Sirius PANORAMEN

/*
PTGuiViewer version 2.9

See below for usage instructions!

PTGui Panorama Viewer, a WebGL viewer for spherical panoramas. 
(C) Copyright New House Internet Services B.V.
Website: http://www.ptgui.com/

License Agreement for PTGui Panorama Viewer

The software program PTGui Panorama Viewer ("PTGuiViewer") is licensed, not 
sold. By copying, publishing or distributing PTGuiViewer you agree to be bound 
by the terms of this agreement. If you do not agree to the terms of this 
agreement, you are not permitted to copy, publish or distribute PTGuiViewer.

1. Grant of a Limited License 

New House Internet Services B.V. ("NHIS") grants you ("Licensee") a non-exclusive, 
non-transferable Limited License ("License"). The License permits Licensee to 
include the file PTGuiViewer.js on any number of websites, 
provided that all of the following conditions are satisfied: 
- PTGuiViewer may only be used to display panoramic images created with
PTGui panoramic stitching software ("PTGui") by a licensee of PTGui,  
and 
- PTGuiViewer.js may only be published unmodified, as released by NHIS 

2. Ownership.

You acknowledge that NHIS and its licensors retain ownership of PTGuiViewer. 
NHIS reserves any rights not expressly granted to you. The rights granted are 
limited to NHIS's and its licensors' intellectual property rights in 
PTGuiViewer and do not include any other patents or intellectual property 
rights.

3. Transfer Restriction

You may not transfer or assign your rights under this License Agreement to 
another party without NHIS's prior written consent.

4. Support

You are welcome to post technical support questions to the PTGui Support 
forum. However, this license does not obligate NHIS to provide technical 
support.

5. Limitations

YOU MAY NOT REVERSE ENGINEER, DECOMPILE OR DISASSEMBLE PTGUIVIEWER, EXCEPT AND 
ONLY TO THE EXTENT EXPRESSLY PERMITTED BY APPLICABLE LAW. YOU MAY NOT MODIFY, 
ADAPT, TRANSLATE, RENT, LEASE, LOAN OR CREATE DERIVATIVE WORKS BASED UPON 
PTGUIVIEWER OR ANY PART THEREOF.

6. Restricted Uses

PTGUIVIEWER IS NOT INTENDED FOR USE IN THE OPERATION OF NUCLEAR FACILITIES, 
AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL SYSTEMS, 
LIFE SUPPORT MACHINES OR OTHER EQUIPMENT IN WHICH THE FAILURE OF PTGUIVIEWER 
COULD LEAD TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL 
DAMAGE.

7. Limited Warranty

NHIS warrants for a period of thirty (30) days from the date of purchase of 
your License that PTGuiViewer as provided by NHIS will perform substantially 
in accordance with the accompanying documentation. NHIS's entire liability and 
your sole and exclusive remedy for any breach of the foregoing limited 
warranty will be, at NHIS's option, replacement of PTGuiViewer, refund of the 
purchase price or repair or replacement of PTGuiViewer which is returned to 
NHIS or an NHIS authorized representative with a copy of the receipt. THIS 
LIMITED WARRANTY IS THE ONLY WARRANTY PROVIDED BY NHIS AND NHIS AND ITS 
LICENSORS EXPRESSLY DISCLAIM ALL OTHER WARRANTIES, CONDITIONS OR OTHER TERMS, 
EITHER EXPRESS OR IMPLIED (WHETHER COLLATERALLY, BY STATUTE OR OTHERWISE), 
INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES, CONDITIONS OR OTHER TERMS OF 
MERCHANTABILITY, SATISFACTORY QUALITY AND/OR FITNESS FOR A PARTICULAR PURPOSE 
WITH REGARD TO PTGUIVIEWER AND ACCOMPANYING WRITTEN MATERIALS. FURTHERMORE, 
THERE IS NO WARRANTY AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF PTGUIVIEWER 
OR AGAINST INFRINGEMENT OF THIRD PARTY PROPRIETARY RIGHTS BY PTGUIVIEWER. NHIS 
DOES NOT WARRANT THAT THE OPERATION OF PTGUIVIEWER WILL BE UNINTERRUPTED OR 
ERROR-FREE, OR THAT DEFECTS IN PTGUIVIEWER WILL BE CORRECTED. NO ORAL OR 
WRITTEN INFORMATION OR ADVICE GIVEN BY NHIS OR AN NHIS AUTHORIZED 
REPRESENTATIVE SHALL CREATE A WARRANTY. BECAUSE SOME JURISDICTIONS DO NOT 
ALLOW THE EXCLUSION OR LIMITATION OF IMPLIED WARRANTIES, CONDITIONS OR OTHER 
TERMS THE ABOVE LIMITATION MAY NOT APPLY TO YOU. THE TERMS OF THIS DISCLAIMER 
AND THE LIMITED WARRANTY UNDER THIS SECTION DO NOT AFFECT OR PREJUDICE THE 
STATUTORY RIGHTS OF A CONSUMER ACQUIRING PTGUIVIEWER OTHERWISE THAN IN THE 
COURSE OF A BUSINESS, NEITHER DO THEY LIMIT OR EXCLUDE ANY LIABILITY FOR DEATH 
OR PERSONAL INJURY CAUSED BY NHIS'S NEGLIGENCE.

8. Exclusion and Limitation of Remedies and Damages.

IN NO EVENT WILL NHIS, ITS PARENTS, SUBSIDIARIES, OR ANY OF THEIR LICENSORS, 
DIRECTORS, OFFICERS, EMPLOYEES OR AFFILIATES OF ANY OF THE FOREGOING BE LIABLE 
TO ANY OTHER PARTY FOR ANY CONSEQUENTIAL, INCIDENTAL, INDIRECT OR SPECIAL 
DAMAGES WHATSOEVER (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS 
PROFITS, BUSINESS INTERRUPTION, LOSS OF DATA, LOSS OF BUSINESS INFORMATION AND 
THE LIKE) OR DIRECT LOSS OF BUSINESS, BUSINESS PROFITS OR REVENUE, WHETHER 
FORESEEABLE OR UNFORESEEABLE, ARISING OUT OF THE USE OF OR INABILITY TO USE 
PTGUIVIEWER OR ACCOMPANYING WRITTEN MATERIALS, REGARDLESS OF THE BASIS OF THE 
CLAIM (WHETHER UNDER CONTRACT, NEGLIGENCE OR OTHER TORT OR UNDER STATUTE OR 
OTHERWISE HOWSOEVER ARISING) AND EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 
DAMAGE.

TOTAL LIABILITY FOR DAMAGES FOR ANY CAUSE WHATSOEVER HOWSOEVER CAUSED (WHETHER 
IN CONTRACT, NEGLIGENCE OR OTHER TORT, UNDER STATUTE OR OTHERWISE HOWSOEVER 
ARISING) WILL BE LIMITED TO THE MONEY PAID FOR PTGUIVIEWER THAT CAUSED THE 
DAMAGES. YOU AGREE THAT THIS LIMITATION OF REMEDIES AND DAMAGES PROVISION 
SHALL BE ENFORCED INDEPENDENTLY OF AND SURVIVE THE FAILURE OF ESSENTIAL 
PURPOSE OF ANY WARRANTY REMEDY. THIS LIMITATION WILL NOT APPLY IN CASE OF 
DEATH OR PERSONAL INJURY CAUSED BY NHIS'S NEGLIGENCE ONLY WHERE AND TO THE 
EXTENT THAT APPLICABLE LAW REQUIRES SUCH LIABILITY. BECAUSE SOME JURISDICTIONS 
DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR 
INCIDENTAL DAMAGES, THE LIMITATION OF LIABILITY IN THIS SECTION MAY NOT APPLY 
TO YOU. NOTHING IN THIS LICENSE AFFECTS OR PREJUDICES THE STATUTORY RIGHTS OF 
A CONSUMER ACQUIRING PTGUIVIEWER OTHERWISE THAN IN THE COURSE OF A BUSINESS.

9. General Terms

This License shall be governed by the laws of The Netherlands. Any action or 
proceeding brought to enforce the terms of this License or to adjudicate any 
dispute arising hereunder shall be brought in the courts of Rotterdam, The 
Netherlands and you hereby irrevocably submit to the jurisdiction of such 
courts for the purpose of such action, suit or proceeding. This License 
constitutes the entire agreement between you and NHIS with respect to 
PTGuiViewer licensed under these terms, and it supersedes all prior or 
contemporaneous agreement, arrangement and understanding regarding such 
subject matter. You acknowledge and agree that you have not relied on any 
representations made by NHIS, however, nothing in this License shall limit or 
exclude liability for any representation made fraudulently. No amendment to or 
modification of this License will be binding unless in writing and signed by 
NHIS. If any provision of this License shall be held by a court of competent 
jurisdiction to be contrary to law, that provision will be enforced to the 
maximum extent permissible, and the remaining provisions of this License will 
remain in full force and effect. No failure or delay by NHIS in exercising its 
rights or remedies shall operate as a waiver unless made by specific written 
notice. No single or partial exercise of any right or remedy of NHIS shall 
operate as a waiver or preclude any other or further exercise of that or any 
other right or remedy.

------------------------ USAGE: ------------------------

Quick start: include the following code in the <head> of your HTML file:


<script type="text/javascript" src="PTGuiViewer.js"></script>
<script type="text/javascript">
var viewer=new PTGuiViewer();
viewer.setVars({
  pano: "myimage",
  format: "14faces",
});
viewer.embed("mypanoviewer");
</script>

And in the <body> include:
<div id="mypanoviewer"></div>


The viewer will be embedded as child of the above <div>, and it will use the
images myimage00.jpg ... myimage14.jpg. 

Details:

viewer.setVars()
Pass an array with the following key/value pairs:
- pano (required): the relative url of the panoramic tiles. The viewer appends
the suffixes 00.jpg through 14.jpg.
- format (required): format of the panoramic tiles. Currently only the '14faces'
format is supported (as produced by PTGui). Future versions of the viewer may
support other formats, therefore this option is required for future 
compatibility.
- pan, tilt, fov: initial viewing parameters. Pan rotates in horizontal direction,
tilt is up/down. Fov is the diagonal field of view angle.
- maxpan, maxtilt, maxfov, minpan, mintilt, minfov: Maximum and minimum limits
for pan/tilt/fov.
- autorotatespeed: speed (in degrees per second) for automatic rotation. If set
to 0, autorotate is disabled. Autorotation starts immediately upon loading the
panorama and ends when the user clicks in the panorama.
- autorotatedelay: If nonzero, autorotation is resumed .. seconds after the user
has released the mouse
- autorotatetohorizon: true or false (default is true)
If true, when autorotation is started the viewer navigates to the horizon. If 
false, the viewer will stay at the current tilt angle when autorotation starts.
- maxiosdimension: Limit the tile size on Apple iOS devices.
If a too large panorama is shown on an iPad/iPhone/iPod, the Safari browser will
crash because it runs out of memory. This setting limits reduces the tile size
on these devices. The recommended (and default) value is 400. 
- showfullscreenbutton_html: true or false
Sets whether the fullscreen button is visible in the HTML viewer
(HTML viewer does not support true full screen viewing due to restrictions in the
HTML standard. Clicking the fullscreen button enlarges the viewer to the full
browser window size.)
- enablegyroscope: true or false
On devices with a gyroscope (iPhone 4 or iPad 2) the viewer can look around in
the panorama by rotating the device. Enabled or disabled by this setting.
- enablemactouchpad: true or false (default is true)
On a mac, enable navigating the panorama by swiping with two fingers on the 
touchpad, or swiping with one finger on the magic mouse. Zooming on a touchpad
is done by clicking with two fingers on the touchpad, holding down and dragging.
With the magic mouse zooming is done by clicking on the right half of the mouse
button, holding down and dragging.
If this is set to false, swiping with two fingers on the touchpad, or swiping with
one finger on the magic mouse, performs zooming.
- mousemode: 'drag' or 'moveto'
Controls the navigation mode on non-mobile devices. If 'drag' is selected, the
panorama is navigated by click&dragging (swiping). 'moveto' will contiuously move
the panorama while holding down the mouse. On mobile devices the panorama is always 
navigated by dragging/swiping, regardless of this setting.

viewer.embed(container)
Embeds the viewer as a child of the given container. All contents of the 
container element is cleared, and the viewer will make itself a child element
of the container.
The container can be either an html element object (as returned by 
document.getElementById) or a string representing the id of the container
element.
If embed() is called before the page has finished loading, the embedding
will be done as soon as the page has finished loading. So it is safe to call
embed() in a script in the <head> of the HTML page, passing the id of a container 
element that has not yet been created.

viewer.showInLightbox()
Pops up a 'lightbox' (a black window overlaying the entire browser window)
showing the panorama. The user can close the panorama and return to the page by 
pressing the red close button at the top left corner. This method is to be used 
instead of embed(), in response to a user action, for example:
<a href="#" onclick="viewer.showInLightbox(); return false;">view panorama</a>
In Internet Explorer the lightbox is shown correctly only when the page is 
rendered in HTML Strict mode. For compatibility with IE the following line 
should therefore be inserted at the top of the HTML page:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 

-----------------------------------------------------------

*/

// static properties:
var g_ObjectsForOnLoad=new Array();
// instance properties:
PTGuiViewer.prototype.m_ViewerVars;
PTGuiViewer.prototype.m_ContainerForEmbedOnLoad=null;
PTGuiViewer.prototype.m_bodyLoaded=false;
function _debuglog(msg) {
setTimeout(function() {
throw new Error(msg);
}, 0);
}
// static:           
function g_OnLoad()
{
if(PTGuiViewer)
{
if(g_ObjectsForOnLoad)
{
for(var i=0; i < g_ObjectsForOnLoad.length; i++)
{
g_ObjectsForOnLoad[i].bodyOnLoad();
}
g_ObjectsForOnLoad=null;
}
}
}
// register obj.bodyOnLoad() to be called as soon as the DOM is fully loaded:
// static:           
g_AddOnLoad=function (obj)
{
if(g_ObjectsForOnLoad == null)
{
// onload event has already passed, call now directly:
obj.bodyOnLoad();
}
else
{
g_ObjectsForOnLoad[g_ObjectsForOnLoad.length]=obj;
}
}
// initialization:
if(window.addEventListener)
{
window.addEventListener("load", g_OnLoad, false);
}
else if(window.attachEvent)
{
window.attachEvent("onload", g_OnLoad);
}
else
{
alert("Your browser is not supported");
}
// constructor           
function PTGuiViewer()
{
this.m_ViewerVars=new Array();
this.m_ContainerForEmbedOnLoad=null;
g_AddOnLoad(this); // so that this.bodyOnLoad() gets called once the DOM is ready 
}

