var L_invalidinvoketarget_text = "Invalid invoke target specified.",
    L_invaliddirections_text = "Invalid argument passed; both start and end must be present.",
    L_invalidpageindex_text = "Invalid search results page index is passed.",
    L_invalidelement_text = "Invalid element id; unable to find the element in the document body.",
    L_noheadelement_text = "Head element is missing for the current document; cannot initialize the API framework.",
    L_noserviceurl_text = "Either a service url or script url is required to create VENetwork instance.",
    L_noscripturl_text = "Invalid script source url is assigned; cannot download the assigned script.",
    L_nostylesurl_text = "Invalid style source url is assigned; cannot attach the assigned styles.",
    L_invalidwhatwhere_text = "Invalid what/where parameters; either 'what' or 'where' must be present.",
    L_notinitialized_text = "Map is not loaded; cannot perform this operation.",
    L_noroute_text = "Cannot calculate route at this point; try again later.",
    L_invalidpushpin_text = "Invalid pushpin instance.",
    L_invalidpushpinid_text = "Invalid pushpin id; either id is empty or another pushpin already exists with that id.",
    L_invalidpolylineid_text = "Invalid polyline id; either id is empty or another polyline already exists with that id.",
    L_invalidpolygonid_text = "Invalid polygon id; either id is empty or another polygon already exists with that id.",
    L_invalidargument_text = "Invalid argument; input argument '%1' is not a valid '%2' value.",
    L_invalidlayerid_text = "Invalid layer id; either id is empty or another layer already exists with that id.",
    L_invalidlayertype_text = "Invalid layer type.",
    L_invalidlayersource_text = "Invalid layer source; either layer is empty or does not exist.",
    L_invalidsourceid_text = "Invalid source id; either id is empty or another tile source already exists with that id.",
    L_invalidminmaxzoom_text = "Min zoom is greater than max zoom.",
    L_invalidopacity_text = "Invalid opacity value.",
    L_loadxml_text = "Unable to load source file.",
    L_Help_Text = "Help",
    L_ErrorServerBusy_Text = "The server is temporarily unavailable. Try again later.",
    L_UnsupportMethod_Text = "%1 method is not supported.",
    L_UnsupportClass_Text = "%1 class is not supported.",
    L_UnsupportProperty_Text = "'%1' class does not support property '%2' equals to '%3'.",
    L_error_text = "Error",
    L_close_text = "close",
    L_what_text = "What",
    L_where_text = "Where",
    L_find_text = "Find",
    L_selectlocation_text = "Select a location",
    L_Start_Text = "Start",
    L_End_Text = "End",
    L_DirectionsGetDirections_Text = "Get directions",
    L_loading_text = ".. Loading ..",
    L_arriveat_text = "Arrive at",
    L_startat_text = "Start at",
    L_step_text = "Step %1 of %2",
    L_DirectionsStep_Text = "Step",
    L_invalidroute_Text = "Unable to find a route for the locations you entered. Ensure that your start and end locations are correct, and try again.",
    L_invalidlocation_Text = "The location you entered cannot be found.",
    L_routelessthanoneminute_Text = "Less Than One Minute",
    L_hoursandminutes_Text = "%1 Hours, %2 Minutes",
    L_minutes_Text = "%1 Minutes",
    L_CollectionManagerViewerDefaultTitle_Text = "Shared Collection",
    L_CollectionManagerUnsavedCollectionTitle_Text = "Unsaved Collection",
    L_AnnotationConfDefaultTitle_Text = "Untitled item",
    L_TrafficPopupSeverity_Text = "Severity",
    L_TrafficPopupLocation_Text = "Location",
    L_TrafficPopupDescription_Text = "Description",
    L_TrafficPopupStartTime_Text = "Start time",
    L_TrafficPopupEstEndTime_Text = "Est. end time",
    L_TrafficManagerSerious_Text = "Serious",
    L_TrafficManagerModerate_Text = "Moderate",
    L_TrafficManagerMinor_Text = "Minor",
    L_TrafficManager_Zoomout_Text = "Zoom out to view Traffic information",
    L_TrafficManager_Zoomin_Text = "Zoom in to view Traffic information",
    L_ClientTokenInvalid_Text = "Invalid client token.",
    L_ClientTokenExpired_Text = "Expired client token.",
    L_Shp_IncorrectPoints_Text = "The number of points does not match the specified VEShape type.",
    L_Shp_IncorrectLineWidth_Text = "The line width must be a positive integer.",
    L_Shp_IncorrectZoomLevel_Text = "The specified  zoom level is invalid.  The valid range is 1 to 21,inclusive.",
    L_Shp_IncorrectZoomLevel2_Text = "Max zoom is less than min zoom.",
    L_shp_Notinitialized_text = "Shape is not initialized.",
    L_ShpExist_text = "This shape has already been added to layer.",
    L_invalidzindex_text = "Invalid z-Index parameters; either 'icon' or 'polyshape' must be present.",
    L_altitudemodemismatch_Text = "All altitudes must have the same altitudeMode in a VEShape.",
    L_invalidwhere_text = "Invalid argument; input argument 'where' is not a valid 'string, VELatLong, VELatLongRectangle, or VEPlace ' value.",
    L_invalidnonnegativeint_text = "Invalid argument; input argument '%1' must be a non-negative int value.",
    L_invalidbetweenint_text = "Invalid argument; input argument '%1' must be between %2 and %3, inclusive.",
    L_invalidsearchlocation_Text = "%1 could not find a match for the location. Please check your spelling, enter the complete address including country name and commas, and try again.",
    L_invalidsearchresult_Text = "No results were found.",
    L_ClusterDefaultTitle_Text = "%1 locations near here",
    L_ClusterDefaultDescription_Text = "Zoom in for details.",
    L_InvalidClusterLayer_Text = "Cannot apply clustering to a cluster layer.",
    L_DashboardBirdsEye_Text = "Bird's eye",
    L_DashboardBirdsEyeText_Text = "See this location in bird's eye view",
    L_Dashboard3DText_Text = "See this location in Bing Maps 3D",
    L_Dashboard3DInstalled_Text = "Bing Maps 3D has finished updating",
    L_ObliqueCompassSelectDirection_Text = "Change the direction of the view",
    L_ObliqueModeImageNotAvailable_Text = "Sorry, bird's eye images aren't available here.",
    L_MinimapHybrid_Text = "H",
    L_MinimapRoad_Text = "R",
    L_MinimapHideToolTip_Text = "Hide the mini map",
    L_MinimapShowToolTip_Text = "Show the mini map",
    L_MinimapLargerToolTip_Text = "Larger mini map",
    L_MinimapSmallerToolTip_Text = "Smaller mini map",
    L_MinimapRoadToolTip_Text = "Switch to road view",
    L_MinimapHybridToolTip_Text = "Switch to hybrid view",
    L_MinimapDragToolTip_Text = "Drag to move the map",
    L_MinimapReticuleDragToolTip_Text = "Drag to center map",
    L_ScaleBarMiles_Text = "miles",
    L_ScaleBarKilometers_Text = "km",
    L_ScaleBarMeters_Text = "m",
    L_ScaleBarYards_Text = "yds",
    L_NavActionFlatland_Text = "2D",
    L_NavActionView3D_Text = "3D",
    L_NavActionRoad_Text = "Road",
    L_NavActionAerial_Text = "Aerial",
    L_NavActionHybrid_Text = "Hybrid",
    L_NavActionLabels_Text = "Labels",
    L_NavActionTraffic_Text = "Traffic",
    L_NavActionHideToolTip_Text = "Hide the view control",
    L_NavActionShowToolTip_Text = "Show the view control",
    L_NavActionFlatlandToolTip_Text = "View map in 2D mode",
    L_NavActionView3DToolTip_Text = "View map in 3D mode with Bing Maps 3D (Beta)",
    L_NavActionOrthoToolTip_Text = "Switch to map view",
    L_NavActionObliqueToolTip_Text = "Switch to bird's eye view",
    L_NavActionStreetSideToolTip_Text = "Street-level view",
    L_NavAction3DOrthoToolTip_Text = "Look down",
    L_NavAction3DObliqueToolTip_Text = "Look down at an angle",
    L_NavAction3DStreetSideToolTip_Text = "Look toward horizon",
    L_NavActionShowTrafficToolTip_Text = "Show traffic on the map",
    L_NavActionHideTrafficToolTip_Text = "Hide traffic on the map",
    L_NavActionRoadToolTip_Text = "Switch to road view",
    L_NavActionAerialToolTip_Text = "Switch to aerial view",
    L_NavActionHybridToolTip_Text = "Switch to hybrid view",
    L_NavActionObliqueRotationToolTip_CW_Text = "Rotate the camera angle counterclockwise",
    L_NavActionObliqueRotationToolTip_CCW_Text = "Rotate the camera angle clockwise",
    L_NavActionShowObliqueToolTip_Text = "Show bird's eye images on the map",
    L_NavActionHideObliqueToolTip_Text = "Hide bird's eye images on the map",
    L_NavActionShowLabels_Text = "Show labels",
    L_NavActionHideLabels_Text = "Hide labels",
    L_North_Text = "north",
    L_East_Text = "east",
    L_South_Text = "south",
    L_West_Text = "west",
    L_ObliqueSkippingOneDirection_Text = "A bird's eye image facing %2 isn't available for this location. Facing %1 instead.",
    L_ObliqueSkippingTwoDirections_Text = "Bird's eye images facing %2 or %3 aren't available for this location. Facing %1 instead.",
    L_ObliqueSpinNoOtherImagery_Text = "No other bird's eye images are available for this location. Continuing to face %1.",
    L_ObliqueNoImageryInRequestedDirection_Text = "Bird's eye images facing %2 aren't available for this location. Continuing to face %1.",
    L_NavActionCompassPan_Text = "Pan in any direction",
    L_ZoomBarMinusToolTip_Text = "Zoom out. To zoom continuously, click and hold this button.",
    L_ZoomBarPlusToolTip_Text = "Zoom in. To zoom continuously, click and hold this button.",
    L_ZoomBarSliderToolTip_Text = "Move slider to zoom in or zoom out",
    L_BrowserNotSupported_Text = "To use this feature, open Live Search in Windows Internet Explorer version 6 or 7. For more information, and to download the latest version, visit the Microsoft Internet Explorer website (%1%3%2).",
    L_BrowserNotSupported3D_Text = "Bing Maps 3D is currently not supported for your browser. For a list of supported browsers, see Help.",
    L_NoHardwareAcceleration_Text = "Bing Maps 3D has detected that hardware acceleration is turned off.",
    L_3DLoading_Text = "Initializing Bing Maps 3D (Beta).",
    L_UnableToDisplay3DVIAModel_Text = "Unable to display 3D models in collections at this time. Please try again later.",
    L_InstallVE3DVIATitle_Text = "Virtual Earth - 3DVIA (Beta) installation",
    L_LaunchVE3DVIA_Text = "Launching Virtual Earth - 3DVIA (Beta)",
    L_PluginFeatureNotAvailable_Text = "Feature is currently not available. Please try again later.",
    L_MapLegendTrafficSlow_Text = "Slow",
    L_MapLegendTrafficFast_Text = "Fast",
    L_MapLegendAndPopupLink_Text = "Zoom in for traffic details",
    L_GeoRssInvalidFormatError_Text = "The GeoRSS file you have tried to import is improperly formatted.",
    L_MapCopyrightMicrosoft = "&copy; 2009 Microsoft Corporation",
    L_MapCopyrightTraffic = "Traffic.com",
    L_MapControlPlatformName_Text = "Virtual Earth",
    L_SupportedBrowserDownloadUrl_Text = "http://www.microsoft.com/windows/ie/downloads/default.mspx";
_VERegisterNamespaces("MapControl");
MapControl.Features = {
    PlatformName: L_MapControlPlatformName_Text,
    Image: {
        PoweredLogo: "logo_powered_by_map.png"
    },
    MapStyle: {
        Road: true,
        Shaded: true,
        Aerial: true,
        Hybrid: true,
        BirdsEye: true,
        View3D: true
    },
    BirdsEyeAtZoomLevel: 10,
    ScaleBarKilometers: false,
    Traffic: {
        Flow: {
            Slow: "0-25 mph",
            Moderate: "25-45 mph",
            Fast: "45+ mph"
        },
        Enabled: true,
        ShowOnNavbar: false,
        ShowIncidents: true
    },
    RouteOptions: {
        RouteMode: {
            Driving: true,
            Walking: true
        },
        UseMWS: true,
        UseTraffic: true
    },
    Minimap: {
        ShowByDefault: false
    }
};

function _VERegisterNamespaces() {
    for (var d = 0; d < arguments.length; d++) {
        var b = arguments[d].split("."),
            c = window;
        for (var a = 0; a < b.length; a++) {
            if (!c[b[a]]) c[b[a]] = {};
            c = c[b[a]]
        }
    }
}
_VERegisterNamespaces("Msn.MVC");
Msn.MVC.AbstractView = function () {
    this._contextPin = null
};
Msn.MVC.AbstractView.prototype.OnBeforeSwitchAway = function () {};
Msn.MVC.AbstractView.prototype.ShowShimIfSupported = function () {};
Msn.MVC.AbstractView.prototype.UpdateShimIfSupported = function () {};
_VERegisterNamespaces("Msn.MVC");
Msn.MVC.FlatlandView = function () {
    this._superObj = Msn.MVC.FlatlandView.prototype;
    this._mapDrawingView = null
};
Msn.MVC.FlatlandView.prototype = new Msn.MVC.AbstractView;
Msn.MVC.FlatlandView.prototype.OnBeforeSwitchAway = function () {
    if (window.__drawingLoaded) {
        this._ClearAllCollectionLayers();
        VE_MapDispatch.Clear()
    }
};
_VERegisterNamespaces("Msn.MVC");
Msn.MVC.View3D = function () {
    this._superObj = Msn.MVC.View3D.prototype;
    this._hackUniqueLayerId = "UniqueLayer_Hack";
    this._entityIdShapePostfix = "_Shape";
    this._spacecontrol = null
};
Msn.MVC.View3D.prototype = new Msn.MVC.AbstractView;
Msn.MVC.View3D.prototype.OnBeforeSwitchAway = function () {
    this._SetView3DControl(null)
};
Msn.MVC.View3D.prototype._SetView3DControl = function (a) {
    this._spacecontrol = a
};
Msn.MVC.View3D.prototype.ShowShimIfSupported = function (b, a) {
    ShowShim(b, a)
};
Msn.MVC.View3D.prototype.UpdateShimIfSupported = function (b, a) {
    UpdateIFrameShim(b, a)
};
_VERegisterNamespaces("Msn.MVC");
Msn.MVC.ViewFacade = function () {
    this._mvcFlatlandView = null;
    this._mvcView3D = null;
    this._curMvcView = null
};
Msn.MVC.ViewFacade.prototype.OnSwitchToFlatlandView = function () {
    if (this._mvcFlatlandView == null) this._mvcFlatlandView = new Msn.MVC.FlatlandView;
    if (this._curMvcView == this._mvcFlatlandView) return;
    if (this._curMvcView != null) this._curMvcView.OnBeforeSwitchAway();
    this._curMvcView = this._mvcFlatlandView;
    if (window.__drawingLoaded) this._curMvcView.OnAllCollectionLayersRepaint()
};
Msn.MVC.ViewFacade.prototype.OnSwitchToView3D = function (a) {
    if (this._mvcView3D == null) this._mvcView3D = new Msn.MVC.View3D;
    this._mvcView3D._SetView3DControl(a);
    if (this._curMvcView == this._mvcView3D) return;
    if (this._curMvcView != null) this._curMvcView.OnBeforeSwitchAway();
    this._curMvcView = this._mvcView3D;
    if (window.__drawingLoaded) this._curMvcView.OnAllCollectionLayersRepaint()
};
Msn.MVC.ViewFacade.prototype.ShowShimIfSupported = function (b, a) {
    if (this._curMvcView == null) return;
    return this._curMvcView.ShowShimIfSupported(b, a)
};
Msn.MVC.ViewFacade.prototype.UpdateShimIfSupported = function (b, a) {
    if (this._curMvcView == null) return;
    return this._curMvcView.UpdateShimIfSupported(b, a)
};
var mvcViewFacade = new Msn.MVC.ViewFacade,
    windowWidth = 0,
    windowHeight = 0,
    scrollbarWidth = null;

function $ID(a) {
    var b = document;
    return b.getElementById(a)
}
function $CE(a) {
    var b = document;
    return b.createElement(a)
}
function $CENS(a) {
    var b = document;
    return b.createElementNS(a)
}
function GetWindowWidth() {
    var a = 0;
    if (typeof window.innerWidth == "number") a = window.innerWidth;
    else if (document.documentElement && document.documentElement.clientWidth) a = document.documentElement.clientWidth;
    else if (document.body && document.body.clientWidth) a = document.body.clientWidth;
    if (!a || a < 100) a = 100;
    return a
}
function GetWindowHeight() {
    var a = 0;
    if (typeof window.innerHeight == "number") a = window.innerHeight;
    else if (document.documentElement && document.documentElement.clientHeight) a = document.documentElement.clientHeight;
    else if (document.body && document.body.clientHeight) a = document.body.clientHeight;
    if (!a || a < 100) a = 100;
    return a
}
function GetScrollbarWidth() {
    if (scrollbarWidth) return scrollbarWidth;
    if (navigator.userAgent.indexOf("IE") >= 0) {
        var a = document.createElement("div"),
            b = null;
        a.style.visible = "hidden";
        a.style.overflowY = "scroll";
        a.style.position = "absolute";
        a.style.width = 0;
        document.body.insertAdjacentElement("afterBegin", a);
        b = a.offsetWidth;
        a.parentNode.removeChild(a);
        if (!b) b = 16;
        scrollbarWidth = b;
        return b
    } else return 0
}
function GetUrlPrefix() {
    var a = window.location.pathname.lastIndexOf("/"),
        b = window.location.protocol + "//" + window.location.hostname + window.location.pathname.substring(0, a + 1);
    return b
}
function GetUrlParameterString() {
    var a = window.location.search;
    if (a.length == 0 || a.indexOf("?") == -1) return "";
    return a.substr(a.indexOf("?") + 1)
}
function CheckWipExistence() {
    var a = GetUrlParameterString();
    if (a != "" && a.indexOf("wip=") > -1) return true;
    return false
}
function GetUrlParameters() {
    var b = [],
        d = GetUrlParameterString();
    if (!d) return b;
    var e = d.split("&");
    for (var c = 0; c < e.length; c++) {
        var a = e[c].split("=");
        if (a.length == 2 && a[0] && a[1]) {
            b.push(unescape(a[0]));
            b.push(unescape(a[1]))
        }
    }
    return b
}
function ParseShiftKeyForLinks(a) {
    if (a.shiftKey) return false;
    return true
}
function GetEvent(a) {
    return a ? a : window.event
}
function CancelEvent(a) {
    a.cancelBubble = true;
    a.returnValue = false
}
function IgnoreEvent(a) {
    a = GetEvent(a);
    CancelEvent(a);
    return false
}
function GetMouseScrollDelta(a) {
    if (a.wheelDelta) return a.wheelDelta;
    else if (a.detail) return -a.detail;
    return 0
}
function IsLeftMouseButton(a) {
    var b = Msn.VE.Environment.BrowserInfo;
    if (b.Type == Msn.VE.BrowserType.MSIE) return a.button == 1 || a.button == 3 || a.type == "click";
    else if (b.Type == Msn.VE.BrowserType.Firefox) return a.which == 1;
    else return false
}
function IsRightMouseButton(a) {
    var b = Msn.VE.Environment.BrowserInfo;
    if (b.Type == Msn.VE.BrowserType.MSIE) return a.button == 2 || a.button == 3 || a.type == "contextmenu";
    else if (b.Type == Msn.VE.BrowserType.Firefox) return a.which == 3;
    else return false
}
function IsMiddleMouseButton(b) {
    var a = Msn.VE.Environment.BrowserInfo;
    if (a.Type == Msn.VE.BrowserType.MSIE) return b.button == 4;
    else if (a.Type == Msn.VE.BrowserType.Firefox) return b.which == 2;
    else return false
}
_VERegisterNamespaces("Msn.VE");
Msn.VE.DistanceUnit = {
    Kilometers: "km",
    Miles: "mi"
};
Msn.VE.DistanceUnit.IsValidType = function (a) {
    if (typeof a == "string") if (a == Msn.VE.DistanceUnit.Miles || a == Msn.VE.DistanceUnit.Kilometers) return true;
    return false
};

function VEException(b, c, a) {
    this.source = b;
    this.name = c;
    this.message = a
}
VEException.prototype.Name = this.name;
VEException.prototype.Source = this.source;
VEException.prototype.Message = this.message;

function MathFloor(a) {
    return Math.floor(a)
}
function MathCeil(a) {
    return Math.ceil(a)
}
function MathMax(a, b) {
    return Math.max(a, b)
}
function MathMin(a, b) {
    return Math.min(a, b)
}
function MathAbs(a) {
    return Math.abs(a)
}
function MathRound(a) {
    return Math.round(a)
}
function DegToRad(a) {
    return a * Math.PI / 180
}
function RadToDeg(a) {
    return a * 180 / Math.PI
}
function MatrixMultiply(e, b) {
    if (!e || !b || e[0].length != b.length) return;
    var g = e.length,
        h = b[0].length,
        d = new Array(g),
        i = b.length;
    for (var a = 0; a < g; a++) {
        d[a] = new Array(h);
        for (var c = 0; c < h; c++) {
            d[a][c] = 0;
            for (var f = 0; f < i; f++) d[a][c] += e[a][f] * b[f][c]
        }
    }
    return d
}
function VEParameter(b, a) {
    this.Name = b;
    this.Value = a
}
VEParameter.prototype.Name = this.name;
VEParameter.prototype.Value = this.value;

function VENetwork(c, a, b) {
    if (c != null && c != "undefined") this.ServiceUrl = c;
    this.UseCloseDep = false;
    if (a != null && a != "undefined") Msn.VE.API.Globals.veonbegininvokeevent = a;
    if (b != null && b != "undefined") Msn.VE.API.Globals.veonendinvokeevent = b
}
function BeginInvoke(f, d, h, g, j) {
    if (this.ServiceUrl == null || this.ServiceUrl == "undefined" || this.ServiceUrl.length == 0) throw new VEException("VENetwork:BeginInvoke", "err_noserviceurl", L_noserviceurl_text);
    if (Msn.VE.API && Msn.VE.API.Globals.veonbegininvokeevent) Msn.VE.API.Globals.veonbegininvokeevent();
    var c = j;
    if (!c) c = VENetwork.GetExecutionID();
    if (d) {
        var b = this.ServiceUrl + "?";
        for (var e = 0; e < d.length; e++) {
            b = b + d[e].Name;
            b = b + "=";
            b = b + d[e].Value;
            b = b + "&"
        }
    } else var b = this.ServiceUrl;
    var a = document.createElement("script");
    a.type = "text/javascript";
    a.language = "javascript";
    a.id = c;
    a.src = b;
    if (this.UseCloseDep == true) {
        var i = openDependency("BEGIN_INVOKE::" + c, function () {
            EndInvoke(g, h, f, a, c)
        },
        c);
        if (i) VENetwork.GetAttachTarget().appendChild(a)
    } else {
        if (navigator.userAgent.indexOf("IE") >= 0) a.onreadystatechange = function () {
            if (a && ("loaded" == a.readyState || "complete" == a.readyState)) {
                a.onreadystatechange = null;
                EndInvoke(g, h, f, a, c)
            }
        };
        else a.onload = function () {
            a.onload = null;
            EndInvoke(g, h, f, a, c)
        };
        VENetwork.GetAttachTarget().appendChild(a)
    }
}
function EndInvoke(endInvokeTarget, fnCallback, endInvokeMethod, elScript, executionId) {
    var objects = null;
    if (endInvokeMethod) eval("if(typeof " + endInvokeMethod + " == 'function') {objects = " + endInvokeMethod + "();}");
    setTimeout(function () {
        if (elScript.parentNode) elScript.parentNode.removeChild(elScript);
        elScript = null
    },
    100);
    if (fnCallback != null && fnCallback != "undefined") fnCallback(objects, endInvokeTarget);
    if (Msn.VE.API && Msn.VE.API.Globals.veonendinvokeevent) Msn.VE.API.Globals.veonendinvokeevent()
}
VENetwork.GetExecutionID = function () {
    var a = new Date,
        b = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate(), a.getHours(), a.getMinutes(), a.getSeconds(), a.getMilliseconds());
    b += Math.round(Math.random() * 1000000);
    return b
};

function GetXmlHttp() {
    var a = null;
    if (window.XMLHttpRequest) a = new XMLHttpRequest;
    else if (window.ActiveXObject) try {
        a = new ActiveXObject("Msxml2.XmlHttp.6.0")
    } catch(b) {
        try {
            a = new ActiveXObject("Msxml2.XmlHttp.3.0")
        } catch(c) {
            try {
                a = new ActiveXObject("Msxml2.XMLHTTP")
            } catch(d) {
                try {
                    a = new ActiveXObject("Microsoft.XMLHTTP")
                } catch(e) {}
            }
        }
    } else throw "XMLHTTP Required: Browser not supported";
    return a
}
VENetwork.AttachStyleSheetCallback = function (a) {
    if (a) a()
};
VENetwork.AttachStyleSheet = function (a, b, d, c) {
    if (a == null || a == "undefined" || a.length == 0) throw new VEException("VENetwork:AttachStylesheet", "err_nostylesurl", "");
    elStyle = document.createElement("link");
    if (d == true) elStyle.rel = "alternate stylesheet";
    else elStyle.rel = "stylesheet";
    if (c) elStyle.media = c;
    elStyle.type = "text/css";
    elStyle.rev = "stylesheet";
    elStyle.id = VENetwork.GetExecutionID();
    elStyle.href = a;
    VENetwork.GetAttachTarget().appendChild(elStyle);
    if (navigator.userAgent.indexOf("IE") >= 0) elStyle.onreadystatechange = function () {
        if (elStyle && ("loaded" == elStyle.readyState || "complete" == elStyle.readyState)) {
            elStyle.onreadystatechange = null;
            VENetwork.AttachStyleSheetCallback(b)
        }
    };
    else VENetwork.AttachStyleSheetCallback(b);
    return
};
VENetwork.DownloadScriptCallback = function (a, b) {
    if (a) a(b)
};
VENetwork.DownloadScript = function (b, c, d) {
    if (b == null || b == "undefined" || b.length == 0) throw new VEException("VENetwork:DownloadScript", "err_noscripturl", L_noscripturl_text);
    var a = document.createElement("script");
    a.type = "text/javascript";
    a.language = "javascript";
    a.id = VENetwork.GetExecutionID();
    a.src = b;
    if (navigator.userAgent.indexOf("IE") >= 0) a.onreadystatechange = function () {
        if (a && ("loaded" == a.readyState || "complete" == a.readyState)) {
            a.onreadystatechange = null;
            VENetwork.DownloadScriptCallback(c, d)
        }
    };
    else a.onload = function () {
        a.onload = null;
        VENetwork.DownloadScriptCallback(c, d)
    };
    VENetwork.GetAttachTarget().appendChild(a);
    return a.id
};
VENetwork.DownloadXml = function (e, c, b, d) {
    var a = GetXmlHttp();
    a.open(c, e, true);
    a.onreadystatechange = function () {
        if (a.readyState == 4) {
            if (b) b(a.responseXML, d);
            a = null
        }
    };
    a.send(null)
};
VENetwork.GetAttachTarget = function () {
    if (document.getElementsByTagName("head")[0] != null) return document.getElementsByTagName("head")[0];
    else throw new VEException("VENetwork:cstr", "err_noheadelement", L_noheadelement_text)
};
VENetwork.prototype.BeginInvoke = BeginInvoke;
VENetwork.prototype.EndInvoke = EndInvoke;

function JSONConstant() {}
JSONConstant.culture = "culture";
JSONConstant.format = "format";
JSONConstant.json = "json";
JSONConstant.requestid = "rid";

function JSONRequestInvoke(f, a, e) {
    var c = new VENetwork,
        b = VENetwork.GetExecutionID();
    c.UseCloseDep = true;
    c.ServiceUrl = f;
    if (!a) a = [];
    var d = Msn.VE.API ? Msn.VE.API.Globals.locale : window.serviceLocale;
    a.push(new VEParameter(JSONConstant.culture, '"' + d + '"'));
    a.push(new VEParameter(JSONConstant.format, JSONConstant.json));
    a.push(new VEParameter(JSONConstant.requestid, b));
    c.BeginInvoke("_f" + b, a, e, null, b)
}
_VERegisterNamespaces("Msn.Drawing");
var MC_PointID = 10000,
    MC_PolylineID = 30000,
    MC_PolygonID = 50000,
    MC_SYMBOL_IID = 70000,
    MC_TEXT_IID = 90000,
    MC_ENTITY_IID = 200000,
    MC_COL_IID = 1000,
    MC_GEO_TYPE_SYMBOL = "Symbol",
    MC_GEO_TYPE_POINT = "Point",
    MC_GEO_TYPE_POLYLINE = "Polyline",
    MC_GEO_TYPE_POLYGON = "Polygon",
    MC_GEO_TYPE_TEXT = "Text",
    MC_GEO_TYPE_COL = "Collection",
    MC_GEO_TYPE_ENTITY = "Entity",
    VEShapeType = {
    Pushpin: "Point",
    Polyline: "Polyline",
    Polygon: "Polygon"
},
    VEMapserviceType = {
    None: "None",
    MapCruncher: "MapCruncher",
    KML: "KML",
    WMS: "WMS"
},
    VEMapserviceTypeList = [VEMapserviceType.None, VEMapserviceType.MapCruncher, VEMapserviceType.KML, VEMapserviceType.WMS];
VEMapserviceTypeIndex = function (c) {
    var b = -1;
    if (VEMapserviceTypeList != null) for (var a = 0; a < VEMapserviceTypeList.length; a++) if (c == VEMapserviceTypeList[a]) {
        b = a;
        break
    }
    return b
};
IsValidMapserviceType = function (a) {
    return a != null && typeof a != "undefined" && a != "" && VEMapserviceTypeIndex(a) != -1
};
IsValidMapserviceSource = function (a) {
    return a != null && typeof a != "undefined" && a != ""
};
IsValidMapserviceMetadata = function (a) {
    return a != null && typeof a != "undefined" && a != ""
};
IsValidMapserviceOpacity = function (a) {
    return a != null && typeof a != "undefined" && a >= 0 && a <= 1
};
Msn.Drawing.GetGeoUID = function (b) {
    var a = "";
    switch (b) {
    case VEShapeType.Polygon:
        a = MC_PolygonID++;
        break;
    case VEShapeType.Pushpin:
        a = MC_PointID++;
        break;
    case VEShapeType.Polyline:
        a = MC_PolylineID++;
        break;
    case MC_GEO_TYPE_SYMBOL:
        a = MC_SYMBOL_IID++;
        break;
    case MC_GEO_TYPE_TEXT:
        a = MC_TEXT_IID++;
        break;
    case MC_GEO_TYPE_COL:
        a = MC_COL_IID++;
        break;
    case MC_GEO_TYPE_ENTITY:
        a = MC_ENTITY_IID++
    }
    return a.toString()
};
Msn.Drawing.Exception = function (a) {
    this.message = a;
    this.name = "Msn.Drawing.Exception"
};
Msn.Drawing.Exception.prototype.toString = function () {
    return this.name + ": " + this.message
};
Msn.Drawing.Point = function (a, b) {
    this.id = 0;
    this.points = [];
    this.points.push(a);
    this.points.push(b);
    this.iid = Msn.Drawing.GetGeoUID(VEShapeType.Pushpin)
};
Msn.Drawing.Point.prototype.altitudes = null;
Msn.Drawing.Point.prototype.altitudeMode = "Ground";
Msn.Drawing.Point.prototype.type = VEShapeType.Pushpin;
Msn.Drawing.Point.prototype.name = null;
Msn.Drawing.Point.prototype.symbol = null;
Msn.Drawing.Point.prototype.isLabel = true;
Msn.Drawing.Point.prototype.isOnLegend = false;
Msn.Drawing.Point.prototype.Destroy = function () {
    this.symbol = null;
    this.points = null;
    this.altitudes = null;
    this.altitudeMode = null
};
Msn.Drawing.Point.prototype.toString = function () {
    return this.points[0] + "," + this.points[1]
};
Msn.Drawing.PolyLine = function (a) {
    this.id = 0;
    this.iid = Msn.Drawing.GetGeoUID(VEShapeType.Polyline);
    this.points = a ? a : [];
    this.minX = null;
    this.minY = null;
    this.maxX = null;
    this.maxY = null;
    this.length = -1
};
Msn.Drawing.PolyLine.prototype.toString = function () {
    if (this.points != null) return this.points.join(" ");
    else return ""
};
Msn.Drawing.PolyLine.prototype.altitudes = null;
Msn.Drawing.PolyLine.prototype.altitudeMode = "Ground";
Msn.Drawing.PolyLine.prototype.extruded = false;
Msn.Drawing.PolyLine.prototype.minZ = null;
Msn.Drawing.PolyLine.prototype.maxZ = null;
Msn.Drawing.PolyLine.prototype.minX = null;
Msn.Drawing.PolyLine.prototype.minY = null;
Msn.Drawing.PolyLine.prototype.maxX = null;
Msn.Drawing.PolyLine.prototype.maxY = null;
Msn.Drawing.PolyLine.prototype.iid = Msn.Drawing.GetGeoUID(VEShapeType.Polyline);
Msn.Drawing.PolyLine.prototype.labelPosX = null;
Msn.Drawing.PolyLine.prototype.labelPosY = null;
Msn.Drawing.PolyLine.prototype.labelPosZ = null;
Msn.Drawing.PolyLine.prototype.name = null;
Msn.Drawing.PolyLine.prototype.type = VEShapeType.Polyline;
Msn.Drawing.PolyLine.prototype.symbol = null;
Msn.Drawing.PolyLine.prototype.isLabel = true;
Msn.Drawing.PolyLine.prototype.isOnLegend = false;
Msn.Drawing.PolyLine.prototype.Destroy = function () {
    this.symbol = null;
    this.points = null;
    this.altitudes = null;
    this.altitudeMode = null;
    this.extruded = null;
    this.minX = null;
    this.minY = null;
    this.maxX = null;
    this.maxY = null;
    this.minZ = null;
    this.maxZ = null
};
Msn.Drawing.PolyLine.prototype.GetLength = function () {
    if (this.length < 0) this.length = CalculateShapeLengthP(this.points);
    return this.length
};
Msn.Drawing.PolyLine.prototype.SetLength = function (a) {
    this.length = a
};
Msn.Drawing.Polygon = function (a) {
    this.id = 0;
    this.iid = Msn.Drawing.GetGeoUID(VEShapeType.Polygon);
    this.points = a;
    this.length = -1;
    this.area = -1;
    this.minX = null;
    this.minY = null;
    this.maxX = null;
    this.maxY = null
};
Msn.Drawing.Polygon.prototype.altitudes = null;
Msn.Drawing.Polygon.prototype.altitudeMode = "Ground";
Msn.Drawing.Polygon.prototype.extruded = false;
Msn.Drawing.Polygon.prototype.minZ = null;
Msn.Drawing.Polygon.prototype.maxZ = null;
Msn.Drawing.Polygon.prototype.labelPosX = null;
Msn.Drawing.Polygon.prototype.labelPosY = null;
Msn.Drawing.Polygon.prototype.labelPosZ = null;
Msn.Drawing.Polygon.prototype.symbol = null;
Msn.Drawing.Polygon.prototype.isLabel = true;
Msn.Drawing.Polygon.prototype.isOnLegend = false;
Msn.Drawing.Polygon.prototype.type = VEShapeType.Polygon;
Msn.Drawing.Polygon.prototype.name = null;
Msn.Drawing.Polygon.prototype.Destroy = function () {
    this.symbol = null;
    this.points = null;
    this.altitudes = null;
    this.altitudeMode = null;
    this.extruded = null;
    this.minX = null;
    this.minY = null;
    this.maxX = null;
    this.maxY = null;
    this.minZ = null;
    this.maxZ = null
};
Msn.Drawing.Polygon.prototype.GetLength = function () {
    if (this.length < 0) this.length = CalculateShapeLength(this);
    return this.length
};
Msn.Drawing.Polygon.prototype.SetLength = function (a) {
    this.length = a
};
Msn.Drawing.Polygon.prototype.GetArea = function () {
    if (this.area < 0) this.area = CalculateAreaP(this.points);
    if (this.area < 0) this.area = CalculateAreaP(this.points, false);
    return this.area
};
Msn.Drawing.Polygon.prototype.SetArea = function (a) {
    this.area = a
};
Msn.Drawing.Stroke = function () {
    this.width = 1;
    this.linecap = "round";
    this.opacity = 1;
    this.linejoin = "miter";
    this.color = new Msn.Drawing.Color(255, 255, 255, 1);
    this.fillcolor = new Msn.Drawing.Color(0, 255, 0, 1)
};
Msn.Drawing.Color = function (d, c, b, a) {
    this.R = d ? d : 0;
    this.G = c ? c : 0;
    this.B = b ? b : 0;
    this.A = a ? a : 0;
    this.ToHexString = function () {
        return VEColorToHexString(this.R, this.G, this.B)
    }
};
VEShapeStyle = function () {
    this.iid = Msn.Drawing.GetGeoUID(MC_GEO_TYPE_SYMBOL);
    this.id = this.iid
};
VEShapeStyle.prototype.point_type = "v:rect";
VEShapeStyle.prototype.name = "symbol";
VEShapeStyle.prototype.highlight_stroke_color = "#336666";
VEShapeStyle.prototype.highlight_fill_color = "#FFCC33";
VEShapeStyle.prototype.shape_drawtype = "v:shape";
VEShapeStyle.prototype.shape_fill = "false";
VEShapeStyle.prototype.shape_filled = "false";
VEShapeStyle.prototype.shape_unselectable = "off";
VEShapeStyle.prototype.style_zIndex = 60;
VEShapeStyle.prototype.style_zIndex_polyshape = 50;
VEShapeStyle.prototype.style_position = "absolute";
VEShapeStyle.prototype.style_filter = "alpha(opacity=30)";
VEShapeStyle.prototype.style_width = "10";
VEShapeStyle.prototype.style_height = "10";
VEShapeStyle.prototype.style_visibility = "visible";
VEShapeStyle.prototype.style_display = "block";
VEShapeStyle.prototype.stroke_drawtype = "v:stroke";
VEShapeStyle.prototype.stroke_on = "true";
VEShapeStyle.prototype.stroke_joinstyle = "miter";
VEShapeStyle.prototype.stroke_endcap = "round";
VEShapeStyle.prototype.stroke_opacity = "1";
VEShapeStyle.prototype.stroke_color = "#0000FF";
VEShapeStyle.prototype.stroke_weight = "2pt";
VEShapeStyle.prototype.stroke_style = "Single";
VEShapeStyle.prototype.stroke_filltype = "solid";
VEShapeStyle.prototype.stroke_color2 = "#FF0000";
VEShapeStyle.prototype.stroke_dashstyle = "Solid";
VEShapeStyle.prototype.stroke_startarrow = "none";
VEShapeStyle.prototype.stroke_startarrowwidth = "medium";
VEShapeStyle.prototype.stroke_startarrowlength = "medium";
VEShapeStyle.prototype.stroke_endarrow = "none";
VEShapeStyle.prototype.stroke_endarrowwidth = "medium";
VEShapeStyle.prototype.stroke_endarrowlength = "medium";
VEShapeStyle.prototype.fill_drawtype = "v:fill";
VEShapeStyle.prototype.fill_color = "#008000";
VEShapeStyle.prototype.fill_colors = "30% yellow";
VEShapeStyle.prototype.fill_color2 = "#0000FF";
VEShapeStyle.prototype.fill_type = "solid";
VEShapeStyle.prototype.fill_opacity = "0.3";
VEShapeStyle.prototype.fill_on = "false";
VEShapeStyle.prototype.textbox_drawtype = "v:textbox";
VEShapeStyle.prototype.textbox_text = "name";
VEShapeStyle.prototype.textbox_color = "#FFFFFF";
VEShapeStyle.prototype.textbox_bold = false;
VEShapeStyle.prototype.textbox_italic = false;
VEShapeStyle.prototype.textbox_underscore = false;
VEShapeStyle.prototype.textbox_font = "Arial";
VEShapeStyle.prototype.textbox_size = 7;
VEShapeStyle.prototype.imagedata_on = false;
VEShapeStyle.prototype.imagedata_src = null;
VEShapeStyle.prototype.isOn = false;
VEShapeStyle.prototype.textbox_OffsetX = 0;
VEShapeStyle.prototype.textbox_OffsetY = 0;
VEShapeStyle.prototype.textbox_backcolor = "#0000FF";
VEShapeStyle.textbox_color_opacity = "1";
VEShapeStyle.textbox_backcolor_opacity = "1";
VEShapeStyle.prototype.img_offsetX = 0;
VEShapeStyle.prototype.img_offsetY = 0;
VEShapeStyle.prototype.img_width = 22;
VEShapeStyle.prototype.img_height = 22;
VEShapeStyle.prototype.Clone = function () {
    var a = new VEShapeStyle;
    a.point_type = this.point_type;
    a.name = this.name;
    a.line_color = this.line_color;
    a.line_width = this.line_width;
    a.line_dasharray = this.line_dasharray;
    a.highlight_stroke_color = this.highlight_stroke_color;
    a.highlight_fill_color = this.highlight_fill_color;
    a.shape_drawtype = this.shape_drawtype;
    a.shape_fill = this.shape_fill;
    a.shape_filled = this.shape_filled;
    a.shape_unselectable = this.shape_unselectable;
    a.style_zIndex = this.style_zIndex;
    a.style_zIndex_polyshape = this.style_zIndex_polyshape;
    a.style_position = this.style_position;
    a.style_filter = this.style_filter;
    a.style_width = this.style_width;
    a.style_height = this.style_height;
    a.style_visibility = this.style_visibility;
    a.style_display = this.style_display;
    a.stroke_drawtype = this.stroke_drawtype;
    a.stroke_on = this.stroke_on;
    a.stroke_joinstyle = this.stroke_joinstyle;
    a.stroke_endcap = this.stroke_endcap;
    a.stroke_opacity = this.stroke_opacity;
    a.stroke_color = this.stroke_color;
    a.stroke_weight = this.stroke_weight;
    a.stroke_style = this.stroke_style;
    a.stroke_filltype = this.stroke_filltype;
    a.stroke_color2 = this.stroke_color2;
    a.stroke_dashstyle = this.stroke_dashstyle;
    a.stroke_startarrow = this.stroke_startarrow;
    a.stroke_startarrowwidth = this.stroke_startarrowwidth;
    a.stroke_startarrowlength = this.stroke_startarrowlength;
    a.stroke_endarrow = this.stroke_endarrow;
    a.stroke_endarrowwidth = this.stroke_endarrowwidth;
    a.stroke_endarrowlength = this.stroke_endarrowlength;
    a.fill_drawtype = this.fill_drawtype;
    a.fill_color = this.fill_color;
    a.fill_colors = this.fill_colors;
    a.fill_color2 = this.fill_color2;
    a.fill_type = this.fill_type;
    a.fill_opacity = this.fill_opacity;
    a.fill_on = this.fill_on;
    a.textbox_drawtype = this.textbox_drawtype;
    a.textbox_text = this.textbox_text;
    a.textbox_color = this.textbox_color;
    a.textbox_bold = this.textbox_bold;
    a.textbox_italic = this.textbox_italic;
    a.textbox_underscore = this.textbox_underscore;
    a.textbox_backcolor = this.textbox_backcolor;
    a.imagedata_on = this.imagedata_on;
    a.imagedata_src = this.imagedata_src;
    a.isOn = this.isOn;
    a.textbox_OffsetX = this.textbox_OffsetX;
    a.textbox_OffsetY = this.textbox_OffsetY;
    a.img_offsetX = this.img_offsetX;
    a.img_offsetY = this.img_offsetY;
    a.img_width = this.img_width;
    a.img_height = this.img_height;
    return a
};

function VE_MapLineClip() {
    var b = -360,
        c = 360,
        d = -180,
        e = 180,
        a = {
        LEFT: 1,
        RIGHT: 2,
        BOTTOM: 4,
        TOP: 8
    };

    function h(i, s, u, t, v) {
        b = s;
        c = t;
        d = u;
        e = v;
        if (typeof i == "undefined" || i == null || i.length < 4) return null;
        var m = false,
            o = i.length;
        if (i[o - 2] == i[0] && i[o - 1] == i[1]) m = true;
        var f = [];
        for (var l = 0; l < i.length; l++) f.push(i[l]);
        var k = a.LEFT;
        while (k <= 8) {
            var q = f[f.length - 2],
                r = f[f.length - 1];
            f.push(q);
            f.push(r);
            var h = [],
                p = f.length;
            for (var j = 0; j < p - 2; j = j + 2) g(h, k, f[j], f[j + 1], f[j + 2], f[j + 3]);
            if (m) {
                var n = h.length;
                if (h[n - 2] != h[0] || h[n - 1] != h[1]) {
                    h.push(h[0]);
                    h.push(h[1])
                }
            }
            f = null;
            k = k * 2;
            f = h
        }
        return f
    }
    function g(g, j, h, i, k, l) {
        var n = f(h, i),
            o = f(k, l);
        if ((j & n) == 0 && (j & o) == 0) {
            g.push(h);
            g.push(i)
        } else if ((j & n) == 0 || (j & o) == 0) {
            var m = (j & n) == 0 ? true : false;
            if (j == a.LEFT) {
                var q = i + (l - i) * (b - h) / (k - h);
                if (m) {
                    g.push(h);
                    g.push(i)
                }
                g.push(b);
                g.push(q)
            } else if (j == a.RIGHT) {
                var q = i + (l - i) * (c - h) / (k - h);
                if (m) {
                    g.push(h);
                    g.push(i)
                }
                g.push(c);
                g.push(q)
            } else if (j == a.TOP) {
                var p = h + (k - h) * (e - i) / (l - i);
                if (m) {
                    g.push(h);
                    g.push(i)
                }
                g.push(p);
                g.push(e)
            } else if (j == a.BOTTOM) {
                var p = h + (k - h) * (d - i) / (l - i);
                if (m) {
                    g.push(h);
                    g.push(i)
                }
                g.push(p);
                g.push(d)
            }
        };
    }
    function f(g, h) {
        var f = 0;
        if (g < b) f = f | a.LEFT;
        else if (g > c) f = f | a.RIGHT;
        if (h < d) f = f | a.BOTTOM;
        else if (h > e) f = f | a.TOP;
        return f
    }
    this.Clip = h
}
VE_LineClip = new VE_MapLineClip;
var L_GraphicsInitError_Text = "Your Web browser does not support SVG or VML. Some graphics features may not function properly.";
_VERegisterNamespaces("Msn.Drawing");
Msn.Drawing.Graphic = function () {};
Msn.Drawing.Graphic.CreateGraphic = function (e, b) {
    if (Msn.VE.Environment.BrowserInfo.BrowserCaps & Msn.VE.BrowserCaps.VML) return new Msn.Drawing.VMLGraphic(e, b);
    else {
        if (navigator.userAgent.indexOf("KHTML") !== -1 || Gimme.Browser.isOpera) return new Msn.Drawing.SVGGraphic(e, b);
        var c = 0,
            f = 0,
            g = new RegExp("Firefox/(.*)"),
            d = g.exec(navigator.userAgent);
        if (d && d.length >= 2) {
            var a = d[1].split(".");
            if (a) {
                c = a[0];
                f = a[1];
                if (parseInt(c) > 0 && parseInt(f) >= 5 || parseInt(c) >= 2) return new Msn.Drawing.SVGGraphic(e, b)
            }
        }
        throw new Msn.Drawing.Exception(L_GraphicsInitError_Text)
    }
};
Msn.Drawing.BaseGraphic = function () {
    this._stroke = new Msn.Drawing.Stroke
};
Msn.Drawing.BaseGraphic.prototype.CreatePrimitive = function () {};
Msn.Drawing.BaseGraphic.prototype.DrawPrimitive = function (d, c, a) {
    var b = new VEShapeStyle;
    if (a._stroke) {
        b.stroke_weight = a._stroke.width;
        b.stroke_joinstyle = a._stroke.linejoin;
        b.stroke_color = a._stroke.color.ToHexString();
        b.stroke_dashstyle = a._stroke.linecap;
        b.stroke_opacity = a._stroke.color.A.toString();
        b.fill_color = a._stroke.fillcolor.ToHexString();
        b.fill_opacity = a._stroke.fillcolor.A.toString()
    }
    c.symbol = b;
    var e = a.CreatePrimitive(d, c, "");
    return e
};
Msn.Drawing.BaseGraphic.prototype.SetStroke = function (a) {
    this._stroke = a
};
Msn.Drawing.VMLGraphic = function (c, d) {
    Msn.Drawing.BaseGraphic.call();
    var g = new Msn.Drawing.Color(255, 0, 0, 1),
        f = new Msn.Drawing.Color(255, 0, 0, 1),
        e = 1,
        a = c;
    c.unselectable = "on";
    var b = [];
    this.DrawPrimitive = function (f, e) {
        var c = Msn.Drawing.VMLGraphic.prototype.DrawPrimitive(d, f, this);
        if (a && c) {
            if (e) a.appendChild(wrapVmlElementInDiv(c));
            else a.appendChild(c);
            b.push(c)
        }
    };
    this.resetOffset = function () {};
    this.SetZIndex = function (a) {
        e = a
    };
    this.Clear = function () {
        var a = null,
            c = null;
        while (a = b.pop()) {
            c = a.parentElement;
            if (c) c.removeChild(a);
            a = null
        }
    };
    this.Destroy = function () {
        this.Clear();
        a = null
    }
};
Msn.Drawing.VMLGraphic.prototype = new Msn.Drawing.BaseGraphic;
Msn.Drawing.VMLGraphic.prototype.CreatePrimitive = function (e, a) {
    var b = null;
    if (a.type == VEShapeType.Pushpin) {
        if (a.symbol.shape_drawtype == "v:oval" || a.symbol.shape_drawtype == "v:rect" || a.symbol.shape_drawtype == "v:roundrect") b = document.createElement(a.symbol.shape_drawtype);
        else b = document.createElement("v:roundrect");
        b.className = "vml";
        var f = LatLongtoRoundedPixel(e, a.points[1], a.points[0]);
        b.style.width = a.symbol.style_width;
        b.style.height = a.symbol.style_height;
        b.style.left = -5 + f.x + e.GetOffsetX() + "px";
        b.style.top = -5 + f.y + e.GetOffsetY() + "px";
        b.style.position = a.symbol.style_position
    } else {
        b = document.createElement("v:shape");
        b.className = "MSVE_Shape vml";
        var g = null;
        g = GetVmlPath(e, a);
        var h = e.GetMapWidth(),
            i = e.GetMapHeight();
        b.style.top = "0px";
        b.style.left = "0px";
        b.style.width = h + "px";
        b.style.height = i + "px";
        b.coordsize = h + " " + i;
        b.style.position = a.symbol.style_position;
        b.path = g
    }
    b.id = a.id != 0 ? a.id : a.iid;
    b.style.zIndex = a.symbol.style_zIndex_polyshape;
    b.unselectable = a.symbol.shape_unselectable;
    var c = document.createElement("v:stroke");
    c.className = "vml";
    c.joinstyle = a.symbol.stroke_joinstyle;
    c.endcap = a.symbol.stroke_endcap;
    c.opacity = a.symbol.stroke_opacity;
    c.dashstyle = a.symbol.stroke_dashstyle;
    c.filltype = a.symbol.stroke_filltype;
    c.color2 = a.symbol.stroke_color2;
    c.color = a.symbol.stroke_color;
    c.weight = a.symbol.stroke_weight;
    c.linestyle = a.symbol.stroke_style;
    if (a.type == VEShapeType.Polygon) {
        var d = document.createElement("v:fill");
        d.className = "vml";
        d.color = a.symbol.fill_color;
        d.colors = a.symbol.fill_colors;
        d.color2 = a.symbol.fill_color2;
        d.type = a.symbol.fill_type;
        d.opacity = a.symbol.fill_opacity;
        b.appendChild(d)
    } else if (a.type == VEShapeType.Polyline) b.filled = false;
    else if (a.type == VEShapeType.Pushpin) {
        b.style.filter = a.symbol.style_filter;
        b.style.zIndex = a.symbol.style_zIndex;
        b.style.display = a.symbol.style_display;
        b.unselectable = a.symbol.shape_unselectable;
        b.fill = true;
        b.filled = true;
        b.fillcolor = a.symbol.fill_color
    }
    b.appendChild(c);
    return b
};
Msn.Drawing.VMLGraphic.prototype.UpdatePoints = function (d, a, b, c) {
    if (c && (a.type == VEShapeType.Polyline || a.type == VEShapeType.Polygon)) {
        var e = GetVmlPath(d, a);
        b.path = e
    }
    return b
};
Msn.Drawing.VMLGraphic.prototype.UpdateStyle = function (f, a, e) {
    e.style.zIndex = a.symbol.style_zIndex_polyshape;
    e.unselectable = a.symbol.shape_unselectable;
    var c = e.firstChild,
        b = null,
        d = null;
    while (c != null) {
        if (c.tagName == "stroke") b = c;
        else if (c.tagName == "fill") d = c;
        c = c.nextSibling
    }
    if (b) {
        b.joinstyle = a.symbol.stroke_joinstyle;
        b.endcap = a.symbol.stroke_endcap;
        b.opacity = a.symbol.stroke_opacity;
        b.dashstyle = a.symbol.stroke_dashstyle;
        b.filltype = a.symbol.stroke_filltype;
        b.color2 = a.symbol.stroke_color2;
        b.color = a.symbol.stroke_color;
        b.weight = a.symbol.stroke_weight;
        b.linestyle = a.symbol.stroke_style
    }
    if (a.type == VEShapeType.Polygon && d) {
        d.color = a.symbol.fill_color;
        d.color2 = a.symbol.fill_color2;
        d.type = a.symbol.fill_type;
        d.opacity = a.symbol.fill_opacity
    }
    return e
};
Msn.Drawing.VMLGraphic.prototype._printable = false;
Msn.Drawing.VMLGraphic.prototype._printTilesLayer = null;
Msn.Drawing.VMLGraphic.prototype._printTopLayer = null;
Msn.Drawing.VMLGraphic.prototype.CreatePrintLayer = function (a, d, c, b) {
    if (!this._printable) {
        this._printTilesLayer = document.createElement("div");
        this._printTilesLayer.className = "MSVE_Print_TileLayer";
        this._printTilesLayer.innerHTML = "<xml:namespace ns='urn:schemas-microsoft-com:vml' prefix='v'/>";
        a.appendChild(this._printTilesLayer);
        this._printTopLayer = document.createElement("div");
        this._printTopLayer.className = "MSVE_Print_TopLayer";
        this._printTopLayer.innerHTML = "<xml:namespace ns='urn:schemas-microsoft-com:vml' prefix='v'/>";
        this._printTopLayer.style.width = c;
        this._printTopLayer.style.height = b;
        this._printTopLayer.zIndex = 100;
        a.parentNode.appendChild(this._printTopLayer);
        this._printable = true
    }
};
Msn.Drawing.VMLGraphic.prototype.RemovePrintLayer = function () {
    if (this._printable) {
        this._printable = false;
        this._printTilesLayer.parentNode.removeChild(this._printTilesLayer);
        this._printTopLayer.parentNode.removeChild(this._printTopLayer);
        this._printTilesLayer = null;
        this._printTopLayer = null
    }
};
Msn.Drawing.VMLGraphic.prototype.AddPrintTile = function (f, g, e, d, b, h, c) {
    var a = null;
    if (this._printable) {
        a = document.createElement("div");
        a.style.position = "absolute";
        a.style.top = g;
        a.style.left = e;
        a.style.width = d + 1;
        a.style.height = b + 1;
        a.style.zIndex = c;
        a.innerHTML = "<v:image src='" + f + "' style='width:100%;height:100%;left:0px;top:0px;behavior:url(#default#VML);display:inline-block;'></v:image>";
        this._printTilesLayer.appendChild(a)
    }
    return a
};
Msn.Drawing.VMLGraphic.prototype.RemovePrintTile = function (a) {
    if (a.parentNode) a.parentNode.removeChild(a)
};
Msn.Drawing.VMLGraphic.prototype.AddLogo = function (b) {
    if (this._printable) {
        var a = document.createElement("v:image");
        a.src = b;
        a.className = "MSVE_PoweredByLogo_print vml";
        this._printTopLayer.appendChild(a)
    }
};
Msn.Drawing.SVGGraphic = function (c, b) {
    Msn.Drawing.BaseGraphic.call();
    var g = new Msn.Drawing.Color(255, 0, 0, 1),
        f = new Msn.Drawing.Color(0, 255, 0, 1);
    _curmap = b;
    this._svgLayer = null;
    var d = 60,
        e = c,
        a = [];
    this.DrawPrimitive = function (d) {
        var c = Msn.Drawing.SVGGraphic.prototype.DrawPrimitive(b, d, this);
        if (c) a.push(c)
    };
    this.resetOffset = function () {
        _curmap.resetSvgLayer()
    };
    this.SetZIndex = function (a) {
        d = a;
        if (this._svgLayer != null) this._svgLayer.SetZIndex(a)
    };
    this.Destroy = function () {
        this.Clear()
    };
    this.Clear = function () {
        if (this._svgLayer == null) return;
        var b = null,
            c = null;
        while (b = a.pop()) {
            c = b.parentNode;
            if (c) c.removeChild(b);
            b = null
        }
    }
};
Msn.Drawing.SVGGraphic.prototype = new Msn.Drawing.BaseGraphic;
Msn.Drawing.SVGGraphic.prototype.CreatePrimitive = function (a, b, c) {
    this._svgLayer = a.getSvgLayer();
    return this._svgLayer.addShape(b, c)
};
Msn.Drawing.SVGGraphic.prototype.UpdatePoints = function (a, b, c) {
    this._svgLayer = a.getSvgLayer();
    return this._svgLayer.UpdatePoints(b, c)
};
Msn.Drawing.SVGGraphic.prototype.UpdateStyle = function (a, b, c) {
    this._svgLayer = a.getSvgLayer();
    return this._svgLayer.UpdateStyle(b, c)
};
Msn.Drawing.SVGGraphic.prototype._printable = false;
Msn.Drawing.SVGGraphic.prototype._printTilesLayer = null;
Msn.Drawing.SVGGraphic.prototype._printTopLayer = null;
Msn.Drawing.SVGGraphic.prototype._printLogo = null;
Msn.Drawing.SVGGraphic.prototype._offsetX = null;
Msn.Drawing.SVGGraphic.prototype._offsetY = null;
Msn.Drawing.SVGGraphic.prototype.CreatePrintLayer = function (d, a, c, b) {
    if (!this._printable) {
        this._svgLayer = a.getSvgLayer();
        this._printTopLayer = this._svgLayer.CreatePrintLayer("MSVE_Print_TopLayer");
        this._printTopLayer.setAttributeNS(null, "width", parseInt(c));
        this._printTopLayer.setAttributeNS(null, "height", parseInt(b));
        this._printTilesLayer = this._svgLayer.CreatePrintLayer("MSVE_Print_TileLayer");
        this._printable = true
    }
};
Msn.Drawing.SVGGraphic.prototype.RemovePrintLayer = function () {
    if (this._printable) {
        this._printTilesLayer.parentNode.removeChild(this._printTilesLayer);
        this._printTopLayer.parentNode.removeChild(this._printTopLayer);
        this._printTilesLayer = null;
        this._printTopLayer = null;
        this._printLogo = null;
        this._printable = false
    }
};
Msn.Drawing.SVGGraphic.prototype.AddPrintTile = function (g, h, f, e, c, b, d) {
    var a = null;
    if (this._printable) {
        a = document.createElementNS("http://www.w3.org/2000/svg", "image");
        a.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", g);
        a.setAttributeNS(null, "preserveAspectRatio", "none");
        a.setAttributeNS(null, "x", f - this._offsetX);
        a.setAttributeNS(null, "y", h - this._offsetY);
        a.setAttributeNS(null, "width", e);
        a.setAttributeNS(null, "height", c);
        a.setAttributeNS(null, "opacity", b);
        this.AddPrintTileToLayer(a, d)
    }
    return a
};
Msn.Drawing.SVGGraphic.prototype.AddPrintTileToLayer = function (d, b) {
    var a = this._printTilesLayer.firstChild;
    while (a && a.style.zIndex < b) a = a.nextSibling;
    if (!a || a.style.zIndex != b) {
        var c = document.createElementNS("http://www.w3.org/2000/svg", "g");
        c.style.zIndex = b;
        this._printTilesLayer.insertBefore(c, a);
        a = c
    }
    a.appendChild(d)
};
Msn.Drawing.SVGGraphic.prototype.RemovePrintTile = function (a) {
    if (this._printable) a.parentElement.removeChild(a)
};
Msn.Drawing.SVGGraphic.prototype.RePositionPrintTile = function (a, c, b) {
    a.setAttributeNS(null, "x", b - this._offsetX);
    a.setAttributeNS(null, "y", c - this._offsetY)
};
Msn.Drawing.SVGGraphic.prototype.SetOffset = function (a, b) {
    this._offsetX = a;
    this._offsetY = b
};
Msn.Drawing.SVGGraphic.prototype.AddLogo = function (b) {
    if (this._printable) {
        var a = document.createElementNS("http://www.w3.org/2000/svg", "image");
        a.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", b);
        a.setAttributeNS(null, "class", "MSVE_PoweredByLogo_print");
        a.setAttributeNS(null, "x", 6);
        a.setAttributeNS(null, "y", parseInt(this._printTopLayer.getAttribute("height")) - 79);
        this._printLogo = a;
        this._printTopLayer.appendChild(a)
    }
};
Msn.Drawing.SVGGraphic.prototype.RepositionLogo = function (b, a) {
    if (this._printable && this._printLogo) this._printLogo.setAttributeNS(null, "y", parseInt(a) - 79)
};
Msn.Drawing.SvgLayer = function (f, g) {
    var c = g,
        b = null,
        e = false,
        h = false;
    if (e == false) {
        e = true;
        b = document.createElementNS("http://www.w3.org/2000/svg", "svg");
        b.setAttribute("height", "100%");
        b.setAttribute("width", "100%");
        f.appendChild(b);
        this.lineDashStyles = [];
        var a = this.lineDashStyles;
        a[0] = ["Solid", "none"];
        a[1] = ["ShortDash", "6,2"];
        a[2] = ["ShortDot", "2,2"];
        a[3] = ["ShortDashDot", "6,2,2,2"];
        a[4] = ["ShortDashDotDot", "6,2,2,2,2,2"];
        a[5] = ["Dot", "2,6"];
        a[6] = ["Dash", "10,6"];
        a[7] = ["LongDash", "20,6"];
        a[8] = ["DashDot", "10,6,2,6"];
        a[9] = ["LongDashDot", "20,6,2,6"];
        a[10] = ["LongDashDotDot", "20,6,2,6,2,6"]
    }
    this.addShape = function (e) {
        if (b == null) return;
        var a = null;
        if (e.type == VEShapeType.Pushpin) {
            a = document.createElementNS("http://www.w3.org/2000/svg", "rect");
            var i = LatLongtoRoundedPixel(c, e.points[1], e.points[0]);
            a.setAttribute("x", i.x - 4);
            a.setAttribute("y", i.y - 4);
            a.setAttribute("width", "8pt");
            a.setAttribute("height", "8pt");
            a.setAttribute("stroke-width", e.symbol.stroke_weight);
            a.setAttribute("stroke", e.symbol.stroke_color);
            a.setAttribute("fill", e.symbol.fill_color);
            b.appendChild(a)
        } else if (e.type == VEShapeType.Polyline || e.type == VEShapeType.Polygon) {
            var h = e.type == VEShapeType.Polygon ? true : false;
            a = document.createElementNS("http://www.w3.org/2000/svg", h ? "polygon" : "polyline");
            a.setAttributeNS(null, "class", "MSVE_Shape");
            a.setAttribute("points", GetSvgPath(c, e.points));
            a.setAttribute("stroke", e.symbol.stroke_color);
            a.setAttribute("stroke-width", e.symbol.stroke_weight);
            a.setAttribute("stroke-linejoin", e.symbol.stroke_joinstyle);
            a.setAttribute("stroke-opacity", d(e.symbol.stroke_opacity));
            var g = this.lineDashStyles;
            for (var f = 0; f < g.length; f++) if (e.symbol.stroke_dashstyle == g[f][0]) a.setAttribute("stroke-dasharray", g[f][1]);
            if (!h) a.setAttribute("fill", "none");
            else {
                a.setAttribute("fill-rule", "evenodd");
                a.setAttribute("fill", e.symbol.fill_color);
                a.setAttribute("fill-opacity", d(e.symbol.fill_opacity))
            }
        }
        if (a) {
            a.setAttribute("id", e.id != 0 ? e.id : e.iid);
            b.appendChild(a)
        }
        return a
    };

    function d(b) {
        var a = parseFloat(b);
        if (a == NaN) a = .3;
        else if (a > 1) a /= 100;
        else if (a < 0) a = 0;
        return a
    }
    this.SetZIndex = function (a) {
        if (!c.bShowSVG) return;
        c.GetsvgDiv().style.zIndex = a
    };
    this.UpdatePoints = function (a, b) {
        if (a.type == VEShapeType.Polyline || a.type == VEShapeType.Polygon) b.setAttribute("points", GetSvgPath(c, a.points))
    };
    this.UpdateStyle = function (a, c) {
        if (b == null) return;
        if (a.type != VEShapeType.Pushpin) {
            c.setAttribute("stroke", a.symbol.stroke_color);
            c.setAttribute("stroke-width", a.symbol.stroke_weight);
            c.setAttribute("stroke-linejoin", a.symbol.stroke_joinstyle);
            c.setAttribute("stroke-opacity", d(a.symbol.stroke_opacity));
            var f = this.lineDashStyles;
            for (var e = 0; e < f.length; e++) if (a.symbol.stroke_dashstyle == f[e][0]) c.setAttribute("stroke-dasharray", f[e][1]);
            if (a.type == VEShapeType.Polyline) c.setAttribute("fill", "none");
            else {
                c.setAttribute("fill", a.symbol.fill_color);
                c.setAttribute("fill-opacity", d(a.symbol.fill_opacity))
            }
        }
        return a
    };
    this.CreatePrintLayer = function (c) {
        var a = null;
        if (b) {
            a = document.createElementNS("http://www.w3.org/2000/svg", "g");
            a.setAttributeNS(null, "class", c);
            b.insertBefore(a, b.firstChild)
        }
        return a
    }
};

function GetSvgPath(j, e) {
    if (!e) return null;
    var a = 0,
        k = e.length,
        f = k / 2,
        i = 0,
        c = new Array(Math.max(128, Math.round(k / 8))),
        b = null,
        l = 0,
        m = 0,
        g = 0,
        h = 0;
    while (a < f) {
        g = e[a * 2];
        h = e[a * 2 + 1];
        if (a == f - 1 || a == 0 || VE_IsDisplayLatLon(j, l, m, g, h, f)) {
            b = LatLongtoRoundedPixel(j, h, g);
            if (!b) return;
            var d = "";
            if (a < f - 1) d = d.concat(b.x, ",", b.y, ",");
            else d = d.concat(b.x, ",", b.y);
            if (i >= c.length) c.length += Math.round(c.length / 4);
            c[i++] = d;
            l = g;
            m = h
        }
        a++
    }
    if (i > 0) c.length = i;
    return c.join("")
}
function LatLongtoRoundedPixel(b, d, e) {
    var c;
    if (typeof VEMap != "undefined" && b instanceof VEMap) c = new VELatLong(d, e);
    else c = new Msn.VE.LatLong(d, e);
    var a = b.LatLongToPixel(c, b.GetZoomLevel());
    if (!a) return null;
    a.x = MathRound(a.x);
    a.y = MathRound(a.y);
    return a
}
VE_LatLongThreshold = {
    PixelDiff: 8,
    DistDiff: .5,
    OriginLat: 0,
    OriginLon: 0,
    LatDiff: 0,
    LonDiff: 0,
    UseThreshold: true,
    IsNotInit: true
};

function VE_SetLatLonThreshold(c, e, d) {
    VE_LatLongThreshold.IsNotInit = false;
    if (e != null && d != null) {
        VE_LatLongThreshold.OriginLat = d;
        VE_LatLongThreshold.OriginLon = e
    }
    var a, b = LatLongtoRoundedPixel(c, VE_LatLongThreshold.OriginLat, VE_LatLongThreshold.OriginLon);
    if (b) {
        a = c.PixelToLatLong(new VEPixel(b.x + VE_LatLongThreshold.PixelDiff, b.y + VE_LatLongThreshold.PixelDiff));
        VE_LatLongThreshold.LatDiff = Math.abs(a.latitude - VE_LatLongThreshold.OriginLat);
        VE_LatLongThreshold.LonDiff = Math.abs(a.longitude - VE_LatLongThreshold.OriginLon)
    }
}
function VE_IsDisplayLatLon(e, i, h, b, a) {
    if (!VE_LatLongThreshold.UseThreshold) return true;
    var c = Math.abs(VE_LatLongThreshold.OriginLat - a),
        d = Math.abs(VE_LatLongThreshold.OriginLon - b);
    if (Math.max(c, d) > VE_LatLongThreshold.DistDiff || VE_LatLongThreshold.IsNotInit) VE_SetLatLonThreshold(e, b, a);
    var f = Math.abs(a - h),
        g = Math.abs(b - i);
    if (f > VE_LatLongThreshold.LatDiff || g > VE_LatLongThreshold.LonDiff) return true;
    return false
}
function GetVmlPath(j, a) {
    var h = a.points;
    if (!h) return null;
    var g = 0,
        l = h.length,
        m = l / 2,
        e = 0,
        b = new Array(Math.max(128, Math.round(l / 8)));
    b[e++] = "m ";
    var q = MathRound(j.GetOffsetY()),
        p = MathRound(j.GetOffsetX()),
        f = null,
        n = 0,
        o = 0,
        c = 0,
        d = 0;
    if (l >= 4) {
        c = h[g * 2];
        d = h[g * 2 + 1];
        f = LatLongtoRoundedPixel(j, d, c);
        if (!f) return null;
        var i = "";
        i = i.concat(f.x + p, ",", f.y + q, " l ");
        if (e >= b.length) b.length += Math.round(b.length / 4);
        b[e++] = i;
        n = c;
        o = d;
        ++g
    }
    var k = false;
    if (a.type != VEShapeType.Pushpin) if (a.minX == null || a.minY == null || a.maxX == null || a.maxY == null) {
        k = false;
        a.minX = 360;
        a.minY = 360;
        a.maxX = -360;
        a.maxY = -360
    } else k = true;
    while (g < m) {
        c = h[g * 2];
        d = h[g * 2 + 1];
        if (!k) {
            a.minX = Math.min(a.minX, c);
            a.minY = Math.min(a.minY, d);
            a.maxX = Math.max(a.maxX, c);
            a.maxY = Math.max(a.maxY, d)
        }
        if (VE_IsDisplayLatLon(j, n, o, c, d, m) || g == m - 1) {
            f = LatLongtoRoundedPixel(j, d, c);
            if (!f) return null;
            var i = "";
            i = i.concat(f.x + p, ",", f.y + q, " ");
            if (e >= b.length) b.length += Math.round(b.length / 4);
            b[e++] = i;
            n = c;
            o = d
        }++g
    }
    if (e >= b.length) b.length += 1;
    b[e++] = " e";
    if (e > 0) b.length = e;
    return b.join("")
}
function GetCurrentMapViewBounds(b) {
    var o = b.GetCenterLongitude(),
        p = b.GetCenterLatitude(),
        a = b.LatLongToPixel(new Msn.VE.LatLong(p, o)),
        h = b.GetMapWidth(),
        g = b.GetMapHeight();
    if (!a || isNaN(a.x) || isNaN(a.y)) return new Msn.VE.Bounds(0, 0, -Infinity, -Infinity, Infinity, Infinity);
    var l, n, k, m, j = false,
        q = b.GetMapStyle(),
        c = b.PixelToLatLong(new VEPixel(a.x - h / 2, a.y + g / 2)),
        d = b.PixelToLatLong(new VEPixel(a.x + h / 2, a.y - g / 2));
    if (Msn.VE.MapStyle.IsViewOblique(q)) {
        var e = b.PixelToLatLong(new VEPixel(a.x - h / 2, a.y - g / 2)),
            f = b.PixelToLatLong(new VEPixel(a.x + h / 2, a.y + g / 2));
        if (c != null && d != null && e != null && f != null) {
            l = Math.min(c.longitude, d.longitude, e.longitude, f.longitude);
            n = Math.min(c.latitude, d.latitude, e.latitude, f.latitude);
            k = Math.max(c.longitude, d.longitude, e.longitude, f.longitude);
            m = Math.max(c.latitude, d.latitude, e.latitude, f.latitude)
        } else j = true
    } else if (c != null && d != null) {
        l = Math.min(c.longitude, d.longitude);
        n = Math.min(c.latitude, d.latitude);
        k = Math.max(c.longitude, d.longitude);
        m = Math.max(c.latitude, d.latitude)
    } else j = true;
    var i = null;
    if (j) i = new Msn.VE.Bounds(0, 0, -Infinity, -Infinity, Infinity, Infinity);
    else i = new Msn.VE.Bounds(0, 0, l, n, k, m);
    return i
}
function GetBufferedMapViewBounds(b, a) {
    var c = null,
        e = Math.abs(a.x2 - a.x1),
        d = Math.abs(a.y2 - a.y1);
    c = new Msn.VE.Bounds(0, 0, a.x1 - b * e, a.y1 - b * d, a.x2 + b * e, a.y2 + b * d);
    return c
}
function IsContainedInView(a, b) {
    var c = false;
    if (b.x1 > a.x1 && b.y1 > a.y1 && b.x2 < a.x2 && b.y2 < a.y2) c = true;
    return c
}
Msn.Drawing.ComputeBoundingBox = function (a) {
    if (typeof a == "undefined" || a == null || a.length == 0) return null;
    var c = [],
        f = Infinity,
        g = Infinity,
        d = -Infinity,
        e = -Infinity;
    for (var b = 0; b < a.length; b = b + 2) {
        f = Math.min(f, a[b]);
        g = Math.min(g, a[b + 1]);
        d = Math.max(d, a[b]);
        e = Math.max(e, a[b + 1])
    }
    c[0] = f;
    c[1] = g;
    c[2] = d;
    c[3] = e;
    return c
};

function IsBoundsIntersect(a, b) {
    if (a == null) return true;
    if (b == null) return true;
    if (a.x2 < b.x1 || a.x1 > b.x2 || a.y2 < b.y1 || a.y1 > b.y2) return false;
    return true
}
function IsDisplayShape(d, c, e, g, f, h) {
    if (c == 0) return true;
    if (e == f && g == h) return true;
    var a = null,
        b = null;
    a = d.LatLongToPixel(new Msn.VE.LatLong(g, e));
    b = d.LatLongToPixel(new Msn.VE.LatLong(h, f));
    if (a == null || b == null) return true;
    if (Math.abs(b.y - a.y) > c || Math.abs(b.x - a.x) > c) return true;
    else return false
}
function IsRecIntersect(c, d, a, b, g, h, e, f) {
    if (a < g || c > e || b < h || d > f) return false;
    return true
}
function wrapVmlElementInDiv(a) {
    var c = Msn.VE.Css.Functions.getComputedStyle,
        b = document.createElement("div");
    b.className = "VmlContainer";
    b.style.left = c(a, "left");
    b.style.top = c(a, "top");
    b.style.width = c(a, "width");
    b.style.height = c(a, "height");
    a.style.position = "relative";
    a.style.left = "0px";
    a.style.top = "0px";
    a.style.width = "100%";
    a.style.height = "100%";
    b.appendChild(a);
    return b
}
function VEColorToHexString(c, b, a) {
    return "#" + (c < 16 ? "0" : "") + Number(c).toString(16) + (b < 16 ? "0" : "") + Number(b).toString(16) + (a < 16 ? "0" : "") + Number(a).toString(16)
}
function VEHexStringToColor() {
    this.Convert = function (a) {
        a = a.toUpperCase();
        var b = hTov(a.substring(0, 1)),
            c = hTov(a.substring(1, 2)),
            d = hTov(a.substring(2, 3)),
            e = hTov(a.substring(3, 4)),
            f = hTov(a.substring(4, 5)),
            g = hTov(a.substring(5, 6)),
            h = b * 16 + c,
            i = d * 16 + e,
            j = f * 16 + g;
        return new VEColor(h, i, j, 1)
    };

    function hTov(h) {
        var v = 0;
        if (h == "A") v = 10;
        else if (h == "B") v = 11;
        else if (h == "C") v = 12;
        else if (h == "D") v = 13;
        else if (h == "E") v = 14;
        else if (h == "F") v = 15;
        else v = eval(h);
        return v
    }
}
_VERegisterNamespaces("Msn.VE");
$MVEM = new
function () {
    this.IsEnabled = function (a) {
        if (a == undefined) throw new VEException("$MVEM.IsEnabled", "err_invalidfeature", "Specified feature is invalid.");
        return a
    }
};

function VEException(b, c, a) {
    this.source = b;
    this.name = c;
    this.message = a
}
VEException.prototype.Name = this.name;
VEException.prototype.Source = this.source;
VEException.prototype.Message = this.message;

function pseudoHover(a) {
    if (!document.all) return;
    var d = function () {
        a.className += " ms_pseudoHover"
    },
        c = function () {
        a.className = a.className.replace(/\s*ms_pseudoHover/g, "")
    };
    a.attachEvent("onmouseenter", d);
    a.attachEvent("onmouseleave", c);
    window.attachEvent("onunload", b);

    function b() {
        a.detachEvent("onmouseenter", d);
        a.detachEvent("onmouseleave", c);
        window.detachEvent("onunload", b)
    }
}
function pseudoHoverForChildren(d, a) {
    if (!document.all) return;
    if (!a) a = "LI";
    var c = d.getElementsByTagName(a);
    for (var b = 0; b < c.length; b++) this.pseudoHover(c[b])
}
function pseudoHoverRemove(a) {
    if (!document.all) return;
    a.className = a.className.replace(/\s*ms_pseudoHover/g, "")
}
_VERegisterNamespaces("Msn.VE.Css");
Msn.VE.CurrentDomain = typeof Msn.VE.API != "undefined" && Msn.VE.API != null ? Msn.VE.API.Globals.vecurrentdomain : ".";
Msn.VE.Css = {
    Cursors: {
        Auto: "auto",
        Default: "default",
        Crosshair: "crosshair",
        Pointer: "pointer",
        Move: "move",
        Wait: "wait",
        Text: "text",
        Help: "help",
        NResize: "n-resize",
        NEResize: "ne-resize",
        NWResize: "nw-resize",
        SResize: "s-resize",
        SEResize: "se-resize",
        SWResize: "sw-resize",
        EResize: "e-resize",
        WResize: "w-resize",
        CustomCursors: null,
        defineCustomCursors: function (c) {
            Msn.VE.Css.Cursors.CustomCursors = c;
            var b, d = c.length;
            for (b = 0; b < d; b++) {
                var a = c[b];
                if (navigator.userAgent.indexOf(" Safari/") > -1) Msn.VE.Css.Cursors[a.name] = a.fallback;
                else Msn.VE.Css.Cursors[a.name] = 'url("' + a.domain + a.path + '"), ' + a.fallback
            }
        }
    },
    RegEx: {
        RectClip: /rect\((auto|\d+px|\d*\.*\d+em|\d*\.*\d+pt)\s*,*\s*(auto|\d+px|\d*\.*\d+em|\d*\.*\d+pt)\s*,*\s*(auto|\d+px|\d*\.*\d+em|\d*\.*\d+pt)\s*,*\s*(auto|\d+px|\d*\.*\d+em|\d*\.*\d+pt)\)/
    },
    Functions: {
        addClass: function (a) {
            this.alterClass(a, arguments, true)
        },
        removeClass: function (a) {
            this.alterClass(a, arguments, false)
        },
        alterClass: function (a, e, g) {
            var c, h = e.length;
            for (c = 1; c < h; c++) {
                var d = e[c],
                    d = e[c].replace(/^\s*/, "").replace(/\s*$/, "");
                if (d.indexOf(" ") != -1) continue;
                var f = new RegExp("(^| )" + d + "( |$)", "i");
                if (g) {
                    if (!f.test(a.className)) if (a.className == "") a.className = d;
                    else a.className += " " + d
                } else {
                    var b = a.className;
                    b = b.replace(f, "$1");
                    b = b.replace(/ $/, "");
                    a.className = b
                }
            }
        },
        getComputedStyle: function (b, c) {
            var a = null;
            if (document.defaultView && document.defaultView.getComputedStyle && typeof document.defaultView.getComputedStyle != "undefined") a = document.defaultView.getComputedStyle(b, null);
            else a = b.currentStyle;
            return a[c]
        },
        setClip: function (c, d, e) {
            var b = Msn.VE.Css.Functions.getClip(c, 0),
                f = Msn.VE.Css.RegEx.RectClip,
                a = f.exec(b);
            a[d] = e;
            if (d == 0) c.style.clip = a[0];
            else {
                a[d] = e;
                a.shift();
                b = "rect(" + a.join(" ") + ")";
                c.style.clip = b
            }
        },
        getClip: function (d, e) {
            var b = d.style.clip;
            if (b == "") {
                var b = (window.opera ? "auto" : Msn.VE.Css.Functions.getComputedStyle(d, "clip")) || "auto";
                if (b == "auto") b = "rect(auto auto auto auto)";
                else if (typeof b == "undefined" || b == null) {
                    var c = d.currentStyle;
                    if (typeof c != "undefined" && c != null) b = "rect(" + c.clipTop + " " + c.clipRight + " " + c.clipBottom + " " + c.clipLeft + ")"
                }
            }
            var f = Msn.VE.Css.RegEx.RectClip,
                a = f.exec(b);
            if (e == 0) return a[0];
            a[1] = a[1] == "auto" ? 0 : a[1];
            a[4] = a[4] == "auto" ? 0 : a[4];
            a[2] = a[2] == "auto" ? d.offsetWidth : a[2];
            a[3] = a[3] == "auto" ? d.offsetHeight : a[3];
            if (e == 5) return a;
            else return a[e]
        }
    }
};
_VERegisterNamespaces("Msn.VE");
Msn.VE.OSType = {
    Windows: 1,
    Windows95: 2,
    Windows98: 3,
    WindowsMillenium: 4,
    WindowsNT: 5,
    WindowsNT4: 6,
    Windows2000: 7,
    Windows2000SP1: 8,
    WindowsXP: 9,
    WindowsXPSP2: 10,
    WindowsServer2003: 11,
    WindowsServer2003SP1: 12,
    WindowsVista: 13,
    MacOS: 30,
    MacOS9: 31,
    MacOSX: 32,
    Linux: 40,
    Unknown: 100
};
Msn.VE.CLRType = {
    CLR10: 1,
    CLR11: 2,
    CLR20: 4,
    CLR30: 8
};
Msn.VE.BrowserType = {
    Firefox: 1,
    MSIE: 2,
    Opera: 3,
    Unknown: 10
};
Msn.VE.BrowserCaps = {
    VML: 1,
    SVG: 2,
    WindowlessSelectElement: 4,
    RightMouseButton: 8,
    AddFavourite: 16,
    VectorCapable: 3
};
Msn.VE.BrowserInfo = function () {
    var a = this;
    this.Type = null;
    this.BrowserCaps = 0;
    this.CLRType = 0;
    this.MajorVersion = null;
    this.MinorVersion = null;
    this.versionString = null;
    this.UserAgent = null;
    this.OSType = null;
    this.Locale = null;
    if (arguments.length == 0) {
        this.UserAgent = window.navigator.userAgent;
        this.currentBrowser = true
    } else {
        this.UserAgent = arguments[0];
        this.currentBrowser = false;
        if (arguments.length >= 2) this.Locale = arguments[1]
    }
    this.IsCompatibleWith = function (c) {
        for (var b = 0; b < c.length; b++) {
            var a = c[b];
            if (a.Type == this.Type && (this.MajorVersion > a.MajorVersion || a.MajorVersion == this.MajorVersion && a.MinorVersion >= this.MinorVersion)) return true
        }
        return false
    };

    function b() {
        if (a.UserAgent.indexOf("Mac") == -1 && (a.UserAgent.indexOf("Gecko") != -1 || a.UserAgent.indexOf("MSIE") != -1)) a.BrowserCaps |= Msn.VE.BrowserCaps.RightMouseButton
    }
    function c() {
        if (a.UserAgent.indexOf("MSIE 7") != -1 || a.UserAgent.indexOf("MSIE 8") != -1 || a.UserAgent.indexOf("Gecko") != -1) a.BrowserCaps |= Msn.VE.BrowserCaps.WindowlessSelectElement
    }
    function j() {
        if (a.UserAgent.indexOf("Mac") == -1 && (a.UserAgent.indexOf("MSIE 5") != -1 || a.UserAgent.indexOf("MSIE 6") != -1 || a.UserAgent.indexOf("MSIE 7") != -1 || a.UserAgent.indexOf("MSIE 8") != -1)) a.BrowserCaps |= Msn.VE.BrowserCaps.VML
    }
    function i() {
        if (a.UserAgent.indexOf("MSIE") == -1) {
            var d = 0,
                e = 0,
                f = new RegExp("Firefox/(.*)"),
                c = f.exec(a.UserAgent);
            if (c && c.length >= 2) {
                var b = c[1].split(".");
                if (b) {
                    d = b[0];
                    e = b[1];
                    if (parseInt(d) > 0 && parseInt(e) >= 5) a.BrowserCaps |= Msn.VE.BrowserCaps.SVG
                }
            }
        }
    }
    function h() {
        try {
            if (a.UserAgent.indexOf("MSIE") != -1) a.BrowserCaps |= Msn.VE.BrowserCaps.AddFavourite
        } catch(b) {}
    }
    this.GetVersionString = function () {
        if (this.versionString == null) if (a.UserAgent.indexOf("Win") != -1 && a.UserAgent.indexOf("MSIE") != -1) {
            var b = null,
                c;
            try {
                b = document.createElement("<DIV STYLE='behavior:url(#default#clientCaps); display: none' ID='__clientCaps'>");
                document.body.appendChild(b);
                c = b.getComponentVersion("{89820200-ECBD-11CF-8B85-00AA005B4383}", "componentid")
            } catch(d) {
                c = a.MajorVersion + "." + a.MinorVersion
            } finally {
                if ($ID("__clientCaps") != null) $ID("__clientCaps").parentNode.removeChild(b)
            }
            this.versionString = c
        } else if (a.MajorVersion != null && a.MajorVersion != null) this.versionString = a.MajorVersion + "." + a.MinorVersion;
        else this.versionString = "";
        return this.versionString
    };

    function e() {
        if (a.UserAgent.indexOf("MSIE") != -1) {
            var c = new RegExp("MSIE ([0-9]).([0-9])"),
                b = c.exec(a.UserAgent);
            if (b != null) {
                a.MajorVersion = parseInt(b[1]);
                a.MinorVersion = parseInt(b[2]);
                return
            }
        } else if (a.UserAgent.indexOf("Firefox") != -1) {
            var c = new RegExp("Firefox/([0-9]).([0-9])(.*)"),
                b = c.exec(a.UserAgent);
            if (b != null) {
                a.MajorVersion = parseInt(b[1]);
                a.MinorVersion = parseInt(b[2]);
                return
            }
        } else if (a.UserAgent.indexOf("Opera") != -1) {
            var c = new RegExp("Opera/([0-9]{1,2}).([0-9])"),
                b = c.exec(a.UserAgent);
            if (b != null) {
                a.MajorVersion = parseInt(b[1]);
                a.MinorVersion = parseInt(b[2]);
                return
            }
        }
        a.MajorVersion = null;
        a.MinorVersion = null
    }
    function g() {
        if (a.UserAgent.indexOf("Mac OS X") != -1) a.OSType = Msn.VE.OSType.MacOSX;
        else if (a.UserAgent.indexOf("Mac") != -1) a.OSType = Msn.VE.OSType.MacOS;
        else if (a.UserAgent.indexOf("Linux") != -1) a.OSType = Msn.VE.OSType.Linux;
        else if (a.UserAgent.indexOf("Win95") != -1 || a.UserAgent.indexOf("Windows 95") != -1) a.OSType = Msn.VE.OSType.Windows95;
        else if (a.UserAgent.indexOf("Win98") != -1 || a.UserAgent.indexOf("Windows 98") != -1) a.OSType = Msn.VE.OSType.Windows98;
        else if (a.UserAgent.indexOf("Win 9x 4.90") != -1) a.OSType = Msn.VE.OSType.WindowsMillenium;
        else if (a.UserAgent.indexOf("Windows NT 4.0") != -1) a.OSType = Msn.VE.OSType.WindowsNT4;
        else if (a.UserAgent.indexOf("Windows NT 5.01") != -1) a.OSType = Msn.VE.OSType.Windows2000SP1;
        else if (a.UserAgent.indexOf("Windows NT 5.0") != -1) a.OSType = Msn.VE.OSType.Windows2000;
        else if (a.UserAgent.indexOf("Windows NT 5.1") != -1 && a.UserAgent.indexOf("SV1") != -1) a.OSType = Msn.VE.OSType.WindowsXPSP2;
        else if (a.UserAgent.indexOf("Windows NT 5.1") != -1) a.OSType = Msn.VE.OSType.WindowsXP;
        else if (a.UserAgent.indexOf("Windows NT 5.2") != -1 && a.UserAgent.indexOf("SV1") != -1) a.OSType = Msn.VE.OSType.WindowsServer2003SP1;
        else if (a.UserAgent.indexOf("Windows NT 5.2") != -1) a.OSType = Msn.VE.OSType.WindowsServer2003;
        else if (a.UserAgent.indexOf("Windows NT 6.0") != -1) a.OSType = Msn.VE.OSType.WindowsVista;
        else if (a.UserAgent.indexOf("Windows NT") != -1) a.OSType = Msn.VE.OSType.WindowsNT;
        else if (a.UserAgent.indexOf("Win") != -1) a.OSType = Msn.VE.OSType.Windows;
        else a.OSType = Msn.VE.OSType.Unknown
    }
    function d() {
        if (a.UserAgent.indexOf(".NET CLR 1.0") != -1) a.CLRType |= Msn.VE.CLRType.CLR10;
        if (a.UserAgent.indexOf(".NET CLR 1.1") != -1) a.CLRType |= Msn.VE.CLRType.CLR11;
        if (a.UserAgent.indexOf(".NET CLR 2.0") != -1) a.CLRType |= Msn.VE.CLRType.CLR20;
        if (a.UserAgent.indexOf(".NET CLR 3.0") != -1) a.CLRType |= Msn.VE.CLRType.CLR30
    }
    function f() {
        if (a.Locale != null) return;
        a.Locale = "en-US";
        if (a.UserAgent.indexOf("MSIE") != -1) {
            if (navigator.browserLanguage) a.Locale = navigator.browserLanguage;
            if (navigator.userLanguage) a.Locale = navigator.userLanguage;
            if (navigator.systemLanguage) a.Locale = navigator.systemLanguage
        } else if (a.UserAgent.indexOf("Gecko") != -1) {
            var c = new RegExp("; (.*); rv:"),
                b = c.exec(a.UserAgent);
            if (b && b.length >= 2) a.Locale = b[1].substring(b[1].lastIndexOf(" "), b[1].length + 1)
        } else if (a.UserAgent.indexOf("Opera") != -1) {
            var c = new RegExp(" (.*)\\)"),
                b = c.exec(a.UserAgent);
            if (b && b.length >= 2) a.Locale = b[1].substring(b[1].lastIndexOf(" "), b[1].length + 1)
        }
    }
    function k() {
        if (a.UserAgent.indexOf("Gecko") != -1) a.Type = Msn.VE.BrowserType.Firefox;
        else if (a.UserAgent.indexOf("MSIE") != -1) a.Type = Msn.VE.BrowserType.MSIE;
        else if (a.UserAgent.indexOf("Opera") != -1) a.Type = Msn.VE.BrowserType.Opera;
        else a.Type = Msn.VE.BrowserType.Unknown;
        e();
        g();
        d();
        f();
        h();
        i();
        j();
        c();
        b()
    }
    k()
};
Msn.VE.Environment = function () {};
Msn.VE.Environment.Redirect = function (a) {
    window.location.href = a
};
Msn.VE.Environment.BrowserInfo = new Msn.VE.BrowserInfo;
Msn.VE.Environment.IsFF20 = function () {
    var a = Msn.VE.Environment.BrowserInfo;
    if (a.Type == Msn.VE.BrowserType.Firefox) {
        var b = a.MajorVersion;
        if (b >= 2) return true
    }
    return false
};
Msn.VE.Environment.IsIE50 = function () {
    var a = Msn.VE.Environment.BrowserInfo;
    if (a.Type == Msn.VE.BrowserType.MSIE) {
        var b = a.MajorVersion;
        if (b >= 5) return true
    }
    return false
};
Msn.VE.Environment.IsIE80 = function () {
    var a = Msn.VE.Environment.BrowserInfo;
    if (a.Type == Msn.VE.BrowserType.MSIE) {
        var b = a.MajorVersion;
        if (b >= 8) return true
    }
    return false
};
_VERegisterNamespaces("Msn.VE");
Msn.VE.PushPinTypes = {
    Default: 0,
    SearchResultPrecise: 1,
    Annotation: 2,
    Direction: 3,
    DirectionTemp: 4,
    TrafficLight: 5,
    TrafficOthers: 6,
    YouAreHere: 7,
    AdStandard: 8,
    AdWide: 9,
    AdCategory: 10,
    AdRoofStandard: 11,
    AdRoofWide: 12,
    AdSponsor: 13,
    DirectionStep: 14,
    Context: 15,
    SearchResultNonprecise: 16,
    Collection: 17,
    Overlay: 18
};
Msn.VE.MapActionMode = {
    ModeUnknown: 0,
    Mode2D: 1,
    Mode3D: 2,
    ModeOblique: 3
};
Msn.VE.BirdsEyeSearchSpinDirection = {
    ClockwiseSpin: -1,
    NoSpin: 0,
    CounterclockwiseSpin: 1
};
Msn.VE.LineJoinMode = {
    Straight: "miter",
    Round: "round"
};
Msn.VE.Css.Cursors.defineCustomCursors([{
    name: "Grab",
    domain: ".",
    path: "/cursors/grab.cur",
    fallback: "move"
},
{
    name: "Grabbing",
    domain: ".",
    path: "/cursors/grabbing.cur",
    fallback: "move"
},
{
    name: "Target",
    domain: ".",
    path: "/cursors/target.cur",
    fallback: "crosshair"
}]);
Msn.VE.MapControl = function (p_elSource, p_htParams, p_parentAPIControl) {
    var offsetMeters = 20971520,
        baseMetersPerPixel = 163840,
        buffer = 0,
        maxTilePixelBuffer = 768,
        animatedMovementEnabled = true,
        zoomTotalSteps = 6,
        keyboardPanSpeed = 15,
        panToLatLongSpeed = 15,
        earthRadius = 6378137,
        earthCircumference = earthRadius * 2 * Math.PI,
        projectionOffset = earthCircumference * .5,
        minZoom = 1,
        maxZoom = 19,
        emptyTile = "http://virtualearth.msn.com/i/spacer.gif",
        minLatitude = -85,
        maxLatitude = 85,
        minLongitude = -180,
        maxLongitude = 180,
        tileSize = 256,
        generations = {},
        zoomLevelToAdjustObliqueToOrthro = 18,
        kbInputZIndex = 0,
        containerZIndex = 0,
        mapZIndex = 1,
        swapZIndex = 1,
        baseZIndex = 2,
        debugZIndex = 3,
        baseZIndex = 11,
        topZIndex = 20,
        p_this = this,
        m_clientToken = null,
        cssCursors = Msn.VE.Css.Cursors,
        cssFn = Msn.VE.Css.Functions,
        roadStyle = Msn.VE.MapStyle.Road,
        shadedStyle = Msn.VE.MapStyle.Shaded,
        hybridStyle = Msn.VE.MapStyle.Hybrid,
        aerialStyle = Msn.VE.MapStyle.Aerial,
        obliqueStyle = Msn.VE.MapStyle.Oblique,
        obliqueHybridStyle = Msn.VE.MapStyle.ObliqueHybrid;
    generations[roadStyle] = 392;
    generations[aerialStyle] = 392;
    generations[hybridStyle] = 392;
    generations[obliqueStyle] = 392;
    generations[obliqueHybridStyle] = 392;
    var mapTiles = "Road",
        trafficTiles = "Traffic",
        marketMaxZoom = 1,
        currentScaleBarUnit = null,
        currentView = new Msn.VE.MapView(p_this),
        preferredView = new Msn.VE.MapView(p_this),
        previousZoomLevel = 1,
        previousCenter = null,
        lastViewChangeType = null,
        previousMapStyle = null,
        lastOrthoZoomLevel = 15,
        lastOrthoMapStyle = roadStyle,
        x = 0,
        y = 0,
        width = 0,
        height = 0,
        trafficAvailable = false,
        tileLayerManager = new VETileLayerManager,
        originX = 0,
        originY = 0,
        offsetX = 0,
        offsetY = 0,
        tileViewportX1 = 0,
        tileViewportY1 = 0,
        tileViewportX2 = 0,
        tileViewportY2 = 0,
        tileViewportWidth = 0,
        tileViewportHeight = 0,
        dragging = false,
        keyboardPan = false,
        lastMouseX = 0,
        lastMouseY = 0,
        zooming = false,
        zoomCounter = 0,
        panning = false,
        panCounter = 0,
        panningX = 0,
        panningY = 0,
        panLatitude = null,
        panLongitude = null,
        pushpins = [],
        lines = [],
        map = document.createElement("div"),
        keyboard = document.createElement("input");
    keyboard.id = "wl_ve_mapInput";
    var logo = null,
        scaleBar = null,
        mapLegend = null,
        copyright = null;
    this.UpdateCopyright = function () {
        if (copyright) copyright.Update()
    };
    var dashboardContainer = null,
        dashboard = null,
        minimapControl = null,
        minimapContainer = null,
        mouseZoomDisabled = false,
        mousewheelZoomToCenter = true,
        isMinimap = false,
        boxTool = null,
        panTool = null,
        targetTool = null,
        currentTool = null,
        orthoMode = null,
        obliqueMode = null,
        threeDMode = null,
        currentMode = null,
        previousMode = null,
        Initialized2D = false,
        currentBounds = null,
        defaultEventTable = [],
        customEventTable = [],
        debug = false,
        graphicCanvas = null,
        svgLayer = null,
        svgDiv = null,
        bShowSVG = true;
    this.GetsvgDiv = function () {
        return svgDiv
    };
    var mapCenterOffset = new VEPixel(0, 0),
        resizeInProgress = false,
        loadBaseTiles = true,
        view3DCreated = false,
        spacecontrol = false,
        spacediv = null,
        spaceCameraIsFlying = false,
        init3dparam = null,
        resizeTimer = null,
        traffic3dAdded = false,
        initial3dView = null,
        cameraUpdateCount = 0,
        photoplugin3dActive = false;
    this.Is3DPhotoPluginActive = function () {
        return photoplugin3dActive
    };
    this.Set3DPhotoPluginActive = function (a) {
        photoplugin3dActive = a
    };

    function SetChildDiv(a) {
        map.appendChild(a)
    }
    function EnableGeoCommunity(a) {
        hijackMouseMove = a
    }
    function IsGeoCommunityEnabled() {
        return hijackMouseMove
    }
    function HijackMouseCursor(a) {
        hijackMouseCursor = a
    }
    function IsHijackMouseCursor() {
        return hijackMouseCursor
    }
    function GetOffsetX() {
        return offsetX
    }
    function GetOffsetY() {
        return offsetY
    }
    function GetOriginY() {
        return originY
    }
    function GetOriginX() {
        return originX
    }
    this.Init = function () {
        orthoMode = new OrthoMode;
        orthoMode.Init();
        if (p_htParams.obliqueEnabled) {
            obliqueMode = new ObliqueMode;
            obliqueMode.SetGUID(p_htParams.mapGUID);
            obliqueMode.Init(p_htParams.obliqueUrl ? p_htParams.obliqueUrl : "%0dev.virtualearth.net/services/v1/ImageryMetadataService/ImageryMetadataService.asmx")
        }
        if (p_htParams.clientToken) this.SetClientToken(p_htParams.clientToken);
        threeDMode = new ThreeDMode;
        threeDMode.Init();
        UpdateFromParent();
        map.className = "MSVE_Map";
        map.style.zIndex = mapZIndex;
        p_elSource.appendChild(map);
        cssFn.addClass(p_elSource, "MSVE_MapContainer");
        keyboard.className = "MSVE_KeyboardInput";
        if (typeof Msn.VE.API != "undefined" && Msn.VE.API != null && Web.Browser.isSafari()) {
            keyboard.style.top = 0;
            keyboard.style.left = 0;
            keyboard.style.border = 0;
            if (Web.Browser.isSafari2()) {
                keyboard.style.height = 0;
                keyboard.style.width = 0
            } else if (Web.Browser.isSafari3()) {
                keyboard.style.outlineWidth = 0;
                keyboard.style.color = "transparent";
                keyboard.style.backgroundColor = "transparent"
            }
        }
        p_elSource.appendChild(keyboard);
        if (!p_htParams.fixedView) {
            p_elSource.attachEvent("onmousedown", MouseDown);
            p_elSource.attachEvent("onmouseup", MouseUp);
            p_elSource.attachEvent("onmousemove", MouseMove);
            p_elSource.attachEvent("ondblclick", MouseDoubleClick);
            p_elSource.attachEvent("oncontextmenu", ContextMenu);
            p_elSource.attachEvent("onclick", MouseClick);
            p_elSource.attachEvent("onmouseout", MouseOut);
            p_elSource.attachEvent("onmouseover", MouseOver);
            p_elSource.attachEvent("onmouseenter", MouseEnter);
            p_elSource.attachEvent("onmouseleave", MouseLeave)
        }
        if (p_htParams.buffer != undefined && p_htParams.buffer != null) SetTilePixelBuffer(p_htParams.buffer);
        var startIn3DMode = false;
        loadBaseTiles = typeof p_htParams.loadBaseTiles == "undefined" || p_htParams.loadBaseTiles != false;
        if (p_htParams.mapMode != "undefined" && p_htParams.mapMode != null && p_htParams.mapMode == Msn.VE.MapActionMode.Mode3D || p_htParams.altitude && p_htParams.altitude > -1000 || p_htParams.tilt && p_htParams.tilt != -90 || p_htParams.direction && p_htParams.direction != 0) {
            SetBaseTileSource();
            startIn3DMode = true;
            currentMode = threeDMode
        }
        init3dparam = p_htParams.mapGUID;
        if ((p_htParams.latitude != null && typeof p_htParams.latitude != "undefined" && p_htParams.longitude != null && typeof p_htParams.longitude != "undefined" && p_htParams.zoomlevel != null && typeof p_htParams.zoomlevel != "undefined" || p_htParams.boundingBox != null && typeof p_htParams.boundingBox != "undefined") && p_htParams.mapstyle != null && typeof p_htParams.mapstyle != "undefined") try {
            var initialView = new Msn.VE.MapView(p_this);
            initialView.SetMapStyle(ValidateMapStyle(p_htParams.mapstyle), p_htParams.obliqueSceneId, p_htParams.birdseyeOrientation);
            if (startIn3DMode) {
                initialView.sceneId = p_htParams.obliqueSceneId;
                initialView.photoX = p_htParams.photoX;
                initialView.photoY = p_htParams.photoY;
                initialView.photoScale = p_htParams.photoScale
            }
            if (p_htParams.boundingBox) {
                var bb = p_htParams.boundingBox;
                if (bb.northwest) {
                    bb.northwest.latitude = ClipLatitude(bb.northwest.latitude);
                    bb.northwest.longitude = ClipLongitude(bb.northwest.longitude)
                }
                if (bb.southeast) {
                    bb.southeast.latitude = ClipLatitude(bb.southeast.latitude);
                    bb.southeast.longitude = ClipLongitude(bb.southeast.longitude)
                }
                initialView.SetLatLongRectangle(bb);
                if (startIn3DMode) initialView.Resolve(orthoMode, width, height)
            } else {
                initialView.SetZoomLevel(eval(p_htParams.zoomlevel));
                initialView.SetCenterLatLong(new Msn.VE.LatLong(eval(p_htParams.latitude), eval(p_htParams.longitude)))
            }
            if (p_htParams.altitude) initialView.SetAltitude(p_htParams.altitude);
            if (p_htParams.tilt) initialView.SetTilt(p_htParams.tilt);
            if (p_htParams.direction) initialView.SetDirection(p_htParams.direction);
            if (p_htParams.cameraPos) {
                initialView.cameraLatlong = new Msn.VE.LatLong(eval(p_htParams.cameraPos[0]), eval(p_htParams.cameraPos[1]));
                initialView._needsPivotOperation = false
            }
            if (!startIn3DMode) SetBaseTileSource();
            currentView = initialView
        } catch(a) {
            if (!startIn3DMode) SetDefaultView();
            else currentView = initialView
        } else if (!startIn3DMode) SetDefaultView();
        else currentView = initialView;
        if (startIn3DMode) this.Init3DOnly();
        else this.Init2DOnly();
        if (typeof p_htParams.hideCopyright == "undefined" || !p_htParams.hideCopyright) {
            copyright = new Copyright(p_elSource);
            copyright.Init();
            copyright.Update();
            if (scaleBar) copyright.PinTo(scaleBar);
            if (mapLegend) mapLegend.PinTo(copyright)
        }
        if (typeof p_htParams.showMinimap != "undefined" && p_htParams.showMinimap) {
            var loadMinimapNow = false;
            if (obliqueMode != null && Msn.VE.MapStyle.IsViewOblique(p_htParams.mapstyle)) loadMinimapNow = true;
            CreateMinimap(null, null, null, loadMinimapNow, null, p_htParams.minimapVersion, p_htParams.clientToken)
        }
        if (p_htParams.showDashboard) {
            if (p_htParams.showMapModeSwitch != false) p_htParams.showMapModeSwitch = true;
            CreateDashboard(p_htParams.dashboardX, p_htParams.dashboardY, p_htParams.dashboardSize, p_htParams.dashboardId, p_htParams.showMapModeSwitch, p_htParams.obliqueEnabled, p_htParams.labelsDefault, p_htParams.dashboardVersion)
        }
        if (p_htParams.showMapLegend) this.CreateLegend();
        if (startIn3DMode) copyright.Hide()
    };
    AttachEvent("onstartmapstyleoblique", function () {
        if (targetTool) targetTool.trackMovement()
    });
    AttachEvent("onendmapstyleoblique", function () {
        if (targetTool) targetTool.ignoreMovement()
    });
    AttachEvent("onchangeview", OnChangeView);
    this.Init2DOnly = function (a) {
        mvcViewFacade.OnSwitchToFlatlandView();
        currentView.doRoadShading = typeof p_htParams.doRoadShading != "undefined" && p_htParams.doRoadShading == true;
        if (!p_htParams.fixedView) {
            boxTool = new BoxTool;
            boxTool.Init();
            panTool = new PanTool;
            panTool.Init();
            currentTool = panTool;
            keyboard.attachEvent("onkeydown", KeyDown);
            keyboard.attachEvent("onkeyup", KeyUp);
            keyboard.attachEvent("onblur", StopKeyboardPan);
            p_elSource.attachEvent("onmousewheel", MouseWheel)
        }
        targetTool = new TargetTool;
        targetTool.init();
        if (!p_htParams.disableLogo) {
            logo = new Logo(p_elSource);
            logo.Init()
        }
        if (typeof copyright != "undefined" && copyright != null) copyright.Show();
        if (obliqueMode && currentMode != obliqueMode) obliqueMode.UpdateAvailability();
        graphicCanvas = GetGraphic(this);
        tileLayerManager.Active = true;
        if (currentView == null) SetDefaultView();
        else {
            if (a == true || !Initialized2D) {
                SetView(currentView);
                Initialized2D = true
            }
            SetView(null)
        }
        if (p_htParams.showScaleBar) {
            InitScaleBar();
            scaleBar.Show()
        }
        Fire("oninitmode", Msn.VE.MapActionMode.Mode2D)
    };

    function InitScaleBar() {
        scaleBar = new ScaleBar(p_elSource);
        scaleBar.Init();
        if (currentScaleBarUnit) SetScaleBarDistanceUnit(currentScaleBarUnit);
        if (copyright) copyright.PinTo(scaleBar);
        AttachEvent("onendzoom", scaleBar.Update);
        AttachEvent("onendpan", scaleBar.Update);
        AttachEvent("onobliquechange", scaleBar.Update);
        AttachEvent("onchangemapstyle", scaleBar.Update);
        AttachEvent("onresize", scaleBar.Reposition)
    }
    this.Init3DOnly = function () {
        if (typeof LoadMapDrawing == "function") LoadMapDrawing(null);
        if (dashboard) if (window.navigator.userAgent.indexOf("Firefox") < 0) {
            var d = dashboard.GetShimmedElements(),
                c;
            for (c = 0; c < d.length; c++) UpdateIFrameShim(d[c])
        }
        var b;
        try {
            if (currentView == null) b = SetDefaultView();
            else {
                var a = currentView.MakeCopy();
                if (Msn.VE.MapStyle.IsViewOblique(currentView.mapStyle)) {
                    a.SetMapStyle(lastOrthoMapStyle);
                    a.SetZoomLevel(a.GetZoomLevel() + zoomLevelToAdjustObliqueToOrthro)
                }
                a.SetCenterLatLong(new Msn.VE.LatLong(currentView.latlong.latitude, currentView.latlong.longitude));
                a.cameraLatlong = currentView.cameraLatlong;
                b = SetView(a)
            }
        } catch(e) {
            b = false
        }
        if (!b) {
            this._Disable3DMode(true);
            return
        }
        if (!view3DCreated) return;
        mvcViewFacade.OnSwitchToView3D(spacecontrol);
        if (p_htParams.showDashboard) spacecontrol.ShowNavigationControl = true;
        if (typeof p_htParams.hideCopyright == "undefined" || !p_htParams.hideCopyright) spacecontrol.ShowCopyright = true;
        if (typeof copyright != "undefined" && copyright != null) copyright.Hide();
        if (p_htParams.showScaleBar) spacecontrol.ShowScale = true;
        if (currentScaleBarUnit && p_htParams.showScaleBar || Msn.VE.API) this.SetScaleBarDistanceUnit(currentScaleBarUnit);
        if ((typeof Msn.VE.API == "undefined" || !Msn.VE.API) && window.locale) spacecontrol.DisplayMetricUnits = MapControl.Features.ScaleBarKilometers;
        if (mapLegend) mapLegend.UpdateShim();
        spacecontrol.AttachEvent("OnHardwareCapabilitiesUpdate", "OnHardwareCapabilitiesUpdate");
        if (spacecontrol.HardwareClassificationLevel > 0) this.Setup3DManifests();
        tileLayerManager.AddAllTileSourcesTo3D(spacecontrol);
        AttachEvent("onchangetraffic", OnView3DScaleBarPositionUpdate);
        AttachEvent("onchangemapstyle", OnChangeMapStyle3D);
        spacecontrol.AttachEvent("OnCameraChanged", "OnView3DUpdateViewpoint");
        spacecontrol.AttachEvent("OnBeginCameraChange", "OnBeginFlyTo");
        if (!p_htParams.fixedView) {
            spacecontrol.AttachEvent("OnHover", "OnView3DPushpinHover");
            spacecontrol.AttachEvent("OnHoverEnd", "OnView3DHoverEnd");
            spacecontrol.AttachEvent("OnDropGeometry", "OnView3DDropGeometry");
            spacecontrol.AttachEvent("OnLatLonAltClicked", "OnView3DLatLonAltClicked");
            spacecontrol.AttachEvent("OnMouseDown", "OnMouseDown3D");
            spacecontrol.AttachEvent("OnMouseUp", "OnMouseUp3D");
            spacecontrol.AttachEvent("OnClick", "OnClick3D");
            spacecontrol.AttachEvent("OnMouseOver", "OnMouseOver3D");
            spacecontrol.AttachEvent("OnMouseOut", "OnMouseOut3D");
            spacecontrol.AttachEvent("OnDoubleClick", "OnDoubleClick3D");
            spacecontrol.AttachEvent("OnModelViewSuccess", "UniqueModelViewSuccess");
            spacecontrol.AttachEvent("OnModelViewFailure", "UniqueModelViewFailure");
            spacecontrol.AttachEvent("OnModelFullyDownloaded", "UniqueModelFullyDownloaded")
        } else spacecontrol.FixedView = true;
        traffic3dAdded = false;
        if (typeof VE_TrafficManager != "undefined" && VE_TrafficManager != null) VE_TrafficManager.GetTrafficInfo(false);
        OnView3DScaleBarPositionUpdate();
        if (typeof VE_BrandExplorationManager != "undefined" && VE_BrandExplorationManager != null) VE_BrandExplorationManager.Clear();
        LoadStreetLevelGeometry(spacecontrol);
        LoadHiResModelsPlugin(spacecontrol);
        LoadWeatherPlugin(spacecontrol);
        if (!init3dparam) Relay3DPushpins();
        Fire("oninitmode", Msn.VE.MapActionMode.Mode3D)
    };
    this.Setup3DManifests = function () {
        var c = currentView.mapStyle,
            a = "http://go.microsoft.com/fwlink/?LinkID=98770",
            b = "http://go.microsoft.com/fwlink/?LinkID=98775",
            d = "http://go.microsoft.com/fwlink/?LinkID=98774";
        if (c == "a") {
            a = "http://go.microsoft.com/fwlink/?LinkID=98771";
            spacecontrol.ShowAtmosphere = true
        }
        if (c == "h") {
            a = "http://go.microsoft.com/fwlink/?LinkID=98772";
            spacecontrol.ShowAtmosphere = true
        }
        if (c == "r") {
            spacecontrol.TexturesVisible = false;
            if (spacecontrol.HardwareClassificationLevel < 3) a = "http://go.microsoft.com/fwlink/?LinkID=98769";
            spacecontrol.ShowAtmosphere = false
        } else spacecontrol.TexturesVisible = true;
        if (2 == spacecontrol.HardwareClassificationLevel) {
            d = "http://go.microsoft.com/fwlink/?LinkID=98773";
            b = "http://go.microsoft.com/fwlink/?LinkID=98776"
        } else if (1 == spacecontrol.HardwareClassificationLevel) {
            d = "http://go.microsoft.com/fwlink/?LinkID=98773";
            b = ""
        }
        if (loadBaseTiles) spacecontrol.AddImageSource("Terrain", "Texture", GetManifestUrl(a), 0, 1);
        spacecontrol.AddElevationSource("Terrain", "DEM", GetManifestUrl(d), 0);
        if (b != "") spacecontrol.AddModelSource("Model", "Model", GetManifestUrl(b));
        else spacecontrol.RemoveModelSource("Model", "Model")
    };
    this.ShowSVG = function (a) {
        bShowSVG = a
    };
    this.getSvgLayer = function () {
        if (svgLayer == null) {
            svgDiv = document.createElement("div");
            svgDiv.style.position = "absolute";
            if (bShowSVG) svgDiv.style.zIndex = 60;
            else svgDiv.style.zIndex = -1;
            svgDiv.align = "left";
            this.resizeSVG();
            map.appendChild(svgDiv);
            svgLayer = new Msn.Drawing.SvgLayer(svgDiv, this)
        }
        return svgLayer
    };
    this.resetSvgLayer = function () {
        this.getSvgLayer();
        svgDiv.style.top = -parseInt(map.style.top) + "px";
        svgDiv.style.left = -parseInt(map.style.left) + "px";
        if (currentMode != threeDMode && graphicCanvas) {
            graphicCanvas.SetOffset(offsetX, offsetY);
            tileLayerManager.RePositionPrintTiles()
        }
    };
    this.resizeSVG = function () {
        if (svgDiv != null) {
            var b = GetWindowWidth(),
                a = GetWindowHeight();
            svgDiv.style.top = "0px";
            svgDiv.style.left = "0px";
            svgDiv.style.width = b + "px";
            svgDiv.style.height = a + "px";
            if (currentMode != threeDMode && graphicCanvas) {
                graphicCanvas.SetOffset(offsetX, offsetY);
                graphicCanvas.RepositionLogo(g(p_elSource).getStyle("width"), g(p_elSource).getStyle("height"));
                tileLayerManager.RePositionPrintTiles()
            }
        }
    };

    function GetGraphic(a) {
        if (!graphicCanvas) try {
            graphicCanvas = Msn.Drawing.Graphic.CreateGraphic(map, a);
            graphicCanvas.SetZIndex(17)
        } catch(b) {}
        return graphicCanvas
    }
    this.GetDashboard = function () {
        return dashboard
    };
    this.GetMinimap = function () {
        return minimapControl
    };
    this.DisableZoomEvents = function (a) {
        mouseZoomDisabled = a
    };
    this.GetMouseWheelZoomToCenter = function () {
        return mousewheelZoomToCenter
    };
    this.SetMouseWheelZoomToCenter = function (a) {
        mousewheelZoomToCenter = a
    };
    this.SetMinimapMode = function () {
        mouseZoomDisabled = true;
        isMinimap = true
    };
    this.SetCursor = function (a) {
        var b = p_elSource.style;
        if (b.cursor != a) b.cursor = a
    };
    this.Destroy = function () {
        if (currentView) {
            currentView.Destroy();
            currentView = null
        }
        if (preferredView) {
            preferredView.Destroy();
            preferredView = null
        }
        if (copyright) {
            copyright.Destroy();
            copyright = null
        }
        if (currentMode == threeDMode && currentMode != null) this.Destroy3DOnly();
        else {
            this.Destroy2DOnly();
            while (pushpins.length) pushpins.pop().Destroy();
            ClearLines()
        }
        if (!p_htParams.fixedView) {
            p_elSource.detachEvent("onmousedown", MouseDown);
            p_elSource.detachEvent("onmouseup", MouseUp);
            p_elSource.detachEvent("onmousemove", MouseMove);
            p_elSource.detachEvent("ondblclick", MouseDoubleClick);
            p_elSource.detachEvent("oncontextmenu", ContextMenu);
            p_elSource.detachEvent("onmousewheel", MouseWheel);
            p_elSource.detachEvent("onclick", MouseClick);
            p_elSource.detachEvent("onmouseout", MouseOut);
            p_elSource.detachEvent("onmouseover", MouseOver);
            p_elSource.detachEvent("onmouseenter", MouseEnter);
            p_elSource.detachEvent("onmouseleave", MouseLeave)
        }
        if (dashboard) {
            if (typeof dashboard.Destroy != "undefined") dashboard.Destroy();
            dashboard = null
        }
        if (mapLegend) {
            DetachEvent("onendzoom", mapLegend.Update);
            DetachEvent("onendpan", mapLegend.Update);
            DetachEvent("onobliquechange", mapLegend.Update);
            if (typeof VE_TrafficManager != "undefined" && VE_TrafficManager != null) VE_TrafficManager.CloseTrafficLegend();
            mapLegend.Destroy();
            mapLegend = null
        }
        if (dashboardContainer) {
            dashboardContainer.detachEvent("onmousedown", IgnoreEvent);
            dashboardContainer.detachEvent("onmouseup", IgnoreEvent);
            dashboardContainer.detachEvent("onmousemove", DashboardContainerMouseMoveEvent);
            dashboardContainer.detachEvent("onmousewheel", IgnoreEvent);
            dashboardContainer.detachEvent("ondblclick", IgnoreEvent);
            dashboardContainer.detachEvent("oncontextmenu", IgnoreEvent);
            dashboardContainer.detachEvent("onkeydown", IgnoreEvent);
            dashboardContainer.detachEvent("onkeyup", IgnoreEvent);
            dashboardContainer = null
        }
        if (minimapControl) {
            minimapControl.Destroy();
            minimapControl = null
        }
        if (minimapContainer) {
            minimapContainer.detachEvent("onmousedown", IgnoreEvent);
            minimapContainer.detachEvent("onmouseup", IgnoreEvent);
            minimapContainer.detachEvent("onmousemove", DashboardContainerMouseMoveEvent);
            minimapContainer.detachEvent("onmousewheel", IgnoreEvent);
            minimapContainer.detachEvent("ondblclick", IgnoreEvent);
            minimapContainer.detachEvent("oncontextmenu", IgnoreEvent);
            minimapContainer.detachEvent("onkeydown", IgnoreEvent);
            minimapContainer.detachEvent("onkeyup", IgnoreEvent);
            minimapContainer = null
        }
        if (orthoMode) {
            orthoMode.Destroy();
            orthoMode = null
        }
        if (obliqueMode) {
            obliqueMode.Destroy();
            obliqueMode = null
        }
        if (threeDMode) {
            threeDMode.Destroy();
            threeDMode = null
        }
        DestroyEventTable();
        m_clientToken = null;
        p_elSource.style.backgroundColor = "transparent";
        p_elSource.style.backgroundImage = "none";
        p_elSource.style.filter = "";
        keyboard = p_elSource = p_this = map = null;
        tileLayerManager.ClearTileLayers();
        cssCursors = null;
        cssFn = null
    };
    this.Destroy2DOnly = function () {
        if (!p_htParams.fixedView) {
            keyboard.detachEvent("onkeydown", KeyDown);
            keyboard.detachEvent("onkeyup", KeyUp);
            keyboard.detachEvent("onblur", StopKeyboardPan);
            p_elSource.detachEvent("onmousewheel", MouseWheel)
        }
        tileLayerManager.Active = false;
        if (scaleBar) {
            DetachEvent("onendzoom", scaleBar.Update);
            DetachEvent("onendpan", scaleBar.Update);
            DetachEvent("onobliquechange", scaleBar.Update);
            DetachEvent("onchangemapstyle", scaleBar.Update);
            DetachEvent("onresize", scaleBar.Reposition);
            scaleBar.Destroy();
            scaleBar = null
        }
        if (copyright) copyright.PinTo(null);
        if (logo) {
            logo.Destroy();
            logo = null
        }
        if (boxTool) {
            boxTool.Destroy();
            boxTool = null
        }
        if (panTool) {
            panTool.Destroy();
            panTool = null
        }
        if (targetTool) {
            targetTool.destroy();
            targetTool = null
        }
        if (graphicCanvas) {
            graphicCanvas.Destroy();
            graphicCanvas = null
        }
        Fire("ondestroymode", Msn.VE.MapActionMode.Mode2D)
    };
    this.Destroy3DOnly = function () {
        DetachEvent("onchangetraffic", OnView3DScaleBarPositionUpdate);
        DetachEvent("onchangemapstyle", OnChangeMapStyle3D);
        view3DCreated = false;
        try {
            spacecontrol.Close()
        } catch(c) {}
        spacecontrol = false;
        window.status = "";
        if (spacediv != null) {
            spacediv.removeNode(true);
            spacediv = null
        }
        if (dashboard && dashboard.GetShimmedElements) {
            var b = dashboard.GetShimmedElements(),
                a;
            for (a = 0; a < b.length; a++) destroyIFrameShim(b[a].id)
        }
        if (mapLegend) mapLegend.RemoveShim();
        Fire("ondestroymode", Msn.VE.MapActionMode.Mode3D)
    };

    function OnView3DScaleBarPositionUpdate() {
        var a = 0;
        if (typeof Msn.VE.API != "undefined" && Msn.VE.API != null) {
            if (VE_TrafficManager.turnedOn && VE_TrafficManager.legend != null && VE_TrafficManager.legendPinned) a = 25
        } else if (VE_TrafficManager.turnedOn) a = 25;
        if (spacecontrol) spacecontrol.RaiseEvent("CB24F613-FE72-442e-857A-BB2FD6BFBAA5", "OnScaleBarPositionChange", a)
    }
    function UpdateFromParent() {
        var a = g(p_elSource).getPagePosition();
        x = a.x;
        y = a.y;
        width = p_elSource.offsetWidth;
        height = p_elSource.offsetHeight
    }
    function CreateDashboard(c, d, b, h, e, g, f, a) {
        if (currentMode == threeDMode && currentMode != null) b = Msn.VE.DashboardSize.Normal;
        dashboard = Msn.VE.NavControlFactory(p_elSource, p_this, b, h, e, g, f, a);
        dashboard.Init();
        dashboardContainer = dashboard.GetElement();
        if (a == 5) {
            if (isFinite(parseInt(c))) dashboardContainer.style.left = c + "px";
            if (isFinite(parseInt(d))) dashboardContainer.style.top = d + "px"
        }
    }
    function CreateMinimap(c, d, a, f, g, h, e) {
        minimapContainer = document.createElement("div");
        if (typeof a != "undefined" && a != null) minimapContainer.id = a;
        else minimapContainer.id = "MSVE_minimap";
        p_elSource.appendChild(minimapContainer);
        minimapContainer.attachEvent("onmousedown", IgnoreEvent);
        minimapContainer.attachEvent("onmouseup", IgnoreEvent);
        minimapContainer.attachEvent("onmousemove", DashboardContainerMouseMoveEvent);
        minimapContainer.attachEvent("onmousewheel", IgnoreEvent);
        minimapContainer.attachEvent("ondblclick", IgnoreEvent);
        minimapContainer.attachEvent("oncontextmenu", IgnoreEvent);
        minimapContainer.attachEvent("onkeydown", IgnoreEvent);
        minimapContainer.attachEvent("onkeyup", IgnoreEvent);
        minimapControl = new Msn.VE.Minimap(minimapContainer, p_this, g, h);
        if (e) minimapControl.SetClientToken(e);
        var b = f || IsMapViewOblique() || $MVEM.IsEnabled(MapControl.Features.Minimap.ShowByDefault);
        b = b && IsModeEnabled(Msn.VE.MapActionMode.Mode2D);
        if (b) minimapControl.Init();
        if (typeof c != "undefined" && c != null && typeof d != "undefined" && d != null) minimapControl.SetPosition(c, d);
        return minimapControl
    }
    function OnChangeView() {
        if (Msn.VE.MapStyle.IsViewOblique(currentView.mapStyle)) {
            var b = GetObliqueScene();
            if (b != null && targetTool) {
                var a = Msn.VE.Geometry,
                    e = g(p_elSource).getPagePosition(),
                    c = new a.Point(e.x + (map.offsetLeft - originX), e.y + (map.offsetTop - originY)),
                    d = 2 / currentView.zoomLevel,
                    h = new a.Point(c.x + b.GetWidth() / d, c.y + b.GetHeight() / d),
                    f = new a.Rectangle(c, h);
                f.scale(-256);
                targetTool.setBoundingArea(f);
                a = null
            }
            b = null
        }
        if (obliqueMode) obliqueMode.UpdateAvailability()
    }
    function SetDefaultView() {
        var a = new Msn.VE.MapView(p_this);
        a.SetCenterLatLong(new Msn.VE.LatLong(0, 0));
        a.SetZoomLevel(1);
        a.SetMapStyle(roadStyle);
        SetBaseTileSource(a);
        SetView(a);
        Initialized2D = true
    }
    function SetAltitude(b) {
        Sync3dView();
        var a = currentView.MakeCopy();
        a.SetAltitude(b);
        SetView(a)
    }
    function SetTilt(b) {
        Sync3dView();
        var a = currentView.MakeCopy();
        a.SetTilt(b);
        SetView(a)
    }
    function SetDirection(b) {
        Sync3dView();
        var a = currentView.MakeCopy();
        a.SetDirection(b);
        SetView(a)
    }
    function GetCurrentMode() {
        return currentMode
    }
    function GetObliqueMode() {
        return obliqueMode
    }
    function GetOrthoMode() {
        return orthoMode
    }
    function GetMapWidth() {
        return width
    }
    function GetMapHeight() {
        return height
    }
    function SetMapHeight(a) {
        height = a;
        p_this.h = a;
        p_elSource.style.height = a
    }
    function GetCurrentMapView() {
        return preferredView.MakeCopy()
    }
    function SetCenter(c, b) {
        Sync3dView();
        var a = preferredView.MakeCopy();
        a.SetCenterLatLong(new Msn.VE.LatLong(c, b));
        SetView(a)
    }
    function SetCenterAccurate(c, b) {
        Sync3dView();
        var a = preferredView.MakeCopy();
        a.SetCenterLatLongAccurate(new Msn.VE.LatLong(c, b));
        SetView(a)
    }
    function SetMapStyle(b, f, c, e, d) {
        Sync3dView();
        var a = currentView.MakeCopy();
        a.SetMapStyle(ValidateMapStyle(b), f, c, e, d);
        if (Msn.VE.MapStyle.IsViewOblique(currentView.mapStyle) != Msn.VE.MapStyle.IsViewOblique(b)) if (Msn.VE.MapStyle.IsViewOblique(b)) {
            Fire("onstartmapstyleoblique");
            a.SetZoomLevel(1);
            lastOrthoZoomLevel = currentView.zoomLevel;
            lastOrthoMapStyle = currentView.mapStyle
        } else if (Msn.VE.MapStyle.IsViewOblique(currentView.mapStyle)) {
            Fire("onendmapstyleoblique");
            a.SetZoomLevel(lastOrthoZoomLevel)
        }
        a.latlong.latitude = GetCenterLatitude();
        a.latlong.longitude = GetCenterLongitude();
        if (currentMode == threeDMode) a._supressFlyToCall = true;
        SetView(a)
    }
    function SetScaleBarDistanceUnit(a) {
        currentScaleBarUnit = a;
        if (scaleBar != null) {
            scaleBar.SetDistanceUnit(a);
            scaleBar.Update()
        }
        if (currentMode == threeDMode && spacecontrol != null) {
            if (a == null) bUseKilometers = $MVEM.IsEnabled(MapControl.Features.ScaleBarKilometers);
            else bUseKilometers = a == Msn.VE.DistanceUnit.Kilometers;
            spacecontrol.DisplayMetricUnits = bUseKilometers
        }
    }
    function SetScaleBarVisibility(a) {
        p_htParams.showScaleBar = a;
        if (currentMode != null) if (currentMode == threeDMode) {
            if (spacecontrol != null) spacecontrol.ShowScale = a
        } else if (a) {
            if (!scaleBar) InitScaleBar();
            scaleBar.Show()
        } else if (scaleBar) scaleBar.Hide()
    }
    function ValidateMapStyle(a) {
        if (Msn.VE.MapStyle.IsViewOrtho(a) || Msn.VE.MapStyle.IsViewOblique(a)) return a;
        else return roadStyle
    }
    function GetCenterLatitude() {
        if (currentMode == threeDMode) {
            if (view3DCreated) {
                var a = spacecontrol.GetCenterLatitude();
                return isNaN(a) ? null : a
            }
            return null
        } else if (currentView != null && currentView != "undefined" && currentView.latlong != null && currentView.latlong != "undefined" && currentView.latlong.latitude != null && currentView.latlong.latitude != "undefined") return currentView.GetCenterLatLong().latitude;
        return null
    }
    function GetCenterLongitude() {
        if (currentMode == threeDMode) {
            if (view3DCreated) {
                var a = spacecontrol.GetCenterLongitude();
                return isNaN(a) ? null : a
            }
            return null
        } else if (currentView != null && currentView != "undefined" && currentView.latlong != null && currentView.latlong != "undefined" && currentView.latlong.longitude != null && currentView.latlong.longitude != "undefined") return currentView.GetCenterLatLong().longitude;
        return null
    }
    function ComputeCenterPoint(a) {
        currentView.latlong = currentMode.PixelToLatLong(currentView.center, currentView.zoomLevel);
        if (a) preferredView.Copy(currentView)
    }
    function GetLatitude(c) {
        var b = new VEPixel(originX + offsetX + width / 2, originY + offsetY + c),
            a = currentMode.PixelToLatLong(b, currentView.zoomLevel);
        if (!a) return null;
        return a.latitude
    }
    function GetLongitude(c) {
        var b = new VEPixel(originX + offsetX + c, originY + offsetY + height / 2),
            a = currentMode.PixelToLatLong(b, currentView.zoomLevel);
        if (!a) return null;
        return a.longitude
    }
    function GetY(b) {
        var c = new Msn.VE.LatLong(b, currentView.center.longitude),
            a = LatLongToPixel(c);
        if (!a) return null;
        return MathRound(a.y)
    }
    function GetX(b) {
        var c = new Msn.VE.LatLong(currentView.center.latitude, b),
            a = LatLongToPixel(c);
        if (!a) return null;
        return MathRound(a.x)
    }
    function LatLongToPixel(c, a) {
        if (a == null || typeof a == "undefined") a = currentView.zoomLevel;
        var b = currentMode.LatLongToPixel(c, a);
        if (b != null) if (currentMode != threeDMode) {
            b.x -= originX + offsetX;
            b.y -= originY + offsetY
        }
        return b
    }
    function LatLongToPixelAsync(c, a, d) {
        if (a == null || typeof a == "undefined") a = currentView.zoomLevel;
        var b = function (a) {
            if (a != null && typeof a != "undefined" && currentMode != threeDMode) for (var b = 0; b < a.length; ++b) if (a[b] != null) {
                a[b].x -= originX + offsetX;
                a[b].y -= originY + offsetY
            }
            d(a)
        };
        currentMode.LatLongToPixelAsync(c, a, b)
    }
    function PixelToLatLong(b, a) {
        if (a == null || typeof a == "undefined") a = currentView.zoomLevel;
        var c = new VEPixel(b.x + originX + offsetX, b.y + originY + offsetY);
        return currentMode.PixelToLatLong(c, a)
    }
    function PixelToLatLongAsync(c, b, e) {
        if (b == null || typeof b == "undefined") b = currentView.zoomLevel;
        var d = [];
        for (var a = 0; a < c.length; ++a) d[a] = new VEPixel(c[a].x + originX + offsetX, c[a].y + originY + offsetY);
        currentMode.PixelToLatLongAsync(d, b, e)
    }
    function GetZoomLevel() {
        return currentView.zoomLevel
    }
    function GetMapStyle() {
        return currentView.mapStyle
    }
    function GetMapMode() {
        var a = Msn.VE.MapActionMode.ModeUnknown;
        if (currentMode != null) if (currentMode == threeDMode) a = Msn.VE.MapActionMode.Mode3D;
        else if (currentMode == orthoMode) a = Msn.VE.MapActionMode.Mode2D;
        else if (currentMode == obliqueMode) a = Msn.VE.MapActionMode.ModeOblique;
        return a
    }
    function GetMode() {
        var a = Msn.VE.MapActionMode.ModeUnknown;
        if (currentMode != null) if (currentMode == threeDMode) a = Msn.VE.MapActionMode.Mode3D;
        else if (currentMode == orthoMode) a = Msn.VE.MapActionMode.Mode2D;
        else if (currentMode == obliqueMode) if (this.GetDashboard().GetMode() == 1) a = Msn.VE.MapActionMode.Mode2D;
        else a = Msn.VE.MapActionMode.Mode3D;
        return a
    }
    function GetAltitude() {
        return currentView.GetAltitude()
    }
    function GetTilt() {
        return currentView.GetTilt()
    }
    function GetDirection() {
        return currentView.GetDirection()
    }
    function EnableMode(b, a) {
        switch (b) {
        case Msn.VE.MapActionMode.Mode3D:
            this._Enable3DMode(a);
            break;
        case Msn.VE.MapActionMode.Mode2D:
        default:
            this._Disable3DMode(a);
            UnHidePins()
        }
    }
    function _Enable3DMode(a) {
        if (currentMode != threeDMode && currentMode != null) {
            VE_3DPhotoPluginObj = 0;
            VE_3DGeoCommunityPluginObj = 0;
            VE_3DStreetLevelGeometryObj = 0;
            VE_3DWeatherPluginObj = 0;
            VE_3DHiResModelsPluginObj = 0;
            PluginEventRegistered = 0;
            PhotoPluginEventRegistered = 0;
            GeoCommunityPluginEventRegistered = 0;
            StreetLevelGeometryEventRegistered = 0;
            previousMode = currentMode;
            currentMode = threeDMode;
            this.Destroy2DOnly();
            if (typeof a != "undefined") init3dparam = a;
            this.Init3DOnly()
        }
    }
    function _Disable3DMode(a) {
        if (currentMode == threeDMode && currentMode != null) {
            previousMode = currentMode;
            currentMode = orthoMode;
            this.Destroy3DOnly();
            this.Init2DOnly(a)
        }
    }
    function ControlReady() {
        return IsModeEnabled(Msn.VE.MapActionMode.Mode2D) || IsModeEnabled(Msn.VE.MapActionMode.Mode3D) && Get3DControl() != null
    }
    function Get3DControl() {
        if (view3DCreated) return spacecontrol;
        return null
    }
    function IsModeEnabled(b) {
        var a = currentMode != null && currentMode == threeDMode;
        switch (b) {
        case Msn.VE.MapActionMode.Mode2D:
            return !a;
            break;
        case Msn.VE.MapActionMode.Mode3D:
            return a
        }
        return false
    }
    function Get3DVisibleArea(acceptRegionAroundCenter) {
        if (!view3DCreated) return null;
        var lat1, lon1, lat2, lon2, lat3, lon3, lat4, lon4, aroundcenter, ret = spacecontrol.QueryRegion();
        eval(ret);
        if ((acceptRegionAroundCenter == "undefined" || acceptRegionAroundCenter == false) && aroundcenter == 1) return null;
        var points = [];
        points.push(new Msn.VE.LatLong(lat1, lon1));
        points.push(new Msn.VE.LatLong(lat2, lon2));
        points.push(new Msn.VE.LatLong(lat3, lon3));
        points.push(new Msn.VE.LatLong(lat4, lon4));
        return points
    }
    function Show3DTraffic(a) {
        if (view3DCreated) if (!traffic3dAdded || a) {
            spacecontrol.AddImageSource("Terrain", "Traffic", GetManifestUrl("http://go.microsoft.com/fwlink/?LinkID=98777"), 1, .6);
            traffic3dAdded = true
        }
    }
    function Remove3DTraffic() {
        if (view3DCreated && traffic3dAdded) {
            spacecontrol.RemoveImageSource("Terrain", "Traffic");
            traffic3dAdded = false
        }
    }
    function Show3DBirdseye(a, b) {
        if (currentMode == threeDMode && spacecontrol) {
            ProcessPhotoPluginActionIn3D("PhotosEnabled", "enabled=" + (a ? "1" : "0") + ";labels=" + (b ? "1" : "0"), spacecontrol);
            p_this.Set3DPhotoPluginActive(a);
            p_this.UpdateCopyright()
        }
    }
    function Sync3dView() {
        if (spacecontrol && spaceCameraIsFlying) spacecontrol.RaiseCameraChangedEvent()
    }
    function OnBeginCameraUpdate() {
        cameraUpdateCount++;
        spaceCameraIsFlying = true
    }
    function OnEndCameraUpdate() {
        spaceCameraIsFlying = false
    }
    function IsCameraFlying() {
        return spaceCameraIsFlying
    }
    function GetMetersPerPixel(b, a) {
        if (!b) b = currentView.latlong.latitude;
        if (!a) a = currentView.zoomLevel;
        return Math.cos(DegToRad(b)) * currentMode.MetersPerPixel(a)
    }
    function Fill() {
        var b = g(p_elSource).getStyle("width"),
            a = g(p_elSource).getStyle("height"),
            f = parseInt(b) - width,
            h = parseInt(a) - height;
        if (!/px$/.test(b)) width = p_elSource.clientWidth || p_elSource.offsetWidth;
        else width = parseInt(b);
        if (!/px$/.test(a)) height = p_elSource.clientHeight || p_elSource.offsetHeight;
        else height = parseInt(a);
        if (!panning) if (currentMode != threeDMode) {
            panning = true;
            var e = g(map).getComputedPosition(),
                c = {
                x: e.x + f / 2,
                y: e.y + h / 2
            };
            offsetX = -c.x;
            offsetY = -c.y;
            var d = new VEPixel(width / 2 + originX + offsetX, height / 2 + originY + offsetY);
            currentView.SetCenter(d);
            preferredView.SetCenter(new VEPixel(d.x, d.y));
            window.setTimeout(tileLayerManager.PanView, 1);
            g(map).slideToPoint(c, "quickly", "MAP_SLIDE", function () {
                panning = false
            },
            Gimme.Animation.AccelerationLines.quickStartDecelerate)
        } else PanToView(currentView);
        if (resizeInProgress) resizeInProgress = false
    }
    function GetSourceWidth() {
        var b = g(p_elSource).getStyle("width"),
            a;
        if (!/px$/.test(b)) a = p_elSource.clientWidth || p_elSource.offsetWidth;
        else a = parseInt(b);
        return a
    }
    function GetSourceHeight() {
        var b = g(p_elSource).getStyle("height"),
            a;
        if (!/px$/.test(b)) a = p_elSource.clientHeight || p_elSource.offsetHeight;
        else a = parseInt(b);
        return a
    }
    function Resize(b, a) {
        if (resizeTimer != null && typeof resizeTimer == "number") window.clearTimeout(resizeTimer);
        p_this.w = b;
        p_this.h = a;
        resizeTimer = window.setTimeout(p_this.FireResize, 250)
    }
    this.FireResize = function () {
        if (resizeInProgress) return;
        else resizeInProgress = true;
        var b = p_this.w,
            a = p_this.h;
        if (!b || b <= 0 || !a || a <= 0) Fill();
        else {
            p_elSource.style.width = b + "px";
            p_elSource.style.height = a + "px";
            UpdateFromParent();
            if (currentMode == null || currentMode != threeDMode) {
                if (b && b >= 0) width = b;
                if (a && a >= 0) height = a
            }
            PanToView(currentView)
        }
        if (copyright) copyright.Reposition();
        if (scaleBar) scaleBar.Reposition();
        if (!document.all) p_this.resizeSVG();
        Fire("onresize")
    };

    function IsObliqueAvailable() {
        return obliqueMode ? obliqueMode.IsAvailable() : false
    }
    function GetObliqueScene() {
        return obliqueMode ? obliqueMode.GetScene() : null
    }
    function SetAnimationEnabled(a) {
        animatedMovementEnabled = a
    }
    function IsAnimationEnabled() {
        return animatedMovementEnabled && currentMode != threeDMode
    }
    function SetObliqueScene(a) {
        if (obliqueMode) SetMapStyle(obliqueStyle, a, null)
    }
    function SetObliqueLocation(f, c, d, e) {
        if (obliqueMode) {
            Sync3dView();
            var a = currentView.MakeCopy(),
                b;
            if (IsMapViewOblique()) b = GetMapStyle();
            else b = p_htParams.labelsDefault ? obliqueHybridStyle : obliqueStyle;
            a.SetMapStyle(b, null, c);
            a.SetZoomLevel(d);
            if (!Msn.VE.MapStyle.IsViewOblique(currentView.mapStyle)) {
                Fire("onstartmapstyleoblique");
                lastOrthoZoomLevel = currentView.zoomLevel;
                lastOrthoMapStyle = currentView.mapStyle
            }
            a.SetCenterLatLong(f);
            a.callback = e;
            SetView(a)
        }
    }
    function SetObliqueOrientation(d, c, b) {
        if (obliqueMode) {
            var a;
            if (IsMapViewOblique()) a = GetMapStyle();
            else a = p_htParams.labelsDefault ? obliqueHybridStyle : obliqueStyle;
            SetMapStyle(a, null, d, c, b)
        }
    }
    function Debug(a) {
        debug = a
    }
    function GetMapLegend() {
        return mapLegend
    }
    function SetFocus() {
        if (currentMode == threeDMode) spacecontrol.Focus();
        else keyboard.focus()
    }
    function StopKeyboardPan() {
        if (panning && keyboardPan) StopContinuousPan()
    }
    function UpdatePreferredView() {
        preferredView.Copy(currentView)
    }
    function GetCenterOffset() {
        if (currentMode != null && currentMode == threeDMode) return new VEPixel(0, 0);
        return mapCenterOffset
    }
    function SetCenterOffset(a) {
        if (typeof a != "undefined" && a != null) mapCenterOffset = a
    }
    function GetLastViewChangeType() {
        var a = lastViewChangeType;
        lastViewChangeType = null;
        return a
    }
    function ShowNonIENotSupportedDialog() {
        Fire("onerror", CreateEvent(currentView.latlong, currentView.zoomLevel, L_BrowserNotSupported_Text.replace(/%1/g, '<a href="' + L_SupportedBrowserDownloadUrl_Text + '" target="_blank">').replace(/%3/g, L_SupportedBrowserDownloadUrl_Text).replace(/%2/g, "</a>")))
    }
    function DelayedHWDialog() {
        ShowMessage(L_NoHardwareAcceleration_Text)
    }
    function SetShowMapModeSwitch(a) {
        if (dashboard && dashboard.constructor == Msn.VE.NavAction) dashboard.SetShowMapModeSwitch(a)
    }
    function SetTilePixelBuffer(a) {
        buffer = a < maxTilePixelBuffer ? a : maxTilePixelBuffer
    }
    function SetClientToken(a) {
        m_clientToken = a;
        if (tileLayerManager) {
            tileLayerManager.SetClientToken(mapTiles, m_clientToken);
            tileLayerManager.SetClientToken(trafficTiles, m_clientToken)
        }
        if (minimapControl) minimapControl.SetClientToken(m_clientToken);
        if (obliqueMode) {
            obliqueMode.SetUseOriginTiles(p_htParams.useOriginTiles);
            obliqueMode.SetClientToken(m_clientToken)
        }
    }
    function GetTopPx() {
        if (typeof p_elSource != "undefined" && p_elSource != null) return g(p_elSource).getPagePosition().y;
        else return 0
    }
    function GetLeftPx() {
        if (typeof p_elSource != "undefined" && p_elSource != null) return g(p_elSource).getPagePosition().x;
        else return 0
    }
    function GetObliqueAvailability(b, a) {
        if (obliqueMode) obliqueMode.GetObliqueAvailability(b, a);
        else if (typeof a == "function") a(false)
    }
    function GetMapSurface() {
        return map
    }
    this.CreateLegend = function () {
        if (!mapLegend) {
            mapLegend = new MapLegend(p_elSource);
            mapLegend.Init();
            if (copyright) mapLegend.PinTo(copyright)
        }
        return mapLegend
    };

    function CalculateTileViewPort(a, b, d, c, e) {
        return tileLayerManager.CalculateTileViewPort(a, b, d, c, e)
    }
    function GetCurrentTileViewPort() {
        return tileLayerManager.GetViewPort()
    }
    function SetPrintable(a) {
        if (a) {
            graphicCanvas.CreatePrintLayer(map, this, g(p_elSource).getStyle("width"), g(p_elSource).getStyle("height"));
            tileLayerManager.SetPrintable(true);
            graphicCanvas.AddLogo(logo.GetURL());
            g(p_elSource).addClass("MSVE_Printable_Map")
        } else {
            tileLayerManager.SetPrintable(false);
            graphicCanvas.RemovePrintLayer(this);
            g(p_elSource).removeClass("MSVE_Printable_Map")
        }
    }
    function IsMapViewOblique() {
        return Msn.VE.MapStyle.IsViewOblique(GetMapStyle())
    }
    function IsMapViewOrtho() {
        return Msn.VE.MapStyle.IsViewOrtho(GetMapStyle())
    }
    function GetTileGeneration(a) {
        return generations[a]
    }
    function ClipView(b, c) {
        var a = ShiftView(b, c, 0, 0);
        if (typeof a != "undefined" && a != null) b.SetCenter(new VEPixel(b.center.x + a.x, b.center.y + a.y))
    }
    function ShiftView(b, a, c, d) {
        if (b != null && b.center != null && a != null && a != "undefined") {
            c = ClipDelta(c, width, b.center.x - width / 2, b.zoomLevel, a.z1, a.x1, a.x2, b.mapStyle);
            d = ClipDelta(d, height, b.center.y - height / 2, b.zoomLevel, a.z1, a.y1, a.y2, b.mapStyle);
            return new VEPixel(c, d)
        }
    }
    function ClipDelta(a, b, d, g, f, i, h) {
        var c = tileSize * i * Math.pow(2, g - f),
            e = tileSize * h * Math.pow(2, g - f);
        if (IsMapViewOblique()) {
            c -= Math.ceil(b / 2);
            e += Math.ceil(b / 2)
        }
        if (b > e - c) a = (e - c - b) / 2 - d + c;
        else if (d + a < c) a = c - d;
        else if (d + b + a > e) a = e - d - b;
        return a
    }
    function VECopyrightTableEntry(b, a, e, f, c, d) {
        this.MinZoomLevel = b;
        this.MaxZoomLevel = a;
        this.MinLatitude = e;
        this.MinLongitude = f;
        this.MaxLatitude = c;
        this.MaxLongitude = d
    }
    VECopyrightTableEntry.prototype.IsMatch = function (b, c, a) {
        var d = false;
        if (b >= this.MinZoomLevel && b <= this.MaxZoomLevel && (c >= this.MinLatitude && c <= this.MaxLatitude) && (a >= this.MinLongitude && a <= this.MaxLongitude)) d = true;
        return d
    };

    function VECopyrightTable() {
        var L_MapControlImageCourtesyOfPictometry_Text = 'Pictometry Bird’s Eye &copy; 2009 Pictometry International Corp';
        var L_MapControlImageCourtesyOfPictometry_CAN_Text = 'Pictometry Bird’s Eye &copy; 2009 MDA Geospatial Services Inc.';
        var L_MapControlImageCourtesyOfPictometry_AUS_Text = 'Pictometry Bird’s Eye &copy; 2009 AAMHatch Pty Ltd';
        var L_MapControlImageCourtesyOfBlom_Text = '&copy; 2009 Blom';
        var L_MapControlImageCourtesyOfNAVTEQ_Text = '&copy; 2009 NAVTEQ';
        var L_MapControlImageCourtesyOfAND_Text = '&copy; AND';
        var L_MapControlImageCourtesyOfMapDataSciences_Text = '&copy; 2009 MapData Sciences Pty Ltd';
        var L_MapControlImageCourtesyOfZenrin_Text = '&copy; 2009 Zenrin';
        var L_MapControlImageCourtesyOfIntermap_Text = '&copy; 2009 Intermap';
        var L_MapControlImageCourtesyOfDigitalGlobe_Text = '&copy; 2009 DigitalGlobe';
        var L_MapControlImageCourtesyOfNASA_Text = 'Image courtesy of NASA';
        var L_MapControlImageCourtesyOfHarrisCorp_Text = '&copy; Harris Corp, Earthstar Geographics LLC';
        var L_MapControlImageCourtesyOfUSGS_Text = 'Image courtesy of USGS';
        var L_MapControlImageCourtesyOfGetmapping_Text = '&copy; Getmapping plc';
        var L_MapControlImageCourtesyOfGeoEye_Text = '&copy; 2009 GeoEye';
        var L_MapControlImageCourtesyOfPasco_Text = '&copy; 2009 Pasco';
        var L_MapControlImageCourtesyOfIntergraph_Text = '&copy; GeoContent / (p) Intergraph';
        var L_MapControlImageCourtesyOfTerraItaly_Text = '&copy; 2009 TerraItaly';
        var L_MapControlImageCourtesyOfIntermap_Text = '&copy; 2009 Intermap';
        var L_MapControlImageCourtesyOfIndianaMap_Text = 'Image courtesy of the IndianaMap';
        var L_MapControlImageCourtesyOfStateOfNevada_Text = 'Image courtesy of the Nevada State Mapping Advisory Committee';
        var L_MapControlImageCourtesyOfInterAtlas_Text = '&copy; 2009 InterAtlas';
        var L_MapControlImageCourtesyOfEurosense_Text = '&copy; 2009 Eurosense';
        var L_MapControlImageCourtesyOfIGP_Text = '&copy; 2009 IGP';
        var L_MapControlImageCourtesyOfIGN_Text = '&copy; 2009 IGN';
        var L_MapControlImageCourtesyOfBC_Text = '&copy; Province of British Columbia';
        var L_MapControlImageCourtesyOfBEV_Text = '&copy; 2009 BEV / (p) Intergraph';
        var L_MapControlImageCourtesyOfBlom_Text = '&copy; 2009 Blom';
        var L_MapControlImageCourtesyOfAerialsExpress_Text = '&copy; 2009 Aerials Express';

        var m_tableKeys = [];
        m_tableKeys[Msn.VE.MapStyle.Oblique] = [L_MapControlImageCourtesyOfPictometry_Text, L_MapControlImageCourtesyOfPictometry_CAN_Text, L_MapControlImageCourtesyOfPictometry_AUS_Text, L_MapControlImageCourtesyOfBlom_Text];
        m_tableKeys[Msn.VE.MapStyle.Road] = [L_MapControlImageCourtesyOfNAVTEQ_Text, L_MapControlImageCourtesyOfAND_Text, L_MapControlImageCourtesyOfMapDataSciences_Text, L_MapControlImageCourtesyOfZenrin_Text, L_MapControlImageCourtesyOfIntermap_Text];
        m_tableKeys[Msn.VE.MapStyle.Aerial] = [L_MapControlImageCourtesyOfDigitalGlobe_Text, L_MapControlImageCourtesyOfNASA_Text, L_MapControlImageCourtesyOfHarrisCorp_Text, L_MapControlImageCourtesyOfUSGS_Text, L_MapControlImageCourtesyOfGetmapping_Text, L_MapControlImageCourtesyOfGeoEye_Text, L_MapControlImageCourtesyOfPasco_Text, L_MapControlImageCourtesyOfIntergraph_Text, L_MapControlImageCourtesyOfTerraItaly_Text, L_MapControlImageCourtesyOfIntermap_Text, L_MapControlImageCourtesyOfIndianaMap_Text, L_MapControlImageCourtesyOfStateOfNevada_Text, L_MapControlImageCourtesyOfInterAtlas_Text, L_MapControlImageCourtesyOfEurosense_Text, L_MapControlImageCourtesyOfIGP_Text, L_MapControlImageCourtesyOfIGN_Text, L_MapControlImageCourtesyOfBC_Text, L_MapControlImageCourtesyOfBEV_Text, L_MapControlImageCourtesyOfBlom_Text, L_MapControlImageCourtesyOfAerialsExpress_Text];

        var m_table = [];
        m_table[Msn.VE.MapStyle.Oblique] = [];
        m_table[Msn.VE.MapStyle.Oblique][L_MapControlImageCourtesyOfPictometry_Text] = [];
        m_table[Msn.VE.MapStyle.Oblique][L_MapControlImageCourtesyOfPictometry_Text].push(new VECopyrightTableEntry(1, 20, 10, -165, 75, -45));
        m_table[Msn.VE.MapStyle.Oblique][L_MapControlImageCourtesyOfPictometry_Text].push(new VECopyrightTableEntry(1, 20, 10, 90, 72, 165));
        m_table[Msn.VE.MapStyle.Oblique][L_MapControlImageCourtesyOfPictometry_CAN_Text] = [];
        m_table[Msn.VE.MapStyle.Oblique][L_MapControlImageCourtesyOfPictometry_CAN_Text].push(new VECopyrightTableEntry(1, 20, 41.3, -142, 70, -50));
        m_table[Msn.VE.MapStyle.Oblique][L_MapControlImageCourtesyOfPictometry_AUS_Text] = [];
        m_table[Msn.VE.MapStyle.Oblique][L_MapControlImageCourtesyOfPictometry_AUS_Text].push(new VECopyrightTableEntry(1, 20, -60, 90, 0, 180));
        m_table[Msn.VE.MapStyle.Oblique][L_MapControlImageCourtesyOfBlom_Text] = [];
        m_table[Msn.VE.MapStyle.Oblique][L_MapControlImageCourtesyOfBlom_Text].push(new VECopyrightTableEntry(1, 20, 34, -13, 72, 35));
        m_table[Msn.VE.MapStyle.Road] = [];
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfNAVTEQ_Text] = [];
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfNAVTEQ_Text].push(new VECopyrightTableEntry(1, 9, -90, -180, 90, 180));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfNAVTEQ_Text].push(new VECopyrightTableEntry(10, 21, 14, -180, 90, -50));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfNAVTEQ_Text].push(new VECopyrightTableEntry(10, 21, 27, -32, 40, -13));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfNAVTEQ_Text].push(new VECopyrightTableEntry(10, 21, 35, -11, 72, 20));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfNAVTEQ_Text].push(new VECopyrightTableEntry(10, 21, 21, 20, 72, 32));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfNAVTEQ_Text].push(new VECopyrightTableEntry(10, 21, 21.92, 113.14, 22.79, 114.52));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfNAVTEQ_Text].push(new VECopyrightTableEntry(10, 21, 21.73, 119.7, 25.65, 122.39));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfNAVTEQ_Text].push(new VECopyrightTableEntry(10, 21, 0, 98.7, 8, 120.17));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfNAVTEQ_Text].push(new VECopyrightTableEntry(10, 21, 0.86, 103.2, 1.92, 104.45));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfAND_Text] = [];
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfAND_Text].push(new VECopyrightTableEntry(10, 21, -90, -180, 90, 180));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfMapDataSciences_Text] = [];
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfMapDataSciences_Text].push(new VECopyrightTableEntry(5, 21, -45, 111, -9, 156));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfMapDataSciences_Text].push(new VECopyrightTableEntry(5, 21, -49.7, 164.42, -30.82, 180));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfZenrin_Text] = [];
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfZenrin_Text].push(new VECopyrightTableEntry(4, 21, 23.5, 122.5, 46.65, 151.66));
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfIntermap_Text] = [];
        m_table[Msn.VE.MapStyle.Road][L_MapControlImageCourtesyOfIntermap_Text].push(new VECopyrightTableEntry(1, 21, 49, -11, 60, 2));
        m_table[Msn.VE.MapStyle.Aerial] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text].push(new VECopyrightTableEntry(14, 21, -67, -179.99, 27, 0));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text].push(new VECopyrightTableEntry(14, 21, 27, -179.99, 87, -126.5));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text].push(new VECopyrightTableEntry(14, 21, 48.4, -126.5, 87, -5.75));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text].push(new VECopyrightTableEntry(14, 21, -67, 28, 86.5, 179.99));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text].push(new VECopyrightTableEntry(14, 21, -67, 0, 37.8, 28));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text].push(new VECopyrightTableEntry(14, 21, 37.7, 18.5, 59.8, 28));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text].push(new VECopyrightTableEntry(14, 21, 43, -81.6, 48.4, -10));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text].push(new VECopyrightTableEntry(14, 21, 27, -70, 43, -10));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text].push(new VECopyrightTableEntry(14, 21, 27, -10, 35.8, 0));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text].push(new VECopyrightTableEntry(14, 21, 27, -120, 32.3, -105.8));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfDigitalGlobe_Text].push(new VECopyrightTableEntry(14, 21, 43.4, 13.78, 54.9, 18.5));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfNASA_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfNASA_Text].push(new VECopyrightTableEntry(1, 8, -90, -180, 90, 180));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfHarrisCorp_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfHarrisCorp_Text].push(new VECopyrightTableEntry(9, 13, -90, -180, 90, 180));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfUSGS_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfUSGS_Text].push(new VECopyrightTableEntry(14, 17, 17.99, -150.11, 61.39, -65.57));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGetmapping_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGetmapping_Text].push(new VECopyrightTableEntry(14, 21, 49.94, -6.82, 60.17, 1.78));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGeoEye_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGeoEye_Text].push(new VECopyrightTableEntry(14, 21, 44.53, -63.75, 45.06, -63.45));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGeoEye_Text].push(new VECopyrightTableEntry(14, 21, 45.39, -73.78, 45.66, -73.4));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGeoEye_Text].push(new VECopyrightTableEntry(14, 21, 45.2, -75.92, 45.59, -75.55));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGeoEye_Text].push(new VECopyrightTableEntry(14, 21, 42.95, -79.81, 44.06, -79.42));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGeoEye_Text].push(new VECopyrightTableEntry(14, 21, 50.35, -114.26, 51.25, -113.82));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGeoEye_Text].push(new VECopyrightTableEntry(14, 21, 48.96, -123.33, 49.54, -122.97));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGeoEye_Text].push(new VECopyrightTableEntry(14, 21, -35.42, 138.32, -34.47, 139.07));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGeoEye_Text].push(new VECopyrightTableEntry(14, 21, -32.64, 115.58, -32.38, 115.85));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGeoEye_Text].push(new VECopyrightTableEntry(14, 21, -34.44, 150.17, -33.27, 151.49));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfGeoEye_Text].push(new VECopyrightTableEntry(14, 21, -28.3, 152.62, -26.94, 153.64));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfPasco_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfPasco_Text].push(new VECopyrightTableEntry(14, 21, 23.5, 122.5, 46.65, 151.66));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIntergraph_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIntergraph_Text].push(new VECopyrightTableEntry(14, 21, 47, 5, 55.5, 16));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfTerraItaly_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfTerraItaly_Text].push(new VECopyrightTableEntry(14, 21, 43.15, 6.5, 47.15, 14));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfTerraItaly_Text].push(new VECopyrightTableEntry(14, 21, 41.3, 9.9, 43.15, 16.4));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfTerraItaly_Text].push(new VECopyrightTableEntry(14, 21, 36.5, 7.9, 41.3, 18.7));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIntermap_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIntermap_Text].push(new VECopyrightTableEntry(1, 21, 49, -11, 60, 2));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIndianaMap_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIndianaMap_Text].push(new VECopyrightTableEntry(14, 21, 37.7, -88.2, 41.9, -84.7));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfStateOfNevada_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfStateOfNevada_Text].push(new VECopyrightTableEntry(14, 21, 34.85, -120.2, 42.12, -113.91));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfInterAtlas_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfInterAtlas_Text].push(new VECopyrightTableEntry(14, 21, 48.37, 1.4, 49.28, 3.37));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfInterAtlas_Text].push(new VECopyrightTableEntry(14, 21, 47.72, 1.67, 48.05, 2.18));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfInterAtlas_Text].push(new VECopyrightTableEntry(14, 21, 45.55, 4.57, 45.95, 5.33));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfInterAtlas_Text].push(new VECopyrightTableEntry(14, 21, 43.18, 4.92, 43.77, 5.82));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfEurosense_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfEurosense_Text].push(new VECopyrightTableEntry(14, 21, 51, 3, 53.65, 7.67));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfEurosense_Text].push(new VECopyrightTableEntry(14, 21, 50.58, 5.42, 51, 5.47));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIGP_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIGP_Text].push(new VECopyrightTableEntry(14, 21, 36.88, -9.6, 42.27, -6));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIGN_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIGN_Text].push(new VECopyrightTableEntry(14, 21, 42, -5, 51.25, 8.5));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIGN_Text].push(new VECopyrightTableEntry(14, 21, 41.25, 8.3, 43.1, 9.65));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIGN_Text].push(new VECopyrightTableEntry(14, 21, 17.85, -63.17, 18.15, -62.77));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIGN_Text].push(new VECopyrightTableEntry(14, 21, 15.75, -61.9, 16.55, -60.9));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIGN_Text].push(new VECopyrightTableEntry(14, 21, 14.35, -61.25, 14.95, -60.75));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIGN_Text].push(new VECopyrightTableEntry(14, 21, 2.25, -54.65, 6, -51.4));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIGN_Text].push(new VECopyrightTableEntry(14, 21, -21.5, 55, -20.75, 56));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfIGN_Text].push(new VECopyrightTableEntry(14, 21, 46.7, -56.5, 47.2, -56.1));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfBC_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfBC_Text].push(new VECopyrightTableEntry(14, 18, 48.99, -139.05, 60, -114.05));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfBEV_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfBEV_Text].push(new VECopyrightTableEntry(14, 21, 46.25, 9.4, 49.2, 17.3));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfBlom_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfBlom_Text].push(new VECopyrightTableEntry(14, 21, 36.1, -9.51, 51.04, 11.67));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfBlom_Text].push(new VECopyrightTableEntry(14, 21, 55.69, 9.8, 61.17, 13.23));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfBlom_Text].push(new VECopyrightTableEntry(14, 21, 62.2, 25.82, 62.24, 25.89));
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfAerialsExpress_Text] = [];
        m_table[Msn.VE.MapStyle.Aerial][L_MapControlImageCourtesyOfAerialsExpress_Text].push(new VECopyrightTableEntry(14, 21, 34.63, -90.41, 35.52, -89.48));

        ;
        this.CreditsFor = function (a, i, j, h) {
            var e = [];
            if (a != "undefined" && a != null && typeof m_tableKeys[a] != "undefined" && m_tableKeys[a] != null) {
                var k = m_tableKeys[a].length;
                for (var c = 0; c < k; ++c) {
                    var f = m_tableKeys[a][c],
                        d = m_table[a][f],
                        g = d.length;
                    for (var b = 0; b < g; ++b) if (d[b].IsMatch(i, j, h)) {
                        e.push(f);
                        break
                    }
                }
            }
            return e
        };
        this.CreditsForView = function (a) {
            var b = [];
            b.push(L_MapCopyrightMicrosoft);
            if (a.mapStyle == Msn.VE.MapStyle.Hybrid) {
                b = b.concat(this.CreditsFor(Msn.VE.MapStyle.Road, a.zoomLevel, a.latlong.latitude, a.latlong.longitude));
                b = b.concat(this.CreditsFor(Msn.VE.MapStyle.Aerial, a.zoomLevel, a.latlong.latitude, a.latlong.longitude))
            } else if (a.mapStyle == Msn.VE.MapStyle.ObliqueHybrid) {
                b = b.concat(this.CreditsFor(Msn.VE.MapStyle.Road, 17, a.latlong.latitude, a.latlong.longitude));
                b = b.concat(this.CreditsFor(Msn.VE.MapStyle.Oblique, a.zoomLevel, a.latlong.latitude, a.latlong.longitude))
            } else if (a.mapStyle == Msn.VE.MapStyle.Shaded) b = b.concat(this.CreditsFor(Msn.VE.MapStyle.Road, a.zoomLevel, a.latlong.latitude, a.latlong.longitude));
            else b = b.concat(this.CreditsFor(a.mapStyle, a.zoomLevel, a.latlong.latitude, a.latlong.longitude));
            if (view3DCreated && a.mapStyle != Msn.VE.MapStyle.Oblique && photoplugin3dActive) b = b.concat(this.CreditsFor(Msn.VE.MapStyle.Oblique, a.zoomLevel, a.latlong.latitude, a.latlong.longitude));
            if (typeof VE_TrafficManager !== "undefined") if (VE_TrafficManager.turnedOn && L_MapCopyrightTraffic != "") {
                var d = false;
                if (L_MapControlImageCourtesyOfNAVTEQ_Text) for (var c = 0; c < b.length; c++) if (b[c] == L_MapControlImageCourtesyOfNAVTEQ_Text) {
                    d = true;
                    b.splice(c + 1, 0, L_MapCopyrightTraffic);
                    break
                }
                if (!d) b.push(L_MapCopyrightTraffic)
            }
            return b
        }
    }
    var g_sVECopyrightTable = new VECopyrightTable;

    function Copyright(f) {
        var d = document.createElement("div"),
            a = document.createElement("div"),
            c = null,
            b = null;
        this.Show = function () {
            f.appendChild(d);
            f.appendChild(a)
        };
        this.Hide = function () {
            try {
                f.removeChild(d);
                f.removeChild(a)
            } catch(b) {}
        };
        this.Init = function () {
            d.className = "MSVE_Copyright MSVE_CopyrightBackground";
            a.className = "MSVE_Copyright MSVE_CopyrightForeground";
            e();
            this.Show()
        };
        this.Destroy = function () {
            this.Hide();
            c = null;
            b = null;
            d = a = null
        };

        function e() {
            var e = 0;
            if (c && c.style.display !== "none") {
                var h = parseInt(g(c).getStyle("height")),
                    f = parseInt(c.style.bottom);
                e += (isNaN(h) ? 0 : h) + (isNaN(f) ? 0 : f)
            }
            d.style.bottom = e + "px";
            a.style.bottom = e + 1 + "px";
            if (b) window.setTimeout(b.Reposition, 1)
        }
        function j() {
            var g = g_sVECopyrightTable.CreditsForView(currentView),
                c = "",
                f = "";
            for (var b = 0; b < g.length; ++b) {
                if (b > 0) if (b == 2) c += "\n";
                else c += "  ";
                f += "<span>" + g[b] + "</span> ";
                c += g[b]
            }
            if (view3DCreated) spacecontrol.SetCopyrightString(c);
            d.innerHTML = f;
            a.innerHTML = f;
            e()
        }
        function i() {
            e()
        }
        function k(c) {
            b = c;
            if (b) b.SetPinElement(a)
        }
        function h(a) {
            c = a;
            e()
        }
        this.Reposition = e;
        this.Update = j;
        this.SetOffset = i;
        this.PinTo = k;
        this.SetPinElement = h
    }
    function MapEvent(f, d, e, a, c, b, g) {
        this.view = f;
        this.oblique = d;
        this.error = e;
        this.requestedView = a;
        this.elementID = c;
        this.mouseButton = b;
        this.e = g
    }
    function CreateEvent(b, f, c, d, e, n, g, h) {
        var a = currentView.MakeCopy();
        if (b != null && b instanceof Msn.VE.LatLong) {
            if (Msn.VE.API != null) {
                var m = new VELatLongFactory(new VELatLongFactorySpecFromMapView(a));
                a.LatLong = m.CreateVELatLong(b.latitude, b.longitude);
                a.latlong = b
            } else a.latlong = b;
            if (typeof g != "undefined" && g != null) a.altitude = parseFloat(g);
            else a.altitude = 0
        }
        if (f != null && typeof f == "number") a.zoomLevel = f;
        if (c == null || typeof c == "undefined") c = "";
        var j = null;
        if (obliqueMode) j = obliqueMode.GetEventInfo();
        var i = null;
        if (d != null && d instanceof Msn.VE.MapView) i = d.MakeCopy();
        var k = null;
        if (typeof e != "undefined" && e != null) k = e;
        var l = null;
        if (typeof h != "undefined" && h != null) l = h;
        return new MapEvent(a, j, c, i, k, n, l)
    }
    function CreateCustomEvent(h, b, d) {
        var a = new MapEvent;
        if (d) a.error = d.error;
        a.eventName = h;
        a.zoomLevel = currentView.zoomLevel;
        a.mapStyle = currentView.mapStyle;
        if (currentMode != threeDMode) {
            a.birdseyeSceneID = currentView.sceneId;
            a.birdseyeSceneOrientation = currentView.sceneOrientation;
            if (b) {
                a.leftMouseButton = IsLeftMouseButton(b);
                a.rightMouseButton = IsRightMouseButton(b);
                a.middleMouseButton = IsMiddleMouseButton(b);
                a.mouseWheelChange = GetMouseScrollDelta(b);
                a.screenX = b.screenX;
                a.screenY = b.screenY;
                var e = Gimme.Screen.getMousePosition(b);
                a.clientX = e.x;
                a.clientY = e.y;
                var f = g(p_elSource).getPagePosition();
                a.mapX = a.clientX - f.x;
                a.mapY = a.clientY - f.y;
                a.keyCode = b.keyCode;
                a.altKey = b.altKey;
                a.ctrlKey = b.ctrlKey;
                a.shiftKey = b.shiftKey;
                a.elementID = null;
                var c = GetTarget(b);
                while (typeof c != "undefined" && c != null) if (typeof c.id != "undefined" && c.id != null && c.id.indexOf(MC_IID_NAMESPACE) == 0 && c.tagName != "CANVAS") {
                    a.elementID = c.id;
                    break
                } else if (typeof c.className != "undefined" && c.className != null && c.className == "MSVE_MapContainer") break;
                else c = c.parentElement
            }
        } else if (d) {
            if (d.view) a.latLong = d.view.LatLong;
            else a.latLong = null;
            a.elementID = d.elementID;
            a.leftMouseButton = d.mouseButton == "Left";
            a.rightMouseButton = d.mouseButton == "Right";
            a.middleMouseButton = d.mouseButton == "Middle";
            a.mouseWheelChange = 0;
            a.keyCode = 0;
            a.altKey = false;
            a.ctrlKey = false;
            a.shiftKey = false
        }
        return a
    }
    function AttachEvent(d, c) {
        var a = defaultEventTable[d];
        if (!a) {
            a = [];
            defaultEventTable[d] = a
        }
        for (var b = 0; b < a.length; b++) if (a[b] == c) return true;
        a.push(c)
    }
    function DetachEvent(d, c) {
        var a = defaultEventTable[d];
        if (!a) return;
        for (var b = 0; b < a.length; b++) if (a[b] == c) a.splice(b, 1)
    }
    function AttachCustomEvent(d, c) {
        var a = customEventTable[d];
        if (!a) {
            a = [];
            customEventTable[d] = a
        }
        for (var b = 0; b < a.length; b++) if (a[b] == c) return true;
        a.push(c)
    }
    function DetachCustomEvent(d, c) {
        var a = customEventTable[d];
        if (a) for (var b = 0; b < a.length; b++) if (a[b] == c) a.splice(b, 1)
    }
    function IsEventAttached(a) {
        var b = customEventTable[a],
            c = defaultEventTable[a];
        return c != null || b != null
    }
    function Fire(b, a) {
        FireCustomEvent(b, a);
        FireDefaultEvent(b, a)
    }
    function FireDefaultEvent(d, b) {
        var a = defaultEventTable[d];
        if (!b) b = CreateEvent();
        if (a) for (var c = 0; c < a.length; c++) a[c](b)
    }
    var currentShapeID = null;

    function FireCustomEvent(d, a) {
        var b = false,
            c = customEventTable[d];
        if (c) {
            if (a && a instanceof MapEvent) {
                var f = window.event;
                a = CreateCustomEvent(d, f, a)
            } else a = CreateCustomEvent(d, a, null);
            for (var e = 0; e < c.length; e++) b = b | c[e](a)
        }
        return b
    }
    function DisposeAllCustomEvent() {
        while (customEventTable.length) {
            var a = customEventTable.pop();
            while (a.length) a.pop();
            a = null
        }
    }
    function DestroyEventTable() {
        while (defaultEventTable.length) {
            var a = defaultEventTable.pop();
            while (a.length) a.pop();
            a = null
        }
        defaultEventTable = null;
        DisposeAllCustomEvent();
        customEventTable = null
    }
    function KeyDown(c) {
        if (isMinimap) return false;
        c = GetEvent(c);
        if (FireCustomEvent("onkeydown", c)) return false;
        var e = c.ctrlKey ? 5 : 1,
        d = keyboardPanSpeed * e,
        a = panningX,
        b = panningY;
        switch (c.keyCode) {
        case 9:
        case 17:
        case 18:
            if (panning && keyboardPan) StopContinuousPan();
            return true;
        case 37:
            a = -d;
            break;
        case 38:
            b = -d;
            break;
        case 39:
            a = d;
            break;
        case 40:
            b = d;
            break;
        case 107:
        case 187:
        case 61:
        case 43:
            a = 0;
            b = 0;
            ZoomIn();
            break;
        case 109:
        case 189:
            a = 0;
            b = 0;
            ZoomOut();
            break;
        case 65:
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Aerial)) {
                a = 0;
                b = 0;
                SetMapStyle(aerialStyle)
            }
            break;
        case 72:
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Hybrid)) {
                a = 0;
                b = 0;
                SetMapStyle(hybridStyle)
            }
            break;
        case 82:
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Road)) {
                a = 0;
                b = 0;
                SetMapStyle(roadStyle)
            }
            break;
        case 66:
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye)) if (obliqueMode && obliqueMode.IsAvailable()) {
                a = 0;
                b = 0;
                SetMapStyle(obliqueHybridStyle)
            }
            break;
        case 79:
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye)) if (obliqueMode && obliqueMode.IsAvailable()) {
                a = 0;
                b = 0;
                SetMapStyle(obliqueStyle)
            }
            break;
        case 51:
        case 99:
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.View3D)) p_this.EnableMode(Msn.VE.MapActionMode.Mode3D)
        }
        if (a || b) ContinuousPan(a, b, null, true);
        FireDefaultEvent("onkeydown");
        return false
    }
    function KeyUp(a) {
        a = GetEvent(a);
        if (FireCustomEvent("onkeyup", a)) return false;
        var b = panningX,
            c = panningY,
            d = true;
        switch (a.keyCode) {
        case 37:
            b = 0;
            break;
        case 38:
            c = 0;
            break;
        case 39:
            b = 0;
            break;
        case 40:
            c = 0;
            break;
        default:
            d = false
        }
        if (d) ContinuousPan(b, c, null, true);
        if (FireCustomEvent("onkeypress", a)) return false
    }
    var northLatitude = 0,
        southLatitude = 0,
        westLongitude = 0,
        eastLongitude = 0;

    function AddLine(h, f, g, l, n, m, a, d, i, k, j) {
        if (h == null || f == null || g == null || a == null || d == null) return null;
        var e = [];
        for (var b = 0; b < a.length; b++) e.push(BuildRegionHeap(a[b], 0, a[b].length - 1));
        var c = new Line;
        c.Init(h, f, g, l, n, m, e, d, i, k, j);
        lines.push(c);
        return c
    }
    function RemoveLine(c) {
        for (var a = 0; a < lines.length; a++) {
            var b = lines[a];
            if (b.id == c) {
                lines.splice(a, 1);
                b.Destroy();
                return
            }
        }
    }
    function ClearLines() {
        while (lines.length > 0) lines.pop().Destroy()
    }
    function ShowLines() {
        graphicCanvas.Clear();
        for (var a = 0; a < lines.length; a++) {
            lines[a].StartLine();
            lines[a].Show()
        }
    }
    function HideLines() {
        for (var a = 0; a < lines.length; a++) {
            lines[a].Hide();
            lines[a].RemoveFromMap()
        }
    }
    function UpdateLines() {
        if (typeof graphicCanvas === "object" && graphicCanvas !== null) graphicCanvas.Clear();
        if (!document.all) currentView.GetMap().resetSvgLayer();
        for (var a = 0; a < lines.length; a++) lines[a].UpdateLine()
    }
    function BuildRegionHeap(f, e, g) {
        var h = g - e + 1;
        if (h < 1) return null;
        else if (h == 1) return f[e];
        var d = null,
            c = null;
        if (h == 2) {
            d = f[e];
            c = f[g]
        } else {
            var i = Math.round((e + g) / 2);
            d = BuildRegionHeap(f, e, i);
            c = BuildRegionHeap(f, i + 1, g)
        }
        if (d != null && c != null) {
            var b = d.boundingRectangle,
                a = c.boundingRectangle,
                l = b[0].latitude > a[0].latitude ? b[0].latitude : a[0].latitude,
            k = b[0].longitude > a[0].longitude ? b[0].longitude : a[0].longitude,
            m = b[1].latitude < a[1].latitude ? b[1].latitude : a[1].latitude,
            n = b[1].longitude < a[1].longitude ? b[1].longitude : a[1].longitude,
            j = [new Msn.VE.LatLong(l, k), new Msn.VE.LatLong(m, n)];
            return new Msn.VE.LineRegion(j, null, [d, c])
        } else if (d != null) return d;
        else if (c != null) return c;
        return null
    }
    var IsDrivingEventAttached = false;

    function Line() {
        var t = 5,
            v = new Msn.Drawing.Color(0, 169, 235, .7),
            w = "Solid",
            d = new Msn.Drawing.Stroke,
            H = 4,
            c = null,
            e = "",
            f = true,
            A = "",
            i = "",
            r = 0,
            y = 0,
            x = 0,
            B = 0,
            z = 0,
            a = null,
            b = null,
            h = null,
            g = null,
            I = 0,
            J = 0,
            n = false;

        function F(m, u, C, c, j, k, p, s, l, f, o) {
            if (!c) c = t;
            if (!j) j = v;
            if (!k) k = defaultZIndex;
            if (!f) f = w;
            n = o;
            this.id = m;
            e = m;
            if (l) d.linejoin = l;
            A = c + "pt";
            i = j;
            r = k;
            a = u;
            b = C;
            g = s;
            h = p;
            y = a[0];
            x = b[0];
            B = a[a.length - 1];
            z = b[b.length - 1];
            d.color = i;
            d.width = c;
            d.linecap = f;
            q();
            if (!IsDrivingEventAttached) {
                AttachEvent("onstartzoom", HideLines);
                AttachEvent("onchangeview", UpdateLines);
                IsDrivingEventAttached = true
            }
            this._Draw3D();
            AttachEvent("oninitmode", this._Draw3D)
        }
        function E() {
            if (view3DCreated) spacecontrol.DeleteGeometry(0, e);
            DetachEvent("oninitmode", this._Draw3D);
            m();
            a = b = h = c = null
        }
        this._Draw3D = function () {
            if (view3DCreated) {
                var c = [];
                for (var f = 0; f < a.length; f++) {
                    c.push(b[f]);
                    c.push(",");
                    c.push(a[f]);
                    if (f != a.length - 1) c.push(" ")
                }
                var g = c.join("");
                spacecontrol.AddPolyline("0", e, g, i.ToHexString(), .75, d.width)
            }
        };

        function m() {
            if (graphicCanvas) graphicCanvas.Clear()
        }
        function G() {
            if (!f) {
                j();
                return
            }
            if (c) c.style.display = "block"
        }
        function j() {
            if (c) c.style.display = "none"
        }
        function u(a) {
            f = a;
            if (!f) j()
        }
        function q() {
            l();
            o()
        }
        function D() {
            l();
            o()
        }
        function l() {
            var a = height < 900 ? 900 : height,
            b = width < 900 ? 900 : width;
            northLatitude = GetLatitude(-0.5 * a);
            southLatitude = GetLatitude(1.5 * a);
            westLongitude = GetLongitude(-0.5 * b);
            eastLongitude = GetLongitude(1.5 * b)
        }
        function o() {
            if (Msn.VE.MapStyle.IsViewOblique(currentView.mapStyle)) {
                graphicCanvas.Clear();
                return
            }
            if (view3DCreated) return;
            var b = [],
                a = g.length - 1;
            while (g[a] < currentView.zoomLevel && a >= 0) a--;
            k(h[a], b);
            C(b)
        }
        function k(f, c) {
            if (s(f.boundingRectangle[0], f.boundingRectangle[1])) return;
            if (f.childRegions != null) for (var j = 0; j < f.childRegions.length; j++) k(f.childRegions[j], c);
            else {
                var h = f.indices,
                    e = new Msn.VE.LatLong(a[h[0]], b[h[0]]),
                    d, g = false;
                if (p(e.latitude, e.longitude)) {
                    c.push(e.longitude);
                    c.push(e.latitude);
                    g = true
                }
                for (var i = 1; i < h.length; i++) {
                    d = new Msn.VE.LatLong(a[h[i]], b[h[i]]);
                    if (p(d.latitude, d.longitude)) {
                        if (!g) {
                            c.push(e.longitude);
                            c.push(e.latitude)
                        }
                        g = true;
                        c.push(d.longitude);
                        c.push(d.latitude)
                    } else if (g) {
                        g = false;
                        c.push(d.longitude);
                        c.push(d.latitude)
                    }
                    e = d
                }
            }
        }
        function C(g) {
            if (!graphicCanvas) return;
            var a = new Msn.Drawing.PolyLine(g);
            a.id = e;
            var b = VE_LatLongThreshold.UseThreshold;
            VE_LatLongThreshold.UseThreshold = false;
            graphicCanvas.SetZIndex(r);
            graphicCanvas.SetStroke(d);
            graphicCanvas.DrawPrimitive(a, n);
            VE_LatLongThreshold.UseThreshold = b;
            c = $ID(e);
            if (f) c.style.display = "block";
            else c.style.display = "none"
        }
        function p(a, b) {
            return a >= southLatitude && a <= northLatitude && b >= westLongitude && b <= eastLongitude
        }
        function s(a, b) {
            return a.latitude > northLatitude && b.latitude > northLatitude || a.latitude < southLatitude && b.latitude < southLatitude || a.longitude > eastLongitude && b.longitude > eastLongitude || a.longitude < westLongitude && b.longitude < westLongitude
        }
        this.Init = F;
        this.Destroy = E;
        this.RemoveFromMap = m;
        this.Show = G;
        this.Hide = j;
        this.ChangeVisibility = u;
        this.StartLine = q;
        this.UpdateLine = D
    }
    function Logo(b) {
        var a = null;
        this.Init = function () {
            if (navigator.userAgent.toLowerCase().indexOf("msie") != -1) {
                a = document.createElement("div");
                a.className = "MSVE_PoweredByLogo MSVE_PoweredByLogo_ie";
                if (Msn.VE.API != null) a.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + Msn.VE.API.Globals.vecurrentdomain + "/i/bin/" + Msn.VE.API.Globals.vecurrentversion + "/" + MapControl.Features.Image.PoweredLogo + "', sizingMethod='scale')"
            } else {
                a = document.createElement("img");
                a.src = this.GetURL();
                a.className = "MSVE_PoweredByLogo"
            }
            b.appendChild(a)
        };
        this.GetURL = function () {
            var c = location.pathname.lastIndexOf("/"),
                d = location.pathname.substring(0, c + 1),
                b = "http://" + location.host + d,
                a = "";
            if (Msn.VE.API != null) {
                b = Msn.VE.API.Globals.vecurrentdomain + "/";
                a = Msn.VE.API.Globals.vecurrentversion
            } else a = window.buildVersion;
            return b + "i/bin/" + a + "/" + MapControl.Features.Image.PoweredLogo
        };
        this.Destroy = function () {
            b.removeChild(a);
            a = null
        }
    }
    var hijackMouseMove = false,
        hijackMouseCursor = false,
        isLastButtonMiddle = false;

    function MouseDown(a) {
        a = GetEvent(a);
        CancelEvent(a);
        if (currentMode != threeDMode && FireCustomEvent("onmousedown", a)) return false;
        if (zooming) return false;
        if (panning) StopContinuousPan();
        if (obliqueMode) obliqueMode.CancelRequest();
        if (!mouseZoomDisabled) if (a.which && a.which == 2) currentTool = boxTool;
        else if (!a.which && a.button && a.button == 4) currentTool = boxTool;
        else if (a.ctrlKey | a.altKey) currentTool = boxTool;
        if (!document.all && !isEnablingDefaultDblClick) isEnablingDefaultDblClick = true;
        dragging = true;
        var b = typeof a.which != "undefined" ? a.which : a.button;
        if (!hijackMouseMove && !hijackMouseCursor && b == 1) p_this.SetCursor(cssCursors.Grabbing);
        if (currentTool) currentTool.OnMouseDown(a);
        return false
    }
    var lastmouseX = 0,
        lastmouseY = 0;

    function MouseMove(a) {
        a = GetEvent(a);
        var b = Gimme.Screen.getMousePosition(a);
        lastmouseX = b.x;
        lastmouseY = b.y;
        if (currentMode != threeDMode && FireCustomEvent("onmousemove", a)) return false;
        if (hijackMouseMove) {
            a = GetEvent(a);
            CancelEvent(a);
            var c = g(p_elSource).getPagePosition();
            x = c.x;
            y = c.y;
            var e = originX + offsetX + lastmouseX - x,
                f = originY + offsetY + lastmouseY - y,
                d = CreateEvent(currentMode.PixelToLatLong(new VEPixel(e, f), currentView.zoomLevel));
            FireDefaultEvent("onmousemove", d);
            return
        }
        if (currentTool && dragging) currentTool.OnMouseMove(a);
        return false
    }
    function MouseUp(a) {
        a = GetEvent(a);
        CancelEvent(a);
        if (a) isLastButtonMiddle = IsMiddleMouseButton(a);
        if (currentMode != threeDMode && FireCustomEvent("onmouseup", a)) return false;
        dragging = false;
        if (!hijackMouseMove && !hijackMouseCursor) p_this.SetCursor(cssCursors.Grab);
        var b;
        if (currentTool) b = currentTool.OnMouseUp(a);
        if (targetTool && targetTool.isOutOfBounds()) targetTool.OnMouseUp(a);
        var c = true;
        if (typeof b != "undefined" && b.view != null) {
            isEnablingDefaultDblClick = b.view.disableDbClick != true;
            c = b.view.disableMapFocus != true
        } else isEnablingDefaultDblClick = true;
        currentTool = panTool;
        try {
            if (c) keyboard.focus()
        } catch(d) {}
        return false
    }
    function IsOnscreen(c, d) {
        var b = tileSize * Math.pow(2, currentView.zoomLevel),
            a = originX + offsetX + c - x;
        if (a < 0 || a > b) return false;
        a = originY + offsetY + d - y;
        if (a < 0 || a > b) return false;
        return true
    }
    var isEnablingDefaultDblClick = true;

    function MouseDoubleClick(a) {
        a = GetEvent(a);
        CancelEvent(a);
        var b = Gimme.Screen.getMousePosition(a);
        if (currentMode != threeDMode && FireCustomEvent("ondoubleclick", a)) return false;
        if (hijackMouseMove) return false;
        if (isEnablingDefaultDblClick) {
            UpdateFromParent();
            if (panning || zooming || mouseZoomDisabled) return false;
            if (!IsMapViewOblique() && !IsOnscreen(b.x, b.y)) return false;
            var c = preferredView.MakeCopy();
            c.SetCenter(new VEPixel(originX + offsetX + b.x - x - mapCenterOffset.x, originY + offsetY + b.y - y - mapCenterOffset.y));
            if (a.ctrlKey | a.altKey) c.SetZoomLevel(currentView.zoomLevel - 1);
            else c.SetZoomLevel(currentView.zoomLevel + 1);
            SetView(c);
            return false
        } else isEnablingDefausltDblClick = true
    }
    function MouseWheel(a) {
        a = GetEvent(a);
        CancelEvent(a);
        if (currentMode != threeDMode && FireCustomEvent("onmousewheel", a)) return false;
        if (currentMode != null && currentMode == threeDMode) return false;
        if (panning || zooming || mouseZoomDisabled) return false;
        var f = GetMouseScrollDelta(a);
        if (f === 0) return false;
        var g = f > 0;
        if (mousewheelZoomToCenter || IsMapViewOblique() || !IsOnscreen(lastmouseX, lastmouseY)) if (g) ZoomIn();
        else ZoomOut();
        else {
            var b = g ? currentView.zoomLevel + 1 : currentView.zoomLevel - 1;
            if (b <= GetCurrentViewMaxZoomLevel(currentView)) {
                UpdateFromParent();
                var h = lastmouseX - x,
                    i = lastmouseY - y,
                    d = originX + offsetX + h,
                    e = originY + offsetY + i,
                    c = preferredView.MakeCopy();
                d = currentView.ScaleCoord(d, b);
                e = currentView.ScaleCoord(e, b);
                c.SetZoomLevel(b);
                c.SetCenter(new VEPixel(d - h + width / 2, e - i + height / 2));
                SetView(c)
            }
        }
        return false
    }
    function ContextMenu(a) {
        if (mouseZoomDisabled) return false;
        a = GetEvent(a);
        CancelEvent(a);
        if (currentMode != threeDMode && FireCustomEvent("onclick", a)) return false;
        var e = g(p_elSource).getPagePosition();
        x = e.x;
        y = e.y;
        var c, d, b = Gimme.Screen.getMousePosition(a);
        if (currentMode == threeDMode) {
            c = b.x - x;
            d = b.y - y
        } else {
            c = originX + offsetX + b.x - x;
            d = originY + offsetY + b.y - y
        }
        var f = currentMode.PixelToLatLong(new VEPixel(c, d), currentView.zoomLevel);
        if (f != null) {
            if (currentMode == threeDMode && Get3DControl().UIHasFocus()) return false;
            var h = CreateEvent(f);
            FireDefaultEvent("oncontextmenu", h)
        }
        return false
    }
    function MouseClick(a) {
        a = GetEvent(a);
        CancelEvent(a);
        if (!isLastButtonMiddle) if (currentMode != threeDMode && FireCustomEvent("onclick", a)) return false
    }
    function MouseOut(a) {
        a = GetEvent(a);
        if (currentMode != threeDMode && g(GetTarget(a)).hasClass("MSVE_Shape") && FireCustomEvent("onmouseout", a)) {
            CancelEvent(a);
            return false
        }
    }
    function MouseOver(a) {
        a = GetEvent(a);
        if (currentMode != threeDMode && g(GetTarget(a)).hasClass("MSVE_Shape") && FireCustomEvent("onmouseover", a)) {
            CancelEvent(a);
            return false
        }
    }
    function MouseEnter(a) {
        a = GetEvent(a);
        var b = a.relatedTarget || a.fromElement;
        if (currentMode != threeDMode && b != null && FireCustomEvent("onmouseover", a)) {
            CancelEvent(a);
            return false
        }
        if (!hijackMouseMove && !hijackMouseCursor) p_this.SetCursor(cssCursors.Grab)
    }
    function MouseLeave(a) {
        a = GetEvent(a);
        if (currentMode != threeDMode && FireCustomEvent("onmouseout", a)) {
            CancelEvent(a);
            return false
        }
    }
    var obliqueLoop = 0,
        panningTargetPixel = null,
        panningCurrentPixel = null;

    function PanMap(c, d) {
        if (c == 0 && d == 0 || isNaN(c) || isNaN(d)) return false;
        if (currentMode != threeDMode) {
            var a = ShiftView(currentView, currentBounds, c, d);
            if (typeof a != "undefined" && a != null) {
                var f = g(map).getComputedPosition(),
                    e = f.x - a.x,
                    h = f.y - a.y;
                map.style.left = e + "px";
                map.style.top = h + "px";
                offsetX = -e;
                offsetY = -h;
                var b = new VEPixel(width / 2 + originX + offsetX, height / 2 + originY + offsetY);
                if (keyboardPan && (c != 0 && a.x == 0 || d != 0 && a.y == 0)) {
                    if (typeof currentMode.RequestPending != "undefined" && !currentMode.RequestPending()) {
                        b.x += c;
                        b.y += d;
                        var i = PixelToLatLong(b);
                        targetTool.centeringTrigger = true;
                        SetCenter(i.latitude, i.longitude)
                    }
                } else {
                    currentView.SetCenter(b);
                    preferredView.SetCenter(new VEPixel(b.x, b.y));
                    tileLayerManager.PanView()
                }
                Fire("onpan")
            }
        } else return false;
        if (copyright) copyright.Update();
        return true
    }
    function ContinuousPan(a, b, c, d) {
        if (zooming) return;
        if (!c) c = -1;
        panningX = a;
        panningY = b;
        panCounter = c;
        if (!a && !b) {
            StopContinuousPan();
            return
        }
        keyboardPan = d;
        if (view3DCreated) {
            spacecontrol.ContinuousPan(a, b);
            Fire("onstartpan")
        } else if (!panning) {
            panning = true;
            StepPan();
            Fire("onstartpan")
        }
    }
    function StepPan() {
        if (panning) {
            var a = panningX,
                b = panningY;
            if (panningCurrentPixel != null && panningTargetPixel != null) {
                var c = panningTargetPixel.x - panningCurrentPixel.x;
                if (Math.abs(c) < Math.abs(a) || a == 0) a = c;
                var d = panningTargetPixel.y - panningCurrentPixel.y;
                if (Math.abs(d) < Math.abs(b) || b == 0) b = d;
                panningCurrentPixel.x += a;
                panningCurrentPixel.y += b
            }
            PanMap(a, b);
            if (panCounter > 0) panCounter--;
            if (panCounter != 0 && (panningCurrentPixel == null || panningTargetPixel == null || panningTargetPixel.x != panningCurrentPixel.x || panningTargetPixel.y != panningCurrentPixel.y)) window.setTimeout(StepPan, 10);
            else StopContinuousPan()
        }
    }
    function StopContinuousPan() {
        panningX = 0;
        panningY = 0;
        panningTargetPixel = null;
        panningCurrentPixel = null;
        panning = false;
        keyboardPan = false;
        if (currentMode != threeDMode) if (panLatitude != null && panLongitude != null) {
            var b = new Msn.VE.LatLong(panLatitude, panLongitude),
                a = LatLongToPixel(b),
                c = a.x - width / 2,
                d = a.y - height / 2;
            PanMap(c, d);
            currentView.latlong.latitude = panLatitude;
            currentView.latlong.longitude = panLongitude;
            preferredView.Copy(currentView);
            panLatitude = null;
            panLongitude = null;
            if (obliqueMode) obliqueMode.UpdateAvailability()
        } else ComputeCenterPoint(true);
        else if (view3DCreated) spacecontrol.ContinuousPan(0, 0);
        Fire("onendpan");
        Fire("onchangeview");
        if (resizeInProgress) resizeInProgress = false
    }
    function PanToLatLong(b, a, c) {
        if (currentMode == threeDMode) SetCenter(b, a);
        else {
            panLatitude = b;
            panLongitude = a;
            if (Msn.VE.MapStyle.IsViewOblique(currentView.mapStyle) && PanInOblique(new Msn.VE.LatLong(b, a), null, c));
            else PanToPixel(LatLongToPixel(new Msn.VE.LatLong(b, a)), c)
        }
    }
    function PanByPixel(a, b) {
        a.x = width / 2 + a.x;
        a.y = height / 2 + a.y;
        PanToPixel(a, b)
    }
    function PanToView(a) {
        var b = a.center.x - (originX + offsetX),
            c = a.center.y - (originY + offsetY);
        PanToPixel(new VEPixel(b, c))
    }
    function PanToPixel(a, e) {
        if (Msn.VE.MapStyle.IsViewOblique(currentView.mapStyle) && PanInOblique(null, a, e)) return;
        var b = a.x - width / 2,
            c = a.y - height / 2;
        panningTargetPixel = a;
        panningCurrentPixel = new VEPixel(width / 2, height / 2);
        var d = Math.sqrt(b * b + c * c);
        if (!e && (!IsAnimationEnabled() || MathAbs(b) > 2 * width || MathAbs(c) > 2 * height || d > 1.5 * Math.sqrt(width * width + height * height))) {
            var h = preferredView.MakeCopy(),
                j = a.x + (originX + offsetX),
                k = a.y + (originY + offsetY);
            h.SetCenter(new VEPixel(j, k));
            SetView(h);
            if (resizeInProgress) resizeInProgress = false;
            return
        }
        var f = Math.atan2(c, b),
            i = MathCeil(d / panToLatLongSpeed),
            g = MathRound(d / i);
        b = MathRound(Math.cos(f) * g);
        c = MathRound(Math.sin(f) * g);
        ContinuousPan(b, c)
    }
    function PanInOblique(a, d) {
        obliqueLoop++;
        if (obliqueLoop > 30) {
            obliqueLoop = 0;
            return false
        }
        var c = obliqueMode.GetScene();
        if (!a) a = PixelToLatLong(d);
        if (!c || !c.ContainsLatLong(a, currentView.zoomLevel)) {
            var b = preferredView.MakeCopy();
            b.sceneId = null;
            b.SetCenterLatLong(a);
            SetView(b);
            if (resizeInProgress) resizeInProgress = false;
            return true
        } else return false
    }
    function PushPinOffset(a, b) {
        this.x = a;
        this.y = b
    }
    function getPushPinOffset(c) {
        var a = Msn.VE.PushPinTypes,
            b;
        switch (c) {
        case a.Annotation:
            b = new PushPinOffset(-2, -29 / 2 - 5);
            break;
        case a.Overlay:
        case a.SearchResultPrecise:
        case a.SearchResultNonprecise:
        case a.Collection:
        case a.AdSponsor:
            b = new PushPinOffset(0, -29 / 2 + 3);
            break;
        case a.Direction:
            b = new PushPinOffset(-3, -26 / 2 - 3);
            break;
        case a.DirectionTemp:
            b = new PushPinOffset(2, -26 / 2 + 3);
            break;
        case a.TrafficLight:
            b = new PushPinOffset(0, -26 / 2);
            break;
        case a.TrafficOthers:
            b = new PushPinOffset(0, -29 / 2);
            break;
        case a.YouAreHere:
            b = new PushPinOffset(0, -26 / 2);
            break;
        case a.AdStandard:
            b = new PushPinOffset(0, -42 / 2 + 2);
            break;
        case a.AdWide:
            b = new PushPinOffset(0, -27 / 2);
            break;
        case a.AdCategory:
            b = new PushPinOffset(0, -16 / 2);
            break;
        case a.Default:
        default:
            b = new PushPinOffset(0, 0)
        }
        return b
    }
    function GetPushpins() {
        return pushpins
    }
    function AddPushpin(m, k, l, j, h, e, f, i, g, b, c, d) {
        var a = new Pushpin;
        a.Init(m, k, l, j, h, e, f, i, g, d);
        if (typeof b == "undefined" || b == false || b == null) {
            if (IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) {
                if (! (typeof c != "undefined" && c == false)) View3DAddPushpin(a);
                map.appendChild(a.pin);
                a.Hide()
            } else map.appendChild(a.pin);
            pushpins.push(a)
        }
        return a.pin
    }
    function GetPushpinIndex(b) {
        for (var a = 0; a < pushpins.length; a++) if (pushpins[a].id == b) return a;
        return -1
    }
    function RemovePushpin(b) {
        var a = GetPushpinIndex(b);
        if (a >= 0) {
            var c = pushpins[a];
            pushpins.splice(a, 1);
            if (IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) View3DRemovePushpin(b);
            c.Destroy()
        }
    }
    function ClearPushpins() {
        while (pushpins.length > 0) {
            var a = pushpins.pop();
            if (IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) View3DRemovePushpin(a.id);
            a.Destroy()
        }
    }
    function Relay3DPushpins() {
        for (var b = 0; b < pushpins.length; b++) {
            var a = pushpins[b];
            if (a.id && a.id.constructor == String && a.id.indexOf("Layer") == -1) View3DAddPushpin(a)
        }
    }
    function NeedToPlaceAccurately(a) {
        switch (a.pinType) {
        case Msn.VE.PushPinTypes.SearchResultPrecise:
        case Msn.VE.PushPinTypes.AdStandard:
        case Msn.VE.PushPinTypes.AdCategory:
        case Msn.VE.PushPinTypes.AdWide:
        case Msn.VE.PushPinTypes.AdSponsor:
            return true;
        default:
            return false
        }
    }
    function _RepositionPushpins() {
        for (var a = 0; a < pushpins.length; a++) {
            pushpins[a].pin.style.display = "";
            pushpins[a].Reposition()
        }
    }
    function RepositionPushpins() {
        var d = [],
            h, i = function (b) {
            if (currentMode != obliqueMode || null == currentMode.GetScene() || h != currentMode.GetScene().GetID()) return;
            if (b) for (var a = 0; a < d.length; a++) {
                var c = GetPushpinIndex(d[a]);
                if (c >= 0) if (b[a]) pushpins[c].SetAccuratePixel(b[a])
            }
            _RepositionPushpins()
        };
        if (pushpins && pushpins.length > 0) {
            if (null == Msn.VE.API && currentMode == obliqueMode) {
                var c = currentMode.GetScene(),
                    f = [],
                    a = 0;
                if (c) {
                    h = c.GetID();
                    for (var e = 0; e < pushpins.length; e++) {
                        var b = pushpins[e],
                            g = new Msn.VE.LatLong(b.GetLatitude(), b.GetLongitude());
                        if (NeedToPlaceAccurately(b) && c.ContainsLatLong(g)) {
                            f[a] = g;
                            d[a] = b.id;
                            a++
                        }
                    }
                    if (a > 0) {
                        currentMode.LatLongToPixelAsync(f, currentView.GetZoomLevel(), i);
                        return
                    }
                }
            }
            _RepositionPushpins()
        }
    }
    function HidePins() {
        for (var a = 0; a < pushpins.length; a++) pushpins[a].Hide()
    }
    function UnHidePins() {
        for (var a = 0; a < pushpins.length; a++) pushpins[a].UnHide()
    }
    function GetPushpinPixel(b, c, d, e) {
        var a = currentMode.LatLongToPixel(b, c);
        if (a) {
            a.x = MathRound(a.x - d);
            a.y = MathRound(a.y - e)
        }
        return a
    }
    function GetPushpinMapPixel(a, b) {
        return GetPushpinPixel(a, b, originX, originY)
    }
    function Pushpin() {
        var a = this;
        this.visible = true;
        this.pin = document.createElement("a");
        this.img = document.createElement("img");
        this.img.className = "VE_PushpinImage";
        this.pin.href = "javascript://pushin hover";
        this.pin.onclick = function () {
            return ParseShiftKeyForLinks(event)
        };
        this.pin.vePushpin = this;
        this.x1 = 0;
        this.y1 = 0;
        this.x2 = 0;
        this.y2 = 0;
        this.center = null;
        this.w = 0;
        this.h = 0;
        this.n = zoomTotalSteps + 1;
        this.xs = new Array(this.n);
        this.ys = new Array(this.n);
        this.Offset = 0;
        this.beLatLongOffset = null;
        this.Destroy = function () {
            a.RemoveFromMap();
            a.pin.onclick = null;
            a.pin.vePushpin = null;
            a.pin = null;
            while (a.xs.length > 0) a.xs.pop();
            while (a.ys.length > 0) a.ys.pop();
            a = null
        }
    }
    Pushpin.prototype.Init = function (i, g, h, f, e, c, d, j, a, b) {
        this.id = i;
        this.lat = g;
        this.lon = h;
        this.width = f;
        this.height = e;
        this.className = c;
        this.innerHtml = d;
        this.zIndex = j;
        this.pinType = a;
        this.pin.id = i;
        this.pin.className = c;
        this.pin.style.position = "absolute";
        this.pin.innerHTML = d;
        this.pin.pinType = a || Msn.VE.PushPinTypes.Default;
        this.Offset = getPushPinOffset(this.pin.pinType);
        if (a == Msn.VE.PushPinTypes.SearchResultPrecise) {
            this.img.src = GetUrlPrefix() + "i/bin/" + window.buildVersion + "/pins/poi_search.gif";
            this.pin.appendChild(this.img)
        } else if (a == Msn.VE.PushPinTypes.SearchResultNonprecise) {
            this.img.src = GetUrlPrefix() + "i/bin/" + window.buildVersion + "/pins/poi_search_nonprecise.gif";
            this.pin.appendChild(this.img)
        } else if (a == Msn.VE.PushPinTypes.AdSponsor) {
            this.img.src = GetUrlPrefix() + "i/bin/" + window.buildVersion + "/pins/poi_search.gif";
            this.pin.appendChild(this.img)
        }
        this.pin.unselectable = "on";
        this.center = new Msn.VE.LatLong(g, h);
        this.w = f;
        this.h = e;
        if (b) this.SetAccuratePixel(b);
        var k = this.LatLongToPixelWithAccuracyOffset(currentView.zoomLevel, originX, originY);
        this.SetPixelLocation(k)
    };
    Pushpin.prototype.SetAccuratePixel = function (b) {
        var a = currentMode.PixelToLatLong(b, currentView.zoomLevel);
        this.beLatLongOffset = new Msn.VE.LatLong(a.latitude - this.center.latitude, a.longitude - this.center.longitude)
    };
    Pushpin.prototype.LatLongToPixelWithAccuracyOffset = function (b, c, d) {
        var a = this.center;
        if (this.beLatLongOffset && IsMapViewOblique()) a = new Msn.VE.LatLong(this.center.latitude + this.beLatLongOffset.latitude, this.center.longitude + this.beLatLongOffset.longitude);
        return GetPushpinPixel(a, b, c, d)
    };
    Pushpin.prototype.GetLatitude = function () {
        return this.center.latitude
    };
    Pushpin.prototype.GetLongitude = function () {
        return this.center.longitude
    };
    Pushpin.prototype.ClearSteps = function () {
        var b = zoomTotalSteps;
        for (var a = 0; a <= b; a++) {
            this.xs[a] = this.x1 - this.w / 2 + this.Offset.x + "px";
            this.ys[a] = this.y1 - this.h / 2 + this.Offset.y + "px"
        }
    };
    Pushpin.prototype.PrecomputeSteps = function () {
        var d = zoomTotalSteps;
        for (var a = 0; a <= d; a++) {
            var b = a / d,
                c = 1 - b;
            this.xs[a] = MathFloor(c * this.x1 + b * this.x2 - this.w / 2 + this.Offset.x) + "px";
            this.ys[a] = MathFloor(c * this.y1 + b * this.y2 - this.h / 2 + this.Offset.y) + "px"
        }
    };
    Pushpin.prototype.SetFactor = function (a) {
        this.pin.style.left = this.xs[a];
        this.pin.style.top = this.ys[a]
    };
    Pushpin.prototype.SetPixelLocation = function (a) {
        if (a && this.visible) {
            this.x1 = a.x;
            this.y1 = a.y;
            this.x2 = this.x1;
            this.y2 = this.y1;
            this.PrecomputeSteps();
            this.SetFactor(0);
            this.pin.style.display = "block"
        } else this.pin.style.display = "none"
    };
    Pushpin.prototype.SwapStates = function () {
        var a = 0;
        a = this.x1;
        this.x1 = this.x2;
        this.x2 = a;
        a = this.y1;
        this.y1 = this.y2;
        this.y2 = a
    };
    Pushpin.prototype.Reposition = function () {
        var a = this.LatLongToPixelWithAccuracyOffset(currentView.zoomLevel, originX, originY);
        if (a) {
            this.x1 = a.x;
            this.y1 = a.y;
            this.ClearSteps();
            this.SetFactor(0);
            if (this.pin.style.display != "none" && this.visible) this.pin.style.display = "block"
        } else this.pin.style.display = "none"
    };
    Pushpin.prototype.UnHide = function () {
        if (!this.visible) {
            this.pin.style.display = "block";
            this.visible = true
        }
    };
    Pushpin.prototype.Hide = function () {
        if (this.visible) {
            this.pin.style.display = "none";
            this.visible = false
        }
    };
    Pushpin.prototype.UnHide3D = function () {
        if (IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) View3DAddPushpin(this)
    };
    Pushpin.prototype.Hide3D = function () {
        if (IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) View3DRemovePushpin(this.id)
    };
    Pushpin.prototype.PrepareForZoom = function (b, c, d) {
        this.x1 -= offsetX;
        this.y1 -= offsetY;
        var a = this.LatLongToPixelWithAccuracyOffset(d, b, c);
        if (a) {
            this.x2 = a.x;
            this.y2 = a.y;
            this.PrecomputeSteps();
            if (this.pin.style.display != "none" && this.visible) this.pin.style.display = "block"
        } else this.pin.style.display = "none"
    };
    Pushpin.prototype.RemoveFromMap = function () {
        if (this.pin.parentNode == map) map.removeChild(this.pin)
    };
    Pushpin.prototype.Move = function (a) {
        this.MoveToLatLon(PixelToLatLong(a))
    };
    Pushpin.prototype.MoveToLatLon = function (a) {
        this.center = a;
        this.Reposition()
    };

    function ScaleBar(c) {
        var e = null,
            j = null,
            a = g(document.createElement("div")),
            b = g(document.createElement("div")),
            m = false,
            d = document.createElement("div"),
            f = document.createElement("div"),
            i = 150;
        this.Init = function () {
            a.addClass("MSVE_ScaleBarLabel MSVE_ScaleBarLabelBg");
            b.addClass("MSVE_ScaleBarLabel MSVE_ScaleBarLabelFg");
            d.className = "MSVE_ScaleBar MSVE_ScaleBarBg";
            f.className = "MSVE_ScaleBar MSVE_ScaleBarFg";
            n();
            k()
        };
        this.Show = function () {
            c.appendChild(a.element());
            c.appendChild(b.element());
            c.appendChild(d);
            c.appendChild(f)
        };
        this.Hide = function () {
            try {
                c.removeChild(a.element());
                c.removeChild(b.element());
                c.removeChild(d);
                c.removeChild(f)
            } catch(e) {}
        };
        this.Destroy = function () {
            this.Hide();
            e = null;
            a = b = d = BarFg = null
        };

        function k() {
            var c = 0;
            if (e && e.style.display !== "none") {
                var i = parseInt(g(e).getStyle("height")),
                    h = parseInt(e.style.bottom);
                c += (isNaN(i) ? 0 : i) + (isNaN(h) ? 0 : h)
            }
            if (a) {
                a.setStyle("bottom", c + "px");
                b.setStyle("bottom", 1 + c + "px")
            }
            if (d) {
                d.style.bottom = c + "px";
                f.style.bottom = 1 + c + "px"
            }
        }
        function o(a) {
            return a * .001
        }
        function q(a) {
            return a * .000621371192
        }
        function r(a) {
            return a * 1.0936133
        }
        function t(a) {
            i = a
        }
        function p(a) {
            j = a
        }
        function n() {
            try {
                var f = GetMetersPerPixel(),
                    c = f * i,
                    e;
                if (j == null) e = $MVEM.IsEnabled(MapControl.Features.ScaleBarKilometers);
                else e = j == Msn.VE.DistanceUnit.Kilometers;
                if (e) {
                    var d = L_ScaleBarKilometers_Text,
                        b = o(c),
                        a = h(b);
                    if (a < .5) {
                        d = L_ScaleBarMeters_Text;
                        b = c;
                        a = h(b)
                    }
                    l("metric", d, a, Math.round(a / b * i))
                } else {
                    var d = L_ScaleBarMiles_Text,
                        b = q(c),
                        a = h(b);
                    if (a < .5) {
                        d = L_ScaleBarYards_Text;
                        b = r(c);
                        a = h(b)
                    }
                    l("us", d, a, Math.round(a / b * i))
                }
            } catch(g) {}
        }
        function h(d) {
            var g = Math.log(d) / Math.log(10),
                e = Math.floor(g),
                a = Math.pow(10, e),
                c = d / a,
                b = Math.floor(c);
            if (b >= 3) return b * a;
            var f = Math.floor(c * 2) * .5;
            return f * a
        }
        function l(j, i, c, g) {
            if (c < 1) c = c.toFixed(1);
            var e = GetMapStyle() != roadStyle;
            if (e != m) {
                if (e) {
                    a.swapClass("MSVE_ScaleBarLabelBg", "MSVE_ScaleBarLabelBgInv");
                    b.swapClass("MSVE_ScaleBarLabelFg", "MSVE_ScaleBarLabelFgInv")
                } else {
                    a.swapClass("MSVE_ScaleBarLabelBgInv", "MSVE_ScaleBarLabelBg");
                    b.swapClass("MSVE_ScaleBarLabelFgInv", "MSVE_ScaleBarLabelFg")
                }
                m = e
            }
            var h = c + " " + i;
            a.setHTML(h);
            b.setHTML(h);
            d.style.width = 4 + g + "px";
            f.style.width = g + "px"
        }
        function s(a) {
            e = a;
            k()
        }
        this.SetBarWidth = t;
        this.SetDistanceUnit = p;
        this.Update = n;
        this.Reposition = k;
        this.SetPinElement = s
    }
    function MapLegend(h) {
        var q = this,
            g = h,
            a = null,
            e = null,
            b = null,
            d = null,
            c = null;
        h = null;
        this.Init = function () {
            a = document.createElement("div");
            a.id = "MSVE_MapLegend";
            a.style.display = "none";
            g.appendChild(a);
            e = document.createElement("div");
            e.className = "MSVE_LegendGroup";
            a.appendChild(e);
            a.attachEvent("onmousedown", IgnoreEvent);
            a.attachEvent("onmouseup", IgnoreEvent);
            a.attachEvent("onmousemove", IgnoreEvent);
            a.attachEvent("onmousewheel", IgnoreEvent);
            a.attachEvent("ondblclick", IgnoreEvent);
            a.attachEvent("oncontextmenu", IgnoreEvent);
            a.attachEvent("onkeydown", IgnoreEvent);
            a.attachEvent("onkeyup", IgnoreEvent)
        };
        this.Destroy = function () {
            if (a) {
                a.detachEvent("onmousedown", IgnoreEvent);
                a.detachEvent("onmouseup", IgnoreEvent);
                a.detachEvent("onmousemove", IgnoreEvent);
                a.detachEvent("onmousewheel", IgnoreEvent);
                a.detachEvent("ondblclick", IgnoreEvent);
                a.detachEvent("oncontextmenu", IgnoreEvent);
                a.detachEvent("onkeydown", IgnoreEvent);
                a.detachEvent("onkeyup", IgnoreEvent);
                g.removeChild(a);
                a = null
            }
            g = null;
            e = null;
            d = null;
            c = null
        };

        function k(d) {
            if (d && !b) i();
            a.style.display = d ? "" : "none";
            if (c) window.setTimeout(c.Reposition, 1);
            f()
        }
        function i() {
            if (e && !b) {
                b = document.createElement("div");
                b.className = "MSVE_LegendGroup";
                b.id = "MSVE_TrafficLegend";
                e.appendChild(b);
                var a = document.createElement("span");
                a.id = "MSVE_TL_Slow";
                a.appendChild(document.createTextNode(L_MapLegendTrafficSlow_Text));
                b.appendChild(a);
                a = document.createElement("span");
                a.id = "MSVE_TL_Fast";
                a.appendChild(document.createTextNode(L_MapLegendTrafficFast_Text));
                b.appendChild(a);
                a = document.createElement("img");
                a.id = "MSVE_TL_Key";
                var c = GetUrlPrefix(),
                    f = window.buildVersion;
                if (Msn.VE.API != null) {
                    c = Msn.VE.API.Globals.vecurrentdomain + "/";
                    f = Msn.VE.API.Globals.vecurrentversion
                }
                a.src = c + "i/bin/" + f + "/traffic/tf_legend.gif";
                a.alt = "";
                b.appendChild(a);
                d = document.createElement("div");
                d.className = "MSVE_LegendGroup";
                d.id = "MSVE_TrafficMsg";
                e.appendChild(d)
            }
        }
        function l(a) {
            while (a.hasChildNodes()) a.removeChild(a.childNodes[0])
        }
        function j(a) {
            if (d) {
                l(d);
                d.appendChild(document.createTextNode(a));
                f()
            }
        }
        function o(b) {
            c = b;
            if (c) c.SetPinElement(a)
        }
        function p() {
            if (c) {
                c.SetPinElement(null);
                c = null
            }
        }
        function n(b, c) {
            if (a) {
                a.style.left = b + "px";
                a.style.top = c + "px";
                a.style.bottom = "auto";
                a.style.right = "auto";
                f()
            }
        }
        function f() {
            if (a) mvcViewFacade.UpdateShimIfSupported(a)
        }
        function m() {
            if (a) destroyIFrameShim(a.id)
        }
        this.ShowTrafficLegend = k;
        this.SetTrafficLegendMsg = j;
        this.UnPin = p;
        this.PinTo = o;
        this.MoveTo = n;
        this.UpdateShim = f;
        this.RemoveShim = m
    }
    var totalRequestTime = 0,
        totalRequestCount = 0,
        totalFailureCount = 0,
        responseRangeCeilings = [];
    responseRangeCeilings[roadStyle] = [325, 975];
    responseRangeCeilings[shadedStyle] = responseRangeCeilings[roadStyle];
    responseRangeCeilings[aerialStyle] = [350, 1050];
    responseRangeCeilings[hybridStyle] = [425, 1275];
    responseRangeCeilings[obliqueStyle] = [450, 1350];
    responseRangeCeilings[obliqueHybridStyle] = responseRangeCeilings[obliqueStyle];
    var responseRangeCounts = [0, 0, 0];

    function RequestTile(b, c, i, h, d, g, e, f) {
        var a = new Tile;
        a.Init(b, c, i, h, b * tileSize - originX, c * tileSize - originY, d, g, e, f);
        return a
    }
    function ClearTiles(a) {
        while (a.length > 0) {
            var b = a.pop();
            b.Destroy();
            b = null
        }
    }
    function GetResponseRangeCounts() {
        var b = 0;
        for (var a = 0; a < responseRangeCounts.length; a++) b += responseRangeCounts[a];
        if (b == 0) return responseRangeCounts;
        var c = new Array(responseRangeCounts.length);
        for (var a = 0; a < responseRangeCounts.length; a++) c[a] = responseRangeCounts[a] / b;
        return c
    }
    function ResetResponseRangeCounts() {
        for (var a = 0; a < responseRangeCounts.length; a++) responseRangeCounts[a] = 0
    }
    function GetFailureRate() {
        return totalFailureCount / totalRequestCount
    }
    function Tile() {
        var a = null,
            b = null,
            c = null,
            i = null,
            D = null,
            e = null,
            p = 0,
            q = 0,
            v = 0,
            B = 0,
            f = 0,
            d = 1,
            x = zoomTotalSteps + 1,
            m = new Array(x),
            o = new Array(x),
            u = new Array(x),
            s = new Array(x),
            A = false,
            g = 0,
            h = 0,
            k = 0,
            j = 0,
            l = 0,
            n = 0,
            t = 0,
            r = 0,
            z = null,
            C = 0;
        this.Init = function (k, l, m, j, c, e, g, a, h, i) {
            p = k;
            q = l;
            v = m;
            B = j;
            f = i;
            d = h;
            if (!currentMode.IsValidTile(p, q, v)) return;
            y(c, e, tileSize, tileSize);
            I(c, e, tileSize, tileSize);
            w();
            if (a == mapTiles || a == trafficTiles) C = 0;
            else C = 1;
            b = document.createElement("img");
            b.className = "MSVE_ImageTile";
            if (a != null) b.className += " msve_" + a + "_tile";
            b.onload = T;
            b.onerror = S;
            z = new Date;
            D = currentMode.GetFilename(p, q, v, g, a);
            b.src = D
        };

        function H() {
            if (!e && a != null) e = graphicCanvas.AddPrintTile(D, q * tileSize - originY, p * tileSize - originX, tileSize, tileSize, d, f)
        }
        this.AddPrintTile = H;

        function O() {
            if (e) {
                graphicCanvas.RemovePrintTile(e);
                e = null
            }
        }
        this.RemovePrintTile = O;

        function L() {
            if (e) graphicCanvas.RePositionPrintTile(e, q * tileSize - originY, p * tileSize - originX)
        }
        this.RePositionPrintTile = L;
        this.Destroy = function () {
            if (a) a.onmousedown = null;
            G();
            while (m.length > 0) m.pop();
            while (o.length > 0) o.pop();
            while (u.length > 0) u.pop();
            while (s.length > 0) s.pop();
            m = o = u = s = null
        };

        function y(c, d, b, a) {
            g = c;
            h = d;
            k = b;
            j = a
        }
        this.SetCurrentState = y;

        function I(c, d, b, a) {
            l = c;
            n = d;
            t = b;
            r = a
        }
        this.SetNextState = I;

        function Q() {
            for (var a = 0; a <= zoomTotalSteps; a++) {
                m[a] = g + "px";
                o[a] = h + "px";
                u[a] = k + "px";
                s[a] = j + "px"
            }
        }
        this.ClearSteps = Q;

        function w() {
            for (var a = 0; a <= zoomTotalSteps; a++) {
                var b = a / zoomTotalSteps,
                    c = 1 - b;
                m[a] = MathFloor(c * g + b * l) + "px";
                o[a] = MathFloor(c * h + b * n) + "px";
                u[a] = MathCeil(c * k + b * t) + "px";
                s[a] = MathCeil(c * j + b * r) + "px"
            }
        }
        this.PrecomputeSteps = w;

        function K(e) {
            if (a == null || zooming && !A) return;
            var b = a.style;
            b.left = m[e];
            b.top = o[e];
            b.width = u[e];
            b.height = s[e];
            if (debug && e == 0) {
                if (!c) F();
                var g = c.style;
                b.border = "1px dashed red";
                g.left = m[e];
                g.top = o[e]
            }
            if (a.parentNode != map) {
                b.position = "absolute";
                b.zIndex = f;
                if (C > 0) if (b && typeof b.filter != "undefined") if (Msn.VE.Environment.BrowserInfo.MajorVersion <= 6) {
                    if (!i) {
                        i = document.createElement("div");
                        i.className = "MSVE_ImageTile";
                        var b = i.style;
                        b.left = m[e];
                        b.top = o[e];
                        b.width = u[e];
                        b.height = s[e];
                        b.position = "absolute";
                        b.zIndex = f;
                        if (d != 1) b.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + a.src + "',sizingMethod='scale'), alpha(opacity=" + d * 100 + ")";
                        else b.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + a.src + "',sizingMethod='scale')";
                        map.appendChild(i)
                    }
                } else {
                    b.zIndex = f;
                    if (d < 1) b.filter = "alpha(opacity=" + d * 100 + ");opacity:" + d + ";";
                    map.appendChild(a)
                } else {
                    b.zIndex = f;
                    b.opacity = d;
                    map.appendChild(a)
                } else {
                    if (b && typeof b.filter != "undefined") {
                        if (d < 1) b.filter = "alpha(opacity=" + d * 100 + ");opacity:" + d
                    } else b.opacity = d;
                    map.appendChild(a)
                }
                if (debug && c && c.parentNode != map) {
                    var h = a.src;
                    c.innerHTML = h.substring(h.lastIndexOf("/") + 1, h.lastIndexOf("."));
                    g.position = "absolute";
                    g.zIndex = f + 1;
                    map.appendChild(c)
                }
            }
        }
        this.SetFactor = K;

        function J() {
            var a = 0;
            a = g;
            g = l;
            l = a;
            a = h;
            h = n;
            n = a;
            a = k;
            k = t;
            t = a;
            a = j;
            j = r;
            r = a
        }
        this.SwapStates = J;

        function G() {
            if (b) {
                b.onload = null;
                b.onerror = null;
                b = null
            }
            if (a) {
                if (a.parentNode == map) map.removeChild(a);
                a = null
            }
            if (c) {
                if (c.parentNode == map) map.removeChild(c);
                c = null
            }
            if (i) {
                if (i.parentNode == map) map.removeChild(i);
                i = null
            }
            if (e) {
                graphicCanvas.RemovePrintTile(e);
                e = null
            }
        }
        this.RemoveFromMap = G;

        function T() {
            if (currentView && v != currentView.zoomLevel || b == null) return;
            var d = new Date,
                c = d.getTime() - z.getTime();
            E(c);
            totalRequestTime += c;
            totalRequestCount++;
            if (debug) window.status = "last=" + c + ", average=" + totalRequestTime / totalRequestCount;
            b.onload = null;
            b.onerror = null;
            a = b;
            a.onmousedown = function () {
                return false
            };
            b = null;
            if (!zooming) K(zoomCounter);
            if (graphicCanvas && graphicCanvas._printable) H()
        }
        function S() {
            if (v != currentView.zoomLevel || b == null) return;
            var c = new Date,
                a = c.getTime() - z.getTime();
            E(a);
            totalRequestTime += a;
            totalRequestCount++;
            totalFailureCount++;
            b.onload = null;
            b.onerror = null;
            b = null
        }
        function E(b) {
            for (var a = 0; a < responseRangeCeilings[B].length; a++) if (b < responseRangeCeilings[B][a]) {
                responseRangeCounts[a]++;
                return
            }
            responseRangeCounts[responseRangeCounts.length - 1]++
        }
        function M(e, i, p, c, d, o) {
            y(g - offsetX, h - offsetY, k, j);
            var m = o - p,
                b = Math.pow(2, m);
            l = MathFloor((e + g) * b - c);
            n = MathFloor((i + h) * b - d);
            t = MathCeil((e + g + k) * b - c) - l;
            r = MathCeil((i + h + j) * b - d) - n;
            A = true;
            w();
            f = baseZIndex;
            if (a != null) a.style.zIndex = f
        }
        this.PrepareBaseTile = M;

        function N(i, m, s, d, e, o) {
            var u = s - o,
                a = Math.pow(2, u);
            l = MathFloor((d + g) * a - i);
            n = MathFloor((e + h) * a - m);
            t = MathCeil((d + g + k) * a - i) - l;
            r = MathCeil((e + h + j) * a - m) - n;
            var c = MathCeil(tileViewportWidth * .25),
                b = MathCeil(tileViewportHeight * .25);
            A = o < s && (p < tileViewportX1 + c || p > tileViewportX2 - c || q < tileViewportY1 + b || q > tileViewportY2 - b);
            J();
            w();
            f = swapZIndex
        }
        this.PrepareSwapTile = N;

        function R(b) {
            if (!c) F();
            if (a != null) a.style.border = b ? "1px dashed red" : "0px";
            c.style.display = b ? "block" : "none"
        }
        this.Debug = R;

        function P() {
            t = k;
            r = j
        }
        this.ClearStates = P;

        function F() {
            c = document.createElement("div");
            c.style.font = "7pt Verdana, sans-serif";
            c.style.color = "Red";
            c.style.backgroundColor = "White"
        }
    }
    var tileMarket = Msn.VE.API ? Msn.VE.API.Globals.locale : window.locale,
    orthoTileSpec = new VETileSourceSpecification;
    orthoTileSpec.Subdomains = [
        [0, 2, 4, 6],
        [1, 3, 5, 7]
    ];
    if (orthoTileSpec.Subdomains != null) {
        orthoTileSpec.SubdomainsMaxX = orthoTileSpec.Subdomains.length;
        orthoTileSpec.SubdomainsMaxY = orthoTileSpec.Subdomains[0].length
    }
    orthoTileSpec.ID = mapTiles;
    orthoTileSpec.SourceName = Msn.VE.API ? Msn.VE.API.Constants.orthotileserver : "%0ecn.t%2.tiles.virtualearth.net/tiles/%3%4.%5?g=%6&mkt={21}";
    orthoTileSpec.SourceName = orthoTileSpec.SourceName.replace(/\{21\}/g, tileMarket);
    orthoTileSpec.OriginSourceName = Msn.VE.API && p_htParams.useOriginTiles ? Msn.VE.API.Constants.orthoorigintileserver.replace(/\{21\}/g, tileMarket) : "";
    orthoTileSpec.NumServers = 4;
    var shadedTileSpec = new VETileSourceSpecification;
    shadedTileSpec.Subdomains = [
        [0, 2, 4, 6],
        [1, 3, 5, 7]
    ];
    if (shadedTileSpec.Subdomains != null) {
        shadedTileSpec.SubdomainsMaxX = shadedTileSpec.Subdomains.length;
        shadedTileSpec.SubdomainsMaxY = shadedTileSpec.Subdomains[0].length
    }
    shadedTileSpec.ID = mapTiles;
    shadedTileSpec.SourceName = Msn.VE.API ? Msn.VE.API.Constants.shadedtileserver : "%0ecn.t%2.tiles.virtualearth.net/tiles/%3%4.%5?g=%6&mkt={21}&shading=hill";
    shadedTileSpec.SourceName = shadedTileSpec.SourceName.replace(/%1/g, "r").replace(/%3/g, "r").replace(/%5/g, "png").replace(/%6/g, generations["r"]).replace(/\{21\}/g, tileMarket);
    shadedTileSpec.OriginSourceName = Msn.VE.API && p_htParams.useOriginTiles ? Msn.VE.API.Constants.shadedorigintileserver.replace(/%1/g, "r").replace(/%3/g, "r").replace(/%5/g, "png").replace(/%6/g, generations["r"]).replace(/\{21\}/g, tileMarket) : "";
    shadedTileSpec.NumServers = 4;

    function SetBaseTileSource(a) {
        if (!a) a = currentView;
        var c = a && shadedTileSpec && shadedTileSpec.SourceName && (a.mapStyle == Msn.VE.MapStyle.Road && $MVEM.IsEnabled(MapControl.Features.MapStyle.Shaded) && currentView.doRoadShading) || a.mapStyle == Msn.VE.MapStyle.Shaded,
            b = c ? shadedTileSpec : orthoTileSpec;
        b.LoadTiles = loadBaseTiles;
        tileLayerManager.AddTileSource(b)
    }
    function SetView(a) {
        if (currentMode != null && currentMode == threeDMode) return SetView3DSpecialized(a);
        if (a == null) return CreateNewView();
        if (zooming || dragging) return true;
        if (panning) StopContinuousPan();
        var b = a.latlong;
        if (a.GetViewType() == Msn.VE.MapViewType.LatLongRect) b = a.latlongRect.Center();
        if (Msn.VE.MapStyle.IsViewOblique(a.mapStyle)) return SetViewOblique(a, b);
        else return SetViewOrtho(a, b)
    }
    function SetView3DSpecialized(a) {
        var b = false;
        if (a == null) {
            a = new Msn.VE.MapView;
            a.Copy(currentView);
            b = true
        }
        if (!view3DCreated) b = true;
        return SetView3D(a, b)
    }
    function SetViewOblique(a, c) {
        if (obliqueMode == null) return true;
        preferredView.Copy(a);
        currentMode = obliqueMode;
        if (Msn.VE.API) p_elSource.style.background = '#000 url("' + Msn.VE.API.Globals.vecurrentdomain + "/i/bin/" + Msn.VE.API.Globals.vecurrentversion + '/oblique/oblique_bg.gif") repeat';
        else p_elSource.style.background = '#000 url("./i/bin/' + window.buildVersion + '/oblique/oblique_bg.gif") repeat';

        function b() {
            var b = HandleSetViewObliqueResolve(a, c, preferredView);
            if (!b && typeof a.callback == "function") a.callback(obliqueMode.GetScene())
        }
        a.Resolve(currentMode, width, height, b)
    }
    function HandleSetViewObliqueResolve(a, c, i) {
        if (targetTool.centeringTrigger) {
            targetTool.centeringTrigger = false;
            obliqueMode.RequestSceneAtLatLong(c, a.sceneOrientation, true, null, null, null, null, a.mapStyle);
            return true
        }
        var b = obliqueMode.GetScene(),
            e = b && b.ContainsLatLong(c, a.zoomLevel);
        if (a.bySceneId) {
            if (!b || b.GetID() != a.sceneId) {
                obliqueMode.RequestScene(a.sceneId);
                return true
            } else if (!e) {
                var l = b.GetBounds();
                a.SetCenterLatLong(b.PixelToLatLong(new VEPixel(b.GetWidth() / 4, b.GetHeight() / 4), 1));
                a.Resolve(currentMode, width, height);
                e = true
            }
        } else if (!b || !e || b.GetOrientation() != a.sceneOrientation || b.GetMapStyle() != a.mapStyle) {
            obliqueMode.RequestSceneAtLatLong(c, a.sceneOrientation, true, null, a.callback, a.spinDirection, a.preserveScene, a.mapStyle);
            return true
        }
        c = a.latlong;
        i.Copy(a);
        SetBaseTileSource(a);
        currentMode.ValidateZoomLevel(a);
        currentBounds = currentMode.GetBounds(a);
        ClipView(a, currentBounds);
        if (a.Equals(currentView) && !resizeInProgress) return false;
        var g = a.GetX(currentView.zoomLevel) - currentView.center.x,
            h = a.GetY(currentView.zoomLevel) - currentView.center.y,
            d = Math.sqrt(g * g + h * h);
        previousCenter = currentView.latlong;
        var f = 0;
        if (!previousCenter.Equals(a.latlong)) f += Msn.VE.ViewChangeType.Pan;
        if (currentView.zoomLevel != a.zoomLevel) f += Msn.VE.ViewChangeType.Zoom;
        SetLastViewChangeType(f);
        var k = d < width && d < height && a.zoomLevel == currentView.zoomLevel && IsAnimationEnabled() && a.mapStyle == currentView.mapStyle && (a.sceneId == null || a.sceneId == currentView.sceneId);
        if (k) {
            PanToPixel(new VEPixel(a.center.x - originX - offsetX, a.center.y - originY - offsetY), true);
            return false
        }
        previousZoomLevel = currentView.zoomLevel;
        if (currentView.zoomLevel != a.zoomLevel) {
            Fire("onstartzoom", CreateEvent(null, null, null, a));
            zooming = true
        }
        var j = d < width && d < height && (a.zoomLevel == currentView.zoomLevel - 1 || a.zoomLevel == currentView.zoomLevel + 1) && IsAnimationEnabled() && a.mapStyle == currentView.mapStyle && (a.sceneId == null || a.sceneId == currentView.sceneId);
        if (j) {
            tileLayerManager.zoomView(a);
            return false
        }
        UpdateTiles(a);
        return false
    }
    function SetViewOrtho(a, f) {
        currentMode = orthoMode;
        p_elSource.style.backgroundImage = "none";
        if (a.mapStyle == Msn.VE.MapStyle.Road || a.mapStyle == Msn.VE.MapStyle.Shaded) p_elSource.style.backgroundColor = "#e9e7d4";
        else p_elSource.style.backgroundColor = "black";
        a.Resolve(currentMode, width, height);
        f = a.latlong;
        preferredView.Copy(a);
        SetBaseTileSource(a);
        currentMode.ValidateZoomLevel(a);
        currentBounds = currentMode.GetBounds(a);
        ClipView(a, currentBounds);
        a.Resolve(currentMode, width, height);
        if (a.Equals(currentView) && !resizeInProgress) return false;
        if (!currentView.center) currentView.center = a.center;
        var d = a.GetX(currentView.zoomLevel) - currentView.center.x,
            e = a.GetY(currentView.zoomLevel) - currentView.center.y,
            b = Math.sqrt(d * d + e * e);
        previousCenter = currentView.GetCenterLatLong();
        var c = 0;
        if (!previousCenter.Equals(a.GetCenterLatLong())) c += Msn.VE.ViewChangeType.Pan;
        if (currentView.zoomLevel != a.zoomLevel) c += Msn.VE.ViewChangeType.Zoom;
        SetLastViewChangeType(c);
        var h = b < width && b < height && a.zoomLevel == currentView.zoomLevel && IsAnimationEnabled() && a.mapStyle == currentView.mapStyle && (a.sceneId == null || a.sceneId == currentView.sceneId);
        if (h) {
            PanToLatLong(a.latlong.latitude, a.latlong.longitude, true);
            return true
        }
        previousZoomLevel = currentView.zoomLevel;
        if (currentView.zoomLevel != a.zoomLevel) {
            Fire("onstartzoom", CreateEvent(null, null, null, a));
            zooming = true
        }
        var g = b < width && b < height && (a.zoomLevel == currentView.zoomLevel - 1 || a.zoomLevel == currentView.zoomLevel + 1) && IsAnimationEnabled() && a.mapStyle == currentView.mapStyle && (a.sceneId == null || a.sceneId == currentView.sceneId);
        if (g) {
            tileLayerManager.zoomView(a);
            return true
        }
        UpdateTiles(a);
        return true
    }
    function CreateNewView() {
        var a = new Msn.VE.MapView;
        a.Copy(currentView);
        a.SetAltitude(-1000);
        a.SetTilt(-90);
        a.SetDirection(0);
        var b = a.latlong,
            c = ClipLatitude(b.latitude);
        if (b.latitude != c) {
            a.SetCenterLatLong(new Msn.VE.LatLong(c, b.longitude));
            a.Resolve(currentMode, width, height)
        }
        if (Msn.VE.MapStyle.IsViewOblique(a.mapStyle)) currentMode = obliqueMode;
        else currentMode = orthoMode;
        SetBaseTileSource(a);
        currentMode.ValidateZoomLevel(a);
        UpdateTiles(a);
        return true
    }
    function UpdateTiles(a) {
        currentView.Destroy();
        currentView = a;
        tileLayerManager.SetViewPort();
        tileLayerManager.LoadBaseLayer("Road", mapTiles, 1, 1);
        tileLayerManager.RefreshTileLayers();
        tileLayerManager.FinalizeView();
        RepositionPushpins()
    }
    function SetLastViewChangeType(a) {
        if (Msn.VE.ViewChangeType.IsValid(a)) lastViewChangeType = a
    }
    _VERegisterNamespaces("Msn.VE.Geometry");
    Msn.VE.Geometry.Point = function (c, d) {
        var a = this,
            b = Msn.VE.Geometry;
        this.x = c;
        this.y = d;
        this.add = function (c, d) {
            var e = new b.Point(a.x + c, a.y + d);
            return e
        };
        this.getDistanceFrom = function (b) {
            var c = Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2),
                d = Math.sqrt(c);
            return d
        }
    };
    Msn.VE.Geometry.Overlap = {
        Range: {
            GreaterThanX: 1,
            LessThanX: 2,
            GreaterThanY: 4,
            LessThanY: 8,
            InXRange: 16,
            InYRange: 32,
            InRange: 48
        },
        getInstance: function (f, g) {
            var d = Msn.VE.Geometry.Overlap,
                a = f,
                b = g,
                c = 0;
            e();

            function e() {
                if (b.getP2().x > a.getP2().x) c += d.Range.GreaterThanX;
                if (b.getP1().x < a.getP1().x) c += d.Range.LessThanX;
                if (b.getP2().y > a.getP2().y) c += d.Range.GreaterThanY;
                if (b.getP1().y < a.getP1().y) c += d.Range.LessThanY;
                if (a.getP1().x <= b.getP1().x && b.getP2().x <= a.getP2().x) c += d.Range.InXRange;
                if (a.getP1().y <= b.getP1().y && b.getP2().y <= a.getP2().y) c += d.Range.InYRange
            }
            this.getRange = function () {
                return c
            };
            this.getLeftXBleed = function () {
                if (c & d.Range.LessThanX) return Math.abs(a.getP1().x - b.getP1().x);
                else return 0
            };
            this.getRightXBleed = function () {
                if (c & d.Range.GreaterThanX) return b.getP2().x - a.getP2().x;
                else return 0
            };
            this.getTopYBleed = function () {
                if (c & d.Range.LessThanY) return Math.abs(a.getP1().y - b.getP1().y);
                else return 0
            };
            this.getBottomYBleed = function () {
                if (c & d.Range.GreaterThanY) return b.getP2().y - a.getP2().y;
                else return 0
            }
        }
    };
    Msn.VE.Geometry.Rectangle = function (h, i) {
        var g = this,
            a = h,
            b = i,
            d, e;
        f();

        function f() {
            c()
        }
        this.move = function (c) {
            a.x = c.x;
            a.y = c.y;
            b.x = c.x + e;
            b.y = c.y + d
        };
        this.getP1 = function () {
            return a
        };
        this.getP2 = function () {
            return b
        };
        this.setP1 = function (b) {
            a = b;
            c()
        };
        this.setP2 = function (a) {
            b = a;
            c()
        };
        this.getWidth = function () {
            return e
        };
        this.getHeight = function () {
            return d
        };
        this.containsPoint = function (c) {
            return c.x >= a.x && c.x <= b.x && c.y >= a.y && c.y <= b.y
        };
        this.scale = function (d) {
            a.x -= d;
            a.y -= d;
            b.x += d;
            b.y += d;
            c()
        };
        this.getOverlap = function (a) {
            var b = Msn.VE.Geometry;
            return new b.Overlap.getInstance(g, a)
        };

        function c() {
            d = b.y - a.y;
            e = b.x - a.x
        }
    };
    Msn.VE.Geometry.Functions = {
        getSlope: function (a, b) {
            return (b.y - a.y) / (b.x - a.x)
        },
        getYIntercept: function (b, a) {
            return a.y - b * a.x
        },
        getBestBoundingPoint: function (f, b, c) {
            var a = Msn.VE.Geometry;
            if (!b) b = g(f).getScreenPosition();
            var e = new a.Rectangle(b, new a.Point(b.x + f.offsetWidth, b.y + f.offsetHeight)),
                j = c.getOverlap(e),
                d = j.getRange();
            if ((d & a.Overlap.Range.InRange) == a.Overlap.Range.InRange) return b;
            var h = b.x,
                i = b.y;
            if (d & a.Overlap.Range.GreaterThanX) h = c.getP2().x - e.getWidth();
            if (d & a.Overlap.Range.LessThanX) h = c.getP1().x;
            if (d & a.Overlap.Range.GreaterThanY) i = c.getP2().y - e.getHeight();
            if (d & a.Overlap.Range.LessThanY) i = c.getP1().y;
            return new a.Point(h, i)
        }
    };
    view3DMode = false;
    var sentinel3D, setStyle;

    function View3DAddPushpin(a) {
        if (g(a.pin).hasClass("inactiveAbbreviationPin")) return;
        var d = parseInt(a.pinType),
            h = TranslatePushpinURL(a.className, a.innerHtml, d),
            c = Msn.VE.PushPinTypes,
            e = parseFloat(a.lat),
            f = parseFloat(a.lon),
            b = 'zindex="' + a.zIndex + '"';
        switch (d) {
        case c.DirectionStep:
        case c.SearchResultNonprecise:
            b += ' textoffset="50%, 50%"';
        case c.Direction:
        case c.SearchResultPrecise:
        case c.AdSponsor:
            b += ' text="' + extractText(a.innerHtml) + '"';
            break;
        case c.Collection:
            if (a.className.indexOf("point") == -1) b += ' textoffset="50%, 60%"';
            b += ' text="' + extractText(a.innerHtml) + '"';
            break;
        case c.Overlay:
            b += ' textoffset="50%, 50%"';
            b += ' text="' + extractText(a.innerHtml) + '"'
        }
        spacecontrol.AddPointWithProperties(0, a.id, e, f, h, b)
    }
    function extractText(b) {
        var a = document.createElement("div");
        a.innerHTML = b;
        var c = a.textContent || a.innerText;
        a = null;
        return c
    }
    function View3DRemovePushpin(a) {
        spacecontrol.DeleteGeometry(0, a)
    }
    function AddView3DParameter(d, c, b) {
        var a = document.createElement("param");
        a.name = c;
        a.value = b;
        d.appendChild(a)
    }
    function Get3DUpdatedUrl(a) {
        var b = Get3dInstallMarket();
        return "http://www.bing.com/maps/Help/VE3DInstall/" + "VersionUpdated.aspx?version=" + a + "&mkt=" + b
    }
    function GetScriptVersion() {
        var a = null;
        if (typeof Msn.VE.API != "undefined" && Msn.VE.API != null && Msn.VE.API.Globals.vecurrentversion) {
            var b = Msn.VE.API.Globals.vecurrentversion.split(".");
            a = "";
            if (b.length > 0) a += b[0];
            if (b.length > 1) a += "." + b[1]
        } else if (typeof window.spacelandScriptVersion != "undefined") a = window.spacelandScriptVersion;
        return a
    }
    function CreateView3DControl(a) {
        if (!BrowserSupports3D()) {
            View3DUnavailable();
            return false
        }
        initial3dView = new Msn.VE.MapView;
        initial3dView.Copy(a);
        if (sentinel3D == null) sentinel3D = GetSentinel();
        if (null == sentinel3D) {
            View3DUnavailable();
            return false
        }
        if (sentinel3D != null && sentinel3D.CurrentVersion < 4.0) {
            var d = sentinel3D.CurrentVersion;
            sentinel3D = null;
            if (d > 0) View3DUpgrade(d);
            return false
        }
        try {
            sentinel3D.InitializeRuntime()
        } catch(h) {}
        spacediv = document.createElement("div");
        spacediv.id = "MSVE_spacediv";
        spacediv.className = "MSVE_SLMap";
        spacediv.style.position = "relative";
        spacediv.style.height = "100%";
        spacediv.style.overflow = "hidden";
        spacecontrol = document.createElement("object");
        var b = a.cameraLatlong == null ? a.latlong : a.cameraLatlong;
        AddView3DParameter(spacecontrol, "StartLongitude", b.longitude);
        AddView3DParameter(spacecontrol, "StartLatitude", b.latitude);
        AddView3DParameter(spacecontrol, "StartPitch", a.GetTilt());
        AddView3DParameter(spacecontrol, "StartHeading", -a.GetDirection());
        var f = Get3dMarket();
        if (f) AddView3DParameter(spacecontrol, "CurrentLocale", f);
        var e = a.GetAltitude();
        if (e > -1000) AddView3DParameter(spacecontrol, "StartAltitude", e);
        else AddView3DParameter(spacecontrol, "StartZoomLevel", a.zoomLevel);
        spacediv.appendChild(spacecontrol);
        try {
            if (window.navigator.userAgent.indexOf("MSIE") != -1) spacecontrol.classid = "clsid:68BFC611-B963-4e8c-B0FE-0DD4FB832796";
            else spacecontrol.type = "application/x-virtual-earth-3d"
        } catch(h) {
            View3DUnavailable();
            spacecontrol = false;
            return false
        }
        var c = GetScriptVersion();
        spacecontrol.ControlId = init3dparam;
        spacecontrol.ScriptVersion = c;
        AttachEvent("onresize", ResizeControl);
        p_elSource.appendChild(spacediv);
        ResizeControl();
        setStyle = false;
        var g = ValidateControl();
        if (g) {
            IterativeCameraRefinement();
            spacecontrol.ControlId = init3dparam;
            spacecontrol.ScriptVersion = c;
            if ((typeof Msn.VE.API == "undefined" || Msn.VE.API == null) && spacecontrol.VersionUpdated) VE_Help.OpenSized(L_VE3D_VersionUpgradedDialogTitle, Get3DUpdatedUrl(sentinel3D.CurrentVersion), 550, 280)
        }
        if (typeof state != "undefined" && state != null) state.Set3DViewInstallInProgress("");
        return g
    }
    function View3DUnavailable() {
        if (IsEventAttached("onmodenotavailable")) Fire("onmodenotavailable", Msn.VE.MapActionMode.Mode3D);
        else if (typeof Msn.VE.API != "undefined" && Msn.VE.API != null) if (sentinel3D != null) window.open(Get3dHelpUrl("View3DUnavailable.htm"), "_blank", "width=600,height=550,menubar=0,resizeable=0,status=0,titlebar=0,toolbar=0,scrollbars=0");
        else if (window.navigator.userAgent.indexOf("MSIE") != -1) window.open(Get3dInstallUrl(), "_blank", "width=650,height=520,menubar=0,resizeable=0,status=0,titlebar=0,toolbar=0,scrollbars=0");
        else if (window.navigator.userAgent.indexOf("Windows") != -1) window.open(Get3dInstallUrl(), "_blank", "width=760,height=580,menubar=0,resizeable=0,status=0,titlebar=0,toolbar=0,scrollbars=0")
    }
    function CallIterativeCameraRefinement() {
        var a = GetMapControlInstance(null);
        if (a) a.IterativeCameraRefinement()
    }
    function IterativeCameraRefinement() {
        if (cameraUpdateCount > 0) return;
        if (IsModeEnabled(Msn.VE.MapActionMode.Mode3D) && spacecontrol) if (!spacecontrol.AllTilesLoaded) setTimeout(CallIterativeCameraRefinement, 1000);
        else {
            var a = false,
                c = currentView.GetAltitude(),
                d = initial3dView.GetAltitude();
            if (d > -1000 && c > -1000) a = Math.abs(c - d) > 1;
            else a = currentView.GetZoomLevel() != initial3dView.GetZoomLevel();
            if (a) {
                var b = initial3dView.MakeCopy();
                b.SetMapStyle(currentView.mapStyle);
                SetView3D(b, true)
            }
        }
    }
    function ValidateControl() {
        if (typeof Msn.VE.API == "undefined" || Msn.VE.API == null) if (0 == spacecontrol.HardwareClassificationLevel) setStyle = true;
        var a = false,
            b = 300;
        if (spacecontrol.Created) {
            while (!spacecontrol.FirstFrameRendered && !spacecontrol.LoadFailed && !spacecontrol.AlreadyLoaded && b > 0) {
                b--;
                spacecontrol.ProcessEvents()
            }
            a = spacecontrol.FirstFrameRendered
        }
        if (spacecontrol.Created && !spacecontrol.HardwareAccelerationEnabled && spacecontrol.LoadFailed) {
            if (typeof Msn.VE.API == "undefined" || Msn.VE.API == null) {
                window.setTimeout(DelayedHWDialog, 2759);
                window.setTimeout(OnHardwareAccelHelpFired, 4000)
            } else if (IsEventAttached("onmodenotavailable")) Fire("onmodenotavailable", Msn.VE.MapActionMode.Mode3D);
            if (mode == Msn.VE.MapActionMode.Mode3D) EnableMode(Msn.VE.MapActionMode.Mode2D);
            return false
        } else if (!spacecontrol.Created || !spacecontrol.Enabled || !spacecontrol.IsHandleCreated || !a && !spacecontrol.AlreadyLoaded) {
            View3DUnavailable();
            spacecontrol = false;
            return false
        } else {
            spacecontrol.focus();
            view3DCreated = true;
            return true
        }
    }
    function ResizeControl() {
        if (spacecontrol) {
            spacecontrol.style.height = spacediv.offsetHeight + "px";
            spacecontrol.style.width = spacediv.offsetWidth + "px"
        }
        RepositionShims()
    }
    function SetView3D(a, g) {
        currentMode.ValidateZoomLevel(a);
        a.Resolve(orthoMode, width, height);
        preferredView.Copy(a);
        if (!view3DCreated && !spacecontrol) {
            var l = CreateView3DControl(a);
            if (setStyle) {
                a.mapStyle = "h";
                previousMapStyle = "h"
            }
            if (!l) return false;
            if (a.GetTilt() != -90 && a.cameraLatlong == null) {
                a.Resolve(orthoMode, width, height);
                cameraUpdateCount = -1
            } else {
                cameraUpdateCount = 0;
                a._supressFlyToCall = true
            }
            p_elSource.style.backgroundColor = "#e9e7d4";
            originX = 0;
            originY = 0;
            offsetX = 0;
            offsetY = 0;
            UpdateFromParent()
        }
        if (!g && a.Equals(currentView)) {
            if (!spaceCameraIsFlying) ProcessQueuedRequest(null, null);
            return false
        }
        var c = false;
        if (a.GetAltitude() > -1000) c = Math.abs(a.GetAltitude() - currentView.GetAltitude()) > 1e-4;
        else c = currentView.zoomLevel != a.zoomLevel;
        currentView.Destroy();
        currentView = a;
        if (view3DCreated) {
            if (previousMapStyle) {
                if (currentView.mapStyle != null && previousMapStyle != currentView.mapStyle) {
                    var b = "http://go.microsoft.com/fwlink/?LinkID=98770";
                    if (currentView.mapStyle == "a") {
                        b = "http://go.microsoft.com/fwlink/?LinkID=98771";
                        spacecontrol.ShowAtmosphere = true
                    }
                    if (currentView.mapStyle == "h") {
                        b = "http://go.microsoft.com/fwlink/?LinkID=98772";
                        spacecontrol.ShowAtmosphere = true
                    }
                    if (currentView.mapStyle == "r") {
                        spacecontrol.TexturesVisible = false;
                        if (spacecontrol.HardwareClassificationLevel < 3) b = "http://go.microsoft.com/fwlink/?LinkID=98769";
                        spacecontrol.ShowAtmosphere = false
                    } else spacecontrol.TexturesVisible = true;
                    spacecontrol.AddImageSource("Terrain", "Texture", GetManifestUrl(b), 0, 1);
                    Fire("onchangemapstyle");
                    previousMapStyle = currentView.mapStyle
                }
            } else previousMapStyle = currentView.mapStyle;
            var d = a.cameraLatlong,
                i = a.zoomLevel,
                j = a.GetAltitude(),
                k = a.GetTilt(),
                h = a.GetDirection(),
                e = a._needsPivotOperation;
            if (c) Fire("onstartzoom");
            if (a._supressFlyToCall) a._supressFlyToCall = false;
            else {
                var f = spacecontrol.FlyTo(d.latitude, d.longitude, i, j, k, h, e ? 1 : 0);
                if (!f && !spaceCameraIsFlying) ProcessQueuedRequest(null, null)
            }
            if (a.sceneId && a.sceneId != -1) {
                ProcessPhotoPluginActionIn3D("PhotosEnabled", "enabled=1" + ";labels=" + (a.mapStyle == Msn.VE.MapStyle.Road || a.mapStyle == Msn.VE.MapStyle.Hybrid || a.mapStyle == Msn.VE.MapStyle.ObliqueHybrid ? "1" : "0"), spacecontrol);
                ProcessPhotoPluginActionIn3D("SelectSceneId", "SceneId=" + a.sceneId + ";X=" + a.photoX + ";Y=" + a.photoY + ";Scale=" + a.photoScale, spacecontrol, null)
            }
            if (c) Fire("onendzoom");
            if (copyright) copyright.Update();
            return true
        }
        return false
    }
    var on3DAnimationInterruptedCallback = null;

    function SetOn3DAnimationInterruptedCallback(a) {
        on3DAnimationInterruptedCallback = a
    }
    function GetOn3DAnimationInterruptedCallback() {
        return on3DAnimationInterruptedCallback
    }
    function SetViewport(b, d, c, e) {
        Sync3dView();
        var a = preferredView.MakeCopy();
        a.sceneId = null;
        a.SetLatLongRectangle(new Msn.VE.LatLongRectangle(new Msn.VE.LatLong(ClipLatitude(b), ClipLongitude(d)), new Msn.VE.LatLong(ClipLatitude(c), ClipLongitude(e))));
        a.SetTilt(-90);
        a.SetDirection(0);
        return SetView(a)
    }
    function SetBestMapView(b) {
        var a = GetBestMapViewBounds(b);
        if (!a || a.constructor != Array) return false;
        if (a.length == 4) return SetViewport(a[0], a[1], a[2], a[3])
    }
    function GetBestMapViewBounds(a) {
        var b = [];
        if (!a || a.constructor != Array) return null;
        var c = a[0].latitude,
            d = a[0].longitude,
            f = c,
            g = d;
        for (var e = 1; e < a.length; e++) {
            c = MathMin(c, a[e].latitude);
            d = MathMin(d, a[e].longitude);
            f = MathMax(f, a[e].latitude);
            g = MathMax(g, a[e].longitude)
        }
        var h = (f - c) * .1,
            i = (g - d) * .1;
        c -= h;
        d -= i;
        f += h;
        g += i;
        if (!b || b.constructor != Array) return null;
        else {
            b.push(ClipLatitude(c));
            b.push(ClipLongitude(d));
            b.push(ClipLatitude(f));
            b.push(ClipLongitude(g));
            return b
        }
    }
    function IncludePointInViewport(d, c) {
        var a = new Msn.VE.LatLong(d, c);
        if (Msn.VE.MapStyle.IsViewOblique(currentView.mapStyle)) {
            var b = obliqueMode.GetScene();
            if (!b || !b.ContainsLatLong(a)) SetMapStyle(lastOrthoMapStyle)
        }
        SetBestMapView([currentView.latlong, a])
    }
    function ClipLatitude(a) {
        return Clip(a, minLatitude, maxLatitude)
    }
    function ClipLongitude(a) {
        return Clip(a, minLongitude, maxLongitude)
    }
    function Clip(a, c, b) {
        if (a < c) return c;
        if (a > b) return b;
        return a
    }
    function SetZoom(b) {
        Sync3dView();
        var a = preferredView.MakeCopy();
        a.SetZoomLevel(b);
        SetView(a)
    }
    function ZoomIn() {
        Sync3dView();
        var a = preferredView.MakeCopy();
        a.SetZoomLevel(currentView.zoomLevel + 1);
        SetView(a)
    }
    function ZoomOut() {
        Sync3dView();
        var a = preferredView.MakeCopy();
        a.SetZoomLevel(currentView.zoomLevel - 1);
        SetView(a)
    }
    function SetCenterAndZoom(d, b, c) {
        Sync3dView();
        var a = preferredView.MakeCopy();
        a.sceneId = null;
        a.SetCenterLatLong(new Msn.VE.LatLong(d, b));
        a.SetZoomLevel(c);
        SetView(a)
    }
    function GetCurrentViewMaxZoomLevel(b) {
        var a = b;
        if (typeof a == "undefined" || a == null) a = preferredView;
        if (!currentMode) return tileLayerManager.GetMaxTileZoom();
        return currentMode.GetCurrentMaxZoomLevel(a)
    }
    function ObliqueMode() {
        var r = false,
            a = null,
            t = null,
            b = false,
            h = false,
            y = null,
            z = null,
            l = false,
            n = false,
            k = null,
            c = null,
            g = -1,
            e = null,
            p = true,
            m = null,
            s = null,
            f = ['02121131200', '02121131201', '02121131202', '02121131203', '02121131210', '02121131211', '02121131212', '02121131213', '02121131220', '02121131221', '02121131222', '02121131223', '02121131230', '02121131231', '02121131232', '02121131233', '02121131300', '02121131302', '02121222032', '02121222033', '02121222122', '02121222210', '02121222211', '02121222212', '02121222213', '02121222230', '02121222231', '02121222233', '02121222300', '02121222301', '02121222302', '02121222303', '02121222310', '02121222311', '02121222312', '02121222313', '02121222320', '02121222321', '02121222322', '02121222323', '02121222330', '02121222331', '02121222332', '02121222333', '02121223200', '02121223202', '02121223203', '02121223210', '02121223212', '02121223213', '02121223220', '02121223221', '02121223222', '02121223223', '02121223230', '02121223231', '02121223232', '02121311002', '02121311003', '02121311020', '02121311021', '02121312131', '02121312132', '02121312133', '02121312301', '02121312303', '02121312310', '02121312311', '02121312312', '02121312313', '02121312330', '02121312331', '02121312333', '02121313022', '02121313200', '02121313202', '02121313220', '02121313222', '02121330111', '02121333101', '02121333103', '02121333110', '02121333112', '02121333130', '02122313101', '02122313103', '02122313110', '02122313112', '02123000003', '02123000012', '02123000021', '02123000022', '02123000023', '02123000030', '02123000032', '02123000101', '02123000103', '02123000110', '02123000111', '02123000112', '02123000113', '02123000121', '02123000123', '02123000130', '02123000131', '02123000132', '02123000133', '02123000200', '02123000201', '02123000210', '02123000301', '02123000303', '02123000310', '02123000311', '02123000312', '02123000313', '02123000321', '02123000330', '02123000331', '02123000332', '02123000333', '02123001000', '02123001001', '02123001002', '02123001003', '02123001010', '02123001011', '02123001012', '02123001013', '02123001020', '02123001021', '02123001022', '02123001023', '02123001030', '02123001031', '02123001032', '02123001033', '02123001103', '02123001112', '02123001120', '02123001121', '02123001122', '02123001123', '02123001130', '02123001132', '02123001200', '02123001201', '02123001202', '02123001203', '02123001210', '02123001211', '02123001212', '02123001220', '02123001221', '02123001222', '02123001223', '02123001232', '02123001300', '02123001301', '02123001302', '02123002103', '02123002110', '02123002111', '02123002112', '02123002113', '02123002121', '02123002123', '02123002130', '02123002131', '02123002132', '02123002133', '02123002233', '02123002301', '02123002303', '02123002310', '02123002311', '02123002312', '02123002313', '02123002320', '02123002321', '02123002322', '02123002323', '02123002330', '02123002331', '02123002332', '02123002333', '02123003000', '02123003001', '02123003002', '02123003003', '02123003010', '02123003011', '02123003012', '02123003013', '02123003020', '02123003021', '02123003022', '02123003023', '02123003030', '02123003031', '02123003032', '02123003033', '02123003102', '02123003103', '02123003112', '02123003113', '02123003120', '02123003121', '02123003122', '02123003123', '02123003130', '02123003131', '02123003132', '02123003133', '02123003200', '02123003201', '02123003202', '02123003203', '02123003210', '02123003211', '02123003212', '02123003213', '02123003220', '02123003221', '02123003222', '02123003223', '02123003230', '02123003231', '02123003232', '02123003233', '02123003300', '02123003301', '02123003302', '02123003303', '02123003310', '02123003320', '02123003321', '02123003322', '02123003323', '02123003330', '02123003332', '02123020011', '02123020013', '02123020031', '02123020100', '02123020101', '02123020102', '02123020103', '02123020110', '02123020111', '02123020112', '02123020113', '02123020120', '02123021000', '02123021001', '02123021002', '02123021100', '02123021101', '02123022103', '02123022112', '02123022113', '02123022121', '02123022122', '02123022123', '02123022130', '02123022131', '02123022132', '02123022133', '02123022211', '02123022233', '02123022300', '02123022301', '02123022302', '02123022303', '02123022310', '02123022311', '02123022312', '02123022313', '02123022320', '02123022321', '02123022322', '02123022323', '02123022330', '02123022331', '02123023200', '02123023202', '02123023220', '02123030020', '02123030021', '02123030022', '02123030023', '02123030030', '02123030032', '02123030033', '02123030200', '02123030201', '02123030210', '02123030211', '02123030212', '02123030213', '02123030231', '02123030300', '02123030302', '02123030303', '02123030312', '02123030320', '02123030321', '02123030323', '02123030330', '02123030331', '02123030332', '02123030333', '02123031031', '02123031033', '02123031120', '02123031122', '02123031202', '02123031203', '02123031212', '02123031220', '02123031221', '02123031223', '02123031230', '02123031231', '02123031232', '02123031233', '02123031332', '02123031333', '02123033010', '02123033011', '02123033101', '02123033110', '02123033111', '02123100233', '02123100322', '02123102011', '02123102012', '02123102013', '02123102030', '02123102031', '02123102032', '02123102033', '02123102100', '02123102102', '02123102103', '02123102111', '02123102112', '02123102113', '02123102120', '02123102121', '02123102122', '02123102123', '02123102130', '02123102131', '02123102132', '02123102133', '02123102210', '02123102211', '02123102301', '02123102310', '02123102311', '02123102312', '02123102313', '02123102330', '02123102331', '02123102332', '02123102333', '02123103002', '02123103020', '02123103022', '02123103030', '02123103031', '02123103032', '02123103033', '02123103120', '02123103122', '02123103200', '02123103201', '02123103202', '02123103203', '02123103210', '02123103212', '02123103213', '02123103220', '02123103221', '02123103222', '02123103230', '02123103231', '02123120111', '02123200011', '02123200013', '02123200031', '02123200033', '02123200100', '02123200101', '02123200102', '02123200103', '02123200120', '02123200121', '02123200122', '02123200223', '02123200230', '02123200231', '02123200232', '02123200233', '02123200322', '02123200323', '02123201303', '02123201312', '02123201320', '02123201321', '02123201323', '02123201330', '02123201331', '02123201332', '02123202001', '02123202010', '02123202011', '02123202013', '02123202031', '02123202100', '02123202101', '02123202102', '02123202120', '02123202130', '02123202131', '02123203101', '02123203102', '02123203103', '02123203110', '02123203112', '02123203120', '02123203121', '02123203122', '02123203123', '02123220122', '02123220123', '02123220210', '02123220211', '02123220212', '02123220213', '02123220300', '02123220301', '02123220302', '02123220303', '02123220320', '02123220321', '02123220323', '02123220330', '02123220332', '02123223233', '02123223322', '02123302112', '02123302113', '02123302130', '02123302131', '02123302132', '02123302133', '02123302310', '02123302311', '02123302313', '02123303002', '02123303003', '02123303020', '02123303021', '02123303022', '02123303023', '02123303030', '02123303032', '02123303033', '02123303200', '02123303201', '02123303202', '02123303203', '02123303210', '02123303211', '02123303220', '02123303221', '02123323323', '02123323332', '02123330233', '02123332011', '02123332221', '02123332223', '02123332230', '02123332232', '02130221203', '02130221212', '02130221221', '02130221230', '02130231032', '02130231033', '02130231210', '02130231211', '02130300020', '02130300021', '02130300022', '02130300023', '02130300030', '02130300032', '02130300200', '02130300201', '02130300210', '02130313022', '02130313023', '02130313200', '02130313201', '02130320130', '02130320131', '02130320132', '02130320133', '02130321020', '02130321022', '02130321102', '02130321103', '02130321120', '02130321121', '02130321122', '02130321123', '02130332002', '02130332003', '02130332020', '02130332021', '02130332303', '02130332312', '02130332321', '02130332330', '02132032103', '02132032112', '02132032113', '02132032120', '02132032121', '02132032122', '02132032123', '02132032130', '02132032131', '02132032132', '02132222202', '02132222203', '02132222210', '02132222211', '02132222212', '02132222213', '02132222220', '02132222221', '02132222222', '02132222223', '02132222230', '02132222231', '02132222232', '02132222233', '02132222300', '02132222301', '02132222302', '02132222303', '02132222310', '02132222312', '02132222320', '02132222321', '02132222330', '02132310233', '02132310322', '02132310323', '02132310332', '02132312011', '02132312013', '02132312031', '02132312100', '02132312101', '02132312102', '02132312103', '02133030110', '02133030111', '02133030112', '02133030113', '02133031000', '02133031001', '02133031002', '02133031003', '02133031012', '02133031020', '02133031021', '02133031332', '02133031333', '02133033110', '02133033111', '02133033112', '02133033113', '02133033130', '02133033131', '02133033133', '02133033311', '02133033313', '02133103133', '02133103213', '02133103231', '02133103233', '02133103302', '02133103311', '02133103313', '02133103320', '02133103322', '02133112022', '02133112023', '02133112032', '02133112033', '02133112200', '02133112201', '02133112210', '02133112211', '02133120212', '02133120213', '02133120222', '02133120223', '02133120230', '02133120231', '02133120232', '02133120233', '02133120302', '02133120303', '02133120312', '02133120320', '02133120321', '02133120322', '02133120323', '02133120330', '02133120331', '02133120332', '02133120333', '02133121220', '02133121221', '02133121222', '02133121223', '02133121230', '02133121232', '02133122000', '02133122001', '02133122002', '02133122003', '02133122010', '02133122011', '02133122012', '02133122013', '02133122020', '02133122021', '02133122022', '02133122023', '02133122030', '02133122031', '02133122032', '02133122033', '02133122100', '02133122101', '02133122102', '02133122103', '02133122110', '02133122111', '02133122112', '02133122113', '02133122120', '02133122121', '02133122122', '02133122123', '02133122130', '02133122131', '02133122132', '02133122133', '02133122200', '02133122201', '02133122202', '02133122203', '02133122210', '02133122212', '02133122213', '02133122221', '02133122223', '02133122230', '02133122231', '02133122232', '02133122233', '02133122301', '02133122302', '02133122303', '02133122310', '02133122311', '02133122312', '02133122313', '02133122320', '02133122321', '02133122322', '02133122323', '02133122330', '02133122331', '02133122332', '02133122333', '02133123000', '02133123001', '02133123002', '02133123003', '02133123010', '02133123012', '02133123020', '02133123021', '02133123022', '02133123023', '02133123030', '02133123032', '02133123033', '02133123122', '02133123200', '02133123201', '02133123202', '02133123203', '02133123210', '02133123211', '02133123212', '02133123213', '02133123220', '02133123221', '02133123230', '02133123231', '02133123232', '02133123233', '02133123300', '02133123301', '02133123302', '02133123303', '02133123310', '02133123311', '02133123312', '02133123313', '02133123320', '02133123321', '02133123322', '02133123323', '02133123330', '02133123331', '02133123332', '02133123333', '02133130013', '02133130021', '02133130023', '02133130030', '02133130031', '02133130032', '02133130033', '02133130102', '02133130120', '02133130122', '02133132220', '02133132222', '02133211123', '02133211132', '02133211133', '02133211231', '02133211233', '02133211301', '02133211303', '02133211310', '02133211311', '02133211312', '02133211313', '02133211320', '02133211321', '02133211322', '02133211323', '02133211330', '02133211331', '02133211332', '02133211333', '02133212113', '02133212131', '02133212133', '02133212311', '02133213002', '02133213003', '02133213010', '02133213011', '02133213012', '02133213013', '02133213020', '02133213021', '02133213022', '02133213023', '02133213030', '02133213031', '02133213032', '02133213033', '02133213100', '02133213101', '02133213102', '02133213103', '02133213200', '02133213201', '02133213210', '02133213211', '02133231032', '02133231033', '02133231122', '02133231123', '02133231132', '02133231133', '02133231210', '02133231211', '02133231213', '02133231231', '02133231300', '02133231301', '02133231302', '02133231303', '02133231310', '02133231311', '02133231312', '02133231313', '02133231320', '02133231321', '02133231330', '02133231331', '02133233101', '02133233103', '02133233112', '02133233113', '02133233121', '02133233123', '02133233130', '02133233131', '02133233132', '02133233133', '02133233211', '02133233213', '02133233222', '02133233223', '02133233231', '02133233232', '02133233233', '02133233300', '02133233301', '02133233302', '02133233303', '02133233310', '02133233311', '02133233312', '02133233313', '02133233320', '02133233321', '02133233322', '02133233323', '02133233330', '02133233331', '02133233332', '02133300001', '02133300002', '02133300003', '02133300010', '02133300011', '02133300012', '02133300013', '02133300020', '02133300021', '02133300022', '02133300023', '02133300030', '02133300031', '02133300032', '02133300033', '02133300100', '02133300101', '02133300102', '02133300103', '02133300110', '02133300111', '02133300112', '02133300113', '02133300120', '02133300121', '02133300122', '02133300123', '02133300130', '02133300132', '02133300200', '02133300202', '02133300210', '02133300211', '02133300220', '02133300221', '02133300222', '02133300223', '02133300230', '02133300231', '02133300232', '02133300233', '02133300300', '02133300301', '02133300302', '02133300303', '02133300322', '02133301000', '02133301001', '02133301002', '02133301003', '02133301010', '02133301011', '02133301012', '02133301013', '02133301020', '02133301021', '02133301022', '02133301023', '02133301030', '02133301031', '02133301032', '02133301033', '02133301100', '02133301101', '02133301102', '02133301103', '02133301110', '02133301111', '02133301112', '02133301113', '02133301120', '02133301121', '02133301122', '02133301123', '02133301130', '02133301131', '02133301132', '02133301133', '02133301201', '02133301210', '02133301211', '02133301213', '02133301231', '02133301233', '02133301300', '02133301301', '02133301302', '02133301303', '02133301310', '02133301311', '02133301312', '02133301313', '02133301320', '02133301321', '02133301322', '02133301323', '02133301330', '02133301331', '02133301332', '02133301333', '02133302000', '02133302001', '02133302002', '02133302003', '02133302010', '02133302011', '02133302012', '02133302013', '02133302020', '02133302021', '02133302030', '02133302031', '02133302100', '02133302102', '02133302120', '02133303100', '02133303101', '02133303102', '02133303103', '02133303110', '02133303111', '02133303112', '02133303113', '02133303120', '02133303121', '02133303130', '02133303131', '02133310000', '02133310002', '02133310020', '02133310022', '02133310112', '02133310113', '02133310130', '02133310131', '02133310132', '02133310133', '02133310200', '02133310220', '02133310221', '02133310222', '02133310223', '02133310230', '02133310231', '02133310232', '02133310233', '02133310310', '02133310311', '02133310320', '02133310321', '02133310322', '02133310323', '02133310330', '02133310332', '02133310333', '02133311002', '02133311003', '02133311012', '02133311020', '02133311021', '02133311022', '02133311023', '02133311030', '02133311032', '02133311101', '02133311103', '02133311110', '02133311112', '02133311113', '02133311130', '02133311132', '02133311133', '02133311200', '02133311201', '02133311210', '02133311222', '02133311223', '02133311232', '02133312000', '02133312001', '02133312002', '02133312003', '02133312010', '02133312011', '02133312012', '02133312013', '02133312020', '02133312021', '02133312030', '02133312031', '02133312100', '02133312101', '02133312102', '02133312103', '02133312110', '02133312111', '02133312112', '02133312113', '02133312120', '02133312121', '02133312123', '02133312130', '02133312131', '02133312132', '02133312133', '02133312301', '02133312310', '02133312311', '02133313000', '02133313001', '02133313002', '02133313003', '02133313010', '02133313012', '02133313020', '02133313021', '02133313022', '02133313023', '02133313030', '02133313032', '02133313200', '02133313201', '02133320011', '02133320013', '02133320023', '02133320031', '02133320032', '02133320033', '02133320100', '02133320101', '02133320102', '02133320103', '02133320110', '02133320112', '02133320120', '02133320121', '02133320122', '02133320123', '02133320130', '02133320132', '02133320201', '02133320203', '02133320210', '02133320211', '02133320212', '02133320213', '02133320221', '02133320223', '02133320230', '02133320231', '02133320232', '02133320233', '02133320300', '02133320301', '02133320302', '02133320310', '02133320320', '02133320322', '02133321132', '02133321133', '02133321220', '02133321221', '02133321222', '02133321223', '02133321230', '02133321231', '02133321232', '02133321233', '02133321310', '02133321311', '02133321312', '02133321313', '02133321320', '02133321321', '02133321322', '02133321323', '02133321330', '02133321331', '02133322000', '02133322001', '02133322002', '02133322003', '02133322010', '02133322012', '02133322013', '02133322020', '02133322021', '02133322022', '02133322023', '02133322030', '02133322031', '02133322032', '02133322033', '02133322200', '02133322201', '02133322202', '02133322203', '02133322210', '02133322211', '02133322212', '02133322220', '02133322221', '02133322223', '02133322230', '02133322232', '02133323000', '02133323001', '02133323002', '02133323003', '02133323010', '02133323011', '02133323012', '02133323013', '02133323021', '02133323030', '02133323031', '02133323032', '02133323033', '02133323100', '02133323101', '02133323102', '02133323103', '02133323120', '02133323121', '02133323122', '02133323123', '02133323210', '02133323211', '02133323300', '02133323301', '02133330022', '02133330023', '02133330032', '02133330033', '02133330122', '02133330200', '02133330201', '02133330202', '02133330203', '02133330210', '02133330211', '02133330212', '02133330213', '02133330220', '02133330221', '02133330230', '02133330231', '02133330300', '02133330302', '02133330320', '02133330323', '02133330332', '02133330333', '02133332012', '02133332013', '02133332030', '02133332031', '02133332032', '02133332033', '02133332101', '02133332102', '02133332103', '02133332110', '02133332111', '02133332112', '02133332113', '02133332120', '02133332121', '02133332122', '02133332123', '02133332130', '02133332131', '02133332132', '02133332133', '02133332210', '02133332211', '02133332300', '02133332301', '02133332310', '02133332311', '02133333000', '02133333002', '02133333012', '02133333013', '02133333020', '02133333022', '02133333030', '02133333031', '02133333032', '02133333033', '02133333102', '02133333103', '02133333112', '02133333120', '02133333121', '02133333122', '02133333123', '02133333130', '02133333131', '02133333132', '02133333133', '02133333200', '02133333201', '02133333203', '02133333210', '02133333211', '02133333212', '02133333213', '02133333300', '02133333301', '02133333302', '02133333303', '02133333310', '02133333311', '02221111013', '02221111031', '02221111033', '02221111102', '02221111103', '02221111120', '02221111121', '02221111122', '02221111123', '02221111130', '02221111132', '02221111133', '02221111301', '02221111310', '02221111311', '02301000113', '02301000131', '02301000133', '02301000311', '02301001002', '02301001011', '02301001013', '02301001020', '02301001022', '02301001100', '02301001200', '02301002223', '02301002232', '02301002233', '02301002322', '02301002323', '02301003010', '02301003011', '02301003012', '02301003013', '02301003031', '02301003033', '02301003100', '02301003102', '02301003120', '02301003121', '02301003122', '02301003123', '02301003211', '02301003323', '02301003332', '02301003333', '02301012103', '02301012112', '02301012113', '02301012121', '02301012123', '02301012130', '02301012131', '02301012132', '02301012133', '02301012310', '02301012311', '02301012312', '02301012313', '02301012330', '02301012331', '02301020001', '02301020003', '02301020010', '02301020011', '02301020012', '02301020013', '02301020030', '02301020031', '02301020033', '02301020100', '02301020101', '02301020102', '02301020103', '02301020110', '02301020112', '02301020113', '02301020120', '02301020121', '02301020122', '02301020123', '02301020130', '02301020131', '02301020132', '02301020133', '02301020211', '02301020300', '02301020301', '02301020302', '02301020303', '02301020310', '02301020311', '02301020312', '02301020313', '02301020321', '02301020330', '02301020331', '02301020332', '02301020333', '02301021001', '02301021003', '02301021010', '02301021011', '02301021012', '02301021013', '02301021020', '02301021021', '02301021022', '02301021023', '02301021030', '02301021031', '02301021032', '02301021033', '02301021100', '02301021101', '02301021102', '02301021103', '02301021110', '02301021111', '02301021112', '02301021113', '02301021120', '02301021121', '02301021122', '02301021123', '02301021130', '02301021131', '02301021132', '02301021133', '02301021200', '02301021201', '02301021202', '02301021203', '02301021210', '02301021211', '02301021212', '02301021213', '02301021220', '02301021221', '02301021222', '02301021223', '02301021230', '02301021231', '02301021232', '02301021233', '02301021300', '02301021301', '02301021302', '02301021303', '02301021310', '02301021311', '02301021312', '02301021313', '02301021320', '02301021321', '02301021322', '02301021323', '02301021330', '02301021331', '02301021332', '02301021333', '02301022110', '02301022111', '02301022112', '02301022113', '02301022131', '02301023000', '02301023001', '02301023002', '02301023003', '02301023010', '02301023011', '02301023012', '02301023013', '02301023020', '02301023021', '02301023022', '02301023023', '02301023030', '02301023031', '02301023032', '02301023033', '02301023100', '02301023101', '02301023102', '02301023103', '02301023110', '02301023111', '02301023112', '02301023113', '02301023120', '02301023122', '02301023130', '02301023131', '02301023133', '02301023200', '02301023201', '02301023202', '02301023203', '02301023210', '02301023211', '02301023212', '02301023213', '02301023223', '02301023230', '02301023231', '02301023232', '02301023233', '02301023300', '02301023302', '02301023320', '02301023322', '02301030222', '02301030223', '02301031102', '02301031103', '02301031120', '02301031121', '02301031131', '02301031133', '02301032000', '02301032001', '02301032002', '02301032003', '02301032030', '02301032031', '02301032032', '02301032033', '02301032131', '02301032133', '02301032211', '02301032212', '02301032230', '02301032231', '02301032232', '02301032233', '02301032300', '02301032301', '02301032302', '02301032303', '02301032312', '02301032313', '02301032320', '02301032321', '02301032322', '02301032323', '02301032330', '02301032331', '02301032332', '02301032333', '02301033220', '02301033222', '02301033223', '02301101013', '02301101031', '02301101100', '02301101101', '02301101102', '02301101103', '02301101110', '02301101112', '02301101113', '02301101120', '02301101121', '02301101130', '02301101131', '02301110112', '02301110113', '02301110130', '02301110131', '02301120020', '02301120022', '02301132111', '02301132113', '02301132131', '02301132133', '02301132311', '02301132313', '02301133000', '02301133001', '02301133002', '02301133003', '02301133010', '02301133012', '02301133013', '02301133020', '02301133021', '02301133022', '02301133023', '02301133030', '02301133031', '02301133032', '02301133033', '02301133102', '02301133103', '02301133120', '02301133121', '02301133122', '02301133123', '02301133200', '02301133201', '02301133202', '02301133203', '02301133210', '02301133211', '02301133212', '02301133213', '02301133300', '02301133301', '02301133302', '02301133303', '02301201001', '02301201010', '02301201011', '02301201013', '02301201100', '02301201101', '02301201103', '02301201110', '02301201112', '02301201121', '02301201130', '02301201131', '02301201132', '02301201133', '02301210011', '02301210030', '02301210031', '02301210032', '02301210033', '02301210100', '02301210101', '02301210103', '02301210110', '02301210111', '02301210112', '02301210113', '02301210120', '02301210121', '02301210122', '02301210123', '02301211000', '02301211001', '02301211002', '02301211003', '02301211010', '02301211012', '02301211020', '02301211021', '02301211022', '02301211023', '02301211030', '02301211032', '02301211033', '02301211201', '02301211202', '02301211203', '02301211210', '02301211211', '02301211212', '02301211220', '02301211221', '02301211222', '02301211223', '02301211230', '02301211232', '02301211233', '02301212003', '02301212012', '02301212021', '02301212023', '02301212030', '02301212032', '02301212033', '02301212210', '02301212211', '02301212213', '02301212302', '02301212303', '02301212320', '02301212321', '02301212323', '02301212330', '02301212331', '02301212332', '02301212333', '02301213000', '02301213001', '02301213002', '02301213010', '02301213011', '02301213012', '02301213013', '02301213020', '02301213021', '02301213022', '02301213031', '02301213100', '02301213102', '02301213120', '02301213211', '02301213213', '02301213220', '02301213221', '02301213222', '02301213223', '02301213230', '02301213231', '02301213232', '02301213233', '02301213300', '02301213301', '02301213302', '02301213303', '02301213310', '02301213311', '02301213312', '02301213313', '02301213320', '02301213321', '02301213322', '02301213323', '02301213330', '02301213331', '02301213332', '02301213333', '02301231000', '02301231001', '02301231003', '02301231010', '02301231011', '02301231012', '02301231013', '02301231030', '02301231031', '02301231100', '02301231101', '02301231102', '02301231103', '02301231110', '02301231111', '02301231112', '02301231113', '02301231120', '02301231121', '02301231123', '02301231130', '02301231131', '02301231132', '02301231133', '02301231303', '02301231310', '02301231311', '02301231312', '02301231321', '02301231323', '02301231330', '02301231331', '02301231332', '02301231333', '02301300230', '02301300231', '02301300232', '02301300233', '02301300302', '02301300320', '02301301113', '02301301131', '02301301133', '02301301311', '02301301332', '02301301333', '02301302123', '02301302132', '02301302133', '02301302200', '02301302201', '02301302202', '02301302203', '02301302210', '02301302211', '02301302212', '02301302213', '02301302220', '02301302221', '02301302222', '02301302223', '02301302230', '02301302231', '02301302232', '02301302233', '02301302300', '02301302301', '02301302302', '02301302303', '02301302310', '02301302311', '02301302312', '02301302313', '02301302320', '02301302321', '02301302322', '02301302323', '02301302330', '02301302331', '02301302332', '02301302333', '02301303021', '02301303022', '02301303110', '02301303111', '02301303200', '02301303201', '02301310002', '02301310020', '02301310021', '02301310022', '02301310023', '02301310030', '02301310032', '02301310033', '02301310200', '02301310201', '02301310210', '02301310211', '02301310212', '02301310213', '02301312013', '02301312031', '02301312033', '02301312102', '02301312103', '02301312112', '02301312113', '02301312120', '02301312122', '02301312130', '02301312131', '02301312211', '02301312300', '02301312302', '02301312320', '02301312321', '02301312323', '02301312330', '02301312332', '02301320000', '02301320001', '02301320002', '02301320003', '02301320010', '02301320011', '02301320012', '02301320013', '02301320020', '02301320021', '02301320022', '02301320023', '02301320030', '02301320031', '02301320032', '02301320033', '02301320100', '02301320101', '02301320102', '02301320103', '02301320110', '02301320111', '02301320112', '02301320113', '02301320120', '02301320121', '02301320122', '02301320123', '02301320130', '02301320131', '02301320132', '02301320133', '02301320200', '02301320201', '02301320203', '02301320210', '02301320211', '02301320212', '02301320213', '02301320230', '02301320231', '02301320300', '02301320301', '02301320302', '02301320303', '02301320310', '02301320311', '02301320312', '02301320320', '02301320321', '02301320322', '02301320323', '02301320330', '02301320332', '02301321001', '02301321002', '02301321003', '02301321010', '02301321011', '02301321012', '02301321013', '02301321020', '02301321021', '02301321022', '02301321023', '02301321030', '02301321032', '02301321033', '02301321100', '02301321101', '02301321102', '02301321103', '02301321201', '02301321210', '02301321211', '02301321212', '02301321213', '02301321332', '02301321333', '02301322100', '02301322101', '02301322102', '02301322103', '02301322110', '02301322111', '02301322112', '02301322113', '02301322120', '02301322121', '02301322122', '02301322123', '02301322130', '02301322131', '02301322132', '02301322133', '02301322301', '02301322310', '02301323000', '02301323002', '02301323020', '02301323103', '02301323110', '02301323111', '02301323112', '02301323113', '02301323121', '02301323130', '02301323131', '02301323132', '02301323133', '02301330011', '02301330100', '02301330101', '02301330102', '02301330103', '02301330110', '02301331312', '02301331313', '02301331330', '02301331331', '02301332031', '02301332033', '02301332120', '02301332121', '02301332122', '02301332123', '02301332210', '02301332211', '02301333301', '02301333303', '02301333310', '02301333312', '02310000003', '02310000010', '02310000011', '02310000012', '02310000013', '02310000021', '02310000023', '02310000030', '02310000031', '02310000032', '02310000033', '02310000100', '02310000102', '02310000103', '02310000120', '02310000121', '02310000122', '02310000123', '02310000201', '02310000203', '02310000210', '02310000211', '02310000212', '02310000213', '02310000230', '02310000231', '02310000232', '02310000233', '02310000300', '02310000301', '02310000302', '02310000303', '02310000310', '02310000312', '02310000320', '02310000321', '02310000322', '02310000323', '02310000330', '02310000332', '02310002001', '02310002010', '02310002011', '02310002100', '02310002101', '02310002110', '02310012303', '02310012312', '02310012313', '02310012321', '02310012330', '02310012331', '02310022303', '02310022312', '02310022321', '02310022330', '02310032321', '02310032330', '02310032331', '02310032332', '02310032333', '02310033202', '02310033203', '02310033212', '02310033220', '02310033221', '02310033222', '02310033223', '02310033230', '02310033231', '02310033232', '02310033233', '02310101012', '02310101021', '02310101023', '02310101030', '02310101032', '02310101033', '02310101122', '02310101201', '02310101202', '02310101203', '02310101210', '02310101211', '02310101212', '02310101220', '02310101221', '02310101222', '02310101223', '02310101230', '02310101231', '02310101232', '02310101233', '02310101300', '02310101301', '02310101322', '02310101323', '02310101332', '02310101333', '02310103000', '02310103001', '02310103002', '02310103003', '02310103010', '02310103011', '02310103012', '02310103013', '02310103020', '02310103021', '02310103022', '02310103023', '02310103030', '02310103031', '02310103032', '02310103033', '02310103100', '02310103101', '02310103102', '02310103103', '02310103110', '02310103111', '02310103112', '02310103113', '02310103120', '02310103121', '02310103122', '02310103130', '02310103131', '02310103203', '02310103210', '02310103211', '02310103212', '02310103213', '02310103231', '02310103233', '02310103300', '02310103302', '02310103320', '02310103322', '02310110222', '02310110223', '02310110232', '02310112000', '02310112001', '02310112002', '02310112003', '02310112010', '02310112012', '02310112020', '02310112021', '02310112030', '02310121011', '02310121033', '02310121100', '02310121102', '02310121122', '02310121123', '02310121211', '02310121300', '02310121301', '02310200132', '02310200133', '02310202033', '02310202102', '02310202103', '02310202120', '02310202121', '02310202122', '02310202211', '02310202300', '02310210231', '02310210233', '02310210320', '02310210321', '02310210322', '02310210323', '02310210332', '02310210333', '02310211202', '02310211203', '02310211212', '02310211213', '02310211220', '02310211221', '02310211222', '02310211223', '02310211230', '02310211231', '02310211232', '02310211233', '02310211302', '02310211303', '02310211320', '02310211321', '02310211322', '02310212011', '02310212013', '02310212100', '02310212101', '02310212103', '02310212110', '02310212111', '02310212112', '02310212113', '02310212130', '02310212131', '02310212132', '02310213000', '02310213001', '02310213002', '02310213003', '02310213010', '02310213011', '02310213012', '02310213100', '02310213112', '02310213113', '02310213130', '02310213131', '02310213132', '02310213133', '02310213310', '02310213311', '02310220021', '02310220023', '02310220030', '02310220031', '02310220032', '02310220033', '02310220122', '02310220200', '02310220201', '02310220202', '02310220203', '02310220210', '02310220211', '02310220212', '02310220213', '02310220220', '02310220221', '02310220223', '02310220230', '02310220231', '02310220232', '02310220233', '02310220300', '02310220302', '02310220303', '02310220320', '02310220321', '02310220322', '02310220323', '02310220330', '02310222310', '02310222311', '02310222312', '02310222313', '02310222331', '02310222333', '02310223200', '02310223201', '02310223202', '02310223203', '02310223212', '02310223220', '02310223221', '02310223222', '02310223223', '02310223230', '02310223232', '02310300110', '02310300111', '02310300112', '02310300113', '02310300122', '02310300123', '02310300130', '02310300131', '02310300300', '02310300301', '02310300302', '02310300303', '02310300320', '02310300321', '02310300322', '02310300323', '02310302002', '02310302003', '02310302012', '02310302013', '02310302020', '02310302021', '02310302022', '02310302023', '02310302030', '02310302031', '02310302032', '02310302033', '02310302101', '02310302120', '02310302121', '02310302122', '02310302123', '02310302200', '02310302201', '02310302210', '02310302211', '02310302212', '02310302213', '02310302230', '02310302231', '02310302232', '02310302233', '02310302300', '02310302301', '02310302302', '02310302320', '02310311230', '02310311231', '02310311232', '02310311233', '02310311320', '02310311321', '02310311322', '02310311323', '02310311330', '02310311332', '02310313010', '02310313011', '02310313012', '02310313013', '02310313030', '02310313031', '02310313032', '02310313033', '02310313100', '02310313101', '02310313102', '02310313103', '02310313110', '02310313112', '02310313120', '02310313121', '02310313122', '02310313123', '02310313130', '02310313132', '02310313210', '02310313211', '02310313212', '02310313213', '02310313300', '02310313301', '02310313302', '02310313303', '02310313310', '02310313312', '02310322223', '02310322232', '02310322233', '02310322322', '02310322323', '02310322332', '02310322333', '02310323222', '02310323223', '02310323232', '02310323233', '02310331033', '02310331211', '02310331213', '02310331231', '02310331300', '02310331301', '02310331302', '02310331303', '02310331320', '02310331321', '02310333223', '02310333232', '02310333233', '02311011000', '02311011001', '02311011002', '02311011003', '02311011010', '02311011011', '02311011012', '02311011013', '02311011020', '02311011021', '02311011022', '02311011023', '02311011030', '02311011031', '02311011032', '02311011033', '02311011100', '02311011101', '02311013303', '02311013312', '02311013313', '02311013321', '02311013323', '02311013330', '02311013331', '02311013332', '02311013333', '02311030103', '02311030112', '02311030113', '02311030121', '02311030123', '02311030130', '02311030131', '02311030132', '02311030133', '02311030231', '02311030233', '02311030310', '02311030311', '02311030313', '02311030320', '02311030321', '02311030322', '02311030323', '02311030330', '02311030331', '02311030332', '02311030333', '02311031002', '02311031003', '02311031020', '02311031021', '02311031022', '02311031023', '02311031200', '02311031201', '02311031202', '02311031203', '02311032011', '02311032013', '02311032031', '02311032100', '02311032101', '02311032102', '02311032103', '02311032110', '02311032111', '02311032112', '02311032113', '02311032120', '02311032121', '02311032130', '02311032131', '02311033301', '02311033303', '02311033310', '02311033311', '02311033312', '02311033313', '02311033321', '02311033323', '02311033330', '02311033331', '02311033332', '02311033333', '02311100231', '02311100233', '02311100320', '02311100321', '02311100322', '02311100323', '02311102011', '02311102013', '02311102030', '02311102031', '02311102032', '02311102033', '02311102100', '02311102101', '02311102102', '02311102103', '02311102120', '02311102121', '02311102122', '02311102123', '02311102130', '02311102131', '02311102132', '02311102133', '02311102202', '02311102210', '02311102211', '02311102212', '02311102213', '02311102220', '02311102221', '02311102222', '02311102223', '02311102230', '02311102231', '02311102232', '02311102233', '02311102300', '02311102301', '02311102302', '02311102303', '02311102310', '02311102311', '02311102312', '02311102313', '02311102320', '02311102321', '02311102322', '02311102323', '02311102330', '02311102331', '02311102332', '02311102333', '02311103020', '02311103022', '02311103200', '02311103202', '02311103220', '02311103222', '02311103233', '02311103320', '02311103321', '02311103322', '02311103323', '02311103330', '02311103332', '02311111113', '02311111303', '02311111312', '02311111313', '02311111320', '02311111321', '02311111322', '02311111323', '02311111330', '02311111331', '02311111332', '02311111333', '02311112002', '02311112003', '02311112012', '02311112020', '02311112021', '02311112022', '02311112023', '02311112030', '02311112031', '02311112032', '02311112033', '02311112122', '02311112123', '02311112132', '02311112133', '02311112200', '02311112201', '02311112203', '02311112210', '02311112211', '02311112212', '02311112213', '02311112221', '02311112223', '02311112230', '02311112231', '02311112232', '02311112233', '02311112300', '02311112301', '02311112302', '02311112303', '02311112310', '02311112311', '02311112312', '02311112313', '02311112320', '02311112321', '02311112330', '02311112331', '02311113011', '02311113013', '02311113100', '02311113101', '02311113102', '02311113103', '02311113110', '02311113111', '02311113112', '02311113113', '02311113120', '02311113121', '02311113122', '02311113123', '02311113130', '02311113131', '02311113132', '02311113133', '02311113200', '02311113202', '02311113220', '02311113232', '02311113233', '02311113322', '02311113323', '02311113330', '02311113331', '02311113332', '02311113333', '02311120010', '02311120011', '02311120100', '02311120101', '02311120103', '02311120110', '02311120111', '02311120112', '02311120113', '02311120121', '02311120130', '02311120131', '02311121000', '02311121002', '02311121011', '02311121013', '02311121020', '02311121031', '02311121100', '02311121101', '02311121102', '02311121103', '02311121110', '02311121112', '02311121120', '02311121121', '02311121130', '02311122123', '02311122131', '02311122132', '02311122133', '02311122301', '02311122310', '02311122311', '02311123013', '02311123031', '02311123033', '02311123102', '02311123103', '02311123112', '02311123120', '02311123121', '02311123122', '02311123123', '02311123130', '02311123132', '02311123200', '02311123211', '02311123300', '02311123301', '02311123310', '02311130010', '02311130011', '02311130020', '02311130021', '02311130022', '02311130023', '02311130030', '02311130032', '02311130033', '02311130200', '02311130201', '02311130202', '02311130203', '02311130210', '02311130211', '02311130212', '02311130213', '02311130221', '02311130230', '02311130231', '02311131002', '02311131003', '02311131010', '02311131011', '02311131012', '02311131013', '02311131021', '02311131023', '02311131030', '02311131031', '02311131032', '02311131033', '02311131100', '02311131101', '02311131102', '02311131103', '02311131110', '02311131111', '02311131112', '02311131113', '02311131120', '02311131121', '02311131122', '02311131123', '02311131130', '02311131131', '02311131132', '02311131133', '02311131201', '02311131211', '02311131213', '02311131300', '02311131301', '02311131302', '02311131303', '02311131310', '02311131311', '02311131312', '02311131320', '02311131321', '02311133213', '02311133231', '02311133302', '02311133303', '02311133312', '02311133320', '02311133321', '02311133322', '02311133323', '02311133330', '02311133331', '02311133332', '02311133333', '02311203123', '02311203132', '02311203133', '02311203301', '02311203303', '02311203310', '02311203311', '02311203312', '02311203313', '02311203321', '02311203330', '02311203331', '02311203332', '02311203333', '02311210121', '02311210123', '02311210130', '02311210131', '02311210132', '02311210133', '02311210231', '02311210232', '02311210233', '02311210301', '02311210302', '02311210303', '02311210310', '02311210311', '02311210312', '02311210313', '02311210320', '02311210321', '02311210322', '02311210323', '02311210330', '02311210331', '02311210332', '02311210333', '02311211020', '02311211021', '02311211022', '02311211023', '02311211030', '02311211031', '02311211032', '02311211033', '02311211101', '02311211103', '02311211110', '02311211111', '02311211112', '02311211113', '02311211120', '02311211121', '02311211122', '02311211123', '02311211130', '02311211131', '02311211132', '02311211133', '02311211200', '02311211201', '02311211202', '02311211203', '02311211210', '02311211212', '02311211300', '02311211301', '02311211303', '02311211310', '02311211311', '02311211312', '02311211313', '02311212001', '02311212003', '02311212010', '02311212011', '02311212012', '02311212013', '02311212021', '02311212022', '02311212023', '02311212030', '02311212031', '02311212032', '02311212033', '02311212100', '02311212101', '02311212102', '02311212103', '02311212110', '02311212111', '02311212112', '02311212113', '02311212120', '02311212121', '02311212122', '02311212123', '02311212130', '02311212131', '02311212132', '02311212133', '02311212200', '02311212201', '02311212202', '02311212203', '02311212210', '02311212211', '02311212212', '02311212213', '02311212220', '02311212221', '02311212222', '02311212223', '02311212230', '02311212231', '02311212232', '02311212233', '02311212300', '02311212301', '02311212302', '02311212303', '02311212310', '02311212311', '02311212312', '02311212313', '02311212320', '02311212321', '02311212322', '02311212323', '02311212330', '02311212331', '02311212332', '02311212333', '02311213020', '02311213022', '02311213023', '02311213032', '02311213033', '02311213200', '02311213201', '02311213202', '02311213203', '02311213210', '02311213211', '02311213212', '02311213213', '02311213220', '02311213221', '02311213222', '02311213223', '02311213230', '02311213231', '02311213232', '02311213233', '02311221100', '02311221101', '02311221102', '02311221103', '02311221110', '02311221111', '02311221112', '02311221113', '02311221120', '02311221121', '02311221122', '02311221123', '02311221130', '02311221131', '02311221132', '02311221133', '02311222102', '02311222120', '02311222121', '02311222122', '02311222123', '02311222132', '02311222133', '02311222300', '02311222301', '02311222310', '02311222311', '02311222312', '02311222313', '02311222330', '02311222331', '02311222332', '02311222333', '02311223022', '02311223023', '02311223113', '02311223131', '02311223133', '02311223200', '02311223201', '02311223202', '02311223203', '02311223220', '02311223221', '02311223222', '02311223223', '02311223311', '02311223312', '02311223313', '02311223330', '02311223331', '02311223333', '02311230001', '02311230002', '02311230010', '02311230011', '02311230020', '02311230022', '02311230100', '02311230101', '02311230102', '02311230103', '02311230110', '02311230111', '02311230112', '02311230113', '02311230120', '02311230121', '02311230122', '02311230123', '02311230130', '02311230131', '02311230132', '02311230133', '02311230212', '02311230213', '02311230230', '02311230231', '02311230232', '02311230233', '02311230301', '02311230302', '02311230303', '02311230310', '02311230311', '02311230312', '02311230313', '02311230320', '02311230321', '02311230322', '02311230323', '02311230330', '02311230331', '02311230332', '02311230333', '02311231000', '02311231001', '02311231002', '02311231003', '02311231010', '02311231011', '02311231012', '02311231013', '02311231020', '02311231021', '02311231022', '02311231023', '02311231030', '02311231031', '02311231032', '02311231033', '02311231100', '02311231101', '02311231102', '02311231103', '02311231110', '02311231112', '02311231120', '02311231121', '02311231122', '02311231123', '02311231130', '02311231131', '02311231132', '02311231133', '02311231200', '02311231201', '02311231202', '02311231203', '02311231210', '02311231211', '02311231212', '02311231213', '02311231220', '02311231221', '02311231222', '02311231223', '02311231230', '02311231231', '02311231232', '02311231233', '02311231300', '02311231301', '02311231302', '02311231303', '02311231310', '02311231311', '02311231312', '02311231313', '02311231320', '02311231321', '02311231322', '02311231323', '02311231330', '02311231331', '02311231332', '02311231333', '02311232000', '02311232001', '02311232002', '02311232003', '02311232010', '02311232011', '02311232012', '02311232013', '02311232020', '02311232021', '02311232022', '02311232023', '02311232030', '02311232031', '02311232032', '02311232033', '02311232100', '02311232101', '02311232102', '02311232103', '02311232110', '02311232111', '02311232112', '02311232113', '02311232120', '02311232121', '02311232122', '02311232123', '02311232130', '02311232131', '02311232132', '02311232133', '02311232200', '02311232201', '02311232202', '02311232203', '02311232210', '02311232211', '02311232212', '02311232213', '02311232220', '02311232221', '02311232222', '02311232223', '02311232230', '02311232231', '02311232232', '02311232233', '02311232300', '02311232301', '02311232302', '02311232303', '02311232310', '02311232311', '02311232312', '02311232313', '02311232320', '02311232321', '02311232322', '02311232323', '02311232330', '02311232331', '02311232332', '02311232333', '02311233000', '02311233001', '02311233002', '02311233003', '02311233010', '02311233011', '02311233012', '02311233013', '02311233020', '02311233021', '02311233022', '02311233023', '02311233030', '02311233031', '02311233032', '02311233033', '02311233100', '02311233101', '02311233102', '02311233103', '02311233110', '02311233111', '02311233112', '02311233113', '02311233120', '02311233121', '02311233122', '02311233123', '02311233130', '02311233131', '02311233133', '02311233200', '02311233201', '02311233202', '02311233203', '02311233210', '02311233211', '02311233212', '02311233213', '02311233220', '02311233221', '02311233222', '02311233223', '02311233230', '02311233231', '02311233300', '02311233301', '02311233302', '02311233303', '02311300101', '02311300103', '02311300110', '02311300111', '02311300112', '02311300113', '02311300121', '02311300123', '02311300130', '02311300131', '02311300132', '02311300133', '02311300301', '02311300303', '02311300310', '02311300311', '02311300312', '02311300313', '02311300321', '02311300330', '02311300331', '02311300332', '02311300333', '02311301000', '02311301001', '02311301002', '02311301003', '02311301010', '02311301012', '02311301020', '02311301021', '02311301022', '02311301023', '02311301030', '02311301032', '02311301111', '02311301113', '02311301131', '02311301133', '02311301200', '02311301201', '02311301202', '02311301203', '02311301220', '02311301221', '02311301222', '02311301223', '02311301311', '02311302110', '02311302111', '02311302112', '02311302113', '02311302130', '02311302131', '02311302132', '02311302133', '02311302310', '02311302311', '02311303000', '02311303001', '02311303002', '02311303003', '02311303020', '02311303021', '02311303022', '02311303133', '02311303311', '02311310000', '02311310001', '02311310002', '02311310003', '02311310010', '02311310012', '02311310020', '02311310021', '02311310022', '02311310023', '02311310030', '02311310032', '02311310200', '02311310201', '02311310210', '02311311100', '02311311101', '02311311110', '02311311111', '02311312022', '02311312023', '02311312030', '02311312031', '02311312032', '02311312033', '02311312120', '02311312122', '02311312200', '02311312201', '02311312202', '02311312203', '02311312210', '02311312211', '02311312212', '02311312213', '02311312221', '02311312230', '02311312231', '02311312232', '02311312233', '02311312300', '02311312302', '02311312320', '02311312322', '02311313110', '02311313111', '02311313112', '02311313113', '02311313130', '02311313131', '02311313132', '02311313133', '02311313233', '02311313301', '02311313303', '02311313310', '02311313311', '02311313312', '02311313313', '02311313320', '02311313321', '02311313322', '02311313323', '02311313330', '02311313331', '02311313332', '02311313333', '02311320020', '02311320021', '02311320022', '02311320023', '02311320030', '02311320031', '02311320032', '02311320033', '02311320120', '02311320122', '02311320123', '02311320200', '02311320201', '02311320202', '02311320203', '02311320210', '02311320211', '02311320212', '02311320213', '02311320220', '02311320221', '02311320222', '02311320223', '02311320230', '02311320231', '02311320232', '02311320233', '02311320300', '02311320301', '02311320302', '02311320303', '02311320320', '02311320321', '02311320322', '02311320323', '02311320330', '02311320331', '02311320332', '02311320333', '02311321200', '02311321201', '02311321202', '02311321203', '02311321220', '02311321221', '02311321222', '02311321223', '02311322000', '02311322001', '02311322002', '02311322003', '02311322010', '02311322011', '02311322012', '02311322013', '02311322020', '02311322022', '02311322023', '02311322033', '02311322100', '02311322101', '02311322102', '02311322103', '02311322110', '02311322111', '02311322112', '02311322113', '02311322120', '02311322121', '02311322122', '02311322123', '02311322130', '02311322131', '02311322132', '02311322133', '02311322200', '02311322201', '02311322203', '02311322210', '02311322211', '02311322212', '02311322213', '02311322220', '02311322221', '02311322230', '02311322231', '02311322233', '02311322300', '02311322301', '02311322302', '02311322303', '02311322310', '02311322311', '02311322312', '02311322313', '02311322320', '02311322321', '02311322322', '02311322323', '02311322330', '02311322332', '02311323000', '02311323001', '02311323002', '02311323003', '02311323010', '02311323011', '02311323012', '02311323013', '02311323020', '02311323021', '02311323022', '02311323023', '02311323030', '02311323031', '02311323032', '02311323033', '02311323100', '02311323102', '02311323120', '02311323122', '02311323131', '02311323133', '02311323200', '02311323201', '02311323202', '02311323203', '02311323210', '02311323211', '02311323212', '02311323213', '02311323220', '02311323221', '02311323230', '02311323231', '02311323300', '02311323302', '02311323311', '02311323320', '02311331011', '02311331013', '02311331031', '02311331033', '02311331100', '02311331101', '02311331102', '02311331103', '02311331110', '02311331111', '02311331112', '02311331113', '02311331120', '02311331121', '02311331122', '02311331123', '02311331130', '02311331131', '02311331132', '02311331133', '02311331201', '02311331203', '02311331210', '02311331211', '02311331212', '02311331213', '02311331221', '02311331230', '02311331231', '02311331232', '02311331233', '02311331300', '02311331301', '02311331302', '02311331303', '02311331310', '02311331311', '02311331312', '02311331313', '02311331320', '02311331321', '02311331322', '02311331323', '02311331330', '02311331331', '02311331332', '02311331333', '02311332020', '02311332021', '02311332022', '02311332023', '02311332030', '02311332031', '02311332032', '02311332033', '02311332100', '02311332101', '02311332102', '02311332103', '02311332110', '02311332111', '02311332112', '02311332113', '02311332120', '02311332121', '02311332122', '02311332123', '02311332130', '02311332131', '02311332132', '02311332200', '02311332201', '02311332210', '02311332211', '02311332212', '02311332213', '02311332230', '02311332231', '02311332300', '02311332301', '02311332302', '02311332310', '02311332320', '02311333001', '02311333003', '02311333010', '02311333011', '02311333012', '02311333013', '02311333021', '02311333023', '02311333030', '02311333031', '02311333032', '02311333033', '02311333100', '02311333101', '02311333102', '02311333103', '02311333110', '02311333111', '02311333112', '02311333113', '02311333120', '02311333121', '02311333122', '02311333123', '02311333130', '02311333131', '02311333132', '02311333133', '02311333210', '02311333211', '02311333212', '02311333213', '02311333222', '02311333223', '02311333230', '02311333231', '02311333232', '02311333233', '02311333300', '02311333301', '02311333302', '02311333303', '02311333310', '02311333311', '02311333312', '02311333313', '02311333320', '02311333321', '02311333322', '02311333323', '02311333330', '02311333331', '02311333332', '02311333333', '02312001000', '02312001001', '02312001002', '02312100001', '02312100003', '02312100010', '02312100011', '02312100012', '02312100013', '02312100031', '02312100033', '02312100100', '02312100101', '02312100102', '02312100103', '02312100110', '02312100111', '02312100112', '02312100113', '02312100120', '02312100121', '02312100122', '02312100123', '02312100130', '02312100131', '02312100132', '02312100133', '02312100300', '02312100301', '02312100303', '02312100310', '02312100311', '02312100312', '02312100313', '02312100330', '02312100331', '02312100333', '02312101000', '02312101002', '02312101003', '02312101010', '02312101011', '02312101012', '02312101013', '02312101020', '02312101021', '02312101022', '02312101023', '02312101030', '02312101031', '02312101032', '02312101033', '02312101200', '02312101201', '02312101202', '02312101203', '02312101210', '02312101211', '02312101212', '02312101213', '02312101220', '02312101221', '02312101222', '02312101223', '02312101230', '02312101231', '02312101232', '02312101233', '02312103000', '02312103001', '02312103010', '02312103011', '02312103012', '02312103013', '02312111000', '02312111001', '02312111002', '02312111003', '02312111010', '02312111011', '02312112003', '02312112010', '02312112011', '02312112012', '02312112013', '02312112021', '02312112023', '02312112030', '02312112031', '02312112032', '02312112033', '02312112100', '02312112102', '02312112103', '02312112120', '02312112121', '02312112122', '02312112123', '02312112130', '02312112131', '02312112132', '02312112133', '02312112201', '02312112203', '02312112210', '02312112211', '02312112212', '02312112213', '02312112221', '02312112223', '02312112230', '02312112231', '02312112232', '02312112233', '02312112300', '02312112301', '02312112302', '02312112303', '02312112310', '02312112311', '02312112312', '02312112313', '02312112320', '02312112321', '02312112322', '02312112323', '02312112330', '02312112331', '02312112332', '02312112333', '02312113022', '02312113200', '02312113201', '02312113202', '02312113203', '02312113212', '02312113220', '02312113221', '02312113222', '02312113230', '02312130001', '02312130003', '02312130010', '02312130011', '02312130012', '02312130013', '02312130021', '02312130030', '02312130031', '02312130033', '02312130100', '02312130101', '02312130102', '02312130110', '02312130111', '02312130112', '02312130113', '02312130120', '02312130121', '02312130122', '02312130123', '02312130130', '02312130132', '02312130301', '02313000033', '02313000120', '02313000121', '02313000122', '02313000123', '02313000300', '02313001313', '02313001331', '02313001333', '02313003111', '02313003113', '02313003311', '02313003312', '02313003313', '02313003320', '02313003321', '02313003322', '02313003323', '02313003330', '02313003331', '02313003332', '02313003333', '02313010000', '02313010001', '02313010010', '02313010013', '02313010021', '02313010023', '02313010030', '02313010031', '02313010033', '02313010101', '02313010102', '02313010103', '02313010110', '02313010111', '02313010112', '02313010113', '02313010120', '02313010121', '02313010122', '02313010123', '02313010130', '02313010131', '02313010132', '02313010133', '02313010201', '02313010202', '02313010203', '02313010212', '02313010213', '02313010220', '02313010221', '02313010222', '02313010223', '02313010230', '02313010231', '02313010232', '02313010233', '02313010301', '02313010302', '02313010303', '02313010310', '02313010311', '02313010312', '02313010320', '02313010321', '02313010322', '02313010323', '02313010330', '02313010332', '02313011000', '02313011001', '02313011002', '02313011003', '02313011020', '02313011021', '02313011022', '02313011023', '02313011200', '02313011333', '02313012000', '02313012001', '02313012002', '02313012003', '02313012010', '02313012011', '02313012012', '02313012013', '02313012020', '02313012021', '02313012023', '02313012030', '02313012031', '02313012032', '02313012033', '02313012100', '02313012101', '02313012102', '02313012103', '02313012110', '02313012111', '02313012112', '02313012113', '02313012120', '02313012121', '02313012122', '02313012123', '02313012130', '02313012131', '02313012200', '02313012201', '02313012202', '02313012203', '02313012210', '02313012211', '02313012212', '02313012213', '02313012220', '02313012221', '02313012222', '02313012223', '02313012230', '02313012231', '02313012232', '02313012233', '02313012300', '02313012301', '02313012302', '02313012320', '02313012321', '02313012322', '02313012323', '02313013110', '02313013111', '02313013112', '02313013113', '02313013123', '02313013130', '02313013131', '02313013132', '02313013133', '02313013301', '02313013310', '02313013311', '02313013312', '02313013313', '02313013321', '02313013323', '02313013330', '02313013331', '02313013332', '02313013333', '02313020312', '02313020313', '02313020330', '02313020331', '02313020332', '02313020333', '02313021100', '02313021101', '02313021102', '02313021103', '02313021110', '02313021111', '02313021112', '02313021113', '02313021120', '02313021121', '02313021130', '02313021131', '02313021133', '02313021202', '02313021203', '02313021212', '02313021220', '02313021221', '02313021222', '02313021223', '02313021230', '02313021232', '02313022101', '02313022103', '02313022110', '02313022111', '02313022112', '02313022113', '02313022130', '02313022131', '02313022133', '02313023000', '02313023001', '02313023002', '02313023003', '02313023010', '02313023012', '02313023013', '02313023020', '02313023021', '02313023022', '02313023023', '02313023030', '02313023031', '02313023032', '02313023033', '02313023102', '02313023103', '02313023112', '02313023120', '02313023121', '02313023122', '02313023123', '02313023130', '02313023132', '02313023200', '02313023201', '02313023203', '02313023210', '02313023211', '02313023212', '02313023213', '02313023221', '02313023230', '02313023231', '02313023232', '02313023233', '02313023300', '02313023301', '02313023302', '02313023303', '02313023310', '02313023312', '02313023313', '02313023320', '02313023321', '02313023322', '02313023323', '02313023330', '02313023331', '02313023332', '02313023333', '02313030000', '02313030001', '02313030002', '02313030003', '02313030010', '02313030011', '02313030012', '02313030013', '02313030020', '02313030021', '02313030022', '02313030100', '02313030102', '02313030333', '02313031101', '02313031103', '02313031110', '02313031111', '02313031112', '02313031113', '02313031130', '02313031131', '02313031133', '02313031222', '02313031223', '02313032013', '02313032030', '02313032031', '02313032032', '02313032033', '02313032102', '02313032111', '02313032112', '02313032113', '02313032120', '02313032121', '02313032122', '02313032123', '02313032130', '02313032131', '02313032132', '02313032133', '02313032210', '02313032211', '02313032213', '02313032222', '02313032300', '02313032301', '02313032302', '02313032303', '02313032310', '02313032311', '02313032312', '02313032313', '02313033000', '02313033001', '02313033002', '02313033003', '02313033020', '02313033021', '02313033022', '02313100011', '02313100100', '02313100101', '02313100110', '02313100213', '02313100221', '02313100222', '02313100223', '02313100230', '02313100231', '02313100232', '02313100233', '02313100302', '02313100303', '02313100312', '02313100313', '02313100320', '02313100321', '02313100322', '02313100323', '02313100330', '02313100331', '02313100332', '02313100333', '02313101131', '02313101132', '02313101133', '02313101201', '02313101202', '02313101203', '02313101212', '02313101213', '02313101220', '02313101221', '02313101222', '02313101223', '02313101230', '02313101231', '02313101232', '02313101233', '02313101302', '02313101310', '02313101311', '02313101313', '02313101320', '02313101331', '02313101333', '02313102000', '02313102001', '02313102002', '02313102003', '02313102010', '02313102011', '02313102012', '02313102013', '02313102020', '02313102021', '02313102022', '02313102023', '02313102030', '02313102031', '02313102032', '02313102033', '02313102100', '02313102101', '02313102102', '02313102103', '02313102110', '02313102112', '02313102113', '02313102120', '02313102121', '02313102122', '02313102123', '02313102130', '02313102131', '02313102132', '02313102133', '02313102200', '02313102201', '02313102202', '02313102203', '02313102210', '02313102211', '02313102212', '02313102213', '02313102220', '02313102221', '02313102222', '02313102223', '02313102230', '02313102231', '02313102232', '02313102233', '02313102300', '02313102301', '02313102302', '02313102303', '02313102310', '02313102311', '02313102312', '02313102320', '02313102321', '02313102322', '02313102323', '02313102330', '02313102332', '02313102333', '02313103000', '02313103001', '02313103002', '02313103003', '02313103010', '02313103011', '02313103012', '02313103013', '02313103020', '02313103021', '02313103022', '02313103023', '02313103030', '02313103031', '02313103032', '02313103033', '02313103102', '02313103120', '02313103121', '02313103122', '02313103123', '02313103130', '02313103132', '02313103133', '02313103200', '02313103201', '02313103202', '02313103203', '02313103210', '02313103211', '02313103212', '02313103221', '02313103300', '02313103301', '02313103310', '02313110020', '02313110022', '02313110023', '02313110030', '02313110031', '02313110032', '02313110033', '02313110113', '02313110122', '02313110131', '02313110133', '02313110200', '02313110201', '02313110202', '02313110203', '02313110210', '02313110211', '02313110212', '02313110213', '02313110220', '02313110221', '02313110222', '02313110223', '02313110230', '02313110231', '02313110232', '02313110300', '02313110311', '02313111000', '02313111001', '02313111002', '02313111003', '02313111010', '02313111011', '02313111012', '02313111020', '02313111021', '02313111022', '02313111023', '02313111030', '02313111031', '02313111032', '02313111033', '02313111101', '02313111102', '02313111103', '02313111110', '02313111111', '02313111112', '02313111113', '02313111120', '02313111121', '02313111122', '02313111123', '02313111130', '02313111131', '02313111132', '02313111133', '02313111200', '02313111201', '02313111202', '02313111203', '02313111210', '02313111211', '02313111212', '02313111213', '02313111220', '02313111221', '02313111223', '02313111230', '02313111231', '02313111232', '02313111233', '02313111300', '02313111301', '02313111302', '02313111303', '02313111310', '02313111311', '02313111312', '02313111313', '02313111320', '02313111321', '02313111330', '02313111331', '02313111332', '02313111333', '02313112031', '02313112032', '02313112033', '02313112120', '02313112121', '02313112122', '02313112123', '02313112210', '02313112211', '02313112300', '02313112301', '02313113000', '02313113001', '02313113002', '02313113003', '02313113010', '02313113011', '02313113012', '02313113020', '02313113021', '02313113023', '02313113030', '02313113031', '02313113032', '02313113033', '02313113110', '02313113111', '02313113112', '02313113113', '02313113121', '02313113122', '02313113123', '02313113130', '02313113131', '02313113132', '02313113133', '02313113210', '02313113211', '02313113212', '02313113213', '02313113230', '02313113231', '02313113232', '02313113233', '02313113300', '02313113301', '02313113302', '02313113303', '02313113310', '02313113311', '02313113312', '02313113313', '02313113320', '02313113321', '02313113322', '02313113323', '02313113330', '02313113331', '02313113332', '02313113333', '02313120000', '02313120001', '02313120002', '02313120003', '02313120010', '02313120011', '02313120012', '02313120013', '02313120020', '02313120021', '02313120022', '02313120023', '02313120030', '02313120031', '02313120032', '02313120033', '02313120100', '02313120101', '02313120102', '02313120103', '02313120110', '02313120111', '02313120120', '02313120201', '02313131100', '02313131101', '02313131103', '02313131110', '02313131111', '02313131112', '02313131113', '02313131121', '02313131130', '02313131131', '02313131132', '02313131133', '02313201010', '02313201011', '02313201012', '02313201013', '02313201031', '02313201033', '02313201100', '02313201101', '02313201102', '02313201103', '02313201110', '02313201111', '02313201112', '02313201113', '02313201120', '02313201121', '02313201122', '02313201123', '02313201130', '02313201131', '02313201132', '02313201133', '02313201300', '02313201301', '02313201310', '02313201311', '02313201312', '02313201313', '02313210000', '02313210002', '02313210020', '02313210022', '02313210023', '02313210032', '02313210123', '02313210132', '02313210200', '02313210201', '02313210202', '02313210203', '02313210210', '02313210211', '02313210212', '02313210213', '02313210220', '02313210221', '02313210230', '02313210231', '02313210300', '02313210301', '02313210302', '02313210303', '02313210310', '02313210311', '02313210312', '02313210313', '02313210320', '02313210321', '02313210322', '02313210323', '02313210330', '02313210331', '02313210332', '02313210333', '02313212101', '02313212110', '03022023330', '03022023331', '03022023332', '03022023333', '03022032201', '03022032202', '03022032203', '03022032210', '03022032212', '03022032220', '03022032221', '03022032222', '03022032223', '03022032230', '03022200000', '03022200001', '03022200002', '03022200003', '03022200010', '03022200012', '03022200021', '03022200030', '03022200132', '03022200133', '03022200310', '03022200311', '03022200312', '03022200313', '03022200330', '03022200331', '03022200332', '03022200333', '03022201022', '03022201023', '03022201032', '03022201033', '03022201103', '03022201110', '03022201111', '03022201112', '03022201113', '03022201120', '03022201121', '03022201122', '03022201123', '03022201130', '03022201131', '03022201132', '03022201133', '03022201200', '03022201201', '03022201202', '03022201203', '03022201210', '03022201211', '03022201212', '03022201213', '03022201220', '03022201221', '03022201222', '03022201223', '03022201230', '03022201231', '03022201232', '03022201233', '03022201300', '03022201301', '03022201302', '03022201303', '03022201320', '03022201321', '03022201322', '03022202110', '03022202111', '03022202112', '03022202113', '03022202130', '03022202131', '03022202132', '03022202133', '03022202203', '03022202212', '03022202213', '03022202220', '03022202221', '03022202222', '03022202223', '03022202230', '03022202231', '03022202232', '03022202233', '03022202302', '03022202303', '03022202310', '03022202311', '03022202320', '03022202321', '03022202322', '03022202323', '03022202330', '03022202331', '03022202332', '03022202333', '03022203000', '03022203001', '03022203002', '03022203003', '03022203010', '03022203012', '03022203013', '03022203020', '03022203021', '03022203022', '03022203023', '03022203030', '03022203031', '03022203032', '03022203033', '03022203102', '03022203103', '03022203120', '03022203121', '03022203122', '03022203123', '03022203200', '03022203201', '03022203202', '03022203203', '03022203210', '03022203211', '03022203212', '03022203213', '03022203220', '03022203221', '03022203222', '03022203223', '03022203230', '03022203231', '03022203232', '03022203233', '03022203300', '03022203301', '03022203302', '03022203320', '03022203322', '03022210000', '03022210002', '03022210020', '03022212211', '03022212213', '03022212300', '03022212301', '03022212302', '03022212303', '03022212310', '03022212312', '03022212313', '03022212320', '03022212321', '03022212322', '03022212323', '03022212330', '03022212331', '03022212332', '03022212333', '03022213202', '03022213203', '03022213212', '03022213220', '03022213221', '03022213222', '03022213223', '03022213230', '03022213231', '03022213232', '03022213233', '03022213311', '03022213313', '03022213331', '03022213333', '03022220000', '03022220001', '03022220002', '03022220003', '03022220010', '03022220011', '03022220012', '03022220013', '03022220020', '03022220021', '03022220030', '03022220031', '03022220033', '03022220100', '03022220101', '03022220102', '03022220103', '03022220110', '03022220111', '03022220112', '03022220113', '03022220120', '03022220121', '03022220122', '03022220123', '03022220130', '03022220131', '03022220132', '03022220133', '03022220211', '03022220213', '03022220231', '03022220300', '03022220301', '03022220302', '03022220303', '03022220310', '03022220311', '03022220312', '03022220313', '03022220320', '03022220321', '03022220322', '03022220323', '03022220330', '03022220331', '03022220332', '03022220333', '03022221000', '03022221001', '03022221002', '03022221003', '03022221010', '03022221011', '03022221012', '03022221013', '03022221020', '03022221021', '03022221022', '03022221023', '03022221030', '03022221031', '03022221032', '03022221033', '03022221100', '03022221102', '03022221120', '03022221121', '03022221122', '03022221200', '03022221201', '03022221202', '03022221203', '03022221210', '03022221211', '03022221212', '03022221213', '03022221220', '03022221221', '03022221222', '03022221223', '03022221230', '03022221231', '03022221232', '03022221233', '03022221300', '03022221302', '03022221320', '03022221322', '03022221323', '03022222111', '03022222113', '03022222122', '03022222123', '03022222131', '03022222132', '03022222133', '03022222300', '03022222301', '03022222302', '03022222303', '03022222310', '03022222311', '03022222312', '03022222313', '03022222321', '03022222330', '03022222331', '03022222332', '03022222333', '03022223000', '03022223001', '03022223002', '03022223003', '03022223010', '03022223011', '03022223012', '03022223013', '03022223020', '03022223021', '03022223022', '03022223023', '03022223030', '03022223031', '03022223032', '03022223033', '03022223100', '03022223101', '03022223102', '03022223103', '03022223120', '03022223121', '03022223122', '03022223123', '03022223130', '03022223131', '03022223132', '03022223133', '03022223200', '03022223201', '03022223202', '03022223203', '03022223210', '03022223211', '03022223212', '03022223213', '03022223220', '03022223221', '03022223222', '03022223223', '03022223230', '03022223231', '03022223232', '03022223233', '03022223300', '03022223301', '03022223302', '03022223303', '03022223310', '03022223311', '03022223312', '03022223313', '03022223320', '03022223321', '03022223322', '03022223323', '03022223330', '03022223331', '03022223332', '03022230101', '03022230103', '03022230110', '03022230111', '03022230112', '03022230113', '03022230121', '03022230123', '03022230130', '03022230131', '03022230132', '03022230133', '03022230233', '03022230300', '03022230301', '03022230302', '03022230303', '03022230310', '03022230311', '03022230312', '03022230313', '03022230320', '03022230321', '03022230322', '03022230323', '03022230330', '03022230331', '03022230332', '03022230333', '03022231000', '03022231001', '03022231002', '03022231003', '03022231010', '03022231011', '03022231012', '03022231013', '03022231020', '03022231021', '03022231022', '03022231023', '03022231030', '03022231031', '03022231033', '03022231113', '03022231120', '03022231121', '03022231122', '03022231123', '03022231130', '03022231131', '03022231132', '03022231133', '03022231200', '03022231201', '03022231202', '03022231203', '03022231211', '03022231213', '03022231220', '03022231221', '03022231222', '03022231223', '03022231300', '03022231301', '03022231302', '03022231303', '03022231310', '03022231311', '03022231312', '03022231313', '03022231321', '03022231323', '03022231330', '03022231331', '03022231332', '03022231333', '03022232003', '03022232010', '03022232011', '03022232012', '03022232013', '03022232020', '03022232021', '03022232022', '03022232023', '03022232030', '03022232031', '03022232032', '03022232033', '03022232100', '03022232101', '03022232102', '03022232103', '03022232110', '03022232111', '03022232112', '03022232113', '03022232120', '03022232121', '03022232122', '03022232123', '03022232130', '03022232131', '03022232132', '03022232133', '03022232200', '03022232201', '03022232202', '03022232203', '03022232210', '03022232211', '03022232300', '03022232301', '03022232310', '03022232311', '03022233000', '03022233002', '03022233020', '03022233022', '03022233111', '03022233113', '03022233131', '03022233200', '03022233212', '03022233213', '03022233222', '03022233223', '03022233230', '03022233231', '03022233232', '03022233233', '03022233302', '03022233303', '03022233320', '03022233321', '03022233322', '03022233323', '03022302001', '03022302003', '03022302010', '03022302012', '03022302021', '03022302022', '03022302023', '03022302030', '03022302032', '03022302033', '03022302200', '03022302201', '03022302202', '03022302203', '03022302210', '03022302211', '03022302212', '03022302213', '03022302220', '03022302221', '03022302222', '03022302223', '03022302230', '03022302231', '03022302232', '03022302233', '03022302302', '03022302320', '03022302321', '03022302322', '03022302323', '03022302332', '03022302333', '03022303220', '03022303221', '03022303222', '03022303223', '03022303230', '03022303232', '03022303233', '03022313011', '03022313012', '03022313013', '03022313021', '03022313023', '03022313030', '03022313031', '03022313032', '03022313033', '03022313100', '03022313102', '03022313103', '03022313112', '03022313113', '03022313120', '03022313121', '03022313122', '03022313123', '03022313130', '03022313131', '03022313201', '03022313210', '03022313211', '03022313300', '03022313312', '03022313313', '03022313321', '03022313323', '03022313330', '03022313331', '03022313332', '03022313333', '03022320002', '03022320003', '03022320010', '03022320011', '03022320012', '03022320013', '03022320020', '03022320021', '03022320022', '03022320023', '03022320030', '03022320031', '03022320032', '03022320033', '03022320100', '03022320101', '03022320102', '03022320103', '03022320111', '03022320112', '03022320113', '03022320120', '03022320121', '03022320122', '03022320123', '03022320130', '03022320131', '03022320132', '03022320133', '03022320200', '03022320201', '03022320202', '03022320203', '03022320210', '03022320211', '03022320212', '03022320213', '03022320220', '03022320221', '03022320222', '03022320223', '03022320230', '03022320231', '03022320232', '03022320233', '03022320300', '03022320301', '03022320302', '03022320303', '03022320310', '03022320311', '03022320312', '03022320313', '03022320320', '03022320321', '03022320322', '03022320323', '03022320330', '03022320331', '03022320332', '03022320333', '03022321000', '03022321001', '03022321002', '03022321003', '03022321010', '03022321011', '03022321012', '03022321013', '03022321020', '03022321021', '03022321022', '03022321023', '03022321030', '03022321031', '03022321032', '03022321200', '03022321201', '03022321202', '03022321210', '03022322000', '03022322001', '03022322002', '03022322003', '03022322010', '03022322011', '03022322012', '03022322013', '03022322020', '03022322021', '03022322030', '03022322031', '03022322032', '03022322033', '03022322103', '03022322110', '03022322120', '03022322121', '03022322122', '03022322123', '03022322130', '03022322131', '03022322132', '03022322133', '03022322210', '03022322211', '03022322212', '03022322213', '03022322230', '03022322231', '03022322300', '03022322301', '03022322302', '03022322303', '03022322320', '03022322321', '03022323021', '03022323022', '03022323023', '03022323122', '03022323123', '03022323132', '03022323133', '03022323200', '03022323201', '03022323202', '03022323203', '03022323210', '03022323211', '03022323212', '03022323213', '03022323223', '03022323231', '03022323232', '03022323233', '03022323300', '03022323301', '03022323302', '03022323303', '03022323310', '03022323311', '03022323312', '03022323313', '03022323320', '03022323321', '03022323322', '03022323323', '03022323330', '03022323331', '03022323332', '03022323333', '03022330332', '03022330333', '03022331110', '03022331111', '03022331112', '03022331113', '03022331121', '03022331123', '03022331130', '03022331131', '03022331132', '03022331133', '03022331211', '03022331212', '03022331213', '03022331220', '03022331221', '03022331222', '03022331223', '03022331230', '03022331231', '03022331232', '03022331233', '03022331300', '03022331301', '03022331302', '03022331303', '03022331310', '03022331311', '03022331312', '03022331313', '03022331320', '03022331321', '03022331322', '03022331323', '03022331330', '03022331332', '03022332002', '03022332003', '03022332010', '03022332011', '03022332012', '03022332013', '03022332020', '03022332021', '03022332022', '03022332023', '03022332030', '03022332031', '03022332032', '03022332033', '03022332100', '03022332101', '03022332102', '03022332103', '03022332110', '03022332111', '03022332112', '03022332113', '03022332120', '03022332122', '03022332123', '03022332132', '03022332133', '03022332200', '03022332201', '03022332202', '03022332203', '03022332210', '03022332211', '03022332212', '03022332213', '03022332220', '03022332221', '03022332222', '03022332223', '03022332230', '03022332231', '03022332232', '03022332233', '03022332300', '03022332301', '03022332302', '03022332303', '03022332310', '03022332311', '03022332312', '03022332313', '03022332320', '03022332321', '03022332322', '03022332323', '03022332330', '03022332331', '03022332332', '03022332333', '03022333000', '03022333001', '03022333002', '03022333003', '03022333010', '03022333011', '03022333012', '03022333013', '03022333022', '03022333100', '03022333101', '03022333110', '03022333200', '03022333202', '03022333220', '03022333221', '03022333222', '03022333223', '03022333230', '03022333232', '03023023313', '03023023331', '03023023333', '03023032200', '03023032201', '03023032202', '03023032203', '03023032210', '03023032211', '03023032212', '03023032213', '03023032220', '03023032221', '03023032222', '03023032223', '03023032230', '03023033033', '03023033120', '03023033121', '03023033122', '03023033123', '03023033130', '03023033132', '03023033210', '03023033211', '03023033212', '03023033213', '03023033230', '03023033231', '03023033300', '03023033301', '03023033302', '03023033303', '03023033310', '03023033312', '03023033320', '03023033321', '03023033330', '03023121001', '03023121003', '03023121010', '03023121011', '03023121012', '03023121013', '03023121021', '03023121023', '03023121030', '03023121031', '03023121032', '03023121033', '03023201313', '03023201330', '03023201331', '03023201332', '03023201333', '03023202202', '03023202203', '03023202212', '03023202213', '03023202220', '03023202221', '03023202222', '03023202223', '03023202230', '03023202231', '03023202232', '03023202233', '03023202302', '03023202303', '03023202320', '03023202321', '03023202322', '03023202323', '03023202330', '03023202331', '03023202332', '03023202333', '03023203110', '03023203111', '03023203112', '03023203113', '03023203130', '03023203131', '03023203132', '03023203133', '03023203202', '03023203203', '03023203211', '03023203212', '03023203213', '03023203220', '03023203221', '03023203222', '03023203223', '03023203230', '03023203231', '03023203232', '03023203233', '03023203300', '03023203301', '03023203302', '03023203303', '03023203310', '03023203311', '03023203312', '03023203313', '03023203320', '03023203321', '03023203322', '03023203323', '03023203330', '03023203331', '03023203332', '03023203333', '03023210023', '03023210030', '03023210031', '03023210032', '03023210033', '03023210101', '03023210103', '03023210110', '03023210111', '03023210112', '03023210113', '03023210120', '03023210121', '03023210122', '03023210123', '03023210131', '03023210132', '03023210133', '03023210201', '03023210202', '03023210210', '03023210212', '03023210213', '03023210220', '03023210221', '03023210222', '03023210223', '03023210230', '03023210231', '03023210232', '03023210233', '03023210300', '03023210311', '03023210313', '03023210322', '03023210323', '03023210331', '03023210333', '03023211000', '03023211001', '03023211002', '03023211003', '03023211010', '03023211011', '03023211012', '03023211013', '03023211020', '03023211021', '03023211022', '03023211023', '03023211030', '03023211031', '03023211032', '03023211033', '03023211131', '03023211132', '03023211133', '03023211200', '03023211201', '03023211202', '03023211203', '03023211210', '03023211211', '03023211212', '03023211213', '03023211220', '03023211221', '03023211222', '03023211223', '03023211230', '03023211232', '03023211310', '03023211311', '03023211312', '03023211313', '03023211330', '03023211331', '03023212000', '03023212001', '03023212002', '03023212003', '03023212010', '03023212011', '03023212012', '03023212013', '03023212020', '03023212021', '03023212022', '03023212023', '03023212030', '03023212031', '03023212032', '03023212033', '03023212100', '03023212102', '03023212111', '03023212120', '03023212122', '03023212200', '03023212201', '03023212202', '03023212203', '03023212210', '03023212211', '03023212212', '03023212213', '03023212220', '03023212221', '03023212222', '03023212223', '03023212230', '03023212231', '03023212232', '03023212233', '03023212300', '03023212302', '03023212303', '03023212312', '03023212313', '03023212320', '03023212322', '03023212330', '03023212331', '03023212332', '03023212333', '03023213000', '03023213001', '03023213112', '03023213121', '03023213123', '03023213130', '03023213132', '03023213133', '03023213203', '03023213212', '03023213213', '03023213220', '03023213221', '03023213222', '03023213223', '03023213230', '03023213231', '03023213232', '03023213233', '03023213300', '03023213301', '03023213302', '03023213303', '03023213310', '03023213311', '03023213312', '03023213313', '03023213320', '03023213321', '03023213322', '03023213323', '03023213330', '03023213331', '03023213332', '03023213333', '03023220000', '03023220001', '03023220002', '03023220003', '03023220010', '03023220011', '03023220012', '03023220013', '03023220020', '03023220021', '03023220022', '03023220023', '03023220030', '03023220031', '03023220032', '03023220033', '03023220100', '03023220101', '03023220102', '03023220103', '03023220110', '03023220111', '03023220112', '03023220113', '03023220120', '03023220122', '03023220123', '03023220130', '03023220131', '03023220132', '03023220133', '03023220200', '03023220201', '03023220202', '03023220210', '03023220211', '03023220212', '03023220213', '03023220230', '03023220231', '03023220232', '03023220233', '03023220300', '03023220301', '03023220302', '03023220303', '03023220310', '03023220311', '03023220312', '03023220313', '03023220320', '03023220321', '03023220322', '03023220323', '03023220330', '03023220331', '03023220332', '03023220333', '03023221000', '03023221001', '03023221002', '03023221003', '03023221010', '03023221011', '03023221012', '03023221013', '03023221020', '03023221021', '03023221022', '03023221023', '03023221030', '03023221031', '03023221032', '03023221033', '03023221100', '03023221101', '03023221102', '03023221103', '03023221110', '03023221111', '03023221112', '03023221113', '03023221120', '03023221121', '03023221122', '03023221123', '03023221130', '03023221131', '03023221132', '03023221200', '03023221201', '03023221202', '03023221203', '03023221210', '03023221211', '03023221212', '03023221213', '03023221220', '03023221221', '03023221222', '03023221223', '03023221230', '03023221231', '03023221232', '03023221233', '03023221300', '03023221301', '03023221302', '03023221303', '03023221310', '03023221311', '03023221312', '03023221313', '03023221320', '03023221321', '03023221322', '03023221323', '03023221330', '03023221331', '03023221332', '03023221333', '03023222010', '03023222011', '03023222100', '03023222101', '03023222110', '03023222111', '03023222231', '03023222233', '03023222302', '03023222320', '03023222321', '03023222322', '03023222323', '03023222330', '03023222332', '03023222333', '03023223000', '03023223001', '03023223010', '03023223011', '03023223100', '03023223101', '03023223110', '03023223111', '03023223222', '03023223223', '03023223301', '03023223303', '03023223310', '03023223311', '03023223312', '03023223313', '03023223321', '03023223323', '03023223330', '03023223331', '03023223332', '03023223333', '03023230000', '03023230001', '03023230002', '03023230003', '03023230010', '03023230011', '03023230012', '03023230013', '03023230020', '03023230021', '03023230022', '03023230023', '03023230030', '03023230031', '03023230100', '03023230102', '03023230110', '03023230111', '03023230113', '03023230120', '03023230132', '03023230133', '03023230200', '03023230202', '03023230203', '03023230212', '03023230213', '03023230220', '03023230221', '03023230222', '03023230223', '03023230230', '03023230231', '03023230232', '03023230233', '03023230300', '03023230301', '03023230302', '03023230303', '03023230310', '03023230311', '03023230312', '03023230313', '03023230320', '03023230321', '03023230322', '03023230323', '03023230330', '03023230331', '03023230332', '03023230333', '03023231000', '03023231001', '03023231002', '03023231003', '03023231010', '03023231011', '03023231012', '03023231013', '03023231021', '03023231023', '03023231030', '03023231031', '03023231032', '03023231033', '03023231100', '03023231101', '03023231102', '03023231103', '03023231110', '03023231111', '03023231112', '03023231113', '03023231120', '03023231121', '03023231122', '03023231123', '03023231130', '03023231131', '03023231132', '03023231133', '03023231200', '03023231201', '03023231202', '03023231203', '03023231210', '03023231211', '03023231212', '03023231213', '03023231220', '03023231221', '03023231222', '03023231223', '03023231230', '03023231231', '03023231232', '03023231233', '03023231300', '03023231301', '03023231302', '03023231303', '03023231310', '03023231311', '03023231312', '03023231313', '03023231320', '03023231321', '03023231322', '03023231323', '03023231330', '03023231331', '03023231332', '03023231333', '03023232000', '03023232001', '03023232010', '03023232011', '03023232013', '03023232100', '03023232101', '03023232102', '03023232103', '03023232110', '03023232111', '03023232112', '03023232113', '03023232120', '03023232121', '03023232122', '03023232123', '03023232130', '03023232131', '03023232132', '03023232133', '03023232200', '03023232201', '03023232202', '03023232203', '03023232212', '03023232213', '03023232220', '03023232221', '03023232222', '03023232223', '03023232230', '03023232231', '03023232232', '03023232233', '03023232301', '03023232302', '03023232310', '03023232311', '03023232312', '03023232313', '03023232320', '03023232321', '03023232322', '03023232323', '03023232331', '03023232332', '03023232333', '03023233000', '03023233002', '03023233010', '03023233011', '03023233012', '03023233013', '03023233020', '03023233021', '03023233022', '03023233023', '03023233030', '03023233031', '03023233032', '03023233033', '03023233100', '03023233101', '03023233102', '03023233103', '03023233110', '03023233111', '03023233112', '03023233113', '03023233120', '03023233121', '03023233122', '03023233123', '03023233130', '03023233131', '03023233132', '03023233133', '03023233200', '03023233201', '03023233202', '03023233203', '03023233210', '03023233211', '03023233212', '03023233213', '03023233220', '03023233221', '03023233222', '03023233223', '03023233230', '03023233231', '03023233232', '03023233233', '03023233300', '03023233301', '03023233302', '03023233303', '03023233310', '03023233311', '03023233312', '03023233313', '03023233320', '03023233321', '03023233322', '03023233323', '03023233330', '03023233331', '03023233332', '03023233333', '03023300020', '03023300022', '03023300023', '03023300200', '03023300201', '03023300202', '03023300203', '03023300210', '03023300212', '03023300220', '03023300221', '03023300222', '03023300223', '03023301313', '03023301322', '03023301323', '03023301330', '03023301331', '03023301332', '03023301333', '03023302310', '03023302311', '03023302312', '03023302313', '03023302323', '03023302330', '03023302331', '03023302332', '03023302333', '03023303100', '03023303101', '03023303102', '03023303103', '03023303110', '03023303111', '03023303112', '03023303113', '03023303120', '03023303121', '03023303122', '03023303123', '03023303130', '03023303131', '03023303132', '03023303133', '03023303200', '03023303201', '03023303202', '03023303203', '03023303213', '03023303220', '03023303221', '03023303222', '03023303223', '03023303230', '03023303231', '03023303232', '03023303233', '03023303300', '03023303301', '03023303302', '03023303303', '03023303310', '03023303311', '03023303312', '03023303313', '03023303320', '03023303321', '03023303322', '03023303323', '03023303330', '03023303331', '03023303332', '03023310023', '03023310031', '03023310032', '03023310033', '03023310120', '03023310122', '03023310123', '03023310200', '03023310201', '03023310202', '03023310203', '03023310210', '03023310211', '03023310212', '03023310213', '03023310220', '03023310221', '03023310222', '03023310223', '03023310230', '03023310231', '03023310232', '03023310233', '03023310300', '03023310301', '03023310302', '03023310303', '03023310320', '03023310322', '03023312000', '03023312001', '03023312002', '03023312003', '03023312010', '03023312011', '03023312012', '03023312013', '03023312020', '03023312021', '03023312022', '03023312200', '03023312202', '03023320020', '03023320021', '03023320022', '03023320023', '03023320030', '03023320031', '03023320032', '03023320033', '03023320101', '03023320103', '03023320110', '03023320111', '03023320112', '03023320113', '03023320120', '03023320121', '03023320122', '03023320123', '03023320130', '03023320131', '03023320132', '03023320133', '03023320200', '03023320201', '03023320202', '03023320203', '03023320210', '03023320211', '03023320212', '03023320213', '03023320220', '03023320221', '03023320222', '03023320223', '03023320230', '03023320231', '03023320232', '03023320233', '03023320300', '03023320301', '03023320302', '03023320303', '03023320310', '03023320311', '03023320312', '03023320313', '03023320320', '03023320321', '03023320322', '03023320323', '03023320330', '03023320331', '03023320332', '03023320333', '03023321000', '03023321001', '03023321002', '03023321003', '03023321010', '03023321011', '03023321012', '03023321013', '03023321020', '03023321021', '03023321022', '03023321023', '03023321030', '03023321031', '03023321032', '03023321033', '03023321100', '03023321101', '03023321102', '03023321103', '03023321110', '03023321120', '03023321121', '03023321122', '03023321123', '03023321130', '03023321132', '03023321200', '03023321201', '03023321202', '03023321203', '03023321210', '03023321211', '03023321212', '03023321213', '03023321220', '03023321221', '03023321222', '03023321223', '03023321230', '03023321231', '03023321232', '03023321233', '03023321300', '03023321301', '03023321302', '03023321320', '03023321321', '03023321322', '03023321323', '03023321332', '03023322000', '03023322001', '03023322002', '03023322003', '03023322010', '03023322011', '03023322012', '03023322013', '03023322020', '03023322021', '03023322022', '03023322023', '03023322030', '03023322031', '03023322032', '03023322033', '03023322100', '03023322101', '03023322102', '03023322103', '03023322110', '03023322111', '03023322112', '03023322113', '03023322120', '03023322121', '03023322122', '03023322123', '03023322130', '03023322131', '03023322132', '03023322133', '03023322200', '03023322201', '03023322202', '03023322203', '03023322210', '03023322211', '03023322212', '03023322213', '03023322220', '03023322221', '03023322222', '03023322223', '03023322230', '03023322231', '03023322232', '03023322233', '03023322300', '03023322301', '03023322302', '03023322303', '03023322310', '03023322311', '03023322312', '03023322313', '03023322320', '03023322321', '03023322322', '03023322323', '03023322330', '03023322332', '03023322333', '03023323000', '03023323001', '03023323002', '03023323003', '03023323010', '03023323011', '03023323012', '03023323013', '03023323020', '03023323021', '03023323022', '03023323023', '03023323030', '03023323031', '03023323032', '03023323033', '03023323100', '03023323101', '03023323102', '03023323103', '03023323110', '03023323112', '03023323113', '03023323120', '03023323121', '03023323122', '03023323123', '03023323130', '03023323131', '03023323132', '03023323133', '03023323200', '03023323201', '03023323202', '03023323203', '03023323210', '03023323211', '03023323220', '03023323221', '03023323222', '03023323223', '03023323300', '03023323301', '03023323302', '03023323303', '03023323310', '03023323311', '03023323312', '03023323313', '03023330222', '03023330223', '03023332000', '03023332001', '03023332002', '03023332003', '03023332010', '03023332012', '03023332020', '03023332021', '03023332022', '03023332023', '03023332030', '03023332032', '03023332201', '03023332202', '03023332203', '03023332212', '03023332220', '03023332221', '03032021332', '03032021333', '03032022100', '03032022101', '03032022102', '03032022103', '03032022331', '03032022333', '03032023110', '03032023111', '03032023202', '03032023220', '03032023222', '03032030222', '03032031220', '03032031221', '03032032000', '03032121220', '03032121221', '03032121222', '03032121223', '03032121232', '03032123001', '03032210103', '03032210112', '03032210121', '03032210123', '03032210130', '03032210131', '03032210132', '03032210133', '03032210301', '03032210310', '03032210311', '03033012031', '03033012032', '03033012033', '03033012120', '03033012122', '03033012201', '03033012210', '03033012211', '03033012212', '03033012213', '03033012300', '03033012302', '03113321330', '03113321331', '03113321332', '03113321333', '03113322302', '03113322303', '03113322320', '03113322321', '03113322323', '03113322330', '03113322331', '03113322332', '03113322333', '03113323110', '03113323111', '03113323112', '03113323113', '03113323203', '03113323212', '03113323213', '03113323220', '03113323221', '03113323222', '03113323223', '03113323231', '03113323232', '03113323233', '03113323300', '03113323302', '03113323303', '03113323312', '03113323320', '03113323321', '03113323322', '03113323323', '03113323330', '03113323331', '03113323332', '03113330011', '03113330013', '03113330031', '03113330102', '03113330120', '03113330202', '03113330203', '03113330212', '03113330220', '03113330221', '03113330222', '03113330223', '03113330230', '03113332000', '03113332001', '03113332002', '03131010323', '03131010332', '03131012110', '03131013121', '03131013123', '03131013130', '03131013131', '03131013132', '03131013133', '03131013211', '03131013213', '03131013300', '03131013301', '03131013302', '03131013310', '03131013311', '03131023011', '03131023100', '03131023312', '03131023313', '03131023330', '03131023331', '03131031201', '03131031203', '03131031210', '03131031212', '03131031231', '03131031232', '03131031233', '03131031320', '03131031321', '03131031322', '03131031323', '03131031332', '03131033010', '03131033011', '03131033100', '03131033101', '03131033102', '03131033103', '03131033110', '03131033200', '03131100111', '03131100121', '03131100123', '03131100130', '03131100132', '03131101000', '03131101001', '03131101010', '03131102020', '03131102022', '03131103110', '03131103111', '03131103112', '03131103113', '03131110332', '03131110333', '03131111222', '03131112110', '03131112111', '03131112112', '03131112113', '03131112310', '03131112311', '03131113000', '03131113002', '03131113020', '03131113021', '03131113022', '03131113023', '03131113200', '03131113201', '03131113321', '03131113323', '03131121111', '03131121113', '03131121130', '03131121131', '03131121132', '03131121133', '03131121310', '03131121311', '03131121312', '03131121313', '03131121321', '03131121322', '03131121323', '03131121330', '03131121331', '03131121332', '03131121333', '03131123011', '03131123100', '03131123101', '03131123110', '03131123111', '03131123112', '03131123113', '03131123313', '03131123331', '03131130000', '03131130002', '03131130022', '03131130023', '03131130031', '03131130032', '03131130033', '03131130112', '03131130113', '03131130121', '03131130122', '03131130123', '03131130130', '03131130131', '03131130132', '03131130133', '03131130200', '03131130201', '03131130202', '03131130203', '03131130210', '03131130211', '03131130212', '03131130213', '03131130220', '03131130221', '03131130222', '03131130223', '03131130230', '03131130231', '03131130232', '03131130233', '03131130300', '03131130301', '03131130302', '03131130303', '03131130310', '03131130311', '03131130312', '03131130313', '03131130320', '03131130322', '03131130331', '03131130333', '03131131003', '03131131012', '03131131020', '03131131021', '03131131022', '03131131030', '03131131123', '03131131132', '03131131200', '03131131202', '03131131203', '03131131211', '03131131212', '03131131213', '03131131220', '03131131221', '03131131222', '03131131230', '03131131231', '03131131300', '03131131301', '03131131302', '03131131310', '03131131313', '03131131320', '03131131331', '03131132000', '03131132001', '03131132002', '03131132003', '03131132010', '03131132011', '03131132012', '03131132021', '03131132030', '03131132031', '03131132032', '03131132033', '03131132100', '03131132111', '03131132113', '03131132120', '03131132122', '03131132132', '03131132133', '03131132202', '03131132203', '03131132211', '03131132212', '03131132213', '03131132220', '03131132221', '03131132230', '03131132231', '03131132233', '03131132300', '03131132302', '03131132310', '03131132311', '03131132320', '03131132321', '03131132322', '03131132323', '03131132330', '03131132332', '03131132333', '03131133000', '03131133002', '03131133003', '03131133020', '03131133021', '03131133022', '03131133023', '03131133030', '03131133032', '03131133100', '03131133101', '03131133102', '03131133103', '03131133200', '03131133201', '03131133203', '03131133210', '03131133212', '03131133220', '03131133221', '03131133222', '03131133223', '03131133230', '03131133232', '03131133323', '03131133330', '03131133332', '03131201311', '03131201313', '03131201331', '03131210202', '03131211012', '03131211013', '03131301222', '03131301223', '03131301232', '03131301323', '03131301332', '03131301333', '03131303000', '03131303001', '03131303010', '03131303101', '03131303102', '03131303103', '03131303110', '03131303111', '03131303112', '03131303120', '03131303121', '03131303130', '03131303131', '03131303133', '03131303233', '03131303312', '03131303322', '03131310010', '03131310011', '03131310012', '03131310013', '03131310022', '03131310023', '03131310031', '03131310033', '03131310100', '03131310101', '03131310102', '03131310103', '03131310110', '03131310111', '03131310112', '03131310113', '03131310120', '03131310121', '03131310130', '03131310131', '03131310200', '03131310201', '03131310211', '03131310212', '03131310213', '03131310230', '03131310231', '03131310300', '03131310302', '03131310323', '03131310332', '03131311000', '03131311001', '03131311002', '03131311003', '03131311011', '03131311012', '03131311013', '03131311030', '03131311031', '03131311032', '03131311033', '03131311100', '03131311102', '03131311113', '03131311120', '03131311121', '03131311122', '03131311123', '03131311131', '03131311210', '03131311211', '03131311213', '03131311220', '03131311221', '03131311222', '03131311223', '03131311231', '03131311232', '03131311233', '03131311300', '03131311301', '03131311302', '03131311303', '03131311310', '03131311312', '03131311313', '03131311320', '03131311321', '03131311322', '03131311323', '03131311330', '03131311331', '03131311332', '03131311333', '03131312000', '03131312001', '03131312002', '03131312003', '03131312010', '03131312012', '03131312013', '03131312020', '03131312021', '03131312022', '03131312030', '03131312031', '03131312101', '03131312103', '03131312110', '03131312112', '03131312312', '03131312313', '03131312322', '03131312323', '03131312330', '03131312331', '03131312332', '03131312333', '03131313001', '03131313002', '03131313003', '03131313010', '03131313011', '03131313012', '03131313013', '03131313020', '03131313021', '03131313023', '03131313030', '03131313031', '03131313032', '03131313033', '03131313100', '03131313101', '03131313102', '03131313103', '03131313110', '03131313111', '03131313112', '03131313113', '03131313120', '03131313121', '03131313122', '03131313123', '03131313130', '03131313131', '03131313132', '03131313133', '03131313202', '03131313203', '03131313210', '03131313211', '03131313212', '03131313220', '03131313221', '03131313222', '03131313223', '03131313230', '03131313232', '03131313233', '03131313300', '03131313301', '03131313310', '03131313311', '03131313312', '03131313313', '03131313320', '03131313321', '03131313322', '03131313323', '03131313330', '03131313331', '03131313332', '03131313333', '03131320131', '03131320133', '03131321011', '03131321013', '03131321020', '03131321021', '03131321022', '03131321023', '03131321031', '03131321033', '03131321100', '03131321102', '03131321120', '03131330001', '03131330003', '03131330010', '03131330012', '03131330100', '03131330101', '03131330110', '03131330111', '03131333303', '03131333312', '03131333321', '03131333330', '03133101222', '03133101223', '03133103000', '03133103001', '03133103102', '03133103103', '03133103120', '03133103121', '03133110323', '03133110330', '03133110332', '03133111233', '03133112213', '03133112230', '03133112231', '03133112312', '03133112313', '03133112330', '03133112331', '03133112332', '03133112333', '03133113122', '03133113123', '03133113232', '03133113233', '03133113300', '03133113301', '03133131010', '03133131011', '03133131222', '03133131223', '03133131303', '03133131321', '03133212322', '03133212323', '03133213123', '03133213132', '03133213133', '03133213301', '03133213310', '03133213311', '03133213312', '03133213313', '03133213330', '03133213331', '03133221113', '03133221310', '03133221311', '03133221312', '03133221313', '03133221321', '03133221330', '03133221331', '03133221332', '03133223133', '03133223311', '03133223312', '03133223313', '03133223330', '03133223331', '03133223332', '03133223333', '03133230002', '03133230100', '03133230101', '03133230212', '03133230213', '03133230231', '03133231032', '03133231133', '03133231210', '03133232022', '03133232200', '03133232201', '03133233133', '03133233310', '03133233311', '03133233333', '03133302200', '03133303201', '03133303202', '03133303203', '03133303210', '03133303212', '03133303220', '03133303221', '03133311102', '03133311103', '03133311120', '03133311121', '03133312221', '03133312223', '03133312230', '03133312231', '03133312232', '03133312233', '03133312303', '03133312312', '03133312320', '03133312321', '03133312322', '03133313303', '03133313312', '03133313321', '03133313330', '03133320022', '03133320332', '03133321212', '03133321213', '03133322110', '03133322120', '03133322121', '03133322122', '03133322123', '03133322222', '03133323222', '03133330001', '03133330002', '03133330003', '03133330010', '03133330011', '03133330012', '03133330021', '03133330100', '03133330112', '03133330130', '03133331321', '03133331323', '03133331332', '03133332003', '03133332012', '03133332021', '03133332030', '03133333021', '03133333023', '03133333030', '03133333031', '03133333032', '03133333033', '03200000001', '03200000002', '03200000003', '03200000010', '03200000011', '03200000012', '03200000013', '03200000020', '03200000021', '03200000022', '03200000023', '03200000030', '03200000032', '03200000033', '03200000103', '03200000112', '03200000113', '03200000120', '03200000121', '03200000122', '03200000123', '03200000130', '03200000131', '03200000132', '03200000133', '03200000202', '03200000220', '03200000222', '03200000232', '03200000300', '03200000301', '03200000302', '03200000303', '03200000310', '03200000311', '03200000312', '03200000313', '03200000320', '03200000321', '03200000322', '03200000323', '03200000330', '03200000331', '03200000332', '03200000333', '03200001001', '03200001002', '03200001010', '03200001011', '03200001020', '03200001022', '03200001100', '03200001101', '03200001110', '03200001200', '03200001202', '03200001203', '03200001210', '03200001212', '03200001220', '03200001221', '03200001223', '03200001230', '03200001231', '03200001232', '03200002000', '03200002001', '03200002002', '03200002003', '03200002010', '03200002012', '03200002020', '03200002021', '03200002022', '03200002030', '03200002100', '03200002101', '03200002102', '03200002103', '03200002110', '03200002111', '03200002112', '03200002113', '03200002120', '03200002121', '03200002130', '03200002131', '03200002220', '03200002222', '03200003002', '03200003003', '03200003012', '03200003013', '03200003020', '03200003021', '03200003022', '03200003023', '03200003030', '03200003031', '03200003032', '03200003033', '03200003121', '03200003123', '03200003130', '03200003131', '03200003132', '03200003133', '03200003200', '03200003201', '03200003210', '03200003211', '03200003301', '03200003310', '03200003311', '03200010022', '03200010023', '03200010032', '03200010200', '03200010201', '03200010202', '03200010203', '03200010210', '03200010212', '03200010213', '03200010230', '03200010231', '03200010232', '03200010233', '03200010302', '03200010303', '03200010311', '03200010312', '03200010313', '03200010320', '03200010321', '03200010322', '03200010323', '03200010330', '03200010331', '03200010332', '03200010333', '03200011000', '03200011001', '03200011002', '03200011003', '03200011010', '03200011011', '03200011012', '03200011020', '03200011021', '03200011030', '03200011100', '03200011101', '03200011111', '03200011113', '03200011131', '03200011200', '03200011201', '03200011202', '03200011203', '03200011210', '03200011211', '03200011212', '03200011213', '03200011220', '03200011221', '03200011222', '03200011223', '03200011230', '03200011231', '03200011232', '03200011233', '03200011313', '03200011322', '03200011323', '03200011331', '03200011333', '03200012010', '03200012011', '03200012012', '03200012013', '03200012020', '03200012030', '03200012031', '03200012032', '03200012033', '03200012100', '03200012101', '03200012102', '03200012103', '03200012110', '03200012111', '03200012112', '03200012113', '03200012120', '03200012121', '03200012122', '03200012123', '03200012130', '03200012131', '03200012132', '03200012133', '03200012210', '03200012211', '03200012212', '03200012213', '03200012230', '03200012231', '03200012232', '03200012233', '03200012300', '03200012301', '03200012302', '03200012303', '03200012310', '03200012311', '03200012320', '03200012321', '03200012322', '03200012323', '03200013000', '03200013001', '03200013010', '03200013011', '03200013012', '03200013013', '03200013021', '03200013022', '03200013023', '03200013030', '03200013032', '03200013100', '03200013101', '03200013102', '03200013103', '03200013111', '03200013113', '03200013121', '03200013123', '03200013130', '03200013131', '03200013132', '03200013133', '03200013200', '03200013201', '03200013202', '03200013203', '03200013210', '03200013212', '03200013220', '03200013221', '03200013301', '03200013303', '03200013310', '03200013311', '03200013312', '03200013313', '03200013321', '03200013323', '03200013330', '03200013331', '03200013332', '03200013333', '03200020000', '03200020001', '03200020002', '03200020003', '03200020010', '03200020012', '03200020020', '03200020021', '03200020022', '03200020023', '03200020200', '03200020201', '03200021301', '03200021303', '03200021310', '03200021312', '03200021321', '03200021323', '03200021330', '03200022121', '03200022123', '03200022130', '03200022131', '03200022132', '03200022133', '03200022310', '03200022311', '03200022313', '03200023020', '03200023022', '03200023113', '03200023130', '03200023131', '03200023132', '03200023133', '03200023200', '03200023202', '03200023311', '03200023313', '03200023332', '03200023333', '03200030113', '03200030130', '03200030131', '03200030132', '03200030133', '03200030211', '03200030213', '03200030231', '03200030300', '03200030301', '03200030302', '03200030303', '03200030310', '03200030311', '03200030312', '03200030313', '03200030320', '03200030321', '03200030322', '03200030323', '03200030330', '03200030331', '03200030332', '03200030333', '03200031002', '03200031003', '03200031012', '03200031020', '03200031021', '03200031022', '03200031023', '03200031030', '03200031032', '03200031033', '03200031101', '03200031103', '03200031110', '03200031111', '03200031112', '03200031113', '03200031120', '03200031121', '03200031122', '03200031123', '03200031130', '03200031131', '03200031132', '03200031200', '03200031201', '03200031202', '03200031203', '03200031210', '03200031211', '03200031212', '03200031213', '03200031220', '03200031231', '03200031300', '03200031301', '03200031302', '03200031303', '03200031310', '03200031311', '03200031312', '03200031313', '03200031320', '03200031321', '03200031323', '03200031330', '03200031331', '03200031332', '03200031333', '03200032002', '03200032020', '03200032021', '03200032022', '03200032023', '03200032200', '03200032201', '03200032202', '03200032203', '03200032211', '03200032213', '03200032231', '03200032300', '03200032301', '03200032302', '03200032303', '03200032320', '03200033110', '03200033111', '03200033113', '03200100000', '03200100001', '03200100002', '03200100003', '03200100010', '03200100011', '03200100012', '03200100020', '03200100021', '03200100030', '03200100132', '03200100133', '03200100202', '03200100203', '03200100212', '03200100220', '03200100221', '03200100222', '03200100223', '03200100230', '03200100231', '03200100232', '03200100233', '03200100310', '03200100311', '03200100312', '03200100313', '03200100320', '03200100321', '03200100322', '03200100323', '03200100330', '03200100331', '03200100332', '03200100333', '03200101001', '03200101003', '03200101010', '03200101011', '03200101012', '03200101013', '03200101022', '03200101031', '03200101033', '03200101100', '03200101101', '03200101102', '03200101103', '03200101110', '03200101111', '03200101112', '03200101113', '03200101120', '03200101121', '03200101122', '03200101130', '03200101131', '03200101133', '03200101200', '03200101201', '03200101202', '03200101203', '03200101212', '03200101213', '03200101220', '03200101221', '03200101222', '03200101223', '03200101230', '03200101231', '03200101232', '03200101233', '03200101302', '03200101303', '03200101312', '03200101313', '03200101320', '03200101321', '03200101322', '03200101323', '03200101330', '03200101331', '03200101332', '03200101333', '03200102000', '03200102001', '03200102002', '03200102003', '03200102010', '03200102011', '03200102012', '03200102013', '03200102020', '03200102021', '03200102022', '03200102023', '03200102030', '03200102031', '03200102032', '03200102100', '03200102101', '03200102102', '03200102103', '03200102110', '03200102111', '03200102112', '03200102113', '03200102120', '03200102121', '03200102122', '03200102123', '03200102130', '03200102131', '03200102132', '03200102133', '03200102200', '03200102201', '03200102202', '03200102203', '03200102210', '03200102212', '03200102220', '03200102221', '03200102222', '03200102223', '03200102230', '03200102232', '03200102300', '03200102301', '03200102303', '03200102310', '03200102311', '03200102312', '03200102313', '03200103000', '03200103001', '03200103002', '03200103003', '03200103010', '03200103011', '03200103012', '03200103013', '03200103020', '03200103021', '03200103022', '03200103023', '03200103030', '03200103031', '03200103100', '03200103101', '03200103102', '03200103103', '03200103110', '03200103111', '03200103112', '03200103113', '03200103133', '03200103200', '03200103201', '03200103202', '03200103203', '03200103310', '03200103311', '03200103312', '03200103313', '03200103330', '03200103331', '03200110000', '03200110001', '03200110002', '03200110003', '03200110010', '03200110011', '03200110012', '03200110013', '03200110020', '03200110021', '03200110030', '03200110031', '03200110033', '03200110100', '03200110101', '03200110102', '03200110103', '03200110110', '03200110111', '03200110112', '03200110113', '03200110120', '03200110121', '03200110122', '03200110123', '03200110130', '03200110131', '03200110132', '03200110133', '03200110301', '03200110303', '03200110310', '03200110311', '03200110312', '03200110313', '03200110321', '03200110323', '03200110330', '03200110331', '03200110332', '03200110333', '03200111000', '03200111001', '03200111002', '03200111003', '03200111010', '03200111012', '03200111020', '03200111021', '03200111022', '03200111023', '03200111030', '03200111031', '03200111032', '03200111033', '03200111113', '03200111122', '03200111123', '03200111131', '03200111132', '03200111133', '03200111200', '03200111201', '03200111202', '03200111203', '03200111210', '03200111211', '03200111212', '03200111213', '03200111220', '03200111221', '03200111222', '03200111223', '03200111230', '03200111231', '03200111232', '03200111233', '03200111300', '03200111301', '03200111302', '03200111303', '03200111310', '03200111311', '03200111312', '03200111313', '03200111320', '03200111321', '03200111322', '03200111323', '03200111330', '03200112022', '03200112023', '03200112101', '03200112103', '03200112110', '03200112111', '03200112112', '03200112113', '03200112200', '03200112201', '03200112202', '03200112203', '03200112210', '03200112220', '03200113000', '03200113001', '03200113002', '03200113003', '03200113010', '03200113011', '03200113012', '03200113013', '03200113100', '03200113102', '03200113111', '03200113113', '03200120000', '03200120001', '03200120010', '03200120120', '03200120121', '03200120122', '03200120123', '03200120132', '03200120200', '03200120202', '03200120211', '03200120213', '03200120220', '03200120221', '03200120222', '03200120223', '03200120300', '03200120301', '03200120302', '03200120303', '03200120310', '03200120311', '03200120312', '03200120320', '03200120321', '03200121013', '03200121030', '03200121031', '03200121032', '03200121033', '03200121102', '03200121103', '03200121113', '03200121120', '03200121121', '03200121122', '03200121123', '03200121130', '03200121131', '03200121132', '03200121133', '03200121211', '03200121222', '03200121223', '03200121232', '03200121233', '03200121300', '03200121310', '03200121311', '03200121312', '03200121313', '03200122000', '03200122001', '03200122002', '03200122003', '03200123000', '03200123001', '03200123002', '03200123003', '03200123010', '03200123011', '03200123012', '03200123013', '03200123020', '03200123021', '03200123023', '03200123030', '03200123031', '03200123032', '03200123033', '03200123100', '03200123101', '03200123102', '03200123103', '03200123120', '03200123121', '03200123122', '03200123123', '03200123132', '03200123210', '03200123211', '03200123213', '03200123231', '03200123233', '03200123300', '03200123301', '03200123302', '03200123303', '03200123310', '03200123312', '03200123320', '03200123321', '03200123322', '03200123323', '03200123330', '03200130020', '03200130022', '03200130123', '03200130200', '03200130201', '03200130202', '03200130203', '03200130301', '03200130310', '03200132001', '03200132003', '03200132010', '03200132011', '03200132012', '03200132013', '03200132021', '03200132023', '03200132030', '03200132031', '03200132032', '03200132033', '03200132102', '03200132120', '03200132122', '03200133020', '03200133021', '03200133022', '03200133023', '03200133102', '03200133103', '03200133120', '03200133121', '03200133130', '03200200001', '03200200002', '03200200003', '03200200010', '03200200011', '03200200012', '03200200013', '03200200020', '03200200021', '03200200022', '03200200023', '03200200030', '03200200031', '03200200032', '03200200033', '03200200100', '03200200101', '03200200102', '03200200103', '03200200110', '03200200111', '03200200112', '03200200113', '03200200120', '03200200121', '03200200122', '03200200123', '03200200130', '03200200131', '03200200132', '03200200133', '03200200200', '03200200201', '03200200210', '03200200211', '03200200213', '03200200300', '03200200301', '03200200302', '03200200303', '03200200310', '03200200311', '03200200312', '03200200313', '03200200320', '03200200321', '03200200330', '03200201000', '03200201001', '03200201002', '03200201003', '03200201010', '03200201011', '03200201012', '03200201013', '03200201020', '03200201021', '03200201022', '03200201023', '03200201030', '03200201031', '03200201032', '03200201033', '03200201110', '03200201111', '03200201112', '03200201113', '03200201200', '03200201201', '03200201202', '03200201203', '03200201210', '03200201211', '03200201212', '03200201213', '03200201223', '03200201232', '03200201233', '03200202000', '03200202001', '03200202002', '03200202003', '03200202010', '03200202012', '03200202020', '03200202021', '03200202022', '03200202023', '03200202030', '03200202031', '03200202032', '03200202033', '03200202120', '03200202121', '03200202122', '03200202123', '03200202130', '03200202131', '03200202132', '03200202133', '03200202200', '03200202201', '03200202202', '03200202203', '03200202210', '03200202211', '03200202212', '03200202213', '03200202220', '03200202221', '03200202222', '03200202223', '03200202230', '03200202231', '03200202232', '03200202233', '03200202300', '03200202301', '03200202302', '03200202303', '03200202310', '03200202311', '03200202312', '03200202313', '03200202320', '03200202321', '03200202322', '03200202323', '03200202330', '03200202331', '03200202332', '03200202333', '03200203001', '03200203003', '03200203010', '03200203011', '03200203012', '03200203013', '03200203020', '03200203021', '03200203022', '03200203023', '03200203030', '03200203031', '03200203032', '03200203033', '03200203200', '03200203201', '03200203202', '03200203203', '03200203210', '03200203212', '03200203213', '03200203220', '03200203221', '03200203222', '03200203223', '03200203230', '03200203231', '03200203232', '03200203233', '03200203302', '03200203303', '03200203312', '03200203320', '03200203321', '03200203322', '03200203323', '03200203330', '03200203332', '03200203333', '03200210000', '03200210002', '03200210003', '03200210012', '03200210013', '03200210020', '03200210021', '03200210022', '03200210023', '03200210030', '03200210031', '03200210032', '03200210033', '03200210120', '03200210122', '03200210200', '03200210201', '03200210210', '03200210211', '03200210212', '03200210213', '03200210230', '03200210231', '03200210232', '03200210233', '03200210300', '03200210301', '03200210302', '03200210303', '03200210310', '03200210320', '03200210321', '03200210322', '03200210323', '03200211131', '03200211133', '03200211233', '03200211301', '03200211303', '03200211310', '03200211311', '03200211312', '03200211313', '03200211321', '03200211322', '03200211330', '03200211331', '03200211332', '03200212010', '03200212011', '03200212013', '03200212030', '03200212031', '03200212032', '03200212033', '03200212100', '03200212101', '03200212102', '03200212120', '03200212121', '03200212122', '03200212123', '03200212202', '03200212203', '03200212210', '03200212211', '03200212212', '03200212213', '03200212220', '03200212221', '03200212222', '03200212223', '03200212230', '03200212231', '03200212232', '03200212233', '03200212300', '03200212301', '03200212302', '03200212303', '03200212312', '03200212313', '03200212320', '03200212321', '03200212322', '03200212323', '03200212330', '03200212331', '03200212332', '03200212333', '03200213003', '03200213010', '03200213011', '03200213012', '03200213013', '03200213021', '03200213022', '03200213023', '03200213030', '03200213031', '03200213032', '03200213033', '03200213100', '03200213101', '03200213102', '03200213103', '03200213110', '03200213112', '03200213113', '03200213120', '03200213121', '03200213122', '03200213123', '03200213130', '03200213131', '03200213132', '03200213133', '03200213200', '03200213201', '03200213202', '03200213203', '03200213210', '03200213211', '03200213220', '03200213221', '03200213222', '03200213223', '03200213300', '03200213330', '03200213332', '03200213333', '03200220000', '03200220001', '03200220002', '03200220003', '03200220010', '03200220011', '03200220012', '03200220013', '03200220020', '03200220021', '03200220022', '03200220023', '03200220030', '03200220031', '03200220032', '03200220033', '03200220100', '03200220101', '03200220102', '03200220103', '03200220110', '03200220111', '03200220112', '03200220113', '03200220120', '03200220121', '03200220122', '03200220123', '03200220130', '03200220131', '03200220132', '03200220133', '03200220200', '03200220201', '03200220202', '03200220203', '03200220210', '03200220211', '03200220212', '03200220213', '03200220220', '03200220221', '03200220222', '03200220223', '03200220230', '03200220231', '03200220232', '03200220233', '03200220300', '03200220301', '03200220302', '03200220303', '03200220310', '03200220311', '03200220312', '03200220313', '03200220320', '03200220321', '03200220322', '03200220323', '03200220330', '03200220331', '03200220332', '03200220333', '03200221000', '03200221001', '03200221002', '03200221003', '03200221010', '03200221011', '03200221012', '03200221013', '03200221020', '03200221021', '03200221022', '03200221023', '03200221030', '03200221031', '03200221032', '03200221033', '03200221100', '03200221101', '03200221102', '03200221103', '03200221110', '03200221111', '03200221112', '03200221113', '03200221120', '03200221121', '03200221122', '03200221123', '03200221130', '03200221131', '03200221132', '03200221133', '03200221200', '03200221201', '03200221202', '03200221203', '03200221210', '03200221211', '03200221212', '03200221213', '03200221220', '03200221221', '03200221222', '03200221223', '03200221230', '03200221231', '03200221232', '03200221233', '03200221300', '03200221301', '03200221302', '03200221303', '03200221310', '03200221311', '03200221312', '03200221313', '03200221320', '03200221321', '03200221322', '03200221323', '03200221330', '03200221331', '03200221332', '03200221333', '03200222000', '03200222001', '03200222002', '03200222003', '03200222010', '03200222011', '03200222012', '03200222013', '03200222020', '03200222021', '03200222022', '03200222023', '03200222030', '03200222031', '03200222032', '03200222033', '03200222100', '03200222101', '03200222102', '03200222103', '03200222110', '03200222111', '03200222112', '03200222113', '03200222120', '03200222121', '03200222122', '03200222123', '03200222130', '03200222131', '03200222132', '03200222133', '03200222200', '03200222201', '03200222202', '03200222203', '03200222210', '03200222211', '03200222212', '03200222213', '03200222220', '03200222221', '03200222222', '03200222223', '03200222230', '03200222231', '03200222232', '03200222233', '03200222300', '03200222301', '03200222302', '03200222303', '03200222310', '03200222311', '03200222312', '03200222313', '03200222320', '03200222321', '03200222322', '03200222323', '03200222330', '03200222331', '03200222332', '03200222333', '03200223000', '03200223001', '03200223002', '03200223003', '03200223010', '03200223011', '03200223012', '03200223013', '03200223020', '03200223021', '03200223022', '03200223023', '03200223100', '03200223101', '03200223102', '03200223103', '03200223110', '03200223111', '03200223112', '03200223113', '03200223200', '03200223201', '03200223202', '03200223203', '03200223220', '03200223221', '03200230000', '03200230001', '03200230002', '03200230003', '03200230010', '03200230011', '03200230012', '03200230013', '03200230020', '03200230021', '03200230022', '03200230023', '03200230030', '03200230031', '03200230032', '03200230033', '03200230100', '03200230101', '03200230102', '03200230103', '03200230110', '03200230111', '03200230112', '03200230113', '03200230120', '03200230121', '03200230122', '03200230123', '03200230130', '03200230131', '03200230132', '03200230133', '03200230200', '03200230201', '03200230202', '03200230203', '03200230210', '03200230211', '03200230212', '03200230213', '03200230220', '03200230221', '03200230222', '03200230223', '03200230230', '03200230231', '03200230232', '03200230300', '03200230301', '03200230302', '03200230310', '03200230311', '03200230312', '03200230313', '03200231000', '03200231002', '03200231020', '03200231021', '03200231022', '03200231023', '03200231101', '03200231103', '03200231110', '03200231111', '03200231112', '03200231113', '03200231120', '03200231121', '03200231122', '03200231123', '03200231130', '03200231131', '03200231132', '03200231133', '03200231200', '03200231201', '03200231202', '03200231300', '03200231301', '03200231302', '03200231303', '03200231310', '03200231311', '03200231312', '03200231313', '03200231321', '03200231323', '03200231330', '03200231331', '03200231332', '03200231333', '03200232000', '03200232120', '03200232121', '03200232122', '03200232123', '03200232130', '03200232131', '03200232132', '03200232133', '03200232211', '03200232213', '03200232231', '03200232300', '03200232301', '03200232302', '03200232303', '03200232310', '03200232311', '03200232312', '03200232313', '03200232320', '03200232321', '03200232322', '03200232323', '03200232330', '03200232331', '03200232332', '03200233020', '03200233021', '03200233022', '03200233023', '03200233030', '03200233031', '03200233032', '03200233033', '03200233111', '03200233122', '03200233123', '03200233132', '03200233200', '03200233201', '03200233203', '03200233210', '03200233211', '03200233212', '03200233300', '03200233301', '03200233302', '03200233303', '03200233310', '03200300003', '03200300012', '03200300020', '03200300021', '03200300022', '03200300023', '03200300030', '03200300031', '03200300032', '03200300033', '03200300120', '03200300122', '03200300200', '03200300201', '03200300202', '03200300203', '03200300210', '03200300211', '03200300212', '03200300213', '03200300220', '03200300221', '03200300222', '03200300223', '03200300230', '03200300231', '03200300232', '03200300233', '03200300300', '03200300302', '03200300320', '03200300322', '03200300323', '03200300332', '03200300333', '03200301011', '03200301013', '03200301100', '03200301101', '03200301102', '03200301203', '03200301212', '03200301221', '03200301222', '03200301223', '03200301230', '03200301231', '03200301232', '03200301233', '03200301320', '03200301322', '03200302001', '03200302002', '03200302003', '03200302010', '03200302011', '03200302012', '03200302013', '03200302020', '03200302021', '03200302022', '03200302023', '03200302030', '03200302031', '03200302032', '03200302100', '03200302101', '03200302102', '03200302110', '03200302111', '03200302131', '03200302132', '03200302133', '03200302201', '03200302202', '03200302203', '03200302210', '03200302211', '03200302212', '03200302213', '03200302220', '03200302221', '03200302222', '03200302223', '03200302230', '03200302231', '03200302232', '03200302233', '03200302301', '03200302303', '03200302310', '03200302311', '03200302312', '03200302313', '03200302320', '03200302322', '03200302330', '03200302331', '03200302333', '03200303001', '03200303003', '03200303010', '03200303011', '03200303012', '03200303013', '03200303020', '03200303021', '03200303022', '03200303023', '03200303030', '03200303031', '03200303032', '03200303033', '03200303100', '03200303102', '03200303103', '03200303112', '03200303120', '03200303121', '03200303122', '03200303123', '03200303130', '03200303132', '03200303133', '03200303200', '03200303201', '03200303202', '03200303203', '03200303210', '03200303211', '03200303212', '03200303213', '03200303220', '03200303221', '03200303222', '03200303223', '03200303230', '03200303231', '03200303232', '03200303300', '03200303301', '03200303302', '03200303303', '03200303310', '03200303311', '03200303312', '03200303321', '03200303330', '03200310123', '03200310130', '03200310131', '03200310132', '03200310133', '03200310233', '03200310301', '03200310310', '03200310311', '03200310313', '03200310322', '03200310323', '03200310332', '03200310333', '03200311020', '03200311021', '03200311022', '03200311023', '03200311030', '03200311031', '03200311032', '03200311033', '03200311120', '03200311121', '03200311122', '03200311123', '03200311130', '03200311131', '03200311132', '03200311133', '03200311200', '03200311201', '03200311202', '03200311203', '03200311210', '03200311211', '03200311212', '03200311213', '03200311220', '03200311221', '03200311222', '03200311223', '03200311230', '03200311231', '03200311232', '03200311233', '03200311300', '03200311301', '03200311302', '03200311303', '03200311310', '03200311311', '03200311312', '03200311313', '03200311330', '03200311331', '03200311332', '03200311333', '03200312000', '03200312001', '03200312002', '03200312003', '03200312010', '03200312011', '03200312012', '03200312013', '03200312020', '03200312021', '03200312022', '03200312023', '03200312030', '03200312031', '03200312032', '03200312033', '03200312100', '03200312101', '03200312102', '03200312103', '03200312110', '03200312111', '03200312112', '03200312113', '03200312120', '03200312121', '03200312122', '03200312123', '03200312130', '03200312131', '03200312132', '03200312133', '03200312200', '03200312201', '03200312210', '03200312211', '03200312300', '03200312301', '03200312310', '03200312311', '03200313000', '03200313001', '03200313002', '03200313003', '03200313012', '03200313013', '03200313020', '03200313021', '03200313022', '03200313023', '03200313030', '03200313031', '03200313032', '03200313033', '03200313112', '03200313113', '03200313120', '03200313122', '03200313123', '03200313130', '03200313131', '03200313132', '03200313133', '03200313200', '03200313201', '03200313210', '03200313211', '03200313232', '03200313233', '03200313310', '03200313311', '03200320000', '03200320001', '03200320002', '03200320003', '03200320010', '03200320011', '03200320012', '03200320013', '03200320020', '03200320021', '03200320022', '03200320023', '03200320030', '03200320031', '03200320032', '03200320033', '03200320100', '03200320102', '03200320103', '03200320112', '03200320120', '03200320121', '03200320122', '03200320123', '03200320130', '03200320132', '03200320200', '03200320201', '03200320202', '03200320203', '03200320210', '03200320211', '03200320212', '03200320213', '03200320220', '03200320221', '03200320222', '03200320223', '03200320230', '03200320231', '03200320232', '03200320300', '03200320302', '03200320320', '03200321131', '03200321133', '03200321301', '03200321302', '03200321303', '03200321310', '03200321311', '03200321312', '03200321313', '03200321320', '03200321321', '03200321322', '03200321323', '03200321330', '03200321331', '03200321332', '03200322000', '03200322001', '03200322012', '03200322013', '03200322030', '03200322031', '03200322033', '03200322102', '03200322103', '03200322120', '03200322121', '03200322122', '03200322211', '03200322300', '03200322301', '03200323123', '03200323132', '03200323133', '03200323301', '03200323303', '03200323310', '03200323311', '03200323312', '03200323313', '03200323321', '03200323330', '03200323331', '03200330000', '03200330001', '03200330002', '03200330003', '03200330010', '03200330011', '03200330012', '03200330013', '03200330020', '03200330021', '03200330022', '03200330023', '03200330030', '03200330031', '03200330032', '03200330033', '03200330100', '03200330102', '03200330103', '03200330120', '03200330121', '03200330122', '03200330123', '03200330200', '03200330201', '03200330210', '03200330211', '03200331000', '03200331001', '03200331002', '03200331003', '03200331010', '03200331011', '03200331012', '03200331013', '03200331020', '03200331021', '03200331023', '03200331030', '03200331031', '03200331032', '03200331033', '03200331120', '03200331122', '03200331123', '03200331131', '03200331132', '03200331133', '03200331222', '03200331223', '03200331310', '03200331311', '03200331312', '03200332031', '03200332033', '03200332110', '03200332111', '03200332112', '03200332113', '03200332120', '03200332121', '03200332122', '03200332123', '03200332131', '03200332132', '03200332133', '03200332200', '03200332202', '03200332203', '03200332211', '03200332212', '03200332213', '03200332220', '03200332221', '03200332222', '03200332223', '03200332230', '03200332231', '03200332232', '03200332233', '03200332300', '03200332301', '03200332302', '03200332303', '03200332310', '03200332312', '03200332320', '03200332321', '03200332322', '03200332330', '03200333000', '03200333001', '03200333002', '03200333003', '03200333012', '03200333020', '03200333021', '03200333022', '03200333023', '03200333030', '03201000002', '03201000003', '03201000010', '03201000011', '03201000012', '03201000013', '03201000020', '03201000021', '03201000022', '03201000023', '03201000030', '03201000031', '03201000032', '03201000033', '03201000100', '03201000101', '03201000102', '03201000103', '03201000110', '03201000111', '03201000112', '03201000113', '03201000120', '03201000121', '03201000130', '03201000200', '03201000201', '03201000202', '03201000203', '03201000210', '03201000211', '03201000212', '03201000220', '03201000221', '03201000222', '03201000223', '03201000230', '03201000232', '03201000233', '03201000311', '03201000312', '03201000313', '03201000330', '03201000331', '03201000332', '03201000333', '03201001000', '03201001001', '03201001002', '03201001021', '03201001023', '03201001030', '03201001031', '03201001032', '03201001033', '03201001101', '03201001103', '03201001110', '03201001111', '03201001112', '03201001113', '03201001120', '03201001121', '03201001122', '03201001123', '03201001130', '03201001131', '03201001132', '03201001133', '03201001200', '03201001201', '03201001202', '03201001203', '03201001210', '03201001211', '03201001212', '03201001213', '03201001220', '03201001221', '03201001222', '03201001223', '03201001230', '03201001231', '03201001232', '03201001233', '03201001300', '03201001301', '03201001302', '03201001303', '03201001310', '03201001311', '03201001312', '03201001313', '03201001320', '03201001321', '03201001322', '03201001323', '03201001330', '03201001331', '03201001332', '03201001333', '03201002000', '03201002002', '03201002012', '03201002013', '03201002030', '03201002031', '03201002102', '03201002103', '03201002110', '03201002111', '03201002112', '03201002113', '03201002120', '03201002121', '03201002122', '03201002123', '03201002130', '03201002131', '03201002132', '03201002133', '03201002301', '03201002303', '03201002310', '03201002311', '03201002312', '03201002313', '03201002321', '03201002330', '03201002331', '03201002332', '03201002333', '03201003000', '03201003001', '03201003002', '03201003003', '03201003010', '03201003011', '03201003012', '03201003013', '03201003020', '03201003021', '03201003022', '03201003023', '03201003030', '03201003031', '03201003032', '03201003033', '03201003100', '03201003101', '03201003102', '03201003103', '03201003110', '03201003111', '03201003112', '03201003113', '03201003120', '03201003121', '03201003122', '03201003123', '03201003130', '03201003131', '03201003132', '03201003133', '03201003200', '03201003201', '03201003202', '03201003203', '03201003210', '03201003211', '03201003212', '03201003213', '03201003220', '03201003221', '03201003222', '03201003223', '03201003230', '03201003231', '03201003232', '03201003233', '03201003300', '03201003301', '03201003302', '03201003303', '03201003310', '03201003311', '03201003312', '03201003320', '03201003321', '03201003322', '03201003323', '03201010000', '03201010001', '03201010002', '03201010003', '03201010010', '03201010011', '03201010012', '03201010013', '03201010020', '03201010021', '03201010022', '03201010023', '03201010030', '03201010031', '03201010032', '03201010033', '03201010100', '03201010101', '03201010102', '03201010103', '03201010110', '03201010111', '03201010112', '03201010113', '03201010120', '03201010121', '03201010122', '03201010123', '03201010130', '03201010131', '03201010132', '03201010133', '03201010200', '03201010201', '03201010202', '03201010203', '03201010210', '03201010211', '03201010212', '03201010213', '03201010220', '03201010221', '03201010222', '03201010223', '03201010230', '03201010231', '03201010232', '03201010233', '03201010300', '03201010301', '03201010302', '03201010303', '03201010310', '03201010311', '03201010312', '03201010313', '03201010320', '03201010321', '03201010322', '03201010323', '03201010330', '03201010331', '03201010332', '03201010333', '03201011000', '03201011001', '03201011002', '03201011003', '03201011010', '03201011011', '03201011012', '03201011013', '03201011020', '03201011021', '03201011022', '03201011023', '03201011030', '03201011031', '03201011032', '03201011033', '03201011100', '03201011101', '03201011102', '03201011103', '03201011110', '03201011111', '03201011112', '03201011113', '03201011120', '03201011121', '03201011122', '03201011123', '03201011130', '03201011131', '03201011132', '03201011200', '03201011201', '03201011202', '03201011203', '03201011210', '03201011211', '03201011212', '03201011213', '03201011220', '03201011221', '03201011222', '03201011223', '03201011230', '03201011231', '03201011232', '03201012000', '03201012001', '03201012002', '03201012003', '03201012010', '03201012011', '03201012012', '03201012013', '03201012020', '03201012021', '03201012022', '03201012023', '03201012030', '03201012031', '03201012032', '03201012033', '03201012100', '03201012101', '03201012102', '03201012103', '03201012110', '03201012111', '03201012112', '03201012113', '03201012120', '03201012121', '03201012122', '03201012123', '03201012130', '03201012131', '03201012132', '03201012133', '03201012200', '03201012201', '03201012202', '03201012203', '03201012210', '03201012211', '03201012212', '03201012213', '03201012220', '03201012221', '03201012223', '03201012230', '03201012231', '03201012232', '03201012233', '03201012300', '03201012301', '03201012302', '03201012303', '03201012310', '03201012311', '03201012312', '03201012313', '03201012321', '03201012322', '03201012323', '03201012330', '03201012331', '03201012332', '03201013000', '03201013001', '03201013002', '03201013003', '03201013010', '03201013012', '03201013020', '03201013021', '03201013022', '03201013023', '03201013030', '03201013200', '03201013201', '03201020110', '03201020111', '03201020112', '03201020113', '03201020130', '03201020131', '03201020132', '03201020133', '03201020203', '03201020221', '03201020310', '03201020311', '03201020332', '03201020333', '03201021000', '03201021001', '03201021002', '03201021003', '03201021010', '03201021011', '03201021012', '03201021013', '03201021020', '03201021021', '03201021022', '03201021030', '03201021031', '03201021100', '03201021101', '03201021102', '03201022101', '03201022102', '03201022103', '03201022110', '03201022111', '03201022112', '03201022113', '03201022120', '03201022121', '03201022123', '03201022130', '03201022131', '03201022132', '03201022133', '03201022310', '03201022311', '03201023000', '03201023002', '03201023003', '03201023020', '03201023021', '03201023022', '03201023033', '03201023122', '03201023123', '03201023132', '03201023200', '03201023211', '03201023213', '03201023230', '03201023231', '03201023232', '03201023233', '03201023300', '03201023301', '03201023302', '03201023303', '03201023310', '03201023312', '03201023313', '03201023320', '03201023321', '03201023322', '03201023323', '03201023330', '03201023331', '03201023332', '03201023333', '03201030001', '03201030003', '03201030010', '03201030011', '03201030012', '03201030013', '03201030021', '03201030030', '03201030031', '03201030032', '03201030033', '03201030100', '03201030101', '03201030102', '03201030103', '03201030120', '03201030121', '03201030122', '03201030123', '03201032202', '03201032220', '03201032222', '03201100000', '03201100001', '03201100002', '03201100003', '03201100010', '03201100011', '03201100012', '03201100013', '03201100020', '03201100021', '03201100100', '03201100101', '03201100102', '03201100110', '03201200020', '03201200022', '03201200023', '03201200200', '03201200201', '03201200202', '03201200203', '03201200210', '03201200211', '03201200212', '03201200213', '03201200220', '03201200221', '03201200222', '03201200223', '03201200230', '03201200231', '03201200232', '03201200233', '03201200300', '03201200301', '03201200302', '03201200303', '03201200312', '03201200313', '03201200320', '03201200321', '03201200322', '03201200323', '03201200330', '03201200331', '03201200332', '03201200333', '03201201010', '03201201011', '03201201100', '03201201101', '03201201110', '03201201111', '03201201112', '03201201113', '03201201130', '03201201131', '03201201133', '03201201202', '03201201220', '03201201222', '03201202000', '03201202001', '03201202002', '03201202003', '03201202010', '03201202011', '03201202012', '03201202013', '03201202020', '03201202022', '03201202023', '03201202030', '03201202031', '03201202100', '03201202101', '03201202102', '03201202103', '03201202111', '03201202120', '03201202121', '03201202200', '03201202201', '03201202233', '03201202322', '03201202323', '03201202332', '03201203000', '03201203031', '03201203032', '03201203033', '03201203120', '03201203121', '03201203122', '03201203123', '03201203130', '03201203132', '03201203200', '03201203201', '03201203202', '03201203203', '03201203210', '03201203211', '03201203212', '03201203213', '03201203300', '03201203301', '03201203302', '03201203303', '03201203310', '03201210000', '03201210002', '03201210020', '03201210021', '03201210022', '03201210023', '03201210200', '03201210201', '03201210203', '03201210210', '03201210212', '03201210230', '03201210232', '03201212002', '03201212003', '03201212010', '03201212012', '03201220011', '03201220022', '03201220100', '03201220101', '03201220102', '03201220103', '03201220110', '03201220120', '03201220121', '03201220200', '03202000000', '03202000001', '03202000002', '03202000003', '03202000010', '03202000011', '03202000012', '03202000013', '03202000020', '03202000021', '03202000022', '03202000023', '03202000030', '03202000031', '03202000032', '03202000033', '03202000100', '03202000101', '03202000102', '03202000103', '03202000110', '03202000111', '03202000112', '03202000113', '03202000120', '03202000121', '03202000122', '03202000123', '03202000130', '03202000131', '03202000132', '03202000200', '03202000201', '03202000202', '03202000203', '03202000210', '03202000211', '03202000212', '03202000213', '03202000220', '03202000221', '03202000222', '03202000223', '03202000230', '03202000231', '03202000232', '03202000233', '03202000300', '03202000301', '03202000302', '03202000303', '03202000310', '03202000311', '03202000312', '03202000313', '03202000320', '03202000321', '03202000322', '03202000323', '03202000330', '03202000331', '03202000332', '03202000333', '03202001000', '03202001002', '03202001020', '03202001022', '03202001200', '03202001201', '03202001202', '03202001203', '03202001212', '03202001213', '03202001220', '03202001221', '03202001222', '03202001223', '03202001230', '03202001231', '03202001232', '03202001233', '03202001302', '03202001320', '03202001321', '03202001322', '03202001323', '03202001330', '03202001331', '03202001332', '03202001333', '03202002000', '03202002001', '03202002002', '03202002003', '03202002010', '03202002011', '03202002012', '03202002013', '03202002020', '03202002021', '03202002022', '03202002023', '03202002030', '03202002031', '03202002032', '03202002033', '03202002100', '03202002101', '03202002102', '03202002103', '03202002110', '03202002111', '03202002112', '03202002113', '03202002120', '03202002121', '03202002122', '03202002123', '03202002130', '03202002131', '03202002200', '03202002201', '03202002202', '03202002203', '03202002210', '03202002211', '03202002220', '03202002222', '03202003000', '03202003001', '03202003002', '03202003003', '03202003010', '03202003011', '03202003012', '03202003013', '03202003020', '03202003021', '03202003023', '03202003030', '03202003031', '03202003032', '03202003033', '03202003100', '03202003101', '03202003102', '03202003103', '03202003110', '03202003111', '03202003112', '03202003113', '03202003120', '03202003121', '03202003122', '03202003123', '03202003130', '03202003131', '03202003132', '03202003133', '03202010100', '03202010101', '03202010110', '03202010220', '03202010221', '03202010222', '03202010223', '03202010230', '03202010232', '03202010333', '03202011222', '03202011223', '03202011232', '03202012000', '03202012001', '03202012002', '03202012003', '03202012010', '03202012012', '03202012020', '03202012021', '03202012022', '03202012030', '03202012111', '03202012113', '03202012130', '03202012131', '03202012132', '03202012133', '03202012311', '03202013000', '03202013001', '03202013002', '03202013003', '03202013010', '03202013012', '03202013020', '03202013021', '03202013022', '03202013023', '03202013030', '03202013032', '03202013111', '03202013112', '03202013113', '03202013121', '03202013123', '03202013130', '03202013131', '03202013132', '03202013133', '03202013200', '03202013201', '03202013203', '03202013210', '03202013212', '03202020000', '03202100002', '03202100003', '03202100020', '03202100021', '03202100022', '03202100023', '03202100030', '03202101311', '03202101313', '03202101323', '03202101332', '03202101333', '03202102000', '03202102001', '03202102002', '03202102003', '03202102010', '03202102012', '03202102020', '03202102021', '03202102022', '03202102023', '03202102030', '03202102032', '03202102331', '03202102333', '03202103101', '03202103103', '03202103110', '03202103111', '03202103112', '03202103113', '03202103121', '03202103122', '03202103123', '03202103130', '03202103131', '03202103132', '03202103133', '03202103202', '03202103203', '03202103212', '03202103213', '03202103220', '03202103221', '03202103222', '03202103223', '03202103230', '03202103231', '03202103232', '03202103233', '03202103301', '03202103302', '03202103310', '03202103311', '03202103312', '03202103313', '03202103320', '03202103321', '03202103322', '03202103323', '03202110001', '03202110003', '03202110010', '03202110011', '03202110012', '03202110013', '03202110100', '03202110200', '03202110201', '03202110202', '03202110203', '03202110220', '03202112000', '03202112002', '03202112003', '03202112020', '03202112021', '03202112022', '03202112023', '03202112200', '03202112201', '03202121001', '03202121010', '03202121011', '03202121023', '03202121032', '03202121033', '03202121100', '03202121101', '03202121102', '03202121111', '03202121113', '03202121123', '03202121131', '03202121132', '03202121133', '03202121201', '03202121203', '03202121210', '03202121211', '03202121212', '03202121213', '03202121221', '03202121223', '03202121230', '03202121231', '03202121232', '03202121233', '03202121300', '03202121301', '03202121302', '03202121303', '03202121310', '03202121311', '03202121312', '03202121313', '03202121320', '03202121321', '03202121322', '03202121323', '03202121330', '03202121331', '03202121332', '03202121333', '03202123000', '03202123001', '03202123002', '03202123003', '03202123010', '03202123011', '03202123012', '03202123013', '03202123020', '03202123021', '03202123022', '03202123023', '03202123030', '03202123031', '03202123032', '03202123033', '03202123100', '03202123101', '03202123102', '03202123103', '03202123110', '03202123111', '03202123112', '03202123113', '03202123120', '03202123121', '03202123122', '03202123123', '03202123130', '03202123131', '03202123132', '03202123133', '03202123201', '03202123203', '03202123210', '03202123211', '03202123212', '03202123213', '03202123221', '03202123230', '03202123231', '03202123232', '03202123233', '03202123300', '03202123301', '03202123302', '03202123303', '03202123310', '03202123311', '03202123320', '03202123321', '03202123322', '03202123323', '03202130000', '03202130002', '03202130003', '03202130010', '03202130012', '03202130013', '03202130020', '03202130021', '03202130022', '03202130023', '03202130030', '03202130031', '03202130032', '03202130033', '03202130122', '03202130200', '03202130201', '03202130202', '03202130203', '03202130210', '03202130211', '03202130212', '03202130213', '03202130220', '03202130221', '03202130222', '03202130223', '03202130230', '03202130231', '03202130232', '03202130233', '03202130300', '03202130302', '03202130320', '03202130321', '03202130322', '03202130323', '03202132000', '03202132001', '03202132002', '03202132003', '03202132010', '03202132011', '03202132012', '03202132013', '03202132020', '03202132021', '03202132022', '03202132023', '03202132030', '03202132031', '03202132032', '03202132033', '03202132100', '03202132101', '03202132102', '03202132103', '03202132112', '03202132120', '03202132121', '03202132122', '03202132123', '03202132130', '03202132132', '03202132133', '03202132200', '03202132201', '03202132210', '03202132211', '03202132300', '03202132301', '03202132302', '03202132303', '03202132310', '03202132311', '03202132312', '03202132313', '03202301011', '03202301013', '03202301031', '03202301033', '03202301100', '03202301101', '03202301102', '03202301103', '03202301112', '03202301113', '03202301120', '03202301121', '03202301122', '03202301123', '03202301130', '03202301131', '03202301132', '03202301133', '03202301300', '03202301301', '03202301310', '03202301311', '03202301312', '03202301313', '03202301330', '03202301331', '03202301332', '03202301333', '03202310002', '03202310003', '03202310012', '03202310013', '03202310020', '03202310021', '03202310022', '03202310023', '03202310030', '03202310031', '03202310032', '03202310033', '03202310101', '03202310102', '03202310103', '03202310110', '03202310111', '03202310112', '03202310113', '03202310120', '03202310121', '03202310122', '03202310123', '03202310130', '03202310131', '03202310132', '03202310133', '03202310200', '03202310201', '03202310202', '03202310203', '03202310210', '03202310211', '03202310212', '03202310213', '03202310300', '03202310301', '03202310310', '03202310311', '03202310312', '03202310313', '03202310321', '03202310323', '03202310330', '03202310331', '03202310332', '03202310333', '03202311000', '03202311002', '03202311020', '03202311022', '03202311200', '03202311202', '03202311220', '03202311222', '03202312100', '03202312101', '03202312102', '03202312103', '03202312110', '03202312111', '03202312112', '03202312113', '03202312121', '03202312123', '03202312130', '03202312131', '03202312132', '03202312133', '03202313000', '03202313002', '03311001130', '03311001131', '03311001132', '03311001133', '03311001313', '03311001331', '03311003101', '03311003103', '03311003110', '03311003112', '03311003232', '03311003233', '03311003322', '03311003323', '03311010202', '03311010220', '03311011111', '03311013033', '03311013233', '03311013322', '03311021001', '03311021003', '03311021010', '03311021011', '03311021012', '03311021013', '03311021031', '03311021100', '03311021101', '03311021102', '03311021103', '03311021120', '03311021121', '03311032210', '03311032211', '03311032212', '03311032213', '03311033103', '03311033112', '03311033120', '03311033121', '03311033123', '03311033130', '03311033131', '03311033132', '03311033133', '03311100000', '03311100121', '03311100322', '03311101000', '03311101020', '03311101021', '03311101022', '03311101023', '03311101030', '03311101031', '03311101032', '03311101033', '03311101120', '03311101121', '03311101122', '03311101123', '03311101130', '03311101201', '03311101203', '03311101210', '03311101211', '03311101212', '03311101213', '03311101222', '03311101223', '03311101230', '03311101231', '03311101233', '03311101300', '03311101301', '03311103000', '03311103001', '03311103221', '03311103223', '03311110231', '03311110233', '03311110320', '03311110322', '03311111201', '03311111203', '03311111210', '03311111333', '03311113103', '03311113112', '03311113113', '03311113120', '03311113121', '03311113122', '03311113123', '03311113130', '03311113132', '03311113300', '03311113301', '03311113310', '03311113330', '03311113331', '03311113332', '03311113333', '03311120231', '03311120233', '03311120320', '03311120321', '03311120322', '03311120323', '03311121213', '03311121232', '03311122112', '03311122113', '03311122123', '03311122130', '03311122131', '03311122132', '03311122133', '03311122213', '03311122223', '03311122230', '03311122231', '03311122232', '03311122233', '03311122300', '03311122301', '03311122302', '03311122303', '03311122310', '03311122311', '03311122312', '03311122313', '03311122320', '03311122321', '03311122322', '03311122323', '03311122330', '03311122331', '03311122332', '03311122333', '03311123002', '03311123020', '03311123032', '03311123033', '03311123202', '03311123210', '03311123211', '03311123220', '03311123221', '03311123222', '03311123223', '03311123230', '03311123231', '03311123232', '03311123233', '03311123320', '03311123322', '03311123331', '03311131031', '03311131033', '03311131101', '03311131103', '03311131112', '03311131113', '03311131120', '03311131121', '03311131122', '03311131123', '03311131130', '03311131131', '03311131132', '03311131202', '03311131203', '03311131211', '03311131212', '03311131213', '03311131220', '03311131221', '03311131230', '03311131231', '03311131300', '03311131301', '03311131302', '03311131320', '03311132110', '03311132203', '03311132212', '03311132220', '03311132221', '03311132222', '03311132223', '03311132230', '03311133001', '03311133003', '03311133010', '03311133012', '03311211011', '03311211100', '03311211102', '03311300001', '03311300003', '03311300010', '03311300011', '03311300012', '03311300013', '03311300020', '03311300021', '03311300022', '03311300023', '03311300100', '03311300101', '03311300110', '03312120230', '03312120231', '03312120233', '03312122002', '03312122003', '03312122113', '03312122131', '03312122133', '03312123000', '03312123002', '03312123020', '03312123022', '03312130032', '03312130033', '03312130210', '12000313012', '12000313013', '12000313030', '12000313031', '12000313102', '12001113301', '12001113303', '12001113310', '12001113312', '12001130332', '12001130333', '12001132110', '12001132111', '12001212211', '12001212213', '12001303030', '12001303032', '12001303033', '12001310032', '12001310033', '12001310210', '12001310211', '12001310213', '12001313201', '12001313203', '12001313210', '12001313211', '12001313212', '12001313213', '12001313230', '12001313231', '12001320203', '12001320212', '12001320213', '12001320221', '12001320230', '12001320231', '12002013303', '12002013312', '12002013321', '12002013323', '12002013330', '12002013332', '12002122202', '12002122220', '12002122222', '12002131010', '12002131012', '12002131031', '12002131033', '12002131120', '12002131121', '12002131122', '12002131123', '12002131130', '12002131131', '12002131132', '12002131133', '12002131202', '12002131203', '12002131211', '12002131212', '12002131221', '12002131230', '12002131300', '12002131301', '12002131303', '12002132132', '12002132133', '12002132310', '12002132311', '12002132312', '12002132313', '12002133123', '12002133130', '12002133131', '12002133132', '12002133133', '12002133310', '12002300000', '12002301321', '12002301322', '12002301323', '12002301330', '12002301332', '12002330131', '12002330133', '12002331020', '12002331021', '12002331022', '12002331023', '12002332032', '12002332033', '12002332123', '12002332132', '12002332210', '12002332211', '12002332301', '12002332310', '12002332331', '12002332333', '12002333023', '12002333032', '12002333201', '12002333210', '12002333220', '12002333222', '12003013022', '12003013023', '12003013032', '12003013200', '12003013201', '12003013210', '12003023102', '12003023103', '12003031321', '12003031323', '12003031330', '12003031332', '12003032130', '12003032132', '12003033103', '12003033112', '12003033121', '12003033130', '12003102021', '12003102023', '12003102030', '12003102032', '12003111013', '12003111102', '12003111120', '12003113301', '12003113303', '12003113310', '12003113311', '12003113312', '12003113313', '12003120033', '12003120122', '12003120123', '12003120211', '12003120213', '12003120300', '12003120301', '12003120302', '12003120303', '12003120323', '12003120332', '12003120333', '12003122033', '12003122100', '12003122101', '12003122102', '12003122103', '12003122110', '12003122111', '12003122112', '12003122113', '12003122120', '12003122121', '12003122122', '12003122123', '12003122130', '12003122131', '12003122132', '12003122133', '12003122211', '12003122300', '12003122301', '12003122310', '12003122311', '12003123002', '12003123020', '12003123022', '12003123023', '12003123200', '12003123201', '12003200211', '12003200213', '12003200300', '12003200302', '12003200303', '12003200312', '12003200321', '12003200330', '12003201132', '12003201133', '12003201310', '12003201311', '12003202030', '12003202031', '12003202032', '12003202033', '12003202120', '12003202122', '12003202123', '12003202210', '12003202211', '12003202213', '12003202231', '12003202300', '12003202301', '12003202302', '12003202320', '12003203022', '12003203023', '12003203032', '12003203133', '12003203200', '12003203201', '12003203210', '12003203311', '12003211013', '12003211031', '12003211033', '12003211102', '12003211120', '12003211122', '12003211200', '12003211201', '12003212020', '12003212021', '12003212022', '12003212023', '12003212200', '12003220103', '12003220112', '12003220121', '12003220130', '12003221220', '12003221221', '12003221222', '12003221223', '12003222311', '12003222312', '12003222313', '12003222321', '12003222323', '12003222330', '12003222331', '12003222332', '12003222333', '12003223200', '12003223202', '12003223220', '12003223222', '12003230033', '12003230122', '12003230211', '12003230300', '12003230302', '12003231302', '12003231320', '12003231321', '12003231322', '12003231323', '12003232202', '12003233022', '12003233023', '12003233200', '12003233201', '12010030022', '12010030023', '12010030200', '12010030201', '12010030202', '12010030203', '12010213322', '12010213323', '12010230223', '12010230232', '12010230233', '12010231100', '12010231101', '12010232001', '12010232010', '12010232011', '12010232012', '12010321022', '12010321023', '12010321032', '12010321200', '12010321201', '12010321210', '12012000101', '12012000103', '12012000110', '12012000111', '12012000112', '12012000113', '12012000130', '12012000131', '12012001000', '12012001002', '12012001020', '12012001230', '12012001231', '12012001232', '12012001233', '12012003233', '12012003303', '12012003312', '12012003313', '12012003320', '12012003321', '12012003322', '12012003323', '12012003330', '12012003331', '12012003332', '12012003333', '12012010221', '12012010222', '12012010223', '12012010230', '12012010232', '12012011331', '12012013200', '12012013201', '12012013202', '12012013203', '12012013220', '12012013221', '12012021011', '12012021013', '12012021100', '12012021101', '12012021102', '12012021103', '12012021110', '12012021111', '12012021112', '12012021113', '12012100202', '12012100203', '12012100220', '12012100221', '12012100222', '12020020202', '12020020220', '12020022312', '12020022313', '12020022330', '12020022331', '12020022332', '12020022333', '12020023202', '12020023220', '12020023221', '12020023222', '12020023223', '12020023230', '12020023232', '12020033032', '12020033033', '12020033213', '12020033223', '12020033230', '12020033231', '12020033232', '12020033233', '12020033320', '12020033321', '12020033322', '12020033332', '12020033333', '12020101131', '12020101133', '12020110020', '12020110022', '12020110101', '12020110103', '12020110110', '12020110112', '12020110113', '12020110121', '12020110123', '12020110130', '12020110131', '12020110132', '12020111030', '12020111031', '12020111032', '12020111033', '12020111210', '12020111211', '12020112103', '12020112112', '12020112121', '12020112130', '12020113203', '12020113212', '12020113221', '12020113223', '12020113230', '12020113232', '12020121222', '12020121223', '12020121303', '12020121312', '12020121321', '12020121330', '12020122000', '12020122001', '12020122002', '12020122003', '12020122012', '12020122013', '12020122030', '12020122031', '12020122100', '12020122101', '12020122102', '12020122103', '12020122121', '12020122123', '12020122232', '12020122233', '12020122302', '12020122303', '12020122311', '12020122312', '12020122313', '12020122321', '12020122323', '12020123000', '12020123001', '12020123112', '12020123113', '12020123130', '12020123131', '12020123223', '12020130020', '12020130021', '12020130023', '12020130202', '12020130203', '12020130220', '12020130221', '12020131000', '12020131001', '12020131002', '12020131003', '12020131120', '12020131121', '12020131122', '12020131123', '12020132003', '12020132012', '12020132020', '12020132021', '12020132022', '12020132023', '12020132030', '12020132031', '12020132032', '12020132033', '12020133220', '12020133221', '12020133222', '12020133223', '12020200002', '12020200003', '12020200020', '12020200021', '12020200022', '12020200023', '12020200132', '12020200133', '12020200202', '12020200203', '12020200220', '12020200221', '12020200222', '12020200223', '12020200230', '12020200231', '12020200232', '12020200233', '12020200300', '12020200301', '12020200302', '12020200303', '12020200310', '12020200311', '12020200320', '12020200321', '12020200322', '12020200330', '12020201001', '12020201010', '12020202000', '12020202001', '12020202002', '12020202003', '12020202010', '12020202011', '12020202012', '12020202013', '12020202020', '12020202021', '12020202022', '12020202023', '12020202030', '12020202031', '12020202032', '12020202033', '12020202100', '12020202101', '12020202102', '12020202113', '12020202120', '12020202121', '12020202122', '12020202123', '12020202130', '12020202131', '12020202201', '12020202223', '12020202230', '12020202231', '12020202232', '12020202233', '12020202300', '12020202301', '12020202303', '12020202310', '12020202311', '12020202312', '12020202320', '12020203002', '12020203020', '12020203212', '12020203213', '12020203230', '12020203231', '12020203302', '12020203303', '12020210133', '12020210313', '12020211001', '12020211003', '12020211010', '12020211011', '12020211012', '12020211013', '12020211020', '12020211021', '12020211022', '12020211023', '12020211030', '12020211031', '12020211032', '12020211033', '12020211100', '12020211101', '12020211102', '12020211103', '12020211110', '12020211111', '12020211112', '12020211120', '12020211121', '12020211122', '12020211123', '12020211130', '12020211131', '12020211132', '12020211133', '12020211200', '12020211201', '12020211202', '12020211203', '12020211210', '12020211211', '12020211212', '12020211213', '12020211220', '12020211221', '12020211230', '12020211231', '12020211232', '12020211233', '12020211300', '12020211301', '12020211311', '12020211322', '12020211323', '12020211331', '12020212022', '12020212023', '12020212032', '12020212121', '12020212123', '12020212130', '12020212132', '12020212133', '12020212210', '12020212223', '12020212230', '12020212231', '12020212232', '12020212233', '12020212300', '12020212301', '12020212302', '12020212303', '12020212311', '12020212312', '12020212313', '12020212330', '12020212331', '12020212333', '12020213000', '12020213001', '12020213002', '12020213003', '12020213010', '12020213011', '12020213022', '12020213023', '12020213100', '12020213101', '12020213110', '12020213111', '12020213112', '12020213113', '12020213130', '12020213131', '12020213200', '12020213201', '12020213202', '12020213203', '12020213212', '12020213213', '12020213220', '12020213221', '12020213222', '12020213223', '12020213230', '12020213231', '12020213232', '12020213233', '12020213312', '12020213313', '12020213330', '12020213331', '12020213333', '12020220001', '12020221322', '12020221323', '12020222020', '12020222021', '12020222022', '12020222023', '12020222121', '12020222123', '12020222130', '12020222132', '12020222301', '12020222310', '12020223033', '12020223122', '12020230000', '12020230001', '12020230002', '12020230003', '12020230010', '12020230011', '12020230012', '12020230013', '12020230111', '12020230113', '12020230130', '12020230131', '12020230232', '12020230233', '12020231000', '12020231001', '12020231002', '12020231020', '12020231021', '12020231022', '12020231023', '12020231030', '12020231032', '12020231110', '12020231111', '12020231112', '12020231113', '12020232010', '12020232011', '12020232310', '12020232311', '12020232312', '12020232313', '12020233010', '12020233011', '12020233012', '12020233013', '12020300010', '12020300011', '12020300012', '12020300013', '12020300021', '12020300022', '12020300023', '12020300030', '12020300031', '12020300032', '12020300101', '12020300103', '12020300110', '12020300111', '12020300112', '12020300113', '12020300130', '12020300131', '12020300200', '12020300201', '12020300202', '12020300203', '12020300210', '12020300220', '12020300221', '12020300303', '12020300312', '12020300321', '12020300323', '12020300330', '12020300331', '12020300332', '12020300333', '12020301000', '12020301003', '12020301012', '12020301013', '12020301021', '12020301030', '12020301031', '12020301102', '12020301103', '12020301112', '12020301120', '12020301121', '12020301130', '12020301210', '12020301211', '12020301212', '12020301213', '12020301220', '12020301221', '12020301222', '12020301223', '12020301230', '12020301231', '12020301232', '12020301233', '12020301300', '12020301302', '12020301312', '12020301313', '12020301320', '12020301321', '12020301322', '12020301323', '12020301333', '12020302000', '12020302002', '12020302012', '12020302013', '12020302030', '12020302031', '12020302100', '12020302101', '12020302102', '12020302103', '12020302110', '12020302111', '12020302112', '12020302113', '12020302120', '12020302121', '12020302122', '12020302123', '12020302130', '12020302131', '12020302132', '12020302133', '12020302202', '12020302203', '12020302212', '12020302220', '12020302221', '12020302222', '12020302230', '12020302231', '12020302232', '12020302233', '12020302300', '12020302301', '12020302310', '12020302311', '12020302312', '12020302313', '12020302320', '12020302321', '12020302322', '12020302323', '12020302330', '12020302331', '12020302332', '12020302333', '12020303000', '12020303001', '12020303002', '12020303003', '12020303010', '12020303011', '12020303012', '12020303013', '12020303020', '12020303021', '12020303022', '12020303023', '12020303030', '12020303031', '12020303032', '12020303033', '12020303100', '12020303102', '12020303103', '12020303112', '12020303121', '12020303130', '12020303200', '12020303201', '12020303202', '12020303203', '12020303210', '12020303211', '12020303212', '12020303213', '12020303220', '12020303221', '12020303222', '12020303223', '12020303303', '12020303320', '12020303321', '12020303322', '12020303323', '12020303330', '12020310012', '12020310013', '12020310022', '12020310023', '12020310030', '12020310110', '12020310111', '12020310112', '12020310113', '12020310123', '12020310201', '12020310210', '12020310212', '12020310221', '12020310223', '12020310230', '12020310232', '12020311000', '12020311002', '12020311032', '12020311033', '12020311100', '12020311101', '12020311210', '12020311211', '12020312121', '12020312123', '12020312130', '12020312132', '12020312221', '12020312223', '12020312230', '12020312232', '12020313000', '12020313002', '12020313310', '12020313312', '12020313313', '12020313330', '12020313331', '12020320000', '12020320002', '12020320003', '12020320010', '12020320011', '12020320100', '12020320101', '12020320111', '12020320113', '12020321000', '12020321001', '12020321002', '12020321003', '12020321021', '12020321030', '12020321031', '12020321032', '12020321033', '12020321113', '12020321211', '12020321311', '12020321312', '12020321313', '12020321330', '12020321331', '12020321332', '12020321333', '12020322012', '12020322013', '12020322030', '12020322031', '12020322101', '12020322103', '12020322110', '12020322212', '12020322213', '12020322230', '12020322231', '12020322311', '12020322313', '12020323022', '12020323023', '12020323033', '12020323113', '12020323122', '12020323131', '12020323132', '12020323133', '12020323200', '12020323201', '12020323202', '12020323310', '12020323311', '12020323331', '12020323333', '12020330001', '12020330002', '12020330003', '12020330112', '12020330113', '12020330130', '12020330131', '12020330200', '12020330201', '12020330202', '12020330203', '12020330210', '12020330212', '12020330213', '12020330220', '12020330221', '12020330222', '12020330223', '12020330230', '12020330231', '12020330320', '12020331222', '12020331323', '12020331332', '12020332020', '12020332022', '12020332023', '12020332200', '12020332201', '12020332220', '12020332222', '12020332223', '12020332233', '12020332302', '12020332320', '12020332322', '12020333000', '12020333112', '12020333121', '12020333123', '12020333130', '12020333131', '12020333132', '12020333133', '12020333310', '12020333311', '12021000100', '12021000101', '12021000102', '12021000103', '12021000110', '12021000111', '12021000112', '12021000113', '12021000120', '12021000121', '12021000122', '12021000123', '12021000130', '12021000131', '12021000300', '12021000301', '12021001000', '12021001001', '12021001002', '12021001003', '12021001010', '12021001011', '12021001012', '12021001013', '12021001020', '12021001021', '12021001023', '12021001030', '12021001032', '12021002322', '12021002323', '12021003203', '12021003212', '12021003221', '12021003223', '12021003230', '12021003232', '12021003301', '12021003303', '12021003310', '12021003321', '12021020100', '12021020101', '12021021011', '12021021100', '12021021213', '12021021231', '12021023213', '12021023221', '12021023223', '12021023230', '12021023231', '12021023232', '12021023233', '12021023302', '12021023320', '12021023321', '12021023322', '12021023323', '12021023330', '12021023332', '12021200021', '12021200023', '12021200030', '12021200032', '12021200110', '12021200111', '12021200112', '12021200113', '12021200210', '12021200302', '12021200303', '12021200312', '12021200320', '12021200321', '12021200330', '12021201001', '12021201003', '12021201010', '12021201011', '12021201012', '12021201013', '12021201100', '12021201101', '12021201102', '12021201103', '12021201110', '12021202011', '12021202013', '12021202100', '12021202102', '12021202103', '12021202112', '12021202113', '12021202120', '12021202121', '12021202123', '12021202130', '12021202131', '12021202132', '12021202202', '12021202203', '12021202212', '12021202220', '12021202221', '12021202230', '12021202320', '12021202321', '12021202322', '12021202323', '12021203221', '12021203222', '12021203223', '12021203301', '12021203303', '12021203310', '12021203312', '12021210010', '12021210012', '12021210221', '12021210223', '12021210230', '12021212123', '12021212300', '12021212301', '12021220102', '12021220103', '12021220120', '12021220121', '12021220221', '12021220223', '12021220230', '12021220232', '12021222320', '12021222321', '12021222322', '12021222323', '12022000222', '12022000223', '12022001100', '12022001101', '12022001102', '12022001103', '12022001110', '12022001112', '12022002000', '12022002001', '12022002211', '12022002213', '12022002300', '12022002302', '12022003010', '12022003011', '12022003012', '12022003013', '12022003323', '12022010312', '12022010313', '12022013302', '12022013303', '12022013320', '12022013321', '12022020023', '12022020032', '12022020201', '12022020210', '12022021003', '12022021021', '12022022112', '12022022113', '12022022130', '12022022131', '12022031013', '12022031031', '12022032003', '12022032012', '12022032021', '12022032030', '12022033013', '12022033030', '12022033031', '12022033033', '12022033102', '12022033120', '12022033122', '12022033200', '12022033201', '12022033202', '12022033203', '12022100012', '12022100013', '12022100030', '12022100031', '12022101031', '12022101033', '12022101110', '12022101112', '12022101113', '12022101120', '12022101122', '12022101123', '12022101221', '12022101223', '12022101230', '12022101232', '12022101300', '12022101301', '12022101322', '12022101333', '12022102130', '12022102131', '12022102132', '12022102133', '12022102212', '12022102221', '12022102230', '12022103003', '12022103012', '12022103021', '12022103030', '12022103031', '12022103032', '12022103033', '12022103100', '12022103210', '12022103211', '12022103311', '12022103313', '12022103332', '12022103333', '12022110001', '12022110011', '12022110012', '12022110013', '12022110030', '12022110031', '12022110033', '12022110100', '12022110101', '12022110102', '12022110103', '12022110111', '12022110112', '12022110113', '12022110120', '12022110121', '12022110122', '12022110130', '12022110131', '12022110222', '12022111000', '12022111001', '12022111002', '12022111200', '12022111201', '12022111301', '12022111303', '12022111310', '12022111312', '12022112023', '12022112031', '12022112032', '12022112033', '12022112120', '12022112121', '12022112122', '12022112130', '12022112200', '12022112201', '12022112202', '12022112203', '12022112210', '12022112220', '12022112221', '12022112300', '12022112301', '12022112302', '12022112303', '12022113012', '12022113030', '12022113331', '12022120123', '12022120230', '12022120231', '12022120232', '12022120233', '12022120300', '12022120301', '12022120310', '12022121001', '12022121003', '12022121010', '12022121012', '12022121110', '12022121111', '12022122023', '12022122201', '12022122210', '12022122220', '12022122222', '12022122223', '12022123123', '12022123132', '12022123232', '12022123233', '12022123301', '12022123310', '12022123313', '12022123322', '12022123331', '12022131333', '12022132000', '12022132001', '12022132002', '12022132003', '12022132012', '12022132013', '12022132021', '12022132030', '12022132031', '12022132032', '12022132102', '12022132120', '12022132122', '12022132123', '12022132130', '12022132131', '12022132132', '12022132133', '12022132200', '12022132201', '12022132202', '12022132203', '12022132210', '12022132211', '12022132212', '12022132213', '12022132220', '12022132230', '12022132231', '12022132233', '12022132300', '12022132301', '12022132302', '12022132303', '12022132320', '12022132321', '12022132322', '12022132330', '12022133023', '12022133032', '12022133111', '12022133201', '12022133210', '12022133222', '12022133223', '12022133301', '12022133303', '12022133310', '12022133311', '12022133312', '12022133313', '12022133322', '12022133323', '12022133332', '12022202111', '12022202133', '12022202311', '12022203022', '12022203200', '12022211011', '12022211013', '12022211100', '12022211102', '12022212123', '12022212132', '12022212212', '12022212230', '12022212301', '12022212310', '12022213002', '12022213003', '12022213010', '12022213011', '12022213012', '12022213013', '12022213020', '12022213021', '12022213030', '12022213032', '12022213310', '12022213311', '12022213312', '12022213313', '12022213330', '12022213331', '12022222031', '12022222033', '12022222122', '12022222330', '12022222331', '12022222332', '12022222333', '12022223030', '12022223033', '12022223111', '12022223113', '12022223122', '12022223123', '12022223132', '12022223211', '12022223212', '12022223213', '12022223220', '12022223222', '12022223230', '12022223300', '12022223301', '12022223302', '12022230020', '12022230022', '12022232000', '12022232002', '12022301010', '12022301011', '12022301013', '12022301100', '12022301102', '12022301112', '12022301113', '12022301212', '12022301213', '12022301331', '12022302133', '12022302311', '12022303021', '12022303022', '12022303023', '12022303030', '12022303031', '12022303102', '12022303120', '12022303200', '12022310000', '12022310001', '12022310002', '12022310003', '12022310110', '12022310111', '12022310203', '12022310210', '12022310211', '12022310212', '12022310213', '12022310220', '12022310333', '12022311012', '12022311013', '12022311021', '12022311030', '12022311031', '12022311032', '12022311033', '12022311101', '12022311110', '12022311120', '12022311121', '12022311122', '12022311123', '12022311130', '12022311132', '12022311222', '12022311301', '12022311310', '12022311311', '12022312111', '12022313000', '12022313001', '12022313003', '12022313010', '12022313012', '12022313013', '12022313030', '12022313031', '12022313032', '12022313033', '12022313101', '12022313102', '12022313103', '12022313110', '12022313112', '12022313113', '12022313120', '12022313121', '12022313123', '12022313130', '12022313131', '12022313132', '12022313133', '12022313210', '12022331112', '12022331113', '12022331130', '12022331131', '12022332332', '12023000002', '12023000003', '12023000120', '12023000121', '12023000122', '12023000123', '12023000203', '12023000212', '12023000220', '12023000221', '12023000222', '12023000223', '12023000230', '12023000232', '12023001331', '12023002100', '12023002101', '12023002102', '12023002103', '12023002202', '12023002203', '12023002220', '12023002221', '12023003003', '12023003012', '12023010201', '12023010202', '12023010203', '12023010212', '12023010220', '12023010221', '12023011202', '12023011203', '12023011213', '12023011220', '12023011221', '12023011231', '12023011233', '12023011300', '12023011301', '12023011302', '12023011303', '12023011312', '12023011320', '12023011321', '12023011322', '12023011323', '12023011330', '12023011332', '12023012331', '12023012333', '12023013222', '12023020200', '12023021132', '12023021133', '12023021232', '12023021233', '12023021310', '12023022023', '12023022032', '12023022111', '12023022113', '12023022121', '12023022123', '12023022130', '12023022132', '12023022201', '12023022210', '12023022211', '12023022213', '12023022232', '12023022233', '12023022301', '12023022302', '12023022303', '12023022310', '12023022311', '12023022312', '12023022321', '12023022323', '12023022330', '12023022332', '12023023000', '12023023002', '12023023010', '12023023011', '12023023101', '12023023103', '12023023121', '12023023123', '12023023130', '12023023132', '12023023133', '12023030023', '12023030032', '12023030111', '12023031000', '12023200003', '12023200010', '12023200011', '12023200012', '12023200021', '12023200030', '12023200200', '12023200201', '12023200202', '12023200212', '12023200213', '12023200230', '12023200231', '12023200301', '12023200303', '12023200310', '12023200312', '12023200320', '12023200322', '12023200323', '12023200333', '12023202002', '12023202020', '12023202022', '12023202110', '12023202111', '12023202112', '12023202113', '12023202131', '12023202133', '12023202202', '12023202211', '12023202213', '12023202220', '12023202323', '12023202332', '12023203000', '12023203002', '12023203003', '12023203012', '12023203020', '12023203021', '12023203022', '12023203030', '12023203122', '12023203123', '12023203300', '12023203301', '12023220101', '12023220110', '12023220133', '12023220230', '12023220231', '12023220232', '12023220233', '12023220300', '12023220301', '12023220302', '12023220303', '12023220311', '12023220323', '12023220332', '12023220333', '12023221000', '12023221002', '12023221022', '12023221102', '12023221103', '12023221112', '12023221121', '12023221123', '12023221130', '12023221132', '12023221200', '12023221201', '12023221202', '12023221203', '12023221213', '12023221222', '12023221302', '12023222101', '12023222103', '12023222110', '12023222111', '12023222112', '12023222113', '12023222121', '12023222130', '12023222131', '12023223000', '12023223001', '12023223002', '12023223003', '12023223022', '12023223023', '12023223031', '12023223033', '12023223120', '12023223122', '12023223200', '12023223201', '12023223203', '12023230200', '12023230201', '12023230202', '12023230203', '12023232022', '12023232023', '12023232033', '12023232131', '12023232221', '12023232222', '12023232223', '12023232231', '12023232233', '12023232320', '12023232322', '12023233030', '12023233032', '12023233200', '12023233212', '12023233230', '12023233302', '12023233303', '12023233320', '12023233321', '12023233330', '12023233331', '12023233332', '12023233333', '12023322220', '12023322222', '12032210122', '12032210123', '12032210211', '12032210213', '12032210300', '12032210301', '12032210302', '12032210303', '12032210320', '12032210321', '12032222323', '12032222332', '12032223220', '12032223221', '12032223223', '12200003130', '12200003131', '12200003133', '12200101131', '12200101133', '12200110002', '12200110003', '12200110020', '12200110021', '12200110101', '12200110110', '12200110222', '12200110223', '12200110300', '12200110301', '12200110302', '12200110303', '12200112000', '12200112001', '12200112211', '12200112213', '12200112300', '12200112302', '12201001111', '12201001113', '12201010000', '12201010001', '12201010002', '12201010003', '12201010010', '12201010011', '12201010012', '12201010013', '12201010030', '12201010031', '12201010100', '12201010102', '12201010120', '12201011021', '12201011030', '12201011101', '12201011103', '12201011110', '12201011112', '12201011130', '12201013211', '12201013300', '12201013320', '12201013321', '12201013322', '12201013323', '12201013330', '12201013332', '12201013333', '12201020313', '12201020331', '12201020332', '12201020333', '12201021211', '12201021213', '12201021300', '12201021302', '12201023113', '12201023120', '12201023121', '12201023122', '12201023123', '12201023131', '12201030313', '12201031011', '12201031013', '12201031022', '12201031023', '12201031110', '12201031200', '12201031201', '12201031202', '12201031203', '12201031220', '12201031221', '12201032001', '12201032002', '12201032003', '12201032103', '12201032112', '12201032121', '12201032132', '12201032200', '12201032201', '12201032203', '12201032212', '12201032213', '12201032230', '12201032231', '12201032302', '12201032310', '12201032311', '12201032312', '12201032313', '12201032320', '12201100023', '12201100032', '12201100121', '12201100130', '12201100132', '12201100133', '12201100201', '12201100210', '12201100310', '12201100311', '12201100312', '12201100313', '12201102203', '12201102221', '12201111313', '12201112112', '12201112130', '12201113031', '12201113113', '12201113120', '12201113131', '12201113333', '12201131003', '12201131033', '12201131122', '12201131211', '12201131300', '12201133301', '12201133303', '12210000021', '12210000030', '12210000031', '12210000032', '12210000033', '12210000202', '12210001010', '12210001011', '12210002002', '12210002020', '12210002032', '12210002210', '12210020130', '12210020311', '12210020312', '12210020313', '12210020321', '12210020330', '12210020331', '12210020332', '12210020333', '12210021200', '12210021202', '12210021220', '12210021222', '12210201222', '12210203110', '12210203111', '12210203112', '12210203113', '13300211201', '13300211203', '13300211210', '13300211211', '13300211212', '13300211213', '13300211221', '13300211223', '13300211230', '13300211231', '13300211232', '13300211233', '13300211302', '13300211320', '13300211322', '13300213001', '13300213010', '13300213011', '31121301200', '31121301201', '31121301202', '31121301203', '31121301220', '31121301221', '31121301222', '31121301223', '31122312102', '31122312103', '31122312110', '31122312111', '31122312112', '31122312113', '31122312120', '31122312121', '31122312122', '31122312123', '31122312130', '31122312131', '31122312132', '31122312133', '31122312301', '31122312310', '31122312311', '31122313000', '31122313001', '31122313002', '31122313003', '31122313010', '31122313012', '31122313020', '31122313021', '31122313023', '31122313032', '31123013122', '31123013123', '31123013211', '31123013213', '31123013231', '31123013232', '31123013233', '31123013300', '31123013301', '31123013302', '31123013303', '31123013320', '31123021313', '31123021331', '31123021333', '31123023111', '31123030202', '31123030220', '31123030221', '31123030222', '31123030223', '31123031001', '31123031003', '31123031010', '31123031011', '31123031012', '31123032000', '31301002303', '31301002312', '31301002321', '31301002323', '31301002330', '31301002331', '31301002332'],
            i = false,
            d = [];
        this.Init = function (a) {
            y = a + "/GetBirdsEyeSceneByLocation";
            z = a + "/GetBirdsEyeSceneById";
            r = true
        };
        this.SetClientToken = function (b) {
            e = b;
            if (a) a.SetClientToken(e, p)
        };
        this.SetUseOriginTiles = function (a) {
            p = a
        };
        this.SetGUID = function (b) {
            m = b;
            if (a) a.SetGUID(m);
            if (typeof VEMap != "undefined") s = VEMap._GetMapFromGUID(m)
        };
        this.Destroy = function () {
            e = null;
            r = false
        };
        this.RequestPending = function () {
            return i
        };

        function P(c, d, b) {
            return a.IsValidTile(c, d, b)
        }
        function N(b, c, d) {
            return a.GetTileFilename(b, c, d, currentView.mapStyle)
        }
        this.GetMiddleTileFilename = function () {
            return a.GetMiddleTileFilename()
        };

        function I(e) {
            if (!a) return 0;
            var b = new VEPixel(MathRound(originX + offsetX + width / 2), MathRound(originY + offsetY + height / 2)),
                f = a.PixelToLatLong(b, e);
            b.x++;
            var g = a.PixelToLatLong(b, e),
                h = Math.sin(DegToRad(f.latitude)),
                i = Math.sin(DegToRad(g.latitude)),
                c = earthRadius / 2 * MathAbs(Math.log((1 + h) / (1 - h)) - Math.log((1 + i) / (1 - i))),
                d = earthRadius * MathAbs(DegToRad(f.longitude) - DegToRad(g.longitude));
            return Math.sqrt(d * d + c * c)
        }
        function J(c, b) {
            return a ? a.PixelToLatLong(c, b) : null
        }
        function E(c, d, b) {
            if (a) a.PixelToLatLongAsync(c, d, b);
            else b(null)
        }
        function H(c, b) {
            return a ? a.LatLongToPixel(c, b) : null
        }
        function D(c, d, b) {
            if (a) a.LatLongToPixelAsync(c, d, b);
            else b(null)
        }
        function B() {
            return 2
        }
        function G(a) {
            if (a.zoomLevel >= 2) tileLayerManager.SetMarketMaxZoom(2);
            if (a.zoomLevel < 1) a.SetZoomLevel(1);
            else if (a.zoomLevel > 2) a.SetZoomLevel(2)
        }
        function R() {
            return a
        }
        function Q() {
            return a.GetBounds()
        }
        function O() {
            return b
        }
        function K() {
            if (!b) return null;
            var a = {};
            return a
        }
        function F() {
            if (currentView != null && !Msn.VE.MapStyle.IsViewOblique(currentView.mapStyle) && currentView.zoomLevel > 0) if (currentView.zoomLevel < MapControl.Features.BirdsEyeAtZoomLevel) {
                a = null;
                h = b;
                b = false;
                q()
            } else v(currentView.latlong, "North", false, 500)
        }
        var x = false;

        function v(e, i, t, o, m, f, r, s, p) {
            j();
            l = t;
            x = r;
            n = p;
            if (!S(e)) {
                a = null;
                h = b;
                b = false;
                q(m);
                return
            }
            k = y;
            c = [];
            c.push(new VEParameter("latitude", e.latitude));
            c.push(new VEParameter("longitude", e.longitude));
            c.push(new VEParameter("level", 20));
            var d = "NoSpin";
            if (f == Msn.VE.BirdsEyeSearchSpinDirection.ClockwiseSpin) d = "CounterclockwiseSpin";
            else if (f == Msn.VE.BirdsEyeSearchSpinDirection.CounterclockwiseSpin) d = "ClockwiseSpin";
            c.push(new VEParameter("spinDirection", '"' + d + '"'));
            if (i) c.push(new VEParameter("orientation", '"' + i + '"'));
            else c.push(new VEParameter("orientation", '"' + Msn.VE.Orientation.North + '"'));
            if (o) g = window.setTimeout(u, o);
            else {
                u(m, s);
                g = -1
            }
        }
        function L(b) {
            if (a && a.GetID() == b) return;
            j();
            l = true;
            k = z;
            c = [];
            c.push(new VEParameter("sceneId", b));
            u()
        }
        function j() {
            try {
                if (g != -1) window.clearTimeout(g)
            } catch(a) {}
            g = -1
        }
        function u(b, d) {
            j();
            if (!k) return;
            i = true;
            if (e) c.push(new VEParameter(Msn.VE.API.Constants.clienttoken, e));

            function a(a) {
                if (typeof w == "function" && r) w(a, b, d)
            }
            JSONRequestInvoke(k, c, a)
        }
        function w(c, f, d) {
            if (s) s.__HandleAuthentication(c);
            h = b;
            t = a;
            a = null;
            b = false;
            if (c != null) if (c.Scene) {
                a = M(c.Scene, d);
                if (Msn.VE.API && e) a.SetClientToken(e, p);
                a.SetGUID(m);
                b = true
            }
            q(f, d)
        }
        function M(a, b) {
            switch (a.O) {
            case 0:
                a.O = Msn.VE.Orientation.North;
                break;
            case 2:
                a.O = Msn.VE.Orientation.East;
                break;
            case 4:
                a.O = Msn.VE.Orientation.South;
                break;
            case 6:
                a.O = Msn.VE.Orientation.West
            }
            return new Msn.VE.ObliqueScene(a.S, a.Q, a.RI, a.O, a.L, null, a.Fcx, a.Fcy, [
                [a.QA, a.QB, a.QC],
                [a.QD, a.QE, a.QF],
                [a.QG, a.QH, a.QI]
            ], [
                [a.XA, a.XB, a.XC],
                [a.XD, a.XE, a.XF],
                [a.XG, a.XH, a.XI]
            ], b)
        }
        function q(e) {
            i = false;
            if (typeof e == "function") if (b) e(a);
            else e(null);
            if (l) {
                l = false;
                if (b) {
                    var c = preferredView.MakeCopy();
                    if (!Msn.VE.MapStyle.IsViewOblique(c.mapStyle)) {
                        c.SetZoomLevel(1);
                        c.SetCenterLatLong((new Msn.VE.LatLong).Copy(preferredView.latlong))
                    }
                    var f = Msn.VE.MapStyle.IsViewOblique(c.mapStyle) ? c.mapStyle : obliqueStyle;
                    c.SetMapStyle(f, a.GetID(), a.GetOrientation());
                    SetView(c);
                    Fire("onobliquechange")
                } else if (x && t) {
                    a = t;
                    b = true;
                    Fire("obliquerequestunavailable")
                } else {
                    var c = preferredView.MakeCopy();
                    c.SetMapStyle(lastOrthoMapStyle);
                    if (c.GetViewType() != "latlongRect") c.SetZoomLevel(lastOrthoZoomLevel);
                    SetView(c);
                    Fire("onendmapstyleoblique");
                    Fire("onerror", CreateEvent(currentView.latlong, currentView.zoomLevel, L_ObliqueModeImageNotAvailable_Text))
                }
            }
            if (!n) {
                if (h != b) if (b) Fire("onobliqueenter");
                else Fire("onobliqueleave");
                if (d.length > 0) A(b)
            }
            n = false
        }
        function S(a) {
            if (!a || !f || f.length == 0) return false;
            var c = orthoMode.LatLongToPixel(a, f[0].length),
                b = VEPixelToQuadKey(c, f[0].length);
            return o(b, 0, f.length - 1)
        }
        function o(a, d, c) {
            if (c < d) return false;
            var b = MathFloor((d + c) / 2);
            if (f[b] == a) return true;
            if (a < f[b]) return o(a, d, b - 1);
            return o(a, b + 1, c)
        }
        function C(a, c) {
            if (i) {
                if (d[a] != true) {
                    var e = d.push({
                        callbackName: a,
                        callback: c
                    });
                    d[a] = true
                }
            } else if (typeof c == "function") c(b)
        }
        function A(c) {
            var e = d.length;
            for (var b = 0; b < e; b++) {
                var a = d.shift();
                delete d[a.callbackName];
                if (typeof a.callback == "function") a.callback(c)
            }
        }
        this.IsValidTile = P;
        this.GetFilename = N;
        this.MetersPerPixel = I;
        this.PixelToLatLong = J;
        this.PixelToLatLongAsync = E;
        this.LatLongToPixel = H;
        this.LatLongToPixelAsync = D;
        this.GetBounds = Q;
        this.ValidateZoomLevel = G;
        this.IsAvailable = O;
        this.UpdateAvailability = F;
        this.CancelRequest = j;
        this.GetEventInfo = K;
        this.GetScene = R;
        this.RequestSceneAtLatLong = v;
        this.RequestScene = L;
        this.GetCurrentMaxZoomLevel = B;
        this.GetObliqueAvailability = C
    }
    function OrthoMode() {
        var a = [new Msn.VE.Bounds(1, 17, 0, 0, 2, 2), new Msn.VE.Bounds(18, 19, 12379, 112260, 20388, 119266), new Msn.VE.Bounds(18, 19, 80099, 115425, 85051, 119645), new Msn.VE.Bounds(18, 19, 220032, 93184, 240640, 113792), new Msn.VE.Bounds(18, 19, 32768, 81920, 94208, 98304), new Msn.VE.Bounds(18, 19, 38912, 98304, 80896, 106496), new Msn.VE.Bounds(18, 19, 44544, 106496, 77824, 113408), new Msn.VE.Bounds(18, 19, 49152, 113408, 68096, 122880), new Msn.VE.Bounds(18, 19, 122880, 71680, 133120, 103424), new Msn.VE.Bounds(18, 19, 133120, 59392, 142848, 103424), new Msn.VE.Bounds(18, 19, 142848, 55296, 155648, 103424)];
        this.Init = function () {};
        this.Destroy = function () {};

        function j(a, b, d) {
            var c = 1 << d;
            return a >= 0 && b >= 0 && a < c && b < c
        }
        function i(c, d, f, b) {
            var a = new VETileContext;
            a.XPos = c;
            a.YPos = d;
            a.ZoomLevel = f;
            a.MapStyle = currentView.mapStyle;
            var e = b.GetTilePath(a);
            return e
        }
        function b(a) {
            return earthCircumference / ((1 << a) * tileSize)
        }
        function h(d, e) {
            var c = b(e),
                f = d.x * c - projectionOffset,
                g = projectionOffset - d.y * c,
                a = new Msn.VE.LatLong;
            a.latitude = RadToDeg(Math.PI / 2 - 2 * Math.atan(Math.exp(-g / earthRadius)));
            a.longitude = RadToDeg(f / earthRadius);
            return a
        }
        function e(d, g, e) {
            var b = [];
            for (var a = 0; a < d.length; ++a) {
                var c = this.PixelToLatLong(d[a], g);
                if (Msn.VE.API != null) {
                    var f = new VELatLong(c.latitude, c.longitude);
                    b[a] = f
                } else b[a] = c
            }
            if (e) e(b)
        }
        function g(d, f) {
            var e = Math.sin(DegToRad(d.latitude)),
                g = earthRadius * DegToRad(d.longitude),
                h = earthRadius / 2 * Math.log((1 + e) / (1 - e)),
                c = b(f),
                a = new VEPixel;
            a.x = (projectionOffset + g) / c;
            a.y = (projectionOffset - h) / c;
            return a
        }
        function d(b, e, d) {
            var c = [];
            for (var a = 0; a < b.length; ++a) c[a] = this.LatLongToPixel(b[a], e);
            if (d) d(c)
        }
        function k(c) {
            if (c == undefined) c = currentView;
            var d = c.zoomLevel,
                f = c.center.x + mapCenterOffset.x,
                g = c.center.y + mapCenterOffset.y;
            for (var b = 0; b < a.length; b++) {
                var h = d - a[b].z1,
                    e = tileSize * Math.pow(2, h),
                    k = a[b].x1 * e,
                    i = a[b].x2 * e,
                    l = a[b].y1 * e,
                    j = a[b].y2 * e;
                if (f >= k && f <= i && g >= l && g <= j) if (d >= a[b].z1 && d <= a[b].z2 || d <= tileLayerManager.GetMaxTileZoom()) return a[b]
            }
            return a[0]
        }
        function c(e) {
            var f = e.center.x + mapCenterOffset.x,
                g = e.center.y + mapCenterOffset.y,
                c = 0;
            for (var b = 0; b < a.length; b++) {
                var d = tileSize * Math.pow(2, e.zoomLevel - a[b].z1),
                    j = a[b].x1 * d,
                    h = a[b].x2 * d,
                    k = a[b].y1 * d,
                    i = a[b].y2 * d;
                if (f >= j && f <= h && g >= k && g <= i) c = Math.max(c, a[b].z2)
            }
            c = Math.max(c, tileLayerManager.GetMaxTileZoom());
            return c
        }
        function f(d) {
            var f = d.center.x + mapCenterOffset.x,
                g = d.center.y + mapCenterOffset.y,
                c = 0;
            for (var b = 0; b < a.length; b++) {
                var e = tileSize * Math.pow(2, d.zoomLevel - a[b].z1),
                    j = a[b].x1 * e,
                    h = a[b].x2 * e,
                    k = a[b].y1 * e,
                    i = a[b].y2 * e;
                if (f >= j && f <= h && g >= k && g <= i) {
                    c = 0;
                    if (a[b].z2 >= d.zoomLevel) {
                        tileLayerManager.SetMarketMaxZoom(a[b].z2);
                        return
                    } else if (a[b].z2 > c) {
                        tileLayerManager.SetMarketMaxZoom(a[b].z2);
                        c = a[b].z2;
                        if (c < tileLayerManager.GetMaxTileZoom()) if (d.zoomLevel <= tileLayerManager.GetMaxTileZoom()) c = d.zoomLevel;
                        else c = tileLayerManager.GetMaxTileZoom()
                    }
                }
            }
            d.SetZoomLevel(c)
        }
        this.IsValidTile = j;
        this.GetFilename = i;
        this.MetersPerPixel = b;
        this.PixelToLatLong = h;
        this.PixelToLatLongAsync = e;
        this.LatLongToPixel = g;
        this.LatLongToPixelAsync = d;
        this.GetBounds = k;
        this.ValidateZoomLevel = f;
        this.GetCurrentMaxZoomLevel = c
    }
    function ThreeDMode() {
        var internalOrthoMode = new OrthoMode,
            bounds = [new Msn.VE.Bounds(1, 17, 0, 0, 2, 2), new Msn.VE.Bounds(18, 19, 12379, 112260, 20388, 119266), new Msn.VE.Bounds(18, 19, 80099, 115425, 85051, 119645), new Msn.VE.Bounds(18, 19, 220032, 93184, 240640, 113792), new Msn.VE.Bounds(18, 19, 32768, 81920, 94208, 98304), new Msn.VE.Bounds(18, 19, 38912, 98304, 80896, 106496), new Msn.VE.Bounds(18, 19, 44544, 106496, 77824, 113408), new Msn.VE.Bounds(18, 19, 49152, 113408, 68096, 122880), new Msn.VE.Bounds(18, 19, 122880, 71680, 133120, 103424), new Msn.VE.Bounds(18, 19, 133120, 59392, 142848, 103424), new Msn.VE.Bounds(18, 19, 142848, 55296, 155648, 103424)];
        this.Init = function () {};
        this.Destroy = function () {};

        function IsValidTile(b, c, a) {
            return internalOrthoMode.IsValidTile(b, c, a)
        }
        function GetFilename(a, b, d, c) {
            return internalOrthoMode.GetFilename(a, b, d, c)
        }
        function MetersPerPixel(a) {
            return internalOrthoMode.MetersPerPixel(a)
        }
        function PixelToLatLong(pixel) {
            if (!view3DCreated) return null;
            var lat, lon, latlonvalid, result = spacecontrol.PixelToLatLong(pixel.x, pixel.y);
            eval(result);
            if (latlonvalid != 0) {
                var latlong = new Msn.VE.LatLong;
                latlong.latitude = RadToDeg(lat);
                latlong.longitude = RadToDeg(lon);
                return latlong
            }
            return null
        }
        function PixelToLatLongAsync(d, g, e) {
            var b = [];
            for (var a = 0; a < d.length; ++a) {
                var c = this.PixelToLatLong(d[a], g);
                if (Msn.VE.API != null) {
                    var f = new VELatLong(c.latitude, c.longitude);
                    b[a] = f
                } else b[a] = c
            }
            if (e) e(b)
        }
        function LatLongToPixel(latlong) {
            if (!view3DCreated) return null;
            var x, y, xyvalid = 0,
                result = spacecontrol.LatLongToPixel(parseFloat(latlong.latitude), parseFloat(latlong.longitude));
            eval(result);
            if (xyvalid != 0) {
                var pixel = new VEPixel(x, y);
                return pixel
            }
            return null
        }
        function LatLongToPixelAsync(b, e, d) {
            var c = [];
            for (var a = 0; a < b.length; ++a) c[a] = this.LatLongToPixel(b[a], e);
            if (d) d(c)
        }
        function GetBounds() {
            return null
        }
        function GetCurrentMaxZoomLevel() {
            return 19
        }
        function ValidateZoomLevel(a) {
            if (a.zoomLevel < 1) a.SetZoomLevel(1);
            if (a.zoomLevel > 19) a.SetZoomLevel(19)
        }
        function _InternalOrthoMode() {
            return internalOrthoMode
        }
        this._InternalOrthoMode = _InternalOrthoMode;
        this.IsValidTile = IsValidTile;
        this.GetFilename = GetFilename;
        this.MetersPerPixel = MetersPerPixel;
        this.PixelToLatLong = PixelToLatLong;
        this.PixelToLatLongAsync = PixelToLatLongAsync;
        this.LatLongToPixel = LatLongToPixel;
        this.LatLongToPixelAsync = LatLongToPixelAsync;
        this.GetBounds = GetBounds;
        this.ValidateZoomLevel = ValidateZoomLevel;
        this.GetCurrentMaxZoomLevel = GetCurrentMaxZoomLevel
    }
    function BoxTool() {
        var b = document.createElement("div"),
            a = document.createElement("div"),
            h, c = 0,
            d = 0,
            e = 0,
            f = 0;
        this.Init = function () {
            b.className = "MSVE_ZoomBox_bg";
            a.className = "MSVE_ZoomBox_fg";
            b.attachEvent("onmouseup", MouseUp);
            a.attachEvent("onmouseup", MouseUp);
            if (map != null) {
                map.appendChild(b);
                map.appendChild(a)
            }
        };
        this.Destroy = function () {
            b.detachEvent("onmouseup", MouseUp);
            a.detachEvent("onmouseup", MouseUp);
            if (map != null) {
                map.removeChild(b);
                map.removeChild(a)
            }
        };

        function k(i) {
            if (typeof VE_ContextMenu != "undefined" && VE_ContextMenu != null) {
                VE_ContextMenu.RemoveContextPin();
                VE_ContextMenu.CloseMenu()
            }
            var b = Gimme.Screen.getMousePosition(i);
            h = g(p_elSource).getPagePosition();
            c = e = b.x - h.x + offsetX;
            d = f = b.y - h.y + offsetY;
            j(c, d, 1, 1);
            o();
            if (a.setCapture) a.setCapture()
        }
        function l(i) {
            var a = Gimme.Screen.getMousePosition(i);
            e = a.x - h.x + offsetX;
            f = a.y - h.y + offsetY;
            var g = e - c,
                b = f - d;
            j(Math.min(c, c + g), Math.min(d, d + b), Math.abs(g), Math.abs(b))
        }
        function m(j) {
            if (MathAbs(c - e) > 1 && MathAbs(d - f) > 1) {
                var b = preferredView.MakeCopy();
                b.SetZoomLevel(currentView.zoomLevel);
                if (!j.shiftKey) b.SetPixelRectangle(new Msn.VE.PixelRectangle(new VEPixel(originX + c, originY + d), new VEPixel(originX + e, originY + f)));
                else {
                    var h = width / MathAbs(e - c),
                        i = height / MathAbs(f - d),
                        g = h < i ? h : i;
                    b.SetPixelRectangle(new Msn.VE.PixelRectangle(new VEPixel(originX - Math.floor(width * (g - 1) / 2), originY - Math.floor(height * (g - 1) / 2)), new VEPixel(originX + Math.floor(width * (g + 1) / 2), originY + Math.floor(height * (g + 1) / 2))))
                }
                SetView(b)
            }
            setTimeout(n, 250);
            if (a.releaseCapture) a.releaseCapture()
        }
        function j(e, f, d, c) {
            i(b, e + 1, f + 1, d, c);
            i(a, e, f, d, c)
        }
        function i(a, d, e, c, b) {
            a.style.left = d + "px";
            a.style.top = e + "px";
            a.style.width = c + "px";
            a.style.height = b + "px"
        }
        function o() {
            b.style.display = "block";
            a.style.display = "block"
        }
        function n() {
            b.style.display = "none";
            a.style.display = "none"
        }
        this.OnMouseDown = k;
        this.OnMouseMove = l;
        this.OnMouseUp = m
    }
    function PanTool() {
        var a = false;
        this.Init = function () {};
        this.Destroy = function () {};

        function b(b) {
            a = false;
            var d = Gimme.Screen.getMousePosition(b);
            lastMouseX = d.x;
            lastMouseY = d.y;
            if (p_elSource.setCapture) p_elSource.setCapture();
            var e = g(p_elSource).getPagePosition();
            x = e.x;
            y = e.y;
            var f = originX + offsetX + lastMouseX - x,
                h = originY + offsetY + lastMouseY - y,
                c = CreateEvent(currentMode.PixelToLatLong(new VEPixel(f, h), currentView.zoomLevel), currentView.zoomLevel, null, null, null, b.button, 0, b);
            Fire("onstartpan", c);
            FireDefaultEvent("onmousedown", c)
        }
        function c(e) {
            var d = Gimme.Screen.getMousePosition(e),
                b = d.x,
                c = d.y;
            PanMap(lastMouseX - b, lastMouseY - c);
            if (lastMouseX != b || lastMouseY != c) a = true;
            lastMouseX = b;
            lastMouseY = c
        }
        function d(c) {
            ComputeCenterPoint(true);
            if (p_elSource.releaseCapture) p_elSource.releaseCapture();
            if (a) {
                Fire("onendpan");
                Fire("onchangeview");
                a = false
            }
            var d = Gimme.Screen.getMousePosition(c),
                e = originX + offsetX + d.x - x,
                f = originY + offsetY + d.y - y,
                b = CreateEvent(currentMode.PixelToLatLong(new VEPixel(e, f), currentView.zoomLevel), currentView.zoomLevel, null, null, null, c.button, 0, c);
            FireDefaultEvent("onmouseup", b);
            FireDefaultEvent("onclick", b);
            return b
        }
        this.OnMouseDown = b;
        this.OnMouseMove = c;
        this.OnMouseUp = d
    }
    function TargetTool() {
        var b = this,
            f = Msn.VE.Geometry,
            d, a, e, c;
        this.centeringTrigger = false;
        g();

        function g() {
            d = false;
            a = false;
            e = null;
            c = false;
            m_dragging = false
        }
        this.init = function () {
            if (Msn.VE.MapStyle.IsViewOblique(currentView.mapStyle)) b.trackMovement()
        };
        this.destroy = function () {
            b.ignoreMovement();
            f = null
        };
        this.isOutOfBounds = function () {
            return a
        };
        this.trackMovement = function () {
            if (!d) {
                p_elSource.attachEvent("onmousemove", b.OnMouseMove);
                d = true
            }
        };
        this.ignoreMovement = function () {
            p_elSource.detachEvent("onmousemove", b.OnMouseMove);
            d = a = b.centeringTrigger = false;
            p_this.SetCursor(cssCursors.Grab)
        };
        this.setBoundingArea = function (a) {
            if (a instanceof f.Rectangle) e = a
        };
        this.OnMouseDown = function () {};
        this.OnMouseMove = function (b) {
            if (e == null) return;
            if (!dragging) {
                var d = Gimme.Screen.getMousePosition(b);
                if (!e.containsPoint(d)) {
                    if (!hijackMouseMove && (!c || p_elSource.style.cursor != cssCursors.Target)) {
                        a = c = true;
                        p_this.SetCursor(cssCursors.Target)
                    }
                } else if (c) {
                    a = c = false;
                    p_this.SetCursor(cssCursors.Grab)
                }
            }
        };
        this.OnMouseUp = function (c) {
            if (typeof VE_ContextMenu != "undefined" && VE_ContextMenu != null) {
                VE_ContextMenu.RemoveContextPin();
                VE_ContextMenu.CloseMenu()
            }
            var g = c.which || c.button;
            if (a && g == 1) {
                c.cancelBubble = true;
                b.centeringTrigger = true;
                var e = originX + offsetX + Math.round(GetMapWidth() / 2),
                    f = originY + offsetY + Math.round(GetMapHeight() / 2),
                    d = currentMode.PixelToLatLong(new VEPixel(e, f), currentView.zoomLevel);
                SetCenter(d.latitude, d.longitude)
            }
        }
    }
    function GetTrafficAvailability() {
        return trafficAvailable
    }
    function GetSlidingExpirationForAutoRefresh() {
        return 1800000
    }
    function GetAutoRefreshRate() {
        return 300000
    }
    function GetMarketsFile() {
        return Msn.VE.API ? Msn.VE.API.Constants.trafficmarketsserver : "%0t0.tiles.virtualearth.net/incidents/markets.js"
    }
    function GetIncidentsFile() {
        return Msn.VE.API ? Msn.VE.API.Constants.trafficincidentsserver : "%0t0.tiles.virtualearth.net/incidents/market-%1.js"
    }
    var setTrafficViewflag = true;

    function SetTrafficView() {
        var a = new VETileSourceSpecification;
        a.ID = trafficTiles;
        a.SourceName = Msn.VE.API ? Msn.VE.API.Constants.traffictileserver : "%0t%2.tiles.virtualearth.net/tiles/t%4";
        var b = "?";
        if (a.SourceName.match(/\?/)) b = "&";
        a.SourceName = a.SourceName + b + "tc=" + Math.floor((new Date).getTime() / (GetAutoRefreshRate() * .8));
        a.NumServers = 2;
        tileLayerManager.AddTileSource(a);
        var c = typeof Msn.VE.API != "undefined" && Msn.VE.API != null;
        tileLayerManager.LoadTileLayer("Traffic", a.ID, .6, c ? 2 : 3)
    }
    function VETileLayerManager() {
        var d = [],
            b = [],
            a = [],
            c = {},
            e = {},
            g = {},
            k = null,
            i = true,
            h = 17;
        this.AddTileSource = function (a) {
            d[a.ID] = a;
            if (g[a.ID]) this.SetClientToken(a.ID, g[a.ID])
        };
        this.Add3DTileSource = function (e, c, h) {
            if (trafficTiles == e) return;
            if (1 == b[e].zIndex) return;
            if (typeof b[e].IsVisible != "undefined" && b[e].IsVisible == false) return;
            var g = c.MaxZoom == 1 ? 21 : c.MaxZoom,
            a = 'ID="' + c.ID + '" TILESOURCE="' + c.SourceName + '" MINZOOM="' + c.MinZoom + '" MAXZOOM="' + g + '"',
            d = c.Bounds;
            if (typeof d != "undefined" && d != null) {
                a = a + ' Bounds="';
                for (var f = 0; f < d.length; f++) {
                    if (f > 0) a = a + ",";
                    a = a + d[f].TopLeftLatLong.Longitude + "," + d[f].BottomRightLatLong.Latitude + "," + d[f].BottomRightLatLong.Longitude + "," + d[f].TopLeftLatLong.Latitude
                }
                a = a + '"'
            }
            h.AddImageSource(e, c.ID, a, b[e].zIndex, b[e].opacity)
        };
        this.Remove3DTileSource = function (b, a, c) {
            c.RemoveImageSource(b, a.ID)
        };
        this.AddAllTileSourcesTo3D = function (d) {
            if (typeof Msn.VE.API != "undefined" && Msn.VE.API != null) for (var c = 0; c < a.length; c++) this.Add3DTileSource(a[c], b[a[c]], d)
        };
        this.AddMapServiceLayersTo3D = function (f) {
            for (var d = 0; d < a.length; d++) {
                var e = a[d],
                    c = b[e];
                if (c != null && c.ID.indexOf("VE_MapServiceLayer") == 1) tileLayerManager.Add3DTileSource(e, c, f)
            }
        };
        this.DeleteMapServiceLayersFrom3D = function (f, e) {
            for (var c = 0; c < e.length; c++) {
                var d = e[c],
                    a = b[d];
                if (a != null && a.ID.indexOf("VE_MapServiceLayer") == 1) f.RemoveImageSource(d, a.ID)
            }
        };
        this.LoadBaseLayer = function (c, e, f, g) {
            if (b[c] == null || typeof b[c] == "undefined") a.push(c);
            b[c] = d[e];
            b[c].opacity = f;
            b[c].zIndex = g
        };
        this.HideBaseTileLayer = function () {
            this.SetTileLayerVisibility(mapTiles, false);
            this.RefreshTileLayer(mapTiles)
        };
        this.ShowBaseTileLayer = function () {
            this.SetTileLayerVisibility(mapTiles, true);
            this.RefreshTileLayer(mapTiles)
        };
        this.SetTileLayerVisibility = function (c, a) {
            if (b[c] != null && typeof a != "undefined") b[c].IsVisible = a
        };
        this.LoadTileLayer = function (g, h, m, n) {
            if (!i) return;
            if (b[g] == null || typeof b[g] == "undefined") a.push(g);
            b[g] = d[h];
            if (c[g]) {
                ClearTiles(c[g]);
                if (typeof Msn.VE.API != "undefined" && Msn.VE.API != null) {
                    var j = f();
                    if (typeof j != "undefined" && j != null) tileLayerManager.Remove3DTileSource(g, d[h], j)
                }
            }
            if (typeof b[g].IsVisible != "undefined" && b[g].IsVisible == false) return;
            c[g] = [];
            e[g] = [];
            if (m != null && m != "undefined") b[g].opacity = m;
            else b[g].opacity = 1;
            if (n != null && n != "undefined") b[g].zIndex = n;
            else b[g].zIndex = 1;
            var k = false;
            if (typeof Msn.VE.API != "undefined" && Msn.VE.API != null) {
                var j = f();
                if (typeof j != "undefined" && j != null) tileLayerManager.Add3DTileSource(g, d[h], j)
            }
            var l = d[h].MaxZoom;
            if (l == 1) l = d[mapTiles].MaxZoom;
            if (currentView.zoomLevel >= d[h].MinZoom && currentView.zoomLevel <= l) if (d[h].Bounds != "undefined" && d[h].Bounds != null) k = tileLayerManager.CheckTilesAvailability(h, g);
            else k = true;
            if (k && b[g].LoadTiles) {
                b[g].isActive = true;
                for (var p = tileViewportY1; p <= tileViewportY2; p++) for (var o = tileViewportX1; o <= tileViewportX2; o++) {
                    var q = RequestTile(o, p, currentView.zoomLevel, currentView.mapStyle, b[g], h, b[g].opacity, b[g].zIndex);
                    c[g].push(q)
                }
            }
        };
        this.SetViewPort = function () {
            map.style.top = "0px";
            map.style.left = "0px";
            originX = MathRound(currentView.center.x - width / 2);
            originY = MathRound(currentView.center.y - height / 2);
            offsetX = 0;
            offsetY = 0;
            var a = this.CalculateTileViewPort(true, originX, originY, originX + width, originY + height);
            tileViewportX1 = a[0];
            tileViewportY1 = a[1];
            tileViewportX2 = a[2];
            tileViewportY2 = a[3];
            tileViewportWidth = a[4];
            tileViewportHeight = a[5];
            Fire("onmapoffsetreset")
        };
        this.CalculateTileViewPort = function (f, b, d, c, e) {
            var a = [];
            b = (b - buffer) / tileSize;
            d = (d - buffer) / tileSize;
            c = (c + buffer) / tileSize;
            e = (e + buffer) / tileSize;
            if (f) {
                b = MathFloor(b);
                d = MathFloor(d);
                c = MathFloor(c);
                e = MathFloor(e)
            }
            a[0] = b;
            a[1] = d;
            a[2] = c;
            a[3] = e;
            a[4] = a[2] - a[0] + 1;
            a[5] = a[3] - a[1] + 1;
            return a
        };
        this.GetViewPort = function () {
            var a = [];
            a[0] = tileViewportX1;
            a[1] = tileViewportY1;
            a[2] = tileViewportX2;
            a[3] = tileViewportY2;
            a[4] = tileViewportWidth;
            a[5] = tileViewportHeight;
            return a
        };
        this.FinalizeView = function () {
            zooming = false;
            for (var b = 0; b < a.length; b++) {
                if (e[a[b]]) {
                    ClearTiles(e[a[b]]);
                    e[a[b]] = null
                }
                for (var d = 0; d < c[a[b]].length; d++) {
                    var f = c[a[b]];
                    f[d].SwapStates();
                    f[d].ClearSteps();
                    f[d].SetFactor(0);
                    f[d].ClearStates()
                }
            }
            for (var b = 0; b < pushpins.length; b++) {
                pushpins[b].SwapStates();
                pushpins[b].ClearSteps();
                pushpins[b].SetFactor(0)
            }
            if (copyright) copyright.Update();
            if (previousMapStyle != currentView.mapStyle) {
                Fire("onchangemapstyle");
                previousMapStyle = currentView.mapStyle
            }
            if (previousZoomLevel != currentView.zoomLevel) Fire("onendzoom");
            Fire("onchangeview");
            try {
                CollectGarbage()
            } catch(g) {}
        };
        this.CheckLayerUpdatability = function (d) {
            var e = false;
            if (typeof b[a[d]].LoadTiles == "undefined" || b[a[d]].LoadTiles != false) {
                if (b[a[d]].isActive == false) this.RefreshTileLayer(b[a[d]].ID);
                if (d >= 0) e = b[a[d]].ID == mapTiles || c[a[d]].length > 0
            }
            return e
        };
        this.PanView = function () {
            if (!i) return;
            if (zooming) return;
            var h = originX + offsetX,
                j = originY + offsetY,
                k = MathFloor((h - buffer) / tileSize),
                m = MathFloor((j - buffer) / tileSize),
                l = MathFloor((h + width + buffer) / tileSize),
                n = MathFloor((j + height + buffer) / tileSize);
            while (tileViewportX1 < k) {
                for (var e = tileViewportHeight - 1; e >= 0; e--) for (var d = 0; d < a.length; d++) if (tileLayerManager.CheckLayerUpdatability(d)) {
                    var g = c[a[d]].splice(e * tileViewportWidth, 1)[0];
                    try {
                        g.RemoveFromMap()
                    } catch(o) {}
                }
                tileViewportX1++;
                tileViewportWidth--
            }
            while (tileViewportX1 > k) {
                tileViewportX1--;
                tileViewportWidth++;
                for (var e = 0; e < tileViewportHeight; e++) for (var d = 0; d < a.length; d++) if (tileLayerManager.CheckLayerUpdatability(d)) {
                    var g = RequestTile(tileViewportX1, tileViewportY1 + e, currentView.zoomLevel, currentView.mapStyle, b[a[d]], a[d], b[a[d]].opacity, b[a[d]].zIndex);
                    c[a[d]].splice(e * tileViewportWidth, 0, g)
                }
            }
            while (tileViewportY1 < m) {
                for (var f = 0; f < tileViewportWidth; f++) for (var d = 0; d < a.length; d++) if (tileLayerManager.CheckLayerUpdatability(d)) {
                    var g = c[a[d]].shift();
                    try {
                        g.RemoveFromMap()
                    } catch(o) {}
                }
                tileViewportY1++;
                tileViewportHeight--
            }
            while (tileViewportY1 > m) {
                tileViewportY1--;
                tileViewportHeight++;
                for (var f = tileViewportWidth - 1; f >= 0; f--) for (var d = 0; d < a.length; d++) if (tileLayerManager.CheckLayerUpdatability(d)) {
                    var g = RequestTile(tileViewportX1 + f, tileViewportY1, currentView.zoomLevel, currentView.mapStyle, b[a[d]], a[d], b[a[d]].opacity, b[a[d]].zIndex);
                    c[a[d]].unshift(g)
                }
            }
            while (tileViewportX2 > l) {
                for (var e = tileViewportHeight - 1; e >= 0; e--) for (var d = 0; d < a.length; d++) if (tileLayerManager.CheckLayerUpdatability(d)) {
                    var g = c[a[d]].splice(e * tileViewportWidth + tileViewportWidth - 1, 1)[0];
                    try {
                        g.RemoveFromMap()
                    } catch(o) {}
                }
                tileViewportX2--;
                tileViewportWidth--
            }
            while (tileViewportX2 < l) {
                tileViewportX2++;
                tileViewportWidth++;
                for (var e = 0; e < tileViewportHeight; e++) for (var d = 0; d < a.length; d++) if (tileLayerManager.CheckLayerUpdatability(d)) {
                    var g = RequestTile(tileViewportX2, tileViewportY1 + e, currentView.zoomLevel, currentView.mapStyle, b[a[d]], a[d], b[a[d]].opacity, b[a[d]].zIndex);
                    c[a[d]].splice(e * tileViewportWidth + tileViewportWidth - 1, 0, g)
                }
            }
            while (tileViewportY2 > n) {
                for (var f = 0; f < tileViewportWidth; f++) for (var d = 0; d < a.length; d++) if (tileLayerManager.CheckLayerUpdatability(d)) {
                    var g = c[a[d]].pop();
                    try {
                        g.RemoveFromMap()
                    } catch(o) {}
                }
                tileViewportY2--;
                tileViewportHeight--
            }
            while (tileViewportY2 < n) {
                tileViewportY2++;
                tileViewportHeight++;
                for (var f = 0; f < tileViewportWidth; f++) for (var d = 0; d < a.length; d++) if (tileLayerManager.CheckLayerUpdatability(d)) {
                    var g = RequestTile(tileViewportX1 + f, tileViewportY2, currentView.zoomLevel, currentView.mapStyle, b[a[d]], a[d], b[a[d]].opacity, b[a[d]].zIndex);
                    c[a[d]].push(g)
                }
            }
        };
        this.StepAnimation = j;
        this.zoomView = function (g) {
            if (!i) return;
            var l = originX + offsetX,
                m = originY + offsetY,
                o = currentView.zoomLevel,
                k = g.zoomLevel,
                h = MathRound(g.center.x - width / 2),
                j = MathRound(g.center.y - height / 2);
            e[mapTiles] = c[mapTiles];
            for (var d = 0; d < a.length; d++) if (b[a[d]].ID == mapTiles) c[a[d]] = [];
            else ClearTiles(c[a[d]]);
            for (var f = 0; f < e[mapTiles].length; f++) e[mapTiles][f].PrepareBaseTile(l, m, o, h, j, k);
            for (var d = 0; d < pushpins.length; d++) pushpins[d].PrepareForZoom(h, j, k);
            currentView.Destroy();
            currentView = g;
            var n = [];
            n = e[mapTiles];
            this.SetViewPort();
            this.RefreshTileLayers();
            e[mapTiles] = n;
            for (var f = 0; f < c[mapTiles].length; f++) c[mapTiles][f].PrepareSwapTile(l, m, o, h, j, k);
            zoomCounter = 1;
            this.StepAnimation()
        };

        function j() {
            if (!zooming) return;
            for (var a = 0; a < e[mapTiles].length; a++) e[mapTiles][a].SetFactor(zoomCounter);
            for (var a = 0; a < c[mapTiles].length; a++) c[mapTiles][a].SetFactor(zoomCounter);
            for (var b = 0; b < pushpins.length; b++) pushpins[b].SetFactor(zoomCounter);
            if (zoomCounter < zoomTotalSteps) {
                zoomCounter++;
                window.setTimeout(j, 1)
            } else {
                zoomCounter = 0;
                tileLayerManager.FinalizeView()
            }
        }
        this.ClearTileLayers = function () {
            for (var d = 0; d < a.length; d++) {
                ClearTiles(c[a[d]]);
                b[a[d]] = null;
                delete b[a[d]];
                a[d] = null
            }
            a.length = 0
        };

        function f() {
            if (typeof Msn.VE.API.Globals.vemapinstances == "undefined" || Msn.VE.API.Globals.vemapinstances == null) return null;
            var b = 0;
            for (var a in Msn.VE.API.Globals.vemapinstances) if (Msn.VE.API.Globals.vemapinstances[a] instanceof VEMap && Msn.VE.API.Globals.vemapinstances[a].vemapcontrol && Msn.VE.API.Globals.vemapinstances[a].GetMapMode() == VEMapMode.Mode3D) return Msn.VE.API.Globals.vemapinstances[a].vemapcontrol.Get3DControl();
            return null
        }
        this.ClearTileLayer = function (d) {
            if (b[d] != null && b[d] != "undefined") {
                if (typeof Msn.VE.API != "undefined" && Msn.VE.API != null) {
                    var g = f();
                    if (typeof g != "undefined" && g != null) g.RemoveImageSource(d, b[d].ID)
                }
                ClearTiles(c[d]);
                b[d] = null;
                delete b[d]
            }
            for (var e = 0; e < a.length; e++) if (a[e] == d) {
                a[e] = null;
                a.splice(e, 1)
            }
        };
        this.RefreshTileLayers = function () {
            if (a != null) for (var c = 0; c < a.length; c++) this.LoadTileLayer(a[c], b[a[c]].ID, b[a[c]].opacity, b[a[c]].zIndex)
        };
        this.RefreshTileLayer = function (a) {
            this.LoadTileLayer(a, b[a].ID, b[a].opacity, b[a].zIndex)
        };
        this.SetTileSource = function (a) {
            var b = new VETileSourceSpecification;
            b.ID = a.ID;
            b.SourceName = a.TileSource;
            b.NumServers = a.NumServers;
            b.Bounds = a.Bounds;
            if (typeof a.MinZoomLevel != "undefined" && a.MinZoomLevel != null) b.MinZoom = a.MinZoomLevel;
            if (typeof a.MaxZoomLevel != "undefined" && a.MaxZoomLevel != null) {
                b.MaxZoom = a.MaxZoomLevel;
                if (b.MaxZoom > h) h = b.MaxZoom
            }
            if (a.GetTilePath != "undefined" && a.GetTilePath != null) b.GetTilePath = a.GetTilePath;
            tileLayerManager.AddTileSource(b)
        };
        this.DeleteTileSource = function (f) {
            if (d[f] != null && d[f] != "undefined") {
                d[f] = null;
                delete d[f]
            }
            if (a != null) for (var e = 0; e < a.length; e++) if (b[a[e]] != null && b[a[e]] != "undefined" && b[a[e]].ID == f) {
                ClearTiles(c[a[e]]);
                b[a[e]] = null;
                delete b[a[e]];
                a[e] = null;
                a.splice(e, 1)
            }
        };
        this.CheckTilesAvailability = function (g, n) {
            if (typeof d[g].LoadTiles != "undefined" && d[g].LoadTiles == false) return false;
            var k = PixelToLatLong(new VEPixel(0, 0)),
                j = PixelToLatLong(new VEPixel(width, height));
            if (k == null || j == null) return;
            var a = k.latitude,
                c = j.longitude,
                e = j.latitude,
                f = k.longitude;
            if (a < e) {
                var i = a;
                a = e;
                e = i
            }
            if (c < f) {
                var i = c;
                c = f;
                f = i
            }
            var l = new Msn.VE.LatLongRectangle(new Msn.VE.LatLong(a, f), new Msn.VE.LatLong(e, c)),
                o = d[g].Bounds.length;
            for (var h = 0; h < o; h++) {
                a = d[g].Bounds[h].TopLeftLatLong.Latitude;
                c = d[g].Bounds[h].BottomRightLatLong.Longitude;
                e = d[g].Bounds[h].BottomRightLatLong.Latitude;
                f = d[g].Bounds[h].TopLeftLatLong.Longitude;
                if (a < e) {
                    var i = a;
                    a = e;
                    e = i
                }
                if (c < f) {
                    var i = c;
                    c = f;
                    f = i
                }
                var m = new Msn.VE.LatLongRectangle(new Msn.VE.LatLong(a, f), new Msn.VE.LatLong(e, c));
                if (tileLayerManager.BBOverlap(l, m)) return true
            }
            b[n].isActive = false;
            return false
        };
        this.BBOverlap = function (a, b) {
            return this.RectInBoundingBox(b, a)
        };
        this.RectInBoundingBox = function (a, b) {
            return ! (a.southeast.latitude > b.northwest.latitude || a.southeast.longitude < b.northwest.longitude || a.northwest.latitude < b.southeast.latitude || a.northwest.longitude > b.southeast.longitude)
        };
        this.ShowTrafficLegend = function (a) {
            k = a;
            Fire("onapitrafficdisplay")
        };
        this.HideTrafficLegend = function () {
            Fire("onapitraffichide")
        };
        this.GetTimeStamp = function () {
            return k
        };
        this.GetMaxTileZoom = function () {
            return h
        };
        this.SetMarketMaxZoom = function (a) {
            marketMaxZoom = a;
            d[mapTiles].MaxZoom = a
        };
        this.SetClientToken = function (a, b) {
            g[a] = b;
            if (d[a]) d[a].SetClientToken(b)
        };
        this.SetPrintable = function (f) {
            if (f) for (var b = 0; b < a.length; b++) {
                var e = c[a[b]].length;
                for (var d = 0; d < e; d++) c[a[b]][d].AddPrintTile()
            } else for (var b = 0; b < a.length; b++) {
                var e = c[a[b]].length;
                for (var d = 0; d < e; d++) c[a[b]][d].RemovePrintTile()
            }
        };
        this.RePositionPrintTiles = function () {
            for (var b = 0; b < a.length; b++) {
                var e = c[a[b]].length;
                for (var d = 0; d < e; d++) c[a[b]][d].RePositionPrintTile()
            }
        }
    }
    function VETileSourceSpecification() {
        this.Subdomains = null;
        this.SubdomainsMaxX = 1;
        this.SubdomainsMaxY = 1;
        this.ID = "";
        this.SourceName = "";
        this.OriginalName = null;
        this.OriginSourceName = "";
        this.NumServers = 0;
        this.Bounds = null;
        this.MinZoom = minZoom;
        this.MaxZoom = 1;
        this.IsVisible = true;
        this.LoadTiles = true;
        this.GetTilePath = function (a) {
            try {
                if (a != null && a != "undefined") {
                    var e = "",
                        c = 0;
                    for (var b = a.ZoomLevel; b > 0; b--) {
                        c = 0;
                        var d = 1 << b - 1;
                        if ((a.XPos & d) != 0) c++;
                        if ((a.YPos & d) != 0) c += 2;
                        e += c + ""
                    }
                    var b;
                    if (this.Subdomains == null) b = c % this.NumServers;
                    else b = this.Subdomains[a.XPos % this.SubdomainsMaxX][a.YPos % this.SubdomainsMaxY];
                    return this.SourceName.replace(/%1/g, a.MapStyle).replace(/%2/g, b).replace(/%3/g, a.MapStyle).replace(/%4/g, e).replace(/%5/g, a.MapStyle == roadStyle ? "png" : "jpeg").replace(/%6/g, generations[a.MapStyle])
                } else return ""
            } catch(f) {}
        };
        this.SetClientToken = function (c) {
            if (!this.OriginalName) this.OriginalName = this.SourceName;
            var a = this.OriginalName;
            if (c && this.OriginSourceName) {
                a = this.OriginSourceName;
                var b;
                if (a.indexOf("?") >= 0) b = "&";
                else b = "?";
                a = a.concat(b, Msn.VE.API.Constants.clienttoken, "=", c)
            } else this.OriginalName = null;
            this.SourceName = a
        }
    }
    function VETileLayerSpecification() {
        this.ID = "";
        this.ZIndex = 0;
        this.Opacity = 1
    }
    function VETileContext() {
        this.XPos = 0;
        this.YPos = 0;
        this.ZoomLevel = 0;
        this.MapStyle = ""
    }
    VEAuthenticationCode = function () {};
    VEAuthenticationCode.None = 0;
    VEAuthenticationCode.NoToken = 1;
    VEAuthenticationCode.TokenValid = 2;
    VEAuthenticationCode.TokenInvalid = 3;
    VEAuthenticationCode.TokenExpired = 4;
    VEAuthenticationCode.TokenIPInvalid = 5;
    VEAuthenticationCode.TokenExpiredAndIPInvalid = 6;
    VEAuthenticationCode.TokenValidButNotAuthorized = 7;
    this.__HandleAuthentication = function (a) {
        if (a && a.ResponseSummary && a.ResponseSummary.AuthResultCode) {
            var b = a.ResponseSummary.AuthResultCode;
            switch (b) {
            case VEAuthenticationCode.TokenExpired:
            case VEAuthenticationCode.TokenExpiredAndIPInvalid:
                this.Fire("ontokenexpire");
                break;
            case VEAuthenticationCode.TokenInvalid:
            case VEAuthenticationCode.TokenIPInvalid:
            case VEAuthenticationCode.TokenValidButNotAuthorized:
                this.Fire("ontokenerror")
            }
        }
    };
    this.SetCenter = SetCenter;
    this.SetCenterAccurate = SetCenterAccurate;
    this.SetMapStyle = SetMapStyle;
    this.SetScaleBarDistanceUnit = SetScaleBarDistanceUnit;
    this.SetScaleBarVisibility = SetScaleBarVisibility;
    this.OnView3DScaleBarPositionUpdate = OnView3DScaleBarPositionUpdate;
    this.GetCenterLatitude = GetCenterLatitude;
    this.GetCenterLongitude = GetCenterLongitude;
    this.GetLatitude = GetLatitude;
    this.GetLongitude = GetLongitude;
    this.GetY = GetY;
    this.GetX = GetX;
    this.LatLongToPixel = LatLongToPixel;
    this.LatLongToPixelAsync = LatLongToPixelAsync;
    this.PixelToLatLong = PixelToLatLong;
    this.PixelToLatLongAsync = PixelToLatLongAsync;
    this.GetZoomLevel = GetZoomLevel;
    this.GetMapStyle = GetMapStyle;
    this.GetMapMode = GetMapMode;
    this.GetMode = GetMode;
    this.GetAltitude = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? GetAltitude : function () {
        NotSupportedMethod("VEMapControl", "GetAltitude")
    };
    this.GetDirection = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? GetDirection : function () {
        NotSupportedMethod("VEMapControl", "GetDirection")
    };
    this.GetTilt = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? GetTilt : function () {
        NotSupportedMethod("VEMapControl", "GetTilt")
    };
    this.GetMetersPerPixel = GetMetersPerPixel;
    this.Fill = Fill;
    this.Resize = Resize;
    this.PanMap = PanMap;
    this.ContinuousPan = ContinuousPan;
    this.StopContinuousPan = StopContinuousPan;
    this.StopKeyboardPan = StopKeyboardPan;
    this.PanToLatLong = PanToLatLong;
    this.PanByPixel = PanByPixel;
    this.GetPushpins = GetPushpins;
    this.AddPushpin = AddPushpin;
    this.RemovePushpin = RemovePushpin;
    this.ClearPushpins = ClearPushpins;
    this.GetPushpinMapPixel = GetPushpinMapPixel;
    this.SetViewport = SetViewport;
    this.SetBestMapView = SetBestMapView;
    this.ClipLatitude = ClipLatitude;
    this.ClipLongitude = ClipLongitude;
    this.GetBestMapViewBounds = GetBestMapViewBounds;
    this.IncludePointInViewport = IncludePointInViewport;
    this.SetZoom = SetZoom;
    this.SetTilt = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? SetTilt : function () {
        NotSupportedMethod("VEMapControl", "SetTilt")
    };
    this.SetDirection = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? SetDirection : function () {
        NotSupportedMethod("VEMapControl", "SetDirection")
    };
    this.SetAltitude = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? SetAltitude : function () {
        NotSupportedMethod("VEMapControl", "SetAltitude")
    };
    this.ZoomIn = ZoomIn;
    this.ZoomOut = ZoomOut;
    this.SetCenterAndZoom = SetCenterAndZoom;
    this.AddLine = AddLine;
    this.RemoveLine = RemoveLine;
    this.ClearLines = ClearLines;
    this.AttachEvent = AttachEvent;
    this.DetachEvent = DetachEvent;
    this.AttachCustomEvent = AttachCustomEvent;
    this.DetachCustomEvent = DetachCustomEvent;
    this.FireCustomEvent = FireCustomEvent;
    this.DisposeAllCustomEvent = DisposeAllCustomEvent();
    this.CreateEvent = CreateEvent;
    this.Fire = Fire;
    this.IsObliqueAvailable = IsObliqueAvailable;
    this.GetObliqueScene = GetObliqueScene;
    this.SetAnimationEnabled = SetAnimationEnabled;
    this.IsAnimationEnabled = IsAnimationEnabled;
    this.SetObliqueScene = $MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye) ? SetObliqueScene : function () {
        NotSupportedMethod("VEMapControl", "SetObliqueScene")
    };
    this.SetObliqueLocation = $MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye) ? SetObliqueLocation : function () {
        NotSupportedMethod("VEMapControl", "SetObliqueLocation")
    };
    this.SetObliqueOrientation = $MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye) ? SetObliqueOrientation : function () {
        NotSupportedMethod("VEMapControl", "SetObliqueOrientation")
    };
    this.SetView = SetView;
    this.Debug = Debug;
    this.GetResponseRangeCounts = GetResponseRangeCounts;
    this.ResetResponseRangeCounts = ResetResponseRangeCounts;
    this.GetFailureRate = GetFailureRate;
    this.SetTrafficView = $MVEM.IsEnabled(MapControl.Features.Traffic.Enabled) ? SetTrafficView : function () {
        NotSupportedMethod("VEMapControl", "SetTrafficView")
    };
    this.GetTrafficAvailability = GetTrafficAvailability;
    this.GetMarketsFile = GetMarketsFile;
    this.GetIncidentsFile = GetIncidentsFile;
    this.GetSlidingExpirationForAutoRefresh = $MVEM.IsEnabled(MapControl.Features.Traffic.Enabled) ? GetSlidingExpirationForAutoRefresh : function () {
        NotSupportedMethod("VEMapControl", "GetSlidingExpirationForAutoRefresh")
    };
    this.GetAutoRefreshRate = $MVEM.IsEnabled(MapControl.Features.Traffic.Enabled) ? GetAutoRefreshRate : function () {
        NotSupportedMethod("VEMapControl", "GetAutoRefreshRate")
    };
    this.GetMapLegend = GetMapLegend;
    this.SetFocus = SetFocus;
    this.GetCurrentMode = GetCurrentMode;
    this.GetObliqueMode = GetObliqueMode;
    this.GetOrthoMode = GetOrthoMode;
    this.GetMapWidth = GetMapWidth;
    this.GetMapHeight = GetMapHeight;
    this.GetCurrentMapView = GetCurrentMapView;
    this.SetBaseTileSource = SetBaseTileSource;
    this.SetTileSource = tileLayerManager.SetTileSource;
    this.SetTileLayerVisibility = tileLayerManager.SetTileLayerVisibility;
    this.AddMapServiceLayersTo3D = tileLayerManager.AddMapServiceLayersTo3D;
    this.DeleteMapServiceLayersFrom3D = tileLayerManager.DeleteMapServiceLayersFrom3D;
    this.LoadTileLayer = tileLayerManager.LoadTileLayer;
    this.ClearTileLayer = tileLayerManager.ClearTileLayer;
    this.ClearTileLayers = tileLayerManager.ClearTileLayers;
    this.DeleteTileSource = tileLayerManager.DeleteTileSource;
    this.HideBaseTileLayer = tileLayerManager.HideBaseTileLayer;
    this.ShowBaseTileLayer = tileLayerManager.ShowBaseTileLayer;
    this.RefreshTileLayer = tileLayerManager.RefreshTileLayer;
    this.RefreshTileLayers = tileLayerManager.RefreshTileLayers;
    this.ShowTrafficLegend = $MVEM.IsEnabled(MapControl.Features.Traffic.Enabled) ? tileLayerManager.ShowTrafficLegend : function () {
        NotSupportedMethod("VEMapControl", "ShowTrafficLegend")
    };
    this.HideTrafficLegend = $MVEM.IsEnabled(MapControl.Features.Traffic.Enabled) ? tileLayerManager.HideTrafficLegend : function () {
        NotSupportedMethod("VEMapControl", "HideTrafficLegend")
    };
    this.GetTimeStamp = $MVEM.IsEnabled(MapControl.Features.Traffic.Enabled) ? tileLayerManager.GetTimeStamp : function () {
        NotSupportedMethod("VEMapControl", "GetTimeStamp")
    };
    this.GetMaxTileZoom = tileLayerManager.GetMaxTileZoom;
    this.PanView = tileLayerManager.PanView;
    this.LoadBaseLayer = tileLayerManager.LoadBaseLayer;
    this.GetCurrentViewMaxZoomLevel = GetCurrentViewMaxZoomLevel;
    this.SetTilePixelBuffer = SetTilePixelBuffer;
    this.SetClientToken = SetClientToken;
    this.SetMapHeight = SetMapHeight;
    this.GetMapSurface = GetMapSurface;
    this.EnableMode = EnableMode;
    this._Enable3DMode = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? _Enable3DMode : function () {
        NotSupportedMethod("VEMapControl", "_Enable3DMode")
    };
    this._Disable3DMode = _Disable3DMode;
    this.ControlReady = ControlReady;
    this.Get3DVisibleArea = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? Get3DVisibleArea : function () {
        NotSupportedMethod("VEMapControl", "Get3DVisibleArea")
    };
    this.Get3DControl = Get3DControl;
    this.IsModeEnabled = IsModeEnabled;
    this.Sync3dView = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? Sync3dView : function () {
        NotSupportedMethod("VEMapControl", "Sync3dView")
    };
    this.OnBeginCameraUpdate = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? OnBeginCameraUpdate : function () {
        NotSupportedMethod("VEMapControl", "OnBeginCameraUpdate")
    };
    this.OnEndCameraUpdate = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? OnEndCameraUpdate : function () {
        NotSupportedMethod("VEMapControl", "OnEndCameraUpdate")
    };
    this.IsCameraFlying = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? IsCameraFlying : function () {
        NotSupportedMethod("VEMapControl", "IsCameraFlying")
    };
    this.Show3DTraffic = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? Show3DTraffic : function () {
        NotSupportedMethod("VEMapControl", "Show3DTraffic")
    };
    this.Remove3DTraffic = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? Remove3DTraffic : function () {
        NotSupportedMethod("VEMapControl", "Remove3DTraffic")
    };
    this.Show3DBirdseye = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? Show3DBirdseye : function () {
        NotSupportedMethod("VEMapControl", "Show3DBirdseye")
    };
    this.IterativeCameraRefinement = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? IterativeCameraRefinement : function () {
        NotSupportedMethod("VEMapControl", "IterativeCameraRefinement")
    };
    this.SetChildDiv = SetChildDiv;
    this.EnableGeoCommunity = EnableGeoCommunity;
    this.IsGeoCommunityEnabled = IsGeoCommunityEnabled;
    this.HijackMouseCursor = HijackMouseCursor;
    this.IsHijackMouseCursor = IsHijackMouseCursor;
    this.GetOffsetX = GetOffsetX;
    this.GetOriginY = GetOriginY;
    this.GetOriginX = GetOriginX;
    this.GetOffsetY = GetOffsetY;
    this.GetCenterOffset = GetCenterOffset;
    this.SetCenterOffset = SetCenterOffset;
    this.UpdatePreferredView = UpdatePreferredView;
    this.GetGraphic = GetGraphic;
    this.GetCurrentTileViewPort = GetCurrentTileViewPort;
    this.CalculateTileViewPort = CalculateTileViewPort;
    this.CreateDashboard = CreateDashboard;
    this.GetLastViewChangeType = GetLastViewChangeType;
    this.SetOn3DAnimationInterruptedCallback = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? SetOn3DAnimationInterruptedCallback : function () {
        NotSupportedMethod("VEMapControl", "SetOn3DAnimationInterruptedCallback")
    };
    this.GetOn3DAnimationInterruptedCallback = $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) ? GetOn3DAnimationInterruptedCallback : function () {
        NotSupportedMethod("VEMapControl", "GetOn3DAnimationInterruptedCallback")
    };
    this.SetShowMapModeSwitch = SetShowMapModeSwitch;
    this.GetObliqueAvailability = GetObliqueAvailability;
    this.GetTopPx = GetTopPx;
    this.GetLeftPx = GetLeftPx;
    this.SetPrintable = SetPrintable;
    this.CreateMinimap = CreateMinimap;
    this.IsMapViewOblique = IsMapViewOblique;
    this.IsMapViewOrtho = IsMapViewOrtho;
    this.GetTileGeneration = GetTileGeneration;
    this.IsDragging = function () {
        return dragging
    };
    this.IsZooming = function () {
        return zooming
    }
};

function NotSupportedMethod(a, b) {
    throw new VEException(a, "err_unsupport", L_UnsupportMethod_Text.replace("%1", b))
}
function NotSupportedClass(a) {
    throw new VEException("", "err_unsupport", L_UnsupportClass_Text.replace("%1", a))
}
Msn.VE.Bounds = function (e, f, a, c, b, d) {
    this.z1 = e;
    this.z2 = f;
    this.x1 = a;
    this.y1 = c;
    this.x2 = b;
    this.y2 = d
};
Msn.VE.DashboardStates = new
function () {
    this.MapMode = new
    function () {
        this.Flatland = 1;
        this.View3D = 2
    };
    this.MapView = new
    function () {
        this.Ortho = 4;
        this.Oblique = 8;
        this.StreetSide = 16
    };
    this.MapStyle = new
    function () {
        this.Road = 32;
        this.Shaded = 64;
        this.Aerial = 128;
        this.Hybrid = 256
    }
};
VEMiniMapSize = function () {};
VEMiniMapSize.Small = "small";
VEMiniMapSize.Large = "large";
VEMiniMapExpandState = function () {};
VEMiniMapExpandState.Collapsed = "collapsed";
VEMiniMapExpandState.Expanded = "expanded";
VEMiniMapVersion = function () {};
VEMiniMapVersion[5] = "MSVE_Minimap_V5";
VEMiniMapVersion[6] = "MSVE_Minimap_V6";
Msn.VE.Minimap = function (bb, m, cb, h) {
    var n = this,
        db = Msn.VE.Css,
        U = Msn.VE.Css.Functions,
        t = Msn.VE.DashboardStates.MapMode.Flatland,
        e = Msn.VE.DashboardStates.MapView.Ortho,
        N = false,
        O = null,
        A = false,
        u = false,
        B = false,
        k = true,
        o = null,
        c = bb,
        b = null,
        a = m,
        i = [];
    i[VEMiniMapSize.Small] = "MSVE_smallMinimap";
    i[VEMiniMapSize.Large] = "MSVE_normalMinimap";
    var w = [];
    w[VEMiniMapSize.Small] = L_MinimapLargerToolTip_Text;
    w[VEMiniMapSize.Large] = L_MinimapSmallerToolTip_Text;
    var r = [];
    r[VEMiniMapSize.Small] = 138.5;
    r[VEMiniMapSize.Large] = 180.5;
    if (h != 5 && h != 6) h = 5;
    c.className = VEMiniMapExpandState.Expanded + " " + i[VEMiniMapSize.Small] + " " + VEMiniMapVersion[h];
    var p = document.createElement("div");
    p.id = "MSVE_minimap_transparency";
    c.appendChild(p);
    var f = document.createElement("div");
    f.id = "MSVE_minimap_content";
    f.title = L_MinimapDragToolTip_Text;
    p.appendChild(f);
    var j = document.createElement("span");
    j.id = "MSVE_minimap_glyph";
    j.title = L_MinimapHideToolTip_Text;
    if (cb != false && Msn.VE.Animation) {
        this.rollInDirection = null;
        this.rollOutDirection = null;
        c.appendChild(j);
        H(this, h)
    }
    var d = null,
        q = false;
    a.AttachEvent("onchangemapstyle", W);
    var D = document.createElement("div"),
        C = document.createElement("div"),
        l = document.createElement("div");
    l.id = "MSVE_minimap_style_wrapper";
    f.appendChild(l);
    switch (h) {
    case 5:
        var g = document.createElement("div");
        g.id = "MSVE_minimap_resize";
        g.attachEvent("onclick", L);
        g.title = L_MinimapLargerToolTip_Text;
        pseudoHover(g);
        c.appendChild(g);
        break;
    case 6:
        if ($MVEM.IsEnabled(MapControl.Features.Minimap.ShowByDefault)) j.title = L_MinimapHideToolTip_Text;
        else j.title = L_MinimapShowToolTip_Text
    }
    function V() {
        var g = {};
        g.latitude = a.GetCenterLatitude();
        g.longitude = a.GetCenterLongitude();
        var h = a.GetZoomLevel() - 4;
        if (h < 1) h = 1;
        if (g.latitude == null || g.longitude == null) {
            g.latitude = 0;
            g.longitude = 0;
            h = 1
        }
        g.zoomlevel = h;
        g.mapstyle = Msn.VE.MapStyle.Road;
        g.showScaleBar = false;
        g.showMapLegend = false;
        g.showDashboard = false;
        g.showMinimap = false;
        g.hideCopyright = true;
        g.disableLogo = true;
        g.clientToken = O;
        b = new Msn.VE.MapControl(f, g);
        b.Init();
        b.SetMinimapMode();
        G(D, "MSVE_minimap_r_style_button", "MSVE_minimap_style", L_MinimapRoad_Text, L_MinimapRoadToolTip_Text, J, $MVEM.IsEnabled(MapControl.Features.MapStyle.Road));
        G(C, "MSVE_minimap_h_style_button", "MSVE_minimap_style", L_MinimapHybrid_Text, L_MinimapHybridToolTip_Text, F, $MVEM.IsEnabled(MapControl.Features.MapStyle.Hybrid));
        K();
        b.AttachEvent("onendpan", S);
        b.AttachEvent("onclick", x);
        a.AttachEvent("onendpan", R);
        a.AttachEvent("onobliquechange", M);
        a.AttachEvent("onendzoom", P);
        a.AttachEvent("onchangeview", I);
        var i = a.IsModeEnabled(Msn.VE.MapActionMode.Mode3D) ? Msn.VE.DashboardStates.MapMode.View3D : Msn.VE.DashboardStates.MapMode.Flatland;
        e = Msn.VE.DashboardStates.MapView.Ortho;
        if (a.IsMapViewOblique()) {
            b.SetZoom(14);
            e = Msn.VE.DashboardStates.MapView.Oblique
        }
        d = new Msn.VE.CameraRotator(c, this, f);
        q = true;
        T(i);
        y();
        s()
    }
    this.Init = V;
    this.Destroy = function () {
        E(D, J);
        E(C, F);
        D = C = null;
        if (d) {
            d.Destroy();
            d = null
        }
        a.DetachEvent("onendpan", R);
        a.DetachEvent("onobliquechange", M);
        a.DetachEvent("onendzoom", P);
        a.DetachEvent("onchangeview", I);
        if (b) {
            b.DetachEvent("onendpan", S);
            b.DetachEvent("onclick", x);
            b.Destroy();
            b = null
        }
        switch (h) {
        case 5:
            g.detachEvent("onclick", L)
        }
        l = null;
        p = null;
        f = null;
        j = null;
        g = null;
        n = null
    };
    this.IsInitialized = function () {
        return q
    };
    this.SetClientToken = function (a) {
        O = a;
        if (b) b.SetClientToken(a)
    };

    function T(a) {
        t = a
    }
    this.SetMapMode = T;

    function y() {
        if (!N && typeof minimapRoller != "undefined" && minimapRoller != null && t == Msn.VE.DashboardStates.MapMode.Flatland) if (e == Msn.VE.DashboardStates.MapView.Oblique) {
            if (!minimapRoller.isExpanded()) minimapRoller.rollOut(n.rollOutDirection)
        } else if (e == Msn.VE.DashboardStates.MapView.Ortho) if (minimapRoller.isExpanded() && !$MVEM.IsEnabled(MapControl.Features.Minimap.ShowByDefault)) minimapRoller.rollIn(n.rollInDirection)
    }
    this.SetRollerState = y;
    this.ChangeOrientation = function (b) {
        if (t == Msn.VE.DashboardStates.MapMode.Flatland) if (e == Msn.VE.DashboardStates.MapView.Oblique) switch (b) {
        case 0:
        case 360:
            a.SetObliqueOrientation("East");
            break;
        case 270:
            a.SetObliqueOrientation("South");
            break;
        case 90:
            a.SetObliqueOrientation("North");
            break;
        case 180:
            a.SetObliqueOrientation("West")
        }
    };
    this.SetKeepRollState = function () {
        N = true
    };

    function s() {
        if (t == Msn.VE.DashboardStates.MapMode.Flatland) if (e == Msn.VE.DashboardStates.MapView.Oblique) {
            var b = a.GetObliqueScene();
            if (!b) return;
            var c = b.GetOrientation();
            d.SetStyle("oblique");
            switch (c) {
            case "North":
                d.SetOrientation(90);
                break;
            case "South":
                d.SetOrientation(270);
                break;
            case "East":
                d.SetOrientation(0);
                break;
            case "West":
                d.SetOrientation(180)
            }
            d.Show()
        } else if (e == Msn.VE.DashboardStates.MapView.Ortho) {
            d.SetStyle("ortho");
            d.Show()
        } else d.Hide();
        else d.Hide()
    }
    function Z() {
        u = true;
        a.PanToLatLong(b.GetCenterLatitude(), b.GetCenterLongitude())
    }
    function z() {
        var c = a.GetCenterLatitude(),
            d = a.GetCenterLongitude();
        A = true;
        b.PanToLatLong(c, d)
    }
    this.Hide = function () {
        c.style.display = "none"
    };
    this.Show = function () {
        c.style.display = "block"
    };
    this.SetPosition = function (a, b) {
        c.style.left = a + "px";
        c.style.top = b + "px"
    };
    this.SetSize = function (a) {
        var d = this.GetSize();
        if (a != d) {
            U.removeClass(c, i[d]);
            U.addClass(c, i[a]);
            g.title = w[a];
            if (c.className.indexOf(VEMiniMapExpandState.Expanded) >= 0) {
                B = true;
                b.Resize(r[a], r[a])
            }
        }
    };
    this.GetSize = function () {
        return c.className.indexOf(i[VEMiniMapSize.Large]) > -1 ? VEMiniMapSize.Large : VEMiniMapSize.Small
    };
    this.SetDoUpdates = function (a) {
        k = a;
        if (k) Q()
    };
    this.GetContainer = function () {
        return c
    };

    function W() {
        var b = e;
        e = Msn.VE.DashboardStates.MapView.Ortho;
        if (a.IsMapViewOblique()) {
            e = Msn.VE.DashboardStates.MapView.Oblique;
            if (!q) V()
        }
        if (q && e != b) {
            y();
            s()
        }
    }
    function S() {
        if (B) {
            B = false;
            return
        }
        if (!A) Z();
        else A = false
    }
    function L() {
        var a = n.GetSize() == VEMiniMapSize.Small ? VEMiniMapSize.Large : VEMiniMapSize.Small;
        n.SetSize(a)
    }
    function R() {
        if (!k) return;
        if (!u) {
            o = v();
            z()
        } else u = false
    }
    function I() {
        if (!k) return;
        var c = v();
        if (!a.IsMapViewOblique() && !c.Equals(o)) {
            b.SetView(c);
            o = null
        }
    }
    function M() {
        if (!k) return;
        z();
        s()
    }
    function P() {
        if (!k) return;
        o = v();
        Q()
    }
    function v() {
        var d = b.GetCurrentMapView().MakeCopy(),
            e = a.GetCurrentMapView();
        d.SetCenterLatLong(new Msn.VE.LatLong(e.latlong.latitude, e.latlong.longitude));
        var c = 1;
        if (Msn.VE.MapStyle.IsViewOblique(e.style)) c = 14;
        else c = e.GetZoomLevel() - 4;
        if (c < 1) c = 1;
        d.SetZoomLevel(c);
        d.Resolve(b.GetCurrentMode(), b.GetMapWidth(), b.GetMapHeight());
        return d
    }
    function Q() {
        var c = 0;
        if (a.IsMapViewOblique()) c = 14;
        else c = a.GetZoomLevel() - 4;
        if (c < 1) c = 1;
        if (b.GetZoomLevel() == c) {
            z();
            return
        }
        b.SetCenterAndZoom(a.GetCenterLatitude(), a.GetCenterLongitude(), c)
    }
    function G(a, g, d, f, e, c, b) {
        a.innerText = f;
        a.id = g;
        a.title = e;
        if (typeof b == "undefined" || b == true) {
            a.className = d;
            a.attachEvent("onclick", c);
            a.attachEvent("onmousedown", IgnoreEvent)
        };
        pseudoHover(a);
        l.appendChild(a)
    }
    function E(a, b) {
        a.detachEvent("onclick", b);
        a.detachEvent("onmousedown", IgnoreEvent)
    }
    function x() {
        f.title = "";
        b.DetachEvent("onclick", x)
    }
    function J() {
        K()
    }
    function F() {
        X()
    }
    function X() {
        l.className = "MSVE_minimap_hybrid_style";
        b.SetMapStyle("h")
    }
    function K() {
        l.className = "MSVE_minimap_road_style";
        b.SetMapStyle("r")
    }
    function ab() {
        return h
    }
    this.GetVersion = ab;

    function H(b, g) {
        var f = m.IsMapViewOblique() || $MVEM.IsEnabled(MapControl.Features.Minimap.ShowByDefault),
            d, e, c = $ID("MSVE_minimap"),
            a = $ID("MSVE_minimap_glyph");
        if (!a || !c) return;
        switch (g) {
        case 5:
            b.rollInDirection = Msn.VE.Animation.RollDirection.RightLeft;
            b.rollOutDirection = Msn.VE.Animation.RollDirection.LeftRight;
            d = 8;
            e = 0;
            break;
        case 6:
            b.rollInDirection = Msn.VE.Animation.RollDirection.LeftRight | Msn.VE.Animation.RollDirection.BottomUp;
            b.rollOutDirection = Msn.VE.Animation.RollDirection.RightLeft | Msn.VE.Animation.RollDirection.TopDown;
            d = a.offsetWidth + 1;
            e = a.offsetHeight;
            break;
        default:
            return
        }
        window.minimapRoller = new Msn.VE.Animation.Roller(c);
        minimapRoller.setAccelerationFunction(AccelerationFunctions.CrazyElevator);
        minimapRoller.setXLeave(d);
        minimapRoller.setYLeave(e);
        pseudoHover(a);
        Y(c, minimapRoller, "MSVE_minimap_glyph");
        if (!f) minimapRoller.collapse(b.rollInDirection);
        a.onclick = function () {
            var a = m.GetMinimap();
            a.SetKeepRollState();
            if (minimapRoller.isExpanded()) minimapRoller.rollIn(a.rollInDirection);
            else minimapRoller.rollOut(a.rollOutDirection)
        };
        window.attachEvent("onunload", function () {
            a = c = null;
            window.detachEvent("onunload", arguments.callee)
        })
    }
    function Y(a, b, c) {
        b.hookEvent("afterrollin", function () {
            var d = Msn.VE.Css.Functions,
                b = m.GetMinimap();
            d.removeClass(a, "expanded");
            d.addClass(a, "collapsed");
            if (b && b.IsInitialized()) b.SetDoUpdates(false);
            $ID(c).title = L_MinimapShowToolTip_Text
        });
        b.hookEvent("afterrollout", function () {
            var d = Msn.VE.Css.Functions,
                b = m.GetMinimap();
            d.removeClass(a, "collapsed");
            d.addClass(a, "expanded");
            if (b && b.IsInitialized()) {
                b.SetDoUpdates(true);
                s()
            }
            $ID(c).title = L_MinimapHideToolTip_Text
        });
        b.hookEvent("beforerollout", function () {
            var a = m.GetMinimap();
            if (a && !a.IsInitialized()) a.Init()
        })
    }
    this.creatMinimapRoller = H;
    Msn.VE.CameraRotator = function (g, j, d) {
        var n = Msn.VE.Css,
            m = j,
            g = g,
            d = d,
            e = 0,
            c = "ortho",
            a = document.createElement("div");
        a.id = "MSVE_cameraPosition";
        d.appendChild(a);
        b(90);

        function i() {
            a = null
        }
        function k() {
            a.style.display = "none"
        }
        function l() {
            a.style.display = "block"
        }
        function f(a) {
            b(a)
        }
        function h(a) {
            switch (a) {
            case "oblique":
                c = "MSVE_direction";
                b(90);
                break;
            case "ortho":
                c = "MSVE_ortho";
                b(90);
                break;
            default:
                c = "MSVE_ortho";
                b(90)
            }
        }
        function b(b) {
            e = MathFloor((b + 45 + 720) / 90) % 4;
            a.className = c + e
        }
        this.Hide = k;
        this.Show = l;
        this.Destroy = i;
        this.SetStyle = h;
        this.SetOrientation = f
    }
};
Msn.VE.DashboardSize = new
function () {
    this.Normal = "normal";
    this.Small = "small";
    this.Tiny = "tiny"
};
Msn.VE.NavControlFactory = function (g, i, c, b, e, h, f, d) {
    if (typeof c == "undefined" || c == null) c = Msn.VE.DashboardSize.Normal;
    if (typeof b == "undefined" || b == null) b = "MSVE_dashboardId";
    if (!isFinite(parseInt(d))) d = 6;
    var a;
    switch (d) {
    case 5:
        a = new Msn.VE.V5Control(g, i, c, b, e, h, f);
        break;
    case 6:
    default:
        a = new Msn.VE.V6Control(g, i, c, b, e, h, f)
    }
    a.version = d;
    a.GetVersion = function () {
        return a.version
    };
    return a
};
Msn.VE.V5Control = function (z, a, i, C, x, A) {
    Msn.VE.DashboardStates = new
    function () {
        this.MapMode = new
        function () {
            this.Flatland = 1;
            this.View3D = 2
        };
        this.MapView = new
        function () {
            this.Ortho = 4;
            this.Oblique = 8;
            this.StreetSide = 16
        };
        this.MapStyle = new
        function () {
            this.Road = 32;
            this.Shaded = 64;
            this.Aerial = 128;
            this.Hybrid = 256
        }
    };
    var s = {
        Style: "MSVE_navAction_mapStyleCell",
        Road: "MSVE_navAction_RoadMapStyle",
        Aerial: "MSVE_navAction_AerialMapStyle",
        Hybrid: "MSVE_navAction_HybridMapStyle",
        Mode: "MSVE_navAction_modeCell",
        Mode2D: "MSVE_navAction_FlatlandMapMode",
        Mode3D: "MSVE_navAction_View3DMapMode",
        View: "MSVE_navAction_mapViewCellInner",
        Ortho: "MSVE_navAction_OrthoMapView",
        Oblique: "MSVE_navAction_ObliqueMapView",
        StreetSide: "MSVE_navAction_StreetSideMapView",
        ShowLabels: "MSVE_navAction_showLabels",
        Pan: "MSVE_navAction_panContainer",
        PanUp: "MSVE_navAction_panUp",
        PanDown: "MSVE_navAction_panDown",
        PanLeft: "MSVE_navAction_panLeft",
        PanRight: "MSVE_navAction_panRight",
        TinyZoom: "MSVE_TinyZoomBar",
        OrthoZoom: "MSVE_OrthoZoomBar",
        ObliqueZoom: "MSVE_ObliqueZoomBar",
        ObliqueCompass: "MSVE_compassDiv",
        ObliqueNotification: "MSVE_obliqueNotification",
        ThreeDUpdatedNotification: "MSVE_threeDUpdatedNotification",
        Traffic: "MSVE_navAction_traffic"
    },
        G = "Nav Bar";
    Msn.VE.CommonControls = function (c, v) {
        function yb(b) {
            var f = document.createElement("div"),
                e = document.createElement("div"),
                a = document.createElement("div"),
                d = document.createElement("div"),
                w = 0,
                s = 0,
                j = false;
            this.Init = function () {
                d.className = "MSVE_ZoomBar_minus";
                d.id = "MSVE_navAction_obliqueZoomBar_minus";
                d.unselectable = "on";
                d.title = L_ZoomBarMinusToolTip_Text;
                d.attachEvent("onclick", l);
                pseudoHover(d);
                a.className = "MSVE_ZoomBar_slider";
                a.id = "MSVE_navAction_obliqueZoomBar_slider";
                a.unselectable = "on";
                a.attachEvent("onmousedown", o);
                a.attachEvent("onmousemove", p);
                a.attachEvent("onmouseup", q);
                a.attachEvent("onclick", IgnoreEvent);
                pseudoHover(a);
                e.className = "MSVE_ObliqueZoomBar_bar";
                e.unselectable = "on";
                e.appendChild(a);
                e.attachEvent("onclick", r);
                f.className = "MSVE_ZoomBar_plus";
                f.id = "MSVE_navAction_obliqueZoomBar_plus";
                f.title = L_ZoomBarPlusToolTip_Text;
                f.unselectable = "on";
                f.attachEvent("onclick", m);
                pseudoHover(f);
                b.className = "MSVE_ZoomBar";
                b.id = "MSVE_ObliqueZoomBar";
                b.appendChild(d);
                b.appendChild(e);
                b.appendChild(f);
                b.attachEvent("onmousedown", IgnoreEvent);
                b.attachEvent("onmouseup", IgnoreEvent);
                b.attachEvent("onclick", IgnoreEvent);
                b.attachEvent("ondblclick", IgnoreEvent);
                i()
            };

            function v() {
                b.style.display = "block"
            }
            function u() {
                b.style.display = "none"
            }
            function r(a) {
                a = GetEvent(a);
                CancelEvent(a);
                k();
                n(h(Gimme.Screen.getMousePosition(a).y));
                return false
            }
            function h(b) {
                b -= s + d.offsetHeight + a.offsetHeight;
                var c = e.offsetHeight - a.offsetHeight;
                if (b < 0) b = 0;
                else if (b > c) b = c;
                return b
            }
            function l() {
                c.ZoomOut()
            }
            function m() {
                c.ZoomIn()
            }
            function t() {
                d.detachEvent("onclick", l);
                a.detachEvent("onmousedown", o);
                a.detachEvent("onmousemove", p);
                a.detachEvent("onmouseup", q);
                a.detachEvent("onclick", IgnoreEvent);
                e.detachEvent("onclick", r);
                f.detachEvent("onclick", m);
                b.detachEvent("onmousedown", IgnoreEvent);
                b.detachEvent("onmousedown", IgnoreEvent);
                b.detachEvent("onclick", IgnoreEvent);
                b.detachEvent("ondblclick", IgnoreEvent);
                d = a = e = f = null
            }
            function o(b) {
                b = GetEvent(b);
                CancelEvent(b);
                k();
                if (a.setCapture) a.setCapture();
                j = true;
                return false
            }
            function p(b) {
                b = GetEvent(b);
                CancelEvent(b);
                if (j) a.style.top = h(Gimme.Screen.getMousePosition(b).y) + "px";
                return false
            }
            function q(b) {
                b = GetEvent(b);
                CancelEvent(b);
                if (a.releaseCapture) a.releaseCapture();
                j = false;
                n(h(Gimme.Screen.getMousePosition(b).y));
                i();
                return false
            }
            function k() {
                var a = g(b).getScreenPosition();
                w = a.x;
                s = a.y
            }
            function n(f) {
                var b = e.offsetHeight - a.offsetHeight,
                    d = 1 + MathRound((b - f) / b * 1);
                c.SetZoom(d)
            }
            function i() {
                if (c.GetZoomLevel() == 1) a.style.top = e.offsetHeight - a.offsetHeight + "px";
                else a.style.top = "0px"
            }
            this.Destroy = t;
            this.Show = v;
            this.Hide = u;
            this.UpdateFromMap = i
        }
        function C(z, x, y) {
            var a = document.createElement("div");
            a.setAttribute("id", z);
            a.innerHTML = x;
            var c = "MSVE_obliqueCompassPointOff",
                g = y;
            a.attachEvent("onmouseover", f);
            a.attachEvent("onmouseout", h);
            a.attachEvent("onclick", i);
            this.onclick = null;
            this.onmouseover = null;
            this.onmouseout = null;
            var e = 25,
                b = this,
                d = false,
                j = new v(a, 17, 17);

            function f(e) {
                if (d) return;
                c = a.className;
                a.className = "MSVE_obliqueCompassPointHover";
                if (b.onmouseover) b.onmouseover(e)
            }
            function i(a) {
                if (d) return;
                f(a);
                c = "MSVE_obliqueCompassPointOn";
                if (b.onclick) b.onclick(a)
            }
            function h(e) {
                if (d) return;
                a.className = c;
                if (b.onmouseout) b.onmouseout(e)
            }
            function m() {
                c = "MSVE_obliqueCompassPointOn";
                a.className = "MSVE_obliqueCompassPointOn"
            }
            function l() {
                c = "MSVE_obliqueCompassPointOff";
                a.className = "MSVE_obliqueCompassPointOff"
            }
            function u() {
                d = true;
                l()
            }
            function k() {
                d = false;
                m()
            }
            function q() {
                return a
            }
            function n() {
                return g
            }
            function o(a) {
                g = a
            }
            function w() {
                j.Reset();
                k()
            }
            function p(b) {
                a.style.left = b.left;
                a.style.top = b.top
            }
            function v(r, n, o) {
                var g = r,
                    a = 0,
                    b = .3,
                    c = 0,
                    l = 40,
                    k = Math.PI / 2,
                    h = true,
                    p = b + .1;

                function m(a, b, c) {
                    if (b >= c - a && b <= c + a) return true;
                    return false
                }
                function i() {
                    a += b;
                    if (a > Math.PI * 2) a -= Math.PI * 2;
                    else if (a < 0) a += Math.PI * 2;
                    if (m(p, a, c)) {
                        b = .3;
                        a = c;
                        d(a);
                        return
                    }
                    d(a);
                    window.setTimeout(i, l)
                }
                function d(a) {
                    var b = n + e * Math.sin(a),
                        c = o + e * Math.cos(a);
                    g.style.left = b + "px";
                    g.style.top = c + "px"
                }
                function f(a) {
                    c = a;
                    i()
                }
                function j(a, c) {
                    h = c;
                    if (!h) b *= -1;
                    f(k * a)
                }
                function q() {
                    a = 0
                }
                this.RotateTo = f;
                this.RotateToIndex = j;
                this.Reset = q
            }
            function t() {
                a.detachEvent("onmouseover", f);
                a.detachEvent("onmouseout", h);
                a.detachEvent("onclick", i);
                a = null
            }
            function s(a) {
                e = a
            }
            function r() {
                return e
            }
            this.SetRadius = s;
            this.GetRadius = r;
            this.GetElement = q;
            this.GetCurrentPositionIndex = n;
            this.SetCurrentPositionIndex = o;
            this.SetCurrentPosition = p;
            this.On = m;
            this.Off = l;
            this.RotateToIndex = j.RotateToIndex;
            this.Reset = w;
            this.Disable = u;
            this.Enable = k;
            this.Destroy = t
        }
        function xb(D) {
            var o = [];
            o.push({
                "top": "-8px",
                "left": "17px"
            });
            o.push({
                "top": "17px",
                "left": "42px"
            });
            o.push({
                "top": "42px",
                "left": "17px"
            });
            o.push({
                "top": "17px",
                "left": "-8px"
            });
            var f = document.createElement("div");
            f.setAttribute("id", "MSVE_obliqueCompassContainer");
            f.title = L_ObliqueCompassSelectDirection_Text;
            var a = new C("MSVE_obliqueCompassPointN", "N", 0),
                i = a.GetElement();
            i.attachEvent("onclick", r);
            i.attachEvent("onmouseover", u);
            i.attachEvent("onmouseout", h);
            var d = new C("MSVE_obliqueCompassPointE", "E", 1),
                k = d.GetElement();
            k.attachEvent("onclick", t);
            k.attachEvent("onmouseover", x);
            k.attachEvent("onmouseout", h);
            var b = new C("MSVE_obliqueCompassPointS", "S", 2),
                j = b.GetElement();
            j.attachEvent("onclick", s);
            j.attachEvent("onmouseover", v);
            j.attachEvent("onmouseout", h);
            var e = new C("MSVE_obliqueCompassPointW", "W", 3),
                l = e.GetElement();
            l.attachEvent("onclick", w);
            l.attachEvent("onmouseover", y);
            l.attachEvent("onmouseout", h);
            var m = document.createElement("div");
            m.id = "MSVE_navAction_obliqueCompassArrow";
            f.appendChild(i);
            f.appendChild(k);
            f.appendChild(j);
            f.appendChild(l);
            f.appendChild(m);
            D.appendChild(f);
            q();

            function p(a) {
                if (a < 0) a = 4 - Math.abs(a);
                return a
            }
            function n(l, i, k) {
                var c = l.GetCurrentPositionIndex(),
                    h, f = [];
                f[a.GetCurrentPositionIndex()] = L_North_Text;
                f[b.GetCurrentPositionIndex()] = L_South_Text;
                f[d.GetCurrentPositionIndex()] = L_East_Text;
                f[e.GetCurrentPositionIndex()] = L_West_Text;
                if (i) {
                    h = i == Msn.VE.BirdsEyeSearchSpinDirection.CounterclockwiseSpin;
                    if (c + i != 2) {
                        var g;
                        switch (i) {
                        case -1:
                            switch (c) {
                            case 0:
                            case 2:
                                g = [3];
                                break;
                            case 1:
                                g = [3, 2]
                            }
                            break;
                        case 1:
                            switch (c) {
                            case 0:
                            case 2:
                                g = [1];
                                break;
                            case 3:
                                g = [1, 2]
                            }
                        }
                        if (g) {
                            var j = L_ObliqueSkippingOneDirection_Text;
                            if (c == 0) j = L_ObliqueNoImageryInRequestedDirection_Text;
                            if (g.length == 2) j = L_ObliqueSkippingTwoDirections_Text;
                            if (typeof ShowMessage != "undefined") ShowMessage(j.replace("%1", f[c]).replace("%2", f[g[0]]).replace("%3", f[g[1]]))
                        }
                    }
                } else {
                    h = c != 3;
                    if (k) if (c == 0) {
                        if (typeof ShowMessage != "undefined") ShowMessage(L_ObliqueModeImageNotAvailable_Text)
                    } else if (typeof ShowMessage != "undefined") ShowMessage(L_ObliqueNoImageryInRequestedDirection_Text.replace("%1", f[c]).replace("%2", f[0]))
                }
                d.SetCurrentPositionIndex(p(d.GetCurrentPositionIndex() - c));
                e.SetCurrentPositionIndex(p(e.GetCurrentPositionIndex() - c));
                a.SetCurrentPositionIndex(p(a.GetCurrentPositionIndex() - c));
                b.SetCurrentPositionIndex(p(b.GetCurrentPositionIndex() - c));
                a.RotateToIndex(2 - a.GetCurrentPositionIndex() < 0 ? a.GetCurrentPositionIndex() : 2 - a.GetCurrentPositionIndex(), h);
                d.RotateToIndex(2 - d.GetCurrentPositionIndex() < 0 ? d.GetCurrentPositionIndex() : 2 - d.GetCurrentPositionIndex(), h);
                b.RotateToIndex(2 - b.GetCurrentPositionIndex() < 0 ? b.GetCurrentPositionIndex() : 2 - b.GetCurrentPositionIndex(), h);
                e.RotateToIndex(2 - e.GetCurrentPositionIndex() < 0 ? e.GetCurrentPositionIndex() : 2 - e.GetCurrentPositionIndex(), h)
            }
            function g(a) {
                switch (a) {
                case 0:
                    h();
                    break;
                case 1:
                    z();
                    break;
                case 2:
                    A();
                    break;
                case 3:
                    B()
                }
            }
            function h() {
                m.className = "MSVE_obliqueCompassArrowU"
            }
            function A() {
                m.className = "MSVE_obliqueCompassArrowD"
            }
            function z() {
                m.className = "MSVE_obliqueCompassArrowR"
            }
            function B() {
                m.className = "MSVE_obliqueCompassArrowL"
            }
            function s() {
                if (c.GetDashboard() && c.GetDashboard().SetLastRotationDirection) c.GetDashboard().SetLastRotationDirection(Msn.VE.BirdsEyeSearchSpinDirection.NoSpin);
                n(b);
                g(0);
                var a = c.GetObliqueScene();
                if (a) if (a.GetOrientation() != Msn.VE.Orientation.South) c.SetObliqueOrientation("South", null, true)
            }
            function r() {
                if (c.GetDashboard() && c.GetDashboard().SetLastRotationDirection) c.GetDashboard().SetLastRotationDirection(Msn.VE.BirdsEyeSearchSpinDirection.NoSpin);
                n(a);
                g(0);
                var b = c.GetObliqueScene();
                if (b) if (b.GetOrientation() != Msn.VE.Orientation.North) c.SetObliqueOrientation("North", null, true)
            }
            function t() {
                if (c.GetDashboard() && c.GetDashboard().SetLastRotationDirection) c.GetDashboard().SetLastRotationDirection(Msn.VE.BirdsEyeSearchSpinDirection.NoSpin);
                n(d);
                g(0);
                var a = c.GetObliqueScene();
                if (a) if (a.GetOrientation() != Msn.VE.Orientation.East) c.SetObliqueOrientation("East", null, true)
            }
            function w() {
                if (c.GetDashboard() && c.GetDashboard().SetLastRotationDirection) c.GetDashboard().SetLastRotationDirection(Msn.VE.BirdsEyeSearchSpinDirection.NoSpin);
                n(e);
                g(0);
                var a = c.GetObliqueScene();
                if (a) if (a.GetOrientation() != Msn.VE.Orientation.West) c.SetObliqueOrientation("West", null, true)
            }
            function v() {
                g(b.GetCurrentPositionIndex())
            }
            function x() {
                g(d.GetCurrentPositionIndex())
            }
            function y() {
                g(e.GetCurrentPositionIndex())
            }
            function u() {
                g(a.GetCurrentPositionIndex())
            }
            function H() {
                f.style.display = "none"
            }
            function I() {
                f.style.display = "block"
            }
            function q(k, j) {
                var i = c.GetObliqueScene();
                if (!i) return;
                var f = i.GetOrientation(),
                    h;
                switch (f) {
                case "North":
                    h = a;
                    break;
                case "South":
                    h = b;
                    break;
                case "East":
                    h = d;
                    break;
                case "West":
                    h = e
                }
                n(h, k, j);
                g(0);
                if (f != Msn.VE.Orientation.North) a.Enable();
                else a.Disable();
                if (f != Msn.VE.Orientation.South) b.Enable();
                else b.Disable();
                if (f != Msn.VE.Orientation.East) d.Enable();
                else d.Disable();
                if (f != Msn.VE.Orientation.West) e.Enable();
                else e.Disable()
            }
            function G() {
                a.Destroy();
                d.Destroy();
                b.Destroy();
                e.Destroy();
                i.detachEvent("onclick", r);
                i.detachEvent("onmouseover", u);
                i.detachEvent("onmouseout", h);
                k.detachEvent("onclick", t);
                k.detachEvent("onmouseover", x);
                k.detachEvent("onmouseout", h);
                j.detachEvent("onclick", s);
                j.detachEvent("onmouseover", v);
                j.detachEvent("onmouseout", h);
                l.detachEvent("onclick", w);
                l.detachEvent("onmouseover", y);
                l.detachEvent("onmouseout", h);
                f = null
            }
            function F(c) {
                a.SetRadius(c);
                b.SetRadius(c);
                d.SetRadius(c);
                e.SetRadius(c)
            }
            function E() {
                return a.GetRadius()
            }
            this.Hide = H;
            this.Show = I;
            this.UpdateFromMap = q;
            this.SetRadius = F;
            this.GetRadius = E;
            this.Destroy = G
        }
        function Bb(b) {
            var f = document.createElement("div"),
                e = document.createElement("div"),
                a = document.createElement("div"),
                d = document.createElement("div"),
                v = 0,
                s = 0,
                j = false;
            this.Init = function () {
                d.className = "MSVE_ZoomBar_minus";
                d.id = "MSVE_navAction_orthoZoomBar_minus";
                d.title = L_ZoomBarMinusToolTip_Text;
                d.unselectable = "on";
                d.attachEvent("onclick", l);
                pseudoHover(d);
                a.className = "MSVE_ZoomBar_slider";
                a.id = "MSVE_navAction_orthoZoomBar_slider";
                a.title = L_ZoomBarSliderToolTip_Text;
                a.unselectable = "on";
                a.attachEvent("onmousedown", o);
                a.attachEvent("onmousemove", p);
                a.attachEvent("onmouseup", q);
                a.attachEvent("onclick", IgnoreEvent);
                pseudoHover(a);
                e.className = "MSVE_OrthoZoomBar_bar";
                e.unselectable = "on";
                e.appendChild(a);
                e.attachEvent("onclick", r);
                f.className = "MSVE_ZoomBar_plus";
                f.id = "MSVE_navAction_orthoZoomBar_plus";
                f.title = L_ZoomBarPlusToolTip_Text;
                f.unselectable = "on";
                f.attachEvent("onclick", m);
                pseudoHover(f);
                b.className = "MSVE_ZoomBar";
                b.id = "MSVE_OrthoZoomBar";
                b.appendChild(d);
                b.appendChild(e);
                b.appendChild(f);
                b.attachEvent("onmousedown", IgnoreEvent);
                b.attachEvent("onmouseup", IgnoreEvent);
                b.attachEvent("onclick", IgnoreEvent);
                b.attachEvent("ondblclick", IgnoreEvent);
                i()
            };
            this.Destroy = function () {
                d.detachEvent("onclick", l);
                a.detachEvent("onmousedown", o);
                a.detachEvent("onmousemove", p);
                a.detachEvent("onmouseup", q);
                a.detachEvent("onclick", IgnoreEvent);
                e.detachEvent("onclick", r);
                f.detachEvent("onclick", m);
                b.detachEvent("onmousedown", IgnoreEvent);
                b.detachEvent("onmousedown", IgnoreEvent);
                b.detachEvent("onclick", IgnoreEvent);
                b.detachEvent("ondblclick", IgnoreEvent);
                d = a = e = f = null
            };

            function u() {
                b.style.display = "block"
            }
            function t() {
                b.style.display = "none"
            }
            function k() {
                var a = g(b).getScreenPosition();
                v = a.x;
                s = a.y
            }
            function o(b) {
                b = GetEvent(b);
                CancelEvent(b);
                k();
                if (a.setCapture) a.setCapture();
                j = true;
                return false
            }
            function p(b) {
                b = GetEvent(b);
                CancelEvent(b);
                if (j) a.style.top = h(Gimme.Screen.getMousePosition(b).y) + "px";
                return false
            }
            function q(b) {
                b = GetEvent(b);
                CancelEvent(b);
                if (a.releaseCapture) a.releaseCapture();
                j = false;
                n(h(Gimme.Screen.getMousePosition(b).y));
                i();
                return false
            }
            function m() {
                c.ZoomIn()
            }
            function l() {
                c.ZoomOut()
            }
            function r(a) {
                a = GetEvent(a);
                CancelEvent(a);
                k();
                n(h(Gimme.Screen.getMousePosition(a).y));
                return false
            }
            function h(b) {
                b -= s + d.offsetHeight + a.offsetHeight;
                var c = e.offsetHeight - a.offsetHeight;
                if (b < 0) b = 0;
                else if (b > c) b = c;
                return b
            }
            function n(f) {
                var b = e.offsetHeight - a.offsetHeight,
                    d = 1 + MathRound((b - f) / b * 18);
                c.SetZoom(d)
            }
            function i() {
                var b = e.offsetHeight - a.offsetHeight,
                    d = b - (c.GetZoomLevel() - 1) / 18 * b;
                a.style.top = d + "px"
            }
            this.UpdateFromMap = i;
            this.Show = u;
            this.Hide = t
        }
        function Eb() {
            var h = document.createElement("div"),
                g = document.createElement("div"),
                f = document.createElement("div"),
                a = false,
                d = g,
                b = f;
            this.maxZoomLevel = 21;
            this.minZoomLevel = 1;
            this.Init = function () {
                g.className = "MSVE_ZoomBar_plus";
                g.id = "MSVE_navAction_tinyZoomBar_plus";
                g.title = L_ZoomBarPlusToolTip_Text;
                g.unselectable = "on";
                f.className = "MSVE_ZoomBar_minus";
                f.id = "MSVE_navAction_tinyZoomBar_minus";
                f.title = L_ZoomBarMinusToolTip_Text;
                f.unselectable = "on";
                c.AttachEvent("onendzoom", i);
                h.className = "MSVE_ZoomBar";
                h.id = "MSVE_TinyZoomBar";
                h.appendChild(g);
                h.appendChild(f);
                return h
            };
            this.HookupPlusMinusEvents = function (b, a) {
                m(b);
                j(a)
            };

            function m(a) {
                if (a) d = a;
                d.attachEvent("onmousedown", o);
                d.attachEvent("onmouseup", e);
                d.attachEvent("onmouseout", e)
            }
            this.HookupPlusEvents = m;

            function j(a) {
                if (a) b = a;
                b.attachEvent("onmousedown", l);
                b.attachEvent("onmouseup", e);
                b.attachEvent("onmouseout", e)
            }
            this.HookupMinusEvents = j;

            function n() {
                if (d != null) {
                    d.detachEvent("onmousedown", o);
                    d.detachEvent("onmouseup", e);
                    d.detachEvent("onmouseout", e)
                }
                if (a == "in") a = false
            }
            this.UnhookPlusEvents = n;

            function k() {
                if (b != null) {
                    b.detachEvent("onmousedown", l);
                    b.detachEvent("onmouseup", e);
                    b.detachEvent("onmouseout", e)
                }
                if (a == "out") a = false
            }
            this.UnhookMinusEvents = k;
            this.Destroy = function () {
                n();
                k();
                c.DetachEvent("onendzoom", i);
                g = f = d = b = null
            };

            function q() {
                if (c.GetMapMode() == Msn.VE.MapActionMode.Mode3D) return true;
                else return c.IsAnimationEnabled()
            }
            function o() {
                a = "in";
                c.ZoomIn()
            }
            function i() {
                window.setTimeout(p, q() ? 1 : 500)
            }
            function p() {
                if (a == "in" && c.GetZoomLevel() < 21) c.ZoomIn(false);
                else if (a == "out" && c.GetZoomLevel() > 1) c.ZoomOut(false)
            }
            function l() {
                a = "out";
                c.ZoomOut()
            }
            function e() {
                a = false
            }
            this.GetPlus = function () {
                return g
            };
            this.GetMinus = function () {
                return f
            }
        }
        var a = s,
            j = [];
        j[a.Style] = {
            Id: a.Style,
            InitialClass: null,
            OnClickFunction: null,
            StyleUpdateEvent: null,
            StyleUpdateFunction: null,
            Enabled: true,
            Title: null,
            Children: [a.Road, a.Aerial, a.Hybrid],
            Text: null
        };
        j[a.Road] = {
            Id: a.Road,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: sb,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: t,
            Enabled: MapControl.Features.MapStyle.Road,
            Title: L_NavActionRoadToolTip_Text,
            Children: null,
            Text: L_NavActionRoad_Text
        };
        j[a.Aerial] = {
            Id: a.Aerial,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: mb,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: t,
            Enabled: MapControl.Features.MapStyle.Aerial,
            Title: L_NavActionAerialToolTip_Text,
            Children: null,
            Text: L_NavActionAerial_Text
        };
        j[a.Hybrid] = {
            Id: a.Hybrid,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: nb,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: t,
            Enabled: MapControl.Features.MapStyle.Hybrid,
            Title: L_NavActionHybridToolTip_Text,
            Children: null,
            Text: L_NavActionHybrid_Text
        };
        j[a.Mode] = {
            Id: a.Mode,
            InitialClass: "MSVE_modeCell",
            OnClickFunction: null,
            StyleUpdateEvent: null,
            StyleUpdateFunction: null,
            Enabled: true,
            Title: null,
            Children: [a.Mode2D, a.Mode3D],
            Text: null
        };
        j[a.Mode2D] = {
            Id: a.Mode2D,
            InitialClass: "MSVE_MapMode",
            OnClickFunction: kb,
            StyleUpdateEvent: "oninitmode",
            StyleUpdateFunction: Z,
            Enabled: true,
            Title: L_NavActionFlatlandToolTip_Text,
            Children: null,
            Text: L_NavActionFlatland_Text
        };
        j[a.Mode3D] = {
            Id: a.Mode3D,
            InitialClass: "MSVE_MapMode",
            OnClickFunction: qb,
            StyleUpdateEvent: "oninitmode",
            StyleUpdateFunction: Z,
            Enabled: MapControl.Features.MapStyle.View3D,
            Title: L_NavActionView3DToolTip_Text,
            Children: null,
            Text: L_NavActionView3D_Text
        };
        j[a.View] = {
            Id: a.View,
            InitialClass: null,
            OnClickFunction: null,
            StyleUpdateEvent: null,
            StyleUpdateFunction: null,
            Enabled: true,
            Title: null,
            Children: [a.Ortho, a.Oblique, a.StreetSide],
            Text: null
        };
        j[a.Ortho] = {
            Id: a.Ortho,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: u,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: t,
            Enabled: true,
            Title: L_NavActionOrthoToolTip_Text,
            Children: null,
            Text: null
        };
        j[a.Oblique] = {
            Id: a.Oblique,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: G,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: t,
            Enabled: false,
            Title: L_NavActionObliqueToolTip_Text,
            Children: null,
            Text: null
        };
        j[a.StreetSide] = {
            Id: a.StreetSide,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: hb,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: t,
            Enabled: false,
            Title: L_NavActionStreetSideToolTip_Text,
            Children: null,
            Text: null
        };
        j[a.ShowLabels] = {
            Id: a.ShowLabels,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: vb,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: t,
            Enabled: true,
            Title: L_NavActionShowLabels_Text,
            Children: null,
            Text: L_NavActionLabels_Text
        };
        j[a.Traffic] = {
            Id: a.Traffic,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: Ab,
            StyleUpdateEvent: null,
            StyleUpdateFunction: null,
            Enabled: true,
            Title: L_NavActionShowTrafficToolTip_Text,
            Children: null,
            Text: L_NavActionTraffic_Text
        };
        this.ObliqueFunctions = [];
        this.ObliqueFunctions.ObliqueImageryIn3D = {
            ObliqueClickFunction: fb,
            Title: L_NavActionShowObliqueToolTip_Text,
            DependsOnObliqueAvailability: true
        };
        this.ObliqueFunctions.ObliqueTiltIn3D = {
            ObliqueClickFunction: lb,
            Title: L_NavAction3DObliqueToolTip_Text,
            DependsOnObliqueAvailability: false
        };
        var e = this,
            b = [],
            h = Msn.VE.DashboardStates.MapMode.Flatland,
            d = Msn.VE.DashboardStates.MapView.Ortho,
            f = Msn.VE.DashboardStates.MapStyle.Road;
        this.orthoZoom = null;
        var l;
        this.obliqueCompass = null;
        this.obliqueZoom = null;
        this.displaying3DNotification = false;
        var z = null;
        this.Oblique3DFunctionality = this.ObliqueFunctions.ObliqueImageryIn3D;
        var q = document.createElement("div");
        q.id = "MSVE_navAction_palette";
        document.body.appendChild(q);
        var I = false,
            ab = false,
            S = 19,
            Q = 1,
            k = true,
            R = false,
            r = Msn.VE.BirdsEyeSearchSpinDirection.NoSpin,
            N;
        for (N in v) if (v.hasOwnProperty(N)) M(v[N]);

        function Ib() {
            var d = $MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye) && (c.IsObliqueAvailable() || c.IsMapViewOblique());
            if (d) {
                i(a.Oblique, true);
                if (b[a.ObliqueNotification] && !c.IsMapViewOblique() && !g(b[a.Oblique]).hasClass("MSVE_selected")) x()
            } else {
                i(a.Oblique, false);
                if (b[a.ObliqueNotification]) p()
            }
            W();
            if (c.IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) U();
            else T()
        }
        function Hb() {
            var a;
            for (a in v) if (v.hasOwnProperty(a)) J(v[a]);
            document.body.removeChild(q);
            q = null
        }
        function M(f) {
            switch (f) {
            case a.OrthoZoom:
                b[f] = document.createElement("div");
                e.orthoZoom = new Bb(b[f]);
                e.orthoZoom.Init();
                c.AttachEvent("onendzoom", w);
                q.appendChild(b[f]);
                w();
                return;
            case a.ObliqueZoom:
                b[f] = document.createElement("div");
                ab = true;
                b[f].id = f;
                q.appendChild(b[f]);
                return;
            case a.TinyZoom:
                l = new Eb;
                b[f] = l.Init();
                c.AttachEvent("onendzoom", w);
                w();
                return;
            case a.ObliqueCompass:
                b[f] = document.createElement("div");
                b[f].id = f;
                I = true;
                return;
            case a.ObliqueNotification:
                db();
                return;
            case a.ThreeDUpdatedNotification:
                cb();
                return;
            case a.Oblique:
                c.AttachEvent("onve3dphotostatechanged", rb)
            }
            var d = j[f],
                g = document.createElement("div");
            b[d.Id] = g;
            g.id = d.Id;
            g.enabled = d.Enabled;
            g.classRecipients = [g];
            if (d.Text != null) g.innerText = d.Text;
            if (d.OnClickFunction != null && d.Enabled == true) g.attachEvent("onclick", d.OnClickFunction);
            if (d.StyleUpdateEvent != null && d.StyleUpdateFunction != null) c.AttachEvent(d.StyleUpdateEvent, d.StyleUpdateFunction);
            if (d.InitialClass) {
                g.className = d.InitialClass;
                if (!g.enabled) g.className += "_disabled"
            }
            if (d.Children != null) {
                var h;
                for (h in d.Children) if (d.Children.hasOwnProperty(h)) g.appendChild(M(d.Children[h]))
            } else pseudoHover(g);
            switch (f) {
            case a.Oblique:
            case a.ObliqueCompass:
                c.AttachEvent("onobliqueenter", zb);
                c.AttachEvent("onobliqueleave", K);
                c.AttachEvent("onendmapstyleoblique", pb);
                c.AttachEvent("onobliquechange", wb);
                c.AttachEvent("obliquerequestunavailable", eb);
                break;
            case a.Traffic:
                c.AttachEvent("onchangetraffic", A);
                A()
            }
            return g
        }
        function J(f) {
            switch (f) {
            case a.OrthoZoom:
                e.orthoZoom.Destroy();
                b[f] = null;
                c.DetachEvent("onendzoom", w);
                try {
                    q.removeChild(b[f])
                } catch(k) {}
                return;
            case a.ObliqueZoom:
                try {
                    q.removeChild(b[f])
                } catch(k) {}
                if (e.obliqueZoom) {
                    e.obliqueZoom.Destroy();
                    e.obliqueZoom = null
                }
            case a.TinyZoom:
                l.Destroy();
                b[f] = null;
                return;
            case a.ObliqueCompass:
                if (I && e.obliqueCompass) {
                    e.obliqueCompass.onclick = null;
                    e.obliqueCompass.Destroy();
                    e.obliqueCompass = null
                }
                return;
            case a.ObliqueNotification:
                b[a.ObliqueNotification].detachEvent("onclick", P);
                return;
            case a.ThreeDUpdatedNotification:
                b[a.ThreeDUpdatedNotification] = null;
                return;
            case a.Traffic:
                c.DetachEvent("onchangetraffic", A)
            }
            var i = b[f];
            if (i == null) return;
            var d = j[f];
            if (d.Children != null) {
                var g, h;
                for (h in d.Children) if (d.Children.hasOwnProperty(h)) {
                    g = d.Children[h];
                    try {
                        i.removeChild(b[g])
                    } catch(k) {}
                    J(g)
                }
            }
            if (d.OnClickFunction != null) i.detachEvent("onclick", d.OnClickFunction);
            try {
                if (c && d.StyleUpdateEvent != null && d.StyleUpdateFunction != null) c.DetachEvent(d.StyleUpdateEvent, d.StyleUpdateFunction)
            } catch(k) {}
            b[d.Id] = null
        }
        function db() {
            b[a.ObliqueNotification] = document.createElement("div");
            b[a.ObliqueNotification].id = a.ObliqueNotification;
            b[a.ObliqueNotification].attachEvent("onclick", P);
            b[a.ObliqueNotification].innerHTML += '<div id="MSVE_obliqueNotifyBeak" ></div> ' + '<div id="MSVE_obliqueNotifyContent"> ' + '<div id="MSVE_obliqueNotifyText" >' + L_DashboardBirdsEyeText_Text + "</div>" + '<img id="MSVE_obliqueNotifyImg" />' + "</div>"
        }
        function cb() {
            b[a.ThreeDUpdatedNotification] = document.createElement("div");
            b[a.ThreeDUpdatedNotification].id = a.ThreeDUpdatedNotification;
            b[a.ThreeDUpdatedNotification].innerHTML += '<div id="MSVE_threeDNotifyIcon">&nbsp;</div> <div id="MSVE_threeDNotifyText">' + L_Dashboard3DInstalled_Text + "</div>"
        }
        function sb() {
            B()
        }
        function B() {
            if (f == Msn.VE.DashboardStates.MapStyle.Road && d == Msn.VE.DashboardStates.MapView.Ortho) return;
            f = Msn.VE.DashboardStates.MapStyle.Road;
            d = Msn.VE.DashboardStates.MapView.Ortho;
            m(h + d + f)
        }
        function mb() {
            if (b[a.ShowLabels]) {
                i(a.ShowLabels, true);
                if (k) Y();
                else X()
            } else X()
        }
        function X() {
            if (f == Msn.VE.DashboardStates.MapStyle.Aerial && d == Msn.VE.DashboardStates.MapView.Ortho) return;
            f = Msn.VE.DashboardStates.MapStyle.Aerial;
            d = Msn.VE.DashboardStates.MapView.Ortho;
            m(h + d + f)
        }
        function nb() {
            Y()
        }
        function Y() {
            if (f == Msn.VE.DashboardStates.MapStyle.Hybrid && d == Msn.VE.DashboardStates.MapView.Ortho) return;
            f = Msn.VE.DashboardStates.MapStyle.Hybrid;
            d = Msn.VE.DashboardStates.MapView.Ortho;
            m(h + d + f)
        }
        function u() {
            if (d == Msn.VE.DashboardStates.MapView.Ortho && h == Msn.VE.DashboardStates.MapMode.Flatland) return;
            d = Msn.VE.DashboardStates.MapView.Ortho;
            if (h == Msn.VE.DashboardStates.MapMode.Flatland) switch (f) {
            case Msn.VE.DashboardStates.MapStyle.Aerial:
                if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Aerial)) m(h + d + f);
                else B();
                break;
            case Msn.VE.DashboardStates.MapStyle.Hybrid:
                if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Hybrid)) m(h + d + f);
                else B();
                break;
            default:
                m(h + d + f)
            } else m(h + d);
            o()
        }
        function P(c) {
            if (h == Msn.VE.DashboardStates.MapMode.View3D && g(b[a.Oblique]).hasClass("MSVE_selected")) {
                p();
                c.cancelBubble = true;
                return
            }
            G()
        }
        function G() {
            if (typeof b[a.ObliqueNotification] != "undefined" && b[a.ObliqueNotification]) p();
            if (h == Msn.VE.DashboardStates.MapMode.View3D) e.Oblique3DFunctionality.ObliqueClickFunction();
            else tb()
        }
        var L = null;

        function fb() {
            var e = new Date;
            if (L != null) if (e.getTime() - L.getTime() < 1000) return;
            L = e;
            var d = !g(b[a.Oblique]).hasClass("MSVE_selected");
            c.Show3DBirdseye(d, f == Msn.VE.DashboardStates.MapStyle.Road || k);
            var h = d ? "RequestLayerBirdsEyeOn" : "RequestLayerBirdsEyeOff"
        }
        var n;

        function tb() {
            if (d === Msn.VE.DashboardStates.MapView.Oblique) return;
            d = Msn.VE.DashboardStates.MapView.Oblique;
            y();
            if (k) f = Msn.VE.DashboardStates.MapStyle.Hybrid;
            else f = Msn.VE.DashboardStates.MapStyle.Aerial;
            if (typeof Msn.VE.API == "undefined") ob();
            else F()
        }
        function ob() {
            if (!n) {
                var a = $ID("msve_mapContainer");
                n = document.createElement("div");
                n.id = "animator";
                a.appendChild(n)
            }
            n.style.display = "block";
            n.className = "zoom_animation";
            window.setTimeout(F, 2000)
        }
        function F() {
            if (n) {
                n.parentNode.removeChild(n);
                n = null
            }
            if (c.IsDragging() || c.IsZooming()) {
                window.setTimeout(F, 250);
                return
            }
            m(h + d + f)
        }
        function lb() {
            Gb(Msn.VE.DashboardStates.MapMode.View3D + Msn.VE.DashboardStates.MapView.Oblique)
        }
        function hb() {
            if (d == Msn.VE.DashboardStates.MapView.StreetSide && h == Msn.VE.DashboardStates.MapMode.Flatland) return;
            d = Msn.VE.DashboardStates.MapView.StreetSide;
            m(h + d);
            jb()
        }
        function vb() {
            if (f == Msn.VE.DashboardStates.MapStyle.Aerial) {
                k = true;
                f = Msn.VE.DashboardStates.MapStyle.Hybrid
            } else if (f == Msn.VE.DashboardStates.MapStyle.Hybrid) {
                k = false;
                f = Msn.VE.DashboardStates.MapStyle.Aerial
            }
            m(h + d + f)
        }
        function kb() {
            c.EnableMode(Msn.VE.MapActionMode.Mode2D)
        }
        function qb() {
            if (typeof b[a.ThreeDUpdatedNotification] != "undefined" && b[a.ThreeDUpdatedNotification]) E();
            if (!c.IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) if (typeof ShowMessage != "undefined") {
                ShowMessage(L_3DLoading_Text);
                window.setTimeout(View3DSwitch, 200)
            } else c.EnableMode(Msn.VE.MapActionMode.Mode3D)
        }
        function A() {
            if (VE_TrafficManager.turnedOn) {
                g(b[a.Traffic]).addClass("MSVE_selected");
                b[a.Traffic].title = L_NavActionHideTrafficToolTip_Text
            } else {
                g(b[a.Traffic]).removeClass("MSVE_selected");
                b[a.Traffic].title = L_NavActionShowTrafficToolTip_Text
            }
        }
        function Ab() {
            if (VE_TrafficManager.turnedOn) VE_TrafficManager.ClearTraffic();
            else {
                for (var a in Msn.VE.API.Globals.vemapinstances) if (Msn.VE.API.Globals.vemapinstances[a] instanceof VEMap && Msn.VE.API.Globals.vemapinstances[a].vemapcontrol) {
                    VE_TrafficManager.m_vemap = Msn.VE.API.Globals.vemapinstances[a];
                    break
                }
                VE_TrafficManager.turnedOn = true;
                VE_TrafficManager.showTrafficFlow = true;
                VE_TrafficManager.showIncidents = true;
                VE_TrafficManager.showConstructionIncidents = true;
                VE_TrafficManager.markets = [];
                VE_TrafficManager.incidents = [];
                VE_TrafficManager.m_vemap.ShowTrafficLegend();
                VE_TrafficManager.m_vemap.SetTrafficLegendText(L_MapLegendAndPopupLink_Text);
                window.setTimeout(VE_TrafficManager.GetMarkets, 100)
            }
            A()
        }
        function rb(c) {
            if (c.enabled == "1") {
                g(b[a.Oblique]).addClass("MSVE_selected");
                b[a.Oblique].title = L_NavActionHideObliqueToolTip_Text
            } else {
                g(b[a.Oblique]).removeClass("MSVE_selected");
                b[a.Oblique].title = L_NavActionShowObliqueToolTip_Text
            }
        }
        function t(a) {
            W(a.view.mapStyle)
        }
        function Z(a) {
            if (a == Msn.VE.MapActionMode.Mode3D) U();
            else T()
        }
        function U() {
            if (h == Msn.VE.DashboardStates.MapMode.View3D) return;
            h = Msn.VE.DashboardStates.MapMode.View3D;
            if (typeof b[a.Mode] != "undefined" && b[a.Mode] != null) g(b[a.Mode].classRecipients).swapClass("MSVE_FlatlandMapMode", "MSVE_View3DMapMode");
            i(a.StreetSide, true);
            i(a.Road, true);
            i(a.Aerial, true);
            i(a.Hybrid, true);
            if (!e.Oblique3DFunctionality.DependsOnObliqueAvailability) i(a.Oblique, true);
            else {
                if (b[a.ObliqueNotification] != null && b[a.ObliqueNotification].enabled && !g(b[a.Oblique]).hasClass("MSVE_selected")) x();
                o()
            }
            if (typeof b[a.Ortho] != "undefined" && b[a.Ortho] != null) b[a.Ortho].title = L_NavAction3DOrthoToolTip_Text;
            if (typeof b[a.Oblique] != "undefined" && b[a.Oblique] != null) {
                b[a.Oblique].title = e.Oblique3DFunctionality.Title;
                if (b[a.Oblique].enabled && !g(b[a.Oblique]).hasClass("MSVE_selected")) x()
            }
            if (typeof b[a.StreetSide] != "undefined" && b[a.StreetSide] != null) b[a.StreetSide].title = L_NavAction3DStreetSideToolTip_Text;
            var f = c.GetDashboard().GetShimmedElements(),
                d;
            for (d = 0; d < f.length; d++) mvcViewFacade.UpdateShimIfSupported(f[d])
        }
        function T() {
            h = Msn.VE.DashboardStates.MapMode.Flatland;
            if (typeof b[a.Mode] != "undefined" && b[a.Mode] != null) g(b[a.Mode].classRecipients).swapClass("MSVE_View3DMapMode", "MSVE_FlatlandMapMode");
            if (typeof b[a.Ortho] != "undefined" && b[a.Ortho] != null) b[a.Ortho].title = L_NavActionOrthoToolTip_Text;
            if (typeof b[a.Oblique] != "undefined" && b[a.Oblique] != null) b[a.Oblique].title = L_NavActionObliqueToolTip_Text;
            g(b[a.Oblique]).removeClass("MSVE_selected");
            photoState = 0;
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Road)) i(a.Road, true);
            else i(a.Road, false);
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Aerial)) i(a.Aerial, true);
            else i(a.Aerial, false);
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Hybrid)) i(a.Hybrid, true);
            else i(a.Hybrid, false);
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye)) {
                c.GetObliqueAvailability("OnFlatlandModeUpdateUIObliqueReturned", O);
                return
            } else O(false)
        }
        function O(b) {
            if (b) {
                i(a.Oblique, true);
                if (e.obliqueZoom != null) e.obliqueZoom.UpdateFromMap()
            } else {
                i(a.Oblique, false);
                d = Msn.VE.DashboardStates.MapView.Ortho;
                o()
            }
            switch (d) {
            case Msn.VE.DashboardStates.MapView.Oblique:
                if (b && $MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye)) m(h + d);
                else u();
                break;
            case Msn.VE.DashboardStates.MapView.StreetSide:
                u();
                break;
            case Msn.VE.DashboardStates.MapView.Ortho:
                switch (f) {
                case Msn.VE.DashboardStates.MapStyle.Aerial:
                    if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Aerial)) m(h + d + f);
                    else B();
                    break;
                case Msn.VE.DashboardStates.MapStyle.Hybrid:
                    if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Hybrid)) m(h + d + f);
                    else B();
                    break;
                default:
                    m(h + d + f)
                }
                break;
            default:
                u()
            }
        }
        function w() {
            if (e.orthoZoom) e.orthoZoom.UpdateFromMap();
            if (e.obliqueZoom) e.obliqueZoom.UpdateFromMap();
            var b = null,
                a = null;
            if (l) {
                var f = l.GetPlus();
                if (f) b = g([f]);
                var d = l.GetMinus();
                if (d) a = g([d])
            }
            if (c.IsMapViewOrtho() && c.GetZoomLevel() == S || c.IsMapViewOblique() && c.GetZoomLevel() == 2) {
                if (b) b.addClass("MSVE_ZoomBar_plus_disabled");
                if (l) l.UnhookPlusEvents()
            } else if (c.GetZoomLevel() == Q) {
                if (a) a.addClass("MSVE_ZoomBar_minus_disabled");
                if (l) l.UnhookMinusEvents()
            }
            if (c.IsMapViewOrtho() && c.GetZoomLevel() != S || c.IsMapViewOblique() && c.GetZoomLevel() != 2) if (b && b.hasClass("MSVE_ZoomBar_plus_disabled")) {
                b.removeClass("MSVE_ZoomBar_plus_disabled");
                if (l) l.HookupPlusEvents()
            }
            if (c.GetZoomLevel() != Q) if (a && a.hasClass("MSVE_ZoomBar_minus_disabled")) {
                a.removeClass("MSVE_ZoomBar_minus_disabled");
                if (l) l.HookupMinusEvents()
            }
        }
        function zb() {
            if (c.IsMapViewOblique()) d = Msn.VE.DashboardStates.MapView.Oblique;
            if (h == Msn.VE.DashboardStates.MapMode.Flatland || h == Msn.VE.DashboardStates.MapMode.View3D && e.Oblique3DFunctionality.DependsOnObliqueAvailability) {
                i(a.Oblique, true);
                if (b[a.ObliqueNotification] && !c.IsMapViewOblique() && !g(b[a.Oblique]).hasClass("MSVE_selected")) x()
            }
        }
        function K() {
            d = Msn.VE.DashboardStates.MapView.Ortho;
            o();
            if (h == Msn.VE.DashboardStates.MapMode.Flatland || h == Msn.VE.DashboardStates.MapMode.View3D && e.Oblique3DFunctionality.DependsOnObliqueAvailability) {
                i(a.Oblique, false);
                p()
            }
        }
        function eb() {
            if (c.IsObliqueAvailable()) e.obliqueCompass.UpdateFromMap(r, true);
            else K()
        }
        function pb() {
            if (c.IsObliqueAvailable()) {
                d = Msn.VE.DashboardStates.MapView.Ortho;
                o()
            } else K()
        }
        function wb() {
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye)) {
                if (d != Msn.VE.DashboardStates.MapView.Oblique) {
                    d = Msn.VE.DashboardStates.MapView.Oblique;
                    i(a.Oblique, true);
                    y()
                }
            } else {
                d = Msn.VE.DashboardStates.MapView.Oblique;
                u()
            }
            if (b[a.ObliqueNotification]) p();
            if (typeof e.obliqueCompass != "undefined" && e.obliqueCompass != null) {
                e.obliqueCompass.UpdateFromMap(r);
                r = Msn.VE.BirdsEyeSearchSpinDirection.NoSpin
            }
        }
        function W(e) {
            if (!e) e = c.GetMapStyle();
            switch (e) {
            case Msn.VE.MapStyle.Shaded:
            case Msn.VE.MapStyle.Road:
                d = Msn.VE.DashboardStates.MapView.Ortho;
                o();
                f = Msn.VE.DashboardStates.MapStyle.Road;
                ub();
                if (b[a.ShowLabels]) {
                    i(a.ShowLabels, false);
                    g(b[a.ShowLabels]).addClass("MSVE_selected")
                }
                break;
            case Msn.VE.MapStyle.Aerial:
                d = Msn.VE.DashboardStates.MapView.Ortho;
                o();
                f = Msn.VE.DashboardStates.MapStyle.Aerial;
                H();
                k = false;
                if (b[a.ShowLabels]) {
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).removeClass("MSVE_selected")
                }
                break;
            case Msn.VE.MapStyle.Hybrid:
                d = Msn.VE.DashboardStates.MapView.Ortho;
                o();
                f = Msn.VE.DashboardStates.MapStyle.Hybrid;
                if (b[a.ShowLabels]) {
                    k = true;
                    H();
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).addClass("MSVE_selected")
                } else V();
                break;
            case Msn.VE.MapStyle.Oblique:
                d = Msn.VE.DashboardStates.MapView.Oblique;
                y();
                f = Msn.VE.DashboardStates.MapStyle.Aerial;
                if (b[a.ShowLabels]) {
                    H();
                    k = false;
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).removeClass("MSVE_selected")
                }
                i(a.Oblique, true);
                break;
            case Msn.VE.MapStyle.ObliqueHybrid:
                d = Msn.VE.DashboardStates.MapView.Oblique;
                y();
                f = Msn.VE.DashboardStates.MapStyle.Hybrid;
                if (b[a.ShowLabels]) {
                    V();
                    k = true;
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).addClass("MSVE_selected")
                }
                i(a.Oblique, true)
            }
            if (h == Msn.VE.DashboardStates.MapMode.View3D && g(b[a.Oblique]).hasClass("MSVE_selected")) if (f == Msn.VE.DashboardStates.MapStyle.Road) c.Show3DBirdseye(true, true);
            else c.Show3DBirdseye(true, k);
            if (b[a.ShowLabels]) if (k || f == Msn.VE.DashboardStates.MapStyle.Road) b[a.ShowLabels].title = L_NavActionHideLabels_Text;
            else b[a.ShowLabels].title = L_NavActionShowLabels_Text
        }
        function ub() {
            if (typeof b[a.Style] != "undefined" && b[a.Style] != null) {
                var c;
                for (c = 0; c < b[a.Style].classRecipients.length; c++) b[a.Style].classRecipients[c].className = "MSVE_RoadMapStyle"
            }
        }
        function H() {
            if (typeof b[a.Style] != "undefined" && b[a.Style] != null) {
                var c;
                for (c = 0; c < b[a.Style].classRecipients.length; c++) b[a.Style].classRecipients[c].className = "MSVE_AerialMapStyle"
            }
        }
        function V() {
            if (typeof b[a.Style] != "undefined" && b[a.Style] != null) {
                var c;
                for (c = 0; c < b[a.Style].classRecipients.length; c++) b[a.Style].classRecipients[c].className = "MSVE_HybridMapStyle"
            }
        }
        function o() {
            if (typeof b[a.View] != "undefined" && b[a.View] != null) {
                var c = g(b[a.View].classRecipients);
                c.removeClass("MSVE_StreetSideView");
                c.removeClass("MSVE_ObliqueView");
                c.addClass("MSVE_OrthoView")
            }
            if (b[a.Traffic] != null) {
                i(a.Traffic, true);
                A()
            }
            r = Msn.VE.BirdsEyeSearchSpinDirection.NoSpin
        }
        function y() {
            if (typeof b[a.View] != "undefined" && b[a.View] != null) {
                var c = g(b[a.View].classRecipients);
                c.removeClass("MSVE_StreetSideView");
                c.removeClass("MSVE_OrthoView");
                c.addClass("MSVE_ObliqueView")
            }
            if (I) {
                if (e.obliqueCompass == null) {
                    e.obliqueCompass = new xb(b[a.ObliqueCompass]);
                    if (b[a.ObliqueCompass].radius) e.obliqueCompass.SetRadius(b[a.ObliqueCompass].radius);
                    e.obliqueCompass.onclick = function () {
                        r = Msn.VE.BirdsEyeSearchSpinDirection.NoSpin
                    }
                }
                e.obliqueCompass.UpdateFromMap()
            }
            if (ab) {
                if (e.obliqueZoom == null) {
                    e.obliqueZoom = new yb(b[a.ObliqueZoom]);
                    e.obliqueZoom.Init()
                }
                e.obliqueZoom.UpdateFromMap()
            }
            if (b[a.Traffic] != null && h == Msn.VE.DashboardStates.MapMode.Flatland) i(a.Traffic, false)
        }
        function jb() {
            if (typeof b[a.View] != "undefined" && b[a.View] != null) {
                var c = g(b[a.View].classRecipients);
                c.removeClass("MSVE_OrthoView");
                c.removeClass("MSVE_ObliqueView");
                c.addClass("MSVE_StreetSideView")
            }
        }
        function x() {
            if (!b[a.ObliqueNotification]) return;
            if (R) return;
            R = true;
            if (!e.displaying3DNotification) if (d != Msn.VE.DashboardStates.MapView.Oblique) {
                if (!z) {
                    var o = g(b[a.ObliqueNotification]),
                        k = o.select("img");
                    for (var i = 0; i < k.length && !z; i++) {
                        var j = k.element(i);
                        if (j.id == "MSVE_obliqueNotifyImg") z = j
                    }
                }
                if (z) z.src = c.GetObliqueMode().GetMiddleTileFilename();
                var f = b[a.Oblique];
                b[a.ObliqueNotification].style.display = "block";
                var m = f.offsetLeft + f.offsetWidth / 2 - b[a.ObliqueNotification].offsetWidth / 2,
                    n = f.offsetTop + f.offsetHeight + 4;
                g(b[a.ObliqueNotification]).setStyle("top", n + "px").setStyle("left", m + "px");
                var l = D(),
                    h;
                for (h = 0; h < l.length; ++h) mvcViewFacade.UpdateShimIfSupported(l[h]);
                m = n = f = null;
                window.setTimeout(p, 6000)
            }
        }
        function bb() {
            if (!b[a.ThreeDUpdatedNotification]) return;
            p();
            if (!e.displaying3DNotification) {
                e.displaying3DNotification = true;
                var c = b[a.Mode3D];
                b[a.ThreeDUpdatedNotification].style.display = "block";
                var d = c.offsetLeft - 6,
                    f = c.offsetTop + c.offsetHeight + 4;
                g(b[a.ThreeDUpdatedNotification]).setStyle("top", f + "px").setStyle("left", d + "px");
                mvcViewFacade.UpdateShimIfSupported(b[a.ThreeDUpdatedNotification]);
                c = null;
                window.setTimeout(E, 6000)
            }
        }
        function p() {
            b[a.ObliqueNotification].style.display = "none";
            var d = D(),
                c;
            for (c = 0; c < d.length; ++c) mvcViewFacade.UpdateShimIfSupported(d[c])
        }
        function E() {
            e.displaying3DNotification = false;
            b[a.ThreeDUpdatedNotification].style.display = "none";
            mvcViewFacade.UpdateShimIfSupported(b[a.ThreeDUpdatedNotification])
        }
        function i(c, d) {
            if (b[c] == null) return;
            if (b[c].enabled == d) return;
            b[c].enabled = d;
            var a = j[c];
            if (a.InitialClass) if (d) g(b[c]).swapClass(a.InitialClass + "_disabled", a.InitialClass);
            else g(b[c]).swapClass(a.InitialClass, a.InitialClass + "_disabled");
            if (a.Title) b[c].title = a.Title;
            if (a.OnClickFunction) if (d) b[c].attachEvent("onclick", a.OnClickFunction);
            else b[c].detachEvent("onclick", a.OnClickFunction)
        }
        function m(d) {
            if (d & Msn.VE.DashboardStates.MapView.Ortho || d & Msn.VE.DashboardStates.MapMode.View3D) if (d & Msn.VE.DashboardStates.MapStyle.Road) c.SetMapStyle("r");
            else if (d & Msn.VE.DashboardStates.MapStyle.Aerial) c.SetMapStyle("a");
            else if (d & Msn.VE.DashboardStates.MapStyle.Hybrid) c.SetMapStyle("h");
            if (d & Msn.VE.DashboardStates.MapMode.Flatland && d & Msn.VE.DashboardStates.MapView.Oblique) if (d & Msn.VE.DashboardStates.MapStyle.Aerial && c.GetMapStyle() != Msn.VE.MapStyle.Oblique) {
                k = false;
                if (b[a.ShowLabels]) {
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).removeClass("MSVE_selected")
                }
                c.SetMapStyle(Msn.VE.MapStyle.Oblique)
            } else if (d & Msn.VE.DashboardStates.MapStyle.Hybrid && c.GetMapStyle() != Msn.VE.MapStyle.ObliqueHybrid) {
                k = true;
                if (b[a.ShowLabels]) {
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).addClass("MSVE_selected")
                }
                c.SetMapStyle(Msn.VE.MapStyle.ObliqueHybrid)
            }
        }
        function Gb(a) {
            if (a & Msn.VE.DashboardStates.MapMode.View3D) if (a & Msn.VE.DashboardStates.MapView.Ortho) c.SetTilt(-90);
            else if (a & Msn.VE.DashboardStates.MapView.Oblique) c.SetTilt(-45);
            else if (a & Msn.VE.DashboardStates.MapView.StreetSide) c.SetTilt(-25)
        }
        function D() {
            return [b[a.ObliqueNotification]]
        }
        function Fb(a) {
            return b[a]
        }
        function Cb() {
            return b
        }
        function Db() {
            return l
        }
        function gb() {
            return r
        }
        function ib(a) {
            r = a
        }
        this.SetMapViewState = function (a) {
            d = a
        };
        this.GetMapViewState = function () {
            return d
        };
        this.SetMapModeState = function (a) {
            h = a
        };
        this.GetMapModeState = function () {
            return h
        };
        this.SetLabelsState = function (a) {
            k = a
        };
        this.GetLabelsState = function () {
            return k
        };
        this.GetLastRotationDirection = gb;
        this.SetLastRotationDirection = ib;
        this.GetObliqueNotifierShimmedElements = D;
        this.Init = Ib;
        this.Create = M;
        this.Destroy = Hb;
        this.DestroyControl = J;
        this.GetControl = Fb;
        this.GetControls = Cb;
        this.GetTinyZoom = Db;
        this.OnOrthoMapViewClick = u;
        this.OnObliqueMapViewClick = G;
        this.UpdateZoom = w;
        this.SelectObliqueMapView = y;
        this.SelectOrthoMapView = o;
        this.DisplayObliqueNotification = x;
        this.HideObliqueNotification = p;
        this.DisplayThreeDUpdatedNotification = bb;
        this.HideThreeDUpdatedNotification = E
    };
    var c = document.createElement("div");
    c.id = C;
    z.appendChild(c);
    c.attachEvent("onmousedown", IgnoreEvent);
    c.attachEvent("onmouseup", IgnoreEvent);
    c.attachEvent("onmousemove", DashboardContainerMouseMoveEvent);
    c.attachEvent("onmousewheel", IgnoreEvent);
    c.attachEvent("ondblclick", IgnoreEvent);
    c.attachEvent("oncontextmenu", IgnoreEvent);
    c.attachEvent("onkeydown", IgnoreEvent);
    c.attachEvent("onkeyup", IgnoreEvent);
    c.className = "MSVE_Dashboard MSVE_Dashboard_V5 MSVE_FlatlandMapMode";
    if (i == Msn.VE.DashboardSize.Normal) c.className += " MSVE_Dashboard_Normal";
    else if (i == Msn.VE.DashboardSize.Small) c.className += " MSVE_Dashboard_Small";
    else if (i == Msn.VE.DashboardSize.Tiny) c.className += " MSVE_Dashboard_Tiny";
    var h = null,
        f = document.createElement("div");
    f.className = "MSVE_header";
    f.id = "MSVE_navAction_header";
    var e, d, b = s,
        o = document.createElement("div");
    o.id = "MSVE_dashboardContainer";
    var q = document.createElement("div");
    q.id = "MSVE_mapViewRow";
    o.appendChild(q);
    var m = document.createElement("div");
    m.id = "MSVE_zoomDiv";
    var p = document.createElement("div");
    p.id = "MSVE_navAction_mapViewCell";
    p.className = "MSVE_dashboardMapModeContainer";
    q.appendChild(m);
    q.appendChild(p);
    var l = document.createElement("div");
    l.id = "MSVE_mapStyleRow";
    o.appendChild(l);
    var j = document.createElement("div");
    j.id = "MSVE_threeDNotification";
    var n = document.createElement("div");
    n.id = "MSVE_lowerContainer";
    n.appendChild(o);
    c.className += " expanded";
    c.appendChild(f);
    c.appendChild(n);
    var k = false;

    function E() {
        if (i == Msn.VE.DashboardSize.Normal) {
            controlsNeeded = [b.Mode, b.View, b.Style, b.OrthoZoom, b.ObliqueCompass, b.ObliqueZoom];
            e = new Msn.VE.CommonControls(a, controlsNeeded);
            d = e.GetControls();
            e.displaying3DNotification = false;
            d[b.View].classRecipients = [o];
            d[b.Mode].classRecipients = [c];
            e.Oblique3DFunctionality = e.ObliqueFunctions.ObliqueTiltIn3D;
            e.Init();
            B(x);
            this.HideToggleGlyph();
            p.appendChild(d[b.View]);
            l.appendChild(d[b.Style]);
            l.appendChild(d[b.ObliqueCompass]);
            m.appendChild(d[b.OrthoZoom]);
            m.appendChild(d[b.ObliqueZoom]);
            if (A && $MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye)) {
                e.Create(b.ObliqueNotification);
                n.appendChild(d[b.ObliqueNotification])
            }
            if (Msn.VE.Animation) t()
        }
        if (i == Msn.VE.DashboardSize.Small) {
            controlsNeeded = [b.Style];
            e = new Msn.VE.CommonControls(a, controlsNeeded);
            d = e.GetControls();
            l.appendChild(d[b.Style]);
            e.Init()
        }
        if (i == Msn.VE.DashboardSize.Small || i == Msn.VE.DashboardSize.Tiny) {
            controlsNeeded = [b.TinyZoom];
            e = new Msn.VE.CommonControls(a, controlsNeeded);
            d = e.GetControls();
            m.appendChild(d[b.TinyZoom]);
            var f = e.GetTinyZoom(),
                h = f.GetPlus(),
                g = f.GetMinus();
            if (h && g) f.HookupPlusMinusEvents(h, g)
        }
    }
    function D() {
        if (i == Msn.VE.DashboardSize.Normal) {
            e.DestroyControl(d[b.OrthoZoom]);
            e.DestroyControl(d[b.ObliqueZoom]);
            e.DestroyControl(d[b.ObliqueCompass]);
            y();
            if (a) {
                try {
                    a.DetachEvent("onobliquechange", OnObliqueChange);
                    if ($MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye)) {
                        a.DetachEvent("onobliqueenter", OnObliqueEnter);
                        a.DetachEvent("onobliqueleave", OnObliqueLeave)
                    }
                } catch(c) {}
                a = null
            }
        }
        if (i == Msn.VE.DashboardSize.Normal || i == Msn.VE.DashboardSize.Small) {
            e.DestroyControl(d[b.Style]);
            l.removeChild(d[b.Style])
        }
        if (i == Msn.VE.DashboardSize.Small || i == Msn.VE.DashboardSize.Tiny) {
            e.DestroyControl(d[b.TinyZoom]);
            m.removeChild(d[b.TinyZoom])
        }
        l = e.obliqueCompass = null;
        p = q = null;
        n = null;
        j = null;
        d[b.ObliqueNotification] = m = d[b.ObliqueCompass] = null
    }
    function v() {
        if (!a.IsModeEnabled(Msn.VE.MapActionMode.Mode3D) && !a.IsMapViewOblique()) {
            n.appendChild(j);
            j.style.top = -(f.offsetHeight / 2 + 6) + "px";
            j.innerHTML += '<div id="MSVE_threeDNotifyIcon">&nbsp;</div> <div id="MSVE_threeDNotifyText">' + L_Dashboard3DText_Text + "</div>";
            j.attachEvent("onclick", u);
            window.setTimeout(w, 6000);
            e.displaying3DNotification = true
        } else j.style.display = "none"
    }
    function B(a) {
        r(a);
        h = document.createElement("a");
        h.className = "MSVE_toggleGlyph";
        h.title = L_NavActionHideToolTip_Text;
        f.appendChild(h)
    }
    function r(a) {
        if ($MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) && a != false) {
            if (!k) {
                e.Create(b.Mode);
                f.appendChild(d[b.Mode]);
                v();
                k = true
            }
            f.className = "MSVE_header MSVE_with3D"
        } else {
            f.className = "MSVE_header MSVE_no3D";
            k = false
        }
    }
    function y() {
        if (k) {
            e.DestroyControl(b.Mode);
            if (d[b.Mode] != null) f.removeChild(d[b.Mode]);
            k = false
        }
        f.removeChild(h);
        c.removeChild(f);
        h = f = null
    }
    function u() {
        j.style.display = "none";
        e.displaying3DNotification = false;
        if (!a.IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) if (typeof ShowMessage != "undefined") {
            ShowMessage(L_3DLoading_Text);
            window.setTimeout(View3DSwitch, 200)
        } else a.EnableMode(Msn.VE.MapActionMode.Mode3D)
    }
    function w() {
        if (j) {
            j.style.display = "none";
            e.displaying3DNotification = false
        }
        if (a != null && !a.IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) if (a.IsObliqueAvailable() && $MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye)) e.DisplayObliqueNotification()
    }
    this.SetX = function (a) {
        c.style.left = a + "px"
    };
    this.GetElement = function () {
        return c
    };
    this.GetShimmedElements = function () {
        return [c]
    };
    this.GetHeader = function () {
        return f
    };
    this.GetY = function () {
        return g(c).getScreenPosition().y
    };
    this.GetHeight = function () {
        return c.offsetHeight
    };
    this.ShowToggleGlyph = function () {
        if (h != null && h != "undefined") h.style.display = "block"
    };
    this.HideToggleGlyph = function () {
        if (h != null && h != "undefined") h.style.display = "none"
    };
    this.SetShowMapModeSwitch = function (a) {
        if (a != k) {
            if (!a) {
                e.DestroyControl(b.Mode);
                f.removeChild(d[b.Mode]);
                k = false
            }
            r(a)
        }
    };

    function t() {
        var b = a.GetDashboard().GetHeader().lastChild;
        a.GetDashboard().ShowToggleGlyph();
        window.dbRoller = new Msn.VE.Animation.Roller(a.GetDashboard().GetElement());
        dbRoller.setAccelerationFunction(AccelerationFunctions.CrazyElevator);
        dbRoller.setYLeave(32);
        dbRoller.hookEvent("beforerollin", function () {
            dbRoller.setYLeave(a.GetDashboard().GetHeader().offsetHeight);
            if (a.GetMinimap()) {
                a.GetMinimap().Hide();
                if (a.GetMinimap().IsInitialized()) a.GetMinimap().SetDoUpdates(false)
            }
        });
        dbRoller.hookEvent("afterrollin", function () {
            a.GetDashboard().GetElement().className = a.GetDashboard().GetElement().className.replace(/\s*expanded/g, "");
            a.GetDashboard().GetElement().className += " collapsed";
            a.GetDashboard().GetHeader().lastChild.title = L_NavActionShowToolTip_Text
        });
        dbRoller.hookEvent("beforerollout", function () {
            a.GetDashboard().GetElement().className = a.GetDashboard().GetElement().className.replace(/\s*collapsed/g, "");
            a.GetDashboard().GetElement().className += " expanded"
        });
        dbRoller.hookEvent("afterrollout", function () {
            if (a.GetMinimap()) {
                a.GetMinimap().Show();
                if (minimapRoller && minimapRoller.isExpanded() && a.GetMinimap().IsInitialized()) a.GetMinimap().SetDoUpdates(true)
            }
            a.GetDashboard().GetHeader().lastChild.title = L_NavActionHideToolTip_Text
        });
        dbRoller.hookEvent("roll", RollShim);
        b.onclick = function () {
            if (dbRoller.isExpanded()) dbRoller.rollIn(Msn.VE.Animation.RollDirection.BottomUp);
            else dbRoller.rollOut(Msn.VE.Animation.RollDirection.TopDown);
            return false
        };
        b = null
    }
    this.Hide = function () {
        if (c) c.style.display = "none"
    };
    this.Show = function () {
        if (c) c.style.display = "block"
    };
    this.Init = E;
    this.Destroy = D;
    this.createRoller = t
};

function DashboardContainerMouseMoveEvent(a) {
    a = GetEvent(a);
    return false
}
Msn.VE.V6Control = function (K, e, lb, ib, D, Z, V) {
    Msn.VE.DashboardStates = new
    function () {
        this.MapMode = new
        function () {
            this.Flatland = 1;
            this.View3D = 2
        };
        this.MapView = new
        function () {
            this.Ortho = 4;
            this.Oblique = 8;
            this.StreetSide = 16
        };
        this.MapStyle = new
        function () {
            this.Road = 32;
            this.Shaded = 64;
            this.Aerial = 128;
            this.Hybrid = 256
        }
    };
    var G = {
        Style: "MSVE_navAction_mapStyleCell",
        Road: "MSVE_navAction_RoadMapStyle",
        Aerial: "MSVE_navAction_AerialMapStyle",
        Hybrid: "MSVE_navAction_HybridMapStyle",
        Mode: "MSVE_navAction_modeCell",
        Mode2D: "MSVE_navAction_FlatlandMapMode",
        Mode3D: "MSVE_navAction_View3DMapMode",
        View: "MSVE_navAction_mapViewCellInner",
        Ortho: "MSVE_navAction_OrthoMapView",
        Oblique: "MSVE_navAction_ObliqueMapView",
        StreetSide: "MSVE_navAction_StreetSideMapView",
        ShowLabels: "MSVE_navAction_showLabels",
        Pan: "MSVE_navAction_panContainer",
        PanUp: "MSVE_navAction_panUp",
        PanDown: "MSVE_navAction_panDown",
        PanLeft: "MSVE_navAction_panLeft",
        PanRight: "MSVE_navAction_panRight",
        TinyZoom: "MSVE_TinyZoomBar",
        OrthoZoom: "MSVE_OrthoZoomBar",
        ObliqueZoom: "MSVE_ObliqueZoomBar",
        ObliqueCompass: "MSVE_compassDiv",
        ObliqueNotification: "MSVE_obliqueNotification",
        ThreeDUpdatedNotification: "MSVE_threeDUpdatedNotification",
        Traffic: "MSVE_navAction_traffic"
    },
        jb = "Nav Bar";
    Msn.VE.CommonControls = function (c, u) {
        function yb(b) {
            var f = document.createElement("div"),
                e = document.createElement("div"),
                a = document.createElement("div"),
                d = document.createElement("div"),
                w = 0,
                s = 0,
                j = false;
            this.Init = function () {
                d.className = "MSVE_ZoomBar_minus";
                d.id = "MSVE_navAction_obliqueZoomBar_minus";
                d.unselectable = "on";
                d.title = L_ZoomBarMinusToolTip_Text;
                d.attachEvent("onclick", l);
                pseudoHover(d);
                a.className = "MSVE_ZoomBar_slider";
                a.id = "MSVE_navAction_obliqueZoomBar_slider";
                a.unselectable = "on";
                a.attachEvent("onmousedown", o);
                a.attachEvent("onmousemove", p);
                a.attachEvent("onmouseup", q);
                a.attachEvent("onclick", IgnoreEvent);
                pseudoHover(a);
                e.className = "MSVE_ObliqueZoomBar_bar";
                e.unselectable = "on";
                e.appendChild(a);
                e.attachEvent("onclick", r);
                f.className = "MSVE_ZoomBar_plus";
                f.id = "MSVE_navAction_obliqueZoomBar_plus";
                f.title = L_ZoomBarPlusToolTip_Text;
                f.unselectable = "on";
                f.attachEvent("onclick", m);
                pseudoHover(f);
                b.className = "MSVE_ZoomBar";
                b.id = "MSVE_ObliqueZoomBar";
                b.appendChild(d);
                b.appendChild(e);
                b.appendChild(f);
                b.attachEvent("onmousedown", IgnoreEvent);
                b.attachEvent("onmouseup", IgnoreEvent);
                b.attachEvent("onclick", IgnoreEvent);
                b.attachEvent("ondblclick", IgnoreEvent);
                i()
            };

            function v() {
                b.style.display = "block"
            }
            function u() {
                b.style.display = "none"
            }
            function r(a) {
                a = GetEvent(a);
                CancelEvent(a);
                k();
                n(h(Gimme.Screen.getMousePosition(a).y));
                return false
            }
            function h(b) {
                b -= s + d.offsetHeight + a.offsetHeight;
                var c = e.offsetHeight - a.offsetHeight;
                if (b < 0) b = 0;
                else if (b > c) b = c;
                return b
            }
            function l() {
                c.ZoomOut()
            }
            function m() {
                c.ZoomIn()
            }
            function t() {
                d.detachEvent("onclick", l);
                a.detachEvent("onmousedown", o);
                a.detachEvent("onmousemove", p);
                a.detachEvent("onmouseup", q);
                a.detachEvent("onclick", IgnoreEvent);
                e.detachEvent("onclick", r);
                f.detachEvent("onclick", m);
                b.detachEvent("onmousedown", IgnoreEvent);
                b.detachEvent("onmousedown", IgnoreEvent);
                b.detachEvent("onclick", IgnoreEvent);
                b.detachEvent("ondblclick", IgnoreEvent);
                d = a = e = f = null
            }
            function o(b) {
                b = GetEvent(b);
                CancelEvent(b);
                k();
                if (a.setCapture) a.setCapture();
                j = true;
                return false
            }
            function p(b) {
                b = GetEvent(b);
                CancelEvent(b);
                if (j) a.style.top = h(Gimme.Screen.getMousePosition(b).y) + "px";
                return false
            }
            function q(b) {
                b = GetEvent(b);
                CancelEvent(b);
                if (a.releaseCapture) a.releaseCapture();
                j = false;
                n(h(Gimme.Screen.getMousePosition(b).y));
                i();
                return false
            }
            function k() {
                var a = g(b).getScreenPosition();
                w = a.x;
                s = a.y
            }
            function n(f) {
                var b = e.offsetHeight - a.offsetHeight,
                    d = 1 + MathRound((b - f) / b * 1);
                c.SetZoom(d)
            }
            function i() {
                if (c.GetZoomLevel() == 1) a.style.top = e.offsetHeight - a.offsetHeight + "px";
                else a.style.top = "0px"
            }
            this.Destroy = t;
            this.Show = v;
            this.Hide = u;
            this.UpdateFromMap = i
        }
        function B(z, x, y) {
            var a = document.createElement("div");
            a.setAttribute("id", z);
            a.innerHTML = x;
            var c = "MSVE_obliqueCompassPointOff",
                g = y;
            a.attachEvent("onmouseover", f);
            a.attachEvent("onmouseout", h);
            a.attachEvent("onclick", i);
            this.onclick = null;
            this.onmouseover = null;
            this.onmouseout = null;
            var e = 25,
                b = this,
                d = false,
                j = new v(a, 17, 17);

            function f(e) {
                if (d) return;
                c = a.className;
                a.className = "MSVE_obliqueCompassPointHover";
                if (b.onmouseover) b.onmouseover(e)
            }
            function i(a) {
                if (d) return;
                f(a);
                c = "MSVE_obliqueCompassPointOn";
                if (b.onclick) b.onclick(a)
            }
            function h(e) {
                if (d) return;
                a.className = c;
                if (b.onmouseout) b.onmouseout(e)
            }
            function m() {
                c = "MSVE_obliqueCompassPointOn";
                a.className = "MSVE_obliqueCompassPointOn"
            }
            function l() {
                c = "MSVE_obliqueCompassPointOff";
                a.className = "MSVE_obliqueCompassPointOff"
            }
            function u() {
                d = true;
                l()
            }
            function k() {
                d = false;
                m()
            }
            function q() {
                return a
            }
            function n() {
                return g
            }
            function o(a) {
                g = a
            }
            function w() {
                j.Reset();
                k()
            }
            function p(b) {
                a.style.left = b.left;
                a.style.top = b.top
            }
            function v(r, n, o) {
                var g = r,
                    a = 0,
                    b = .3,
                    c = 0,
                    l = 40,
                    k = Math.PI / 2,
                    h = true,
                    p = b + .1;

                function m(a, b, c) {
                    if (b >= c - a && b <= c + a) return true;
                    return false
                }
                function i() {
                    a += b;
                    if (a > Math.PI * 2) a -= Math.PI * 2;
                    else if (a < 0) a += Math.PI * 2;
                    if (m(p, a, c)) {
                        b = .3;
                        a = c;
                        d(a);
                        return
                    }
                    d(a);
                    window.setTimeout(i, l)
                }
                function d(a) {
                    var b = n + e * Math.sin(a),
                        c = o + e * Math.cos(a);
                    g.style.left = b + "px";
                    g.style.top = c + "px"
                }
                function f(a) {
                    c = a;
                    i()
                }
                function j(a, c) {
                    h = c;
                    if (!h) b *= -1;
                    f(k * a)
                }
                function q() {
                    a = 0
                }
                this.RotateTo = f;
                this.RotateToIndex = j;
                this.Reset = q
            }
            function t() {
                a.detachEvent("onmouseover", f);
                a.detachEvent("onmouseout", h);
                a.detachEvent("onclick", i);
                a = null
            }
            function s(a) {
                e = a
            }
            function r() {
                return e
            }
            this.SetRadius = s;
            this.GetRadius = r;
            this.GetElement = q;
            this.GetCurrentPositionIndex = n;
            this.SetCurrentPositionIndex = o;
            this.SetCurrentPosition = p;
            this.On = m;
            this.Off = l;
            this.RotateToIndex = j.RotateToIndex;
            this.Reset = w;
            this.Disable = u;
            this.Enable = k;
            this.Destroy = t
        }
        function xb(D) {
            var o = [];
            o.push({
                "top": "-8px",
                "left": "17px"
            });
            o.push({
                "top": "17px",
                "left": "42px"
            });
            o.push({
                "top": "42px",
                "left": "17px"
            });
            o.push({
                "top": "17px",
                "left": "-8px"
            });
            var f = document.createElement("div");
            f.setAttribute("id", "MSVE_obliqueCompassContainer");
            f.title = L_ObliqueCompassSelectDirection_Text;
            var a = new B("MSVE_obliqueCompassPointN", "N", 0),
                i = a.GetElement();
            i.attachEvent("onclick", r);
            i.attachEvent("onmouseover", u);
            i.attachEvent("onmouseout", h);
            var d = new B("MSVE_obliqueCompassPointE", "E", 1),
                k = d.GetElement();
            k.attachEvent("onclick", t);
            k.attachEvent("onmouseover", x);
            k.attachEvent("onmouseout", h);
            var b = new B("MSVE_obliqueCompassPointS", "S", 2),
                j = b.GetElement();
            j.attachEvent("onclick", s);
            j.attachEvent("onmouseover", v);
            j.attachEvent("onmouseout", h);
            var e = new B("MSVE_obliqueCompassPointW", "W", 3),
                l = e.GetElement();
            l.attachEvent("onclick", w);
            l.attachEvent("onmouseover", y);
            l.attachEvent("onmouseout", h);
            var m = document.createElement("div");
            m.id = "MSVE_navAction_obliqueCompassArrow";
            f.appendChild(i);
            f.appendChild(k);
            f.appendChild(j);
            f.appendChild(l);
            f.appendChild(m);
            D.appendChild(f);
            q();

            function p(a) {
                if (a < 0) a = 4 - Math.abs(a);
                return a
            }
            function n(l, i, k) {
                var c = l.GetCurrentPositionIndex(),
                    h, f = [];
                f[a.GetCurrentPositionIndex()] = L_North_Text;
                f[b.GetCurrentPositionIndex()] = L_South_Text;
                f[d.GetCurrentPositionIndex()] = L_East_Text;
                f[e.GetCurrentPositionIndex()] = L_West_Text;
                if (i) {
                    h = i == Msn.VE.BirdsEyeSearchSpinDirection.CounterclockwiseSpin;
                    if (c + i != 2) {
                        var g;
                        switch (i) {
                        case -1:
                            switch (c) {
                            case 0:
                            case 2:
                                g = [3];
                                break;
                            case 1:
                                g = [3, 2]
                            }
                            break;
                        case 1:
                            switch (c) {
                            case 0:
                            case 2:
                                g = [1];
                                break;
                            case 3:
                                g = [1, 2]
                            }
                        }
                        if (g) {
                            var j = L_ObliqueSkippingOneDirection_Text;
                            if (c == 0) j = L_ObliqueNoImageryInRequestedDirection_Text;
                            if (g.length == 2) j = L_ObliqueSkippingTwoDirections_Text;
                            if (typeof ShowMessage != "undefined") ShowMessage(j.replace("%1", f[c]).replace("%2", f[g[0]]).replace("%3", f[g[1]]))
                        }
                    }
                } else {
                    h = c != 3;
                    if (k) if (c == 0) {
                        if (typeof ShowMessage != "undefined") ShowMessage(L_ObliqueModeImageNotAvailable_Text)
                    } else if (typeof ShowMessage != "undefined") ShowMessage(L_ObliqueNoImageryInRequestedDirection_Text.replace("%1", f[c]).replace("%2", f[0]))
                }
                d.SetCurrentPositionIndex(p(d.GetCurrentPositionIndex() - c));
                e.SetCurrentPositionIndex(p(e.GetCurrentPositionIndex() - c));
                a.SetCurrentPositionIndex(p(a.GetCurrentPositionIndex() - c));
                b.SetCurrentPositionIndex(p(b.GetCurrentPositionIndex() - c));
                a.RotateToIndex(2 - a.GetCurrentPositionIndex() < 0 ? a.GetCurrentPositionIndex() : 2 - a.GetCurrentPositionIndex(), h);
                d.RotateToIndex(2 - d.GetCurrentPositionIndex() < 0 ? d.GetCurrentPositionIndex() : 2 - d.GetCurrentPositionIndex(), h);
                b.RotateToIndex(2 - b.GetCurrentPositionIndex() < 0 ? b.GetCurrentPositionIndex() : 2 - b.GetCurrentPositionIndex(), h);
                e.RotateToIndex(2 - e.GetCurrentPositionIndex() < 0 ? e.GetCurrentPositionIndex() : 2 - e.GetCurrentPositionIndex(), h)
            }
            function g(a) {
                switch (a) {
                case 0:
                    h();
                    break;
                case 1:
                    z();
                    break;
                case 2:
                    A();
                    break;
                case 3:
                    C()
                }
            }
            function h() {
                m.className = "MSVE_obliqueCompassArrowU"
            }
            function A() {
                m.className = "MSVE_obliqueCompassArrowD"
            }
            function z() {
                m.className = "MSVE_obliqueCompassArrowR"
            }
            function C() {
                m.className = "MSVE_obliqueCompassArrowL"
            }
            function s() {
                if (c.GetDashboard() && c.GetDashboard().SetLastRotationDirection) c.GetDashboard().SetLastRotationDirection(Msn.VE.BirdsEyeSearchSpinDirection.NoSpin);
                n(b);
                g(0);
                var a = c.GetObliqueScene();
                if (a) if (a.GetOrientation() != Msn.VE.Orientation.South) c.SetObliqueOrientation("South", null, true)
            }
            function r() {
                if (c.GetDashboard() && c.GetDashboard().SetLastRotationDirection) c.GetDashboard().SetLastRotationDirection(Msn.VE.BirdsEyeSearchSpinDirection.NoSpin);
                n(a);
                g(0);
                var b = c.GetObliqueScene();
                if (b) if (b.GetOrientation() != Msn.VE.Orientation.North) c.SetObliqueOrientation("North", null, true)
            }
            function t() {
                if (c.GetDashboard() && c.GetDashboard().SetLastRotationDirection) c.GetDashboard().SetLastRotationDirection(Msn.VE.BirdsEyeSearchSpinDirection.NoSpin);
                n(d);
                g(0);
                var a = c.GetObliqueScene();
                if (a) if (a.GetOrientation() != Msn.VE.Orientation.East) c.SetObliqueOrientation("East", null, true)
            }
            function w() {
                if (c.GetDashboard() && c.GetDashboard().SetLastRotationDirection) c.GetDashboard().SetLastRotationDirection(Msn.VE.BirdsEyeSearchSpinDirection.NoSpin);
                n(e);
                g(0);
                var a = c.GetObliqueScene();
                if (a) if (a.GetOrientation() != Msn.VE.Orientation.West) c.SetObliqueOrientation("West", null, true)
            }
            function v() {
                g(b.GetCurrentPositionIndex())
            }
            function x() {
                g(d.GetCurrentPositionIndex())
            }
            function y() {
                g(e.GetCurrentPositionIndex())
            }
            function u() {
                g(a.GetCurrentPositionIndex())
            }
            function H() {
                f.style.display = "none"
            }
            function I() {
                f.style.display = "block"
            }
            function q(k, j) {
                var i = c.GetObliqueScene();
                if (!i) return;
                var f = i.GetOrientation(),
                    h;
                switch (f) {
                case "North":
                    h = a;
                    break;
                case "South":
                    h = b;
                    break;
                case "East":
                    h = d;
                    break;
                case "West":
                    h = e
                }
                n(h, k, j);
                g(0);
                if (f != Msn.VE.Orientation.North) a.Enable();
                else a.Disable();
                if (f != Msn.VE.Orientation.South) b.Enable();
                else b.Disable();
                if (f != Msn.VE.Orientation.East) d.Enable();
                else d.Disable();
                if (f != Msn.VE.Orientation.West) e.Enable();
                else e.Disable()
            }
            function G() {
                a.Destroy();
                d.Destroy();
                b.Destroy();
                e.Destroy();
                i.detachEvent("onclick", r);
                i.detachEvent("onmouseover", u);
                i.detachEvent("onmouseout", h);
                k.detachEvent("onclick", t);
                k.detachEvent("onmouseover", x);
                k.detachEvent("onmouseout", h);
                j.detachEvent("onclick", s);
                j.detachEvent("onmouseover", v);
                j.detachEvent("onmouseout", h);
                l.detachEvent("onclick", w);
                l.detachEvent("onmouseover", y);
                l.detachEvent("onmouseout", h);
                f = null
            }
            function F(c) {
                a.SetRadius(c);
                b.SetRadius(c);
                d.SetRadius(c);
                e.SetRadius(c)
            }
            function E() {
                return a.GetRadius()
            }
            this.Hide = H;
            this.Show = I;
            this.UpdateFromMap = q;
            this.SetRadius = F;
            this.GetRadius = E;
            this.Destroy = G
        }
        function Bb(b) {
            var f = document.createElement("div"),
                e = document.createElement("div"),
                a = document.createElement("div"),
                d = document.createElement("div"),
                v = 0,
                s = 0,
                j = false;
            this.Init = function () {
                d.className = "MSVE_ZoomBar_minus";
                d.id = "MSVE_navAction_orthoZoomBar_minus";
                d.title = L_ZoomBarMinusToolTip_Text;
                d.unselectable = "on";
                d.attachEvent("onclick", l);
                pseudoHover(d);
                a.className = "MSVE_ZoomBar_slider";
                a.id = "MSVE_navAction_orthoZoomBar_slider";
                a.title = L_ZoomBarSliderToolTip_Text;
                a.unselectable = "on";
                a.attachEvent("onmousedown", o);
                a.attachEvent("onmousemove", p);
                a.attachEvent("onmouseup", q);
                a.attachEvent("onclick", IgnoreEvent);
                pseudoHover(a);
                e.className = "MSVE_OrthoZoomBar_bar";
                e.unselectable = "on";
                e.appendChild(a);
                e.attachEvent("onclick", r);
                f.className = "MSVE_ZoomBar_plus";
                f.id = "MSVE_navAction_orthoZoomBar_plus";
                f.title = L_ZoomBarPlusToolTip_Text;
                f.unselectable = "on";
                f.attachEvent("onclick", m);
                pseudoHover(f);
                b.className = "MSVE_ZoomBar";
                b.id = "MSVE_OrthoZoomBar";
                b.appendChild(d);
                b.appendChild(e);
                b.appendChild(f);
                b.attachEvent("onmousedown", IgnoreEvent);
                b.attachEvent("onmouseup", IgnoreEvent);
                b.attachEvent("onclick", IgnoreEvent);
                b.attachEvent("ondblclick", IgnoreEvent);
                i()
            };
            this.Destroy = function () {
                d.detachEvent("onclick", l);
                a.detachEvent("onmousedown", o);
                a.detachEvent("onmousemove", p);
                a.detachEvent("onmouseup", q);
                a.detachEvent("onclick", IgnoreEvent);
                e.detachEvent("onclick", r);
                f.detachEvent("onclick", m);
                b.detachEvent("onmousedown", IgnoreEvent);
                b.detachEvent("onmousedown", IgnoreEvent);
                b.detachEvent("onclick", IgnoreEvent);
                b.detachEvent("ondblclick", IgnoreEvent);
                d = a = e = f = null
            };

            function u() {
                b.style.display = "block"
            }
            function t() {
                b.style.display = "none"
            }
            function k() {
                var a = g(b).getScreenPosition();
                v = a.x;
                s = a.y
            }
            function o(b) {
                b = GetEvent(b);
                CancelEvent(b);
                k();
                if (a.setCapture) a.setCapture();
                j = true;
                return false
            }
            function p(b) {
                b = GetEvent(b);
                CancelEvent(b);
                if (j) a.style.top = h(Gimme.Screen.getMousePosition(b).y) + "px";
                return false
            }
            function q(b) {
                b = GetEvent(b);
                CancelEvent(b);
                if (a.releaseCapture) a.releaseCapture();
                j = false;
                n(h(Gimme.Screen.getMousePosition(b).y));
                i();
                return false
            }
            function m() {
                c.ZoomIn()
            }
            function l() {
                c.ZoomOut()
            }
            function r(a) {
                a = GetEvent(a);
                CancelEvent(a);
                k();
                n(h(Gimme.Screen.getMousePosition(a).y));
                return false
            }
            function h(b) {
                b -= s + d.offsetHeight + a.offsetHeight;
                var c = e.offsetHeight - a.offsetHeight;
                if (b < 0) b = 0;
                else if (b > c) b = c;
                return b
            }
            function n(f) {
                var b = e.offsetHeight - a.offsetHeight,
                    d = 1 + MathRound((b - f) / b * 18);
                c.SetZoom(d)
            }
            function i() {
                var b = e.offsetHeight - a.offsetHeight,
                    d = b - (c.GetZoomLevel() - 1) / 18 * b;
                a.style.top = d + "px"
            }
            this.UpdateFromMap = i;
            this.Show = u;
            this.Hide = t
        }
        function Eb() {
            var h = document.createElement("div"),
                g = document.createElement("div"),
                f = document.createElement("div"),
                a = false,
                d = g,
                b = f;
            this.maxZoomLevel = 21;
            this.minZoomLevel = 1;
            this.Init = function () {
                g.className = "MSVE_ZoomBar_plus";
                g.id = "MSVE_navAction_tinyZoomBar_plus";
                g.title = L_ZoomBarPlusToolTip_Text;
                g.unselectable = "on";
                f.className = "MSVE_ZoomBar_minus";
                f.id = "MSVE_navAction_tinyZoomBar_minus";
                f.title = L_ZoomBarMinusToolTip_Text;
                f.unselectable = "on";
                c.AttachEvent("onendzoom", i);
                h.className = "MSVE_ZoomBar";
                h.id = "MSVE_TinyZoomBar";
                h.appendChild(g);
                h.appendChild(f);
                return h
            };
            this.HookupPlusMinusEvents = function (b, a) {
                m(b);
                j(a)
            };

            function m(a) {
                if (a) d = a;
                d.attachEvent("onmousedown", o);
                d.attachEvent("onmouseup", e);
                d.attachEvent("onmouseout", e)
            }
            this.HookupPlusEvents = m;

            function j(a) {
                if (a) b = a;
                b.attachEvent("onmousedown", l);
                b.attachEvent("onmouseup", e);
                b.attachEvent("onmouseout", e)
            }
            this.HookupMinusEvents = j;

            function n() {
                if (d != null) {
                    d.detachEvent("onmousedown", o);
                    d.detachEvent("onmouseup", e);
                    d.detachEvent("onmouseout", e)
                }
                if (a == "in") a = false
            }
            this.UnhookPlusEvents = n;

            function k() {
                if (b != null) {
                    b.detachEvent("onmousedown", l);
                    b.detachEvent("onmouseup", e);
                    b.detachEvent("onmouseout", e)
                }
                if (a == "out") a = false
            }
            this.UnhookMinusEvents = k;
            this.Destroy = function () {
                n();
                k();
                c.DetachEvent("onendzoom", i);
                g = f = d = b = null
            };

            function q() {
                if (c.GetMapMode() == Msn.VE.MapActionMode.Mode3D) return true;
                else return c.IsAnimationEnabled()
            }
            function o() {
                a = "in";
                c.ZoomIn()
            }
            function i() {
                window.setTimeout(p, q() ? 1 : 500)
            }
            function p() {
                if (a == "in" && c.GetZoomLevel() < 21) c.ZoomIn(false);
                else if (a == "out" && c.GetZoomLevel() > 1) c.ZoomOut(false)
            }
            function l() {
                a = "out";
                c.ZoomOut()
            }
            function e() {
                a = false
            }
            this.GetPlus = function () {
                return g
            };
            this.GetMinus = function () {
                return f
            }
        }
        var a = G,
            j = [];
        j[a.Style] = {
            Id: a.Style,
            InitialClass: null,
            OnClickFunction: null,
            StyleUpdateEvent: null,
            StyleUpdateFunction: null,
            Enabled: true,
            Title: null,
            Children: [a.Road, a.Aerial, a.Hybrid],
            Text: null
        };
        j[a.Road] = {
            Id: a.Road,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: sb,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: s,
            Enabled: MapControl.Features.MapStyle.Road,
            Title: L_NavActionRoadToolTip_Text,
            Children: null,
            Text: L_NavActionRoad_Text
        };
        j[a.Aerial] = {
            Id: a.Aerial,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: mb,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: s,
            Enabled: MapControl.Features.MapStyle.Aerial,
            Title: L_NavActionAerialToolTip_Text,
            Children: null,
            Text: L_NavActionAerial_Text
        };
        j[a.Hybrid] = {
            Id: a.Hybrid,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: nb,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: s,
            Enabled: MapControl.Features.MapStyle.Hybrid,
            Title: L_NavActionHybridToolTip_Text,
            Children: null,
            Text: L_NavActionHybrid_Text
        };
        j[a.Mode] = {
            Id: a.Mode,
            InitialClass: "MSVE_modeCell",
            OnClickFunction: null,
            StyleUpdateEvent: null,
            StyleUpdateFunction: null,
            Enabled: true,
            Title: null,
            Children: [a.Mode2D, a.Mode3D],
            Text: null
        };
        j[a.Mode2D] = {
            Id: a.Mode2D,
            InitialClass: "MSVE_MapMode",
            OnClickFunction: kb,
            StyleUpdateEvent: "oninitmode",
            StyleUpdateFunction: Z,
            Enabled: true,
            Title: L_NavActionFlatlandToolTip_Text,
            Children: null,
            Text: L_NavActionFlatland_Text
        };
        j[a.Mode3D] = {
            Id: a.Mode3D,
            InitialClass: "MSVE_MapMode",
            OnClickFunction: qb,
            StyleUpdateEvent: "oninitmode",
            StyleUpdateFunction: Z,
            Enabled: MapControl.Features.MapStyle.View3D,
            Title: L_NavActionView3DToolTip_Text,
            Children: null,
            Text: L_NavActionView3D_Text
        };
        j[a.View] = {
            Id: a.View,
            InitialClass: null,
            OnClickFunction: null,
            StyleUpdateEvent: null,
            StyleUpdateFunction: null,
            Enabled: true,
            Title: null,
            Children: [a.Ortho, a.Oblique, a.StreetSide],
            Text: null
        };
        j[a.Ortho] = {
            Id: a.Ortho,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: t,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: s,
            Enabled: true,
            Title: L_NavActionOrthoToolTip_Text,
            Children: null,
            Text: null
        };
        j[a.Oblique] = {
            Id: a.Oblique,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: F,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: s,
            Enabled: false,
            Title: L_NavActionObliqueToolTip_Text,
            Children: null,
            Text: null
        };
        j[a.StreetSide] = {
            Id: a.StreetSide,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: hb,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: s,
            Enabled: false,
            Title: L_NavActionStreetSideToolTip_Text,
            Children: null,
            Text: null
        };
        j[a.ShowLabels] = {
            Id: a.ShowLabels,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: vb,
            StyleUpdateEvent: "onchangemapstyle",
            StyleUpdateFunction: s,
            Enabled: true,
            Title: L_NavActionShowLabels_Text,
            Children: null,
            Text: L_NavActionLabels_Text
        };
        j[a.Traffic] = {
            Id: a.Traffic,
            InitialClass: "MSVE_MapStyle",
            OnClickFunction: Ab,
            StyleUpdateEvent: null,
            StyleUpdateFunction: null,
            Enabled: true,
            Title: L_NavActionShowTrafficToolTip_Text,
            Children: null,
            Text: L_NavActionTraffic_Text
        };
        this.ObliqueFunctions = [];
        this.ObliqueFunctions.ObliqueImageryIn3D = {
            ObliqueClickFunction: fb,
            Title: L_NavActionShowObliqueToolTip_Text,
            DependsOnObliqueAvailability: true
        };
        this.ObliqueFunctions.ObliqueTiltIn3D = {
            ObliqueClickFunction: lb,
            Title: L_NavAction3DObliqueToolTip_Text,
            DependsOnObliqueAvailability: false
        };
        var e = this,
            b = [],
            h = Msn.VE.DashboardStates.MapMode.Flatland,
            d = Msn.VE.DashboardStates.MapView.Ortho,
            f = Msn.VE.DashboardStates.MapStyle.Road;
        this.orthoZoom = null;
        var l;
        this.obliqueCompass = null;
        this.obliqueZoom = null;
        this.displaying3DNotification = false;
        var y = null;
        this.Oblique3DFunctionality = this.ObliqueFunctions.ObliqueImageryIn3D;
        var q = document.createElement("div");
        q.id = "MSVE_navAction_palette";
        document.body.appendChild(q);
        var I = false,
            ab = false,
            S = 19,
            Q = 1,
            k = true,
            R = false,
            r = Msn.VE.BirdsEyeSearchSpinDirection.NoSpin,
            N;
        for (N in u) if (u.hasOwnProperty(N)) M(u[N]);

        function Ib() {
            var d = $MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye) && (c.IsObliqueAvailable() || c.IsMapViewOblique());
            if (d) {
                i(a.Oblique, true);
                if (b[a.ObliqueNotification] && !c.IsMapViewOblique() && !g(b[a.Oblique]).hasClass("MSVE_selected")) w()
            } else {
                i(a.Oblique, false);
                if (b[a.ObliqueNotification]) p()
            }
            W();
            if (c.IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) U();
            else T()
        }
        function Hb() {
            var a;
            for (a in u) if (u.hasOwnProperty(a)) J(u[a]);
            document.body.removeChild(q);
            q = null
        }
        function M(f) {
            switch (f) {
            case a.OrthoZoom:
                b[f] = document.createElement("div");
                e.orthoZoom = new Bb(b[f]);
                e.orthoZoom.Init();
                c.AttachEvent("onendzoom", v);
                q.appendChild(b[f]);
                v();
                return;
            case a.ObliqueZoom:
                b[f] = document.createElement("div");
                ab = true;
                b[f].id = f;
                q.appendChild(b[f]);
                return;
            case a.TinyZoom:
                l = new Eb;
                b[f] = l.Init();
                c.AttachEvent("onendzoom", v);
                v();
                return;
            case a.ObliqueCompass:
                b[f] = document.createElement("div");
                b[f].id = f;
                I = true;
                return;
            case a.ObliqueNotification:
                db();
                return;
            case a.ThreeDUpdatedNotification:
                cb();
                return;
            case a.Oblique:
                c.AttachEvent("onve3dphotostatechanged", rb)
            }
            var d = j[f],
                g = document.createElement("div");
            b[d.Id] = g;
            g.id = d.Id;
            g.enabled = d.Enabled;
            g.classRecipients = [g];
            if (d.Text != null) g.innerText = d.Text;
            if (d.OnClickFunction != null && d.Enabled == true) g.attachEvent("onclick", d.OnClickFunction);
            if (d.StyleUpdateEvent != null && d.StyleUpdateFunction != null) c.AttachEvent(d.StyleUpdateEvent, d.StyleUpdateFunction);
            if (d.InitialClass) {
                g.className = d.InitialClass;
                if (!g.enabled) g.className += "_disabled"
            }
            if (d.Children != null) {
                var h;
                for (h in d.Children) if (d.Children.hasOwnProperty(h)) g.appendChild(M(d.Children[h]))
            } else pseudoHover(g);
            switch (f) {
            case a.Oblique:
            case a.ObliqueCompass:
                c.AttachEvent("onobliqueenter", zb);
                c.AttachEvent("onobliqueleave", K);
                c.AttachEvent("onendmapstyleoblique", pb);
                c.AttachEvent("onobliquechange", wb);
                c.AttachEvent("obliquerequestunavailable", eb);
                break;
            case a.Traffic:
                c.AttachEvent("onchangetraffic", z);
                z()
            }
            return g
        }
        function J(f) {
            switch (f) {
            case a.OrthoZoom:
                e.orthoZoom.Destroy();
                b[f] = null;
                c.DetachEvent("onendzoom", v);
                try {
                    q.removeChild(b[f])
                } catch(k) {}
                return;
            case a.ObliqueZoom:
                try {
                    q.removeChild(b[f])
                } catch(k) {}
                if (e.obliqueZoom) {
                    e.obliqueZoom.Destroy();
                    e.obliqueZoom = null
                }
            case a.TinyZoom:
                l.Destroy();
                b[f] = null;
                return;
            case a.ObliqueCompass:
                if (I && e.obliqueCompass) {
                    e.obliqueCompass.onclick = null;
                    e.obliqueCompass.Destroy();
                    e.obliqueCompass = null
                }
                return;
            case a.ObliqueNotification:
                b[a.ObliqueNotification].detachEvent("onclick", P);
                return;
            case a.ThreeDUpdatedNotification:
                b[a.ThreeDUpdatedNotification] = null;
                return;
            case a.Traffic:
                c.DetachEvent("onchangetraffic", z)
            }
            var i = b[f];
            if (i == null) return;
            var d = j[f];
            if (d.Children != null) {
                var g, h;
                for (h in d.Children) if (d.Children.hasOwnProperty(h)) {
                    g = d.Children[h];
                    try {
                        i.removeChild(b[g])
                    } catch(k) {}
                    J(g)
                }
            }
            if (d.OnClickFunction != null) i.detachEvent("onclick", d.OnClickFunction);
            try {
                if (c && d.StyleUpdateEvent != null && d.StyleUpdateFunction != null) c.DetachEvent(d.StyleUpdateEvent, d.StyleUpdateFunction)
            } catch(k) {}
            b[d.Id] = null
        }
        function db() {
            b[a.ObliqueNotification] = document.createElement("div");
            b[a.ObliqueNotification].id = a.ObliqueNotification;
            b[a.ObliqueNotification].attachEvent("onclick", P);
            b[a.ObliqueNotification].innerHTML += '<div id="MSVE_obliqueNotifyBeak" ></div> ' + '<div id="MSVE_obliqueNotifyContent"> ' + '<div id="MSVE_obliqueNotifyText" >' + L_DashboardBirdsEyeText_Text + "</div>" + '<img id="MSVE_obliqueNotifyImg" />' + "</div>"
        }
        function cb() {
            b[a.ThreeDUpdatedNotification] = document.createElement("div");
            b[a.ThreeDUpdatedNotification].id = a.ThreeDUpdatedNotification;
            b[a.ThreeDUpdatedNotification].innerHTML += '<div id="MSVE_threeDNotifyIcon">&nbsp;</div> <div id="MSVE_threeDNotifyText">' + L_Dashboard3DInstalled_Text + "</div>"
        }
        function sb() {
            A()
        }
        function A() {
            if (f == Msn.VE.DashboardStates.MapStyle.Road && d == Msn.VE.DashboardStates.MapView.Ortho) return;
            f = Msn.VE.DashboardStates.MapStyle.Road;
            d = Msn.VE.DashboardStates.MapView.Ortho;
            m(h + d + f)
        }
        function mb() {
            if (b[a.ShowLabels]) {
                i(a.ShowLabels, true);
                if (k) Y();
                else X()
            } else X()
        }
        function X() {
            if (f == Msn.VE.DashboardStates.MapStyle.Aerial && d == Msn.VE.DashboardStates.MapView.Ortho) return;
            f = Msn.VE.DashboardStates.MapStyle.Aerial;
            d = Msn.VE.DashboardStates.MapView.Ortho;
            m(h + d + f)
        }
        function nb() {
            Y()
        }
        function Y() {
            if (f == Msn.VE.DashboardStates.MapStyle.Hybrid && d == Msn.VE.DashboardStates.MapView.Ortho) return;
            f = Msn.VE.DashboardStates.MapStyle.Hybrid;
            d = Msn.VE.DashboardStates.MapView.Ortho;
            m(h + d + f)
        }
        function t() {
            if (d == Msn.VE.DashboardStates.MapView.Ortho && h == Msn.VE.DashboardStates.MapMode.Flatland) return;
            d = Msn.VE.DashboardStates.MapView.Ortho;
            if (h == Msn.VE.DashboardStates.MapMode.Flatland) switch (f) {
            case Msn.VE.DashboardStates.MapStyle.Aerial:
                if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Aerial)) m(h + d + f);
                else A();
                break;
            case Msn.VE.DashboardStates.MapStyle.Hybrid:
                if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Hybrid)) m(h + d + f);
                else A();
                break;
            default:
                m(h + d + f)
            } else m(h + d);
            o()
        }
        function P(c) {
            if (h == Msn.VE.DashboardStates.MapMode.View3D && g(b[a.Oblique]).hasClass("MSVE_selected")) {
                p();
                c.cancelBubble = true;
                return
            }
            F()
        }
        function F() {
            if (typeof b[a.ObliqueNotification] != "undefined" && b[a.ObliqueNotification]) p();
            if (h == Msn.VE.DashboardStates.MapMode.View3D) e.Oblique3DFunctionality.ObliqueClickFunction();
            else tb()
        }
        var L = null;

        function fb() {
            var e = new Date;
            if (L != null) if (e.getTime() - L.getTime() < 1000) return;
            L = e;
            var d = !g(b[a.Oblique]).hasClass("MSVE_selected");
            c.Show3DBirdseye(d, f == Msn.VE.DashboardStates.MapStyle.Road || k);
            var h = d ? "RequestLayerBirdsEyeOn" : "RequestLayerBirdsEyeOff"
        }
        var n;

        function tb() {
            if (d === Msn.VE.DashboardStates.MapView.Oblique) return;
            d = Msn.VE.DashboardStates.MapView.Oblique;
            x();
            if (k) f = Msn.VE.DashboardStates.MapStyle.Hybrid;
            else f = Msn.VE.DashboardStates.MapStyle.Aerial;
            if (typeof Msn.VE.API == "undefined") ob();
            else E()
        }
        function ob() {
            if (!n) {
                var a = $ID("msve_mapContainer");
                n = document.createElement("div");
                n.id = "animator";
                a.appendChild(n)
            }
            n.style.display = "block";
            n.className = "zoom_animation";
            window.setTimeout(E, 2000)
        }
        function E() {
            if (n) {
                n.parentNode.removeChild(n);
                n = null
            }
            if (c.IsDragging() || c.IsZooming()) {
                window.setTimeout(E, 250);
                return
            }
            m(h + d + f)
        }
        function lb() {
            Gb(Msn.VE.DashboardStates.MapMode.View3D + Msn.VE.DashboardStates.MapView.Oblique)
        }
        function hb() {
            if (d == Msn.VE.DashboardStates.MapView.StreetSide && h == Msn.VE.DashboardStates.MapMode.Flatland) return;
            d = Msn.VE.DashboardStates.MapView.StreetSide;
            m(h + d);
            jb()
        }
        function vb() {
            if (f == Msn.VE.DashboardStates.MapStyle.Aerial) {
                k = true;
                f = Msn.VE.DashboardStates.MapStyle.Hybrid
            } else if (f == Msn.VE.DashboardStates.MapStyle.Hybrid) {
                k = false;
                f = Msn.VE.DashboardStates.MapStyle.Aerial
            }
            m(h + d + f)
        }
        function kb() {
            c.EnableMode(Msn.VE.MapActionMode.Mode2D)
        }
        function qb() {
            if (typeof b[a.ThreeDUpdatedNotification] != "undefined" && b[a.ThreeDUpdatedNotification]) D();
            if (!c.IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) if (typeof ShowMessage != "undefined") {
                ShowMessage(L_3DLoading_Text);
                window.setTimeout(View3DSwitch, 200)
            } else c.EnableMode(Msn.VE.MapActionMode.Mode3D)
        }
        function z() {
            if (VE_TrafficManager.turnedOn) {
                g(b[a.Traffic]).addClass("MSVE_selected");
                b[a.Traffic].title = L_NavActionHideTrafficToolTip_Text
            } else {
                g(b[a.Traffic]).removeClass("MSVE_selected");
                b[a.Traffic].title = L_NavActionShowTrafficToolTip_Text
            }
        }
        function Ab() {
            if (VE_TrafficManager.turnedOn) VE_TrafficManager.ClearTraffic();
            else {
                for (var a in Msn.VE.API.Globals.vemapinstances) if (Msn.VE.API.Globals.vemapinstances[a] instanceof VEMap && Msn.VE.API.Globals.vemapinstances[a].vemapcontrol) {
                    VE_TrafficManager.m_vemap = Msn.VE.API.Globals.vemapinstances[a];
                    break
                }
                VE_TrafficManager.turnedOn = true;
                VE_TrafficManager.showTrafficFlow = true;
                VE_TrafficManager.showIncidents = true;
                VE_TrafficManager.showConstructionIncidents = true;
                VE_TrafficManager.markets = [];
                VE_TrafficManager.incidents = [];
                VE_TrafficManager.m_vemap.ShowTrafficLegend();
                VE_TrafficManager.m_vemap.SetTrafficLegendText(L_MapLegendAndPopupLink_Text);
                window.setTimeout(VE_TrafficManager.GetMarkets, 100)
            }
            z()
        }
        function rb(c) {
            if (c.enabled == "1") {
                g(b[a.Oblique]).addClass("MSVE_selected");
                b[a.Oblique].title = L_NavActionHideObliqueToolTip_Text
            } else {
                g(b[a.Oblique]).removeClass("MSVE_selected");
                b[a.Oblique].title = L_NavActionShowObliqueToolTip_Text
            }
        }
        function s(a) {
            W(a.view.mapStyle)
        }
        function Z(a) {
            if (a == Msn.VE.MapActionMode.Mode3D) U();
            else T()
        }
        function U() {
            if (h == Msn.VE.DashboardStates.MapMode.View3D) return;
            h = Msn.VE.DashboardStates.MapMode.View3D;
            if (typeof b[a.Mode] != "undefined" && b[a.Mode] != null) g(b[a.Mode].classRecipients).swapClass("MSVE_FlatlandMapMode", "MSVE_View3DMapMode");
            i(a.StreetSide, true);
            i(a.Road, true);
            i(a.Aerial, true);
            i(a.Hybrid, true);
            if (!e.Oblique3DFunctionality.DependsOnObliqueAvailability) i(a.Oblique, true);
            else {
                if (b[a.ObliqueNotification] != null && b[a.ObliqueNotification].enabled && !g(b[a.Oblique]).hasClass("MSVE_selected")) w();
                o()
            }
            if (typeof b[a.Ortho] != "undefined" && b[a.Ortho] != null) b[a.Ortho].title = L_NavAction3DOrthoToolTip_Text;
            if (typeof b[a.Oblique] != "undefined" && b[a.Oblique] != null) {
                b[a.Oblique].title = e.Oblique3DFunctionality.Title;
                if (b[a.Oblique].enabled && !g(b[a.Oblique]).hasClass("MSVE_selected")) w()
            }
            if (typeof b[a.StreetSide] != "undefined" && b[a.StreetSide] != null) b[a.StreetSide].title = L_NavAction3DStreetSideToolTip_Text;
            var f = c.GetDashboard().GetShimmedElements(),
                d;
            for (d = 0; d < f.length; d++) mvcViewFacade.UpdateShimIfSupported(f[d])
        }
        function T() {
            h = Msn.VE.DashboardStates.MapMode.Flatland;
            if (typeof b[a.Mode] != "undefined" && b[a.Mode] != null) g(b[a.Mode].classRecipients).swapClass("MSVE_View3DMapMode", "MSVE_FlatlandMapMode");
            if (typeof b[a.Ortho] != "undefined" && b[a.Ortho] != null) b[a.Ortho].title = L_NavActionOrthoToolTip_Text;
            if (typeof b[a.Oblique] != "undefined" && b[a.Oblique] != null) b[a.Oblique].title = L_NavActionObliqueToolTip_Text;
            g(b[a.Oblique]).removeClass("MSVE_selected");
            photoState = 0;
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Road)) i(a.Road, true);
            else i(a.Road, false);
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Aerial)) i(a.Aerial, true);
            else i(a.Aerial, false);
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Hybrid)) i(a.Hybrid, true);
            else i(a.Hybrid, false);
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye)) {
                c.GetObliqueAvailability("OnFlatlandModeUpdateUIObliqueReturned", O);
                return
            } else O(false)
        }
        function O(b) {
            if (b) {
                i(a.Oblique, true);
                if (e.obliqueZoom != null) e.obliqueZoom.UpdateFromMap()
            } else {
                i(a.Oblique, false);
                d = Msn.VE.DashboardStates.MapView.Ortho;
                o()
            }
            switch (d) {
            case Msn.VE.DashboardStates.MapView.Oblique:
                if (b && $MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye)) m(h + d);
                else t();
                break;
            case Msn.VE.DashboardStates.MapView.StreetSide:
                t();
                break;
            case Msn.VE.DashboardStates.MapView.Ortho:
                switch (f) {
                case Msn.VE.DashboardStates.MapStyle.Aerial:
                    if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Aerial)) m(h + d + f);
                    else A();
                    break;
                case Msn.VE.DashboardStates.MapStyle.Hybrid:
                    if ($MVEM.IsEnabled(MapControl.Features.MapStyle.Hybrid)) m(h + d + f);
                    else A();
                    break;
                default:
                    m(h + d + f)
                }
                break;
            default:
                t()
            }
        }
        function v() {
            if (e.orthoZoom) e.orthoZoom.UpdateFromMap();
            if (e.obliqueZoom) e.obliqueZoom.UpdateFromMap();
            var b = null,
                a = null;
            if (l) {
                var f = l.GetPlus();
                if (f) b = g([f]);
                var d = l.GetMinus();
                if (d) a = g([d])
            }
            if (c.IsMapViewOrtho() && c.GetZoomLevel() == S || c.IsMapViewOblique() && c.GetZoomLevel() == 2) {
                if (b) b.addClass("MSVE_ZoomBar_plus_disabled");
                if (l) l.UnhookPlusEvents()
            } else if (c.GetZoomLevel() == Q) {
                if (a) a.addClass("MSVE_ZoomBar_minus_disabled");
                if (l) l.UnhookMinusEvents()
            }
            if (c.IsMapViewOrtho() && c.GetZoomLevel() != S || c.IsMapViewOblique() && c.GetZoomLevel() != 2) if (b && b.hasClass("MSVE_ZoomBar_plus_disabled")) {
                b.removeClass("MSVE_ZoomBar_plus_disabled");
                if (l) l.HookupPlusEvents()
            }
            if (c.GetZoomLevel() != Q) if (a && a.hasClass("MSVE_ZoomBar_minus_disabled")) {
                a.removeClass("MSVE_ZoomBar_minus_disabled");
                if (l) l.HookupMinusEvents()
            }
        }
        function zb() {
            if (c.IsMapViewOblique()) d = Msn.VE.DashboardStates.MapView.Oblique;
            if (h == Msn.VE.DashboardStates.MapMode.Flatland || h == Msn.VE.DashboardStates.MapMode.View3D && e.Oblique3DFunctionality.DependsOnObliqueAvailability) {
                i(a.Oblique, true);
                if (b[a.ObliqueNotification] && !c.IsMapViewOblique() && !g(b[a.Oblique]).hasClass("MSVE_selected")) w()
            }
        }
        function K() {
            d = Msn.VE.DashboardStates.MapView.Ortho;
            o();
            if (h == Msn.VE.DashboardStates.MapMode.Flatland || h == Msn.VE.DashboardStates.MapMode.View3D && e.Oblique3DFunctionality.DependsOnObliqueAvailability) {
                i(a.Oblique, false);
                p()
            }
        }
        function eb() {
            if (c.IsObliqueAvailable()) e.obliqueCompass.UpdateFromMap(r, true);
            else K()
        }
        function pb() {
            if (c.IsObliqueAvailable()) {
                d = Msn.VE.DashboardStates.MapView.Ortho;
                o()
            } else K()
        }
        function wb() {
            if ($MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye)) {
                if (d != Msn.VE.DashboardStates.MapView.Oblique) {
                    d = Msn.VE.DashboardStates.MapView.Oblique;
                    i(a.Oblique, true);
                    x()
                }
            } else {
                d = Msn.VE.DashboardStates.MapView.Oblique;
                t()
            }
            if (b[a.ObliqueNotification]) p();
            if (typeof e.obliqueCompass != "undefined" && e.obliqueCompass != null) {
                e.obliqueCompass.UpdateFromMap(r);
                r = Msn.VE.BirdsEyeSearchSpinDirection.NoSpin
            }
        }
        function W(e) {
            if (!e) e = c.GetMapStyle();
            switch (e) {
            case Msn.VE.MapStyle.Shaded:
            case Msn.VE.MapStyle.Road:
                d = Msn.VE.DashboardStates.MapView.Ortho;
                o();
                f = Msn.VE.DashboardStates.MapStyle.Road;
                ub();
                if (b[a.ShowLabels]) {
                    i(a.ShowLabels, false);
                    g(b[a.ShowLabels]).addClass("MSVE_selected")
                }
                break;
            case Msn.VE.MapStyle.Aerial:
                d = Msn.VE.DashboardStates.MapView.Ortho;
                o();
                f = Msn.VE.DashboardStates.MapStyle.Aerial;
                H();
                k = false;
                if (b[a.ShowLabels]) {
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).removeClass("MSVE_selected")
                }
                break;
            case Msn.VE.MapStyle.Hybrid:
                d = Msn.VE.DashboardStates.MapView.Ortho;
                o();
                f = Msn.VE.DashboardStates.MapStyle.Hybrid;
                if (b[a.ShowLabels]) {
                    k = true;
                    H();
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).addClass("MSVE_selected")
                } else V();
                break;
            case Msn.VE.MapStyle.Oblique:
                d = Msn.VE.DashboardStates.MapView.Oblique;
                x();
                f = Msn.VE.DashboardStates.MapStyle.Aerial;
                if (b[a.ShowLabels]) {
                    H();
                    k = false;
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).removeClass("MSVE_selected")
                }
                i(a.Oblique, true);
                break;
            case Msn.VE.MapStyle.ObliqueHybrid:
                d = Msn.VE.DashboardStates.MapView.Oblique;
                x();
                f = Msn.VE.DashboardStates.MapStyle.Hybrid;
                if (b[a.ShowLabels]) {
                    V();
                    k = true;
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).addClass("MSVE_selected")
                }
                i(a.Oblique, true)
            }
            if (h == Msn.VE.DashboardStates.MapMode.View3D && g(b[a.Oblique]).hasClass("MSVE_selected")) if (f == Msn.VE.DashboardStates.MapStyle.Road) c.Show3DBirdseye(true, true);
            else c.Show3DBirdseye(true, k);
            if (b[a.ShowLabels]) if (k || f == Msn.VE.DashboardStates.MapStyle.Road) b[a.ShowLabels].title = L_NavActionHideLabels_Text;
            else b[a.ShowLabels].title = L_NavActionShowLabels_Text
        }
        function ub() {
            if (typeof b[a.Style] != "undefined" && b[a.Style] != null) {
                var c;
                for (c = 0; c < b[a.Style].classRecipients.length; c++) b[a.Style].classRecipients[c].className = "MSVE_RoadMapStyle"
            }
        }
        function H() {
            if (typeof b[a.Style] != "undefined" && b[a.Style] != null) {
                var c;
                for (c = 0; c < b[a.Style].classRecipients.length; c++) b[a.Style].classRecipients[c].className = "MSVE_AerialMapStyle"
            }
        }
        function V() {
            if (typeof b[a.Style] != "undefined" && b[a.Style] != null) {
                var c;
                for (c = 0; c < b[a.Style].classRecipients.length; c++) b[a.Style].classRecipients[c].className = "MSVE_HybridMapStyle"
            }
        }
        function o() {
            if (typeof b[a.View] != "undefined" && b[a.View] != null) {
                var c = g(b[a.View].classRecipients);
                c.removeClass("MSVE_StreetSideView");
                c.removeClass("MSVE_ObliqueView");
                c.addClass("MSVE_OrthoView")
            }
            if (b[a.Traffic] != null) {
                i(a.Traffic, true);
                z()
            }
            r = Msn.VE.BirdsEyeSearchSpinDirection.NoSpin
        }
        function x() {
            if (typeof b[a.View] != "undefined" && b[a.View] != null) {
                var c = g(b[a.View].classRecipients);
                c.removeClass("MSVE_StreetSideView");
                c.removeClass("MSVE_OrthoView");
                c.addClass("MSVE_ObliqueView")
            }
            if (I) {
                if (e.obliqueCompass == null) {
                    e.obliqueCompass = new xb(b[a.ObliqueCompass]);
                    if (b[a.ObliqueCompass].radius) e.obliqueCompass.SetRadius(b[a.ObliqueCompass].radius);
                    e.obliqueCompass.onclick = function () {
                        r = Msn.VE.BirdsEyeSearchSpinDirection.NoSpin
                    }
                }
                e.obliqueCompass.UpdateFromMap()
            }
            if (ab) {
                if (e.obliqueZoom == null) {
                    e.obliqueZoom = new yb(b[a.ObliqueZoom]);
                    e.obliqueZoom.Init()
                }
                e.obliqueZoom.UpdateFromMap()
            }
            if (b[a.Traffic] != null && h == Msn.VE.DashboardStates.MapMode.Flatland) i(a.Traffic, false)
        }
        function jb() {
            if (typeof b[a.View] != "undefined" && b[a.View] != null) {
                var c = g(b[a.View].classRecipients);
                c.removeClass("MSVE_OrthoView");
                c.removeClass("MSVE_ObliqueView");
                c.addClass("MSVE_StreetSideView")
            }
        }
        function w() {
            if (!b[a.ObliqueNotification]) return;
            if (R) return;
            R = true;
            if (!e.displaying3DNotification) if (d != Msn.VE.DashboardStates.MapView.Oblique) {
                if (!y) {
                    var o = g(b[a.ObliqueNotification]),
                        k = o.select("img");
                    for (var i = 0; i < k.length && !y; i++) {
                        var j = k.element(i);
                        if (j.id == "MSVE_obliqueNotifyImg") y = j
                    }
                }
                if (y) y.src = c.GetObliqueMode().GetMiddleTileFilename();
                var f = b[a.Oblique];
                b[a.ObliqueNotification].style.display = "block";
                var m = f.offsetLeft + f.offsetWidth / 2 - b[a.ObliqueNotification].offsetWidth / 2,
                    n = f.offsetTop + f.offsetHeight + 4;
                g(b[a.ObliqueNotification]).setStyle("top", n + "px").setStyle("left", m + "px");
                var l = C(),
                    h;
                for (h = 0; h < l.length; ++h) mvcViewFacade.UpdateShimIfSupported(l[h]);
                m = n = f = null;
                window.setTimeout(p, 6000)
            }
        }
        function bb() {
            if (!b[a.ThreeDUpdatedNotification]) return;
            p();
            if (!e.displaying3DNotification) {
                e.displaying3DNotification = true;
                var c = b[a.Mode3D];
                b[a.ThreeDUpdatedNotification].style.display = "block";
                var d = c.offsetLeft - 6,
                    f = c.offsetTop + c.offsetHeight + 4;
                g(b[a.ThreeDUpdatedNotification]).setStyle("top", f + "px").setStyle("left", d + "px");
                mvcViewFacade.UpdateShimIfSupported(b[a.ThreeDUpdatedNotification]);
                c = null;
                window.setTimeout(D, 6000)
            }
        }
        function p() {
            b[a.ObliqueNotification].style.display = "none";
            var d = C(),
                c;
            for (c = 0; c < d.length; ++c) mvcViewFacade.UpdateShimIfSupported(d[c])
        }
        function D() {
            e.displaying3DNotification = false;
            b[a.ThreeDUpdatedNotification].style.display = "none";
            mvcViewFacade.UpdateShimIfSupported(b[a.ThreeDUpdatedNotification])
        }
        function i(c, d) {
            if (b[c] == null) return;
            if (b[c].enabled == d) return;
            b[c].enabled = d;
            var a = j[c];
            if (a.InitialClass) if (d) g(b[c]).swapClass(a.InitialClass + "_disabled", a.InitialClass);
            else g(b[c]).swapClass(a.InitialClass, a.InitialClass + "_disabled");
            if (a.Title) b[c].title = a.Title;
            if (a.OnClickFunction) if (d) b[c].attachEvent("onclick", a.OnClickFunction);
            else b[c].detachEvent("onclick", a.OnClickFunction)
        }
        function m(d) {
            if (d & Msn.VE.DashboardStates.MapView.Ortho || d & Msn.VE.DashboardStates.MapMode.View3D) if (d & Msn.VE.DashboardStates.MapStyle.Road) c.SetMapStyle("r");
            else if (d & Msn.VE.DashboardStates.MapStyle.Aerial) c.SetMapStyle("a");
            else if (d & Msn.VE.DashboardStates.MapStyle.Hybrid) c.SetMapStyle("h");
            if (d & Msn.VE.DashboardStates.MapMode.Flatland && d & Msn.VE.DashboardStates.MapView.Oblique) if (d & Msn.VE.DashboardStates.MapStyle.Aerial && c.GetMapStyle() != Msn.VE.MapStyle.Oblique) {
                k = false;
                if (b[a.ShowLabels]) {
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).removeClass("MSVE_selected")
                }
                c.SetMapStyle(Msn.VE.MapStyle.Oblique)
            } else if (d & Msn.VE.DashboardStates.MapStyle.Hybrid && c.GetMapStyle() != Msn.VE.MapStyle.ObliqueHybrid) {
                k = true;
                if (b[a.ShowLabels]) {
                    i(a.ShowLabels, true);
                    g(b[a.ShowLabels]).addClass("MSVE_selected")
                }
                c.SetMapStyle(Msn.VE.MapStyle.ObliqueHybrid)
            }
        }
        function Gb(a) {
            if (a & Msn.VE.DashboardStates.MapMode.View3D) if (a & Msn.VE.DashboardStates.MapView.Ortho) c.SetTilt(-90);
            else if (a & Msn.VE.DashboardStates.MapView.Oblique) c.SetTilt(-45);
            else if (a & Msn.VE.DashboardStates.MapView.StreetSide) c.SetTilt(-25)
        }
        function C() {
            return [b[a.ObliqueNotification]]
        }
        function Fb(a) {
            return b[a]
        }
        function Cb() {
            return b
        }
        function Db() {
            return l
        }
        function gb() {
            return r
        }
        function ib(a) {
            r = a
        }
        this.SetMapViewState = function (a) {
            d = a
        };
        this.GetMapViewState = function () {
            return d
        };
        this.SetMapModeState = function (a) {
            h = a
        };
        this.GetMapModeState = function () {
            return h
        };
        this.SetLabelsState = function (a) {
            k = a
        };
        this.GetLabelsState = function () {
            return k
        };
        this.GetLastRotationDirection = gb;
        this.SetLastRotationDirection = ib;
        this.GetObliqueNotifierShimmedElements = C;
        this.Init = Ib;
        this.Create = M;
        this.Destroy = Hb;
        this.DestroyControl = J;
        this.GetControl = Fb;
        this.GetControls = Cb;
        this.GetTinyZoom = Db;
        this.OnOrthoMapViewClick = t;
        this.OnObliqueMapViewClick = F;
        this.UpdateZoom = v;
        this.SelectObliqueMapView = x;
        this.SelectOrthoMapView = o;
        this.DisplayObliqueNotification = w;
        this.HideObliqueNotification = p;
        this.DisplayThreeDUpdatedNotification = bb;
        this.HideThreeDUpdatedNotification = D
    };

    function ab(o, c, d, b) {
        var a = document.createElement("div"),
            i = 0,
            j = 0,
            h = false,
            f = 15;
        this.Init = function () {
            a.id = "Compass";
            a.attachEvent("onmousedown", k);
            a.attachEvent("onmouseup", m);
            a.attachEvent("onmousemove", l);
            a.attachEvent("ondblclick", IgnoreEvent);
            a.title = L_NavActionCompassPan_Text;
            o.appendChild(a);
            if (isNaN(parseInt(c))) c = a.offsetWidth / 2;
            if (isNaN(parseInt(d))) d = a.offsetHeight / 2;
            if (isNaN(parseInt(b))) b = Math.min(c, d)
        };
        this.Destroy = function () {
            a.detachEvent("onmousedown", k);
            a.detachEvent("onmouseup", m);
            a.detachEvent("onmousemove", l);
            a.detachEvent("ondblclick", IgnoreEvent);
            a = null
        };

        function k(m) {
            m = GetEvent(m);
            CancelEvent(m);
            var n = g(a).getPagePosition();
            i = n.x;
            j = n.y;
            if (a.setCapture) a.setCapture();
            var k = Gimme.Screen.getMousePosition(m).x - i - c,
                l = Gimme.Screen.getMousePosition(m).y - j - d,
                o = Math.sqrt(k * k + l * l);
            if (o < b) {
                k = Math.floor(k / b * f);
                l = Math.floor(l / b * f);
                e.ContinuousPan(k, l, 0, true);
                h = true
            }
            return false
        }
        function l(k) {
            k = GetEvent(k);
            CancelEvent(k);
            if (h) {
                var a = Gimme.Screen.getMousePosition(k).x - i - c,
                    g = Gimme.Screen.getMousePosition(k).y - j - d,
                    l = Math.sqrt(a * a + g * g);
                if (l < b) {
                    a = Math.floor(a / b * f);
                    g = Math.floor(g / b * f);
                    e.ContinuousPan(a, g, 0, true)
                }
            }
            return false
        }
        function m(b) {
            b = GetEvent(b);
            CancelEvent(b);
            if (a.releaseCapture) a.releaseCapture();
            e.StopContinuousPan();
            h = false;
            return false
        }
        function p() {
            a.style.display = "none"
        }
        function q() {
            a.style.display = "block"
        }
        function n() {
            return a
        }
        this.Hide = p;
        this.Show = q;
        this.GetElement = n
    }
    var a = G,
        b = null,
        f = null,
        A = null,
        c = null,
        t = null,
        w = null,
        x = null,
        d = null,
        m = null,
        q = null,
        r = null,
        h = null,
        i = null,
        kb = null,
        j = null,
        o = null,
        p = null,
        n = null,
        k = null,
        l = null,
        v = null,
        u = null,
        T = ["North", "East", "South", "West"],
        Q = {
        "North": 0,
        "East": 1,
        "South": 2,
        "West": 3
    },
        z, y, s, J = 150,
        F = .7,
        W = .9,
        L = 1;

    function eb() {
        A = [a.Mode, a.View, a.Style, a.ShowLabels, a.TinyZoom, a.ObliqueNotification, a.ObliqueCompass, a.ThreeDUpdatedNotification];
        if ($MVEM.IsEnabled(MapControl.Features.Traffic.ShowOnNavbar)) if (typeof VE_TrafficManager != "undefined") A.push(a.Traffic);
        f = new Msn.VE.CommonControls(e, A);
        b = f.GetControls();
        b[a.Oblique].innerText = L_DashboardBirdsEye_Text;
        c = document.createElement("div");
        c.id = "MSVE_navAction_container";
        c.className = "MSVE_Dashboard_V6";
        if (Msn.VE.API) g(c).addClass("MSVE_API");
        i = document.createElement("div");
        i.id = "MSVE_navAction_styleGroup";
        d = document.createElement("div");
        d.id = "MSVE_navAction_topBar";
        b[a.View].classRecipients = [i, c, d];
        b[a.Style].classRecipients = [i];
        b[a.Mode].classRecipients = [d];
        f.Oblique3DFunctionality = f.ObliqueFunctions.ObliqueImageryIn3D;
        K.appendChild(c);
        t = document.createElement("div");
        t.id = "MSVE_navAction_topBackground";
        t.className = "MSVE_navAction_background";
        w = document.createElement("div");
        w.id = "MSVE_navAction_compassBackground";
        w.className = "MSVE_navAction_background";
        x = document.createElement("div");
        x.id = "MSVE_navAction_leftBackground";
        x.className = "MSVE_navAction_background";
        d.className = "MSVE_Dashboard MSVE_Dashboard_V6 MSVE_FlatlandMapMode";
        m = document.createElement("div");
        m.id = "MSVE_navAction_leftBar";
        m.className = "MSVE_Dashboard MSVE_Dashboard_V6";
        q = document.createElement("div");
        q.id = "MSVE_navAction_compassContainer";
        q.className = "MSVE_Dashboard MSVE_Dashboard_V6";
        j = document.createElement("div");
        j.id = "MSVE_navAction_toggleGlyphWrapper";
        j.title = L_NavActionHideToolTip_Text;
        pseudoHover(j);
        c.appendChild(x);
        c.appendChild(w);
        c.appendChild(t);
        c.appendChild(q);
        c.appendChild(m);
        c.appendChild(d);
        c.appendChild(j);
        if (!e.IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) O();
        var C = g(c),
            B = C.select("> div");
        B.addEvent("mousedown", IgnoreEvent);
        B.addEvent("mouseup", IgnoreEvent);
        B.addEvent("mousemove", DashboardContainerMouseMoveEvent);
        B.addEvent("mousewheel", IgnoreEvent);
        B.addEvent("dblclick", IgnoreEvent);
        B.addEvent("contextmenu", IgnoreEvent);
        B.addEvent("keydown", IgnoreEvent);
        B.addEvent("keyup", IgnoreEvent);
        B.addEvent("click", IgnoreEvent);
        h = [];
        for (s = 0; s < 5; s++) {
            h[s] = document.createElement("div");
            h[s].className = "MSVE_navAction_separator";
            h[s].id = "MSVE_navAction_separator" + s
        }
        y = document.createElement("div");
        y.id = "MSVE_navAction_toggleGlyphInner";
        y.className = "MSVE_navAction_toggleGlyph";
        j.appendChild(y);
        b[a.Road].title = L_NavActionRoadToolTip_Text;
        b[a.Aerial].title = L_NavActionAerialToolTip_Text;
        b[a.Hybrid].title = L_NavActionHybridToolTip_Text;
        b[a.Mode2D].title = L_NavActionFlatlandToolTip_Text;
        b[a.Mode3D].title = L_NavActionView3DToolTip_Text;
        i.appendChild(b[a.Road]);
        i.appendChild(b[a.Aerial]);
        i.appendChild(h[1]);
        i.appendChild(b[a.Oblique]);
        if (D) {
            d.appendChild(b[a.Mode]);
            d.appendChild(h[0])
        }
        d.appendChild(i);
        d.appendChild(h[2]);
        f.SetLabelsState(V != false);
        d.appendChild(b[a.ShowLabels]);
        d.appendChild(h[3]);
        if (b[a.Traffic] != null) {
            b[a.Traffic].title = L_NavActionShowTrafficToolTip_Text;
            d.appendChild(b[a.Traffic]);
            d.appendChild(h[4])
        } else C.addClass("notraffic");
        if (!Z) {
            var F = parseInt(C.getStyle("width")) - parseInt(g(b[a.Oblique]).getStyle("width"));
            c.style.width = F + "px";
            b[a.Oblique].style.display = "none"
        }
        r = document.createElement("div");
        r.id = "MSVE_navAction_compassWrapper";
        q.appendChild(r);
        z = new ab(r);
        z.Init();
        pseudoHover(z.GetElement());
        b[a.ObliqueCompass].radius = 31;
        r.appendChild(b[a.ObliqueCompass]);
        var E = f.GetTinyZoom();
        m.appendChild(b[a.TinyZoom]);
        p = document.createElement("div");
        p.id = "MSVE_navAction_zoomPlusWrapper";
        pseudoHover(p);
        p.appendChild(E.GetPlus());
        b[a.TinyZoom].appendChild(p);
        o = document.createElement("div");
        o.id = "MSVE_navAction_zoomMinusWrapper";
        pseudoHover(o);
        o.appendChild(E.GetMinus());
        b[a.TinyZoom].appendChild(o);
        E.HookupPlusMinusEvents(p, o);
        n = document.createElement("div");
        n.id = "MSVE_navAction_rotatorContainer";
        u = document.createElement("div");
        u.id = "MSVE_navAction_ccw";
        u.title = L_NavActionObliqueRotationToolTip_CCW_Text;
        u.className = "MSVE_navAction_rotator";
        v = document.createElement("div");
        v.id = "MSVE_navAction_cw";
        v.title = L_NavActionObliqueRotationToolTip_CW_Text;
        v.className = "MSVE_navAction_rotator";
        k = document.createElement("div");
        k.id = "MSVE_navAction_ccwWrapper";
        pseudoHover(k);
        k.appendChild(u);
        l = document.createElement("div");
        l.id = "MSVE_navAction_cwWrapper";
        pseudoHover(l);
        l.appendChild(v);
        g(k).addEvent("click", N);
        g(l).addEvent("click", P);
        n.appendChild(k);
        n.appendChild(l);
        m.appendChild(n);
        d.appendChild(b[a.ObliqueNotification]);
        d.appendChild(b[a.ThreeDUpdatedNotification]);
        f.Init();
        e.AttachEvent("oninitmode", X);
        if (Msn.VE.Animation) I();
        f.UpdateZoom()
    }
    function bb() {
        d.removeChild(b[a.ObliqueNotification]);
        d.removeChild(b[a.ThreeDUpdatedNotification]);
        g(k).removeEvent("click", N);
        g(l).removeEvent("click", P);
        k.removeChild(u);
        l.removeChild(v);
        n.removeChild(k);
        n.removeChild(l);
        m.removeChild(n);
        var s = f.GetTinyZoom();
        if (s) {
            var A = s.GetMinus();
            if (A) o.removeChild(A);
            var F = s.GetPlus();
            if (F) p.removeChild(F);
            b[a.TinyZoom].removeChild(o);
            b[a.TinyZoom].removeChild(p);
            m.removeChild(b[a.TinyZoom])
        }
        z.Destroy();
        q.removeChild(r);
        r.removeChild(b[a.ObliqueCompass]);
        if (b[a.Traffic] != null) {
            d.removeChild(b[a.Traffic]);
            d.removeChild(h[4])
        }
        d.removeChild(b[a.ShowLabels]);
        d.removeChild(h[3]);
        i.removeChild(b[a.Road]);
        i.removeChild(b[a.Aerial]);
        i.removeChild(h[1]);
        i.removeChild(b[a.Oblique]);
        if (D) {
            d.removeChild(b[a.Mode]);
            d.removeChild(h[0])
        }
        d.removeChild(i);
        d.removeChild(h[2]);
        j.removeChild(y);
        var G = g(c),
            e = G.select("> div");
        e.removeEvent("mouseleave", B);
        e.removeEvent("mouseenter", C);
        e.removeEvent("mousedown", IgnoreEvent);
        e.removeEvent("mouseup", IgnoreEvent);
        e.removeEvent("mousemove", DashboardContainerMouseMoveEvent);
        e.removeEvent("mousewheel", IgnoreEvent);
        e.removeEvent("dblclick", IgnoreEvent);
        e.removeEvent("contextmenu", IgnoreEvent);
        e.removeEvent("keydown", IgnoreEvent);
        e.removeEvent("keyup", IgnoreEvent);
        e.removeEvent("click", IgnoreEvent);
        c.removeChild(x);
        c.removeChild(w);
        c.removeChild(t);
        c.removeChild(q);
        c.removeChild(m);
        c.removeChild(d);
        c.removeChild(j);
        K.removeChild(c);
        f.Destroy();
        if (Msn.VE.Animation) E().onclick = null
    }
    function B() {
        Gimme.Animation.end("MSVE_NAVACTION_FADEIN");
        g(c).select("div.MSVE_navAction_background").fadeTo(null, F, J, "MSVE_NAVACTION_FADEOUT")
    }
    function C() {
        Gimme.Animation.end("MSVE_NAVACTION_FADEOUT");
        g(c).select("div.MSVE_navAction_background").fadeTo(null, W, J, "MSVE_NAVACTION_FADEIN")
    }
    function X(a) {
        if (a == Msn.VE.MapActionMode.Mode3D) {
            Y();
            if (e.Get3DControl()) if (g(M()).hasClass("collapsed")) e.Get3DControl().ShowNavigationControl = false;
            else e.Get3DControl().ShowNavigationControl = true
        } else O()
    }
    function O() {
        var a = g(c),
            b = a.select("> div");
        a.select("div.MSVE_navAction_background").setStyle("opacity", F);
        b.addEvent("mouseleave", B);
        b.addEvent("mouseenter", C)
    }
    function Y() {
        var a = g(c),
            b = a.select("> div");
        b.removeEvent("mouseleave", B);
        b.removeEvent("mouseenter", C);
        a.select("div.MSVE_navAction_background").setStyle("opacity", L)
    }
    function N() {
        H(Msn.VE.BirdsEyeSearchSpinDirection.CounterclockwiseSpin)
    }
    function P() {
        H(Msn.VE.BirdsEyeSearchSpinDirection.ClockwiseSpin)
    }
    function H(a) {
        f.SetLastRotationDirection(a);
        var b = e.GetObliqueScene();
        if (b) {
            var d = Q[b.GetOrientation()],
                c = T[(d + a + 4) % 4];
            e.SetObliqueOrientation(c, a, true);
            f.obliqueCompass.UpdateFromMap()
        }
    }
    function M() {
        return c
    }
    function S() {
        return f.GetObliqueNotifierShimmedElements().concat([t])
    }
    function E() {
        return j
    }
    function cb() {
        return f.GetMapModeState()
    }
    function fb() {
        if (c) c.style.display = "block"
    }
    function db() {
        if (c) c.style.display = "none"
    }
    function I() {
        if (!e.GetDashboard().GetToggleGlyph()) return;
        e.GetDashboard().GetToggleGlyph().onclick = function () {
            var a = e.GetDashboard();
            if (g(a.GetElement()).hasClass("collapsed")) {
                g(a.GetElement()).removeClass("collapsed");
                a.GetToggleGlyph().title = L_NavActionHideToolTip_Text;
                if (e.Get3DControl()) e.Get3DControl().ShowNavigationControl = true
            } else {
                g(a.GetElement()).addClass("collapsed");
                a.GetToggleGlyph().title = L_NavActionShowToolTip_Text;
                if (e.Get3DControl()) e.Get3DControl().ShowNavigationControl = false
            }
            var c = e.GetDashboard().GetShimmedElements(),
                b;
            for (b = 0; b < c.length; b++) mvcViewFacade.UpdateShimIfSupported(c[b]);
            g("#MSVE_navAction_topBackground").setStyle("opacity", L)
        }
    }
    function U() {
        f.ObliqueFunctions.ObliqueImageryIn3D.ObliqueClickFunction()
    }
    this.DisplayThreeDUpdatedNotification = function gb() {
        f.DisplayThreeDUpdatedNotification()
    };

    function R(a) {
        f.SetLastRotationDirection(a)
    }
    this.Init = eb;
    this.Destroy = bb;
    this.GetElement = M;
    this.GetToggleGlyph = E;
    this.GetShimmedElements = S;
    this.createRoller = I;
    this.GetMode = cb;
    this.Show = fb;
    this.Hide = db;
    this.Oblique3DToggle = U;
    this.SetLastRotationDirection = R
};
Msn.VE.LatLong = function (b, a) {
    this.latitude = b;
    this.longitude = a
};
Msn.VE.LatLong.prototype.ToString = function () {
    return "(" + this.latitude + ", " + this.longitude + ")"
};
Msn.VE.LatLong.prototype.Copy = function (a) {
    if (!a) return;
    this.latitude = a.latitude;
    this.longitude = a.longitude
};
Msn.VE.LatLong.prototype.Equals = function (a) {
    if (a instanceof Msn.VE.LatLong) return this.latitude == a.latitude && this.longitude == a.longitude;
    else return false
};
Msn.VE.LatLongRectangle = function (a, b) {
    this.northwest = a;
    this.southeast = b;
    this.ToString = function () {
        return "(" + (this.northwest ? this.northwest.ToString() : "null") + ", " + (this.southeast ? this.southeast.ToString() : "null") + ")"
    };
    this.Copy = function (a) {
        if (!a) return;
        if (!this.northwest) this.northwest = new Msn.VE.LatLong;
        if (!this.southeast) this.southeast = new Msn.VE.LatLong;
        this.northwest.Copy(a.northwest);
        this.southeast.Copy(a.southeast)
    };
    this.Center = function () {
        var b = Math.sin(this.northwest.latitude * Math.PI / 180),
            c = Math.sin(this.southeast.latitude * Math.PI / 180),
            d = .25 * (Math.log((1 + b) / (1 - b)) + Math.log((1 + c) / (1 - c))),
            a = new Msn.VE.LatLong;
        a.latitude = Math.atan(Math.exp(d)) * 360 / Math.PI - 90;
        a.longitude = .5 * (parseFloat(this.northwest.longitude) + parseFloat(this.southeast.longitude));
        return a
    };
    this.Contains = function (c) {
        return c.latitude <= a.latitude && c.longitude >= a.longitude && c.latitude >= b.latitude && c.longitude <= b.longitude
    };
    this.ContainsRectangle = function (a) {
        return a.southeast.latitude >= this.southeast.latitude && a.southeast.longitude <= this.southeast.longitude && a.northwest.latitude <= this.northwest.latitude && a.northwest.longitude >= this.northwest.longitude
    }
};
Msn.VE.MapStyle = new
function () {
    this.Road = "r";
    this.Shaded = "s";
    this.Aerial = "a";
    this.Hybrid = "h";
    this.Oblique = "o";
    this.ObliqueHybrid = "b"
};
Msn.VE.MapStyle.IsViewOblique = function (a) {
    return a == Msn.VE.MapStyle.ObliqueHybrid || a == Msn.VE.MapStyle.Oblique
};
Msn.VE.MapStyle.IsViewOrtho = function (a) {
    return a == Msn.VE.MapStyle.Road || a == Msn.VE.MapStyle.Shaded || a == Msn.VE.MapStyle.Hybrid || a == Msn.VE.MapStyle.Aerial
};
Msn.VE.MapViewType = function () {};
Msn.VE.MapViewType.Pixel = "pixel";
Msn.VE.MapViewType.PixelRect = "pixelRect";
Msn.VE.MapViewType.LatLong = "latlong";
Msn.VE.MapViewType.LatLongAccurate = "latlongaccurate";
Msn.VE.MapViewType.LatLongRect = "latlongRect";
Msn.VE.MapView = function (map) {
    this.zoomLevel = 0;
    this.mapStyle = null;
    this.doRoadShading = false;
    this.tilt = -90;
    this.direction = 0;
    this.altitude = -1000;
    this.center = new VEPixel;
    this.latlong = new Msn.VE.LatLong;
    this.cameraLatlong = null;
    this.pixelRect = new Msn.VE.PixelRectangle;
    this.latlongRect = new Msn.VE.LatLongRectangle;
    this.sceneId = null;
    this.sceneOrientation = null;
    this.bySceneId = false;
    this.callback = null;
    this.photoX = null;
    this.photoY = null;
    this.photoScale = null;
    this._supressFlyToCall = false;
    this._needsPivotOperation = true;
    var mapInstance = map,
        p_this = this,
        viewType = Msn.VE.MapViewType.Pixel;
    this.Destroy = function () {
        this.center = this.latlong = p_this = mapInstance = null
    };
    this.GetViewType = function () {
        return viewType
    };
    this.GetMap = function () {
        return mapInstance
    };
    this.SetMap = function (a) {
        mapInstance = a
    };

    function MakeCopy() {
        var a = new Msn.VE.MapView;
        a.Copy(p_this);
        return a
    }
    function Copy(a) {
        p_this.zoomLevel = a.zoomLevel;
        p_this.mapStyle = a.mapStyle;
        p_this.doRoadShading = a.doRoadShading;
        p_this.tilt = a.tilt;
        p_this.direction = a.direction;
        p_this.altitude = a.altitude;
        p_this.center.Copy(a.center);
        if (a.cameraLatlong != null) {
            p_this.cameraLatlong = new Msn.VE.LatLong;
            p_this.cameraLatlong.Copy(a.cameraLatlong)
        }
        p_this.latlong.Copy(a.latlong);
        p_this.pixelRect.Copy(a.pixelRect);
        p_this.latlongRect.Copy(a.latlongRect);
        p_this.sceneId = a.sceneId;
        p_this.sceneOrientation = a.sceneOrientation;
        p_this.photoX = a.photoX;
        p_this.photoY = a.photoY;
        p_this.photoScale = a.photoScale;
        p_this.SetMap(a.GetMap());
        viewType = a.GetViewType()
    }
    function Equals(a) {
        return a != null && p_this.zoomLevel == a.zoomLevel && p_this.mapStyle == a.mapStyle && MathAbs(p_this.tilt - a.tilt) < 1e-6 && MathAbs(p_this.direction - a.direction) < 1e-6 && MathAbs(p_this.altitude - a.altitude) < 1e-6 && MathAbs(p_this.center.x - a.center.x) < 1e-6 && MathAbs(p_this.center.y - a.center.y) < 1e-6 && p_this.sceneId == a.sceneId && p_this.GetMap() == a.GetMap() && p_this.sceneOrientation == a.sceneOrientation
    }
    function ToString() {
        return "(" + p_this.latlong.ToString() + ", " + p_this.zoomLevel + ", " + p_this.mapStyle + ")"
    }
    function SetCenter(a) {
        if (!a) return;
        p_this.center = a;
        viewType = Msn.VE.MapViewType.Pixel
    }
    function SetCenterLatLong(a) {
        if (!a) return;
        p_this.latlong = a;
        p_this.cameraLatlong = null;
        viewType = Msn.VE.MapViewType.LatLong
    }
    function SetCenterLatLongAccurate(a) {
        if (a) {
            p_this.latlong = a;
            p_this.cameraLatlong = null;
            if (Msn.VE.MapStyle.IsViewOblique(p_this.mapStyle)) viewType = Msn.VE.MapViewType.LatLongAccurate;
            else viewType = Msn.VE.MapViewType.LatLong
        }
    }
    function SetPixelRectangle(a) {
        p_this.pixelRect = a;
        p_this.cameraLatlong = null;
        p_this.tilt = -90;
        p_this.direction = 0;
        viewType = Msn.VE.MapViewType.PixelRect
    }
    function SetLatLongRectangle(a) {
        p_this.latlongRect = a;
        p_this.cameraLatlong = null;
        p_this.tilt = -90;
        p_this.direction = 0;
        viewType = Msn.VE.MapViewType.LatLongRect
    }
    function SetZoomLevel(a) {
        if (a <= 0) a = 1;
        var c = mapInstance.GetCenterOffset().x,
            d = mapInstance.GetCenterOffset().y;
        switch (viewType) {
        case Msn.VE.MapViewType.Pixel:
            var b = Math.pow(2, a - p_this.zoomLevel);
            p_this.center.x = (p_this.center.x + c) * b - c;
            p_this.center.y = (p_this.center.y + d) * b - d;
            break;
        case Msn.VE.MapViewType.PixelRect:
            var b = Math.pow(2, a - p_this.zoomLevel);
            p_this.pixelRect.topLeft.x = p_this.pixelRect.topLeft.x * b;
            p_this.pixelRect.topLeft.y = p_this.pixelRect.topLeft.y * b;
            p_this.pixelRect.bottomRight.x = p_this.pixelRect.bottomRight.x * b;
            p_this.pixelRect.bottomRight.y = p_this.pixelRect.bottomRight.y * b
        }
        if (p_this.zoomLevel != a) {
            p_this.altitude = -1000;
            if (p_this.zoomLevel != 0) p_this.cameraLatlong = null
        }
        p_this.zoomLevel = a
    }
    function SetMapStyle(a, c, b, e, d) {
        var f = p_this.mapStyle;
        p_this.mapStyle = a;
        if (viewType == Msn.VE.MapViewType.Pixel) viewType = Msn.VE.MapViewType.LatLong;
        if (!Msn.VE.MapStyle.IsViewOblique(a)) {
            p_this.sceneId = null;
            p_this.sceneOrientation = null;
            p_this.bySceneId = false
        } else {
            p_this.sceneId = c;
            if (b) p_this.sceneOrientation = b;
            p_this.spinDirection = f == a ? e : null;
            p_this.preserveScene = d;
            if (c) p_this.bySceneId = true;
            else p_this.bySceneId = false
        }
    }
    function SetTilt(a) {
        if (a >= 269.99999) a = a - 360;
        if (a < -90) a = -90;
        if (a > 90) a = 90;
        p_this.tilt = a;
        p_this._needsPivotOperation = true
    }
    function SetDirection(a) {
        if (a < 0 || a >= 360) {
            a = a % 360;
            if (a < 0) a = 360 + a
        }
        p_this.direction = a;
        p_this._needsPivotOperation = true
    }
    function SetAltitude(a) {
        if (a < -1000 || a > 15000000) a = -1000;
        p_this.altitude = a
    }
    function GetTilt() {
        return p_this.tilt
    }
    function GetDirection() {
        return p_this.direction
    }
    function GetAltitude() {
        return p_this.altitude
    }
    function ScaleCoord(a, b) {
        if (b) a = a * Math.pow(2, b - p_this.zoomLevel);
        return a
    }
    function GetX(a) {
        return ScaleCoord(p_this.center.x, a)
    }
    function GetY(a) {
        return ScaleCoord(p_this.center.y, a)
    }
    function GetCenter(a) {
        var b = ScaleCoord(p_this.center.x + mapInstance.GetCenterOffset().x, a),
            c = ScaleCoord(p_this.center.y + mapInstance.GetCenterOffset().y, a);
        return new VEPixel(b, c)
    }
    function GetZoomLevel() {
        return p_this.zoomLevel
    }
    function GetLatLongRectangle() {
        return p_this.latlongRect
    }
    function GetPixelRectangle() {
        return p_this.pixelRect
    }
    function GetCenterLatLong() {
        var b = p_this.center.x + mapInstance.GetCenterOffset().x,
            c = p_this.center.y + mapInstance.GetCenterOffset().y,
            a = mapInstance.GetCurrentMode().PixelToLatLong(new VEPixel(b, c), p_this.zoomLevel);
        return a == null ? p_this.latlong : a
    }
    function Resolve(b, d, c, a) {
        if (viewType == Msn.VE.MapViewType.LatLongAccurate) ResolveAsync(b, d, c, a);
        else ResolveSync(b, d, c, a)
    }
    function ResolveAsync(b, e, d, a) {
        function c(c) {
            if (c != null && typeof c != "undefined" && c.length == 1) p_this.center = c[0];
            if (p_this.cameraLatlong == null) if (!p_this._UpdateCamera(b)) {
                p_this.tilt = -90;
                p_this.cameraLatlong = p_this.latlong
            }
            viewType = Msn.VE.MapViewType.Pixel;
            if (a != null && typeof a == "function") a()
        }
        b.LatLongToPixelAsync([p_this.latlong], p_this.zoomLevel, c)
    }
    function ResolveSync(a, e, c, b) {
        switch (viewType) {
        case Msn.VE.MapViewType.Pixel:
            p_this.latlong = a.PixelToLatLong(p_this.center, p_this.zoomLevel);
            break;
        case Msn.VE.MapViewType.LatLong:
            p_this.center = a.LatLongToPixel(p_this.latlong, p_this.zoomLevel);
            if (p_this.center != null) {
                p_this.center.x -= mapInstance.GetCenterOffset().x;
                p_this.center.y -= mapInstance.GetCenterOffset().y
            }
            break;
        case Msn.VE.MapViewType.PixelRect:
            ResolveRectangle(a, e, c);
            break;
        case Msn.VE.MapViewType.LatLongRect:
            if (Msn.VE.MapStyle.IsViewOblique(p_this.mapStyle)) {
                p_this.zoomLevel = 1;
                var d = a.GetScene();
                if (!d || !d.ContainsLatLong(p_this.latlongRect.northwest) || !d.ContainsLatLong(p_this.latlongRect.southeast)) {
                    p_this.latlong = p_this.latlongRect.Center();
                    p_this.center = a.LatLongToPixel(p_this.latlong, p_this.zoomLevel)
                } else {
                    p_this.pixelRect.topLeft = a.LatLongToPixel(p_this.latlongRect.northwest, p_this.zoomLevel);
                    p_this.pixelRect.bottomRight = a.LatLongToPixel(p_this.latlongRect.southeast, p_this.zoomLevel);
                    ResolveRectangle(a, e, c)
                }
            } else {
                p_this.zoomLevel = 12;
                p_this.altitude = -1000;
                p_this.pixelRect.topLeft = a.LatLongToPixel(p_this.latlongRect.northwest, p_this.zoomLevel);
                p_this.pixelRect.bottomRight = a.LatLongToPixel(p_this.latlongRect.southeast, p_this.zoomLevel);
                ResolveRectangle(a, e, c)
            }
        }
        if (p_this.cameraLatlong == null) if (!p_this._UpdateCamera(a)) {
            p_this.tilt = -90;
            p_this.cameraLatlong = p_this.latlong
        }
        viewType = Msn.VE.MapViewType.Pixel;
        if (b != null && typeof b == "function") b()
    }
    function ResolveRectangle(i, k, j) {
        var c = 19,
            a = Math.pow(2, c - p_this.zoomLevel),
            g = MathMax(1, MathAbs(p_this.pixelRect.topLeft.x - p_this.pixelRect.bottomRight.x) * a),
            f = MathMax(1, MathAbs(p_this.pixelRect.topLeft.y - p_this.pixelRect.bottomRight.y) * a),
            d = Math.log(2),
            e = c - Math.ceil(Math.log(g / k) / d),
            h = c - Math.ceil(Math.log(f / j) / d),
            b = MathMin(e, h);
        if (b <= 0) b = 1;
        a = Math.pow(2, b - p_this.zoomLevel);
        p_this.center.x = .5 * (p_this.pixelRect.topLeft.x + p_this.pixelRect.bottomRight.x) * a - mapInstance.GetCenterOffset().x;
        p_this.center.y = .5 * (p_this.pixelRect.topLeft.y + p_this.pixelRect.bottomRight.y) * a - mapInstance.GetCenterOffset().y;
        p_this.zoomLevel = b;
        p_this.altitude = -1000;
        p_this.latlong = i.PixelToLatLong(p_this.center, p_this.zoomLevel)
    }
    function _UpdateCamera(viewMode) {
        if (p_this.latlong == null) if (p_this.center != null && p_this.zoomLevel != null && typeof viewMode._InternalOrthoMode == "function") {
            var orthoMode = viewMode._InternalOrthoMode();
            p_this.latlong = orthoMode.PixelToLatLong(p_this.center, p_this.zoomLevel);
            if (p_this.latlong != null) {
                p_this.tilt = -90;
                p_this.direction = 0
            }
        }
        if (p_this.latlong == null) return false;
        p_this._needsPivotOperation = false;
        if (mapInstance.IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) {
            var control = mapInstance.Get3DControl();
            if (control != null) {
                var cam = control.CameraPositionGivenTarget(p_this.latlong.latitude, p_this.latlong.longitude, p_this.altitude, p_this.zoomLevel, p_this.tilt, p_this.direction);
                if (cam != null) {
                    var lat, lon, alt;
                    eval(cam);
                    p_this.cameraLatlong = new Msn.VE.LatLong;
                    p_this.cameraLatlong.latitude = lat;
                    p_this.cameraLatlong.longitude = lon;
                    p_this.altitude = alt
                } else return false
            }
        }
        return true
    }
    this.MakeCopy = MakeCopy;
    this.Copy = Copy;
    this.Equals = Equals;
    this.ToString = ToString;
    this.SetCenter = SetCenter;
    this.SetCenterLatLong = SetCenterLatLong;
    this.SetCenterLatLongAccurate = SetCenterLatLongAccurate;
    this.SetPixelRectangle = SetPixelRectangle;
    this.SetLatLongRectangle = SetLatLongRectangle;
    this.SetZoomLevel = SetZoomLevel;
    this.SetMapStyle = SetMapStyle;
    this.SetTilt = SetTilt;
    this.SetDirection = SetDirection;
    this.SetAltitude = SetAltitude;
    this.GetTilt = GetTilt;
    this.GetDirection = GetDirection;
    this.GetAltitude = GetAltitude;
    this.ScaleCoord = ScaleCoord;
    this.GetX = GetX;
    this.GetY = GetY;
    this.GetCenter = GetCenter;
    this.Resolve = Resolve;
    this.SetZoomLevel = SetZoomLevel;
    this.GetZoomLevel = GetZoomLevel;
    this.GetLatLongRectangle = GetLatLongRectangle;
    this.GetPixelRectangle = GetPixelRectangle;
    this.GetCenterLatLong = GetCenterLatLong;
    this._UpdateCamera = _UpdateCamera
};
Msn.VE.ViewChangeType = function () {};
Msn.VE.ViewChangeType.Zoom = 1;
Msn.VE.ViewChangeType.Pan = 2;
Msn.VE.ViewChangeType.Hybrid = 3;
Msn.VE.ViewChangeType.IsValid = function (a) {
    return typeof a == "number" && a > 0 && a < 4
};
Msn.VE.ObliqueScene = function (e, J, C, F, H, O, b, d, v, u, I) {
    var c = null,
        a = "",
        g = null,
        h = null,
        f = {};
    f[Msn.VE.MapStyle.Oblique] = "392";
    f[Msn.VE.MapStyle.ObliqueHybrid] = "392";
    var i = {};
    i[Msn.VE.MapStyle.Oblique] = "%0ecn.t%3.tiles.virtualearth.net/tiles/o%4-%5-%6-%7.jpeg?g=%8";
    i[Msn.VE.MapStyle.ObliqueHybrid] = "%0ecn.t%3.tiles.virtualearth.net/tiles/cmd/ObliqueHybrid?a=%4-%5-%6-%7&g=%8";
    var w = Msn.VE.MapStyle.Oblique,
        j = null,
        N = null,
        o = null;
    if (Msn.VE.API == null) j = "__obliqueCalcServiceUrl__";
    else o = Msn.VE.API.Constants.imageryurl + "/ConvertLatLongToPixelInBirdsEye";
    var r = new _xz1,
        q = 256,
        M = this,
        K = new Msn.VE.Bounds(1, 2, 0, 0, b / 2, d / 2);

    function B(d, e) {
        var c = Math.pow(2, e - 2),
            f = [
            [d.x / c],
            [d.y / c],
            [1]
        ],
            a = MatrixMultiply(v, f),
            b = new Msn.VE.LatLong;
        b.longitude = a[0][0] / a[2][0];
        b.latitude = a[1][0] / a[2][0];
        return b
    }
    function y(d, g, f) {
        var b = [];
        for (var a = 0; a < d.length; ++a) {
            var c = this.PixelToLatLong(d[a], g);
            if (Msn.VE.API != null) {
                var e = new VELatLong;
                e._reserved = r.Encode(c.latitude, c.longitude);
                b[a] = e
            } else b[a] = c
        }
        if (f) f(b)
    }
    function l(d, e) {
        var c = Math.pow(2, e - 2),
            f = [
            [d.longitude],
            [d.latitude],
            [1]
        ],
            a = MatrixMultiply(u, f),
            b = new VEPixel;
        b.x = a[0][0] / a[2][0] * c;
        b.y = a[1][0] / a[2][0] * c;
        return b
    }
    function x(f, k, l) {
        var d = [];
        for (var b = 0; b < f.length; ++b) d[b] = r.Encode(f[b].latitude, f[b].longitude);
        var a = [];
        if (Msn.VE.API == null) {
            a.push(new VEParameter("a", "L2P"));
            a.push(new VEParameter("b", d.join("")));
            a.push(new VEParameter("s", e));
            a.push(new VEParameter("f", "__LatLongToPixelAsyncResponse"))
        } else {
            if (c) a.push(new VEParameter(Msn.VE.API.Constants.clienttoken, c));
            if (g) a.push(new VEParameter("mapguid", g));
            a.push(new VEParameter("locations", '"' + d.join("") + '"'));
            a.push(new VEParameter("sceneId", e));
            a.push(new VEParameter("encodingLength", 6))
        }
        if (Msn.VE.API != null) {
            var i = function (d) {
                if (h) h.__HandleAuthentication(d);
                var c = null;
                if (d != null && d.Pixels != null) {
                    var e = Math.pow(2, k - 2);
                    c = [];
                    var b = d.Pixels;
                    for (var a = 0; a < b.length; ++a) if (b[a] != null && b[a].X != null && typeof b[a].X != "undefined" && b[a].Y != null && typeof b[a].Y != "undefined") c[a] = new VEPixel(b[a].X * e, b[a].Y * e);
                    else c[a] = null
                }
                l(c)
            };
            VEAPIRequestInvoke(o, a, i)
        } else {
            var i = function (a) {
                var c = null;
                if (a != null && (a.err == null || typeof a.err == "undefined")) {
                    var d = Math.pow(2, k - 2);
                    c = [];
                    for (var b = 0; b < a.length; ++b) if (a[b] != null && a[b].x != null && typeof a[b].x != "undefined" && a[b].y != null && typeof a[b].y != "undefined") c[b] = new VEPixel(a[b].x * d, a[b].y * d);
                    else c[b] = null
                }
                l(c)
            },
                m = new VENetwork;
            m.ServiceUrl = j;
            m.BeginInvoke("__LatLongToPixelAsyncResponse", a, i, M)
        }
    }
    function E(a, c, e) {
        if (a < 0 || c < 0) return false;
        if (e == 1) return a < b / 2 && c < d / 2;
        return a < b && c < d
    }
    function L() {
        return e
    }
    function k(h, j, e, d) {
        if (!Msn.VE.MapStyle.IsViewOblique(d)) d = w;
        var g = j * (e == 1 ? b / 2 : b) + h,
            c = i[d];
        if (Msn.VE.API) {
            if (d == Msn.VE.MapStyle.ObliqueHybrid) c = a ? Msn.VE.API.Constants.obliquehybridorigintileserver : Msn.VE.API.Constants.obliquehybridtileserver;
            else c = a ? Msn.VE.API.Constants.obliqueorigintileserver : Msn.VE.API.Constants.obliquetileserver;
            c = c + a
        }
        return c.replace(/%3/g, g % 8).replace(/%4/g, J).replace(/%5/g, C).replace(/%6/g, H + e - 2).replace(/%7/g, g).replace(/%8/g, f[d])
    }
    function s() {
        return k(b / 4, d / 4, 1)
    }
    this.GetMiddleTileFilename = s;

    function t() {
        var b = Msn.VE.API ? (a ? Msn.VE.API.Constants.obliquethumbnailorigintileserver : Msn.VE.API.Constants.obliquethumbnailtileserver) + a : "%0ecn.t%1.tiles.virtualearth.net/tiles/ot%2.jpeg?g=%3";
        return b.replace(/%1/g, e % 4).replace(/%2/g, e).replace(/%3/g, f)
    }
    function A() {
        return F
    }
    function G() {
        return K
    }
    function p() {
        return b * q
    }
    function n() {
        return d * q
    }
    function z(a) {
        if (!a) return false;
        var b = l(a, 2);
        return m(b, 2)
    }
    function m(b, e) {
        var a = Math.pow(2, 2 - e),
            c = b.x * a,
            d = b.y * a;
        return c >= 0 && d >= 0 && c < p() && d < n()
    }
    this.SetClientToken = function (d, b) {
        c = d;
        if (c && b) a = "&" + Msn.VE.API.Constants.clienttoken + "=" + c;
        else a = ""
    };
    this.SetGUID = function (a) {
        g = a;
        if (typeof VEMap != "undefined") h = VEMap._GetMapFromGUID(g)
    };

    function D() {
        return I
    }
    this.PixelToLatLong = B;
    this.PixelToLatLongAsync = y;
    this.LatLongToPixel = l;
    this.LatLongToPixelAsync = x;
    this.IsValidTile = E;
    this.GetID = L;
    this.GetTileFilename = k;
    this.GetThumbnailFilename = t;
    this.GetOrientation = A;
    this.GetBounds = G;
    this.GetWidth = p;
    this.GetHeight = n;
    this.ContainsLatLong = z;
    this.ContainsPixel = m;
    this.GetMapStyle = D
};
Msn.VE.Orientation = new
function () {
    this.North = "North";
    this.East = "East";
    this.West = "West";
    this.South = "South"
};
VEPixel = function (a, b) {
    this.x = parseFloat(a);
    this.y = parseFloat(b)
};
VEPixel.prototype.ToString = function () {
    return "(" + this.x + ", " + this.y + ")"
};
VEPixel.prototype.Copy = function (a) {
    if (!a) return;
    this.x = a.x;
    this.y = a.y
};

function VEPixelToQuadKey(a, f) {
    var d = "";
    if (a != null) {
        var g = MathFloor(a.x / 256),
            h = MathFloor(a.y / 256);
        for (var c = f; c > 0; c--) {
            var b = 0,
                e = 1 << c - 1;
            if ((g & e) != 0) b++;
            if ((h & e) != 0) b += 2;
            d += b + ""
        }
    }
    return d
}
Msn.VE.PixelRectangle = function (b, a) {
    this.topLeft = b;
    this.bottomRight = a;
    this.ToString = function () {
        return "(" + (this.topLeft ? this.topLeft.ToString() : "null") + ", " + (this.bottomRight ? this.bottomRight.ToString() : "null") + ")"
    };
    this.Copy = function (a) {
        if (!a) return;
        if (!this.topLeft) this.topLeft = new VEPixel;
        if (!this.bottomRight) this.bottomRight = new VEPixel;
        this.topLeft.Copy(a.topLeft);
        this.bottomRight.Copy(a.bottomRight)
    };
    this.Contains = function (a) {
        if (a instanceof VEPixel) return a.x > this.topLeft.x && a.y > this.topLeft.y && a.x < this.bottomRight.x && a.y < this.bottomRight.y
    }
};
Msn.VE.LineRegion = function (b, a, c) {
    this.boundingRectangle = b;
    this.indices = a;
    this.childRegions = c;

    function d() {
        return "Bounding Rectangle: " + this.boundingRectangle[0].ToString() + " to " + this.boundingRectangle[1].ToString() + " | Indices: [" + a + "]"
    }
    this.ToString = d
};
var L_integerencodingoutofrange_text = "VEIntegerEncoding: The number encoded is out of supported range",
    L_floatintegermapencodingoutofrange_text = "VEFloatIntegerMap: The number encoded is out of supported range",
    L_integerencodinginvalidstringlength_text = "VEIntegerEncoding: Invalid string length",
    L_integerencodingunknowndigit_text = "VEIntegerEncoding: The encoded string has an unknown digit";

function VEIntegerEncoding(g, j) {
    var e = g,
        d = g.length,
        a = j,
        h = 1;
    for (var i = 0; i < a; ++i) h *= d;
    var f = h - 1,
        c = [];
    for (var b = 0; b < e.length; ++b) c[e.substr(b, 1)] = b;
    this.MaxValue = function () {
        return f
    };
    this.ValueLength = function () {
        return a
    };
    this.Encode = function (c) {
        if (c <= f) {
            var h = "",
                g = [];
            for (var b = 0; b < a; ++b) g[b] = 0;
            var i = a - 1;
            while (c > 0) {
                g[i] = Math.floor(c % d);
                c = Math.floor(c / d);
                --i
            }
            for (var b = 0; b < g.length; ++b) h += e.substr(g[b], 1);
            return h
        } else throw L_integerencodingoutofrange_text
    };
    this.Decode = function (c) {
        if (c.length == a) {
            var b = 0;
            for (var e = 0; e < c.length; ++e) {
                b *= d;
                b += this.DigitValue(c.substr(e, 1))
            }
            return b
        } else throw L_integerencodinginvalidstringlength_text
    };
    this.DigitValue = function (a) {
        if (c[a] != null && c[a] != "undefined") return c[a];
        else throw L_integerencodingunknowndigit_text
    }
}
function VEFloatIntegerMap(e, d, f) {
    var a = e,
        c = d,
        b = f;
    this.MinFloat = function () {
        return a
    };
    this.MaxFloat = function () {
        return c
    };
    this.MaxInt = function () {
        return b
    };
    this.FloatToInt = function (d) {
        if (d >= a && d <= c) {
            var e = (d - a) / (c - a),
                f = e * b + .5;
            return Math.min(Math.floor(f), b)
        } else throw L_floatintegermapencodingoutofrange_text
    };
    this.IntToFloat = function (d) {
        if (d <= b) {
            var f = d / b,
                e = a + f * (c - a);
            return e
        } else throw L_floatintegermapencodingoutofrange_text
    }
}
var L_velatlongencodinginvalidstringlength_text = "_xz1: Invalid string length";

function _xz1(b) {
    var i = -90,
        h = 90,
        g = -180,
        f = 180,
        j = "0123456789bcdfghjkmnpqrstvwxyz",
        e = 6;
    if (b != null && typeof b != "undefined") e = b;
    var a = new VEIntegerEncoding(j, e),
        d = new VEFloatIntegerMap(i, h, a.MaxValue()),
        c = new VEFloatIntegerMap(g, f, a.MaxValue());
    this.Encode = function (e, b) {
        var f = a.Encode(d.FloatToInt(e)) + a.Encode(c.FloatToInt(b));
        return f
    };
    this.Decode = function (f) {
        if (f.length == 2 * a.ValueLength()) {
            var e = a.ValueLength(),
                j = f.substr(0, e),
                h = f.substr(e, e),
                i = a.Decode(j),
                g = a.Decode(h),
                b = [];
            b[0] = d.IntToFloat(i);
            b[1] = c.IntToFloat(g);
            return b
        } else throw L_velatlongencodinginvalidstringlength_text
    }
}
function _xz1ForMobile() {
    _xz1.call(this, 5)
}
var Shims = ["help", "msve_ScratchPad", "VE_MessageControl", "contextMenu", "MSVE_dashboardId"],
    vedomain = "http://ecn.dev.virtualearth.net/mapcontrol/v6.2",
    _entityIdShapePostfix = "_Shape",
    _hackUniqueLayerId = "UniqueLayer_Hack";

function GetManifestUrl(a) {
    return a.indexOf("http") == 0 ? a : vedomain + a
}
function Get3dMarket() {
    if (typeof Msn.VE.API == "undefined" || Msn.VE.API == null) return window.locale;
    else return Msn.VE.API.Globals.locale
}
function Get3dInstallMarket() {
    if (typeof Msn.VE.API == "undefined" || Msn.VE.API == null) return window.locale;
    else return Msn.VE.API.Globals.resourcelocale
}
function Get3dInstallUrl(b, a) {
    if (typeof a == "undefined" || a == null) a = Get3dInstallMarket();
    if (typeof b == "undefined" || b == null) {
        b = "Default.aspx?action=install";
        if (a) b += "&mkt={0}"
    }
    var c = "http://www.bing.com/maps/Help/VE3DInstall/" + b;
    c = c.replace("{0}", a);
    return c
}
function Get3dHelpUrl(c, a) {
    var b = "http://www.bing.com/maps/Help/{0}/" + c;
    if (typeof a == "undefined" || a == null) a = Get3dMarket();
    b = b.replace("{0}", a);
    return b
}
function initShimElements() {
    for (var a = 0; a < Shims.length; a++) UpdateIFrameShim(Shims[a])
}
function hookResizeEvent(a) {
    if (a.onresize == null) a.onresize = function () {
        var b = event.srcElement,
            a = b.shimElement;
        if (a) SetShimPosition(a, b)
    }
}
function destroyShimElements() {
    for (var a = 0; a < Shims.length; a++) destroyIFrameShim(Shims[a]);
    var b = $ID("msve_ScratchPad");
    if (b) b.onresize = null
}
function ConvertClipToSize(d, e) {
    var a = e.style.clip.split(",");
    if (a.length == 4) {
        var c = parseInt(a[1]),
            b = parseInt(a[2]);
        if (!isNaN(b)) d.height = b;
        if (!isNaN(c)) d.width = c
    }
}
var UseClipToSize = window.navigator.userAgent.indexOf("Firefox") >= 0;

function SetShimPosition(a, b) {
    var c = g(b).getRelativePosition(a.parentNode);
    a.style.top = c.y + "px";
    a.style.left = c.x + "px";
    a.width = b.offsetWidth;
    a.height = b.offsetHeight;
    if (UseClipToSize) ConvertClipToSize(a, b);
    else a.style.clip = b.style.clip
}
function UpdateIFrameShim(c, e, d) {
    var a = typeof c == "object" ? c : $ID(c);
    if (!a) return;
    if (!a.shimElement) addIFrameShim(a, e, d);
    var b = a.shimElement;
    SetShimPosition(b, a);
    if (Msn.VE.Css.Functions.getComputedStyle(a, "display") == "none" || Msn.VE.Css.Functions.getComputedStyle(a, "visibility") == "hidden") b.style.display = "none";
    else b.style.display = "block"
}
function RepositionShims() {
    if (!view3DMode) return;
    for (var b = 0; b < Shims.length; b++) {
        var a = $ID(Shims[b]);
        if (a && a.shimElement && a.shimElement.style.display != "none") SetShimPosition(a.shimElement, a)
    }
}
function addIFrameShim(b, f, e) {
    var a = document.createElement("iframe");
    a.frameBorder = "0";
    a.scrolling = "no";
    a.style.position = "absolute";
    if (e >= 0) a.style.zIndex = e;
    else a.style.zIndex = "1";
    a.style.backgroundColor = "white";
    b.shimElement = a;
    HideShim(b);
    var c = f;
    if (c == null) c = b;
    var d = c.parentNode;
    if (d == null) d = document.body;
    d.insertBefore(a, c);
    if (b.id == "msve_ScratchPad" || b.id && b.id.indexOf("_vefindcontrolinput") > 0) hookResizeEvent(b);
    return a
}
function destroyIFrameShim(b) {
    var a = $ID(b);
    DestroyShim(a)
}
function ShowShim(a, b) {
    UpdateIFrameShim(a, b);
    if (a != null && a.shimElement) a.shimElement.style.display = "block"
}
function HideShim(a) {
    if (a != null && a.shimElement) a.shimElement.style.display = "none"
}
function DestroyShim(a) {
    if (a != null && a.shimElement) {
        a.shimElement.parentNode.removeChild(a.shimElement);
        a.shimElement = null
    }
}
function RollShim(b) {
    var a = b.Recipient;
    if (a.shimElement) if (UseClipToSize) ConvertClipToSize(a.shimElement, a);
    else a.shimElement.style.clip = a.style.clip
}
function OnView3DKeyDown(d, c) {
    var b = parseInt(d);
    CloseContextMenu(b);
    ero.hide();
    var a = GetMapControlInstance(c);
    if (a == null) return;
    switch (b) {
    case 65:
        a.SetMapStyle("a");
        break;
    case 72:
        a.SetMapStyle("h");
        break;
    case 82:
    case 86:
        a.SetMapStyle("r");
        break;
    case 50:
    case 98:
        window.setTimeout(function () {
            a.EnableMode(Msn.VE.MapActionMode.Mode2D)
        },
        10);
        break;
    case 66:
    case 79:
        a.GetDashboard().Oblique3DToggle()
    }
}
function OnNavigationHelpFired() {
    VE_Help.OpenLiveHelp("wl_local", "topic", "WL_LOCAL_PROC_3D_NavigateMap.htm")
}
function OnHardwareAccelHelpFired() {
    VE_Help.OpenLiveHelp("wl_local", "topic", "WL_LOCAL_TROU_3D_VideoAcceleration.htm")
}
var __shapeIdBeingDragged = null;

function Deserialize3DMessage(message) {
    var messageObject;
    if (typeof Sys != "undefined" && Sys != null && Sys.Serialization != null) messageObject = Sys.Serialization.JavaScriptSerializer.deserialize(message);
    else eval("messageObject = " + message + ";");
    return messageObject
}
function OnView3DMouseDown(b) {
    var a = Deserialize3DMessage(b);
    if (a.button == "Left") {
        __shapeIdBeingDragged = a.shapeId;
        window.setTimeout(BeginDragPin3D, 300)
    }
    CloseContextMenu();
    ero.hide();
    if (typeof Msn.VE.API == "undefined" || Msn.VE.API == null) VE_MapDispatch.ClickedEntity = null
}
function BeginDragPin3D() {
    if (__shapeIdBeingDragged != null) {
        var d = true,
            b = VE_MapManager.GetCollectionByAnId(__shapeIdBeingDragged);
        if (b != null) {
            var c = VE_MapManager.GetSelectedCollection();
            if (c != null && c.GetId() != b.GetId()) return
        } else return;
        var a = VE_MapManager.GetAnnotationInCollectionById(b, __shapeIdBeingDragged);
        if (typeof a != "undefined" && a != null && a.GetType() == MC_GEO_TYPE_POINT) {
            VE_Annotations.EnterMovePushpinMode(__shapeIdBeingDragged, true);
            View3DMovePin(__shapeIdBeingDragged)
        }
    }
}
function OnView3DDropGeometry(b) {
    var a = Deserialize3DMessage(b);
    if (!a.pushpinId) return;
    var c = VE_MapManager.GetAnnotationById(a.pushpinId);
    if (c) VE_Annotations.MovePushpin(null, new Msn.VE.LatLong(a.lat, a.lon))
}
function OnView3DLatLonAltClicked(b) {
    var a = Deserialize3DMessage(b);
    VE_MapUpdateView_AutoSaveEntity();
    if (VE_EditControl.GetMode() == MC_DRAW_MODEL) VE_MapDispatch.OnCreateModel(a.lat, a.lon, a.alt);
    else VE_EditControl.AddPoint(null, a.lat, a.lon, a.alt)
}
function OnBeginFlyTo(c, b) {
    ero.hide();
    var a = GetMapControlInstance(b);
    if (a != null) a.OnBeginCameraUpdate()
}
function OnView3DUpdateViewpoint(k, l) {
    var b = Deserialize3DMessage(k),
        c = GetMapControlInstance(l);
    if (c == null) return;
    c.OnEndCameraUpdate();
    var f = 1e-6,
        e = .1,
        j = .01,
        a = c.GetCurrentMapView(),
        h = Math.abs(b.heading - a.GetDirection()) < e && Math.abs(b.pitch - a.GetTilt()) < e,
        i = a.cameraLatlong != null && Math.abs(b.lat - a.cameraLatlong.latitude) < f && Math.abs(b.lon - a.cameraLatlong.longitude) < f,
        m = Math.abs(b.alt - a.GetAltitude()) < j && a.GetZoomLevel() == b.zoom,
        g = i && h && (a.GetAltitude() <= -1000 && a.GetZoomLevel() == b.zoom);
    if (!g) {
        var d = c.GetOn3DAnimationInterruptedCallback();
        if (d) d()
    }
    a = new Msn.VE.MapView(c);
    a.latlong = new Msn.VE.LatLong(b.targetLat, b.targetLon);
    a.cameraLatlong = new Msn.VE.LatLong(b.lat, b.lon);
    a.SetZoomLevel(b.zoom);
    a.SetMapStyle(c.GetMapStyle());
    a.SetAltitude(b.alt);
    a.SetDirection(b.heading);
    a.SetTilt(b.pitch);
    a._supressFlyToCall = true;
    c.SetView(a);
    c.Fire("onendpan");
    c.Fire("onchangeview")
}
function ProcessQueuedRequest(c, b) {
    var a = GetVEMapInstance(b);
    if (a != null) a._ProcessQueuedRequest()
}
function OnView3DHoverEnd() {
    ero.hide()
}
function CloseContextMenu(a) {
    if (a != 16) {
        VE_MapUpdateView_AutoSaveEntity();
        VE_MapUpdateView_AutoSaveEntity()
    }
    if (VE_ContextMenu.MenuOpen) {
        VE_ContextMenu.RemoveContextPin();
        VE_ContextMenu.CloseMenu()
    }
}
function DoShowNotification(b) {
    var a = Deserialize3DMessage(b);
    VE_MessageControl._AddMessage(a.message, a.milliseconds)
}
function OnSetupVE3DVIA() {
    VE_Help.OpenSized(L_InstallVE3DVIATitle_Text, "Help/" + Get3dInstallMarket() + "/VE3DVIAInstall.htm", 700, 520)
}
function Refresh3DPassportCookie(a) {
    if (document.all) return;
    if (!a) a = map.Get3DControl();
    a.RefreshCookiesFromMozilla()
}
function OnRefreshModel(a) {
    if (typeof Msn.VE.API == "undefined" || Msn.VE.API == null) if (typeof a != "undefined" && a != null) {
        var b = a.split(",");
        VE_MapViewPreUpdate.RefreshCollectionList(b)
    }
}
function OnSelectPhoto(a) {
    var b = Deserialize3DMessage(a);
    if (typeof state != "undefined" && state != null) state.SetScene(b.SceneId)
}
function OnPhotoCameraZoom(a) {
    OnPhotoCameraPanOrZoom(a, "Zoom while In-Image")
}
function OnPhotoCameraPan(a) {
    OnPhotoCameraPanOrZoom(a, "Pan BE Scene")
}
function OnPhotoCameraPanOrZoom(b) {
    ero.hide();
    var a = Deserialize3DMessage(b);
    if (typeof state != "undefined" && state != null) state.SetXYScale(a.X, a.Y, a.Scale)
}
function OnActivate(a) {
    var b = Deserialize3DMessage(a)
}
function IsModelVisibleInSpaceland(c) {
    var a = false,
        b = map.Get3DControl();
    if (b) if (b.InvokePlugInMethod(VE_3DPlugin.GeoCommunityGuid, "QueryModel", 'msnid="' + c + '"') == "1") a = true;
    return a
}
VE_ModelActionType = {
    CreateModel: "CreateModel",
    AddModel: "AssociateModel",
    AddModelByReference: "LoadModelFile",
    DeleteModel: "DissociateModel",
    MoveModel: "MoveModel",
    RotateModel: "RotateModel",
    ElevateModel: "ElevateModel",
    EditModel: "EditModel",
    LoadModelFile: "LoadModelFile",
    DeleteModelFile: "DeleteModelFile"
};
VE_ModelWhereType = {
    Scratchpad: "scratchpad",
    Taskbar: "taskbar",
    ContextMenu: "contextmenu",
    CV: "cv"
};

function UniqueModelViewSuccess() {}
function UniqueModelViewFailure() {}
function UniqueModelFullyDownloaded() {}
function OnView3DPushpinHover(b, c) {
    if (typeof VE_Annotations != "undefined") if (VE_Annotations.PanelOpen) return;
    var a = Deserialize3DMessage(b);
    Process3DPushpinHover(a.layerId, a.pushpinId, a.rX1, a.rY1, a.rX2, a.rY2, c)
}
function Process3DPushpinHover(layerId, pushpinId, rX1, rY1, rX2, rY2, mapGuid) {
    var result = null,
        isInvalid = rX1 == null || rY1 == null || rX2 == null || rY2 == null ? true : false,
    isEqual = rX1 === rX2 && rY1 === rY2 ? true : false,
    vmap,
    mapcontrol,
    mapid;
    try {
        var isAPI = typeof Msn.VE.API != "undefined" && Msn.VE.API != null;
        if (!isAPI) {
            vmap = null;
            mapcontrol = map;
            mapid = "msve_mapContainer"
        } else {
            vmap = GetVEMapInstance(mapGuid);
            if (vmap == null) return;
            mapcontrol = vmap.vemapcontrol;
            mapid = vmap.ID
        }
    } catch(a) {
        return
    }
    var mapdiv = $ID(mapid);
    if (mapdiv == null) return;
    var mapPos = g(mapdiv).getScreenPosition(),
        rect = null;
    if (!isInvalid) rect = new Msn.VE.Geometry.Rectangle(new Msn.VE.Geometry.Point(rX1 + mapPos.x, rY1 + mapPos.y), new Msn.VE.Geometry.Point(rX2 + mapPos.x, rY2 + mapPos.y));
    if (vmap != null) {
        if (isInvalid || isEqual) return;
        if (pushpinId.indexOf("msftve") == 0) {
            VEShowVEShapeERO(pushpinId, mapGuid, rect);
            return
        } else {
            var pushpins = vmap.pushpins;
            if (pushpins != null) {
                var len = pushpins.length;
                for (var i = 0; i < len; i++) {
                    var p = pushpins[i];
                    if (p != null && p.ID == pushpinId) {
                        ero.hide();
                        VEPushpin.Show3D(rect, p.Title, p.Details, p.TitleStyle, p.DetailsStyle);
                        return
                    }
                }
            }
        }
        return
    } else {
        result = VE_MapManager.GetAnnotationById(pushpinId);
        if (result) {
            var entity = result;
            try {
                if (entity != "undefined" && entity != "" && entity) {
                    var content = null,
                        col = null;
                    col = VE_MapManager.GetCollectionByAnId(pushpinId);
                    var isCV = col.GetType() == MC_COL_TYPE_COLLECTION ? false : true,
                    primitive = entity.GetPrimitive(0);
                    if (primitive.type != VEShapeType.Pushpin && pushpinId.indexOf(_entityIdShapePostfix) > 0) {
                        VE_MapManager.SetHighlightEntity(entity, isCV);
                        return
                    }
                    if (!isCV) VE_MapViewPreUpdate.ShowEro(pushpinId, VE_Directions.EntryPoint.Scratchpad, rect);
                    else VE_MapViewPreUpdate.Viewer.ShowEroToItem(null, pushpinId, rect, null)
                }
            } catch(a) {}
            return
        }
    }
    var ddERO = $find(pushpinId + "_ero");
    if (ddERO) {
        CloseContextMenu();
        var content = ddERO.get_Content();
        ero.clearActions();
        var ddActionNames = eval(ddERO.get_ActionNames()),
            ddActionValues = eval(ddERO.get_ActionValues());
        g(ddActionNames).forEach(function (a, b) {
            ero.addAction('<a href = "#" onclick = "' + ddActionValues[b] + '; return false;">' + a + "</a>")
        });
        ero.setContent(content);
        ero.dockToRect(rect, null, -1);
        return
    }
    result = pushpinId.match(/pin_traffic_market_(.*)/);
    if (result != null && result.length >= 2) {
        var entity = VE_TrafficManager.GetEntity(pushpinId);
        if (entity != null) {
            var content = VE_TrafficManager.CreateZoomPopupContent(entity);
            if (content != null && content != "" && content != "undefined") {
                CloseContextMenu();
                ero.setContent(content);
                ero.dockToRect(rect, null, -1);
                return
            }
        }
    }
    result = pushpinId.match(/pin_traffic_incident_(.*)/);
    if (result != null && result.length >= 2) {
        var entity = VE_TrafficManager.GetEntity(pushpinId);
        if (entity != null) {
            var content = VE_TrafficManager.CreatePopupContent(entity, true);
            if (content != null && content != "" && content != "undefined") {
                CloseContextMenu();
                ero.setContent(content);
                ero.dockToRect(rect, null, -1);
                return
            }
        }
    }
    if (pushpinId == "autolocate") {
        var pushpins = mapcontrol.GetPushpins();
        if (pushpins) for (var i = 0; i < pushpins.length; ++i) if (pushpins[i].pin.id == "autolocate") {
            var pinDOM = pushpins[i].pin;
            pinDOM.onmouseover(rect);
            return
        }
    }
    result = pushpinId.match(/pin_(.*)/);
    if (result == null) result = pushpinId == "place_pin" ? [null, "place_ero"] : null;
    if (result != null && result.length >= 2) {
        var entityID = result[1],
            r = VE_SearchManager.GetEntity(entityID);
        if (r === null) {
            entityID = result[0];
            r = VE_SearchManager.GetEntity(entityID);
            if (r === null) {
                var correspondingItem = Gimme.id(entityID + "_number");
                entityID = correspondingItem && correspondingItem.parentNode.id.replace(/_pin$/, "");
                r = VE_SearchManager.GetEntity(entityID)
            }
        }
        if (r !== null) {
            CloseContextMenu();
            VE_SearchManager.SetLatLong(r.latitude, r.longitude);
            if (r.type != VE_SearchType.Collection) {
                var content = VE_SearchManager.CreatePopupContent(r, true);
                ero.setContent(content);
                ero.dockToRect(rect, null, -1)
            } else ShowCollectionPopup(new VE_CollectionSearchEroData(r), rect, null)
        }
        return
    }
}
function OnHardwareCapabilitiesUpdate() {
    if (typeof view3DMode != "undefined" && view3DMode) {
        map.Setup3DManifests();
        var b = "3D performance option � ",
            a = map.Get3DControl().HardwareClassificationLevel;
        if (typeof a != "undefined" && a != null) {
            switch (a) {
            case 3:
                b += "Quality";
                break;
            case 2:
                b += "Balanced";
                break;
            case 1:
                b += "Performance"
            }
            UpdateStreetLevelGeometryState(map.Get3DControl());
            UpdateHiResModelsState(map.Get3DControl());
            UpdateWeatherPluginState(map.Get3DControl())
        }
    }
}
function View3DMovePin(a) {
    map.Get3DControl().PickupGeometry("UniqueLayer_Hack", a)
}
Msn.VE.FFSentinel = function (a) {
    this.CurrentVersion = a
};

function BrowserSupports3D() {
    var a = window.navigator.userAgent;
    return a.indexOf("Windows") != -1 && (a.indexOf("MSIE") != -1 || a.indexOf("Firefox") != -1)
}
function GetSentinel() {
    if (BrowserSupports3D()) {
        if (window.navigator.userAgent.indexOf("MSIE") != -1) {
            var b;
            try {
                b = new ActiveXObject("Microsoft.SentinelVirtualEarth3DProxy.SentinelVE3DProxy")
            } catch(f) {
                try {
                    b = new ActiveXObject("Microsoft.SentinelVirtualEarth3D.SentinelVE3D")
                } catch(g) {
                    b = null
                }
            }
            return b
        } else if (typeof navigator.plugins != undefined) for (var a = 0; a < navigator.plugins.length; a++) {
            var c = navigator.plugins[a].name.indexOf("Virtual Earth 3D");
            if (c >= 0) {
                var e = navigator.plugins[a].name.indexOf("plugin"),
                    d = parseFloat(navigator.plugins[a].name.substring(c + 17, e - 1));
                return new Msn.VE.FFSentinel(d)
            }
        }
    } else if (typeof navigator.plugins != undefined) for (var a = 0; a < navigator.plugins.length; a++) {
        var c = navigator.plugins[a].name.indexOf("Virtual Earth 3D");
        if (c >= 0) {
            var e = navigator.plugins[a].name.indexOf("plugin"),
                d = parseFloat(navigator.plugins[a].name.substring(c + 17, e - 1));
            return new Msn.VE.FFSentinel(d)
        }
    }
    return null
}
function HandleModeNotInstalled(b) {
    if (b == Msn.VE.MapActionMode.Mode3D) {
        map.EnableMode(Msn.VE.MapActionMode.Mode2D);
        if (BrowserSupports3D()) {
            var a = GetSentinel();
            if (a != null) View3DDamaged();
            else View3DInstall()
        } else if (typeof ShowMessage != "undefined") ShowMessage(L_BrowserNotSupported3D_Text)
    }
}
function View3DInstall() {
    try {
        if (typeof Msn.VE.API == "undefined" || Msn.VE.API == null) state.Set3DViewInstallInProgress("true");
        if (window.navigator.userAgent.indexOf("MSIE") != -1) VE_Help.OpenSized(L_View3DHelpWindowTitle_Text, Get3dInstallUrl(), 650, 520);
        else VE_Help.OpenSized(L_View3DHelpWindowTitle_Text, Get3dInstallUrl(), 680, 540);
        var a = VE_Help.helpPanel.onCloseClick;
        VE_Help.helpPanel.onCloseClick = function () {
            a();
            VE_Help.helpPanel.onCloseClick = a
        }
    } catch(b) {}
}
function View3DUpgrade(c) {
    try {
        var b = Get3dInstallUrl("Default.aspx?v=" + c + "&mkt={0}");
        if (typeof Msn.VE.API == "undefined" || Msn.VE.API == null) state.Set3DViewInstallInProgress("true");
        if (typeof Msn.VE.API != "undefined" && Msn.VE.API != null) window.open(b, "_blank", "width=600,height=320,menubar=0,resizeable=0,status=0,titlebar=0,toolbar=0,scrollbars=0");
        else {
            VE_Help.OpenSized(L_View3DHelpWindowTitle_Text, b, 600, 320);
            var a = VE_Help.helpPanel.onCloseClick;
            VE_Help.helpPanel.onCloseClick = function () {
                a();
                VE_Help.helpPanel.onCloseClick = a
            }
        }
    } catch(d) {}
}
function View3DDamaged() {
    try {
        VE_Help.Open("", Get3dHelpUrl("View3DUnavailable.htm"))
    } catch(a) {}
}
function View3DSwitch() {
    if (map) map.EnableMode(Msn.VE.MapActionMode.Mode3D)
}
function Start3DView() {
    if (map) {
        if (typeof ShowMessage != "undefined") ShowMessage(L_3DLoading_Text);
        window.setTimeout(View3DSwitch, 200)
    }
}
function Start3DViewWhenUpgradeComplete() {
    if (map) {
        var a = GetSentinel();
        if (a.CurrentVersion >= 4.0) {
            if (typeof ShowMessage != "undefined") ShowMessage(L_3DLoading_Text);
            window.setTimeout(View3DSwitch, 200)
        } else setTimeout(Start3DViewWhenUpgradeComplete, 1500);
        a = null
    }
}
function NotifyWhen3DUpgraded() {
    if (map) {
        var a = GetSentinel();
        if (a.CurrentVersion >= 4.0) if (map.GetDashboard() && map.GetDashboard().DisplayThreeDUpdatedNotification) map.GetDashboard().DisplayThreeDUpdatedNotification();
        else {
            if (typeof ShowMessage != "undefined") ShowMessage(L_3DLoading_Text);
            window.setTimeout(View3DSwitch, 200)
        } else setTimeout(NotifyWhen3DUpgraded, 1500);
        a = null
    }
}
function PushpinURL(d, c) {
    var a = vedomain + "/i/bin/" + window.buildVersion + "/";
    if (typeof d == "undefined" || d == null || !d) return a + "pins/red_circ7px.gif";
    var b = Msn.VE.PushPinTypes;
    switch (d) {
    case b.Annotation:
        if (c == "shared") return a + "pins/poi_viewer.gif";
        else return a + "pins/poi_usergenerated.gif";
    case b.Overlay:
        if (c == "shared") return a + "pins/poi_cruncher_viewer.gif";
        else return a + "pins/poi_cruncher.gif";
    case b.SearchResultPrecise:
        if (c == "model" || c == "sharemodel") return a + "pins/modelpoi.gif";
        else if (c == "shared") return a + "pins/poi_title_viewer.gif";
        return a + "pins/poi_" + c + ".gif";
    case b.SearchResultNonprecise:
        if (c == "model" || c == "sharemodel") return a + "pins/modelpoi.gif";
        else if (c == "shared") return a + "pins/poi_title_viewer.gif";
        return a + "pins/poi_search_nonprecise.gif";
    case b.Collection:
        return a + "pins/poi_" + c + ".gif";
    case b.AdSponsor:
        return a + "pins/poi_search.gif";
    case b.DirectionStep:
        return a + "pins/poi_direction_step.png";
    case b.Direction:
        return a + "blue_pushpin.png";
    case b.DirectionTemp:
        return a + "pins/mapicon_" + c + ".gif";
    case b.TrafficOthers:
        return a + "Traffic/Traffic" + c + ".gif";
    case b.YouAreHere:
        return a + "pins/poi_youarehere.gif";
    case b.Default:
        return a + "pins/" + c;
    case b.Context:
        return a + "pins/red_circ7px.gif";
    case b.AdRoofStandard:
    case b.AdRoofWide:
    case b.AdStandard:
    case b.AdWide:
    case b.AdCategory:
        return c
    }
    return a + "pins/poi_usergenerated.gif"
}
function _VEExtractImgUrlFromHtml(d) {
    var b = null,
        a = document.createElement("div");
    a.innerHTML = d;
    var c = a.getElementsByTagName("img");
    if (c.length >= 1) b = c[0].getAttribute("src");
    a = null;
    return b
}
var _VEHtmlToImgUrlHash = [];

function TranslatePushpinURL(d, f, g) {
    var a = Msn.VE.PushPinTypes,
        h, c = null;
    switch (g) {
    case a.DirectionTemp:
        var e = /mapicon_(start|end).gif/g,
            b = e.exec(f);
        if (b != null && b.length >= 2) {
            c = b[1];
            break
        } else return vedomain + _VEExtractImgUrlFromHtml(f);
    case a.SearchResultPrecise:
    case a.SearchResultNonprecise:
    case a.Collection:
        var e = /VE_Pushpin VE_Pushpin_(.*)/g,
            b = e.exec(d);
        if (b != null && b.length >= 2) c = b[1];
        break;
    case a.TrafficOthers:
        if (typeof _VEHtmlToImgUrlHash[d] == "string") c = _VEHtmlToImgUrlHash[d];
        else {
            var e = new RegExp(/VE_Pushpin VE_Traffic_(.*)/g),
                b = e.exec(d);
            if (b != null && b.length >= 2) {
                c = b[1];
                _VEHtmlToImgUrlHash[d] = c
            }
            e = null
        }
        break;
    case a.AdRoofStandard:
    case a.AdRoofWide:
    case a.AdStandard:
    case a.AdWide:
    case a.AdCategory:
        c = _VEExtractImgUrlFromHtml(f)
    }
    var h = PushpinURL(g, c);
    return h
}
var _VE_previousShapeId = null;

function RaiseMouseEvent3D(g, d, b) {
    try {
        var a = Deserialize3DMessage(g);
        if (a.shapeId != null) {
            var e = typeof Msn.VE.API != "undefined" && Msn.VE.API != null;
            if (b == "onclick" || !e && b == "onmouseover" && a.shapeId.indexOf(_entityIdShapePostfix) > 0 && _VE_previousShapeId != a.shapeId) {
                if (typeof VE_Annotations != "undefined") if (VE_Annotations.PanelOpen) return;
                _VE_previousShapeId = a.shapeId;
                Process3DPushpinHover(a.layerId, a.shapeId, a.rX1, a.rY1, a.rX2, a.rY2, d)
            } else if (!e && b == "onmouseout" && a.shapeId.indexOf(_entityIdShapePostfix) > 0) {
                VE_MapManager.HighlightEntity(false);
                _VE_previousShapeId = null
            }
        }
        var c = GetMapControlInstance(d);
        if (c == null) return;
        var f = c.CreateEvent(a.lat == null || a.lon == null ? null : new Msn.VE.LatLong(a.lat, a.lon), null, null, null, a.shapeId, a.button, a.alt);
        c.Fire(b, f)
    } catch(h) {}
}
function OnMouseDown3D(b, a) {
    RaiseMouseEvent3D(b, a, "onmousedown")
}
function OnMouseUp3D(b, a) {
    __shapeIdBeingDragged = null;
    RaiseMouseEvent3D(b, a, "onmouseup")
}
function OnClick3D(b, a) {
    RaiseMouseEvent3D(b, a, "onclick")
}
function OnMouseOver3D(b, a) {
    RaiseMouseEvent3D(b, a, "onmouseover")
}
function OnMouseOut3D(b, a) {
    ero.hide();
    RaiseMouseEvent3D(b, a, "onmouseout")
}
function OnDoubleClick3D(b, a) {
    RaiseMouseEvent3D(b, a, "ondoubleclick")
}
function OnChangeMapStyle3D() {
    var b = GetMapControlInstance();
    if (b) {
        var a = b.Get3DControl();
        UpdateStreetLevelGeometryState(a);
        UpdateHiResModelsState(a);
        UpdateWeatherPluginState(a)
    }
}
function GetMapControlInstance(b) {
    if (typeof Msn.VE.API == "undefined" || Msn.VE.API == null) return map;
    var a = GetVEMapInstance(b);
    if (a == null) return null;
    return a.vemapcontrol
}
function GetVEMapInstance(a) {
    if (typeof a == "undefined" || a == null) {
        if (Msn.VE.API == null || Msn.VE.API == "undefined" || Msn.VE.API.Globals.vemapinstances == null || Msn.VE.API.Globals.vemapinstances == "undefined") return null;
        var c = 0;
        for (var b in Msn.VE.API.Globals.vemapinstances) if (Msn.VE.API.Globals.vemapinstances[b] instanceof VEMap && Msn.VE.API.Globals.vemapinstances[b].GetMapMode() == VEMapMode.Mode3D) {
            c++;
            a = b
        }
        if (c != 1) return null
    }
    return VEMap._GetMapFromGUID(a)
}
function Get3DHardwareClassification(b) {
    var a = b.HardwareClassificationLevel;
    if (a == 3) a = "Quality";
    else if (a == 2) a = "Balanced";
    else if (a == 1) a = "Performance";
    else a = "Unknown";
    return a
}
VE_3DPlugin = {
    MovieRecorderGuid: "791BC97B-7526-4C74-85DB-8CC220E3A65E",
    PhotoGuid: "B1FC67C1-F8CE-4CA5-A957-B5FF2215037B",
    PhotoManifest: GetManifestUrl("http://go.microsoft.com/fwlink/?LinkID=99342"),
    PhotoUrl: GetManifestUrl("http://go.microsoft.com/fwlink/?LinkID=98905"),
    HiResModelsGuid: "5D4BE259-4D19-492F-8D6B-830833E2EAD9",
    HiResModelsManifest: GetManifestUrl("http://go.microsoft.com/fwlink/?LinkID=124117"),
    HiResModelsUrl: GetManifestUrl("http://go.microsoft.com/fwlink/?LinkID=124119"),
    WeatherPluginGuid: "A020A315-34D9-4357-94AD-97F909E96B22",
    WeatherPluginManifest: GetManifestUrl("http://go.microsoft.com/fwlink/?LinkID=124118"),
    WeatherPluginUrl: GetManifestUrl("http://go.microsoft.com/fwlink/?LinkID=124120"),
    GeoCommunityGuid: "49D0BC0C-67A7-44CD-93BA-C7CF6F20EAB9",
    GeoCommunityManifest: GetManifestUrl("http://go.microsoft.com/fwlink/?LinkID=99343"),
    GeoCommunityUrl: GetManifestUrl("http://go.microsoft.com/fwlink/?LinkID=98904"),
    StreetLevelGeometryGuid: "C9F0B259-0B78-464A-BEC4-B4E90CF0BC8D",
    StreetLevelGeometryManifest: GetManifestUrl("http://go.microsoft.com/fwlink/?LinkID=111353"),
    StreetLevelGeometryUrl: GetManifestUrl("http://go.microsoft.com/fwlink/?LinkID=109495")
};
var VE_3DPhotoPluginObj = 0,
    VE_3DHiResModelsPluginObj = 0,
    VE_3DWeatherPluginObj = 0,
    VE_3DGeoCommunityPluginObj = 0,
    VE_3DStreetLevelGeometryObj = 0,
    PluginEventRegistered = 0,
    PhotoPluginEventRegistered = 0,
    GeoCommunityPluginEventRegistered = 0,
    StreetLevelGeometryEventRegistered = 0,
    VE3DVIASavedAction = 0;

function GetVE3DVIAInstallState(a) {
    if (!a) {
        a = map.Get3DControl();
        if (!a) return 0
    }
    return a.GetComponentInstallState("EE3B731B-969E-4cb6-8949-ADFDC763A547")
}
function OnVE3DVIAInstallEnd() {
    if (VE3DVIASavedAction != 0) {
        ProcessModelIn3DEx(VE3DVIASavedAction.actionType, VE3DVIASavedAction.properties, VE3DVIASavedAction.control, L_PluginFeatureNotAvailable_Text);
        VE3DVIASavedAction = 0
    }
}
function ProcessModelRequire3DVIA(b, c, a) {
    if (typeof b == "undefined" || b == null) return;
    if (!a) {
        a = map.Get3DControl();
        if (!a) return
    }
    if (GetVE3DVIAInstallState() == 2) ProcessModelIn3DEx(b, c, a, L_PluginFeatureNotAvailable_Text);
    else {
        if (!VE3DVIASavedAction) VE3DVIASavedAction = {};
        VE3DVIASavedAction.actionType = b;
        VE3DVIASavedAction.properties = c;
        VE3DVIASavedAction.control = a;
        OnSetupVE3DVIA()
    }
}
function ProcessModelIn3D(b, c, d) {
    var a = L_UnableToDisplay3DVIAModel_Text;
    if (VE_ModelActionType.DeleteModel == b) a = "";
    ProcessModelIn3DEx(b, c, d, a)
}
function ProcessModelIn3DEx(b, e, a, d) {
    if (typeof b == "undefined" || b == null) return;
    if (!a) {
        var c = GetMapControlInstance();
        if (c) a = c.Get3DControl();
        if (!a) return
    }
    if (!VE_3DGeoCommunityPluginObj) VE_3DGeoCommunityPluginObj = CreatePluginObj(a, VE_3DPlugin.GeoCommunityGuid, VE_3DPlugin.GeoCommunityManifest, VE_3DPlugin.GeoCommunityUrl);
    if (!GeoCommunityPluginEventRegistered) {
        a.AttachPlugInEvent(VE_3DPlugin.GeoCommunityGuid, "OnRefreshModel", "OnRefreshModel");
        a.AttachPlugInEvent(VE_3DPlugin.GeoCommunityGuid, "OnLaunchVE3DVIA", "OnLaunchVE3DVIA");
        a.AttachPlugInEvent(VE_3DPlugin.GeoCommunityGuid, "LoadModelFileStatus", "VE_OnLoadModelFileStatus");
        GeoCommunityPluginEventRegistered = 1
    }
    FirePluginEventIn3D(VE_3DGeoCommunityPluginObj, b, e, a, d)
}
function ProcessPhotoPluginActionIn3D(b, c, a) {
    if (typeof b == "undefined" || b == null) return;
    if (!a) {
        a = map.Get3DControl();
        if (!a) return
    }
    if (!VE_3DPhotoPluginObj) VE_3DPhotoPluginObj = CreatePluginObj(a, VE_3DPlugin.PhotoGuid, VE_3DPlugin.PhotoManifest, VE_3DPlugin.PhotoUrl);
    if (!PhotoPluginEventRegistered) {
        a.AttachPlugInEvent(VE_3DPlugin.PhotoGuid, "OnSelectPhoto", "OnSelectPhoto");
        a.AttachPlugInEvent(VE_3DPlugin.PhotoGuid, "OnActivate", "OnActivate");
        a.AttachPlugInEvent(VE_3DPlugin.PhotoGuid, "OnCameraPan", "OnPhotoCameraPan");
        a.AttachPlugInEvent(VE_3DPlugin.PhotoGuid, "OnCameraZoom", "OnPhotoCameraZoom");
        a.AttachPlugInEvent(VE_3DPlugin.PhotoGuid, "OnPhotoStateChanged", "OnPhotoStateChanged");
        PhotoPluginEventRegistered = 1
    }
    FirePluginEventIn3D(VE_3DPhotoPluginObj, b, c, a, null)
}
function AllowWeatherPlugin(a) {
    if (!a) return false;
    var c = GetMapControlInstance(null),
        d = a.HardwareClassificationLevel,
        b = c.GetMapStyle();
    return d == 3 && (b == "a" || b == "h")
}
function AllowHiResModels(a) {
    if (!a) return false;
    var c = GetMapControlInstance(null),
        b = a.HardwareClassificationLevel;
    return b == 3
}
function AllowStreetLevelDetail(a) {
    if (!a) return false;
    var c = GetMapControlInstance(null),
        d = a.HardwareClassificationLevel,
        b = c.GetMapStyle();
    return d == 3 && (b == "a" || b == "h")
}
function LoadWeatherPlugin(a) {
    if (!VE_3DWeatherPluginObj) if (a && AllowWeatherPlugin(a)) {
        VE_3DWeatherPluginObj = CreatePluginObj(a, VE_3DPlugin.WeatherPluginGuid, VE_3DPlugin.WeatherPluginManifest, VE_3DPlugin.WeatherPluginUrl);
        if (VE_3DWeatherPluginObj) {
            VE_3DWeatherPluginObj.Loading = 1;
            a.LoadPlugInDll(VE_3DWeatherPluginObj.Url)
        }
    }
}
function OnHiResModelViewed() {}
function LoadHiResModelsPlugin(a) {
    if (!VE_3DHiResModelsPluginObj) if (a && AllowHiResModels(a)) {
        VE_3DHiResModelsPluginObj = CreatePluginObj(a, VE_3DPlugin.HiResModelsGuid, VE_3DPlugin.HiResModelsManifest, VE_3DPlugin.HiResModelsUrl);
        if (VE_3DHiResModelsPluginObj) {
            a.AttachPlugInEvent(VE_3DPlugin.HiResModelsGuid, "OnHiResModelViewed", "OnHiResModelViewed");
            VE_3DHiResModelsPluginObj.Loading = 1;
            a.LoadPlugInDll(VE_3DHiResModelsPluginObj.Url)
        }
    }
}
function LoadStreetLevelGeometry(a) {
    if (!VE_3DStreetLevelGeometryObj) if (a && AllowStreetLevelDetail(a)) {
        VE_3DStreetLevelGeometryObj = CreatePluginObj(a, VE_3DPlugin.StreetLevelGeometryGuid, VE_3DPlugin.StreetLevelGeometryManifest, VE_3DPlugin.StreetLevelGeometryUrl);
        if (VE_3DStreetLevelGeometryObj) {
            VE_3DStreetLevelGeometryObj.Loading = 1;
            a.LoadPlugInDll(VE_3DStreetLevelGeometryObj.Url)
        }
    }
}
function ActivateStreetLevelGeometry(a) {
    if (AllowStreetLevelDetail(a)) if (!VE_3DStreetLevelGeometryObj) LoadStreetLevelGeometry(a);
    else if (VE_3DStreetLevelGeometryObj.Loaded && !VE_3DStreetLevelGeometryObj.Activated) if (a) a.ActivatePlugIn(VE_3DStreetLevelGeometryObj.Guid, VE_3DStreetLevelGeometryObj.Manifest)
}
function DeactivateStreetLevelGeometry(a) {
    if (VE_3DStreetLevelGeometryObj) if (VE_3DStreetLevelGeometryObj.Loaded && VE_3DStreetLevelGeometryObj.Activated && !AllowStreetLevelDetail(a)) if (a) a.DeactivatePlugIn(VE_3DStreetLevelGeometryObj.Guid)
}
function UpdateStreetLevelGeometryState(a) {
    var b = AllowStreetLevelDetail(a);
    if (b) {
        if (!VE_3DStreetLevelGeometryObj.Activated) ActivateStreetLevelGeometry(a)
    } else if (VE_3DStreetLevelGeometryObj.Activated) DeactivateStreetLevelGeometry(a)
}
function ActivateWeatherPlugin(a) {
    if (AllowWeatherPlugin(a)) if (!VE_3DWeatherPluginObj) LoadWeatherPlugin(a);
    else if (VE_3DWeatherPluginObj.Loaded && !VE_3DWeatherPluginObj.Activated) if (a) a.ActivatePlugIn(VE_3DWeatherPluginObj.Guid, VE_3DWeatherPluginObj.Manifest)
}
function DeactivateWeatherPlugin(a) {
    if (VE_3DWeatherPluginObj) if (VE_3DWeatherPluginObj.Loaded && VE_3DWeatherPluginObj.Activated && !AllowWeatherPlugin(a)) if (a) a.DeactivatePlugIn(VE_3DWeatherPluginObj.Guid)
}
function UpdateWeatherPluginState(a) {
    var b = AllowWeatherPlugin(a);
    if (b) {
        if (!VE_3DWeatherPluginObj.Activated) ActivateWeatherPlugin(a)
    } else if (VE_3DWeatherPluginObj.Activated) DeactivateWeatherPlugin(a)
}
function ActivateHiResModelsPlugin(a) {
    if (AllowHiResModels(a)) if (!VE_3DHiResModelsPluginObj) LoadHiResModelsPlugin(a);
    else if (VE_3DHiResModelsPluginObj.Loaded && !VE_3DHiResModelsPluginObj.Activated) if (a) a.ActivatePlugIn(VE_3DHiResModelsPluginObj.Guid, VE_3DHiResModelsPluginObj.Manifest)
}
function DeactivateHiResModelsPlugin(a) {
    if (VE_3DHiResModelsPluginObj) if (VE_3DHiResModelsPluginObj.Loaded && VE_3DHiResModelsPluginObj.Activated && !AllowHiResModels(a)) if (a) a.DeactivatePlugIn(VE_3DHiResModelsPluginObj.Guid)
}
function UpdateHiResModelsState(a) {
    var b = AllowHiResModels(a);
    if (b) {
        if (!VE_3DHiResModelsPluginObj.Activated) ActivateHiResModelsPlugin(a)
    } else if (VE_3DHiResModelsPluginObj.Activated) DeactivateHiResModelsPlugin(a)
}
function CreatePluginObj(b, d, c, e) {
    if (!PluginEventRegistered) {
        b.AttachEvent("OnPlugInLoaded", "On3DPlugInLoaded");
        b.AttachEvent("OnPlugInActivated", "On3DPlugInActivated");
        b.AttachEvent("OnPlugInDeactivated", "On3DPlugInDeactivated");
        PluginEventRegistered = 1
    }
    var a = {};
    a.Loaded = 0;
    a.Loading = 0;
    a.Activated = 0;
    a.actionCounter = 0;
    a.actionType = [];
    a.properties = [];
    a.control = [];
    a.errorMessage = [];
    a.Guid = d.toUpperCase();
    a.Manifest = c;
    a.Url = e;
    return a
}
function FirePluginEventIn3D(a, c, d, b, e) {
    if (a.Activated) b.RaiseEvent(a.Guid, c, d);
    else {
        if (!a.Loaded && !a.Loading) {
            a.Loading = 1;
            b.LoadPlugInDll(a.Url)
        }
        QueuePluginEvent(a, c, d, b, e)
    }
}
function QueuePluginEvent(a, c, d, e, b) {
    a.actionType[a.actionCounter] = c;
    a.properties[a.actionCounter] = d;
    a.control[a.actionCounter] = e;
    a.errorMessage[a.actionCounter] = b;
    a.actionCounter = a.actionCounter + 1
}
function FireErrorMessage(b) {
    var a, c;
    for (a = 0; a < b.actionCounter; a = a + 1) {
        if (b.errorMessage[a] == null || b.errorMessage[a].length == 0) continue;
        var d = false;
        for (c = 0; c < a; c = c + 1) if (b.errorMessage[a] == b.errorMessage[c]) {
            d = true;
            break
        }
        if (!d) VE_MessageControl._AddMessage(b.errorMessage[a])
    }
}
function PostLoadPlugin(b, a, c) {
    a.Loading = 0;
    if (!a.Loaded) if (c) {
        a.Loaded = 1;
        b.ActivatePlugIn(a.Guid, a.Manifest)
    } else {
        if (a.Guid == VE_3DPlugin.GeoCommunityGuid) FireErrorMessage(a);
        else VE_MessageControl._AddMessage(L_PluginFeatureNotAvailable_Text, 3000);
        a.actionCounter = 0
    }
}
function PostActivatePlugin(c, a, d) {
    if (d) {
        a.Activated = 1;
        var b;
        for (b = 0; b < a.actionCounter; b = b + 1) if (c == a.control[b]) c.RaiseEvent(a.Guid, a.actionType[b], a.properties[b])
    } else if (a.Guid == VE_3DPlugin.GeoCommunityGuid) FireErrorMessage(a);
    else VE_MessageControl._AddMessage(L_PluginFeatureNotAvailable_Text, 3000);
    a.actionCounter = 0
}
function On3DPlugInLoaded(h, g) {
    var a = Deserialize3DMessage(h);
    if (typeof a.guid != "undefined" && a.guid != null) a.guid = a.guid.toUpperCase();
    else if (typeof a.plugInPath == "string") {
        var i = a.plugInPath.toLowerCase(),
            f = [VE_3DPhotoPluginObj, VE_3DGeoCommunityPluginObj, VE_3DStreetLevelGeometryObj, VE_3DWeatherPluginObj, VE_3DHiResModelsPluginObj];
        for (var d = 0; d < f.length; d++) {
            var c = f[d];
            if (typeof c == "object" && typeof c.Url == "string" && c.Url.toLowerCase() == i) {
                a.guid = c.Guid.toUpperCase();
                break
            }
        }
    }
    var e = GetMapControlInstance(g);
    if (e) {
        var b = e.Get3DControl();
        if (a.guid == VE_3DPlugin.PhotoGuid) PostLoadPlugin(b, VE_3DPhotoPluginObj, a.success);
        else if (a.guid == VE_3DPlugin.GeoCommunityGuid) PostLoadPlugin(b, VE_3DGeoCommunityPluginObj, a.success);
        else if (a.guid == VE_3DPlugin.HiResModelsGuid) {
            if (a.success && !VE_3DHiResModelsPluginObj.Loaded) {
                VE_3DHiResModelsPluginObj.Loaded = 1;
                ActivateHiResModelsPlugin(b)
            }
        } else if (a.guid == VE_3DPlugin.WeatherPluginGuid) {
            if (a.success && !VE_3DWeatherPluginObj.Loaded) {
                VE_3DWeatherPluginObj.Loaded = 1;
                ActivateWeatherPlugin(b)
            }
        } else if (a.guid == VE_3DPlugin.StreetLevelGeometryGuid) if (a.success && !VE_3DStreetLevelGeometryObj.Loaded) {
            VE_3DStreetLevelGeometryObj.Loaded = 1;
            ActivateStreetLevelGeometry(b)
        }
    }
}
function On3DPlugInActivated(e, d) {
    var a = Deserialize3DMessage(e);
    if (typeof a.guid != "undefined" && a.guid != null) a.guid = a.guid.toUpperCase();
    var c = GetMapControlInstance(d);
    if (c) {
        var b = c.Get3DControl();
        if (a.guid == VE_3DPlugin.PhotoGuid) PostActivatePlugin(b, VE_3DPhotoPluginObj, a.success);
        else if (a.guid == VE_3DPlugin.GeoCommunityGuid) PostActivatePlugin(b, VE_3DGeoCommunityPluginObj, a.success);
        else if (a.guid == VE_3DPlugin.StreetLevelGeometryGuid) PostActivatePlugin(b, VE_3DStreetLevelGeometryObj, a.success);
        else if (a.guid == VE_3DPlugin.HiResModelsGuid) PostActivatePlugin(b, VE_3DHiResModelsPluginObj, a.success);
        else if (a.guid == VE_3DPlugin.WeatherPluginGuid) PostActivatePlugin(b, VE_3DWeatherPluginObj, a.success)
    }
}
function On3DPlugInDeactivated(b) {
    var a = Deserialize3DMessage(b);
    a.guid = a.guid.toUpperCase();
    if (a.guid == VE_3DPlugin.PhotoGuid && a.success) VE_3DPhotoPluginObj.Activated = 0;
    else if (a.guid == VE_3DPlugin.GeoCommunityGuid && a.success) VE_3DGeoCommunityPluginObj.Activated = 0;
    else if (a.guid == VE_3DPlugin.StreetLevelGeometryGuid && a.success) VE_3DStreetLevelGeometryObj.Activated = 0;
    else if (a.guid == VE_3DPlugin.HiResModelsGuid && a.success) VE_3DHiResModelsPluginObj.Activated = 0;
    else if (a.guid == VE_3DPlugin.WeatherPluginGuid && a.success) VE_3DWeatherPluginObj.Activated = 0
}
function OnPhotoStateChanged(e, c) {
    var a = GetMapControlInstance(c);
    if (a == null) return;
    var b = a.CreateEvent(),
        d = Deserialize3DMessage(e);
    b.enabled = d.enabled;
    a.Fire("onve3dphotostatechanged", b)
}
function OnLaunchVE3DVIA() {
    VE_MessageControl._AddMessage(L_LaunchVE3DVIA_Text, 5000)
}
function VE_OnLoadModelFileStatus(d) {
    if (typeof Msn.VE.API != "undefined" && Msn.VE.API != null) {
        var c = GetVEMapInstance();
        if (c) {
            var b = Deserialize3DMessage(d),
                a = c.GetShapeByID(b.id);
            if (a && a.ModelData && typeof a.ModelData.Callback == "function") a.ModelData.Callback(a, b.status)
        }
    }
}
var __vemapcontrolisReady = true;
if (!window.__DEP_COL_HASH) window.__DEP_COL_HASH = [];

function openDependency(c, g) {
    var d = false,
        a = __DEP_COL_HASH[c];
    if (!a) {
        a = new f(c, g);
        var b = __DEP_COL_HASH.push(a);
        __DEP_COL_HASH[c] = __DEP_COL_HASH[b - 1]
    }
    if (a.isClosed) a.reset();
    var b, i = arguments.length;
    for (b = 2; b < i; b++) {
        var e = arguments[b];
        if (!a.dependencyExists(e)) a.addDependency(new h(e));
        else d = true
    }
    return !d;

    function h(a) {
        this.id = a;
        this.isReady = false
    }
    function f(c, d) {
        var a = [],
            b = d,
            e = false;
        this.key = c;
        this.isClosed = false;
        this.addDependency = function (b) {
            var c = a.push(b);
            a[b.id] = a[c - 1]
        };
        this.dependencyExists = function (b) {
            return a[b] != null
        };
        this.getDependencies = function () {
            return a
        };
        this.executeCallback = function () {
            if (typeof b == "function") b.call()
        };
        this.reset = function () {
            this.isClosed = false;
            a = []
        }
    }
}
function closeDependency(f) {
    var b, h = __DEP_COL_HASH.length;
    a: for (b = 0; b < h; b++) {
        var a = __DEP_COL_HASH[b],
            d = a.getDependencies(),
            e = d[f];
        if (typeof e != "undefined" && e != null) {
            e.isReady = true;
            if (!a.isClosed) {
                var c, g = d.length;
                for (c = 0; c < g; c++) if (!d[c].isReady) continue a;
                a.isClosed = true;
                a.executeCallback()
            }
        }
    }
}
var CompatVersion = "";
if (typeof VEAPI_DisableAtlasCompat == "undefined" || !VEAPI_DisableAtlasCompat) VEAPI_DisableAtlasCompat = navigator.userAgent.indexOf("KHTML") !== -1;

function disable_text_selection(a) {
    if (typeof a === "undefined") return;
    a.onselectstart = function () {
        return false
    };
    a.onmousedown = function () {
        return false
    };
    a.unselectable = "on";
    a.style.MozUserSelect = "none";
    a.style.cursor = "default"
}
_VERegisterNamespaces("Web.Browser", "Web.Debug.Performance");
if (!Web.Debug.Enabled) {
    Web.Debug.Enabled = false;
    Web.Debug.Assert = Web.Debug.Trace = function () {};
    Web.Debug.Performance.Start = function () {
        this.End = function () {};
        return this
    }
}
Web.Browser.isSafari = function () {
    return navigator.userAgent.indexOf("KHTML") !== -1
};
Web.Browser.GetWebKitVersion = function () {
    var b = NaN,
        a = / AppleWebKit\/([^ ]+)/.exec(navigator.userAgent);
    if (a && a.length == 2) b = parseInt(a[1]);
    Web.Browser.GetWebKitVersion = function () {
        return b
    };
    return b
};
Web.Browser.isSafari2 = function () {
    return Web.Browser.GetWebKitVersion() < 500
};
Web.Browser.isSafari3 = function () {
    return Web.Browser.GetWebKitVersion() >= 500
};
Web.Browser.AttachSafariCompatibility = function (a) {
    if (Web.Browser.isSafari2()) try {
        document.getElementsByTagName("HTML")[0]
    } catch(s) {}
    a.CollectGarbage = function () {};
    Web.Browser.Button = {
        LEFT: 0,
        RIGHT: 2,
        MIDDLE: 1
    };

    function i(a) {
        window.event = a
    }
    function q(b, c, d) {
        var a = c.slice(2);
        if (a !== "mouseenter" && a !== "mouseleave") b.addEventListener(a, i, true);
        else {
            b.addEventListener("mouseover", i, true);
            b.addEventListener("mouseout", i, true)
        }
        b.addEventListener(a, d, false)
    }
    function p(d, b, c) {
        var a = b.slice(2);
        if (b === "mousewheel") a = "DOMMouseScroll";
        d.removeEventListener(a, c, false)
    }
    function j(a, b) {
        if (a === "onclick") a = "onmouseup";
        q(this, a, b)
    }
    function k(a, b) {
        if (a === "onclick") a = "onmouseup";
        p(this, a, b)
    }
    if (Web.Browser.isSafari2()) if (typeof a["[[DOMDocument.prototype]]"] === "undefined" || typeof a["[[DOMElement.prototype]]"] === "undefined") {
        Object.prototype.attachEvent = j;
        Object.prototype.detachEvent = k
    } else {
        a.attachEvent = a["[[DOMDocument.prototype]]"].attachEvent = a["[[DOMElement.prototype]]"].attachEvent = j;
        a.detachEvent = a["[[DOMDocument.prototype]]"].detachEvent = a["[[DOMElement.prototype]]"].detachEvent = k
    } else if (Web.Browser.isSafari3()) {
        a.attachEvent = a.HTMLDocument.prototype.attachEvent = a.HTMLElement.prototype.attachEvent = j;
        a.detachEvent = a.HTMLDocument.prototype.detachEvent = a.HTMLElement.prototype.detachEvent = k
    }
    var g = false;

    function c(a) {
        if (g) {
            a.preventDefault();
            a.returnValue = false;
            document.removeEventListener(a.type, c, true);
            a.capturedTarget = a.target;
            g.dispatchEvent(a);
            delete a.captureTarget;
            if (g) document.addEventListener(a.type, c, true);
            a.stopPropagation()
        }
    }
    function b(a) {
        a.stopPropagation();
        a.preventDefault()
    }
    function o() {
        g = this;
        document.addEventListener("mousemove", c, true);
        document.addEventListener("mouseover", b, true);
        document.addEventListener("mouseout", b, true);
        document.addEventListener("mouseenter", b, true);
        document.addEventListener("mouseleave", b, true);
        document.addEventListener("mouseup", c, true)
    }
    function m() {
        g = null;
        document.removeEventListener("mousemove", c, true);
        document.removeEventListener("mouseover", b, true);
        document.removeEventListener("mouseout", b, true);
        document.removeEventListener("mouseenter", b, true);
        document.removeEventListener("mouseleave", b, true);
        document.removeEventListener("mouseup", c, true)
    }
    if (Web.Browser.isSafari2()) {
        var n = 0;

        function l() {
            if (typeof a["[[DOMElement.prototype]]"] === "undefined") {
                if (n < 100) {
                    n++;
                    setTimeout(l, 100)
                }
            } else {
                a["[[DOMElement.prototype]]"].setCapture = o;
                a["[[DOMElement.prototype]]"].releaseCapture = m
            }
        }
        l()
    } else if (Web.Browser.isSafari3()) {
        a.HTMLElement.prototype.setCapture = o;
        a.HTMLElement.prototype.releaseCapture = m
    }
    function h() {}
    function d() {}
    var f = null,
        e = null;
    if (Web.Browser.isSafari2()) {
        h = function (e, c, b) {
            var a = d(e, c, b);
            if (a.length > 0) return a[0];
            else return null
        };
        d = function (g, e, d) {
            var c = d.getElementsByTagName(e),
                b = [],
                a, f = c.length;
            for (a = 0; a < f; a++) b.push(c[a]);
            return b
        };
        f = typeof a["[[DOMDocument.prototype]]"] !== "undefined" ? a["[[DOMDocument.prototype]]"] : Object.prototype;
        e = typeof a["[[DOMElement.prototype]]"] !== "undefined" ? a["[[DOMElement.prototype]]"] : Object.prototype
    } else if (Web.Browser.isSafari3()) {
        h = function (e, a, c) {
            a += "[1]";
            var b = d(e, a, c);
            if (b.length > 0) return b[0];
            else return null
        };
        d = function (b, f, e) {
            var d = b.evaluate(f, e, b.createNSResolver(b.documentElement), XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null),
                c = [],
                a, g = d.snapshotLength;
            for (a = 0; a < g; a++) c.push(d.snapshotItem(a));
            return c
        };
        if (typeof document.implementation !== "undefined" && typeof document.implementation.createDocument !== "undefined") f = document.implementation.createDocument("ns", "root", null).constructor.prototype;
        if (typeof Element !== "undefined") e = Element.prototype
    }
    if (f) {
        f.selectNodes = function (a) {
            return d(this, a, this)
        };
        f.selectSingleNode = function (a) {
            return h(this, a, this)
        }
    }
    if (e) {
        e.selectNodes = function (b) {
            var a = this.ownerDocument;
            if (a.selectNodes) return d(a, b, this);
            else return null
        };
        e.selectSingleNode = function (b) {
            var a = this.ownerDocument;
            if (a.selectSingleNode) return h(a, b, this);
            else return null
        }
    }
};
if (Web.Browser.isSafari()) {
    Web.Browser.AttachSafariCompatibility(window);
    if (Web.Browser.isSafari2()) Msn.Drawing.SvgLayer = function (i, d) {
        function g(b) {
            var c = "http://www.w3.org/1999/xhtml",
                a = document.createElementNS(c, "canvas");
            a.setAttribute("id", b);
            disable_text_selection(a);
            a.setAttribute("width", d.GetMapWidth());
            a.setAttribute("height", d.GetMapHeight());
            a.style.position = "absolute";
            a.style.top = "0px";
            a.style.left = "0px";
            return a
        }
        var c = d,
            b = null,
            h = false,
            k = false,
            j = true;
        if (h === false) {
            h = true;
            b = document.createElement("div");
            b.setAttribute("height", "100%");
            b.setAttribute("width", "100%");
            i.appendChild(b);
            this.lineDashStyles = [];
            var a = this.lineDashStyles;
            a[0] = ["Solid", "none"];
            a[1] = ["ShortDash", "6,2"];
            a[2] = ["ShortDot", "2,2"];
            a[3] = ["ShortDashDot", "6,2,2,2"];
            a[4] = ["ShortDashDotDot", "6,2,2,2,2,2"];
            a[5] = ["Dot", "2,6"];
            a[6] = ["Dash", "10,6"];
            a[7] = ["LongDash", "20,6"];
            a[8] = ["DashDot", "10,6,2,6"];
            a[9] = ["LongDashDot", "20,6,2,6"];
            a[10] = ["LongDashDotDot", "20,6,2,6,2,6"]
        }
        this.addShape = function (d) {
            if (b === null) return;
            var j = null;
            if (d.type === MC_GEO_TYPE_POINT) {
                j = g(d.id !== 0 ? d.id : d.iid);
                b.appendChild(j);
                var a = j.getContext("2d"),
                    n = k.x - 6,
                    o = k.y - 6,
                    m = 12,
                    k = 12;
                a.fillStyle = d.symbol.fill_color;
                a.strokeStyle = d.symbol.stroke_color;
                a.lineWidth = d.symbol.stroke_weight;
                a.beginPath();
                a.rect(n, o, m, k);
                a.closePath();
                a.fill();
                a.stroke()
            } else if (d.type === MC_GEO_TYPE_POLYLINE || d.type === MC_GEO_TYPE_POLYGON) {
                j = g(d.id !== 0 ? d.id : d.iid);
                b.appendChild(j);
                var a = j.getContext("2d");
                if (d.type === MC_GEO_TYPE_POLYGON) a.fillStyle = f(d.symbol.fill_color, e(d.symbol.fill_opacity));
                else a.fillStyle = "";
                a.strokeStyle = f(d.symbol.stroke_color, e(d.symbol.stroke_opacity));
                a.lineWidth = parseInt(d.symbol.stroke_weight);
                var i = GetSvgPath(c, d.points).split(/[\s,]+/),
                    h, l = i.length;
                if (d.type === MC_GEO_TYPE_POLYGON) {
                    a.beginPath();
                    a.moveTo(Number(i[0]), Number(i[1]));
                    for (h = 2; h < l; h += 2) a.lineTo(Number(i[h]), Number(i[h + 1]));
                    a.closePath();
                    a.fill()
                }
                a.beginPath();
                a.moveTo(Number(i[0]), Number(i[1]));
                for (h = 2; h < l; h += 2) a.lineTo(Number(i[h]), Number(i[h + 1]));
                a.stroke()
            }
            return j
        };
        this.SetZIndex = function (a) {
            if (!c.bShowSVG) return;
            c.GetsvgDiv().style.zIndex = a
        };
        this.UpdatePoints = function (a) {
            if (a.type == VEShapeType.Polyline || a.type == VEShapeType.Polygon) {
                var b = $ID(a.id !== 0 ? a.id : a.iid);
                if (b.parentNode) b.parentNode.removeChild(b);
                this.addShape(a)
            }
            return a
        };
        this.UpdateStyle = this.UpdatePoints;

        function f(b, c) {
            if (b.length == 7 && c) {
                var a = [];
                a.push("rgba(");
                a.push(parseInt(b.substring(1, 3), 16));
                a.push(",");
                a.push(parseInt(b.substring(3, 5), 16));
                a.push(",");
                a.push(parseInt(b.substring(5, 7), 16));
                a.push(",");
                a.push(c);
                a.push(")");
                return a.join("")
            } else return b
        }
        function e(a) {
            a += "";
            if (a.indexOf("%") > 1) {
                a = parseInt(a);
                if (a === NaN) a = .3;
                else a /= 100
            }
            return a
        }
    }
}
var windowWidth = 0,
    windowHeight = 0,
    scrollbarWidth = null;

function $ID(a) {
    var b = document;
    return b.getElementById(a)
}
function $CE(a) {
    var b = document;
    return b.createElement(a)
}
function $CENS(a) {
    var b = document;
    return b.createElementNS(a)
}
function GetWindowWidth() {
    var a = 0;
    if (typeof window.innerWidth == "number") a = window.innerWidth;
    else if (document.documentElement && document.documentElement.clientWidth) a = document.documentElement.clientWidth;
    else if (document.body && document.body.clientWidth) a = document.body.clientWidth;
    if (!a || a < 100) a = 100;
    return a
}
function GetWindowHeight() {
    var a = 0;
    if (typeof window.innerHeight == "number") a = window.innerHeight;
    else if (document.documentElement && document.documentElement.clientHeight) a = document.documentElement.clientHeight;
    else if (document.body && document.body.clientHeight) a = document.body.clientHeight;
    if (!a || a < 100) a = 100;
    return a
}
function GetScrollbarWidth() {
    if (scrollbarWidth) return scrollbarWidth;
    if (navigator.userAgent.indexOf("IE") >= 0) {
        var a = document.createElement("div"),
            b = null;
        a.style.visible = "hidden";
        a.style.overflowY = "scroll";
        a.style.position = "absolute";
        a.style.width = 0;
        document.body.insertAdjacentElement("afterBegin", a);
        b = a.offsetWidth;
        a.parentNode.removeChild(a);
        if (!b) b = 16;
        scrollbarWidth = b;
        return b
    } else return 0
}
function GetUrlPrefix() {
    var a = window.location.pathname.lastIndexOf("/"),
        b = window.location.protocol + "//" + window.location.hostname + window.location.pathname.substring(0, a + 1);
    return b
}
function GetUrlParameterString() {
    var a = window.location.search;
    if (a.length == 0 || a.indexOf("?") == -1) return "";
    return a.substr(a.indexOf("?") + 1)
}
function CheckWipExistence() {
    var a = GetUrlParameterString();
    if (a != "" && a.indexOf("wip=") > -1) return true;
    return false
}
function GetUrlParameters() {
    var b = [],
        d = GetUrlParameterString();
    if (!d) return b;
    var e = d.split("&");
    for (var c = 0; c < e.length; c++) {
        var a = e[c].split("=");
        if (a.length == 2 && a[0] && a[1]) {
            b.push(unescape(a[0]));
            b.push(unescape(a[1]))
        }
    }
    return b
}
function ParseShiftKeyForLinks(a) {
    if (a.shiftKey) return false;
    return true
}
_VERegisterNamespaces("Msn.VE.API.Globals");
_VERegisterNamespaces("Msn.VE.API.Constants");
Msn.VE.API.Globals.vemapinstances = null;
Msn.VE.API.Globals.veonbegininvokeevent = null;
Msn.VE.API.Globals.veonendinvokeevent = null;
Msn.VE.API.Globals.vefindresultsnpanel = null;
Msn.VE.API.Globals.language = "en";
Msn.VE.API.Globals.locale = "pt-PT";
Msn.VE.API.Globals.resourcelocale = "en-us";
Msn.VE.API.Globals.vecurrentversion = "6.2.2008082210001.41";
Msn.VE.API.Globals.ishttpsenabled = false;
Msn.VE.API.Globals.protocol = Msn.VE.API.Globals.ishttpsenabled ? "https://" : "http://";
Msn.VE.API.Globals.vecurrentdomain = "http://ecn.dev.virtualearth.net/mapcontrol/v6.2";
Msn.VE.API.Globals.vedebug = false;
Msn.VE.API.Globals.analyticsInitialized = false;
var VE_MapDispatch_SymbolLib = null;
Msn.VE.API.Constants.orthotileserver = "%0ecn.t%2.tiles.virtualearth.net/tiles/%3%4.%5?g=%6&mkt={21}".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.obliquetileserver = "%0ecn.t%3.tiles.virtualearth.net/tiles/o%4-%5-%6-%7.jpeg?g=%8".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.obliquehybridtileserver = "%0ecn.t%3.tiles.virtualearth.net/tiles/cmd/ObliqueHybrid?a=%4-%5-%6-%7&g=%8".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.obliquethumbnailtileserver = "%0ecn.t%1.tiles.virtualearth.net/tiles/ot%2.jpeg?g=%3".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.shadedtileserver = "%0ecn.t%2.tiles.virtualearth.net/tiles/%3%4.%5?g=%6&mkt={21}&shading=hill".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.traffictileserver = "%0t%2.tiles.virtualearth.net/tiles/t%4".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.trafficmarketsserver = "%0t0.tiles.virtualearth.net/incidents/markets.js".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.trafficincidentsserver = "%0t0.tiles.virtualearth.net/incidents/market-%1.js".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.orthoorigintileserver = "%0t%2.tiles.virtualearth.net/tiles/%3%4.%5?g=%6&mkt={21}".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.obliqueorigintileserver = "%0t%3.tiles.virtualearth.net/tiles/o%4-%5-%6-%7.jpeg?g=%8".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.obliquehybridorigintileserver = "%0t%3.tiles.virtualearth.net/tiles/cmd/ObliqueHybrid?a=%4-%5-%6-%7&g=%8".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.obliquethumbnailorigintileserver = "%0t%1.tiles.virtualearth.net/tiles/ot%2.jpeg?g=%3".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.shadedorigintileserver = "%0t%2.tiles.virtualearth.net/tiles/%3%4.%5?g=%6&mkt={21}&shading=hill".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.imageryurl = "%0dev.virtualearth.net/services/v1/ImageryMetadataService/ImageryMetadataService.asmx".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.collectionservice = "%0www.bing.com/maps/GeoCommunity.aspx".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.searchservice = "%0dev.virtualearth.net/services/v1/SearchService/SearchService.asmx/Search2".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.legacyrouteservice = "__legacyRouteServiceUrl__".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.routeservice = "%0dev.virtualearth.net/services/v1/RouteService/RouteService.asmx".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.geocodingservice = "%0dev.virtualearth.net/services/v1/geocodeservice/geocodeservice.asmx".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.logservice = "%0dev.virtualearth.net/webservices/v1/LoggingService/LoggingService.svc".replace(/%0/g, Msn.VE.API.Globals.protocol);
Msn.VE.API.Constants.iconurl = Msn.VE.API.Globals.vecurrentdomain + "/i/bin/" + Msn.VE.API.Globals.vecurrentversion + "/pins/poi_usergenerated.gif";
Msn.VE.API.Constants.clustericonurl = Msn.VE.API.Globals.vecurrentdomain + "/i/bin/" + Msn.VE.API.Globals.vecurrentversion + "/pins/poi_stack.gif";
Msn.VE.API.Constants.atlascompatjs = Msn.VE.API.Globals.vecurrentdomain + "/js/atlascompat.js";
Msn.VE.API.Constants.stylesheet = Msn.VE.API.Globals.vecurrentdomain + "/css/bin/" + Msn.VE.API.Globals.vecurrentversion + "/" + Msn.VE.API.Globals.language + "/mapcontrol.css";
Msn.VE.API.Constants.stylesheetiev6 = Msn.VE.API.Globals.vecurrentdomain + "/css/bin/" + Msn.VE.API.Globals.vecurrentversion + "/" + Msn.VE.API.Globals.language + "/mapcontroliev6.css";
Msn.VE.API.Constants.vedirectionsstarticon = Msn.VE.API.Globals.vecurrentdomain + "/i/bin/" + Msn.VE.API.Globals.vecurrentversion + "/pins/mapicon_start.gif";
Msn.VE.API.Constants.vedirectionsendicon = Msn.VE.API.Globals.vecurrentdomain + "/i/bin/" + Msn.VE.API.Globals.vecurrentversion + "/pins/mapicon_end.gif";
Msn.VE.API.Constants.vedirectionsstepicon = Msn.VE.API.Globals.vecurrentdomain + "/i/bin/" + Msn.VE.API.Globals.vecurrentversion + "/pins/RedCircle%1.gif";
Msn.VE.API.Constants.trafficiconurl = Msn.VE.API.Globals.vecurrentdomain + "/i/bin/" + Msn.VE.API.Globals.vecurrentversion + "/Traffic/Traffic%1.gif";
Msn.VE.API.Constants.trafficmarketiconurl = Msn.VE.API.Globals.vecurrentdomain + "/i/bin/" + Msn.VE.API.Globals.vecurrentversion + "/Traffic/%1TrafficZoom.gif";
Msn.VE.API.Constants.spacerurl = Msn.VE.API.Globals.vecurrentdomain + "/i/bin/" + Msn.VE.API.Globals.vecurrentversion + "/spacer.gif";
Msn.VE.API.Constants.mapguid = "mapguid";
Msn.VE.API.Constants.rim = "rim";
Msn.VE.API.Constants.rimargs = "rimargs";
Msn.VE.API.Constants.contextid = "contextid";
Msn.VE.API.Constants.clienttoken = "token";
Msn.VE.API.Constants.market = "mkt";
Msn.VE.API.Constants.culture = "culture";
Msn.VE.API.Constants.format = "format";
Msn.VE.API.Constants.json = "json";
Msn.VE.API.Constants.requestid = "rid";
Msn.VE.API.Constants.maximportedshapes = "maxitems";
Msn.VE.API.Constants.defaultLogCredentials = "Ahn5L376ymB7iE0SUTiv0-mqke-onEds0hDyR5WF9uaGYphF-L3tsU6i7xcT-B5H";
Msn.VE.API.Globals.vemapmode = Msn.VE.MapActionMode.Mode2D;
Msn.VE.API.Globals.vemapheight = 400;
Msn.VE.API.Globals.vemapwidth = 600;
Msn.VE.API.Globals.vemapzoom = 4;
Msn.VE.API.Globals.vemaplatitude = "43.75";
Msn.VE.API.Globals.vemaplongitude = "-99.71";
Msn.VE.API.Globals.vemapstyle = "r";
Msn.VE.API.Globals.vemaxzoom = "26";
Msn.VE.API.Globals.veminzoom = "1";
Msn.VE.API.Globals.veshapemaxzoom = "21";
Msn.VE.API.Globals.veshapeminzoom = "1";
Msn.VE.API.Globals.vetilesize = 256;
Msn.VE.API.Globals.vepushpinpanelzIndex = 999;
Msn.VE.API.Globals.veshapeiconzindex = 1000;
Msn.VE.API.Globals.veshapepolyshapezindex = 50;
Msn.VE.API.Globals.vetilelayerdefaultzindex = 2;
Msn.VE.API.Globals.vemessagepanelheight = 75;
Msn.VE.API.Globals.vemessagepanelzIndex = 99;
Msn.VE.API.Globals.veplacelistpanelheight = 200;
Msn.VE.API.Globals.veplacelistpanelwidth = 350;
Msn.VE.API.Globals.veplacelistpanelzIndex = 300;
Msn.VE.API.Globals.vefindresultsnpanelwidth = 200;
Msn.VE.API.Globals.vefindresultsnpanelzIndex = 99;
Msn.VE.API.Globals.vefindresultsnpanelcolor = "blue";
Msn.VE.API.Globals.veiscommercialcontrol = false;
Msn.VE.API.Globals.veobliqueMode = null;
Msn.VE.API.Constants.maxasynlatlongs = 50;
Msn.VE.API.Globals.vefindnumresultsdefault = 10;
Msn.VE.API.Globals.vefindnumresultsmin = 1;
Msn.VE.API.Globals.vefindnumresultsmax = 20;
Msn.VE.API.Globals.vedefaultmaximportedshapes = 200;
Msn.VE.API.Globals.Dispose = function () {
    Msn.VE.API.Globals.veonbegininvokeevent = null;
    Msn.VE.API.Globals.veonendinvokeevent = null;
    Msn.VE.API.Globals.vefindresultsnpanel = null
};
Msn.VE.API.Globals.PosX = function (a) {
    var b = 0;
    if (!a) var a = window.event;
    if (a.pageX) b = a.pageX;
    else if (a.clientX) b = a.clientX + document.body.scrollLeft;
    return b
};
Msn.VE.API.Globals.PosY = function (a) {
    var b = 0;
    if (!a) var a = window.event;
    if (a.pageY) b = a.pageY;
    else if (a.clientY) b = a.clientY + document.body.scrollTop;
    return b
};

function VE_Help() {}
_VERegisterNamespaces("Msn.VE.Constants.Css");
var MSVE_header = document.getElementsByTagName("body")[0],
    VE_ContextMenu = null,
    Gimme = {};
(function () {
    var b = new
    function () {
        var e = {},
            n = new
        function () {
            this.val = -2;
            this.t = 0;
            this.f = 0;
            this.inc = function () {
                this.val += 2;
                this.t = this.val + 1;
                this.f = this.val
            }
        };
        this.query = p;
        this.processSelector = f;
        this.nthCacheContains = i;

        function p(a, b) {
            if (!a) return [];
            if (a instanceof Array) return a;
            if (typeof a !== "string") return [a];
            if (typeof document.querySelectorAll !== "undefined") try {
                return g(document.querySelectorAll(a))
            } catch(c) {}
            e = {};
            n.inc();
            return o(d.parseSelector(a), b)
        }
        function o(q, c) {
            var b = q.selectors,
                i = q.hints,
                h = i.anchor;
            c = c || document.documentElement;
            if (h.elem === null) return [];
            if (i.isPartialQuery) {
                b.unshift(d.createReferenceSelector(c));
                c = c.parentNode
            } else if (h.elem !== -1 && b.length > 1) c = h.elem;
            if (i.initialCollection !== null) elems = j(i.initialCollection, b[b.length - 1]);
            else elems = m(b[b.length - 1], c);
            if (b.length === 1) return elems;
            if (b.length === 3) if (h.isIdeal) return elems;
            var s = 0,
                k, g, t = elems.length,
                r = a.combinator,
                l, p, f, e, n = null,
                o = [];
            a: for (k = 0; k < t; k++) {
                g = b.length - 2;
                e = b[g];
                f = p = elems[k];
                while (e) {
                    l = b[g - 1];
                    if (!r[e](l, f)) if (f.parentNode && n === " " && e !== " ") {
                        f = f.parentNode;
                        continue
                    } else continue a;
                    f = l.cursor;
                    g -= 2;
                    n = e;
                    e = g < 1 ? null : b[g]
                }
                o[s++] = p
            }
            return o
        }
        function f(d, b) {
            if (!b) return false;
            if (d.refersTo) return d.refersTo === b;
            var c = d.inProps,
                n = c.id,
                m = c.tag,
                j = c.classes,
                i = c.attributes,
                l = c.pseudos,
                g = a.inRules,
                f = a.exRules;
            if (n && b.id !== n || m && b.tagName !== m || j.length > 0 && !g["."].processFn(b, j) || i.length > 0 && !g["["].processFn(b, i) || l.length > 0 && !g[":"].processFn(b, l)) return false;
            var h, e, k = d.exProps;
            for (h in f) {
                e = f[h].name;
                if (k[e] && !f[h].processFn(b, k[e])) return false
            }
            return true
        }
        function m(h, f) {
            f = f || document.documentElement;
            var l = 0,
                d, j, c, a = h.inProps,
                m = h.exProps;
            if (a.id) {
                c = [$ID(a.id)];
                delete a.id
            } else {
                var e = a.pseudos[a.pseudos.length - 1];
                if (e && e.name === "nth-child") {
                    c = k(e.param.a, e.param.b, a.tag);
                    a.pseudos = a.pseudos.splice(a.pseudos.length, 1)
                } else c = f.getElementsByTagName(a.tag || "*");
                if (m.isEmpty && a.classes.length < 1 && a.attributes.length < 1 && a.pseudos.length < 1) return g(c);
                delete a.tag
            }
            var i = [];
            j = c.length;
            for (d = 0; d < j; d++) if (b.processSelector(h, c[d])) i[l++] = c[d];
            return i
        }
        function j(d, g) {
            var c = [],
                e = 0,
                h = d.length,
                a, b;
            for (b = 0; b < h; b++) {
                a = d[b];
                if (a.nodeType !== 1) continue;
                if (f(g, a)) c[e++] = a
            }
            return c
        }
        function g(b) {
            var c = [],
                d = 0,
                e = b.length,
                a;
            for (a = 0; a < e; a++) c[d++] = b[a];
            return c
        }
        function k(a, b, c) {
            return e[a + "n+" + b] = h(a, b, c, true)
        }
        function l(a, b) {
            return e[a + "n+" + b] = h(a, b, null, false)
        }
        function h(j, n, b, h) {
            if (b === "*") b = null;
            var k = document.getElementsByTagName("*"),
                m = k.length,
                i = {},
                l = 0,
                e, a, f, g, d = h ? [] : {};
            for (f = 0; f < m; f++) {
                a = k[f];
                e = c(a.parentNode);
                i[e] = i[e] || 0;
                g = (l = ++i[e]) - n;
                if (j === 0 && (b && a.tagName !== b ? false : true)) {
                    if (g === 0) {
                        if (h) d.push(a);
                        d[c(a)] = true
                    }
                } else if (j * g >= 0 && g % j === 0 && (b && a.tagName !== b ? false : true)) {
                    if (h) d.push(a);
                    d[c(a)] = true
                }
            }
            return d
        }
        function i(c, d, f) {
            var b = c + "n+" + d,
                a = e[b];
            if (!a) a = e[b] = l(c, d);
            return a[f] === true
        }
    },
        d = new
    function () {
        var d = null,
            f = null,
            c = "";
        this.setRules = function (b) {
            d = b;
            var a;
            for (a in d.combinator) if (d.combinator.hasOwnProperty(a)) c += a;
            f = new RegExp("\\s*([" + c + "])\\s*", "g")
        };
        this.parseSelector = function (l) {
            l = e(l).replace(f, "$1");
            var i = null,
                k = [],
                n = new b,
                m = {
                anchor: new g,
                isPartialQuery: false,
                initialCollection: null
            },
                h = m.anchor,
                p = h,
                s, t, v, q, r, u, d, j = 0,
                o = "",
                w = l.length;
            while (j < w) {
                d = l.charAt(j);
                i = i || a.inRules[d] || a.exRules[d];
                if (i) {
                    u = i.endsWith + (i.stopForCombinators === false ? "" : c);
                    t = i.startSkip || 0;
                    v = i.endSkip || 0;
                    q = i.startModifier || null;
                    r = i.endModifier || null;
                    d = l.charAt(j += t);
                    while (u.indexOf(d) === -1) {
                        if (d === q) while (d && d !== r) {
                            o += d;
                            d = l.charAt(++j)
                        }
                        o += d;
                        d = l.charAt(++j)
                    }
                    if ((s = n.addPart(o, i)) !== -1) {
                        p = h;
                        h = new g(k.length, s)
                    }
                    j += v;
                    o = "";
                    i = null;
                    continue
                } else if (c.indexOf(d) !== -1) {
                    d === "+" || d === "~" ? (h = p) : (p = h);
                    if (! (m.isPartialQuery = j === 0)) {
                        k.push(n);
                        n = new b
                    }
                    k.push(d);
                    m.initialCollection = d === ">" && h.elem && h.elem !== -1 && h.index === k.length - 2 ? h.elem.childNodes : null
                } else {
                    i = a.inRules["tag"];
                    continue
                }
                j++
            }
            k.push(n);
            h.isIdeal = h.elem !== -1 && k.length - 3 === h.index;
            m.anchor = h;
            return {
                selectors: k,
                hints: m
            }
        };
        this.parseAttribute = function (c) {
            var d = /\=|\^=|\$=|\*=|\|=|~=|!=/,
                a = c.match(d);
            a = a && a[0];
            var b = c.split(a),
                f = b[0] && e(b[0].replace(/[\[\]"]/g, "")),
                g = b[1] && e(b[1].replace(/[\[\]"]/g, ""));
            return {
                name: f,
                delim: a,
                val: g
            }
        };
        this.parsePseudo = function (f) {
            var d = /(.*)\((.*)\)/,
                b = f.match(d),
                g = b && b[1] || f,
                a = b && b[2],
                c, h, e;
            if (g === "nth-child") if (a === "even") a = {
                wholeValue: a,
                a: 2,
                b: 0
            };
            else if (a === "odd") a = {
                wholeValue: a,
                a: 2,
                b: 1
            };
            else {
                d = /([+-]?\d+)?(n)?([+-]?\d+)?/;
                b = a.match(d);
                c = parseInt(b[1]) || 1;
                e = b[2] ? 1 : 0;
                h = c && !e ? c : parseInt(b[3]) || 0;
                a = {
                    wholeValue: a,
                    a: c * e,
                    b: h
                }
            }
            return {
                name: g,
                param: a
            }
        };
        this.createReferenceSelector = function (a) {
            return new b(a)
        };

        function b(e) {
            this.cursor = null;
            this.refersTo = e;
            this.inProps = {
                id: null,
                tag: null,
                classes: [],
                attributes: [],
                pseudos: []
            };
            this.exProps = {
                isEmpty: true
            };
            var d, b, c = a.exRules;
            for (d in c) if (c.hasOwnProperty(d)) {
                delete this.exProps.isEmpty;
                b = c[d];
                switch (b.objType) {
                case "array":
                    this.exProps[b.name] = [];
                    break;
                case "null":
                default:
                    this.exProps[b.name] = null
                }
            }
        }
        b.prototype.addPart = function (a, c) {
            var b = c.name,
                f = c.preFn,
                e = c.hintFn,
                g = -1;
            if (typeof f === "function") a = f(a);
            var d = typeof this.inProps[b] !== "undefined" ? this.inProps : this.exProps;
            d[b] instanceof Array ? d[b].push(a) : (d[b] = a);
            if (typeof e === "function") g = e(a);
            return g
        };

        function g(b, a, c) {
            this.index = b === 0 ? 0 : b || NaN;
            this.elem = a === null ? null : a || -1;
            this.isIdeal = c || false
        }
    },
        a = {
        inRules: {
            "tag": {
                name: "tag",
                endsWith: "#.[:",
                preFn: function (a) {
                    return a.toUpperCase()
                },
                hintFn: function (a) {
                    return a === "BODY" || a === "HTML" ? document.getElementsByTagName(a)[0] : -1
                },
                processFn: function (a, b) {
                    return a.tagName === b
                }
            },
            "#": {
                name: "id",
                endsWith: "#.[:",
                startSkip: 1,
                preFn: null,
                hintFn: function (a) {
                    return $ID(a)
                },
                processFn: function (a, b) {
                    return a.id === b
                }
            },
            ".": {
                name: "classes",
                endsWith: ".[:",
                startSkip: 1,
                objType: "array",
                processFn: function (d, c) {
                    var a = d.className;
                    if (typeof a !== "string") a = d.getAttribute("class");
                    if (!a || a.length < 1) return false;
                    var e = " " + a + " ",
                        b, f = c.length;
                    for (b = 0; b < f; b++) if (e.indexOf(" " + c[b] + " ") === -1) return false;
                    return true
                }
            },
            "[": {
                name: "attributes",
                endsWith: "]",
                stopForCombinators: false,
                startSkip: 1,
                endSkip: 1,
                startModifier: '"',
                endModifier: '"',
                objType: "array",
                preFn: d.parseAttribute,
                processFn: function (j, g) {
                    var c, k = g.length,
                        b, h, i, e, d;
                    for (c = 0; c < k; c++) {
                        b = g[c];
                        h = b.name;
                        i = b.val;
                        e = b.delim;
                        d = f(j, h);
                        if (d === null) return false;
                        else if (!e) continue;
                        else if (!a.attr[e || "unknown"](d, i)) return false
                    }
                    return true
                }
            },
            ":": {
                name: "pseudos",
                endsWith: "#.[:)",
                startSkip: 1,
                startModifier: "(",
                endModifier: ")",
                objType: "array",
                preFn: d.parsePseudo,
                processFn: function (f, d) {
                    var c, e, g = d.length,
                        b;
                    for (b = 0; b < g; b++) {
                        c = d[b];
                        e = a.pseudo[c.name] || a.pseudo.unknown;
                        if (!e(f, c)) return false
                    }
                    return true
                }
            }
        },
        exRules: {},
        attr: {
            "=": function (a, b) {
                return a === b
            },
            "^=": function (a, b) {
                return a.indexOf(b) === 0
            },
            "$=": function (a, b) {
                var c = a.lastIndexOf(b);
                return c !== -1 && c + b.length === a.length
            },
            "*=": function (a, b) {
                return a.indexOf(b) !== -1
            },
            "|=": function (a, b) {
                return a === b || a.indexOf(b + "-") === 0
            },
            "~=": function (a, b) {
                return a === b || h(a.split(" "), b)
            },
            "!=": function (a, b) {
                return a !== b
            },
            "unknown": function () {
                return false
            }
        },
        pseudo: {
            "first-child": j("previous"),
            "last-child": j("next"),
            "only-child": function (b) {
                return a.pseudo["first-child"](b) && a.pseudo["last-child"](b)
            },
            "nth-child": function (d, a) {
                var e = a.param.a,
                    f = a.param.b;
                return b.nthCacheContains(e, f, c(d))
            },
            "contains": function (b, a) {
                return b.innerHTML.indexOf(a.param) !== -1
            },
            "unknown": function () {
                return false
            }
        },
        combinator: {
            " ": function (c, d) {
                var a = d.parentNode;
                while (a && a !== document) {
                    if (b.processSelector(c, a)) {
                        c.cursor = a;
                        return true
                    }
                    a = a.parentNode
                }
                return false
            },
            ">": function (a, d) {
                var c = d.parentNode;
                a.cursor = c;
                return b.processSelector(a, c)
            },
            "<": function (d, e) {
                var c = e.childNodes,
                    a, f = c.length;
                for (a = 0; a < f; a++) if (b.processSelector(d, c[a])) return true;
                return false
            },
            "~": function (c, d) {
                var a = d.previousSibling;
                while (a) if (a.nodeType === 1 && b.processSelector(c, a)) {
                    c.cursor = a;
                    return true
                } else a = a.previousSibling;
                return false
            },
            "+": function (c, d) {
                var a = d.previousSibling;
                while (a && a.nodeType !== 1) a = a.previousSibling;
                c.cursor = a;
                return b.processSelector(c, a)
            },
            ",": function () {
                return false
            }
        }
    };
    Gimme.Selectors = {
        addRule: function (b, c) {
            a.exRules[b] = c
        },
        addPseudo: function (b, c) {
            a.pseudo[b] = c
        },
        addAttribute: function (b, c) {
            a.attr[b] = c
        },
        addCombinator: function (b, c) {
            a.combinator[b] = c
        }
    };
    d.setRules(a);
    Gimme.query = b.query;
    Gimme.id = function (a) {
        return $ID(a)
    };
    var g = navigator.userAgent.toLowerCase();
    Gimme.Browser = {
        isIE: typeof ActiveXObject !== "undefined",
        isOpera: typeof window.opera !== "undefined",
        isKHTML: g.indexOf("khtml") !== -1,
        isGecko: g.indexOf("khtml") === -1 && g.indexOf("gecko") !== -1,
        isInIFrame: function () {
            try {
                return window.frameElement && window.frameElement.tagName === "IFRAME"
            } catch(a) {
                return true
            }
        }(),
        isInFrameset: window != top,
        isInQuirksMode: document.compatMode === "BackCompat",
        offsetIncludesBorders: function () {
            if (typeof this.value === "undefined") {
                var a = document.createElement("div");
                a.setAttribute("style", "position:absolute;visibility:hidden;top:0;left:0;border:1px solid #000;");
                var b = document.createElement("div");
                a.appendChild(b);
                document.body.appendChild(a);
                this.value = offsetIncludesBorders = b.offsetTop === 1;
                document.body.removeChild(a);
                a = b = null
            }
            return this.value
        }
    };
    var o = {
        guid: "_$gimme$_guid",
        descendant: "_$gimme$_descendant"
    },
        l = 0;

    function c(a) {
        if (a === window) return "theWindow";
        else if (a === document) return "theDocument";
        else if (typeof a.uniqueID !== "undefined") return a.uniqueID;
        var b = o.guid;
        if (typeof a[b] === "undefined") a[b] = b + l++;
        return a[b]
    }
    var i = function () {
        return typeof Array.prototype.indexOf !== "undefined" ? b : a;

        function b(b, a) {
            return b.indexOf(a)
        }
        function a(b, c) {
            var a, d = b.length;
            for (a = 0; a < d; a++) if (b[a] === c) return a;
            return -1
        }
    }();

    function h(b, a) {
        return i(b, a) !== -1
    }
    function e(a) {
        return a.replace(/^\s+|\s+$/g, "")
    }
    function n(a) {
        return e(a).replace(/\s{2,}/g, " ")
    }
    var f = function () {
        return Gimme.Browser.isIE ? b : a;

        function a(b, a) {
            return b.getAttribute(a)
        }
        function b(a, b) {
            switch (b.toLowerCase()) {
            case "class":
                return a.className || null;
            case "id":
                return a.id || null;
            case "href":
            case "src":
                if (typeof a.getAttribute !== "undefined") return a.getAttribute(b, 2)
            }
            return a.attributes && a.attributes[b] ? a.attributes[b].nodeValue : a.getAttribute(b)
        }
    }(),
        m = function () {
        return typeof document.createElement("div").hasAttribute !== "undefined" ? a : b;

        function a(b, a) {
            return b.hasAttribute(a)
        }
        function b(b, a) {
            return !!f(b, a)
        }
    }();

    function j(b) {
        var a = b + "Sibling";
        return function (c) {
            var b = c[a];
            while (b && b.nodeType !== 1) b = b[a];
            return !b
        }
    }
    function k(c, b) {
        if (!c) return 0;
        if (/px$/.test(c)) return parseInt(c, 10);
        if (!b) b = document.body;
        var a = document.createElement("div");
        a.style.visbility = "hidden";
        a.style.position = "absolute";
        a.style.lineHeight = "0";
        if (/%$/.test(c) || b.tagName === "IMG") {
            b = b.parentNode || b;
            a.style.height = c
        } else {
            a.style.borderStyle = "solid";
            a.style.borderBottomWidth = "0";
            a.style.borderTopWidth = c
        }
        b.appendChild(a);
        var d = a.offsetHeight;
        b.removeChild(a);
        return d || 0
    }
    Gimme.Helper = {
        getObjectGUID: c,
        indexOf: i,
        contains: h,
        trim: e,
        normalize: n,
        hasClass: a.inRules["."].processFn,
        readAttribute: f,
        attrExists: m,
        convertToPixels: k
    }
})();

function g(a) {
    return new Gimme.object(Gimme.query(a))
}
Gimme.object = function (a) {
    this.entities = a;
    this.length = this.entities.length
};
Gimme.ext = Gimme.object.prototype;
(function () {
    var a = Gimme.Helper,
        i = a.contains,
        k = a.indexOf,
        n = a.trim,
        h = a.normalize,
        d = a.hasClass,
        m = a.attrExists,
        j = a.readAttribute,
        b = a.getObjectGUID,
        l = a.convertToPixels;
    Gimme.ext.element = function (a) {
        return this.entities[a || 0]
    };
    Gimme.ext.parent = function (a) {
        return this.entities[a || 0].parentNode
    };
    Gimme.ext.addClass = function (b) {
        var a = b.split(/\s+/);
        this.forEach(function (b) {
            g(a).forEach(function (a) {
                if (!d(b, [a])) if (b.className === "") b.className = a;
                else b.className += " " + a
            })
        });
        return this
    };
    Gimme.ext.removeClass = function (a) {
        return this.swapClass(a, "$1")
    };
    Gimme.ext.swapClass = function (b, a) {
        if (a !== "$1") a = " " + a + " ";
        var c = b.split(/\s+/);
        this.forEach(function (d) {
            var b = d.className;
            g(c).forEach(function (c) {
                var d = new RegExp("(^| )" + c + "( |$)");
                b = b.replace(d, a)
            });
            d.className = h(b)
        });
        return this
    };
    Gimme.ext.hasClass = function (a, b) {
        return d(this.entities[b || 0], [a])
    };
    Gimme.ext.getAncestor = function (b, d) {
        var a = this.entities[d || 0],
            c = b;
        while (c -->
        0) if (a) a = a.parentNode;
        else break;
        return a
    };
    Gimme.ext.getSibling = function (b, g) {
        var c = this.entities[g || 0];
        if (b === 0) return c;
        var e = b > 0 ? "nextSibling" : "previousSibling",
        a = c,
        f = Math.abs(b),
        d = 0;
        while (d < f) {
            a = a[e];
            if (!a) break;
            if (a.nodeType === 1) d++
        }
        return a
    };
    Gimme.ext.select = function (a) {
        return new Gimme.object(Gimme.query(a, this.entities[0]))
    };
    Gimme.ext.setHTML = function (a) {
        this.forEach(function (b) {
            b.innerHTML = a
        });
        return this
    };
    Gimme.ext.getHTML = function (a) {
        return this.entities[a || 0].innerHTML
    };
    Gimme.ext.setValue = function (a) {
        this.forEach(function (b) {
            if (typeof b.value !== "undefined") b.value = a
        });
        return this
    };
    Gimme.ext.getValue = function (a) {
        return this.entities[a || 0].value || ""
    };
    Gimme.ext.readAttribute = function (a, b) {
        return j(this.entities[b || 0], a)
    };
    Gimme.ext.writeAttribute = function (a, b) {
        this.forEach(function (c) {
            c.setAttribute(a, b)
        });
        return this
    };
    Gimme.ext.filter = function (d) {
        var b = this.entities,
            a = 0,
            c = b.length;
        while (a < c) if (!d(b[a])) {
            b.splice(a, 1);
            c--
        } else a++;
        return this
    };
    Gimme.ext.iterate = function (b) {
        var c = this.entities,
            a, e = c.length;
        for (a = 0; a < e; a++) {
            var d = g(c[a]);
            b.call(d, a)
        }
        b = null;
        return this
    };
    Gimme.ext.getStyle = function (c, p, i) {
        var b = this.entities[p || 0];
        if (c === "opacity") {
            var h = e(b);
            if (isNaN(h)) c = h;
            else return h
        }
        if (i !== false) i = true;
        var d = "";
        if (typeof document.defaultView !== "undefined" && typeof document.defaultView.getComputedStyle !== "undefined") d = document.defaultView.getComputedStyle(b, null);
        else if (typeof b.currentStyle !== "undefined") {
            d = b.currentStyle;
            var k = d[c];
            if (k === "auto") {
                if (c === "height") {
                    var f = parseInt(g(b).getStyle("paddingTop")) + parseInt(g(b).getStyle("paddingBottom"));
                    if (b.clientHeight) return b.clientHeight - f + "px";
                    else return b.offsetHeight - f - parseInt(g(b).getStyle("borderTopWidth")) - parseInt(g(b).getStyle("borderBottomWidth")) + "px"
                }
                if (c === "width") {
                    var f = parseInt(g(b).getStyle("paddingLeft")) + parseInt(g(b).getStyle("paddingRight"));
                    if (b.clientWidth) return b.clientWidth - f + "px";
                    else return b.offsetWidth - f - parseInt(g(b).getStyle("borderLeftWidth")) - parseInt(g(b).getStyle("borderRightWidth")) + "px"
                }
                if (c === "top") return b.offsetTop + "px";
                else if (c === "left") return b.offsetLeft + "px";
                else if (i && (c === "right" || c === "bottom")) {
                    var j = {
                        bottom: ["top", "Height"],
                        right: ["left", "Width"]
                    },
                        n = parseInt(this.getComputedStyle(b, j[c][0], false), 10);
                    return b.parentNode["client" + j[c][1]] - b["offset" + j[c][1]] - n + "px"
                } else return "0px"
            }
            var o = /(em|ex|%|in|cm|mm|pt|pc|small|medium|large|thin|thick)$/,
                m = /border(.*)Width/i,
                l = m.test(c) ? c.replace(m, "border$1Style") : null;
            if (o.test(k)) if (l !== null && d[l] === "none") return "0px";
            else return a.convertToPixels(k, b)
        }
        return d && d[c]
    };
    Gimme.ext.setStyle = function (a, b) {
        return g(this.entities).setStyles(a, b)
    };
    Gimme.ext.setStyles = function () {
        var b, c, d = arguments,
            e = d.length,
            a;
        if (e % 2 !== 0) return;
        this.forEach(function (g) {
            for (a = 0; a < e; a += 2) {
                b = d[a];
                c = d[a + 1];
                if (b === "opacity") f(g, c);
                else g.style[b] = c
            }
        });
        return this
    };
    Gimme.ext.addEvent = function () {
        if (typeof document.addEventListener !== "undefined") return a;
        else if (typeof document.attachEvent !== "undefined") return d;
        else return function () {};

        function a(b, d, a, e) {
            var c = this["on" + b];
            if (typeof c === "function" && e !== false) c.call(this, d, a, true);
            else this.forEach(function (c) {
                c.addEventListener(b, d, a)
            });
            return this
        }
        function d(a, d, g, f) {
            var e = this["on" + a];
            if (typeof e === "function" && f !== false) e.call(this, d, g, true);
            else this.forEach(function (f) {
                var g = "{" + b(f) + "/" + a + "/" + b(d) + "}",
                    e = c[g];
                if (typeof e !== "undefined") return;
                e = function (b) {
                    b.target = b.srcElement;
                    if (a == "mouseover") b.relatedTarget = b.fromElement;
                    else if (a == "mouseout") b.relatedTarget = b.toElement;
                    b.preventDefault = function () {
                        b.returnValue = false
                    };
                    b.stopPropagation = function () {
                        b.cancelBubble = true
                    };
                    d.call(f, b);
                    b.target = null;
                    b.relatedTarget = null;
                    b.preventDefault = null;
                    b.stopPropagation = null;
                    b = null
                };
                c[g] = e;
                f.attachEvent("on" + a, e);
                g = null;
                e = null
            });
            return this
        }
    }();
    Gimme.ext.removeEvent = function () {
        if (typeof document.removeEventListener !== "undefined") return a;
        else if (typeof document.detachEvent !== "undefined") return d;
        else return function () {};

        function a(b, d, a, e) {
            var c = this["on" + b];
            if (typeof c === "function" && e !== false) c.call(this, d, a, false);
            else this.forEach(function (c) {
                c.removeEventListener(b, d, a)
            });
            return this
        }
        function d(a, e, g, f) {
            var d = this["on" + a];
            if (typeof d === "function" && f !== false) d.call(this, e, g, false);
            else this.forEach(function (g) {
                var d = "{" + b(g) + "/" + a + "/" + b(e) + "}",
                    f = c[d];
                if (typeof f !== "undefined") {
                    g.detachEvent("on" + a, f);
                    delete c[d]
                }
                d = null;
                f = null
            });
            return this
        }
    }();
    Gimme.ext.forEach = function () {
        return typeof Array.prototype.forEach !== "undefined" ? b : a;

        function b(b, a) {
            this.entities.forEach(b, a);
            return this
        }
        function a(e, d) {
            var b = this.entities,
                a, c, f = b.length;
            for (a = 0; a < f; a++) {
                c = b[a];
                e.call(d, c, a, b)
            }
            return this
        }
    }();
    Gimme.ext.map = function () {
        return typeof Array.prototype.map !== "undefined" ? b : a;

        function b(b, a) {
            return this.entities.map(b, a)
        }
        function a(c, b) {
            var a = [];
            this.forEach(function (d) {
                a.push(c.call(b, d))
            });
            return a
        }
    }();
    Gimme.ext.contains = function (a) {
        return i(this.entities, a)
    };
    Gimme.ext.indexOf = function (a) {
        return k(this.entities, a)
    };
    var c = {},
        f = function () {
        function c(a, b) {
            a.style.opacity = b
        }
        function d(a, b) {
            a.style.filter = "alpha(opacity=" + b * 100 + ")"
        }
        var a, b = document.createElement("div");
        if (typeof b.style.opacity !== "undefined") a = c;
        else if (typeof b.style.filter !== "undefined") a = d;
        else a = function () {};
        b = null;
        return a
    }(),
        e = function () {
        function c(a) {
            return parseFloat(a.style.opacity) || "opacity"
        }
        function d(c) {
            var b = c.currentStyle.filter,
                a = b.match(/pacity\s*=\s*(\d{1,3}.?\d*)\)/);
            if (!a) return 1;
            else return parseFloat(a[1]) / 100
        }
        var a, b = document.createElement("div");
        if (typeof b.style.opacity !== "undefined") a = c;
        else if (typeof b.style.filter !== "undefined") a = d;
        else a = function () {};
        b = null;
        return a
    }()
})();
Gimme.Screen = new
function () {
    this.getViewportSize = function () {
        var a = {
            width: 0,
            height: 0
        };
        if (typeof window.innerWidth !== "undefined") a = {
            width: window.innerWidth,
            height: window.innerHeight
        };
        else if (typeof document.documentElement !== "undefined" && typeof document.documentElement.clientWidth !== "undefined" && document.documentElement.clientWidth !== 0) a = {
            width: document.documentElement.clientWidth,
            height: document.documentElement.clientHeight
        };
        else a = {
            width: document.getElementsByTagName("body")[0].clientWidth,
            height: document.getElementsByTagName("body")[0].clientHeight
        };
        return a
    };
    this.getMousePosition = function (a) {
        if (!a) a = window.event;
        var b = {
            x: 0,
            y: 0
        };
        if (typeof a.pageX !== "undefined" && typeof a.x !== "undefined") {
            b.x = a.pageX;
            b.y = a.pageY
        } else {
            var c = this.getScrollPosition();
            b.x = a.clientX + c.x;
            b.y = a.clientY + c.y
        }
        return b
    };
    this.getScrollPosition = function () {
        var a = {
            x: 0,
            y: 0
        };
        if (typeof window.pageYOffset !== "undefined") {
            a.x = window.pageXOffset;
            a.y = window.pageYOffset
        } else if (!Gimme.Browser.isInQuirksMode && typeof document.documentElement.scrollTop !== "undefined") {
            a.x = document.documentElement.scrollLeft;
            a.y = document.documentElement.scrollTop
        } else if (typeof document.body.scrollTop !== "undefined") {
            a.x = document.body.scrollLeft;
            a.y = document.body.scrollTop
        }
        return a
    }
};
Gimme.ext.getPosition = function (e, j) {
    var a = this.entities[j || 0],
        f, b, i, h, c = 0,
        d = 0;
    if (!Gimme.Browser.isOpera && typeof a.getBoundingClientRect !== "undefined") {
        h = !Gimme.Browser.isInIFrame && Gimme.Browser.isInFrameset ? 0 : 2;
        i = a.getBoundingClientRect();
        c = i.left - h;
        d = i.top - h;
        if (!e) {
            b = Gimme.Screen.getScrollPosition();
            c += b.x;
            d += b.y
        } else e = false
    } else while (a !== null) {
        f = typeof a.scrollTop !== "undefined" && a !== document.body && a !== document.documentElement && a.tagName !== "TEXTAREA" && a.tagName !== "INPUT" ? 1 : 0;
        c += a.offsetLeft - f * a.scrollLeft;
        d += a.offsetTop - f * a.scrollTop;
        a = a.offsetParent;
        if (a && !Gimme.Browser.offsetIncludesBorders()) {
            c += parseInt(g(a).getStyle("borderLeftWidth")) || 0;
            d += parseInt(g(a).getStyle("borderTopWidth")) || 0
        }
    }
    if (e) {
        b = Gimme.Screen.getScrollPosition();
        c -= b.x;
        d -= b.y
    }
    return {
        x: c,
        y: d
    }
};
Gimme.ext.getScreenPosition = function (a) {
    return this.getPosition(true, a)
};
Gimme.ext.getPagePosition = function (a) {
    return this.getPosition(false, a)
};
Gimme.ext.getComputedPosition = function (b) {
    var a = this.entities[b || 0];
    return {
        x: parseInt(g(a).getStyle("left"), 10),
        y: parseInt(g(a).getStyle("top"), 10)
    }
};
Gimme.Util = new
function () {
    this.setTimeout = function () {
        return a(arguments, false)
    };
    this.setInterval = function () {
        return a(arguments, true)
    };

    function a(a, c) {
        var e = a[0],
            b = a[1];

        function d() {
            e.apply(this, Array.prototype.slice.call(a, 2));
            if (!c) e = null
        }
        if (c === true) return window.setInterval(d, b);
        else return window.setTimeout(d, b)
    }
};
Gimme.Animation = new
function () {
    var a = {},
        b = false;
    this.Speeds = {
        snail: 2000,
        turtle: 1250,
        slowly: 1250,
        rabbit: 1000,
        greyhound: 750,
        quickly: 750,
        cheetah: 500,
        lightning: 250
    };
    this.Directions = {
        vertically: 1,
        horizontally: 2,
        both: 3
    };
    this.start = function (b, f, e) {
        var c = setInterval(f, e),
            d = a[b];
        if (typeof d === "undefined") a[b] = {
            iids: [c],
            callback: null
        };
        else d.iids.push(c)
    };
    this.end = function () {
        var c, e = arguments.length;
        for (c = 0; c < e; c++) {
            var d = arguments[c],
                b = a[d];
            if (typeof b !== "undefined") {
                g(b.iids).forEach(function (a) {
                    clearTimeout(a)
                });
                if (typeof b.callback === "function") {
                    b.callback.call();
                    b.callback = null
                }
                delete a[d]
            }
        }
    };
    this.isRunning = function (b) {
        return typeof a[b] !== "undefined"
    };
    this.whenDone = function (c, b) {
        var d = a[c];
        if (typeof d === "undefined") a[c] = {
            iids: [],
            callback: b
        };
        else d.callback = b
    };
    this.startGroup = function () {
        b = true
    };
    this.endGroup = function () {
        b = false
    };
    this.isGrouping = function () {
        return b === true
    }
};
Gimme.Animation.BezierCurve = function () {
    this.points = [];
    this.args = arguments
};
Gimme.Animation.BezierCurve.prototype.initialize = function () {
    var d = this.args,
        h = d.length,
        g = d[h - 1] || 100,
        k = h - 1,
        e, f, b, c, a;
    for (e = 0; e < k; e++) {
        a = d[e];
        c = i(a.length);
        b = a.length - 1;
        for (f = 0; f <= g; f++) this.points.push(j(f / g))
    }
    this.args = d = null;
    return g;

    function j(j) {
        var d, h = 0,
            i = 0;
        for (d = 0; d <= b; d++) {
            var f = c[b] / (c[d] * c[b - d]),
                e = Math.pow(1 - j, b - d),
                g = Math.pow(j, d);
            h += f * a[d].x * e * g;
            i += f * a[d].y * e * g
        }
        return {
            x: h,
            y: i
        }
    }
    function i(d) {
        var a, c = 1,
            b = [1];
        for (a = 1; a <= d; a++) {
            c *= a;
            b.push(c)
        }
        return b
    }
};
Gimme.Animation.BezierCurve.prototype.getPoint = function (c) {
    var a = this.points.length;
    if (a === 0) a = this.initialize();
    var b = Math.floor(c * a);
    if (b > a - 1) b = a - 1;
    return this.points[b]
};
Gimme.Animation.AccelerationLine = function (a, c) {
    var d = a[a.length - 1],
        b = g(a).map(function (a) {
        return {
            x: a / d,
            y: 0
        }
    });
    this.bezier = new Gimme.Animation.BezierCurve(b, c);
    this.points = this.bezier.points
};
Gimme.Animation.AccelerationLine.prototype.getValue = function (a) {
    return this.bezier.getPoint(a).x
};
Gimme.Animation.AccelerationLines = {
    zoom: new Gimme.Animation.AccelerationLine([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520], 75),
    slowStartAccelerate: new Gimme.Animation.AccelerationLine([0, 1, 2, 3, 8, 50], 100),
    quickStartDecelerate: new Gimme.Animation.AccelerationLine([0, 50, 55, 56, 57, 58], 100),
    linear: new Gimme.Animation.AccelerationLine([0, 10], 100)
};
Gimme.Animation.AccelerationLines.defaultLine = Gimme.Animation.AccelerationLines.zoom;
Gimme.ext.fadeIn = function (b, c, a) {
    g(this.entities).fadeTo(null, .99999, b, c, a);
    a = null;
    return this
};
Gimme.ext.fadeOut = function (b, c, a) {
    g(this.entities).fadeTo(null, 0, b, c, a);
    a = null;
    return this
};
Gimme.ext.fadeTo = function (b, c, e, h, d, a) {
    a = a || Gimme.Animation.AccelerationLines.linear;
    g(this.entities).animate(a, e, h, d, f, i);

    function i(d) {
        d.style.zoom = "1";
        var a = b === 0 ? 0 : b || Number(g(d).getStyle("opacity")),
        e = c - a;
        return {
            startOpacity: a,
            deltaO: e
        }
    }
    function f(e, b, c, a) {
        var f = c.getValue(b),
            d = a.startOpacity + f * a.deltaO;
        g(e).setStyle("opacity", d)
    }
    return this
};
Gimme.ext.veil = function (b, d, h, c, e) {
    var a = Gimme.Animation.Directions;
    b = Math.floor(b) || a[b] || a.vertically;
    g(this.entities).animate(e, d, h, c, f, i);

    function i(d) {
        var e = d.style.display || g(d).getStyle("display");
        if (e === "none") return false;
        var c = function (b) {
            var a = {};
            g(b).forEach(function (b) {
                a[b] = parseInt(g(d).getStyle(b), 10)
            });
            return a
        }(["height", "width", "paddingTop", "paddingRight", "paddingBottom", "paddingLeft"]);
        d["_$gimme$_veil"] = c.height + ";" + c.width + ";" + c.paddingTop + ";" + c.paddingRight + ";" + c.paddingBottom + ";" + c.paddingLeft;
        d.style.overflow = "hidden";
        if ((b & a.horizontally) === a.horizontally) d.style.height = c.height + "px";
        return c
    }
    function f(d, g, m, c) {
        if (g >= 1) d.style.display = "none";
        var e = m.getValue(g),
            k, l, j, h, f, i;
        if ((b & a.vertically) === a.vertically) {
            k = c.height - e * c.height;
            j = c.paddingTop - e * c.paddingTop;
            f = c.paddingBottom - e * c.paddingBottom;
            d.style.height = k + "px";
            d.style.paddingTop = j + "px";
            d.style.paddingBottom = f + "px"
        }
        if ((b & a.horizontally) === a.horizontally) {
            l = c.width - e * c.width;
            h = c.paddingRight - e * c.paddingRight;
            i = c.paddingLeft - e * c.paddingLeft;
            d.style.width = l + "px";
            d.style.paddingRight = h + "px";
            d.style.paddingLeft = i + "px"
        }
    }
    return this
};
Gimme.ext.unveil = function (b, e, i, d, f) {
    var a = Gimme.Animation.Directions;
    b = Math.floor(b) || a[b] || a.vertically;
    var c = true;
    g(this.entities).animate(f, e, i, d, h, j);

    function j(b) {
        var l = b.style.display || g(b).getStyle("display");
        if (l !== "none" && l !== null) return false;
        var m = Gimme.Helper.convertToPixels,
            d = b.cloneNode(true);
        d.setAttribute("style", "position:absolute;top:0;left:0;visibility:hidden;margin:0;padding:0;border:0;height:;width:;");
        d.style.display = "block";
        b.parentNode.appendChild(d);
        var j, k, i, f, e, h, a = b["_$gimme$_veil"];
        if (a) {
            a = a.split(";");
            j = a[0];
            k = a[1];
            i = a[2];
            f = a[3];
            e = a[4];
            h = a[5]
        } else {
            var c = g(d);
            j = parseInt(m(b.style.height), 10) || parseInt(c.getStyle("height"), 10);
            k = parseInt(m(b.style.width), 10) || parseInt(c.getStyle("width"), 10);
            d.style.padding = "";
            i = parseInt(c.getStyle("paddingTop"), 10);
            e = parseInt(c.getStyle("paddingBottom"), 10);
            f = parseInt(c.getStyle("paddingRight"), 10);
            h = parseInt(c.getStyle("paddingLeft"), 10)
        }
        b.parentNode.removeChild(d);
        b.style.overflow = "hidden";
        return {
            deltaH: j,
            deltaW: k,
            paddingTop: i,
            paddingBottom: e,
            paddingLeft: h,
            paddingRight: f
        }
    }
    function h(h, j, p, d) {
        var n, o, m, i, k, l, f = g(h),
            e = 1 - p.getValue(j);
        if (c) {
            h.style.display = "block";
            c = false
        }
        if (j >= 1) h.style.overflow = "";
        if (b === a.vertically) f.setStyles("width", d.deltaW + "px", "paddingRight", d.paddingRight + "px", "paddingLeft", d.paddingLeft + "px");
        else if (b === a.horizontally) f.setStyles("height", d.deltaH + "px", "paddingTop", d.paddingTop + "px", "paddingBottom", d.paddingBottom + "px");
        if ((b & a.vertically) === a.vertically) {
            n = d.deltaH - e * d.deltaH;
            m = d.paddingTop - e * d.paddingTop;
            i = d.paddingBottom - e * d.paddingBottom;
            f.setStyles("height", n + "px", "paddingTop", m + "px", "paddingBottom", i + "px")
        }
        if ((b & a.horizontally) === a.horizontally) {
            o = d.deltaW - e * d.deltaW;
            k = d.paddingRight - e * d.paddingRight;
            l = d.paddingLeft - e * d.paddingLeft;
            f.setStyles("width", o + "px", "paddingRight", k + "px", "paddingLeft", l + "px")
        }
    }
    return this
};
Gimme.ext.scrollTo = function (b, e, a, c) {
    g(this.entities[0]).animate(c, b, e, a, d, f);

    function f(c) {
        var a = Gimme.Screen.getScrollPosition(),
            b = g(c).getPagePosition().y - a.y;
        return {
            scrollPos: a,
            deltaY: b
        }
    }
    function d(f, b, c, a) {
        var d = c.getValue(b),
            e = a.scrollPos.y + d * a.deltaY;
        window.scrollTo(0, Math.floor(e))
    }
    return this
};
Gimme.ext.slideToPoint = function (a, c, f, b, d) {
    g(this.entities).animate(d, c, f, b, e, h);

    function h(e) {
        var b = g(e).getComputedPosition();
        if (a.x === null) a.x = b.x;
        if (a.y === null) a.y = b.y;
        var d = a.y - b.y,
            c = a.x - b.x;
        return {
            startPt: b,
            deltaX: c,
            deltaY: d
        }
    }
    function e(c, e, f, a) {
        var b = a.startPt,
            g = a.deltaX,
            h = a.deltaY,
            d = f.getValue(e),
            i = b.x + d * g,
            j = b.y + d * h;
        c.style.top = Math.floor(Math.round(j)) + "px";
        c.style.left = Math.floor(Math.round(i)) + "px"
    }
    return this
};
Gimme.ext.followPath = function (f, a, d, e, c) {
    a = a || 1;
    g(this.entities).animate(f, d, e, c, b, h);

    function h(b) {
        var a = g(b).getComputedPosition();
        return {
            startPt: a
        }
    }
    function b(c, e, g, f) {
        var b = f.startPt,
            d = g.getPoint(e),
            h = b.x + d.x * a,
            i = b.y + d.y * a;
        c.style.top = Math.floor(Math.round(i)) + "px";
        c.style.left = Math.floor(Math.round(h)) + "px"
    }
    return this
};
Gimme.ext.animate = function (d, b, a, h, c, e) {
    var f = this.entities.length;
    if (f < 1) return;
    d = d || Gimme.Animation.AccelerationLines.defaultLine;
    b = Math.floor(b) || Gimme.Animation.Speeds[b] || Gimme.Animation.Speeds.quickly;
    a = a || "AUTOGUID_" + Math.random((new Date).getTime());
    if (!Gimme.Animation.isGrouping() && Gimme.Animation.isRunning(a)) return;
    Gimme.Animation.whenDone(a, h);
    var g = 0,
        j = (new Date).getTime();
    this.forEach(function (c, b) {
        Gimme.Animation.start(a, i(c, b), 1)
    });

    function i(i) {
        var h = e(i),
            l = function () {
            var l = (new Date).getTime(),
                k = (l - j) / b;
            if (k >= 1) {
                if (typeof c === "function") c(i, 1, d, h);
                if (++g === f) {
                    Gimme.Animation.end(a);
                    e = null;
                    c = null
                }
            } else c(i, k, d, h)
        },
            k = function () {
            Gimme.Animation.end(a)
        };
        return h ? l : k
    }
};
Gimme.Events = new
function () {
    var c = {},
        b = null,
        a = null;
    this.captureMouse = function (c) {
        Gimme.Events.releaseMouse();
        b = c;
        if (typeof c.setCapture !== "undefined") c.setCapture();
        else {
            a = function (b) {
                b.stopPropagation();
                var d, e;
                if (Gimme.Browser.isGecko) {
                    d = document.createEvent("MouseEvents");
                    d.initMouseEvent(b.type, b.bubbles, b.cancelable, window, b.detail, b.screenX, b.screenY, b.clientX, b.clientY, b.ctrlKey, b.altKey, b.shiftKey, b.metaKey, b.button, b.relatedTarget);
                    e = Gimme.Screen.getScrollPosition();
                    d.__defineGetter__("pageX", function () {
                        return this.clientX + e.x
                    });
                    d.__defineGetter__("pageY", function () {
                        return this.clientY + e.y
                    })
                } else d = b;
                document.removeEventListener(b.type, a, true);
                d.captureTarget = b.target;
                c.dispatchEvent(d);
                if (a !== null) document.addEventListener(b.type, a, true);
                delete d.captureTarget
            };
            document.addEventListener("mouseover", a, true);
            document.addEventListener("mouseout", a, true);
            document.addEventListener("mousemove", a, true);
            document.addEventListener("mouseup", a, true);
            document.addEventListener("mousedown", a, true);
            document.addEventListener("click", a, true);
            document.addEventListener("dblclick", a, true)
        }
        return this
    };
    this.releaseMouse = function () {
        if (b !== null) {
            if (typeof b.releaseCapture !== "undefined") b.releaseCapture();
            else {
                document.removeEventListener("mouseover", a, true);
                document.removeEventListener("mouseout", a, true);
                document.removeEventListener("mousemove", a, true);
                document.removeEventListener("mouseup", a, true);
                document.removeEventListener("mousedown", a, true);
                document.removeEventListener("click", a, true);
                document.removeEventListener("dblclick", a, true)
            }
            b = a = null
        }
        return this
    };
    this.getCaptureTarget = function (a) {
        return a.captureTarget || a.srcElement || a.target
    };
    Gimme.ext.onmouseenter = function (e, b, c) {
        var a = d(e);
        c ? this.addEvent("mouseover", a, b, false) : this.removeEvent("mouseover", a, b, false);
        a = null
    };
    Gimme.ext.onmouseleave = function (e, b, c) {
        var a = d(e);
        c ? this.addEvent("mouseout", a, b, false) : this.removeEvent("mouseout", a, b, false);
        a = null
    };
    Gimme.ext.onmousewheel = function (d, c, e) {
        var a = "mousewheel",
            b = d;
        if (Gimme.Browser.isGecko) {
            a = "DOMMouseScroll";
            b = f(d)
        }
        e ? this.addEvent(a, b, c, false) : this.removeEvent(a, b, c, false)
    };

    function e(c, a, b) {
        if (c === a) return false;
        var d = 0;
        while (a && a != c) {
            d++;
            a = a.parentNode
        }
        b = b || d;
        return a === c && b === d
    }
    function d(b) {
        var d = Gimme.Helper.getObjectGUID(b),
            a = c[d];
        if (typeof a === "undefined") a = c[d] = function (c) {
            var a = c.relatedTarget;
            if (this === a || e(this, a)) return;
            b.call(this, c)
        };
        return a
    }
    function f(b) {
        var d = Gimme.Helper.getObjectGUID(b),
            a = c[d];
        if (typeof a === "undefined") a = c[d] = function (a) {
            a.wheelDelta = -a.detail;
            b.call(this, a);
            a.wheelDelta = null
        };
        return a
    }
};
Gimme.ver = "Gimme v2.0.0.3 (Caspian) :: 12/2/2008, 9:57:48";
Gimme.ext.getRelativePosition = function (d, e) {
    var a = this.entities[e || 0],
        b = 0,
        c = 0;
    while (a !== null && a !== d) {
        b += a.offsetLeft;
        c += a.offsetTop;
        a = a.offsetParent
    }
    return {
        x: b,
        y: c
    }
};
Gimme.ext.addShim = function (d, e) {
    var b = this.entities[0];
    if (b.shim) {
        b.shim.parentNode.removeChild(b.shim);
        b.shim = null
    }
    var a = document.createElement("iframe");
    a.frameBorder = "0";
    a.scrolling = "no";
    a.className = "iframeShim";
    a.style.position = "absolute";
    a.style.zIndex = e || "1";
    a.style.background = "#fff";
    a.style.height = b.offsetHeight + "px";
    a.style.width = b.offsetWidth + "px";
    var c = g(b);
    a.style.top = c.getStyle("top");
    a.style.left = c.getStyle("left");
    a.style.marginTop = c.getStyle("marginTop");
    a.style.marginLeft = c.getStyle("marginLeft");
    a.style.marginRight = c.getStyle("marginRight");
    a.style.marginBottom = c.getStyle("marginBottom");
    this.entities.push(a);
    d = d || b;
    (d.parentNode || document.body).insertBefore(a, d);
    b.shim = a;
    return this
};
Gimme.ext.removeShim = function () {
    var b = this.entities[0],
        a = b.shim;
    if (a) {
        a.parentNode.removeChild(a);
        b.shim = null
    }
    return this
};
Gimme.ext.toggle = function (a) {
    if (a !== true) a = false;
    this.forEach(function (c) {
        var b = g(c);
        if (a) b.setStyle("visibility", b.getStyle("visibility") === "visible" ? "hidden" : "visible");
        else b.setStyle("display", b.getStyle("display") !== "none" ? "none" : "block")
    });
    return this
};

function MVC_Init_AbstractView_Shared() {
    Msn.MVC.AbstractView.prototype.GetMoveMenuOptionAsHtml = function (a) {
        return a
    }
}
function MVC_Init_View3D_Shared() {
    Msn.MVC.View3D.prototype.GetMoveMenuOptionAsHtml = function (d, c) {
        var e = c.GetPrimitiveCount();
        for (var a = 0; a < e; a++) {
            var b = c.GetPrimitive(a).type;
            if (b == VEShapeType.Polyline || b == VEShapeType.Polygon) return ""
        }
        return d
    }
}
function MVC_Init_ViewFacade_Shared() {
    Msn.MVC.ViewFacade.prototype.GetMoveMenuOptionAsHtml = function (a, b) {
        if (this._curMvcView == null) return "";
        return this._curMvcView.GetMoveMenuOptionAsHtml(a, b)
    }
}
function VE_SelectItem(b, a) {
    this.data = b;
    this.description = a
}
VE_SelectItem.prototype.toString = function () {
    return this.description
};

function VE_Select(h, l, k, j) {
    this.isVisible = false;
    var b = [],
        a = document.createElement("div");
    a.setAttribute("id", h);
    this.id = h;
    var v = h,
        d = this,
        c = -1,
        r = k ? k : "",
    m = l ? l : "",
    p = j ? j : "",
    e = "";

    function y(d) {
        if (! (d instanceof VE_SelectItem)) d = new VE_SelectItem(d, d.toString());
        b.push(d);
        var c = document.createElement("div");
        c.setAttribute("id", v + "_" + (b.length - 1));
        c.onclick = w;
        c.onmouseover = q;
        c.onmouseout = s;
        c.innerHTML = d.description;
        a.appendChild(c)
    }
    function x() {
        return b.length
    }
    function u() {
        return a
    }
    function w(e) {
        var c = GetTarget(e),
            a = f(c);
        i(a);
        if (d.OnClick) d.OnClick(a, b[a]);
        if (d.OnSelect) d.OnSelect(a, b[a])
    }
    function q(g) {
        var a = GetTarget(g),
            c = f(a);
        e = a.className;
        a.className = p;
        if (d.OnMouseOver) d.OnMouseOver(c, b[c])
    }
    function s(g) {
        var a = GetTarget(g),
            c = f(a);
        a.className = e;
        if (d.OnMouseOut) d.OnMouseOut(c, b[c])
    }
    function i(d) {
        if (d >= 0 && d < b.length) {
            var f = g();
            if (f >= 0) a.childNodes[f].className = m;
            c = d;
            a.childNodes[d].className = r;
            e = a.childNodes[d].className
        } else {
            var f = g();
            if (f >= 0) a.childNodes[f].className = m;
            c = -1
        }
    }
    function g() {
        return c
    }
    function o() {
        if (c >= 0 && c < b.length) return b[c];
        return null
    }
    function n(d) {
        if (d < 0 || d >= b.length) return;
        if (d < c) c -= 1;
        else if (d == c) c = -1;
        b.splice(d, 1);
        a.removeChild(a.childNodes[d])
    }
    function f(c) {
        for (var b = 0; b < a.childNodes.length; ++b) if (c == a.childNodes[b]) return b;
        return -1
    }
    function t() {
        while (b.length > 0) b.pop();
        while (a.childNodes.length > 0) a.removeChild(a.lastChild);
        c = -1
    }
    function A() {
        a.style.display = "block";
        this.isVisible = true
    }
    function z() {
        a.style.display = "none";
        this.isVisible = false
    }
    this.OnClick = null;
    this.GetCount = x;
    this.GetElement = u;
    this.GetSelectedIndex = g;
    this.GetSelectedItem = o;
    this.SelectItemAtIndex = i;
    this.OnSelect = null;
    this.AddItem = y;
    this.OnMouseOver = null;
    this.OnSelect = null;
    this.OnMouseOut = null;
    this.ClearItems = t;
    this.RemoveItemAtIndex = n;
    this.Show = A;
    this.Hide = z
}
function DecodeHtml(a) {
    var c = "";
    if (typeof a == "string" && a.length > 0) {
        var b = document.createElement("span");
        b.innerHTML = a;
        c = b.firstChild.nodeValue;
        b = null
    }
    return c
}
function OutputEncoder_URLEncodeUTF8(e) {
    if (e == null) return "";
    var d = ["%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07", "%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f", "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17", "%18", "%19", "%1a", "%1b", "%1c", "%1d", "%1e", "%1f", "%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27", "%28", "%29", "%2a", "%2b", "%2c", "%2d", "%2e", "%2f", "%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37", "%38", "%39", "%3a", "%3b", "%3c", "%3d", "%3e", "%3f", "%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47", "%48", "%49", "%4a", "%4b", "%4c", "%4d", "%4e", "%4f", "%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57", "%58", "%59", "%5a", "%5b", "%5c", "%5d", "%5e", "%5f", "%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67", "%68", "%69", "%6a", "%6b", "%6c", "%6d", "%6e", "%6f", "%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77", "%78", "%79", "%7a", "%7b", "%7c", "%7d", "%7e", "%7f", "%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87", "%88", "%89", "%8a", "%8b", "%8c", "%8d", "%8e", "%8f", "%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97", "%98", "%99", "%9a", "%9b", "%9c", "%9d", "%9e", "%9f", "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7", "%a8", "%a9", "%aa", "%ab", "%ac", "%ad", "%ae", "%af", "%b0", "%b1", "%b2", "%b3", "%b4", "%b5", "%b6", "%b7", "%b8", "%b9", "%ba", "%bb", "%bc", "%bd", "%be", "%bf", "%c0", "%c1", "%c2", "%c3", "%c4", "%c5", "%c6", "%c7", "%c8", "%c9", "%ca", "%cb", "%cc", "%cd", "%ce", "%cf", "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", "%d8", "%d9", "%da", "%db", "%dc", "%dd", "%de", "%df", "%e0", "%e1", "%e2", "%e3", "%e4", "%e5", "%e6", "%e7", "%e8", "%e9", "%ea", "%eb", "%ec", "%ed", "%ee", "%ef", "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7", "%f8", "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff"],
        b, a = [],
        g = e.length;
    for (var f = 0; f < g; f++) {
        var c = e.charCodeAt(f),
            b = e.charAt(f);
        if ("A" <= b && b <= "Z") a = a + b;
        else if ("a" <= b && b <= "z") a = a + b;
        else if ("0" <= b && b <= "9") a = a + b;
        else if (b == " ") a = a + "+";
        else if (b == "-" || b == "_" || b == "." || b == "!" || b == "~" || b == "*" || b == "'" || b == "(" || b == ")") a = a + String.fromCharCode(c);
        else if (c <= 127) a = a + d[c];
        else if (c <= 2047) {
            a = a + d[192 | c >> 6];
            a = a + d[128 | c & 63]
        } else {
            a = a + d[224 | c >> 12];
            a = a + d[128 | c >> 6 & 63];
            a = a + d[128 | c & 63]
        }
    }
    return a
}
function OutputEncoder_URLEncodeEscapeUTF8(e) {
    if (e == null) return "";
    var d = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1a", "1b", "1c", "1d", "1e", "1f", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3a", "3b", "3c", "3d", "3e", "3f", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4a", "4b", "4c", "4d", "4e", "4f", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5a", "5b", "5c", "5d", "5e", "5f", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b", "6c", "6d", "6e", "6f", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7a", "7b", "7c", "7d", "7e", "7f", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8a", "8b", "8c", "8d", "8e", "8f", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9a", "9b", "9c", "9d", "9e", "9f", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "aa", "ab", "ac", "ad", "ae", "af", "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "ba", "bb", "bc", "bd", "be", "bf", "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "ca", "cb", "cc", "cd", "ce", "cf", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "da", "db", "dc", "dd", "de", "df", "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8", "e9", "ea", "eb", "ec", "ed", "ee", "ef", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "fa", "fb", "fc", "fd", "fe", "ff"],
        b, a = [],
        g = e.length;
    for (var f = 0; f < g; f++) {
        var c = e.charCodeAt(f),
            b = e.charAt(f);
        if ("A" <= b && b <= "Z") a = a + b;
        else if ("a" <= b && b <= "z") a = a + b;
        else if ("0" <= b && b <= "9") a = a + b;
        else if (b == " ") a = a + "+";
        else if (b == "-" || b == "_" || b == "." || b == "!" || b == "~" || b == "*" || b == "'" || b == "(" || b == ")") a = a + String.fromCharCode(c);
        else if (c <= 127) a = a + "%" + d[c];
        else if (c <= 2047) {
            a = a + "%25" + d[192 | c >> 6];
            a = a + "%25" + d[128 | c & 63]
        } else {
            a = a + "%25" + d[224 | c >> 12];
            a = a + "%25" + d[128 | c >> 6 & 63];
            a = a + "%25" + d[128 | c & 63]
        }
    }
    return a
}
function OutputEncoder_EncodeHtml(c) {
    var a, b = "";
    if (c == null) return "";
    for (var d = 0; d < c.length; d++) {
        a = c.charCodeAt(d);
        if (a > 96 && a < 123 || a > 64 && a < 91 || a == 32 || a > 47 && a < 58 || a == 46 || a == 44 || a == 45 || a == 95) b = b + String.fromCharCode(a);
        else b = b + "&#" + a + ";"
    }
    return b
}
function OutputEncoder_EncodeHtmlAttribute(c) {
    var a, b = "";
    if (c == null) return "";
    for (var d = 0; d < c.length; d++) {
        a = c.charCodeAt(d);
        if (a > 96 && a < 123 || a > 64 && a < 91 || a > 47 && a < 58 || a == 46 || a == 44 || a == 45 || a == 95) b = b + String.fromCharCode(a);
        else b = b + "&#" + a + ";"
    }
    return b
}
function OutputEncoder_EncodeXml(a) {
    return OutputEncoder_EncodeHtml(a)
}
function OutputEncoder_EncodeXmlAttribute(a) {
    return OutputEncoder_EncodeHtmlAttribute(a)
}
function OutputEncoder_EncodeJs(c) {
    var a, b = "";
    if (c == null) return "";
    for (var d = 0; d < c.length; d++) {
        a = c.charCodeAt(d);
        if (a > 96 && a < 123 || a > 64 && a < 91 || a == 32 || a > 47 && a < 58 || a == 46 || a == 44 || a == 45 || a == 95) b = b + String.fromCharCode(a);
        else if (a > 127) b = b + "\\u" + OutputEncoder_TwoByteHex(a);
        else b = b + "\\x" + OutputEncoder_SingleByteHex(a)
    }
    return "'" + b + "'"
}
function OutputEncoder_EncodeVbs(d) {
    var b, a = "",
        c = false;
    if (d == null) return "";
    for (var e = 0; e < d.length; e++) {
        b = d.charCodeAt(e);
        if (b > 96 && b < 123 || b > 64 && b < 91 || b == 32 || b > 47 && b < 58 || b == 46 || b == 44 || b == 45 || b == 95) {
            if (!c) {
                a = a + '&"';
                c = true
            }
            a = a + String.fromCharCode(b)
        } else {
            if (c) {
                a = a + '"';
                c = false
            }
            a = a + "&chrw(" + b + ")"
        }
    }
    if (a.charAt(0) == "&") a = a.substring(1);
    if (a.length == 0) a = '""';
    if (c) a = a + '"';
    return a
}
function OutputEncoder_AsUrl(a) {
    if (a == null) return "";
    if (a.search(/^(?:http|https|ftp):\/\/[a-zA-Z0-9\.\-]+(?:\:\d{1,5})?(?:[A-Za-z0-9\.\;\:\@\&\=\+\$\,\?\/]|%u[0-9A-Fa-f]{4}|%[0-9A-Fa-f]{2})*$/i)) throw "Unsanitized value passed to AsUrl";
    return a
}
function OutputEncoder_QualifyUrl(a) {
    if (a == null) return "";
    if (a.search(/^(?:http|https|ftp):\/\//i)) if (document.location.protocol == "HTTPS") return "https://" + document.location.hostname + OutputEncoder_QualifyUrl_MakePath(a);
    else return "http://" + document.location.hostname + OutputEncoder_QualifyUrl_MakePath(a);
    else return a
}
function OutputEncoder_QualifyUrl_MakePath(a) {
    if (a == null) return "";
    if (!a.search(/^[\/\\]/)) return a;
    var b = /^(\/(?:.*\/|))(?:[^\/\\]*\.\w+|\w*)$/;
    if (!document.location.pathname.search(b)) {
        var c = b.exec(document.location.pathname);
        return c[1] + a
    }
    return "/" + a
}
function OutputEncoder_AsNumeric(a) {
    if (a == null) return "";
    if (isNaN(parseFloat(a))) throw "IOSec.AsNumeric(): Error input [" + a + "] not a valid number.";
    return a
}
function OutputEncode_TruncateUrlSafe(a, b, e) {
    if (a.length <= b) return a;
    var d = "";
    if (e && e.length > 0) {
        d = OutputEncoder_EncodeUrl(e);
        b -= d.length
    }
    var a = a.substring(0, b);
    for (var c = 1; c < 6; c++) if (a.charAt(b - c) == "%") {
        a = a.substring(0, b - c);
        break
    }
    return a + d
}
function OutputEncode_EncodeUrlDelims(f, c) {
    if (!f) return c;
    var a, h, b = "";
    for (var d = 0; d < c.length; d++) {
        a = c.charCodeAt(d);
        if (37 == a) {
            b = b + "%" + OutputEncoder_SingleByteHex(a);
            continue
        }
        var e = c.charAt(d);
        for (var g = 0; g < f.length; g++) {
            h = f.charCodeAt(g);
            if (h == a) {
                if (a > 127) e = "%u" + OutputEncoder_TwoByteHex(a);
                else e = "%" + OutputEncoder_SingleByteHex(a);
                break
            }
        }
        b += e
    }
    return b
}
function OutputEncoder_EncodeUrl(c) {
    if (c == null) return "";
    var a, e = c.length,
        b = new Array(e);
    for (var d = 0; d < e; ++d) {
        a = c.charCodeAt(d);
        if (a > 96 && a < 123 || a > 64 && a < 91 || a > 47 && a < 58 || a == 46 || a == 45 || a == 95) b.push(String.fromCharCode(a));
        else if (a > 127) {
            b.push("%u");
            b.push(OutputEncoder_TwoByteHex(a))
        } else {
            b.push("%");
            b.push(OutputEncoder_SingleByteHex(a))
        }
    }
    return b.join("")
}
function OutputEncoder_SingleByteHex(b) {
    if (b == null) return "";
    var a = b.toString(16);
    for (var c = a.length; c < 2; c++) a = "0" + a;
    return a
}
function OutputEncoder_TwoByteHex(b) {
    if (b == null) return "";
    var a = b.toString(16);
    for (var c = a.length; c < 4; c++) a = "0" + a;
    return a
}
function GetValidatedUrl(a) {
    if (a == null || a == "undefined" || a.length <= 0) return "";
    try {
        a = unescape(a);
        a = a.replace(/\|/g, " ").replace(/\^/g, " ").replace(/^\s+/g, "").replace(/\s+$/g, "");
        var b = new RegExp(/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/);
        if (a.match(b)) return a;
        else return ""
    } catch(c) {
        return ""
    }
}
function OutputEncoder() {
    this.GetValidatedUrl = GetValidatedUrl;
    this.EncodeHtml = OutputEncoder_EncodeHtml;
    this.EncodeHtmlAttribute = OutputEncoder_EncodeHtmlAttribute;
    this.EncodeXml = OutputEncoder_EncodeXml;
    this.EncodeXmlAttribute = OutputEncoder_EncodeXmlAttribute;
    this.EncodeJs = OutputEncoder_EncodeJs;
    this.EncodeVbs = OutputEncoder_EncodeVbs;
    this.AsNumeric = OutputEncoder_AsNumeric;
    this.EncodeUrl = OutputEncoder_EncodeUrl;
    this.EncodeUrlDelims = OutputEncode_EncodeUrlDelims;
    this.TruncateUrlSafe = OutputEncode_TruncateUrlSafe;
    this.SingleByteHex = OutputEncoder_SingleByteHex;
    this.TwoByteHex = OutputEncoder_TwoByteHex;
    this.AsUrl = OutputEncoder_AsUrl;
    this.QualifyUrl = OutputEncoder_QualifyUrl;
    this.EncodeUrlUTF8 = OutputEncoder_URLEncodeUTF8;
    this.EncodeUrlEscapeUTF8 = OutputEncoder_URLEncodeEscapeUTF8;
    this.DecodeHtml = DecodeHtml
}
var IOSec = new OutputEncoder;

function VE_Panel(c, q, r, o, m, f, d, n, p, l, s, t, e, h, i, j) {
    var b = this;
    this.index = 0;
    this.x = q;
    this.y = r;
    this.width = o;
    this.height = m;
    this.dynamicHeightMax = 600;
    this.color = f;
    this.sPanel = null;
    this.toolbarHeight = 20;
    this.footerHeight = 20;
    this.min = false;
    this.visible = true;
    this.onTitleClick = null;
    this.onCloseClick = null;
    this.onMaximize = null;
    this.onMinimize = null;
    this.isLegacyPanel = h == true;
    this.usesShimIn3D = !this.isLegacyPanel;
    if (!e) e = document.body;
    var a = null;
    if (!this.isLegacyPanel) {
        a = VE_Panel._CreateElement("div", c, "VE_Panel_el", d);
        this.el = a;
        this.titleDisabled = false;
        this.title = document.createElement("a");
        this.title.id = c + "_title";
        this.title.className = "VE_Panel_title";
        this.title.appendChild(document.createElement("span"));
        this.title.onclick = function (a) {
            VE_Panel._OnTitleClick(a);
            return false
        };
        this.title.href = "#";
        a.appendChild(this.title);
        this.SetTitle(n);
        this.closeboxDisabled = false;
        this.cb = VE_Panel._CreateElement("a", c + "_cb", "VE_Panel_cb VE_Panel_cb_" + f, d + 1);
        this.cb.onclick = function (a) {
            VE_Panel._OnCloseClick(a);
            return false
        };
        this.cb.onmouseover = function () {
            if (typeof Msn.VE.Css != "undefined") Msn.VE.Css.Functions.addClass(b.title, "VE_Panel_title_hover")
        };
        this.cb.onmouseout = function () {
            if (typeof Msn.VE.Css != "undefined") Msn.VE.Css.Functions.removeClass(b.title, "VE_Panel_title_hover")
        };
        this.cb.href = "#";
        this.cb.unselectable = "on";
        a.appendChild(this.cb);
        this.tb = VE_Panel._CreateElement("div", c + "_tb", "toolbar", d + 1);
        this.tb.unselectable = "on";
        a.appendChild(this.tb)
    } else {
        var k = $ID(c + "_tb");
        this.tb = VE_Panel._CreateElement("div", "", "", d + 1);
        k.appendChild(this.tb)
    }
    this.body = VE_Panel._CreateElement("div", c + "_body", "VE_Panel_body", d + 1);
    this.body.innerHTML = p;
    if (!this.isLegacyPanel) {
        a.appendChild(this.body);
        this.foot = VE_Panel._CreateElement("div", c + "_foot", "VE_Panel_foot VE_Panel_foot_" + f, d + 1);
        this.foot.innerHTML = l;
        this.foot.unselectable = "on";
        a.appendChild(this.foot)
    } else {
        a = this.body;
        this.el = a
    }
    VE_Panel.panels.push(this);
    if (i) {
        a.style.top = "0";
        a.style.left = "0";
        if (j) a.style.position = "absolute";
        else {
            a.style.display = "none";
            a.style.visibility = "hidden"
        }
    }
    e.appendChild(a);
    if (!Gimme.Browser.isKHTML) {
        var g = Gimme.id("TaskHost_CollectionsViewer_state");
        if (g !== null) e.appendChild(g)
    }
    this.Destroy = function () {
        if (a.parentNode) a.parentNode.removeChild(a);
        if (b.sPanel != null) b.sPanel.Destroy();
        if (a.shimElement && a.shimElement.parentNode) a.shimElement.parentNode.removeChild(a.shimElement);
        a.shimElement = null;
        var d = VE_Panel.panels;
        for (var c = 0; c < d.length; c++) if (d[c] == b) {
            d.splice(c, 1);
            break
        }
        if (!this.isLegacyPanel) {
            b.cb.onclick = b.cb.onmouseover = b.cb.onmouseout = null;
            b.title.onclick = null;
            b.cb = null;
            b.title = null;
            b.foot = null;
            b.onTitleClick = null;
            b.onCloseClick = null
        } else {
            var f = b.tb.parentNode;
            if (f) f.removeChild(b.tb)
        }
        b.tb = null;
        b.sPanel = null;
        b.body = null;
        b.onMaximize = null;
        a = b.el = null;
        b = null;
        e = null
    }
}
VE_Panel.panels = [];
VE_Panel.shadowThickness = 3;
VE_Panel._CreateElement = function (d, e, b, c) {
    var a = document.createElement(d);
    a.id = e;
    a.className = b;
    a.style.zIndex = c;
    return a
};
VE_Panel._PositionElement = function (a, d, e, c, b) {
    a.style.top = e + "px";
    a.style.left = d + "px";
    a.style.width = c + "px";
    a.style.height = b + "px"
};
VE_Panel.prototype.SetPosition = function (c, d, b, a) {
    this.x = c;
    this.y = d;
    this.width = b;
    this.height = a;
    if (map.IsModeEnabled(Msn.VE.MapActionMode.Mode3D) && this.usesShimIn3D) UpdateIFrameShim(this.el)
};
VE_Panel.prototype.SetToolbarSize = function (toolbarHeight) {
    this.toolbarHeight = toolbarHeight;
    var d = eval(toolbarHeight) > 0 ? "block" : "none";
    this.tb.style.display = d;
    this.Resize()
};
VE_Panel.prototype.SetFooterSize = function (footerHeight) {
    if (!this.isLegacyPanel) {
        this.footerHeight = footerHeight;
        var d = eval(footerHeight) > 0 ? "block" : "none";
        this.foot.style.display = d;
        this.Resize()
    }
};
VE_Panel.prototype.Resize = function () {
    if (typeof ve_globals != "undefined") {
        var geoFn = Msn.VE.Geometry.Functions,
            taskAreaHeight = Gimme.Screen.getViewportSize().y - g(ve_globals["taskArea"]).getScreenPosition().y - ve_globals["footer"].offsetHeight;
        if (taskAreaHeight >= 0 && typeof taskAreaHeight == "number") ve_globals["taskArea"].style.height = taskAreaHeight - 2 + "px";
        if (this.el.id == "contextMenu" || this.el.id == "scratchpad" || this.el.id == "annotationPanel" || this.el.id == "annotationPopup" || this.el.id == "searchPopup" || this.el.id == "help") {
            if (this.height != "auto" && typeof this.height == "number") this.el.style.height = eval(this.height) + "px";
            if (this.width != "auto" && typeof this.width == "number") this.el.style.width = eval(this.width) + "px";
            if (this.x != "auto" && typeof this.x == "number") this.el.style.left = eval(this.x) + "px";
            if (this.y != "auto" && typeof this.y == "number") this.el.style.top = eval(this.y) + "px"
        }
        if (this.el.shimElement) ShowShim(this.el)
    }
};
VE_Panel.prototype.SetHeightToFit = function () {
    var contentid = this.id + "_body_table",
        content = $ID(contentid);
    if (!content) return false;
    this.height = 0;
    var width = Math.max(eval(this.width), 100);
    if (content.offsetWidth > width - 14) this.height += scrollbarWidth;
    this.height += this.titleDisabled ? 14 : 21 + 14;
    this.height += this.toolbarHeight;
    this.height += content.offsetHeight;
    this.height += this.footerHeight;
    this.height = Math.min(this.dynamicHeightMax, this.height)
};
VE_Panel.prototype.DisableClosebox = function () {
    if (!this.isLegacyPanel) {
        if (this.closeboxDisabled) return;
        this.closeboxDisabled = true;
        this.el.removeChild(this.cb)
    }
};
VE_Panel.prototype.EnableClosebox = function () {
    if (!this.isLegacyPanel) {
        if (!this.closeboxDisabled) return;
        this.closeboxDisabled = false;
        this.el.appendChild(this.cb)
    }
};
VE_Panel.prototype.DisableTitle = function () {
    if (!this.isLegacyPanel) {
        if (this.titleDisabled) return;
        this.titleDisabled = true;
        this.el.removeChild(this.cb);
        this.el.removeChild(this.title)
    }
};
VE_Panel.prototype.EnableTitle = function () {
    if (!this.isLegacyPanel) {
        if (!this.titleDisabled) return;
        this.titleDisabled = false;
        this.el.insertBefore(this.cb, this.tb);
        this.el.insertBefore(this.title, this.cb)
    }
};
VE_Panel.prototype.SetTitle = function (c) {
    if (!this.isLegacyPanel) {
        var b = document.createTextNode(c),
            a = this.title.firstChild;
        if (a) if (a.firstChild) a.replaceChild(b, a.firstChild);
        else a.appendChild(b)
    }
};
VE_Panel.prototype.SetToolbar = function (a) {
    this.tb.innerHTML = a
};
VE_Panel.prototype.SetBody = function (a) {
    this.body.innerHTML = a
};
VE_Panel.prototype.SetDynamicBody = function (a) {
    this.body.innerHTML = '<table id="' + this.id + '_body_table"><tr><td>' + a + "</td></tr></table>"
};
VE_Panel.prototype.SetFooter = function (a) {
    if (!this.isLegacyPanel) this.foot.innerHTML = a
};
VE_Panel.prototype.SetOpacity = function (o) {
    if (o >= 100) o = 99.99;
    with(this.el.style) {
        filter = "alpha(opacity:" + o + ")";
        o *= .01;
        KHTMLOpacity = o;
        MozOpacity = o;
        opacity = o
    }
};
VE_Panel.prototype.SetColor = function (a) {
    if (!this.isLegacyPanel) {
        this.color = a;
        this.title.className = "VE_Panel_title VE_Panel_title_" + a;
        this.foot.className = "VE_Panel_foot VE_Panel_foot_" + a;
        this.cb.className = "VE_Panel_cb VE_Panel_cb_" + a
    }
};
VE_Panel.prototype.Minimize = function () {
    this.el.className = " VE_Panel_el_minimized";
    if (this.onMinimize) this.onMinimize(this._CreateEvent())
};
VE_Panel.prototype.Maximize = function () {
    this.el.className = "VE_Panel_el";
    if (this.onMaximize) this.onMaximize(this._CreateEvent());
    this.Resize()
};
VE_Panel.prototype.isMaximized = function () {
    return this.el.className == "VE_Panel_el"
};
VE_Panel.prototype.Show = function () {
    this.el.style.display = "block";
    this.visible = true;
    if (this.usesShimIn3D) mvcViewFacade.ShowShimIfSupported(this.el)
};
VE_Panel.prototype.Hide = function () {
    this.el.style.display = "none";
    this.visible = false;
    HideShim(this.el)
};
VE_Panel.prototype.IsVisible = function () {
    return this.el.style.display != "none"
};

function VE_PanelEvent(a) {
    this.srcPanel = a
}
VE_Panel.prototype._CreateEvent = function () {
    return new VE_PanelEvent(this)
};
VE_Panel._OnTitleClick = function (c) {
    if (!c) c = window.event;
    var d = GetTarget(c),
        b = VE_Panel.panels;
    for (var a = 0; a < b.length; a++) if (b[a].title == d || b[a].title == d.parentNode) {
        if (b[a].onTitleClick) b[a].onTitleClick(b[a]._CreateEvent());
        return
    }
};
VE_Panel._OnCloseClick = function (c) {
    if (!c) c = window.event;
    var d = GetTarget(c),
        b = VE_Panel.panels;
    for (var a = 0; a < b.length; a++) if (b[a].cb == d) {
        if (b[a].onCloseClick) b[a].onCloseClick(b[a]._CreateEvent());
        return
    }
};

function Ad(h, j, a, e, b, c, d, i, g, f, k) {
    this.title = h;
    this.url = j;
    this.description = a;
    this.latitude = e;
    this.longitude = b;
    this.address1 = c;
    this.address2 = d;
    this.city = i;
    this.state = g;
    this.country = f;
    this.zip = k
}
Ad.prototype.ToHtml = function () {
    var a = "<li>" + '<a href = "' + this.url + '" target = "_blank">' + IOSec.EncodeHtml(this.title) + "</a>" + "$AdDescription$" + "</li>";
    if (this.description && this.description.length > 0) a = a.replace("$AdDescription$", "<p>" + IOSec.EncodeHtml(this.description) + "</p>");
    return a
};
Ad.prototype.HasAddress = function () {
    return this.address1.length > 0 && this.city.length > 0 && this.state.length > 0 && this.zip.length > 0
};
Ad.prototype.GetAdDescription = function () {
    var a = this.description;
    if (this.HasAddress()) a = this.address1 + ", " + this.city + ", " + this.state + " " + this.zip;
    return a
};
Msn.VE.DirectionsDecoder = function () {
    var a = 4,
        b = 1000000;

    function e(a, c, m, l) {
        if (!a || a.length < c) return [];
        var k = a.length - a.length % c,
            i = [],
            f = false,
            b = 0,
            j = c - 1;
        for (var d = 0; d < k; d++) {
            var e = a.charCodeAt(d),
                h = d % c;
            if (l && h == 0) {
                f = e & 128;
                e &= 127
            }
            b |= e;
            if (h == j) {
                var g = b / m;
                i.push(f ? -g : g);
                b = 0;
                f = false
            } else b <<= 8
        }
        return i
    }
    function d(c) {
        return e(c, a, b, true)
    }
    function c(c) {
        var l = true;
        if (!c || c.length < a) return [];
        var j = [],
            g = false,
            d = 0,
            k = a - 1,
            m = c.length;
        for (var e = 0; e < m; ++e) {
            var f = c[e],
                i = e % a;
            if (l && i == 0) {
                g = f & 128;
                f &= 127
            }
            d |= f;
            if (i == k) {
                var h = d / b;
                j.push(g ? -h : h);
                d = 0;
                g = false
            } else d <<= 8
        }
        return j
    }
    this.DecodeCoordinatesString = d;
    this.DecodeCoordinatesByteArray = c
};
var HelpHistory = [];

function VE_Help() {}
VE_Help.helpZIndex = 31;
VE_Help.introZIndex = 31;
VE_Help.introPanel = null;
VE_Help.helpPanel = null;
VE_Help.margins = 110;
VE_Help.LiveHelp = new
function () {
    this.Keyword = "keyword";
    this.Search = "search";
    this.Topic = "topic"
};
VE_Help.CreateHelpPanel = function () {
    VE_Help.CreateSizedHelpPanel(220, 160, windowWidth <= 430 ? 300 : windowWidth - 430, windowHeight <= 220 ? 200 : windowHeight - 220)
};
VE_Help.CreateSizedHelpPanel = function (e, f, c, b) {
    if (typeof VE_Help.helpPanel != "undefined" && VE_Help.helpPanel != null) {
        VE_Help.helpPanel.SetBody("");
        VE_Help.helpPanel.Destroy();
        VE_Help.helpPanel = null
    }
    var d = '<iframe id="helpFrame" src="about:blank" width="100%" height="100%" allowtransparency="true" frameborder="0"></iframe>',
        a = new VE_Panel("help", e, f, c <= 300 ? 300 : c, b <= 200 ? 200 : b, "blue", VE_Help.helpZIndex, L_Help_Text, d, "", null, null, null, null, true, null);
    a.body.className = "VE_Panel_body_help";
    a.Hide();
    a.el.style.visibility = "";
    a.SetToolbarSize(0);
    a.SetFooterSize(0);
    a.onCloseClick = function () {
        VE_Help.DisablePreventLayer();
        VE_Help.ClosePanel()
    };
    VE_Help.helpPanel = a
};
VE_Help.EnablePreventLayer = function () {
    var a = $ID("__preventLayer__");
    if (!a) a = document.createElement("div");
    a.id = "__preventLayer__";
    a.className = "preventLayer";
    document.body.appendChild(a)
};
VE_Help.DisablePreventLayer = function () {
    var a = $ID("__preventLayer__");
    if (a) document.body.removeChild(a)
};
VE_Help.EnableDrawingPreventLayer = function () {
    var c = $ID("msve_header");
    if (c) {
        var b = $ID("__preventLayerHeader__");
        if (!b) b = document.createElement("div");
        b.id = "__preventLayerHeader__";
        b.className = "preventLayer";
        b.style.left = c.clientLeft;
        b.style.top = c.clientTop;
        b.style.width = c.clientWidth;
        b.style.height = c.clientHeight;
        document.body.appendChild(b)
    }
    var d = $ID("sb_foot");
    if (d) {
        var a = $ID("__preventLayerFooter__");
        if (!a) a = document.createElement("div");
        a.id = "__preventLayerFooter__";
        a.className = "preventLayer";
        a.style.left = 0;
        a.style.top = GetWindowHeight() - d.clientHeight;
        a.style.width = d.clientWidth;
        a.style.height = d.clientHeight;
        document.body.appendChild(a)
    }
};
VE_Help.DisableDrawingPreventLayer = function () {
    var d = $ID("__preventLayerHeader__");
    if (d) document.body.removeChild(d);
    var b = $ID("__preventLayerTaskArea__");
    if (b) document.body.removeChild(b);
    var a = $ID("__preventLayerActionBar__");
    if (a) document.body.removeChild(a);
    var c = $ID("__preventLayerFooter__");
    if (c) document.body.removeChild(c)
};

function findPosX(a) {
    var b = 0;
    if (a.offsetParent) while (a.offsetParent) {
        b += a.offsetLeft;
        a = a.offsetParent
    } else if (a.x) b += a.x;
    return b
}
function findPosY(a) {
    var b = 0;
    if (a.offsetParent) while (a.offsetParent) {
        b += a.offsetTop;
        a = a.offsetParent
    } else if (a.y) b += a.y;
    return b
}
VE_Help.Open = function (b, c) {
    VE_Help.EnablePreventLayer();
    VE_Help.helpPanel.Show();
    VE_Help.helpPanel.SetTitle(b);
    VE_Help.helpPanel.SetBody('<iframe id = "helpFrame" src = "about:blank" width = "100%" allowtransparency = "true" scrolling = "auto" frameborder = "0"></iframe>');
    var a = $ID("helpFrame");
    a.src = c;
    VE_Help.Redraw()
};
VE_Help.OpenSized = function (f, g, a, b) {
    var d = GetWindowWidth(),
        c = GetWindowHeight();
    if (a > d - 10) a = d - 10;
    if (b > c - 10) b = c - 10;
    VE_Help.CreateSizedHelpPanel((d - a) / 2, (c - b) / 2, a, b);
    VE_Help.EnablePreventLayer();
    VE_Help.helpPanel.Show();
    VE_Help.helpPanel.SetTitle(f);
    VE_Help.helpPanel.SetBody('<iframe id = "helpFrame" src = "about:blank" width = "100%" allowtransparency = "true" scrolling = "no" frameborder = "0"></iframe>');
    var e = $ID("helpFrame");
    e.src = g
};
VE_Help.OpenLiveHelp = function (b, a, c) {
    var g = "_live_help",
        f = 550,
        e = 575,
        i = (screen.availWidth - f) * .5,
        j = (screen.availHeight - e) * .5,
        h = "resizable=yes,top=" + j + ",width=" + f + ",height=" + e + ",left=" + i;
    if (typeof b == "undefined" || b == null || b == "") b = liveLocalHelpProjectCode;
    if (typeof a == "undefined" || a == null || a == "") a = VE_Help.LiveHelp.Keyword;
    if (typeof c == "undefined" || c == null || c == "") c = "qaf";
    var k = liveHelpUrl + "&project=" + b + "&querytype=" + a + "&query=" + c,
        d = window.open(k, g, h);
    if (d != null && typeof d == "object") d.focus()
};
VE_Help.Redraw = function () {
    var b = VE_Help.helpPanel;
    if (!b) return;
    var c = Gimme.Screen.getViewportSize(),
        a = g(b.el);
    a.setStyle("top", (c.height - a.element().offsetHeight) / 2 + "px");
    a.setStyle("left", (c.width - a.element().offsetWidth) / 2 + "px");
    ShowShim(b.el)
};
VE_Help.CloseIntro = function () {
    if (VE_Help.introPanel) VE_Help.introPanel.Hide()
};
VE_Help.ClosePanel = function () {
    if (VE_Help.helpPanel) {
        VE_Help.helpPanel.Hide();
        VE_Help.DisablePreventLayer()
    }
};
VE_Help.Destroy = function () {
    if (VE_Help.introPanel) {
        VE_Help.introPanel.Destroy();
        VE_Help.introPanel = null
    }
    if (VE_Help.helpPanel) {
        VE_Help.helpPanel.Destroy();
        VE_Help.helpPanel = null
    }
};

function SanitizeHtmlString(a) {
    if (!a || typeof a != "string") return a;
    return IOSec.EncodeHtml(a)
}
function GetTarget(b) {
    if (!b) b = window.event;
    var a = null;
    if (b.srcElement) a = b.srcElement;
    else if (b.target) a = b.target;
    if (a && a.nodeType) {
        if (b.capturedTarget) a = b.capturedTarget;
        if (a.nodeType == 3) a = a.parentNode
    }
    return a
}
function SelectText(a, c, d) {
    if (!a) return;
    if (a.createTextRange) {
        var b = a.createTextRange();
        b.moveStart("character", c);
        b.moveEnd("character", d);
        b.select()
    } else if (a.setSelectionRange) a.setSelectionRange(c, d)
}
function SelectedTextLength(a) {
    if (!a) return 0;
    if (a.document) {
        var b = a.document.selection.createRange();
        return b.text.length
    } else {
        var c = a.selectionStart,
            d = a.selectionEnd;
        return d - c
    }
}
function GetXMLText(a) {
    if (a.text) return a.text;
    else if (a.textContent) return a.textContent;
    else if (a.firstChild && a.firstChild.data) return a.firstChild.data;
    return ""
}
function VEValidator() {}
VEValidator.ValidateFloat = function (b, c) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a == "") a = "VEValidator.ValidateFloat";
    if (b == null || b == "undefined") throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "float"));
    try {
        if (isNaN(parseFloat(b))) throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "float"));
        return true
    } catch(d) {
        throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "float"))
    }
};
VEValidator.ValidateInt = function (b, c) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a == "") a = "VEValidator.ValidateInt";
    if (b == null || b == "undefined") throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "int"));
    try {
        if (isNaN(parseInt(b)) || parseFloat(b) != parseInt(b)) throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "int"));
        return true
    } catch(d) {
        throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "int"))
    }
};
VEValidator.ValidateNonNegativeInt = function (a, c) {
    var b = "";
    if (arguments != null && arguments.caller != null) b = VEValidator.GetCaller(arguments.caller);
    if (b == "") b = "VEValidator.ValidateNonNegativeInt";
    if (a == null || a == "undefined") throw new VEException(b, "err_invalidargument", L_invalidnonnegativeint_text.replace("%1", c));
    try {
        if (isNaN(parseInt(a)) || parseFloat(a) != parseInt(a) || parseInt(a) < 0) throw new VEException(b, "err_invalidargument", L_invalidnonnegativeint_text.replace("%1", c));
        return true
    } catch(d) {
        throw new VEException(b, "err_invalidargument", L_invalidnonnegativeint_text.replace("%1", c))
    }
};
VEValidator.ValidateFunction = function (b, c) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a == "") a = "VEValidator.ValidateFunction";
    if (b == null || typeof b != "function") throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "function"))
};
VEValidator.ValidateNonNull = function (b, c) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a == "") a = "VEValidator.ValidateNonNull";
    if (b == null || b == "undefined") throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "non null"))
};
VEValidator.ValidateBetween = function (b, e, d, c) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a == "") a = "VEValidator.ValidateBetween";
    if (b < d || b > c) throw new VEException(a, "err_invalidargument", L_invalidbetweenint_text.replace("%1", e).replace("%2", d).replace("%3", c))
};
VEValidator.ValidateBoolean = function (b, c) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a == "") a = "VEValidator.ValidateBoolean";
    if (b != true && b != false) throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "bool"))
};
VEValidator.ValidateMapStyle = function (a, c) {
    var b = "";
    if (arguments != null && arguments.caller != null) b = VEValidator.GetCaller(arguments.caller);
    if (b == "") b = "VEValidator.ValidateMapStyle";
    if (a == null || a == "undefined") throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "MapStyle"));
    if (a == "r" || a == "R" || $MVEM.IsEnabled(MapControl.Features.MapStyle.Shaded) && (a == "s" || a == "S") || $MVEM.IsEnabled(MapControl.Features.MapStyle.Aerial) && (a == "a" || a == "A") || $MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye) && (a == "o" || a == "O") || $MVEM.IsEnabled(MapControl.Features.MapStyle.BirdsEye) && (a == "b" || a == "B") || $MVEM.IsEnabled(MapControl.Features.MapStyle.Hybrid) && (a == "h" || a == "H")) return true;
    throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "MapStyle"))
};
VEValidator.ValidateClusteringType = function (a, c) {
    var b = "";
    if (arguments != null && arguments.caller != null) b = VEValidator.GetCaller(arguments.caller);
    if (b == "") b = "VEValidator.ValidateClusteringType";
    if (a == null || a == "undefined") throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "ClusteringType"));
    if (typeof a == "number" && (a == VEClusteringType.None || a == VEClusteringType.Grid)) return true;
    throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "ClusteringType"))
};
VEValidator.ValidateMapMode = function (b, c) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a = "") a = "VEValidator.ValidateMapMode";
    if (b == null || b == "undefined") throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "MapMode"));
    if (b == VEMapMode.Mode2D || $MVEM.IsEnabled(MapControl.Features.MapStyle.View3D) && b == VEMapMode.Mode3D) return true;
    throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "MapMode"))
};
VEValidator.ValidateDistanceUnit = function (b, c) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a == "") a = "VEValidator.ValidateDistanceUnit";
    if (b == null || b == "undefined") throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEDistanceUnit"));
    if (b == VEDistanceUnit.Miles || b == VEDistanceUnit.Kilometers) return true;
    throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEDistanceUnit"))
};
VEValidator.ValidateMaxZoom = function (b, c) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a == "") a = "VEValidator.ValidateMaxZoom";
    if (b == null || b == "undefined") throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "ValidateMaxZoom"));
    if (b <= Msn.VE.API.Globals.vemaxzoom) return true;
    throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "ValidateMaxZoom"))
};
VEValidator.ValidateLayerType = function (a, c) {
    var b = "";
    if (arguments != null && arguments.caller != null) b = VEValidator.GetCaller(arguments.caller);
    if (b == "") b = "VEValidator.ValidateLayerType";
    if (a == null || a == "undefined") throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEDataType"));
    if (a == VEDataType.GeoRSS || a == VEDataType.VECollection || a == VEDataType.VETileSource) return true;
    throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEDataType"))
};
VEValidator.ValidateDashboardSize = function (a, c) {
    var b = "";
    if (arguments != null && arguments.caller != null) b = VEValidator.GetCaller(arguments.caller);
    if (b == "") b = "VEValidator.ValidateDashboardSize";
    if (a == null || a == "undefined") throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEDashboardSize"));
    if (a == VEDashboardSize.Normal || a == VEDashboardSize.Small || a == VEDashboardSize.Tiny) return true;
    throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEDashboardSize"))
};
VEValidator.ValidateMiniMapSize = function (b, c) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a == "") a = "VEValidator.ValidateMiniMapSize";
    if (b == null || b == "undefined") throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEMiniMapSize"));
    if (b == VEMiniMapSize.Small || b == VEMiniMapSize.Large) return true;
    throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEMiniMapSize"))
};
VEValidator.ValidateAltitudeMode = function (b, c) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a == "") a = "VEValidator.ValidateAltitudeMode";
    if (b == null) throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEAltitudeMode"));
    if (b != VEAltitudeMode.Absolute && b != VEAltitudeMode.RelativeToGround) throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEAltitudeMode"));
    return true
};
VEValidator.ValidateObject = function (b, c, e, d) {
    var a = "";
    if (arguments != null && arguments.caller != null) a = VEValidator.GetCaller(arguments.caller);
    if (a == "") a = "VEValidator.ValidateObject";
    if (b == null || b == "undefined") throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "non null"));
    if (! (b instanceof e)) throw new VEException(a, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", d))
};
VEValidator.ValidateObjectArray = function (a, d, f, e) {
    var b = "";
    if (arguments != null && arguments.caller != null) b = VEValidator.GetCaller(arguments.caller);
    if (b == "") b = "VEValidator.ValidateObject";
    if (a == null || typeof a == "undefined" || a.length == null || typeof a.length == "undefined") throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", d).replace("%2", "array"));
    for (var c = 0; c < a.length; ++c) if (a[c] == null || typeof a[c] == "undefined" || !(a[c] instanceof f)) throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", d).replace("%2", e))
};
VEValidator.ValidateOrientation = function (a, c) {
    var b = "";
    if (arguments != null && arguments.caller != null) b = VEValidator.GetCaller(arguments.caller);
    if (b == "") b = "VEValidator.ValidateOrientation";
    if (a == null || a == "undefined") throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEOrientation"));
    if (a != VEOrientation.North && a != VEOrientation.East && a != VEOrientation.West && a != VEOrientation.South) throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VEOrientation"))
};
VEValidator.ValidateCacheMode = function (a, b) {
    var c = "VEValidator.ValidateCacheMode";
    if (a == null || a == "undefined") throw new VEException(c, "err_invalidargument", L_invalidargument_text.replace("%1", b).replace("%2", "VECacheMode"));
    if (a != VECacheMode.Auto && a != VECacheMode.EnableTileCaching) throw new VEException(c, "err_invalidargument", L_invalidargument_text.replace("%1", b).replace("%2", "VECacheMode"))
};
VEValidator.ValidateBounds = function (a, c) {
    var b = "";
    if (arguments != null && arguments.caller != null) b = VEValidator.GetCaller(arguments.caller);
    if (b == "") b = "VEValidator.ValidateBounds";
    if (a == null || a == "undefined") throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VELatLongRectangle"));
    if (a.TopLeftLatLong == null || a.BottomRightLatLong == null || a.TopLeftLatLong.Latitude <= a.BottomRightLatLong.Latitude || a.TopLeftLatLong.Longitude >= a.BottomRightLatLong.Longitude) throw new VEException(b, "err_invalidargument", L_invalidargument_text.replace("%1", c).replace("%2", "VELatLongRectangle"))
};
VEValidator.GetCaller = function () {
    return ""
};

function VEPushpin(f, e, d, h, g, c, b, a) {
    VEValidator.ValidateNonNull(f, "pinId");
    VEValidator.ValidateNonNull(e, "veLatLong");
    var i = this;
    this.IsInLayer = false;
    this.ID = f;
    this.LatLong = e;
    this.Title = h;
    if (d == null || d == "undefined" || d.length == 0) this.Iconurl = Msn.VE.API.Constants.iconurl;
    else this.Iconurl = d;
    this.Details = g;
    if (c == null || c == "undefined" || c.length == 0) this.IconStyle = "";
    else this.IconStyle = c;
    if (b == null || b == "undefined" || b.length == 0) this.TitleStyle = "VE_Pushpin_Popup_Title";
    else this.TitleStyle = b;
    if (a == null || a == "undefined" || a.length == 0) this.DetailsStyle = "VE_Pushpin_Popup_Body";
    else this.DetailsStyle = a;
    if (window.ero == null || window.ero == "undefined") window.ero = ERO.getInstance()
}
VEPushpin.ShowDetailOnMouseOver = true;
VEPushpin.OnMouseOverCallback = null;
VEPushpin.prototype.Dispose = function () {
    this.DetailsStyle == null;
    this.TitleStyle = null;
    this.IconStyle = null;
    this.Details = null;
    this.IconUrl = null;
    this.Title = null;
    this.LatLong = null;
    this.ID = null;
    this.m_vemapcontrol = null;
    this.m_vemap = null
};
VEPushpin.Hide = function (a) {
    if (window.ero != null) {
        if (a == "undefined" || a == null) a = false;
        window.ero.hide(a)
    }
};
VEPushpin.GetEroContent = function (c, b, e, d) {
    var a = "<p>";
    if (c != null && c != "undefined" && c.length > 0) a += '<div class="' + e + '">' + unescape(c) + "</div>";
    if (b != null && b != "undefined" && b.length > 0) a += '<div class="' + d + '">' + unescape(b) + "</div>";
    if (!document.all && (c.length == 0 || b.length == 0)) a += "<br/><br/>";
    a += "</p>";
    return a
};
VEPushpin.Show = function (l, m, k, h, d, c, g, e) {
    var a = VEMap._GetMapFromGUID(l);
    if (a == null || a == "undefined") return;
    var i = a.vemapcontrol.GetX(h) + a.GetLeft(),
        j = a.vemapcontrol.GetY(k) + a.GetTop();
    if (VEPushpin.ShowDetailOnMouseOver) {
        var b = $ID(m + "_" + a.GUID);
        if (b != null && b != "undefined") {
            var f = VEPushpin.GetEroContent(d, c, g, e);
            window.ero.setContent(f);
            window.ero.setBoundingArea(null);
            window.ero.getBoundingArea().move(Gimme.Screen.getScrollPosition());
            window.ero.dockToElement(b)
        }
    }
    if (VEPushpin.OnMouseOverCallback != null) VEPushpin.OnMouseOverCallback(i, j, d, unescape(c))
};
VEPushpin.Show3D = function (a, c, b, f, d) {
    if (VEPushpin.ShowDetailOnMouseOver) {
        var e = VEPushpin.GetEroContent(c, b, f, d);
        window.ero.setContent(e);
        ero.setGlitz(false, false, false, true);
        window.ero.dockToRect(a, null, -1)
    }
    if (VEPushpin.OnMouseOverCallback != null) VEPushpin.OnMouseOverCallback(a.getP1().x, a.getP1().y, c, unescape(b))
};

function GetContent() {
    var g = this.ID + "_" + this.m_vemap.GUID,
        a = "<img class='" + this.IconStyle + "' src='" + this.Iconurl + "' id='" + g + "' ",
        f = Msn.VE.Environment.BrowserInfo;
    if (f.Type == Msn.VE.BrowserType.MSIE && parseFloat(f.MajorVersion) < 7 && this.Iconurl != null && this.Iconurl.search(/.gif$/) < 0) a += 'onload=\'this.onload="";if(this.fileSize!=-1){this.style.width=this.width;this.style.height=this.height;this.src="' + Msn.VE.API.Constants.spacerurl + '";this.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\\"' + this.Iconurl + '\\", sizingMethod=\\"scale\\")";}\' ';
    var e = this.Title != null && this.Title != "undefined" && this.Title.length > 0,
        d = this.Details != null && this.Details != "undefined" && this.Details.length > 0;
    if (e || d) {
        var b = "if (VEMap._GetMapFromGUID(" + this.m_vemap.GUID + ").FireEvent(",
            c = "))return;";
        a += " onmouseout='" + b + '"onmouseout"' + c + "VEPushpin.Hide();' ";
        a += " onmousedown='" + b + '"onmousedown"' + c + "VEPushpin.Hide(true);' ";
        a += " onmouseover='" + b + '"onmouseover"' + c + 'VEPushpin.Show("' + this.m_vemap.GUID + '","' + this.ID + '",' + this.LatLong.Latitude + "," + this.LatLong.Longitude;
        if (e) a += ', "' + escape(this.Title) + '"';
        else a += ',""';
        if (d) a += ', "' + escape(this.Details) + '"';
        else a += ',""';
        a += ',"' + this.TitleStyle + '"';
        a += ',"' + this.DetailsStyle + '"';
        a += ");' "
    }
    a += "/>";
    return a
}
VEPushpin.DisposeERO = function () {
    if (window.ero != null && window.ero != "undefined") {
        window.ero.destroy();
        window.ero = null
    }
};
VEPushpin.prototype._SetMapInstance = function (a) {
    this.m_vemap = a;
    this.m_vemapcontrol = a.vemapcontrol
};
VEPushpin.prototype.GetContent = GetContent;

function GetImageFullUrl(a) {
    var b = "";
    if (a && a.constructor == String && a.length > 0) {
        var c = new Image;
        c.src = a;
        b = c.src
    }
    return b
}
function VE_ScratchpadManager() {}
VE_ScratchpadManager.AddGeoLocation = function () {
    return
};
VE_ScratchpadManager.AddLocation = VE_ScratchpadManager.AddGeoLocation;
VE_Scratchpad = VE_ScratchpadManager;

function VEMessage(b) {
    VEValidator.ValidateObject(b, "vemap", VEMap, "VEMap");
    this.m_vemap = b;
    var a = this;
    this.Show = function (g) {
        if (g == null || g == "undefined" || g.length <= 0) return;
        g = c(g);
        if (this.vemessagepanel == null || this.vemessagepanel == "undefined") {
            var d = document.createElement("div");
            d.id = this.m_vemap.ID + "_vemessagepanel";
            d.className = "VE_Message";
            d.style.zIndex = Msn.VE.API.Globals.vemessagepanelzIndex;
            var i = this.m_vemap.GetHeight() / 2 - Msn.VE.API.Globals.vemessagepanelheight / 2;
            if (i < 0) i = 0;
            d.style.top = i + "px";
            d.style.left = 30 + "px";
            var h = this.m_vemap.GetWidth() - 60;
            if (h < 30) h = 30;
            d.style.width = h + "px";
            d.style.height = Msn.VE.API.Globals.vemessagepanelheight + "px";
            d.style.position = "absolute";
            this.vemessagepanel = d;
            var e = document.createElement("a");
            e.className = "VE_Message_Title";
            e.style.zIndex = parseInt(Msn.VE.API.Globals.vemessagepanelzIndex) + 1;
            e.style.top = "1px";
            e.style.left = "1px";
            e.style.width = parseInt(this.vemessagepanel.style.width) - 5 + "px";
            e.innerHTML = IOSec.EncodeHtml(L_error_text);
            e.unselectable = "on";
            this.vemessagepanel.appendChild(e);
            var f = document.createElement("a");
            f.className = "VE_Message_Close";
            f.style.zIndex = parseInt(Msn.VE.API.Globals.vemessagepanelzIndex) + 2;
            f.style.top = "1px";
            f.style.right = "1px";
            f.onclick = a.Hide;
            f.unselectable = "on";
            f.innerHTML = L_close_text;
            this.vemessagepanel.appendChild(f);
            var b = document.createElement("div");
            b.id = this.m_vemap.ID + "_vemessagepanel_body";
            b.className = "VE_Message_Body";
            b.style.zIndex = parseInt(Msn.VE.API.Globals.vemessagepanelzIndex) + 3;
            b.style.top = 22 + "px";
            b.style.left = 0 + "px";
            b.style.width = parseInt(this.vemessagepanel.style.width) - 8 + "px";
            b.onclick = a.Hide;
            b.unselectable = "on";
            b.innerHTML = g;
            this.vemessagepanel.appendChild(b);
            this.m_vemap.AddControl(this.vemessagepanel, Msn.VE.API.Globals.vemessagepanelzIndex)
        } else {
            var b = $ID(this.m_vemap.ID + "_vemessagepanel_body");
            b.innerHTML = g
        }
        this.vemessagepanel.style.display = "block";
        mvcViewFacade.ShowShimIfSupported(this.vemessagepanel);
        this.timeoutIntervalID = window.setInterval(this.Hide, 10000)
    };
    this.Hide = function () {
        if (a.vemessagepanel != null && a.vemessagepanel != "undefined") {
            a.vemessagepanel.style.display = "none";
            HideShim(a.vemessagepanel);
            if (a.timeoutIntervalID != null) {
                window.clearInterval(a.timeoutIntervalID);
                a.timeoutIntervalID = null
            }
        }
    };
    this.Dispose = function () {
        if (this.vemessagepanel != null && this.vemessagepanel != "undefined") this.vemessagepanel = null
    };

    function c(a) {
        var b = /<a[^>]*>/gi;
        a = a.replace(b, "");
        b = /<\/a>/gi;
        a = a.replace(b, "");
        return a
    }
}
function VEAmbiguouslist(vemap) {
    VEValidator.ValidateNonNull(vemap, "vemap");
    this.m_vemap = vemap;
    var self = this;
    this.ID = this.m_vemap.ID + "_veplacelistpanel";
    this.Show = function (a, onSelectCallback, callbackOnClose) {
        var body = null,
            veambiglistHide = "VEMap._GetMapFromGUID('" + this.m_vemap.GUID + "').m_veambiguouslist.Hide();",
            veambiglistSetViewport = "VEMap._GetMapFromGUID('" + this.m_vemap.GUID + "').vemapcontrol.SetViewport";
        if (this.veplacelistpanel == null || this.veplacelistpanel == "undefined") {
            var e = document.createElement("div");
            e.id = this.ID;
            e.className = "VE_PlaceList";
            e.style.top = this.m_vemap.GetHeight() / 2 - Msn.VE.API.Globals.veplacelistpanelheight / 2 + "px";
            e.style.left = this.m_vemap.GetWidth() / 2 - Msn.VE.API.Globals.veplacelistpanelwidth / 2 + "px";
            e.style.width = Msn.VE.API.Globals.veplacelistpanelwidth + "px";
            e.style.height = Msn.VE.API.Globals.veplacelistpanelheight + "px";
            e.style.position = "absolute";
            this.veplacelistpanel = e;
            var title = document.createElement("a");
            title.className = "VE_PlaceList_Title";
            title.style.zIndex = parseInt(Msn.VE.API.Globals.veplacelistpanelzIndex) + 1;
            title.style.width = parseInt(Msn.VE.API.Globals.veplacelistpanelwidth) - 5 + "px";
            title.style.top = "1px";
            title.style.left = "1px";
            title.style.height = "20px";
            title.innerHTML = IOSec.EncodeHtml(L_selectlocation_text);
            title.unselectable = "on";
            this.veplacelistpanel.appendChild(title);
            var cb = document.createElement("a");
            cb.className = "VE_PlaceList_Close";
            cb.id = this.m_vemap.ID + "_veplaceListclose";
            cb.style.zIndex = parseInt(Msn.VE.API.Globals.veplacelistpanelzIndex) + 2;
            cb.style.top = "1px";
            cb.style.right = "1px";
            cb.unselectable = "on";
            cb.innerHTML = L_close_text;
            this.veplacelistpanel.appendChild(cb);
            body = document.createElement("div");
            body.id = this.m_vemap.ID + "_veplacelistbody";
            body.style.zIndex = 300;
            body.style.height = Msn.VE.API.Globals.veplacelistpanelheight - 38 + "px";
            body.style.width = Msn.VE.API.Globals.veplacelistpanelwidth - 8 + "px";
            body.className = "VE_PlaceList_Body";
            this.veplacelistpanel.appendChild(body);
            this.m_vemap.AddControl(this.veplacelistpanel, Msn.VE.API.Globals.veplacelistpanelzIndex)
        } else body = $ID(this.m_vemap.ID + "_veplacelistbody");
        var cb = $ID(this.m_vemap.ID + "_veplaceListclose");
        if (callbackOnClose == true) cb.onclick = function () {
            eval(veambiglistHide + onSelectCallback + "();")
        };
        else cb.onclick = self.Hide;
        body.innerHTML = "";
        for (var i = 0; i < a.length; i++) {
            if (a[i] == null || a[i] == "undefined") continue;
            var loc = document.createElement("div");
            loc.id = "veplacelistpanel_body_loc" + i;
            loc.className = "VE_PlaceList_Location";
            loc.style.position = "relative";
            loc.style.zIndex = parseInt(Msn.VE.API.Globals.veplacelistpanelzIndex) + 4;
            loc.unselectable = "on";
            if (a[i].name) if (onSelectCallback != null && onSelectCallback != "undefined") loc.innerHTML = '<a onclick="javascript:' + veambiglistHide + onSelectCallback + "('" + a[i].name + "', " + a[i].latitude + ", " + a[i].longitude + ');">' + a[i].name + "</a>";
            else loc.innerHTML = '<a onclick="javascript:' + veambiglistHide + '">' + a[i].name + "</a>";
            else if (onSelectCallback != null && onSelectCallback != "undefined") loc.innerHTML = '<a onclick="javascript:' + veambiglistHide + onSelectCallback + "('" + a[i][0].replace("'", "\\'") + "', " + a[i][1] + ", " + a[i][2] + ", " + a[i][3] + ", " + a[i][4] + ');">' + a[i][0] + "</a>";
            else loc.innerHTML = '<a onclick="javascript:' + veambiglistHide + veambiglistSetViewport + "(" + a[i][1] + ", " + a[i][2] + ", " + a[i][3] + ", " + a[i][4] + ');">' + a[i][0] + "</a>";
            body.appendChild(loc)
        }
        this.veplacelistpanel.style.display = "block";
        mvcViewFacade.ShowShimIfSupported(this.veplacelistpanel)
    };
    this.Hide = function () {
        if (self.veplacelistpanel != null && self.veplacelistpanel != "undefined") {
            HideShim(self.veplacelistpanel);
            self.veplacelistpanel.style.display = "none"
        }
    };
    this.IsVisible = function () {
        var a = false;
        if (this.veplacelistpanel != null && this.veplacelistpanel != "undefined" && this.veplacelistpanel.style.display != "none") a = true;
        return a
    };
    this.Dispose = function () {
        DestroyShim(self.veplacelistpanel);
        if (this.veplacelistpanel != null && this.veplacelistpanel != "undefined") this.veplacelistpanel = null
    }
}
function VEGraphicsManager(w) {
    VEValidator.ValidateObject(w, "vemap", VEMap, "VEMap");
    var a = this;
    this._spacecontrol = null;
    this._hackUniqueLayerId = "UniqueLayer_Hack";
    var ab = null;
    this._entityIdShapePostfix = "_Shape";
    this.m_vemap = w;
    this.m_vemapcontrol = this.m_vemap.vemapcontrol;
    var f = null,
        F = w._mapOptions.DrawingBuffer,
        p = false,
        S = 1,
        d = null;
    this._useOffset = VEShapeAccuracy.None;
    this._drawOverMaxShapes = VEFailedShapeRequest.DrawInaccurately;
    this._failRequest = VEFailedShapeRequest.DrawInaccurately;
    var Z = null,
        x = null,
        g = [],
        b = [],
        j = {},
        e = false,
        c = null;
    this.m_spec = null;
    var s = null,
        k = null,
        m = true,
        Y = Msn.VE.API.Constants.iconurl,
        t = 0,
        n = new _xy1;
    this.SetDisplayThreshold = function (a) {
        t = a
    };
    this.Initialize = function () {
        if (this.m_vegraphiccanvas == null || this.m_vegraphiccanvas == "undefined") {
            this.m_vegraphicspolylines = [];
            this.m_vegraphicspolygons = [];
            var b = document.createElement("div");
            b.id = "rootgraphicshape";
            this.m_vemapcontrol.SetChildDiv(b);
            this.m_vegraphiccanvas = Msn.Drawing.Graphic.CreateGraphic(b, this.m_vemapcontrol);
            this.m_vegraphiccanvas.SetZIndex(17);
            this.m_vemapcontrol.AttachEvent("onstartzoom", a.OnStartZoom);
            this.m_vemapcontrol.AttachEvent("onchangeview", a.Update);
            this.m_vemapcontrol.AttachEvent("onmapoffsetreset", a.OnMapOffsetReset);
            this.m_vemapcontrol.AttachEvent("oninitmode", a.UpdateViewMode);
            if (window.ero == null || window.ero == "undefined") window.ero = ERO.getInstance()
        }
    };
    this.HideClusterLayers = function () {
        var d = a.m_vemap.GetShapeLayerCount();
        for (var c = 0; c < d; c++) {
            var b = a.m_vemap.GetShapeLayerByIndex(c);
            if (b._isClusterLayer) {
                b._originalVisibility = b.GetVisibility();
                b.SetVisibility(false)
            }
        }
    };
    this.ShowClusterLayers = function () {
        var d = a.m_vemap.GetShapeLayerCount();
        for (var c = 0; c < d; c++) {
            var b = a.m_vemap.GetShapeLayerByIndex(c);
            if (b._isClusterLayer) {
                if (b._originalVisibility) {
                    b.SetVisibility(true);
                    b._clusterZoomLevel = null
                }
                b._originalVisibility = null
            }
        }
    };
    this.UpdateViewMode = function () {
        if (a.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode3D) {
            a.HideClusterLayers();
            a.DrawAll3DPushpins();
            a.Draw()
        } else {
            a.ShowClusterLayers();
            _spacecontrol = null;
            a.ClearAll();
            a.Update()
        }
    };
    this.Update = function () {
        if (a.m_vemap.GetMapMode() != Msn.VE.MapActionMode.Mode3D) {
            a.Clear();
            a.Draw()
        }
        p = false
    };
    this.OnStartZoom = function () {
        a.Clear();
        if (a.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode2D) {
            if (!c) return;
            var h = c.GetCollectionCount();
            for (var d = 0; d < h; d++) {
                var f = c.GetCollectionByIndex(d),
                    g = f.GetShapeCount();
                for (var e = 0; e < g; e++) {
                    var b = f.Annotations[e];
                    if (b._isDrawn) {
                        a.HideShape(b);
                        a.HideIcon(b)
                    }
                    b._isHiddenForZoom = true
                }
            }
        }
    };
    this.OnMapOffsetReset = function () {
        if (a.m_vemap.GetMapMode() != Msn.VE.MapActionMode.Mode3D) p = true
    };
    this.Clear = function () {
        if (a.m_vegraphiccanvas != null && a.m_vegraphiccanvas != "undefined") a.m_vegraphiccanvas.Clear()
    };

    function C(a) {
        var b = false;
        if (a.minX > d.x1 && a.minY > d.y1 && a.maxX < d.x2 && a.maxY < d.y2) b = true;
        return b
    }
    function M(a) {
        if (typeof a == "undefined" || a.type == VEShapeType.Pushpin) return false;
        if (a.minX == null || a.minY == null || a.maxX == null || a.maxY == null) {
            var b = null;
            b = Msn.Drawing.ComputeBoundingBox(a.points);
            if (b) {
                a.minX = b[0];
                a.minY = b[1];
                a.maxX = b[2];
                a.maxY = b[3]
            } else return false
        }
        var c = true;
        c = IsRecIntersect(f.x1, f.y1, f.x2, f.y2, a.minX, a.minY, a.maxX, a.maxY);
        return c
    }
    function E(c) {
        if (!C(c)) {
            var a = d;
            if (a == null) return false;
            var b = null;
            b = VE_LineClip.Clip(c.points, a.x1, a.y1, a.x2, a.y2);
            if (b) {
                c.points = b;
                return true
            }
        }
        return false
    }
    function J(b) {
        if (M(b)) {
            var f = b.points;
            if (!C(b)) {
                var c = d;
                if (c == null) return;
                var e = null;
                e = VE_LineClip.Clip(f, c.x1, c.y1, c.x2, c.y2);
                if (e) b.points = e
            }
            a.m_vegraphiccanvas.DrawPrimitive(b);
            b.points = f
        }
    }
    function N(b) {
        a.m_vemap.m_velayermanager = b;
        c = b.VE_LayerManager;
        k = c.GetCollectionListDiv();
        a.m_vemapcontrol.SetChildDiv(k);
        a.m_spec = new VELatLongFactorySpecFromMap(a.m_vemap);
        s = new VELatLongFactory(b.m_spec)
    }
    function l(e) {
        if (f == null || e) {
            var b = GetCurrentMapViewBounds(a.m_vemapcontrol);
            f = F == 0 ? b : GetBufferedMapViewBounds(F, b);
            d = GetBufferedMapViewBounds(S, b)
        }
        currentOffetScene = null;
        if (a.m_vemapcontrol.IsMapViewOblique()) {
            var c = a.m_vemapcontrol.GetObliqueScene();
            if (c != null) currentOffetScene = c.GetID()
        }
    }
    function v() {
        e = false;
        g = [];
        b = [];
        for (var a in j) j[a] = null
    }
    function q(a) {
        j[a.GetId()] = null
    }
    function o(b) {
        var c = a.m_vemapcontrol.GetObliqueScene();
        if (a.m_vemapcontrol.IsMapViewOblique() && c != null) {
            if (j[b.GetId()] == null) {
                j[b.GetId()] = b;
                g.push(b)
            }
        } else v()
    }
    function I(f) {
        try {
            var n = a.m_vemapcontrol.GetObliqueScene();
            if (a.m_vemapcontrol.IsMapViewOblique() && n != null) {
                var m = n.GetID();
                if (x != m) {
                    for (var c = 0; c < b.length; c++) g.push(b[c]);
                    e = true
                } else if (f != null) for (var c = 0, d = 0; c < b.length && d < f.length; c++) {
                    var k = true,
                        l = [];
                    if (f[d] != null) {
                        var j = a.m_vemapcontrol.PixelToLatLong(f[d], a.m_vemapcontrol.GetZoomLevel());
                        b[c]._OffsetScene = m;
                        b[c]._OffsetLatLong = s.CreateVELatLong(j.latitude, j.longitude);
                        l.push(f[d])
                    } else k = false;
                    if (b[c].GetPrimitive(0).type != VEShapeType.Pushpin) {
                        b[c]._OffsetPoints = [];
                        var i = b[c].GetPrimitive(0).points.length / 2,
                            p = [];
                        while (i > 0) {
                            d++;
                            if (f[d] == null) {
                                k = false;
                                d = d + i - 1;
                                i = 0
                            } else {
                                var j = a.m_vemapcontrol.PixelToLatLong(f[d], a.m_vemapcontrol.GetZoomLevel());
                                b[c]._OffsetPoints.push(s.CreateVELatLong(j.latitude, j.longitude));
                                i--;
                                l.push(f[d])
                            }
                        }
                    }
                    q(b[c]);
                    if (k) {
                        h(b[c]);
                        if (b[c]._OffsetCallBack) b[c]._OffsetCallBack(l)
                    } else {
                        b[c]._OffsetScene = null;
                        b[c]._OffsetLatLong = null;
                        b[c]._OffsetPoints = null;
                        if (a._failRequest == VEFailedShapeRequest.DoNotDraw) {
                            if (b[c]._OffsetCallBack) b[c]._OffsetCallBack(null)
                        } else if (a._failRequest == VEFailedShapeRequest.DrawInaccurately) {
                            b[c]._OffsetScene = -1;
                            h(b[c]);
                            b[c]._OffsetScene = null;
                            if (b[c]._OffsetCallBack) b[c]._OffsetCallBack(null)
                        } else if (a._failRequest == VEFailedShapeRequest.QueueRequest) {
                            e = true;
                            o(b[c])
                        };
                    }
                    d++
                } else for (var c = 0; c < b.length; c++) {
                    q(b[c]);
                    if (a._failRequest == VEFailedShapeRequest.DoNotDraw) {
                        if (b[c]._OffsetCallBack) b[c]._OffsetCallBack(null)
                    } else if (a._failRequest == VEFailedShapeRequest.DrawInaccurately) {
                        b[c]._OffsetScene = -1;
                        h(b[c]);
                        b[c]._OffsetScene = null;
                        if (b[c]._OffsetCallBack) b[c]._OffsetCallBack(null)
                    } else if (a._failRequest == VEFailedShapeRequest.QueueRequest) {
                        e = true;
                        o(b[c])
                    };
                }
            } else v()
        } catch(r) {
            throw r
        } finally {
            b = [];
            if (e) {
                e = false;
                a.PushOffsetRequest()
            }
        }
    }
    this.PushOffsetRequest = function () {
        var k = a.m_vemapcontrol.GetObliqueScene();
        if (e || b.length != 0) e = true;
        else if (!a.m_vemapcontrol.IsMapViewOblique() || k == null) v();
        else if (g.length > 0) {
            var f = Msn.VE.API.Constants.maxasynlatlongs,
                d = [];
            while (g.length > 0 && f > 0) {
                var c = g.shift();
                if (c.GetPrimitive(0).type != VEShapeType.Pushpin && c.GetPrimitive(0).points.length / 2 > f - 1) {
                    var j = c.GetPrimitive(0).points;
                    if (j.length / 2 > Msn.VE.API.Constants.maxasynlatlongs - 1) {
                        q(c);
                        if (a._drawOverMaxShapes == VEFailedShapeRequest.DoNotDraw) {
                            if (c._OffsetCallBack) c._OffsetCallBack(null)
                        } else if (a._drawOverMaxShapes == VEFailedShapeRequest.DrawInaccurately) {
                            c._OffsetScene = -1;
                            h(c);
                            if (c._OffsetCallBack) c._OffsetCallBack(null)
                        };
                    } else {
                        g.unshift(c);
                        f = 0
                    }
                } else if (c._OffsetScene != k.GetID()) {
                    b.push(c);
                    d.push(new Msn.VE.LatLong(c.Latitude, c.Longitude));
                    f--;
                    if (c.GetPrimitive(0).type != VEShapeType.Pushpin) {
                        var j = c.GetPrimitive(0).points;
                        for (var i = 0; i < j.length; i = i + 2) {
                            d.push(new Msn.VE.LatLong(j[i + 1], j[i]));
                            f--
                        }
                    }
                } else q(c)
            }
            if (g.length > 0) e = true;
            if (d != null && d.length > 0) {
                x = k.GetID();
                a.m_vemapcontrol.LatLongToPixelAsync(d, a.m_vemapcontrol.GetZoomLevel(), I)
            }
        }
    };

    function X() {
        if (!c) return;
        MC_MAX_COL_SIZE = 200;
        if (c.GetCollectionCount() < 1) return;
        l();
        for (var d = 0; d < c.GetCollectionCount(); d++) {
            var b = c.GetCollectionByIndex(d);
            if (b) {
                b._index = d;
                MC_MAX_COL_SIZE = Math.max(MC_MAX_COL_SIZE, b.GetShapeCount());
                if (!G(b)) i(b)
            }
        }
        a.PushOffsetRequest()
    }
    function G(b) {
        if (!c) return false;
        if (b.GetType() == MC_COL_TYPE_TILEIMAGE) return false;
        b._mapGuid = a.m_vemap.GUID;
        if (!b.GetVisibility()) return false;
        if (a.m_vemapcontrol.IsMapViewOblique()) i(b);
        W(b);
        var q = b.GetShapeCount();
        if (a.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode3D) {
            if (VE_CheckModuleStatus(VE_ModuleName.API3D) == "loaded") mvcViewFacade._curMvcView._DrawCollectionLayer(b);
            return true
        }
        var p = a.m_vemapcontrol.GetZoomLevel();
        if (p > b.MaxScale || p < b.MinScale) return false;
        l();
        var e = b.GetBoundingBox();
        if (q > 0 && !IsBoundsIntersect(f, e)) return false;
        if (b.Spec != null && b.Spec.IconUrl != null && b.Spec.IconUrl != "undefined") Y = b.Spec.IconUrl;
        var g = $ID(b.GetId());
        if (g == null) {
            g = document.createElement("div");
            g.setAttribute("id", b.GetId());
            k.appendChild(g)
        }
        var o = true;
        m = true;
        if (IsContainedInView(d, e)) {
            m = false;
            o = IsDisplayShape(a.m_vemap.vemapcontrol, t, e.x1, e.y1, e.x2, e.y2)
        }
        for (var n = 0; n < q; n++) {
            var j = b.Annotations[n];
            j._shplayer = b;
            j.SetIndex(n);
            if (!h(j, g)) r(j);
            if (!o) break
        }
        m = true;
        return true
    }
    function h(b, g) {
        if (b.GetVisibility() && !b._clustered) {
            if (a.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode3D) {
                if (VE_CheckModuleStatus(VE_ModuleName.API3D) == "loaded") mvcViewFacade._curMvcView._DrawEntity(b, null, false, false, b._shplayer);
                return
            }
            var m = a.m_vemapcontrol.GetZoomLevel();
            if (m > b.maxZoomLevel || m < b.minZoomLevel) return false;
            l();
            var i = D(b),
                j;
            if (i && b.GetPrimitive(0).type == VEShapeType.Pushpin && b._OffsetScene == currentOffetScene) {
                var q = n.Decode(b._OffsetLatLong);
                j = new VELatLongRectangle(q, q)
            } else j = b.GetBoundingBox();
            if (!IsBoundsIntersect(f, j)) return false;
            if (typeof g == "undefined" || g == null) g = H(b.iid);
            var d = b.GetPrimitive(0),
                e = null,
                c = null;
            if (i) r(b);
            var h = b._isDrawn;
            if (d.type != VEShapeType.Pushpin) {
                var c = null;
                if (b._isDrawn) if (b._isHiddenForZoom || p) {
                    c = u(b, true);
                    a.ShowShape(b)
                } else c = u(b, false);
                else {
                    var k = true;
                    k = IsDisplayShape(a.m_vemap.vemapcontrol, t, d.minX, d.minY, d.maxX, d.maxY);
                    if (k) {
                        if (i) if (b._OffsetScene == currentOffetScene) try {
                            b.SetUseOffset(true);
                            c = y(a.m_vemapcontrol, d, b.GetIndex(), b.GetTitle())
                        } catch(s) {
                            throw s
                        } finally {
                            b.SetUseOffset(false)
                        } else o(b);
                        else c = y(a.m_vemapcontrol, d, b.GetIndex(), b.GetTitle());
                        if (document.all && c) {
                            c.style.zIndex = b.GetZIndexPolyShape();
                            g.appendChild(c)
                        }
                        if (c) h = true;
                        d._shapeElement = c
                    }
                }
            }
            if (b.GetIconVisibility()) if (b._isDrawn) {
                if (b._isHiddenForZoom || p) {
                    c = B(b);
                    if (c && d.isLabel) a.ShowIcon(b)
                }
            } else {
                if (b.IconUrl == null) b.IconUrl = Msn.VE.API.Constants.iconurl;
                e = Q(b);
                if (e) {
                    e.style.zIndex = b.GetZIndex();
                    g.appendChild(e);
                    e.innerHTML = VECreateVEShapeERO(b, a.m_vemap.GUID);
                    d._iconElement = e;
                    h = true
                }
            }
            b._isDrawn = h;
            b._isHiddenForZoom = false;
            return h
        }
    }
    function u(f, d) {
        var c = f.GetShapeElement();
        if (c) {
            var b = f.GetPrimitive(0),
                g = b.points,
                e = false;
            if (m) e = E(b);
            d = d || e || b._isClipped;
            c = a.m_vemapcontrol.GetGraphic().UpdatePoints(a.m_vemapcontrol, b, c, d);
            b.points = g;
            b._isClipped = e
        }
        return c
    }
    function B(d) {
        var b = d.GetIconElement();
        if (b) {
            var c = A(d);
            if (c) {
                var e = a.m_vemapcontrol.GetPushpinMapPixel(new Msn.VE.LatLong(c.Latitude, c.Longitude), a.m_vemapcontrol.GetZoomLevel());
                b.style.left = MathRound(e.x) - 25 / 2 + "px";
                b.style.top = MathRound(e.y) - 25 / 2 + "px"
            } else b = null
        }
        return b
    }
    function R(c) {
        var b = c.GetShapeElement();
        if (b) b = a.m_vemapcontrol.GetGraphic().UpdateStyle(a.m_vemapcontrol, c.GetPrimitive(0), b);
        return b
    }
    function O(b) {
        var c = b.GetIconElement();
        if (c) {
            if (b.IconUrl == null) b.IconUrl = Msn.VE.API.Constants.iconurl;
            c.style.zIndex = b.GetZIndex();
            c.innerHTML = VECreateVEShapeERO(b, a.m_vemap.GUID)
        }
        return c
    }
    this.ShowShape = function (b) {
        var a = null;
        if (b.GetPrimitive(0).type != VEShapeType.Pushpin) {
            a = b.GetShapeElement();
            if (a) a.style.display = "block"
        }
        return a
    };
    this.HideShape = function (b) {
        var a = null;
        if (b.GetPrimitive(0).type != VEShapeType.Pushpin) {
            a = b.GetShapeElement();
            if (a) a.style.display = "none"
        }
        return a
    };
    this.ShowIcon = function (b) {
        var a = b.GetIconElement();
        if (a) a.style.display = "block";
        return a
    };
    this.HideIcon = function (b) {
        var a = b.GetIconElement();
        if (a) a.style.display = "none";
        return a
    };

    function Q(d) {
        if (a.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode3D) return null;
        var b = d.GetPrimitive(0),
            f = null,
            e = b.iid;
        if (b.type != VEShapeType.Pushpin) e = Msn.Drawing.GetLabelUID(b.iid);
        var c = A(d);
        if (c != null) return a.m_vemap.vemapcontrol.AddPushpin(e, c.Latitude, c.Longitude, 25, 25, "VEAPI_Pushpin", null, Msn.VE.API.Globals.vepushpinpanelzIndex - 1, null, true);
        else return null
    }
    function A(a) {
        var b = null;
        if (D(a)) if (a._OffsetScene == currentOffetScene) b = n.Decode(a._OffsetLatLong);
        else o(a);
        else b = new VELatLong(a.Latitude, a.Longitude);
        return b
    }
    function D(b) {
        if (a._useOffset == VEShapeAccuracy.None || currentOffetScene == null || b._OffsetScene == -1) return false;
        else if (a._useOffset == VEShapeAccuracy.Pushpin) return b.GetPrimitive(0).type == VEShapeType.Pushpin;
        else if (a._useOffset == VEShapeAccuracy.All) return true;
        else return false
    }
    function y(c, a, g, f) {
        if (!a || !a.points || a.points.length < 1 || typeof a.points[0] == "undefined") return;
        if (a.type == VEShapeType.Pushpin && (a.symbol == null || a.symbol != null && a.symbol.id == MC_PROPERTY_PUSHPIN)) a.symbol = VE_MapDispatch_SymbolLib.GetMapSymbolByID(MC_PROPERTY_PUSHPIN);
        else if (a.symbol == null) {
            var b = VE_MapDispatch_SymbolLib.GetCurrentDefaultSymbol();
            if (b) a.symbol = b.Clone()
        }
        var e = a.points,
            d = null;
        if (m) a._isClipped = E(a);
        d = c.GetGraphic().CreatePrimitive(c, a, f);
        a.points = e;
        return d
    }
    function V() {
        if (!c) return;
        var b = c.GetCollectionCount();
        if (b < 1) return;
        for (var a = 0; a < b; a++) {
            var d = c.GetCollectionByIndex(a);
            i(d)
        }
    }
    function i(b) {
        if (a.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode3D) if (VE_CheckModuleStatus(VE_ModuleName.API3D) == "loaded") mvcViewFacade._curMvcView._ClearCollectionLayer(b);
        if (b.GetType() == MC_COL_TYPE_TILEIMAGE) return;
        var c = null;
        c = $ID(b.GetId());
        if (c == null) return null;
        if (!document.all || c && c.hasChildNodes()) {
            var e = b.GetShapeCount();
            for (var d = 0; d < e; d++) r(b.Annotations[d]);
            c.innerHTML = ""
        }
        if (b._clusterLayer) i(b._clusterLayer);
        return c
    }
    function r(b) {
        if (a.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode3D) if (VE_CheckModuleStatus(VE_ModuleName.API3D) == "loaded") mvcViewFacade._curMvcView._ClearEntity(b);
        z(b.GetPrimitive(0));
        b._isDrawn = false;
        b._isHiddenForZoom = false
    }
    function z(d) {
        var a = null,
            b = null,
            e = d.iid;
        if (d.type != VEShapeType.Pushpin) {
            e = Msn.Drawing.GetLabelUID(d.iid);
            b = $ID(d.iid);
            if (b && b.parentNode) b.parentNode.removeChild(b)
        }
        a = $ID(e);
        if (!a) return null;
        a.detachEvent("onmouseover", VEShowVEShapeERO);
        a.detachEvent("onmouseout", VEHideVEShapeERO);
        a.detachEvent("onclick", VEShowVEShapeERO);
        a.parentNode.removeChild(a);
        var c = a.vePushpin;
        if (typeof c != "undefined" && c != null) {
            c.Destroy();
            c.innerHtml = "";
            c = null
        }
    }
    function H(b) {
        var a = c.ParseInternalID(b);
        if (a && a[1]) return parentElement = T(a[1], false, k);
        else return k
    }
    function T(b, d, c) {
        var a = null;
        a = $ID(b);
        if (a && d) a.innerHTML = "";
        if (!a) {
            a = document.createElement("div");
            a.setAttribute("id", b);
            c.appendChild(a)
        }
        return a
    }
    this.InitLayerManager = N;
    this.DrawAll = X;
    this.DrawLayer = G;
    this.DrawEntity = h;
    this.ClearAll = V;
    this.ClearLayerDom = i;
    this.ClearPrimitiveDom = z;
    this.ClearEntityDom = r;
    this.UpdatePoints = u;
    this.UpdateIconPoints = B;
    this.UpdateStyle = R;
    this.UpdateIconStyle = O;
    this.Draw = function () {
        l(true);
        if (!document.all) a.m_vemapcontrol.resetSvgLayer();
        VE_LatLongThreshold.IsNotInit = true;
        a.DrawAll();
        if (a.m_vegraphicspolylines != null && a.m_vegraphicspolylines.length > 0) {
            var c = a.m_vegraphicspolylines.length;
            for (var b = 0; b < c; b++) {
                var e = a.m_vegraphicspolylines[b];
                a.DrawOne(e, true, d)
            }
        }
        if (a.m_vegraphicspolygons != null && a.m_vegraphicspolygons.length > 0) {
            var g = a.m_vegraphicspolygons.length;
            for (var b = 0; b < g; b++) {
                var f = a.m_vegraphicspolygons[b];
                a.DrawOne(f, false, d)
            }
        }
    };
    this.DrawOne = function (b, g, i) {
        if (typeof b == "undefined" || b == null) return;
        if (a.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode3D) {
            U(b, g, i);
            return
        } else a._spacecontrol = null;
        l();
        a.m_vegraphiccanvas.resetOffset();
        var h = b.GetLatLongs(),
            c = [];
        for (var e = 0; e < h.length; e++) {
            var f = n.Decode(h[e]);
            c.push(parseFloat(f.Longitude));
            c.push(parseFloat(f.Latitude))
        }
        var d;
        if (g) d = new Msn.Drawing.PolyLine(c);
        else d = new Msn.Drawing.Polygon(c);
        a.m_vegraphiccanvas.SetZIndex(17);
        a.m_vegraphiccanvas.SetStroke(b.Stroke);
        J(d)
    };

    function U(d, g) {
        if (typeof d == "undefined" || d == null) return;
        if (!a._spacecontrol) a._spacecontrol = a.m_vemapcontrol.Get3DControl();
        var l = d.GetLatLongs(),
            e = [];
        for (var h = 0; h < l.length; h++) {
            var i = n.Decode(l[h]);
            e.push(i.Longitude);
            e.push(i.Latitude)
        }
        var f;
        if (g) f = new Msn.Drawing.PolyLine(e);
        else f = new Msn.Drawing.Polygon(e);
        a.m_vegraphiccanvas.SetZIndex(17);
        a.m_vegraphiccanvas.SetStroke(d.Stroke);
        var o = d.ID,
            m = a._hackUniqueLayerId,
            k = ConvertPointArrayToView3DParameter(f.points),
            c = GetPrimitiveSymbolOrDefault(f, d.Stroke),
            p = ConvertStrokeWeightToView3DParameter(c.stroke_weight),
            b = "Linecolor='" + c.stroke_color + "'" + " Lineweight='" + p + "'" + " Dashstyle='" + c.stroke_dashstyle + "'" + " Lineopacity='" + c.stroke_opacity + "'",
            j = o + a._entityIdShapePostfix;
        if (g) a._spacecontrol.AddPolylineWithProperties(m, j, k, b);
        else if (!g) {
            b = b.concat(" Fillcolor='", c.fill_color, "'");
            b = b.concat(" Fillopacity='", c.fill_opacity, "'");
            b = b.concat(" Lineopacity='", c.stroke_opacity, "'");
            a._spacecontrol.AddPolygonWithProperties(m, j, k, b)
        }
    }
    function W(b) {
        if (!b._isClusterLayer) {
            var d;
            if (a.m_vemap.GetMapMode() != Msn.VE.MapActionMode.Mode3D && b._clusteringAlgorithm != null) {
                var h = a.m_vemap.GetZoomLevel(),
                    j = a.m_vemap.GetMapMode(),
                    i = a.m_vemap.GetMapStyle();
                if (!b._clusterLayer) b.CreateClusterLayer();
                if (!b._clusterLayer._clusterZoomLevel || b._clusterLayer._clusterZoomLevel != h || b._clusterLayer._mapMode != j || b._clusterLayer._mapStyle != i) {
                    for (var c = 0; c < b.Annotations.length; c++) b.Annotations[c]._clustered = false;
                    b._clusterLayer._clusterZoomLevel = h;
                    b._clusterLayer._mapMode = j;
                    b._clusterLayer._mapStyle = i;
                    b._clusterLayer.DeleteAllShapes();
                    if (b._clusteringAlgorithm != null) d = b._clusteringAlgorithm(b);
                    if (d != null) for (var c = 0; c < d.length; c++) {
                        var e = d[c];
                        if (e.Shapes && e.Shapes.length > 0) L(e, b._clusteringOptions)
                    }
                    if (b._clusteringOptions && b._clusteringOptions.Callback) clusterDescription = b._clusteringOptions.Callback(d);
                    var f = [];
                    for (var c = 0; c < d.length; c++) {
                        var g = d[c].GetClusterShape();
                        if (g != null) f.push(g)
                    }
                    b._clusterLayer.AddShapes(f);
                    d = null
                }
            } else {
                if (b._clusterLayer) a.ClearLayerDom(b._clusterLayer);
                for (var c = 0; c < b.Annotations.length; c++) {
                    b.Annotations[c]._clustered = false;
                    if (b.Annotations[c]._sort) b.Annotations[c]._sort = null
                }
            }
        }
    }
    function L(a, f) {
        if (a != null) {
            var c = a.Shapes.length,
                d = 0,
                e = 0;
            for (var b = 0; b < c; b++) {
                a.Shapes[b]._clustered = true;
                var j = parseFloat(a.Shapes[b].Primitives[0].points[1]),
                    k = parseFloat(a.Shapes[b].Primitives[0].points[0]);
                d += j;
                e += k
            }
            if (!a.LatLong && c > 0) {
                var h = d / c,
                    i = e / c;
                a.LatLong = new VELatLong(h, i)
            }
            var g = new VEShape(VEShapeType.Pushpin, a.LatLong);
            a._clusterShape = g;
            P(a, f);
            K(a)
        }
    }
    function P(a, b) {
        if (a != null && a._clusterShape != null) if (b && b.Icon) a._clusterShape.SetCustomIcon(b.Icon);
        else a._clusterShape.SetCustomIcon(Msn.VE.API.Constants.clustericonurl)
    }
    function K(b) {
        if (b != null && b._clusterShape != null) {
            var d = L_ClusterDefaultTitle_Text.replace(/%1/g, b.Shapes.length);
            b._clusterShape.SetTitle(d);
            var c = a.m_vemap.vemapcontrol.GetCurrentMode();
            if (c && a.m_vemap.GetZoomLevel() < c.GetCurrentMaxZoomLevel(a.m_vemap.vemapcontrol.GetCurrentMapView())) b._clusterShape.SetDescription(L_ClusterDefaultDescription_Text)
        }
    }
}
VEGraphicsManager.prototype.RemoveLine = function (a) {
    this.RemoveLinebyId(a.ID)
};
VEGraphicsManager.prototype.RemoveLinebyId = function (b) {
    if (this.m_vegraphiccanvas == null || this.m_vegraphiccanvas == "undefined") {
        throw new VEException("VEMap:RemoveLinebyId", "err_GraphicsInitError", L_GraphicsInitError_Text);
        return
    }
    var c = this.m_vegraphicspolylines.length,
        a = 0;
    while (a < c && b != this.m_vegraphicspolylines[a].ID) a++;
    if (a < c) this.m_vegraphicspolylines.splice(a, 1);
    else {
        throw new VEException("VEMap:RemoveLinebyId", "err_GraphicsInitError", L_invalidpolylineid_text);
        return
    }
    if (this.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode3D) this.Clear3DShape(b);
    else {
        this.Clear();
        this.Draw()
    }
};
VEGraphicsManager.prototype.RemoveAllLines = function () {
    if (this.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode3D) this.ClearAll3DShape();
    this.m_vegraphicspolylines = [];
    this.Clear();
    this.Draw()
};
VEGraphicsManager.prototype.DrawLine = function (a) {
    if (this.m_vegraphiccanvas == null || this.m_vegraphiccanvas == "undefined") {
        throw new VEException("VEMap:DrawLine", "err_GraphicsInitError", L_GraphicsInitError_Text);
        return
    }
    VEValidator.ValidateObject(a, "vePolyline", VEPolyline, "VEPolyline");
    var c = this.m_vegraphicspolylines.length;
    for (var b = 0; b < c; b++) if (a.ID == this.m_vegraphicspolylines[b].ID) throw new VEException("VEMap:DrawLine", "err_invalidpolylineid", L_invalidpolylineid_text);
    this.m_vegraphicspolylines.push(a);
    this.DrawOne(a, true)
};
VEGraphicsManager.prototype.RemovePolygon = function (a) {
    this.RemovePolygonbyId(a.ID)
};
VEGraphicsManager.prototype.RemovePolygonbyId = function (b) {
    if (this.m_vegraphiccanvas == null || this.m_vegraphiccanvas == "undefined") {
        throw new VEException("VEMap:RemovePolygonbyId", "err_GraphicsInitError", L_GraphicsInitError_Text);
        return
    }
    var c = this.m_vegraphicspolygons.length,
        a = 0;
    while (a < c && b != this.m_vegraphicspolygons[a].ID) a++;
    if (a < c) this.m_vegraphicspolygons.splice(a, 1);
    else {
        throw new VEException("VEMap:RemovePolygonbyId", "err_GraphicsInitError", L_invalidpolygonid_text);
        return
    }
    if (this.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode3D) this.Clear3DShape(b);
    else {
        this.Clear();
        this.Draw()
    }
};
VEGraphicsManager.prototype.RemoveAllPolygons = function () {
    if (this.m_vemap.GetMapMode() == Msn.VE.MapActionMode.Mode3D) this.ClearAll3DShape();
    this.m_vegraphicspolygons = [];
    this.Clear();
    this.Draw()
};
VEGraphicsManager.prototype.DrawPolygon = function (a) {
    if (this.m_vegraphiccanvas == null || this.m_vegraphiccanvas == "undefined") {
        throw new VEException("VEMap:DrawPolygon", "err_GraphicsInitError", L_GraphicsInitError_Text);
        return
    }
    VEValidator.ValidateObject(a, "vePolygon", VEPolygon, "VEPolygon");
    var c = this.m_vegraphicspolygons.length;
    for (var b = 0; b < c; b++) if (a.ID == this.m_vegraphicspolygons[b].ID) throw new VEException("VEMap:DrawPolygon", "err_invalidpolygonid", L_invalidpolygonid_text);
    this.m_vegraphicspolygons.push(a);
    this.DrawOne(a, false)
};
VEGraphicsManager.prototype.Dispose = function () {
    if (this.m_vegraphiccanvas != null) {
        this.m_vegraphiccanvas.Clear();
        this.m_vegraphiccanvas.Destroy();
        this.m_vegraphiccanvas = null
    }
    if (this.m_vegraphicspolylines != null && this.m_vegraphicspolylines != "undefined") {
        var b = this.m_vegraphicspolylines.length;
        for (var a = 0; a < b; a++) this.m_vegraphicspolylines.pop().Dispose()
    }
    if (this.m_vegraphicspolygons != null && this.m_vegraphicspolygons != "undefined") {
        var c = this.m_vegraphicspolygons.length;
        for (var a = 0; a < c; a++) this.m_vegraphicspolygons.pop().Dispose()
    }
    if (this.m_vemap != null) {
        this.m_vemapcontrol.DetachEvent("onchangeview", this.Update);
        this.m_vemapcontrol.DetachEvent("onobliquechange", this.Update);
        this.m_vemapcontrol.DetachEvent("onstartzoom", this.Clear)
    }
};
VEGraphicsManager.prototype.DrawAll3DPushpins = function () {
    if (this.m_vemap.GetMapMode() != Msn.VE.MapActionMode.Mode3D) return;
    if (!this.m_vemap.pushpins) return;
    if (typeof this._spacecontrol == "undefined" || this._spacecontrol == null) this._spacecontrol = this.m_vemapcontrol.Get3DControl();
    if (!this._spacecontrol) return;
    var c = this.m_vemap.pushpins,
        e = c.length;
    for (var a = 0; a < e; a++) {
        var b = c[a],
            d = b.LatLong;
        this.Add3DPushpin(b.ID, d.Latitude, d.Longitude, 25, 25, "VEAPI_Pushpin", b, Msn.VE.API.Globals.vepushpinpanelzIndex - 1)
    }
};
VEGraphicsManager.prototype.Add3DPushpin = function (b, e, f, n, l, g, d, m) {
    var h = f,
        j = e,
        k = this._hackUniqueLayerId,
        o = 'text=""',
        c;
    c = GetImageFullUrl(d.Iconurl);
    var i = b;
    this.m_vemapcontrol.Get3DControl().AddPointWithProperties(k, i, j, h, c, o);
    var a = null;
    if (!$ID(b)) {
        a = this.m_vemapcontrol.AddPushpin(b, e, f, n, l, g, d.GetContent(), m, "VEAPI_Pushpin", false, false);
        if (a) a.style.display = "none"
    }
};
VEGraphicsManager.prototype.Remove3DPushpin = function (a) {
    if (typeof this._spacecontrol == "undefined" || this._spacecontrol == null) this._spacecontrol = this.m_vemapcontrol.Get3DControl();
    this.Clear3DShape(a);
    this.m_vemapcontrol.RemovePushpin(a)
};
VEGraphicsManager.prototype.ClearAllPushpins = function (b) {
    if (typeof this._spacecontrol == "undefined" || this._spacecontrol == null) this._spacecontrol = this.m_vemapcontrol.Get3DControl();
    var d = b.length;
    for (var c = 0; c < d; c++) {
        var a = b.pop();
        if (!a.IsInLayer) {
            this.Clear3DShape(a.ID);
            a.Dispose()
        }
    }
    this.m_vemapcontrol.ClearPushpins()
};
VEGraphicsManager.prototype.ClearAll3DShape = function () {
    var c = null,
        b = 0;
    if (this.m_vegraphicspolylines != null && this.m_vegraphicspolylines != "undefined") {
        b = this.m_vegraphicspolylines.length;
        for (var a = 0; a < b; a++) {
            c = this.m_vegraphicspolylines[a];
            this.Clear3DShape(c.ID)
        }
    }
    if (this.m_vegraphicspolygons != null && this.m_vegraphicspolygons != "undefined") {
        b = this.m_vegraphicspolygons.length;
        for (var a = 0; a < b; a++) {
            c = this.m_vegraphicspolygons[a];
            this.Clear3DShape(c.ID)
        }
    }
};
VEGraphicsManager.prototype.Clear3DShape = function (c) {
    var a = c;
    this._spacecontrol.DeleteGeometry(this._hackUniqueLayerId, a);
    var b = a + this._entityIdShapePostfix;
    this._spacecontrol.DeleteGeometry(this._hackUniqueLayerId, b)
};

function ConvertPointArrayToView3DParameter(a) {
    var b = "",
        c = a.length;
    for (i = 0; i < c; i += 2) {
        var d = a[i],
            e = a[i + 1];
        b += d + "," + e + " "
    }
    return b
}
function ConvertStrokeWeightToView3DParameter(a) {
    if (a == null) return "";
    var c = a.length,
        b = a.substring(0, c - 2);
    return b + "px"
}
function GetPrimitiveSymbolOrDefault(c, b) {
    var a = c.symbol;
    if (a == null) {
        if (typeof b != "undefined") {
            c.symbol = new VEShapeStyle;
            a = c.symbol;
            a.stroke_weight = b.width + "pt";
            a.joinstyle = b.linejoin;
            a.stroke_color = b.color.ToHexString();
            a.stroke_dashstyle = b.linecap;
            a.stroke_opacity = b.color.A.toString();
            a.fill_color = b.fillcolor.ToHexString();
            a.fill_opacity = b.fillcolor.A.toString();
            return a
        } else if (_defaultSymbol == null) {
            _defaultSymbol = new VEShapeStyle;
            _defaultSymbol.id = MC_PROPERTY_DEFAULT;
            c.symbol = _defaultSymbol
        }
        return _defaultSymbol
    }
    return a
}
function VELatLong(b, a, c, d) {
    this.Latitude = null;
    this.Longitude = null;
    this.Altitude = null;
    this.AltitudeMode = null;
    this._reserved = null;
    if (b != null) {
        VEValidator.ValidateFloat(b, "latitude");
        this.Latitude = b
    }
    if (a != null) {
        VEValidator.ValidateFloat(a, "longitude");
        this.Longitude = a
    }
    if (c != null) this.SetAltitude(c, d)
}
VELatLong.prototype.SetAltitude = function (b, a) {
    VEValidator.ValidateFloat(b, "altitude");
    this.Altitude = b;
    if (a != null) {
        VEValidator.ValidateAltitudeMode(a, "altitudeMode");
        this.AltitudeMode = a
    } else this.AltitudeMode = VEAltitudeMode.Default
};
VELatLong.prototype.HasAltitude = function () {
    return this.Altitude != null
};

function Clone() {
    var a = new VELatLong;
    a.Latitude = this.Latitude;
    a.Longitude = this.Longitude;
    a._reserved = this._reserved;
    a.Altitude = this.Altitude;
    a.AltitudeMode = this.AltitudeMode;
    return a
}
function toString() {
    var a = "";
    if (this.Latitude != null && this.Longitude != null) a = this.Latitude + ", " + this.Longitude;
    if (this.Altitude != null) a += ", " + this.Altitude;
    return a
}
VELatLong.prototype.toString = toString;
VELatLong.prototype.Clone = Clone;

function VELatLongRectangle(d, c, b, a) {
    VEValidator.ValidateObject(d, "topLeftLatLong", VELatLong, "VELatLong");
    VEValidator.ValidateObject(c, "bottomRightLatLong", VELatLong, "VELatLong");
    this.TopLeftLatLong = d;
    this.BottomRightLatLong = c;
    if (b != null && b != "undefined") {
        VEValidator.ValidateObject(b, "topRightLatLong", VELatLong, "VELatLong");
        this.TopRightLatLong = b
    }
    if (a != null && a != "undefined") {
        VEValidator.ValidateObject(a, "bottomLeftLatLong", VELatLong, "VELatLong");
        this.BottomLeftLatLong = a
    }
}
VEAltitudeMode = new
function () {
    this.Default = "Ground";
    this.Absolute = "Datum";
    this.RelativeToGround = "Ground"
};

function _xy1() {
    var a = new _xz1;
    this.Decode = function (c) {
        VEValidator.ValidateObject(c, "veLatLong", VELatLong, "VELatLong");
        var b = c.Clone();
        if (b.Latitude == null || b.Longitude == null && b._reserved != null) {
            var d = a.Decode(b._reserved);
            b.Latitude = d[0];
            b.Longitude = d[1];
            b._reserved = null
        }
        return b
    }
}
function VELatLongFactoryAlwaysEncodeSpec() {
    this.IsEncode = function () {
        return true
    }
}
function VELatLongFactorySpecFromMap(a) {
    VEValidator.ValidateObject(a, "vemap", VEMap, "VEMap");
    var b = a;
    this.IsEncode = function () {
        var a = b.GetMapStyle();
        return a == VEMapStyle.Birdseye || a == VEMapStyle.BirdseyeHybrid
    }
}
function VELatLongFactorySpecFromMapView(a) {
    VEValidator.ValidateNonNull(a, "mapView");
    var b = a;
    this.IsEncode = function () {
        return Msn.VE.MapStyle.IsViewOblique(b.mapStyle)
    }
}
function VELatLongFactory(a) {
    VEValidator.ValidateNonNull(a, "veLatLongFactorySpec");
    var c = a,
        b = new _xz1;
    this.CreateVELatLong = function (e, d) {
        var a = null;
        if (c.IsEncode()) {
            a = new VELatLong;
            a._reserved = b.Encode(e, d)
        } else a = new VELatLong(e, d);
        return a
    }
}
function VEPolyline(d, c, a, b) {
    VEValidator.ValidateNonNull(d, "id");
    VEValidator.ValidateNonNull(c, "arrVELatLong");
    this.ID = d;
    this.LatLongs = c;
    this.Stroke = new Msn.Drawing.Stroke;
    if (a == null || a == "undefined") a = new VEColor(17, 221, 17, .7);
    this.SetColor(a);
    if (b == null || b == "undefined") b = 6;
    this.SetWidth(b)
}
function SetColor(a) {
    VEValidator.ValidateNonNull(a);
    this.Stroke.color = new Msn.Drawing.Color(a.R, a.G, a.B, a.A)
}
function SetWidth(a) {
    VEValidator.ValidateInt(a, "width");
    this.Stroke.width = a
}
function GetLatLongs() {
    return this.LatLongs
}
function Dispose() {
    this.ID = null;
    this.LatLongs = null;
    this.Stroke = null
}
VEPolyline.prototype.SetColor = SetColor;
VEPolyline.prototype.SetWidth = SetWidth;
VEPolyline.prototype.GetLatLongs = GetLatLongs;
VEPolyline.prototype.Dispose = Dispose;

function VEPolygon(e, d, c, a, b) {
    VEValidator.ValidateNonNull(e, "id");
    VEValidator.ValidateNonNull(d, "arrVELatLong");
    this.ID = e;
    this.LatLongs = d;
    this.Stroke = new Msn.Drawing.Stroke;
    if (c == null || c == "undefined") c = new VEColor(17, 221, 17, .7);
    this.SetFillColor(c);
    if (a == null || a == "undefined") a = new VEColor(17, 221, 17, .7);
    this.SetOutlineColor(a);
    if (b == null || b == "undefined") b = 6;
    this.SetOutlineWidth(b)
}
function SetFillColor(a) {
    VEValidator.ValidateNonNull(a);
    this.Stroke.fillcolor = new Msn.Drawing.Color(a.R, a.G, a.B, a.A)
}
function SetOutlineColor(a) {
    VEValidator.ValidateNonNull(a);
    this.Stroke.color = new Msn.Drawing.Color(a.R, a.G, a.B, a.A)
}
function SetOutlineWidth(a) {
    VEValidator.ValidateInt(a, "width");
    this.Stroke.width = a
}
function GetLatLongs() {
    return this.LatLongs
}
function Dispose() {
    this.ID = null;
    this.LatLongs = null;
    this.Stroke = null
}
VEPolygon.prototype.SetFillColor = SetFillColor;
VEPolygon.prototype.SetOutlineColor = SetOutlineColor;
VEPolygon.prototype.SetOutlineWidth = SetOutlineWidth;
VEPolygon.prototype.GetLatLongs = GetLatLongs;
VEPolygon.prototype.Dispose = Dispose;

function VEColor(d, c, b, a) {
    VEValidator.ValidateInt(d, "r");
    VEValidator.ValidateBetween(d, "r", 0, 255);
    VEValidator.ValidateInt(c, "g");
    VEValidator.ValidateBetween(c, "g", 0, 255);
    VEValidator.ValidateInt(b, "b");
    VEValidator.ValidateBetween(b, "b", 0, 255);
    VEValidator.ValidateFloat(a, "a");
    VEValidator.ValidateBetween(a, "a", 0, 1);
    Msn.Drawing.Color.call(this, d, c, b, a)
}
var L_integerencodingoutofrange_text = "VEIntegerEncoding: The number encoded is out of supported range",
    L_floatintegermapencodingoutofrange_text = "VEFloatIntegerMap: The number encoded is out of supported range",
    L_integerencodinginvalidstringlength_text = "VEIntegerEncoding: Invalid string length",
    L_integerencodingunknowndigit_text = "VEIntegerEncoding: The encoded string has an unknown digit";

function VEIntegerEncoding(g, j) {
    var e = g,
        d = g.length,
        a = j,
        h = 1;
    for (var i = 0; i < a; ++i) h *= d;
    var f = h - 1,
        c = [];
    for (var b = 0; b < e.length; ++b) c[e.substr(b, 1)] = b;
    this.MaxValue = function () {
        return f
    };
    this.ValueLength = function () {
        return a
    };
    this.Encode = function (c) {
        if (c <= f) {
            var h = "",
                g = [];
            for (var b = 0; b < a; ++b) g[b] = 0;
            var i = a - 1;
            while (c > 0) {
                g[i] = Math.floor(c % d);
                c = Math.floor(c / d);
                --i
            }
            for (var b = 0; b < g.length; ++b) h += e.substr(g[b], 1);
            return h
        } else throw L_integerencodingoutofrange_text
    };
    this.Decode = function (c) {
        if (c.length == a) {
            var b = 0;
            for (var e = 0; e < c.length; ++e) {
                b *= d;
                b += this.DigitValue(c.substr(e, 1))
            }
            return b
        } else throw L_integerencodinginvalidstringlength_text
    };
    this.DigitValue = function (a) {
        if (c[a] != null && c[a] != "undefined") return c[a];
        else throw L_integerencodingunknowndigit_text
    }
}
function VEFloatIntegerMap(e, d, f) {
    var a = e,
        c = d,
        b = f;
    this.MinFloat = function () {
        return a
    };
    this.MaxFloat = function () {
        return c
    };
    this.MaxInt = function () {
        return b
    };
    this.FloatToInt = function (d) {
        if (d >= a && d <= c) {
            var e = (d - a) / (c - a),
                f = e * b + .5;
            return Math.min(Math.floor(f), b)
        } else throw L_floatintegermapencodingoutofrange_text
    };
    this.IntToFloat = function (d) {
        if (d <= b) {
            var f = d / b,
                e = a + f * (c - a);
            return e
        } else throw L_floatintegermapencodingoutofrange_text
    }
}
var L_velatlongencodinginvalidstringlength_text = "_xz1: Invalid string length";

function _xz1(b) {
    var i = -90,
        h = 90,
        g = -180,
        f = 180,
        j = "0123456789bcdfghjkmnpqrstvwxyz",
        e = 6;
    if (b != null && typeof b != "undefined") e = b;
    var a = new VEIntegerEncoding(j, e),
        d = new VEFloatIntegerMap(i, h, a.MaxValue()),
        c = new VEFloatIntegerMap(g, f, a.MaxValue());
    this.Encode = function (e, b) {
        var f = a.Encode(d.FloatToInt(e)) + a.Encode(c.FloatToInt(b));
        return f
    };
    this.Decode = function (f) {
        if (f.length == 2 * a.ValueLength()) {
            var e = a.ValueLength(),
                j = f.substr(0, e),
                h = f.substr(e, e),
                i = a.Decode(j),
                g = a.Decode(h),
                b = [];
            b[0] = d.IntToFloat(i);
            b[1] = c.IntToFloat(g);
            return b
        } else throw L_velatlongencodinginvalidstringlength_text
    }
}
function _xz1ForMobile() {
    _xz1.call(this, 5)
}
VEMapMode = new
function () {
    this.Mode2D = 1;
    this.Mode3D = 2
};

function VEMapViewSpecification(c, d, e, g, f) {
    this.LatLong = null;
    this.ZoomLevel = null;
    this.Altitude = null;
    this.Pitch = null;
    this.Heading = null;
    if (c != null && c != "undefined") {
        VEValidator.ValidateObject(c, "veLatLong", VELatLong, "VELatLong");
        this.LatLong = c
    }
    if (d != null && d != "undefined") {
        VEValidator.ValidateNonNegativeInt(d, "zoomLevel");
        this.ZoomLevel = d
    }
    if (e != null && e != "undefined") {
        VEValidator.ValidateFloat(e, "altitude");
        this.Altitude = parseFloat(e)
    }
    if (g != null && g != "undefined") {
        VEValidator.ValidateFloat(g, "pitch");
        var a = parseFloat(g);
        a = a % 360;
        if (a < -90) a = -90;
        if (a > 90) a = 90;
        this.Pitch = a
    }
    if (f != null && f != "undefined") {
        VEValidator.ValidateFloat(f, "heading");
        var b = parseFloat(f);
        b = b % 360;
        if (b < 0) b += 360;
        this.Heading = b
    }
}
function MapViewSpecClone() {
    var a = new VEMapViewSpecification;
    a.LatLong = this.LatLong.Clone();
    a.Altitude = this.Altitude;
    a.Pitch = this.Pitch;
    a.Heading = this.Heading;
    return veLatLong
}
VEMapViewSpecification.prototype.Clone = MapViewSpecClone;
VEMapStyle = new
function () {
    this.Road = Msn.VE.MapStyle.Road;
    this.Shaded = Msn.VE.MapStyle.Shaded;
    this.Aerial = Msn.VE.MapStyle.Aerial;
    this.Hybrid = Msn.VE.MapStyle.Hybrid;
    this.Oblique = Msn.VE.MapStyle.Oblique;
    this.Birdseye = Msn.VE.MapStyle.Oblique;
    this.BirdseyeHybrid = Msn.VE.MapStyle.ObliqueHybrid
};
VEOrientation = new
function () {
    this.North = Msn.VE.Orientation.North;
    this.East = Msn.VE.Orientation.East;
    this.West = Msn.VE.Orientation.West;
    this.South = Msn.VE.Orientation.South
};

function VEBirdseyeScene(d) {
    VEValidator.ValidateNonNull(d, "obliqueScene");
    var a = d,
        f = null,
        c = null,
        e = new VELatLongFactory(new VELatLongFactoryAlwaysEncodeSpec),
        b = new _xy1;
    this.PixelToLatLong = function (d, b, f) {
        if (b != null) {
            VEValidator.ValidateNonNegativeInt(b, "zoomLevel");
            b = parseInt(b)
        } else b = VEMap._GetMapFromGUID(c).GetZoomLevel();
        if (f) {
            VEValidator.ValidateObjectArray(d, "pixelArray", VEPixel, "VEPixel array");
            VEValidator.ValidateFunction(f, "callback");
            this.PixelToLatLongAsync(d, b, f)
        } else {
            VEValidator.ValidateObject(d, "pixel", VEPixel, "VEPixel");
            var g = a.PixelToLatLong(d, b);
            return e.CreateVELatLong(g.latitude, g.longitude)
        }
    };
    this.PixelToLatLongAsync = function (b, c, d) {
        a.PixelToLatLongAsync(b, c, d)
    };
    this.LatLongToPixel = function (e, d, f) {
        if (d != null) {
            VEValidator.ValidateNonNegativeInt(d, "zoomLevel");
            d = parseInt(d)
        } else d = VEMap._GetMapFromGUID(c).GetZoomLevel();
        if (f) {
            VEValidator.ValidateObjectArray(e, "veLatLongArray", VELatLong, "VELatLong array");
            VEValidator.ValidateFunction(f, "callback");
            this.LatLongToPixelAsync(e, d, f)
        } else {
            VEValidator.ValidateObject(e, "veLatLong", VELatLong, "VELatLong");
            var g = b.Decode(e),
                h = new Msn.VE.LatLong(g.Latitude, g.Longitude);
            return a.LatLongToPixel(h, d)
        }
    };
    this.LatLongToPixelAsync = function (e, g, h) {
        var f = [];
        for (var c = 0; c < e.length; ++c) {
            var d = b.Decode(e[c]);
            f[c] = new Msn.VE.LatLong(d.Latitude, d.Longitude)
        }
        a.LatLongToPixelAsync(f, g, h)
    };
    this.IsValidTile = function (c, d, b) {
        return a.IsValidTile(c, d, b)
    };
    this.GetID = function () {
        return a.GetID()
    };
    this.GetTileFilename = function () {
        return a.GetTileFilename()
    };
    this.GetThumbnailFilename = function () {
        return a.GetThumbnailFilename()
    };
    this.GetOrientation = function () {
        return a.GetOrientation()
    };
    this.GetBounds = function () {
        return a.GetBounds()
    };
    this.GetWidth = function () {
        return a.GetWidth()
    };
    this.GetHeight = function () {
        return a.GetHeight()
    };
    this.ContainsLatLong = function (d) {
        VEValidator.ValidateObject(d, "veLatLong", VELatLong, "VELatLong");
        var c = b.Decode(d),
            e = new Msn.VE.LatLong(c.Latitude, c.Longitude);
        return a.ContainsLatLong(e)
    };
    this.ContainsPixel = function (d, e, b) {
        var c = new VEPixel(d, e);
        return a.ContainsPixel(c, b)
    };
    this.SetClientToken = function (b) {
        f = b;
        a.SetClientToken(b)
    };
    this.SetGUID = function (b) {
        c = b;
        a.SetGUID(b)
    };
    this.GetBoundingRectangle = function () {
        var g = a.PixelToLatLong(new VEPixel(0, 0), 2),
            h = a.PixelToLatLong(new VEPixel(a.GetWidth(), a.GetHeight()), 2),
            i = null;
        if (g && h) {
            var b = 100,
                c = g.latitude,
                d = h.latitude,
                e = g.longitude,
                f = h.longitude;
            if (c < d) {
                c = Math.floor(c * b) / b;
                d = Math.ceil(d * b) / b
            } else {
                c = Math.ceil(c * b) / b;
                d = Math.floor(d * b) / b
            }
            if (e < f) {
                e = Math.floor(e * b) / b;
                f = Math.ceil(f * b) / b
            } else {
                e = Math.ceil(e * b) / b;
                f = Math.floor(f * b) / b
            }
            i = new VELatLongRectangle(new VELatLong(c, e), new VELatLong(d, f))
        }
        return i
    };
    this.GetBoundingRectangleNorthFacing = function () {
        var b = this.GetBoundingRectangle(),
            c = null;
        switch (a.GetOrientation()) {
        case Msn.VE.Orientation.East:
            c = new VELatLongRectangle(new VELatLong(b.TopLeftLatLong.Latitude, b.BottomRightLatLong.Longitude), new VELatLong(b.BottomRightLatLong.Latitude, b.TopLeftLatLong.Longitude));
            break;
        case Msn.VE.Orientation.South:
            c = new VELatLongRectangle(new VELatLong(b.BottomRightLatLong.Latitude, b.BottomRightLatLong.Longitude), new VELatLong(b.TopLeftLatLong.Latitude, b.TopLeftLatLong.Longitude));
            break;
        case Msn.VE.Orientation.West:
            c = new VELatLongRectangle(new VELatLong(b.BottomRightLatLong.Latitude, b.TopLeftLatLong.Longitude), new VELatLong(b.TopLeftLatLong.Latitude, b.BottomRightLatLong.Longitude));
            break;
        default:
            c = b
        }
        return c
    }
}
VEMap.prototype.__HandleAuthentication = function (a) {
    if (this.vemapcontrol) this.vemapcontrol.__HandleAuthentication(a)
};
var VE_ModuleName = {
    APICORE: "__core__",
    APICONTROLS: "__controls__",
    APIBIRDSEYE: "__birdseye__",
    APILAYERS: "__layers__",
    APIFIND: "__find__",
    APIROUTING: "__routing__",
    APITRAFFIC: "__traffic__",
    API3D: "__3d__",
    APITILES: "__tiles__"
},
    _VE_ModuleStatus = {
    "__core__": "loaded",
    "__layers__": null,
    "__controls__": null,
    "__find__": null,
    "__routing__": null,
    "__traffic__": null,
    "___3d__": null,
    "__birdseye__": null,
    "__tiles__": null
};

function _VE_InitAllModules(a) {
    if (Msn.VE.API.Globals.vemapinstances || a == null) {
        var b = Msn.VE.API.Globals.vemapinstances;
        for (var c in b) if (b[c] instanceof VEMap) b[c]._InitializeModules(a.split(","))
    }
    if (_VEDownloadQueue) _VEDownloadQueue.Fire(a)
}
function VE_GetLoadedAPIModules() {
    var b = [VE_ModuleName.APICORE, VE_ModuleName.APICONTROLS, VE_ModuleName.APIBIRDSEYE, VE_ModuleName.APILAYERS, VE_ModuleName.APIFIND, VE_ModuleName.APIROUTING, VE_ModuleName.APITRAFFIC, VE_ModuleName.API3D, VE_ModuleName.APITILES],
        c = [],
        d = b.length;
    for (var a = 0; a < d; a++) if (VE_CheckModuleStatus(b[a]) == "loaded") c.push(b[a]);
    return c
}
function VE_CheckModuleStatus(a) {
    if (a == VE_ModuleName.API3D) a = "_" + a;
    return _VE_ModuleStatus[a]
}
function VE_SetModuleStatus(a, b) {
    if (a == null && typeof _VE_ModuleStatus[a] == "undefined") return;
    if (a == VE_ModuleName.API3D) a = "_" + a;
    _VE_ModuleStatus[a] = b
}
VE_RequestUrl = Msn.VE.API.Globals.vecurrentdomain + "/veapi.ashx?VEAPI_DisableAtlasCompat=true&v=" + Msn.VE.API.Globals.vecurrentversion + "&__load__";

function VEOndemandJsDownloads(l, a, d, g) {
    var e = null;
    if (a == null || typeof a != "string" || typeof d != "object") throw new VEException("VEJsDownloadQueue:Fire", "err_invalidmoduleurl", L_noscripturl_text);
    if (typeof g != "object") g = null;
    var j = false,
        h = false,
        b = null;
    b = a.split(",");
    var m = b.length,
        i = true,
        f = null;
    for (var c = 0; c < m; c++) {
        f = VE_CheckModuleStatus(b[c]);
        if (typeof f == "undefined") throw new VEException("VEJsDownloadQueue:Fire", "err_invalidmoduleurl", L_noscripturl_text);
        else if (f == null) {
            if (i) {
                a = b[0];
                i = false
            } else a += "," + b[c];
            j = true;
            VE_SetModuleStatus(b[c], "loading")
        } else if (f == "loading") h = true
    }
    if (j) {
        if (_VEDownloadQueue == null) _VEDownloadQueue = new VEJsDownloadQueue;
        var k = VE_RequestUrl + "=" + a;
        _VEDownloadQueue.Push(a, d.GUID, g);
        if (l) VENetwork.DownloadScript(k);
        else VENetwork.DownloadScript(k, _VEDownloadQueue.Fire, a);
        e = null
    } else if (h) {
        _VEDownloadQueue.Push(a, d.GUID, g);
        e = null
    } else e = d;
    return e
}
function VEJsDownloadQueue() {
    var a = [],
        c = [],
        b = [];
    this.Dispose = function () {
        a = [];
        c = [];
        b = []
    };
    this.Push = function (d, f, e) {
        if (typeof mapContext == "undefined") mapContext = null;
        a.push(e);
        c.push(d);
        b.push(f)
    };
    this.Fire = function (f) {
        if (a.length == 0) return;
        for (var d = 0; d < a.length; d++) if (c[d] == f) {
            if (b[d]) {
                var e = null;
                e = Msn.VE.API.Globals.vemapinstances[b[d]];
                if (e && typeof a[d][0] == "function") a[d][0].call(e, a[d][1], a[d][2], a[d][3], a[d][4]);
                else throw new VEException("VEJsDownloadQueue:Fire", "err_invalidinvoketarget", L_invalidinvoketarget_text)
            } else a[d][0](a[d][1], a[d][2], a[d][3], a[d][4]);
            a.splice(d, 1);
            c.splice(d, 1);
            b.splice(d, 1);
            d--
        }
    }
}
var _VEDownloadQueue = null;
_VERegisterNamespaces("Msn.VE");
Msn.VE.Animation = {
    Animation: function (h, f) {
        var b = false;
        this.Running = b;
        var e = h,
            d = f,
            a = null;

        function c() {
            if (b) {
                e();
                a = setTimeout(c, d)
            } else a = null
        }
        function g() {
            if (!b) {
                b = true;
                c();
                a = window.setTimeout(c, d)
            }
        }
        this.Start = g;

        function i() {
            if (a != null) {
                window.clearTimeout(a);
                a = null
            }
            b = false
        }
        this.Stop = i
    },
    AccelerationFunction: function (e) {
        var b = null,
            a = 200,
            d = e;
        this.setSteps = function (d) {
            a = d;
            b = null;
            c()
        };
        this.getSteps = function () {
            return a
        };
        this.getValue = function (e) {
            if (!b) c();
            var d = parseInt(Math.round(e * a));
            if (d < 0) d = 0;
            if (d > a) d = a;
            return b[d]
        };
        this.getTotal = function () {
            return this.getValue(1)
        };

        function c() {
            b = [];
            b[0] = 0;
            for (var c = 1; c <= a; c++) b[c] = b[c - 1] + d(c / a)
        }
    },
    Movie: function (b, g) {
        var a = this;
        this.Repeat = true;
        this.AppendContent = true;
        var e = [],
            c = -1,
            d = null;
        this.addFrame = function (b, a) {
            if (a == null) a = true;
            var c = {
                data: b,
                append: a
            };
            e.push(c)
        };
        this.start = function () {
            a.stop();
            a.show();
            a.clear();
            c = -1;
            d = setInterval(h, g)
        };
        this.stop = function () {
            if (d) clearInterval(d)
        };
        this.end = function () {
            a.stop();
            f(e.length - 1)
        };
        this.show = function () {
            b.style.visibility = "visible"
        };
        this.hide = function () {
            b.style.visibility = "hidden"
        };
        this.clear = function () {
            b.innerHTML = ""
        };

        function h() {
            c++;
            if (c > e.length - 1) {
                c = 0;
                if (!a.Repeat) {
                    clearInterval(d);
                    return
                } else a.clear()
            }
            f(c)
        }
        function f(c) {
            var a = e[c];
            if (a.append) b.innerHTML += a.data;
            else b.innerHTML = a.data
        }
    },
    RollDirection: {
        TopDown: 1,
        RightLeft: 2,
        BottomUp: 4,
        LeftRight: 8
    },
    RollStyle: {
        In: 0,
        Out: 1
    },
    Roller: function (q) {
        var c = this;
        this.superclass = Msn.VE.OO.Eventable.EventableObject;
        this.superclass();
        var l = Msn.VE.Css,
            a = Msn.VE.Animation,
            h = Msn.VE.OO.Eventable,
            b = q,
            d = null,
            f = true,
            g = false,
            e = AccelerationFunctions.CrazyElevator,
            i = 10,
            j = 10,
            m = 5,
            p = {
            top: 1,
            right: 2,
            bottom: 3,
            left: 4
        },
            o = {
            top: 3,
            right: 4,
            bottom: 1,
            left: 2
        };
        this.setAccelerationFunction = function (a) {
            if (a instanceof Msn.VE.Animation.AccelerationFunction) e = a
        };
        this.setXLeave = function (a) {
            if (typeof a == "number" && a >= 0) i = Math.floor(a, 10)
        };
        this.setYLeave = function (a) {
            if (typeof a == "number" && a >= 0) j = Math.floor(a, 10)
        };
        this.getLeave = function () {
            return {
                x: i,
                y: j
            }
        };
        this.setDelay = function (a) {
            if (typeof a == "number" && a > 0) m = Math.floor(a, 10)
        };
        this.isExpanded = function () {
            return f
        };
        this.isRolling = function () {
            return g
        };
        this.isAssociated = function () {
            if (d != null && d.length > 0) return true;
            return false
        };
        this.associate = function (a) {
            if (a instanceof Array) d = a
        };
        this.rollIn = function (d) {
            if (g) return;
            c.executeEvent("beforerollin", c, new h.EventArgs("beforerollin", b));
            k(a.RollStyle.In, d);
            f = false
        };
        this.rollOut = function (d) {
            if (g) return;
            c.executeEvent("beforerollout", c, new h.EventArgs("beforerollout", b));
            k(a.RollStyle.Out, d);
            f = true
        };
        this.expand = function (b) {
            k(a.RollStyle.Out, b, false);
            f = true
        };
        this.collapse = function (b) {
            k(a.RollStyle.In, b, false);
            f = false
        };

        function k(u, k, t) {
            g = true;
            if (t !== false) t = true;
            n();
            var f = p,
                q = 0,
                r = 0;
            if (u == a.RollStyle.Out) {
                f = o;
                q = i;
                r = j
            }
            var y = b.offsetWidth,
                w = b.offsetHeight,
                A = y - i,
                B = w - j,
                C = A / e.getTotal(),
                D = B / e.getTotal(),
                x = e.getSteps();
            if (!t) {
                v(1)();
                return
            }
            for (var s = 0; s <= x; s++) {
                var z = s / x;
                setTimeout(v(z), s * m)
            }
            function v(i) {
                return function () {
                    var m = parseInt(Math.round(e.getValue(i) * C)) + q,
                        n = parseInt(Math.round(e.getValue(i) * D)) + r,
                        j = {
                        top: 0,
                        right: 0,
                        bottom: 0,
                        left: 0
                    };
                    if ((k & a.RollDirection.TopDown) == a.RollDirection.TopDown) {
                        l.Functions.setClip(b, f.top, n + "px");
                        j.top = n - r
                    }
                    if ((k & a.RollDirection.RightLeft) == a.RollDirection.RightLeft) {
                        l.Functions.setClip(b, f.right, y - m + "px");
                        j.right = -m + q
                    }
                    if ((k & a.RollDirection.BottomUp) == a.RollDirection.BottomUp) {
                        l.Functions.setClip(b, f.bottom, w - n + "px");
                        j.bottom = -n + r
                    }
                    if ((k & a.RollDirection.LeftRight) == a.RollDirection.LeftRight) {
                        l.Functions.setClip(b, f.left, m + "px");
                        j.left = m - q
                    }
                    if (d != null) {
                        var p;
                        for (p = 0; p < d.length; p++) {
                            var o = d[p],
                                t = j.top + j.bottom,
                                x = o.origPos.y + t,
                                s = j.left + j.right,
                                v = o.origPos.x + s;
                            if (s != 0) o.style.left = v + "px";
                            if (t != 0) o.style.top = x + "px"
                        }
                    }
                    if (i == 1) {
                        g = false;
                        if (u == a.RollStyle.In) c.executeEvent("afterrollin", c, new h.EventArgs("afterrollin", b));
                        else {
                            b.style.clip = "rect(auto auto auto auto)";
                            c.executeEvent("afterrollout", c, new h.EventArgs("afterrollout", b))
                        }
                    }
                    c.executeEvent("roll", c, new h.EventArgs("roll", b))
                }
            }
        }
        function n() {
            var b = Msn.VE.Css;
            if (d == null) return;
            var c, i = d.length;
            for (c = 0; c < i; c++) {
                var a = d[c];
                a.origPos = {
                    x: parseInt(b.Functions.getComputedStyle(a, "left")),
                    y: parseInt(b.Functions.getComputedStyle(a, "top"))
                };
                if (isNaN(a.origPos.x)) {
                    var f = parseInt(b.Functions.getComputedStyle(a, "marginLeft"), 10),
                        e = parseInt(b.Functions.getCoputedStyle(a, "paddingLeft"), 10);
                    a.origPos.x = a.offsetLeft - (isNaN(f) ? 0 : f) - (isNaN(e) ? 0 : e)
                }
                if (isNaN(a.origPos.y)) {
                    var h = parseInt(b.Functions.getComputedStyle(a, "marginTop"), 10),
                        g = parseInt(b.Functions.getComputedStyle(a, "paddingTop"), 10);
                    a.origPos.y = a.offsetTop - (isNaN(h) ? 0 : h) - (isNaN(g) ? 0 : g)
                }
            }
            b = null
        }
    },
    Slider: function () {
        var d = this,
            c = Msn.VE.Geometry,
            a = AccelerationFunctions.Linear,
            b = 5;
        this.setAccelerationFunction = function (b) {
            if (b instanceof Msn.VE.Animation.AccelerationFunction) a = b
        };
        this.setDelay = function (a) {
            if (typeof a == "number" && a > 0) b = a
        };
        this.slideToPoint = function (e, i) {
            var d = new c.Point(e.offsetLeft, e.offsetTop),
                n = d.getDistanceFrom(i);
            a.setSteps(Math.floor(n / 10));
            var p = n / a.getTotal(),
                o = i.y - d.y,
                l = i.x - d.x,
                f = Math.atan(o / l),
                m = a.getSteps();
            for (var h = 0; h <= m; h++) {
                sum = a.getValue(h / m);
                var g = sum * p,
                    k, j;
                if (l < 0) {
                    k = d.y - Math.sin(f) * g;
                    j = d.x - Math.cos(f) * g
                } else {
                    k = d.y + Math.sin(f) * g;
                    j = d.x + Math.cos(f) * g
                }
                setTimeout(q(j, k), h * b)
            }
            function q(a, b) {
                return function () {
                    e.style.top = parseInt(Math.round(b)) + "px";
                    e.style.left = parseInt(Math.round(a)) + "px"
                }
            }
        }
    }
};
var AccelerationFunctions = {
    Linear: new Msn.VE.Animation.AccelerationFunction(function () {
        return 1
    }),
    ExponentialAcc: new Msn.VE.Animation.AccelerationFunction(function (b) {
        var a = 0,
            d = 1,
            c = d - a,
            f = a + b * c,
            e = Math.pow(f, 2);
        return e
    }),
    ExponentialDec: new Msn.VE.Animation.AccelerationFunction(function (b) {
        var a = -1,
            d = 0,
            c = d - a,
            f = a + b * c,
            e = Math.pow(f, 2);
        return e
    }),
    CosineWave: new Msn.VE.Animation.AccelerationFunction(function (b) {
        var a = -Math.PI,
            d = Math.PI,
            c = d - a,
            f = a + b * c,
            e = Math.cos(f) + 1;
        return e
    }),
    CrazyElevator: new Msn.VE.Animation.AccelerationFunction(function (b) {
        var a = -5,
            d = 5,
            c = d - a,
            f = a + b * c,
            e = 2 / (Math.pow(Math.abs(f), 3) + 1);
        return e
    })
};
_VERegisterNamespaces("Msn.VE.Geometry");
Msn.VE.Geometry.Point = function (c, d) {
    var a = this,
        b = Msn.VE.Geometry;
    this.x = c;
    this.y = d;
    this.add = function (c, d) {
        var e = new b.Point(a.x + c, a.y + d);
        return e
    };
    this.getDistanceFrom = function (b) {
        var c = Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2),
            d = Math.sqrt(c);
        return d
    }
};
Msn.VE.Geometry.Overlap = {
    Range: {
        GreaterThanX: 1,
        LessThanX: 2,
        GreaterThanY: 4,
        LessThanY: 8,
        InXRange: 16,
        InYRange: 32,
        InRange: 48
    },
    getInstance: function (f, g) {
        var d = Msn.VE.Geometry.Overlap,
            a = f,
            b = g,
            c = 0;
        e();

        function e() {
            if (b.getP2().x > a.getP2().x) c += d.Range.GreaterThanX;
            if (b.getP1().x < a.getP1().x) c += d.Range.LessThanX;
            if (b.getP2().y > a.getP2().y) c += d.Range.GreaterThanY;
            if (b.getP1().y < a.getP1().y) c += d.Range.LessThanY;
            if (a.getP1().x <= b.getP1().x && b.getP2().x <= a.getP2().x) c += d.Range.InXRange;
            if (a.getP1().y <= b.getP1().y && b.getP2().y <= a.getP2().y) c += d.Range.InYRange
        }
        this.getRange = function () {
            return c
        };
        this.getLeftXBleed = function () {
            if (c & d.Range.LessThanX) return Math.abs(a.getP1().x - b.getP1().x);
            else return 0
        };
        this.getRightXBleed = function () {
            if (c & d.Range.GreaterThanX) return b.getP2().x - a.getP2().x;
            else return 0
        };
        this.getTopYBleed = function () {
            if (c & d.Range.LessThanY) return Math.abs(a.getP1().y - b.getP1().y);
            else return 0
        };
        this.getBottomYBleed = function () {
            if (c & d.Range.GreaterThanY) return b.getP2().y - a.getP2().y;
            else return 0
        }
    }
};
Msn.VE.Geometry.Rectangle = function (h, i) {
    var g = this,
        a = h,
        b = i,
        d, e;
    f();

    function f() {
        c()
    }
    this.move = function (c) {
        a.x = c.x;
        a.y = c.y;
        b.x = c.x + e;
        b.y = c.y + d
    };
    this.getP1 = function () {
        return a
    };
    this.getP2 = function () {
        return b
    };
    this.setP1 = function (b) {
        a = b;
        c()
    };
    this.setP2 = function (a) {
        b = a;
        c()
    };
    this.getWidth = function () {
        return e
    };
    this.getHeight = function () {
        return d
    };
    this.containsPoint = function (c) {
        return c.x >= a.x && c.x <= b.x && c.y >= a.y && c.y <= b.y
    };
    this.scale = function (d) {
        a.x -= d;
        a.y -= d;
        b.x += d;
        b.y += d;
        c()
    };
    this.getOverlap = function (a) {
        var b = Msn.VE.Geometry;
        return new b.Overlap.getInstance(g, a)
    };

    function c() {
        d = b.y - a.y;
        e = b.x - a.x
    }
};
Msn.VE.Geometry.Functions = {
    getSlope: function (a, b) {
        return (b.y - a.y) / (b.x - a.x)
    },
    getYIntercept: function (b, a) {
        return a.y - b * a.x
    },
    getBestBoundingPoint: function (f, b, c) {
        var a = Msn.VE.Geometry;
        if (!b) b = g(f).getScreenPosition();
        var e = new a.Rectangle(b, new a.Point(b.x + f.offsetWidth, b.y + f.offsetHeight)),
            j = c.getOverlap(e),
            d = j.getRange();
        if ((d & a.Overlap.Range.InRange) == a.Overlap.Range.InRange) return b;
        var h = b.x,
            i = b.y;
        if (d & a.Overlap.Range.GreaterThanX) h = c.getP2().x - e.getWidth();
        if (d & a.Overlap.Range.LessThanX) h = c.getP1().x;
        if (d & a.Overlap.Range.GreaterThanY) i = c.getP2().y - e.getHeight();
        if (d & a.Overlap.Range.LessThanY) i = c.getP1().y;
        return new a.Point(h, i)
    }
};
_VERegisterNamespaces("Msn.VE.OO.Eventable");
Msn.VE.OO.Eventable.EventArgs = function (b, a) {
    this.EventName = b;
    this.Recipient = a
};
Msn.VE.OO.Eventable.EventableObject = function () {
    if (typeof window.attachEvent != "undefined") window.attachEvent("onunload", c);
    var a = [];
    this.getEventHash = function () {
        return a
    };
    this.hookEvent = function (d, e) {
        var c = a[d];
        if (typeof c == "undefined" || c == null) {
            c = new b(d);
            a[d] = c
        }
        c.addEvent(e)
    };
    this.unhookEvent = function (d, e) {
        var c = a[d];
        if (c instanceof b) c.removeEvent(e)
    };
    this.executeEvent = function (g, h, f) {
        var d = a[g];
        if (! (d instanceof b)) return;
        var e = d.getEvents(),
            c;
        for (c = 0; c < e.length; c++) e[c].call(h, f)
    };

    function b(b) {
        var c = b,
            a = [];
        this.addEvent = function (c) {
            if (typeof c == "function") {
                var b;
                for (b = 0; b < a.length; b++) if (a[b] == c) return;
                a.push(c)
            }
        };
        this.removeEvent = function (c) {
            if (typeof c != "function") return;
            var b;
            for (b = 0; b < a.length; b++) if (a[b] == c) {
                a[b] = null;
                delete a[b];
                a.splice(b, 1)
            }
        };
        this.destroy = function () {
            var b;
            for (b = 0; b < a.length; b++) {
                a[b] = null;
                delete a[b]
            }
        };
        this.getEvents = function () {
            return a
        }
    }
    function c() {
        var d;
        for (d in a) if (a[d] instanceof b) {
            a[d].destroy();
            a[d] = null
        }
        a = null;
        window.detachEvent("onunload", c)
    }
};
var ERO = {
    Classes: {
        ContainerNoBeak: "ero ero-noBeak",
        ContainerRightBeak: "ero ero-rightBeak",
        ContainerLeftBeak: "ero ero-leftBeak",
        Beak: "ero-beak",
        Shadow: "ero-shadow",
        Body: "ero-body",
        Actions: "ero-actions",
        ActionsBackground: "ero-actionsBackground",
        PreviewArea: "ero-previewArea",
        PaddingHack: "ero-paddingHack",
        ProgressAnimation: "ero-progressAnimation"
    },
    DefaultClasses: null,
    BeakDirection: {
        Right: 0,
        Left: 1
    },
    DockPosition: {
        Top: 0,
        Center: 1
    },
    m_theEro: null,
    BeakHeight: 34,
    Glitz: function (d, e, b, c) {
        var a = this;
        this.useBeak = d;
        this.useFade = e;
        this.useProgressTimer = b;
        this.isTemporary = c;
        this.copy = function () {
            return new ERO.Glitz(a.useBeak, a.useFade, a.useProgressTimer, a.isTemporary)
        }
    },
    EROEventArgs: function (c, a, b) {
        this.superclass = Msn.VE.OO.Eventable.EventArgs;
        this.superclass(c, a);
        this.Entity = b
    },
    getInstance: function () {
        var a = Msn.VE.Geometry;
        if (!ERO.m_theEro) {
            ERO.m_theEro = new b;
            ERO.m_theEro.setBoundingArea(null)
        }
        ERO.m_theEro.addToPage();
        return ERO.m_theEro;

        function b() {
            this.superclass = Msn.VE.OO.Eventable.EventableObject;
            this.superclass();
            var c = this,
                r = null,
                f = null,
                k = null,
                h = false,
                o = 500,
                n = 0,
                B = true,
                i = new ERO.Glitz(true, true, true, false),
                C = i.copy(),
                w = 0,
                z = false,
                b = document.createElement("div");
            b.className = ERO.Classes.ContainerLeftBeak;
            if (typeof b.addEventListener != "undefined") {
                b.addEventListener("mouseover", x, false);
                b.addEventListener("mouseout", y, false)
            } else {
                b.attachEvent("onmouseover", x);
                b.attachEvent("onmouseout", y)
            }
            var s = document.createElement("div");
            s.className = ERO.Classes.Shadow;
            var j = document.createElement("div");
            j.className = ERO.Classes.Body;
            var q = document.createElement("div");
            q.className = ERO.Classes.Actions;
            var p = document.createElement("ul"),
                m = document.createElement("div");
            m.className = ERO.Classes.ActionsBackground;
            var l = document.createElement("div");
            l.className = ERO.Classes.PreviewArea;
            var t = document.createElement("div");
            t.className = ERO.Classes.Beak;
            var v = document.createElement("div");
            v.className = ERO.Classes.PaddingHack;
            b.appendChild(s);
            b.appendChild(t);
            s.appendChild(j);
            j.appendChild(m);
            m.appendChild(l);
            m.appendChild(q);
            q.appendChild(p);
            m.appendChild(v);
            var d = document.createElement("div");
            d.className = ERO.Classes.ProgressAnimation;
            var e = new Msn.VE.Animation.Movie(d, 75);
            e.addFrame('<div class = "frame1"></div>');
            e.addFrame('<div class = "frame2"></div>');
            e.addFrame('<div class = "frame3"></div>');
            e.addFrame("");
            e.addFrame("");
            e.addFrame('<div class = "frame2"></div><div class = "frame3"></div>', false);
            e.addFrame('<div class = "frame3"></div>', false);
            e.Repeat = false;
            this.destroy = function () {
                if (b) {
                    if (typeof b.removeEventListener != "undefined") {
                        b.removeEventListener("mouseover", x, false);
                        b.removeEventListener("mouseout", y, false)
                    } else {
                        b.detachEvent("onmouseover", x);
                        b.detachEvent("onmouseout", y)
                    }
                    if (j.shimElement) {
                        j.shimElement.removeNode(true);
                        j.shimElement = null
                    }
                    b.parentNode.removeChild(b);
                    d.parentNode.removeChild(d);
                    b = null;
                    s = null;
                    j = null;
                    q = null;
                    p = null;
                    m = null;
                    l = null;
                    t = null;
                    v = null
                }
                ERO.m_theEro = null;
                k = null
            };
            this.getElement = function () {
                return b
            };
            this.getBody = function () {
                return j
            };
            this.getAnimation = function () {
                return e
            };
            this.getDelay = function () {
                return o + n
            };
            this.setDelay = function (a) {
                o = a || o
            };
            this.getDelayDelta = function () {
                return n
            };
            this.setDelayDelta = function (a, b) {
                B = b == false ? false : true;
                if (typeof a == "number") {
                    n = a;
                    if (!h && r != -1) c.hide()
                }
            };
            this.setClasses = function (b, d) {
                var a;
                if (ERO.DefaultClasses === null) {
                    ERO.DefaultClasses = {};
                    for (a in ERO.Classes) ERO.DefaultClasses[a] = ERO.Classes[a]
                }
                if (d !== false) c.setClasses(ERO.DefaultClasses, false);
                for (a in b) if (typeof ERO.Classes[a] != "undefined") ERO.Classes[a] = b[a];
                D()
            };
            this.setBeak = function (a) {
                if (a == ERO.BeakDirection.Left) g(b).removeClass(ERO.Classes.ContainerRightBeak).addClass(ERO.Classes.ContainerLeftBeak);
                else g(b).removeClass(ERO.Classes.ContainerLeftBeak).addClass(ERO.Classes.ContainerRightBeak)
            };
            this.setContent = function (c) {
                var a = document.createElement("div");
                a.className = "firstChild";
                a.innerHTML = c;
                var b = l.firstChild;
                if (b) l.replaceChild(a, b);
                else l.appendChild(a);
                a = null;
                b = null
            };
            this.addAction = function (b) {
                var a = document.createElement("li");
                if (!b) return;
                a.innerHTML = b;
                p.appendChild(a);
                a = null
            };
            this.clearActions = function () {
                var a = p.getElementsByTagName("li"),
                    c = a.length;
                for (var b = 0; b < c; b++) p.removeChild(a[0])
            };
            this.dockToText = function (e, b, i) {
                b = typeof b != "undefined" ? b : typeof window.event != "undefined" ? window.event : null;
                var k = g(e).getPagePosition(),
                    h = Gimme.Screen.getMousePosition(b).x,
                    j = new a.Point(h, k.y),
                    f = new a.Point(0, parseInt(d.offsetHeight / 2, 10));
                c.dockToPoint(j, f, e, i)
            };
            this.dockToElement = function (b, e) {
                var d = g(b).getPagePosition(),
                    f = new a.Rectangle(d, new a.Point(d.x + b.offsetWidth, d.y + b.offsetHeight));
                c.dockToRect(f, null, b, e)
            };
            this.dockToPoint = function (b, d, f, e) {
                c.dockToRect(new a.Rectangle(b, b), d, f, e)
            };
            this.dockToRect = function (m, q, I, C) {
                if (k === I) {
                    clearTimeout(r);
                    if (h) return
                } else if (k !== null) {
                    clearTimeout(r);
                    A()
                }
                var v = "px";
                h = true;
                k = I;
                b.style.visibility = "hidden";
                c.setBeak(ERO.BeakDirection.Left);
                if (typeof q == "undefined" || q == null) q = {
                    x: 0,
                    y: 0
                };
                C = C || "";
                j.style.width = C;
                var g = l.offsetHeight - ERO.BeakHeight;
                d.style.top = m.getP1().y - d.offsetHeight + q.y + v;
                d.style.left = m.getP2().x - d.offsetWidth + q.x + v;
                var s = m.getP2().x,
                    E = m.getP2().y - g - ERO.BeakHeight / 2 - m.getHeight() / 2,
                    y = c.getSize(),
                    G = y.getP2().y - y.getP1().y,
                    B = y.getP2().x - y.getP1().x,
                    J = new a.Rectangle(new a.Point(s, E), new a.Point(s + B, E + G)),
                    D = f.getOverlap(J),
                    p = D.getRange(),
                    x, w;
                if (p & a.Overlap.Range.InXRange) w = s;
                if (p & a.Overlap.Range.InYRange) x = E;
                if (p & a.Overlap.Range.GreaterThanX) {
                    c.setBeak(ERO.BeakDirection.Right);
                    w = s > f.getP2().x ? f.getP1().x + f.getWidth() - B : s - B - m.getWidth()
                }
                if (p & a.Overlap.Range.LessThanX) {
                    c.setBeak(ERO.BeakDirection.Left);
                    w = f.getP1().x
                }
                if (p & a.Overlap.Range.GreaterThanY) {
                    x = f.getP1().y + f.getHeight() - G;
                    var H = D.getBottomYBleed();
                    g += H;
                    if (g > b.offsetHeight - ERO.BeakHeight) g = b.offsetHeight - ERO.BeakHeight - 4
                }
                if (p & a.Overlap.Range.LessThanY) {
                    x = f.getP1().y;
                    var H = D.getTopYBleed();
                    g -= H;
                    if (g < 0) g = 0
                }
                b.style.top = x + v;
                b.style.left = w + v;
                t.style.top = g + "px";
                c.executeEvent("beforeshow", c, new ERO.EROEventArgs("beforeshow", b, k));
                if (!i.useBeak) b.className = ERO.Classes.ContainerNoBeak;
                z = false;
                if (i.useProgressTimer) {
                    e.start();
                    if (!i.useFade) {
                        setTimeout(u, o + n);
                        return
                    }
                }
                if (i.useFade) setTimeout(F, o + n);
                else u()
            };
            this.showImmediate = function () {
                z = h = true;
                e.end();
                u()
            };
            this.hide = function (a) {
                h = false;
                if (a === true) A();
                else {
                    clearTimeout(r);
                    r = setTimeout(A, o + n)
                }
            };
            this.setGlitz = function (c, d, a, b) {
                if (c != null) i.useBeak = c;
                if (d != null) i.useFade = d;
                if (a != null) i.useProgressTimer = a;
                if (b === true) i.isTemporary = b;
                else C = i.copy()
            };
            this.setBoundingArea = function (e, g) {
                if (e === null) {
                    var b = Gimme.Screen.getScrollPosition(),
                        c = Gimme.Screen.getViewportSize(),
                        d = new a.Rectangle(new a.Point(0, 0), new a.Point(c.width, c.height));
                    d.move(new a.Point(b.x, b.y));
                    f = d
                } else f = new a.Rectangle(e, g)
            };
            this.getBoundingArea = function () {
                return f
            };
            this.isInUse = function () {
                return h
            };
            this.isVisible = function () {
                return b.style.visibility == "visible"
            };
            this.addToPage = function () {
                b.style.visibility = "hidden";
                d.style.visibility = "hidden";
                document.body.appendChild(b);
                document.body.appendChild(d)
            };
            this.getSize = function () {
                var c = b.offsetLeft,
                    d = b.offsetTop,
                    f = c + b.offsetWidth,
                    g = d + b.offsetHeight,
                    e = new a.Rectangle(new a.Point(c, d), new a.Point(f, g));
                return e
            };

            function E(b, a) {
                if (b == a) return false;
                while (a && a != b) a = a.parentNode;
                return a == b
            }
            function x() {
                h = true
            }
            function y(a) {
                var d = a.relatedTarget || a.toElement || a.srcElement;
                if (!E(b, d)) c.hide()
            }
            function u() {
                if (b && h) {
                    if (b.style.visibility != "visible") b.style.visibility = "visible";
                    if (typeof b.style.opacity != "undefined") b.style.opacity = 1;
                    c.executeEvent("aftershow", c, new ERO.EROEventArgs("aftershow", b, k));
                    i = C.copy()
                }
            }
            function A() {
                if (!h && b) {
                    c.executeEvent("beforehide", c, new ERO.EROEventArgs("beforehide", b, k));
                    b.style.visibility = "hidden";
                    e.hide();
                    if (!Msn.VE.API) {
                        d.style.left = b.style.left = "0";
                        d.style.top = b.style.top = "0"
                    }
                    k = null;
                    c.executeEvent("afterhide", c, new ERO.EROEventArgs("afterhide", b, k))
                }
                if (B) n = 0
            }
            function F() {
                if (z || !h || !b) return;
                if (b.style && typeof b.style.filter != "undefined") {
                    b.style.filter = "progid:DXImageTransform.Microsoft.Fade(duration=.5)";
                    b.filters[0].Apply();
                    b.style.visibility = "visible";
                    b.style.display = "block";
                    b.filters[0].Play();
                    var c = setInterval(function () {
                        if (b.filters[0].status == 0) {
                            clearInterval(c);
                            u()
                        }
                    },
                    10)
                } else {
                    b.style.visibility = "visible";
                    if (w === 0) a()
                }
                function a() {
                    if (h && ++w <= 10) {
                        var c = w * .09999999;
                        b.style.opacity = c;
                        setTimeout(a, 50)
                    } else {
                        u();
                        w = 0
                    }
                }
            }
            function D() {
                b.className = ERO.Classes.Container;
                s.className = ERO.Classes.Shadow;
                j.className = ERO.Classes.Body;
                t.className = ERO.Classes.Beak;
                q.className = ERO.Classes.Actions;
                m.className = ERO.Classes.ActionsBackground;
                l.className = ERO.Classes.PreviewArea;
                v.className = ERO.Classes.PaddingHack;
                d.className = ERO.Classes.ProgressAnimation
            }
        }
    }
};

function LogEROBehavior(eroEvent, fromPanel) {
    var bERO = $find(eroEvent.Entity.id + "_ero");
    if (bERO != null) {
        var eroSource = eval(fromPanel ? bERO.get_EROPanel() : bERO.get_EROMap()),
            pageName = eval(bERO.get_PageName());
        if (eroSource) $VE_A.Log(pageName, eroSource)
    }
}
function LogEROBehaviorFromPanel(a) {
    ero.unhookEvent("aftershow", LogEROBehaviorFromPanel);
    LogEROBehavior(a, true)
}
function LogEROBehaviorFromMap(a) {
    ero.unhookEvent("aftershow", LogEROBehaviorFromMap);
    LogEROBehavior(a, false)
}
function VETime() {}
VETime.FormatTime = function (a) {
    if (a == null || a == "" || a == "undefined") return "";
    var c = false,
        d = a.substr(0, 10),
        e = a.substr(11, 5),
        b = "";
    if (a.indexOf("AM") > -1) {
        b = "AM";
        c = true
    } else b = "PM";
    return d + " " + VETime.ConvertTo12HourFormat(e, c) + " " + b
};
VETime.ConvertTo12HourFormat = function (d, c) {
    var a = d;
    try {
        var b = parseFloat(a.replace(":", "."));
        if (b > 12) if (b < 13 && c != true);
        else b = b - 12;
        a = b.toFixed(2);
        a = a.replace(".", ":")
    } catch(e) {
        a = ""
    }
    return a
};
VETime.FormatPanelTime = function (a, g) {
    if (a == null || a == "" || a == "undefined") return "";
    try {
        var b = 0,
            d = false,
            i = a.substr(4, 8),
            h = a.indexOf(":"),
            f = a.substr(h - 2, 5),
            c = "";
        if (a.indexOf("AM") > -1) {
            c = "AM";
            d = true;
            b = a.indexOf("AM")
        } else {
            c = "PM";
            b = a.indexOf("PM")
        }
        var e = "";
        if (b > 0) e = a.substr(b + 3, 3);
        if (g) return i + " " + VETime.ConvertTo12HourFormat(f, d) + " " + c + " " + e;
        else return VETime.ConvertTo12HourFormat(f, d) + " " + c + " " + e
    } catch(j) {}
};
VETime.getMonth = function (a) {
    switch (a) {
    case "01":
        return " Jan";
    case "02":
        return " Feb";
    case "03":
        return " Mar";
    case "04":
        return " Apr";
    case "05":
        return " May";
    case "06":
        return " Jun";
    case "07":
        return " Jul";
    case "08":
        return " Aug";
    case "09":
        return " Sep";
    case "10":
        return " Oct";
    case "11":
        return " Nov";
    case "12":
        return " Dec"
    }
};
VEMap.prototype.GetImageryMetadata = function (c, a) {
    var j = this;
    VEValidator.ValidateFunction(c);
    if (a) {
        VEValidator.ValidateObject(a, "options", VEImageryMetadataOptions, "VEImageryMetadataOptions");
        if (a.LatLong != null) VEValidator.ValidateObject(a.LatLong, "LatLong", VELatLong, "VELatLong");
        if (a.MapStyle != null) VEValidator.ValidateMapStyle(a.MapStyle, "MapStyle");
        if (a.ZoomLevel != null) {
            VEValidator.ValidateNonNegativeInt(a.ZoomLevel, "ZoomLevel");
            if (a.ZoomLevel == 0 || a.ZoomLevel > Msn.VE.API.Globals.vemaxzoom) throw new VEException("VEMap.GetImageryMetadata", "err_invalidargument", L_invalidargument_text.replace("%1", "ZoomLevel").replace("%2", "int"))
        }
    } else a = new VEImageryMetadataOptions;
    if (a.LatLong == null) a.LatLong = this.GetCenter();
    if (a.MapStyle == null) a.MapStyle = this.GetMapStyle();
    if (a.ZoomLevel == null) a.ZoomLevel = this.GetZoomLevel();
    if ((a.MapStyle == VEMapStyle.Road || a.MapStyle == VEMapStyle.Shaded || a.MapStyle == VEMapStyle.Aerial || a.MapStyle == VEMapStyle.Hybrid) && (this.HasClientToken() || this.HasValidCredentials())) {
        if (a.MapStyle == VEMapStyle.Shaded) a.MapStyle == VEMapStyle.Road;
        var d = new Msn.VE.LatLong;
        d.latitude = a.LatLong.Latitude;
        d.longitude = a.LatLong.Longitude;
        var g = this.vemapcontrol.GetOrthoMode(),
            i = g.LatLongToPixel(d, a.ZoomLevel),
            h = VEPixelToQuadKey(i, a.ZoomLevel),
            b = [];
        if (this.HasClientToken()) b.push(new VEParameter(Msn.VE.API.Constants.clienttoken, this.ClientToken));
        b.push(new VEParameter("quadKey", '"' + h + '"'));
        b.push(new VEParameter("mapStyle", '"' + a.MapStyle + '"'));
        b.push(new VEParameter("tileGeneration", '"' + this.vemapcontrol.GetTileGeneration(a.MapStyle) + '"'));
        this.vemapcontrol.Fire("onstartrequest");

        function e(a) {
            j._GetImageryMetadataHandler(a, c)
        }
        VEAPIRequestInvoke(Msn.VE.API.Constants.imageryurl + "/GetTileMetadata", b, e)
    } else {
        var f = new VEImageryMetadata;
        c(f)
    }
};
VEMap.prototype._GetImageryMetadataHandler = function (a, c) {
    this.vemapcontrol.Fire("onendrequest");
    this.__HandleAuthentication(a);
    var b = null;
    if (a) {
        b = new VEImageryMetadata;
        if (typeof a.Vintage != "undefined" && a.Vintage != null) {
            if (typeof a.Vintage.From != "undefined" && a.Vintage.From != null) {
                var d = a.Vintage.From;
                b.DateRangeStart = ParseJsonDate(d)
            }
            if (typeof a.Vintage.To != "undefined" && a.Vintage.To != null) {
                var e = a.Vintage.To;
                b.DateRangeEnd = ParseJsonDate(e)
            }
        }
    }
    if (typeof c == "function") c(b)
};

function ParseJsonDate(dateString) {
    var date = null;
    if (dateString) try {
        dateString = dateString.replace(/\//g, "");
        date = eval("new " + dateString + ";")
    } catch(a) {}
    return date
}
function VEImageryMetadata() {
    this.DateRangeStart = null;
    this.DateRangeEnd = null;
    this.toString = function () {
        strDateStart = "";
        strDateEnd = "";
        if (this.DateRangeStart) strDateStart += this.DateRangeStart.getFullYear();
        if (this.DateRangeEnd) strDateEnd += this.DateRangeEnd.getFullYear();
        var a;
        if (strDateStart == strDateEnd) a = strDateStart;
        else a = strDateStart + " - " + strDateEnd;
        return a
    }
}
function VEImageryMetadataOptions() {
    this.LatLong = null;
    this.MapStyle = null;
    this.ZoomLevel = null
}
var customCursors = Msn.VE.Css.Cursors.CustomCursors;
if (customCursors != null) {
    var i, len = customCursors.length;
    for (i = 0; i < len; i++) customCursors[i].domain = Msn.VE.API.Globals.vecurrentdomain;
    Msn.VE.Css.Cursors.defineCustomCursors(customCursors)
}
if (! (navigator.userAgent.indexOf("IE") >= 0) && (typeof VEAPI_DisableAtlasCompat == "undefined" || VEAPI_DisableAtlasCompat != true)) VENetwork.DownloadScript(Msn.VE.API.Constants.atlascompatjs);
VENetwork.AttachStyleSheet(Msn.VE.API.Constants.stylesheet);
if (navigator.userAgent.indexOf("MSIE") >= 0 && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE") + 5)) == 6) VENetwork.AttachStyleSheet(Msn.VE.API.Constants.stylesheetiev6);
try {
    document.namespaces.add("v", "urn:schemas-microsoft-com:vml")
} catch(a) {}
function RequestQueueItem(a, b, c, d) {
    this.Call = a;
    this.Param1 = b;
    this.Param2 = c;
    this.Param3 = d
}
function VECustomEvent(b, a) {
    this.Name = b;
    this.Callback = a
}
VECacheMode = {
    Auto: 0,
    EnableTileCaching: 1
};

function VEMapOptions() {
    this.EnableBirdseye = true;
    this.EnableDashboardLabels = true;
    this.LoadBaseTiles = true;
    this.BirdseyeOrientation = VEOrientation.North;
    this.DrawingBuffer = 0;
    this.CacheMode = VECacheMode.Auto
}
function VEMap(g) {
    var a = this;
    this.ID = g;
    this.GUID = VENetwork.GetExecutionID();
    this.ClientToken = null;
    this.Credentials = null;
    var f = false;
    if (Msn.VE.API.Globals.vemapinstances == null || Msn.VE.API.Globals.vemapinstances == "undefined") Msn.VE.API.Globals.vemapinstances = [];
    Msn.VE.API.Globals.vemapinstances[this.GUID] = a;
    this.requestQueue = [];
    this.preInitCustomEvents = [];
    this.network = new VENetwork;
    this.mapelement = $ID(g);
    this.pushpins = [];
    this.DisambiguationCallback = null;
    this.ShowMessageBox = true;
    if (this.mapelement == null) throw new VEException("VEMap:cstr", "err_invalidelement", L_invalidelement_text);
    this.m_vedirectionsmanager = null;
    this._dm = this.m_vedirectionsmanager;
    this.m_routemanager = null;
    this.m_vesearchmanager = null;
    this._sm = this.m_vesearchmanager;
    this.m_vemessage = new VEMessage(this);
    this.m_veambiguouslist = new VEAmbiguouslist(this);
    var c = new VELatLongFactory(new VELatLongFactorySpecFromMap(this)),
        b = new _xy1;
    this.queueEventInitialized = false;
    this.RequestQueueEnabled = true;
    this.queueEventInitialized = false;
    windowWidth = GetWindowWidth();
    windowHeight = GetWindowHeight();
    scrollbarWidth = GetScrollbarWidth();
    this.dashboardSize = Msn.VE.DashboardSize.Normal;
    this.dashboardVersion = 6;
    this._showDashboard = true;
    this._showScalebar = true;
    this._mapPrintOptions = null;
    this.LoadMap = function (c, i, l, k, d, h, e, g) {
        if (!a) throw new VEException("VEMap:LoadMap", "err_notinitializedmap", L_notinitialized_text);
        if (typeof d != "undefined" && d != null) {
            VEValidator.ValidateMapMode(d, "mapMode");
            this.mapMode = d
        }
        if (c != null && c != "undefined") {
            VEValidator.ValidateObject(c, "veLatLong", VELatLong, "VELatLong");
            var f = b.Decode(c);
            this.initialLatitude = f.Latitude;
            this.initialLongitude = f.Longitude
        }
        this.fixedMap = k;
        this.initialZoomLevel = i;
        this.initialMapStyle = l;
        this.showMapModeSwitch = h;
        if (e != null && typeof e != "undefined") this.tileBuffer = e;
        this._mapOptions = g ? g : new VEMapOptions;
        VEValidator.ValidateOrientation(this._mapOptions.BirdseyeOrientation, "VEMapOptions.BirdseyeOrientation");
        VEValidator.ValidateFloat(this._mapOptions.DrawingBuffer, "VEMapOptions.DrawingBuffer");
        VEValidator.ValidateBetween(this._mapOptions.DrawingBuffer, "VEMapOptions.DrawingBuffer", 0, Number.POSITIVE_INFINITY);
        VEValidator.ValidateCacheMode(this._mapOptions.CacheMode, "VEMapOptions.CacheMode");
        this.veonmaploadevent = this.onLoadMap;
        this.mapelement.innerHTML = "";
        this.mapelement.innerHTML = "<table width=100% height=100%><tr valign=middle><td align=center valign=middle><h3>" + L_loading_text + "</h3></td></tr></table>";
        this.InitializeMap();
        this.vemapcontrol.AttachEvent("onstartpan", function () {
            if (window.ero) window.ero.hide(true)
        });
        setTimeout(j, 10)
    };

    function j() {
        e([new VEParameter("entry", "0")])
    }
    function e(b) {
        if (b) {
            var g = Msn.VE.API.Constants.logservice + "/Log?",
                f = false,
                c = null;
            if (a.Credentials != null && a.Credentials.length > 0) c = a.Credentials;
            else if (a.HasClientToken()) c = a.ClientToken;
            else {
                c = Msn.VE.API.Constants.defaultLogCredentials;
                f = true
            }
            var e = new Image;
            if (c != null && c.length > 0) {
                b.push(new VEParameter("auth", c));
                if (!f) {
                    e.onerror = h;
                    e.onload = i
                }
            }
            b.push(new VEParameter("fmt", "1"));
            b.push(new VEParameter("type", "3"));
            b.push(new VEParameter("group", "MapControl"));
            b.push(new VEParameter("name", "AJAX"));
            b.push(new VEParameter("version", Msn.VE.API.Globals.vecurrentversion));
            b.push(new VEParameter("session", a.GUID));
            b.push(new VEParameter("mkt", Msn.VE.API.Globals.locale));
            b.push(new VEParameter("image", "1"));
            for (var d = 0; d < b.length; d++) g += b[d].Name + "=" + b[d].Value + "&";
            e.src = g
        }
    }
    function h() {
        f = false;
        if (a && a.vemapcontrol) a.vemapcontrol.Fire("oncredentialserror")
    }
    function i() {
        f = true;
        if (a && a.vemapcontrol) a.vemapcontrol.Fire("oncredentialsvalid")
    }
    this._ReArrangeControls = function () {
        if (a.controlzIndexes != null && a.controls != null && a.controlzIndexes.length == a.controls.length) {
            var d = a.controls.length;
            for (var b = 0; b < d; b++) {
                document.body.removeChild(a.controls[b]);
                var c = a.controls[b];
                c.style.top = a.controltops[b];
                c.style.left = a.controllefts[b];
                a._AddControlInner(c, a.controlzIndexes[b])
            }
        }
    };
    this._ClearView = function () {
        VEPushpin.Hide();
        a.m_vemessage.Hide();
        if (typeof VE_TrafficManager != "undefined" && VE_TrafficManager.turnedOn == true) VE_TrafficManager._ViewChangeNotification()
    };
    this._RefreshLayers = function () {
        if (a.vemapcontrol.GetMapMode() != 2) a.vemapcontrol.PanView();
        if (typeof VE_TrafficManager != "undefined" && VE_TrafficManager.turnedOn == true) VE_TrafficManager._ViewChangeNotification()
    };
    this.SetViewport = function (a, c, b, d) {
        return this.vemapcontrol.SetViewport(a, c, b, d)
    };
    this.GetCenter = function () {
        var b = this.vemapcontrol.GetCenterLatitude(),
            d = this.vemapcontrol.GetCenterLongitude(),
            a = c.CreateVELatLong(b, d);
        return a
    };
    this.GetMapView = function () {
        var e;
        if (this.vemapcontrol.IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) {
            var d = this.vemapcontrol.Get3DVisibleArea(true);
            if (d == null) return null;
            var b = d[0],
                g = d[1],
                a = d[2],
                f = d[3];
            e = new VELatLongRectangle(c.CreateVELatLong(b.latitude, b.longitude), c.CreateVELatLong(a.latitude, a.longitude), c.CreateVELatLong(g.latitude, g.longitude), c.CreateVELatLong(f.latitude, f.longitude))
        } else {
            var b = this.vemapcontrol.PixelToLatLong(new VEPixel(0, 0)),
                a = this.vemapcontrol.PixelToLatLong(new VEPixel(this.GetWidth(), this.GetHeight()));
            if (b == null || a == null) return null;
            e = new VELatLongRectangle(c.CreateVELatLong(this.vemapcontrol.ClipLatitude(b.latitude), this.vemapcontrol.ClipLongitude(b.longitude)), c.CreateVELatLong(this.vemapcontrol.ClipLatitude(a.latitude), this.vemapcontrol.ClipLongitude(a.longitude)))
        }
        return e
    };
    this.PixelToLatLong = function (b, a, d) {
        if (a != null) {
            VEValidator.ValidateNonNegativeInt(a, "zoomLevel");
            a = parseInt(a)
        }
        if (d) {
            VEValidator.ValidateObjectArray(b, "pixelArray", VEPixel, "VEPixel array");
            VEValidator.ValidateFunction(d, "callback");
            if (typeof b.length != "undefined" && b.length > 0) this.PixelToLatLongAsync(b, a, d)
        } else {
            VEValidator.ValidateObject(b, "pixel", VEPixel, "VEPixel");
            var e = this.vemapcontrol.PixelToLatLong(b, a),
                f = c.CreateVELatLong(e.latitude, e.longitude);
            return f
        }
    };
    this.PixelToLatLongAsync = function (a, b, c) {
        this.vemapcontrol.PixelToLatLongAsync(a, b, c)
    };
    this.SetCenter = function (c) {
        VEValidator.ValidateObject(c, "veLatLong", VELatLong, "VELatLong");
        var a = b.Decode(c);
        this._QueueRequest(this.vemapcontrol.SetCenterAccurate, a.Latitude, a.Longitude)
    };
    this.SetCenterClassic = function (c) {
        VEValidator.ValidateObject(c, "veLatLong", VELatLong, "VELatLong");
        var a = b.Decode(c);
        this._QueueRequest(this.vemapcontrol.SetCenter, a.Latitude, a.Longitude)
    };
    this.SetCenterAndZoom = function (c, d) {
        VEValidator.ValidateObject(c, "veLatLong", VELatLong, "VELatLong");
        VEValidator.ValidateNonNegativeInt(d, "zoomLevel");
        var a = b.Decode(c);
        this._QueueRequest(this.vemapcontrol.SetCenterAndZoom, a.Latitude, a.Longitude, d);
        return true
    };
    this.GetMouseWheelZoomToCenter = function () {
        return a.vemapcontrol.GetMouseWheelZoomToCenter()
    };
    this.SetMouseWheelZoomToCenter = function (b) {
        return a.vemapcontrol.SetMouseWheelZoomToCenter(b)
    };
    this.IncludePointInView = function (c) {
        VEValidator.ValidateObject(c, "veLatLong", VELatLong, "VELatLong");
        var a = b.Decode(c);
        return this.vemapcontrol.IncludePointInViewport(a.Latitude, a.Longitude)
    };
    this.GetOffsetX = function () {
        return a.vemapcontrol.GetOffsetX()
    };
    this.GetOffsetY = function () {
        return a.vemapcontrol.GetOffsetY()
    };
    this.getSvgLayer = function () {
        return a.vemapcontrol.getSvgLayer()
    };
    this.resizeSVG = function () {
        return a.vemapcontrol.resizeSVG()
    };
    this.GetsvgDiv = function () {
        return a.vemapcontrol.GetsvgDiv()
    };
    this.LatLongToPixel = function (c, a, d) {
        if (a != null) {
            VEValidator.ValidateNonNegativeInt(a, "zoomLevel");
            a = parseInt(a)
        }
        if (d) {
            VEValidator.ValidateObjectArray(c, "veLatLongArray", VELatLong, "VELatLong array");
            VEValidator.ValidateFunction(d, "callback");
            this.LatLongToPixelAsync(c, a, d)
        } else {
            VEValidator.ValidateObject(c, "veLatLong", VELatLong, "VELatLong");
            var e = b.Decode(c),
                f = new Msn.VE.LatLong(e.Latitude, e.Longitude);
            return this.vemapcontrol.LatLongToPixel(f, a)
        }
    };
    this.LatLongToPixelAsync = function (d, f, g) {
        var e = [];
        for (var a = 0; a < d.length; ++a) {
            var c = b.Decode(d[a]);
            e[a] = new Msn.VE.LatLong(c.Latitude, c.Longitude)
        }
        this.vemapcontrol.LatLongToPixelAsync(e, f, g)
    };
    this.PanToLatLong = function (c) {
        VEValidator.ValidateObject(c, "veLatLong", VELatLong, "VELatLong");
        var a = b.Decode(c);
        if (this.GetMapMode() == Msn.VE.MapActionMode.Mode2D) {
            a.Latitude = this.vemapcontrol.ClipLatitude(a.Latitude);
            a.Longitude = this.vemapcontrol.ClipLongitude(a.Longitude)
        }
        this._QueueRequest(this.vemapcontrol.PanToLatLong, a.Latitude, a.Longitude);
        return true
    };
    this.SetMapView = function (a) {
        VEValidator.ValidateNonNull(a, "arrObject");
        if (a instanceof VEMapViewSpecification) {
            var j = b.Decode(a.LatLong);
            view = new Msn.VE.MapView(this.vemapcontrol);
            view.SetCenterLatLong(new Msn.VE.LatLong(j.Latitude, j.Longitude));
            view.SetMapStyle(this.vemapcontrol.GetMapStyle());
            if (a.ZoomLevel != null) view.SetZoomLevel(a.ZoomLevel);
            else view.SetZoomLevel(this.vemapcontrol.GetZoomLevel());
            if (a.Altitude != null) view.SetAltitude(a.Altitude);
            if (a.Heading != null) view.SetDirection(a.Heading);
            if (a.Pitch != null) view.SetTilt(a.Pitch);
            this._QueueRequest(this.vemapcontrol.SetView, view)
        } else if (a instanceof VELatLongRectangle) {
            var f = b.Decode(a.TopLeftLatLong),
                g = b.Decode(a.BottomRightLatLong),
                k = this.GetMapView(),
                h = b.Decode(k.TopLeftLatLong),
                i = b.Decode(k.BottomRightLatLong),
                l = h.Latitude != f.Latitude || h.Longitude != f.Longitude || i.Latitude != g.Latitude || i.Longitude != g.Longitude;
            if (l) this.vemapcontrol.SetViewport(f.Latitude, f.Longitude, g.Latitude, g.Longitude)
        } else {
            var e = [];
            for (var c = 0; c < a.length; c++) {
                VEValidator.ValidateNonNull(a[c], "arrObject[" + c + "]");
                if (a[c] instanceof VELatLong) d([a[c]], e);
                else if (a[c] instanceof VEShape) d(a[c].GetPoints(), e);
                else if (a[c] instanceof VEPolyline) d(a[c].GetLatLongs(), e);
                else if (a[c] instanceof VEPolygon) d(a[c].GetLatLongs(), e);
                else if (a[c] instanceof VELatLongRectangle) d([a[c].TopLeftLatLong, a[c].BottomRightLatLong], e);
                else throw new VEException("VEMap:SetMapView", "err_invalidargument", L_invalidargument_text.replace("%1", "arrObject").replace("%2", "object"))
            }
            this._QueueRequest(this.vemapcontrol.SetBestMapView, e)
        }
        return true
    };

    function d(d, e) {
        for (var a = 0; a < d.length; a++) {
            var c = b.Decode(d[a]),
                f = new Msn.VE.LatLong(c.Latitude, c.Longitude);
            e.push(f)
        }
    }
    this.AddPushpin = function (a) {
        if (typeof a == "object" && !(a instanceof VEPushpin)) {
            var e = new VEShape(VEShapeType.Pushpin, a);
            this.AddShape(e);
            return e
        }
        VEValidator.ValidateObject(a, "vePushpin", VEPushpin, "VEPushpin");
        var f = this.pushpins.length;
        for (var d = 0; d < f; d++) {
            var g = this.pushpins[d];
            if (g.ID == a.ID) throw new VEException("VEMap:AddPushpin", "err_invalidpushpinid", L_invalidpushpinid_text)
        }
        this.pushpins.push(a);
        a._SetMapInstance(this);
        var c = b.Decode(a.LatLong);
        if (this.GetMapMode() == Msn.VE.MapActionMode.Mode3D) this.m_vegraphicsmanager.Add3DPushpin(a.ID, c.Latitude, c.Longitude, 25, 25, "VEAPI_Pushpin", a, Msn.VE.API.Globals.vepushpinpanelzIndex - 1);
        else this.vemapcontrol.AddPushpin(a.ID, c.Latitude, c.Longitude, 25, 25, "VEAPI_Pushpin", a.GetContent(), Msn.VE.API.Globals.vepushpinpanelzIndex - 1)
    };
    this._DisambiguateCallback = "VEMap._GetMapFromGUID(" + this.GUID + ")._sm.FindAmbiguousListCallBack";
    this._Disambiguate = function (f, b, d, c, e) {
        var a = $ID(this.ID + "_vewhereinput");
        if (a) a.value = unescape(f);
        this.vemapcontrol.SetViewport(b, d, c, e);
        if (this.m_vesearchmanager != null && this.lastwhatsearch != null && this.lastwhatsearch.length > 0) this.Find(this.lastwhatsearch, null, 1, this.m_vesearchmanager.vesearchcallback)
    };
    this._DoFind = function () {
        try {
            this.lastwhatsearch = $ID(this.ID + "_vewhatinput").value;
            this.lastwheresearch = $ID(this.ID + "_vewhereinput").value;
            this.Find(this.lastwhatsearch, this.lastwheresearch)
        } catch(a) {
            this.ShowMessage(a.message)
        }
    };
    this.Dispose = function () {
        try {
            e([new VEParameter("entry", "1")]);
            if (a.vemapcontrol != null) {
                a.vemapcontrol.DetachEvent("onchangeview", a._ClearView);
                a.vemapcontrol.DetachEvent("onresize", a._ReArrangeControls);
                a.vemapcontrol.DetachEvent("onendpan", a._RefreshLayers);
                a.vemapcontrol.DetachEvent("oninitmode", a._EROHouseKeeping)
            }
            a.vemapcontrol.DetachEvent("onclick", VEPushpin.Hide);
            var c = a.controlzIndexes.length;
            for (var b = 0; b < c; b++) a.controlzIndexes.pop();
            var c = a.controls.length;
            for (var b = 0; b < c; b++) {
                try {
                    document.body.removeChild(a.controls[b])
                } catch(h) {}
                a.controls[b] = null;
                a.controltops[b] = null;
                a.controllefts[b] = null
            }
            a.controls = null;
            a.controlzIndexes = null;
            if (a.m_velayermanager) a.m_velayermanager.Dispose();
            if (a.m_vesearchmanager) {
                a.m_vesearchmanager.Dispose();
                a.m_vesearchmanager = null;
                a._sm = null
            }
            if (a.m_routemanager) {
                a.m_routemanager.Dispose();
                a.m_routemanager = null
            }
            for (var b = 0; b < a.pushpins.length; ++b) if (a.pushpins[b] != null && a.pushpins[b] != "undefined") {
                if (a.GetMapMode() == Msn.VE.MapActionMode.Mode3D) a.m_vegraphicsmanager.Remove3DPushpin(a.pushpins[b].ID);
                a.pushpins[b].Dispose();
                a.pushpins[b] = null
            }
            a.pushpins = null;
            if (a.m_vegraphicsmanager) a.m_vegraphicsmanager.Dispose();
            if (a.m_vetilesourcemanager) a.m_vetilesourcemanager.Dispose();
            a.m_vemessage.Dispose();
            a.m_veambiguouslist.Dispose();
            try {
                if (typeof VE_TrafficManager != "undefined") VE_TrafficManager.Destroy()
            } catch(h) {}
            Msn.VE.API.Globals.vemapinstances[a.GUID] = null;
            a.veonmaploadevent = null;
            a.veloadingdiv = null;
            a.vemapcontrol.Destroy();
            try {
                var g = $ID(a.ID);
                g.innerHTML = ""
            } catch(h) {}
            a.ClientToken = null;
            a.ID = null;
            a.vemapcontrol = null;
            var f = 0;
            for (var d in Msn.VE.API.Globals.vemapinstances) if (typeof Msn.VE.API.Globals.vemapinstances[d] != "function" && Msn.VE.API.Globals.vemapinstances[d] != null)++f;
            if (f == 0) {
                VE_Help.Destroy();
                VEPushpin.DisposeERO();
                Msn.VE.API.Globals.Dispose()
            }
            Msn.VE.API.Globals.vemapinstances[this.GUID] = null;
            var c = a.preInitCustomEvents.length;
            for (var b = 0; b < c; ++b) a.preInitCustomEvents.pop();
            a.preInitCustomEvents = null;
            a.requestQueue = null;
            a.network = null;
            a.mapelement = null;
            a.pushpins = null;
            if (a._mapOptions) a._mapOptions = null;
            a = null
        } catch(h) {}
    };
    this.GetDashboardSize = function () {
        return this.dashboardSize
    };
    this.SetClientToken = function (a) {
        this.ClientToken = a;
        if (this.vemapcontrol) {
            this.vemapcontrol.SetClientToken(a);
            e([new VEParameter("entry", "2")])
        }
    };
    this.SetCredentials = function (a) {
        this.Credentials = a;
        if (this.vemapcontrol) e([new VEParameter("entry", "2")])
    };
    this.HasValidCredentials = function () {
        return f
    }
}
VEMap._GetMapFromGUID = function (a) {
    if (Msn.VE.API.Globals.vemapinstances != null && Msn.VE.API.Globals.vemapinstances[a] == null || Msn.VE.API.Globals.vemapinstances[a] == "undefined") {
        throw new VEException("VEMap:_GetMapFromGUID", "err_notinitialized", L_notinitialized_text);
        return
    }
    return Msn.VE.API.Globals.vemapinstances[a]
};
VEMap.prototype.InitializeMap = function () {
    _VERegisterNamespaces("Msn.VE");
    this.mapelement.innerHTML = "";
    this.mapelement.style.overflow = "hidden";
    if (this.mapelement.className == null || this.mapelement.className == "undefined" || this.mapelement.className == "") {
        if (this.mapelement.style == null || this.mapelement.style.height == null || this.mapelement.style.height == "undefined" || this.mapelement.style.height == "") this.mapelement.style.height = Msn.VE.API.Globals.vemapheight + "px";
        if (this.mapelement.style == null || this.mapelement.style.width == null || this.mapelement.style.width == "undefined" || this.mapelement.style.width == "") this.mapelement.style.width = Msn.VE.API.Globals.vemapwidth + "px"
    }
    var a = {};
    if (this.mapMode != null && this.mapMode != "undefined") a.mapMode = this.mapMode;
    else a.mapMode = Msn.VE.API.Globals.vemapmode;
    a.mapGUID = this.GUID;
    a.clientToken = this.ClientToken;
    if (this.initialLatitude != null && this.initialLatitude != "undefined") a.latitude = this.initialLatitude;
    else a.latitude = Msn.VE.API.Globals.vemaplatitude;
    if (this.initialLongitude != null && this.initialLongitude != "undefined") a.longitude = this.initialLongitude;
    else a.longitude = Msn.VE.API.Globals.vemaplongitude;
    if (this.initialZoomLevel != null && this.initialZoomLevel != "undefined") a.zoomlevel = this.initialZoomLevel;
    else a.zoomlevel = Msn.VE.API.Globals.vemapzoom;
    if (this.initialMapStyle != null && this.initialMapStyle != "undefined") a.mapstyle = this.initialMapStyle;
    else a.mapstyle = Msn.VE.API.Globals.vemapstyle;
    this.m_dashboardId = this.ID + "_dashboard";
    if (this.fixedMap != true) {
        a.showDashboard = VE_CheckModuleStatus(VE_ModuleName.APICONTROLS) == "loaded" && this._showDashboard;
        a.dashboardSize = this.dashboardSize;
        a.dashboardVersion = this.dashboardVersion;
        a.dashboardX = 5;
        a.dashboardY = 5;
        a.dashboardId = this.m_dashboardId;
        a.showScaleBar = this._showScalebar
    }
    a.obliqueEnabled = this._mapOptions.EnableBirdseye;
    a.labelsDefault = this._mapOptions.EnableDashboardLabels;
    a.loadBaseTiles = this._mapOptions.LoadBaseTiles;
    a.birdseyeOrientation = this._mapOptions.BirdseyeOrientation;
    a.useOriginTiles = this._mapOptions.CacheMode == VECacheMode.Auto;
    a.obliqueUrl = Msn.VE.API.Constants.imageryurl;
    if (this.fixedMap == true) a.fixedView = true;
    a.disableLogo = false;
    if (this.showMapModeSwitch == false) a.showMapModeSwitch = false;
    else a.showMapModeSwitch = true;
    if (this.tileBuffer != null && typeof this.tileBuffer != "undefined") a.buffer = this.tileBuffer * Msn.VE.API.Globals.vetilesize;
    this.vemapcontrol = new Msn.VE.MapControl(this.mapelement, a, this);
    var d = this.preInitCustomEvents.length;
    for (var c = 0; c < d; ++c) {
        var b = this.preInitCustomEvents.pop();
        this.vemapcontrol.AttachCustomEvent(b.Name, b.Callback)
    }
    this.vemapcontrol.Init();
    if (!this.fixedMap == true) this.vemapcontrol.AttachEvent("onchangeview", this._ClearView);
    this.vemapcontrol.AttachEvent("onendpan", this._RefreshLayers);
    this.vemapcontrol.AttachEvent("oninitmode", this._ResetQueueEvent);
    this.vemapcontrol.AttachEvent("oninitmode", this._EROHouseKeeping);
    _VERegisterNamespaces("Msn.Drawing");
    this.m_vegraphicsmanager = new VEGraphicsManager(this);
    this.m_vegraphicsmanager.Initialize();
    this.m_velayermanager = null;
    this._lm = this.m_velayermanager;
    this.m_vetilesourcemanager = null;
    this.m_vetrafficmanager = null;
    _VERegisterNamespaces("Msn.VE.UI");
    Msn.VE.UI.Color = {
        Red: "red",
        Orange: "orange",
        Yellow: "yellow"
    };
    if (($ID("help") == null || $ID("help") == "undefined") && !Msn.VE.API.Globals.ishttpsenabled) VE_Help.CreateHelpPanel();
    this._InitializeModules(VE_GetLoadedAPIModules());
    if (this.veonmaploadevent) this.veonmaploadevent(this);
    this.controlzIndexes = [];
    this.controls = [];
    this.controltops = [];
    this.controllefts = [];
    this.vemapcontrol.AttachEvent("onresize", this._ReArrangeControls);
    if (window.ero == null || typeof window.ero == "undefined") window.ero = ERO.getInstance();
    this._EROHouseKeeping(this.GetMapMode());
    window.attachEvent("onunload", DisposeAllMaps);
    if (this._mapPrintOptions) this.SetPrintOptions(this._mapPrintOptions)
};

function DisposeAllMaps() {
    for (var a in Msn.VE.API.Globals.vemapinstances) if (Msn.VE.API.Globals.vemapinstances[a] instanceof VEMap) Msn.VE.API.Globals.vemapinstances[a].Dispose();
    if (_VEDownloadQueue) {
        _VEDownloadQueue.Dispose();
        _VEDownloadQueue = null
    }
    if (VE_Help && VE_Help.Destroy) VE_Help.Destroy()
}
VEMap.prototype.DeleteAllPushpins = function () {
    VEPushpin.Hide();
    if (this.pushpins != null && this.pushpins != "undefined") if (this.GetMapMode() == Msn.VE.MapActionMode.Mode3D) {
        this.m_vegraphicsmanager.ClearAllPushpins(this.pushpins);
        return
    } else {
        var c = this.pushpins.length;
        for (var a = 0; a < c; a++) {
            var b = this.pushpins.pop();
            if (!b.IsInLayer) b.Dispose()
        }
    }
    return this.vemapcontrol.ClearPushpins()
};
VEMap.prototype.GetMapStyle = function () {
    return this.vemapcontrol.GetMapStyle()
};
VEMap.prototype.GetZoomLevel = function () {
    return this.vemapcontrol.GetZoomLevel()
};
VEMap.prototype.StartContinuousPan = function (a, b) {
    VEValidator.ValidateInt(a, "deltaX");
    VEValidator.ValidateInt(b, "deltaY");
    return this.vemapcontrol.ContinuousPan(parseInt(a), parseInt(b))
};
VEMap.prototype.EndContinuousPan = function () {
    return this.vemapcontrol.StopContinuousPan()
};
VEMap.prototype.Pan = function (a, b) {
    VEValidator.ValidateInt(a, "deltaX");
    VEValidator.ValidateInt(b, "deltaY");
    if (this.GetMapMode() != Msn.VE.MapActionMode.Mode3D) return this.vemapcontrol.PanByPixel(new VEPixel(parseInt(a), parseInt(b)), false);
    else return false
};
VEMap.prototype.DeletePushpin = function (c) {
    var d = 0;
    if (typeof this.pushpins == "object" && this.pushpins && this.pushpins.constructor == Array) d = this.pushpins.length;
    for (var a = 0; a < d; a++) {
        var b = this.pushpins[a];
        if (b != null && b.ID == c) {
            if (!b.IsInLayer) b.Dispose();
            this.pushpins.splice(a, 1);
            if (this.GetMapMode() == Msn.VE.MapActionMode.Mode3D) return this.m_vegraphicsmanager.Remove3DPushpin(c);
            else return this.vemapcontrol.RemovePushpin(c)
        }
    }
    throw new VEException("VEMap:DeletePushpin", "err_invalidpushpinid", L_invalidpushpinid_text)
};
VEMap.prototype.Resize = function (d, c) {
    var b = -1,
        a = -1;
    if (d != null && typeof d != "undefined") {
        VEValidator.ValidateNonNegativeInt(d, "width");
        b = parseInt(d)
    }
    if (c != null && typeof c != "undefined") {
        VEValidator.ValidateNonNegativeInt(c, "height");
        a = parseInt(c)
    }
    if (b >= 0 || a >= 0) {
        if (b < 0) b = this.GetWidth();
        if (a < 0) a = this.GetHeight()
    }
    return this.vemapcontrol.Resize(b, a)
};
VEMap.prototype.SetMapMode = function (a) {
    VEValidator.ValidateMapMode(a, "mapMode");
    this.vemapcontrol.EnableMode(a, this.GUID)
};
VEMap.prototype.GetMapMode = function () {
    if (this.vemapcontrol.IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) return VEMapMode.Mode3D;
    return VEMapMode.Mode2D
};
VEMap.prototype.SetMapStyle = function (a) {
    VEValidator.ValidateMapStyle(a, "mapStyle");
    if (this.GetMapMode() == Msn.VE.MapActionMode.Mode3D && (a == VEMapStyle.Birdseye || a == VEMapStyle.BirdseyeHybrid)) return false;
    this.vemapcontrol.SetMapStyle(a)
};
VEMap.prototype.SetScaleBarDistanceUnit = function (a) {
    VEValidator.ValidateDistanceUnit(a, "distanceUnit");
    this.vemapcontrol.SetScaleBarDistanceUnit(a == VEDistanceUnit.Miles ? Msn.VE.DistanceUnit.Miles : Msn.VE.DistanceUnit.Kilometers)
};
VEMap.prototype.SetZoomLevel = function (a) {
    VEValidator.ValidateNonNegativeInt(a, "zoomLevel");
    this._QueueRequest(this.vemapcontrol.SetZoom, parseInt(a));
    return true
};
VEMap.prototype.ZoomIn = function () {
    this.vemapcontrol.ZoomIn()
};
VEMap.prototype.ZoomOut = function () {
    this._QueueRequest(this.vemapcontrol.ZoomOut)
};
VEMap.prototype.AttachEvent = function (b, a) {
    VEValidator.ValidateNonNull(b, "eventname");
    VEValidator.ValidateNonNull(a, "eventhandler");
    if (this.vemapcontrol) this.vemapcontrol.AttachCustomEvent(b, a);
    else this.preInitCustomEvents.push(new VECustomEvent(b, a))
};
VEMap.prototype.DetachEvent = function (b, a) {
    VEValidator.ValidateNonNull(b, "eventname");
    VEValidator.ValidateNonNull(a, "eventhandler");
    this.vemapcontrol.DetachCustomEvent(b, a)
};
VEMap.prototype.FireEvent = function (a) {
    try {
        var b = window.event;
        return this.vemapcontrol.FireCustomEvent(a, b)
    } catch(c) {
        return false
    }
};
VEMap.prototype.ShowMessage = function (a) {
    if (this.ShowMessageBox) this.m_vemessage.Show(a)
};
VEMap.prototype.GetHeight = function () {
    var a = 0;
    if (this.mapelement.style.height.search(/px/) > 0) a = parseInt(this.mapelement.style.height.replace("px", ""));
    if (isNaN(a) || a == 0) a = this.mapelement.offsetHeight;
    return a
};
VEMap.prototype.GetWidth = function () {
    var a = 0;
    if (this.mapelement.style.width.search(/px/) > 0) a = parseInt(this.mapelement.style.width.replace("px", ""));
    if (isNaN(a) || a == 0) a = this.mapelement.offsetWidth;
    return a
};
VEMap.prototype.GetLeft = function () {
    return this.vemapcontrol.GetLeftPx()
};
VEMap.prototype.GetTop = function () {
    return this.vemapcontrol.GetTopPx()
};
VEMap.prototype.SetFindResultsPanel = function (a) {
    if (a == null || a == "undefined") throw new VEException("VEMap:SetFindResultsPanel", "err_invalidelement", L_invalidelement_text);
    var b = $ID(a);
    if (b == null || b == "undefined") throw new VEException("VEMap:SetFindResultsPanel", "err_invalidelement", L_invalidelement_text);
    this.searchelement = a
};
VEMap.prototype._AddControlInner = function (a) {
    a.style.position = "absolute";
    a.style.zIndex = 201;
    var e = this.GetTop(),
        d = this.GetLeft();
    if (!a.style.top) a.style.top = "0px";
    if (!a.style.left) a.style.left = "0px";
    var c = a.style.top,
        b = a.style.left;
    if (isNaN(c)) c = c.toString().toLowerCase();
    if (isNaN(b)) b = b.toString().toLowerCase();
    e += parseInt(c.replace("px"));
    d += parseInt(b.replace("px"));
    a.style.top = e + "px";
    a.style.left = d + "px";
    document.body.appendChild(a)
};
VEMap.prototype.AddControl = function (a, b) {
    if (a == null || a == "undefined") throw new VEException("VEMap:AddControl", "err_invalidelement", L_invalidelement_text);
    if (this.controls == null || this.controls == "undefined") throw new VEException("VEMap:AddControl", "err_notinitialized", L_notinitialized_text);
    this.controlzIndexes.push(b);
    this.controls.push(a);
    this.controltops.push(a.style.top);
    this.controllefts.push(a.style.left);
    this._AddControlInner(a, b)
};
VEMap.prototype.DeleteControl = function (b) {
    if (b == null || b == "undefined") throw new VEException("VEMap:DeleteControl", "err_invalidelement", L_invalidelement_text);
    if (this.controls == null || this.controls == "undefined") throw new VEException("VEMap:DeleteControl", "err_notinitialized", L_notinitialized_text);
    if (b.shimElement) {
        b.shimElement.removeNode(true);
        b.shimElement = null
    }
    document.body.removeChild(b);
    var c = -1;
    for (var a = 0; a < this.controls.length; a++) if (this.controls[a] == b) {
        c = a;
        break
    }
    if (c >= 0) {
        for (var a = c; a < this.controls.length - 1; a++) {
            this.controls[a] = this.controls[a + 1];
            this.controlzIndexes[a] = this.controlzIndexes[a + 1];
            this.controltops[a] = this.controltops[a + 1];
            this.controllefts[a] = this.controllefts[a + 1]
        }
        this.controls.pop();
        this.controlzIndexes.pop();
        this.controltops.pop();
        this.controllefts.pop()
    }
};
VEMap.prototype.ShowControl = function (a) {
    if (a != null && a != "undefined") {
        if (a.shimElement) a.shimElement.style.display = "block";
        a.style.visibility = "visible";
        mvcViewFacade.ShowShimIfSupported(a)
    }
};
VEMap.prototype.HideControl = function (a) {
    if (a != null && a != "undefined") {
        HideShim(a);
        a.style.visibility = "hidden"
    }
};
VEMap.prototype.Clear = function () {
    this._ClearView();
    if (typeof VE_TrafficManager != "undefined") VE_TrafficManager.Destroy();
    this.DeleteAllPushpins();
    this.DeleteAllShapeLayers();
    this.DeleteRoute();
    this.m_vegraphicsmanager.Clear();
    this.m_veambiguouslist.Hide();
    this.m_vemessage.Hide()
};
VEMap.prototype._ShowLoading = function () {
    if (!this.veloadingdiv) {
        this.veloadingdiv = document.createElement("div");
        this.veloadingdiv.className = "VE_Network_Loading";
        this.veloadingdiv.style.top = "75px";
        this.veloadingdiv.style.left = "80px";
        this.veloadingdiv.innerHTML = L_loading_text;
        this.AddControl(this.veloadingdiv, 202)
    }
    if (this.veloadingdiv.style.display != "block") this.veloadingdiv.style.display = "block";
    else this.veloadingdiv.style.display = "none"
};
VEMap.prototype.AddPolyline = function (a) {
    if (typeof a == "object" && !(a instanceof VEPolyline)) {
        var b = new VEShape(VEShapeType.Polyline, a);
        this.AddShape(b);
        return b
    }
    this.m_vegraphicsmanager.DrawLine(a)
};
VEMap.prototype.DeletePolyline = function (a) {
    this.m_vegraphicsmanager.RemoveLinebyId(a)
};
VEMap.prototype.DeleteAllPolylines = function () {
    this.m_vegraphicsmanager.RemoveAllLines()
};
VEMap.prototype.AddPolygon = function (a) {
    if (typeof a == "object" && !(a instanceof VEPolygon)) {
        var b = new VEShape(VEShapeType.Polygon, a);
        this.AddShape(b);
        return b
    }
    this.m_vegraphicsmanager.DrawPolygon(a)
};
VEMap.prototype.DeletePolygon = function (a) {
    this.m_vegraphicsmanager.RemovePolygonbyId(a)
};
VEMap.prototype.DeleteAllPolygons = function () {
    this.m_vegraphicsmanager.RemoveAllPolygons()
};
VEMap.prototype.LoadModules = function (c, a, d) {
    var b = null;
    b = VEOndemandJsDownloads(true, c, this, [this.LoadModules, c, a, d]);
    if (b) if (typeof a == "function" && a != null) a(d)
};
VEMap.prototype._InitializeModules = function (b) {
    var c = b.length;
    for (var a = 0; a < c; a++) switch (b[a]) {
    case VE_ModuleName.APILAYERS:
        this.InitMapDrawing();
        break;
    case VE_ModuleName.APIFIND:
        this.InitSearch();
        break;
    case VE_ModuleName.APIROUTING:
        this.InitRouting();
        break;
    case VE_ModuleName.APITRAFFIC:
        this.InitTraffic();
        break;
    case VE_ModuleName.API3D:
        this.Init3D();
        break;
    case VE_ModuleName.APICONTROLS:
        this.InitNavControl();
        break;
    case VE_ModuleName.APIBIRDSEYE:
        this.InitBirdseye();
        break;
    case VE_ModuleName.APITILES:
        this.InitTiles()
    }
};
VEMap.prototype._ResetQueueEvent = function (a) {
    if (a == Msn.VE.MapActionMode.Mode2D) this.queueEventInitialized = false
};
VEMap.prototype._QueueRequest = function (a, b, c, d) {
    if (this.vemapcontrol.IsModeEnabled(Msn.VE.MapActionMode.Mode3D) && this.RequestQueueEnabled) {
        if (!this.queueEventInitialized) {
            this.vemapcontrol.Get3DControl().AttachEvent("OnCameraChanged", "ProcessQueuedRequest");
            this.queueEventInitialized = true
        }
        if (this.vemapcontrol.IsCameraFlying() || this.requestQueue.length > 0) {
            this.requestQueue.push(new RequestQueueItem(a, b, c, d));
            return
        }
    }
    a(b, c, d)
};
VEMap.prototype._ProcessQueuedRequest = function () {
    if (this.requestQueue.length > 0) {
        var a = this.requestQueue.shift();
        a.Call(a.Param1, a.Param2, a.Param3)
    }
};
VEMap.prototype.ShowMapModeSwitch = function (a) {
    if (this.fixedMap != true) {
        this.vemapcontrol.SetShowMapModeSwitch(a);
        this.showMapModeSwitch = a
    }
};
VEMap.prototype.SetTileBuffer = function (a) {
    this.tileBuffer = a;
    if (this.vemapcontrol != null && this.vemapcontrol != "undefined") this.vemapcontrol.SetTilePixelBuffer(a * Msn.VE.API.Globals.vetilesize)
};
VEMap.prototype._EROHouseKeeping = function (d) {
    if (d == Msn.VE.MapActionMode.Mode2D) {
        ero.setGlitz(true, false, true, false);
        ero.unhookEvent("aftershow", c);
        ero.unhookEvent("afterhide", b);
        ero.unhookEvent("beforeshow", a)
    } else {
        ero.setGlitz(true, false, true, false);
        ero.hookEvent("aftershow", c);
        ero.hookEvent("afterhide", b);
        ero.hookEvent("beforeshow", a)
    }
    function c() {
        ShowShim(ero.getBody(), ero.getElement())
    }
    function b() {
        HideShim(ero.getBody())
    }
    function a(a) {
        if (a.Entity == -1) ero.setGlitz(false, null, false, true)
    }
};
VEMap.prototype.AllTilesLoaded = function () {
    if (this.vemapcontrol.IsModeEnabled(Msn.VE.MapActionMode.Mode3D)) {
        var a = this.vemapcontrol.Get3DControl();
        return a ? a.AllTilesLoaded : false
    }
    return true
};
VEMap.prototype.HasClientToken = function () {
    return this.ClientToken != null && typeof this.ClientToken != "undefined" && this.ClientToken.length > 0
};
VEMap.GetVersion = function () {
    return Msn.VE.API.Globals.vecurrentversion
};
VEMap.prototype.ShowDisambiguationDialog = function (a) {
    VEValidator.ValidateBoolean(a, "value");
    this.m_vedirectionsmanager.m_showDisambigousDialog = a
};
VEMap.prototype.SetAnimationEnabled = function (a) {
    VEValidator.ValidateBoolean(a, "value");
    if (this.vemapcontrol) this.vemapcontrol.SetAnimationEnabled(a)
};

function VEPrintOptions(a) {
    VEValidator.ValidateBoolean(a, "enablePrinting");
    this.EnablePrinting = a
}
VEMap.prototype.SetPrintOptions = function (a) {
    VEValidator.ValidateBoolean(a.EnablePrinting, "VEPrintOptions.EnablePrinting");
    if (! (Web.Browser.isSafari() || Msn.VE.Environment.IsIE80())) {
        this._mapPrintOptions = a;
        if (this.vemapcontrol) this.vemapcontrol.SetPrintable(a.EnablePrinting)
    }
};

function VEAPIRequestInvoke(e, a, d) {
    var c = new VENetwork,
        b = VENetwork.GetExecutionID();
    c.UseCloseDep = true;
    c.ServiceUrl = e;
    a.push(new VEParameter(Msn.VE.API.Constants.culture, '"' + Msn.VE.API.Globals.locale + '"'));
    a.push(new VEParameter(Msn.VE.API.Constants.format, Msn.VE.API.Constants.json));
    a.push(new VEParameter(Msn.VE.API.Constants.requestid, b));
    c.BeginInvoke("_f" + b, a, d, null, b)
}
VEMap.prototype.GetDistance = function (a, b) {
    VEValidator.ValidateObject(a, "veLatLong1", VELatLong, "VELatLong");
    VEValidator.ValidateObject(b, "veLatLong2", VELatLong, "VELatLong");
    var h = 6378137,
        c = Math.PI / 180,
        d = a.Latitude * c,
        e = b.Latitude * c,
        f = Math.sin((d - e) / 2),
        g = Math.sin((a.Longitude - b.Longitude) * c / 2),
        i = Math.asin(Math.sqrt(f * f + Math.cos(d) * Math.cos(e) * g * g));
    return h * 2 * i / 1000
};
VEMap.prototype.InitNavControl = function () {};
VEDashboardSize = Msn.VE.DashboardSize;
VEMap.prototype.SetDashboardSize = function (a) {
    if (typeof a != "undefined" && a != null) {
        VEValidator.ValidateDashboardSize(a, "VEDashboardSize");
        this.dashboardSize = a;
        this.dashboardVersion = 6;
        if (this.dashboardSize == VEDashboardSize.Small || this.dashboardSize == VEDashboardSize.Tiny) this.dashboardVersion = 5
    }
};
VEMap.prototype.SetDashboardVersion = function (a) {
    this.dashboardVersion = a
};
VEMap.prototype.ShowDashboard = function () {
    if (this.vemapcontrol) {
        var a = this.vemapcontrol.GetDashboard();
        if (!a) this.vemapcontrol.CreateDashboard(5, 5, this.dashboardSize, this.m_dashboardId, this.showMapModeSwitch, this._mapOptions.EnableBirdseye, this._mapOptions.EnableDashboardLabels, this.dashboardVersion);
        else a.Show();
        if ($MVEM.IsEnabled(MapControl.Features.MapStyle.View3D)) this.Show3DNavigationControl()
    }
    this._showDashboard = true
};
VEMap.prototype.HideDashboard = function () {
    if (this.vemapcontrol) {
        var a = this.vemapcontrol.GetDashboard();
        if (a) a.Hide();
        if ($MVEM.IsEnabled(MapControl.Features.MapStyle.View3D)) this.Hide3DNavigationControl()
    }
    this._showDashboard = false
};
VEMap.prototype.ShowScalebar = function () {
    if (this.vemapcontrol) this.vemapcontrol.SetScaleBarVisibility(true);
    this._showScalebar = true
};
VEMap.prototype.HideScalebar = function () {
    if (this.vemapcontrol) this.vemapcontrol.SetScaleBarVisibility(false);
    this._showScalebar = false
};
VEMap.prototype.ShowMiniMap = function (a, b, d) {
    if (a != null && typeof a != "undefined" && b != null && typeof b != "undefined") {
        VEValidator.ValidateInt(a, "x");
        VEValidator.ValidateInt(b, "y")
    }
    if (d) VEValidator.ValidateMiniMapSize(d, "size");
    var c = this.vemapcontrol.GetMinimap();
    if (c) {
        if (a != null && typeof a != "undefined" && b != null && typeof b != "undefined") c.SetPosition(parseInt(a), parseInt(b));
        c.Show()
    } else c = this.vemapcontrol.CreateMinimap(a, b, null, true, false, null, this.ClientToken);
    if (d) c.SetSize(d)
};
VEMap.prototype.HideMiniMap = function () {
    var a = this.vemapcontrol.GetMinimap();
    if (a) a.Hide()
};
VE_SetModuleStatus(VE_ModuleName.APICONTROLS, "loaded");
VEMap.prototype.InitBirdseye = function () {};
VEMap.prototype.GetBirdseyeScene = function () {
    if (this.GetMapMode() == Msn.VE.MapActionMode.Mode3D) return null;
    var a = null,
        b = this.vemapcontrol.GetObliqueScene();
    if (b != null && b != "undefined") {
        a = new VEBirdseyeScene(b);
        a.SetClientToken(this.ClientToken);
        a.SetGUID(this.GUID)
    }
    return a
};
VEMap.prototype.IsBirdseyeAvailable = function () {
    if (this.GetMapMode() == Msn.VE.MapActionMode.Mode3D) return false;
    return this.vemapcontrol.IsObliqueAvailable()
};
VEMap.prototype.SetBirdseyeOrientation = function (a) {
    if (this.GetMapMode() == Msn.VE.MapActionMode.Mode3D) return false;
    VEValidator.ValidateOrientation(a, "orientation");
    return this.vemapcontrol.SetObliqueOrientation(a)
};
VEMap.prototype.SetBirdseyeScene = function (a, b, c, d) {
    if (this.GetMapMode() == Msn.VE.MapActionMode.Mode3D) return false;
    if (a == null || a instanceof VELatLong) return this.SetBirdseye(a, b, c, d);
    else return this.vemapcontrol.SetObliqueScene(a)
};
VEMap.prototype.SetBirdseye = function (b, a, c, d) {
    if (this.GetMapMode() == Msn.VE.MapActionMode.Mode3D) return false;
    if (b) VEValidator.ValidateObject(b, "veLatLong", VELatLong, "VELatLong");
    else b = this.GetCenter();
    if (a) VEValidator.ValidateOrientation(a, "orientation");
    else a = VEOrientation.North;
    if (c) VEValidator.ValidateNonNegativeInt(c, "zoomLevel");
    else c = 1;
    if (d) VEValidator.ValidateFunction(d, "callback");
    else d = null;
    var e = (new _xy1).Decode(b);
    return this.vemapcontrol.SetObl