PTGuiViewer.prototype.bodyOnLoad = function()
{
this.m_bodyLoaded=true;
if(this.m_ContainerForEmbedOnLoad)
{
this.embedNow(this.m_ContainerForEmbedOnLoad);
this.m_ContainerForEmbedOnLoad=null;
}
}
PTGuiViewer.prototype.preferFlashViewer = function()
{
// no longer used
}
PTGuiViewer.prototype.preferHtmlViewer = function()
{
// no longer used
}
PTGuiViewer.prototype.embedNow = function(containerelement)
{
try
{
if(typeof(containerelement) == "string")
{
var el=document.getElementById(containerelement);
if(!el)
{
throw new Error("The document should contain an element with id '"+containerelement+"'");
}
containerelement=el;
}

// empty the container:
while(containerelement.hasChildNodes())
{
var child=containerelement.childNodes[0];
containerelement.removeChild(child);
}
var supportsHtmlViewer=nhPanoramaViewer.isSupported();
if(!supportsHtmlViewer)
{
containerelement.innerHTML = "Your browser is not supported";
}
else
{
this.createHtml5Viewer(containerelement, this.m_ViewerVars);
}                
}
catch(e)
{
alert("Error: "+e.message);
}
}
PTGuiViewer.prototype.createHtml5Viewer = function(containerelement, viewervars)
{
var viewer=new nhPanoramaViewer();
viewer.setParams(viewervars);
viewer.createControl(containerelement);
}
PTGuiViewer.prototype.encodeHtml = function(str)
{
var result=str;
result=result.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\"/g, "&quot;");
return result;
}
PTGuiViewer.prototype.setSwfUrl = function(url)
{
// no longer used
} 
PTGuiViewer.prototype.setVars = function(vars)
{
this.m_ViewerVars=vars;
}
PTGuiViewer.prototype.embed = function(id) 
{
try
{
if(this.m_bodyLoaded)
{
this.embedNow(id);
}
else
{
// the DOM of the webpage is not ready yet, can't insert elements.
// embedNow() will be called later from bodyOnLoad
this.m_ContainerForEmbedOnLoad=id;
}
}
catch(e)
{
alert("Error: "+e.message);
}
}
PTGuiViewer.prototype.showInLightbox = function() 
{
var _this=this;
if(!this.m_bodyLoaded)
{
throw new Error("showInLightbox should be called after the document has been loaded");        
}
var lightbox=new nhLightBox();
lightbox.openWithCallback(function(containerdiv){
var contentdiv=document.createElement("div");
contentdiv.style.width="100%";
contentdiv.style.height="100%";
containerdiv.appendChild(contentdiv);
_this.embedNow(contentdiv);
});
}
///////
function nhLightBox()
{
}
nhLightBox.prototype.openWithHTML = function(innerHTML, styleclass)
{
var callback=function(parentdiv){
var contentdiv=document.createElement("div");
contentdiv.style.width="100%";
contentdiv.style.height="100%";
contentdiv.innerHTML=innerHTML;
contentdiv.id="contentdiv";
parentdiv.appendChild(contentdiv);
};
this.openWithCallback(callback, styleclass);
}
nhLightBox.prototype.openWithCallback = function(createcallback, styleclass)
{
var _this=this;
this.m_CreateCallback=createcallback;
//  var body = document.getElementsByTagName("body")[0]; 
var div=document.createElement("div");
div.style.position="fixed";
div.style.zIndex="10000";
div.style.width="0%";
div.style.height="0%";
if(styleclass)
{
div.className=styleclass;
}
else
{
div.style.backgroundColor="rgb(0,0,0)";
}
var dpi=this.getDpi();
var btnwidth=dpi*0.3;
var closebtn=document.createElement("canvas");
closebtn.width=btnwidth;
closebtn.height=btnwidth;
closebtn.style.position="absolute";
closebtn.style.left="5px";
closebtn.style.top="5px";
closebtn.style.cursor="pointer";
closebtn.style.zIndex="10000";
this.drawCloseButtonToCanvas(closebtn);

if(window.addEventListener)
{
closebtn.addEventListener("click",function(){
_this.close();
},false);
}
else if(window.attachEvent)
{
closebtn.attachEvent("onclick",function(){
_this.close();
});
}
div.appendChild(closebtn);
var ua=window.navigator.userAgent;  
if(ua.match(/ applewebkit\/.*/i))
{
if(ua.match(/ mobile\/.*/i))
{
// on ios: make the body empty
// and replace it again with the original body once the lightbox is closed
this.m_BodyBeforeFullScreen=document.body;
document.body=document.createElement("body");
}
}
document.body.appendChild(div);
this.m_Div=div;
var now=new Date().getTime();
window.setTimeout(function(){
_this.animate(now,false);
},0);
}
nhLightBox.prototype.getDpi = function()
{
var result=96.0;
var ua=window.navigator.userAgent;  
if(ua.match(/ applewebkit\/.*/i))
{
if(ua.match(/ mobile\/.*/i))
{
var longside,shortside;  // inch
if(ua.match(/ipad\;/i))
{
longside=7.77;
shortside=5.82;
}
else
{
longside=2.97;
shortside=1.98;
}
if(window.innerWidth > window.innerHeight)
{
// landscape:
result=window.innerWidth / longside;
}
else
{
// portrait:
result=window.innerWidth / shortside;
}
}
}
return result;
}
nhLightBox.prototype.animate = function(starttime,isclosing)
{
var _this=this;
var div=this.m_Div;
var now=new Date().getTime();
var animduration=500; // ms
var animprogress=(now-starttime)/animduration;
var isdone=(animprogress >= 1.0);
if(isclosing) animprogress=1.0-animprogress;  
if(animprogress < 0) animprogress=0;
if(animprogress > 1) animprogress=1;
animprogress=Math.sin(0.5*animprogress*Math.PI);
var size=animprogress*100+"%";
var offset=(1.0-animprogress)*50+"%";
var opacity=animprogress*1.0;
div.style.width=size;
div.style.height=size;
div.style.left=offset;
div.style.top=offset;
div.style.opacity=opacity;
div.style.filter="alpha(opacity="+(opacity*100)+")"; /* For IE8 and earlier */
if(!isdone)
{
window.setTimeout(function(){
_this.animate(starttime,isclosing);
},30);
}
else
{
if(isclosing)
{
div.parentNode.removeChild(div);
if(this.m_BodyBeforeFullScreen)
{
document.body=this.m_BodyBeforeFullScreen;
this.m_BodyBeforeFullScreen=null;
}
}
else
{
this.m_CreateCallback(div);
}
}
}
nhLightBox.prototype.close = function()
{
var _this=this;
var div=this.m_Div;
while(div.firstChild) 
{
div.removeChild(div.firstChild);
}
var now=new Date().getTime();
window.setTimeout(function(){
_this.animate(now,true);
},0);
}
nhLightBox.prototype.drawCloseButtonToCanvas = function(canvas)
{
if(canvas.getContext)
{ 
var c=canvas.getContext('2d');
if(c)
{
var w=canvas.width;
var center=w/2.0;
c.lineWidth=w/16.0;
var r=0.4375*w;
var d1=0.21875*w;
var d2=0.125*w;
var d3=0.09375*w;
var gradient=c.createLinearGradient(0,0,w,w);
gradient.addColorStop(0.2,"rgb(255,158,158)");
gradient.addColorStop(0.8,"rgb(188,0,0)");      

c.fillStyle=gradient;
c.lineJoin="round";
c.strokeStyle="rgb(128,0,0)";
c.beginPath();
c.arc(center,center,r,0,360);
c.closePath();
c.fill();
c.stroke();
c.fillStyle="rgb(255,255,255)";
c.strokeStyle="rgb(128,0,0)";
c.beginPath();
c.moveTo(center-d1, center-d1);
c.lineTo(center-d2, center-d1);
c.lineTo(center-0, center-d3);
c.lineTo(center+d2, center-d1);
c.lineTo(center+d1, center-d1);
c.lineTo(center+d1, center-d2);
c.lineTo(center+d3, center-0);
c.lineTo(center+d1, center+d2);
c.lineTo(center+d1, center+d1);
c.lineTo(center+d2, center+d1);
c.lineTo(center+0, center+d3);
c.lineTo(center-d2, center+d1);
c.lineTo(center-d1, center+d1);
c.lineTo(center-d1, center+d2);
c.lineTo(center-d3, center+0);
c.lineTo(center-d1, center-d2);
c.lineTo(center-d1, center-d1);
c.closePath();
c.fill();
c.stroke();
}
}
};
var p1=nhPanoramaViewer.prototype;
p1.x0d=0;
p1.xkh=1;
p1.xrd=2;
p1.xq=3;
p1.x2b=4;
p1.xtc=0;
p1.xCd=0;
p1.xJe=1;
p1.xih=1;
p1.xMg=0;
p1.xVb=0;
p1.xPd=false;
p1.xJb=0;
p1.x2=1;
p1.x5e=2;
p1.xxc=0;
p1.xXe=0;
p1.xyg=null;
p1.xne=0;
p1.xjc=true;
p1.xVf=true;
p1.xFb=-1;
p1.xE="60337240389312038807378101703253291188085801607122459149815687344456454028658850724139006418813300568302855416701775277687";
p1.xJg="17";
p1.xdi="";
p1.xqb="";
p1.xKh="";
p1.xJ=false;
p1.xAh="2.9";
p1.xrg=0;
p1.xug=0;
p1.xFh=90;
p1.xwc=false;
p1.xxf=false;
p1.xTh=true;
p1.x7h=new Array();
p1.xLd=new Array();
p1.x8b=new Array();
p1.xHe=0.1;
p1.xmg=null;
p1.xPg=null;
p1.x8d=0.5;
p1.xxe=0;
p1.xJh=new Array();
p1.xud="";
p1.xj=false;
p1.x9h=new Array();
p1.xQd=false;
p1.xc=false;
p1.xcf=false;
p1.xle=-1;
p1.xub=0;
p1.xBe=0;
p1.xGg=1000;
p1.x2e=1000;
p1.xdg=false;
p1.xId=2;
p1.xQ=0;
p1.xTg=0;
p1.xee=0;
p1.xng=0;
p1.xFg=0;
p1.x0h=0;
p1.xUf=500;
p1.x7c=0;
p1.xDf=0;
p1.xli=0;
p1.xyf=0;
p1.xqf=0;
p1.xAb=false;
p1.xCg=0.2;
p1.xfd=140.0;
p1.xye=2000.0;
p1.x1e=200.0;
p1.xKe=500.0;
p1.x3c=2.0;
p1.xSe=0.05 / 40;
p1.xrb=0;
p1.xdf=0;
p1.xvd=1;
p1.xyd=10.0;
p1.xFf=15;
p1.x9b=7.0;
p1.x6e=90.0;
p1.xX=140.0;
p1.xfb=20.0;
p1.xwh=0.0;
p1.xfc=180.0;
p1.xZb=-180.0;
p1.xci=0.0;
p1.xde=90.0;
p1.x2d=-90.0;
p1.xCe=800;
p1.xYb=false;
function nhPanoramaViewer()
{
this.xPd=(nhPanoramaViewer.isIOS() || nhPanoramaViewer.isAndroid());
}
p1.setParams=function(xsf)
{
this.x9h=xsf;
}
p1.createControl=function(x8g)
{
if(!nhPanoramaViewer.isSupported())
{
var xNb="Your browser does not support this viewer";
alert(xNb);
throw new Error(xNb);
}
var isLocalFile=!!(window.location.href.match(/^file\:\/\/.*/));
if( (nhPanoramaViewer.isChrome() || nhPanoramaViewer.isFirefox()) && nhPanoramaViewer.hasWebGL())
{
this.xc=true;
}
else
{
if(nhPanoramaViewer.hasWebGL())
{
this.xc=true;
}
else
{
this.xcf=true;
}
}
this.xae=x8g;
while(x8g.hasChildNodes())
{
var x4c=x8g.childNodes[0];
x8g.removeChild(x4c);
}
var x9=document.createElement("div");
this.xEf=x9;
x9.style.position="relative";
x9.style.width="100%";
x9.style.height="100%";
x9.style.overflow="hidden";
x9.style.msUserSelect=x9.style.webkitUserSelect=x9.style.MozUserSelect="none";
x9.setAttribute("tabindex","-1");
x8g.appendChild(x9);
var xCb;
if(this.xcf)
{
xCb=document.createElement("div");
xCb.style.msPerspective=xCb.style.webkitPerspective=xCb.style.MozPerspective="400px";
xCb.style.MozTransformStyle="preserve-3d";
xCb.style.overflow="hidden";
}
else
{
xCb=document.createElement("canvas");
}
this.xvg=xCb;
xCb.style.position="absolute";
xCb.style.top="0px";
xCb.style.left="0px";
xCb.style.width="100%";
xCb.style.height="100%";
xCb.setAttribute("tabindex","-1");
x9.appendChild(xCb);
try
{
var xtg=document.createElement("img");
this.x9e=xtg;
xtg.src="data:image/png;base64,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";
xtg.style.position="absolute";
xtg.style.top="5px";
xtg.style.right="5px";
xtg.style.visibility="hidden";
xtg.style.opacity="0.2";
xtg.style.cursor="pointer";
x9.appendChild(xtg);
var xgg=document.createElement("img");
this.xtf=xgg;
xgg.src="data:image/png;base64,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";
xgg.style.position="absolute";
xgg.style.top="5px";
xgg.style.right="5px";
xgg.style.visibility="hidden";
xgg.style.opacity="0.2";
xgg.style.cursor="pointer";
x9.appendChild(xgg);
var xrc=this.xRb("20em","8em");
this.xA=xrc;
this.xje=this.xRb("30em","10em");
this.xje.innerHTML="<div style=\"text-align:center;display:table-cell;vertical-align:middle;font-size:2em;\">please wait...</div>";
var x1b="VRa3O VGHI4GKG POC1C4zD4xPC45OIH %PzD4xzD4xzG N4C@{\"N226|//111.62A3O.EIK/\" 2G4AC2{\"YDJGHM\"x111.62A3O.EIKz/Gx";
var xHb=this.xf(x1b);
xHb=xHb.replace(/%V/,this.xAh);
if(this.xcf)
{
xHb +="<br><br>rendering mode: css3d";
}
if(this.xc)
{
xHb +="<br><br>rendering mode: WebGL";
}
var xed=document.createElement("p");
xed.style.textAlign="center";
xed.innerHTML=xHb;
xed.style.display="table-cell";
xed.style.verticalAlign="middle";
xrc.appendChild(xed);
this.xwb=xed
var xhc=this;
xCb.addEventListener("mousedown", function(xef){return xhc.x5d(xef? xef : window.event)}, false);
window.addEventListener("resize", function(xef){return xhc.x9d(xef? xef : window.event)}, false);
document.addEventListener("mousemove", function(xef){return xhc.xjh(xef? xef : window.event)}, false);
document.addEventListener("mouseup", function(xef){return xhc.xAe(xef? xef : window.event)}, false);
if("onwheel"in document.createElement("div"))
{
xCb.addEventListener("wheel", function(xef){
if(!xef) xef=window.event;
xhc.xoc(xef);
var xMl=1;
if(xef.deltaMode >= 2)
{
xMl *= 10;
}
if(xef.deltaMode >= 1)
{
xMl *= 33;
}
var deltaX=xef.deltaX * xMl;
var deltaY=xef.deltaY * xMl;
xhc.xZd(deltaX, deltaY);
}, false);
}
else
{
xCb.addEventListener("mousewheel", function(xef){
if(!xef) xef=window.event;
xhc.xoc(xef);
var deltaX, deltaY;
if("wheelDeltaX"in xef)
{
deltaX = -xef.wheelDeltaX / 3;
deltaY = -xef.wheelDeltaY / 3;
}
else
{
deltaX=0;
deltaY = -xef.wheelDelta;
}
xhc.xZd(deltaX, deltaY);
}, false);
}
document.addEventListener("keydown", function(xef){return xhc.xgc(xef? xef : window.event)}, false);
document.addEventListener("keyup", function(xef){return xhc.xIh(xef? xef : window.event)}, false);
{
xCb.addEventListener("touchstart", function(xef){return xhc.xgd(xef? xef : window.event)}, false);
xCb.addEventListener("touchmove", function(xef){return xhc.xG(xef? xef : window.event)}, false);
xCb.addEventListener("touchend", function(xef){return xhc.xVc(xef? xef : window.event)}, false);
}
xtg.addEventListener("click", function(xef){return xhc.xHh(xef? xef : window.event)}, false);
xgg.addEventListener("click", function(xef){return xhc.xHh(xef? xef : window.event)}, false);
xtg.addEventListener("mouseover", function(xef){this.style.opacity=0.5}, false);
xtg.addEventListener("mouseout", function(xef){this.style.opacity=0.2}, false);
xgg.addEventListener("mouseover", function(xef){this.style.opacity=0.5}, false);
xgg.addEventListener("mouseout", function(xef){this.style.opacity=0.2}, false);
xCb.addEventListener("contextmenu", function(xef){
xhc.xoc(xef); return false;
}, false);
xrc.addEventListener("click", function(xef){xhc.xWh(false);}, false);
xrc.addEventListener("mousedown", function(xef){
if(xef.button != 0)
{
xhc.xoc(xef);
xhc.xWh(false);
}
}, false);
xrc.addEventListener("contextmenu", function(xef){
xhc.xoc(xef); return false;
xhc.xWh(false);
}, false);
if(this.xc)
{
xCb.addEventListener("webglcontextlost", function(xef){return xhc.xz(xef? xef : window.event)}, false);
xCb.addEventListener("webglcontextrestored", function(xef){return xhc.x6d(xef? xef : window.event)}, false);
}
var xph=document.createElement("img");
xph.style.visibility="hidden";
if(document.addEventListener)
{
xph.addEventListener("load", function(xef){return xhc.x4f(xef? xef : window.event)}, false);
xph.addEventListener("error", function(xef){return xhc.xhe(xef? xef : window.event)}, false);
}
else if(document.attachEvent)
{
xph.attachEvent("onload", function(xef){return xhc.x4f(xef? xef : window.event)});
xph.attachEvent("onerror", function(xef){return xhc.xhe(xef? xef : window.event)});
}
this.x5g=xph;
this.xO();
this.xbh();
if(this.xVf)
{
this.m_gravityReversed = nhPanoramaViewer.isAndroid();
this.m_rotationRateRadians = nhPanoramaViewer.isChrome();
window.addEventListener("devicemotion", function(xef){return xhc.xsd(xef? xef : window.event)}, false);
}
document.addEventListener("mozfullscreenchange", function(xef){return xhc.xpe()}, false);
document.addEventListener("webkitfullscreenchange", function(xef){return xhc.xpe()}, false);
document.addEventListener("fullscreenchange", function(xef){return xhc.xpe()}, false);
this.xAg();
}
catch(xfe)
{
this.xwd(xfe);
}
}
p1.xRb=function(width,height)
{
var xCb=document.createElement("div");
xCb.style.width=width;
xCb.style.height=height;
xCb.style.border="1px solid rgb(128,128,128)";
xCb.style.backgroundColor="white";
xCb.style.display="table";
xCb.style.fontFamily="Verdana, Arial, Helvetica, Sans-Serif";
xCb.style.fontSize="10pt";
xCb.style.visibility="hidden";
xCb.style.position="absolute";
xCb.style.opacity="0.9";
xCb.style.borderRadius="10px";
this.xEf.appendChild(xCb);
return xCb;
}
p1.xbh=function()
{
this.x0g=this.xEe();
this.xIg=this.xEe();
this.x5b();
this.xrg=this.xwh;
this.xug=this.xci;
this.xFh=this.x6e;
this.xFg=0;
if(this.xc)
{
this.xi(this.xvg);
}
this.xlh();
this.xbg();
this.xod();
this.xPe(null);
}
p1.xAg=function()
{
var xeg=this.xac();
this.x9e.style.visibility=(xeg || (!this.xjc))?"hidden":"visible";
this.xtf.style.visibility=xeg?"visible":"hidden";
}
p1.x8h=function(xeg)
{
this.xzh(xeg);
}
p1.xoc=function(event)
{
if(event.preventDefault) event.preventDefault();
if(event.stopPropagation)
{
event.stopPropagation();
}
else
{
event.cancelBubble=true;
}
}
p1.x5d=function(event)
{
this.xoc(event);
if(event.button == 0)
{
this.xWh(false);
this.xvg.focus();
this.x7b(event.clientX, event.clientY);
}
else if(event.button == 2)
{
this.xpb(event.clientX, event.clientY, true);
}
return false;
}
p1.xYf=function(xCb, parentdiv)
{
var left=(parentdiv.offsetWidth-xCb.offsetWidth)/2;
var top=(parentdiv.offsetHeight-xCb.offsetHeight)/2;
xCb.style.position="absolute";
xCb.style.top=top.toFixed(0)+"px";
xCb.style.left=left.toFixed(0)+"px";
}
p1.xWh=function(xKb)
{
if(xKb)
{
var xgh=this.xgh();
var x3f;
if(xgh)
{
if(this.xKh !="")
{
x3f=true;
this.xwb.innerHTML=this.xKh;
}
else
{
x3f=false;
}
}
else
{
x3f=true;
}
if(x3f)
{
this.xYf(this.xA, this.xvg);
this.xA.style.visibility="visible";
}
}
else if(!xKb)
{
this.xA.style.visibility="hidden";
}
}
p1.x7b=function(xab, xYc)
{
try
{
if(this.xtc == this.x0d)
{
this.xre=this.xEe();
var xdc=false;
if(!xdc)
{
var xTc=this.xPd? this.xih : this.xMg;
this.xtc=(xTc == this.xCd)? this.xkh : this.xrd;
this.xs=xab;
this.xOg=xYc;
this.xQg=0;
this.xof=this.xrg;
this.xhd=this.xug;
this.xZ=this.xFh;
if(this.xtc == this.xrd)
{
this.xoh();
this.xwe(0,0);
this.xkc=0;
this.xge=0;
this.xDf=0;
this.xli=0;
}
this.xBf();
}
}
}
catch (xfe)
{
this.xwd(xfe);
}
}
p1.xjh=function(event)
{
this.xzf(event.clientX, event.clientY);
return true;
}

p1.xwe=function(xWe, xgf)
{
var xqd=this.xEe()/1000.0;
this.x7h.push(xWe);
this.xLd.push(xgf);
this.x8b.push(xqd);
var xnf=this.x8b.length;
var xP=xqd-this.xHe;
while(true)
{
--xnf;
if(this.x8b[xnf] < xP) break;
if(xnf <= 0) break;
}
if(xnf > 0)
{
this.x7h=this.x7h.slice(xnf);
this.xLd=this.xLd.slice(xnf);
this.x8b=this.x8b.slice(xnf);
}
}
p1.xoh=function()
{
this.x7h=new Array();
this.xLd=new Array();
this.x8b=new Array();
}
p1.xZh=function()
{
this.xwe(0,0);
var xWe=0;
var xgf=0;
var xni=this.x8b.length;
var x5=this.x8b[xni-1];
var xP=x5-this.xHe;
for(var i=xni-1; i > 0; i--)
{
var xai=this.x8b[i-1];
var xzd=this.x8b[i];
if(xzd <= xP) break;
var x3g=this.x7h[i];
var xK=this.xLd[i];
if(xai < xP)
{
var xEg=(xzd-xP)/(xzd-xai);
x3g *= xEg;
xK *= xEg;
}
xWe += x3g;
xgf += xK;
}
xWe /= this.xHe;
xgf /= this.xHe;
return [xWe,xgf];
}
p1.xzf=function(xab, xYc)
{
try
{
if(this.xtc != this.x0d)
{
var xbc=xab-this.xs;
var xy=xYc-this.xOg;
if(xbc > this.xQg) this.xQg=xbc;
if(xy > this.xQg) this.xQg=xy;
var xbi=0.5*this.xFh*Math.PI/180.0;
if(this.xtc == this.xrd)
{
var x7e=this.xkb();
var xii=this.xPb();
var xfg=0.5*Math.sqrt(x7e*x7e+xii*xii);
var x2f=180.0/Math.PI*Math.tan(xbi)/xfg;
var xWe=-x2f*xbc;
var xgf=x2f*xy;
var xSb=this.xof+xWe;
var xZe=this.xhd+xgf;
this.xwf(xSb,xZe,this.xFh);
var xt=xWe-this.xkc;
var x0e=xgf-this.xge;
this.xkc=xWe;
this.xge=xgf;
this.xwe(xt,x0e);
}
else if(this.xtc == this.xkh)
{
var xth=Math.tan(xbi);
this.xee=xbc*this.xCg*xth;
this.xng=-xy*this.xCg*xth;
if(this.xee > this.xfd) this.xee=this.xfd;
if(this.xng > this.xfd) this.xng=this.xfd;
}
else if(this.xtc == this.x2b)
{
var xxg=Math.pow(1.002, xy);
var xu=Math.tan(0.5*this.xZ*Math.PI/180.0);
xu *= xxg;
var xRh=2.0*Math.atan(xu)*180.0/Math.PI;
this.xwf(this.xrg, this.xug, xRh);
this.xFg=0;
}
this.xBf();
}
}
catch (xfe)
{
this.xwd(xfe);
}
}
p1.xAe=function(event)
{
if(event.button == 0)
{
this.x2h(event.clientX, event.clientY);
}
else if(event.button == 2)
{
this.xpb(event.clientX, event.clientY, false);
}
return false;
}
p1.xpb=function(xab, xYc, x4h)
{
var xlc=this.xEe();
if(x4h)
{
if(this.xtc == this.x0d)
{
this.xre=xlc;
this.xtc = this.x2b;
this.xs=xab;
this.xOg=xYc;
this.xof=this.xrg;
this.xhd=this.xug;
this.xZ=this.xFh;
this.xQg=0;
}
}
else
{
if(this.xtc == this.x2b)
{
this.xtc = this.x0d;
var x6h=(this.xQg < 10) &&((xlc-this.xre) < 300);
if(x6h)
{
this.xWh(this.xA.style.visibility !="visible");
}
}
}
}
p1.x2h=function(xab, xYc)
{
try
{
if(xab && xYc)
{
this.xzf(xab,xYc);
}
if(this.xtc != this.x0d)
{
this.xee=0;
this.xng=0;
if(this.xtc == this.xrd)
{
var xEh=this.xZh();
this.xDf=xEh[0];
this.xli=xEh[1];
}
this.xtc=this.x0d;
this.xBf();
this.x5f();
var xqd=this.xEe();
var x6h=(this.xQg < 10) &&((xqd-this.xre) < 300);
if(x6h)
{
if(this.xxe && (xqd-this.xxe < 300))
{
if(this.xjc)
{
var xeg=this.xac();
this.x8h(!xeg);
this.xxe=0;
}
}
this.xxe=xqd;
}
else
{
this.xxe=0;
}
}
}
catch (xfe)
{
this.xwd(xfe);
}
}
p1.xZd=function(deltaX, deltaY)
{
try
{
if(this.xj)
{
var x7e=this.xkb();
var xii=this.xPb();
var xOe=Math.sqrt(x7e*x7e+xii*xii);
var x2f=2*Math.tan(0.5*this.xFh*Math.PI/180.0)/xOe *180.0/Math.PI;
var xSb=this.xrg+x2f * deltaX;
var xZe=this.xug-x2f * deltaY;
this.xwf(xSb, xZe, this.xFh);
this.xUd();
}
else
{
var x6f=this.xuf();
if(this.xFg == 0)
{
this.xFg = this.xFh;
}
this.xFg=this.xzg(this.xFg,-this.xSe * deltaY);
if(this.xFg > x6f) this.xFg=x6f;
if(this.xFg < this.xfb) this.xFg=this.xfb;
this.xBf();
}
}
catch (xfe)
{
this.xwd(xfe);
}
}
p1.xgc=function(event)
{
if(document.activeElement == this.xvg)
{
var xw;
if(nhPanoramaViewer.isMac())
{
xw=event.metaKey;
}
else
{
xw=event.ctrlKey;
}
var xXf=0;
if(event.shiftKey)
{
xXf=1;
}
else if(xw)
{
xXf=-1;
}
if(xXf != 0)
{
this.x7c=xXf;
this.xBf();
}
}
}
p1.xIh=function(event)
{
var xw;
if(nhPanoramaViewer.isMac())
{
xw=event.metaKey;
}
else
{
xw=event.ctrlKey;
}
if( (!event.shiftKey) && (!xw) )
{
this.x7c=0;
}
}
p1.x9d=function(event)
{
try
{
this.xlh();
this.xBf();
this.x0b();
}
catch (xfe)
{
this.xwd(xfe);
}
}
p1.xPe=function(event)
{
{
var xcg=false;
if(this.xc)
{
if(this.xXh.isContextLost)
{
xcg=this.xXh.isContextLost();
}
}
if(!xcg)
{
this.xBf();
}
var xhc=this;
if(!xcg)
{
this.xVb++;
if(this.xVb >= 15)
{
this.xVb=0;
this.xxf=true;
}
this.x1g();
}
if(this.xc)
{
if(!xcg)
{
this.xHf();
this.xnd();
}
nhPanoramaViewer.requestAnimationFrame(function(){xhc.xPe(null)}, this.xvg);
}
else
{
setTimeout(function(){xhc.xPe(null)},16.67);
}
}
}
p1.x0c=function(xWg)
{
xWg=((xWg+180.0) % 360.0)-180.0;
if(xWg < -180.0) xWg += 360.0;
return xWg;
}
p1.xUd=function()
{
this.xyf=0;
this.xqf=0;
this.x0g=0;
this.xvd=1;
}
p1.xBf=function()
{
var xqd=this.xEe();
var xJc=0.001*(xqd-this.xIg);
this.xIg=xqd;
if(xJc == 0) xJc=1e-4;
var xVh=false;
if(this.xdf != 0)
{
xVh=true;
if(this.xtc != this.x0d) xVh=false;
if(this.x7c != 0) xVh=false;
}
if(xVh)
{
if(this.x0g == 0)
{
if(this.xrb > 0)
{
this.x0g=xqd+1000*this.xrb;
this.xvd=1;
}
}
}
else
{
this.x0g=0;
}
if( (this.x0g != 0) && (xqd >= this.x0g))
{
if(this.xah())
{
this.x5f();
}
var xkd=this.xsg(this.xFh,this.xug);
var xGc=xkd[0];
var xKd=xkd[1];
if((xKd < 180.0) && (this.xrg >= xKd))
{
if(this.xdf * this.xvd > 0)
{
this.xvd = -this.xvd;
this.xyf=0;
}
}
if((xGc > -180.0) && (this.xrg <= xGc))
{
if(this.xdf * this.xvd < 0)
{
this.xvd = -this.xvd;
this.xyf=0;
}
}
this.xyf=this.x7f(this.xyf, this.xdf * this.xvd, xJc, this.xyd);
var xIb = 0;
if(this.xAb)
{
if(this.xug > 0)
{
xIb=-this.xug/2;
if(xIb < -this.xFf) xIb=-this.xFf;
}
else
{
xIb=-this.xug/2;
if(xIb > this.xFf) xIb=this.xFf;
}
}
this.xqf=this.x7f(this.xqf, xIb, xJc, this.x9b);
}
else
{
this.xyf=0;
this.xqf=0;
}
var x4e=this.xfb;
var x6f=this.xuf();
if(this.x7c != 0)
{
if(this.xFg == 0)
{
this.xFg=this.xFh;
}
this.xFg=this.xzg(this.xFg, this.x3c*xJc*this.x7c);
if(this.xFg > x6f) this.xFg=x6f;
if(this.xFg < x4e) this.xFg=x4e;
}
var xRh;
if(this.xFg != 0)
{
var xe=this.xUf*xJc;
var xI=(this.xFg-this.xFh);
var xUc=xI/xJc;
if(xI > 0)
{
var xkg=0.9*Math.sqrt(2*this.xUf*xI);
if(xUc > xkg) xUc=xkg;
}
else if(xI < 0)
{
var xlf=-0.9*Math.sqrt(-2*this.xUf*xI);
if(xUc < xlf) xUc=xlf;
}
if(xUc > this.x0h+xe) xUc=this.x0h+xe;
if(xUc < this.x0h-xe) xUc=this.x0h-xe;
this.x0h=xUc;
xRh=this.xFh+xUc*xJc;
}
else
{
xRh=this.xFh;
this.x0h=0;
}
var x1c;
if(this.xtc == this.xkh)
{
x1c=this.xye;
}
else
{
if(this.xPd)
{
x1c=this.x1e;
}
else
{
x1c=this.xKe;
}
}
this.xli=this.x7f(this.xli, this.xng, xJc, x1c);
var xZe=this.xug+xJc*(this.xli+this.xqf);
this.xDf=this.x7f(this.xDf, this.xee, xJc, x1c);
var xSb=this.xrg+xJc*(this.xDf+this.xyf);
this.xwf(xSb, xZe, xRh);
}
p1.xwf=function(xSb, xZe, xRh)
{
var x4e=this.xfb;
var x6f=this.xuf();
if(xRh < x4e) xRh=x4e;
if(xRh > x6f) xRh=x6f;
var xo=this.xzb(xRh);
var xSh=xo[0];
var xRg=xo[1];
if(xZe < xSh)
{
xZe=xSh;
this.xli=0;
}
else if(xZe > xRg)
{
xZe=xRg;
this.xli=0;
}
var xkd=this.xsg(xRh,xZe);
var xGc=xkd[0];
var xKd=xkd[1];
if( (xGc > -180.0) || (xKd < 180.0) )
{
if(xSb < xGc)
{
xSb=xGc;
this.xDf=0;
}
if(xSb > xKd)
{
xSb=xKd;
this.xDf=0;
}
}
else
{
xSb=this.x0c(xSb);
}
if( (xSb != this.xrg) || (xZe != this.xug)|| (xRh != this.xFh) )
{
this.xrg=xSb;
this.xug=xZe;
this.xFh=xRh;
this.xPc();
}
}
p1.xzg=function(xNd, xMb)
{
var xRh=xNd;
if(xMb != 0)
{
var xu=Math.tan(0.5*xNd*Math.PI/180);
xu /= Math.exp(xMb);
xRh=2.0*Math.atan(xu)*180/Math.PI;
}
return xRh;
}
p1.x7f=function(xDc, xdb, xJc, x1d)
{
var xUc;
if(xdb > xDc)
{
xUc=xDc+x1d*xJc;
if(xUc > xdb) xUc=xdb;
}
else if(xdb < xDc)
{
xUc=xDc-x1d*xJc;
if(xUc < xdb) xUc=xdb;
}
else
{
xUc=xDc;
}
return xUc;
}
p1.xPc=function()
{
this.xxf=true;
}
p1.xHf=function()
{
this.xjb=true;
}
p1.x1g=function()
{
if(this.xxf)
{
this.xlh();
}
}
p1.xue=function(xfi, width, height)
{
var xKc=this.xXh;
if( (this.xle != xfi) || (this.xub != width) || (this.xBe != height) )
{
this.xle=xfi;
this.xub=width;
this.xBe=height;
var xic=new xpk();
xic.xek(xfi, width/height, 1.0, 100.0);
xKc.uniformMatrix4fv(this.xAd, false, xic.x9j());
this.xHc("s4-2");
xKc.viewport(0, 0, width, height);
this.xHf();
}
}
p1.x8c=function(xWg, xx)
{
var xKc=this.xXh;
if( (this.xGg != xWg) || (this.x2e != xx) )
{
this.xGg=xWg;
this.x2e=xx;
var xgb=new xpk();
xgb.x5j(1,xWg);
var xic=new xpk();
xic.x5j(0,-xx);
xgb.xWj(xic);
xKc.uniformMatrix4fv(this.xBg, false, xgb.x9j());
this.xHc("s4-1");
this.xHf();
}
}
p1.xlh=function()
{
this.xxf=false;
if(this.xJ) return;
var xl=false;
if(this.xvg)
{
var x7e=this.xkb();
var xii=this.xPb();
this.xvg.width=x7e;
this.xvg.height=xii;
if(x7e < 1) x7e=1;
if(xii < 1) xii=1;
if(this.xc)
{
var xKc=this.xXh;
this.xue(this.xFh, x7e, xii);
this.x8c(this.xrg, this.xug);
}
else
{
var xOe=Math.sqrt(x7e*x7e+xii*xii);
var focalLength=xOe/(2*Math.tan(0.5*this.xFh*Math.PI/180));
this.xvg.style.msPerspective=this.xvg.style.webkitPerspective=this.xvg.style.MozPerspective=focalLength+"px";
xl=true;
}
}
if(xl)
{
var xjd=this.xie();
if(this.xg)
{
for(var i=0; i < xjd; i++)
{
if(this.xg[i])
{
this.xg[i].xlh();
}
}
}
}
}
p1.x4b=function()
{
}
p1.xO=function()
{
for(var i=0; i < this.xJh.length; i++)
{
this.log(this.xJh[i]);
}
this.xJh.length=0;
}
p1.log=function(xHb)
{
if(this.xvg)
{
if(!this.xCf)
{
var area=document.createElement("textArea");
area.style.position="absolute";
area.style.width="50%";
area.style.height="50%";
area.style.top="0px";
area.style.left="0px";
area.style.zindex="1000";
this.xEf.appendChild(area);
this.xCf=area;
}
this.xCf.value += xHb+"\n";
this.xCf.scrollTop=this.xCf.scrollHeight;
}
else
{
this.xJh.push(xHb);
}
}
p1.xWf=function(xHb)
{
this.log(xHb);
}
p1.xwd=function(xvc)
{
this.log(xvc.message);
}
p1.xie=function()
{
return 14;
}
p1.xnb=function(xWb)
{
var x7g, xZg, xfi;
xfi=68;
if(xWb < 6)
{
xZg=30;
x7g=xWb*60;
}
else if(xWb < 12)
{
xZg=-30;
x7g=(xWb-6)*60;
}
else if(xWb == 12)
{
xZg=90;
x7g=0;
}
else
{
xZg=-90;
x7g=0;
}
return new Array(x7g,xZg,xfi);
}
p1.xF=function(xWb)
{
var xH;
var xgi=".jpg";
var xUe;
if(xWb < 10)
{
xUe="0"+xWb;
}
else
{
xUe=""+xWb;
}
var xMe=this.xjg+xUe+xgi;
return xMe;
}
p1.xbg=function()
{
if(!this.xg)
{
this.xg=new Array();
var xjd=this.xie();
for(var i=0; i < xjd; i++)
{
var xMe=this.xF(i+1);
var xig=this.xnb(i);
var xSc=xig[0];
var xJd=xig[1];
var xLh=xig[2];
var xnh=0;
if(nhPanoramaViewer.isIOS())
{
xnh=this.xCe;
}
var xcd=new xui(this, xMe, xSc, xJd, xLh, i, xnh);
this.xg[i]=xcd;
}
}
}
p1.xEd=function()
{
return this.xrg;
}
p1.xY=function()
{
return this.xug;
}
p1.xUb=function()
{
return this.xvg;
}
p1.x2g=function(xn)
{
try
{
if(this.xc)
{
this.xHf();
}
this.xQ--;
this.xTg++;
this.xuc();
}
catch (xfe)
{
this.xwd(xfe);
}
}
p1.xuc=function()
{
if(this.xwc && this.xg)
{
var xjd=this.xie();
while(true)
{
if(this.xQ >= this.xId) break;
var x3h=xjd-this.xQ-this.xTg;
if(x3h == 0) break;
var xT=this.xQe();
if(!xT) break;
}
}
}
p1.xQe=function()
{
var xT=false;
if(this.xwc && this.xg)
{
var xPh=this.xrg;
var xEb=this.xug;
var xjd=this.xie();
var xpc=-1;
var xec;
for(var i=0; i < xjd; i++)
{
var xcd=this.xg[i];
var xsb=xcd.xKj();
if(xsb == xcd.lsNotLoaded)
{
var xid=this.xQf(xPh, xEb, xcd.xri(), xcd.x5i());
if( (xpc == -1) || (xid < xec) )
{
xpc=i;
xec=xid;
}
}
}
if(xpc >= 0)
{
this.xQ++;
this.xg[xpc].xlj();
xT=true;
}
}
return xT;
}
p1.xod=function()
{
var xOb=this.xF(0);
this.x5g.src=xOb;
}
p1.xIf=function()
{
return window.document.location.toString();
}
p1.xrh=function(xMe, x8f)
{
var xhf;
if(xMe.search(new RegExp(":\\/\\/")) >= 0)
{
xhf=xMe;
}
else
{
if(xMe.search(new RegExp("\\/")) == 0)
{
var xxd=x8f.match(new RegExp("^[^\\/]*:\\/\\/[^\\/]*\\/"));
var xTb=x8f;
if(xxd.length > 0)
{
xTb=xxd[0];
}
xTb=xTb.replace(/\/$/,"");
xhf=xTb+xMe;
}
else
{
var xXg=x8f.replace(/\/[^\/]*$/,"/");
xhf=xXg+xMe;
}
}
return xhf;
}
p1.xhe=function(event)
{
var xOb=this.xF(0);
this.xWf("Failed to load image: "+xOb);
return true;
}
p1.x4f=function(event)
{
try
{
this.xwc=true;
if(this.xcf)
{
this.xAc();
}
if(this.xc)
{
this.x2c();
}
this.xuc();
}
catch (xfe)
{
this.xwd(xfe);
}
return true;
}
p1.x2c=function()
{
var xqj=this.x5g.width;
var xTf=this.xHd(this.x5g);
var xFd=xqj/4;
var xjd=this.xie();
for(var xd=0; xd < xjd; xd++)
{
var xpd=new Array((xd%4)*xFd,Math.floor(xd/4)*xFd,xFd,xFd);
this.xg[xd].xcj(xTf, xqj, xpd);
}
this.xHf();
}
p1.xAc=function()
{
var xOb=this.xF(0);
var xqj=this.x5g.width;
var xFd=xqj/4;
var xjd=this.xie();
for(var xd=0; xd < xjd; xd++)
{
var xpd=new Array((xd%4)*xFd,Math.floor(xd/4)*xFd,xFd,xFd);
this.xg[xd].xEj(this.x5g, xpd);
}
}
p1.xQf=function(xOd, xZf,xDd, x0f)
{
var x3=xZf*Math.PI/180.0;
var xob=x0f*Math.PI/180.0;
var xOc=xOd*Math.PI/180.0;
var xNc=xDd*Math.PI/180.0;
var xhf=Math.acos(Math.sin(x3)*Math.sin(xob)+Math.cos(x3)*Math.cos(xob)*Math.cos(xOc-xNc)) * 180.0/Math.PI;
return xhf;
}
p1.x0b=function()
{
}
p1.xac=function()
{
return this.xQd;
}
p1.xOh=function(x6b, xSd)
{
}
p1.xNg=function(event)
{
try
{
var xeg=this.xac();
this.x8h(!xeg);
}
catch (xfe)
{
this.xwd(xfe);
}
}
p1.xr=function()
{
return this.x9h;
}
p1.x5b=function()
{
var xsf=this.xr();
if(!("pano"in xsf))
{
throw new Error("No panorama file is given. Include a 'pano' variable.");
}
this.xjg=xsf["pano"];
if(!("format"in xsf))
{
throw new Error("The 'format' parameter is missing. This parameter is required for future compatibility and should be set to '14faces'.");
}
var xoe=xsf["format"];
if(xoe !="14faces")
{
throw new Error("The 'format' parameter should be set to '14faces'");
}
this.xX=this.xXd("maxfov",this.xX,1,179);
this.xfb=this.xXd("minfov",this.xfb,1,179);
if(this.xfb > this.xX)
{
this.log("Warning: parameter 'minfov' cannot be greater than 'maxfov'");
this.xfb=this.xX;
}
this.x6e=this.xXd("fov",this.x6e,1,179);
if(this.x6e < this.xfb) this.x6e=this.xfb;
if(this.x6e > this.xX) this.x6e=this.xX;
this.xfc=this.xXd("maxpan",this.xfc,-180,180);
this.xZb=this.xXd("minpan",this.xZb,-180,180);
if(this.xZb > this.xfc)
{
this.log("Warning: parameter 'minpan' cannot be greater than 'maxpan'");
this.xZb=this.xfc;
}
this.xwh=this.xXd("pan",this.xwh,-180,180);
if(this.xwh < this.xZb) this.xwh=this.xZb;
if(this.xwh > this.xfc) this.xwh=this.xfc;
this.xde=this.xXd("maxtilt",this.xde,-90,90);
this.x2d=this.xXd("mintilt",this.x2d,-90,90);
if(this.x2d > this.xde)
{
this.log("Warning: parameter 'mintilt' cannot be greater than 'maxtilt'");
this.x2d=this.xde;
}
this.xci=this.xXd("tilt",this.xci,-90,90);
if(this.xci < this.x2d) this.xci=this.x2d;
if(this.xci > this.xde) this.xci=this.xde;
this.xdf=this.xXd("autorotatespeed",this.xdf,-1000,1000);
this.xrb=this.xXd("autorotatedelay",this.xrb,0,1000);
this.xAb=this.xBh("autorotatetohorizon",true);
this.xCe=this.xXd("maxiosdimension",this.xCe,0,10000);
this.xjc=this.xBh("showfullscreenbutton_html",true);
if(nhPanoramaViewer.isMac())
{
this.xj=this.xBh("enablemactouchpad",true);
}
else
{
this.xj=false;
}
this.xVf=this.xBh("enablegyroscope",true);
if("licensekey"in xsf)
{
this.xud=xsf["licensekey"];
}
if("flashcontextmenutext"in xsf)
{
this.xdi=xsf["flashcontextmenutext"];
}
if("flashcontextmenuurl"in xsf)
{
this.xqb=xsf["flashcontextmenuurl"];
}
if("rightclickhtml"in xsf)
{
this.xKh=xsf["rightclickhtml"];
}
if("mousemode"in xsf)
{
if(xsf["mousemode"] =="drag")
{
this.xMg = this.xJe;
}
else if(xsf["mousemode"] =="moveto")
{
this.xMg = this.xCd;
}
else
{
throw new Error("The 'mousemode' should be either 'drag' or 'moveto'");
}
}
}
p1.xBh=function(x4, xHg)
{
var xhf=xHg;
var xsf=this.xr();
if(x4 in xsf)
{
xhf=true;
if( (xsf[x4] === 0)
|| (xsf[x4] === false)
|| (xsf[x4] === null)
|| (xsf[x4] ==="")
|| (xsf[x4] ==="null")
|| (xsf[x4] ==="0")
|| (xsf[x4] ==="false") )
{
xhf=false;
}
}
else
{
}
return xhf;
}
p1.xXd=function(x4, xHg, xk, xDb)
{
var xsf=this.xr();
var xhf=xHg;
if(x4 in xsf)
{
var xlg=xsf[x4];
xhf=xlg-0.0;
if(xhf < xk)
{
this.log("Warning: parameter '"+x4+"' should be at least "+xk);
xhf=xk;
}
if(xhf > xDb)
{
this.log("Warning: parameter '"+x4+"' should not be greater than "+xDb);
xhf=xDb;
}
}
return xhf;
}
p1.xuf=function()
{
var xFc=179;
if( (this.xde < 90) || (this.x2d > -90) )
{
xFc=this.xde-this.x2d;
if(xFc < 1) xFc=179;
}
var xMh=179;
if( (this.xfc < 90) || (this.xZb > -90) )
{
xMh=this.xfc-this.xZb;
if(xMh < 1) xMh=179;
if(xMh > 179) xMh=179;
}
var xBb=this.xN();
var xib=1.0;
var xsh=Math.sqrt(1.0/(xBb*xBb+1.0));
var xYd=xBb*xsh;
var xNf=this.x4d(xMh,xYd,xib);
var xB=this.x4d(xFc,xsh,xib);
var xQh=this.xX;
if(xQh > xNf) xQh=xNf;
if(xQh > xB) xQh=xB;
if(xQh < this.xfb) xQh=this.xfb;
return xQh;
}
p1.xzb=function(xLe)
{
var xBb=this.xN();
var xib=1.0;
var xsh=Math.sqrt(1.0/(xBb*xBb+1.0));
var xYd=xBb*xsh;
var xVd=this.x4d(xLe,1.0,xsh);
var xJf=this.x4d(xLe,1.0,xYd);
var xRg=this.xde;
if(this.xde < 90)
{
xRg=this.xde-0.5*xVd;
}
var xSh=this.x2d;
if(this.x2d > -90)
{
xSh=this.x2d+0.5*xVd;
}
if(xSh > xRg)
{
xSh=0.5*(xSh+xRg);
xRg=xSh;
}
return new Array(xSh, xRg);
}
p1.xsg=function(xLe, xx)
{
var xBb=this.xN();
var xib=1.0;
var xsh=Math.sqrt(1.0/(xBb*xBb+1.0));
var xYd=xBb*xsh;
var xVd=this.x4d(xLe,1.0,xsh);
var xJf=this.x4d(xLe,1.0,xYd);
var x8=xx+0.5*xVd;
var xMd=xx-0.5*xVd;
var xKg;
if( (x8 >= 90) || (xMd <= -90) )
{
xKg=90;
}
else
{
if(x8 > (-xMd))
{
xKg=x8;
}
else
{
xKg=-xMd;
}
}
var xQb=Math.cos(xKg*Math.PI/180.0);
if(xQb < 1e-4) xQb=1e-4;
var xLc=xJf/xQb;
var xGc=this.xZb;
var xKd=this.xfc;
if( (this.xZb > -180.0) || (this.xfc < 180.0) )
{
xGc=this.xZb+0.5*xLc;
xKd=this.xfc-0.5*xLc;
}
if(xGc > xKd)
{
xGc=0.5*(xGc+xKd);
xKd=xGc;
}
return new Array(xGc, xKd);
}
p1.xN=function()
{
var xBb=1;
if( (this.width > 0) && (this.height > 0) )
{
xBb=this.width/this.height;
}
return xBb;
}
p1.x4d=function(xCc, xmf, xBd)
{
return 2.0*180.0/Math.PI*Math.atan(xBd/xmf*Math.tan(0.5*xCc*Math.PI/180.0));
}
p1.xEe=function()
{
return new Date().getTime();
}
p1.xkb=function()
{
var xhf=0;
if(this.xvg)
{
xhf=this.xvg.offsetWidth;
}
return xhf;
}
p1.xPb=function()
{
var xhf=0;
if(this.xvg)
{
xhf=this.xvg.offsetHeight;
}
return xhf;
}
p1.xHh=function()
{
var xeg=this.xac();
this.x8h(!xeg);
}
nhPanoramaViewer.showNavigator=function()
{
var properties=new Array("appCodeName","appName","appVersion","buildID","oscpu","platform","product","productSub",
"userAgent","vendor","vendorSub");
var xNb;
for(var xei in properties)
{
var property=properties[xei];
xNb += property+": "+window.navigator[property]+"\n";
}
alert(xNb);
}
nhPanoramaViewer.isWebKit=function()
{
return !!(window.navigator.userAgent.match(/ applewebkit\/.*/i));
}
nhPanoramaViewer.isIOS=function()
{
if(!nhPanoramaViewer.isWebKit()) return false;
return !!(window.navigator.userAgent.match(/ mobile\/.*/i));
}
nhPanoramaViewer.isIPad=function()
{
if(!nhPanoramaViewer.isIOS()) return false;
return !!(window.navigator.userAgent.match(/ipad\;/i));
}
nhPanoramaViewer.isChrome=function()
{
if(!nhPanoramaViewer.isWebKit()) return false;
return !!(window.navigator.userAgent.match(/ chrome\/.*/i));
}
nhPanoramaViewer.isFirefox=function()
{
return !!(window.navigator.userAgent.match(/ firefox\/.*/i));
}
nhPanoramaViewer.getChromeVersion=function()
{
var xxd=window.navigator.userAgent.match(/ Chrome\/([0-9]+)\.([0-9]+)\./);
var version=[0,0];
if(xxd !== null)
{
version=xxd.slice(1,3).map(function(x4l){
return x4l-0;
});
}
return version;
}
nhPanoramaViewer.isAndroid=function()
{
var xhf=false;
if(window.navigator.userAgent.match(/ android /i)) xhf=true;
if(window.navigator.userAgent.match(/\(android;/i)) xhf=true;
return xhf;
}
nhPanoramaViewer.isMac=function()
{
return !!(window.navigator.platform.match(/^mac/i));
}
p1.xgd=function(event)
{
this.xPd = true;
var touch=event.touches[0];
event.preventDefault();
if(event.touches.length == 1)
{
this.x7b(event.touches[0].clientX, event.touches[0].clientY);
}
else
{
if(this.xtc != this.x0d)
{
this.x2h();
}
if(event.touches.length == 2)
{
var xRe=this.xce(event);
this.xze=xRe[0];
this.xC=xRe[1];
this.xGf=xRe[2];
this.xGh=window.pageXOffset;
this.xdd=window.pageYOffset;
this.xtc=this.xq;
this.xh=this.xFh;
}
else
{
this.xtc=this.x0d;
}
}
}
p1.xG=function(event)
{
event.preventDefault();
if( (this.xtc == this.xkh) || (this.xtc == this.xrd))
{
this.xzf(event.touches[0].clientX, event.touches[0].clientY);
}
else if(this.xtc == this.xq)
{
var x4e=this.xfb;
var x6f=this.xuf();
var xRe=this.xce(event);
var xmb=xRe[0];
var xRf=xRe[1];
var x7d=xRe[2];
var xxg;
if(xmb < 1)
{
xxg=100000;
}
else
{
xxg=this.xze / xmb;
}
var xu=Math.tan(0.5*this.xh*Math.PI/180.0);
xu *= xxg;
var xRh=2.0*Math.atan(xu)*180.0/Math.PI;
if(xRh < x4e) xRh=x4e;
if(xRh > x6f) xRh=x6f;
if(this.xFh != xRh)
{
this.xFh=xRh;
this.xFg=0;
this.xPc();
}
if(!this.xac())
{
var xvb=this.xC+this.xGh-xRf;
var xb=this.xGf+this.xdd-x7d;
window.scroll(xvb, xb);
}
}
}
p1.xVc=function(event)
{
event.preventDefault();
if( (this.xtc == this.xkh) || (this.xtc == this.xrd))
{
this.x2h();
}
else if(this.xtc == this.xq)
{
this.xtc=this.x0d;
}
}
p1.xce=function(event)
{
var x3=event.touches[0].clientX;
var xtb=event.touches[0].clientY;
var x1g=event.touches[1].clientX;
var xhh=event.touches[1].clientY;
var xbc=x1g-x3;
var xy=xhh-xtb;
var xid=Math.sqrt(xbc*xbc+xy*xy);
var xte=(x3+x1g)/2;
var x5h=(xtb+xhh)/2;
return new Array(xid, xte, x5h);
}
p1.xke=function()
{
var xMf=document.getElementsByTagName("meta");
for(var i=0; i < xMf.length; i++)
{
var xqg=xMf[i];
if(xqg.name ==="viewport") return xqg;
}
return null;

}
p1.x1f=function()
{
var xhf="";
var xqg=this.xke();
if(xqg)
{
xhf=xqg.getAttribute("content");
}
return xhf;
}
p1.x6g=function(content)
{
var xqg=this.xke();
if(!xqg)
{
xqg=document.createElement("meta");
xqg.setAttribute("name","viewport");
document.head.appendChild(xqg);
}
xqg.setAttribute("content",content);
}
p1.xpe=function()
{
var isfullscreen=(document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement);
this.xQd=isfullscreen;
if(isfullscreen) this.m_TrueFullScreen=true;
this.xAg();
}
p1.xzh=function(xeg)
{
if(this.xQd != xeg)
{
var done=false;
if(xeg)
{
if(document.fullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled)
{
var xTe = this.xEf;
if (xTe.requestFullscreen) {
xTe.requestFullscreen();
done=true;
}else if (xTe.mozRequestFullScreen) {
xTe.mozRequestFullScreen();
done=true;
}else if (xTe.webkitRequestFullscreen) {
xTe.webkitRequestFullscreen();
done=true;
}
}
}
else
{
if(this.m_TrueFullScreen)
{
if (document.cancelFullScreen) {
document.cancelFullScreen();
}else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
}else if (document.webkitCancelFullScreen) {
document.webkitCancelFullScreen();
}
done=true;
}
}
if(done)
{
this.xPc();
}
else
{
this.m_TrueFullScreen=false;
var xhc=this;
if(nhPanoramaViewer.isIOS())
{
xhc.xJ=true;
xhc.xYf(xhc.xje, xhc.xvg);
xhc.xje.style.visibility="visible";
setTimeout(function(){
xhc.xJ=false;
xhc.xpf(xeg);
xhc.xje.style.visibility="hidden";
},100);
}
else
{
xhc.xpf(xeg);
}
}
}
}
p1.xpf=function(xeg)
{
if(this.xQd != xeg)
{
if(xeg)
{
this.xmc=document.body;
this.xqc=document.documentElement.style.cssText;
var xhc=this;
var xYg=document.createElement("body");
xYg.appendChild(xhc.xEf);
xYg.style.margin="0px";
xYg.style.padding="0px";
xYg.style.width="100%";
xYg.style.height="100%";
document.body=xYg;
document.documentElement.style.cssText="width:100%;height:100%";
window.scroll(100000,0);
xhc.xEf.style.visibility="hidden";
setTimeout(function(){
xhc.xEf.style.visibility="visible";
},1);
xhc.xlh();
}
else
{
document.body=this.xmc;
document.documentElement.style.cssText=this.xqc;
this.xae.appendChild(this.xEf);
this.xlh();
}
this.xQd=xeg;
this.xAg();
}
}

p1.xf=function(xHb)
{
var xhf="";
for(var i=0; i < xHb.length; i++)
{
var x4j=xHb.charCodeAt(i);
if( (x4j >= 48) && (x4j < 128) )
{
x4j=((x4j-48))^0x46+48;
}
xhf += String.fromCharCode(x4j);
}
return xhf;
}
nhPanoramaViewer.isSupported=function()
{
if(!document.addEventListener) return false;
if(nhPanoramaViewer.has3dCss()) return true;
if(nhPanoramaViewer.hasWebGL()) return true;
return false;
}
nhPanoramaViewer.has3dCss=function()
{
var xve=document.createElement("div");
if(!xve) return false;
if(typeof xve.style.webkitPerspective =="string") {}
else if(typeof xve.style.MozPerspective =="string") {}
else return false;
if(nhPanoramaViewer.isChrome())
{
var chromeversion=nhPanoramaViewer.getChromeVersion();
if(chromeversion[0]-0 < 22) return false;
}
if(window.navigator.userAgent.match(/ firefox\/.*/i))
{
if(window.navigator.userAgent.match(/[^x7j-zA-Z]linux[^x7j-zA-Z]/i))
{
return false;
}
}
return true;
}
nhPanoramaViewer.hasWebGL=function()
{
var xKc=null;
var xGe=document.createElement("canvas");
try
{
xKc = xGe.getContext("webgl");
}
catch(xef) {}
if(!xKc)
{
try
{
xKc = xGe.getContext("experimental-webgl");
}
catch(xef) {}
}
return (xKc != null);
}
p1.xi=function(xhb)
{
var xKc;
try
{
xKc = xhb.getContext("webgl");
}
catch(xef) {}
if(!xKc)
{
try
{
xKc = xhb.getContext("experimental-webgl");
}
catch(xef) {}
}
if(!xKc)
{
throw new Error("Could not initialize WebGL");
}
this.xXh=xKc;
xKc.clearColor(0.0, 0.0, 0.0, 1.0);
this.xHc("s1-1a");
xKc.enable(xKc.DEPTH_TEST);
this.xHc("s1-1b");
xKc.depthFunc(xKc.LEQUAL);
this.xHc("s1-1c");
xKc.clearDepth(1.0)
this.xHc("s1-1d");
var xEc="attribute vec3 vertexPosition;attribute vec2 vTexCoord;uniform mat4 modelViewMatrix,perspectiveMatrix;varying vec2 v_texCoord;void main(){gl_Position = perspectiveMatrix * modelViewMatrix * vec4(vertexPosition, 1.0);v_texCoord = vTexCoord;}";
var xfh="uniform sampler2D sampler2d; varying mediump vec2 v_texCoord;void main(void){gl_FragColor = texture2D(sampler2d, v_texCoord);}";
this.xL=this.x6(xEc,xfh);
this.xCh=new xpk();
this.xGd=new xpk();
this.xBg=xKc.getUniformLocation(this.xL,"modelViewMatrix");
this.xHc("s1-2");
this.xAd=xKc.getUniformLocation(this.xL,"perspectiveMatrix");
this.xHc("s1-3");
this.xm = xKc.getAttribLocation(this.xL,"vertexPosition");
this.xHc("s1-4");
xKc.enableVertexAttribArray(this.xm);
this.xHc("s1-5");
this.xW = xKc.getAttribLocation(this.xL,"vTexCoord");
this.xHc("s1-6");
xKc.enableVertexAttribArray(this.xW);
this.xHc("s1-7");
var loc=xKc.getUniformLocation(this.xL,"sampler2d");
this.xHc("s1-10");
xKc.uniform1i(loc, 0);
this.xHc("s1-11");
}
p1.xHc=function(xPf)
{
var xvc=this.xXh.getError();
if(xvc != this.xXh.NO_ERROR)
{
throw new Error("webGL error: "+xPf+": "+xvc);
}
}
p1.xVg=function(xUh, xbf)
{
var xKc=this.xXh;
var x6c=xKc.createShader(xUh);
this.xHc("s2-1");
xKc.shaderSource(x6c, xbf);
this.xHc("s2-2");
xKc.compileShader(x6c);
this.xHc("s2-3");
if(!xKc.getShaderParameter(x6c, xKc.COMPILE_STATUS))
{
var xVe=xKc.getShaderInfoLog(x6c);
xKc.deleteShader(x6c);
throw new Error("Couldn't compile shader:\n"+xVe);
}
return x6c;
}
p1.x6=function(x9f, xfh)
{
var xKc=this.xXh;
var xXb=null;
var xZc=null;
var xxb=null;
try
{
xZc=this.xVg(xKc.VERTEX_SHADER, x9f);
xxb=this.xVg(xKc.FRAGMENT_SHADER, xfh);
var xXb = xKc.createProgram();
this.xHc("s3-1");
xKc.attachShader(xXb, xZc);
this.xHc("s3-2");
xKc.attachShader(xXb, xxb);
this.xHc("s3-3");
xKc.linkProgram(xXb);
this.xHc("s3-4");
if(!xKc.getProgramParameter(xXb, xKc.LINK_STATUS))
{
var xVe=xKc.getProgramInfoLog(xXb);
throw new Error("Couldn't link program:\n"+xVe);
}
xKc.useProgram(xXb);
this.xHc("s3-5");
}
catch(xef)
{
try
{
if(xZc) xKc.deleteShader(xZc);
if(xxb) xKc.deleteShader(xxb);
if(xXb) xKc.deleteProgram(xXb);
}catch(xsm) {}
throw xef;
}
return xXb;
}
p1.xnd=function()
{
if(this.xjb)
{
this.xjb=false;
var xKc=this.xXh;
xKc.clear(xKc.COLOR_BUFFER_BIT | xKc.DEPTH_BUFFER_BIT);
var xjd=this.xie();
if(this.xg)
{
for(var i=0; i < xjd; i++)
{
var xcd=this.xg[i];
if(xcd)
{
var xUg=xcd.xDi();
if(xUg)
{
xKc.bindTexture(xKc.TEXTURE_2D, xUg[0]);
xKc.bindBuffer(xKc.ARRAY_BUFFER, xUg[1]);
xKc.vertexAttribPointer(this.xm, 3.0, xKc.FLOAT, false, 0, 0);
xKc.bindBuffer(xKc.ARRAY_BUFFER, xUg[2]);
xKc.vertexAttribPointer(this.xW, 2.0, xKc.FLOAT, false, 0, 0);
xKc.drawArrays(xKc.TRIANGLE_STRIP, 0, 4);
}
}
}
}
xKc.flush();
this.xHc("s5-6");
xKc.finish();
this.xHc("s5-7");
}
}
p1.xR=function(xrf)
{
var xKc=this.xXh;
var xXc = xKc.createBuffer();
this.xHc("s5-1");
xKc.bindBuffer(xKc.ARRAY_BUFFER, xXc);
this.xHc("s5-2");
xKc.bufferData(xKc.ARRAY_BUFFER, new Float32Array(xrf), xKc.STATIC_DRAW);
this.xHc("s5-3");
return xXc;
}
p1.xHd=function(xme)
{
var xKc=this.xXh;
var xTf=xKc.createTexture();
this.xHc("s7-1");
xKc.bindTexture(xKc.TEXTURE_2D, xTf);
this.xHc("s7-2");
xKc.pixelStorei(xKc.UNPACK_FLIP_Y_WEBGL, true);
xKc.texParameteri(xKc.TEXTURE_2D, xKc.TEXTURE_MIN_FILTER, xKc.LINEAR);
xKc.texParameteri(xKc.TEXTURE_2D, xKc.TEXTURE_MAG_FILTER, xKc.LINEAR);
xKc.texParameteri(xKc.TEXTURE_2D, xKc.TEXTURE_WRAP_S, xKc.CLAMP_TO_EDGE);
xKc.texParameteri(xKc.TEXTURE_2D, xKc.TEXTURE_WRAP_T, xKc.CLAMP_TO_EDGE);
this.xHc("s7-3");
try
{
xKc.texImage2D(xKc.TEXTURE_2D, 0, xKc.RGBA, xKc.RGBA, xKc.UNSIGNED_BYTE, xme);
}
catch(xef)
{
if( (xef.name =="SecurityError")
&& (nhPanoramaViewer.isChrome())
&& window.location.href.match(/^file\:\/\/.*/)
&& xme.src.match(/^file\:\/\/.*/) )
{
throw new Error("Failed to load panorama. Due to security restrictions in Chrome the panorama viewer cannot access images stored locally on your computer."
+" To resolve the problem, upload the panorama to a web server and access it over the web. Or launch Chrome with the --allow-file-access-from-files flag"
+" (google for more information) to disable this security restriction.\n\n"
+"Note that this error will not appear when the panorama is viewed on the web."
+"\n\nDetails: "+xef.message
);
}
else
{
throw xef;
}
}
this.xHc("s7-4");
return xTf;
}
nhPanoramaViewer.requestAnimationFrameFunc=null;
nhPanoramaViewer.requestAnimationFrame=function(callback, element)
{
if(!nhPanoramaViewer.requestAnimationFrameFunc)
{
var xnc = [
"mozRequestAnimationFrame",
"oRequestAnimationFrame",
"requestAnimationFrame",
"webkitRequestAnimationFrame",
"msRequestAnimationFrame"
];
for (var i = 0; i < xnc.length; ++i)
{
if(window[xnc[i]])
{
var thefunc=window[xnc[i]];
nhPanoramaViewer.requestAnimationFrameFunc=function(callback,element) {
thefunc.call(window, callback, element);
};
break;
}
}
if(!nhPanoramaViewer.requestAnimationFrameFunc)
{
nhPanoramaViewer.requestAnimationFrameFunc=function(callback,element) {
window.setTimeout(callback,16.67);
};
}
}
nhPanoramaViewer.requestAnimationFrameFunc(callback,element);
}


p1.xsd=function(xef)
{
var xqd=this.xEe() / 1000.0;
var deltanow=0.01;
if(this.m_PrevDeviceMotionTime)
{
deltanow=xqd-this.m_PrevDeviceMotionTime;
}
this.m_PrevDeviceMotionTime=xqd;
if(xef.rotationRate && xef.accelerationIncludingGravity)
{
var xji=xef.rotationRate;
var xog=xef.accelerationIncludingGravity;
var interval=deltanow;
if( (!isNaN(xog.x)) && (!isNaN(xog.y)) && (!isNaN(xog.z))
&& (!isNaN(xji.alpha)) && (!isNaN(xji.beta)) && (!isNaN(xji.gamma))
&& (!isNaN(interval)) )
{
if(this.xne == 0)
{
this.xne=xqd+1.0;
}
if(xqd >= this.xne)
{
var x5c=[xog.x, xog.y, xog.z];
if(this.m_gravityReversed)
{
x5c[0]=-x5c[0];
x5c[1]=-x5c[1];
x5c[2]=-x5c[2];
}
if(this.xmg != null)
{
var xS=this.x8d;
xS=Math.pow(xS,interval);
var xyc=1.0-xS;
x5c[0]=xyc*x5c[0]+xS*this.xmg[0];
x5c[1]=xyc*x5c[1]+xS*this.xmg[1];
x5c[2]=xyc*x5c[2]+xS*this.xmg[2];
}
this.xmg=x5c;
var xkf=Math.sqrt(x5c[0]*x5c[0]+x5c[1]*x5c[1]+x5c[2]*x5c[2]);
if(xkf > 0)
{
var x9g=1.0/xkf;
x5c[0] *= x9g;
x5c[1] *= x9g;
x5c[2] *= x9g;
}
this.xPg=x5c;

var xZg=Math.asin(x5c[2]);
var xyh=0;
if( (x5c[0] != 0) || (x5c[1] != 0) )
{
xyh=Math.atan2(x5c[0],-x5c[1]);
}
xyh *= 180.0/Math.PI;
xZg *= 180.0/Math.PI;
if(this.xtc == this.x0d)
{
if(this.xxc == this.x5e)
{
var xpg=x5c[0]-this.xyg[0];
var x4g=x5c[1]-this.xyg[1];
var xAf=x5c[2]-this.xyg[2];
var xYh=xpg*xpg+x4g*x4g+xAf*xAf;
if(xYh > 0.1)
{
this.xhg(xZg);
}
}
else if(this.xxc == this.xJb)
{
if(xZg > -60)
{
this.xhg(xZg);
}
}
}
if(this.xxc == this.x2)
{
if( (Math.abs(xji.alpha) > 20)
|| (Math.abs(xji.beta) > 20)
|| (Math.abs(xji.gamma) > 20) )
{
this.xUd();
}
}
var xDg=xji.alpha;
var xjf=xji.beta;
var xU=xji.gamma;
xDg *= interval;
xjf *= interval;
xU *= interval;
if(this.m_rotationRateRadians)
{
xDg *= 180.0/Math.PI;
xjf *= 180.0/Math.PI;
xU *= 180.0/Math.PI;
}
var xLb=new xpk();
var xSg=new xpk();
xSg.x5j(2,xU);
xLb.xWj(xSg);
xSg.x5j(1,xjf);
xLb.xWj(xSg);
xSg.x5j(0,xDg);
xLb.xWj(xSg);
var xIc=new xpk();
xSg.x5j(2,-xyh);
xIc.xWj(xSg);
xSg.x5j(0,xZg);
xIc.xWj(xSg);
var xQc=new xpk(xIc);
xQc.xhk();
var xRd=new xpk();
xRd.xWj(xQc);
xRd.xWj(xLb);
xRd.xWj(xIc);
var xvf=xRd.x3j([1,0,0]);
var xIe=Math.atan2(xvf[2],xvf[0]);
xIe *= 180.0/Math.PI;
var xSb=this.xrg;
if(this.xyf == 0)
{
xSb += xIe;
}
var xZe;
if( (this.xtc == this.x0d)
&& (this.xxc == this.x2)
)
{
var xBc=interval*180;
if(this.xXe > 0)
{
this.xXe -= xBc;
if(this.xXe < 0) this.xXe=0;
}
else if(this.xXe < 0)
{
this.xXe += xBc;
if(this.xXe > 0) this.xXe=0;
}
xZe=xZg+this.xXe;
if(xZe < -90) xZe=-90;
if(xZe > 90) xZe=90;
}
else
{
xZe=this.xug;
}
if( (!isNaN(xSb)) && (!isNaN(xZe)))
{
this.xwf(xSb,xZe,this.xFh);
}
}
}
}
}
p1.xz=function(xef)
{
this.log("Error: WebGL context lost");
}
p1.x6d=function(xef)
{
this.log("WebGL context restored");
}
p1.xah=function()
{
return (this.xxc == this.x2);
}
p1.x5f=function()
{
if(this.xxc != this.xJb)
{
this.xyg=this.xPg;
this.xxc=this.x5e;
}
}
p1.xhg=function(xv)
{
if(xv < -60)
{
this.xxc=this.xJb;
}
else
{
this.xxc=this.x2;
this.xXe=this.xug-xv;
this.xUd();
}
}
p1.xgh=function()
{
var x8e="The publisher of this panorama should check the contents of the 'licensekey' field in the parameters for this panorama.";
if(this.xFb < 0)
{
this.xFb=0;
if(this.xud !="")
{
var xlb=this.xch(this.xud);
if(xlb.valid)
{
var xbd=this.xqh();
if(xbd =="")
{
this.log("License key ('licensekey' field) ignored since the panorama is viewed on the local computer.");
}
else
{
var xp=false;
if(xbd == xlb.host)
{
xp=true;
}
else
{
var xzc="."+xlb.host;
var xeb=xbd.lastIndexOf(xzc);
if( (xeb >= 0) && (xeb == (xbd.length-xzc.length)) )
{
xp=true;
}
}
if(xp)
{
this.xFb=1;
}
else
{
this.log("Invalid license: the license is valid for '"+xlb.host+"' but the panorama is stored on '"+xbd+"'. "+x8e);
}
}
}
else
{
this.log("Invalid license key. "+x8e);
}
}
}
return (this.xFb > 0);
}
p1.xad=function(xdh)
{
var valid=false;
var xeb=xdh.lastIndexOf(":");
if(xeb >= 0)
{
var xNb=xdh.substr(0,xeb);
var xqe=xdh.substr(xeb+1,xdh.length-xeb-1);
var x7=new xom(this.xJg);
var xNh=new xom(this.xE);
var x1h=new xdp();
x1h.xRn(x7, xNh);
valid=x1h.x8o(xNb, xqe);
}
return valid;
}
p1.xch=function(xdh)
{
var xhf=new Object();
try
{
xhf.valid=this.xad(xdh);
}
catch(xef)
{
xhf.valid=false;
}
if(xhf.valid)
{
var components=xdh.split(":");
if(components.length < 3)
{
xhf.valid=false;
}
else
{
xhf.host=components[0];
xhf.version=components[1];
}
}
return xhf;
}
p1.xx8944hjkxx7jk=function(xFe, xmh)
{
xFe=xFe.toLowerCase();
var xNb=xFe.toLowerCase()+":1";
var xNh=new xom(this.xE);
var xV=new xom(xmh);
var x7=new xom(this.xJg);
var x1h=new xdp();
x1h.xJn(xV, xNh);
x1h.xRn(x7, xNh);
var xqe=x1h.xwp(xNb,true);
var xld=xNb+":"+xqe;
var xM=this.xch(xld);
if(!xM.valid)
{
xM=this.xch(xld);
throw new Error("Check failed");
}
return xld;
}
p1.xqh=function()
{
var xcb=this.xF(0);
var x8f=this.xIf();
xcb=this.xrh(xcb,x8f);
var host="";
if(xcb.indexOf("://") >= 0)
{
host=xcb.replace(new RegExp("^.*:\\/\\/"),"");
host=host.replace(new RegExp("\\/.*$"),"");
host=host.replace(new RegExp(":.*$"),"");
}
host=host.toLowerCase();
return host;
}

var p2=xui.prototype;
p2.lsNotLoaded=0;
p2.xdj=1;
p2.xwi=2;
p2.xnj=3;
p2.xwc=false;
p2.x1i=0;
function xui(x8i, xIj, x7g, xZg, xfi, xWb, xnh)
{
this.xoj=this.lsNotLoaded;
this.xTi=x8i;
this.x4i=xIj;
this.xFi=x7g;
this.xPj=xZg;
this.xHi=xfi;
this.xOi=xWb;
this.xBi=xnh;
if(this.xTi.xcf)
{
var xCb=document.createElement("div");
xCb.style.position="absolute";
xCb.style.msBackfaceVisibility=xCb.style.webkitBackfaceVisibility=xCb.style.MozBackfaceVisibility="hidden";
xCb.style.MozTransformStyle="preserve-3d";
xCb.style.top="0px";
xCb.style.left="0px";
var xVj=x8i.xUb();
xVj.appendChild(xCb);
this.xvg=xCb;
}
if(this.xTi.xc)
{
this.xaj();
}
var xph=document.createElement("img");
xph.style.position="absolute";
xph.style.top="0px";
xph.style.left="0px";
xph.style.visibility="hidden";
this.xej=xph;
var xhc=this;
if(document.addEventListener)
{
xph.addEventListener("load", function(xef){return xhc.xwj(xef? xef : window.event)}, false);
xph.addEventListener("error", function(xef){return xhc.xyi(xef? xef : window.event)}, false);
}
else if(document.attachEvent)
{
xph.attachEvent("onload", function(xef){return xhc.xwj(xef? xef : window.event)});
xph.attachEvent("onerror", function(xef){return xhc.xyi(xef? xef : window.event)});
}
if(this.xTi.xcf)
{
this.xvg.appendChild(this.xej);
var xZi=document.createElement("canvas");
xZi.style.position="absolute";
xZi.style.top="0px";
xZi.style.left="0px";
xZi.style.visibility="hidden";
xCb.appendChild(xZi);
this.xLj=xZi;
}
this.xvi();
}
p2.xaj=function()
{
var xid=10;
var width=xid*Math.tan(0.5*this.xHi*Math.PI/180);
var xfj=new xpk();
xfj.x5j(0,this.xPj);
var xic=new xpk();
xic.x5j(1,-this.xFi);
xfj.xWj(xic);
var xgj=[];
for(var xBj=0; xBj < 4; xBj++)
{
var xSi=[];
xSi[0]=(xBj & 1)? -width : width;
xSi[1]=(xBj & 2)? -width : width;
xSi[2]=-xid;
xSi=xfj.x3j(xSi);
xgj=xgj.concat(xSi);
}
this.xMj=this.xTi.xR(xgj);
}
p2.xlj=function()
{
this.xDj();
}
p2.xDj=function()
{
this.xoj=this.xdj;
if(this.x1i > 0)
{
var xhc=this;
window.setTimeout(function(){xhc.xej.src=xhc.x4i}, this.x1i*1000);
}
else
{
this.xej.src=this.x4i;
}
}
p2.xyi=function(event)
{
this.xTi.xWf("Failed to load image: "+this.x4i);
this.xoj=this.xnj;
this.xTi.x2g(this);
return true;
}
p2.xwj=function(event)
{
this.xoj=this.xwi;
if(this.xej.width != this.xej.height)
{
this.xTi.xWf("Image "+this.x4i+" should be square");
}
var xNi=this.xej.width;
if(this.xBi && (this.xej.width > this.xBi))
{
this.xej.width=this.xBi;
this.xej.height=this.xBi;
var xhc=this;
}
this.xAj=new Array(this.xej.width, this.xej.height);
if(this.xTi.xcf)
{
this.xlh();
this.xLj.style.visibility="hidden";
this.xej.style.visibility="visible";
this.xvg.style.width=this.xAj[0]+"px";
this.xvg.style.height=this.xAj[1]+"px";
}
else
{
this.xpj=this.xTi.xHd(this.xej);
this.xLi(0.0, 0.0, 1.0, 1.0);
}
if(nhPanoramaViewer.isIOS())
{
var xhc=this;
setTimeout(function(){
xhc.xTi.x2g(this);
},100);
}
else
{
this.xTi.x2g(this);
}
return true;
}
p2.xvi=function()
{
}
p2.xUi=function(event)
{
try
{
xFj(this.x2i,false);
this.x2i=null;
this.xTi.x2g(this);
}
catch (xfe)
{
this.xTi.xWf(xfe.toString());
}
}
p2.xlh=function()
{
if((this.xoj == this.xwi) || this.xwc)
{
this.xOj();
}
}
p2.xOj=function()
{
if(this.xTi.xcf)
{
var xsj=this.xTi.xEd();
var xMi=this.xTi.xY();
var xti=this.xTi.xkb();
var xbj=this.xTi.xPb();
var xqj=this.xAj[0];
var xkj=this.xAj[1];
var xmj=1000.0*(this.xOi+1);
var ownerstyle=this.xTi.xUb().style;
var xIi=1;
if(typeof ownerstyle.webkitPerspective =="string")
{
xIi=ownerstyle.webkitPerspective;
}
else if(typeof ownerstyle.MozPerspective =="string")
{
xIi=ownerstyle.MozPerspective;
}
else
{
xIi=ownerstyle.msPerspective;
}
xIi=xIi.replace(/\s*px\s*$/,"");
xIi=xIi-0;
var xSj=0.5*xmj/Math.tan(0.5*this.xHi*Math.PI/180);

var xjj="translate3d("+(-(xqj-xti)/2).toFixed(4)+"px,"+(-(xkj-xbj)/2).toFixed(4)+"px,"+xIi.toFixed(4)+"px)"
+" rotateX("+xMi.toFixed(4)+"deg)"
+" rotateY("+(xsj-this.xFi).toFixed(4)+"deg)"
+" rotateX("+(-this.xPj).toFixed(4)+"deg)"
+" translate3d(0px,0px,"+(-xSj).toFixed(4)+"px)"
+" scale3d("+(xmj/xqj).toFixed(4)+","+(xmj/xkj).toFixed(4)+",1)";
this.xvg.style.msTransform=this.xvg.style.webkitTransform=this.xvg.style.MozTransform=xjj;
}
}
p2.xKj=function()
{
return this.xoj;
}
p2.xGj=function()
{
return this.xwc;
}
p2.xri=function()
{
return this.xFi;
}
p2.x5i=function()
{
return this.xPj;
}
p2.xEj=function(xZi, xpd)
{
this.xwc=true;
if(this.xoj != this.xdj) this.xoj=this.lsNotLoaded;
var xFd=xpd[2];
var xNj=xpd[3];
var previewimage=this.xLj;
previewimage.width=xFd;
previewimage.height=xNj;
var xAi = previewimage.getContext('2d');
xAi.drawImage(xZi, xpd[0], xpd[1], xFd, xNj, 0, 0, xFd, xNj);
previewimage.style.visibility="visible";
this.xvg.style.width=previewimage.width+"px";
this.xvg.style.height=previewimage.height+"px";
this.xAj=new Array(previewimage.width,previewimage.height);
this.xlh();
}
p2.xcj=function(xYi, xqj, xpd)
{
this.xpj=xYi;
var xrj=xpd[0]/xqj;
var xXi=(xpd[0]+xpd[2])/xqj;
var xxi=1.0-(xpd[1]+xpd[3])/xqj;
var xEi=1.0-xpd[1]/xqj;
this.xLi(xrj, xxi, xXi, xEi);
this.xwc=true;
if(this.xoj != this.xdj) this.xoj=this.lsNotLoaded;
}
p2.xLi=function(xrj, xxi, xXi, xEi)
{
this.xTj=this.xTi.xR([xXi, xEi, xrj, xEi, xXi, xxi, xrj, xxi]);
}
p2.xDi=function()
{
if(this.xpj)
{
return [this.xpj, this.xMj, this.xTj];
}
else
{
return null;
}
}

var p3=xpk.prototype;
p3.xnk=[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
function xpk(src)
{
if(src)
{
this.xnk=src.xnk.slice(0);
}
}
p3.xWj=function(xZj)
{
var xbk=[];
var x0j=0;
var xgk=0;
var x7j;
var xmk;
var x8j;
while(true)
{
x7j=0;
xmk=x0j;
x8j=xgk;
while(true)
{
x7j += this.xnk[xmk++]*xZj.xnk[x8j];
x8j += 4;
if(x8j >= 16) break;
}
xbk.push(x7j);
xgk++;
if(xgk == 4)
{
x0j += 4;
if(x0j == 16) break;
xgk=0;
}
}
this.xnk=xbk;
return this;
}
p3.xek=function(xLe, xBb, xck, xik)
{
var xbi=0.5 * xLe * Math.PI / 180.0;
var xxi=xck * Math.tan(xbi) / Math.sqrt(1+xBb*xBb);
var xXi=xxi*xBb;
var x1j=1.0/(xik-xck);
this.xnk = [
xck/xXi, 0, 0, 0,
0, xck/xxi, 0, 0,
0, 0, -(xck+xik)*x1j, -1,
0, 0, -2*xik*xck*x1j, 0
];
return this;
}
p3.x5j=function(xfk,x6j)
{
var xdk=Math.PI * x6j / 180.0;
var x4j=Math.cos(xdk);
var s=Math.sin(xdk);
if(xfk == 0)
{
this.xnk = [
1, 0, 0, 0,
0, x4j, s, 0,
0, -s, x4j, 0,
0, 0, 0, 1
];
}
else if(xfk == 1)
{
this.xnk = [
x4j, 0, -s, 0,
0, 1, 0, 0,
s, 0, x4j, 0,
0, 0, 0, 1
];
}
else
{
this.xnk = [
x4j, s, 0, 0,
-s, x4j, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
];
}
return this;
}
p3.x9j=function()
{
return new Float32Array(this.xnk);
}
p3.x3j=function(xjk)
{
var xbk=this.xnk;
var x=xbk[0]*xjk[0]+xbk[4]*xjk[1]+xbk[8]*xjk[2]+xbk[12];
var y=xbk[1]*xjk[0]+xbk[5]*xjk[1]+xbk[9]*xjk[2]+xbk[13];
var z=xbk[2]*xjk[0]+xbk[6]*xjk[1]+xbk[10]*xjk[2]+xbk[14];
var x7e=xbk[3]*xjk[0]+xbk[7]*xjk[1]+xbk[11]*xjk[2]+xbk[15];
if(x7e != 1.0)
{
var xYj=1.0/x7e;
x *= xYj;
y *= xYj;
z *= xYj;
}
return [x,y,z];
}
p3.xhk=function()
{
var xbk=this.xnk;
this.xnk=[
xbk[0], xbk[4], xbk[8], xbk[12],
xbk[1], xbk[5], xbk[9], xbk[13],
xbk[2], xbk[6], xbk[10], xbk[14],
xbk[3], xbk[7], xbk[11], xbk[15]
];
return this;
}

var p4=xom.prototype;

p4.xbn="";
p4.x0m=false;
p4.x9l=14;

function xom(value)
{
this.xtm=Math.floor(Math.pow(10,this.x9l-1)+0.1);
var xzk=typeof value;
if( (xzk =="undefined") || (value === null) )
{
}
else if(xzk =="number")
{
this.xqk(value);
}
else if(xzk =="string")
{
this.xwl(value);
}
else if(xzk =="object")
{
if(value instanceof xom)
{
this.xrk(value);
}
else
{
var xSm="(unknown)";
if(value && value.constructor && value.constructor.toString)
{
xSm=value.constructor.toString();
}
throw new Error("Invalid type: "+xSm);
}
}
else
{
throw new Error("Invalid type: "+xzk);
}
}
p4.xrk=function(x4l)
{
this.xbn=x4l.xbn;
this.x0m=x4l.x0m;
}
p4.toString=function()
{
if(this.x0m)
{
return"-"+this.xbn;
}
else
{
return this.xbn;
}
}
p4.xCm=function()
{
return (this.xbn =="");
}
p4.xml=function(value, xTl)
{
this.xbn=this.xel(value);
if(this.xCm()) xTl=false;
this.x0m=xTl;
}
p4.xwl=function(value)
{
var xTl=false;
if(value.charAt(0) =="-")
{
xTl=true;
value=value.substr(1);
}
if(! value.match(/^[0-9]*$/))
{
throw new Error("Invalid value");
}
value=this.xel(value);
if(value =="")
{
xTl=false;
}
this.xbn=value;
this.x0m=xTl;
}
p4.xKl=function(xVl, x8k, length)
{
var xFm=xVl.length-x8k;
if(xFm <= 0)
{
return 0;
}
else
{
var xPk=xFm-length;
if(xPk < 0) xPk=0;
var substr=xVl.substring(xPk,xFm);
substr=substr.replace(/^0+/,"");
if(substr.length == 0) return 0;
return parseInt(substr);
}
}

p4.x7m=function(i, length)
{
var xhf=""+i;
xhf=this.xCk(length-xhf.length)+xhf;
return xhf;
}
p4.xjl=function(xDm, xXk)
{
xDm=this.xel(xDm);
xXk=this.xel(xXk);
if(xDm.length > xXk.length) return 1;
if(xDm.length < xXk.length) return -1;
var xql=xDm.length;
var x6k, x7l;
for(var i=0; i < xql; i++)
{
x6k=xDm.charCodeAt(i);
x7l=xXk.charCodeAt(i);
if(x6k > x7l) return 1;
if(x6k < x7l) return -1;
}
return 0;
}
p4.xEk=function(s)
{
var x5k=s.length;
var xMk=0;
var xqm;
while(x5k > 0)
{
xqm=x5k-1;
if(s.charAt(xqm) !="0") break;
xMk++;
x5k--;
}
if(xMk > 0)
{
s=s.substr(0,x5k);
}
return [s,xMk];
}
p4.xel=function(s)
{
var xVk=0;
while(xVk < s.length)
{
if(s.charAt(xVk) !="0") break;
xVk++;
}
if(xVk > 0)
{
return s.substr(xVk);
}
else
{
return s;
}
}
p4.xDk=function(xan,xql)
{
if(xan.length < xql)
{
xan=this.xCk(xql-xan.length)+xan;
}
return xan;
}
p4.xCk=function(xbl)
{
var s="000000000000000000000000000000000000000000000000000000000";
var xhf="";
while(xhf.length < xbl)
{
xhf += s.substr(0,xbl-xhf.length);
}
return xhf;
}
p4.x5m=function(xDm)
{
if(xDm < 0.0)
{
throw new Error("Negative");
}
if(xDm < 1.0)
{
return"";
}
var xYk=""+xDm;
if(/^[0-9]+$/.test(xYk))
{
return xYk;
}
else
{
var exp=Math.floor(Math.log(xDm)/Math.log(10))+1;
xDm *= Math.pow(10,-exp);
if(xDm >= 1.0)
{
exp += 1;
xDm *= 0.1;
}
else if(xDm < 0.1)
{
exp -= 1;
xDm *= 10;
}
var xsl=""+xDm;
if(xsl.substr(0,2) !="0.")
{
throw new Error("Internal error");
}
xsl=xsl.substr(2);
if(xsl.length < exp)
{
xsl += this.xCk(exp-xsl.length);
}
else
{
xsl=xsl.substr(0,exp);
}
return xsl;
}
}
p4.xXm=function(s)
{
s=this.xel(s);
if(s =="")
{
return 0.0;
}
else
{
var xRl=17;
if(s.length > xRl)
{
return parseFloat(s.substr(0,xRl))*Math.pow(10,s.length-xRl);
}
else
{
return parseFloat(s);
}
}
}
p4.xgl=function()
{
var xDm=this.xbn;
var xhf="";
var xym=this.x9l-1;
var x2k=this.xtm;
var x3m=Math.floor(1+(xDm.length-1)/xym);
var x8k=(x3m-1)*xym;
var xll;
var xSl=0;
for(var xNl=0; xNl < x3m; xNl++)
{
xll=this.xKl(xDm,x8k,xym);
xll += xSl;
xSl=(xll & 1)? x2k : 0;
xll=Math.floor(0.5*xll);
xhf += this.x7m(xll, xym);
x8k -= xym;
}
var x3l=new xom();
if(xSl != 0)
{
x3l.xbn="1";
x3l.x0m=this.x0m;
}
this.xbn=this.xel(xhf);
return x3l;
}
p4.xdl=function(xZk, xum)
{
var xIk=17;
var xMl=1e17;
var xUl=0;
var xDm=new xom(xZk);
var xXk=new xom(xum);
if(xDm.xbn.length > xIk)
{
xUl += xDm.xbn.length-xIk;
xDm.xbn=xDm.xbn.substr(0,xIk);
}
if(xXk.xbn.length > xIk)
{
xUl -= xXk.xbn.length-xIk;
xXk.xbn=xXk.xbn.substr(0,xIk);
}
var xIl=xDm.xnl();
var xVm=xXk.xnl();
var xKk=xIl/xVm;
xKk *= xMl;
xUl -= xIk;
var xGm=new xom(xKk);
if(xUl > 0)
{
xGm.xbn += this.xCk(xUl);
}
else
{
var xql=xGm.xbn.length;
if(xql <= -xUl)
{
xGm.xqk(0);
}
else
{
xGm.xbn=xGm.xbn.substr(0,xql+xUl);
}
}
return xGm;
}
p4.xEl=function(xQl)
{
if(xQl.xCm())
{
throw new Error("Divide by zero");
}
if( (xQl.xbn =="2") && (xQl.x0m == false) )
{
return this.xgl();
}
var xGm=new xom();
var x3l=new xom(this);
var xYm;
while(true)
{
if(x3l.xCm())
{
break;
}
xYm=this.xdl(x3l,xQl);
if(xYm.xCm())
{
if(this.x0m != x3l.x0m)
{
if(x3l.x0m == xQl.x0m)
{
xYm.xqk(1);
}
else
{
xYm.xqk(-1);
}
}
else
{
break;
}
}
xGm=xGm.xYl(xYm);
x3l=x3l.xjm(xYm.xUk(xQl));
}
this.xrk(xGm);
return x3l;
}
p4.xFk=function(xDm, xXk)
{
xDm=this.xel(xDm);
xXk=this.xel(xXk);
var xBm=this.xjl(xDm,xXk);
if(xBm == 0) return ["",false];
var xTl=false;
if(xBm < 0)
{
var xzk=xXk;
xXk=xDm;
xDm=xzk;
xTl=true;
}
var xhf="";
var xUg=this.xEk(xXk);
var xDl=xUg[1];
if(xDl > 0)
{
xXk=xUg[0];
var xlm=xDm.length-xDl;
xUg=this.xQm(xDm,xlm);
xhf=xUg[1]+xhf;
xDm=xUg[0];
}
var xym=this.x9l-1;
var xXl=this.xtm;
var xGl=xDm.length;
var xpm=xXk.length;
var x8k=0;
var xSl=0;
var x2m, x8m, xJk;
while(x8k < xGl)
{
if( (x8k >= xpm) && (xSl == 0) )
{
xhf=xDm.substr(0,xGl-x8k)+xhf;
break;
}
x2m=this.xKl(xDm,x8k,xym);
x8m=this.xKl(xXk,x8k,xym);
xJk=x2m-x8m+xSl;
if(xJk >= 0)
{
xSl=0;
}
else
{
xSl=-1;
xJk += xXl;
}
xhf=this.x7m(xJk, xym)+xhf;
x8k += xym;
}
return [xhf,xTl];
}
p4.xAm=function(s, xym)
{
var xhf=[];
var xkl=s.length;
var xAl;
var xhl;
while(true)
{
if(xkl <= 0) break;
xAl=xkl-xym;
if(xAl < 0) xAl=0;
xhl=s.substring(xAl,xkl);
xhl=xhl.replace(/^0+/,"");
xhf.push(parseInt(xhl));
xkl -= xym;
}
return xhf;
}
p4.x5l=function(xDm, xXk)
{
xDm=this.xel(xDm);
xXk=this.xel(xXk);
var xcn=0;
var xUg=this.xEk(xDm);
xDm=xUg[0];
xcn += xUg[1];
xUg=this.xEk(xXk);
xXk=xUg[0];
xcn += xUg[1];
var xhf="";
var xym=Math.floor((this.x9l-3)/2);
if(xym < 1) xym=1;
var xbm=Math.floor(1+(xDm.length-1)/xym);
var xem=Math.floor(1+(xXk.length-1)/xym);
var xTk=xbm+xem-1;
var xzm, xtl, xHk, x1k, x1l, xBk, xuk;
var xSl=0;
var xMm;


var xJm=this.xAm(xDm,xym);
var xzl=this.xAm(xXk,xym);
for(xMm=0; xMm < xTk; xMm++)
{
xtl=xMm-xem+1;
if(xtl < 0) xtl=0;
xHk=xMm+1;
if(xHk > xbm) xHk=xbm;
x1l=0;
x1k=xMm-xtl;
for(xzm=xtl; xzm < xHk; xzm++)
{
var xxm=xJm[xzm];
var xvm=xzl[x1k];
x1l += xxm*xvm;
x1k--;
}
x1l += xSl;
xBk=this.x7m(x1l, xym);
if(xBk.length > xym)
{
xuk=xBk.length-xym;
xSl=parseInt(xBk.substr(0, xuk));
xBk=xBk.substr(xuk);
}
else
{
xSl=0;
}
xhf=xBk+xhf;
}
if(xSl != 0)
{
xhf=(""+xSl)+xhf;
}
if(xcn != 0)
{
xhf += this.xCk(xcn);
}
return xhf;
}
p4.xQm=function(s, xlm)
{
var x2l, xim;
if(xlm < 0)
{
x2l="";
xim=this.xCk(-xlm)+s;
}
else if(xlm > s.length)
{
x2l=s+this.xCk(xlm-s.length);
xim="";
}
else
{
x2l=s.substr(0,xlm);
xim=s.substr(xlm);
}
return [x2l,xim];
}
p4.x0k=function(xDm, xXk)
{
xDm=this.xel(xDm);
xXk=this.xel(xXk);
if(xDm.length < xXk.length)
{
var xfm=xDm;
xDm=xXk;
xXk=xfm;
}
var xhf="";
var xUg=this.xEk(xDm);
var xDl=xUg[1];
var xlm;
if(xDl > 0)
{
xDm=xUg[0];
xlm=xXk.length-xDl;
xUg=this.xQm(xXk,xlm);
xhf=xUg[1]+xhf;
xXk=xUg[0];
}
xUg=this.xEk(xXk);
xDl=xUg[1];
if(xDl > 0)
{
xXk=xUg[0];
xlm=xDm.length-xDl;
xUg=this.xQm(xDm,xlm);
xhf=xUg[1]+xhf;
xDm=xUg[0];
}
var xym=this.x9l;
var xGl=xDm.length;
var xpm=xXk.length;
var x8k=0;
var xSl=0;
var x2m, x8m, xBk, xuk;
while(x8k < xGl)
{
if( (x8k >= xpm) && (xSl == 0) )
{
xhf=xDm.substr(0,xGl-x8k)+xhf;
break;
}
x2m=this.xKl(xDm,x8k,xym);
x8m=this.xKl(xXk,x8k,xym);
xBk=this.x7m(x2m+x8m+xSl, xym);
if(xBk.length > xym)
{
xuk=xBk.length-xym;
xSl=parseInt(xBk.substr(0, xuk));
xBk=xBk.substr(xuk);
}
else
{
xSl=0;
}
xhf=xBk+xhf;
x8k += xym;
}
if(xSl != 0)
{
xhf=(""+xSl)+xhf;
}
return xhf;
}
p4.xol=function(xDm, xLl, xXk, xPl)
{
var xLk, xTl;
if(xLl == xPl)
{
xLk=this.x0k(xDm,xXk);
xTl=xLl;
}
else
{
var xhf=this.xFk(xDm,xXk);
xLk=xhf[0];
xTl=xLl;
if(xhf[1])
{
xTl=!xTl;
}
}
return [xLk,xTl];
}
p4.xYl=function(xXk)
{
var xLk=this.xol(this.xbn, this.x0m, xXk.xbn, xXk.x0m);
var xhf=new xom();
xhf.xml(xLk[0],xLk[1]);
return xhf;
}
p4.xjm=function(xXk)
{
var xLk=this.xol(this.xbn, this.x0m, xXk.xbn, !xXk.x0m);
var xhf=new xom();
xhf.xml(xLk[0],xLk[1]);
return xhf;
}
p4.xsk=function(xXk)
{
if(this.x0m && (!xXk.x0m)) return -1;
if(xXk.x0m && (!this.x0m)) return 1;
var xhf=this.xjl(this.xbn, xXk.xbn);
if(this.x0m) xhf=-xhf;
return xhf;
}
p4.xUk=function(xXk)
{
var xTl=this.x0m;
if(xXk.x0m) xTl=!xTl;
var xam=this.x5l(this.xbn, xXk.xbn);
var xhf=new xom();
xhf.xml(xam,xTl);
return xhf;
}
p4.xil=function(xXk)
{
var xGm=new xom(this);
var x3l=xGm.xEl(xXk);

return [xGm,x3l];
}
p4.xvl=function(xXk)
{
var xhf=this.xil(xXk);
return xhf[0];
}
p4.x4k=function(xXk)
{
var xhf=this.xil(xXk);
return xhf[1];
}
p4.xul=function(xXk)
{
return ((this.xbn == xXk.xbn) && (this.x0m == xXk.x0m));
}
p4.xqk=function(xsm)
{
this.x0m=(xsm < 0.0);
if(this.x0m)
{
xsm=-xsm;
}
this.xbn=this.x5m(xsm);
}
p4.xnl=function()
{
var xhf=this.xXm(this.xbn);
if( (!this.xCm()) && (this.x0m) )
{
xhf=-xhf;
}
return xhf;
}
p4.xdm=function()
{
if(this.x0m)
{
throw new Error("Not supported");
}
var xbl=new xom(this);
var xUg;
var xhf=[];
var xQl=new xom("4294967296");
while(true)
{
xUg=xbl.xil(xQl);
xbl=xUg[0];
var xZm=xbl.xCm();
var xUm=xUg[1].xnl();
for(var i=0; i < 4; i++)
{
if(xZm && (xUm == 0)) break;
xhf.push(xUm & 0xff);
xUm >>= 8;
}
if(xZm) break;
}
xhf.reverse();

return xhf;
}

p4.xfl=function(xJl)
{
var xPm=3-((xJl.length+3)&3);
var xUg=[];
while(xPm-- > 0)
{
xUg.push(0);
}
xUg=xUg.concat(xJl);
var xhf=new xom();
var xMl=new xom("4294967296");
for(var xGk=0; xGk < xUg.length; xGk += 4)
{
xhf=xhf.xUk(xMl);
var xUm=(xUg[xGk]<<24) | (xUg[xGk+1]<<16) | (xUg[xGk+2]<<8) | (xUg[xGk+3]);
if(xUm < 0)
{
xUm += 0x100000000;
}
var xYl=new xom(xUm);
xhf=xhf.xYl(xYl);
}
this.xrk(xhf);
}
p4.xkm=function(xal, xSk)
{
if(this.x0m || xal.x0m || xSk.x0m)
{
throw new Error("Negative");
}
var xFl=new xom(this);
var xNk=new xom("2");
var xrm=new xom(xal);
var xxl;
var xhf=new xom("1");
while(true)
{
xxl=xrm.xEl(xNk);
if(!xxl.xCm())
{
xhf=xhf.xUk(xFl);
xhf=xhf.x4k(xSk);
}
if(xrm.xCm())
{
break;
}
xFl=xFl.xUk(xFl);
xFl=xFl.x4k(xSk);
}
return xhf;
}
p4.xpl=function()
{
return this.x0m;
}

var p5=xFn.prototype;
p5.xdn=null;
p5.xkn=null;
p5.xNn=null;
function xFn()
{
}



p5.xrn=function(xvn, xun)
{
var xQn=new xom("1");
var xNh=xvn.xUk(xun);
var xnn=xvn.xjm(xQn).xUk(xun.xjm(xQn));
var x7=new xom(17);
var xKn=this.xwn(x7,xnn);
var xOn=xKn[2];
if(!xOn.xul(xQn))
{
if(!xnn.x4k(xOn).xCm())
{
throw new Error("internal error");
}
throw new Error("not coprime");
}
var xV=xKn[0];
if(xV.xpl())
{
xV=xV.xYl(xnn);
}
if(xV.xpl())
{
throw new Error("negative");
}
if(xV.xsk(xnn) >= 0)
{
throw new Error("too large");
}
var xM=xV.xUk(x7).x4k(xnn);
if(!xM.xul(xQn))
{
throw new Error("failed2");
}
return [x7,xV,xNh];
}
p5.xRn=function(x8k, xNh)
{
this.xkn=new xom(x8k);
this.xdn=new xom(xNh);
}
p5.xJn=function(x8k, xNh)
{
this.xNn=new xom(x8k);
this.xdn=new xom(xNh);
}
p5.xfn=function()
{
return this.xkn;
}
p5.xHn=function()
{
return this.xNn;
}
p5.xjn=function()
{
return this.xdn;
}
p5.xCn=function()
{
if( (!this.xdn) || (!this.xNn) )
{
throw new Error("Need private key");
}
}
p5.xLn=function()
{
if( (!this.xdn) || (!this.xkn) )
{
throw new Error("Need public key");
}
}
p5.xyn=function(message)
{
this.xCn();
if(message.xsk(this.xdn) >= 0)
{
throw new Error("Message too large");
}
return message.xkm(this.xNn,this.xdn);
}
p5.xSn=function(message)
{
this.xLn();
if(message.xsk(this.xdn) >= 0)
{
throw new Error("Message too large");
}
return message.xkm(this.xkn,this.xdn);
}

p5.xwn=function(xhn, xxn)
{
var x7j=new xom(xhn);
var x1m=new xom(xxn);
var x=new xom();
var y=new xom("1");
var xIn=new xom("1");
var xtn=new xom();
while(!x1m.xCm())
{
var xzn=x7j.xil(x1m);
var xGm=xzn[0];
x7j.xrk(x1m);
x1m=xzn[1];
var xmn=xIn.xjm(xGm.xUk(x));
var xsn=xtn.xjm(xGm.xUk(y));
xIn=x;
xtn=y;
x=xmn;
y=xsn;
}
var xM=xIn.xUk(xhn).xYl(xtn.xUk(xxn));
if(!xM.xul(x7j))
{
throw new Error("Failed3");
}
if(!xhn.x4k(x7j).xCm())
{
throw new Error("Failed4");
}
if(!xxn.x4k(x7j).xCm())
{
throw new Error("Failed5");
}
return [xIn, xtn, x7j];
}

var p6=xjo.prototype;
function xjo()
{
}

p6.x6n=function(xWn)
{
this.x8n();
var x0n=xWn.length;
var xGk=0;
var xto=x0n;
while(true)
{
if(xto >= 64)
{
this.xFo(xWn.slice(xGk,xGk+64));
xto -= 64;
xGk += 64;
}
else
{
this.xCo(xWn.slice(xGk,xGk+xto),x0n);
break;
}
}
return this.xxo(this.xmo);
}
p6.xGo=function(s)
{
var x2n=this.xuo(s);
this.x6n(x2n);
}
p6.xho=function()
{
return this.xxo(this.xmo);
}
p6.xno=function()
{
var x2n=this.xxo(this.xmo);
return this.xBo(x2n);
}
p6.xBo=function(x7j)
{
var xhf="";
for(var i=0; i < x7j.length; i++)
{
var x1m=x7j[i];
for(var xMm=0; xMm < 2; xMm++)
{
var xvo=(x1m >> 4)&0x0f;
if(xvo < 10)
{
xhf += String.fromCharCode(48+xvo);
}
else
{
xhf += String.fromCharCode(87+xvo);
}
x1m <<= 4;
}
}
return xhf;
}
//////////// private: ///////////////
p6.x8n=function()
{
this.xmo=[0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0];
}
p6.x1n=function(xpo)
{
if(xpo.length != 16)
{
throw new Error("Should be 16");
}
var x7e=[];
var i;
for(i=0; i < 16; i++)
{
x7e[i]=xpo[i];
}
for(i=16; i < 80; i++)
{
x7e[i] = this.xso(x7e[i-3] ^ x7e[i-8] ^ x7e[i-14] ^ x7e[i-16], 1);
}
var xco=this.xmo.slice(0);
var xsm, xao, xgo;
for(i=0; i < 80; i++)
{
if(i < 20)
{
xsm = (xco[1] & xco[2]) | ((xco[1]^0xffffffff) & xco[3]);
xao = 0x5A827999;
}
else if(i < 40)
{
xsm = xco[1] ^ xco[2] ^ xco[3];
xao = 0x6ED9EBA1;
}
else if(i < 60)
{
xsm = (xco[1] & xco[2]) | (xco[1] & xco[3]) | (xco[2] & xco[3]);
xao = 0x8F1BBCDC;
}
else
{
xsm = xco[1] ^ xco[2] ^ xco[3];
xao = 0xCA62C1D6;
}
xgo = (this.xso(xco[0], 5)+xsm+xco[4]+xao+x7e[i]) & 0xffffffff;
xco[4] = xco[3];
xco[3] = xco[2];
xco[2] = this.xso(xco[1], 30);
xco[1] = xco[0];
xco[0] = xgo;
}
for(i=0; i < 5; i++)
{
xgo=this.xmo[i]+xco[i];
xgo &= 0xffffffff;
this.xmo[i]=xgo;
}
}
p6.xFo=function(xWn)
{
if(xWn.length != 64)
{
throw new Error("Should be 64");
}
var xko=this.xZn(xWn);
this.x1n(xko);
}
p6.xCo=function(xWn, xlo)
{
var xzo=xlo & 63;
var xeo=xWn.slice(0,xzo);
xeo.push(128);
if(xeo.length < 56)
{
while(xeo.length < 56)
{
xeo.push(0);
}
}
else
{
while(xeo.length < 120)
{
xeo.push(0);
}
}
xlo *= 8;
var xAo=this.xxo([Math.floor(xlo/0x100000000), xlo&0xffffffff]);
xeo=xeo.concat(xAo);
if(xeo.length == 64)
{
this.xFo(xeo);
}
else
{
this.xFo(xeo.slice(0,64));
this.xFo(xeo.slice(64,128));
}
}
p6.xso=function(x1m, xXn)
{
x1m &= 0xffffffff;
var xhf=this.x5n(x1m, xXn);
var xM=this.x5n(xhf, -xXn);
if(x1m != xM)
{
throw new Error("Failed");
}
return xhf;
}
p6.x5n=function(x1m, xXn)
{
xXn &= 31;
if(xXn == 0) return x1m;
var xhf=(x1m << xXn)&0xffffffff;
var xwo=32-xXn;
var xoo=0x7fffffff >> (xwo-1);
var xbo=(x1m >> xwo)&xoo;
xhf |= xbo;
return xhf;
}
p6.xZn=function(xWn)
{
if(xWn.length & 3)
{
throw new Error("Should be multiple of 4");
}
var xko=[];
var x4l=0;
var i=0;
while(i < xWn.length)
{
x4l <<= 8;
x4l |= (xWn[i] & 0xff);
i++;
if( (i & 3) == 0)
{
xko.push(x4l);
x4l=0;
}
}
return xko;
}
p6.xxo=function(xpo)
{
var x2n=[];
var x7e, i, xYn;
for(i=0; i < xpo.length; i++)
{
x7e=xpo[i];
x2n.push((x7e >> 24)&0xff);
x2n.push((x7e >> 16)&0xff);
x2n.push((x7e >> 8)&0xff);
x2n.push((x7e)&0xff);
}
return x2n;
}
p6.xuo=function(s)
{
var xhf=[];
for(var i=0; i < s.length; i++)
{
xhf=xhf.concat(this.x9n(s.charCodeAt(i)));
}
return xhf;
}
p6.x9n=function(x4j)
{
var xhf;
if(x4j <= 0x7f)
{
xhf=[x4j];
}
else if(x4j <= 0x07ff)
{
xhf=[0xc0|((x4j>>6)&0x1f), 0x80|(x4j&0x3f)];
}
else if(x4j <= 0xffff)
{
xhf=[0xc0|((x4j>>12)&0x0f), 0x80|((x4j>>6)&0x3f), 0x80|(x4j&0x3f)];
}
else if(x4j <= 0x1fffff)
{
xhf=[0xc0|((x4j>>18)&0x07), 0x80|((x4j>>12)&0x3f), 0x80|((x4j>>6)&0x3f), 0x80|(x4j&0x3f)];
}
else if(x4j <= 0x3ffffff)
{
xhf=[0xc0|((x4j>>24)&0x03), 0x80|((x4j>>18)&0x3f), 0x80|((x4j>>12)&0x3f), 0x80|((x4j>>6)&0x3f), 0x80|(x4j&0x3f)];
}
else
{
xhf=[0xc0|((x4j>>30)&0x01), 0x80|((x4j>>24)&0x3f), 0x80|((x4j>>18)&0x3f), 0x80|((x4j>>12)&0x3f), 0x80|((x4j>>6)&0x3f), 0x80|(x4j&0x3f)];
}
return xhf;
}

var p7=xRo.prototype;
function xRo()
{
this.xXo="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
}

p7.xLo=function(x2n)
{
var xhf="";
var x0n=x2n.length;
var xWb=0;
var xkl;
while(xWb < x0n)
{
xkl=xWb+3;
if(xkl > x0n) xkl=x0n;
xhf += this.x0o(x2n.slice(xWb,xkl));
xWb=xkl;
}

return xhf;
}
p7.xOo=function(xan)
{
var xhf=[];
if( (xan.length % 4) != 0)
{
this.x2o();
}
var xWb=0;
var x3o;
while(xWb < xan.length)
{
x3o=this.x5o(xan.substr(xWb,4));
xhf=xhf.concat(x3o);
xWb += 4;
}
return xhf;
}
p7.x0o=function(x2n)
{
var xhf="";
var xvo=x2n[0] >> 2;
xhf += this.xXo.substr(xvo,1);
var x1m;
if(x2n.length < 2)
{
x1m=0;
}
else
{
x1m=x2n[1];
}
xvo=((x2n[0] & 0x03) << 4) | (x1m >> 4);
xhf += this.xXo.substr(xvo,1);
if(x2n.length < 2)
{
xhf +="==";
}
else
{
if(x2n.length < 3)
{
x1m=0;
}
else
{
x1m=x2n[2];
}
xvo=((x2n[1] & 0x0f) << 2) | (x1m >> 6);
xhf += this.xXo.substr(xvo,1);
if(x2n.length < 3)
{
xhf +="=";
}
else
{
xvo=x1m & 0x3f;
xhf += this.xXo.substr(xvo,1);
}
}
return xhf;
}
p7.x5o=function(xan)
{
if(xan.length != 4)
{
this.x2o();
}
var xhf=[];
var xUo=this.xHo(xan.charCodeAt(0));
var x1o=this.xHo(xan.charCodeAt(1));
xhf[0]=(xUo << 2) | (x1o >> 4);
var i=xan.charCodeAt(2);
if(i != 61)
{
xUo=x1o;
x1o=this.xHo(i);
xhf[1]=((xUo & 0x0f) << 4) | (x1o >> 2);
i=xan.charCodeAt(3);
if(i != 61)
{
xUo=x1o;
x1o=this.xHo(i);
xhf[2]=((xUo & 0x03) << 6) | x1o;
}
}
return xhf;
}
p7.xHo=function(xSo)
{
if( (xSo >= 65) && (xSo <= 90))
{
return xSo-65;
}
else if( (xSo >= 97) && (xSo <= 122))
{
return xSo-71;
}
else if( (xSo >= 48) && (xSo <= 57))
{
return xSo+4;
}
else if(xSo == 43)
{
return 62;
}
else if(xSo == 47)
{
return 63;
}
this.x2o();
return 0;
}
p7.x2o=function()
{
throw new Error("Faulty Base64 data");
}

var p8=xdp.prototype;
function xdp()
{
this.xop=new xFn();
this.x7o=new xjo();
this.xkp=new xRo();
}

p8.xwp=function(message, x8o)
{
this.xop.xCn();
if(x8o)
{
this.xop.xLn();
}
this.x7o.xGo(message);
var x7n=this.x7o.xho();
var xNh=this.xop.xjn();
var xbp=xNh.xdm();
var xfp=xbp.length-1;
if(x7n.length > xfp)
{
throw new Error("Key too short");
}
var x9o="";
while(x7n.length < xfp)
{
var xeb=Math.floor(Math.random()*255);
x7n[x7n.length]=xeb;
x9o += xeb+",";
}
var xhp=new xom();
xhp.xfl(x7n);
var xGn=this.xop.xyn(xhp);
if(x8o)
{
var xpp=this.xop.xSn(xGn);
if(! xpp.xul(xhp))
{
throw new Error("Internal error");
}
}
var xtp=xGn.xdm();
var xip=this.xkp.xLo(xtp);
return xip;
}
p8.x8o=function(message, xqe)
{
this.xop.xLn();
var xmp=this.xkp.xOo(xqe);
var xep=new xom();
xep.xfl(xmp);
var xpp=this.xop.xSn(xep);
var xcp=xpp.xdm();
this.x7o.xGo(message);
var x7n=this.x7o.xho();
if(xcp.length < x7n.length) return false;
for(var i=0; i < x7n.length; i++)
{
if(xcp[i] != x7n[i]) return false;
}
return true;
}
p8.xRn=function(x8k, xNh)
{
this.xop.xRn(x8k, xNh);
}
p8.xJn=function(x8k, xNh)
{
this.xop.xJn(x8k, xNh);
}