Index: /gs3-extensions/web-audio/trunk/INSTALL.sh
===================================================================
--- /gs3-extensions/web-audio/trunk/INSTALL.sh	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/INSTALL.sh	(revision 28388)
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+
+if [ ! -d ../../web/ext ] ; then
+  mkdir ../../web/ext
+fi
+
+for ed in diy-audio-player  js-dsp  js-mad  sound-manager2 ; do
+  echo "Installing '$ed'"
+  /bin/cp -r $ed ../../web/ext/.
+done
Index: /gs3-extensions/web-audio/trunk/diy-audio-player/script/audioDB-play.js
===================================================================
--- /gs3-extensions/web-audio/trunk/diy-audio-player/script/audioDB-play.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/diy-audio-player/script/audioDB-play.js	(revision 28388)
@@ -0,0 +1,84 @@
+
+var SVG_NS ="http://www.w3.org/2000/svg";
+var XLINK_NS = "http://www.w3.org/1999/xlink";
+
+var _diyImages = "ext/diy-audio-player/images/";
+
+function svgAudioDBInit() 
+{
+    var segsElem = document.getElementById("svgAudioDBSegments");
+    var mysong = document.getElementById("mysong");
+
+    var barWidth = mysong.getElementWidth();
+
+    if ((typeof frameOffsetStr === "undefined") || (frameOffsetStr == null)) { return; }
+
+    var frameOffsetList = frameOffsetStr.split(",");
+    frameOffsetList.sort(function(a,b){return a-b});
+
+    prevOffsetInSecs = 0.0;
+    
+    for (i=0; i < frameOffsetList.length; i++) {
+        var frameOffset = frameOffsetList[i];
+        var offsetInSecs=(250*frameOffset)/1000.0;
+
+	var frameLengthInSecs = frameLength * 250 / 1000;
+        if (i > 0) { 
+	  if ((offsetInSecs - prevOffsetInSecs) < frameLengthInSecs)   {
+	      continue;
+	  }
+	}
+
+	var x = barWidth * offsetInSecs / duration;
+	var y = 0;
+
+	var gElem = document.createElementNS(SVG_NS,'g');
+	gElem.setAttribute('transform','translate('+x+','+y+')');
+
+	var rectElem = document.createElementNS(SVG_NS,'rect');
+	rectElem.setAttribute('width',150);
+	rectElem.setAttribute('height','24');
+	rectElem.setAttribute('x','0');
+	rectElem.setAttribute('y','0');
+	rectElem.setAttribute('fill', 'rgb(100%,100%,70%)');
+
+	var playImgElem = document.createElementNS(SVG_NS,"image");
+	playImgElem.setAttributeNS(XLINK_NS, "xlink:href", 
+				   _diyImages + "/play20.png");
+	playImgElem.setAttribute("x","2");
+	playImgElem.setAttribute("y","2");
+	playImgElem.setAttribute("width","20");
+	playImgElem.setAttribute("height","20");
+
+	var onclick ="playFromOffset('mysong'," + frameOffset + ")";
+	playImgElem.setAttribute("onclick",onclick);
+
+	playImgElem.setAttribute("onmouseover","playHighlightOnSVG(evt.target,20)");
+	playImgElem.setAttribute("onmouseout", "playHighlightOffSVG(evt.target,20)");
+
+	var textElem = document.createElementNS(SVG_NS,'text');
+	textElem.setAttribute('x','24');
+	textElem.setAttribute('y','16');
+	textElem.setAttribute("style","color: black; font-size: 75%;");
+
+	var textNode = document.createTextNode("match @ "+ offsetInSecs + " secs");
+	textElem.appendChild(textNode);
+
+	var rectLenElem = document.createElementNS(SVG_NS,'rect');
+	var frameLengthWidth = barWidth * frameLengthInSecs / duration;
+	rectLenElem.setAttribute('width',frameLengthWidth);
+	rectLenElem.setAttribute('height','4');
+	rectLenElem.setAttribute('x','0');
+	rectLenElem.setAttribute('y','20');
+	rectLenElem.setAttribute('fill', 'rgb(100%,0%,0%)');
+
+
+	gElem.appendChild(rectElem);
+	gElem.appendChild(rectLenElem);
+	gElem.appendChild(playImgElem);
+	gElem.appendChild(textElem);
+	segsElem.appendChild(gElem);
+
+	prevOffsetInSecs = offsetInSecs;
+    }
+}
Index: /gs3-extensions/web-audio/trunk/diy-audio-player/script/similarity-matrix-play.js
===================================================================
--- /gs3-extensions/web-audio/trunk/diy-audio-player/script/similarity-matrix-play.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/diy-audio-player/script/similarity-matrix-play.js	(revision 28388)
@@ -0,0 +1,745 @@
+
+// Audio objects
+var baseSong;
+var leftSong;
+var rightSong;
+
+var pannedPlayback = new Audio();
+//var pannedSink     = new Sink();
+
+var leftBuffers = [];
+var rightBuffers = [];
+
+var leftStartTimeSecs  = 0.0;
+var rightStartTimeSecs = 0.0;
+var leftStartTimeOffset  = 0;
+var rightStartTimeOffset = 0;
+
+var playTrackerMode = "stopped";
+
+var startPlayX;
+var startPlayY;
+
+var pannedPlayWidth;
+var pannedPlayHeight;
+
+var prevPlayedX = -1;
+var prevPlayedY = -1;
+
+//var prevPlayedOffset = -1;
+
+var preparingDualAudio = 0;
+
+var _diyImages = "ext/diy-audio-player/images";
+
+function resetAudioBuffers()
+{
+    //console.log("Panned audio playback buffers initialized/reset");
+
+    pannedPlayback = new Audio();
+    if (webAudioContext != null) {
+	console.log("*** Web Audio filler for resetAudioBuffers()");
+    }
+    else {
+	pannedPlayback.mozSetup(2, baseSong.mozSampleRate);
+    }
+
+    //pannedSink = new Sink(baseSong.mozSampleRate,2);
+    //pannedSink.writeMode = "sink";
+
+    leftBuffers = [];
+    rightBuffers = [];
+
+    leftStartTimeSecs  = 0.0;
+    rightStartTimeSecs = 0.0;
+    leftStartTimeOffset  = 0;
+    rightStartTimeOffset = 0;
+
+    prevPlayedX = -1;
+    prevPlayedY = -1;
+
+    // prevPlayedOffset = -1;
+
+
+
+}
+
+
+
+function dualPlay(evt) 
+{
+
+    //if ($('#playtracker').css('visibility') == 'hidden') { return };
+
+    var mouse_x = evt.pageX;
+    var mouse_y = evt.pageY;
+
+    // display busy/loading cursor
+    var playTrackerBusy = document.getElementById("playtrackerBusy");
+    playTrackerBusy.setAttribute("style","visibility: visible;");
+    preparingDualAudio = 1;
+
+    var selfSimImg = document.getElementById("selfSimImgId");
+    var imgWidth   = selfSimImg.getAttribute("width");
+    var imgHeight  = selfSimImg.getAttribute("height") * yScaleSimImg;
+    
+    // console.log("**** image w x h = " + imgWidth +"," + imgHeight);
+
+    var img_x = $("#selfSimImgId").offset().left;
+    var img_y = $("#selfSimImgId").offset().top;
+   
+    var x_org = mouse_x - img_x;
+    var y_org = mouse_y - img_y;
+    //var adjusted_y_org = imgHeight - y_org;
+    var adjusted_x_org = x_org - FrequencyPlotter.fudgeOffset;
+    var adjusted_y_org = y_org; // *****
+    
+    //console.log("img (x y) = (" + img_x + "," + img_y + ")");
+    //console.log("mouse (x y) = (" + mouse_x + "," + mouse_y + ")");
+    //console.log("(x y) = (" + x_org + "," + adjusted_y_org + ")");
+
+    startPlayX = x_org;
+    startPlayY = y_org;
+
+    //pannedPlayWidth  = imgWidth - x_org;
+    var fudgeWidth = imgWidth - (FrequencyPlotter.fudgeOffset + FrequencyPlotter.fudgeTrim);
+    pannedPlayWidth  = fudgeWidth - adjusted_x_org;
+    //pannedPlayHeight = y_org;
+    pannedPlayHeight = imgHeight - y_org; // **** adjusted
+
+    resetAudioBuffers();
+
+    //var baseSongSrc="sites/localsite/collect/" + collect +"/import/"+source; // ****
+    // improvement to ensure plugin generate .ogg file, and then use that
+    var baseSongSrc=gs.collectionMetadata["httpPath"]+"/index/assoc/"+gs.documentMetadata["assocfilepath"] + "/doc.ogg";
+
+    //console.log("duration = " + duration);
+
+    //leftStartTimeSecs  = duration * (x_org / imgWidth);
+    leftStartTimeSecs  = duration * (adjusted_x_org / fudgeWidth);
+    rightStartTimeSecs = duration * (adjusted_y_org / imgHeight);
+
+    var sampleMult = baseSong.mozSampleRate * baseSong.mozChannels;
+    leftStartTimeOffset  = leftStartTimeSecs * sampleMult;
+    rightStartTimeOffset = rightStartTimeSecs * sampleMult;
+
+    //leftSong.src  = baseSongSrc + "#t=" + leftStartTimeSecs + ",";
+    //rightSong.src = baseSongSrc + "#t=" + rightStartTimeSecs + ",";
+
+    leftSong.currentTime = leftStartTimeSecs;
+    leftSong.play();
+
+    rightSong.currentTime = rightStartTimeSecs;
+    rightSong.play();
+
+    // Drives the visualization
+    baseSong.currentTime = leftStartTimeSecs;
+    baseSong.volume = 0.0;
+    baseSong.play();
+
+
+    // console.log("play tracker mode = " + playTrackerMode);
+    if (togglePlayMode.match("pause")) {
+	// i.e. currently displaying the pause button
+	// stop
+	if (playTrackerMode.match("stopped")) {
+	    // => playing through the main play bar
+	    soundManager.stopAll();
+	    togglePlayVisual(document.getElementById("mainPlayButton"));
+	}
+    }
+
+    console.log("*** DualPlay:: muting  'mysong' volume to 0");
+    soundManager.setVolume("mysong",0.0);
+    var soundManagerFrameOffset = Math.round(1000.0*leftStartTimeSecs/250.0); // **** better to develop function for computation
+    playFromOffset("mysong",soundManagerFrameOffset);
+
+/*
+    if (!playTrackerMode.match("playing")) {
+	togglePlayVisual(document.getElementById("mainPlayButton"));
+    }
+*/
+
+}
+
+
+function playTrackerOn(evt) 
+{
+    if (togglePlayMode.match("play") && $('input:checkbox[name=similarityMatrix]').prop("checked")) {
+
+	var playTracker = document.getElementById("playtracker");
+	playTrackerMove(evt);
+	playTracker.setAttribute("style","visibility: visible");
+    }
+}
+
+function playTrackerOff(evt) 
+{    
+    var playTracker = document.getElementById("playtracker");
+    playTracker.setAttribute("style","visibility: hidden");
+}
+
+function updateLeftAndRightTimes(cx,cy)
+{
+    var selfSimImg = document.getElementById("selfSimImgId");
+    var imgWidth  = selfSimImg.getAttribute("width");
+    var imgHeight = selfSimImg.getAttribute("height") * yScaleSimImg;
+
+    //var mysong = document.getElementById("mysong");
+    //var barWidth = mysong.getElementWidth();
+
+    var fudgeWidth = imgWidth - (FrequencyPlotter.fudgeOffset + FrequencyPlotter.fudgeTrim);
+
+    // update L & R times on tracker
+    var currPlayedXInSecs = (cx/fudgeWidth) * duration; // **** adjusted
+    var currPlayedYInSecs = (cy/imgHeight) * duration;
+
+    // Deliberately crossed to fit visual playTracker circlea 
+
+    var leftTime = document.getElementById("leftTime");
+    var leftText = "R: " + currPlayedXInSecs.toFixed(0) + " secs"; 
+    // (used to do 1 decimal place)
+
+    leftTextNode = leftTime.childNodes[0];
+    leftTextNode.nodeValue = leftText;
+
+    var rightTime = document.getElementById("rightTime");
+    var rightText = "L: " + currPlayedYInSecs.toFixed(0) + " secs";
+        
+    rightTextNode = rightTime.childNodes[0];
+    rightTextNode.nodeValue = rightText;
+
+    // console.log("left text = " + leftText);
+    // console.log("right text = " + rightext);
+}
+
+
+function playTrackerMove(evt) 
+{
+    if (!playTrackerMode.match("playing")) {
+	var mouse_x = evt.pageX;
+	var mouse_y = evt.pageY;
+
+	var img_x = $("#selfSimImgId").offset().left;
+	var img_y = $("#selfSimImgId").offset().top;
+   
+	var x_org = mouse_x - img_x;
+	var y_org = mouse_y - img_y;
+	
+	var adjusted_x_org = x_org - FrequencyPlotter.fudgeOffset;
+	var adjusted_y_org = y_org;
+
+	updateLeftAndRightTimes(adjusted_x_org,adjusted_y_org);
+
+	var playTracker = document.getElementById("playtracker");
+	var transform = "translate("+x_org+","+y_org+")";
+	playTracker.setAttribute("transform",transform);
+    }
+
+}
+
+function svgInitSimilarityPlay() 
+{
+    var mysong = document.getElementById("mysong");
+    var barWidth = mysong.getElementWidth();
+
+    //var baseSongSrc="sites/localsite/collect/" + collect +"/import/"+source;
+    // improvement to ensure plugin generate .ogg file, and then use that
+    var baseSongSrc=gs.collectionMetadata["httpPath"]+"/index/assoc/"+gs.documentMetadata["assocfilepath"] + "/doc.ogg";
+
+    baseSong = document.getElementById("rta-audio-element");
+    //baseSong = new Audio();
+    //baseSong.src = baseSongSrc;
+    //baseSong.control = "control";
+
+    //baseSong.addEventListener('MozAudioAvailable', audioAvailable, false);
+    //baseSong.addEventListener('loadedmetadata', loadedMetadata, false);
+
+/*
+    // match the pannedPlayback sample rate to 'baseSong' once it is set up
+    baseSong.addEventListener('loadedmetadata', initPannedPlaybackSampleRate, false);
+
+    //leftSong = new Audio();
+    leftSong = document.getElementById("leftsong");
+    leftSong.addEventListener('MozAudioAvailable', audioAvailableLeft, false);
+    leftSong.addEventListener('loadedmetadata', loadedMetadataLeft, false);
+
+
+    //rightSong = new Audio();
+    rightSong = document.getElementById("rightsong")
+    rightSong.addEventListener('MozAudioAvailable', audioAvailableRight, false);
+    rightSong.addEventListener('loadedmetadata', loadedMetadataRight, false);
+    
+*/
+
+    //graphicalEq = new GraphicalEq(sampleRate);
+    //graphicalEq.recalculateFilters();
+
+    // Set up self similarity image
+
+    //var selfSimImgSrc="sites/localsite/collect/" + collect +"/bordered/line-interlaced/"+self_sim_png;
+    var selfSimImgSrc="sites/localsite/collect/" + collect +"/images/blank-775x816.png";
+    //console.log("self sim img = " + selfSimImgSrc);
+
+    var simPlayLine = document.getElementById("simPlayLineGroup");
+
+    simPlayLine.setAttributeNS(SVG_NS,"transform","scale(1.0,"+yScaleSimImg+")");
+
+    var selfSimImg = document.createElementNS(SVG_NS,"image");
+    selfSimImg.setAttributeNS(XLINK_NS, "xlink:href", selfSimImgSrc);
+
+    var selfSimImgWidth  = barWidth;
+    var selfSimImgHeight = barWidth * (815.0 / 776.0);
+
+    selfSimImg.setAttribute("x",0);
+    selfSimImg.setAttribute("y",0);
+    selfSimImg.setAttribute("id","selfSimImgId");
+    selfSimImg.setAttribute("width",barWidth);
+    selfSimImg.setAttribute("height",selfSimImgHeight);
+    selfSimImg.setAttribute("onclick","dualPlay(evt)");
+    selfSimImg.setAttribute("onmousemove","playTrackerMove(evt)");
+    selfSimImg.setAttribute("onmouseover","playTrackerOn(evt)");
+    //selfSimImg.setAttribute("onmouseout","playTrackerOff(evt)");
+
+    simPlayLine.appendChild(selfSimImg);
+
+    var svgSimilarityPlay = document.getElementById("svgSimilarityPlay");
+
+    //console.log("self sim height = " + selfSimImgHeight + " y scale = " + yScaleSimImg);
+    svgSimilarityPlay.setAttribute("height",0 + selfSimImgHeight * yScaleSimImg); // used to be 30 +
+
+    // Firefox doesn't seem to like this being initialized statically
+    // in the HTML page generate, so add it dynamically here
+    var playTrackerBusy = document.getElementById("playtrackerBusy");
+    playTrackerBusy.setAttributeNS(XLINK_NS,"xlink:href",
+				   _diyImages + "/wait30trans.gif");
+
+}
+
+
+
+// Not callled anymore // ****
+
+function loadedMetadata() {
+    // Mute baseSong audio.
+    baseSong.volume = 0;
+
+    console.error("This should not be called anymore");
+
+}
+
+function initPannedPlaybackSampleRate() {
+
+    // Set up a pannedPlayback for the left and right song streams to be mixed and routed through
+
+    if (webAudioContext != null) {    
+	console.log("*** Web Audio filler for initPannedPlaybackSampleRate()");
+    }
+    else {
+	console.info("similarity-matrix-play initPannedPlaybackSampleRate(): Setting up pannedPlayback with .mozSetup(2,"+baseSong.mozSampleRate+")");
+	pannedPlayback.mozSetup(2, baseSong.mozSampleRate);
+    }
+}
+
+function loadedMetadataLeft() {
+
+    //console.log("*** similarity-matrix-play: loadedMetadataLeft()");
+
+    // Mute leftSong audio.
+    leftSong.volume = 0;
+
+    if (webAudioContext != null) {
+
+	var webAudioSource = webAudioContext.createMediaElementSource(leftSong);
+
+	var webAudioJSProcessor = webAudioContext.createJavaScriptNode(1024,2,2);
+	webAudioJSProcessor.onaudioprocess = audioAvailableLeft;	
+    
+	// Connect the processing graph: source -> jsProcessor -> analyser -> destination
+	webAudioSource.connect(webAudioJSProcessor);
+	webAudioJSProcessor.connect(webAudioContext.destination);
+    }
+
+
+    //leftSong.currentTime = leftStartTimeSecs;
+    //leftSong.play();
+    //console.log("left start time = " + leftStartTimeSecs);
+}
+
+
+function loadedMetadataRight() {
+
+    //console.log("*** similarity-matrix-play: loadedMetadataRight()");
+
+    // Mute rightSong audio.
+    rightSong.volume = 0;
+
+    if (webAudioContext != null) {
+
+	var webAudioSource = webAudioContext.createMediaElementSource(rightSong);
+
+	var webAudioJSProcessor = webAudioContext.createJavaScriptNode(1024,2,2);
+	webAudioJSProcessor.onaudioprocess = audioAvailableRight;	
+    
+	// Connect the processing graph: source -> jsProcessor -> analyser -> destination
+	webAudioSource.connect(webAudioJSProcessor);
+	webAudioJSProcessor.connect(webAudioContext.destination);
+    }
+
+
+    //rightSong.currentTime = rightStartTimeSecs;
+    //rightSong.play();
+    //console.log("right start time = " + rightStartTimeSecs);
+
+}
+
+function audioAvailable(event) {
+    // Write the current framebuffer
+    //alert("audioAvailable() should no longer be called");
+    console.error("audioAvailable() should no longer be called");
+
+    var frameBuffer = event.frameBuffer; // frameBuffer is Float32Array
+    //writeAudio(frameBuffer);
+}
+
+var smf = true;
+
+function audioAvailableLeft(event) 
+{
+    // Write the current framebuffer
+    if (webAudioContext != null) {
+	
+	if (leftSong.paused) {
+	    // not processing/playing any new audio 
+	    return;
+	}
+
+	if (smf) {
+	    console.log("*** audioAvailableLeft() forcing mysong to 0 vol");
+	    soundManager.setVolume("mysong",0.0);
+	    leftSong.volume = 0.0;
+	    rightSong.volume = 0.0;
+	    smf = false;
+	}
+
+	var inputArrayL = event.inputBuffer.getChannelData(0);
+	var inputArrayR = event.inputBuffer.getChannelData(1);
+	
+	var inputLen = inputArrayL.length;
+
+	var outputArrayL = event.outputBuffer.getChannelData(0);
+	var outputArrayR = event.outputBuffer.getChannelData(1);
+
+	for (var i=0; i<inputLen; i++) {
+	    outputArrayL[i] = (inputArrayL[i] + inputArrayR[i])/2.0;
+	    outputArrayR[i] = 0.0;
+	}
+    }
+    else {
+
+	if (smf) {
+	    console.log("*** audioAvailableLeft() forcing mysong to 0 vol");
+	    soundManager.setVolume("mysong",0.0);
+	    leftSong.volume = 0.0;
+	    rightSong.volume = 0.0;
+	    smf = false;
+	}
+
+	var frameBuffer = event.frameBuffer; 
+	writeAudio(frameBuffer,"left");
+    }
+
+}
+
+function audioAvailableRight(event) 
+{
+    // Write the current framebuffer
+
+    if (webAudioContext != null) {
+	
+	if (rightSong.paused) {
+	    // not processing/playing any new audio 
+	    return;
+	}
+
+	var inputArrayL = event.inputBuffer.getChannelData(0);
+	var inputArrayR = event.inputBuffer.getChannelData(1);
+	
+	var inputLen = inputArrayL.length;
+
+	var outputArrayL = event.outputBuffer.getChannelData(0);
+	var outputArrayR = event.outputBuffer.getChannelData(1);
+
+	for (var i=0; i<inputLen; i++) {
+	    outputArrayL[i] = 0.0;
+	    outputArrayR[i] = (inputArrayL[i] + inputArrayR[i])/2.0;
+	}
+    }
+
+    else {
+	var frameBuffer = event.frameBuffer; 
+	writeAudio(frameBuffer,"right");
+    }
+}
+
+
+
+
+function activeAudioBuffer(audioBuffer,currentFullBufferSize,startTime) 
+{
+    var buffer;
+    if (currentFullBufferSize < startTime) {
+	// active audio starts at offset within this segment of audioBuffer
+
+	var position = startTime - currentFullBufferSize;
+	buffer = audioBuffer.subarray(position);
+    }
+    else {
+	buffer = audioBuffer;
+    }
+    return buffer;
+}
+
+function panLeftEffect(buffer,s,panned_buffer,d) 
+{
+    panned_buffer[d] = buffer[s];
+    if ((d+1) < panned_buffer.length) {
+	panned_buffer[d+1] = 0;
+    }
+}
+
+function panRightEffect(buffer,s,panned_buffer,d) 
+{
+    panned_buffer[d] = 0;
+    if ((d+1) < panned_buffer.length) {
+	panned_buffer[d+1] = buffer[s];
+    }
+}
+
+function panAudioBuffersHead(buffer,position,panEffect)
+{
+    var remaining_len = buffer.length - position;
+    var panned_buffer;
+    if (baseSong.mozChannels == 1) {
+	panned_buffer = new Float32Array(remaining_len * 2);
+
+	var d=0;
+	for (var s=position; s < buffer.length; s++) {
+	    panEffect(buffer,s,panned_buffer,d);
+	    d += 2;
+	}
+    }
+    else {
+	// assume stereo
+	panned_buffer = new Float32Array(remaining_len);
+      
+	var d=0;
+	for (var s=position; s < buffer.length; s+=2) {
+	    panEffect(buffer,s,panned_buffer,d); 
+
+	    d += 2;
+	}
+    }
+
+    return panned_buffer;
+}
+
+function mergeLeftAndRightPan(leftPannedBuffer,rightPannedBuffer)
+{
+    // left and right buffers guaranteed to be stereo samples
+ 
+    // Deliberately crossed to fit visual playTracker circlea 
+
+    var leftLen  = leftPannedBuffer.length;
+    var rightLen = rightPannedBuffer.length;
+    var maxLen = Math.max(leftLen,rightLen);
+
+    var pannedBuffer = new Float32Array(maxLen);
+
+    for (i=0; i < maxLen; i+=2) {
+
+        if (i < leftLen-1) {
+	    // i+1 actually right pos
+	    pannedBuffer[i+1] = leftPannedBuffer[i];
+	}
+	else {
+	    pannedBuffer[i+1] = 0;
+	}
+
+        if (i < rightLen-1) {
+	    // actually left pos
+	    pannedBuffer[i] = rightPannedBuffer[i+1];
+	}
+	else {
+	    pannedBuffer[i] = 0;
+	}
+    }
+
+    return pannedBuffer;
+
+}
+
+function writeAudio(audioBuffer,channel) 
+{
+
+    var mysong = document.getElementById("mysong");
+    var barWidth = mysong.getElementWidth();
+
+    var selfSimImg = document.getElementById("selfSimImgId");
+    var imgWidth  = selfSimImg.getAttribute("width");
+    var imgHeight = selfSimImg.getAttribute("height") * yScaleSimImg;
+
+    var fudgeWidth = imgWidth - (FrequencyPlotter.fudgeOffset + FrequencyPlotter.fudgeTrim);
+
+    // audioBuffer is Float32Array
+    var audioBufferLen = audioBuffer.length; 
+
+    if (channel.match("left")) {
+        //var leftBuffer = activeAudioBuffer(audioBuffer,totalFullBufferSize,leftStartTimeOffset);
+	leftBuffers.push({buffer: audioBuffer, position: 0});
+    }
+
+    if (channel.match("right")) {
+        //var rightBuffer = activeAudioBuffer(audioBuffer,totalFullBufferSize,rightStartTimeOffset);
+	rightBuffers.push({buffer: audioBuffer, position: 0});
+    }
+
+
+    // If there's buffered data in both left and right buffers,
+    // then it's time to play something 
+
+    var currPlayedX = null;
+    var currPlayedY = null;
+
+    while ((leftBuffers.length > 0) && (rightBuffers.length > 0)) {
+
+	if (preparingDualAudio) {
+	    var playTrackerBusy= document.getElementById("playtrackerBusy");
+	    playTrackerBusy.setAttribute("style","visibility: hidden;");
+	    preparingDualAudio = 0;
+	}
+
+
+        var leftBuffer = leftBuffers[0].buffer;
+	var leftBufferPos = leftBuffers[0].position;
+        var leftPannedBuffer  = panAudioBuffersHead(leftBuffer,leftBufferPos,panLeftEffect);
+
+        var rightBuffer = rightBuffers[0].buffer;
+	var rightBufferPos = rightBuffers[0].position;
+        var rightPannedBuffer = panAudioBuffersHead(rightBuffer,rightBufferPos,panRightEffect);
+
+        var pannedBuffer = mergeLeftAndRightPan(leftPannedBuffer,rightPannedBuffer);
+
+	// Send something to be played
+	var written = pannedPlayback.mozWriteAudio(pannedBuffer);
+	//pannedSink.writeBufferSync(pannedBuffer);
+
+
+	//var written = pannedPlayback.mozWriteAudio(rightPannedBuffer);
+	//var written = pannedPlayback.mozWriteAudio(leftPannedBuffer);
+
+	// get current play pos, and plot on selfSimImg
+	var currentPlayedOffset = pannedPlayback.mozCurrentSampleOffset();
+	//var currentPlayedOffset = pannedSink.getSyncWriteOffset();
+
+	var sampleRate = pannedPlayback.mozSampleRate;
+	var numChannels = pannedPlayback.mozChannels;
+	//var sampleRate = pannedSink.sampleRate;
+	//var numChannels = pannedSink.channelCount;
+
+	var pannedDurationLeft  = duration - leftStartTimeSecs;
+	var pannedDurationRight = duration - rightStartTimeSecs;
+
+	var totalNumSamplesLeft  = sampleRate * numChannels * pannedDurationLeft;
+	var totalNumSamplesRight = sampleRate * numChannels * pannedDurationRight;
+
+	var currentPlayedPercLeft  = currentPlayedOffset/totalNumSamplesLeft;
+	var currentPlayedPercRight = currentPlayedOffset/totalNumSamplesRight;
+
+
+	var currPlayedXPrecise = startPlayX + (currentPlayedPercLeft*pannedPlayWidth);
+	//var currPlayedYPrecise = startPlayY - (currentPlayedPercRight*pannedPlayHeight);
+	var currPlayedYPrecise = startPlayY + (currentPlayedPercRight*pannedPlayHeight); // **** adjusted
+
+	currPlayedX = Math.round(currPlayedXPrecise);
+	currPlayedY = Math.round(currPlayedYPrecise);
+
+
+	if ((currPlayedX != prevPlayedX) || (currPlayedY != prevPlayedY)) {
+
+	    updateLeftAndRightTimes(currPlayedXPrecise,currPlayedYPrecise);
+
+	    var playTracker = document.getElementById("playtracker");
+	    var transform = "translate("+currPlayedX+","+currPlayedY+")";
+	    playTracker.setAttribute("transform",transform);
+    	    
+	    if ((prevPlayedX == -1) && (prevPlayedY == -1)) {
+		// notice the first time this happens
+		playTracker.setAttribute("style","visibility: visible");
+		playTrackerMode = "playing";
+	    }
+
+	    prevPlayedX = currPlayedX;
+	    prevPlayedY = currPlayedY;
+	}
+
+	// console.log("currently playing = " + currentPlayedSecs);
+
+
+	// If all data wasn't written, keep it in the buffers:
+	var doBreak = false;
+
+	if (leftBufferPos + written < leftBuffer.length) {
+	    leftBuffers[0].position = leftBufferPos + written;
+	    doBreak = true;
+	}
+	else {
+	    leftBuffers.shift();
+        }
+
+	if (rightBufferPos + written < rightBuffer.length) {
+	    rightBuffers[0].position = rightBufferPos + written;
+	    doBreak = true;
+	}
+	else {
+	    rightBuffers.shift();
+        }
+
+	if (doBreak) {
+	    break;
+	}
+    }
+
+    var currentPlayedOffset = pannedPlayback.mozCurrentSampleOffset();
+    //var currentPlayedOffset = pannedSink.getSyncWriteOffset();
+
+    //if (currentPlayedOffset == prevPlayedOffset) {
+	// Nothing more is playing
+
+    //var exceededX = ((currPlayedX != null) && (currPlayedX>barWidth));
+    var exceededX = ((currPlayedX != null) && (currPlayedX>fudgeWidth));
+    //var exceededY = ((currPlayedY != null) && (currPlayedY<0));
+    var exceededY = ((currPlayedY != null) && (currPlayedY>imgHeight)); // **** adjusted
+
+    if ((exceededX || exceededY) && (!playTrackerMode.match("stopped"))) {
+
+	// console.log("detected stop condition");
+
+	// readed edge of play area
+	playTrackerMode = "stopped";
+	togglePlayVisual(document.getElementById("mainPlayButton"));
+	playTrackerOff(null);
+	    
+	console.log("*** setting 'mysong' volume back to 100%");
+	soundManager.setVolume("mysong",100);
+
+	//prevPlayedOffset = -1;
+    }
+    else {
+	//prevPlayedOffset = currentPlayedOffset;
+    }
+
+}
+
+
+
Index: /gs3-extensions/web-audio/trunk/diy-audio-player/script/structured-audio-play.js
===================================================================
--- /gs3-extensions/web-audio/trunk/diy-audio-player/script/structured-audio-play.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/diy-audio-player/script/structured-audio-play.js	(revision 28388)
@@ -0,0 +1,372 @@
+
+var SVG_NS ="http://www.w3.org/2000/svg";
+var XLINK_NS = "http://www.w3.org/1999/xlink";
+
+var _diyImages = "ext/diy-audio-player/images/";
+
+var togglePlayMode = "play";
+
+function distinctColorHSL(sn,numSegs) {
+
+    var Hangle = 360 * sn / numSegs;
+    var Sperc  = 10 + 90 * sn / numSegs;
+    var Vperc  = 40 + 60 * sn / numSegs;
+
+    return 'hsl(' + Hangle + ', ' + Sperc + '%, ' + Vperc + '%)';
+
+}
+
+
+function togglePlayVisual(elem)
+{
+    if (togglePlayMode.match("play")) {
+	// switch to displaying pause
+	if (elem!=null) {
+	    elem.src=_diyImages+"/pause32.png";
+	}
+	else {
+	    console.warn("structured-audio-play.js, togglePlayVisual(): 'elem' does not exist");
+	}
+	togglePlayMode = "pause";
+    }
+    else {
+	if (elem != null) {
+	    elem.src=_diyImages+"/play32.png";
+	}
+	else {
+	    console.warn("structured-audio-play.js, togglePlayVisual(): 'elem' does not exist");
+	}
+	togglePlayMode = "play";
+    }
+}
+
+
+
+function playFromOffsetPair(frameOffset) 
+{
+    playFromOffset("mysong",frameOffset);
+    
+    // SoundManager playing => also start 'rta-audio-element' but at volume zero
+    var rtaAudio = document.getElementById("rta-audio-element");
+    rtaAudio.volume=0.0;
+    rtaAudio.play();
+}
+
+
+function playFromOffsetRTAEvent(event)
+{
+    // force sound-manager to handle event first, to make sure 
+    // mysongCurrentPos set to the new value
+
+    pagePlayer.handleMouseDown(event);
+
+    var currentPosElem = document.getElementById("mysongCurrentPos");
+    var offsetInMSecs = currentPosElem.getAttribute("offsetInMSecs");
+    // console.log("offsetInMSecs = " + offsetInMSecs);
+	    
+    if (offsetInMSecs==null) { offsetInMSecs = 0; }
+    var frameOffset = Math.round(offsetInMSecs/250.0);
+
+    var rta_audio = document.getElementById("rta-audio-element");
+    var secOffset = offsetInMSecs/1000.0;
+    rta_audio.currentTime = secOffset;
+
+    console.log("playFromOffsetRTAEvent: " + secOffset + " secs -> Real-Time Audio (RTA)");
+    
+    // Force frequencyPlotter to jump to next location
+    frequencyPlotter.prevXLine = null;
+}
+
+function togglePlay(event,elem)
+{
+    togglePlayVisual(elem);
+
+    if (event != null) {
+	event.stopPropagation();
+	event.preventDefault();
+    }
+
+    // switching to offering pause (means it was a play button when clicked)
+    if (togglePlayMode.match("pause")) {
+	if (playTrackerMode.match("paused")) {
+	    rightSong.play();
+	    leftSong.play();
+	    pannedPlayback.play();
+	    playTrackerMode = "playing";
+
+	    var offsetInSecs = rightSong.currentTime;
+	    var offsetInMSecs = 1000.0 * offsetInSecs;
+	    var frameOffset = Math.round(offsetInMSecs/250.0);
+	    playFromOffset("mysong",frameOffset);
+	    
+	}
+	else {
+
+	    var currentPosElem = document.getElementById("mysongCurrentPos");
+	    var offsetInMSecs = currentPosElem.getAttribute("offsetInMSecs");
+	    // console.log("offsetInMSecs = " + offsetInMSecs);
+	    
+	    if (offsetInMSecs==null) { offsetInMSecs = 0; }
+	    var frameOffset = Math.round(offsetInMSecs/250.0);
+
+	    playFromOffsetPair(frameOffset)
+/*
+	    if (selectedMeandreWorkflow.thisMeandreFlowIsRunning()) {
+		// Meandre workflow already up and running
+		playFromOffsetPair(frameOffset)
+	    }
+	    else {
+		// Give Meandre flow time to start getting data, then start the playing
+		selectedMeandreWorkflow.runThisMeandreFlow(null, function() { playFromOffsetPair(frameOffset) });
+	    }
+*/
+
+	}
+    }
+    else {
+	// figure out if mysong or dualPlay in operation, and pause it
+
+	if (playTrackerMode.match("playing")) {
+	    pannedPlayback.pause();
+	    leftSong.pause();
+	    rightSong.pause();
+
+	    var rtaAudio = document.getElementById("rta-audio-element");
+	    rtaAudio.pause();
+
+	    soundManager.pause("mysong");
+
+	    playTrackerMode = "paused";
+	}
+	else {
+	    soundManager.pause("mysong");
+
+	    // SoundManager being ask to pause => also pause 'rta-audio-element' and restore volume
+	    var rtaAudio = document.getElementById("rta-audio-element");
+	    rtaAudio.volume=1.0;
+	    rtaAudio.pause();
+	}
+/*
+    
+	var showSimilarityMatrix = $('input:checkbox[name=similarityMatrix]').prop("checked");
+	if (showSimilarityMatrix) {
+	    plotSimilarityMatrix();
+	}
+*/
+
+    }
+}
+
+
+
+function playHighlightOn(elem,size)
+{
+    size = (size) ? size : 32;
+ 
+    if (togglePlayMode.match("play")) {
+	elem.setAttribute("src",_diyImages+"/play"+size+"Highlight.png");
+    }
+    else {
+	elem.setAttribute("src",_diyImages+"/pause"+size+"Highlight.png");
+    }
+}
+
+function playHighlightOff(elem,size)
+{
+    size = (size) ? size : 32;
+
+    if (togglePlayMode.match("play")) {
+	elem.setAttribute("src",_diyImages+"/play"+size+".png");
+    }
+    else {
+	elem.setAttribute("src",_diyImages+"/pause"+size+".png");
+    }
+}
+
+function playHighlightOnSVG(elem,size)
+{
+    size = (size) ? size : 32;
+ 
+    elem.setAttributeNS(XLINK_NS,"xlink:href",_diyImages+"/play"+size+"Highlight.png");
+}
+
+function playHighlightOffSVG(elem,size)
+{
+    size = (size) ? size : 32;
+
+    elem.setAttributeNS(XLINK_NS,"xlink:href",_diyImages+"/play"+size+".png");
+
+}
+
+
+function searchHighlightOnSVG(elem,size)
+{
+    size = (size) ? size : 32;
+ 
+    elem.setAttributeNS(XLINK_NS,"xlink:href",_diyImages+"/search"+size+"Highlight.png");
+}
+
+function searchHighlightOffSVG(elem,size)
+{
+    size = (size) ? size : 32;
+
+    elem.setAttributeNS(XLINK_NS,"xlink:href",_diyImages+"/search"+size+".png");
+
+}
+
+
+function raiseSPRect(elem)
+{
+    elem.setAttribute("style","z-index: 5;");
+}
+
+
+function lowerSPRect(elem)
+{
+    elem.setAttribute("style","");
+}
+
+function renderStructuredSegBar(segsElem, segData) 
+{
+    var mysong   = document.getElementById("mysong");
+    var barWidth = mysong.getElementWidth();
+
+    // Count how many different labels we have 
+
+    var segFreq = {};
+    var numLabels = 0;
+
+    for(var i=0; i< segData.length; i++) {
+        var value = segData[i].l;
+        if(value in segFreq) {
+            segFreq[value]++;
+        }
+        else {
+            segFreq[value] = 1;
+	    numLabels++;
+        }
+    }
+
+    var numSegs = segData.length;
+
+    for (i=0; i < numSegs; i++) {
+
+	var offsetInSecs = segData[i].o;
+	var frameOffset = Math.round(offsetInSecs*1000/250.0);
+
+	var label = segData[i].l;
+	var labelOrd = label.charCodeAt(0);
+	var letterBaseOrd = "A".charCodeAt(0);
+	var numberBaseOrd = "0".charCodeAt(0);
+
+	var baseOrd;
+	if ((labelOrd >= numberBaseOrd) && (labelOrd <= "9".charCodeAt(0))) {
+	    baseOrd = numberBaseOrd;
+	}
+	else {
+	    baseOrd = letterBaseOrd;
+	}
+
+	var labelIndex = label.charCodeAt(0) - baseOrd;
+	var labelColor = distinctColorHSL(labelIndex,numLabels);
+
+	var x = barWidth * offsetInSecs / duration;
+	var y = 0;
+
+	var nextOffsetInSecs 
+	    = (i < numSegs-1) ? segData[i+1].o : duration;
+	var nextX = barWidth * nextOffsetInSecs / duration;
+
+	var gElem = document.createElementNS(SVG_NS,'g');
+	gElem.setAttribute('transform','translate('+x+','+y+')');
+	gElem.setAttribute("onmouseover","raiseSPRect(evt.target)");
+	gElem.setAttribute("onmouseout","lowerSPRect(evt.target)");
+
+	var rectElem = document.createElementNS(SVG_NS,'rect');
+	rectElem.setAttribute('width',nextX - x - 1);
+	rectElem.setAttribute('height','24');
+	rectElem.setAttribute('x','0');
+	rectElem.setAttribute('y','0');
+	/* rectElem.setAttribute('stroke-width', '5'); */
+	rectElem.setAttribute('fill', labelColor);
+
+
+	var textElem = document.createElementNS(SVG_NS,'text');
+	textElem.setAttribute('x','5');
+	textElem.setAttribute('y','18');
+
+	var textNode = document.createTextNode(label);
+	textElem.appendChild(textNode);
+
+	var playImgElem = document.createElementNS(SVG_NS,"image");
+	playImgElem.setAttributeNS(XLINK_NS, "xlink:href", 
+				   _diyImages+"/play20.png");
+	playImgElem.setAttribute("x","20");
+	playImgElem.setAttribute("y","2");
+	playImgElem.setAttribute("width","20");
+	playImgElem.setAttribute("height","20");
+
+	var onclick ="playFromOffset('mysong'," + frameOffset + ")";
+	playImgElem.setAttribute("onclick",onclick);
+
+	playImgElem.setAttribute("onmouseover","playHighlightOnSVG(evt.target,20)");
+	playImgElem.setAttribute("onmouseout", "playHighlightOffSVG(evt.target,20)");
+
+
+	var searchImgElem = document.createElementNS(SVG_NS,'image');
+	searchImgElem.setAttributeNS(XLINK_NS, "xlink:href", 
+				     _diyImages+"/search20.png");
+	searchImgElem.setAttribute("x","44");
+	searchImgElem.setAttribute("y","2");
+	searchImgElem.setAttribute("width","20");
+	searchImgElem.setAttribute("height","20");
+	var onclickSearch ="searchSubmit("+frameOffset+")";
+	searchImgElem.setAttribute("onclick",onclickSearch);
+
+	searchImgElem.setAttribute("onmouseover","searchHighlightOnSVG(evt.target,20)");
+	searchImgElem.setAttribute("onmouseout", "searchHighlightOffSVG(evt.target,20)");
+
+	gElem.appendChild(rectElem);
+	gElem.appendChild(textElem);
+	gElem.appendChild(playImgElem);
+	gElem.appendChild(searchImgElem);
+	segsElem.appendChild(gElem);
+
+    }
+}
+
+
+function svgGTStructuredInit() 
+{
+    if (allData!=null) {
+	var segDataGT = allData[0]; /* pick out ground truth data */    
+	var segsElemGT = document.getElementById("svgGroundTruthSegments");
+
+	renderStructuredSegBar(segsElemGT,segDataGT);
+    }
+    else {
+	console.warn("svnGTStructuredInit(): allData was null");
+    }
+}
+
+function svgCAStructuredInit(caPos) 
+{
+    var segsElemCA = document.getElementById("svgContentAnalysisSegments");
+    
+    // console.log("caPos = " + caPos);
+
+    if (caPos == -1) {
+	ssegsElemCA.setAttribute("style","display: none;");
+    }
+    else {
+	if (allData!=null) {
+	    var segDataCA = allData[caPos]; /* pick out example content analysis data */ 
+
+	    renderStructuredSegBar(segsElemCA,segDataCA);
+	    //ssegsElemCA.setAttribute("style","display: block;");
+	}
+	else {
+	    console.warn("svnCAStructuredInit(): allData was null");
+	}
+    }
+}
Index: /gs3-extensions/web-audio/trunk/js-dsp/chroma-transform.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/chroma-transform.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/chroma-transform.js	(revision 28388)
@@ -0,0 +1,380 @@
+
+var ChromaTransform = function(transformMode,frameBufferLength,channels,samplerate,totalNumFrames) {
+
+    this.frameBufferLength = frameBufferLength;
+    this.channels = channels;
+    this.samplerate = samplerate;
+
+    // **** Not currently used 
+    this.totalNumFrames = totalNumFrames;
+
+    this.constantQ = 12;
+    this.numOctaves = 1;
+    this.numChromaBins = this.constantQ * this.numOctaves;
+
+    this.loEdge    = 55.0 * Math.pow(2.0, 2.5/12.0); // low C minus quater tone
+    this.hiEdge    = 8000.0;
+
+    this.transformMode = transformMode;
+
+    var fftWindowSize = Math.floor(frameBufferLength/channels); // check this is a power of 2??
+
+    this.initCQT(fftWindowSize, fftWindowSize/2);
+
+    this.fft = new FFTCustom(fftWindowSize, samplerate);
+
+    this.chromaFeaturesOut = new Float32Array(this.numChromaBins); // Init once here, space is reused per calculation
+    this.filterBankOut = new Float32Array(this.cqt_rec.cqtN);  // ditto above
+
+    this.chromaFeaturesSequence = new Array();
+    this.filterBankSequence = new Array();
+
+    this.maxval = { freqSpectrum: 0.0, freqPowerSpectrum: 0.0, filterBank: 0.0, chromaFeatures: 0.0 };
+
+    this.progress = 0;
+    this.ssm = null;
+
+};
+
+ChromaTransform.prototype.reset = function()
+{
+    this.maxval.freqSpectrum = 0.0;
+    this.maxval.freqPowerSpectrum = 0.0;
+    this.maxval.filterBank = 0.0;
+    this.maxval.chromaFeatures = 0.0;
+}
+
+ChromaTransform.prototype.setTransformMode  = function(transformMode) {
+    this.transformMode = transformMode;
+}
+
+ChromaTransform.prototype.getTransformMode  = function() {
+    return this.transformMode;
+}
+
+ChromaTransform.prototype.setMaxVal = function(v)
+{
+    this.maxval[this.transformMode] = v;
+}
+
+
+ChromaTransform.prototype.getMaxVal = function()
+{
+    var maxVal = this.maxval[this.transformMode];
+
+    return maxVal;
+}
+
+ChromaTransform.prototype.getChromaFeaturesSequence  = function() {
+    return this.chromaFeaturesSequence;
+}
+
+ChromaTransform.prototype.getFilterBankSequence  = function() {
+    return this.filterBankSequence;
+}
+
+//
+// init Constant Q transform (http://en.wikipedia.org/wiki/Constant_Q_transform)
+//
+ChromaTransform.prototype.initCQT  = function(fftN, outN) {
+
+    // Linear to log frequency map for FFT
+    
+    // BPO = bands per octave
+
+    var info_mess = "chroma-transform: { ";
+    info_mess += "constantQ: " + this.constantQ;
+    info_mess += ", fftN = " + fftN;
+    info_mess += ", outN = " + outN;
+    info_mess += ", sameplerate = " + this.samplerate;
+    info_mess += ", loEdge = " + this.loEdge + " Hz"; 
+    info_mess += ", hiEdge = " + this.hiEdge + " Hz";
+    info_mess += " }";
+
+    console.info(info_mess);
+
+    var i,j;
+
+    var BPO = this.constantQ; 
+    var fratio = Math.pow(2.0,1.0/BPO);// Constant-Q bandwidth
+
+    var cqtN =  Math.floor(Math.log(this.hiEdge/this.loEdge)/Math.log(fratio)); 
+    if(cqtN<1) {
+        console.error("cqtN not positive definite");
+    }
+
+    if (_debug) {
+	console.log("debug: cqtN = " + cqtN);
+    }
+
+    var fftfrqs = new Float32Array(outN); // Actual number of real FFT coefficients
+    var logfrqs = new Float32Array(cqtN); // Number of constant-Q spectral bins
+    var logfbws = new Float32Array(cqtN); // Bandwidths of constant-Q bins
+
+    var CQT = new Float32Array(cqtN*outN); // The transformation matrix
+
+    var mxnorm = new Float32Array(cqtN); // Normalization coefficients
+    var N = fftN;     // N used as a (double)
+
+    for(i=0; i < outN; i++) {
+        fftfrqs[i] = i * this.samplerate / N;
+    }
+
+    for(i=0; i<cqtN; i++){
+        logfrqs[i] = this.loEdge * Math.exp(Math.log(2.0)*i/BPO);
+        logfbws[i] = Math.max(logfrqs[i] * (fratio - 1.0), this.samplerate / N);
+    }
+     
+    var ovfctr = 0.5475; // Norm constant so CQT'*CQT close to 1.0
+    var tmp,tmp2;
+    var ptr;
+
+    // Build the constant-Q transform (CQT)
+    for(i=0,ptr=0; i<cqtN; i++){
+        mxnorm[i]=0.0;
+        tmp2=1.0/(ovfctr*logfbws[i]);
+        for(j=0 ; j < outN; j++, ptr++){
+            tmp=(logfrqs[i] - fftfrqs[j])*tmp2;
+            tmp=Math.exp(-0.5*tmp*tmp);
+	    CQT[ptr]=tmp; // row major transform
+            mxnorm[i]+=tmp*tmp;
+        }      
+        mxnorm[i]=2.0*Math.sqrt(mxnorm[i]);
+    }
+
+    // Normalize transform matrix for identity inverse
+    for(i=0,ptr=0; i<cqtN; i++) {
+        tmp = 1.0/mxnorm[i];
+        for(j=0; j<outN; j++,ptr++) {
+	    CQT[ptr] *= tmp;
+	}
+    }
+
+    var cqt_rec = { CQT: CQT, cqtN: cqtN, outN: outN };
+
+    if (_debug) {
+	var CQT  = cqt_rec.CQT;
+	var cqtN = cqt_rec.cqtN;
+	var outN = cqt_rec.outN;
+
+        //for(i=0,ptr=0; i<cqtN; i++){
+        for(i=0,ptr=0; i<cqtN; i+=10){
+	    ptr = i*outN;
+	    var line = "";
+	    //for(j=0; j<outN; j++,ptr++) {
+	    for(j=0; j<outN; j+=20,ptr+=20) {
+		line += CQT[ptr] + " ";
+	    }
+	    console.log(line);
+	}
+    }
+
+    // store it in object
+    this.cqt_rec = cqt_rec;
+
+};
+
+
+ChromaTransform.prototype.computeFilterBank = function(fftSpectrumIn,cqtOut)
+{
+    var CQT  = this.cqt_rec.CQT;
+    var cqtN = this.cqt_rec.cqtN;
+    var outN = this.cqt_rec.outN;
+
+    // matrix product of CQT * fftSpectrumIn
+    
+    var a=cqtN;
+    var i=0;
+
+    while (a--) {
+	cqtOut[i] = 0.0;
+
+        var ptr2 = i * outN;
+        var ptr3 = 0;
+
+        var b = outN;
+        while (b--) {
+
+	    cqtOut[i] += CQT[ptr2] * fftSpectrumIn[ptr3];
+
+	    ptr2++;
+	    ptr3++;
+	}
+
+	if (cqtOut[i]>this.maxval.filterBank) {
+	    this.maxval.filterBank = cqtOut[i];
+	}
+
+	i++;
+    }
+}
+
+ChromaTransform.prototype.computeChroma  = function(cqtIn, chromaOut) {
+
+    // compute CHROMA
+    
+    var cqtN = cqtIn.length;
+
+    var log10 = Math.log(10);
+
+    var a = this.numChromaBins;
+
+    var i=0;
+
+    while(a--){
+        var c = 1;
+
+	// folder higher up octaves into the first one
+	var ptr1_val = 0;
+
+        //for(var b=this.constantQ+i; b<cqtN; b+=this.constantQ){
+        for(var b=i; b<cqtN; b+=this.numChromaBins){
+	    ptr1_val += cqtIn[b];
+            c++;
+        }   
+	ptr1_val /= c; // Normalize by number of bands summed
+
+	// ***** can generate negative values ???
+        //ptr1_val = Math.log( ptr1_val ) / log10;
+
+	chromaOut[i] = ptr1_val;
+
+	if (chromaOut[i]>this.maxval.chromaFeatures) {
+	    this.maxval.chromaFeatures = chromaOut[i];
+	}
+
+        i++;
+    }
+}
+
+ChromaTransform.prototype.computeChromaAlt = function(spectrumIn,chromaOut) {
+
+
+    var CB = chromaOut.length; // num chroma bins
+
+    for (var i=0; i<CB; i++) {
+	chromaOut[i] = 0.0;
+    }
+
+    var CR = 440/32.0;
+    var fs = this.samplerate;
+    var fL = (this.frameBufferLength/this.channels); // **** mod by me
+
+    var log2 = Math.log(2);
+
+    for (var k=this.loEdge; k<=this.hiEdge; k++) {
+        var ind = Math.round(CB*Math.log((k)*fs/fL/CR)/log2);
+        var mod_ind = ind%CB;
+        chromaOut[mod_ind] += spectrumIn[k];
+
+	if (chromaOut[mod_ind]>this.maxval.chromaFeatures) {
+	    this.maxval.chromaFeatures = chromaOut[mod_ind];
+	}
+
+    }
+
+}
+
+
+ChromaTransform.prototype.computeTransform = function(signal) {
+
+    this.fft.forward(signal);
+    
+    this.computeFilterBank(this.fft.powerSpectrum,this.filterBankOut);
+
+    var filterBankCopy = new Float32Array(this.filterBankOut); // need a copy of the array (not just a reference)
+    this.filterBankSequence.push(filterBankCopy); 
+
+    if (_debug) {
+	var line = "";
+	for (i=0; i<this.filterBankOut.length; i+=20) {
+	    line += this.filterBankOut[i] + " ";
+	}
+	 
+	console.log("filter bank: " + line);
+    }
+
+
+    this.computeChroma(this.filterBankOut,this.chromaFeaturesOut);
+
+    //this.computeChromaAlt(this.fft.powerSpectrum,this.chromaFeaturesOut);
+
+    var chromaFeaturesCopy = new Float32Array(this.chromaFeaturesOut); // need a copy of the array (not just a reference)
+    this.chromaFeaturesSequence.push(chromaFeaturesCopy); 
+}
+
+
+
+ChromaTransform.prototype.dotProduct = function(v1,v2) {
+    var vlen = v1.length;
+
+    var d = 0;
+
+    for (var i=0; i<vlen; i++) {
+	d = d + (v1[i]*v2[i]);
+    }
+
+    return d;
+}
+
+ChromaTransform.prototype.vectorLength = function(v) {
+    var vlen = v.length;
+
+    var l = 0.0;
+
+    for (var i=0; i<vlen; i++) {
+	l = l + (v[i]*v[i]);
+    }
+
+    l = Math.sqrt(l);
+
+    return l;
+}
+
+
+ChromaTransform.prototype.computeSelfSimilarityMatrix = function(chromaFeaturesSequence) {
+
+    var num_frames = chromaFeaturesSequence.length;
+
+    var norm_lengths = new Float32Array(num_frames);
+
+    this.csm = new Array(num_frames) ; // chroma (self) similarity matrix
+    for (var i=0; i<num_frames; i++) {
+	this.csm[i] = new Float32Array(num_frames);
+	this.csm[i][i]=1.0;
+
+	norm_lengths[i] = this.vectorLength(chromaFeaturesSequence[i]);
+    }
+
+    
+    var total_calcs = num_frames*num_frames;
+    var c = 0;
+    this.progress = 0;
+
+    var i = 0;
+
+    (function(outerThis) {
+	//for (var i=0; i<num_frames-1; i++) {
+	
+
+	for (var j=i+1; j<num_frames; j++) {
+
+	    outerThis.progress = Math.round((100.0*c)/total_calcs);
+
+	    outerThis.csm[i][j] = outerThis.dotProduct(chromaFeaturesSequence[i],chromaFeaturesSequence[j])/(norm_lengths[i]*norm_lengths[j]);
+
+            outerThis.csm[j][i] = outerThis.csm[i][j];
+	    c+=2;
+	}
+	i++;
+
+	if (i<num_frames-1) {
+	    setTimeout(arguments.callee,0,outerThis);
+	}	 
+	else {
+	    outerThis.progress = 100;
+	}
+    })(this);
+
+
+}
Index: /gs3-extensions/web-audio/trunk/js-dsp/component/active-workflow.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/component/active-workflow.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/component/active-workflow.js	(revision 28388)
@@ -0,0 +1,46 @@
+
+
+/*
+// Create components
+new audioMixerCpt = new AudioMixer(numSamples,channels);
+new windowCpt = new Window();
+new fftMagnitudeCpt = new FFTRealMagnitude();
+
+// Wire them up
+
+windowCpt.setInput("input",audioMixerCpt.getOutput("mixedFrames"));
+fftMagnitudeCpt.setInput("input",audioMixerCpt.getOutput("output"));
+
+*/
+
+
+
+// *******
+// *******
+
+function ActiveWorkflow(transformMode,frameBufferLength,concatLimit,channels,samplerate,totalNumFrames) {
+
+    // Create components
+    var audioMixerCpt   = new AudioMixer(frameBufferLength/channels,channels);
+    var freqSpectrumCpt = new WFFreqSpectrum(frameBufferLength*concatLimit,channels,samplerate,totalNumFrames);
+    var filterBankCpt   = new WFFilterBank(frameBufferLength*concatLimit,channels,samplerate,totalNumFrames);
+    var chromaCpt       = new WFChromaTransform(transformMode,frameBufferLength*concatLimit,channels,samplerate,totalNumFrames);
+    
+    // Wire components up
+    audioMixerCpt.connectOutput("mixedFrames", freqSpectrumCpt, "monoAudioInputFrames");
+    freqSpectrumCpt.connectOutput("freqSpectrumFrames", filterBankCpt, "freqSpectrumInputFrames");
+    filterBankCpt.connectOutput("filterBankFrames", chromaCpt, "inputFrames");
+
+    var that = new Workflow(audioMixerCpt);
+    
+    that.initialize();
+
+    that.audioMixerCpt   = audioMixerCpt;
+    that.freqSpectrumCpt = freqSpectrumCpt;
+    that.filterBankCpt   = filterBankCpt;
+    that.chromaCpt       = chromaCpt;
+
+    return that;
+}
+
+//ActiveWorkflow.swiss(Workflow, 'pumpDataHead');
Index: /gs3-extensions/web-audio/trunk/js-dsp/component/audio-mixer.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/component/audio-mixer.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/component/audio-mixer.js	(revision 28388)
@@ -0,0 +1,241 @@
+
+//var org.greenstone.meandre.audio.util.MixType = {
+
+var MixType = {
+    LeftOnly:     { value: 0, name: "Left only" },
+    RightOnly:    { value: 1, name: "Right only" },
+    LeftRightAdd: { value: 2, name: "Left and Right add" },
+    LeftRightSub: { value: 3, name: "Left and Right subtract" }
+};
+
+
+var AudioMixer = function(numSamples,channels) {
+
+    this.getset = {};
+
+    this.numSamples = numSamples;
+    this.channels = 2;
+
+}
+
+AudioMixer.inherits(Component);
+
+//----------------------------- OVERVIEW -----------------------------------------------------
+
+AudioMixer.staticfield('Component', {
+
+    creator: "David Bainbridge (based on AudioFileRead by Kris West)", 
+
+    description : "Overview: Takes a Signal object with file location metadata as input, "
+	+ "reads in the corresponding audio file and streams out frames of data from that file."
+	+ "Detailed Description: This module reads in audio files in a number of formats,"
+	+ "enframes the data and streams out the frames. Mixing options include: LeftOnly, RightOnly, "
+	+ "LeftRightAdd, LeftRightSub."
+	+ "The frame size, overlap percentage and sample rate of the of the audio frames are appended to"
+	+ "the metadata of the Signal object, which is \'passed through\' for later (optional) use but other components. "
+	+ "The \"Read Frame Size\" parameter can be used to control how often data is read from "
+	+ "disk."
+	+ "Currently supported audio file formats include MP3 (.mp3) and Wave (.wav).",
+
+    name: "Audio Signal Mixer", 
+
+    tags: "signal reader",
+
+    // dependency: [ "foundry-abstracts.jar", "seasr-commons-1.4.9.jar" ]
+});
+
+//------------------------------ INPUTS ------------------------------------------------------
+
+AudioMixer.staticfield('ComponentInputArray', [
+/*
+    {
+	name: "signal",
+	description: "A Signal object with \"fileLocation\" metadata, indicating the " 
+	    + "location of the corresponding audio file."
+    }
+*/
+
+    {
+	name: "rawInput",
+	description: "The raw float32 input from the underlying (decompressed if required) audio file"
+    }
+
+
+]);
+
+
+//------------------------------ PROPERTIES --------------------------------------------------
+
+AudioMixer.staticfield('ComponentPropertyArray', [
+/*
+    {
+	name: "outputFrameLength",
+	defaultValue: "0.023219954648526078",
+	description: "The length of audio frames to output, measured in seconds. This "
+	    + "will be multiplied by the samplerate of the audio file and "
+	    + "rounded to calculate the length in samples of the output "
+	    + "vectors. This ensures that constant time resolution can be "
+	    + "maintained at different sample rates. The default setting (0.023219...) "
+	    + "produces 1024 sample frames at 44.1kHz and 512 at 22.05kHz."
+    },
+
+    {
+	name: "overlapPercent",
+	defaultValue: "0.5", 
+	description: "The percentage to overlap concurrent output frames by (0.0-1.0)"
+    },
+    
+    {
+	name: "mixType",
+	defaultValue: "LeftRightAdd", 
+	description: "Controls how the Signal in should be mix.  Assuming a stero "
+	    + "input, then choices are: LeftOnly, RightOnly, LeftRightAdd, LeftRightSub."
+	    + "In the case of mono input, the signal is passed straight through unchanged."
+    },
+
+
+    {
+	name: "readFrameSize",
+	defaultValue: "102400", 
+	description: "Controls frame size of data read in by this module. If possible, "
+	    + "this frame size will be used by the AudioReader responsible for "
+	    + "the file otherwise buffering will be used to achieve the correct "
+	    + "framesize. This parameter is used to control how often data is "
+	    + "read from disk."
+    },
+    
+    
+    {
+	name: "limitAudioFrames",
+	defaultValue: "false", 
+	description: "Controls whether the number of frames that are output is limited or not."
+    },
+    
+    
+    {
+	name: "maxOutFrames",
+	defaultValue: "10000", 
+	description: "The maxium number of frames to output."
+    }
+*/
+]);
+
+
+//------------------------------ OUTPUTS -----------------------------------------------------
+
+AudioMixer.staticfield('ComponentOutputArray', [
+
+    {
+	name: "mixedFrames",
+	description: "Audio frames that are some combination of left and/or right channels "
+	    + "as set by the mixType property"
+    },
+/*
+    {
+	name: "signal",
+	description: "The Signal Object used to read the file, with"
+	    + " \"frameSize\", \"overlapSize\" and \"sampleRate\" metadata set."
+    }
+*/
+
+]);
+
+AudioMixer.prototype.defaults = function() {
+
+    /** enum representing how the left and right audio in channels are to be treated
+     */
+    getset.mixType = MixType.LeftRightAdd;
+
+    /** The length of audio frames output, measured in seconds. */
+    getset.outputFrameLength = (512.0 / 22050.0);
+
+    /** The desired read frame size. This parameter can be used to adjust the number
+     * of disk accesses per output frame.
+     */
+    getset.readFrameSize = 1024;
+
+    /** The percentage to overlap concurrent frames.
+     */
+    getset.overlapPercent = 0.5;
+
+    /** The maximum number of frames to output.
+     */
+    getset.maxOutFrames = 10000;
+    /** Determines whether number of frames is limited
+     */
+    getset.limitAudioFrames = false;
+
+}
+
+
+AudioMixer.prototype.initializeCallBack = function(ccp) {
+
+    // typeof(ccp) => ComponentContextProperties
+
+    // Put these into ComponentPropertyArray
+
+    this.concatLimit = 8;
+    this.concatCount = 0;
+
+    this.concatSignal = new Float32Array(this.numSamples * this.concatLimit); // mono
+
+}
+
+
+AudioMixer.prototype.executeCallBack = function(cc) {
+    
+    // typeof(cc) => ComponentContext
+    
+    // get the "[D" input
+
+    //console.log("*** AudioMixer::executeCallBack(): away to request 'rawInput'");
+
+    var fb = cc.getDataComponentFromInput("rawInput");
+/*
+    var mess = "";
+    for (var i=0; i<fb.length; i+=200) {
+	mess += fb[i] + ", ";
+    }
+    console.log("**** AudioMixer: data samples = " + mess);
+*/
+
+    // Mix number of channels down to one channel
+
+    var p =0;
+    for (var i=0; i<this.numSamples; i++ ) {
+	
+	var sv  = 0;
+	for (var c=0; c<this.channels; c++) {
+	    sv += fb[p];
+	    p++;
+	}
+	// signal[i] = sv / channels;
+	this.concatSignal[(this.concatCount*this.numSamples)+i] = sv / this.channels;
+    }
+    
+    this.concatCount++;
+
+    //console.log("*** concatCount = " + this.concatCount);
+    //console.log("*** concatLimit = " + this.concatLimit);
+
+    if (this.concatCount==this.concatLimit) {
+	// send this mono-mixed concatenated array on its way
+
+	this.concatCount=0;
+        cc.pushDataComponentToOutput("mixedFrames", this.concatSignal);
+    }
+}
+
+
+AudioMixer.prototype.disposeCallBack = function(ccp) {
+
+    // typeof(ccp) => ComponentContextProperties
+
+    this.concatSignal = null;
+
+}
+
+
+
+
+
Index: /gs3-extensions/web-audio/trunk/js-dsp/component/crockford-inheritance.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/component/crockford-inheritance.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/component/crockford-inheritance.js	(revision 28388)
@@ -0,0 +1,64 @@
+
+
+Function.prototype.getHashCode = (function() {
+    var id = 0;
+    return function() {
+        if (!this["hashCode"]) {
+            this["hashCode"] = "<hash|#" + id++ + ">";
+        }
+        return this["hashCode"];
+    }
+})();
+
+var toType = function(obj) {
+    return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
+};
+
+
+Function.prototype.method = function (name, func) {
+    this.prototype[name] = func;
+    return this;
+};
+
+// Does the same as above, but explicitly rewritten here to provide more meaningful name and (variables)
+Function.prototype.staticfield = function (name, field) {
+    this.prototype[name] = field;
+    return this;
+};
+
+Function.method('inherits', function (parent) {
+    var d = {}, p = (this.prototype = new parent());
+
+    this.method('uber', function uber(name) {
+        if (!(name in d)) {
+            d[name] = 0;
+        }        
+        var f, r, t = d[name], v = parent.prototype;
+        if (t) {
+            while (t) {
+                v = v.constructor.prototype;
+                t -= 1;
+            }
+            f = v[name];
+        } else {
+            f = p[name];
+            if (f == this[name]) {
+                f = v[name];
+            }
+        }
+        d[name] += 1;
+        r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));
+        d[name] -= 1;
+        return r;
+    });
+
+    return this;
+});
+
+Function.method('swiss', function (parent) {
+    for (var i = 1; i < arguments.length; i += 1) {
+        var name = arguments[i];
+        this.prototype[name] = parent.prototype[name];
+    }
+    return this;
+});
Index: /gs3-extensions/web-audio/trunk/js-dsp/component/wf-chroma-transform.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/component/wf-chroma-transform.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/component/wf-chroma-transform.js	(revision 28388)
@@ -0,0 +1,467 @@
+
+var WFChromaTransform = function(transformMode,frameBufferLength,channels,samplerate,totalNumFrames) {
+
+    this.getset = {};
+
+    this.transformMode = transformMode;
+
+    this.frameBufferLength = frameBufferLength;
+    this.channels = channels;
+    this.samplerate = samplerate;
+   
+    this.totalNumFrames = totalNumFrames; // **** Not currently used 
+
+    this.defaults();
+
+    var fftWindowSize = Math.floor(this.frameBufferLength/channels); // check this is a power of 2??
+
+    this.initCQT(fftWindowSize, fftWindowSize/2);
+
+    this.fft = new FFTCustom(fftWindowSize, this.samplerate);
+
+    this.chromaFeaturesOut = new Float32Array(this.numChromaBins); // Init once here, space is reused per calculation
+    this.filterBankOut = new Float32Array(this.cqt_rec.cqtN);  // ditto above
+
+    this.chromaFeaturesSequence = new Array();
+    this.filterBankSequence = new Array();
+
+    this.maxval = { freqSpectrum: 0.0, freqPowerSpectrum: 0.0, filterBank: 0.0, chromaFeatures: 0.0 };
+
+}
+
+WFChromaTransform.inherits(Component);
+
+//----------------------------- OVERVIEW -----------------------------------------------------
+
+WFChromaTransform.staticfield('Component', {
+
+    creator:     "David Bainbridge", 
+    description: "Overview: To be written ...",
+    name:        "Chromagram", 
+    tags:        "signal process, chromagram",
+    dependency: [ "dsp.js" ]
+});
+
+//------------------------------ INPUTS ------------------------------------------------------
+
+WFChromaTransform.staticfield('ComponentInputArray', [
+/*
+    {
+	name: "signal",
+	description: "A Signal object with \"fileLocation\" metadata, indicating the " 
+	    + "location of the corresponding audio file."
+    }
+*/
+    {
+	name: "inputFrames",
+	description: "Frames of mono-audio input"
+    }
+
+]);
+
+
+//------------------------------ PROPERTIES --------------------------------------------------
+
+WFChromaTransform.staticfield('ComponentPropertyArray', [
+
+]);
+
+
+//------------------------------ OUTPUTS -----------------------------------------------------
+
+WFChromaTransform.staticfield('ComponentOutputArray', [
+
+    {
+	name: "output",
+	description: "Chroma bins"
+    }
+]);
+
+
+
+
+WFChromaTransform.prototype.reset = function()
+{
+    this.maxval.freqSpectrum = 0.0;
+    this.maxval.freqPowerSpectrum = 0.0;
+    this.maxval.filterBank = 0.0;
+    this.maxval.chromaFeatures = 0.0;
+}
+
+WFChromaTransform.prototype.setTransformMode  = function(transformMode) {
+    this.transformMode = transformMode;
+}
+
+WFChromaTransform.prototype.getTransformMode  = function() {
+    return this.transformMode;
+}
+
+WFChromaTransform.prototype.setMaxVal = function(v)
+{
+    this.maxval[this.transformMode] = v;
+}
+
+
+WFChromaTransform.prototype.getMaxVal = function()
+{
+    var maxVal = this.maxval[this.transformMode];
+
+    return maxVal;
+}
+
+WFChromaTransform.prototype.getChromaFeaturesSequence  = function() {
+    return this.chromaFeaturesSequence;
+}
+
+WFChromaTransform.prototype.getFilterBankSequence  = function() {
+    return this.filterBankSequence;
+}
+
+
+// ******
+// ******
+
+
+
+WFChromaTransform.prototype.defaults = function() {
+
+    this.constantQ = 12;
+    this.numOctaves = 1;
+    this.numChromaBins = this.constantQ * this.numOctaves;
+
+    this.loEdge    = 55.0 * Math.pow(2.0, 2.5/12.0); // low C minus quater tone
+    this.hiEdge    = 8000.0;
+
+};
+
+
+WFChromaTransform.prototype.initializeCallback = function(ccp) {
+
+
+    this.progress = 0;
+    this.ssm = null;
+}
+
+
+//
+// init Constant Q transform (http://en.wikipedia.org/wiki/Constant_Q_transform)
+//
+WFChromaTransform.prototype.initCQT  = function(fftN, outN) {
+
+    // Linear to log frequency map for FFT
+    
+    // BPO = bands per octave
+
+    var info_mess = "chroma-transform: { ";
+    info_mess += "constantQ: " + this.constantQ;
+    info_mess += ", fftN = " + fftN;
+    info_mess += ", outN = " + outN;
+    info_mess += ", sameplerate = " + this.samplerate;
+    info_mess += ", loEdge = " + this.loEdge + " Hz"; 
+    info_mess += ", hiEdge = " + this.hiEdge + " Hz";
+    info_mess += " }";
+
+    console.info(info_mess);
+
+    var i,j;
+
+    var BPO = this.constantQ; 
+    var fratio = Math.pow(2.0,1.0/BPO);// Constant-Q bandwidth
+
+    var cqtN =  Math.floor(Math.log(this.hiEdge/this.loEdge)/Math.log(fratio)); 
+    if(cqtN<1) {
+        console.error("cqtN not positive definite");
+    }
+
+    if (_dspdebug) {
+	console.log("debug: cqtN = " + cqtN);
+    }
+
+    var fftfrqs = new Float32Array(outN); // Actual number of real FFT coefficients
+    var logfrqs = new Float32Array(cqtN); // Number of constant-Q spectral bins
+    var logfbws = new Float32Array(cqtN); // Bandwidths of constant-Q bins
+
+    var CQT = new Float32Array(cqtN*outN); // The transformation matrix
+
+    var mxnorm = new Float32Array(cqtN); // Normalization coefficients
+    var N = fftN;     // N used as a (double)
+
+    for(i=0; i < outN; i++) {
+        fftfrqs[i] = i * this.samplerate / N;
+    }
+
+    for(i=0; i<cqtN; i++){
+        logfrqs[i] = this.loEdge * Math.exp(Math.log(2.0)*i/BPO);
+        logfbws[i] = Math.max(logfrqs[i] * (fratio - 1.0), this.samplerate / N);
+    }
+     
+    var ovfctr = 0.5475; // Norm constant so CQT'*CQT close to 1.0
+    var tmp,tmp2;
+    var ptr;
+
+    // Build the constant-Q transform (CQT)
+    for(i=0,ptr=0; i<cqtN; i++){
+        mxnorm[i]=0.0;
+        tmp2=1.0/(ovfctr*logfbws[i]);
+        for(j=0 ; j < outN; j++, ptr++){
+            tmp=(logfrqs[i] - fftfrqs[j])*tmp2;
+            tmp=Math.exp(-0.5*tmp*tmp);
+	    CQT[ptr]=tmp; // row major transform
+            mxnorm[i]+=tmp*tmp;
+        }      
+        mxnorm[i]=2.0*Math.sqrt(mxnorm[i]);
+    }
+
+    // Normalize transform matrix for identity inverse
+    for(i=0,ptr=0; i<cqtN; i++) {
+        tmp = 1.0/mxnorm[i];
+        for(j=0; j<outN; j++,ptr++) {
+	    CQT[ptr] *= tmp;
+	}
+    }
+
+    var cqt_rec = { CQT: CQT, cqtN: cqtN, outN: outN };
+
+    if (_dspdebug) {
+	var CQT  = cqt_rec.CQT;
+	var cqtN = cqt_rec.cqtN;
+	var outN = cqt_rec.outN;
+
+        //for(i=0,ptr=0; i<cqtN; i++){
+        for(i=0,ptr=0; i<cqtN; i+=10){
+	    ptr = i*outN;
+	    var line = "";
+	    //for(j=0; j<outN; j++,ptr++) {
+	    for(j=0; j<outN; j+=20,ptr+=20) {
+		line += CQT[ptr] + " ";
+	    }
+	    console.log(line);
+	}
+    }
+
+    // store it in object
+    this.cqt_rec = cqt_rec;
+
+};
+
+
+WFChromaTransform.prototype.computeFilterBank = function(fftSpectrumIn,cqtOut)
+{
+    var CQT  = this.cqt_rec.CQT;
+    var cqtN = this.cqt_rec.cqtN;
+    var outN = this.cqt_rec.outN;
+
+    // matrix product of CQT * fftSpectrumIn
+    
+    var a=cqtN;
+    var i=0;
+
+    while (a--) {
+	cqtOut[i] = 0.0;
+
+        var ptr2 = i * outN;
+        var ptr3 = 0;
+
+        var b = outN;
+        while (b--) {
+
+	    cqtOut[i] += CQT[ptr2] * fftSpectrumIn[ptr3];
+
+	    ptr2++;
+	    ptr3++;
+	}
+
+	if (cqtOut[i]>this.maxval.filterBank) {
+	    this.maxval.filterBank = cqtOut[i];
+	}
+
+	i++;
+    }
+}
+
+WFChromaTransform.prototype.computeChroma  = function(cqtIn, chromaOut) {
+
+    // compute CHROMA
+    
+    var cqtN = cqtIn.length;
+
+    var log10 = Math.log(10);
+
+    var a = this.numChromaBins;
+
+    var i=0;
+
+    while(a--){
+        var c = 1;
+
+	// folder higher up octaves into the first one
+	var ptr1_val = 0;
+
+        //for(var b=this.constantQ+i; b<cqtN; b+=this.constantQ){
+        for(var b=i; b<cqtN; b+=this.numChromaBins){
+	    ptr1_val += cqtIn[b];
+            c++;
+        }   
+	ptr1_val /= c; // Normalize by number of bands summed
+
+	// ***** can generate negative values ???
+        //ptr1_val = Math.log( ptr1_val ) / log10;
+
+	chromaOut[i] = ptr1_val;
+
+	if (chromaOut[i]>this.maxval.chromaFeatures) {
+	    this.maxval.chromaFeatures = chromaOut[i];
+	}
+
+        i++;
+    }
+}
+
+WFChromaTransform.prototype.computeChromaAlt = function(spectrumIn,chromaOut) {
+
+
+    var CB = chromaOut.length; // num chroma bins
+
+    for (var i=0; i<CB; i++) {
+	chromaOut[i] = 0.0;
+    }
+
+    var CR = 440/32.0;
+    var fs = this.samplerate;
+    var fL = (this.frameBufferLength/this.channels); // **** mod by me
+
+    var log2 = Math.log(2);
+
+    for (var k=this.loEdge; k<=this.hiEdge; k++) {
+        var ind = Math.round(CB*Math.log((k)*fs/fL/CR)/log2);
+        var mod_ind = ind%CB;
+        chromaOut[mod_ind] += spectrumIn[k];
+
+	if (chromaOut[mod_ind]>this.maxval.chromaFeatures) {
+	    this.maxval.chromaFeatures = chromaOut[mod_ind];
+	}
+
+    }
+
+}
+
+
+WFChromaTransform.prototype.computeTransform = function(filterBankFrame) {
+
+
+    //this.fft.forward(monoAudioFrame);
+    
+    //this.computeFilterBank(this.fft.powerSpectrum,this.filterBankOut);
+
+    //var filterBankCopy = new Float32Array(this.filterBankOut); // need a copy of the array (not just a reference)
+    //this.filterBankSequence.push(filterBankCopy); 
+
+    this.computeChroma(this.filterBankOut,this.chromaFeaturesOut);
+    //this.computeChromaAlt(this.fft.powerSpectrum,this.chromaFeaturesOut);
+
+    this.computeChroma(filterBankFrame,this.chromaFeaturesOut);
+
+    var chromaFeaturesCopy = new Float32Array(this.chromaFeaturesOut); // need a copy of the array (not just a reference)
+    this.chromaFeaturesSequence.push(chromaFeaturesCopy); 
+}
+
+
+
+WFChromaTransform.prototype.executeCallBack = function(cc) {
+    
+    // typeof(cc) => ComponentContext
+    
+    // get the "[D" input
+
+    //console.info("*** WFChromaTransform::executeCallBack(): away to request 'inputFrames'");
+
+    var frame = cc.getDataComponentFromInput("inputFrames");
+/*
+    var mess = "";
+    for (var i=0; i<frame.length; i+=200) {
+	mess += frame[i] + ", ";
+    }
+    console.log("**** WF Chroma Trans: data samples = " + mess);
+*/
+
+    this.computeTransform(frame);
+}
+
+
+// *********
+// *********
+
+
+WFChromaTransform.prototype.dotProduct = function(v1,v2) {
+    var vlen = v1.length;
+
+    var d = 0;
+
+    for (var i=0; i<vlen; i++) {
+	d = d + (v1[i]*v2[i]);
+    }
+
+    return d;
+}
+
+WFChromaTransform.prototype.vectorLength = function(v) {
+    var vlen = v.length;
+
+    var l = 0.0;
+
+    for (var i=0; i<vlen; i++) {
+	l = l + (v[i]*v[i]);
+    }
+
+    l = Math.sqrt(l);
+
+    return l;
+}
+
+
+WFChromaTransform.prototype.computeSelfSimilarityMatrix = function(chromaFeaturesSequence) {
+
+    var num_frames = chromaFeaturesSequence.length;
+
+    var norm_lengths = new Float32Array(num_frames);
+
+    this.csm = new Array(num_frames) ; // chroma (self) similarity matrix
+    for (var i=0; i<num_frames; i++) {
+	this.csm[i] = new Float32Array(num_frames);
+	this.csm[i][i]=1.0;
+
+	norm_lengths[i] = this.vectorLength(chromaFeaturesSequence[i]);
+    }
+
+    
+    var total_calcs = num_frames*num_frames;
+    var c = 0;
+    this.progress = 0;
+
+    var i = 0;
+
+    (function(outerThis) {
+	//for (var i=0; i<num_frames-1; i++) {
+	
+
+	for (var j=i+1; j<num_frames; j++) {
+
+	    outerThis.progress = Math.round((100.0*c)/total_calcs);
+
+	    outerThis.csm[i][j] = outerThis.dotProduct(chromaFeaturesSequence[i],chromaFeaturesSequence[j])/(norm_lengths[i]*norm_lengths[j]);
+
+            outerThis.csm[j][i] = outerThis.csm[i][j];
+	    c+=2;
+	}
+	i++;
+
+	if (i<num_frames-1) {
+	    setTimeout(arguments.callee,0,outerThis);
+	}	 
+	else {
+	    outerThis.progress = 100;
+	}
+    })(this);
+
+
+}
Index: /gs3-extensions/web-audio/trunk/js-dsp/component/wf-filter-bank.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/component/wf-filter-bank.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/component/wf-filter-bank.js	(revision 28388)
@@ -0,0 +1,293 @@
+
+var WFFilterBank = function(frameBufferLength,channels,samplerate,totalNumFrames) {
+
+    this.frameBufferLength = frameBufferLength;
+    this.channels = channels;
+    this.samplerate = samplerate;
+   
+    this.totalNumFrames = totalNumFrames; // **** Not currently used 
+
+    this.defaults();
+
+    var fftWindowSize = Math.floor(this.frameBufferLength/channels); // check this is a power of 2??
+
+    this.initCQT(fftWindowSize, fftWindowSize/2);
+
+    //this.fft = new FFTCustom(fftWindowSize, this.samplerate);
+
+    this.filterBankOut = new Float32Array(this.cqt_rec.cqtN);  // ditto above
+
+    this.filterBankSequence = new Array();
+
+    this.maxval = 0.0;
+
+}
+
+WFFilterBank.inherits(Component);
+
+//----------------------------- OVERVIEW -----------------------------------------------------
+
+WFFilterBank.staticfield('Component', {
+
+    creator:     "David Bainbridge", 
+    description: "Overview: Computes a frequency filter bank based on frequency spectrum input",
+    name:        "filterBank", 
+    tags:        "signal process, filter-bank",
+    dependency: [ "dsp.js" ]
+});
+
+//------------------------------ INPUTS ------------------------------------------------------
+
+WFFilterBank.staticfield('ComponentInputArray', [
+    {
+	name: "freqSpectrumInputFrames",
+	description: "Frames of (mono) freqency spectrum input"
+    }
+
+]);
+
+
+//------------------------------ PROPERTIES --------------------------------------------------
+
+WFFilterBank.staticfield('ComponentPropertyArray', [
+]);
+
+
+//------------------------------ OUTPUTS -----------------------------------------------------
+
+WFFilterBank.staticfield('ComponentOutputArray', [
+    {
+	name: "filterBankFrames",
+	description: "Per frame filter bank"
+    }
+]);
+
+
+
+WFFilterBank.prototype.reset = function()
+{
+    this.maxval = 0.0;
+}
+
+
+WFFilterBank.prototype.setMaxVal = function(v)
+{
+    this.maxval = v;
+}
+
+
+WFFilterBank.prototype.getMaxVal = function()
+{
+    return this.maxval;
+}
+
+WFFilterBank.prototype.getFilterBankSequence  = function() {
+    return this.filterBankSequence;
+}
+
+
+// ******
+// ******
+
+
+
+WFFilterBank.prototype.defaults = function() {
+
+    this.constantQ = 12;
+
+    this.loEdge    = 55.0 * Math.pow(2.0, 2.5/12.0); // low C minus quater tone
+    this.hiEdge    = 8000.0;
+};
+
+
+WFFilterBank.prototype.initializeCallback = function(ccp) {
+
+}
+
+
+//
+// init Constant Q transform (http://en.wikipedia.org/wiki/Constant_Q_transform)
+//
+WFFilterBank.prototype.initCQT  = function(fftN, outN) {
+
+    // Linear to log frequency map for FFT
+    
+    // BPO = bands per octave
+
+    var info_mess = "filter-bank: { ";
+    info_mess += "constantQ: " + this.constantQ;
+    info_mess += ", fftN = " + fftN;
+    info_mess += ", outN = " + outN;
+    info_mess += ", sameplerate = " + this.samplerate;
+    info_mess += ", loEdge = " + this.loEdge + " Hz"; 
+    info_mess += ", hiEdge = " + this.hiEdge + " Hz";
+    info_mess += " }";
+
+    console.info(info_mess);
+
+    var i,j;
+
+    var BPO = this.constantQ; 
+    var fratio = Math.pow(2.0,1.0/BPO);// Constant-Q bandwidth
+
+    var cqtN =  Math.floor(Math.log(this.hiEdge/this.loEdge)/Math.log(fratio)); 
+    if(cqtN<1) {
+        console.error("cqtN not positive definite");
+    }
+
+    if (_dspdebug) {
+	console.log("debug: cqtN = " + cqtN);
+    }
+
+    var fftfrqs = new Float32Array(outN); // Actual number of real FFT coefficients
+    var logfrqs = new Float32Array(cqtN); // Number of constant-Q spectral bins
+    var logfbws = new Float32Array(cqtN); // Bandwidths of constant-Q bins
+
+    var CQT = new Float32Array(cqtN*outN); // The transformation matrix
+
+    var mxnorm = new Float32Array(cqtN); // Normalization coefficients
+    var N = fftN;     // N used as a (double)
+
+    for(i=0; i < outN; i++) {
+        fftfrqs[i] = i * this.samplerate / N;
+    }
+
+    for(i=0; i<cqtN; i++){
+        logfrqs[i] = this.loEdge * Math.exp(Math.log(2.0)*i/BPO);
+        logfbws[i] = Math.max(logfrqs[i] * (fratio - 1.0), this.samplerate / N);
+    }
+     
+    var ovfctr = 0.5475; // Norm constant so CQT'*CQT close to 1.0
+    var tmp,tmp2;
+    var ptr;
+
+    // Build the constant-Q transform (CQT)
+    for(i=0,ptr=0; i<cqtN; i++){
+        mxnorm[i]=0.0;
+        tmp2=1.0/(ovfctr*logfbws[i]);
+        for(j=0 ; j < outN; j++, ptr++){
+            tmp=(logfrqs[i] - fftfrqs[j])*tmp2;
+            tmp=Math.exp(-0.5*tmp*tmp);
+	    CQT[ptr]=tmp; // row major transform
+            mxnorm[i]+=tmp*tmp;
+        }      
+        mxnorm[i]=2.0*Math.sqrt(mxnorm[i]);
+    }
+
+    // Normalize transform matrix for identity inverse
+    for(i=0,ptr=0; i<cqtN; i++) {
+        tmp = 1.0/mxnorm[i];
+        for(j=0; j<outN; j++,ptr++) {
+	    CQT[ptr] *= tmp;
+	}
+    }
+
+    var cqt_rec = { CQT: CQT, cqtN: cqtN, outN: outN };
+
+    if (_dspdebug) {
+	var CQT  = cqt_rec.CQT;
+	var cqtN = cqt_rec.cqtN;
+	var outN = cqt_rec.outN;
+
+        //for(i=0,ptr=0; i<cqtN; i++){
+        for(i=0,ptr=0; i<cqtN; i+=10){
+	    ptr = i*outN;
+	    var line = "";
+	    //for(j=0; j<outN; j++,ptr++) {
+	    for(j=0; j<outN; j+=20,ptr+=20) {
+		line += CQT[ptr] + " ";
+	    }
+	    console.log(line);
+	}
+    }
+
+    // store it in object
+    this.cqt_rec = cqt_rec;
+
+};
+
+
+WFFilterBank.prototype.computeFilterBank = function(fftSpectrumIn,cqtOut)
+{
+    var CQT  = this.cqt_rec.CQT;
+    var cqtN = this.cqt_rec.cqtN;
+    var outN = this.cqt_rec.outN;
+
+    // matrix product of CQT * fftSpectrumIn
+    
+    var a=cqtN;
+    var i=0;
+
+    while (a--) {
+	cqtOut[i] = 0.0;
+
+        var ptr2 = i * outN;
+        var ptr3 = 0;
+
+        var b = outN;
+        while (b--) {
+
+	    cqtOut[i] += CQT[ptr2] * fftSpectrumIn[ptr3];
+
+	    ptr2++;
+	    ptr3++;
+	}
+
+	if (cqtOut[i]>this.maxval) {
+	    this.maxval = cqtOut[i];
+	}
+
+	i++;
+    }
+}
+
+/*
+WFFilterBank.prototype.computeTransform = function(signal) {
+
+    // executeCallback
+    // need to get signal from 'cc' rather than passed in directly as param
+
+    this.fft.forward(signal);
+    
+    this.computeFilterBank(this.fft.powerSpectrum,this.filterBankOut);
+
+    var filterBankCopy = new Float32Array(this.filterBankOut); // need a copy of the array (not just a reference)
+    this.filterBankSequence.push(filterBankCopy); 
+
+    if (_dspdebug) {
+	var line = "";
+	for (i=0; i<this.filterBankOut.length; i+=20) {
+	    line += this.filterBankOut[i] + " ";
+	}
+	 
+	console.log("filter bank: " + line);
+    }
+
+}
+
+*/
+
+
+WFFilterBank.prototype.executeCallBack = function(cc) {
+    
+    // typeof(cc) => ComponentContext
+    
+    // get the "[D" input
+
+    //console.info("*** WFFilterBank::executeCallBack(): away to request 'inputFrames'");
+
+    var frame = cc.getDataComponentFromInput("freqSpectrumInputFrames");
+
+//    this.fft.forward(frame);
+    
+//    this.computeFilterBank(this.fft.powerSpectrum,this.filterBankOut);
+
+    this.computeFilterBank(frame,this.filterBankOut);
+
+    var filterBankCopy = new Float32Array(this.filterBankOut); // need a copy of the array (not just a reference)
+    this.filterBankSequence.push(filterBankCopy); 
+
+    cc.pushDataComponentToOutput("filterBankFrames",this.filterBankOut);
+
+}
+
Index: /gs3-extensions/web-audio/trunk/js-dsp/component/wf-freq-spectrum.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/component/wf-freq-spectrum.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/component/wf-freq-spectrum.js	(revision 28388)
@@ -0,0 +1,115 @@
+
+var WFFreqSpectrum = function(frameBufferLength,channels,samplerate,totalNumFrames) {
+
+    this.frameBufferLength = frameBufferLength;
+    this.channels = channels;
+    this.samplerate = samplerate;
+   
+    this.totalNumFrames = totalNumFrames; // **** Not currently used 
+
+    this.defaults();
+
+    var fftWindowSize = Math.floor(this.frameBufferLength/channels); // check this is a power of 2??
+
+    this.fft = new FFTCustom(fftWindowSize, this.samplerate);
+
+    this.freqSpectrumSequence = new Array();
+}
+
+WFFreqSpectrum.inherits(Component);
+
+//----------------------------- OVERVIEW -----------------------------------------------------
+
+WFFreqSpectrum.staticfield('Component', {
+
+    creator:     "David Bainbridge", 
+    description: "Overview: Computes the frequency spectrum of the (mono-valued) input frame",
+    name:        "freqSpectrum", 
+    tags:        "signal process, frequency-spectrum",
+    dependency: [ "dsp.js" ]
+});
+
+//------------------------------ INPUTS ------------------------------------------------------
+
+WFFreqSpectrum.staticfield('ComponentInputArray', [
+    {
+	name: "monoAudioInputFrames",
+	description: "Frames of (mono, or stereo down-mixed to mono) audio."
+    }
+
+]);
+
+
+//------------------------------ PROPERTIES --------------------------------------------------
+
+WFFreqSpectrum.staticfield('ComponentPropertyArray', [
+]);
+
+
+//------------------------------ OUTPUTS -----------------------------------------------------
+
+WFFreqSpectrum.staticfield('ComponentOutputArray', [
+    {
+	name: "freqSpectrumFrames",
+	description: "Per frame frequency spectrum (potentially the power spectrum, based on the Component's parameters"
+    }
+]);
+
+
+
+WFFreqSpectrum.prototype.reset = function()
+{
+    this.maxval = 0.0;
+}
+
+
+WFFreqSpectrum.prototype.setMaxVal = function(v)
+{
+    this.maxval = v;
+}
+
+
+WFFreqSpectrum.prototype.getMaxVal = function()
+{
+    var maxVal = this.maxval;
+
+    return maxVal;
+}
+
+WFFreqSpectrum.prototype.getFreqSpectrumSequence  = function() {
+    return this.freqSpectrumSequence;
+}
+
+
+// ******
+// ******
+
+
+
+WFFreqSpectrum.prototype.defaults = function() {
+};
+
+
+WFFreqSpectrum.prototype.initializeCallback = function(ccp) {
+}
+
+
+WFFreqSpectrum.prototype.executeCallBack = function(cc) {
+    
+    // typeof(cc) => ComponentContext
+    
+    // get the "[D" input
+
+    //console.info("*** WFFreqSpectrum::executeCallBack(): away to request 'monoAudioInputFrames'");
+
+    var frame = cc.getDataComponentFromInput("monoAudioInputFrames");
+
+    this.fft.forward(frame);
+    
+    var freqSpectrumCopy = new Float32Array(this.fft.powerSpectrum); // need a copy of the array (not just a reference)
+    this.freqSpectrumSequence.push(freqSpectrumCopy); 
+
+    cc.pushDataComponentToOutput("freqSpectrumFrames",this.fft.powerSpectrum);
+
+}
+
Index: /gs3-extensions/web-audio/trunk/js-dsp/component/window.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/component/window.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/component/window.js	(revision 28388)
@@ -0,0 +1,107 @@
+
+
+// ******
+// Base class elements
+// ******
+
+var Window = function() {
+
+    this.getset = {};
+}
+
+Window.prototype.setProperty = function(p,v) {
+
+    this.getset[p] = v;
+}
+
+Window.prototype.getProperty = function(p) {
+
+    return getset[p];
+}
+
+// ******
+// End of base class elements
+// ******
+
+Window.Component = {   
+
+    creator: "David Bainbridge",
+
+    description: "Overview: This module applies a Hamming window to the input array"
+        + " The input data is not modified.",
+
+    name: "Window",
+    
+    tags: "apply a Hamming window to an array"
+};
+
+AudioMixer.ComponentInputArray = [
+    {
+	description:  "input values(1-D double array)",
+        name:         "input"
+    }
+];
+
+
+AudioMixer.ComponentPropertyArray = [
+
+    {
+	defaultValue: "Hamming",
+        description:  "The name of the window function which can be Rectangular, Bartlett, Blackman, Hanning, Hamming.",
+        name:         "windowName"
+    }
+];
+
+AudioMixer.ComponentOutputArray = [
+ 
+    {
+	description:  "output(1-D double array)",
+        name:         "output"
+    }
+];
+
+
+    /**
+     * Window type to use.
+     */
+    private String WindowName = "Rectangular";
+    private WindowClass theWindow = null;
+    //~--- methods ------------------------------------------------------------
+
+    /**Initialises variables before execution */
+    public void initializeCallback(ComponentContextProperties ccp) {
+        theWindow = new WindowClass(WindowName);
+    }
+
+
+    /**
+     * Applies a specified window to the input array. Currently, four window functions
+     * are implemented. Rectangular, Bartlett, Hanning, and Hamming.
+     *
+     */
+    public void executeCallback(ComponentContext cc)
+            throws ComponentExecutionException, ComponentContextException {
+        
+        WindowName = (String)(cc.getProperty(DATA_PROPERTY));
+        theWindow.setWindowName(WindowName); //reset parameters
+
+        
+        Object input = cc.getDataComponentFromInput(DATA_INPUT);
+        if (input instanceof StreamTerminator){
+            cc.pushDataComponentToOutput(DATA_OUTPUT, input);
+        }else{
+            double[] double1DArray = (double[])(input);
+
+	    // Actually doing rectangular here !!!
+
+            double[] output = theWindow.applyWindow(double1DArray);
+
+            cc.pushDataComponentToOutput(DATA_OUTPUT, output);
+            
+            
+        }
+    }
+
+    public void dispose(ComponentContextProperties ccp) {}
+
+}
Index: /gs3-extensions/web-audio/trunk/js-dsp/component/workflow-core.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/component/workflow-core.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/component/workflow-core.js	(revision 28388)
@@ -0,0 +1,267 @@
+
+
+// ******
+// 'Component.java' helper enums
+// ******
+
+
+var FiringPolicy = {
+    all: 0,
+    any: 1
+};
+
+var Licenses = {
+    UofINCSA: 0, 
+    ASL_2: 1, 
+    Other: 2
+};
+
+var Runnable = {
+    java: 0,
+    python: 1,
+    lisp: 2,
+    javascript: 3 // **** extension for OeRC work
+};
+
+
+// ******
+// StringSerminator
+// ******
+
+var StringTerminator = function() {
+    this.type = "terminator";
+}
+
+StringTerminator.isStreamTerminator = function (obj) {
+    
+    return ((obj.type!=null) && (obj.type == "terminator"));
+}
+
+
+// ******
+// ComponentContext
+// ******
+
+
+var Component = function() {
+    this.outputConnector = {};
+    this.outputConnectorInputName = {};
+}
+
+Component.method('connectOutput', function(outputName, inputCpt, inputCptName) {
+    
+    this.outputConnector[outputName] = inputCpt;
+    this.outputConnectorInputName[outputName] = inputCptName;
+
+});
+
+
+Component.method('setProperty', function(p,v) {
+
+    this.getset[p] = v;
+});
+
+
+Component.method('getProperty', function(p) {
+
+    return getset[p];
+});
+
+
+
+
+// ******
+// ComponentContext
+// ******
+
+
+var _wfcPushDataCount = 0;
+
+var ComponentContext = function(component) {
+    this.component = component;
+    this.outputConnectorContext = {};
+
+    
+    var cia = this.component.ComponentInputArray;
+    var cia_len = cia.length;
+
+    // Create an input set with all ComponentInputs set to null
+    var input_set = {};
+
+    for (var i=0; i<cia_len; i++) {
+
+	input_set[name] = null;
+    }
+
+    this.inputSet = input_set;
+
+    // now work through all the components linked through 'outputConnectors'
+    // and recursively set up ComponentContexts for these as well
+
+    for (var output_name in component.outputConnector) {
+	
+	var next_cpt = component.outputConnector[output_name];
+	this.outputConnectorContext[output_name] = new ComponentContext(next_cpt)
+    }
+}
+
+
+ComponentContext.prototype.findComponent = function(ca,name) {
+
+    var ca_len = ca.length;
+
+    var c = null;
+
+    for (var i=0; i<ca_len; i++) {
+	if (ca[i].name == name) {
+	    c = ca[i];
+	}
+    }
+
+    return c;
+}
+
+
+
+ComponentContext.prototype.getDataComponentFromInput = function(name) {
+
+    var ci = this.findComponent(this.component.ComponentInputArray,name);
+
+    //console.log("*** getData input: name = " + name + " cpt type = " + Object.prototype.toString.call(this.component));
+
+    if (ci==null) {
+	// requested name does not exist
+	throw "getDataComponentFromInput(): Input name '" + name + " 'is not defined for this '" 
+	    + Object.prototype.toString.call(this.component) + "' component";
+    }
+    
+    var ci_data = this.inputSet[name]; // note: might be null if input 'name' has not yet arrived
+
+    return ci_data;
+}
+
+
+
+ComponentContext.prototype.pushDataComponentToOutput = function(name, obj) {
+
+    if ((_wfcPushDataCount%500)==0) {
+	console.log("workflow-core::pushDataComponentToOutput() count: " + _wfcPushDataCount);
+    }
+    _wfcPushDataCount++;
+
+    var co = this.findComponent(this.component.ComponentOutputArray,name);
+
+    if (co==null) {
+	// requested name does not exist
+	throw "pushDataComponentToOutput(): Output name '" + name + " 'is not defined for '"
+	    + toType(this.component) + "' component";
+    }
+
+
+    // retrieve the destination Cpt specified by 'name' and its CC
+
+    var next_cpt = this.component.outputConnector[name];
+    var next_input_name = this.component.outputConnectorInputName[name];
+
+    var next_cc = this.outputConnectorContext[name]; 
+
+    var next_input_set = next_cc.inputSet;
+
+    if (next_input_set[name] != null) {
+	throw "pushDataComponentToOutput(): Input for '" + next_input_name + "' already exists";
+    }
+
+    next_input_set[next_input_name] = obj;
+
+    // Now see if the component's executeCallBack method is due to be fired
+
+    var fire_exec = true;
+
+    var firing_policy = next_cpt.firingPolicy;
+
+    //console.log("*** firing policy = " + firing_policy);
+
+    if ((firing_policy!=null) && (firing_policy == FiringPolicy.all)) {
+	
+	for (var k in next_input_set) {
+	    if (next_input_set[k] == null) {
+		// evidence that all inputs are not there yet
+		fire_exec = false;
+		break;
+	    }
+	}
+    }
+
+    if (fire_exec) {
+	// console.log("**** Away to call  executCallback");
+
+	next_cpt.executeCallBack(next_cc);
+    }
+}
+
+
+// ******
+// Workflow
+// ******
+
+var Workflow = function(startingComponent) {
+    this.startingComponent = startingComponent;
+
+    var unique_list   = [ startingComponent ];
+    var working_queue = [ startingComponent ];
+
+    var visited_cpt   = {};
+    visited_cpt[startingComponent.getHashCode] = true;
+
+    while (working_queue.length>0) {
+	var curr_cpt = working_queue.shift();
+	
+	curr_cpt.initializeCallBack();
+	
+	for (var outputName in this.outputConnector) {
+	    
+	    var next_cpt = this.outputConnector[outputName];
+	    var next_cpt_hashCode = next_cpt.getHashCode;
+
+	    if (!visited_cpt[next_cpt_hashCode]) {
+		// haven't seen it before
+		// => record as seen, and push on queue
+
+
+		visited_cpt[next_cpt_hashCode] = true;
+		working_queue.push(next_cpt);
+	    }	    
+	}
+    }
+
+
+    this.uniqueCptList = unique_list;
+
+}
+
+Workflow.prototype.initialize = function() {
+
+    for (var i=0; i<this.uniqueCptList.length; i++) {
+	var curr_cpt = this.uniqueCptList[i];
+	curr_cpt.initializeCallBack();
+    }
+};
+
+
+Workflow.prototype.pumpDataHead = function(name,data) {
+
+    var cc = new ComponentContext(this.startingComponent);
+    cc.inputSet[name] = data;
+
+    this.startingComponent.executeCallBack(cc);
+};
+
+
+Workflow.prototype.dispose = function() {
+
+    for (var i=0; i<this.uniqueCptList.length; i++) {
+	var curr_cpt = this.uniqueCptList[i];
+	curr_cpt.disposeCallBack();
+    }
+};
+
Index: /gs3-extensions/web-audio/trunk/js-dsp/dsp-custom.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/dsp-custom.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/dsp-custom.js	(revision 28388)
@@ -0,0 +1,122 @@
+
+
+// FFT based on dsp.js
+
+// 1. Cutdown to just what is needed
+// 2. Messed around with => added in array for the powerSpectrum
+
+
+var FFTCustom = function(bufferSize, sampleRate) {
+    this.bufferSize   = bufferSize;
+    this.sampleRate   = sampleRate;
+    this.powerSpectrum  = new Float32Array(bufferSize/2);
+    this.spectrum       = new Float32Array(bufferSize/2);
+    this.real         = new Float32Array(bufferSize);
+    this.imag         = new Float32Array(bufferSize);
+    this.reverseTable = new Uint32Array(bufferSize);
+    this.sinTable     = new Float32Array(bufferSize);
+    this.cosTable     = new Float32Array(bufferSize);
+    
+    var limit = 1,
+    bit = bufferSize >> 1;
+
+    while ( limit < bufferSize ) {
+        for ( var i = 0; i < limit; i++ ) {
+            this.reverseTable[i + limit] = this.reverseTable[i] + bit;
+        }
+
+        limit = limit << 1;
+        bit = bit >> 1;
+    }
+
+    for ( var i = 0; i < bufferSize; i++ ) {
+        this.sinTable[i] = Math.sin(-Math.PI/i);
+        this.cosTable[i] = Math.cos(-Math.PI/i);
+    }
+};
+
+FFTCustom.prototype.forward = function(buffer) {
+    var bufferSize   = this.bufferSize,
+    cosTable     = this.cosTable,
+    sinTable     = this.sinTable,
+    reverseTable = this.reverseTable,
+    real         = this.real,
+    imag         = this.imag,
+    spectrum          = this.spectrum;
+    powerSpectrum     = this.powerSpectrum;
+
+    if ( bufferSize !== buffer.length ) {
+        throw "Supplied buffer is not the same size as defined FFT. FFT Size: " + bufferSize + " Buffer Size: " + buffer.length;
+    }
+
+    if (_dspdebug) {
+	var line = "sample: [";
+	for (var ii=0; ii<500; ii+=100) {
+	    line += buffer[ii] + " ";
+	}
+	line += "]";
+	console.log(line);
+    }
+
+    for ( var i = 0; i < bufferSize; i++ ) {
+        real[i] = buffer[reverseTable[i]];
+        imag[i] = 0;
+    }
+
+    var halfSize = 1,
+    phaseShiftStepReal,	
+    phaseShiftStepImag,
+    currentPhaseShiftReal,
+    currentPhaseShiftImag,
+    off,
+    tr,
+    ti,
+    tmpReal,	
+    i;
+
+    while ( halfSize < bufferSize ) {
+        phaseShiftStepReal = cosTable[halfSize];
+        phaseShiftStepImag = sinTable[halfSize];
+        currentPhaseShiftReal = 1.0;
+        currentPhaseShiftImag = 0.0;
+
+        for ( var fftStep = 0; fftStep < halfSize; fftStep++ ) {
+            i = fftStep;
+
+            while ( i < bufferSize ) {
+		off = i + halfSize;
+		tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);
+		ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);
+
+		real[off] = real[i] - tr;
+		imag[off] = imag[i] - ti;
+		real[i] += tr;
+		imag[i] += ti;
+
+		i += halfSize << 1;
+            }
+
+            tmpReal = currentPhaseShiftReal;
+            currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);
+            currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);
+        }
+
+        halfSize = halfSize << 1;
+    }
+
+    i = bufferSize/2;
+    while(i--) {
+        spectrum[i] = 2 * Math.sqrt(real[i] * real[i] + imag[i] * imag[i]) / bufferSize;
+        powerSpectrum[i] = 2 * (real[i] * real[i] + imag[i] * imag[i]) / bufferSize; // done to match fftExtract
+    }
+
+    
+    if (_dspdebug) {
+	for (i=0; i<bufferSize/2; i+=80) {
+	    console.log("{re: " + real[i] + ", im:" + imag[i] + "}");
+	}
+	console.log("-----");
+    }
+
+};
+
Index: /gs3-extensions/web-audio/trunk/js-dsp/dsp.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/dsp.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/dsp.js	(revision 28388)
@@ -0,0 +1,2302 @@
+/* 
+ *  DSP.js - a comprehensive digital signal processing  library for javascript
+ * 
+ *  Created by Corban Brook <corbanbrook@gmail.com> on 2010-01-01.
+ *  Copyright 2010 Corban Brook. All rights reserved.
+ *
+ */
+
+////////////////////////////////////////////////////////////////////////////////
+//                                  CONSTANTS                                 //
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * DSP is an object which contains general purpose utility functions and constants
+ */
+var DSP = {
+  // Channels
+  LEFT:           0,
+  RIGHT:          1,
+  MIX:            2,
+
+  // Waveforms
+  SINE:           1,
+  TRIANGLE:       2,
+  SAW:            3,
+  SQUARE:         4,
+
+  // Filters
+  LOWPASS:        0,
+  HIGHPASS:       1,
+  BANDPASS:       2,
+  NOTCH:          3,
+
+  // Window functions
+  BARTLETT:       1,
+  BARTLETTHANN:   2,
+  BLACKMAN:       3,
+  COSINE:         4,
+  GAUSS:          5,
+  HAMMING:        6,
+  HANN:           7,
+  LANCZOS:        8,
+  RECTANGULAR:    9,
+  TRIANGULAR:     10,
+
+  // Loop modes
+  OFF:            0,
+  FW:             1,
+  BW:             2,
+  FWBW:           3,
+
+  // Math
+  TWO_PI:         2*Math.PI
+};
+
+// Setup arrays for platforms which do not support byte arrays
+function setupTypedArray(name, fallback) {
+  // check if TypedArray exists
+  // typeof on Minefield and Chrome return function, typeof on Webkit returns object.
+  if (typeof this[name] !== "function" && typeof this[name] !== "object") {
+    // nope.. check if WebGLArray exists
+    if (typeof this[fallback] === "function" && typeof this[fallback] !== "object") {
+      this[name] = this[fallback];
+    } else {
+      // nope.. set as Native JS array
+      this[name] = function(obj) {
+        if (obj instanceof Array) {
+          return obj;
+        } else if (typeof obj === "number") {
+          return new Array(obj);
+        }
+      };
+    }
+  }
+}
+
+setupTypedArray("Float32Array", "WebGLFloatArray");
+setupTypedArray("Int32Array",   "WebGLIntArray");
+setupTypedArray("Uint16Array",  "WebGLUnsignedShortArray");
+setupTypedArray("Uint8Array",   "WebGLUnsignedByteArray");
+
+
+////////////////////////////////////////////////////////////////////////////////
+//                            DSP UTILITY FUNCTIONS                           //
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Inverts the phase of a signal
+ *
+ * @param {Array} buffer A sample buffer
+ *
+ * @returns The inverted sample buffer
+ */
+DSP.invert = function(buffer) {
+  for (var i = 0, len = buffer.length; i < len; i++) {
+    buffer[i] *= -1;
+  }
+
+  return buffer;
+};
+
+/**
+ * Converts split-stereo (dual mono) sample buffers into a stereo interleaved sample buffer
+ *
+ * @param {Array} left  A sample buffer
+ * @param {Array} right A sample buffer
+ *
+ * @returns The stereo interleaved buffer
+ */
+DSP.interleave = function(left, right) {
+  if (left.length !== right.length) {
+    throw "Can not interleave. Channel lengths differ.";
+  }
+ 
+  var stereoInterleaved = new Float32Array(left.length * 2);
+ 
+  for (var i = 0, len = left.length; i < len; i++) {
+    stereoInterleaved[2*i]   = left[i];
+    stereoInterleaved[2*i+1] = right[i];
+  }
+ 
+  return stereoInterleaved;
+};
+
+/**
+ * Converts a stereo-interleaved sample buffer into split-stereo (dual mono) sample buffers
+ *
+ * @param {Array} buffer A stereo-interleaved sample buffer
+ *
+ * @returns an Array containing left and right channels
+ */
+DSP.deinterleave = (function() {
+  var left, right, mix, deinterleaveChannel = []; 
+
+  deinterleaveChannel[DSP.MIX] = function(buffer) {
+    for (var i = 0, len = buffer.length/2; i < len; i++) {
+      mix[i] = (buffer[2*i] + buffer[2*i+1]) / 2;
+    }
+    return mix;
+  };
+
+  deinterleaveChannel[DSP.LEFT] = function(buffer) {
+    for (var i = 0, len = buffer.length/2; i < len; i++) {
+      left[i]  = buffer[2*i];
+    }
+    return left;
+  };
+
+  deinterleaveChannel[DSP.RIGHT] = function(buffer) {
+    for (var i = 0, len = buffer.length/2; i < len; i++) {
+      right[i]  = buffer[2*i+1];
+    }
+    return right;
+  };
+
+  return function(channel, buffer) { 
+    left  = left  || new Float32Array(buffer.length/2);
+    right = right || new Float32Array(buffer.length/2);
+    mix   = mix   || new Float32Array(buffer.length/2);
+
+    if (buffer.length/2 !== left.length) {
+      left  = new Float32Array(buffer.length/2);
+      right = new Float32Array(buffer.length/2);
+      mix   = new Float32Array(buffer.length/2);
+    }
+
+    return deinterleaveChannel[channel](buffer);
+  };
+}());
+
+/**
+ * Separates a channel from a stereo-interleaved sample buffer
+ *
+ * @param {Array}  buffer A stereo-interleaved sample buffer
+ * @param {Number} channel A channel constant (LEFT, RIGHT, MIX)
+ *
+ * @returns an Array containing a signal mono sample buffer
+ */
+DSP.getChannel = DSP.deinterleave;
+
+/**
+ * Helper method (for Reverb) to mix two (interleaved) samplebuffers. It's possible
+ * to negate the second buffer while mixing and to perform a volume correction
+ * on the final signal.
+ *
+ * @param {Array} sampleBuffer1 Array containing Float values or a Float32Array
+ * @param {Array} sampleBuffer2 Array containing Float values or a Float32Array
+ * @param {Boolean} negate When true inverts/flips the audio signal
+ * @param {Number} volumeCorrection When you add multiple sample buffers, use this to tame your signal ;)
+ *
+ * @returns A new Float32Array interleaved buffer.
+ */
+DSP.mixSampleBuffers = function(sampleBuffer1, sampleBuffer2, negate, volumeCorrection){
+  var outputSamples = new Float32Array(sampleBuffer1);
+
+  for(var i = 0; i<sampleBuffer1.length; i++){
+    outputSamples[i] += (negate ? -sampleBuffer2[i] : sampleBuffer2[i]) / volumeCorrection;
+  }
+ 
+  return outputSamples;
+}; 
+
+// Biquad filter types
+DSP.LPF = 0;                // H(s) = 1 / (s^2 + s/Q + 1)
+DSP.HPF = 1;                // H(s) = s^2 / (s^2 + s/Q + 1)
+DSP.BPF_CONSTANT_SKIRT = 2; // H(s) = s / (s^2 + s/Q + 1)  (constant skirt gain, peak gain = Q)
+DSP.BPF_CONSTANT_PEAK = 3;  // H(s) = (s/Q) / (s^2 + s/Q + 1)      (constant 0 dB peak gain)
+DSP.NOTCH = 4;              // H(s) = (s^2 + 1) / (s^2 + s/Q + 1)
+DSP.APF = 5;                // H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)
+DSP.PEAKING_EQ = 6;         // H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)
+DSP.LOW_SHELF = 7;          // H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1)
+DSP.HIGH_SHELF = 8;         // H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A)
+
+// Biquad filter parameter types
+DSP.Q = 1;
+DSP.BW = 2; // SHARED with BACKWARDS LOOP MODE
+DSP.S = 3;
+
+// Find RMS of signal
+DSP.RMS = function(buffer) {
+  var total = 0;
+  
+  for (var i = 0, n = buffer.length; i < n; i++) {
+    total += buffer[i] * buffer[i];
+  }
+  
+  return Math.sqrt(total / n);
+};
+
+// Find Peak of signal
+DSP.Peak = function(buffer) {
+  var peak = 0;
+  
+  for (var i = 0, n = buffer.length; i < n; i++) {
+    peak = (Math.abs(buffer[i]) > peak) ? Math.abs(buffer[i]) : peak; 
+  }
+  
+  return peak;
+};
+
+// Fourier Transform Module used by DFT, FFT, RFFT
+function FourierTransform(bufferSize, sampleRate) {
+  this.bufferSize = bufferSize;
+  this.sampleRate = sampleRate;
+  this.bandwidth  = 2 / bufferSize * sampleRate / 2;
+
+  this.spectrum   = new Float32Array(bufferSize/2);
+  this.real       = new Float32Array(bufferSize);
+  this.imag       = new Float32Array(bufferSize);
+
+  this.peakBand   = 0;
+  this.peak       = 0;
+
+  /**
+   * Calculates the *middle* frequency of an FFT band.
+   *
+   * @param {Number} index The index of the FFT band.
+   *
+   * @returns The middle frequency in Hz.
+   */
+  this.getBandFrequency = function(index) {
+    return this.bandwidth * index + this.bandwidth / 2;
+  };
+
+  this.calculateSpectrum = function() {
+    var spectrum  = this.spectrum,
+        real      = this.real,
+        imag      = this.imag,
+        bSi       = 2 / this.bufferSize,
+        sqrt      = Math.sqrt,
+        rval, 
+        ival,
+        mag;
+
+    for (var i = 0, N = bufferSize/2; i < N; i++) {
+      rval = real[i];
+      ival = imag[i];
+      mag = bSi * sqrt(rval * rval + ival * ival);
+
+      if (mag > this.peak) {
+        this.peakBand = i;
+        this.peak = mag;
+      }
+
+      spectrum[i] = mag;
+    }
+  };
+}
+
+/**
+ * DFT is a class for calculating the Discrete Fourier Transform of a signal.
+ *
+ * @param {Number} bufferSize The size of the sample buffer to be computed
+ * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)
+ *
+ * @constructor
+ */
+function DFT(bufferSize, sampleRate) {
+  FourierTransform.call(this, bufferSize, sampleRate);
+
+  var N = bufferSize/2 * bufferSize;
+  var TWO_PI = 2 * Math.PI;
+
+  this.sinTable = new Float32Array(N);
+  this.cosTable = new Float32Array(N);
+
+  for (var i = 0; i < N; i++) {
+    this.sinTable[i] = Math.sin(i * TWO_PI / bufferSize);
+    this.cosTable[i] = Math.cos(i * TWO_PI / bufferSize);
+  }
+}
+
+/**
+ * Performs a forward transform on the sample buffer.
+ * Converts a time domain signal to frequency domain spectra.
+ *
+ * @param {Array} buffer The sample buffer
+ *
+ * @returns The frequency spectrum array
+ */
+DFT.prototype.forward = function(buffer) {
+  var real = this.real, 
+      imag = this.imag,
+      rval,
+      ival;
+
+  for (var k = 0; k < this.bufferSize/2; k++) {
+    rval = 0.0;
+    ival = 0.0;
+
+    for (var n = 0; n < buffer.length; n++) {
+      rval += this.cosTable[k*n] * buffer[n];
+      ival += this.sinTable[k*n] * buffer[n];
+    }
+
+    real[k] = rval;
+    imag[k] = ival;
+  }
+
+  return this.calculateSpectrum();
+};
+
+
+/**
+ * FFT is a class for calculating the Discrete Fourier Transform of a signal
+ * with the Fast Fourier Transform algorithm.
+ *
+ * @param {Number} bufferSize The size of the sample buffer to be computed. Must be power of 2
+ * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)
+ *
+ * @constructor
+ */
+function FFT(bufferSize, sampleRate) {
+  FourierTransform.call(this, bufferSize, sampleRate);
+   
+  this.reverseTable = new Uint32Array(bufferSize);
+
+  var limit = 1;
+  var bit = bufferSize >> 1;
+
+  var i;
+
+  while (limit < bufferSize) {
+    for (i = 0; i < limit; i++) {
+      this.reverseTable[i + limit] = this.reverseTable[i] + bit;
+    }
+
+    limit = limit << 1;
+    bit = bit >> 1;
+  }
+
+  this.sinTable = new Float32Array(bufferSize);
+  this.cosTable = new Float32Array(bufferSize);
+
+  for (i = 0; i < bufferSize; i++) {
+    this.sinTable[i] = Math.sin(-Math.PI/i);
+    this.cosTable[i] = Math.cos(-Math.PI/i);
+  }
+}
+
+/**
+ * Performs a forward transform on the sample buffer.
+ * Converts a time domain signal to frequency domain spectra.
+ *
+ * @param {Array} buffer The sample buffer. Buffer Length must be power of 2
+ *
+ * @returns The frequency spectrum array
+ */
+FFT.prototype.forward = function(buffer) {
+  // Locally scope variables for speed up
+  var bufferSize      = this.bufferSize,
+      cosTable        = this.cosTable,
+      sinTable        = this.sinTable,
+      reverseTable    = this.reverseTable,
+      real            = this.real,
+      imag            = this.imag,
+      spectrum        = this.spectrum;
+
+  var k = Math.floor(Math.log(bufferSize) / Math.LN2);
+
+  if (Math.pow(2, k) !== bufferSize) { throw "Invalid buffer size, must be a power of 2."; }
+  if (bufferSize !== buffer.length)  { throw "Supplied buffer is not the same size as defined FFT. FFT Size: " + bufferSize + " Buffer Size: " + buffer.length; }
+
+  var halfSize = 1,
+      phaseShiftStepReal,
+      phaseShiftStepImag,
+      currentPhaseShiftReal,
+      currentPhaseShiftImag,
+      off,
+      tr,
+      ti,
+      tmpReal,
+      i;
+
+  for (i = 0; i < bufferSize; i++) {
+    real[i] = buffer[reverseTable[i]];
+    imag[i] = 0;
+  }
+
+  while (halfSize < bufferSize) {
+    //phaseShiftStepReal = Math.cos(-Math.PI/halfSize);
+    //phaseShiftStepImag = Math.sin(-Math.PI/halfSize);
+    phaseShiftStepReal = cosTable[halfSize];
+    phaseShiftStepImag = sinTable[halfSize];
+    
+    currentPhaseShiftReal = 1;
+    currentPhaseShiftImag = 0;
+
+    for (var fftStep = 0; fftStep < halfSize; fftStep++) {
+      i = fftStep;
+
+      while (i < bufferSize) {
+        off = i + halfSize;
+        tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);
+        ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);
+
+        real[off] = real[i] - tr;
+        imag[off] = imag[i] - ti;
+        real[i] += tr;
+        imag[i] += ti;
+
+        i += halfSize << 1;
+      }
+
+      tmpReal = currentPhaseShiftReal;
+      currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);
+      currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);
+    }
+
+    halfSize = halfSize << 1;
+  }
+
+  return this.calculateSpectrum();
+};
+
+FFT.prototype.inverse = function(real, imag) {
+  // Locally scope variables for speed up
+  var bufferSize      = this.bufferSize,
+      cosTable        = this.cosTable,
+      sinTable        = this.sinTable,
+      reverseTable    = this.reverseTable,
+      spectrum        = this.spectrum;
+     
+      real = real || this.real;
+      imag = imag || this.imag;
+
+  var halfSize = 1,
+      phaseShiftStepReal,
+      phaseShiftStepImag,
+      currentPhaseShiftReal,
+      currentPhaseShiftImag,
+      off,
+      tr,
+      ti,
+      tmpReal,
+      i;
+
+  for (i = 0; i < bufferSize; i++) {
+    imag[i] *= -1;
+  }
+
+  var revReal = new Float32Array(bufferSize);
+  var revImag = new Float32Array(bufferSize);
+ 
+  for (i = 0; i < real.length; i++) {
+    revReal[i] = real[reverseTable[i]];
+    revImag[i] = imag[reverseTable[i]];
+  }
+ 
+  real = revReal;
+  imag = revImag;
+
+  while (halfSize < bufferSize) {
+    phaseShiftStepReal = cosTable[halfSize];
+    phaseShiftStepImag = sinTable[halfSize];
+    currentPhaseShiftReal = 1;
+    currentPhaseShiftImag = 0;
+
+    for (var fftStep = 0; fftStep < halfSize; fftStep++) {
+      i = fftStep;
+
+      while (i < bufferSize) {
+        off = i + halfSize;
+        tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);
+        ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);
+
+        real[off] = real[i] - tr;
+        imag[off] = imag[i] - ti;
+        real[i] += tr;
+        imag[i] += ti;
+
+        i += halfSize << 1;
+      }
+
+      tmpReal = currentPhaseShiftReal;
+      currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);
+      currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);
+    }
+
+    halfSize = halfSize << 1;
+  }
+
+  var buffer = new Float32Array(bufferSize); // this should be reused instead
+  for (i = 0; i < bufferSize; i++) {
+    buffer[i] = real[i] / bufferSize;
+  }
+
+  return buffer;
+};
+
+/**
+ * RFFT is a class for calculating the Discrete Fourier Transform of a signal
+ * with the Fast Fourier Transform algorithm.
+ *
+ * This method currently only contains a forward transform but is highly optimized.
+ *
+ * @param {Number} bufferSize The size of the sample buffer to be computed. Must be power of 2
+ * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)
+ *
+ * @constructor
+ */
+
+// lookup tables don't really gain us any speed, but they do increase
+// cache footprint, so don't use them in here
+
+// also we don't use sepearate arrays for real/imaginary parts
+
+// this one a little more than twice as fast as the one in FFT
+// however I only did the forward transform
+
+// the rest of this was translated from C, see http://www.jjj.de/fxt/
+// this is the real split radix FFT
+
+function RFFT(bufferSize, sampleRate) {
+  FourierTransform.call(this, bufferSize, sampleRate);
+
+  this.trans = new Float32Array(bufferSize);
+
+  this.reverseTable = new Uint32Array(bufferSize);
+
+  // don't use a lookup table to do the permute, use this instead
+  this.reverseBinPermute = function (dest, source) {
+    var bufferSize  = this.bufferSize, 
+        halfSize    = bufferSize >>> 1, 
+        nm1         = bufferSize - 1, 
+        i = 1, r = 0, h;
+
+    dest[0] = source[0];
+
+    do {
+      r += halfSize;
+      dest[i] = source[r];
+      dest[r] = source[i];
+      
+      i++;
+
+      h = halfSize << 1;
+      while (h = h >> 1, !((r ^= h) & h));
+
+      if (r >= i) { 
+        dest[i]     = source[r]; 
+        dest[r]     = source[i];
+
+        dest[nm1-i] = source[nm1-r]; 
+        dest[nm1-r] = source[nm1-i];
+      }
+      i++;
+    } while (i < halfSize);
+    dest[nm1] = source[nm1];
+  };
+
+  this.generateReverseTable = function () {
+    var bufferSize  = this.bufferSize, 
+        halfSize    = bufferSize >>> 1, 
+        nm1         = bufferSize - 1, 
+        i = 1, r = 0, h;
+
+    this.reverseTable[0] = 0;
+
+    do {
+      r += halfSize;
+      
+      this.reverseTable[i] = r;
+      this.reverseTable[r] = i;
+
+      i++;
+
+      h = halfSize << 1;
+      while (h = h >> 1, !((r ^= h) & h));
+
+      if (r >= i) { 
+        this.reverseTable[i] = r;
+        this.reverseTable[r] = i;
+
+        this.reverseTable[nm1-i] = nm1-r;
+        this.reverseTable[nm1-r] = nm1-i;
+      }
+      i++;
+    } while (i < halfSize);
+
+    this.reverseTable[nm1] = nm1;
+  };
+
+  this.generateReverseTable();
+}
+
+
+// Ordering of output:
+//
+// trans[0]     = re[0] (==zero frequency, purely real)
+// trans[1]     = re[1]
+//             ...
+// trans[n/2-1] = re[n/2-1]
+// trans[n/2]   = re[n/2]    (==nyquist frequency, purely real)
+//
+// trans[n/2+1] = im[n/2-1]
+// trans[n/2+2] = im[n/2-2]
+//             ...
+// trans[n-1]   = im[1] 
+
+RFFT.prototype.forward = function(buffer) {
+  var n         = this.bufferSize, 
+      spectrum  = this.spectrum,
+      x         = this.trans, 
+      TWO_PI    = 2*Math.PI,
+      sqrt      = Math.sqrt,
+      i         = n >>> 1,
+      bSi       = 2 / n,
+      n2, n4, n8, nn, 
+      t1, t2, t3, t4, 
+      i1, i2, i3, i4, i5, i6, i7, i8, 
+      st1, cc1, ss1, cc3, ss3,
+      e, 
+      a,
+      rval, ival, mag; 
+
+  this.reverseBinPermute(x, buffer);
+
+  /*
+  var reverseTable = this.reverseTable;
+
+  for (var k = 0, len = reverseTable.length; k < len; k++) {
+    x[k] = buffer[reverseTable[k]];
+  }
+  */
+
+  for (var ix = 0, id = 4; ix < n; id *= 4) {
+    for (var i0 = ix; i0 < n; i0 += id) {
+      //sumdiff(x[i0], x[i0+1]); // {a, b}  <--| {a+b, a-b}
+      st1 = x[i0] - x[i0+1];
+      x[i0] += x[i0+1];
+      x[i0+1] = st1;
+    } 
+    ix = 2*(id-1);
+  }
+
+  n2 = 2;
+  nn = n >>> 1;
+
+  while((nn = nn >>> 1)) {
+    ix = 0;
+    n2 = n2 << 1;
+    id = n2 << 1;
+    n4 = n2 >>> 2;
+    n8 = n2 >>> 3;
+    do {
+      if(n4 !== 1) {
+        for(i0 = ix; i0 < n; i0 += id) {
+          i1 = i0;
+          i2 = i1 + n4;
+          i3 = i2 + n4;
+          i4 = i3 + n4;
+     
+          //diffsum3_r(x[i3], x[i4], t1); // {a, b, s} <--| {a, b-a, a+b}
+          t1 = x[i3] + x[i4];
+          x[i4] -= x[i3];
+          //sumdiff3(x[i1], t1, x[i3]);   // {a, b, d} <--| {a+b, b, a-b}
+          x[i3] = x[i1] - t1; 
+          x[i1] += t1;
+     
+          i1 += n8;
+          i2 += n8;
+          i3 += n8;
+          i4 += n8;
+         
+          //sumdiff(x[i3], x[i4], t1, t2); // {s, d}  <--| {a+b, a-b}
+          t1 = x[i3] + x[i4];
+          t2 = x[i3] - x[i4];
+         
+          t1 = -t1 * Math.SQRT1_2;
+          t2 *= Math.SQRT1_2;
+     
+          // sumdiff(t1, x[i2], x[i4], x[i3]); // {s, d}  <--| {a+b, a-b}
+          st1 = x[i2];
+          x[i4] = t1 + st1; 
+          x[i3] = t1 - st1;
+          
+          //sumdiff3(x[i1], t2, x[i2]); // {a, b, d} <--| {a+b, b, a-b}
+          x[i2] = x[i1] - t2;
+          x[i1] += t2;
+        }
+      } else {
+        for(i0 = ix; i0 < n; i0 += id) {
+          i1 = i0;
+          i2 = i1 + n4;
+          i3 = i2 + n4;
+          i4 = i3 + n4;
+     
+          //diffsum3_r(x[i3], x[i4], t1); // {a, b, s} <--| {a, b-a, a+b}
+          t1 = x[i3] + x[i4]; 
+          x[i4] -= x[i3];
+          
+          //sumdiff3(x[i1], t1, x[i3]);   // {a, b, d} <--| {a+b, b, a-b}
+          x[i3] = x[i1] - t1; 
+          x[i1] += t1;
+        }
+      }
+   
+      ix = (id << 1) - n2;
+      id = id << 2;
+    } while (ix < n);
+ 
+    e = TWO_PI / n2;
+
+    for (var j = 1; j < n8; j++) {
+      a = j * e;
+      ss1 = Math.sin(a);
+      cc1 = Math.cos(a);
+
+      //ss3 = sin(3*a); cc3 = cos(3*a);
+      cc3 = 4*cc1*(cc1*cc1-0.75);
+      ss3 = 4*ss1*(0.75-ss1*ss1);
+   
+      ix = 0; id = n2 << 1;
+      do {
+        for (i0 = ix; i0 < n; i0 += id) {
+          i1 = i0 + j;
+          i2 = i1 + n4;
+          i3 = i2 + n4;
+          i4 = i3 + n4;
+       
+          i5 = i0 + n4 - j;
+          i6 = i5 + n4;
+          i7 = i6 + n4;
+          i8 = i7 + n4;
+       
+          //cmult(c, s, x, y, &u, &v)
+          //cmult(cc1, ss1, x[i7], x[i3], t2, t1); // {u,v} <--| {x*c-y*s, x*s+y*c}
+          t2 = x[i7]*cc1 - x[i3]*ss1; 
+          t1 = x[i7]*ss1 + x[i3]*cc1;
+          
+          //cmult(cc3, ss3, x[i8], x[i4], t4, t3);
+          t4 = x[i8]*cc3 - x[i4]*ss3; 
+          t3 = x[i8]*ss3 + x[i4]*cc3;
+       
+          //sumdiff(t2, t4);   // {a, b} <--| {a+b, a-b}
+          st1 = t2 - t4;
+          t2 += t4;
+          t4 = st1;
+          
+          //sumdiff(t2, x[i6], x[i8], x[i3]); // {s, d}  <--| {a+b, a-b}
+          //st1 = x[i6]; x[i8] = t2 + st1; x[i3] = t2 - st1;
+          x[i8] = t2 + x[i6]; 
+          x[i3] = t2 - x[i6];
+         
+          //sumdiff_r(t1, t3); // {a, b} <--| {a+b, b-a}
+          st1 = t3 - t1;
+          t1 += t3;
+          t3 = st1;
+          
+          //sumdiff(t3, x[i2], x[i4], x[i7]); // {s, d}  <--| {a+b, a-b}
+          //st1 = x[i2]; x[i4] = t3 + st1; x[i7] = t3 - st1;
+          x[i4] = t3 + x[i2]; 
+          x[i7] = t3 - x[i2];
+         
+          //sumdiff3(x[i1], t1, x[i6]);   // {a, b, d} <--| {a+b, b, a-b}
+          x[i6] = x[i1] - t1; 
+          x[i1] += t1;
+          
+          //diffsum3_r(t4, x[i5], x[i2]); // {a, b, s} <--| {a, b-a, a+b}
+          x[i2] = t4 + x[i5]; 
+          x[i5] -= t4;
+        }
+     
+        ix = (id << 1) - n2;
+        id = id << 2;
+   
+      } while (ix < n);
+    }
+  }
+
+  while (--i) {
+    rval = x[i];
+    ival = x[n-i-1];
+    mag = bSi * sqrt(rval * rval + ival * ival);
+
+    if (mag > this.peak) {
+      this.peakBand = i;
+      this.peak = mag;
+    }
+
+    spectrum[i] = mag;
+  }
+
+  spectrum[0] = bSi * x[0];
+
+  return spectrum;
+};
+
+function Sampler(file, bufferSize, sampleRate, playStart, playEnd, loopStart, loopEnd, loopMode) {
+  this.file = file;
+  this.bufferSize = bufferSize;
+  this.sampleRate = sampleRate;
+  this.playStart  = playStart || 0; // 0%
+  this.playEnd    = playEnd   || 1; // 100%
+  this.loopStart  = loopStart || 0;
+  this.loopEnd    = loopEnd   || 1;
+  this.loopMode   = loopMode  || DSP.OFF;
+  this.loaded     = false;
+  this.samples    = [];
+  this.signal     = new Float32Array(bufferSize);
+  this.frameCount = 0;
+  this.envelope   = null;
+  this.amplitude  = 1;
+  this.rootFrequency = 110; // A2 110
+  this.frequency  = 550;
+  this.step       = this.frequency / this.rootFrequency;
+  this.duration   = 0;
+  this.samplesProcessed = 0;
+  this.playhead   = 0;
+ 
+  var audio = /* new Audio();*/ document.createElement("AUDIO");
+  var self = this;
+ 
+  this.loadSamples = function(event) {
+    var buffer = DSP.getChannel(DSP.MIX, event.frameBuffer);
+    for ( var i = 0; i < buffer.length; i++) {
+      self.samples.push(buffer[i]);
+    }
+  };
+ 
+  this.loadComplete = function() {
+    // convert flexible js array into a fast typed array
+    self.samples = new Float32Array(self.samples);
+    self.loaded = true;
+  };
+ 
+  this.loadMetaData = function() {
+    self.duration = audio.duration;
+  };
+ 
+  audio.addEventListener("MozAudioAvailable", this.loadSamples, false);
+  audio.addEventListener("loadedmetadata", this.loadMetaData, false);
+  audio.addEventListener("ended", this.loadComplete, false);
+  audio.muted = true;
+  audio.src = file;
+  audio.play();
+}
+
+Sampler.prototype.applyEnvelope = function() {
+  this.envelope.process(this.signal);
+  return this.signal;
+};
+
+Sampler.prototype.generate = function() {
+  var frameOffset = this.frameCount * this.bufferSize;
+ 
+  var loopWidth = this.playEnd * this.samples.length - this.playStart * this.samples.length;
+  var playStartSamples = this.playStart * this.samples.length; // ie 0.5 -> 50% of the length
+  var playEndSamples = this.playEnd * this.samples.length; // ie 0.5 -> 50% of the length
+  var offset;
+
+  for ( var i = 0; i < this.bufferSize; i++ ) {
+    switch (this.loopMode) {
+      case DSP.OFF:
+        this.playhead = Math.round(this.samplesProcessed * this.step + playStartSamples);
+        if (this.playhead < (this.playEnd * this.samples.length) ) {
+          this.signal[i] = this.samples[this.playhead] * this.amplitude;
+        } else {
+          this.signal[i] = 0;
+        }
+        break;
+     
+      case DSP.FW:
+        this.playhead = Math.round((this.samplesProcessed * this.step) % loopWidth + playStartSamples);
+        if (this.playhead < (this.playEnd * this.samples.length) ) {
+          this.signal[i] = this.samples[this.playhead] * this.amplitude;
+        }
+        break;
+       
+      case DSP.BW:
+        this.playhead = playEndSamples - Math.round((this.samplesProcessed * this.step) % loopWidth);
+        if (this.playhead < (this.playEnd * this.samples.length) ) {
+          this.signal[i] = this.samples[this.playhead] * this.amplitude;
+        }
+        break;
+       
+      case DSP.FWBW:
+        if ( Math.floor(this.samplesProcessed * this.step / loopWidth) % 2 === 0 ) {
+          this.playhead = Math.round((this.samplesProcessed * this.step) % loopWidth + playStartSamples);
+        } else {
+          this.playhead = playEndSamples - Math.round((this.samplesProcessed * this.step) % loopWidth);
+        }  
+        if (this.playhead < (this.playEnd * this.samples.length) ) {
+          this.signal[i] = this.samples[this.playhead] * this.amplitude;
+        }
+        break;
+    }
+    this.samplesProcessed++;
+  }
+
+  this.frameCount++;
+
+  return this.signal;
+};
+
+Sampler.prototype.setFreq = function(frequency) {
+    var totalProcessed = this.samplesProcessed * this.step;
+    this.frequency = frequency;
+    this.step = this.frequency / this.rootFrequency;
+    this.samplesProcessed = Math.round(totalProcessed/this.step);
+};
+
+Sampler.prototype.reset = function() {
+  this.samplesProcessed = 0;
+  this.playhead = 0;
+};
+
+/**
+ * Oscillator class for generating and modifying signals
+ *
+ * @param {Number} type       A waveform constant (eg. DSP.SINE)
+ * @param {Number} frequency  Initial frequency of the signal
+ * @param {Number} amplitude  Initial amplitude of the signal
+ * @param {Number} bufferSize Size of the sample buffer to generate
+ * @param {Number} sampleRate The sample rate of the signal
+ *
+ * @contructor
+ */
+function Oscillator(type, frequency, amplitude, bufferSize, sampleRate) {
+  this.frequency  = frequency;
+  this.amplitude  = amplitude;
+  this.bufferSize = bufferSize;
+  this.sampleRate = sampleRate;
+  //this.pulseWidth = pulseWidth;
+  this.frameCount = 0;
+ 
+  this.waveTableLength = 2048;
+
+  this.cyclesPerSample = frequency / sampleRate;
+
+  this.signal = new Float32Array(bufferSize);
+  this.envelope = null;
+
+  switch(parseInt(type, 10)) {
+    case DSP.TRIANGLE:
+      this.func = Oscillator.Triangle;
+      break;
+
+    case DSP.SAW:
+      this.func = Oscillator.Saw;
+      break;
+
+    case DSP.SQUARE:
+      this.func = Oscillator.Square;
+      break;
+
+    default:
+    case DSP.SINE:
+      this.func = Oscillator.Sine;
+      break;
+  }
+
+  this.generateWaveTable = function() {
+    Oscillator.waveTable[this.func] = new Float32Array(2048);
+    var waveTableTime = this.waveTableLength / this.sampleRate;
+    var waveTableHz = 1 / waveTableTime;
+
+    for (var i = 0; i < this.waveTableLength; i++) {
+      Oscillator.waveTable[this.func][i] = this.func(i * waveTableHz/this.sampleRate);
+    }
+  };
+
+  if ( typeof Oscillator.waveTable === 'undefined' ) {
+    Oscillator.waveTable = {};
+  }
+
+  if ( typeof Oscillator.waveTable[this.func] === 'undefined' ) {
+    this.generateWaveTable();
+  }
+ 
+  this.waveTable = Oscillator.waveTable[this.func];
+}
+
+/**
+ * Set the amplitude of the signal
+ *
+ * @param {Number} amplitude The amplitude of the signal (between 0 and 1)
+ */
+Oscillator.prototype.setAmp = function(amplitude) {
+  if (amplitude >= 0 && amplitude <= 1) {
+    this.amplitude = amplitude;
+  } else {
+    throw "Amplitude out of range (0..1).";
+  }
+};
+  
+/**
+ * Set the frequency of the signal
+ *
+ * @param {Number} frequency The frequency of the signal
+ */  
+Oscillator.prototype.setFreq = function(frequency) {
+  this.frequency = frequency;
+  this.cyclesPerSample = frequency / this.sampleRate;
+};
+     
+// Add an oscillator
+Oscillator.prototype.add = function(oscillator) {
+  for ( var i = 0; i < this.bufferSize; i++ ) {
+    //this.signal[i] += oscillator.valueAt(i);
+    this.signal[i] += oscillator.signal[i];
+  }
+ 
+  return this.signal;
+};
+     
+// Add a signal to the current generated osc signal
+Oscillator.prototype.addSignal = function(signal) {
+  for ( var i = 0; i < signal.length; i++ ) {
+    if ( i >= this.bufferSize ) {
+      break;
+    }
+    this.signal[i] += signal[i];
+   
+    /*
+    // Constrain amplitude
+    if ( this.signal[i] > 1 ) {
+      this.signal[i] = 1;
+    } else if ( this.signal[i] < -1 ) {
+      this.signal[i] = -1;
+    }
+    */
+  }
+  return this.signal;
+};
+     
+// Add an envelope to the oscillator
+Oscillator.prototype.addEnvelope = function(envelope) {
+  this.envelope = envelope;
+};
+
+Oscillator.prototype.applyEnvelope = function() {
+  this.envelope.process(this.signal);
+};
+     
+Oscillator.prototype.valueAt = function(offset) {
+  return this.waveTable[offset % this.waveTableLength];
+};
+     
+Oscillator.prototype.generate = function() {
+  var frameOffset = this.frameCount * this.bufferSize;
+  var step = this.waveTableLength * this.frequency / this.sampleRate;
+  var offset;
+
+  for ( var i = 0; i < this.bufferSize; i++ ) {
+    //var step = (frameOffset + i) * this.cyclesPerSample % 1;
+    //this.signal[i] = this.func(step) * this.amplitude;
+    //this.signal[i] = this.valueAt(Math.round((frameOffset + i) * step)) * this.amplitude;
+    offset = Math.round((frameOffset + i) * step);
+    this.signal[i] = this.waveTable[offset % this.waveTableLength] * this.amplitude;
+  }
+
+  this.frameCount++;
+
+  return this.signal;
+};
+
+Oscillator.Sine = function(step) {
+  return Math.sin(DSP.TWO_PI * step);
+};
+
+Oscillator.Square = function(step) {
+  return step < 0.5 ? 1 : -1;
+};
+
+Oscillator.Saw = function(step) {
+  return 2 * (step - Math.round(step));
+};
+
+Oscillator.Triangle = function(step) {
+  return 1 - 4 * Math.abs(Math.round(step) - step);
+};
+
+Oscillator.Pulse = function(step) {
+  // stub
+};
+ 
+function ADSR(attackLength, decayLength, sustainLevel, sustainLength, releaseLength, sampleRate) {
+  this.sampleRate = sampleRate;
+  // Length in seconds
+  this.attackLength  = attackLength;
+  this.decayLength   = decayLength;
+  this.sustainLevel  = sustainLevel;
+  this.sustainLength = sustainLength;
+  this.releaseLength = releaseLength;
+  this.sampleRate    = sampleRate;
+ 
+  // Length in samples
+  this.attackSamples  = attackLength  * sampleRate;
+  this.decaySamples   = decayLength   * sampleRate;
+  this.sustainSamples = sustainLength * sampleRate;
+  this.releaseSamples = releaseLength * sampleRate;
+ 
+  // Updates the envelope sample positions
+  this.update = function() {
+    this.attack         =                this.attackSamples;
+    this.decay          = this.attack  + this.decaySamples;
+    this.sustain        = this.decay   + this.sustainSamples;
+    this.release        = this.sustain + this.releaseSamples;
+  };
+ 
+  this.update();
+ 
+  this.samplesProcessed = 0;
+}
+
+ADSR.prototype.noteOn = function() {
+  this.samplesProcessed = 0;
+  this.sustainSamples = this.sustainLength * this.sampleRate;
+  this.update();
+};
+
+// Send a note off when using a sustain of infinity to let the envelope enter the release phase
+ADSR.prototype.noteOff = function() {
+  this.sustainSamples = this.samplesProcessed - this.decaySamples;
+  this.update();
+};
+
+ADSR.prototype.processSample = function(sample) {
+  var amplitude = 0;
+
+  if ( this.samplesProcessed <= this.attack ) {
+    amplitude = 0 + (1 - 0) * ((this.samplesProcessed - 0) / (this.attack - 0));
+  } else if ( this.samplesProcessed > this.attack && this.samplesProcessed <= this.decay ) {
+    amplitude = 1 + (this.sustainLevel - 1) * ((this.samplesProcessed - this.attack) / (this.decay - this.attack));
+  } else if ( this.samplesProcessed > this.decay && this.samplesProcessed <= this.sustain ) {
+    amplitude = this.sustainLevel;
+  } else if ( this.samplesProcessed > this.sustain && this.samplesProcessed <= this.release ) {
+    amplitude = this.sustainLevel + (0 - this.sustainLevel) * ((this.samplesProcessed - this.sustain) / (this.release - this.sustain));
+  }
+ 
+  return sample * amplitude;
+};
+
+ADSR.prototype.value = function() {
+  var amplitude = 0;
+
+  if ( this.samplesProcessed <= this.attack ) {
+    amplitude = 0 + (1 - 0) * ((this.samplesProcessed - 0) / (this.attack - 0));
+  } else if ( this.samplesProcessed > this.attack && this.samplesProcessed <= this.decay ) {
+    amplitude = 1 + (this.sustainLevel - 1) * ((this.samplesProcessed - this.attack) / (this.decay - this.attack));
+  } else if ( this.samplesProcessed > this.decay && this.samplesProcessed <= this.sustain ) {
+    amplitude = this.sustainLevel;
+  } else if ( this.samplesProcessed > this.sustain && this.samplesProcessed <= this.release ) {
+    amplitude = this.sustainLevel + (0 - this.sustainLevel) * ((this.samplesProcessed - this.sustain) / (this.release - this.sustain));
+  }
+ 
+  return amplitude;
+};
+     
+ADSR.prototype.process = function(buffer) {
+  for ( var i = 0; i < buffer.length; i++ ) {
+    buffer[i] *= this.value();
+
+    this.samplesProcessed++;
+  }
+ 
+  return buffer;
+};
+     
+     
+ADSR.prototype.isActive = function() {
+  if ( this.samplesProcessed > this.release || this.samplesProcessed === -1 ) {
+    return false;
+  } else {
+    return true;
+  }
+};
+
+ADSR.prototype.disable = function() {
+  this.samplesProcessed = -1;
+};
+ 
+function IIRFilter(type, cutoff, resonance, sampleRate) {
+  this.sampleRate = sampleRate;
+
+  switch(type) {
+    case DSP.LOWPASS:
+    case DSP.LP12:
+      this.func = new IIRFilter.LP12(cutoff, resonance, sampleRate);
+      break;
+  }
+}
+
+IIRFilter.prototype.__defineGetter__('cutoff',
+  function() {
+    return this.func.cutoff;
+  }
+);
+
+IIRFilter.prototype.__defineGetter__('resonance',
+  function() {
+    return this.func.resonance;
+  }
+);
+
+IIRFilter.prototype.set = function(cutoff, resonance) {
+  this.func.calcCoeff(cutoff, resonance);
+};
+
+IIRFilter.prototype.process = function(buffer) {
+  this.func.process(buffer);
+};
+
+// Add an envelope to the filter
+IIRFilter.prototype.addEnvelope = function(envelope) {
+  if ( envelope instanceof ADSR ) {
+    this.func.addEnvelope(envelope);
+  } else {
+    throw "Not an envelope.";
+  }
+};
+
+IIRFilter.LP12 = function(cutoff, resonance, sampleRate) {
+  this.sampleRate = sampleRate;
+  this.vibraPos   = 0;
+  this.vibraSpeed = 0;
+  this.envelope = false;
+ 
+  this.calcCoeff = function(cutoff, resonance) {
+    this.w = 2.0 * Math.PI * cutoff / this.sampleRate;
+    this.q = 1.0 - this.w / (2.0 * (resonance + 0.5 / (1.0 + this.w)) + this.w - 2.0);
+    this.r = this.q * this.q;
+    this.c = this.r + 1.0 - 2.0 * Math.cos(this.w) * this.q;
+   
+    this.cutoff = cutoff;
+    this.resonance = resonance;
+  };
+
+  this.calcCoeff(cutoff, resonance);
+
+  this.process = function(buffer) {
+    for ( var i = 0; i < buffer.length; i++ ) {
+      this.vibraSpeed += (buffer[i] - this.vibraPos) * this.c;
+      this.vibraPos   += this.vibraSpeed;
+      this.vibraSpeed *= this.r;
+   
+      /*
+      var temp = this.vibraPos;
+     
+      if ( temp > 1.0 ) {
+        temp = 1.0;
+      } else if ( temp < -1.0 ) {
+        temp = -1.0;
+      } else if ( temp != temp ) {
+        temp = 1;
+      }
+     
+      buffer[i] = temp;
+      */
+
+      if (this.envelope) {
+        buffer[i] = (buffer[i] * (1 - this.envelope.value())) + (this.vibraPos * this.envelope.value());
+        this.envelope.samplesProcessed++;
+      } else {
+        buffer[i] = this.vibraPos;
+      }
+    }
+  };
+}; 
+
+IIRFilter.LP12.prototype.addEnvelope = function(envelope) {
+  this.envelope = envelope;
+};
+
+function IIRFilter2(type, cutoff, resonance, sampleRate) {
+  this.type = type;
+  this.cutoff = cutoff;
+  this.resonance = resonance;
+  this.sampleRate = sampleRate;
+
+  this.f = new Float32Array(4);
+  this.f[0] = 0.0; // lp
+  this.f[1] = 0.0; // hp
+  this.f[2] = 0.0; // bp
+  this.f[3] = 0.0; // br 
+ 
+  this.calcCoeff = function(cutoff, resonance) {
+    this.freq = 2 * Math.sin(Math.PI * Math.min(0.25, cutoff/(this.sampleRate*2)));  
+    this.damp = Math.min(2 * (1 - Math.pow(resonance, 0.25)), Math.min(2, 2/this.freq - this.freq * 0.5));
+  };
+
+  this.calcCoeff(cutoff, resonance);
+}
+
+IIRFilter2.prototype.process = function(buffer) {
+  var input, output;
+  var f = this.f;
+
+  for ( var i = 0; i < buffer.length; i++ ) {
+    input = buffer[i];
+
+    // first pass
+    f[3] = input - this.damp * f[2];
+    f[0] = f[0] + this.freq * f[2];
+    f[1] = f[3] - f[0];
+    f[2] = this.freq * f[1] + f[2];
+    output = 0.5 * f[this.type];
+
+    // second pass
+    f[3] = input - this.damp * f[2];
+    f[0] = f[0] + this.freq * f[2];
+    f[1] = f[3] - f[0];
+    f[2] = this.freq * f[1] + f[2];
+    output += 0.5 * f[this.type];
+
+    if (this.envelope) {
+      buffer[i] = (buffer[i] * (1 - this.envelope.value())) + (output * this.envelope.value());
+      this.envelope.samplesProcessed++;
+    } else {
+      buffer[i] = output;
+    }
+  }
+};
+
+IIRFilter2.prototype.addEnvelope = function(envelope) {
+  if ( envelope instanceof ADSR ) {
+    this.envelope = envelope;
+  } else {
+    throw "This is not an envelope.";
+  }
+};
+
+IIRFilter2.prototype.set = function(cutoff, resonance) {
+  this.calcCoeff(cutoff, resonance);
+};
+
+
+
+function WindowFunction(type, alpha) {
+  this.alpha = alpha;
+ 
+  switch(type) {
+    case DSP.BARTLETT:
+      this.func = WindowFunction.Bartlett;
+      break;
+     
+    case DSP.BARTLETTHANN:
+      this.func = WindowFunction.BartlettHann;
+      break;
+     
+    case DSP.BLACKMAN:
+      this.func = WindowFunction.Blackman;
+      this.alpha = this.alpha || 0.16;
+      break;
+   
+    case DSP.COSINE:
+      this.func = WindowFunction.Cosine;
+      break;
+     
+    case DSP.GAUSS:
+      this.func = WindowFunction.Gauss;
+      this.alpha = this.alpha || 0.25;
+      break;
+     
+    case DSP.HAMMING:
+      this.func = WindowFunction.Hamming;
+      break;
+     
+    case DSP.HANN:
+      this.func = WindowFunction.Hann;
+      break;
+   
+    case DSP.LANCZOS:
+      this.func = WindowFunction.Lanczoz;
+      break;
+     
+    case DSP.RECTANGULAR:
+      this.func = WindowFunction.Rectangular;
+      break;
+     
+    case DSP.TRIANGULAR:
+      this.func = WindowFunction.Triangular;
+      break;
+  }
+}
+
+WindowFunction.prototype.process = function(buffer) {
+  var length = buffer.length;
+  for ( var i = 0; i < length; i++ ) {
+    buffer[i] *= this.func(length, i, this.alpha);
+  }
+  return buffer;
+};
+
+WindowFunction.Bartlett = function(length, index) {
+  return 2 / (length - 1) * ((length - 1) / 2 - Math.abs(index - (length - 1) / 2));
+};
+
+WindowFunction.BartlettHann = function(length, index) {
+  return 0.62 - 0.48 * Math.abs(index / (length - 1) - 0.5) - 0.38 * Math.cos(DSP.TWO_PI * index / (length - 1));
+};
+
+WindowFunction.Blackman = function(length, index, alpha) {
+  var a0 = (1 - alpha) / 2;
+  var a1 = 0.5;
+  var a2 = alpha / 2;
+
+  return a0 - a1 * Math.cos(DSP.TWO_PI * index / (length - 1)) + a2 * Math.cos(4 * Math.PI * index / (length - 1));
+};
+
+WindowFunction.Cosine = function(length, index) {
+  return Math.cos(Math.PI * index / (length - 1) - Math.PI / 2);
+};
+
+WindowFunction.Gauss = function(length, index, alpha) {
+  return Math.pow(Math.E, -0.5 * Math.pow((index - (length - 1) / 2) / (alpha * (length - 1) / 2), 2));
+};
+
+WindowFunction.Hamming = function(length, index) {
+  return 0.54 - 0.46 * Math.cos(DSP.TWO_PI * index / (length - 1));
+};
+
+WindowFunction.Hann = function(length, index) {
+  return 0.5 * (1 - Math.cos(DSP.TWO_PI * index / (length - 1)));
+};
+
+WindowFunction.Lanczos = function(length, index) {
+  var x = 2 * index / (length - 1) - 1;
+  return Math.sin(Math.PI * x) / (Math.PI * x);
+};
+
+WindowFunction.Rectangular = function(length, index) {
+  return 1;
+};
+
+WindowFunction.Triangular = function(length, index) {
+  return 2 / length * (length / 2 - Math.abs(index - (length - 1) / 2));
+};
+
+function sinh (arg) {
+  // Returns the hyperbolic sine of the number, defined as (exp(number) - exp(-number))/2 
+  //
+  // version: 1004.2314
+  // discuss at: http://phpjs.org/functions/sinh    // +   original by: Onno Marsman
+  // *     example 1: sinh(-0.9834330348825909);
+  // *     returns 1: -1.1497971402636502
+  return (Math.exp(arg) - Math.exp(-arg))/2;
+}
+
+/* 
+ *  Biquad filter
+ * 
+ *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.
+ *  Copyright 2010 Ricard Marxer. All rights reserved.
+ *
+ */
+// Implementation based on:
+// http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
+function Biquad(type, sampleRate) {
+  this.Fs = sampleRate;
+  this.type = type;  // type of the filter
+  this.parameterType = DSP.Q; // type of the parameter
+
+  this.x_1_l = 0;
+  this.x_2_l = 0;
+  this.y_1_l = 0;
+  this.y_2_l = 0;
+
+  this.x_1_r = 0;
+  this.x_2_r = 0;
+  this.y_1_r = 0;
+  this.y_2_r = 0;
+
+  this.b0 = 1;
+  this.a0 = 1;
+
+  this.b1 = 0;
+  this.a1 = 0;
+
+  this.b2 = 0;
+  this.a2 = 0;
+
+  this.b0a0 = this.b0 / this.a0;
+  this.b1a0 = this.b1 / this.a0;
+  this.b2a0 = this.b2 / this.a0;
+  this.a1a0 = this.a1 / this.a0;
+  this.a2a0 = this.a2 / this.a0;
+
+  this.f0 = 3000;   // "wherever it's happenin', man."  Center Frequency or
+                    // Corner Frequency, or shelf midpoint frequency, depending
+                    // on which filter type.  The "significant frequency".
+
+  this.dBgain = 12; // used only for peaking and shelving filters
+
+  this.Q = 1;       // the EE kind of definition, except for peakingEQ in which A*Q is
+                    // the classic EE Q.  That adjustment in definition was made so that
+                    // a boost of N dB followed by a cut of N dB for identical Q and
+                    // f0/Fs results in a precisely flat unity gain filter or "wire".
+
+  this.BW = -3;     // the bandwidth in octaves (between -3 dB frequencies for BPF
+                    // and notch or between midpoint (dBgain/2) gain frequencies for
+                    // peaking EQ
+
+  this.S = 1;       // a "shelf slope" parameter (for shelving EQ only).  When S = 1,
+                    // the shelf slope is as steep as it can be and remain monotonically
+                    // increasing or decreasing gain with frequency.  The shelf slope, in
+                    // dB/octave, remains proportional to S for all other values for a
+                    // fixed f0/Fs and dBgain.
+
+  this.coefficients = function() {
+    var b = [this.b0, this.b1, this.b2];
+    var a = [this.a0, this.a1, this.a2];
+    return {b: b, a:a};
+  };
+
+  this.setFilterType = function(type) {
+    this.type = type;
+    this.recalculateCoefficients();
+  };
+
+  this.setSampleRate = function(rate) {
+    this.Fs = rate;
+    this.recalculateCoefficients();
+  };
+
+  this.setQ = function(q) {
+    this.parameterType = DSP.Q;
+    this.Q = Math.max(Math.min(q, 115.0), 0.001);
+    this.recalculateCoefficients();
+  };
+
+  this.setBW = function(bw) {
+    this.parameterType = DSP.BW;
+    this.BW = bw;
+    this.recalculateCoefficients();
+  };
+
+  this.setS = function(s) {
+    this.parameterType = DSP.S;
+    this.S = Math.max(Math.min(s, 5.0), 0.0001);
+    this.recalculateCoefficients();
+  };
+
+  this.setF0 = function(freq) {
+    this.f0 = freq;
+    this.recalculateCoefficients();
+  }; 
+ 
+  this.setDbGain = function(g) {
+    this.dBgain = g;
+    this.recalculateCoefficients();
+  };
+
+  this.recalculateCoefficients = function() {
+    var A;
+    if (type === DSP.PEAKING_EQ || type === DSP.LOW_SHELF || type === DSP.HIGH_SHELF ) {
+      A = Math.pow(10, (this.dBgain/40));  // for peaking and shelving EQ filters only
+    } else {
+      A  = Math.sqrt( Math.pow(10, (this.dBgain/20)) );   
+    }
+
+    var w0 = DSP.TWO_PI * this.f0 / this.Fs;
+
+    var cosw0 = Math.cos(w0);
+    var sinw0 = Math.sin(w0);
+
+    var alpha = 0;
+   
+    switch (this.parameterType) {
+      case DSP.Q:
+        alpha = sinw0/(2*this.Q);
+        break;
+           
+      case DSP.BW:
+        alpha = sinw0 * sinh( Math.LN2/2 * this.BW * w0/sinw0 );
+        break;
+
+      case DSP.S:
+        alpha = sinw0/2 * Math.sqrt( (A + 1/A)*(1/this.S - 1) + 2 );
+        break;
+    }
+
+    /**
+        FYI: The relationship between bandwidth and Q is
+             1/Q = 2*sinh(ln(2)/2*BW*w0/sin(w0))     (digital filter w BLT)
+        or   1/Q = 2*sinh(ln(2)/2*BW)             (analog filter prototype)
+
+        The relationship between shelf slope and Q is
+             1/Q = sqrt((A + 1/A)*(1/S - 1) + 2)
+    */
+
+    var coeff;
+
+    switch (this.type) {
+      case DSP.LPF:       // H(s) = 1 / (s^2 + s/Q + 1)
+        this.b0 =  (1 - cosw0)/2;
+        this.b1 =   1 - cosw0;
+        this.b2 =  (1 - cosw0)/2;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2 * cosw0;
+        this.a2 =   1 - alpha;
+        break;
+
+      case DSP.HPF:       // H(s) = s^2 / (s^2 + s/Q + 1)
+        this.b0 =  (1 + cosw0)/2;
+        this.b1 = -(1 + cosw0);
+        this.b2 =  (1 + cosw0)/2;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2 * cosw0;
+        this.a2 =   1 - alpha;
+        break;
+
+      case DSP.BPF_CONSTANT_SKIRT:       // H(s) = s / (s^2 + s/Q + 1)  (constant skirt gain, peak gain = Q)
+        this.b0 =   sinw0/2;
+        this.b1 =   0;
+        this.b2 =  -sinw0/2;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2*cosw0;
+        this.a2 =   1 - alpha;
+        break;
+
+      case DSP.BPF_CONSTANT_PEAK:       // H(s) = (s/Q) / (s^2 + s/Q + 1)      (constant 0 dB peak gain)
+        this.b0 =   alpha;
+        this.b1 =   0;
+        this.b2 =  -alpha;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2*cosw0;
+        this.a2 =   1 - alpha;
+        break;
+
+      case DSP.NOTCH:     // H(s) = (s^2 + 1) / (s^2 + s/Q + 1)
+        this.b0 =   1;
+        this.b1 =  -2*cosw0;
+        this.b2 =   1;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2*cosw0;
+        this.a2 =   1 - alpha;
+        break;
+
+      case DSP.APF:       // H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)
+        this.b0 =   1 - alpha;
+        this.b1 =  -2*cosw0;
+        this.b2 =   1 + alpha;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2*cosw0;
+        this.a2 =   1 - alpha;
+        break;
+
+      case DSP.PEAKING_EQ:  // H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)
+        this.b0 =   1 + alpha*A;
+        this.b1 =  -2*cosw0;
+        this.b2 =   1 - alpha*A;
+        this.a0 =   1 + alpha/A;
+        this.a1 =  -2*cosw0;
+        this.a2 =   1 - alpha/A;
+        break;
+
+      case DSP.LOW_SHELF:   // H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1)
+        coeff = sinw0 * Math.sqrt( (A^2 + 1)*(1/this.S - 1) + 2*A );
+        this.b0 =    A*((A+1) - (A-1)*cosw0 + coeff);
+        this.b1 =  2*A*((A-1) - (A+1)*cosw0);
+        this.b2 =    A*((A+1) - (A-1)*cosw0 - coeff);
+        this.a0 =       (A+1) + (A-1)*cosw0 + coeff;
+        this.a1 =   -2*((A-1) + (A+1)*cosw0);
+        this.a2 =       (A+1) + (A-1)*cosw0 - coeff;
+        break;
+
+      case DSP.HIGH_SHELF:   // H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A)
+        coeff = sinw0 * Math.sqrt( (A^2 + 1)*(1/this.S - 1) + 2*A );
+        this.b0 =    A*((A+1) + (A-1)*cosw0 + coeff);
+        this.b1 = -2*A*((A-1) + (A+1)*cosw0);
+        this.b2 =    A*((A+1) + (A-1)*cosw0 - coeff);
+        this.a0 =       (A+1) - (A-1)*cosw0 + coeff;
+        this.a1 =    2*((A-1) - (A+1)*cosw0);
+        this.a2 =       (A+1) - (A-1)*cosw0 - coeff;
+        break;
+    }
+   
+    this.b0a0 = this.b0/this.a0;
+    this.b1a0 = this.b1/this.a0;
+    this.b2a0 = this.b2/this.a0;
+    this.a1a0 = this.a1/this.a0;
+    this.a2a0 = this.a2/this.a0;
+  };
+
+  this.process = function(buffer) {
+      //y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2]
+      //       - (a1/a0)*y[n-1] - (a2/a0)*y[n-2]
+
+      var len = buffer.length;
+      var output = new Float32Array(len);
+
+      for ( var i=0; i<buffer.length; i++ ) {
+        output[i] = this.b0a0*buffer[i] + this.b1a0*this.x_1_l + this.b2a0*this.x_2_l - this.a1a0*this.y_1_l - this.a2a0*this.y_2_l;
+        this.y_2_l = this.y_1_l;
+        this.y_1_l = output[i];
+        this.x_2_l = this.x_1_l;
+        this.x_1_l = buffer[i];
+      }
+
+      return output;
+  };
+
+  this.processStereo = function(buffer) {
+      //y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2]
+      //       - (a1/a0)*y[n-1] - (a2/a0)*y[n-2]
+
+      var len = buffer.length;
+      var output = new Float32Array(len);
+     
+      for (var i = 0; i < len/2; i++) {
+        output[2*i] = this.b0a0*buffer[2*i] + this.b1a0*this.x_1_l + this.b2a0*this.x_2_l - this.a1a0*this.y_1_l - this.a2a0*this.y_2_l;
+        this.y_2_l = this.y_1_l;
+        this.y_1_l = output[2*i];
+        this.x_2_l = this.x_1_l;
+        this.x_1_l = buffer[2*i];
+
+        output[2*i+1] = this.b0a0*buffer[2*i+1] + this.b1a0*this.x_1_r + this.b2a0*this.x_2_r - this.a1a0*this.y_1_r - this.a2a0*this.y_2_r;
+        this.y_2_r = this.y_1_r;
+        this.y_1_r = output[2*i+1];
+        this.x_2_r = this.x_1_r;
+        this.x_1_r = buffer[2*i+1];
+      }
+
+      return output;
+  };
+}
+
+/* 
+ *  Magnitude to decibels
+ * 
+ *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.
+ *  Copyright 2010 Ricard Marxer. All rights reserved.
+ *
+ *  @buffer array of magnitudes to convert to decibels
+ *
+ *  @returns the array in decibels
+ *
+ */
+DSP.mag2db = function(buffer) {
+  var minDb = -120;
+  var minMag = Math.pow(10.0, minDb / 20.0);
+
+  var log = Math.log;
+  var max = Math.max;
+ 
+  var result = new Float32Array(buffer.length);
+  for (var i=0; i<buffer.length; i++) {
+    result[i] = 20.0*log(max(buffer[i], minMag));
+  }
+
+  return result;
+};
+
+/* 
+ *  Frequency response
+ * 
+ *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.
+ *  Copyright 2010 Ricard Marxer. All rights reserved.
+ *
+ *  Calculates the frequency response at the given points.
+ *
+ *  @b b coefficients of the filter
+ *  @a a coefficients of the filter
+ *  @w w points (normally between -PI and PI) where to calculate the frequency response
+ *
+ *  @returns the frequency response in magnitude
+ *
+ */
+DSP.freqz = function(b, a, w) {
+  var i, j;
+
+  if (!w) {
+    w = new Float32Array(200);
+    for (i=0;i<w.length; i++) {
+      w[i] = DSP.TWO_PI/w.length * i - Math.PI;
+    }
+  }
+
+  var result = new Float32Array(w.length);
+ 
+  var sqrt = Math.sqrt;
+  var cos = Math.cos;
+  var sin = Math.sin;
+ 
+  for (i=0; i<w.length; i++) {
+    var numerator = {real:0.0, imag:0.0};
+    for (j=0; j<b.length; j++) {
+      numerator.real += b[j] * cos(-j*w[i]);
+      numerator.imag += b[j] * sin(-j*w[i]);
+    }
+
+    var denominator = {real:0.0, imag:0.0};
+    for (j=0; j<a.length; j++) {
+      denominator.real += a[j] * cos(-j*w[i]);
+      denominator.imag += a[j] * sin(-j*w[i]);
+    }
+ 
+    result[i] =  sqrt(numerator.real*numerator.real + numerator.imag*numerator.imag) / sqrt(denominator.real*denominator.real + denominator.imag*denominator.imag);
+  }
+
+  return result;
+};
+
+/* 
+ *  Graphical Equalizer
+ *
+ *  Implementation of a graphic equalizer with a configurable bands-per-octave
+ *  and minimum and maximum frequencies
+ * 
+ *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.
+ *  Copyright 2010 Ricard Marxer. All rights reserved.
+ *
+ */
+function GraphicalEq(sampleRate) {
+  this.FS = sampleRate;
+  this.minFreq = 40.0;
+  this.maxFreq = 16000.0;
+
+  this.bandsPerOctave = 1.0;
+
+  this.filters = [];
+  this.freqzs = [];
+
+  this.calculateFreqzs = true;
+
+  this.recalculateFilters = function() {
+    var bandCount = Math.round(Math.log(this.maxFreq/this.minFreq) * this.bandsPerOctave/ Math.LN2);
+
+    this.filters = [];
+    for (var i=0; i<bandCount; i++) {
+      var freq = this.minFreq*(Math.pow(2, i/this.bandsPerOctave));
+      var newFilter = new Biquad(DSP.PEAKING_EQ, this.FS);
+      newFilter.setDbGain(0);
+      newFilter.setBW(1/this.bandsPerOctave);
+      newFilter.setF0(freq);
+      this.filters[i] = newFilter;
+      this.recalculateFreqz(i);
+    }
+  };
+
+  this.setMinimumFrequency = function(freq) {
+    this.minFreq = freq;
+    this.recalculateFilters();
+  };
+
+  this.setMaximumFrequency = function(freq) {
+    this.maxFreq = freq;
+    this.recalculateFilters();
+  };
+
+  this.setBandsPerOctave = function(bands) {
+    this.bandsPerOctave = bands;
+    this.recalculateFilters();
+  };
+
+  this.setBandGain = function(bandIndex, gain) {
+    if (bandIndex < 0 || bandIndex > (this.filters.length-1)) {
+      throw "The band index of the graphical equalizer is out of bounds.";
+    }
+
+    if (!gain) {
+      throw "A gain must be passed.";
+    }
+   
+    this.filters[bandIndex].setDbGain(gain);
+    this.recalculateFreqz(bandIndex);
+  };
+ 
+  this.recalculateFreqz = function(bandIndex) {
+    if (!this.calculateFreqzs) {
+      return;
+    }
+
+    if (bandIndex < 0 || bandIndex > (this.filters.length-1)) {
+      throw "The band index of the graphical equalizer is out of bounds. " + bandIndex + " is out of [" + 0 + ", " + this.filters.length-1 + "]";
+    }
+       
+    if (!this.w) {
+      this.w = new Float32Array(400);
+      for (var i=0; i<this.w.length; i++) {
+         this.w[i] = Math.PI/this.w.length * i;
+      }
+    }
+   
+    var b = [this.filters[bandIndex].b0, this.filters[bandIndex].b1, this.filters[bandIndex].b2];
+    var a = [this.filters[bandIndex].a0, this.filters[bandIndex].a1, this.filters[bandIndex].a2];
+
+    this.freqzs[bandIndex] = DSP.mag2db(DSP.freqz(b, a, this.w));
+  };
+
+  this.process = function(buffer) {
+    var output = buffer;
+
+    for (var i = 0; i < this.filters.length; i++) {
+      output = this.filters[i].process(output);
+    }
+
+    return output;
+  };
+
+  this.processStereo = function(buffer) {
+    var output = buffer;
+
+    for (var i = 0; i < this.filters.length; i++) {
+      output = this.filters[i].processStereo(output);
+    }
+
+    return output;
+  };
+}
+
+/**
+ * MultiDelay effect by Almer Thie (http://code.almeros.com).
+ * Copyright 2010 Almer Thie. All rights reserved.
+ * Example: http://code.almeros.com/code-examples/delay-firefox-audio-api/
+ *
+ * This is a delay that feeds it's own delayed signal back into its circular
+ * buffer. Also known as a CombFilter.
+ *
+ * Compatible with interleaved stereo (or more channel) buffers and
+ * non-interleaved mono buffers.
+ *
+ * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffer)
+ * @param {Number} delayInSamples Initial delay in samples
+ * @param {Number} masterVolume Initial master volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ * @param {Number} delayVolume Initial feedback delay volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ *
+ * @constructor
+ */
+function MultiDelay(maxDelayInSamplesSize, delayInSamples, masterVolume, delayVolume) {
+  this.delayBufferSamples   = new Float32Array(maxDelayInSamplesSize); // The maximum size of delay
+  this.delayInputPointer     = delayInSamples;
+  this.delayOutputPointer   = 0;
+ 
+  this.delayInSamples   = delayInSamples;
+  this.masterVolume     = masterVolume;
+  this.delayVolume     = delayVolume;
+}
+
+/**
+ * Change the delay time in samples.
+ *
+ * @param {Number} delayInSamples Delay in samples
+ */
+MultiDelay.prototype.setDelayInSamples = function (delayInSamples) {
+  this.delayInSamples = delayInSamples;
+ 
+  this.delayInputPointer = this.delayOutputPointer + delayInSamples;
+
+  if (this.delayInputPointer >= this.delayBufferSamples.length-1) {
+    this.delayInputPointer = this.delayInputPointer - this.delayBufferSamples.length; 
+  }
+};
+
+/**
+ * Change the master volume.
+ *
+ * @param {Number} masterVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ */
+MultiDelay.prototype.setMasterVolume = function(masterVolume) {
+  this.masterVolume = masterVolume;
+};
+
+/**
+ * Change the delay feedback volume.
+ *
+ * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ */
+MultiDelay.prototype.setDelayVolume = function(delayVolume) {
+  this.delayVolume = delayVolume;
+};
+
+/**
+ * Process a given interleaved or mono non-interleaved float value Array and adds the delayed audio.
+ *
+ * @param {Array} samples Array containing Float values or a Float32Array
+ *
+ * @returns A new Float32Array interleaved or mono non-interleaved as was fed to this function.
+ */
+MultiDelay.prototype.process = function(samples) {
+  // NB. Make a copy to put in the output samples to return.
+  var outputSamples = new Float32Array(samples.length);
+
+  for (var i=0; i<samples.length; i++) {
+    // delayBufferSamples could contain initial NULL's, return silence in that case
+    var delaySample = (this.delayBufferSamples[this.delayOutputPointer] === null ? 0.0 : this.delayBufferSamples[this.delayOutputPointer]);
+   
+    // Mix normal audio data with delayed audio
+    var sample = (delaySample * this.delayVolume) + samples[i];
+   
+    // Add audio data with the delay in the delay buffer
+    this.delayBufferSamples[this.delayInputPointer] = sample;
+   
+    // Return the audio with delay mix
+    outputSamples[i] = sample * this.masterVolume;
+   
+    // Manage circulair delay buffer pointers
+    this.delayInputPointer++;
+    if (this.delayInputPointer >= this.delayBufferSamples.length-1) {
+      this.delayInputPointer = 0;
+    }
+     
+    this.delayOutputPointer++;
+    if (this.delayOutputPointer >= this.delayBufferSamples.length-1) {
+      this.delayOutputPointer = 0; 
+    } 
+  }
+ 
+  return outputSamples;
+};
+
+/**
+ * SingleDelay effect by Almer Thie (http://code.almeros.com).
+ * Copyright 2010 Almer Thie. All rights reserved.
+ * Example: See usage in Reverb class
+ *
+ * This is a delay that does NOT feeds it's own delayed signal back into its 
+ * circular buffer, neither does it return the original signal. Also known as
+ * an AllPassFilter(?).
+ *
+ * Compatible with interleaved stereo (or more channel) buffers and
+ * non-interleaved mono buffers.
+ *
+ * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffer)
+ * @param {Number} delayInSamples Initial delay in samples
+ * @param {Number} delayVolume Initial feedback delay volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ *
+ * @constructor
+ */
+
+function SingleDelay(maxDelayInSamplesSize, delayInSamples, delayVolume) {
+  this.delayBufferSamples = new Float32Array(maxDelayInSamplesSize); // The maximum size of delay
+  this.delayInputPointer  = delayInSamples;
+  this.delayOutputPointer = 0;
+ 
+  this.delayInSamples     = delayInSamples;
+  this.delayVolume        = delayVolume;
+}
+
+/**
+ * Change the delay time in samples.
+ *
+ * @param {Number} delayInSamples Delay in samples
+ */
+SingleDelay.prototype.setDelayInSamples = function(delayInSamples) {
+  this.delayInSamples = delayInSamples;
+  this.delayInputPointer = this.delayOutputPointer + delayInSamples;
+
+  if (this.delayInputPointer >= this.delayBufferSamples.length-1) {
+    this.delayInputPointer = this.delayInputPointer - this.delayBufferSamples.length; 
+  }
+};
+
+/**
+ * Change the return signal volume.
+ *
+ * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ */
+SingleDelay.prototype.setDelayVolume = function(delayVolume) {
+  this.delayVolume = delayVolume;
+};
+
+/**
+ * Process a given interleaved or mono non-interleaved float value Array and
+ * returns the delayed audio.
+ *
+ * @param {Array} samples Array containing Float values or a Float32Array
+ *
+ * @returns A new Float32Array interleaved or mono non-interleaved as was fed to this function.
+ */
+SingleDelay.prototype.process = function(samples) {
+  // NB. Make a copy to put in the output samples to return.
+  var outputSamples = new Float32Array(samples.length);
+
+  for (var i=0; i<samples.length; i++) {
+
+    // Add audio data with the delay in the delay buffer
+    this.delayBufferSamples[this.delayInputPointer] = samples[i];
+   
+    // delayBufferSamples could contain initial NULL's, return silence in that case
+    var delaySample = this.delayBufferSamples[this.delayOutputPointer];
+
+    // Return the audio with delay mix
+    outputSamples[i] = delaySample * this.delayVolume;
+
+    // Manage circulair delay buffer pointers
+    this.delayInputPointer++;
+
+    if (this.delayInputPointer >= this.delayBufferSamples.length-1) {
+      this.delayInputPointer = 0;
+    }
+     
+    this.delayOutputPointer++;
+
+    if (this.delayOutputPointer >= this.delayBufferSamples.length-1) {
+      this.delayOutputPointer = 0; 
+    } 
+  }
+ 
+  return outputSamples;
+};
+
+/**
+ * Reverb effect by Almer Thie (http://code.almeros.com).
+ * Copyright 2010 Almer Thie. All rights reserved.
+ * Example: http://code.almeros.com/code-examples/reverb-firefox-audio-api/
+ *
+ * This reverb consists of 6 SingleDelays, 6 MultiDelays and an IIRFilter2
+ * for each of the two stereo channels.
+ *
+ * Compatible with interleaved stereo buffers only!
+ *
+ * @param {Number} maxDelayInSamplesSize Maximum possible delay in samples (size of circular buffers)
+ * @param {Number} delayInSamples Initial delay in samples for internal (Single/Multi)delays
+ * @param {Number} masterVolume Initial master volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ * @param {Number} mixVolume Initial reverb signal mix volume. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ * @param {Number} delayVolume Initial feedback delay volume for internal (Single/Multi)delays. Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ * @param {Number} dampFrequency Initial low pass filter frequency. 0 to 44100 (depending on your maximum sampling frequency)
+ *
+ * @constructor
+ */
+function Reverb(maxDelayInSamplesSize, delayInSamples, masterVolume, mixVolume, delayVolume, dampFrequency) {
+  this.delayInSamples   = delayInSamples;
+  this.masterVolume     = masterVolume;
+  this.mixVolume       = mixVolume;
+  this.delayVolume     = delayVolume;
+  this.dampFrequency     = dampFrequency;
+ 
+  this.NR_OF_MULTIDELAYS = 6;
+  this.NR_OF_SINGLEDELAYS = 6;
+ 
+  this.LOWPASSL = new IIRFilter2(DSP.LOWPASS, dampFrequency, 0, 44100);
+  this.LOWPASSR = new IIRFilter2(DSP.LOWPASS, dampFrequency, 0, 44100);
+ 
+  this.singleDelays = [];
+  
+  var i, delayMultiply;
+
+  for (i = 0; i < this.NR_OF_SINGLEDELAYS; i++) {
+    delayMultiply = 1.0 + (i/7.0); // 1.0, 1.1, 1.2...
+    this.singleDelays[i] = new SingleDelay(maxDelayInSamplesSize, Math.round(this.delayInSamples * delayMultiply), this.delayVolume);
+  }
+ 
+  this.multiDelays = [];
+
+  for (i = 0; i < this.NR_OF_MULTIDELAYS; i++) {
+    delayMultiply = 1.0 + (i/10.0); // 1.0, 1.1, 1.2... 
+    this.multiDelays[i] = new MultiDelay(maxDelayInSamplesSize, Math.round(this.delayInSamples * delayMultiply), this.masterVolume, this.delayVolume);
+  }
+}
+
+/**
+ * Change the delay time in samples as a base for all delays.
+ *
+ * @param {Number} delayInSamples Delay in samples
+ */
+Reverb.prototype.setDelayInSamples = function (delayInSamples){
+  this.delayInSamples = delayInSamples;
+
+  var i, delayMultiply;
+ 
+  for (i = 0; i < this.NR_OF_SINGLEDELAYS; i++) {
+    delayMultiply = 1.0 + (i/7.0); // 1.0, 1.1, 1.2...
+    this.singleDelays[i].setDelayInSamples( Math.round(this.delayInSamples * delayMultiply) );
+  }
+   
+  for (i = 0; i < this.NR_OF_MULTIDELAYS; i++) {
+    delayMultiply = 1.0 + (i/10.0); // 1.0, 1.1, 1.2...
+    this.multiDelays[i].setDelayInSamples( Math.round(this.delayInSamples * delayMultiply) );
+  }
+};
+
+/**
+ * Change the master volume.
+ *
+ * @param {Number} masterVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ */
+Reverb.prototype.setMasterVolume = function (masterVolume){
+  this.masterVolume = masterVolume;
+};
+
+/**
+ * Change the reverb signal mix level.
+ *
+ * @param {Number} mixVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ */
+Reverb.prototype.setMixVolume = function (mixVolume){
+  this.mixVolume = mixVolume;
+};
+
+/**
+ * Change all delays feedback volume.
+ *
+ * @param {Number} delayVolume Float value: 0.0 (silence), 1.0 (normal), >1.0 (amplify)
+ */
+Reverb.prototype.setDelayVolume = function (delayVolume){
+  this.delayVolume = delayVolume;
+ 
+  var i;
+
+  for (i = 0; i<this.NR_OF_SINGLEDELAYS; i++) {
+    this.singleDelays[i].setDelayVolume(this.delayVolume);
+  } 
+ 
+  for (i = 0; i<this.NR_OF_MULTIDELAYS; i++) {
+    this.multiDelays[i].setDelayVolume(this.delayVolume);
+  } 
+};
+
+/**
+ * Change the Low Pass filter frequency.
+ *
+ * @param {Number} dampFrequency low pass filter frequency. 0 to 44100 (depending on your maximum sampling frequency)
+ */
+Reverb.prototype.setDampFrequency = function (dampFrequency){
+  this.dampFrequency = dampFrequency;
+ 
+  this.LOWPASSL.set(dampFrequency, 0);
+  this.LOWPASSR.set(dampFrequency, 0); 
+};
+
+/**
+ * Process a given interleaved float value Array and copies and adds the reverb signal.
+ *
+ * @param {Array} samples Array containing Float values or a Float32Array
+ *
+ * @returns A new Float32Array interleaved buffer.
+ */
+Reverb.prototype.process = function (interleavedSamples){ 
+  // NB. Make a copy to put in the output samples to return.
+  var outputSamples = new Float32Array(interleavedSamples.length);
+ 
+  // Perform low pass on the input samples to mimick damp
+  var leftRightMix = DSP.deinterleave(interleavedSamples);
+  this.LOWPASSL.process( leftRightMix[DSP.LEFT] );
+  this.LOWPASSR.process( leftRightMix[DSP.RIGHT] ); 
+  var filteredSamples = DSP.interleave(leftRightMix[DSP.LEFT], leftRightMix[DSP.RIGHT]);
+
+  var i;
+
+  // Process MultiDelays in parallel
+  for (i = 0; i<this.NR_OF_MULTIDELAYS; i++) {
+    // Invert the signal of every even multiDelay
+    outputSamples = DSP.mixSampleBuffers(outputSamples, this.multiDelays[i].process(filteredSamples), 2%i === 0, this.NR_OF_MULTIDELAYS);
+  }
+ 
+  // Process SingleDelays in series
+  var singleDelaySamples = new Float32Array(outputSamples.length);
+  for (i = 0; i<this.NR_OF_SINGLEDELAYS; i++) {
+    // Invert the signal of every even singleDelay
+    singleDelaySamples = DSP.mixSampleBuffers(singleDelaySamples, this.singleDelays[i].process(outputSamples), 2%i === 0, 1);
+  }
+
+  // Apply the volume of the reverb signal
+  for (i = 0; i<singleDelaySamples.length; i++) {
+    singleDelaySamples[i] *= this.mixVolume;
+  }
+ 
+  // Mix the original signal with the reverb signal
+  outputSamples = DSP.mixSampleBuffers(singleDelaySamples, interleavedSamples, 0, 1);
+
+  // Apply the master volume to the complete signal
+  for (i = 0; i<outputSamples.length; i++) {
+    outputSamples[i] *= this.masterVolume;
+  }
+   
+  return outputSamples;
+};
+
Index: /gs3-extensions/web-audio/trunk/js-dsp/dsp.js.fixed-for-chrome
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/dsp.js.fixed-for-chrome	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/dsp.js.fixed-for-chrome	(revision 28388)
@@ -0,0 +1,1295 @@
+/*  
+ *  DSP.js - a comprehensive digital signal processing  library for javascript 
+ *  
+ *  Created by Corban Brook <corbanbrook@gmail.com> on 2010-01-01.
+ *  Copyright 2010 Corban Brook. All rights reserved.
+ *
+ */
+
+// Setup arrays for platforms which do not support byte arrays
+Float32Array = (typeof Float32Array === 'undefined') ? Array : Float32Array;
+Float64Array = (typeof Float64Array === 'undefined') ? Array : Float64Array;
+Uint32Array  = (typeof Uint32Array  === 'undefined') ? Array : Uint32Array;
+
+////////////////////////////////////////////////////////////////////////////////
+//                                  CONSTANTS                                 //
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * DSP is an object which contains general purpose utility functions and constants
+ */
+DSP = {
+  // Channels
+  LEFT:           0,
+  RIGHT:          1,
+  MIX:            2,
+
+  // Waveforms
+  SINE:           1,
+  TRIANGLE:       2,
+  SAW:            3,
+  SQUARE:         4,
+
+  // Filters 
+  LOWPASS:        0,
+  HIGHPASS:       1,
+  BANDPASS:       2,
+  NOTCH:          3,
+
+  // Window functions
+  BARTLETT:       1,
+  BARTLETTHANN:   2,
+  BLACKMAN:       3,
+  COSINE:         4,
+  GAUSS:          5,
+  HAMMING:        6,
+  HANN:           7,
+  LANCZOS:        8,
+  RECTANGULAR:    9,
+  TRIANGULAR:     10,
+
+  // Math
+  TWO_PI:         2*Math.PI
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//                            DSP UTILITY FUNCTIONS                           //
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Inverts the phase of a signal
+ *
+ * @param {Array} buffer A sample buffer
+ *
+ * @returns The inverted sample buffer
+ */
+DSP.invert = function(buffer) {
+  for ( var i = 0, len = buffer.length; i < len; i++ ) {
+    buffer[i] *= -1;
+  }
+
+  return buffer;
+};
+
+/**
+ * Converts split-stereo (dual mono) sample buffers into a stereo interleaved sample buffer
+ *
+ * @param {Array} left  A sample buffer
+ * @param {Array} right A sample buffer
+ *
+ * @returns The stereo interleaved buffer
+ */
+DSP.interleave = function(left, right) {
+  if ( left.length !== right.length ) {
+    throw "Can not interleave. Channel lengths differ.";
+  }
+  
+  var stereoInterleaved = new Float32Array(left.length * 2);
+  
+  for (var i = 0, len = left.length; i < len; i++ ) {
+    stereoInterleaved[2*i]   = left[i];
+    stereoInterleaved[2*i+1] = right[i];
+  }
+  
+  return stereoInterleaved;
+};
+
+/**
+ * Converts a stereo-interleaved sample buffer into split-stereo (dual mono) sample buffers
+ *
+ * @param {Array} buffer A stereo-interleaved sample buffer
+ *
+ * @returns an Array containing left and right channels
+ */
+DSP.deinterleave = function(buffer) {
+  var left  = new Float32Array(buffer.length/2);
+  var right = new Float32Array(buffer.length/2);
+  var mix   = new Float32Array(buffer.length/2);
+  
+  for (var i = 0, len = buffer.length/2; i < len; i ++ ) {
+    left[i]  = buffer[2*i];
+    right[i] = buffer[2*i+1];
+    mix[i]   = (left[i] + right[i]) / 2;
+  }
+  
+  return [left, right, mix];
+};
+
+/**
+ * Separates a channel from a stereo-interleaved sample buffer
+ *
+ * @param {Array}  buffer A stereo-interleaved sample buffer
+ * @param {Number} channel A channel constant (LEFT, RIGHT, MIX)
+ *
+ * @returns an Array containing a signal mono sample buffer
+ */
+DSP.getChannel = function(channel, buffer) {
+  return DSP.deinterleave(buffer)[channel];
+};
+
+// Biquad filter types
+DSP.LPF = 0;       // H(s) = 1 / (s^2 + s/Q + 1)
+DSP.HPF = 1;       // H(s) = s^2 / (s^2 + s/Q + 1)
+DSP.BPF_CONSTANT_SKIRT = 2;       // H(s) = s / (s^2 + s/Q + 1)  (constant skirt gain, peak gain = Q)
+DSP.BPF_CONSTANT_PEAK = 3;       // H(s) = (s/Q) / (s^2 + s/Q + 1)      (constant 0 dB peak gain)
+DSP.NOTCH = 4;     // H(s) = (s^2 + 1) / (s^2 + s/Q + 1)
+DSP.APF = 5;       // H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)
+DSP.PEAKING_EQ = 6;  // H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)
+DSP.LOW_SHELF = 7;   // H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1)
+DSP.HIGH_SHELF = 8;   // H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A)
+
+// Biquad filter parameter types
+DSP.Q = 0;
+DSP.BW = 1;
+DSP.S = 2;
+
+
+/** 
+ * DFT is a class for calculating the Discrete Fourier Transform of a signal.
+ *
+ * @param {Number} bufferSize The size of the sample buffer to be computed
+ * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)
+ *
+ * @constructor
+ */
+DFT = function(bufferSize, sampleRate) {
+  this.bufferSize = bufferSize;
+  this.sampleRate = sampleRate;
+
+  var N = bufferSize/2 * bufferSize;
+      
+  this.sinTable = new Float32Array(N);
+  this.cosTable = new Float32Array(N);
+  
+  for ( var i = 0; i < N; i++ ) {
+    this.sinTable[i] = Math.sin(i * DSP.TWO_PI / bufferSize);
+    this.cosTable[i] = Math.cos(i * DSP.TWO_PI / bufferSize);
+  }
+  
+  this.spectrum = new Float32Array(bufferSize/2);
+  this.complexValues = new Float32Array(bufferSize/2);
+};
+
+/**
+ * Performs a forward tranform on the sample buffer. 
+ * Converts a time domain signal to frequency domain spectra.
+ *
+ * @param {Array} buffer The sample buffer
+ *
+ * @returns The frequency spectrum array
+ */
+DFT.prototype.forward = function(buffer) {
+  var real, imag;
+
+  for ( var k = 0; k < this.bufferSize/2; k++ ) {
+    real = 0.0;
+    imag = 0.0;
+
+    for ( var n = 0; n < buffer.length; n++ ) {
+      real += this.cosTable[k*n] * signal[n];
+      imag += this.sinTable[k*n] * signal[n];
+    }
+
+    this.complexValues[k] = {real: real, imag: imag};
+  }
+  
+  for ( var i = 0; i < this.bufferSize/2; i++ ) {
+    this.spectrum[i] = 2 * Math.sqrt(Math.pow(this.complexValues[i].real, 2) + Math.pow(this.complexValues[i].imag, 2)) / this.bufferSize;
+  }
+
+  return this.spectrum;
+};
+
+
+/** 
+ * FFT is a class for calculating the Discrete Fourier Transform of a signal 
+ * with the Fast Fourier Transform algorithm.
+ *
+ * @param {Number} bufferSize The size of the sample buffer to be computed. Must be power of 2
+ * @param {Number} sampleRate The sampleRate of the buffer (eg. 44100)
+ *
+ * @constructor
+ */
+FFT = function(bufferSize, sampleRate) {
+  this.bufferSize = bufferSize;
+  this.sampleRate = sampleRate;
+  this.spectrum         = new Float32Array(bufferSize/2);
+  this.real             = new Float32Array(bufferSize);
+  this.imag             = new Float32Array(bufferSize);
+    
+  this.reverseTable     = new Uint32Array(bufferSize);
+
+  var limit = 1;
+  var bit = bufferSize >> 1;
+
+  while ( limit < bufferSize ) {
+    for ( var i = 0; i < limit; i++ ) {
+      this.reverseTable[i + limit] = this.reverseTable[i] + bit;
+    }
+
+    limit = limit << 1;
+    bit = bit >> 1;
+  }
+
+  this.sinTable = new Float32Array(bufferSize);
+  this.cosTable = new Float32Array(bufferSize);
+
+  for ( var i = 0; i < bufferSize; i++ ) {
+    this.sinTable[i] = Math.sin(-Math.PI/i);
+    this.cosTable[i] = Math.cos(-Math.PI/i);
+  }
+};
+
+/**
+ * Performs a forward tranform on the sample buffer. 
+ * Converts a time domain signal to frequency domain spectra.
+ *
+ * @param {Array} buffer The sample buffer. Buffer Length must be power of 2
+ *
+ * @returns The frequency spectrum array
+ */
+FFT.prototype.forward = function(buffer) {
+  // Locally scope variables for speed up
+  var bufferSize      = this.bufferSize,
+      cosTable        = this.cosTable,
+      sinTable        = this.sinTable,
+      reverseTable    = this.reverseTable,
+      real            = this.real,
+      imag            = this.imag,
+      spectrum        = this.spectrum;
+
+  if ( bufferSize % 2 !== 0 )         { throw "Invalid buffer size, must be a power of 2."; }
+  if ( bufferSize !== buffer.length ) { throw "Supplied buffer is not the same size as defined FFT. FFT Size: " + bufferSize + " Buffer Size: " + buffer.length; }
+
+  for ( var i = 0; i < bufferSize; i++ ) {
+    real[i] = buffer[reverseTable[i]];
+    imag[i] = 0;
+  }
+
+  var halfSize = 1, 
+      phaseShiftStepReal, 
+      phaseShiftStepImag, 
+      currentPhaseShiftReal, 
+      currentPhaseShiftImag, 
+      off, 
+      tr, 
+      ti, 
+      tmpReal, 
+      i;
+
+  while ( halfSize < bufferSize ) {
+    phaseShiftStepReal = cosTable[halfSize];
+    phaseShiftStepImag = sinTable[halfSize];
+    currentPhaseShiftReal = 1;
+    currentPhaseShiftImag = 0;
+
+    for ( var fftStep = 0; fftStep < halfSize; fftStep++ ) {
+      i = fftStep;
+
+      while ( i < bufferSize ) {
+        off = i + halfSize;
+        tr = (currentPhaseShiftReal * real[off]) - (currentPhaseShiftImag * imag[off]);
+        ti = (currentPhaseShiftReal * imag[off]) + (currentPhaseShiftImag * real[off]);
+
+        real[off] = real[i] - tr;
+        imag[off] = imag[i] - ti;
+        real[i] += tr;
+        imag[i] += ti;
+
+        i += halfSize << 1;
+      }
+
+      tmpReal = currentPhaseShiftReal;
+      currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);
+      currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);
+    }
+
+    halfSize = halfSize << 1;
+  }
+
+  i = bufferSize/2;
+  while(i--) {
+    spectrum[i] = 2 * Math.sqrt(real[i] * real[i] + imag[i] * imag[i]) / bufferSize;
+  }
+};
+
+/**
+ * Oscillator class for generating and modifying signals
+ *
+ * @param {Number} type       A waveform constant (eg. DSP.SINE)
+ * @param {Number} frequency  Initial frequency of the signal
+ * @param {Number} amplitude  Initial amplitude of the signal
+ * @param {Number} bufferSize Size of the sample buffer to generate
+ * @param {Number} sampleRate The sample rate of the signal
+ *
+ * @contructor
+ */
+Oscillator = function Oscillator(type, frequency, amplitude, bufferSize, sampleRate) {
+  this.frequency  = frequency;
+  this.amplitude  = amplitude;
+  this.bufferSize = bufferSize;
+  this.sampleRate = sampleRate;
+  //this.pulseWidth = pulseWidth;
+  this.frameCount = 0;
+  
+  this.waveTableLength = 2048;
+
+  this.cyclesPerSample = frequency / sampleRate;
+
+  this.signal = new Float32Array(bufferSize);
+  this.envelope = null;
+
+
+  switch(parseInt(type)) {
+    case DSP.TRIANGLE:
+      this.func = Oscillator.Triangle;
+      break;
+
+    case DSP.SAW:
+      this.func = Oscillator.Saw;
+      break;
+
+    case DSP.SQUARE:
+      this.func = Oscillator.Square;
+      break;
+
+    case DSP.SINE:
+    default:
+      this.func = Oscillator.Sine;
+      break;
+  }
+
+  this.generateWaveTable = function() {
+    Oscillator.waveTable[this.func] = new Float32Array(2048);
+    var waveTableTime = this.waveTableLength / this.sampleRate;
+    var waveTableHz = 1 / waveTableTime;
+
+    for (var i = 0; i < this.waveTableLength; i++) {
+      Oscillator.waveTable[this.func][i] = this.func(i * waveTableHz/this.sampleRate);
+    }
+  };
+
+  if ( typeof Oscillator.waveTable === 'undefined' ) {
+    Oscillator.waveTable = {};
+  }
+
+  if ( typeof Oscillator.waveTable[this.func] === 'undefined' ) { 
+    this.generateWaveTable();
+  }
+  
+  this.waveTable = Oscillator.waveTable[this.func];
+}; 
+
+/**
+ * Set the amplitude of the signal
+ *
+ * @param {Number} amplitude The amplitude of the signal (between 0 and 1)
+ */
+Oscillator.prototype.setAmp = function(amplitude) {
+  if (amplitude >= 0 && amplitude <= 1) {
+    this.amplitude = amplitude;
+  } else {
+    throw "Amplitude out of range (0..1).";
+  }
+};
+   
+/**
+ * Set the frequency of the signal
+ * 
+ * @param {Number} frequency The frequency of the signal
+ */   
+Oscillator.prototype.setFreq = function(frequency) {
+  this.frequency = frequency;
+  this.cyclesPerSample = frequency / this.sampleRate;
+};
+      
+// Add an oscillator
+Oscillator.prototype.add = function(oscillator) {
+  for ( var i = 0; i < this.bufferSize; i++ ) {
+    //this.signal[i] += oscillator.valueAt(i);
+    this.signal[i] += oscillator.signal[i];
+  }
+  
+  return this.signal;
+};
+      
+// Add a signal to the current generated osc signal
+Oscillator.prototype.addSignal = function(signal) {
+  for ( var i = 0; i < signal.length; i++ ) {
+    if ( i >= this.bufferSize ) {
+      break;
+    }
+    this.signal[i] += signal[i];
+    
+    /*
+    // Constrain amplitude
+    if ( this.signal[i] > 1 ) {
+      this.signal[i] = 1;
+    } else if ( this.signal[i] < -1 ) {
+      this.signal[i] = -1;
+    }
+    */
+  }
+  return this.signal;
+};
+      
+// Add an envelope to the oscillator
+Oscillator.prototype.addEnvelope = function(envelope) {
+  this.envelope = envelope;
+};
+      
+Oscillator.prototype.valueAt = function(offset) {
+  return this.waveTable[offset % this.waveTableLength];
+};
+      
+Oscillator.prototype.generate = function() {
+  var frameOffset = this.frameCount * this.bufferSize;
+  var step = this.waveTableLength * this.frequency / this.sampleRate;
+  var offset;
+
+  for ( var i = 0; i < this.bufferSize; i++ ) {
+    //var step = (frameOffset + i) * this.cyclesPerSample % 1;
+    //this.signal[i] = this.func(step) * this.amplitude;
+    //this.signal[i] = this.valueAt(Math.round((frameOffset + i) * step)) * this.amplitude; 
+    offset = Math.round((frameOffset + i) * step);
+    this.signal[i] = this.waveTable[offset % this.waveTableLength] * this.amplitude;
+  }
+
+  this.frameCount++;
+
+  return this.signal;
+};
+
+Oscillator.Sine = function(step) {
+  return Math.sin(DSP.TWO_PI * step);
+};
+
+Oscillator.Square = function(step) {
+  return step < 0.5 ? 1 : -1;
+};
+
+Oscillator.Saw = function(step) {
+  return 2 * (step - Math.round(step));
+};
+
+Oscillator.Triangle = function(step) {
+  return 1 - 4 * Math.abs(Math.round(step) - step);
+};
+
+Oscillator.Pulse = function(step) {
+  // stub
+};
+  
+ADSR = function(attackLength, decayLength, sustainLevel, sustainLength, releaseLength, sampleRate) {
+  this.attackLength  = attackLength;
+  this.decayLength   = decayLength;
+  this.sustainLevel  = sustainLevel;
+  this.sustainLength = sustainLength;
+  this.releaseLength = releaseLength;
+  this.sampleRate    = sampleRate;
+  
+  this.attackSamples  = attackLength  * sampleRate;
+  this.decaySamples   = decayLength   * sampleRate;
+  this.sustainSamples = sustainLength * sampleRate;
+  this.releaseSamples = releaseLength * sampleRate;
+  
+  this.attack         =                this.attackSamples;
+  this.decay          = this.attack  + this.decaySamples;
+  this.sustain        = this.decay   + this.sustainSamples;
+  this.release        = this.sustain + this.releaseSamples;
+    
+  this.samplesProcessed = 0;
+};
+
+
+ADSR.prototype.trigger = function() {
+  this.samplesProcessed = 0;
+};
+
+ADSR.prototype.processSample = function(sample) {
+  var amplitude = 0;
+
+  if ( this.samplesProcessed <= this.attack ) {
+    amplitude = 0 + (1 - 0) * ((this.samplesProcessed - 0) / (this.attack - 0));
+  } else if ( this.samplesProcessed > this.attack && this.samplesProcessed <= this.decay ) {
+    amplitude = 1 + (this.sustainLevel - 1) * ((this.samplesProcessed - this.attack) / (this.decay - this.attack));
+  } else if ( this.samplesProcessed > this.decay && this.samplesProcessed <= this.sustain ) {
+    amplitude = this.sustainLevel;
+  } else if ( this.samplesProcessed > this.sustain && this.samplesProcessed <= this.release ) {
+    amplitude = this.sustainLevel + (0 - this.sustainLevel) * ((this.samplesProcessed - this.sustain) / (this.release - this.sustain));
+  }
+  
+  return sample * amplitude;
+};
+
+ADSR.prototype.value = function() {
+  var amplitude = 0;
+
+  if ( this.samplesProcessed <= this.attack ) {
+    amplitude = 0 + (1 - 0) * ((this.samplesProcessed - 0) / (this.attack - 0));
+  } else if ( this.samplesProcessed > this.attack && this.samplesProcessed <= this.decay ) {
+    amplitude = 1 + (this.sustainLevel - 1) * ((this.samplesProcessed - this.attack) / (this.decay - this.attack));
+  } else if ( this.samplesProcessed > this.decay && this.samplesProcessed <= this.sustain ) {
+    amplitude = this.sustainLevel;
+  } else if ( this.samplesProcessed > this.sustain && this.samplesProcessed <= this.release ) {
+    amplitude = this.sustainLevel + (0 - this.sustainLevel) * ((this.samplesProcessed - this.sustain) / (this.release - this.sustain));
+  }
+  
+  return amplitude;
+};
+      
+ADSR.prototype.process = function(buffer) {
+  for ( var i = 0; i < buffer.length; i++ ) {
+    /*
+    var amplitude = 0;
+    
+    if ( this.samplesProcessed <= this.attack ) {
+      amplitude = 0 + (1 - 0) * ((this.samplesProcessed - 0) / (this.attack - 0));
+    } else if ( this.samplesProcessed > this.attack && this.samplesProcessed <= this.decay ) {
+      amplitude = 1 + (this.sustainLevel - 1) * ((this.samplesProcessed - this.attack) / (this.decay - this.attack));
+    } else if ( this.samplesProcessed > this.decay && this.samplesProcessed <= this.sustain ) {
+      amplitude = this.sustainLevel;
+    } else if ( this.samplesProcessed > this.sustain && this.samplesProcessed <= this.release ) {
+      amplitude = this.sustainLevel + (0 - this.sustainLevel) * ((this.samplesProcessed - this.sustain) / (this.release - this.sustain));
+    }
+    
+    buffer[i] *= amplitude;
+
+    this.samplesProcessed++;
+    */
+
+    buffer[i] *= this.value();
+
+    this.samplesProcessed++;
+  }
+  
+  return buffer;
+};
+      
+      
+ADSR.prototype.isActive = function() {
+  if ( this.samplesProcessed > this.release ) {
+    return false;
+  } else {
+    return true;
+  }
+};
+  
+IIRFilter = function(type, cutoff, resonance, sampleRate) {
+  this.sampleRate = sampleRate;
+  this.cutoff     = cutoff;
+  this.resonance  = resonance;
+
+  switch(type) {
+    case DSP.LOWPASS:
+    case DSP.LP12:
+      this.func = new IIRFilter.LP12(cutoff, resonance, sampleRate);
+      break;
+  }
+}
+
+IIRFilter.prototype.set = function(cutoff, resonance) {
+  this.func.calcCoeff(cutoff, resonance);
+}
+
+IIRFilter.prototype.process = function(buffer) {
+  this.func.process(buffer);
+}
+
+// Add an envelope to the filter
+IIRFilter.prototype.addEnvelope = function(envelope) {
+  if ( envelope instanceof ADSR ) {
+    this.func.addEnvelope(envelope);
+  } else {
+    throw "Not an envelope.";
+  }
+};
+
+IIRFilter.LP12 = function(cutoff, resonance, sampleRate) {
+  this.sampleRate = sampleRate;
+  this.vibraPos   = 0; 
+  this.vibraSpeed = 0;
+  this.envelope = false;
+  
+  this.calcCoeff = function(cutoff, resonance) {
+    this.w = 2.0 * Math.PI * cutoff / this.sampleRate;
+    this.q = 1.0 - this.w / (2.0 * (resonance + 0.5 / (1.0 + this.w)) + this.w - 2.0);
+    this.r = this.q * this.q;
+    this.c = this.r + 1.0 - 2.0 * Math.cos(this.w) * this.q;
+    
+    this.cutoff = cutoff;
+    this.resonance = resonance;
+  };
+
+  this.calcCoeff(cutoff, resonance);
+
+  this.process = function(buffer) {
+    for ( var i = 0; i < buffer.length; i++ ) {
+      this.vibraSpeed += (buffer[i] - this.vibraPos) * this.c;
+      this.vibraPos   += this.vibraSpeed;
+      this.vibraSpeed *= this.r;
+    
+      /* 
+      var temp = this.vibraPos;
+      
+      if ( temp > 1.0 ) {
+        temp = 1.0;
+      } else if ( temp < -1.0 ) {
+        temp = -1.0;
+      } else if ( temp != temp ) {
+        temp = 1;
+      }
+      
+      buffer[i] = temp;
+      */ 
+
+      if (this.envelope) {
+        buffer[i] = (buffer[i] * (1 - this.envelope.value())) + (this.vibraPos * this.envelope.value());
+        this.envelope.samplesProcessed++;
+      } else {
+        buffer[i] = this.vibraPos;
+      }
+    }
+  }
+};  
+
+IIRFilter.LP12.prototype.addEnvelope = function(envelope) {
+  this.envelope = envelope;
+};
+
+IIRFilter2 = function(type, cutoff, resonance, sampleRate) {
+  this.type = type; 
+  this.cutoff = cutoff;
+  this.resonance = resonance;
+  this.sampleRate = sampleRate;
+
+  this.calcCoeff = function(cutoff, resonance) {
+    this.freq = 2 * Math.sin(Math.PI * Math.min(0.25, cutoff/(this.sampleRate*2)));   
+    this.damp = Math.min(2 * (1 - Math.pow(resonance, 0.25)), Math.min(2, 2/this.freq - this.freq * 0.5));
+  };
+
+  this.calcCoeff(cutoff, resonance);
+};
+
+IIRFilter2.prototype.process = function(buffer) {
+  var input, output, lp, hp, bp, br;
+
+  var f = Array(4);
+  f[0] = 0; // lp
+  f[1] = 0; // hp
+  f[2] = 0; // bp
+  f[3] = 0; // br
+
+  for ( var i = 0; i < buffer.length; i++ ) {
+    input = buffer[i]; 
+
+    // first pass
+    f[3] = input - this.damp * f[2];
+    f[0] = f[0] + this.freq * f[2];
+    f[1] = f[3] - f[0];
+    f[2] = this.freq * f[1] + f[2];
+    output = 0.5 * f[this.type];
+
+    // second pass
+    f[3] = input - this.damp * f[2];
+    f[0] = f[0] + this.freq * f[2];
+    f[1] = f[3] - f[0];
+    f[2] = this.freq * f[1] + f[2];
+    output += 0.5 * f[this.type];
+
+    if (this.envelope) {
+      buffer[i] = (buffer[i] * (1 - this.envelope.value())) + (output * this.envelope.value());
+      this.envelope.samplesProcessed++;
+    } else {
+      buffer[i] = output;
+    }
+  }
+};
+
+IIRFilter2.prototype.addEnvelope = function(envelope) {
+  if ( envelope instanceof ADSR ) {
+    this.envelope = envelope;
+  } else {
+    throw "This is not an envelope.";
+  }
+};
+
+IIRFilter2.prototype.set = function(cutoff, resonance) {
+  this.calcCoeff(cutoff, resonance); 
+};
+
+WindowFunction = function(type, alpha) {
+  this.alpha = alpha;
+  
+  switch(type) {
+    case DSP.BARTLETT:
+      this.func = WindowFunction.Bartlett;
+      break;
+      
+    case DSP.BARTLETTHANN:
+      this.func = WindowFunction.BartlettHann;
+      break;
+      
+    case DSP.BLACKMAN:
+      this.func = WindowFunction.Blackman;
+      this.alpha = this.alpha || 0.16;
+      break;
+    
+    case DSP.COSINE:
+      this.func = WindowFunction.Cosine;
+      break;
+      
+    case DSP.GAUSS:
+      this.func = WindowFunction.Gauss;
+      this.alpha = this.alpha || 0.25;
+      break;
+      
+    case DSP.HAMMING:
+      this.func = WindowFunction.Hamming;
+      break;
+      
+    case DSP.HANN:
+      this.func = WindowFunction.Hann;
+      break;
+    
+    case DSP.LANCZOS:
+      this.func = WindowFunction.Lanczoz;
+      break;
+      
+    case DSP.RECTANGULAR:
+      this.func = WindowFunction.Rectangular;
+      break;
+      
+    case DSP.TRIANGULAR:
+      this.func = WindowFunction.Triangular;
+      break;
+  }
+};
+
+WindowFunction.prototype.process = function(buffer) {
+  var length = buffer.length;
+  for ( var i = 0; i < length; i++ ) {
+    buffer[i] *= this.func(length, i, this.alpha);
+  }
+};
+
+WindowFunction.Bartlett = function(length, index) {
+  return 2 / (length - 1) * ((length - 1) / 2 - Math.abs(index - (length - 1) / 2));
+};
+
+WindowFunction.BartlettHann = function(length, index) {
+  return 0.62 - 0.48 * Math.abs(index / (length - 1) - 0.5) - 0.38 * Math.cos(DSP.TWO_PI * index / (length - 1));
+};
+
+WindowFunction.Blackman = function(length, index, alpha) {
+  var a0 = (1 - alpha) / 2;
+  var a1 = 0.5;
+  var a2 = alpha / 2;
+
+  return a0 - a1 * Math.cos(DSP.TWO_PI * index / (length - 1)) + a2 * Math.cos(4 * Math.PI * index / (length - 1));
+};
+
+WindowFunction.Cosine = function(length, index) {
+  return Math.cos(Math.PI * index / (length - 1) - Math.PI / 2);
+};
+
+WindowFunction.Gauss = function(length, index, alpha) {
+  return Math.pow(Math.E, -0.5 * Math.pow((index - (length - 1) / 2) / (alpha * (length - 1) / 2), 2));
+};
+
+WindowFunction.Hamming = function(length, index) {
+  return 0.54 - 0.46 * Math.cos(DSP.TWO_PI * index / (length - 1));
+};
+
+WindowFunction.Hann = function(length, index) {
+  return 0.5 * (1 - Math.cos(DSP.TWO_PI * index / (length - 1)));
+};
+
+WindowFunction.Lanczos = function(length, index) {
+  var x = 2 * index / (length - 1) - 1;
+  return Math.sin(Math.PI * x) / (Math.PI * x);
+};
+
+WindowFunction.Rectangular = function(length, index) {
+  return 1;
+};
+
+WindowFunction.Triangular = function(length, index) {
+  return 2 / length * (length / 2 - Math.abs(index - (length - 1) / 2));
+};
+
+function sinh (arg) {
+    // Returns the hyperbolic sine of the number, defined as (exp(number) - exp(-number))/2  
+    // 
+    // version: 1004.2314
+    // discuss at: http://phpjs.org/functions/sinh    // +   original by: Onno Marsman
+    // *     example 1: sinh(-0.9834330348825909);
+    // *     returns 1: -1.1497971402636502
+    return (Math.exp(arg) - Math.exp(-arg))/2;
+}
+
+
+/*  
+ *  Biquad filter
+ *  
+ *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.
+ *  Copyright 2010 Ricard Marxer. All rights reserved.
+ *
+ */
+// Implementation based on:
+// http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
+Biquad = function(type, sampleRate) {
+  this.Fs = sampleRate;
+  this.type = type;  // type of the filter
+  this.parameterType = DSP.Q; // type of the parameter
+
+  this.x_1_l = 0;
+  this.x_2_l = 0;
+  this.y_1_l = 0;
+  this.y_2_l = 0;
+
+  this.x_1_r = 0;
+  this.x_2_r = 0;
+  this.y_1_r = 0;
+  this.y_2_r = 0;
+
+  this.b0 = 1;
+  this.a0 = 1;
+
+  this.b1 = 0;
+  this.a1 = 0;
+
+  this.b2 = 0;
+  this.a2 = 0;
+
+  this.b0a0 = this.b0 / this.a0;
+  this.b1a0 = this.b1 / this.a0;
+  this.b2a0 = this.b2 / this.a0;
+  this.a1a0 = this.a1 / this.a0;
+  this.a2a0 = this.a2 / this.a0;
+
+  this.f0 = 3000; // "wherever it's happenin', man."  Center Frequency or
+		// Corner Frequency, or shelf midpoint frequency, depending
+		// on which filter type.  The "significant frequency".
+
+  this.dBgain = 12; // used only for peaking and shelving filters
+
+  this.Q = 1;  // the EE kind of definition, except for peakingEQ in which A*Q is
+	       // the classic EE Q.  That adjustment in definition was made so that
+	       // a boost of N dB followed by a cut of N dB for identical Q and
+               // f0/Fs results in a precisely flat unity gain filter or "wire".
+
+  this.BW = -3; // the bandwidth in octaves (between -3 dB frequencies for BPF
+	       // and notch or between midpoint (dBgain/2) gain frequencies for
+	       // peaking EQ
+
+  this.S = 1;  // a "shelf slope" parameter (for shelving EQ only).  When S = 1,
+	       // the shelf slope is as steep as it can be and remain monotonically
+	       // increasing or decreasing gain with frequency.  The shelf slope, in
+	       // dB/octave, remains proportional to S for all other values for a
+	       // fixed f0/Fs and dBgain.
+
+  this.coefficients = function() {
+    var b = [this.b0, this.b1, this.b2];
+    var a = [this.a0, this.a1, this.a2];
+    return {b: b, a:a};
+  }
+
+  this.setFilterType = function(type) {
+    this.type = type;
+    this.recalculateCoefficients();
+  }
+
+  this.setSampleRate = function(rate) {
+    this.Fs = rate;
+    this.recalculateCoefficients();
+  }
+
+  this.setQ = function(q) {
+    this.parameterType = DSP.Q;
+    this.Q = Math.max(Math.min(q, 115.0), 0.001);
+    this.recalculateCoefficients();
+  }
+
+  this.setBW = function(bw) {
+    this.parameterType = DSP.BW;
+    this.BW = bw;
+    this.recalculateCoefficients();
+  } 
+
+  this.setS = function(s) {
+    this.parameterType = DSP.S;
+    this.S = Math.max(Math.min(s, 5.0), 0.0001);
+    this.recalculateCoefficients();
+  }  
+
+  this.setF0 = function(freq) {
+    this.f0 = freq;
+    this.recalculateCoefficients();
+  }  
+  
+  this.setDbGain = function(g) {
+    this.dBgain = g;
+    this.recalculateCoefficients();
+  }
+
+  this.recalculateCoefficients = function() {
+    var A;
+    if (type == DSP.PEAKING_EQ || type == DSP.LOW_SHELF || type == DSP.HIGH_SHELF ) {
+      A = Math.pow(10, (this.dBgain/40));  // for peaking and shelving EQ filters only
+    } else {
+      A  = Math.sqrt( Math.pow(10, (this.dBgain/20)) );    
+    }
+
+    var w0 = DSP.TWO_PI * this.f0 / this.Fs;
+
+    var cosw0 = Math.cos(w0);
+    var sinw0 = Math.sin(w0);
+
+    var alpha = 0;
+    
+    switch (this.parameterType) {
+      case DSP.Q:
+	alpha = sinw0/(2*this.Q);
+	break;
+      
+      case DSP.BW:
+        alpha = sinw0 * sinh( Math.LN2/2 * this.BW * w0/sinw0 );
+	break;
+
+      case DSP.S:
+        alpha = sinw0/2 * Math.sqrt( (A + 1/A)*(1/this.S - 1) + 2 );
+	break;
+    }
+
+    /**
+        FYI: The relationship between bandwidth and Q is
+             1/Q = 2*sinh(ln(2)/2*BW*w0/sin(w0))     (digital filter w BLT)
+        or   1/Q = 2*sinh(ln(2)/2*BW)             (analog filter prototype)
+
+        The relationship between shelf slope and Q is
+             1/Q = sqrt((A + 1/A)*(1/S - 1) + 2)
+    */
+
+    switch (this.type) {
+      case DSP.LPF:       // H(s) = 1 / (s^2 + s/Q + 1)
+        this.b0 =  (1 - cosw0)/2;
+        this.b1 =   1 - cosw0;
+        this.b2 =  (1 - cosw0)/2;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2 * cosw0;
+        this.a2 =   1 - alpha;
+        break;
+
+      case DSP.HPF:       // H(s) = s^2 / (s^2 + s/Q + 1)
+        this.b0 =  (1 + cosw0)/2;
+        this.b1 = -(1 + cosw0);
+        this.b2 =  (1 + cosw0)/2;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2 * cosw0;
+        this.a2 =   1 - alpha;
+        break;
+
+      case DSP.BPF_CONSTANT_SKIRT:       // H(s) = s / (s^2 + s/Q + 1)  (constant skirt gain, peak gain = Q)
+        this.b0 =   sinw0/2;
+        this.b1 =   0;
+        this.b2 =  -sinw0/2;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2*cosw0;
+        this.a2 =   1 - alpha;
+	break;
+
+      case DSP.BPF_CONSTANT_PEAK:       // H(s) = (s/Q) / (s^2 + s/Q + 1)      (constant 0 dB peak gain)
+        this.b0 =   alpha;
+        this.b1 =   0;
+        this.b2 =  -alpha;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2*cosw0;
+        this.a2 =   1 - alpha;
+	break;
+
+      case DSP.NOTCH:     // H(s) = (s^2 + 1) / (s^2 + s/Q + 1)
+        this.b0 =   1;
+        this.b1 =  -2*cosw0;
+        this.b2 =   1;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2*cosw0;
+        this.a2 =   1 - alpha;
+	break;
+
+      case DSP.APF:       // H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)
+        this.b0 =   1 - alpha;
+        this.b1 =  -2*cosw0;
+        this.b2 =   1 + alpha;
+        this.a0 =   1 + alpha;
+        this.a1 =  -2*cosw0;
+        this.a2 =   1 - alpha;
+	break;
+
+      case DSP.PEAKING_EQ:  // H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)
+        this.b0 =   1 + alpha*A;
+        this.b1 =  -2*cosw0;
+        this.b2 =   1 - alpha*A;
+        this.a0 =   1 + alpha/A;
+        this.a1 =  -2*cosw0;
+        this.a2 =   1 - alpha/A;
+	break;
+
+      case DSP.LOW_SHELF:   // H(s) = A * (s^2 + (sqrt(A)/Q)*s + A)/(A*s^2 + (sqrt(A)/Q)*s + 1)
+	var coeff = sinw0 * Math.sqrt( (A^2 + 1)*(1/this.S - 1) + 2*A );
+        this.b0 =    A*( (A+1) - (A-1)*cosw0 + coeff );
+        this.b1 =  2*A*( (A-1) - (A+1)*cosw0                   );
+        this.b2 =    A*( (A+1) - (A-1)*cosw0 - coeff );
+        this.a0 =        (A+1) + (A-1)*cosw0 + coeff;
+        this.a1 =   -2*( (A-1) + (A+1)*cosw0                   );
+        this.a2 =        (A+1) + (A-1)*cosw0 - coeff;
+	break;
+
+      case DSP.HIGH_SHELF:   // H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1)/(s^2 + (sqrt(A)/Q)*s + A)
+	var coeff = sinw0 * Math.sqrt( (A^2 + 1)*(1/this.S - 1) + 2*A );
+        this.b0 =    A*( (A+1) + (A-1)*cosw0 + coeff );
+        this.b1 = -2*A*( (A-1) + (A+1)*cosw0                   );
+        this.b2 =    A*( (A+1) + (A-1)*cosw0 - coeff );
+        this.a0 =        (A+1) - (A-1)*cosw0 + coeff;
+        this.a1 =    2*( (A-1) - (A+1)*cosw0                   );
+        this.a2 =        (A+1) - (A-1)*cosw0 - coeff;
+	break;
+    }
+    
+    this.b0a0 = this.b0/this.a0;
+    this.b1a0 = this.b1/this.a0;
+    this.b2a0 = this.b2/this.a0;
+    this.a1a0 = this.a1/this.a0;
+    this.a2a0 = this.a2/this.a0;
+  }
+
+  this.process = function(buffer) {
+      //y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2]
+      //       - (a1/a0)*y[n-1] - (a2/a0)*y[n-2]
+
+      var len = buffer.length;
+      var output = new Float32Array(len);
+
+      for ( var i=0; i<buffer.length; i++ ) {
+	output[i] = this.b0a0*buffer[i] + this.b1a0*this.x_1_l + this.b2a0*this.x_2_l - this.a1a0*this.y_1_l - this.a2a0*this.y_2_l;
+	this.y_2_l = this.y_1_l;
+	this.y_1_l = output[i];
+	this.x_2_l = this.x_1_l;
+	this.x_1_l = buffer[i];
+      }
+
+      return output;
+  }
+
+  this.processStereo = function(buffer) {
+      //y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2]
+      //       - (a1/a0)*y[n-1] - (a2/a0)*y[n-2]
+
+      var len = buffer.length;
+      var output = new Float32Array(len);
+      
+      for ( var i=0; i<len/2; i++ ) {
+	output[2*i] = this.b0a0*buffer[2*i] + this.b1a0*this.x_1_l + this.b2a0*this.x_2_l - this.a1a0*this.y_1_l - this.a2a0*this.y_2_l;
+	this.y_2_l = this.y_1_l;
+	this.y_1_l = output[2*i];
+	this.x_2_l = this.x_1_l;
+	this.x_1_l = buffer[2*i];
+
+	output[2*i+1] = this.b0a0*buffer[2*i+1] + this.b1a0*this.x_1_r + this.b2a0*this.x_2_r - this.a1a0*this.y_1_r - this.a2a0*this.y_2_r;
+	this.y_2_r = this.y_1_r;
+	this.y_1_r = output[2*i+1];
+	this.x_2_r = this.x_1_r;
+	this.x_1_r = buffer[2*i+1];
+      }
+
+      return output;
+  }
+};
+
+
+/*  
+ *  Magnitude to decibels
+ *  
+ *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.
+ *  Copyright 2010 Ricard Marxer. All rights reserved.
+ *
+ *  @buffer array of magnitudes to convert to decibels
+ * 
+ *  @returns the array in decibels
+ *
+ */
+DSP.mag2db = function(buffer) {
+  var minDb = -120;
+  var minMag = Math.pow(10.0, minDb / 20.0);
+
+  var log = Math.log;
+  var max = Math.max;
+  
+  var result = new Float32Array(buffer.length);
+  for (var i=0; i<buffer.length; i++) {
+    result[i] = 20.0*log(max(buffer[i], minMag));
+  }
+
+  return result;
+};
+
+/*  
+ *  Frequency response
+ *  
+ *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.
+ *  Copyright 2010 Ricard Marxer. All rights reserved.
+ *
+ *  Calculates the frequency response at the given points.
+ *
+ *  @b b coefficients of the filter
+ *  @a a coefficients of the filter
+ *  @w w points (normally between -PI and PI) where to calculate the frequency response
+ * 
+ *  @returns the frequency response in magnitude
+ *
+ */
+DSP.freqz = function(b, a, w) {
+  if (!w) {
+    w = new Float32Array(200);
+    for (var i=0;i<w.length; i++) {
+      w[i] = DSP.TWO_PI/w.length * i - Math.PI;
+    }
+  }
+
+  var result = new Float32Array(w.length);
+  
+  var sqrt = Math.sqrt;
+  var cos = Math.cos;
+  var sin = Math.sin;
+  
+  for (var i=0; i<w.length; i++) {
+    var numerator = {real:0.0, imag:0.0};
+    for (var j=0; j<b.length; j++) {
+      numerator.real += b[j] * cos(-j*w[i]);
+      numerator.imag += b[j] * sin(-j*w[i]);
+    }
+
+    var denominator = {real:0.0, imag:0.0};
+    for (var j=0; j<a.length; j++) {
+      denominator.real += a[j] * cos(-j*w[i]);
+      denominator.imag += a[j] * sin(-j*w[i]);
+    }
+  
+    result[i] =  sqrt(numerator.real*numerator.real + numerator.imag*numerator.imag) / sqrt(denominator.real*denominator.real + denominator.imag*denominator.imag);
+  }
+
+  return result;
+};
+
+/*  
+ *  Graphical Equalizer
+ *  
+ *  Created by Ricard Marxer <email@ricardmarxer.com> on 2010-05-23.
+ *  Copyright 2010 Ricard Marxer. All rights reserved.
+ *
+ */
+// Implementation of a graphic equalizer with a configurable bands-per-octave
+// and minimum and maximum frequencies
+GraphicalEq = function(sampleRate) {
+  this.FS = sampleRate;
+  this.minFreq = 40.0;
+  this.maxFreq = 16000.0;
+
+  this.bandsPerOctave = 1.0;
+
+  this.filters = []
+  this.freqzs = []
+
+  this.calculateFreqzs = true;
+
+  this.recalculateFilters = function() {
+    var bandCount = Math.round(Math.log(this.maxFreq/this.minFreq) * this.bandsPerOctave/ Math.LN2);
+
+    this.filters = [];
+    for (var i=0; i<bandCount; i++) {
+      var freq = this.minFreq*(Math.pow(2, i/this.bandsPerOctave));
+      var newFilter = new Biquad(DSP.PEAKING_EQ, this.FS);
+      newFilter.setDbGain(0);
+      newFilter.setBW(1/this.bandsPerOctave);
+      newFilter.setF0(freq);
+      this.filters[i] = newFilter;
+      this.recalculateFreqz(i);
+    }
+  }
+
+  this.setMinimumFrequency = function(freq) {
+    this.minFreq = freq;
+    this.recalculateFilters();
+  }
+
+  this.setMaximumFrequency = function(freq) {
+    this.maxFreq = freq;
+    this.recalculateFilters();
+  }
+
+  this.setBandsPerOctave = function(bands) {
+    this.bandsPerOctave = bands;
+    this.recalculateFilters();
+  }
+
+  this.setBandGain = function(bandIndex, gain) {
+    if (bandIndex < 0 || bandIndex > (this.filters.length-1)) {
+      throw "The band index of the graphical equalizer is out of bounds.";
+      return;
+    }
+
+    if (!gain) {
+      throw "A gain must be passed."
+      return;
+    }
+    
+    
+    this.filters[bandIndex].setDbGain(gain);
+    this.recalculateFreqz(bandIndex);
+  }
+  
+  this.recalculateFreqz = function(bandIndex) {
+    if (!this.calculateFreqzs) {
+      return;
+    }
+
+    
+    if (bandIndex < 0 || bandIndex > (this.filters.length-1)) {
+      throw "The band index of the graphical equalizer is out of bounds. " + bandIndex + " is out of [" + 0 + ", " + this.filters.length-1 + "]"
+      return;
+    }
+        
+    if (!this.w) {
+      this.w = new Float32Array(400);
+      for (var i=0; i<this.w.length; i++) {
+         this.w[i] = Math.PI/this.w.length * i;
+      }
+    }
+    
+    var b = [this.filters[bandIndex].b0, this.filters[bandIndex].b1, this.filters[bandIndex].b2];
+    var a = [this.filters[bandIndex].a0, this.filters[bandIndex].a1, this.filters[bandIndex].a2];
+
+    this.freqzs[bandIndex] = DSP.mag2db(DSP.freqz(b, a, this.w));
+  }
+
+  this.process = function(buffer) {
+      var output = buffer;
+      
+      for ( var i=0; i<this.filters.length; i++ ) {
+	output = this.filters[i].process(output);
+      }
+
+      return output;
+  }
+
+  this.processStereo = function(buffer) {
+      var output = buffer;
+      
+      for ( var i=0; i<this.filters.length; i++ ) {
+	output = this.filters[i].processStereo(output);
+      }
+
+      return output;
+  }
+
+}
Index: /gs3-extensions/web-audio/trunk/js-dsp/frequency-player.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/frequency-player.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/frequency-player.js	(revision 28388)
@@ -0,0 +1,419 @@
+
+var _dspdebug = 0;
+
+var chromaTransform;
+var frequencyPlotter;
+
+var concatLimit;
+var concatCount;
+var concatSignal;
+
+var jsMadProcessing = null;
+
+function freqPlayerLoadedAudioMetadata() {
+    console.log("started freqPlayerLoadedAudioMetadata()");
+
+    var audio = document.getElementById('rta-audio-element');
+    var channels;
+    var samplerate;
+    var frameBufferLength;
+    var duration;
+    
+    if (webAudioContext != null) {
+
+	var webAudioSource = webAudioContext.createMediaElementSource(audio);
+
+	var webAudioJSProcessor = webAudioContext.createJavaScriptNode(1024,2,2);
+	webAudioJSProcessor.onaudioprocess = freqPlayerAudioAvailable;	
+    
+	// Connect the processing graph: source -> jsProcessor -> analyser -> destination
+	webAudioSource.connect(webAudioJSProcessor);
+	webAudioJSProcessor.connect(webAudioContext.destination);
+
+	// For now, fake audio values for browsers such as Chrome, so later code works
+	channels = 2;
+	samplerate = 44100;
+	frameBufferLength = 2048; 
+	duration          = audio.duration;    
+    } else if (typeof audio.mozChannels !== "undefined") {
+	// Firefox audio API
+	channels          = audio.mozChannels;
+	samplerate        = audio.mozSampleRate;
+	frameBufferLength = audio.mozFrameBufferLength;
+	duration          = audio.duration;    
+
+    } else {
+	throw new Error('AudioContext not supported.');
+    }
+
+    var numSamples = frameBufferLength/channels;
+    
+    var info_mess = "frequency-player: { ";
+    info_mess += "num channels: " + channels;
+    info_mess += ", sample rate: " + samplerate;
+    info_mess += ", frame buffer length: " + frameBufferLength;
+    info_mess += ", num samples per frame: " + numSamples;
+    info_mess += ", duration: " + duration + "(secs)";
+    info_mess += " }";
+    console.info(info_mess);
+
+    concatLimit = 8;
+    concatCount = 0;
+    concatSignal = new Float32Array(concatLimit * numSamples); // mono
+
+    var totalNumSamples = duration * samplerate;
+    var totalNumFrames = Math.floor(totalNumSamples / (numSamples*concatLimit));
+
+    var frame_mess = "processed frames: { ";
+    frame_mess += "concatLimit: " + concatLimit;
+    frame_mess += ", total num frames = " + totalNumFrames;
+    frame_mess += " }";
+    console.info(frame_mess);
+
+    var canvas = document.getElementById('freq-plot');
+    var label_canvas = document.getElementById('freq-plot-labels');
+
+    var transformMode = $('input:radio[name=visualization]:checked').val();
+    var colorMappingMode = $('input:radio[name=colorMapping]:checked').val();
+
+    // ****
+    //chromaTransform = new ChromaTransform(transformMode, frameBufferLength*concatLimit, channels,samplerate,totalNumFrames);
+    activeWorkflow = new ActiveWorkflow(transformMode, frameBufferLength, concatLimit, 
+					channels,samplerate,totalNumFrames);
+
+    jsMadProcessing = new JsMadProcessing("mysong",activeWorkflow);
+
+    chromaTransform = activeWorkflow.chromaCpt;
+
+    frequencyPlotter = new FrequencyPlotter(audio,canvas,label_canvas,activeWorkflow,colorMappingMode,totalNumFrames);
+
+    //console.log("finished loadedMetadata()");
+}
+
+var audioMode = "stopped";
+var needsRefresh = true;
+
+function setTransformMode(elem) 
+{
+    var transformMode = $(elem).val();
+
+    frequencyPlotter.setTransformMode(transformMode); // set mode + display labels for plot
+}
+
+function setColorMappingMode(elem) 
+{
+    var mappingMode = $(elem).val();
+
+    frequencyPlotter.setColorMappingMode(mappingMode); 
+}
+
+function completedSelfSimilarityMatrixComputation(fracAvailable) 
+{
+
+    var $progressElem = $('#processing');
+    var displayProgress = ($progressElem.length>0) ? true : false;
+
+    if (displayProgress) {
+	$progressElem.css('display','none');
+    }
+
+    var audio = document.getElementById('rta-audio-element');
+    var duration = audio.duration;
+    var currentTime = audio.currentTime;
+
+    //frequencyPlotter.plotSelfSimilarityMatrix(chromaTransform.csm,currentTime/duration);
+
+    frequencyPlotter.plotSelfSimilarityMatrix(chromaTransform.csm,fracAvailable);
+}
+
+function monitorSelfSimilarityMatrixComputation(fracAvailable)
+{
+	
+    var $progressElem = $('#processing');
+    var $progressTextElem = $('#processingText');
+
+    var displayProgress = ($progressElem.length>0) ? true : false;
+
+    var progress = chromaTransform.progress;
+
+    if (progress < 100) {
+	if (displayProgress) {
+	    $progressTextElem.html("Processing: " + progress + "%");
+	}
+	setTimeout(function(){monitorSelfSimilarityMatrixComputation(fracAvailable)},200);
+    }
+    else {
+	completedSelfSimilarityMatrixComputation(fracAvailable);
+    }
+    
+}
+
+function plotSimilarityMatrix()
+{
+    var $progressElem = $('#processing');
+    var displayProgress = ($progressElem.length>0) ? true : false;
+    if (displayProgress) {
+	$progressElem.css('display','block');
+	var $progressTitleElem = $('#processingTitle');
+	$progressTitleElem.html("Computing Chromagram Self-similarity Matrix");
+    }
+    
+    var jsMadProcessedLen = jsMadProcessing.playBufferStore.length/concatLimit;
+    var totalNumFrames = frequencyPlotter.totalNumFrames;
+
+    //console.log("*** playBufferStore len = " + jsMadProcessedLen);
+    //console.log("*** total num frames = " + frequencyPlotter.totalNumFrames);
+
+    var fracAvailable = Math.min(jsMadProcessedLen/totalNumFrames,1.0);
+
+    var cfs = chromaTransform.getChromaFeaturesSequence();
+    chromaTransform.computeSelfSimilarityMatrix(cfs); // starts the progress calculation, but need to be monitored until finished
+
+    monitorSelfSimilarityMatrixComputation(fracAvailable);
+
+}
+
+function plotSimilarityMatrixWhenPaused(elem)
+{
+    // toglePlayMode reflects what graphic the button is showing => displaying "play" means it is paused (or hasn't been played yet)
+    //if (togglePlayMode.match("play")) {
+	
+	// the following could be done by more directly studying 'elem'
+	var showSimilarityMatrix = $('input:checkbox[name=similarityMatrix]').prop("checked");
+	if (showSimilarityMatrix) {
+	    plotSimilarityMatrix();
+	}
+	else {
+	    frequencyPlotter.replotVisual();
+	}
+    //}
+}
+
+function plotFrequencySpectrum(fbSpectrum) 
+{
+    var fft = chromaTransform.fft;
+
+    var canvas = document.getElementById('freq-plot');
+    var ctx = canvas.getContext('2d');
+
+    // Clear the canvas before drawing spectrum
+    ctx.clearRect(0,0, canvas.width, canvas.height);
+    
+    for (var i = 0; i < fft.spectrum.length; i++ ) {
+        // multiply spectrum by a zoom value
+        magnitude = fft.spectrum[i] * 4000;
+	
+        // Draw rectangle bars for each frequency bin
+        ctx.fillRect(i * 4, canvas.height, 3, -magnitude);
+    }
+}
+
+
+var _fp_first_aa = true;
+
+
+function freqPlayerAudioAvailable(event) {
+    //console.log("audioAvailable");
+
+    if (togglePlayMode.match("pause")) { // (counter-intuitively) means it is playing
+	if (playTrackerMode.match("playing")) {
+	    // means it is in dualPlay() mode
+	    return; // don't want the RTA audio playing while dual-playing is doing its panning thing
+	}
+    }
+
+    var audio = document.getElementById('rta-audio-element');
+
+    var channels;         
+    var samplerate;       
+    var frameBufferLength;
+
+    var fb = null;
+
+    if (webAudioContext!=null) {
+	// Working with Web audio
+
+	var inputArrayL = event.inputBuffer.getChannelData(0);
+	var inputArrayR = event.inputBuffer.getChannelData(1);
+	
+	var inputLen = inputArrayL.length;
+
+	var outputArrayL = event.outputBuffer.getChannelData(0);
+	var outputArrayR = event.outputBuffer.getChannelData(1);
+
+
+	//soundManager.setVolume("mysong",0);
+	//pannedPlayback.volume = 1.0;
+
+	//outputArrayL.set(inputArrayL);
+	//outputArrayR.set(inputArrayR);
+
+	if (audio.paused) {
+	    // not processing/playing any new audio 
+
+	    for (var i=0; i<outputArrayL.length; i++) {
+		outputArrayL[i] = 0;
+	    }
+	    for (var i=0; i<outputArrayR.length; i++) {
+		outputArrayR[i] = 0;
+	    }
+	    return;
+	}
+
+	fb = new Float32Array(2*inputLen);
+
+	for (var i=0; i<inputLen; i++) {
+	    fb[2*i] = inputArrayL[i];
+	    fb[(2*i)+1] = inputArrayR[i];
+
+	    //outputArrayL[i] = inputArrayL[i];
+	    //outputArrayR[i] = inputArrayR[i];
+	}
+
+	// And again the fake values to keep the rest of the code happy
+	channels = 2;
+	frameBufferLength = channels * inputLen;
+	samplerate = 44100;
+
+	// Apply Graphics Equalizer, and then play the result
+	if (_fp_first_aa) {
+	    console.log("*** !!!!! freqPlayerAudioAvailable, web audio context setting 'mysong' volume to 0");
+	    soundManager.setVolume("mysong",0.0);
+	    _fp_first_aa = false;
+	}
+
+	outputArrayL.set(grapheqL.process(inputArrayL));
+	outputArrayR.set(grapheqR.process(inputArrayR));
+    }
+    else {
+	// Working with Firefox Audio API
+	channels          = audio.mozChannels;    
+	samplerate        = audio.mozSampleRate;
+	frameBufferLength = audio.mozFrameBufferLength;
+	
+	fb = event.frameBuffer;
+
+	if (channels==2) {
+	    var mono_len = fb.length/2;
+	    var leftSignal = new Float32Array(mono_len);
+	    var rightSignal = new Float32Array(mono_len);
+
+	    for (var i=0; i<mono_len; i++) {
+		leftSignal[i] = fb[2*i];
+		rightSignal[i] = fb[(2*i)+1];
+	    }
+
+	    leftSignal = grapheqL.process(leftSignal);
+	    rightSignal = grapheqR.process(rightSignal);
+
+	    for (var i=0; i<mono_len; i++) {
+		fb[2*i] = leftSignal[i];
+		fb[(2*i)+1] = rightSignal[i];
+	    }
+	}
+	else {
+	    // mono input, but presumable stero out
+
+	    // untested code // *****
+	    var fbLeft  = grapheqL.process(fb);	    
+	    var fbRight = grapheqR.process(fb);
+
+	    var mono_len = fb.length;
+	    fb = new Float32Array(mono_len * 2);
+
+	    for (var i=0; i<mono_len; i++) {
+		fb[2*i] = fbLeft[i];
+		fb[(2*i)+1] = fbRight[i];
+	    }
+
+	}
+
+	// Apply Graphics Equalizer, and then play the result
+
+	if (_fp_first_aa) {
+	    console.log("*** freqPlayerAudioAvailable, Firefox audio API setting 'mysong' volume to 0");
+	    soundManager.setVolume("mysong",0.0);
+	    _fp_first_aa = false;
+	}
+
+	var written = pannedPlayback.mozWriteAudio(fb); // could equally make it baseSong ??
+	if (written != fb.length) {
+	    console.warn("Did not write out as many samples for output as were in the input");
+	    console.warn("input size = " + fb.length + ", output size = " + written);
+	}
+    }
+
+    var numSamples = fb.length/channels;
+
+    if (fb.length != frameBufferLength) {
+	console.error("fb length = " + fb.length);
+	console.error("frame buffer length = " + frameBufferLength);
+	console.error("Expected these values to be the same");
+    }
+
+
+    concatCount++;
+
+    if (concatCount==concatLimit) {
+
+	frequencyPlotter.plotVisualLine(needsRefresh,audio.currentTime);
+
+	needsRefresh = false;
+
+	concatCount=0;
+    }
+
+    // Uncomment the following line to have the audio data being decoded by
+    // the 'rta-audio-element' audio element pushed in to the Javascript DSP workflow
+    //activeWorkflow.pumpDataHead("rawInput",fb);
+
+    if (typeof selectedMeandreWorkflow !== "undefined") {
+	// Have a meandre workflow embedded in the page
+	if (selectedMeandreWorkflow.meandreDataOutput.length>0) {
+	    // play some processed data
+
+	    //var rta_audio = document.getElementById('rta-audio-element');
+	    
+	    console.log("*** freqPlayerAudioAvailable, Meandre workflow setting 'mysong' volume to 0");
+
+	    soundManager.setVolume("mysong",0);
+	    pannedPlayback.volume = 1.0;
+	    
+	    var frame = selectedMeandreWorkflow.meandreDataOutput[0];
+	    //console.log("*** meanderDataOutput len = " + selectedMeandreWorkflow.meandreDataOutput.length
+	    //	    + ", frame size of head = " + frame.length);
+
+	    var stereo_frame = new Float32Array(frame.length*2);
+	    for (var i=0; i<frame.length; i++) {
+		stereo_frame[2*i] = frame[i];
+		stereo_frame[2*i+1] = frame[i];
+	    }
+	    
+	    // Start playing the audio data returned from the Meandre workflow
+	    var written = pannedPlayback.mozWriteAudio(stereo_frame);
+	    
+	    if (written == 0) {
+		// audio has backed up => give it a chance to clear
+		return;
+	    }
+	    
+	    if (togglePlayMode == "play") {
+		// displaying play button (which counter-intuatively means it must be paused)
+		return;
+	    }
+	    
+	    if (written != stereo_frame.length) {
+		//console.log("*** frame size was " + frame.length + " but only wrote out " + written);
+		//selectedMeandreWorkflow.meandreDataOutput[0] = frame.subarray(written);
+		
+		selectedMeandreWorkflow.meandreDataOutput[0] = frame.subarray(written/2);
+	    }
+	    else {
+		//console.log("***### popping head of meandreDataOutput queue");
+		selectedMeandreWorkflow.meandreDataOutput.shift();
+	    }
+	}
+
+    }
+}
+
Index: /gs3-extensions/web-audio/trunk/js-dsp/frequency-plotter.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-dsp/frequency-plotter.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-dsp/frequency-plotter.js	(revision 28388)
@@ -0,0 +1,418 @@
+var FrequencyPlotter = function(audio, canvas, label_canvas,activeWorkflow, colorMappingMode, totalNumFrames) {
+
+    this.canvas = canvas;
+    this.label_canvas = label_canvas;
+    this.chromaTransform = activeWorkflow.chromaCpt;;
+    this.colorMappingMode = colorMappingMode;
+
+    this.totalNumFrames = totalNumFrames; 
+
+    this.width = canvas.width;
+    this.height = canvas.height;
+
+    this.fudgeWidth = this.width - (FrequencyPlotter.fudgeOffset + FrequencyPlotter.fudgeTrim);
+
+    //console.debug("frequency-plotter constructor(): Canvas w x h: [" + this.width +","+ this.height + "]");
+
+    this.duration = audio.duration;
+
+    this.dataMapping = { "freqSpectrum":      activeWorkflow.freqSpectrumCpt.fft.spectrum,
+			 "freqPowerSpectrum": activeWorkflow.freqSpectrumCpt.fft.powerSpectrum,
+			 "filterBank":        activeWorkflow.filterBankCpt.filterBankSequence,
+			 "chromaFeatures":    activeWorkflow.chromaCpt.chromaFeaturesSequence };
+
+    this.plotMapping = { "freqSpectrum":      plotFrequencySpectrumLabels,
+			 "freqPowerSpectrum": plotFrequencyPowerSpectrumLabels,
+			 "filterBank":        plotFilterBankLabels,
+			 "chromaFeatures":    plotChromaFeaturesLabels };
+
+
+    this.cptMapping = { "freqSpectrum":      activeWorkflow.freqSpectrumCpt,
+			"freqPowerSpectrum": activeWorkflow.freqSpectrumCpt,
+			"filterBank":        activeWorkflow.filterBankCpt,
+			"chromaFeatures":    activeWorkflow.chromaCpt };
+
+    this.ctx = canvas.getContext('2d');
+    this.label_ctx = label_canvas.getContext('2d');
+
+    this.plotMapping[activeWorkflow.chromaCpt.transformMode](this);
+
+    this.prevXLine = null;
+    this.prevXLineMaxArray = null;
+    this.plottedDataBuffer = new Array();
+
+};
+
+
+FrequencyPlotter.prototype.reset = function() {
+    this.chromaTransform.reset();
+    this.prevXLine = null;
+    this.prevXLineMaxArray = null;
+    this.plottedDataBuffer = new Array();
+}
+
+
+FrequencyPlotter.prototype.plotDataLine = function(eventTime,data) {
+
+    var lineX = FrequencyPlotter.fudgeOffset + Math.round((eventTime/this.duration) *  this.fudgeWidth);
+
+    var box_width = 1;
+    var box_height = Math.round(this.height/data.length);
+
+    var gapX = 0;
+
+    if (this.prevXLine!=null) {	
+	gapX = lineX - this.prevXLine;
+
+	if (gapX==0) {
+	    // layer max values on top of prevXLineMaxArray
+	    for (var i=0; i<data.length; i++) {
+		this.prevXLineMaxArray[i] = Math.max(this.prevXLineMaxArray[i],data[i]);
+	    }
+	}
+	else {
+	    // on to a new column => lay in the values in 'data'
+	    this.plottedDataBuffer[lineX-1] = new Float32Array(this.prevXLineMaxArray);
+
+	    for (var i=0; i<data.length; i++) {
+		this.prevXLineMaxArray[i] = data[i];
+	    }
+	}
+
+	if (gapX>0) {
+//	    box_width = gapX+1;
+	    box_width = gapX;
+	}
+    }
+    else {
+	this.prevXLineMaxArray = new Float32Array(data.length);
+	for (var i=0; i<data.length; i++) {
+	    this.prevXLineMaxArray[i] = data[i];
+	}
+    }
+	    
+    var transformMode = this.chromaTransform.transformMode;
+    var maxVal = this.cptMapping[transformMode].getMaxVal();
+
+    var $displayElem = $("#"+this.chromaTransform.getTransformMode()+"Max");
+    if ($displayElem.length>0) {
+	$displayElem.html(maxVal.toPrecision(4).substring(0,5));
+    }
+
+    for (var i=0; i<this.prevXLineMaxArray.length; i++) {
+
+	//var cv_perc = 100 * data[i] / maxVal;
+	var cv_perc = 100 * this.prevXLineMaxArray[i] / maxVal;
+
+	if (cv_perc>100) {
+	    console.log("Percent exceeds 100%: cv_perc[ = " + i + "] = " + cv_perc + " => Capping to 100%");
+	    cv_perc = 100;
+	}
+
+	var plot_color;
+	if (this.colorMappingMode == "rgb") {
+	    var rr = Math.floor(255 * (cv_perc / 100));
+	    plot_color = "rgb("+ rr +",0,0)";
+	}
+	else {
+	    var hue = Math.floor(240 * ((100.0-cv_perc) / 100));
+	    plot_color = "hsl("+ hue +",100%,50%)";
+	}
+
+	this.ctx.fillStyle=plot_color;	
+	// //this.ctx.fillRect(lineX-gapX,i*box_height+1,box_width,box_height-1);
+	//this.ctx.fillRect(lineX,i*box_height+1,box_width,box_height-1);
+	this.ctx.fillRect(this.prevXLine,i*box_height+1,box_width,box_height-1);
+
+	//this.ctx.fillRect(0,0,200,400);
+
+/*
+	//var plot_color2 = "rgb(0,"+ i*20 +",0)";
+	var plot_color2 = "hsl(358,100%,50%)";
+	this.ctx.fillStyle=plot_color2;
+	this.ctx.fillRect(lineX-gapX,i*box_height+1,box_width,box_height-1);
+*/
+
+    }
+
+/*
+    if (gapX > 0) {
+	// on to a new column => lay in the values in 'data'
+	for (var i=0; i<data.length; i++) {
+	    this.prevXLineMaxArray[i] = data[i];
+	}
+    }
+*/
+
+    //console.log("*** setting prevXLine = " + lineX);
+
+    this.prevXLine = lineX;
+    this.plottedDataBuffer[lineX] = new Float32Array(this.prevXLineMaxArray);
+
+};
+
+
+var _fpChangingMode = false;
+
+FrequencyPlotter.prototype.plotVisualLine  = function(needsRefresh,eventTime) {
+
+
+    if (_fpChangingMode) {
+	return;
+    }
+
+    if (needsRefresh) {
+	// Clear the canvas before drawing line
+
+	this.ctx.clearRect(FrequencyPlotter.fudgeOffset,0, this.width, this.fudgeHeight);
+	this.label_ctx.clearRect(FrequencyPlotter.fudgeOffset,0, this.width, this.fudgeHeight);
+    }
+
+    
+    //var dataPos = Math.round((eventTime * this.sampleRate)/(this.frameBufferLength*this.concatLimit));
+
+    var dataPos = Math.round((eventTime / this.duration) * this.totalNumFrames);
+
+    var dataSequence = this.dataMapping[this.chromaTransform.transformMode];
+
+    if (dataPos<dataSequence.length) {
+	var data = dataSequence[dataPos];
+
+	this.plotDataLine(eventTime,data);
+    }
+    else {
+	console.error("FrequencyPlotter::plotVisualLine(): No data to play for event time: " + eventTime);
+    }
+
+};
+
+FrequencyPlotter.prototype.replotVisual  = function() {
+
+    //console.log("**** FrequencyPlotter.replotVisual()");
+
+    var transformMode = this.chromaTransform.transformMode;
+    var maxVal = this.cptMapping[transformMode].getMaxVal();
+
+    var prevX = -1;
+    var box_width = 0;
+
+    for (var x=0; x<this.plottedDataBuffer.length; x++) {
+	var data = this.plottedDataBuffer[x];
+	
+	if (data != null) {
+
+	    box_width = x - prevX;
+
+	    var box_height = Math.round(this.height/data.length);
+
+	    for (var i=0; i<data.length; i++) {
+
+		var cv_perc = 100 * data[i] / maxVal;
+
+		var plot_color;
+		if (this.colorMappingMode == "rgb") {
+		    var rr = Math.floor(255 * (cv_perc / 100));
+		    plot_color = "rgb("+ rr +",0,0)";
+		}
+		else {
+		    var hue = Math.floor(240 * ((100.0-cv_perc) / 100));
+		    plot_color = "hsl("+ hue +",100%,50%)";
+		}
+
+		this.ctx.fillStyle=plot_color;	
+		this.ctx.fillRect(x,i*box_height+1,box_width,box_height-1);
+	    }
+
+	    prevX = x;
+	}
+    }
+}
+
+
+
+FrequencyPlotter.prototype.plotSelfSimilarityMatrix  = function(ssm,pausePerc) {
+
+
+    var num_frames = ssm.length;
+
+    var activeWidth  = this.fudgeWidth * pausePerc;
+    var activeHeight = this.height * pausePerc;
+
+    var x_scale = activeWidth / num_frames;
+    var y_scale = activeHeight / num_frames;
+
+    var x_width  = Math.ceil(x_scale);
+    var y_height = Math.ceil(y_scale);
+
+    console.log("SelfSimilarityMatrix: x scale = " + x_scale);
+    console.log("SelfSimilarityMatrix: y scale = " + y_scale);
+
+    //console.log("box width = " + x_width);
+    //console.log("box hieght = " + y_height);
+
+    this.label_ctx.clearRect(0,0, this.width, this.height);
+
+    this.progress = 0;
+    var total_calcs = num_frames * num_frames;
+    var c=0;
+    var y=0;
+    
+    (function(outerThis) {
+	// for (var y=0; y<num_frames; y++) {
+
+	for (var x=0; x<num_frames; x++) {
+
+	    outerThis.progress = Math.round((100.0*c)/total_calcs);
+
+	    var v = ssm[y][x];
+	    var hue = Math.floor(240 * (1.0 - v));
+	    var plot_color = "hsl("+ hue +",100%,50%)";
+
+	    outerThis.ctx.fillStyle=plot_color;	
+	    outerThis.ctx.fillRect(FrequencyPlotter.fudgeOffset + (x*x_scale),y*y_scale,x_width,y_height);
+
+	    c++;
+	}
+
+	y++;
+
+	if (y<num_frames) {
+	    setTimeout(arguments.callee,0,outerThis);
+	}	 
+	else {
+	    outerThis.progress = 100;
+	}
+    })(this);
+
+};
+
+var plotFrequencySpectrumLabels = function(fp) {
+};
+
+var plotFrequencyPowerSpectrumLabels = function(fp) {
+};
+
+var plotFilterBankLabels = function(fp) {
+
+    var transformMode = fp.chromaTransform.transformMode;
+    var numSteps = fp.cptMapping[transformMode].filterBankOut.length;
+
+    var stepY = Math.round(fp.height/numSteps);
+
+    var startX;
+    if (fp.prevXLine==null) {
+	startX=0;
+    }
+    else {
+	startX = fp.prevXLine+1;
+    }
+
+    //console.log("*** Filter bank start x = " + startX);
+
+    for (var i=0; i<numSteps; i++) {
+
+	fp.label_ctx.beginPath();
+	fp.label_ctx.moveTo(startX, i*stepY);
+	fp.label_ctx.lineTo(fp.width, i*stepY);
+	fp.label_ctx.strokeStyle = "white";
+	fp.label_ctx.stroke();
+	fp.label_ctx.closePath();
+    }
+
+    fp.label_ctx.fillStyle = "black";
+    fp.label_ctx.font = "bold 14px Arial";
+    fp.label_ctx.textBaseline = "top";
+
+    var x = FrequencyPlotter.fudgeOffset + fp.fudgeWidth + 5;
+    if (FrequencyPlotter.fudgeTrim==0) {
+	// A fudge on top of a fudge!
+	x -= 60;
+    }
+
+    var y = 1;
+    var loEdge = fp.chromaTransform.loEdge;
+
+    fp.label_ctx.fillText(loEdge.toPrecision(3) + " Hz", x,y);
+
+};
+
+var plotChromaFeaturesLabels = function(fp) {
+
+    var labels = ['C','C#/Db','D','D#/Eb','E','F','F#/Gb','G','G#/Ab','A','A#/Bb','B'];
+
+    fp.label_ctx.fillStyle = "black";
+    fp.label_ctx.font = "bold 14px Arial";
+    fp.label_ctx.textBaseline = "top";
+
+
+    // fp.ctx.lineWidth   = 1;
+
+    var x = FrequencyPlotter.fudgeOffset + fp.fudgeWidth + 5;
+    if (FrequencyPlotter.fudgeTrim==0) {
+	// A fudge on top of a fudge!
+	x -= 50;
+    }
+
+    var stepY = fp.height/labels.length;
+
+    var startX;
+    if (fp.prevXLine==null) {
+	startX=0;
+    }
+    else {
+	startX = fp.prevXLine+1;
+    }
+
+    //console.log("*** Chromagram start x = " + startX);
+
+    for (var i=0; i<labels.length; i++) {
+
+	var y = 12 + i * stepY;
+
+	fp.label_ctx.fillText(labels[i], x,y);
+
+	fp.label_ctx.beginPath();
+	fp.label_ctx.moveTo(startX, i*stepY);
+	fp.label_ctx.lineTo(fp.width, i*stepY);
+	fp.label_ctx.strokeStyle = "white";
+	fp.label_ctx.stroke();
+	fp.label_ctx.closePath();
+    }
+
+};
+
+FrequencyPlotter.prototype.setTransformMode = function(transformMode) {
+
+    _fpChangingMode = true;
+
+    this.chromaTransform.setTransformMode(transformMode);
+
+    var startX;
+    if (this.prevXLine==null) {
+	startX=0;
+    }
+    else {
+	startX = this.prevXLine+1;
+    }
+
+    //this.ctx.clearRect(startX,0, this.width-startX, this.height);
+    this.label_ctx.clearRect(startX,0, this.width-startX, this.height);
+
+    this.plotMapping[transformMode](this);
+
+    _fpChangingMode = false;
+
+};
+
+
+FrequencyPlotter.prototype.setColorMappingMode  = function(colorMappingMode) {
+    this.colorMappingMode = colorMappingMode;
+}
+
+// Guestimate for Firefox audio element
+//FrequencyPlotter.fudgeOffset = 28;
+//FrequencyPlotter.fudgeTrim   = 58;
+
+// SoundManager2 settings
+FrequencyPlotter.fudgeOffset = 0;
+FrequencyPlotter.fudgeTrim   = 0;
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/.gitignore
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/.gitignore	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/.gitignore	(revision 28388)
@@ -0,0 +1,2 @@
+*~
+.*.swp
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/.gitmodules
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/.gitmodules	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/.gitmodules	(revision 28388)
@@ -0,0 +1,6 @@
+[submodule "audiolib.js"]
+	path = audiolib.js
+	url = git://github.com/jussi-kalliokoski/audiolib.js.git
+[submodule "sink.js"]
+	path = sink.js
+	url = https://github.com/jussi-kalliokoski/sink.js.git
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/README.md
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/README.md	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/README.md	(revision 28388)
@@ -0,0 +1,72 @@
+## About
+
+jsmad is a pure javascript MP3 decoder, based on [libmad](http://www.underbit.com/products/mad/), with an ID3 decoder written from scratch.
+
+For example, jsmad allows Firefox 4.0+ to play MP3s without any Flash. Faster loading times. Fewer security holes. No 64-bit headaches on Linux. Fewer memory leaks.
+
+jsmad opens up a whole world of realtime audio applications implemented in javascript: 
+dj-mixers, samplers, sequencers, all these applications benefit from using mp3s as audio source.  
+
+jsmad is released under the GPLv2 license.
+
+## Demo
+
+See a live demo here: http://jsmad.org/ in collaboration with [official.fm](http://official.fm/) and using the [musicmetric](http://musicmetric.com/) API
+
+It works out of the box under Firefox 4.0 and above. On Chrome 13.0+, you have to enable manually the Web Audio API in 'about:flags', then restart the browser and it should work fine! No Opera support at the moment.
+
+## Authors
+
+  * [@nddrylliog](http://twitter.com/nddrylliog) - lead developer
+  * [@jensnockert](http://twitter.com/jensnockert) - helped porting & debugging the code at MusicHackDay Berlin
+  * [@mgeorgi](http://twitter.com/mgeorgi) - helped debugging the code after MusicHackDay Berlin
+
+Special thanks to [@antoinem](http://twitter.com/antoinem) for the Demo design and particularly to [@_romac](http://twitter.com/_romac) for adding features & keeping the demo server alive!
+
+## Porting notes
+
+Obviously, porting low-level C code to Javascript isn't an easy task. Some things had to be 
+adapted pretty heavily. jsmad is not the result of an automatic translation - all 15K+ lines
+of code were translated by hand by @nddrylliog and @jensnockert during MusicHackDay Berlin.
+Then, @mgeorgi helped us a lot with the debugging process, and @antoinem did the design of the demo
+during MusicHackDay Barcelona.
+
+It performs well enough to decode and play MP3s in realtime on Firefox on modern computers,
+although if you do lots of things at once, Firefox might forget at all about scheduled tasks
+and let the soundcard underflow. There is a rescue mechanism for that in the demo, which works
+most of the time.
+
+jsmad will undoubtedly be an interesting benchmark for browser's javascript implementations.
+We would love to get feedback from the Mozilla, Google Chrome, and Opera team - shoot us a note!
+
+## Accuracy
+
+The output from jsmad is NOT representative of the output quality of libmad itself. jsmad hasn't been
+tested for ISO/IEC 11172-4 computational accuracy requirements compliance. JavaScript number crunching
+has always been a bad idea, and we're aware of that - we've done it to push the limits of what is being
+done with JavaScript, much in the spirit of [pdf.js](https://github.com/andreasgal/pdf.js)
+
+## License
+
+jsmad is available under the terms of the GNU General Public License, Version 2. Please note that
+under the GPL, there is absolutely no warranty of any kind, to the extent permitted by the law.
+
+What GPL means for a javascript library is not exactly clear to us. What's clear is that you have
+to release any fork/changes under the GPL as well, so that everyone can profit from it. However,
+using it on a commercial platform is probably alright. Remember: no guarantees, and we'd love to know
+about it!
+
+libmad has commercial license. As for jsmad, we're in a sort of grey legal area. If you're from
+Underbit and want to work this out with us please drop me a note at amos@official.fm
+
+## Future
+
+What's next? A few things:
+
+  - Strings are still used in the core decoding routines instead of Uint8Arrays - this should change
+  - Optimizations, always
+  - Better buffering strategy - player.js is still pretty naive and we stumble now and then onto buffer underflow
+  - MPEG Layer I and II are not supported, only Layer III is - it should be pretty trivial but we had no interest for it in the first place.
+  - MPEG 2.5 is not supported.
+  - Free bitrate streams are not supported (this is different from VBR - VBR is supported)
+  - Most of ID3v2.2 and ID3v2.3 are implemented, but some tags are mising.
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/css/style.css
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/css/style.css	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/css/style.css	(revision 28388)
@@ -0,0 +1,155 @@
+body {
+  font-family: Helvetica;
+  margin:0;
+  padding:0;
+  background:#fa5945 url(../images/header.png) repeat-x top left;
+}
+#container {
+  width:960px;
+  margin:0 auto;
+}
+
+h1 { 
+  background:transparent url(../images/logo.png) no-repeat top left;
+  width: 157px;
+  height: 180px;
+  display: block;
+  float:left;
+  margin:20px 40px 20px 20px;
+  }
+  h1 span { display:none; }
+  
+h2 { font-size: 30px; line-height: 38px; margin:0; }
+h3 { font-size: 22px; margin: 10px 0 20px; }
+
+h3 small { font-size: 14px; color:#FA5945 !important; font-weight:normal !important; margin-left:10px; }
+
+a, a:active { color:#490CCE; outline:0;}
+a:hover { color:#0A28AC; }
+
+div.github {
+  -moz-transform: rotate(2deg);
+  -moz-transform-origin: left top;
+  background: url(../images/github.png) no-repeat 16px 10px rgba(255, 255, 255, 0.5);
+  box-shadow: 0 0 27px rgba(0, 0, 0, 0.08);
+  float: right;
+  padding: 30px 30px 30px 91px;
+  position: relative;
+  top: -3px;
+}
+
+div.select {
+  top: 66px;
+  clear:right;
+  position: relative;
+}
+div.select span {
+  margin:0 10px;
+}
+form { display: inline-block;}
+
+label { color:#FFE400; font-size: 18px; line-height:22px; margin-bottom: 3px; text-shadow: rgba(0,0,0,0.3) 1px 1px 1px; display:block;}
+label.ofm { background:url(../images/ofm.png) no-repeat top left; padding-left:20px;}
+
+input { font-size:18px; }
+
+#content {
+  clear:both;
+}
+
+#ID3 {
+  background:#fff;
+  padding:20px;
+  min-height:400px;
+  position:relative;
+}
+
+#ID3:before {
+  content: ' ';
+  height: 0;
+  position: absolute;
+  width: 0;	
+  border: 15px solid transparent;
+	border-bottom-color: #fff;
+	top: 0%;
+	left: 90px;
+	margin-top: -30px;
+}
+
+div.player { 
+  float:left;
+  margin-right:20px;
+  }
+
+div.picture {
+  width:400px; 
+  height:400px; 
+  display: block; 
+  }
+  div.picture img.picture {
+    width:400px; 
+    height:400px; 
+    display: block; 
+  }
+
+a.button {
+  width:100px; 
+  height:100px; 
+  display:block;
+  position:relative; 
+  top:-250px; 
+  left:150px;
+}
+
+a.play {
+  background: transparent url(../images/play.png) no-repeat top left; 
+  opacity:0.7;
+  }
+  a.play:hover {opacity:1;}
+
+a.pause {
+  background: transparent url(../images/pause.png) no-repeat top left; 
+  opacity:0.7;
+  }
+  a.pause:hover {opacity:1;}
+
+div.timeline {
+  width:360px;
+  height:20px;
+  border: 1px solid rgba(255,228,0,0.7);
+  display:block;
+  position:relative;
+  top:-140px;
+  left:20px;
+}
+div#progressbar { width: 0; height: 20px; background-color: #FA5945; }
+div#preloadbar { width: 0; height: 20px; background-color: rgba(255,228,0,0.5); }
+
+div.meta { background-color: rgba(0, 0, 0, 0.1); width:460px; padding:20px; font-size:16px; display:inline-block; }
+
+#shareTrack {
+    text-align: right;
+    margin: 20px 0 40px 0;
+}
+
+#playUrl {
+    width: 320px;
+}
+
+#footer {
+  clear:both;
+  padding:0 20px 20px;
+  color:#FFE400;
+  font-size:15px;
+  }
+  #footer a { background:#fff; padding:2px 5px; -moz-border-radius:3px;font-size: 15px;
+     padding: 3px 5px 1px;
+     position: relative;
+     top: -1px;
+     font-weight:bold;
+     text-decoration:none;
+     color:#FA5945;}
+     #footer a:hover { color:#000;}
+     #footer a span {font-weight:normal;color:#000; font-style:italic;font-size:12px;}
+  #footer a.mhd { background:transparent; top:0;}
+  #footer img { position: relative;top: 4px; }
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/application.css
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/application.css	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/application.css	(revision 28388)
@@ -0,0 +1,268 @@
+* {
+  padding: 0;
+  -moz-user-select: -moz-none;
+}
+
+html {
+  font: 18px/27px 'TeXGyreHerosBold';
+  color: white;
+}
+
+body {
+  width: 35em;
+  margin: 2em auto;
+  background: url("images/noise.png") #3c3c46;
+  -webkit-user-select: none;
+  user-select: none;
+}
+
+span.even {
+  color: #bc4;
+}
+
+h1, h2 {
+  text-shadow: #1f2329 0 1px 0;
+}
+
+#outer {
+  position: absolute;
+  width: 36em;
+  margin-left: -18em;
+  left: 50%;
+  top: 20%;
+  margin-top: -125px;
+}
+
+#content {
+  font: 100% 'TeXGyreHerosRegular';
+}
+
+h2.slogan {
+  width: 100%;
+  left: 0;
+  text-align: center;
+}
+
+h1.logo {
+  font: 5em 'TeXGyreHerosBold';
+  color: white;
+  margin-bottom: 0.6em;
+  text-align: center;
+}
+
+h1.lovelogo {
+  width: 100%;
+  text-align: center;
+  font: 3.4em 'TeXGyreHerosBold';
+}
+
+h1 a, h1 a:visited{
+  color: white;
+  text-decoration: none;
+}
+
+em {
+  font-style: normal;
+  color: #bc4;
+}
+
+a:visited {
+  color: #444;
+}
+
+button:hover, input[type=submit]:hover, input[type=button]:hover, select:focus
+{
+  background-color: rgb(106, 120, 145);
+}
+
+button:active, input[type=submit]:active, input[type=button]:active
+{
+  background-color: rgb(37, 41, 47);
+  background-image: -webkit-gradient(
+    linear,
+    left top,
+    left bottom,
+    color-stop(0.00, rgba(0, 0, 0, 0.3)),
+    color-stop(0.50, rgba(0, 0, 0, 0.0))
+  );
+  background-image: -webkit-linear-gradient(
+    top,
+    rgba(0, 0, 0, 0.3) 0%,
+    rgba(0, 0, 0, 0.0) 50%
+  );
+  background-image: -moz-linear-gradient(
+    top,
+    rgba(0, 0, 0, 0.3) 0%,
+    rgba(0, 0, 0, 0.0) 50%
+  );
+  background-image: linear-gradient(
+    top,
+    rgba(0, 0, 0, 0.3) 0%,
+    rgba(0, 0, 0, 0.0) 50%
+  );
+  border-color: rgb(36, 40, 46);
+  border-bottom-color: rgb(81, 83, 91);
+}
+
+textarea.code {
+  display: block;
+  margin-left: 10px;
+  margin-right: 10px;
+  font-size: 75%;
+  min-height: 40px;
+  max-width: 90%;
+  min-width: 90%;
+}
+
+textarea.code:disabled {
+  color: #fff;
+}
+
+.avatar, .avatar img {
+  width: 80px;
+  height: 80px;
+}
+
+.avatar {
+  display: inline-block;
+  border: 2px solid white;
+  vertical-align: middle;
+  border-radius: 0.15em;
+  background: white;
+}
+
+.avatar img {
+  border-radius: 0.15em;
+  margin-bottom: 2px;
+}
+
+h2.slogan {
+  font-size: 1.7em; 
+  bottom: 6%;
+}
+
+form {
+  width: 100%;
+  text-align: center;
+}
+
+ul.steps {
+  font-size: 1.6em;
+  width: 12em;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+ul.steps li {
+  padding: 0.3em;
+  list-style-type: none;
+  border-bottom: 1px solid white;
+  color: #ddd;
+  box-shadow: 0 0 35px #111111 inset;
+  background: #222;
+}
+
+ul.steps li a {
+  color: #ddd;
+  text-decoration: none;
+}
+
+ul.steps li:first-child {
+  border-radius: 8px 8px 0 0;
+}
+
+ul.steps li:last-child {
+  border: none;
+  border-radius: 0 0 8px 8px;
+}
+
+ul.steps li:hover {
+  cursor: pointer;
+  color: white;
+  background: #444;
+}
+
+ul.steps span {
+  display: inline-block;
+  vertical-align: middle;
+  width: 1.8em;
+  height: 1.8em;
+  font-size: 0.8em;
+  text-align: center;
+  padding: 0;
+  color: white;
+  text-shadow: -1px -1px 2px #444, 2px 2px 2px #222;
+}
+
+ul.steps span img {
+  height: 1.8em;
+}
+
+#signup form {
+  position: relative;
+  margin: 10% 0;
+  text-align: center;
+}
+
+#signup button {
+  font-size: 2.2em;
+  width: 9em;
+  height: 2.7em;
+  padding-right: 0.6em;
+  padding-top: 0.3em;
+  padding-bottom: 0;
+  padding-left: 0;
+}
+
+#signup button img {
+  vertical-align: middle;
+  margin-bottom: 0.3em;
+  margin-right: 0.3em;
+}
+
+h2.greeting, h2.status {
+  margin-top: 0.1em;
+  margin-bottom: 1.3em;
+}
+
+div.player, .dashboard {
+  border: 2px solid #CCC;
+  padding-top: 1em;
+  padding-left: 1.2em;
+  border-radius: 0.4em;
+  background-color: #111;
+}
+
+div.signout form input[type=submit] {
+  border: none;
+  background: transparent;
+  color: #A44;
+  font-size: 100%;
+  float: right;
+  margin-bottom: 0.5em;
+  margin-right: 0.5em;
+  box-shadow: none;
+  padding: 0;
+  
+}
+
+div.signout form input[type=submit]:hover {
+  text-decoration: underline;
+  cursor: pointer;
+}
+
+div.clear {
+  clear: both;
+}
+
+iframe.player {
+  border: none;
+  width: 220px;
+  height: 350px;
+  margin-left: auto;
+  margin-right: auto;
+  display: block;
+  overflow: hidden;
+  margin-bottom: 10px;
+  scrolling: no;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/experiment.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/experiment.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/experiment.js	(revision 28388)
@@ -0,0 +1,45 @@
+var domReady = function ()
+{
+    var fileChooser = document.forms['uploadData']['fileChooser'];
+    fileChooser.onchange = function(ev) {
+        readFile()
+    }
+
+    function readFile() {
+        var file = fileChooser.files[0];
+        console.log("Reading file " + file.name);
+
+	console.info("**** forcing hardwired URL");
+	var url = "http://localhost:8383/greenstone3/sites/localsite/collect/js-dsp/import/AFIH.mp3"
+
+
+	var stream = new Mad.AjaxStream(url);
+
+        //new Mad.FileStream(file, function(stream) {
+        //new Mad.AjaxStream(url, function(stream) {
+
+	stream.requestAbsolute(1 * 1024, function () {
+            var mp3 = new Mad.MP3File(stream);
+            console.log("File loaded");
+            var mpeg = mp3.getMpegStream();
+          
+            var howmuch = 10000; 
+            var ss1 = Date.now();
+            console.log("Decoding first " + howmuch + " frames"); 
+            var frame = new Mad.Frame();
+
+            for(var i = 0; i < howmuch; i += 1) {
+		try {
+                    frame = Mad.Frame.decode(frame, mpeg);
+		}
+		catch(err) {
+		    console.log("*** decoding terminated at: " + i);
+		    break;
+		}
+            }
+            var ss2 = Date.now();
+            console.log("Done in " + (ss2 - ss1) + "ms");
+        });
+    }
+};
+document.addEventListener("DOMContentLoaded", domReady, false);
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/index.html
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/index.html	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/index.html	(revision 28388)
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <title>jsmad experiment</title>
+        <link rel="stylesheet" href="application.css" type="text/css" media="screen" />
+        <script type="text/javascript" src="src/mad.js"></script>
+        <script type="text/javascript" src="src/rq_table.js"></script>
+        <script type="text/javascript" src="src/imdct_s.js"></script>
+        <script type="text/javascript" src="src/huffman.js"></script>
+        <script type="text/javascript" src="src/bit.js"></script>
+        <script type="text/javascript" src="src/stream.js"></script>
+        <script type="text/javascript" src="src/layer3.js"></script>
+        <script type="text/javascript" src="src/frame.js"></script>
+        <script type="text/javascript" src="src/synth.js"></script>
+       
+        <script type="text/javascript" src="src/arraybuffer/bytestream.js"></script>
+        <script type="text/javascript" src="src/arraybuffer/filestream.js"></script>
+        <script type="text/javascript" src="src/arraybuffer/substream.js"></script>
+        <script type="text/javascript" src="src/arraybuffer/arraystream.js"></script>
+        <script type="text/javascript" src="src/arraybuffer/ajaxstream.js"></script>
+
+        <script type="text/javascript" src="src/binarystring/bytestream.js"></script>
+        <script type="text/javascript" src="src/binarystring/filestream.js"></script>
+        <script type="text/javascript" src="src/binarystring/substream.js"></script>
+        <script type="text/javascript" src="src/binarystring/stringstream.js"></script>
+        <script type="text/javascript" src="src/binarystring/ajaxstream.js"></script>
+
+        <script type="text/javascript" src="src/id3v22stream.js"></script>
+        <script type="text/javascript" src="src/id3v23stream.js"></script>
+        <script type="text/javascript" src="src/mp3file.js"></script>
+        
+        <script type="text/javascript" src="src/player.js"></script>   </head>
+    <body>
+        <div id="content">
+            <form id="uploadData">
+                <label for="fileChooser"><h2>Select an MP3 file</h2></label> 
+                <input id="fileChooser" type="file" />
+            </form>
+        </div>
+
+        <script type="text/javascript" src="experiment.js"></script>   </head>
+    </body>
+</html>
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/ajaxstream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/ajaxstream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/ajaxstream.js	(revision 28388)
@@ -0,0 +1,159 @@
+Mad.ArrayBuffers.AjaxStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function (url) {
+        this.offset = 0;
+
+        var request = new XMLHttpRequest();
+        request.open('GET', url);
+        request.responseType = "arraybuffer";
+        
+        this.request = request;
+        this.amountRead = 0;
+        this.inProgress = true;
+        this.finalAmount = false;
+        this.callbacks = [];
+        this.buffer = new Uint8Array(0);
+        
+        var self = this;
+        
+        var iteration = 0;
+        
+        var ochange = function () {
+            console.log("ochange! callbacks.length = " + self.callbacks.length + ", iteration = " + iteration);
+            console.log("readyState = " + request.readyState + ", amountRead = " + self.amountRead + ", contentLength = " + self.contentLength);
+            iteration += 1;
+            if ((self.callbacks.length > 0 && iteration % 32 === 0) || iteration % 256 === 0) {
+                self.updateBuffer();
+                
+                var newCallbacks = [];
+                
+                for (var i = 0; i < self.callbacks.length; i++) {
+                    console.log("Handling callback " + i);
+                    var callback = self.callbacks[i];
+                    
+                    if (callback[0] < self.amountRead) {
+                        try {
+                                callback[1]();
+                        } catch (e) {
+                                console.log(e);
+                        }
+                    } else {
+                        newCallbacks.push(callback);
+                    }
+                }
+                
+                self.callbacks = newCallbacks;
+            }
+            
+            if (request.readyState === 4) {
+                self.updateBuffer();
+                self.amountRead = self.contentLength;
+                for (var i = 0; i < self.callbacks.length; i++) {
+                    var callback = self.callbacks[i];
+                    callback[1]();
+                }
+                
+                window.clearInterval(self.timer);
+                
+                self.inProgress = false;
+            }
+        }
+        
+        request.onprogress = ochange;
+        
+        this.timer = window.setInterval(ochange, 250);
+        
+        request.send(null);
+    },
+
+    updateBuffer: function() {
+        console.log("updateBuffer!");
+        if (!this.finalAmount && this.request.response) {
+            this.arrayBuffer = this.request.response;
+            this.buffer = new Uint8Array(this.arrayBuffer);
+            this.amountRead = this.buffer.length;
+            console.log("typeof buffer = " + typeof(this.arrayBuffer) + ", amountRead = " + this.amountRead);
+            this.contentLength = this.request.getResponseHeader('Content-Length');
+            if(!this.contentLength) {
+                // if the server doesn't send a Content-Length Header, just use amountRead instead
+                // it's less precise at first, but once everything is buffered it becomes accurate.
+                this.contentLength = this.amountRead;
+            }
+        
+            if (!this.inProgress) {
+                this.finalAmount = true;
+            }
+            
+            return true;
+        } else {
+            return false;
+        }
+    },
+
+    absoluteAvailable: function(n, updated) {
+        if (n > this.amountRead) {
+            if (updated) {
+                throw new Error("buffer underflow with absoluteAvailable!");
+            } else if (this.updateBuffer()) {
+                return this.absoluteAvailable(n, true);
+            } else {
+                return false;
+            }
+        } else {
+            return true;
+        }
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+
+    read: function(n) {
+        var result = this.peek(n);
+        this.seek(n);
+        return result;
+    },
+
+    peek: function(n) {
+        if (this.available(n)) {
+            var offset = this.offset;
+            
+            var result = this.get(offset, n);
+            
+            return result;
+        } else {
+            throw new Error("buffer underflow with peek!");
+        }
+    },
+
+    get: function(offset, length) {
+        if (offset + length < this.amountRead) {
+            var subarr = this.buffer.subarray(offset, offset + length);
+            return subarr;
+        } else {
+            throw 'TODO: THROW GET ERROR!';
+        }
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.buffer[offset];
+    },
+
+    substream: function (offset, length) {
+        return new Mad.ArrayBuffers.SubStream(this, offset, length);
+    },
+
+    requestAbsolute: function(n, callback) {
+        console.log("requestAbsolute(" + n + ", ...), amountRead = " + this.amountRead);
+        if (n < this.amountRead) {
+            console.log("all fine, calling callback :)");
+            callback();
+        } else {
+            console.log("pushing callback on queue");
+            this.callbacks.push([n, callback]);
+        }
+    },
+
+    request: function(n, callback) {
+        this.requestAbsolute(this.offset + n, callback);
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/arraystream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/arraystream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/arraystream.js	(revision 28388)
@@ -0,0 +1,55 @@
+
+Mad.ArrayBuffers.ArrayStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function (buffer) {
+        this.offset        = 0;
+        this.buffer        = buffer;
+        this.amountRead    = this.buffer.length;
+        this.contentLength = this.buffer.length;
+        this.length = this.amountRead;
+    },
+
+    substream: function (offset, length) {
+        return new Mad.ArrayBuffers.SubStream(this, offset, length);
+    },
+
+    absoluteAvailable: function(n, updated) {
+        return n < this.amountRead;
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.buffer[offset];
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+
+    read: function(n) {
+        var result = this.peek(n);
+        
+        this.seek(n);
+        
+        return result;
+    },
+
+    peek: function(n) {
+        if (this.available(n)) {
+            var offset = this.offset;
+            
+            var result = this.get(offset, n);
+            
+            return result;
+        } else {
+            throw 'TODO: THROW PEEK ERROR!';
+        }
+    },
+
+    get: function(offset, length) {
+        if (offset + length < this.contentLength) {
+            var subarr = this.buffer.subarray(offset, offset + length);
+            return subarr;
+        } else {
+            throw 'TODO: THROW GET ERROR!';
+        }
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/bytestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/bytestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/bytestream.js	(revision 28388)
@@ -0,0 +1,149 @@
+
+Mad.ArrayBuffers.ByteStream = Class.extend({
+    available: function(n) {
+        return this.absoluteAvailable(this.offset + n);
+    },
+
+    strEquals: function (offset, string) {
+        for (var i = 0; i < string.length; i++) {
+            if(this.getU8(offset + i, false) != string.charCodeAt(i)) return false;
+        }
+        return true;
+    },
+
+    getU8: function(offset, bigEndian) {
+        var bytes = this.get(offset, 1);
+        throw 'Wtf bytestream?'
+        return bytes[0];
+    },
+
+    getU16: function(offset, bigEndian) {
+        var bytes = this.get(offset, 2);
+        if (!bigEndian) {
+            bytes = bytes.reverse();
+        }
+        return (bytes[0] << 8) | bytes[1];
+    },
+
+    getU24: function(offset, bigEndian) {
+        var bytes = this.get(offset, 3);
+        if (!bigEndian) {
+            bytes = bytes.reverse();
+        }
+        return (bytes[0] << 16) | (bytes[1] << 8) | bytes[2];
+    },
+
+    getU32: function(offset, bigEndian) {
+        var bytes = this.get(offset, 4);
+        if (!bigEndian) {
+            bytes = bytes.reverse();
+        }
+        return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
+    },
+
+    getI8: function(offset, bigEndian) {
+        return this.getU8(offset, bigEndian) - 128;            // 2 ** 7
+    },
+
+    getI16: function(offset, bigEndian) {
+        return this.getU16(offset, bigEndian) - 65536;         // 2 ** 15
+    },
+
+    getI32: function(offset, bigEndian) {
+        return this.getU32(offset, bigEndian) - 2147483648;    // 2 ** 31
+    },
+
+    getSyncInteger: function(offset) {
+        var bytes = this.get(offset, 4);
+        return (bytes[0] << 21) | (bytes[1] << 14) | (bytes[2] << 7) | bytes[3];
+    },
+
+    peekU8: function(bigEndian) {
+        return this.getU8(this.offset, bigEndian);
+    },
+
+    peekU16: function(bigEndian) {
+        return this.getU16(this.offset, bigEndian);
+    },
+
+    peekU24: function(bigEndian) {
+        return this.getU24(this.offset, bigEndian);
+    },
+
+    peekU32: function(bigEndian) {
+        return this.getU32(this.offset, bigEndian);
+    },
+
+    peekI8: function(bigEndian) {
+        return this.getI8(this.offset, bigEndian);
+    },
+
+    peekI16: function(bigEndian) {
+        return this.getI16(this.offset, bigEndian);
+    },
+
+    peekI32: function(bigEndian) {
+        return this.getI32(this.offset, bigEndian);
+    },
+
+    peekSyncInteger: function() {
+        return this.getSyncInteger(this.offset);
+    },
+
+    readU8: function(bigEndian) {
+        var result = this.peekU8(bigEndian);
+        this.seek(1);
+        return result;
+    },
+
+    readU16: function(bigEndian) {
+        var result = this.peekU16(bigEndian);
+        this.seek(2);
+        return result;
+    },
+
+    readU24: function(bigEndian) {
+        var result = this.peekU24(bigEndian);
+        this.seek(3);
+        return result;
+    },
+
+    readU32: function(bigEndian) {
+        var result = this.peekU32(bigEndian);
+        this.seek(4);
+        return result;
+    },
+
+    readI8: function(bigEndian) {
+        var result = this.peekI8(bigEndian);
+        this.seek(1);
+        return result;
+    },
+
+    readI16: function(bigEndian) {
+        var result = this.peekI16(bigEndian);
+        this.seek(2);
+        return result;
+    },
+
+    readI32: function(bigEndian) {
+        var result = this.peekI32(bigEndian);
+        this.seek(4);
+        return result;
+    },
+
+    readSyncInteger: function() {
+        var result = this.getSyncInteger(this.offset);
+        this.seek(4);
+        return result;
+    },
+
+    readAsString: function(n) {
+        var arr = this.read(n);
+        var str = "";
+        for (var i = 0; i < n; i++) {
+            str += String.fromCharCode(arr[i]);
+        }
+        return str;
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/filestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/filestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/filestream.js	(revision 28388)
@@ -0,0 +1,75 @@
+
+Mad.ArrayBuffers.FileStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function (file, callback) {
+        this.offset        = 0;
+
+        // Check for the various File API support.
+        if (window.File && window.FileReader && window.FileList && window.Blob) {
+            // Great success! All the File APIs are supported.
+        } else {
+            alert('The File APIs are not fully supported in this browser.');
+            return null;
+        } 
+        
+        var self = this;
+        var reader = new FileReader();
+        reader.onload = function () {
+          self.buffer        = new Uint8Array(reader.result);
+          self.amountRead    = self.buffer.length;
+          self.contentLength = self.buffer.length;
+          self.length = self.amountRead;
+          
+          callback(self);
+        }
+        
+        reader.onerror = function () {
+            console.log("Error loading file " + file);
+        }
+
+        // Only supported from Firefox 7 and Chrome 'Something'
+        reader.readAsArrayBuffer(file);
+    },
+
+    substream: function (offset, length) {
+        return new Mad.ArrayBuffers.SubStream(this, offset, length);
+    },
+
+    absoluteAvailable: function(n, updated) {
+        return n < this.amountRead;
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.buffer[offset];
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+
+    read: function(n) {
+        var result = this.peek(n);
+        this.seek(n);
+        return result;
+    },
+
+    peek: function(n) {
+        if (this.available(n)) {
+            var offset = this.offset;
+            
+            var result = this.get(offset, n);
+            
+            return result;
+        } else {
+            throw 'TODO: THROW PEEK ERROR!';
+        }
+    },
+
+    get: function(offset, length) {
+        if (offset + length < this.contentLength) {
+            var subarr = this.buffer.subarray(offset, offset + length);
+            return subarr;
+        } else {
+            throw 'TODO: THROW GET ERROR!';
+        }
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/substream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/substream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/arraybuffer/substream.js	(revision 28388)
@@ -0,0 +1,59 @@
+
+Mad.ArrayBuffers.SubStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function(stream, offset, length) {
+        this.offset = 0; 
+        this.start = offset;
+        this.parentStream = stream;
+        this.length = length;
+    },
+
+    substream: function (offset, length) {
+        return new Mad.SubStream(this.parentStream, this.start + offset, length);
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.parentStream.getU8(this.start + offset, bigEndian);
+    },
+
+    getU16: function(offset, bigEndian) {
+        return this.parentStream.getU16(this.start + offset, bigEndian);
+    },
+
+    getU32: function(offset, bigEndian) {
+        return this.parentStream.getU32(this.start + offset, bigEndian);
+    },
+
+    absoluteAvailable: function(n) {
+        return this.parentStream.absoluteAvailable(this.start + n);
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+ 
+    read: function(n) {
+        var result = this.peek(n);
+        this.seek(n);
+        return result;
+    },
+               
+    peek: function(n) {
+        return this.get(this.offset, n);
+    },
+
+    get: function(offset, length) {
+        return this.parentStream.get(this.start + offset, length);
+    },
+
+    slice: function(start, end) {
+        return this.parentStream.get(this.start + start, end - start);
+    },
+
+    requestAbsolute: function(n, callback) {
+        this.parentStream.requestAbsolute(this.start + n)
+    },
+
+    request: function(n, callback) {
+        this.parentStream.requestAbsolute(this.start + this.offset + n)
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binaryajax.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binaryajax.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binaryajax.js	(revision 28388)
@@ -0,0 +1,278 @@
+
+/*
+ * Binary Ajax 0.1.10
+ * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/
+ * Licensed under the MPL License [http://www.nihilogic.dk/licenses/mpl-license.txt]
+ */
+
+
+var BinaryFile = function(strData, iDataOffset, iDataLength) {
+    var data = strData;
+    var dataOffset = iDataOffset || 0;
+    var dataLength = 0;
+
+    this.getRawData = function() {
+        return data;
+    }
+
+    if (typeof strData === "string") {
+        dataLength = iDataLength || data.length;
+
+        this.getByteAt = function(iOffset) {
+            return data.charCodeAt(iOffset + dataOffset) & 0xFF;
+        }
+
+        this.getBytesAt = function(iOffset, iLength) {
+            var aBytes = [];
+
+            for (var i = 0; i < iLength; i++) {
+                aBytes[i] = data.charCodeAt((iOffset + i) + dataOffset) & 0xFF
+            };
+
+            return aBytes;
+        }
+    } else if (typeof strData === "unknown") {
+        dataLength = iDataLength || IEBinary_getLength(data);
+
+        this.getByteAt = function(iOffset) {
+            return IEBinary_getByteAt(data, iOffset + dataOffset);
+        }
+
+        this.getBytesAt = function(iOffset, iLength) {
+            return new VBArray(IEBinary_getBytesAt(data, iOffset + dataOffset, iLength)).toArray();
+        }
+    }
+
+    this.getLength = function() {
+        return dataLength;
+    }
+
+    this.getSByteAt = function(iOffset) {
+        var iByte = this.getByteAt(iOffset);
+        if (iByte > 127)
+            return iByte - 256;
+        else
+            return iByte;
+    }
+
+    this.getShortAt = function(iOffset, bBigEndian) {
+        var iShort = bBigEndian ? 
+            (this.getByteAt(iOffset) << 8) + this.getByteAt(iOffset + 1)
+            : (this.getByteAt(iOffset + 1) << 8) + this.getByteAt(iOffset)
+            if (iShort < 0) iShort += 65536;
+        return iShort;
+    }
+    this.getSShortAt = function(iOffset, bBigEndian) {
+        var iUShort = this.getShortAt(iOffset, bBigEndian);
+        if (iUShort > 32767)
+            return iUShort - 65536;
+        else
+            return iUShort;
+    }
+    this.getLongAt = function(iOffset, bBigEndian) {
+        var iByte1 = this.getByteAt(iOffset),
+            iByte2 = this.getByteAt(iOffset + 1),
+            iByte3 = this.getByteAt(iOffset + 2),
+            iByte4 = this.getByteAt(iOffset + 3);
+
+        var iLong = bBigEndian ? 
+            (((((iByte1 << 8) + iByte2) << 8) + iByte3) << 8) + iByte4
+            : (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1;
+        if (iLong < 0) iLong += 4294967296;
+        return iLong;
+    }
+    this.getSLongAt = function(iOffset, bBigEndian) {
+        var iULong = this.getLongAt(iOffset, bBigEndian);
+        if (iULong > 2147483647)
+            return iULong - 4294967296;
+        else
+            return iULong;
+    }
+
+    this.getStringAt = function(iOffset, iLength) {
+        var aStr = [];
+
+        var aBytes = this.getBytesAt(iOffset, iLength);
+        for (var j=0; j < iLength; j++) {
+            aStr[j] = String.fromCharCode(aBytes[j]);
+        }
+        return aStr.join("");
+    }
+
+    this.getCharAt = function(iOffset) {
+        return String.fromCharCode(this.getByteAt(iOffset));
+    }
+    this.toBase64 = function() {
+        return window.btoa(data);
+    }
+    this.fromBase64 = function(strBase64) {
+        data = window.atob(strBase64);
+    }
+}
+
+
+var BinaryAjax = (function() {
+
+        function createRequest() {
+        var oHTTP = null;
+        if (window.ActiveXObject) {
+        oHTTP = new ActiveXObject("Microsoft.XMLHTTP");
+        } else if (window.XMLHttpRequest) {
+        oHTTP = new XMLHttpRequest();
+        }
+        return oHTTP;
+        }
+
+        function getHead(strURL, fncCallback, fncError) {
+        var oHTTP = createRequest();
+        if (oHTTP) {
+        if (fncCallback) {
+        if (typeof(oHTTP.onload) != "undefined") {
+        oHTTP.onload = function() {
+        if (oHTTP.status === "200") {
+        fncCallback(this);
+        } else {
+            if (fncError) fncError();
+        }
+        oHTTP = null;
+        };
+        } else {
+            oHTTP.onreadchange = function() {
+                if (oHTTP.readyState === 4) {
+                    if (oHTTP.status === "200") {
+                        fncCallback(this);
+                    } else {
+                        if (fncError) fncError();
+                    }
+                    oHTTP = null;
+                }
+            };
+        }
+        }
+        oHTTP.open("HEAD", strURL, true);
+        oHTTP.send(null);
+        } else {
+            if (fncError) fncError();
+        }
+        }
+
+        function sendRequest(strURL, fncCallback, fncError, aRange, bAcceptRanges, iFileSize) {
+            var oHTTP = createRequest();
+            if (oHTTP) {
+
+                var iDataOffset = 0;
+                if (aRange && !bAcceptRanges) {
+                    iDataOffset = aRange[0];
+                }
+                var iDataLen = 0;
+                if (aRange) {
+                    iDataLen = aRange[1]-aRange[0]+1;
+                }
+
+                if (fncCallback) {
+                    if (typeof(oHTTP.onload) != "undefined") {
+                        oHTTP.onload = function() {
+                            if (oHTTP.status === "200" || oHTTP.status === "206" || oHTTP.status === "0") {
+                                oHTTP.binaryResponse = new BinaryFile(oHTTP.responseText, iDataOffset, iDataLen);
+                                oHTTP.fileSize = iFileSize || oHTTP.getResponseHeader("Content-Length");
+                                fncCallback(oHTTP);
+                            } else {
+                                if (fncError) fncError();
+                            }
+                            oHTTP = null;
+                        };
+                    } else {
+                        oHTTP.onreadchange = function() {
+                            if (oHTTP.readyState === 4) {
+                                if (oHTTP.status === "200" || oHTTP.status === "206" || oHTTP.status === "0") {
+                                    // IE6 craps if we try to extend the XHR object
+                                    var oRes = {
+status : oHTTP.status,
+         // IE needs responseBody, Chrome/Safari needs responseText
+         binaryResponse : new BinaryFile(
+                 typeof oHTTP.responseBody === "unknown" ? oHTTP.responseBody : oHTTP.responseText, iDataOffset, iDataLen
+                 ),
+         fileSize : iFileSize || oHTTP.getResponseHeader("Content-Length")
+                                    };
+                                    fncCallback(oRes);
+                                } else {
+                                    if (fncError) fncError();
+                                }
+                                oHTTP = null;
+                            }
+                        };
+                    }
+                }
+                oHTTP.open("GET", strURL, true);
+
+                if (oHTTP.overrideMimeType) oHTTP.overrideMimeType('text/plain; charset=x-user-defined');
+
+                if (aRange && bAcceptRanges) {
+                    oHTTP.setRequestHeader("Range", "bytes=" + aRange[0] + "-" + aRange[1]);
+                }
+
+                oHTTP.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 1970 00:00:00 GMT");
+
+                oHTTP.send(null);
+            } else {
+                if (fncError) fncError();
+            }
+        }
+
+        return function(strURL, fncCallback, fncError, aRange) {
+
+            if (aRange) {
+                getHead(
+                        strURL, 
+                        function(oHTTP) {
+                        var iLength = parseInt(oHTTP.getResponseHeader("Content-Length"),10);
+                        var strAcceptRanges = oHTTP.getResponseHeader("Accept-Ranges");
+
+                        var iStart, iEnd;
+                        iStart = aRange[0];
+                        if (aRange[0] < 0) 
+                        iStart += iLength;
+                        iEnd = iStart + aRange[1] - 1;
+
+                        sendRequest(strURL, fncCallback, fncError, [iStart, iEnd], (strAcceptRanges === "bytes"), iLength);
+                        }
+                       );
+
+            } else {
+                sendRequest(strURL, fncCallback, fncError);
+            }
+        }
+
+}());
+
+/*
+   document.write(
+   "<script type='text/vbscript'>\r\n"
+   + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n"
+   + "	IEBinary_getByteAt = AscB(MidB(strBinary,iOffset+1,1))\r\n"
+   + "End Function\r\n"
+   + "Function IEBinary_getLength(strBinary)\r\n"
+   + "	IEBinary_getLength = LenB(strBinary)\r\n"
+   + "End Function\r\n"
+   + "</script>\r\n"
+   );
+   */
+
+document.write(
+        "<script type='text/vbscript'>\r\n"
+        + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n"
+        + "	IEBinary_getByteAt = AscB(MidB(strBinary, iOffset + 1, 1))\r\n"
+        + "End Function\r\n"
+        + "Function IEBinary_getBytesAt(strBinary, iOffset, iLength)\r\n"
+        + "  Dim aBytes()\r\n"
+        + "  ReDim aBytes(iLength - 1)\r\n"
+        + "  For i = 0 To iLength - 1\r\n"
+        + "   aBytes(i) = IEBinary_getByteAt(strBinary, iOffset + i)\r\n"  
+        + "  Next\r\n"
+        + "  IEBinary_getBytesAt = aBytes\r\n" 
+        + "End Function\r\n"
+        + "Function IEBinary_getLength(strBinary)\r\n"
+        + "	IEBinary_getLength = LenB(strBinary)\r\n"
+        + "End Function\r\n"
+        + "</script>\r\n"
+        );
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/ajaxstream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/ajaxstream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/ajaxstream.js	(revision 28388)
@@ -0,0 +1,166 @@
+Mad.BinaryStrings.AjaxStream = function(url) {
+    this.offset = 0; 
+    var request = window.XMLHttpRequest ? new XMLHttpRequest() :  ActiveXObject("Microsoft.XMLHTTP");
+    
+    // pseudo-binary XHR
+    request.overrideMimeType('text/plain; charset=x-user-defined');
+    request.open('GET', url);
+    
+    this.request = request;
+    this.amountRead = 0;
+    this.inProgress = true;
+    this.callbacks = [];
+    
+    var self = this;
+    
+    var iteration = 0;
+    
+    var ochange = function () {
+        iteration += 1;
+        if ((self.callbacks.length > 0 && iteration % 64 === 0) || iteration % 256 === 0) {
+            self.updateBuffer();
+            
+            var newCallbacks = [];
+            
+            for (var i = 0; i < self.callbacks.length; i++) {
+                var callback = self.callbacks[i];
+                
+                if (callback[0] < self.amountRead) {
+					try {
+						callback[1]();
+					} catch (e) {
+						console.log(e);
+					}
+                } else {
+                    newCallbacks.push(callback);
+                }
+            }
+            
+            self.callbacks = newCallbacks;
+        }
+        
+        if (request.readyState === 4) {
+			self.amountRead = self.contentLength;
+            for (var i = 0; i < self.callbacks.length; i++) {
+                var callback = self.callbacks[i];
+                callback[1]();
+            }
+            
+            window.clearInterval(self.timer);
+            
+            self.inProgress = false;
+        }
+    }
+    
+    request.onreadchange = ochange;
+    
+    this.timer = window.setInterval(ochange, 250);
+    
+    request.send(null);
+}
+
+Mad.BinaryStrings.AjaxStream.prototype = new Mad.BinaryStrings.ByteStream();
+
+Mad.BinaryStrings.AjaxStream.prototype.updateBuffer = function() {
+    if (!this.finalAmount) {
+        this.arrayBuffer = this.request.mozResponseArrayBuffer;
+        if(this.arrayBuffer) {
+			this.byteBuffer = new Uint8Array(this.arrayBuffer);
+			this.amountRead = this.arrayBuffer.byteLength;
+		} else {
+			this.buffer = this.request.responseText
+			this.amountRead = this.buffer.length;
+		}
+        
+		this.contentLength = this.request.getResponseHeader('Content-Length');
+		if(!this.contentLength) {
+			// if the server doesn't send a Content-Length Header, just use amountRead instead
+			// it's less precise at first, but once everything is buffered it becomes accurate.
+			this.contentLength = this.amountRead;
+		}
+    
+        if (!this.inProgress) {
+            this.finalAmount = true;
+        }
+        
+        return true;
+    } else {
+        return false;
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.absoluteAvailable = function(n, updated) {
+    if (n > this.amountRead) {
+        if (updated) {
+            throw new Error("buffer underflow with absoluteAvailable!");
+        } else if (this.updateBuffer()) {
+            return this.absoluteAvailable(n, true);
+        } else {
+            return false;
+        }
+    } else {
+        return true;
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.seek = function(n) {
+    this.offset += n;
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.peek = function(n) {
+    if (this.available(n)) {
+        var offset = this.offset;
+        
+        var result = this.get(offset, n);
+        
+        return result;
+    } else {
+        throw new Error("buffer underflow with peek!");
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.get = function(offset, length) {
+    if (this.absoluteAvailable(offset + length)) {
+		var tmpbuffer = "";
+		if(this.byteBuffer) {
+			for(var i = offset; i < offset + length; i += 1) {
+				tmpbuffer = tmpbuffer + String.fromCharCode(this.byteBuffer[i]);
+			}
+		} else {
+			for(var i = offset; i < offset + length; i += 1) {
+				tmpbuffer = tmpbuffer + String.fromCharCode(this.buffer.charCodeAt(i) & 0xff);
+			}
+		}
+		return tmpbuffer;
+    } else {
+		throw new Error("buffer underflow with get!");
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.getU8 = function(offset, bigEndian) {
+	if(this.byteBuffer) {
+		return this.byteBuffer[offset];
+	}
+		
+    return this.get(offset, 1).charCodeAt(0);
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.requestAbsolute = function(n, callback) {
+    if (n < this.amountRead) {
+        callback();
+    } else {
+        this.callbacks.push([n, callback]);
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.request = function(n, callback) {
+    this.requestAbsolute(this.offset + n, callback);
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/bytestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/bytestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/bytestream.js	(revision 28388)
@@ -0,0 +1,161 @@
+Mad.BinaryStrings.ByteStream = function(url) { }
+
+Mad.BinaryStrings.ByteStream.prototype.available = function(n) {
+    return this.absoluteAvailable(this.offset + n);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.strEquals = function (offset, string) {
+    for (var i = 0; i < string.length; i++) {
+        if(this.getU8(offset + i, false) != string.charCodeAt(i)) return false;
+    }
+    return true;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU8 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 1);
+    return bytes.charCodeAt(0);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU16 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 2);
+    
+    if (!bigEndian) {
+        bytes = bytes.reverse();
+    }
+    
+    return (bytes.charCodeAt(0) << 8) | bytes.charCodeAt(1);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU24 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 3);
+    
+    if (!bigEndian) {
+        bytes = bytes.reverse();
+    }
+    
+    return (bytes.charCodeAt(0) << 16) | (bytes.charCodeAt(1) << 8) | bytes.charCodeAt(2);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU32 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 4);
+    
+    if (!bigEndian) {
+        bytes = bytes.reverse();
+    }
+    
+    return (bytes.charCodeAt(0) << 24) | (bytes.charCodeAt(1) << 16) | (bytes.charCodeAt(2) << 8) | bytes.charCodeAt(3);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getI8 = function(offset, bigEndian) {
+    return this.getU8(offset, bigEndian) - 128;            // 2 ** 7
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getI16 = function(offset, bigEndian) {
+    return this.getU16(offset, bigEndian) - 65536;         // 2 ** 15
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getI32 = function(offset, bigEndian) {
+    return this.getU32(offset, bigEndian) - 2147483648;    // 2 ** 31
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getSyncInteger = function(offset) {
+    var bytes = this.get(offset, 4);
+    
+    return (bytes.charCodeAt(0) << 21) | (bytes.charCodeAt(1) << 14) | (bytes.charCodeAt(2) << 7) | bytes.charCodeAt(3);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU8 = function(bigEndian) {
+    return this.getU8(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU16 = function(bigEndian) {
+    return this.getU16(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU24 = function(bigEndian) {
+    return this.getU24(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU32 = function(bigEndian) {
+    return this.getU32(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekI8 = function(bigEndian) {
+    return this.getI8(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekI16 = function(bigEndian) {
+    return this.getI16(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekI32 = function(bigEndian) {
+    return this.getI32(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekSyncInteger = function() {
+    return this.getSyncInteger(this.offset);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU8 = function(bigEndian) {
+    var result = this.peekU8(bigEndian);
+    
+    this.seek(1);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU16 = function(bigEndian) {
+    var result = this.peekU16(bigEndian);
+    
+    this.seek(2);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU24 = function(bigEndian) {
+    var result = this.peekU24(bigEndian);
+    
+    this.seek(3);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU32 = function(bigEndian) {
+    var result = this.peekU32(bigEndian);
+    
+    this.seek(4);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readI8 = function(bigEndian) {
+    var result = this.peekI8(bigEndian);
+    
+    this.seek(1);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readI16 = function(bigEndian) {
+    var result = this.peekI16(bigEndian);
+    
+    this.seek(2);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readI32 = function(bigEndian) {
+    var result = this.peekI32(bigEndian);
+    
+    this.seek(4);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readSyncInteger = function() {
+    var result = this.getSyncInteger(this.offset);
+    
+    this.seek(4);
+    
+    return result;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/filestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/filestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/filestream.js	(revision 28388)
@@ -0,0 +1,62 @@
+Mad.BinaryStrings.FileStream = function(file, callback) {
+    this.offset = 0;
+    var self = this, reader = new FileReader();
+    
+    reader.onload = function () {
+      self['buffer']     = reader.result;
+      self['amountRead'] = self['buffer'].length;
+      self['contentLength'] = self['buffer'].length;
+      
+      self.length = self['amountRead'];
+      
+      callback(self);
+    }
+    
+    reader.onerror = function () {
+        console.log("Error!");
+    }
+    
+    reader.readAsBinaryString(file);
+}
+
+Mad.BinaryStrings.FileStream.prototype = new Mad.BinaryStrings.ByteStream();
+
+Mad.BinaryStrings.FileStream.prototype.absoluteAvailable = function(n, updated) {
+    return n < this['amountRead'];
+}
+
+Mad.BinaryStrings.FileStream.prototype.substream = function (offset, length) {
+    return new Mad.BinaryStrings.SubStream(this, offset, length);
+}
+
+Mad.BinaryStrings.FileStream.prototype.seek = function(n) {
+    this['offset'] += n;
+}
+
+Mad.BinaryStrings.FileStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.FileStream.prototype.peek = function(n) {
+    if (this.available(n)) {
+        var offset = this['offset'];
+        
+        var result = this.get(offset, n);
+        
+        return result;
+    } else {
+        throw 'TODO: THROW PEEK ERROR!';
+    }
+}
+
+Mad.BinaryStrings.FileStream.prototype.get = function(offset, length) {
+    if (this.absoluteAvailable(offset + length)) {
+        return this['buffer'].slice(offset, offset + length);
+    } else {
+        throw 'TODO: THROW GET ERROR!';
+    }
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/stringstream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/stringstream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/stringstream.js	(revision 28388)
@@ -0,0 +1,44 @@
+Mad.BinaryStrings.StringStream = function(string) {
+    this.offset = 0;
+    this.buffer = string;
+    this.amountRead = string.length;
+    this.length = string.length;
+}
+
+Mad.BinaryStrings.StringStream.prototype = new Mad.BinaryStrings.ByteStream();
+
+Mad.BinaryStrings.StringStream.prototype.absoluteAvailable = function(n, updated) {
+    return n < this['amountRead'];
+}
+
+Mad.BinaryStrings.StringStream.prototype.seek = function(n) {
+    this['offset'] += n;
+}
+
+Mad.BinaryStrings.StringStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.StringStream.prototype.peek = function(n) {
+    if (this.available(n)) {
+        var offset = this['offset'];
+        
+        var result = this.get(offset, n);
+        
+        return result;
+    } else {
+        throw 'TODO: THROW PEEK ERROR!';
+    }
+}
+
+Mad.BinaryStrings.StringStream.prototype.get = function(offset, length) {
+    if (this.absoluteAvailable(offset + length)) {
+        return this['buffer'].slice(offset, offset + length);
+    } else {
+        throw 'TODO: THROW GET ERROR!';
+    }
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/substream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/substream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/binarystring/substream.js	(revision 28388)
@@ -0,0 +1,50 @@
+
+Mad.BinaryStrings.SubStream = function(stream, offset, length) {
+    this.offset = 0;
+    this.start = offset;
+    this.parentStream = stream;
+    this.length = length;
+}
+
+Mad.BinaryStrings.SubStream.prototype = new Mad.BinaryStrings.ByteStream;
+
+Mad.BinaryStrings.SubStream.prototype.substream = function (offset, length) {
+    return new Mad.BinaryStrings.SubStream(this.parentStream, this.start + offset, length);
+}
+
+
+Mad.BinaryStrings.SubStream.prototype.absoluteAvailable = function(n) {
+    return this.parentStream.absoluteAvailable(this.start + n);
+}
+
+Mad.BinaryStrings.SubStream.prototype.seek = function(n) {
+    this.offset += n;
+}
+
+Mad.BinaryStrings.SubStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.SubStream.prototype.peek = function(n) {
+    return this.get(this.offset, n);
+}
+
+Mad.BinaryStrings.SubStream.prototype.get = function(offset, length) {
+    return this.parentStream.get(this.start + offset, length);
+}
+
+Mad.BinaryStrings.SubStream.prototype.slice = function(start, end) {
+    return this.parentStream.get(this.start + start, end - start);
+}
+
+Mad.BinaryStrings.SubStream.prototype.requestAbsolute = function(n, callback) {
+    this.parentStream.requestAbsolute(this.start + n)
+}
+
+Mad.BinaryStrings.SubStream.prototype.request = function(n, callback) {
+    this.parentStream.requestAbsolute(this.start + this.offset + n)
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/bit.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/bit.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/bit.js	(revision 28388)
@@ -0,0 +1,148 @@
+
+// Well duh.
+var CHAR_BIT = 8;
+
+/*
+ * NAME:    bit.init()
+ * DESCRIPTION: initialize bit pointer struct
+ */
+Mad.Bit = function (stream, offset) {
+    if (typeof(stream) === 'string') {
+        this.stream = new Mad.BinaryStrings.StringStream(stream);
+    } else if(stream instanceof Uint8Array) {
+        this.stream = new Mad.ArrayBuffers.ArrayStream(stream);
+    } else {
+        this.stream = stream;
+    }
+
+    this.offset = offset;
+
+    this.cache = 0;
+    this.left = CHAR_BIT;
+}
+
+Mad.Bit.prototype.clone = function() {
+    var c = new Mad.Bit(this.stream, this.offset);
+
+    c.cache = this.cache;
+    c.left = this.left;
+
+    return c;
+}
+
+/*
+ * NAME:    bit.length()
+ * DESCRIPTION: return number of bits between start and end points
+ */
+Mad.Bit.prototype.length = function(end) {
+    return this.left + CHAR_BIT * (end.offset - (this.offset + 1)) + (CHAR_BIT - end.left);
+}
+
+/*
+ * NAME:    bit.nextbyte()
+ * DESCRIPTION: return pointer to next unprocessed byte
+ */
+Mad.Bit.prototype.nextbyte = function() {
+    return this.left === CHAR_BIT ? this.offset : this.offset + 1;
+}
+
+/*
+ * NAME:    bit.skip()
+ * DESCRIPTION: advance bit pointer
+ */
+Mad.Bit.prototype.skip = function(len) {
+    this.offset += (len / CHAR_BIT) >> 0; // javascript trick to get integer divison
+    this.left   -= len % CHAR_BIT;
+
+    if (this.left > CHAR_BIT) {
+        this.offset++;
+        this.left += CHAR_BIT;
+    }
+
+    if (this.left < CHAR_BIT) {
+        this.cache = this.stream.getU8(this.offset);
+    }
+}
+
+/*
+ * NAME:    bit.read()
+ * DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value
+ */
+Mad.Bit.prototype.read = function(len) {
+    if(len > 16) {
+        return this.readBig(len);
+    }
+
+    var value = 0;
+
+    if (this.left === CHAR_BIT) {
+        this.cache = this.stream.getU8(this.offset);
+    }
+
+    if (len < this.left) {
+        value = (this.cache & ((1 << this.left) - 1)) >> (this.left - len);
+        this.left -= len;
+
+        return value;
+    }
+
+    /* remaining bits in current byte */
+    value = this.cache & ((1 << this.left) - 1);
+    len  -= this.left;
+
+    this.offset++;
+    this.left = CHAR_BIT;
+
+    /* more bytes */
+    while (len >= CHAR_BIT) {
+        value = (value << CHAR_BIT) | this.stream.getU8(this.offset++);
+        len  -= CHAR_BIT;
+    }
+
+    if (len > 0) {
+        this.cache = this.stream.getU8(this.offset);
+
+        value = (value << len) | (this.cache >> (CHAR_BIT - len));
+        this.left -= len;
+    }
+
+    return value;
+}
+
+Mad.Bit.prototype.readBig = function(len) {
+    var value = 0;
+
+    if (this.left === CHAR_BIT) {
+        this.cache = this.stream.getU8(this.offset);
+    }
+
+    if (len < this.left) {
+        value = (this.cache & ((1 << this.left) - 1)) >> (this.left - len);
+        this.left -= len;
+
+        return value;
+    }
+
+    /* remaining bits in current byte */
+    value = this.cache & ((1 << this.left) - 1);
+    len  -= this.left;
+
+    this.offset++;
+    this.left = CHAR_BIT;
+
+    /* more bytes */
+    while (len >= CHAR_BIT) {
+        value = Mad.bitwiseOr(Mad.lshift(value, CHAR_BIT), this.stream.getU8(this.offset++));
+        len  -= CHAR_BIT;
+    }
+
+    if (len > 0) {
+        this.cache = this.stream.getU8(this.offset);
+
+        value = Mad.bitwiseOr(Mad.lshift(value, len), (this.cache >> (CHAR_BIT - len)));
+        this.left -= len;
+    }
+
+    return value;
+}
+
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/frame.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/frame.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/frame.js	(revision 28388)
@@ -0,0 +1,411 @@
+
+var bitrate_table /* [5][15] */ = [
+/* MPEG-1 */
+[ 0,  32000,  64000,  96000, 128000, 160000, 192000, 224000,  /* Layer I   */
+    256000, 288000, 320000, 352000, 384000, 416000, 448000 ],
+    [ 0,  32000,  48000,  56000,  64000,  80000,  96000, 112000,  /* Layer II  */
+    128000, 160000, 192000, 224000, 256000, 320000, 384000 ],
+    [ 0,  32000,  40000,  48000,  56000,  64000,  80000,  96000,  /* Layer III */
+    112000, 128000, 160000, 192000, 224000, 256000, 320000 ],
+
+    /* MPEG-2 LSF */
+    [ 0,  32000,  48000,  56000,  64000,  80000,  96000, 112000,  /* Layer I   */
+    128000, 144000, 160000, 176000, 192000, 224000, 256000 ],
+    [ 0,   8000,  16000,  24000,  32000,  40000,  48000,  56000,  /* Layers    */
+    64000,  80000,  96000, 112000, 128000, 144000, 160000 ] /* II & III  */
+    ];
+
+    var samplerate_table /* [3] */ = [ 44100, 48000, 32000 ];
+
+    var decoder_table = [
+    function() { console.log("Layer I decoding is not implemented!"); },
+    function() { console.log("Layer II decoding is not implemented!"); },
+    Mad.layer_III
+    ];
+
+    Mad.Layer = {
+I: 1,
+   II: 2,
+   III: 3
+    };
+
+Mad.Mode = {
+SINGLE_CHANNEL      : 0,
+                      DUAL_CHANNEL        : 1,      /* dual channel */
+                      JOINT_STEREO        : 2,      /* joint (MS/intensity) stereo */
+                      STEREO              : 3       /* normal LR stereo */
+};
+
+Mad.Emphasis = {
+NONE       : 0,     /* no emphasis */
+             _50_15_US  : 1,     /* 50/15 microseconds emphasis */
+             CCITT_J_17 : 3,     /* CCITT J.17 emphasis */
+             RESERVED   : 2      /* unknown emphasis */
+};
+
+Mad.Header = function () {
+    this.layer          = 0;            /* audio layer (1, 2, or 3) */
+    this.mode           = 0;            /* channel mode (see above) */
+    this.mode_extension = 0;            /* additional mode info */
+    this.emphasis       = 0;            /* de-emphasis to use (see above) */    
+
+    this.bitrate        = 0;            /* stream bitrate (bps) */
+    this.samplerate     = 0;            /* sampling frequency (Hz) */
+
+    this.crc_check      = 0;            /* frame CRC accumulator */
+    this.crc_target     = 0;            /* final target CRC checksum */
+
+    this.flags          = 0;            /* flags (see below) */
+    this.private_bits   = 0;            /* private bits (see below) */
+
+    //this.duration       = mad_timer_zero;         /* audio playing time of frame */
+};
+
+Mad.Header.prototype.nchannels = function () {
+    return this.mode === 0 ? 1 : 2;
+}
+
+Mad.Header.prototype.nbsamples = function() {
+    return (this.layer === Mad.Layer.I ? 12 : 
+            ((this.layer === Mad.Layer.III && (this.flags & Mad.Flag.LSF_EXT)) ? 18 : 36));
+}
+
+/* libmad's decode_header */
+Mad.Header.actually_decode = function(stream) {
+    var header = new Mad.Header();
+
+    header.flags        = 0;
+    header.private_bits = 0;
+
+    /* header() */
+
+    /* syncword */
+    stream.ptr.skip(11);
+
+    /* MPEG 2.5 indicator (really part of syncword) */
+    if (stream.ptr.read(1) === 0) {
+        header.flags |= Mad.Flag.MPEG_2_5_EXT;
+    }
+
+    /* ID */
+    if (stream.ptr.read(1) === 0) {
+        header.flags |= Mad.Flag.LSF_EXT;
+    } else if (header.flags & Mad.Flag.MPEG_2_5_EXT) {
+        stream.error = Mad.Error.LOSTSYNC;
+        return null;
+    }
+
+    /* layer */
+    header.layer = 4 - stream.ptr.read(2);
+
+    if (header.layer === 4) {
+        stream.error = Mad.Error.BADLAYER;
+        return header;
+    }
+
+    /* protection_bit */
+    if (stream.ptr.read(1) === 0) {
+        header.flags    |= Mad.Flag.PROTECTION;
+        // TODO: crc
+        //header.crc_check = mad_bit_crc(stream.ptr, 16, 0xffff);
+        stream.ptr.skip(16);
+    }
+
+    /* bitrate_index */
+    var index = stream.ptr.read(4);
+    if (index === 15) {
+        stream.error = Mad.Error.BADBITRATE;
+        return header;
+    }
+
+    if (header.flags & Mad.Flag.LSF_EXT) {
+        header.bitrate = bitrate_table[3 + (header.layer >> 1)][index];
+    } else {
+        header.bitrate = bitrate_table[header.layer - 1][index];
+    }
+
+    /* sampling_frequency */
+    index = stream.ptr.read(2);
+
+    if (index === 3) {
+        stream.error = Mad.Error.BADSAMPLERATE;
+        return header;
+    }
+
+    header.samplerate = samplerate_table[index];
+
+    if (header.flags & Mad.Flag.LSF_EXT) {
+        header.samplerate /= 2;
+
+        if (header.flags & Mad.Flag.MPEG_2_5_EXT)
+            header.samplerate /= 2;
+    }
+
+    /* padding_bit */
+    if (stream.ptr.read(1))
+        header.flags |= Mad.Flag.PADDING;
+
+    /* private_bit */
+    if (stream.ptr.read(1))
+        header.private_bits |= Mad.Private.HEADER;
+
+    /* mode */
+    header.mode = 3 - stream.ptr.read(2);
+
+    /* mode_extension */
+    header.mode_extension = stream.ptr.read(2);
+
+    /* copyright */
+    if (stream.ptr.read(1))
+        header.flags |= Mad.Flag.COPYRIGHT;
+
+    /* original/copy */
+    if (stream.ptr.read(1))
+        header.flags |= Mad.Flag.ORIGINAL;
+
+    /* emphasis */
+    header.emphasis = stream.ptr.read(2);
+
+    /* error_check() */
+
+    /* crc_check */
+    if (header.flags & Mad.Flag.PROTECTION)
+        header.crc_target = stream.ptr.read(16);
+
+    return header;
+}
+
+/* libmad's mad_header_decode */
+Mad.Header.decode = function(stream) {
+    var header = null;
+
+    // those are actually pointers. javascript powa.
+    var ptr = stream.next_frame;
+    var end = stream.bufend;
+    var pad_slot = 0;
+    var N = 0;
+
+    /* stream skip */
+    if (stream.skiplen) {
+        if (!stream.sync)
+            ptr = stream.this_frame;
+
+        if (end - ptr < stream.skiplen) {
+            stream.skiplen   -= end - ptr;
+            stream.next_frame = end;
+
+            stream.error = Mad.Error.BUFLEN;
+            return null;
+        }
+
+        ptr += stream.skiplen;
+        stream.skiplen = 0;
+
+        stream.sync = 1;
+    }
+
+    // emulating goto in JS, yay! this was a 'sync:' label
+    var syncing = true;
+
+    while(syncing) {
+        syncing = false;
+
+        /* synchronize */
+        try {
+            if (stream.sync) {
+                if (end - ptr < Mad.BUFFER_GUARD) {
+                    stream.next_frame = ptr;
+
+                    stream.error = Mad.Error.BUFLEN;
+                    return null;
+                } else if (!(stream.getU8(ptr) === 0xff && (stream.getU8(ptr + 1) & 0xe0) === 0xe0)) {
+                    /* mark point where frame sync word was expected */
+                    stream.this_frame = ptr;
+                    stream.next_frame = ptr + 1;
+
+                    stream.error = Mad.Error.LOSTSYNC;
+                    return null;
+                }
+            } else {
+                stream.ptr = new Mad.Bit(stream.stream, ptr);
+
+                if (stream.doSync() === -1) {
+                    if (end - stream.next_frame >= Mad.BUFFER_GUARD)
+                        stream.next_frame = end - Mad.BUFFER_GUARD;
+                    stream.error = Mad.Error.BUFLEN;
+                    return null;
+                }
+
+                ptr = stream.ptr.nextbyte();
+            }
+        } catch (e) {
+            console.log("Synchronization error: " + e);
+
+            stream.error = Mad.Error.BUFLEN;
+
+            return null;
+        }
+
+        /* begin processing */
+        stream.this_frame = ptr;
+        stream.next_frame = ptr + 1;  /* possibly bogus sync word */
+
+        stream.ptr = new Mad.Bit(stream.stream, stream.this_frame);
+
+        header = Mad.Header.actually_decode(stream);
+        if(header === null) return null; // well Duh^2
+
+        //console.log("=============== Decoding layer " + header.layer + " audio mode " +
+        //     header.mode + " with " + header.bitrate +
+        //     " bps and a samplerate of " + header.samplerate);
+
+        /* calculate frame duration */
+        //mad_timer_set(&header.duration, 0, 32 * MAD_NSBSAMPLES(header), header.samplerate);
+
+        /* calculate free bit rate */
+        if (header.bitrate === 0) {
+            console.log("Uh oh, a free bitrate stream. We're fucked.");
+            stream.error = Mad.Error.BADDATAPTR; // best guess
+            return null;
+
+            //        if ((stream.freerate === 0 || !stream.sync ||
+            //                        (header.layer === Mad.Layer.III && stream.freerate > 640000)) &&
+            //                free_bitrate(stream, header) === -1)
+            //            return null;
+            //
+            //        header.bitrate = stream.freerate;
+            //        header.flags  |= Mad.Flag.FREEFORMAT;
+        }
+
+        /* calculate beginning of next frame */
+        pad_slot = (header.flags & Mad.Flag.PADDING) ? 1 : 0;
+
+        if (header.layer === Mad.Layer.I) {
+            N = (((12 * header.bitrate / header.samplerate) << 0) + pad_slot) * 4;
+        } else {
+            var slots_per_frame = (header.layer === Mad.Layer.III &&
+                    (header.flags & Mad.Flag.LSF_EXT)) ? 72 : 144;
+            //console.log("slots_per_frame = " + slots_per_frame + ", bitrate = " + header.bitrate + ", samplerate = " + header.samplerate);
+
+            N = ((slots_per_frame * header.bitrate / header.samplerate) << 0) + pad_slot;
+        }
+
+
+        /* verify there is enough data left in buffer to decode this frame */
+        if (N + Mad.BUFFER_GUARD > end - stream.this_frame) {
+            stream.next_frame = stream.this_frame;
+
+            stream.error = Mad.Error.BUFLEN;
+            return null;
+        }
+
+        stream.next_frame = stream.this_frame + N;
+
+        // console.log("N = " + N + ", pad_slot = " + pad_slot + ", next_frame = " + stream.next_frame);
+
+        if (!stream.sync) {
+            /* check that a valid frame header follows this frame */
+            ptr = stream.next_frame;
+            if (!(stream.getU8(ptr) === 0xff && (stream.getU8(ptr + 1) & 0xe0) === 0xe0)) {
+                ptr = stream.next_frame = stream.this_frame + 1;
+
+                // emulating 'goto sync'
+                syncing = true;
+                continue;
+            }
+            stream.sync = 1;
+        }
+    } // end of goto emulation (label 'sync')
+
+    header.flags |= Mad.Flag.INCOMPLETE;
+    return header;
+}
+
+Mad.Frame = function () {
+    this.header = new Mad.Header();     /* MPEG audio header */
+
+    this.options = 0;                   /* decoding options (from stream) */
+
+    // sbsample[2][36][32]
+    this.sbsample = [];   /* synthesis subband filter samples */
+    for(var ch = 0; ch < 2; ch++) {
+        this.sbsample[ch] = [];
+        for(var grp = 0; grp < 36; grp++) {
+            // this.sbsample[ch][grp] = new Float64Array(new ArrayBuffer(8 * 32));
+            this.sbsample[ch][grp] = [];
+            for(var i = 0; i < 32; i++) {
+                this.sbsample[ch][grp][i] = 0;
+            }
+        }
+    }
+
+    // overlap[2][32][18]
+    this.overlap = []; /* Layer III block overlap data */
+    for(var ch = 0; ch < 2; ch++) {
+        this.overlap[ch] = [];
+        for(var sb = 0; sb < 32; sb++) {
+            // this.overlap[ch][sb] = new Float64Array(new ArrayBuffer(8 * 18));
+            this.overlap[ch][sb] = [];
+            for(var i = 0; i < 18; i++) {
+                this.overlap[ch][sb][i] = 0;
+            }
+        }
+    }
+};
+
+Mad.Frame.decode = function(frame, stream) {
+    frame.options = stream.options;
+
+    /* header() */
+    /* error_check() */
+
+    if (!(frame.header.flags & Mad.Flag.INCOMPLETE)) {
+        frame.header = Mad.Header.decode(stream);
+        if(frame.header === null) {
+            // something went wrong
+            throw 'Header decoding failed';
+        }
+    }
+
+    frame.header.flags &= ~Mad.Flag.INCOMPLETE;
+
+    if (decoder_table[frame.header.layer - 1](stream, frame) === -1) {
+        if (!Mad.recoverable(stream.error)) {
+            stream.next_frame = stream.this_frame;
+        }
+        throw 'Decoder table error';
+    }
+
+    return frame;
+};
+
+Mad.sbsampleIndex = function (i, j, k) {
+    return i * 36 * 32 + j * 32 + k;
+};
+
+Mad.overlapIndex = function (i, j, k) {
+    return i * 32 * 18 + j * 18 + k;
+};
+
+Mad.Flag = {
+NPRIVATE_III   : 0x0007,   /* number of Layer III private bits */
+                 INCOMPLETE : 0x0008,   /* header but not data is decoded */
+
+                 PROTECTION : 0x0010,   /* frame has CRC protection */
+                 COPYRIGHT  : 0x0020,   /* frame is copyright */
+                 ORIGINAL   : 0x0040,   /* frame is original (else copy) */
+                 PADDING    : 0x0080,   /* frame has additional slot */
+
+                 I_STEREO   : 0x0100,   /* uses intensity joint stereo */
+                 MS_STEREO  : 0x0200,   /* uses middle/side joint stereo */
+                 FREEFORMAT : 0x0400,   /* uses free format bitrate */
+
+                 LSF_EXT    : 0x1000,   /* lower sampling freq. extension */
+                 MC_EXT : 0x2000,   /* multichannel audio extension */
+                 MPEG_2_5_EXT   : 0x4000    /* MPEG 2.5 (unofficial) extension */
+};
+
+Mad.Private = {
+HEADER  : 0x0100,   /* header private bit */
+          III : 0x001f    /* Layer III private bits (up to 5) */
+};
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/huffman.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/huffman.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/huffman.js	(revision 28388)
@@ -0,0 +1,3065 @@
+
+/*
+ * These are the Huffman code words for Layer III.
+ * The data for these tables are derived from Table B.7 of ISO/IEC 11172-3.
+ *
+ * These tables support decoding up to 4 Huffman code bits at a time.
+ */
+
+/*
+union huffquad {
+  struct {
+    unsigned short final  :  1;
+    unsigned short bits   :  3;
+    unsigned short offset : 12;
+  } ptr;
+  struct {
+    unsigned short final  :  1;
+    unsigned short hlen   :  3;
+    unsigned short v      :  1;
+    unsigned short w      :  1;
+    unsigned short x      :  1;
+    unsigned short y      :  1;
+  } value;
+  unsigned short final    :  1;
+};
+
+union huffpair {
+  struct {
+    unsigned short final  :  1;
+    unsigned short bits   :  3;
+    unsigned short offset : 12;
+  } ptr;
+  struct {
+    unsigned short final  :  1;
+    unsigned short hlen   :  3;
+    unsigned short x      :  4;
+    unsigned short y      :  4;
+  } value;
+  unsigned short final    :  1;
+};
+
+struct hufftable {
+  union huffpair const *table;
+  unsigned short linbits;
+  unsigned short startbits;
+};
+*/
+
+//extern union huffquad const *const mad_huff_quad_table[2];
+//extern struct hufftable const mad_huff_pair_table[32];
+
+Mad.huff_quad_table = []; /* 2 */
+Mad.huff_pair_table = []; /* 32 */
+
+var PTR = function(offs, bits) {
+    return {
+        'final':  0, // final is a reserved word in JavaScript and GSC will complain about it.
+        ptr: {
+            bits:   bits,
+            offset: offs
+        }
+    };
+};
+
+var huffquad_V = function (v, w, x, y, hlen) {
+    return {
+        'final':  1, // final is a reserved word in JavaScript and GSC will complain about it.
+        value: {
+            v: v,
+            w: w,
+            x: x,
+            y: y
+        }
+    };
+};
+
+/*
+# if defined(__GNUC__) ||  \
+    (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901)
+#  define PTR(offs, bits)	{ .ptr   = { 0, bits, offs       } }
+#  define V(v, w, x, y, hlen)	{ .value = { 1, hlen, v, w, x, y } }
+# else
+#  define PTR(offs, bits)	{ { 0, bits, offs } }
+#  if defined(WORDS_BIGENDIAN)
+#   define V(v, w, x, y, hlen)	{ { 1, hlen, (v << 11) | (w << 10) | (x <<  9) | (y <<  8) } }
+#  else
+#   define V(v, w, x, y, hlen)	{ { 1, hlen, (v <<  0) | (w <<  1) | (x <<  2) | (y <<  3) } }
+#  endif
+# endif
+*/
+
+/* huffquad */ var hufftabA = [
+  /* 0000 */ PTR(16, 2),
+  /* 0001 */ PTR(20, 2),
+  /* 0010 */ PTR(24, 1),
+  /* 0011 */ PTR(26, 1),
+  /* 0100 */ huffquad_V(0, 0, 1, 0, 4),
+  /* 0101 */ huffquad_V(0, 0, 0, 1, 4),
+  /* 0110 */ huffquad_V(0, 1, 0, 0, 4),
+  /* 0111 */ huffquad_V(1, 0, 0, 0, 4),
+  /* 1000 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1001 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1010 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1011 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1100 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1101 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1110 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1111 */ huffquad_V(0, 0, 0, 0, 1),
+
+  /* 0000 ... */
+  /* 00   */ huffquad_V(1, 0, 1, 1, 2),	/* 16 */
+  /* 01   */ huffquad_V(1, 1, 1, 1, 2),
+  /* 10   */ huffquad_V(1, 1, 0, 1, 2),
+  /* 11   */ huffquad_V(1, 1, 1, 0, 2),
+
+  /* 0001 ... */
+  /* 00   */ huffquad_V(0, 1, 1, 1, 2),	/* 20 */
+  /* 01   */ huffquad_V(0, 1, 0, 1, 2),
+  /* 10   */ huffquad_V(1, 0, 0, 1, 1),
+  /* 11   */ huffquad_V(1, 0, 0, 1, 1),
+
+  /* 0010 ... */
+  /* 0    */ huffquad_V(0, 1, 1, 0, 1),	/* 24 */
+  /* 1    */ huffquad_V(0, 0, 1, 1, 1),
+
+  /* 0011 ... */
+  /* 0    */ huffquad_V(1, 0, 1, 0, 1),	/* 26 */
+  /* 1    */ huffquad_V(1, 1, 0, 0, 1)
+];
+
+/* huffquad */ var hufftabB = [
+  /* 0000 */ huffquad_V(1, 1, 1, 1, 4),
+  /* 0001 */ huffquad_V(1, 1, 1, 0, 4),
+  /* 0010 */ huffquad_V(1, 1, 0, 1, 4),
+  /* 0011 */ huffquad_V(1, 1, 0, 0, 4),
+  /* 0100 */ huffquad_V(1, 0, 1, 1, 4),
+  /* 0101 */ huffquad_V(1, 0, 1, 0, 4),
+  /* 0110 */ huffquad_V(1, 0, 0, 1, 4),
+  /* 0111 */ huffquad_V(1, 0, 0, 0, 4),
+  /* 1000 */ huffquad_V(0, 1, 1, 1, 4),
+  /* 1001 */ huffquad_V(0, 1, 1, 0, 4),
+  /* 1010 */ huffquad_V(0, 1, 0, 1, 4),
+  /* 1011 */ huffquad_V(0, 1, 0, 0, 4),
+  /* 1100 */ huffquad_V(0, 0, 1, 1, 4),
+  /* 1101 */ huffquad_V(0, 0, 1, 0, 4),
+  /* 1110 */ huffquad_V(0, 0, 0, 1, 4),
+  /* 1111 */ huffquad_V(0, 0, 0, 0, 4)
+];
+
+/*
+# undef V
+# undef PTR
+
+# if defined(__GNUC__) ||  \
+    (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901)
+#  define PTR(offs, bits)	{ .ptr   = { 0, bits, offs } }
+#  define V(x, y, hlen)		{ .value = { 1, hlen, x, y } }
+# else
+#  define PTR(offs, bits)	{ { 0, bits, offs } }
+#  if defined(WORDS_BIGENDIAN)
+#   define V(x, y, hlen)	{ { 1, hlen, (x << 8) | (y << 4) } }
+#  else
+#   define V(x, y, hlen)	{ { 1, hlen, (x << 0) | (y << 4) } }
+#  endif
+# endif
+*/
+
+var V = function (x, y, hlen) {
+    return {
+        'final':  1, // final is a reserved word in JavaScript and GSC will complain about it.
+        value: {
+            x: x,
+            y: y,
+            hlen: hlen
+        }
+    };
+};
+
+var hufftab0 = [
+  /*      */ V(0, 0, 0)
+];
+
+var hufftab1 = [
+  /* 000  */ V(1, 1, 3),
+  /* 001  */ V(0, 1, 3),
+  /* 010  */ V(1, 0, 2),
+  /* 011  */ V(1, 0, 2),
+  /* 100  */ V(0, 0, 1),
+  /* 101  */ V(0, 0, 1),
+  /* 110  */ V(0, 0, 1),
+  /* 111  */ V(0, 0, 1)
+];
+
+var hufftab2 = [
+  /* 000  */ PTR(8, 3),
+  /* 001  */ V(1, 1, 3),
+  /* 010  */ V(0, 1, 3),
+  /* 011  */ V(1, 0, 3),
+  /* 100  */ V(0, 0, 1),
+  /* 101  */ V(0, 0, 1),
+  /* 110  */ V(0, 0, 1),
+  /* 111  */ V(0, 0, 1),
+
+  /* 000 ... */
+  /* 000  */ V(2, 2, 3),	/* 8 */
+  /* 001  */ V(0, 2, 3),
+  /* 010  */ V(1, 2, 2),
+  /* 011  */ V(1, 2, 2),
+  /* 100  */ V(2, 1, 2),
+  /* 101  */ V(2, 1, 2),
+  /* 110  */ V(2, 0, 2),
+  /* 111  */ V(2, 0, 2)
+];
+
+var hufftab3 = [
+  /* 000  */ PTR(8, 3),
+  /* 001  */ V(1, 0, 3),
+  /* 010  */ V(1, 1, 2),
+  /* 011  */ V(1, 1, 2),
+  /* 100  */ V(0, 1, 2),
+  /* 101  */ V(0, 1, 2),
+  /* 110  */ V(0, 0, 2),
+  /* 111  */ V(0, 0, 2),
+
+  /* 000 ... */
+  /* 000  */ V(2, 2, 3),	/* 8 */
+  /* 001  */ V(0, 2, 3),
+  /* 010  */ V(1, 2, 2),
+  /* 011  */ V(1, 2, 2),
+  /* 100  */ V(2, 1, 2),
+  /* 101  */ V(2, 1, 2),
+  /* 110  */ V(2, 0, 2),
+  /* 111  */ V(2, 0, 2)
+];
+
+var hufftab5 = [
+  /* 000  */ PTR(8, 4),
+  /* 001  */ V(1, 1, 3),
+  /* 010  */ V(0, 1, 3),
+  /* 011  */ V(1, 0, 3),
+  /* 100  */ V(0, 0, 1),
+  /* 101  */ V(0, 0, 1),
+  /* 110  */ V(0, 0, 1),
+  /* 111  */ V(0, 0, 1),
+
+  /* 000 ... */
+  /* 0000 */ PTR(24, 1),	/* 8 */
+  /* 0001 */ V(3, 2, 4),
+  /* 0010 */ V(3, 1, 3),
+  /* 0011 */ V(3, 1, 3),
+  /* 0100 */ V(1, 3, 4),
+  /* 0101 */ V(0, 3, 4),
+  /* 0110 */ V(3, 0, 4),
+  /* 0111 */ V(2, 2, 4),
+  /* 1000 */ V(1, 2, 3),
+  /* 1001 */ V(1, 2, 3),
+  /* 1010 */ V(2, 1, 3),
+  /* 1011 */ V(2, 1, 3),
+  /* 1100 */ V(0, 2, 3),
+  /* 1101 */ V(0, 2, 3),
+  /* 1110 */ V(2, 0, 3),
+  /* 1111 */ V(2, 0, 3),
+
+  /* 000 0000 ... */
+  /* 0    */ V(3, 3, 1),	/* 24 */
+  /* 1    */ V(2, 3, 1)
+];
+
+var hufftab6 = [
+  /* 0000 */ PTR(16, 3),
+  /* 0001 */ PTR(24, 1),
+  /* 0010 */ PTR(26, 1),
+  /* 0011 */ V(1, 2, 4),
+  /* 0100 */ V(2, 1, 4),
+  /* 0101 */ V(2, 0, 4),
+  /* 0110 */ V(0, 1, 3),
+  /* 0111 */ V(0, 1, 3),
+  /* 1000 */ V(1, 1, 2),
+  /* 1001 */ V(1, 1, 2),
+  /* 1010 */ V(1, 1, 2),
+  /* 1011 */ V(1, 1, 2),
+  /* 1100 */ V(1, 0, 3),
+  /* 1101 */ V(1, 0, 3),
+  /* 1110 */ V(0, 0, 3),
+  /* 1111 */ V(0, 0, 3),
+
+  /* 0000 ... */
+  /* 000  */ V(3, 3, 3),	/* 16 */
+  /* 001  */ V(0, 3, 3),
+  /* 010  */ V(2, 3, 2),
+  /* 011  */ V(2, 3, 2),
+  /* 100  */ V(3, 2, 2),
+  /* 101  */ V(3, 2, 2),
+  /* 110  */ V(3, 0, 2),
+  /* 111  */ V(3, 0, 2),
+
+  /* 0001 ... */
+  /* 0    */ V(1, 3, 1),	/* 24 */
+  /* 1    */ V(3, 1, 1),
+
+  /* 0010 ... */
+  /* 0    */ V(2, 2, 1),	/* 26 */
+  /* 1    */ V(0, 2, 1)
+];
+
+var hufftab7 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 2),
+  /* 0011 */ V(1, 1, 4),
+  /* 0100 */ V(0, 1, 3),
+  /* 0101 */ V(0, 1, 3),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(52, 2),	/* 16 */
+  /* 0001 */ PTR(56, 1),
+  /* 0010 */ PTR(58, 1),
+  /* 0011 */ V(1, 5, 4),
+  /* 0100 */ V(5, 1, 4),
+  /* 0101 */ PTR(60, 1),
+  /* 0110 */ V(5, 0, 4),
+  /* 0111 */ PTR(62, 1),
+  /* 1000 */ V(2, 4, 4),
+  /* 1001 */ V(4, 2, 4),
+  /* 1010 */ V(1, 4, 3),
+  /* 1011 */ V(1, 4, 3),
+  /* 1100 */ V(4, 1, 3),
+  /* 1101 */ V(4, 1, 3),
+  /* 1110 */ V(4, 0, 3),
+  /* 1111 */ V(4, 0, 3),
+
+  /* 0001 ... */
+  /* 0000 */ V(0, 4, 4),	/* 32 */
+  /* 0001 */ V(2, 3, 4),
+  /* 0010 */ V(3, 2, 4),
+  /* 0011 */ V(0, 3, 4),
+  /* 0100 */ V(1, 3, 3),
+  /* 0101 */ V(1, 3, 3),
+  /* 0110 */ V(3, 1, 3),
+  /* 0111 */ V(3, 1, 3),
+  /* 1000 */ V(3, 0, 3),
+  /* 1001 */ V(3, 0, 3),
+  /* 1010 */ V(2, 2, 3),
+  /* 1011 */ V(2, 2, 3),
+  /* 1100 */ V(1, 2, 2),
+  /* 1101 */ V(1, 2, 2),
+  /* 1110 */ V(1, 2, 2),
+  /* 1111 */ V(1, 2, 2),
+
+  /* 0010 ... */
+  /* 00   */ V(2, 1, 1),	/* 48 */
+  /* 01   */ V(2, 1, 1),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 00   */ V(5, 5, 2),	/* 52 */
+  /* 01   */ V(4, 5, 2),
+  /* 10   */ V(5, 4, 2),
+  /* 11   */ V(5, 3, 2),
+
+  /* 0000 0001 ... */
+  /* 0    */ V(3, 5, 1),	/* 56 */
+  /* 1    */ V(4, 4, 1),
+
+  /* 0000 0010 ... */
+  /* 0    */ V(2, 5, 1),	/* 58 */
+  /* 1    */ V(5, 2, 1),
+
+  /* 0000 0101 ... */
+  /* 0    */ V(0, 5, 1),	/* 60 */
+  /* 1    */ V(3, 4, 1),
+
+  /* 0000 0111 ... */
+  /* 0    */ V(4, 3, 1),	/* 62 */
+  /* 1    */ V(3, 3, 1)
+];
+
+var hufftab8 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ V(1, 2, 4),
+  /* 0011 */ V(2, 1, 4),
+  /* 0100 */ V(1, 1, 2),
+  /* 0101 */ V(1, 1, 2),
+  /* 0110 */ V(1, 1, 2),
+  /* 0111 */ V(1, 1, 2),
+  /* 1000 */ V(0, 1, 3),
+  /* 1001 */ V(0, 1, 3),
+  /* 1010 */ V(1, 0, 3),
+  /* 1011 */ V(1, 0, 3),
+  /* 1100 */ V(0, 0, 2),
+  /* 1101 */ V(0, 0, 2),
+  /* 1110 */ V(0, 0, 2),
+  /* 1111 */ V(0, 0, 2),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(48, 3),	/* 16 */
+  /* 0001 */ PTR(56, 2),
+  /* 0010 */ PTR(60, 1),
+  /* 0011 */ V(1, 5, 4),
+  /* 0100 */ V(5, 1, 4),
+  /* 0101 */ PTR(62, 1),
+  /* 0110 */ PTR(64, 1),
+  /* 0111 */ V(2, 4, 4),
+  /* 1000 */ V(4, 2, 4),
+  /* 1001 */ V(1, 4, 4),
+  /* 1010 */ V(4, 1, 3),
+  /* 1011 */ V(4, 1, 3),
+  /* 1100 */ V(0, 4, 4),
+  /* 1101 */ V(4, 0, 4),
+  /* 1110 */ V(2, 3, 4),
+  /* 1111 */ V(3, 2, 4),
+
+  /* 0001 ... */
+  /* 0000 */ V(1, 3, 4),	/* 32 */
+  /* 0001 */ V(3, 1, 4),
+  /* 0010 */ V(0, 3, 4),
+  /* 0011 */ V(3, 0, 4),
+  /* 0100 */ V(2, 2, 2),
+  /* 0101 */ V(2, 2, 2),
+  /* 0110 */ V(2, 2, 2),
+  /* 0111 */ V(2, 2, 2),
+  /* 1000 */ V(0, 2, 2),
+  /* 1001 */ V(0, 2, 2),
+  /* 1010 */ V(0, 2, 2),
+  /* 1011 */ V(0, 2, 2),
+  /* 1100 */ V(2, 0, 2),
+  /* 1101 */ V(2, 0, 2),
+  /* 1110 */ V(2, 0, 2),
+  /* 1111 */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 000  */ V(5, 5, 3),	/* 48 */
+  /* 001  */ V(5, 4, 3),
+  /* 010  */ V(4, 5, 2),
+  /* 011  */ V(4, 5, 2),
+  /* 100  */ V(5, 3, 1),
+  /* 101  */ V(5, 3, 1),
+  /* 110  */ V(5, 3, 1),
+  /* 111  */ V(5, 3, 1),
+
+  /* 0000 0001 ... */
+  /* 00   */ V(3, 5, 2),	/* 56 */
+  /* 01   */ V(4, 4, 2),
+  /* 10   */ V(2, 5, 1),
+  /* 11   */ V(2, 5, 1),
+
+  /* 0000 0010 ... */
+  /* 0    */ V(5, 2, 1),	/* 60 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0000 0101 ... */
+  /* 0    */ V(3, 4, 1),	/* 62 */
+  /* 1    */ V(4, 3, 1),
+
+  /* 0000 0110 ... */
+  /* 0    */ V(5, 0, 1),	/* 64 */
+  /* 1    */ V(3, 3, 1)
+];
+
+var hufftab9 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 3),
+  /* 0010 */ PTR(40, 2),
+  /* 0011 */ PTR(44, 2),
+  /* 0100 */ PTR(48, 1),
+  /* 0101 */ V(1, 2, 4),
+  /* 0110 */ V(2, 1, 4),
+  /* 0111 */ V(2, 0, 4),
+  /* 1000 */ V(1, 1, 3),
+  /* 1001 */ V(1, 1, 3),
+  /* 1010 */ V(0, 1, 3),
+  /* 1011 */ V(0, 1, 3),
+  /* 1100 */ V(1, 0, 3),
+  /* 1101 */ V(1, 0, 3),
+  /* 1110 */ V(0, 0, 3),
+  /* 1111 */ V(0, 0, 3),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(50, 1),	/* 16 */
+  /* 0001 */ V(3, 5, 4),
+  /* 0010 */ V(5, 3, 4),
+  /* 0011 */ PTR(52, 1),
+  /* 0100 */ V(4, 4, 4),
+  /* 0101 */ V(2, 5, 4),
+  /* 0110 */ V(5, 2, 4),
+  /* 0111 */ V(1, 5, 4),
+  /* 1000 */ V(5, 1, 3),
+  /* 1001 */ V(5, 1, 3),
+  /* 1010 */ V(3, 4, 3),
+  /* 1011 */ V(3, 4, 3),
+  /* 1100 */ V(4, 3, 3),
+  /* 1101 */ V(4, 3, 3),
+  /* 1110 */ V(5, 0, 4),
+  /* 1111 */ V(0, 4, 4),
+
+  /* 0001 ... */
+  /* 000  */ V(2, 4, 3),	/* 32 */
+  /* 001  */ V(4, 2, 3),
+  /* 010  */ V(3, 3, 3),
+  /* 011  */ V(4, 0, 3),
+  /* 100  */ V(1, 4, 2),
+  /* 101  */ V(1, 4, 2),
+  /* 110  */ V(4, 1, 2),
+  /* 111  */ V(4, 1, 2),
+
+  /* 0010 ... */
+  /* 00   */ V(2, 3, 2),	/* 40 */
+  /* 01   */ V(3, 2, 2),
+  /* 10   */ V(1, 3, 1),
+  /* 11   */ V(1, 3, 1),
+
+  /* 0011 ... */
+  /* 00   */ V(3, 1, 1),	/* 44 */
+  /* 01   */ V(3, 1, 1),
+  /* 10   */ V(0, 3, 2),
+  /* 11   */ V(3, 0, 2),
+
+  /* 0100 ... */
+  /* 0    */ V(2, 2, 1),	/* 48 */
+  /* 1    */ V(0, 2, 1),
+
+  /* 0000 0000 ... */
+  /* 0    */ V(5, 5, 1),	/* 50 */
+  /* 1    */ V(4, 5, 1),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(5, 4, 1),	/* 52 */
+  /* 1    */ V(0, 5, 1)
+];
+
+var hufftab10 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 2),
+  /* 0011 */ V(1, 1, 4),
+  /* 0100 */ V(0, 1, 3),
+  /* 0101 */ V(0, 1, 3),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(52, 3),	/* 16 */
+  /* 0001 */ PTR(60, 2),
+  /* 0010 */ PTR(64, 3),
+  /* 0011 */ PTR(72, 1),
+  /* 0100 */ PTR(74, 2),
+  /* 0101 */ PTR(78, 2),
+  /* 0110 */ PTR(82, 2),
+  /* 0111 */ V(1, 7, 4),
+  /* 1000 */ V(7, 1, 4),
+  /* 1001 */ PTR(86, 1),
+  /* 1010 */ PTR(88, 2),
+  /* 1011 */ PTR(92, 2),
+  /* 1100 */ V(1, 6, 4),
+  /* 1101 */ V(6, 1, 4),
+  /* 1110 */ V(6, 0, 4),
+  /* 1111 */ PTR(96, 1),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(98, 1),	/* 32 */
+  /* 0001 */ PTR(100, 1),
+  /* 0010 */ V(1, 4, 4),
+  /* 0011 */ V(4, 1, 4),
+  /* 0100 */ V(4, 0, 4),
+  /* 0101 */ V(2, 3, 4),
+  /* 0110 */ V(3, 2, 4),
+  /* 0111 */ V(0, 3, 4),
+  /* 1000 */ V(1, 3, 3),
+  /* 1001 */ V(1, 3, 3),
+  /* 1010 */ V(3, 1, 3),
+  /* 1011 */ V(3, 1, 3),
+  /* 1100 */ V(3, 0, 3),
+  /* 1101 */ V(3, 0, 3),
+  /* 1110 */ V(2, 2, 3),
+  /* 1111 */ V(2, 2, 3),
+
+  /* 0010 ... */
+  /* 00   */ V(1, 2, 2),	/* 48 */
+  /* 01   */ V(2, 1, 2),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 000  */ V(7, 7, 3),	/* 52 */
+  /* 001  */ V(6, 7, 3),
+  /* 010  */ V(7, 6, 3),
+  /* 011  */ V(5, 7, 3),
+  /* 100  */ V(7, 5, 3),
+  /* 101  */ V(6, 6, 3),
+  /* 110  */ V(4, 7, 2),
+  /* 111  */ V(4, 7, 2),
+
+  /* 0000 0001 ... */
+  /* 00   */ V(7, 4, 2),	/* 60 */
+  /* 01   */ V(5, 6, 2),
+  /* 10   */ V(6, 5, 2),
+  /* 11   */ V(3, 7, 2),
+
+  /* 0000 0010 ... */
+  /* 000  */ V(7, 3, 2),	/* 64 */
+  /* 001  */ V(7, 3, 2),
+  /* 010  */ V(4, 6, 2),
+  /* 011  */ V(4, 6, 2),
+  /* 100  */ V(5, 5, 3),
+  /* 101  */ V(5, 4, 3),
+  /* 110  */ V(6, 3, 2),
+  /* 111  */ V(6, 3, 2),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(2, 7, 1),	/* 72 */
+  /* 1    */ V(7, 2, 1),
+
+  /* 0000 0100 ... */
+  /* 00   */ V(6, 4, 2),	/* 74 */
+  /* 01   */ V(0, 7, 2),
+  /* 10   */ V(7, 0, 1),
+  /* 11   */ V(7, 0, 1),
+
+  /* 0000 0101 ... */
+  /* 00   */ V(6, 2, 1),	/* 78 */
+  /* 01   */ V(6, 2, 1),
+  /* 10   */ V(4, 5, 2),
+  /* 11   */ V(3, 5, 2),
+
+  /* 0000 0110 ... */
+  /* 00   */ V(0, 6, 1),	/* 82 */
+  /* 01   */ V(0, 6, 1),
+  /* 10   */ V(5, 3, 2),
+  /* 11   */ V(4, 4, 2),
+
+  /* 0000 1001 ... */
+  /* 0    */ V(3, 6, 1),	/* 86 */
+  /* 1    */ V(2, 6, 1),
+
+  /* 0000 1010 ... */
+  /* 00   */ V(2, 5, 2),	/* 88 */
+  /* 01   */ V(5, 2, 2),
+  /* 10   */ V(1, 5, 1),
+  /* 11   */ V(1, 5, 1),
+
+  /* 0000 1011 ... */
+  /* 00   */ V(5, 1, 1),	/* 92 */
+  /* 01   */ V(5, 1, 1),
+  /* 10   */ V(3, 4, 2),
+  /* 11   */ V(4, 3, 2),
+
+  /* 0000 1111 ... */
+  /* 0    */ V(0, 5, 1),	/* 96 */
+  /* 1    */ V(5, 0, 1),
+
+  /* 0001 0000 ... */
+  /* 0    */ V(2, 4, 1),	/* 98 */
+  /* 1    */ V(4, 2, 1),
+
+  /* 0001 0001 ... */
+  /* 0    */ V(3, 3, 1),	/* 100 */
+  /* 1    */ V(0, 4, 1)
+];
+
+var hufftab11 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 3),
+  /* 0100 */ V(1, 2, 4),
+  /* 0101 */ PTR(72, 1),
+  /* 0110 */ V(1, 1, 3),
+  /* 0111 */ V(1, 1, 3),
+  /* 1000 */ V(0, 1, 3),
+  /* 1001 */ V(0, 1, 3),
+  /* 1010 */ V(1, 0, 3),
+  /* 1011 */ V(1, 0, 3),
+  /* 1100 */ V(0, 0, 2),
+  /* 1101 */ V(0, 0, 2),
+  /* 1110 */ V(0, 0, 2),
+  /* 1111 */ V(0, 0, 2),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(74, 2),	/* 16 */
+  /* 0001 */ PTR(78, 3),
+  /* 0010 */ PTR(86, 2),
+  /* 0011 */ PTR(90, 1),
+  /* 0100 */ PTR(92, 2),
+  /* 0101 */ V(2, 7, 4),
+  /* 0110 */ V(7, 2, 4),
+  /* 0111 */ PTR(96, 1),
+  /* 1000 */ V(7, 1, 3),
+  /* 1001 */ V(7, 1, 3),
+  /* 1010 */ V(1, 7, 4),
+  /* 1011 */ V(7, 0, 4),
+  /* 1100 */ V(3, 6, 4),
+  /* 1101 */ V(6, 3, 4),
+  /* 1110 */ V(6, 0, 4),
+  /* 1111 */ PTR(98, 1),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(100, 1),	/* 32 */
+  /* 0001 */ V(1, 5, 4),
+  /* 0010 */ V(6, 2, 3),
+  /* 0011 */ V(6, 2, 3),
+  /* 0100 */ V(2, 6, 4),
+  /* 0101 */ V(0, 6, 4),
+  /* 0110 */ V(1, 6, 3),
+  /* 0111 */ V(1, 6, 3),
+  /* 1000 */ V(6, 1, 3),
+  /* 1001 */ V(6, 1, 3),
+  /* 1010 */ V(5, 1, 4),
+  /* 1011 */ V(3, 4, 4),
+  /* 1100 */ V(5, 0, 4),
+  /* 1101 */ PTR(102, 1),
+  /* 1110 */ V(2, 4, 4),
+  /* 1111 */ V(4, 2, 4),
+
+  /* 0010 ... */
+  /* 0000 */ V(1, 4, 4),	/* 48 */
+  /* 0001 */ V(4, 1, 4),
+  /* 0010 */ V(0, 4, 4),
+  /* 0011 */ V(4, 0, 4),
+  /* 0100 */ V(2, 3, 3),
+  /* 0101 */ V(2, 3, 3),
+  /* 0110 */ V(3, 2, 3),
+  /* 0111 */ V(3, 2, 3),
+  /* 1000 */ V(1, 3, 2),
+  /* 1001 */ V(1, 3, 2),
+  /* 1010 */ V(1, 3, 2),
+  /* 1011 */ V(1, 3, 2),
+  /* 1100 */ V(3, 1, 2),
+  /* 1101 */ V(3, 1, 2),
+  /* 1110 */ V(3, 1, 2),
+  /* 1111 */ V(3, 1, 2),
+
+  /* 0011 ... */
+  /* 000  */ V(0, 3, 3),	/* 64 */
+  /* 001  */ V(3, 0, 3),
+  /* 010  */ V(2, 2, 2),
+  /* 011  */ V(2, 2, 2),
+  /* 100  */ V(2, 1, 1),
+  /* 101  */ V(2, 1, 1),
+  /* 110  */ V(2, 1, 1),
+  /* 111  */ V(2, 1, 1),
+
+  /* 0101 ... */
+  /* 0    */ V(0, 2, 1),	/* 72 */
+  /* 1    */ V(2, 0, 1),
+
+  /* 0000 0000 ... */
+  /* 00   */ V(7, 7, 2),	/* 74 */
+  /* 01   */ V(6, 7, 2),
+  /* 10   */ V(7, 6, 2),
+  /* 11   */ V(7, 5, 2),
+
+  /* 0000 0001 ... */
+  /* 000  */ V(6, 6, 2),	/* 78 */
+  /* 001  */ V(6, 6, 2),
+  /* 010  */ V(4, 7, 2),
+  /* 011  */ V(4, 7, 2),
+  /* 100  */ V(7, 4, 2),
+  /* 101  */ V(7, 4, 2),
+  /* 110  */ V(5, 7, 3),
+  /* 111  */ V(5, 5, 3),
+
+  /* 0000 0010 ... */
+  /* 00   */ V(5, 6, 2),	/* 86 */
+  /* 01   */ V(6, 5, 2),
+  /* 10   */ V(3, 7, 1),
+  /* 11   */ V(3, 7, 1),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(7, 3, 1),	/* 90 */
+  /* 1    */ V(4, 6, 1),
+
+  /* 0000 0100 ... */
+  /* 00   */ V(4, 5, 2),	/* 92 */
+  /* 01   */ V(5, 4, 2),
+  /* 10   */ V(3, 5, 2),
+  /* 11   */ V(5, 3, 2),
+
+  /* 0000 0111 ... */
+  /* 0    */ V(6, 4, 1),	/* 96 */
+  /* 1    */ V(0, 7, 1),
+
+  /* 0000 1111 ... */
+  /* 0    */ V(4, 4, 1),	/* 98 */
+  /* 1    */ V(2, 5, 1),
+
+  /* 0001 0000 ... */
+  /* 0    */ V(5, 2, 1),	/* 100 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(4, 3, 1),	/* 102 */
+  /* 1    */ V(3, 3, 1)
+];
+
+var hufftab12 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 2),
+  /* 0100 */ PTR(68, 3),
+  /* 0101 */ PTR(76, 1),
+  /* 0110 */ V(1, 2, 4),
+  /* 0111 */ V(2, 1, 4),
+  /* 1000 */ PTR(78, 1),
+  /* 1001 */ V(0, 0, 4),
+  /* 1010 */ V(1, 1, 3),
+  /* 1011 */ V(1, 1, 3),
+  /* 1100 */ V(0, 1, 3),
+  /* 1101 */ V(0, 1, 3),
+  /* 1110 */ V(1, 0, 3),
+  /* 1111 */ V(1, 0, 3),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(80, 2),	/* 16 */
+  /* 0001 */ PTR(84, 1),
+  /* 0010 */ PTR(86, 1),
+  /* 0011 */ PTR(88, 1),
+  /* 0100 */ V(5, 6, 4),
+  /* 0101 */ V(3, 7, 4),
+  /* 0110 */ PTR(90, 1),
+  /* 0111 */ V(2, 7, 4),
+  /* 1000 */ V(7, 2, 4),
+  /* 1001 */ V(4, 6, 4),
+  /* 1010 */ V(6, 4, 4),
+  /* 1011 */ V(1, 7, 4),
+  /* 1100 */ V(7, 1, 4),
+  /* 1101 */ PTR(92, 1),
+  /* 1110 */ V(3, 6, 4),
+  /* 1111 */ V(6, 3, 4),
+
+  /* 0001 ... */
+  /* 0000 */ V(4, 5, 4),	/* 32 */
+  /* 0001 */ V(5, 4, 4),
+  /* 0010 */ V(4, 4, 4),
+  /* 0011 */ PTR(94, 1),
+  /* 0100 */ V(2, 6, 3),
+  /* 0101 */ V(2, 6, 3),
+  /* 0110 */ V(6, 2, 3),
+  /* 0111 */ V(6, 2, 3),
+  /* 1000 */ V(6, 1, 3),
+  /* 1001 */ V(6, 1, 3),
+  /* 1010 */ V(1, 6, 4),
+  /* 1011 */ V(6, 0, 4),
+  /* 1100 */ V(3, 5, 4),
+  /* 1101 */ V(5, 3, 4),
+  /* 1110 */ V(2, 5, 4),
+  /* 1111 */ V(5, 2, 4),
+
+  /* 0010 ... */
+  /* 0000 */ V(1, 5, 3),	/* 48 */
+  /* 0001 */ V(1, 5, 3),
+  /* 0010 */ V(5, 1, 3),
+  /* 0011 */ V(5, 1, 3),
+  /* 0100 */ V(3, 4, 3),
+  /* 0101 */ V(3, 4, 3),
+  /* 0110 */ V(4, 3, 3),
+  /* 0111 */ V(4, 3, 3),
+  /* 1000 */ V(5, 0, 4),
+  /* 1001 */ V(0, 4, 4),
+  /* 1010 */ V(2, 4, 3),
+  /* 1011 */ V(2, 4, 3),
+  /* 1100 */ V(4, 2, 3),
+  /* 1101 */ V(4, 2, 3),
+  /* 1110 */ V(1, 4, 3),
+  /* 1111 */ V(1, 4, 3),
+
+  /* 0011 ... */
+  /* 00   */ V(3, 3, 2),	/* 64 */
+  /* 01   */ V(4, 1, 2),
+  /* 10   */ V(2, 3, 2),
+  /* 11   */ V(3, 2, 2),
+
+  /* 0100 ... */
+  /* 000  */ V(4, 0, 3),	/* 68 */
+  /* 001  */ V(0, 3, 3),
+  /* 010  */ V(3, 0, 2),
+  /* 011  */ V(3, 0, 2),
+  /* 100  */ V(1, 3, 1),
+  /* 101  */ V(1, 3, 1),
+  /* 110  */ V(1, 3, 1),
+  /* 111  */ V(1, 3, 1),
+
+  /* 0101 ... */
+  /* 0    */ V(3, 1, 1),	/* 76 */
+  /* 1    */ V(2, 2, 1),
+
+  /* 1000 ... */
+  /* 0    */ V(0, 2, 1),	/* 78 */
+  /* 1    */ V(2, 0, 1),
+
+  /* 0000 0000 ... */
+  /* 00   */ V(7, 7, 2),	/* 80 */
+  /* 01   */ V(6, 7, 2),
+  /* 10   */ V(7, 6, 1),
+  /* 11   */ V(7, 6, 1),
+
+  /* 0000 0001 ... */
+  /* 0    */ V(5, 7, 1),	/* 84 */
+  /* 1    */ V(7, 5, 1),
+
+  /* 0000 0010 ... */
+  /* 0    */ V(6, 6, 1),	/* 86 */
+  /* 1    */ V(4, 7, 1),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(7, 4, 1),	/* 88 */
+  /* 1    */ V(6, 5, 1),
+
+  /* 0000 0110 ... */
+  /* 0    */ V(7, 3, 1),	/* 90 */
+  /* 1    */ V(5, 5, 1),
+
+  /* 0000 1101 ... */
+  /* 0    */ V(0, 7, 1),	/* 92 */
+  /* 1    */ V(7, 0, 1),
+
+  /* 0001 0011 ... */
+  /* 0    */ V(0, 6, 1),	/* 94 */
+  /* 1    */ V(0, 5, 1)
+];
+
+var hufftab13 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 2),
+  /* 0100 */ V(1, 1, 4),
+  /* 0101 */ V(0, 1, 4),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(68, 4),	/* 16 */
+  /* 0001 */ PTR(84, 4),
+  /* 0010 */ PTR(100, 4),
+  /* 0011 */ PTR(116, 4),
+  /* 0100 */ PTR(132, 4),
+  /* 0101 */ PTR(148, 4),
+  /* 0110 */ PTR(164, 3),
+  /* 0111 */ PTR(172, 3),
+  /* 1000 */ PTR(180, 3),
+  /* 1001 */ PTR(188, 3),
+  /* 1010 */ PTR(196, 3),
+  /* 1011 */ PTR(204, 3),
+  /* 1100 */ PTR(212, 1),
+  /* 1101 */ PTR(214, 2),
+  /* 1110 */ PTR(218, 3),
+  /* 1111 */ PTR(226, 1),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(228, 2),	/* 32 */
+  /* 0001 */ PTR(232, 2),
+  /* 0010 */ PTR(236, 2),
+  /* 0011 */ PTR(240, 2),
+  /* 0100 */ V(8, 1, 4),
+  /* 0101 */ PTR(244, 1),
+  /* 0110 */ PTR(246, 1),
+  /* 0111 */ PTR(248, 1),
+  /* 1000 */ PTR(250, 2),
+  /* 1001 */ PTR(254, 1),
+  /* 1010 */ V(1, 5, 4),
+  /* 1011 */ V(5, 1, 4),
+  /* 1100 */ PTR(256, 1),
+  /* 1101 */ PTR(258, 1),
+  /* 1110 */ PTR(260, 1),
+  /* 1111 */ V(1, 4, 4),
+
+  /* 0010 ... */
+  /* 0000 */ V(4, 1, 3),	/* 48 */
+  /* 0001 */ V(4, 1, 3),
+  /* 0010 */ V(0, 4, 4),
+  /* 0011 */ V(4, 0, 4),
+  /* 0100 */ V(2, 3, 4),
+  /* 0101 */ V(3, 2, 4),
+  /* 0110 */ V(1, 3, 3),
+  /* 0111 */ V(1, 3, 3),
+  /* 1000 */ V(3, 1, 3),
+  /* 1001 */ V(3, 1, 3),
+  /* 1010 */ V(0, 3, 3),
+  /* 1011 */ V(0, 3, 3),
+  /* 1100 */ V(3, 0, 3),
+  /* 1101 */ V(3, 0, 3),
+  /* 1110 */ V(2, 2, 3),
+  /* 1111 */ V(2, 2, 3),
+
+  /* 0011 ... */
+  /* 00   */ V(1, 2, 2),	/* 64 */
+  /* 01   */ V(2, 1, 2),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 0000 */ PTR(262, 4),	/* 68 */
+  /* 0001 */ PTR(278, 4),
+  /* 0010 */ PTR(294, 4),
+  /* 0011 */ PTR(310, 3),
+  /* 0100 */ PTR(318, 2),
+  /* 0101 */ PTR(322, 2),
+  /* 0110 */ PTR(326, 3),
+  /* 0111 */ PTR(334, 2),
+  /* 1000 */ PTR(338, 1),
+  /* 1001 */ PTR(340, 2),
+  /* 1010 */ PTR(344, 2),
+  /* 1011 */ PTR(348, 2),
+  /* 1100 */ PTR(352, 2),
+  /* 1101 */ PTR(356, 2),
+  /* 1110 */ V(1, 15, 4),
+  /* 1111 */ V(15, 1, 4),
+
+  /* 0000 0001 ... */
+  /* 0000 */ V(15, 0, 4),	/* 84 */
+  /* 0001 */ PTR(360, 1),
+  /* 0010 */ PTR(362, 1),
+  /* 0011 */ PTR(364, 1),
+  /* 0100 */ V(14, 2, 4),
+  /* 0101 */ PTR(366, 1),
+  /* 0110 */ V(1, 14, 4),
+  /* 0111 */ V(14, 1, 4),
+  /* 1000 */ PTR(368, 1),
+  /* 1001 */ PTR(370, 1),
+  /* 1010 */ PTR(372, 1),
+  /* 1011 */ PTR(374, 1),
+  /* 1100 */ PTR(376, 1),
+  /* 1101 */ PTR(378, 1),
+  /* 1110 */ V(12, 6, 4),
+  /* 1111 */ V(3, 13, 4),
+
+  /* 0000 0010 ... */
+  /* 0000 */ PTR(380, 1),	/* 100 */
+  /* 0001 */ V(2, 13, 4),
+  /* 0010 */ V(13, 2, 4),
+  /* 0011 */ V(1, 13, 4),
+  /* 0100 */ V(11, 7, 4),
+  /* 0101 */ PTR(382, 1),
+  /* 0110 */ PTR(384, 1),
+  /* 0111 */ V(12, 3, 4),
+  /* 1000 */ PTR(386, 1),
+  /* 1001 */ V(4, 11, 4),
+  /* 1010 */ V(13, 1, 3),
+  /* 1011 */ V(13, 1, 3),
+  /* 1100 */ V(0, 13, 4),
+  /* 1101 */ V(13, 0, 4),
+  /* 1110 */ V(8, 10, 4),
+  /* 1111 */ V(10, 8, 4),
+
+  /* 0000 0011 ... */
+  /* 0000 */ V(4, 12, 4),	/* 116 */
+  /* 0001 */ V(12, 4, 4),
+  /* 0010 */ V(6, 11, 4),
+  /* 0011 */ V(11, 6, 4),
+  /* 0100 */ V(3, 12, 3),
+  /* 0101 */ V(3, 12, 3),
+  /* 0110 */ V(2, 12, 3),
+  /* 0111 */ V(2, 12, 3),
+  /* 1000 */ V(12, 2, 3),
+  /* 1001 */ V(12, 2, 3),
+  /* 1010 */ V(5, 11, 3),
+  /* 1011 */ V(5, 11, 3),
+  /* 1100 */ V(11, 5, 4),
+  /* 1101 */ V(8, 9, 4),
+  /* 1110 */ V(1, 12, 3),
+  /* 1111 */ V(1, 12, 3),
+
+  /* 0000 0100 ... */
+  /* 0000 */ V(12, 1, 3),	/* 132 */
+  /* 0001 */ V(12, 1, 3),
+  /* 0010 */ V(9, 8, 4),
+  /* 0011 */ V(0, 12, 4),
+  /* 0100 */ V(12, 0, 3),
+  /* 0101 */ V(12, 0, 3),
+  /* 0110 */ V(11, 4, 4),
+  /* 0111 */ V(6, 10, 4),
+  /* 1000 */ V(10, 6, 4),
+  /* 1001 */ V(7, 9, 4),
+  /* 1010 */ V(3, 11, 3),
+  /* 1011 */ V(3, 11, 3),
+  /* 1100 */ V(11, 3, 3),
+  /* 1101 */ V(11, 3, 3),
+  /* 1110 */ V(8, 8, 4),
+  /* 1111 */ V(5, 10, 4),
+
+  /* 0000 0101 ... */
+  /* 0000 */ V(2, 11, 3),	/* 148 */
+  /* 0001 */ V(2, 11, 3),
+  /* 0010 */ V(10, 5, 4),
+  /* 0011 */ V(6, 9, 4),
+  /* 0100 */ V(10, 4, 3),
+  /* 0101 */ V(10, 4, 3),
+  /* 0110 */ V(7, 8, 4),
+  /* 0111 */ V(8, 7, 4),
+  /* 1000 */ V(9, 4, 3),
+  /* 1001 */ V(9, 4, 3),
+  /* 1010 */ V(7, 7, 4),
+  /* 1011 */ V(7, 6, 4),
+  /* 1100 */ V(11, 2, 2),
+  /* 1101 */ V(11, 2, 2),
+  /* 1110 */ V(11, 2, 2),
+  /* 1111 */ V(11, 2, 2),
+
+  /* 0000 0110 ... */
+  /* 000  */ V(1, 11, 2),	/* 164 */
+  /* 001  */ V(1, 11, 2),
+  /* 010  */ V(11, 1, 2),
+  /* 011  */ V(11, 1, 2),
+  /* 100  */ V(0, 11, 3),
+  /* 101  */ V(11, 0, 3),
+  /* 110  */ V(9, 6, 3),
+  /* 111  */ V(4, 10, 3),
+
+  /* 0000 0111 ... */
+  /* 000  */ V(3, 10, 3),	/* 172 */
+  /* 001  */ V(10, 3, 3),
+  /* 010  */ V(5, 9, 3),
+  /* 011  */ V(9, 5, 3),
+  /* 100  */ V(2, 10, 2),
+  /* 101  */ V(2, 10, 2),
+  /* 110  */ V(10, 2, 2),
+  /* 111  */ V(10, 2, 2),
+
+  /* 0000 1000 ... */
+  /* 000  */ V(1, 10, 2),	/* 180 */
+  /* 001  */ V(1, 10, 2),
+  /* 010  */ V(10, 1, 2),
+  /* 011  */ V(10, 1, 2),
+  /* 100  */ V(0, 10, 3),
+  /* 101  */ V(6, 8, 3),
+  /* 110  */ V(10, 0, 2),
+  /* 111  */ V(10, 0, 2),
+
+  /* 0000 1001 ... */
+  /* 000  */ V(8, 6, 3),	/* 188 */
+  /* 001  */ V(4, 9, 3),
+  /* 010  */ V(9, 3, 2),
+  /* 011  */ V(9, 3, 2),
+  /* 100  */ V(3, 9, 3),
+  /* 101  */ V(5, 8, 3),
+  /* 110  */ V(8, 5, 3),
+  /* 111  */ V(6, 7, 3),
+
+  /* 0000 1010 ... */
+  /* 000  */ V(2, 9, 2),	/* 196 */
+  /* 001  */ V(2, 9, 2),
+  /* 010  */ V(9, 2, 2),
+  /* 011  */ V(9, 2, 2),
+  /* 100  */ V(5, 7, 3),
+  /* 101  */ V(7, 5, 3),
+  /* 110  */ V(3, 8, 2),
+  /* 111  */ V(3, 8, 2),
+
+  /* 0000 1011 ... */
+  /* 000  */ V(8, 3, 2),	/* 204 */
+  /* 001  */ V(8, 3, 2),
+  /* 010  */ V(6, 6, 3),
+  /* 011  */ V(4, 7, 3),
+  /* 100  */ V(7, 4, 3),
+  /* 101  */ V(5, 6, 3),
+  /* 110  */ V(6, 5, 3),
+  /* 111  */ V(7, 3, 3),
+
+  /* 0000 1100 ... */
+  /* 0    */ V(1, 9, 1),	/* 212 */
+  /* 1    */ V(9, 1, 1),
+
+  /* 0000 1101 ... */
+  /* 00   */ V(0, 9, 2),	/* 214 */
+  /* 01   */ V(9, 0, 2),
+  /* 10   */ V(4, 8, 2),
+  /* 11   */ V(8, 4, 2),
+
+  /* 0000 1110 ... */
+  /* 000  */ V(7, 2, 2),	/* 218 */
+  /* 001  */ V(7, 2, 2),
+  /* 010  */ V(4, 6, 3),
+  /* 011  */ V(6, 4, 3),
+  /* 100  */ V(2, 8, 1),
+  /* 101  */ V(2, 8, 1),
+  /* 110  */ V(2, 8, 1),
+  /* 111  */ V(2, 8, 1),
+
+  /* 0000 1111 ... */
+  /* 0    */ V(8, 2, 1),	/* 226 */
+  /* 1    */ V(1, 8, 1),
+
+  /* 0001 0000 ... */
+  /* 00   */ V(3, 7, 2),	/* 228 */
+  /* 01   */ V(2, 7, 2),
+  /* 10   */ V(1, 7, 1),
+  /* 11   */ V(1, 7, 1),
+
+  /* 0001 0001 ... */
+  /* 00   */ V(7, 1, 1),	/* 232 */
+  /* 01   */ V(7, 1, 1),
+  /* 10   */ V(5, 5, 2),
+  /* 11   */ V(0, 7, 2),
+
+  /* 0001 0010 ... */
+  /* 00   */ V(7, 0, 2),	/* 236 */
+  /* 01   */ V(3, 6, 2),
+  /* 10   */ V(6, 3, 2),
+  /* 11   */ V(4, 5, 2),
+
+  /* 0001 0011 ... */
+  /* 00   */ V(5, 4, 2),	/* 240 */
+  /* 01   */ V(2, 6, 2),
+  /* 10   */ V(6, 2, 2),
+  /* 11   */ V(3, 5, 2),
+
+  /* 0001 0101 ... */
+  /* 0    */ V(0, 8, 1),	/* 244 */
+  /* 1    */ V(8, 0, 1),
+
+  /* 0001 0110 ... */
+  /* 0    */ V(1, 6, 1),	/* 246 */
+  /* 1    */ V(6, 1, 1),
+
+  /* 0001 0111 ... */
+  /* 0    */ V(0, 6, 1),	/* 248 */
+  /* 1    */ V(6, 0, 1),
+
+  /* 0001 1000 ... */
+  /* 00   */ V(5, 3, 2),	/* 250 */
+  /* 01   */ V(4, 4, 2),
+  /* 10   */ V(2, 5, 1),
+  /* 11   */ V(2, 5, 1),
+
+  /* 0001 1001 ... */
+  /* 0    */ V(5, 2, 1),	/* 254 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0001 1100 ... */
+  /* 0    */ V(3, 4, 1),	/* 256 */
+  /* 1    */ V(4, 3, 1),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(5, 0, 1),	/* 258 */
+  /* 1    */ V(2, 4, 1),
+
+  /* 0001 1110 ... */
+  /* 0    */ V(4, 2, 1),	/* 260 */
+  /* 1    */ V(3, 3, 1),
+
+  /* 0000 0000 0000 ... */
+  /* 0000 */ PTR(388, 3),	/* 262 */
+  /* 0001 */ V(15, 15, 4),
+  /* 0010 */ V(14, 15, 4),
+  /* 0011 */ V(13, 15, 4),
+  /* 0100 */ V(14, 14, 4),
+  /* 0101 */ V(12, 15, 4),
+  /* 0110 */ V(13, 14, 4),
+  /* 0111 */ V(11, 15, 4),
+  /* 1000 */ V(15, 11, 4),
+  /* 1001 */ V(12, 14, 4),
+  /* 1010 */ V(13, 12, 4),
+  /* 1011 */ PTR(396, 1),
+  /* 1100 */ V(14, 12, 3),
+  /* 1101 */ V(14, 12, 3),
+  /* 1110 */ V(13, 13, 3),
+  /* 1111 */ V(13, 13, 3),
+
+  /* 0000 0000 0001 ... */
+  /* 0000 */ V(15, 10, 4),	/* 278 */
+  /* 0001 */ V(12, 13, 4),
+  /* 0010 */ V(11, 14, 3),
+  /* 0011 */ V(11, 14, 3),
+  /* 0100 */ V(14, 11, 3),
+  /* 0101 */ V(14, 11, 3),
+  /* 0110 */ V(9, 15, 3),
+  /* 0111 */ V(9, 15, 3),
+  /* 1000 */ V(15, 9, 3),
+  /* 1001 */ V(15, 9, 3),
+  /* 1010 */ V(14, 10, 3),
+  /* 1011 */ V(14, 10, 3),
+  /* 1100 */ V(11, 13, 3),
+  /* 1101 */ V(11, 13, 3),
+  /* 1110 */ V(13, 11, 3),
+  /* 1111 */ V(13, 11, 3),
+
+  /* 0000 0000 0010 ... */
+  /* 0000 */ V(8, 15, 3),	/* 294 */
+  /* 0001 */ V(8, 15, 3),
+  /* 0010 */ V(15, 8, 3),
+  /* 0011 */ V(15, 8, 3),
+  /* 0100 */ V(12, 12, 3),
+  /* 0101 */ V(12, 12, 3),
+  /* 0110 */ V(10, 14, 4),
+  /* 0111 */ V(9, 14, 4),
+  /* 1000 */ V(8, 14, 3),
+  /* 1001 */ V(8, 14, 3),
+  /* 1010 */ V(7, 15, 4),
+  /* 1011 */ V(7, 14, 4),
+  /* 1100 */ V(15, 7, 2),
+  /* 1101 */ V(15, 7, 2),
+  /* 1110 */ V(15, 7, 2),
+  /* 1111 */ V(15, 7, 2),
+
+  /* 0000 0000 0011 ... */
+  /* 000  */ V(13, 10, 2),	/* 310 */
+  /* 001  */ V(13, 10, 2),
+  /* 010  */ V(10, 13, 3),
+  /* 011  */ V(11, 12, 3),
+  /* 100  */ V(12, 11, 3),
+  /* 101  */ V(15, 6, 3),
+  /* 110  */ V(6, 15, 2),
+  /* 111  */ V(6, 15, 2),
+
+  /* 0000 0000 0100 ... */
+  /* 00   */ V(14, 8, 2),	/* 318 */
+  /* 01   */ V(5, 15, 2),
+  /* 10   */ V(9, 13, 2),
+  /* 11   */ V(13, 9, 2),
+
+  /* 0000 0000 0101 ... */
+  /* 00   */ V(15, 5, 2),	/* 322 */
+  /* 01   */ V(14, 7, 2),
+  /* 10   */ V(10, 12, 2),
+  /* 11   */ V(11, 11, 2),
+
+  /* 0000 0000 0110 ... */
+  /* 000  */ V(4, 15, 2),	/* 326 */
+  /* 001  */ V(4, 15, 2),
+  /* 010  */ V(15, 4, 2),
+  /* 011  */ V(15, 4, 2),
+  /* 100  */ V(12, 10, 3),
+  /* 101  */ V(14, 6, 3),
+  /* 110  */ V(15, 3, 2),
+  /* 111  */ V(15, 3, 2),
+
+  /* 0000 0000 0111 ... */
+  /* 00   */ V(3, 15, 1),	/* 334 */
+  /* 01   */ V(3, 15, 1),
+  /* 10   */ V(8, 13, 2),
+  /* 11   */ V(13, 8, 2),
+
+  /* 0000 0000 1000 ... */
+  /* 0    */ V(2, 15, 1),	/* 338 */
+  /* 1    */ V(15, 2, 1),
+
+  /* 0000 0000 1001 ... */
+  /* 00   */ V(6, 14, 2),	/* 340 */
+  /* 01   */ V(9, 12, 2),
+  /* 10   */ V(0, 15, 1),
+  /* 11   */ V(0, 15, 1),
+
+  /* 0000 0000 1010 ... */
+  /* 00   */ V(12, 9, 2),	/* 344 */
+  /* 01   */ V(5, 14, 2),
+  /* 10   */ V(10, 11, 1),
+  /* 11   */ V(10, 11, 1),
+
+  /* 0000 0000 1011 ... */
+  /* 00   */ V(7, 13, 2),	/* 348 */
+  /* 01   */ V(13, 7, 2),
+  /* 10   */ V(4, 14, 1),
+  /* 11   */ V(4, 14, 1),
+
+  /* 0000 0000 1100 ... */
+  /* 00   */ V(12, 8, 2),	/* 352 */
+  /* 01   */ V(13, 6, 2),
+  /* 10   */ V(3, 14, 1),
+  /* 11   */ V(3, 14, 1),
+
+  /* 0000 0000 1101 ... */
+  /* 00   */ V(11, 9, 1),	/* 356 */
+  /* 01   */ V(11, 9, 1),
+  /* 10   */ V(9, 11, 2),
+  /* 11   */ V(10, 10, 2),
+
+  /* 0000 0001 0001 ... */
+  /* 0    */ V(11, 10, 1),	/* 360 */
+  /* 1    */ V(14, 5, 1),
+
+  /* 0000 0001 0010 ... */
+  /* 0    */ V(14, 4, 1),	/* 362 */
+  /* 1    */ V(8, 12, 1),
+
+  /* 0000 0001 0011 ... */
+  /* 0    */ V(6, 13, 1),	/* 364 */
+  /* 1    */ V(14, 3, 1),
+
+  /* 0000 0001 0101 ... */
+  /* 0    */ V(2, 14, 1),	/* 366 */
+  /* 1    */ V(0, 14, 1),
+
+  /* 0000 0001 1000 ... */
+  /* 0    */ V(14, 0, 1),	/* 368 */
+  /* 1    */ V(5, 13, 1),
+
+  /* 0000 0001 1001 ... */
+  /* 0    */ V(13, 5, 1),	/* 370 */
+  /* 1    */ V(7, 12, 1),
+
+  /* 0000 0001 1010 ... */
+  /* 0    */ V(12, 7, 1),	/* 372 */
+  /* 1    */ V(4, 13, 1),
+
+  /* 0000 0001 1011 ... */
+  /* 0    */ V(8, 11, 1),	/* 374 */
+  /* 1    */ V(11, 8, 1),
+
+  /* 0000 0001 1100 ... */
+  /* 0    */ V(13, 4, 1),	/* 376 */
+  /* 1    */ V(9, 10, 1),
+
+  /* 0000 0001 1101 ... */
+  /* 0    */ V(10, 9, 1),	/* 378 */
+  /* 1    */ V(6, 12, 1),
+
+  /* 0000 0010 0000 ... */
+  /* 0    */ V(13, 3, 1),	/* 380 */
+  /* 1    */ V(7, 11, 1),
+
+  /* 0000 0010 0101 ... */
+  /* 0    */ V(5, 12, 1),	/* 382 */
+  /* 1    */ V(12, 5, 1),
+
+  /* 0000 0010 0110 ... */
+  /* 0    */ V(9, 9, 1),	/* 384 */
+  /* 1    */ V(7, 10, 1),
+
+  /* 0000 0010 1000 ... */
+  /* 0    */ V(10, 7, 1),	/* 386 */
+  /* 1    */ V(9, 7, 1),
+
+  /* 0000 0000 0000 0000 ... */
+  /* 000  */ V(15, 14, 3),	/* 388 */
+  /* 001  */ V(15, 12, 3),
+  /* 010  */ V(15, 13, 2),
+  /* 011  */ V(15, 13, 2),
+  /* 100  */ V(14, 13, 1),
+  /* 101  */ V(14, 13, 1),
+  /* 110  */ V(14, 13, 1),
+  /* 111  */ V(14, 13, 1),
+
+  /* 0000 0000 0000 1011 ... */
+  /* 0    */ V(10, 15, 1),	/* 396 */
+  /* 1    */ V(14, 9, 1)
+];
+
+var hufftab15 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 4),
+  /* 0100 */ PTR(80, 4),
+  /* 0101 */ PTR(96, 3),
+  /* 0110 */ PTR(104, 3),
+  /* 0111 */ PTR(112, 2),
+  /* 1000 */ PTR(116, 1),
+  /* 1001 */ PTR(118, 1),
+  /* 1010 */ V(1, 1, 3),
+  /* 1011 */ V(1, 1, 3),
+  /* 1100 */ V(0, 1, 4),
+  /* 1101 */ V(1, 0, 4),
+  /* 1110 */ V(0, 0, 3),
+  /* 1111 */ V(0, 0, 3),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(120, 4),	/* 16 */
+  /* 0001 */ PTR(136, 4),
+  /* 0010 */ PTR(152, 4),
+  /* 0011 */ PTR(168, 4),
+  /* 0100 */ PTR(184, 4),
+  /* 0101 */ PTR(200, 3),
+  /* 0110 */ PTR(208, 3),
+  /* 0111 */ PTR(216, 4),
+  /* 1000 */ PTR(232, 3),
+  /* 1001 */ PTR(240, 3),
+  /* 1010 */ PTR(248, 3),
+  /* 1011 */ PTR(256, 3),
+  /* 1100 */ PTR(264, 2),
+  /* 1101 */ PTR(268, 3),
+  /* 1110 */ PTR(276, 3),
+  /* 1111 */ PTR(284, 2),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(288, 2),	/* 32 */
+  /* 0001 */ PTR(292, 2),
+  /* 0010 */ PTR(296, 2),
+  /* 0011 */ PTR(300, 2),
+  /* 0100 */ PTR(304, 2),
+  /* 0101 */ PTR(308, 2),
+  /* 0110 */ PTR(312, 2),
+  /* 0111 */ PTR(316, 2),
+  /* 1000 */ PTR(320, 1),
+  /* 1001 */ PTR(322, 1),
+  /* 1010 */ PTR(324, 1),
+  /* 1011 */ PTR(326, 2),
+  /* 1100 */ PTR(330, 1),
+  /* 1101 */ PTR(332, 1),
+  /* 1110 */ PTR(334, 2),
+  /* 1111 */ PTR(338, 1),
+
+  /* 0010 ... */
+  /* 0000 */ PTR(340, 1),	/* 48 */
+  /* 0001 */ PTR(342, 1),
+  /* 0010 */ V(9, 1, 4),
+  /* 0011 */ PTR(344, 1),
+  /* 0100 */ PTR(346, 1),
+  /* 0101 */ PTR(348, 1),
+  /* 0110 */ PTR(350, 1),
+  /* 0111 */ PTR(352, 1),
+  /* 1000 */ V(2, 8, 4),
+  /* 1001 */ V(8, 2, 4),
+  /* 1010 */ V(1, 8, 4),
+  /* 1011 */ V(8, 1, 4),
+  /* 1100 */ PTR(354, 1),
+  /* 1101 */ PTR(356, 1),
+  /* 1110 */ PTR(358, 1),
+  /* 1111 */ PTR(360, 1),
+
+  /* 0011 ... */
+  /* 0000 */ V(2, 7, 4),	/* 64 */
+  /* 0001 */ V(7, 2, 4),
+  /* 0010 */ V(6, 4, 4),
+  /* 0011 */ V(1, 7, 4),
+  /* 0100 */ V(5, 5, 4),
+  /* 0101 */ V(7, 1, 4),
+  /* 0110 */ PTR(362, 1),
+  /* 0111 */ V(3, 6, 4),
+  /* 1000 */ V(6, 3, 4),
+  /* 1001 */ V(4, 5, 4),
+  /* 1010 */ V(5, 4, 4),
+  /* 1011 */ V(2, 6, 4),
+  /* 1100 */ V(6, 2, 4),
+  /* 1101 */ V(1, 6, 4),
+  /* 1110 */ PTR(364, 1),
+  /* 1111 */ V(3, 5, 4),
+
+  /* 0100 ... */
+  /* 0000 */ V(6, 1, 3),	/* 80 */
+  /* 0001 */ V(6, 1, 3),
+  /* 0010 */ V(5, 3, 4),
+  /* 0011 */ V(4, 4, 4),
+  /* 0100 */ V(2, 5, 3),
+  /* 0101 */ V(2, 5, 3),
+  /* 0110 */ V(5, 2, 3),
+  /* 0111 */ V(5, 2, 3),
+  /* 1000 */ V(1, 5, 3),
+  /* 1001 */ V(1, 5, 3),
+  /* 1010 */ V(5, 1, 3),
+  /* 1011 */ V(5, 1, 3),
+  /* 1100 */ V(0, 5, 4),
+  /* 1101 */ V(5, 0, 4),
+  /* 1110 */ V(3, 4, 3),
+  /* 1111 */ V(3, 4, 3),
+
+  /* 0101 ... */
+  /* 000  */ V(4, 3, 3),	/* 96 */
+  /* 001  */ V(2, 4, 3),
+  /* 010  */ V(4, 2, 3),
+  /* 011  */ V(3, 3, 3),
+  /* 100  */ V(4, 1, 2),
+  /* 101  */ V(4, 1, 2),
+  /* 110  */ V(1, 4, 3),
+  /* 111  */ V(0, 4, 3),
+
+  /* 0110 ... */
+  /* 000  */ V(2, 3, 2),	/* 104 */
+  /* 001  */ V(2, 3, 2),
+  /* 010  */ V(3, 2, 2),
+  /* 011  */ V(3, 2, 2),
+  /* 100  */ V(4, 0, 3),
+  /* 101  */ V(0, 3, 3),
+  /* 110  */ V(1, 3, 2),
+  /* 111  */ V(1, 3, 2),
+
+  /* 0111 ... */
+  /* 00   */ V(3, 1, 2),	/* 112 */
+  /* 01   */ V(3, 0, 2),
+  /* 10   */ V(2, 2, 1),
+  /* 11   */ V(2, 2, 1),
+
+  /* 1000 ... */
+  /* 0    */ V(1, 2, 1),	/* 116 */
+  /* 1    */ V(2, 1, 1),
+
+  /* 1001 ... */
+  /* 0    */ V(0, 2, 1),	/* 118 */
+  /* 1    */ V(2, 0, 1),
+
+  /* 0000 0000 ... */
+  /* 0000 */ PTR(366, 1),	/* 120 */
+  /* 0001 */ PTR(368, 1),
+  /* 0010 */ V(14, 14, 4),
+  /* 0011 */ PTR(370, 1),
+  /* 0100 */ PTR(372, 1),
+  /* 0101 */ PTR(374, 1),
+  /* 0110 */ V(15, 11, 4),
+  /* 0111 */ PTR(376, 1),
+  /* 1000 */ V(13, 13, 4),
+  /* 1001 */ V(10, 15, 4),
+  /* 1010 */ V(15, 10, 4),
+  /* 1011 */ V(11, 14, 4),
+  /* 1100 */ V(14, 11, 4),
+  /* 1101 */ V(12, 13, 4),
+  /* 1110 */ V(13, 12, 4),
+  /* 1111 */ V(9, 15, 4),
+
+  /* 0000 0001 ... */
+  /* 0000 */ V(15, 9, 4),	/* 136 */
+  /* 0001 */ V(14, 10, 4),
+  /* 0010 */ V(11, 13, 4),
+  /* 0011 */ V(13, 11, 4),
+  /* 0100 */ V(8, 15, 4),
+  /* 0101 */ V(15, 8, 4),
+  /* 0110 */ V(12, 12, 4),
+  /* 0111 */ V(9, 14, 4),
+  /* 1000 */ V(14, 9, 4),
+  /* 1001 */ V(7, 15, 4),
+  /* 1010 */ V(15, 7, 4),
+  /* 1011 */ V(10, 13, 4),
+  /* 1100 */ V(13, 10, 4),
+  /* 1101 */ V(11, 12, 4),
+  /* 1110 */ V(6, 15, 4),
+  /* 1111 */ PTR(378, 1),
+
+  /* 0000 0010 ... */
+  /* 0000 */ V(12, 11, 3),	/* 152 */
+  /* 0001 */ V(12, 11, 3),
+  /* 0010 */ V(15, 6, 3),
+  /* 0011 */ V(15, 6, 3),
+  /* 0100 */ V(8, 14, 4),
+  /* 0101 */ V(14, 8, 4),
+  /* 0110 */ V(5, 15, 4),
+  /* 0111 */ V(9, 13, 4),
+  /* 1000 */ V(15, 5, 3),
+  /* 1001 */ V(15, 5, 3),
+  /* 1010 */ V(7, 14, 3),
+  /* 1011 */ V(7, 14, 3),
+  /* 1100 */ V(14, 7, 3),
+  /* 1101 */ V(14, 7, 3),
+  /* 1110 */ V(10, 12, 3),
+  /* 1111 */ V(10, 12, 3),
+
+  /* 0000 0011 ... */
+  /* 0000 */ V(12, 10, 3),	/* 168 */
+  /* 0001 */ V(12, 10, 3),
+  /* 0010 */ V(11, 11, 3),
+  /* 0011 */ V(11, 11, 3),
+  /* 0100 */ V(13, 9, 4),
+  /* 0101 */ V(8, 13, 4),
+  /* 0110 */ V(4, 15, 3),
+  /* 0111 */ V(4, 15, 3),
+  /* 1000 */ V(15, 4, 3),
+  /* 1001 */ V(15, 4, 3),
+  /* 1010 */ V(3, 15, 3),
+  /* 1011 */ V(3, 15, 3),
+  /* 1100 */ V(15, 3, 3),
+  /* 1101 */ V(15, 3, 3),
+  /* 1110 */ V(13, 8, 3),
+  /* 1111 */ V(13, 8, 3),
+
+  /* 0000 0100 ... */
+  /* 0000 */ V(14, 6, 3),	/* 184 */
+  /* 0001 */ V(14, 6, 3),
+  /* 0010 */ V(2, 15, 3),
+  /* 0011 */ V(2, 15, 3),
+  /* 0100 */ V(15, 2, 3),
+  /* 0101 */ V(15, 2, 3),
+  /* 0110 */ V(6, 14, 4),
+  /* 0111 */ V(15, 0, 4),
+  /* 1000 */ V(1, 15, 3),
+  /* 1001 */ V(1, 15, 3),
+  /* 1010 */ V(15, 1, 3),
+  /* 1011 */ V(15, 1, 3),
+  /* 1100 */ V(9, 12, 3),
+  /* 1101 */ V(9, 12, 3),
+  /* 1110 */ V(12, 9, 3),
+  /* 1111 */ V(12, 9, 3),
+
+  /* 0000 0101 ... */
+  /* 000  */ V(5, 14, 3),	/* 200 */
+  /* 001  */ V(10, 11, 3),
+  /* 010  */ V(11, 10, 3),
+  /* 011  */ V(14, 5, 3),
+  /* 100  */ V(7, 13, 3),
+  /* 101  */ V(13, 7, 3),
+  /* 110  */ V(4, 14, 3),
+  /* 111  */ V(14, 4, 3),
+
+  /* 0000 0110 ... */
+  /* 000  */ V(8, 12, 3),	/* 208 */
+  /* 001  */ V(12, 8, 3),
+  /* 010  */ V(3, 14, 3),
+  /* 011  */ V(6, 13, 3),
+  /* 100  */ V(13, 6, 3),
+  /* 101  */ V(14, 3, 3),
+  /* 110  */ V(9, 11, 3),
+  /* 111  */ V(11, 9, 3),
+
+  /* 0000 0111 ... */
+  /* 0000 */ V(2, 14, 3),	/* 216 */
+  /* 0001 */ V(2, 14, 3),
+  /* 0010 */ V(10, 10, 3),
+  /* 0011 */ V(10, 10, 3),
+  /* 0100 */ V(14, 2, 3),
+  /* 0101 */ V(14, 2, 3),
+  /* 0110 */ V(1, 14, 3),
+  /* 0111 */ V(1, 14, 3),
+  /* 1000 */ V(14, 1, 3),
+  /* 1001 */ V(14, 1, 3),
+  /* 1010 */ V(0, 14, 4),
+  /* 1011 */ V(14, 0, 4),
+  /* 1100 */ V(5, 13, 3),
+  /* 1101 */ V(5, 13, 3),
+  /* 1110 */ V(13, 5, 3),
+  /* 1111 */ V(13, 5, 3),
+
+  /* 0000 1000 ... */
+  /* 000  */ V(7, 12, 3),	/* 232 */
+  /* 001  */ V(12, 7, 3),
+  /* 010  */ V(4, 13, 3),
+  /* 011  */ V(8, 11, 3),
+  /* 100  */ V(13, 4, 2),
+  /* 101  */ V(13, 4, 2),
+  /* 110  */ V(11, 8, 3),
+  /* 111  */ V(9, 10, 3),
+
+  /* 0000 1001 ... */
+  /* 000  */ V(10, 9, 3),	/* 240 */
+  /* 001  */ V(6, 12, 3),
+  /* 010  */ V(12, 6, 3),
+  /* 011  */ V(3, 13, 3),
+  /* 100  */ V(13, 3, 2),
+  /* 101  */ V(13, 3, 2),
+  /* 110  */ V(13, 2, 2),
+  /* 111  */ V(13, 2, 2),
+
+  /* 0000 1010 ... */
+  /* 000  */ V(2, 13, 3),	/* 248 */
+  /* 001  */ V(0, 13, 3),
+  /* 010  */ V(1, 13, 2),
+  /* 011  */ V(1, 13, 2),
+  /* 100  */ V(7, 11, 2),
+  /* 101  */ V(7, 11, 2),
+  /* 110  */ V(11, 7, 2),
+  /* 111  */ V(11, 7, 2),
+
+  /* 0000 1011 ... */
+  /* 000  */ V(13, 1, 2),	/* 256 */
+  /* 001  */ V(13, 1, 2),
+  /* 010  */ V(5, 12, 3),
+  /* 011  */ V(13, 0, 3),
+  /* 100  */ V(12, 5, 2),
+  /* 101  */ V(12, 5, 2),
+  /* 110  */ V(8, 10, 2),
+  /* 111  */ V(8, 10, 2),
+
+  /* 0000 1100 ... */
+  /* 00   */ V(10, 8, 2),	/* 264 */
+  /* 01   */ V(4, 12, 2),
+  /* 10   */ V(12, 4, 2),
+  /* 11   */ V(6, 11, 2),
+
+  /* 0000 1101 ... */
+  /* 000  */ V(11, 6, 2),	/* 268 */
+  /* 001  */ V(11, 6, 2),
+  /* 010  */ V(9, 9, 3),
+  /* 011  */ V(0, 12, 3),
+  /* 100  */ V(3, 12, 2),
+  /* 101  */ V(3, 12, 2),
+  /* 110  */ V(12, 3, 2),
+  /* 111  */ V(12, 3, 2),
+
+  /* 0000 1110 ... */
+  /* 000  */ V(7, 10, 2),	/* 276 */
+  /* 001  */ V(7, 10, 2),
+  /* 010  */ V(10, 7, 2),
+  /* 011  */ V(10, 7, 2),
+  /* 100  */ V(10, 6, 2),
+  /* 101  */ V(10, 6, 2),
+  /* 110  */ V(12, 0, 3),
+  /* 111  */ V(0, 11, 3),
+
+  /* 0000 1111 ... */
+  /* 00   */ V(12, 2, 1),	/* 284 */
+  /* 01   */ V(12, 2, 1),
+  /* 10   */ V(2, 12, 2),
+  /* 11   */ V(5, 11, 2),
+
+  /* 0001 0000 ... */
+  /* 00   */ V(11, 5, 2),	/* 288 */
+  /* 01   */ V(1, 12, 2),
+  /* 10   */ V(8, 9, 2),
+  /* 11   */ V(9, 8, 2),
+
+  /* 0001 0001 ... */
+  /* 00   */ V(12, 1, 2),	/* 292 */
+  /* 01   */ V(4, 11, 2),
+  /* 10   */ V(11, 4, 2),
+  /* 11   */ V(6, 10, 2),
+
+  /* 0001 0010 ... */
+  /* 00   */ V(3, 11, 2),	/* 296 */
+  /* 01   */ V(7, 9, 2),
+  /* 10   */ V(11, 3, 1),
+  /* 11   */ V(11, 3, 1),
+
+  /* 0001 0011 ... */
+  /* 00   */ V(9, 7, 2),	/* 300 */
+  /* 01   */ V(8, 8, 2),
+  /* 10   */ V(2, 11, 2),
+  /* 11   */ V(5, 10, 2),
+
+  /* 0001 0100 ... */
+  /* 00   */ V(11, 2, 1),	/* 304 */
+  /* 01   */ V(11, 2, 1),
+  /* 10   */ V(10, 5, 2),
+  /* 11   */ V(1, 11, 2),
+
+  /* 0001 0101 ... */
+  /* 00   */ V(11, 1, 1),	/* 308 */
+  /* 01   */ V(11, 1, 1),
+  /* 10   */ V(11, 0, 2),
+  /* 11   */ V(6, 9, 2),
+
+  /* 0001 0110 ... */
+  /* 00   */ V(9, 6, 2),	/* 312 */
+  /* 01   */ V(4, 10, 2),
+  /* 10   */ V(10, 4, 2),
+  /* 11   */ V(7, 8, 2),
+
+  /* 0001 0111 ... */
+  /* 00   */ V(8, 7, 2),	/* 316 */
+  /* 01   */ V(3, 10, 2),
+  /* 10   */ V(10, 3, 1),
+  /* 11   */ V(10, 3, 1),
+
+  /* 0001 1000 ... */
+  /* 0    */ V(5, 9, 1),	/* 320 */
+  /* 1    */ V(9, 5, 1),
+
+  /* 0001 1001 ... */
+  /* 0    */ V(2, 10, 1),	/* 322 */
+  /* 1    */ V(10, 2, 1),
+
+  /* 0001 1010 ... */
+  /* 0    */ V(1, 10, 1),	/* 324 */
+  /* 1    */ V(10, 1, 1),
+
+  /* 0001 1011 ... */
+  /* 00   */ V(0, 10, 2),	/* 326 */
+  /* 01   */ V(10, 0, 2),
+  /* 10   */ V(6, 8, 1),
+  /* 11   */ V(6, 8, 1),
+
+  /* 0001 1100 ... */
+  /* 0    */ V(8, 6, 1),	/* 330 */
+  /* 1    */ V(4, 9, 1),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(9, 4, 1),	/* 332 */
+  /* 1    */ V(3, 9, 1),
+
+  /* 0001 1110 ... */
+  /* 00   */ V(9, 3, 1),	/* 334 */
+  /* 01   */ V(9, 3, 1),
+  /* 10   */ V(7, 7, 2),
+  /* 11   */ V(0, 9, 2),
+
+  /* 0001 1111 ... */
+  /* 0    */ V(5, 8, 1),	/* 338 */
+  /* 1    */ V(8, 5, 1),
+
+  /* 0010 0000 ... */
+  /* 0    */ V(2, 9, 1),	/* 340 */
+  /* 1    */ V(6, 7, 1),
+
+  /* 0010 0001 ... */
+  /* 0    */ V(7, 6, 1),	/* 342 */
+  /* 1    */ V(9, 2, 1),
+
+  /* 0010 0011 ... */
+  /* 0    */ V(1, 9, 1),	/* 344 */
+  /* 1    */ V(9, 0, 1),
+
+  /* 0010 0100 ... */
+  /* 0    */ V(4, 8, 1),	/* 346 */
+  /* 1    */ V(8, 4, 1),
+
+  /* 0010 0101 ... */
+  /* 0    */ V(5, 7, 1),	/* 348 */
+  /* 1    */ V(7, 5, 1),
+
+  /* 0010 0110 ... */
+  /* 0    */ V(3, 8, 1),	/* 350 */
+  /* 1    */ V(8, 3, 1),
+
+  /* 0010 0111 ... */
+  /* 0    */ V(6, 6, 1),	/* 352 */
+  /* 1    */ V(4, 7, 1),
+
+  /* 0010 1100 ... */
+  /* 0    */ V(7, 4, 1),	/* 354 */
+  /* 1    */ V(0, 8, 1),
+
+  /* 0010 1101 ... */
+  /* 0    */ V(8, 0, 1),	/* 356 */
+  /* 1    */ V(5, 6, 1),
+
+  /* 0010 1110 ... */
+  /* 0    */ V(6, 5, 1),	/* 358 */
+  /* 1    */ V(3, 7, 1),
+
+  /* 0010 1111 ... */
+  /* 0    */ V(7, 3, 1),	/* 360 */
+  /* 1    */ V(4, 6, 1),
+
+  /* 0011 0110 ... */
+  /* 0    */ V(0, 7, 1),	/* 362 */
+  /* 1    */ V(7, 0, 1),
+
+  /* 0011 1110 ... */
+  /* 0    */ V(0, 6, 1),	/* 364 */
+  /* 1    */ V(6, 0, 1),
+
+  /* 0000 0000 0000 ... */
+  /* 0    */ V(15, 15, 1),	/* 366 */
+  /* 1    */ V(14, 15, 1),
+
+  /* 0000 0000 0001 ... */
+  /* 0    */ V(15, 14, 1),	/* 368 */
+  /* 1    */ V(13, 15, 1),
+
+  /* 0000 0000 0011 ... */
+  /* 0    */ V(15, 13, 1),	/* 370 */
+  /* 1    */ V(12, 15, 1),
+
+  /* 0000 0000 0100 ... */
+  /* 0    */ V(15, 12, 1),	/* 372 */
+  /* 1    */ V(13, 14, 1),
+
+  /* 0000 0000 0101 ... */
+  /* 0    */ V(14, 13, 1),	/* 374 */
+  /* 1    */ V(11, 15, 1),
+
+  /* 0000 0000 0111 ... */
+  /* 0    */ V(12, 14, 1),	/* 376 */
+  /* 1    */ V(14, 12, 1),
+
+  /* 0000 0001 1111 ... */
+  /* 0    */ V(10, 14, 1),	/* 378 */
+  /* 1    */ V(0, 15, 1)
+];
+
+var hufftab16 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 2),
+  /* 0100 */ V(1, 1, 4),
+  /* 0101 */ V(0, 1, 4),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(68, 3),	/* 16 */
+  /* 0001 */ PTR(76, 3),
+  /* 0010 */ PTR(84, 2),
+  /* 0011 */ V(15, 15, 4),
+  /* 0100 */ PTR(88, 2),
+  /* 0101 */ PTR(92, 1),
+  /* 0110 */ PTR(94, 4),
+  /* 0111 */ V(15, 2, 4),
+  /* 1000 */ PTR(110, 1),
+  /* 1001 */ V(1, 15, 4),
+  /* 1010 */ V(15, 1, 4),
+  /* 1011 */ PTR(112, 4),
+  /* 1100 */ PTR(128, 4),
+  /* 1101 */ PTR(144, 4),
+  /* 1110 */ PTR(160, 4),
+  /* 1111 */ PTR(176, 4),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(192, 4),	/* 32 */
+  /* 0001 */ PTR(208, 3),
+  /* 0010 */ PTR(216, 3),
+  /* 0011 */ PTR(224, 3),
+  /* 0100 */ PTR(232, 3),
+  /* 0101 */ PTR(240, 3),
+  /* 0110 */ PTR(248, 3),
+  /* 0111 */ PTR(256, 3),
+  /* 1000 */ PTR(264, 2),
+  /* 1001 */ PTR(268, 2),
+  /* 1010 */ PTR(272, 1),
+  /* 1011 */ PTR(274, 2),
+  /* 1100 */ PTR(278, 2),
+  /* 1101 */ PTR(282, 1),
+  /* 1110 */ V(5, 1, 4),
+  /* 1111 */ PTR(284, 1),
+
+  /* 0010 ... */
+  /* 0000 */ PTR(286, 1),	/* 48 */
+  /* 0001 */ PTR(288, 1),
+  /* 0010 */ PTR(290, 1),
+  /* 0011 */ V(1, 4, 4),
+  /* 0100 */ V(4, 1, 4),
+  /* 0101 */ PTR(292, 1),
+  /* 0110 */ V(2, 3, 4),
+  /* 0111 */ V(3, 2, 4),
+  /* 1000 */ V(1, 3, 3),
+  /* 1001 */ V(1, 3, 3),
+  /* 1010 */ V(3, 1, 3),
+  /* 1011 */ V(3, 1, 3),
+  /* 1100 */ V(0, 3, 4),
+  /* 1101 */ V(3, 0, 4),
+  /* 1110 */ V(2, 2, 3),
+  /* 1111 */ V(2, 2, 3),
+
+  /* 0011 ... */
+  /* 00   */ V(1, 2, 2),	/* 64 */
+  /* 01   */ V(2, 1, 2),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 000  */ V(14, 15, 3),	/* 68 */
+  /* 001  */ V(15, 14, 3),
+  /* 010  */ V(13, 15, 3),
+  /* 011  */ V(15, 13, 3),
+  /* 100  */ V(12, 15, 3),
+  /* 101  */ V(15, 12, 3),
+  /* 110  */ V(11, 15, 3),
+  /* 111  */ V(15, 11, 3),
+
+  /* 0000 0001 ... */
+  /* 000  */ V(10, 15, 2),	/* 76 */
+  /* 001  */ V(10, 15, 2),
+  /* 010  */ V(15, 10, 3),
+  /* 011  */ V(9, 15, 3),
+  /* 100  */ V(15, 9, 3),
+  /* 101  */ V(15, 8, 3),
+  /* 110  */ V(8, 15, 2),
+  /* 111  */ V(8, 15, 2),
+
+  /* 0000 0010 ... */
+  /* 00   */ V(7, 15, 2),	/* 84 */
+  /* 01   */ V(15, 7, 2),
+  /* 10   */ V(6, 15, 2),
+  /* 11   */ V(15, 6, 2),
+
+  /* 0000 0100 ... */
+  /* 00   */ V(5, 15, 2),	/* 88 */
+  /* 01   */ V(15, 5, 2),
+  /* 10   */ V(4, 15, 1),
+  /* 11   */ V(4, 15, 1),
+
+  /* 0000 0101 ... */
+  /* 0    */ V(15, 4, 1),	/* 92 */
+  /* 1    */ V(15, 3, 1),
+
+  /* 0000 0110 ... */
+  /* 0000 */ V(15, 0, 1),	/* 94 */
+  /* 0001 */ V(15, 0, 1),
+  /* 0010 */ V(15, 0, 1),
+  /* 0011 */ V(15, 0, 1),
+  /* 0100 */ V(15, 0, 1),
+  /* 0101 */ V(15, 0, 1),
+  /* 0110 */ V(15, 0, 1),
+  /* 0111 */ V(15, 0, 1),
+  /* 1000 */ V(3, 15, 2),
+  /* 1001 */ V(3, 15, 2),
+  /* 1010 */ V(3, 15, 2),
+  /* 1011 */ V(3, 15, 2),
+  /* 1100 */ PTR(294, 4),
+  /* 1101 */ PTR(310, 3),
+  /* 1110 */ PTR(318, 3),
+  /* 1111 */ PTR(326, 3),
+
+  /* 0000 1000 ... */
+  /* 0    */ V(2, 15, 1),	/* 110 */
+  /* 1    */ V(0, 15, 1),
+
+  /* 0000 1011 ... */
+  /* 0000 */ PTR(334, 2),	/* 112 */
+  /* 0001 */ PTR(338, 2),
+  /* 0010 */ PTR(342, 2),
+  /* 0011 */ PTR(346, 1),
+  /* 0100 */ PTR(348, 2),
+  /* 0101 */ PTR(352, 2),
+  /* 0110 */ PTR(356, 1),
+  /* 0111 */ PTR(358, 2),
+  /* 1000 */ PTR(362, 2),
+  /* 1001 */ PTR(366, 2),
+  /* 1010 */ PTR(370, 2),
+  /* 1011 */ V(14, 3, 4),
+  /* 1100 */ PTR(374, 1),
+  /* 1101 */ PTR(376, 1),
+  /* 1110 */ PTR(378, 1),
+  /* 1111 */ PTR(380, 1),
+
+  /* 0000 1100 ... */
+  /* 0000 */ PTR(382, 1),	/* 128 */
+  /* 0001 */ PTR(384, 1),
+  /* 0010 */ PTR(386, 1),
+  /* 0011 */ V(0, 13, 4),
+  /* 0100 */ PTR(388, 1),
+  /* 0101 */ PTR(390, 1),
+  /* 0110 */ PTR(392, 1),
+  /* 0111 */ V(3, 12, 4),
+  /* 1000 */ PTR(394, 1),
+  /* 1001 */ V(1, 12, 4),
+  /* 1010 */ V(12, 0, 4),
+  /* 1011 */ PTR(396, 1),
+  /* 1100 */ V(14, 2, 3),
+  /* 1101 */ V(14, 2, 3),
+  /* 1110 */ V(2, 14, 4),
+  /* 1111 */ V(1, 14, 4),
+
+  /* 0000 1101 ... */
+  /* 0000 */ V(13, 3, 4),	/* 144 */
+  /* 0001 */ V(2, 13, 4),
+  /* 0010 */ V(13, 2, 4),
+  /* 0011 */ V(13, 1, 4),
+  /* 0100 */ V(3, 11, 4),
+  /* 0101 */ PTR(398, 1),
+  /* 0110 */ V(1, 13, 3),
+  /* 0111 */ V(1, 13, 3),
+  /* 1000 */ V(12, 4, 4),
+  /* 1001 */ V(6, 11, 4),
+  /* 1010 */ V(12, 3, 4),
+  /* 1011 */ V(10, 7, 4),
+  /* 1100 */ V(2, 12, 3),
+  /* 1101 */ V(2, 12, 3),
+  /* 1110 */ V(12, 2, 4),
+  /* 1111 */ V(11, 5, 4),
+
+  /* 0000 1110 ... */
+  /* 0000 */ V(12, 1, 4),	/* 160 */
+  /* 0001 */ V(0, 12, 4),
+  /* 0010 */ V(4, 11, 4),
+  /* 0011 */ V(11, 4, 4),
+  /* 0100 */ V(6, 10, 4),
+  /* 0101 */ V(10, 6, 4),
+  /* 0110 */ V(11, 3, 3),
+  /* 0111 */ V(11, 3, 3),
+  /* 1000 */ V(5, 10, 4),
+  /* 1001 */ V(10, 5, 4),
+  /* 1010 */ V(2, 11, 3),
+  /* 1011 */ V(2, 11, 3),
+  /* 1100 */ V(11, 2, 3),
+  /* 1101 */ V(11, 2, 3),
+  /* 1110 */ V(1, 11, 3),
+  /* 1111 */ V(1, 11, 3),
+
+  /* 0000 1111 ... */
+  /* 0000 */ V(11, 1, 3),	/* 176 */
+  /* 0001 */ V(11, 1, 3),
+  /* 0010 */ V(0, 11, 4),
+  /* 0011 */ V(11, 0, 4),
+  /* 0100 */ V(6, 9, 4),
+  /* 0101 */ V(9, 6, 4),
+  /* 0110 */ V(4, 10, 4),
+  /* 0111 */ V(10, 4, 4),
+  /* 1000 */ V(7, 8, 4),
+  /* 1001 */ V(8, 7, 4),
+  /* 1010 */ V(10, 3, 3),
+  /* 1011 */ V(10, 3, 3),
+  /* 1100 */ V(3, 10, 4),
+  /* 1101 */ V(5, 9, 4),
+  /* 1110 */ V(2, 10, 3),
+  /* 1111 */ V(2, 10, 3),
+
+  /* 0001 0000 ... */
+  /* 0000 */ V(9, 5, 4),	/* 192 */
+  /* 0001 */ V(6, 8, 4),
+  /* 0010 */ V(10, 1, 3),
+  /* 0011 */ V(10, 1, 3),
+  /* 0100 */ V(8, 6, 4),
+  /* 0101 */ V(7, 7, 4),
+  /* 0110 */ V(9, 4, 3),
+  /* 0111 */ V(9, 4, 3),
+  /* 1000 */ V(4, 9, 4),
+  /* 1001 */ V(5, 7, 4),
+  /* 1010 */ V(6, 7, 3),
+  /* 1011 */ V(6, 7, 3),
+  /* 1100 */ V(10, 2, 2),
+  /* 1101 */ V(10, 2, 2),
+  /* 1110 */ V(10, 2, 2),
+  /* 1111 */ V(10, 2, 2),
+
+  /* 0001 0001 ... */
+  /* 000  */ V(1, 10, 2),	/* 208 */
+  /* 001  */ V(1, 10, 2),
+  /* 010  */ V(0, 10, 3),
+  /* 011  */ V(10, 0, 3),
+  /* 100  */ V(3, 9, 3),
+  /* 101  */ V(9, 3, 3),
+  /* 110  */ V(5, 8, 3),
+  /* 111  */ V(8, 5, 3),
+
+  /* 0001 0010 ... */
+  /* 000  */ V(2, 9, 2),	/* 216 */
+  /* 001  */ V(2, 9, 2),
+  /* 010  */ V(9, 2, 2),
+  /* 011  */ V(9, 2, 2),
+  /* 100  */ V(7, 6, 3),
+  /* 101  */ V(0, 9, 3),
+  /* 110  */ V(1, 9, 2),
+  /* 111  */ V(1, 9, 2),
+
+  /* 0001 0011 ... */
+  /* 000  */ V(9, 1, 2),	/* 224 */
+  /* 001  */ V(9, 1, 2),
+  /* 010  */ V(9, 0, 3),
+  /* 011  */ V(4, 8, 3),
+  /* 100  */ V(8, 4, 3),
+  /* 101  */ V(7, 5, 3),
+  /* 110  */ V(3, 8, 3),
+  /* 111  */ V(8, 3, 3),
+
+  /* 0001 0100 ... */
+  /* 000  */ V(6, 6, 3),	/* 232 */
+  /* 001  */ V(2, 8, 3),
+  /* 010  */ V(8, 2, 2),
+  /* 011  */ V(8, 2, 2),
+  /* 100  */ V(4, 7, 3),
+  /* 101  */ V(7, 4, 3),
+  /* 110  */ V(1, 8, 2),
+  /* 111  */ V(1, 8, 2),
+
+  /* 0001 0101 ... */
+  /* 000  */ V(8, 1, 2),	/* 240 */
+  /* 001  */ V(8, 1, 2),
+  /* 010  */ V(8, 0, 2),
+  /* 011  */ V(8, 0, 2),
+  /* 100  */ V(0, 8, 3),
+  /* 101  */ V(5, 6, 3),
+  /* 110  */ V(3, 7, 2),
+  /* 111  */ V(3, 7, 2),
+
+  /* 0001 0110 ... */
+  /* 000  */ V(7, 3, 2),	/* 248 */
+  /* 001  */ V(7, 3, 2),
+  /* 010  */ V(6, 5, 3),
+  /* 011  */ V(4, 6, 3),
+  /* 100  */ V(2, 7, 2),
+  /* 101  */ V(2, 7, 2),
+  /* 110  */ V(7, 2, 2),
+  /* 111  */ V(7, 2, 2),
+
+  /* 0001 0111 ... */
+  /* 000  */ V(6, 4, 3),	/* 256 */
+  /* 001  */ V(5, 5, 3),
+  /* 010  */ V(0, 7, 2),
+  /* 011  */ V(0, 7, 2),
+  /* 100  */ V(1, 7, 1),
+  /* 101  */ V(1, 7, 1),
+  /* 110  */ V(1, 7, 1),
+  /* 111  */ V(1, 7, 1),
+
+  /* 0001 1000 ... */
+  /* 00   */ V(7, 1, 1),	/* 264  */
+  /* 01   */ V(7, 1, 1),
+  /* 10   */ V(7, 0, 2),
+  /* 11   */ V(3, 6, 2),
+
+  /* 0001 1001 ... */
+  /* 00   */ V(6, 3, 2),	/* 268 */
+  /* 01   */ V(4, 5, 2),
+  /* 10   */ V(5, 4, 2),
+  /* 11   */ V(2, 6, 2),
+
+  /* 0001 1010 ... */
+  /* 0    */ V(6, 2, 1),	/* 272 */
+  /* 1    */ V(1, 6, 1),
+
+  /* 0001 1011 ... */
+  /* 00   */ V(6, 1, 1),	/* 274 */
+  /* 01   */ V(6, 1, 1),
+  /* 10   */ V(0, 6, 2),
+  /* 11   */ V(6, 0, 2),
+
+  /* 0001 1100 ... */
+  /* 00   */ V(5, 3, 1),	/* 278 */
+  /* 01   */ V(5, 3, 1),
+  /* 10   */ V(3, 5, 2),
+  /* 11   */ V(4, 4, 2),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(2, 5, 1),	/* 282 */
+  /* 1    */ V(5, 2, 1),
+
+  /* 0001 1111 ... */
+  /* 0    */ V(1, 5, 1),	/* 284 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0010 0000 ... */
+  /* 0    */ V(3, 4, 1),	/* 286 */
+  /* 1    */ V(4, 3, 1),
+
+  /* 0010 0001 ... */
+  /* 0    */ V(5, 0, 1),	/* 288 */
+  /* 1    */ V(2, 4, 1),
+
+  /* 0010 0010 ... */
+  /* 0    */ V(4, 2, 1),	/* 290 */
+  /* 1    */ V(3, 3, 1),
+
+  /* 0010 0101 ... */
+  /* 0    */ V(0, 4, 1),	/* 292 */
+  /* 1    */ V(4, 0, 1),
+
+  /* 0000 0110 1100 ... */
+  /* 0000 */ V(12, 14, 4),	/* 294 */
+  /* 0001 */ PTR(400, 1),
+  /* 0010 */ V(13, 14, 3),
+  /* 0011 */ V(13, 14, 3),
+  /* 0100 */ V(14, 9, 3),
+  /* 0101 */ V(14, 9, 3),
+  /* 0110 */ V(14, 10, 4),
+  /* 0111 */ V(13, 9, 4),
+  /* 1000 */ V(14, 14, 2),
+  /* 1001 */ V(14, 14, 2),
+  /* 1010 */ V(14, 14, 2),
+  /* 1011 */ V(14, 14, 2),
+  /* 1100 */ V(14, 13, 3),
+  /* 1101 */ V(14, 13, 3),
+  /* 1110 */ V(14, 11, 3),
+  /* 1111 */ V(14, 11, 3),
+
+  /* 0000 0110 1101 ... */
+  /* 000  */ V(11, 14, 2),	/* 310 */
+  /* 001  */ V(11, 14, 2),
+  /* 010  */ V(12, 13, 2),
+  /* 011  */ V(12, 13, 2),
+  /* 100  */ V(13, 12, 3),
+  /* 101  */ V(13, 11, 3),
+  /* 110  */ V(10, 14, 2),
+  /* 111  */ V(10, 14, 2),
+
+  /* 0000 0110 1110 ... */
+  /* 000  */ V(12, 12, 2),	/* 318 */
+  /* 001  */ V(12, 12, 2),
+  /* 010  */ V(10, 13, 3),
+  /* 011  */ V(13, 10, 3),
+  /* 100  */ V(7, 14, 3),
+  /* 101  */ V(10, 12, 3),
+  /* 110  */ V(12, 10, 2),
+  /* 111  */ V(12, 10, 2),
+
+  /* 0000 0110 1111 ... */
+  /* 000  */ V(12, 9, 3),	/* 326 */
+  /* 001  */ V(7, 13, 3),
+  /* 010  */ V(5, 14, 2),
+  /* 011  */ V(5, 14, 2),
+  /* 100  */ V(11, 13, 1),
+  /* 101  */ V(11, 13, 1),
+  /* 110  */ V(11, 13, 1),
+  /* 111  */ V(11, 13, 1),
+
+  /* 0000 1011 0000 ... */
+  /* 00   */ V(9, 14, 1),	/* 334 */
+  /* 01   */ V(9, 14, 1),
+  /* 10   */ V(11, 12, 2),
+  /* 11   */ V(12, 11, 2),
+
+  /* 0000 1011 0001 ... */
+  /* 00   */ V(8, 14, 2),	/* 338 */
+  /* 01   */ V(14, 8, 2),
+  /* 10   */ V(9, 13, 2),
+  /* 11   */ V(14, 7, 2),
+
+  /* 0000 1011 0010 ... */
+  /* 00   */ V(11, 11, 2),	/* 342 */
+  /* 01   */ V(8, 13, 2),
+  /* 10   */ V(13, 8, 2),
+  /* 11   */ V(6, 14, 2),
+
+  /* 0000 1011 0011 ... */
+  /* 0    */ V(14, 6, 1),	/* 346 */
+  /* 1    */ V(9, 12, 1),
+
+  /* 0000 1011 0100 ... */
+  /* 00   */ V(10, 11, 2),	/* 348 */
+  /* 01   */ V(11, 10, 2),
+  /* 10   */ V(14, 5, 2),
+  /* 11   */ V(13, 7, 2),
+
+  /* 0000 1011 0101 ... */
+  /* 00   */ V(4, 14, 1),	/* 352 */
+  /* 01   */ V(4, 14, 1),
+  /* 10   */ V(14, 4, 2),
+  /* 11   */ V(8, 12, 2),
+
+  /* 0000 1011 0110 ... */
+  /* 0    */ V(12, 8, 1),	/* 356 */
+  /* 1    */ V(3, 14, 1),
+
+  /* 0000 1011 0111 ... */
+  /* 00   */ V(6, 13, 1),	/* 358 */
+  /* 01   */ V(6, 13, 1),
+  /* 10   */ V(13, 6, 2),
+  /* 11   */ V(9, 11, 2),
+
+  /* 0000 1011 1000 ... */
+  /* 00   */ V(11, 9, 2),	/* 362 */
+  /* 01   */ V(10, 10, 2),
+  /* 10   */ V(14, 1, 1),
+  /* 11   */ V(14, 1, 1),
+
+  /* 0000 1011 1001 ... */
+  /* 00   */ V(13, 4, 1),	/* 366 */
+  /* 01   */ V(13, 4, 1),
+  /* 10   */ V(11, 8, 2),
+  /* 11   */ V(10, 9, 2),
+
+  /* 0000 1011 1010 ... */
+  /* 00   */ V(7, 11, 1),	/* 370 */
+  /* 01   */ V(7, 11, 1),
+  /* 10   */ V(11, 7, 2),
+  /* 11   */ V(13, 0, 2),
+
+  /* 0000 1011 1100 ... */
+  /* 0    */ V(0, 14, 1),	/* 374 */
+  /* 1    */ V(14, 0, 1),
+
+  /* 0000 1011 1101 ... */
+  /* 0    */ V(5, 13, 1),	/* 376 */
+  /* 1    */ V(13, 5, 1),
+
+  /* 0000 1011 1110 ... */
+  /* 0    */ V(7, 12, 1),	/* 378 */
+  /* 1    */ V(12, 7, 1),
+
+  /* 0000 1011 1111 ... */
+  /* 0    */ V(4, 13, 1),	/* 380 */
+  /* 1    */ V(8, 11, 1),
+
+  /* 0000 1100 0000 ... */
+  /* 0    */ V(9, 10, 1),	/* 382 */
+  /* 1    */ V(6, 12, 1),
+
+  /* 0000 1100 0001 ... */
+  /* 0    */ V(12, 6, 1),	/* 384 */
+  /* 1    */ V(3, 13, 1),
+
+  /* 0000 1100 0010 ... */
+  /* 0    */ V(5, 12, 1),	/* 386 */
+  /* 1    */ V(12, 5, 1),
+
+  /* 0000 1100 0100 ... */
+  /* 0    */ V(8, 10, 1),	/* 388 */
+  /* 1    */ V(10, 8, 1),
+
+  /* 0000 1100 0101 ... */
+  /* 0    */ V(9, 9, 1),	/* 390 */
+  /* 1    */ V(4, 12, 1),
+
+  /* 0000 1100 0110 ... */
+  /* 0    */ V(11, 6, 1),	/* 392 */
+  /* 1    */ V(7, 10, 1),
+
+  /* 0000 1100 1000 ... */
+  /* 0    */ V(5, 11, 1),	/* 394 */
+  /* 1    */ V(8, 9, 1),
+
+  /* 0000 1100 1011 ... */
+  /* 0    */ V(9, 8, 1),	/* 396 */
+  /* 1    */ V(7, 9, 1),
+
+  /* 0000 1101 0101 ... */
+  /* 0    */ V(9, 7, 1),	/* 398 */
+  /* 1    */ V(8, 8, 1),
+
+  /* 0000 0110 1100 0001 ... */
+  /* 0    */ V(14, 12, 1),	/* 400 */
+  /* 1    */ V(13, 13, 1)
+];
+
+var hufftab24 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ V(15, 15, 4),
+  /* 0100 */ PTR(64, 4),
+  /* 0101 */ PTR(80, 4),
+  /* 0110 */ PTR(96, 4),
+  /* 0111 */ PTR(112, 4),
+  /* 1000 */ PTR(128, 4),
+  /* 1001 */ PTR(144, 4),
+  /* 1010 */ PTR(160, 3),
+  /* 1011 */ PTR(168, 2),
+  /* 1100 */ V(1, 1, 4),
+  /* 1101 */ V(0, 1, 4),
+  /* 1110 */ V(1, 0, 4),
+  /* 1111 */ V(0, 0, 4),
+
+  /* 0000 ... */
+  /* 0000 */ V(14, 15, 4),	/* 16 */
+  /* 0001 */ V(15, 14, 4),
+  /* 0010 */ V(13, 15, 4),
+  /* 0011 */ V(15, 13, 4),
+  /* 0100 */ V(12, 15, 4),
+  /* 0101 */ V(15, 12, 4),
+  /* 0110 */ V(11, 15, 4),
+  /* 0111 */ V(15, 11, 4),
+  /* 1000 */ V(15, 10, 3),
+  /* 1001 */ V(15, 10, 3),
+  /* 1010 */ V(10, 15, 4),
+  /* 1011 */ V(9, 15, 4),
+  /* 1100 */ V(15, 9, 3),
+  /* 1101 */ V(15, 9, 3),
+  /* 1110 */ V(15, 8, 3),
+  /* 1111 */ V(15, 8, 3),
+
+  /* 0001 ... */
+  /* 0000 */ V(8, 15, 4),	/* 32 */
+  /* 0001 */ V(7, 15, 4),
+  /* 0010 */ V(15, 7, 3),
+  /* 0011 */ V(15, 7, 3),
+  /* 0100 */ V(6, 15, 3),
+  /* 0101 */ V(6, 15, 3),
+  /* 0110 */ V(15, 6, 3),
+  /* 0111 */ V(15, 6, 3),
+  /* 1000 */ V(5, 15, 3),
+  /* 1001 */ V(5, 15, 3),
+  /* 1010 */ V(15, 5, 3),
+  /* 1011 */ V(15, 5, 3),
+  /* 1100 */ V(4, 15, 3),
+  /* 1101 */ V(4, 15, 3),
+  /* 1110 */ V(15, 4, 3),
+  /* 1111 */ V(15, 4, 3),
+
+  /* 0010 ... */
+  /* 0000 */ V(3, 15, 3),	/* 48 */
+  /* 0001 */ V(3, 15, 3),
+  /* 0010 */ V(15, 3, 3),
+  /* 0011 */ V(15, 3, 3),
+  /* 0100 */ V(2, 15, 3),
+  /* 0101 */ V(2, 15, 3),
+  /* 0110 */ V(15, 2, 3),
+  /* 0111 */ V(15, 2, 3),
+  /* 1000 */ V(15, 1, 3),
+  /* 1001 */ V(15, 1, 3),
+  /* 1010 */ V(1, 15, 4),
+  /* 1011 */ V(15, 0, 4),
+  /* 1100 */ PTR(172, 3),
+  /* 1101 */ PTR(180, 3),
+  /* 1110 */ PTR(188, 3),
+  /* 1111 */ PTR(196, 3),
+
+  /* 0100 ... */
+  /* 0000 */ PTR(204, 4),	/* 64 */
+  /* 0001 */ PTR(220, 3),
+  /* 0010 */ PTR(228, 3),
+  /* 0011 */ PTR(236, 3),
+  /* 0100 */ PTR(244, 2),
+  /* 0101 */ PTR(248, 2),
+  /* 0110 */ PTR(252, 2),
+  /* 0111 */ PTR(256, 2),
+  /* 1000 */ PTR(260, 2),
+  /* 1001 */ PTR(264, 2),
+  /* 1010 */ PTR(268, 2),
+  /* 1011 */ PTR(272, 2),
+  /* 1100 */ PTR(276, 2),
+  /* 1101 */ PTR(280, 3),
+  /* 1110 */ PTR(288, 2),
+  /* 1111 */ PTR(292, 2),
+
+  /* 0101 ... */
+  /* 0000 */ PTR(296, 2),	/* 80 */
+  /* 0001 */ PTR(300, 3),
+  /* 0010 */ PTR(308, 2),
+  /* 0011 */ PTR(312, 3),
+  /* 0100 */ PTR(320, 1),
+  /* 0101 */ PTR(322, 2),
+  /* 0110 */ PTR(326, 2),
+  /* 0111 */ PTR(330, 1),
+  /* 1000 */ PTR(332, 2),
+  /* 1001 */ PTR(336, 1),
+  /* 1010 */ PTR(338, 1),
+  /* 1011 */ PTR(340, 1),
+  /* 1100 */ PTR(342, 1),
+  /* 1101 */ PTR(344, 1),
+  /* 1110 */ PTR(346, 1),
+  /* 1111 */ PTR(348, 1),
+
+  /* 0110 ... */
+  /* 0000 */ PTR(350, 1),	/* 96 */
+  /* 0001 */ PTR(352, 1),
+  /* 0010 */ PTR(354, 1),
+  /* 0011 */ PTR(356, 1),
+  /* 0100 */ PTR(358, 1),
+  /* 0101 */ PTR(360, 1),
+  /* 0110 */ PTR(362, 1),
+  /* 0111 */ PTR(364, 1),
+  /* 1000 */ PTR(366, 1),
+  /* 1001 */ PTR(368, 1),
+  /* 1010 */ PTR(370, 2),
+  /* 1011 */ PTR(374, 1),
+  /* 1100 */ PTR(376, 2),
+  /* 1101 */ V(7, 3, 4),
+  /* 1110 */ PTR(380, 1),
+  /* 1111 */ V(7, 2, 4),
+
+  /* 0111 ... */
+  /* 0000 */ V(4, 6, 4),	/* 112 */
+  /* 0001 */ V(6, 4, 4),
+  /* 0010 */ V(5, 5, 4),
+  /* 0011 */ V(7, 1, 4),
+  /* 0100 */ V(3, 6, 4),
+  /* 0101 */ V(6, 3, 4),
+  /* 0110 */ V(4, 5, 4),
+  /* 0111 */ V(5, 4, 4),
+  /* 1000 */ V(2, 6, 4),
+  /* 1001 */ V(6, 2, 4),
+  /* 1010 */ V(1, 6, 4),
+  /* 1011 */ V(6, 1, 4),
+  /* 1100 */ PTR(382, 1),
+  /* 1101 */ V(3, 5, 4),
+  /* 1110 */ V(5, 3, 4),
+  /* 1111 */ V(4, 4, 4),
+
+  /* 1000 ... */
+  /* 0000 */ V(2, 5, 4),	/* 128 */
+  /* 0001 */ V(5, 2, 4),
+  /* 0010 */ V(1, 5, 4),
+  /* 0011 */ PTR(384, 1),
+  /* 0100 */ V(5, 1, 3),
+  /* 0101 */ V(5, 1, 3),
+  /* 0110 */ V(3, 4, 4),
+  /* 0111 */ V(4, 3, 4),
+  /* 1000 */ V(2, 4, 3),
+  /* 1001 */ V(2, 4, 3),
+  /* 1010 */ V(4, 2, 3),
+  /* 1011 */ V(4, 2, 3),
+  /* 1100 */ V(3, 3, 3),
+  /* 1101 */ V(3, 3, 3),
+  /* 1110 */ V(1, 4, 3),
+  /* 1111 */ V(1, 4, 3),
+
+  /* 1001 ... */
+  /* 0000 */ V(4, 1, 3),	/* 144 */
+  /* 0001 */ V(4, 1, 3),
+  /* 0010 */ V(0, 4, 4),
+  /* 0011 */ V(4, 0, 4),
+  /* 0100 */ V(2, 3, 3),
+  /* 0101 */ V(2, 3, 3),
+  /* 0110 */ V(3, 2, 3),
+  /* 0111 */ V(3, 2, 3),
+  /* 1000 */ V(1, 3, 2),
+  /* 1001 */ V(1, 3, 2),
+  /* 1010 */ V(1, 3, 2),
+  /* 1011 */ V(1, 3, 2),
+  /* 1100 */ V(3, 1, 2),
+  /* 1101 */ V(3, 1, 2),
+  /* 1110 */ V(3, 1, 2),
+  /* 1111 */ V(3, 1, 2),
+
+  /* 1010 ... */
+  /* 000  */ V(0, 3, 3),	/* 160 */
+  /* 001  */ V(3, 0, 3),
+  /* 010  */ V(2, 2, 2),
+  /* 011  */ V(2, 2, 2),
+  /* 100  */ V(1, 2, 1),
+  /* 101  */ V(1, 2, 1),
+  /* 110  */ V(1, 2, 1),
+  /* 111  */ V(1, 2, 1),
+
+  /* 1011 ... */
+  /* 00   */ V(2, 1, 1),	/* 168 */
+  /* 01   */ V(2, 1, 1),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0010 1100 ... */
+  /* 000  */ V(0, 15, 1),	/* 172 */
+  /* 001  */ V(0, 15, 1),
+  /* 010  */ V(0, 15, 1),
+  /* 011  */ V(0, 15, 1),
+  /* 100  */ V(14, 14, 3),
+  /* 101  */ V(13, 14, 3),
+  /* 110  */ V(14, 13, 3),
+  /* 111  */ V(12, 14, 3),
+
+  /* 0010 1101 ... */
+  /* 000  */ V(14, 12, 3),	/* 180 */
+  /* 001  */ V(13, 13, 3),
+  /* 010  */ V(11, 14, 3),
+  /* 011  */ V(14, 11, 3),
+  /* 100  */ V(12, 13, 3),
+  /* 101  */ V(13, 12, 3),
+  /* 110  */ V(10, 14, 3),
+  /* 111  */ V(14, 10, 3),
+
+  /* 0010 1110 ... */
+  /* 000  */ V(11, 13, 3),	/* 188 */
+  /* 001  */ V(13, 11, 3),
+  /* 010  */ V(12, 12, 3),
+  /* 011  */ V(9, 14, 3),
+  /* 100  */ V(14, 9, 3),
+  /* 101  */ V(10, 13, 3),
+  /* 110  */ V(13, 10, 3),
+  /* 111  */ V(11, 12, 3),
+
+  /* 0010 1111 ... */
+  /* 000  */ V(12, 11, 3),	/* 196 */
+  /* 001  */ V(8, 14, 3),
+  /* 010  */ V(14, 8, 3),
+  /* 011  */ V(9, 13, 3),
+  /* 100  */ V(13, 9, 3),
+  /* 101  */ V(7, 14, 3),
+  /* 110  */ V(14, 7, 3),
+  /* 111  */ V(10, 12, 3),
+
+  /* 0100 0000 ... */
+  /* 0000 */ V(12, 10, 3),	/* 204 */
+  /* 0001 */ V(12, 10, 3),
+  /* 0010 */ V(11, 11, 3),
+  /* 0011 */ V(11, 11, 3),
+  /* 0100 */ V(8, 13, 3),
+  /* 0101 */ V(8, 13, 3),
+  /* 0110 */ V(13, 8, 3),
+  /* 0111 */ V(13, 8, 3),
+  /* 1000 */ V(0, 14, 4),
+  /* 1001 */ V(14, 0, 4),
+  /* 1010 */ V(0, 13, 3),
+  /* 1011 */ V(0, 13, 3),
+  /* 1100 */ V(14, 6, 2),
+  /* 1101 */ V(14, 6, 2),
+  /* 1110 */ V(14, 6, 2),
+  /* 1111 */ V(14, 6, 2),
+
+  /* 0100 0001 ... */
+  /* 000  */ V(6, 14, 3),	/* 220 */
+  /* 001  */ V(9, 12, 3),
+  /* 010  */ V(12, 9, 2),
+  /* 011  */ V(12, 9, 2),
+  /* 100  */ V(5, 14, 2),
+  /* 101  */ V(5, 14, 2),
+  /* 110  */ V(11, 10, 2),
+  /* 111  */ V(11, 10, 2),
+
+  /* 0100 0010 ... */
+  /* 000  */ V(14, 5, 2),	/* 228 */
+  /* 001  */ V(14, 5, 2),
+  /* 010  */ V(10, 11, 3),
+  /* 011  */ V(7, 13, 3),
+  /* 100  */ V(13, 7, 2),
+  /* 101  */ V(13, 7, 2),
+  /* 110  */ V(14, 4, 2),
+  /* 111  */ V(14, 4, 2),
+
+  /* 0100 0011 ... */
+  /* 000  */ V(8, 12, 2),	/* 236 */
+  /* 001  */ V(8, 12, 2),
+  /* 010  */ V(12, 8, 2),
+  /* 011  */ V(12, 8, 2),
+  /* 100  */ V(4, 14, 3),
+  /* 101  */ V(2, 14, 3),
+  /* 110  */ V(3, 14, 2),
+  /* 111  */ V(3, 14, 2),
+
+  /* 0100 0100 ... */
+  /* 00   */ V(6, 13, 2),	/* 244 */
+  /* 01   */ V(13, 6, 2),
+  /* 10   */ V(14, 3, 2),
+  /* 11   */ V(9, 11, 2),
+
+  /* 0100 0101 ... */
+  /* 00   */ V(11, 9, 2),	/* 248 */
+  /* 01   */ V(10, 10, 2),
+  /* 10   */ V(14, 2, 2),
+  /* 11   */ V(1, 14, 2),
+
+  /* 0100 0110 ... */
+  /* 00   */ V(14, 1, 2),	/* 252 */
+  /* 01   */ V(5, 13, 2),
+  /* 10   */ V(13, 5, 2),
+  /* 11   */ V(7, 12, 2),
+
+  /* 0100 0111 ... */
+  /* 00   */ V(12, 7, 2),	/* 256 */
+  /* 01   */ V(4, 13, 2),
+  /* 10   */ V(8, 11, 2),
+  /* 11   */ V(11, 8, 2),
+
+  /* 0100 1000 ... */
+  /* 00   */ V(13, 4, 2),	/* 260 */
+  /* 01   */ V(9, 10, 2),
+  /* 10   */ V(10, 9, 2),
+  /* 11   */ V(6, 12, 2),
+
+  /* 0100 1001 ... */
+  /* 00   */ V(12, 6, 2),	/* 264 */
+  /* 01   */ V(3, 13, 2),
+  /* 10   */ V(13, 3, 2),
+  /* 11   */ V(2, 13, 2),
+
+  /* 0100 1010 ... */
+  /* 00   */ V(13, 2, 2),	/* 268 */
+  /* 01   */ V(1, 13, 2),
+  /* 10   */ V(7, 11, 2),
+  /* 11   */ V(11, 7, 2),
+
+  /* 0100 1011 ... */
+  /* 00   */ V(13, 1, 2),	/* 272 */
+  /* 01   */ V(5, 12, 2),
+  /* 10   */ V(12, 5, 2),
+  /* 11   */ V(8, 10, 2),
+
+  /* 0100 1100 ... */
+  /* 00   */ V(10, 8, 2),	/* 276 */
+  /* 01   */ V(9, 9, 2),
+  /* 10   */ V(4, 12, 2),
+  /* 11   */ V(12, 4, 2),
+
+  /* 0100 1101 ... */
+  /* 000  */ V(6, 11, 2),	/* 280 */
+  /* 001  */ V(6, 11, 2),
+  /* 010  */ V(11, 6, 2),
+  /* 011  */ V(11, 6, 2),
+  /* 100  */ V(13, 0, 3),
+  /* 101  */ V(0, 12, 3),
+  /* 110  */ V(3, 12, 2),
+  /* 111  */ V(3, 12, 2),
+
+  /* 0100 1110 ... */
+  /* 00   */ V(12, 3, 2),	/* 288 */
+  /* 01   */ V(7, 10, 2),
+  /* 10   */ V(10, 7, 2),
+  /* 11   */ V(2, 12, 2),
+
+  /* 0100 1111 ... */
+  /* 00   */ V(12, 2, 2),	/* 292 */
+  /* 01   */ V(5, 11, 2),
+  /* 10   */ V(11, 5, 2),
+  /* 11   */ V(1, 12, 2),
+
+  /* 0101 0000 ... */
+  /* 00   */ V(8, 9, 2),	/* 296 */
+  /* 01   */ V(9, 8, 2),
+  /* 10   */ V(12, 1, 2),
+  /* 11   */ V(4, 11, 2),
+
+  /* 0101 0001 ... */
+  /* 000  */ V(12, 0, 3),	/* 300 */
+  /* 001  */ V(0, 11, 3),
+  /* 010  */ V(3, 11, 2),
+  /* 011  */ V(3, 11, 2),
+  /* 100  */ V(11, 0, 3),
+  /* 101  */ V(0, 10, 3),
+  /* 110  */ V(1, 10, 2),
+  /* 111  */ V(1, 10, 2),
+
+  /* 0101 0010 ... */
+  /* 00   */ V(11, 4, 1),	/* 308 */
+  /* 01   */ V(11, 4, 1),
+  /* 10   */ V(6, 10, 2),
+  /* 11   */ V(10, 6, 2),
+
+  /* 0101 0011 ... */
+  /* 000  */ V(7, 9, 2),	/* 312 */
+  /* 001  */ V(7, 9, 2),
+  /* 010  */ V(9, 7, 2),
+  /* 011  */ V(9, 7, 2),
+  /* 100  */ V(10, 0, 3),
+  /* 101  */ V(0, 9, 3),
+  /* 110  */ V(9, 0, 2),
+  /* 111  */ V(9, 0, 2),
+
+  /* 0101 0100 ... */
+  /* 0    */ V(11, 3, 1),	/* 320 */
+  /* 1    */ V(8, 8, 1),
+
+  /* 0101 0101 ... */
+  /* 00   */ V(2, 11, 2),	/* 322 */
+  /* 01   */ V(5, 10, 2),
+  /* 10   */ V(11, 2, 1),
+  /* 11   */ V(11, 2, 1),
+
+  /* 0101 0110 ... */
+  /* 00   */ V(10, 5, 2),	/* 326 */
+  /* 01   */ V(1, 11, 2),
+  /* 10   */ V(11, 1, 2),
+  /* 11   */ V(6, 9, 2),
+
+  /* 0101 0111 ... */
+  /* 0    */ V(9, 6, 1),	/* 330 */
+  /* 1    */ V(10, 4, 1),
+
+  /* 0101 1000 ... */
+  /* 00   */ V(4, 10, 2),	/* 332 */
+  /* 01   */ V(7, 8, 2),
+  /* 10   */ V(8, 7, 1),
+  /* 11   */ V(8, 7, 1),
+
+  /* 0101 1001 ... */
+  /* 0    */ V(3, 10, 1),	/* 336 */
+  /* 1    */ V(10, 3, 1),
+
+  /* 0101 1010 ... */
+  /* 0    */ V(5, 9, 1),	/* 338 */
+  /* 1    */ V(9, 5, 1),
+
+  /* 0101 1011 ... */
+  /* 0    */ V(2, 10, 1),	/* 340 */
+  /* 1    */ V(10, 2, 1),
+
+  /* 0101 1100 ... */
+  /* 0    */ V(10, 1, 1),	/* 342 */
+  /* 1    */ V(6, 8, 1),
+
+  /* 0101 1101 ... */
+  /* 0    */ V(8, 6, 1),	/* 344 */
+  /* 1    */ V(7, 7, 1),
+
+  /* 0101 1110 ... */
+  /* 0    */ V(4, 9, 1),	/* 346 */
+  /* 1    */ V(9, 4, 1),
+
+  /* 0101 1111 ... */
+  /* 0    */ V(3, 9, 1),	/* 348 */
+  /* 1    */ V(9, 3, 1),
+
+  /* 0110 0000 ... */
+  /* 0    */ V(5, 8, 1),	/* 350 */
+  /* 1    */ V(8, 5, 1),
+
+  /* 0110 0001 ... */
+  /* 0    */ V(2, 9, 1),	/* 352 */
+  /* 1    */ V(6, 7, 1),
+
+  /* 0110 0010 ... */
+  /* 0    */ V(7, 6, 1),	/* 354 */
+  /* 1    */ V(9, 2, 1),
+
+  /* 0110 0011 ... */
+  /* 0    */ V(1, 9, 1),	/* 356 */
+  /* 1    */ V(9, 1, 1),
+
+  /* 0110 0100 ... */
+  /* 0    */ V(4, 8, 1),	/* 358 */
+  /* 1    */ V(8, 4, 1),
+
+  /* 0110 0101 ... */
+  /* 0    */ V(5, 7, 1),	/* 360 */
+  /* 1    */ V(7, 5, 1),
+
+  /* 0110 0110 ... */
+  /* 0    */ V(3, 8, 1),	/* 362 */
+  /* 1    */ V(8, 3, 1),
+
+  /* 0110 0111 ... */
+  /* 0    */ V(6, 6, 1),	/* 364 */
+  /* 1    */ V(2, 8, 1),
+
+  /* 0110 1000 ... */
+  /* 0    */ V(8, 2, 1),	/* 366 */
+  /* 1    */ V(1, 8, 1),
+
+  /* 0110 1001 ... */
+  /* 0    */ V(4, 7, 1),	/* 368 */
+  /* 1    */ V(7, 4, 1),
+
+  /* 0110 1010 ... */
+  /* 00   */ V(8, 1, 1),	/* 370 */
+  /* 01   */ V(8, 1, 1),
+  /* 10   */ V(0, 8, 2),
+  /* 11   */ V(8, 0, 2),
+
+  /* 0110 1011 ... */
+  /* 0    */ V(5, 6, 1),	/* 374 */
+  /* 1    */ V(6, 5, 1),
+
+  /* 0110 1100 ... */
+  /* 00   */ V(1, 7, 1),	/* 376 */
+  /* 01   */ V(1, 7, 1),
+  /* 10   */ V(0, 7, 2),
+  /* 11   */ V(7, 0, 2),
+
+  /* 0110 1110 ... */
+  /* 0    */ V(3, 7, 1),	/* 380  */
+  /* 1    */ V(2, 7, 1),
+
+  /* 0111 1100 ... */
+  /* 0    */ V(0, 6, 1),	/* 382 */
+  /* 1    */ V(6, 0, 1),
+
+  /* 1000 0011 ... */
+  /* 0    */ V(0, 5, 1),	/* 384 */
+  /* 1    */ V(5, 0, 1)
+];
+
+/* hufftable constructor */
+Mad.Hufftable = function(table, linbits, startbits) {
+    this.table = table;
+    this.linbits = linbits;
+    this.startbits = startbits;
+};
+
+/* external tables */
+Mad.huff_quad_table = [ hufftabA, hufftabB ];
+
+Mad.huff_pair_table = [
+  /*  0 */ new Mad.Hufftable(hufftab0,   0, 0),
+  /*  1 */ new Mad.Hufftable(hufftab1,   0, 3),
+  /*  2 */ new Mad.Hufftable(hufftab2,   0, 3),
+  /*  3 */ new Mad.Hufftable(hufftab3,   0, 3),
+  /*  4 */ null, //new Mad.Hufftable(0 /* not used */),
+  /*  5 */ new Mad.Hufftable(hufftab5,   0, 3),
+  /*  6 */ new Mad.Hufftable(hufftab6,   0, 4),
+  /*  7 */ new Mad.Hufftable(hufftab7,   0, 4),
+  /*  8 */ new Mad.Hufftable(hufftab8,   0, 4),
+  /*  9 */ new Mad.Hufftable(hufftab9,   0, 4),
+  /* 10 */ new Mad.Hufftable(hufftab10,  0, 4),
+  /* 11 */ new Mad.Hufftable(hufftab11,  0, 4),
+  /* 12 */ new Mad.Hufftable(hufftab12,  0, 4),
+  /* 13 */ new Mad.Hufftable(hufftab13,  0, 4),
+  /* 14 */ null, //new Mad.Hufftable(0 /* not used */),
+  /* 15 */ new Mad.Hufftable(hufftab15,  0, 4),
+  /* 16 */ new Mad.Hufftable(hufftab16,  1, 4),
+  /* 17 */ new Mad.Hufftable(hufftab16,  2, 4),
+  /* 18 */ new Mad.Hufftable(hufftab16,  3, 4),
+  /* 19 */ new Mad.Hufftable(hufftab16,  4, 4),
+  /* 20 */ new Mad.Hufftable(hufftab16,  6, 4),
+  /* 21 */ new Mad.Hufftable(hufftab16,  8, 4),
+  /* 22 */ new Mad.Hufftable(hufftab16, 10, 4),
+  /* 23 */ new Mad.Hufftable(hufftab16, 13, 4),
+  /* 24 */ new Mad.Hufftable(hufftab24,  4, 4),
+  /* 25 */ new Mad.Hufftable(hufftab24,  5, 4),
+  /* 26 */ new Mad.Hufftable(hufftab24,  6, 4),
+  /* 27 */ new Mad.Hufftable(hufftab24,  7, 4),
+  /* 28 */ new Mad.Hufftable(hufftab24,  8, 4),
+  /* 29 */ new Mad.Hufftable(hufftab24,  9, 4),
+  /* 30 */ new Mad.Hufftable(hufftab24, 11, 4),
+  /* 31 */ new Mad.Hufftable(hufftab24, 13, 4)
+];
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/id3v22stream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/id3v22stream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/id3v22stream.js	(revision 28388)
@@ -0,0 +1,341 @@
+var trimString = function (string) {
+    return string.replace(/\0$/, "");
+};
+
+var stringToEncoding = function(string, encoding) {
+    switch (encoding) {
+        case 0:
+            return trimString(string);
+        case 1:
+            var ix = 2, offset1 = 1, offset2 = 0;
+
+            if (string.slice(0, 2) === "\xFE\xFF") {
+                offset1 = 0, offset2 = 1;
+            } else {
+                offset1 = 1, offset2 = 0;
+            }
+
+            var result = "";
+
+            for (var ix = 2; ix < string.length; ix += 2) {
+                var byte1 = string[ix + offset1].charCodeAt(0);
+                var byte2 = string[ix + offset2].charCodeAt(0);
+
+                var word1 = (byte1 << 8) | byte2;
+
+                if (byte1 < 0xD8 || byte1 >= 0xE0) {
+                    result += String.fromCharCode(word1);
+                } else {
+                    ix += 2;
+
+                    var byte3 = string[ix + offset1].charCodeAt(0);
+                    var byte4 = string[ix + offset2].charCodeAt(0);
+
+                    var word2 = (byte3 << 8) | byte4;
+
+                    result += String.fromCharCode(word1, word2);
+                }
+            }
+
+            return trimString(result);
+        default:
+            return string;
+    }
+}
+
+var decodeIdentifierFrame = function(header, stream) {
+    var data = stream.read(header['length']);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'owner': array[0],
+            'identifier': array[1]
+    };
+}
+
+var decodeTextFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var data = stream.read(header['length'] - 1);
+
+    return {
+        'header': header,
+            'value': stringToEncoding(data, encoding)
+    };
+}
+
+var decodeCommentFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var language = stream.read(3);
+
+    var data = stream.read(header['length'] - 4);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'language': stringToEncoding(language, 0),
+            'description': stringToEncoding(array[0], 0),
+            'value': stringToEncoding(array[1], encoding)
+    };
+}
+
+var extendWithValueFrame = function(tags, frame) {
+    tags[frame['name']] = frame['value'];
+
+    return tags;
+}
+
+
+var extendWithIdentifierFrame = function(tags, frame) {
+    tags[frame['name']] = {
+        'owner': frame['value'],
+        'identifier': frame['identifier']
+    };
+
+    return tags;
+}
+
+var extendWithCommentFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']][frame['description']] = {
+        'language': frame['language'],
+        'value': frame['value']
+    };
+
+    return tags;
+}
+
+Mad.ID3v22Stream = function(header, stream) {
+    this.offset = 0;
+
+    this.header = header;
+    this.stream = stream;
+
+    this.decoders = {
+        'UFI': decodeIdentifierFrame,
+        'TT1': decodeTextFrame,
+        'TT2': decodeTextFrame,
+        'TT3': decodeTextFrame,
+        'TP1': decodeTextFrame,
+        'TP2': decodeTextFrame,
+        'TP3': decodeTextFrame,
+        'TP4': decodeTextFrame,
+        'TCM': decodeTextFrame,
+        'TXT': decodeTextFrame,
+        'TLA': decodeTextFrame,
+        'TCO': decodeTextFrame,
+        'TAL': decodeTextFrame,
+        'TPA': decodeTextFrame,
+        'TRK': decodeTextFrame,
+        'TRC': decodeTextFrame,
+        'TYE': decodeTextFrame,
+        'TDA': decodeTextFrame,
+        'TIM': decodeTextFrame,
+        'TRD': decodeTextFrame,
+        'TMT': decodeTextFrame,
+        'TFT': decodeTextFrame,
+        'TBP': decodeTextFrame,
+        'TCR': decodeTextFrame,
+        'TPB': decodeTextFrame,
+        'TEN': decodeTextFrame,
+        'TSS': decodeTextFrame,
+        'TOF': decodeTextFrame,
+        'TLE': decodeTextFrame,
+        'TSI': decodeTextFrame,
+        'TDY': decodeTextFrame,
+        'TKE': decodeTextFrame,
+        'TOT': decodeTextFrame,
+        'TOA': decodeTextFrame,
+        'TOL': decodeTextFrame,
+        'TOR': decodeTextFrame,
+
+        'COM': decodeCommentFrame
+    };
+
+    this.names = {
+        /* Identification Frames */
+        'TT1': 'Content group description',
+        'TT2': 'Title/Songname/Content description',
+        'TT3': 'Subtitle/Description refinement',
+        'TAL': 'Album/Movie/Show title',
+        'TOT': 'Original album/movie/show title',
+        'TRK': 'Track number/Position in set',
+        'TPA': 'Part of a set',
+        'TRC': 'ISRC',
+
+        /* Involved Persons Frames */
+        'TP1': 'Lead artist/Lead performer/Soloist/Performing group',
+        'TP2': 'Band/Orchestra/Accompaniment',
+        'TP3': 'Conductor',
+        'TP4': 'Interpreted, remixed, or otherwise modified by',
+        'TOA': 'Original artist/performer',
+        'TXT': 'Lyricist/Text writer',
+        'TOL': 'Original lyricist/text writer',
+        'TCO': 'Composer',
+        'TEN': 'Encoded by',
+
+        /* Derived and Subjective Properties Frames */
+        'TBP': 'BPM',
+        'TLE': 'Length',
+        'TKE': 'Initial key',
+        'TLA': 'Language',
+        'TMT': 'Media type',
+
+        /* Rights and Licence Frames */
+        'TCR': 'Copyright message',
+        'TPB': 'Publisher',
+
+        /* Other Text Frames */
+        'TOF': 'Original filename',
+        'TDY': 'Playlist delay',
+        'TSS': 'Software/Hardware and settings used for encoding',
+        'TFT': 'File type',
+
+        /* Buffering */
+        'BUF': 'Recommended buffer size',
+
+        /* Attached Picture Frame */
+        'PIC': 'Attached picture',
+
+        /* Unique Identifier Frame */
+        'UFI': 'Unique identifier',
+
+        /* Music CD Identifier Frame */
+        'MCI': 'Music CD identifier',
+
+        /* Comment Frame */
+        'COM': 'Comment',
+
+        /* User Defined URL Link Frame */
+        'WXX': 'User defined URL link',
+
+        /* Deprecated ID3v2 frames */
+        'TDA': 'Date',
+        'TIM': 'Time',
+        'TOR': 'Original release year',
+        'TRD': 'Recording dates',
+        'TSI': 'Size',
+        'TYE': 'Year'
+    };
+
+    this.extenders = {
+        'UFI': extendWithIdentifierFrame,
+        'TT1': extendWithValueFrame,
+        'TT2': extendWithValueFrame,
+        'TT3': extendWithValueFrame,
+        'TP1': extendWithValueFrame,
+        'TP2': extendWithValueFrame,
+        'TP3': extendWithValueFrame,
+        'TP4': extendWithValueFrame,
+        'TCM': extendWithValueFrame,
+        'TXT': extendWithValueFrame,
+        'TLA': extendWithValueFrame,
+        'TCO': extendWithValueFrame,
+        'TAL': extendWithValueFrame,
+        'TPA': extendWithValueFrame,
+        'TRK': extendWithValueFrame,
+        'TRC': extendWithValueFrame,
+        'TYE': extendWithValueFrame,
+        'TDA': extendWithValueFrame,
+        'TIM': extendWithValueFrame,
+        'TRD': extendWithValueFrame,
+        'TMT': extendWithValueFrame,
+        'TFT': extendWithValueFrame,
+        'TBP': extendWithValueFrame,
+        'TCR': extendWithValueFrame,
+        'TPB': extendWithValueFrame,
+        'TEN': extendWithValueFrame,
+        'TSS': extendWithValueFrame,
+        'TOF': extendWithValueFrame,
+        'TLE': extendWithValueFrame,
+        'TSI': extendWithValueFrame,
+        'TDY': extendWithValueFrame,
+        'TKE': extendWithValueFrame,
+        'TOT': extendWithValueFrame,
+        'TOA': extendWithValueFrame,
+        'TOL': extendWithValueFrame,
+        'TOR': extendWithValueFrame,
+
+        'COM': extendWithCommentFrame
+    };
+}
+
+Mad.ID3v22Stream.prototype.readFrame = function() {
+    if (this.offset >= this.header.length) {
+        return null;
+    }
+
+    var identifier = this.stream.read(3);
+
+    if (identifier.charCodeAt(0) === 0) {
+        this.offset = this.header.length + 1;
+
+        return null;
+    }
+
+    var length = this.stream.readU24(true);
+
+    var header = {
+identifier: identifier,
+            length: length
+    };
+
+    if (this.decoders[identifier]) {
+        var result = this.decoders[identifier](header, this.stream);
+    } else {
+        var result = {
+identifier: identifier,
+            header: header
+        };
+
+        this.stream.read(length);
+    }
+
+    result.name = this.names[identifier] ? this.names[identifier] : 'UNKNOWN';
+
+    this.offset += 10 + length;
+
+    return result;
+}
+
+Mad.ID3v22Stream.prototype.read = function() {
+    if (!this.array) {
+        this.array = [];
+
+        var frame = null;
+
+        try {
+            while (frame = this.readFrame()) {
+                this.array.push(frame);
+            }
+        } catch (e) {
+            throw(e);
+            //console.log("ID3 Error: " + e);
+        }
+    }
+
+    return this.array;
+}
+
+Mad.ID3v22Stream.prototype.toHash = function() {
+    var frames = this.read();
+
+    var hash = {};
+
+    for (var i = 0; i < frames.length; i++) {
+        var frame = frames[i];
+
+        var extender = this.extenders[frame['header']['identifier']];
+
+        if (extender) {
+            hash = extender(hash, frames[i]);
+        }
+    }
+
+    return hash;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/id3v23stream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/id3v23stream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/id3v23stream.js	(revision 28388)
@@ -0,0 +1,579 @@
+var trimString = function (string) {
+    return string.replace(/\0$/, "");
+};
+
+var stringToEncoding = function(string, encoding) {
+    switch (encoding) {
+        case 0:
+            return trimString(string);
+        case 1:
+            var ix = 2, offset1 = 1, offset2 = 0;
+
+            if (string.slice(0, 2) === "\xFE\xFF") {
+                offset1 = 0, offset2 = 1;
+            } else {
+                offset1 = 1, offset2 = 0;
+            }
+
+            var result = "";
+
+            for (var ix = 2; ix < string.length; ix += 2) {
+                var byte1 = string[ix + offset1].charCodeAt(0);
+                var byte2 = string[ix + offset2].charCodeAt(0);
+
+                var word1 = (byte1 << 8) | byte2;
+
+                if (byte1 < 0xD8 || byte1 >= 0xE0) {
+                    result += String.fromCharCode(word1);
+                } else {
+                    ix += 2;
+
+                    var byte3 = string[ix + offset1].charCodeAt(0);
+                    var byte4 = string[ix + offset2].charCodeAt(0);
+
+                    var word2 = (byte3 << 8) | byte4;
+
+                    result += String.fromCharCode(word1, word2);
+                }
+            }
+
+            return trimString(result);
+        default:
+            return string;
+    }
+}
+
+var decodeTerminatedString = function(header, stream) {
+
+    // skip text encoding (nobody cares, always ISO-8559-15)
+    stream.readAsString(1);
+
+    var c;
+
+    var mimetype = "";
+    while(true) {
+        c = stream.readAsString(1);
+        if(c === "\0") {
+            break;
+        }
+        mimetype += c;
+    }
+    console.log("mimetype = " + mimetype);
+
+    var filename = "";
+    while(true) {
+        c = stream.readAsString(1);
+        if(c === "\0") {
+            break;
+        }
+        filename += c;
+    }
+    console.log("filename = " + filename);
+
+    var contentDescription = "";
+    while(true) {
+        c = stream.readAsString(1);
+        if(c === "\0") {
+            break;
+        }
+        contentDescription += c;
+    }
+    console.log("contentDescription = " + contentDescription);
+
+    var objectName = stream.readAsString(4);
+
+    // skip 4 bytes, then read binary length
+    stream.readAsString(4);
+    var length = stream.readU32(true) - 4;
+
+    if(length > header.length) return null;
+    var value = stream.readAsString(length);
+
+    return {
+        'header': header,
+            'mimetype': mimetype,
+            'filename': filename,
+            'contentDescription': contentDescription,
+            'objectName': objectName,
+            'value': value
+    };
+}
+
+var decodeTextFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var data = stream.readAsString(header['length'] - 1);
+
+    return {
+        'header': header,
+            'value': stringToEncoding(data, encoding)
+    };
+}
+
+var decodeAttachedPictureFrame = function(header, stream) {
+    var encoding = stream.readU8();
+
+    var data = stream.readAsString(header['length'] - 1);
+
+    var array = data.split("\0");
+
+    return {
+        'header': header,
+            'mime': stringToEncoding(array[0], 0),
+            'type': array[1].charCodeAt(0),
+            'description': array[1].slice(1, array[1].length - 1),
+            'value': array.slice(2, array.length - 2).join("\0")
+    };
+}
+
+var decodeIdentifierFrame = function(header, stream) {
+    var data = stream.readAsString(header['length']);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'owner': array[0],
+            'identifier': array[1]
+    };
+}
+
+
+var decodeCommentFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var language = stream.readAsString(3);
+
+    var data = stream.readAsString(header['length'] - 4);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'language': stringToEncoding(language, 0),
+            'description': stringToEncoding(array[0], 0),
+            'value': stringToEncoding(array[1], encoding)
+    };
+}
+
+var decodeBinaryFrame = function(header, stream) {
+    var data = stream.readAsString(header['length']);
+
+    return {
+        'header': header,
+            'value': data
+    };
+}
+
+var decodeUserDefinedLinkFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var data = stream.readAsString(header['length'] - 1);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'description': stringToEncoding(array[0], 0),
+            'value': stringToEncoding(array[1], encoding)
+    };
+}
+
+var extendWithValueFrame = function(tags, frame) {
+    tags[frame['name']] = frame['value'];
+
+    return tags;
+}
+
+var extendWithPictureFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']].push({
+            'mime': frame['mime'],
+            'type': frame['type'],
+            'description': frame['description'],
+            'value': frame['value']
+            });
+
+    return tags;
+}
+
+var extendWithIdentifierFrame = function(tags, frame) {
+    tags[frame['name']] = {
+        'owner': frame['value'],
+        'identifier': frame['identifier']
+    };
+
+    return tags;
+}
+
+var extendWithCommentFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']][frame['description']] = {
+        'language': frame['language'],
+        'value': frame['value']
+    };
+
+    return tags;
+}
+
+var extendWithUserDefinedLinkFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = {}
+    }
+
+    tags[frame['name']][frame['description']] = frame['value'];
+
+    return tags;
+}
+
+var extendWithPrivateFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']].push(frame['value']);
+
+    return tags;
+}
+
+Mad.ID3v23Stream = function(header, stream) {
+    this.offset = 0;
+
+    this.header = header;
+    this.stream = stream;
+
+    this.decoders = {
+        /* Identification Frames */
+        'TIT1': decodeTextFrame,
+        'TIT2': decodeTextFrame,
+        'TIT3': decodeTextFrame,
+        'TALB': decodeTextFrame,
+        'TOAL': decodeTextFrame,
+        'TRCK': decodeTextFrame,
+        'TPOS': decodeTextFrame,
+        'TSST': decodeTextFrame,
+        'TSRC': decodeTextFrame,
+
+        /* Involved Persons Frames */
+        'TPE1': decodeTextFrame,
+        'TPE2': decodeTextFrame,
+        'TPE3': decodeTextFrame,
+        'TPE4': decodeTextFrame,
+        'TOPE': decodeTextFrame,
+        'TEXT': decodeTextFrame,
+        'TOLY': decodeTextFrame,
+        'TCOM': decodeTextFrame,
+        'TMCL': decodeTextFrame,
+        'TIPL': decodeTextFrame,
+        'TENC': decodeTextFrame,
+
+        /* Derived and Subjective Properties Frames */
+        'TBPM': decodeTextFrame,
+        'TLEN': decodeTextFrame,
+        'TKEY': decodeTextFrame,
+        'TLAN': decodeTextFrame,
+        'TCON': decodeTextFrame,
+        'TFLT': decodeTextFrame,
+        'TMED': decodeTextFrame,
+        'TMOO': decodeTextFrame,
+
+        /* Rights and Licence Frames */
+        'TCOP': decodeTextFrame,
+        'TPRO': decodeTextFrame,
+        'TPUB': decodeTextFrame,
+        'TOWN': decodeTextFrame,
+        'TRSN': decodeTextFrame,
+        'TRSO': decodeTextFrame,
+
+        /* Other Text Frames */
+        'TOFN': decodeTextFrame,
+        'TDLY': decodeTextFrame,
+        'TDEN': decodeTextFrame,
+        'TDOR': decodeTextFrame,
+        'TDRC': decodeTextFrame,
+        'TDRL': decodeTextFrame,
+        'TDTG': decodeTextFrame,
+        'TSSE': decodeTextFrame,
+        'TSOA': decodeTextFrame,
+        'TSOP': decodeTextFrame,
+        'TSOT': decodeTextFrame,
+
+        /* Attached Picture Frame */
+        'APIC': decodeAttachedPictureFrame,
+
+        /* Unique Identifier Frame */
+        'UFID': decodeIdentifierFrame,
+
+        /* Music CD Identifier Frame */
+        'MCDI': decodeBinaryFrame,
+
+        /* Comment Frame */
+        'COMM': decodeCommentFrame,
+
+        /* User Defined URL Link Frame */
+        'WXXX': decodeUserDefinedLinkFrame,
+
+        /* Private Frame */
+        'PRIV': decodeBinaryFrame,
+
+        /* Deprecated ID3v2 Frames */
+        'TDAT': decodeTextFrame,
+        'TIME': decodeTextFrame,
+        'TORY': decodeTextFrame,
+        'TRDA': decodeTextFrame,
+        'TSIZ': decodeTextFrame,
+        'TYER': decodeTextFrame,
+
+        /* General encapsulated object */
+        'GEOB': decodeTerminatedString
+    };
+
+    this.names = {
+        /* Identification Frames */
+        'TIT1': 'Content group description',
+        'TIT2': 'Title/Songname/Content description',
+        'TIT3': 'Subtitle/Description refinement',
+        'TALB': 'Album/Movie/Show title',
+        'TOAL': 'Original album/movie/show title',
+        'TRCK': 'Track number/Position in set',
+        'TPOS': 'Part of a set',
+        'TSST': 'Set subtitle',
+        'TSRC': 'ISRC',
+
+        /* Involved Persons Frames */
+        'TPE1': 'Lead artist/Lead performer/Soloist/Performing group',
+        'TPE2': 'Band/Orchestra/Accompaniment',
+        'TPE3': 'Conductor',
+        'TPE4': 'Interpreted, remixed, or otherwise modified by',
+        'TOPE': 'Original artist/performer',
+        'TEXT': 'Lyricist/Text writer',
+        'TOLY': 'Original lyricist/text writer',
+        'TCOM': 'Composer',
+        'TMCL': 'Musician credits list',
+        'TIPL': 'Involved people list',
+        'TENC': 'Encoded by',
+
+        /* Derived and Subjective Properties Frames */
+        'TBPM': 'BPM',
+        'TLEN': 'Length',
+        'TKEY': 'Initial key',
+        'TLAN': 'Language',
+        'TCON': 'Content type',
+        'TFLT': 'File type',
+        'TMED': 'Media type',
+        'TMOO': 'Mood',
+
+        /* Rights and Licence Frames */
+        'TCOP': 'Copyright message',
+        'TPRO': 'Produced notice',
+        'TPUB': 'Publisher',
+        'TOWN': 'File owner/licensee',
+        'TRSN': 'Internet radio station name',
+        'TRSO': 'Internet radio station owner',
+
+        /* Other Text Frames */
+        'TOFN': 'Original filename',
+        'TDLY': 'Playlist delay',
+        'TDEN': 'Encoding time',
+        'TDOR': 'Original release time',
+        'TDRC': 'Recording time',
+        'TDRL': 'Release time',
+        'TDTG': 'Tagging time',
+        'TSSE': 'Software/Hardware and settings used for encoding',
+        'TSOA': 'Album sort order',
+        'TSOP': 'Performer sort order',
+        'TSOT': 'Title sort order',
+
+        /* Attached Picture Frame */
+        'APIC': 'Attached picture',
+
+        /* Unique Identifier Frame */
+        'UFID': 'Unique identifier',
+
+        /* Music CD Identifier Frame */
+        'MCDI': 'Music CD identifier',
+
+        /* Comment Frame */
+        'COMM': 'Comment',
+
+        /* User Defined URL Link Frame */
+        'WXXX': 'User defined URL link',
+
+        /* Private Frame */
+        'PRIV': 'Private',
+
+        /* Deprecated ID3v2 frames */
+        'TDAT': 'Date',
+        'TIME': 'Time',
+        'TORY': 'Original release year',
+        'TRDA': 'Recording dates',
+        'TSIZ': 'Size',
+        'TYER': 'Year'
+    };
+
+    this.extenders = {
+        /* Identification Frames */
+        'TIT1': extendWithValueFrame,
+        'TIT2': extendWithValueFrame,
+        'TIT3': extendWithValueFrame,
+        'TALB': extendWithValueFrame,
+        'TOAL': extendWithValueFrame,
+        'TRCK': extendWithValueFrame,
+        'TPOS': extendWithValueFrame,
+        'TSST': extendWithValueFrame,
+        'TSRC': extendWithValueFrame,
+
+        /* Involved Persons Frames */
+        'TPE1': extendWithValueFrame,
+        'TPE2': extendWithValueFrame,
+        'TPE3': extendWithValueFrame,
+        'TPE4': extendWithValueFrame,
+        'TOPE': extendWithValueFrame,
+        'TEXT': extendWithValueFrame,
+        'TOLY': extendWithValueFrame,
+        'TCOM': extendWithValueFrame,
+        'TMCL': extendWithValueFrame,
+        'TIPL': extendWithValueFrame,
+        'TENC': extendWithValueFrame,
+
+        /* Derived and Subjective Properties Frames */
+        'TBPM': extendWithValueFrame,
+        'TLEN': extendWithValueFrame,
+        'TKEY': extendWithValueFrame,
+        'TLAN': extendWithValueFrame,
+        'TCON': extendWithValueFrame,
+        'TFLT': extendWithValueFrame,
+        'TMED': extendWithValueFrame,
+        'TMOO': extendWithValueFrame,
+
+        /* Rights and Licence Frames */
+        'TCOP': extendWithValueFrame,
+        'TPRO': extendWithValueFrame,
+        'TPUB': extendWithValueFrame,
+        'TOWN': extendWithValueFrame,
+        'TRSN': extendWithValueFrame,
+        'TRSO': extendWithValueFrame,
+
+        /* Other Text Frames */
+        'TOFN': extendWithValueFrame,
+        'TDLY': extendWithValueFrame,
+        'TDEN': extendWithValueFrame,
+        'TDOR': extendWithValueFrame,
+        'TDRC': extendWithValueFrame,
+        'TDRL': extendWithValueFrame,
+        'TDTG': extendWithValueFrame,
+        'TSSE': extendWithValueFrame,
+        'TSOA': extendWithValueFrame,
+        'TSOP': extendWithValueFrame,
+        'TSOT': extendWithValueFrame,
+
+        /* Attached Picture Frame */
+        'APIC': extendWithPictureFrame,
+
+        /* Unique Identifier Frame */
+        'UFID': extendWithIdentifierFrame,
+
+        /* Music CD Identifier */
+        'MCDI': extendWithValueFrame,
+
+        /* Comment Frame */
+        'COMM': extendWithCommentFrame,
+
+        /* User Defined URL Link Frame */
+        'WXXX': extendWithUserDefinedLinkFrame,
+
+        /* Private Frame */
+        'PRIV': extendWithPrivateFrame,
+
+        /* Deprecated ID3v2 Frames */
+        'TDAT': extendWithValueFrame,
+        'TIME': extendWithValueFrame,
+        'TORY': extendWithValueFrame,
+        'TRDA': extendWithValueFrame,
+        'TSIZ': extendWithValueFrame,
+        'TYER': extendWithValueFrame
+    };
+}
+
+Mad.ID3v23Stream.prototype.readFrame = function() {
+    if (this.offset >= this.header.length) {
+        return null;
+    }
+
+    var identifier = this.stream.readAsString(4);
+
+    if (identifier.charCodeAt(0) === 0) {
+        this.offset = this.header.length + 1;
+        return null;
+    }
+
+    var length = this.stream.readU32(true);
+    var flags = this.stream.readU16(true);
+
+    var header = {
+        'identifier': identifier,
+        'length': length,
+        'flags': flags
+    };
+
+    var result = null;
+
+    if (this.decoders[identifier]) {
+        result = this.decoders[identifier](header, this.stream);
+    } else {
+        result = {
+            'identifier': identifier,
+            'header': header
+        };
+
+        this.stream.readAsString(Math.min(length, this.header.length - this.offset));
+    }
+
+    if(result) {
+        result['name'] = this.names[identifier] ? this.names[identifier] : 'UNKNOWN';
+    }
+
+    this.offset += 10 + length;
+
+    return result;
+}
+
+Mad.ID3v23Stream.prototype.read = function() {
+    if (!this.array) {
+        this.array = [];
+
+        var frame = null;
+
+        //try {
+        while (frame = this.readFrame()) {
+            this.array.push(frame);
+        }
+        //} catch (e) {
+        //throw(e);
+        //console.log("ID3 Error: " + e);
+        //}
+    }
+
+    return this.array;
+}
+
+Mad.ID3v23Stream.prototype.toHash = function() {
+    var frames = this.read();
+
+    var hash = {};
+
+    for (var i = 0; i < frames.length; i++) {
+        var frame = frames[i];
+
+        var extender = this.extenders[frame['header']['identifier']];
+
+        if (extender) {
+            hash = extender(hash, frames[i]);
+        }
+    }
+
+    return hash;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/imdct_s.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/imdct_s.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/imdct_s.js	(revision 28388)
@@ -0,0 +1,43 @@
+Mad.imdct_s = [
+  /*  0 */  [ 0.608761429,
+              -0.923879533,
+              -0.130526192,
+               0.991444861,
+              -0.382683432,
+              -0.793353340 ],
+
+  /*  6 */  [ -0.793353340,
+               0.382683432,
+               0.991444861,
+               0.130526192,
+              -0.923879533,
+              -0.608761429 ],
+
+  /*  1 */  [  0.382683432,
+              -0.923879533,
+               0.923879533,
+              -0.382683432,
+              -0.382683432,
+               0.923879533 ],
+
+  /*  7 */  [ -0.923879533,
+              -0.382683432,
+               0.382683432,
+               0.923879533,
+               0.923879533,
+               0.382683432 ],
+
+  /*  2 */  [  0.130526192,
+              -0.382683432,
+               0.608761429,
+              -0.793353340,
+               0.923879533,
+              -0.991444861 ],
+
+  /*  8 */  [ -0.991444861,
+              -0.923879533,
+              -0.793353340,
+              -0.608761429,
+              -0.382683432,
+              -0.130526192 ]
+]
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/layer3.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/layer3.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/layer3.js	(revision 28388)
@@ -0,0 +1,1791 @@
+
+/*
+ * MPEG-1 scalefactor band widths
+ * derived from Table B.8 of ISO/IEC 11172-3
+ */
+var sfb_48000_long = [
+    4,  4,  4,  4,  4,  4,  6,  6,  6,   8,  10,
+    12, 16, 18, 22, 28, 34, 40, 46, 54,  54, 192
+];
+
+var sfb_44100_long = [
+    4,  4,  4,  4,  4,  4,  6,  6,  8,   8,  10,
+    12, 16, 20, 24, 28, 34, 42, 50, 54,  76, 158
+];
+
+var sfb_32000_long = [
+    4,  4,  4,  4,  4,  4,  6,  6,  8,  10,  12,
+    16, 20, 24, 30, 38, 46, 56, 68, 84, 102,  26
+];
+
+var sfb_48000_short = [
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+    6,  6,  6,  6,  6, 10, 10, 10, 12, 12, 12, 14, 14,
+    14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
+];
+
+var sfb_44100_short = [
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+    6,  6,  8,  8,  8, 10, 10, 10, 12, 12, 12, 14, 14,
+    14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
+];
+
+var sfb_32000_short = [
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+    6,  6,  8,  8,  8, 12, 12, 12, 16, 16, 16, 20, 20,
+    20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
+];
+
+var sfb_48000_mixed = [
+    /* long */   4,  4,  4,  4,  4,  4,  6,  6,
+    /* short */  4,  4,  4,  6,  6,  6,  6,  6,  6, 10,
+    10, 10, 12, 12, 12, 14, 14, 14, 16, 16,
+    16, 20, 20, 20, 26, 26, 26, 66, 66, 66
+];
+
+var sfb_44100_mixed = [
+    /* long */   4,  4,  4,  4,  4,  4,  6,  6,
+    /* short */  4,  4,  4,  6,  6,  6,  8,  8,  8, 10,
+    10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
+    18, 22, 22, 22, 30, 30, 30, 56, 56, 56
+];
+
+var sfb_32000_mixed = [
+    /* long */   4,  4,  4,  4,  4,  4,  6,  6,
+    /* short */  4,  4,  4,  6,  6,  6,  8,  8,  8, 12,
+    12, 12, 16, 16, 16, 20, 20, 20, 26, 26,
+    26, 34, 34, 34, 42, 42, 42, 12, 12, 12
+];
+
+var sfbwidth_table = [
+    { l: sfb_48000_long, s: sfb_48000_short, m: sfb_48000_mixed },
+    { l: sfb_44100_long, s: sfb_44100_short, m: sfb_44100_mixed },
+    { l: sfb_32000_long, s: sfb_32000_short, m: sfb_32000_mixed } /*, // fuck MPEG 2.5
+    { l: sfb_24000_long, s: sfb_24000_short, m: sfb_24000_mixed },
+    { l: sfb_22050_long, s: sfb_22050_short, m: sfb_22050_mixed },
+    { l: sfb_16000_long, s: sfb_16000_short, m: sfb_16000_mixed },
+    { l: sfb_12000_long, s: sfb_12000_short, m: sfb_12000_mixed },
+    { l: sfb_11025_long, s: sfb_11025_short, m: sfb_11025_mixed },
+    { l:  sfb_8000_long, s:  sfb_8000_short, m:  sfb_8000_mixed }*/
+];
+
+var pretab /* [22] */ = [
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
+];
+
+/*
+ * fractional powers of two
+ * used for requantization and joint stereo decoding
+ *
+ * root_table[3 + x] = 2^(x/4)
+ */
+var root_table /* 7 */ = [
+    /* 2^(-3/4) */ 0.59460355750136,
+    /* 2^(-2/4) */ 0.70710678118655,
+    /* 2^(-1/4) */ 0.84089641525371,
+    /* 2^( 0/4) */ 1.00000000000000,
+    /* 2^(+1/4) */ 1.18920711500272,
+    /* 2^(+2/4) */ 1.41421356237310,
+    /* 2^(+3/4) */ 1.68179283050743
+];
+
+var cs = [
+        +0.857492926 , +0.881741997,
+        +0.949628649 , +0.983314592,
+        +0.995517816 , +0.999160558,
+        +0.999899195 , +0.999993155
+];
+
+var ca = [
+        -0.514495755, -0.471731969,
+        -0.313377454, -0.181913200,
+        -0.094574193, -0.040965583,
+        -0.014198569, -0.003699975
+];
+
+
+Mad.count1table_select = 0x01;
+Mad.scalefac_scale     = 0x02;
+Mad.preflag            = 0x04;
+Mad.mixed_block_flag   = 0x08;
+
+Mad.I_STEREO  = 0x1;
+Mad.MS_STEREO = 0x2;
+
+/*
+ * windowing coefficients for long blocks
+ * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
+ *
+ * window_l[i] = sin((PI / 36) * (i + 1/2))
+ */
+var window_l /* [36] */ = [
+    0.043619387, 0.130526192,
+    0.216439614, 0.300705800,
+    0.382683432, 0.461748613,
+    0.537299608, 0.608761429,
+    0.675590208, 0.737277337,
+    0.793353340, 0.843391446,
+
+    0.887010833, 0.923879533,
+    0.953716951, 0.976296007,
+    0.991444861, 0.999048222,
+    0.999048222, 0.991444861,
+    0.976296007, 0.953716951,
+    0.923879533, 0.887010833,
+
+    0.843391446, 0.793353340,
+    0.737277337, 0.675590208,
+    0.608761429, 0.537299608,
+    0.461748613, 0.382683432,
+    0.300705800, 0.216439614,
+    0.130526192, 0.043619387
+];
+
+/*
+ * windowing coefficients for short blocks
+ * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
+ *
+ * window_s[i] = sin((PI / 12) * (i + 1/2))
+ */
+var window_s /* [12] */ = [
+    0.130526192, 0.382683432,
+    0.608761429, 0.793353340,
+    0.923879533, 0.991444861,
+    0.991444861, 0.923879533,
+    0.793353340, 0.608761429,
+    0.382683432, 0.130526192
+];
+
+/*
+ * coefficients for intensity stereo processing
+ * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3
+ *
+ * is_ratio[i] = tan(i * (PI / 12))
+ * is_table[i] = is_ratio[i] / (1 + is_ratio[i])
+ */
+var is_table /* [7] */ = [
+    0.000000000,
+    0.211324865,
+    0.366025404,
+    0.500000000,
+    0.633974596,
+    0.788675135,
+    1.000000000
+];
+
+/*
+ * coefficients for LSF intensity stereo processing
+ * derived from section 2.4.3.2 of ISO/IEC 13818-3
+ *
+ * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1)
+ * is_lsf_table[1][i] = (1 /      sqrt(2)) ^(i + 1)
+ */
+var is_lsf_table /* [2][15] */ = [
+    [
+        0.840896415,
+        0.707106781,
+        0.594603558,
+        0.500000000,
+        0.420448208,
+        0.353553391,
+        0.297301779,
+        0.250000000,
+        0.210224104,
+        0.176776695,
+        0.148650889,
+        0.125000000,
+        0.105112052,
+        0.088388348,
+        0.074325445
+    ], [
+        0.707106781,
+        0.500000000,
+        0.353553391,
+        0.250000000,
+        0.176776695,
+        0.125000000,
+        0.088388348,
+        0.062500000,
+        0.044194174,
+        0.031250000,
+        0.022097087,
+        0.015625000,
+        0.011048543,
+        0.007812500,
+        0.005524272
+    ]
+];
+
+Mad.SideInfo = function() {
+    this.gr = []; // array of Mad.Granule
+    this.scfsi = []; // array of ints
+};
+
+/*
+ * scalefactor bit lengths
+ * derived from section 2.4.2.7 of ISO/IEC 11172-3
+ */
+var sflen_table = [
+    { slen1: 0, slen2: 0 }, { slen1: 0, slen2: 1 }, { slen1: 0, slen2: 2 }, { slen1: 0, slen2: 3 },
+    { slen1: 3, slen2: 0 }, { slen1: 1, slen2: 1 }, { slen1: 1, slen2: 2 }, { slen1: 1, slen2: 3 },
+    { slen1: 2, slen2: 1 }, { slen1: 2, slen2: 2 }, { slen1: 2, slen2: 3 }, { slen1: 3, slen2: 1 },
+    { slen1: 3, slen2: 2 }, { slen1: 3, slen2: 3 }, { slen1: 4, slen2: 2 }, { slen1: 4, slen2: 3 }    
+];
+
+Mad.Granule = function() {
+    this.ch = []; // list of Mad.Channel 
+}
+
+Mad.Channel = function() {
+    this.table_select = []; // list of Numbers (I guess)
+    this.scalefac = []; // list of integers
+    this.subblock_gain = [];
+}
+
+
+/* we must take care that sz >= bits and sz < sizeof(long) lest bits === 0 */
+Mad.MASK = function (cache, sz, bits) {
+    // return Mad.bitwiseAnd(Mad.rshift(cache, sz - bits), Mad.lshift(1, bits) - 1);
+    return (((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1));
+}
+
+Mad.MASK1BIT = function (cache, sz) {
+    // return Mad.bitwiseAnd(cache, Mad.lshift(1, sz - 1));
+    return ((cache) & (1 << ((sz) - 1)));
+}
+
+var mad_III_huffdecode_exponents = new Int32Array(4 * 39);
+
+/*
+ * NAME:    III_huffdecode()
+ * DESCRIPTION: decode Huffman code words of one channel of one granule
+ */
+Mad.III_huffdecode = function(ptr, xr /* Float64Array(576) */, channel, sfbwidth, part2_length) {
+    var exponents = mad_III_huffdecode_exponents;
+    var expptr = 0;
+    var bits_left, cachesz;
+    var xrptr;
+    var sfbound;
+    var bitcache;
+    var sfbwidthptr = 0;
+    
+    bits_left = channel.part2_3_length - part2_length;
+    
+    if (bits_left < 0)
+        return Mad.Error.BADPART3LEN;
+
+    Mad.III_exponents(channel, sfbwidth, exponents);
+
+    var peek = ptr.clone();
+    ptr.skip(bits_left);
+    
+    /* align bit reads to byte boundaries */
+    cachesz  = peek.left;
+    cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;
+    
+    bitcache   = peek.read(cachesz);
+    //console.log("bitcache peek.read = " + bitcache);
+    bits_left -= cachesz;
+
+    xrptr = 0;
+
+    /* big_values */
+    {
+        var region = 0, rcount;
+        
+        // var reqcache = new Float64Array(new ArrayBuffer(8 * 16));
+        var reqcache = [];
+
+        sfbound = xrptr + sfbwidth[sfbwidthptr++];
+        rcount  = channel.region0_count + 1;
+
+        var entry = Mad.huff_pair_table[channel.table_select[region]];
+        var table     = entry.table;
+        var linbits   = entry.linbits;
+        var startbits = entry.startbits;
+
+        if (typeof(table) === 'undefined')
+            return Mad.Error.BADHUFFTABLE;
+
+        expptr = 0;
+        exp     = exponents[expptr++];
+        var reqhits = 0;
+        var big_values = channel.big_values;
+
+        while (big_values-- && cachesz + bits_left > 0) {
+            var pair;
+            var clumpsz, value;
+            var requantized;
+
+            //console.log("big_values = " + big_values + ", cachesz = " + cachesz + ", bits_left = " + bits_left);
+
+            if (xrptr === sfbound) {
+                sfbound += sfbwidth[sfbwidthptr++];
+
+                /* change table if region boundary */
+                if (--rcount === 0) {
+                    if (region === 0)
+                        rcount = channel.region1_count + 1;
+                    else
+                        rcount = 0;  /* all remaining */
+
+                    entry     = Mad.huff_pair_table[channel.table_select[++region]];
+                    table     = entry.table;
+                    linbits   = entry.linbits;
+                    startbits = entry.startbits;
+
+                    if (typeof(table) === 'undefined')
+                        return Mad.Error.BADHUFFTABLE;
+                }
+
+                if (exp != exponents[expptr]) {
+                    exp = exponents[expptr];
+                    reqhits = 0;
+                }
+
+                ++expptr;
+            }
+            
+
+            if (cachesz < 21) {
+                var bits       = ((32 - 1 - 21) + (21 - cachesz)) & ~7;
+                bitcache   = (bitcache << bits) | peek.read(bits);
+                cachesz   += bits;
+                bits_left -= bits;
+            }
+
+            /* hcod (0..19) */
+            clumpsz = startbits;
+            //console.log('getting pair, bitcache = ' + bitcache + ", cachesz = " + cachesz + ", clumpsz = " + clumpsz);
+            pair    = table[ (((bitcache) >> ((cachesz) - (clumpsz))) & ((1 << (clumpsz)) - 1))];
+            
+            while (!pair.final) {
+                //console.log('pair ' + JSON.stringify(pair) + ' is not final, cachesz = ' + cachesz + ' being subtracted clumpsz ' + clumpsz);
+                cachesz -= clumpsz;
+
+                clumpsz = pair.ptr.bits;
+                pair    = table[pair.ptr.offset +  (((bitcache) >> ((cachesz) - (clumpsz))) & ((1 << (clumpsz)) - 1))];
+            }
+
+            cachesz -= pair.value.hlen;
+
+            if (linbits) {
+                /* x (0..14) */
+                value = pair.value.x;
+                var x_final = false;
+
+                switch (value) {
+                case 0:
+                    xr[xrptr] = 0;
+                    break;
+
+                case 15:
+                    if (cachesz < linbits + 2) {
+                        bitcache   = (bitcache << 16) | peek.read(16);
+                        cachesz   += 16;
+                        bits_left -= 16;
+                    }
+
+                    value +=  (((bitcache) >> ((cachesz) - (linbits))) & ((1 << (linbits)) - 1));
+                    cachesz -= linbits;
+
+                    requantized = Mad.III_requantize(value, exp);
+                    x_final = true; // simulating goto, yay
+                    break;
+
+                default:
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        requantized = reqcache[value] = Mad.III_requantize(value, exp);
+                    }
+                    x_final = true;
+                }
+                
+                if(x_final) {
+                    xr[xrptr] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+
+                /* y (0..14) */
+                value = pair.value.y;
+                var y_final = false;
+
+                switch (value) {
+                case 0:
+                    xr[xrptr + 1] = 0;
+                    break;
+
+                case 15:
+                    if (cachesz < linbits + 1) {
+                        bitcache   = (bitcache << 16) | peek.read(16);
+                        cachesz   += 16;
+                        bits_left -= 16;
+                    }
+
+                    value +=  (((bitcache) >> ((cachesz) - (linbits))) & ((1 << (linbits)) - 1));
+                    cachesz -= linbits;
+
+                    requantized = Mad.III_requantize(value, exp);
+                    y_final = true;
+                    break; // simulating goto, yayzor
+
+                default:
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        reqcache[value] = Mad.III_requantize(value, exp);
+                        requantized = reqcache[value];
+                    }
+                    y_final = true;
+                }
+                
+                if(y_final) {
+                    xr[xrptr + 1] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+            } else {
+                /* x (0..1) */
+                value = pair.value.x;
+
+                if (value === 0) {
+                    xr[xrptr] = 0;
+                } else {
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        requantized = reqcache[value] = Mad.III_requantize(value, exp);
+                    }
+
+                    xr[xrptr] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+
+                /* y (0..1) */
+                value = pair.value.y;
+
+                if (value === 0)
+                    xr[xrptr + 1] = 0;
+                else {
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        requantized = reqcache[value] = Mad.III_requantize(value, exp);
+                    }
+
+                    xr[xrptr + 1] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+            }
+
+            xrptr += 2;
+            //console.log("big_values = " + big_values + ", cachesz = " + cachesz + ", bits_left = " + bits_left + ", xrptr = " + xrptr);
+        }
+    }
+
+    //console.log("bits_left (before big_values overrun) = " + bits_left + ", cachesz = " + cachesz);
+
+    if (cachesz + bits_left < 0)
+        return Mad.Error.BADHUFFDATA;  /* big_values overrun */
+
+    /* count1 */
+    {
+        var table = Mad.huff_quad_table[channel.flags & Mad.count1table_select];
+        var requantized = Mad.III_requantize(1, exp);
+
+        while (cachesz + bits_left > 0 && xrptr <= 572) {
+            /* hcod (1..6) */
+            if (cachesz < 10) {
+                bitcache   = (bitcache << 16) | peek.read(16);
+                cachesz   += 16;
+                bits_left -= 16;
+            }
+            
+            var quad = table[ (((bitcache) >> ((cachesz) - (4))) & ((1 << (4)) - 1))];
+
+            /* quad tables guaranteed to have at most one extra lookup */
+            if (!quad['final']) {
+                cachesz -= 4;
+
+                quad = table[quad.ptr.offset +
+                              (((bitcache) >> ((cachesz) - (quad.ptr.bits))) & ((1 << (quad.ptr.bits)) - 1))];
+            }
+
+            cachesz -= quad.value.hlen;
+
+            if (xrptr === sfbound) {
+                sfbound += sfbwidth[sfbwidthptr++];
+
+                if (exp != exponents[expptr]) {
+                    exp = exponents[expptr];
+                    requantized = Mad.III_requantize(1, exp);
+                }
+
+                ++expptr;
+            }
+
+            /* v (0..1) */
+            xr[xrptr] = quad.value.v ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            /* w (0..1) */
+            xr[xrptr + 1] = quad.value.w ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            xrptr += 2;
+
+            if (xrptr === sfbound) {
+                sfbound += sfbwidth[sfbwidthptr++];
+
+                if (exp != exponents[expptr]) {
+                    exp = exponents[expptr];
+                    requantized = Mad.III_requantize(1, exp);
+                }
+
+                ++expptr;
+            }
+
+            /* x (0..1) */
+            xr[xrptr] = quad.value.x ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            /* y (0..1) */
+            xr[xrptr + 1] = quad.value.y ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            xrptr += 2;
+        }
+
+        if (cachesz + bits_left < 0) {
+            //# if 0 && defined(DEBUG)
+            //console.log("huffman count1 overrun (" + (-(cachesz + bits_left)) + " bits)");
+            //# endif
+
+            /* technically the bitstream is misformatted, but apparently
+               some encoders are just a bit sloppy with stuffing bits */
+            xrptr -= 4;
+        }
+    }
+
+    if (!(-bits_left <= Mad.BUFFER_GUARD * CHAR_BIT)) {
+        throw new Error("assertion failed: (-bits_left <= Mad.BUFFER_GUARD * CHAR_BIT)");
+    }
+
+    /*
+      # if 0 && defined(DEBUG)
+      if (bits_left < 0)
+      console.log("read " + (-bits_left) + " bits too many");
+      else if (cachesz + bits_left > 0)
+      console.log((cachesz + bits_left) + " stuffing bits");
+      else
+      console.log("bits_left " + bits_left);
+      # endif
+    */
+
+    /* rzero */
+    while (xrptr < 576) {
+        xr[xrptr]     = 0;
+        xr[xrptr + 1] = 0;
+
+        xrptr += 2;
+    }
+
+    return Mad.Error.NONE;
+}
+
+/*
+ * NAME:    III_sideinfo()
+ * DESCRIPTION: decode frame side information from a bitstream
+ * 
+ * Since several values are passed by reference to this function, instead
+ * we're just returning a hash containing:
+ * {
+ *   ptr (Mad.Bit)
+ *   sideinfo (Mad.Sideinfo) 
+ *   data_bitlen (Number)
+ *   priv_bitlen (Number)
+ * }
+ */
+Mad.III_sideinfo = function (ptr, nch, lsf) {
+    
+    var si = new Mad.SideInfo();
+    var result = Mad.Error.NONE;
+
+    var data_bitlen = 0;
+    var priv_bitlen = lsf ? ((nch === 1) ? 1 : 2) : ((nch === 1) ? 5 : 3);
+    
+    si.main_data_begin = ptr.read(lsf ? 8 : 9);
+    si.private_bits    = ptr.read(priv_bitlen);
+
+    var ngr = 1;
+    if (!lsf) {
+        ngr = 2;
+
+        for (var ch = 0; ch < nch; ++ch)
+            si.scfsi[ch] = ptr.read(4);
+    }
+
+    for (var gr = 0; gr < ngr; ++gr) {
+        var granule = new Mad.Granule();
+        si.gr[gr] = granule;
+        
+        for (var ch = 0; ch < nch; ++ch) {
+            var channel = new Mad.Channel();
+            granule.ch[ch] = channel;
+            
+            channel.part2_3_length    = ptr.read(12);
+            channel.big_values        = ptr.read(9);
+            channel.global_gain       = ptr.read(8);
+            channel.scalefac_compress = ptr.read(lsf ? 9 : 4);
+
+            data_bitlen += channel.part2_3_length;
+
+            if (channel.big_values > 288 && result === 0)
+                result = Mad.Error.BADBIGVALUES;
+
+            channel.flags = 0;
+
+            /* window_switching_flag */
+            if (ptr.read(1)) {
+                channel.block_type = ptr.read(2);
+
+                if (channel.block_type === 0 && result === 0)
+                    result = Mad.Error.BADBLOCKTYPE;
+
+                if (!lsf && channel.block_type === 2 && si.scfsi[ch] && result === 0)
+                    result = Mad.Error.BADSCFSI;
+
+                channel.region0_count = 7;
+                channel.region1_count = 36;
+
+                if (ptr.read(1))
+                    channel.flags |= Mad.mixed_block_flag;
+                else if (channel.block_type === 2)
+                    channel.region0_count = 8;
+
+                for (var i = 0; i < 2; ++i)
+                    channel.table_select[i] = ptr.read(5);
+
+                for (var i = 0; i < 3; ++i)
+                    channel.subblock_gain[i] = ptr.read(3);
+            } else {
+                channel.block_type = 0;
+
+                for (var i = 0; i < 3; ++i)
+                    channel.table_select[i] = ptr.read(5);
+
+                channel.region0_count = ptr.read(4);
+                channel.region1_count = ptr.read(3);
+            }
+
+            /* [preflag,] scalefac_scale, count1table_select */
+            channel.flags |= ptr.read(lsf ? 2 : 3);
+        }
+    }
+
+    return {
+        ptr: ptr,
+        si: si,
+        data_bitlen: data_bitlen,
+        priv_bitlen: priv_bitlen
+    };
+}
+
+/*
+ * NAME:    III_scalefactors()
+ * DESCRIPTION: decode channel scalefactors of one granule from a bitstream
+ */
+Mad.III_scalefactors = function (ptr, channel, gr0ch, scfsi) {
+    var start; /* Mad.Bit */
+    var slen1, slen2, sfbi;
+
+    var start = ptr.clone();
+
+    var slen1 = sflen_table[channel.scalefac_compress].slen1;
+    var slen2 = sflen_table[channel.scalefac_compress].slen2;
+
+    if (channel.block_type === 2) {
+        sfbi = 0;
+
+        var nsfb = (channel.flags & Mad.mixed_block_flag) ? 8 + 3 * 3 : 6 * 3;
+        while (nsfb--)
+            channel.scalefac[sfbi++] = ptr.read(slen1);
+
+        nsfb = 6 * 3;
+        while (nsfb--)
+            channel.scalefac[sfbi++] = ptr.read(slen2);
+
+        nsfb = 1 * 3;
+        while (nsfb--)
+            channel.scalefac[sfbi++] = 0;
+    }
+    else {  /* channel.block_type != 2 */
+        if (scfsi & 0x8) {
+            for (var sfbi = 0; sfbi < 6; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 0; sfbi < 6; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen1);
+        }
+
+        if (scfsi & 0x4) {
+            for (var sfbi = 6; sfbi < 11; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 6; sfbi < 11; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen1);
+        }
+
+        if (scfsi & 0x2) {
+            for (var sfbi = 11; sfbi < 16; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 11; sfbi < 16; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen2);
+        }
+
+        if (scfsi & 0x1) {
+            for (var sfbi = 16; sfbi < 21; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 16; sfbi < 21; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen2);
+        }
+
+        channel.scalefac[21] = 0;
+    }
+
+    return start.length(ptr);
+}
+
+var c0 = 2 * Math.cos( 1 * Math.PI / 18);
+var c1 = 2 * Math.cos( 3 * Math.PI / 18);
+var c2 = 2 * Math.cos( 4 * Math.PI / 18);
+var c3 = 2 * Math.cos( 5 * Math.PI / 18);
+var c4 = 2 * Math.cos( 7 * Math.PI / 18);
+var c5 = 2 * Math.cos( 8 * Math.PI / 18);
+var c6 = 2 * Math.cos(16 * Math.PI / 18);
+
+var fastsdct = function (x /* [9] */, y /* [18] */, offset) {
+    var a0,  a1,  a2,  a3,  a4,  a5,  a6,  a7,  a8,  a9,  a10, a11, a12;
+    var a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25;
+    var m0,  m1,  m2,  m3,  m4,  m5,  m6,  m7;
+
+    a0 = x[3] + x[5];
+    a1 = x[3] - x[5];
+    a2 = x[6] + x[2];
+    a3 = x[6] - x[2];
+    a4 = x[1] + x[7];
+    a5 = x[1] - x[7];
+    a6 = x[8] + x[0];
+    a7 = x[8] - x[0];
+
+    a8  = a0  + a2;
+    a9  = a0  - a2;
+    a10 = a0  - a6;
+    a11 = a2  - a6;
+    a12 = a8  + a6;
+    a13 = a1  - a3;
+    a14 = a13 + a7;
+    a15 = a3  + a7;
+    a16 = a1  - a7;
+    a17 = a1  + a3;
+
+    m0 = a17 * -c3;
+    m1 = a16 * -c0;
+    m2 = a15 * -c4;
+    m3 = a14 * -c1;
+    m4 = a5  * -c1;
+    m5 = a11 * -c6;
+    m6 = a10 * -c5;
+    m7 = a9  * -c2;
+
+    a18 =     x[4] + a4;
+    a19 = 2 * x[4] - a4;
+    a20 = a19 + m5;
+    a21 = a19 - m5;
+    a22 = a19 + m6;
+    a23 = m4  + m2;
+    a24 = m4  - m2;
+    a25 = m4  + m1;
+
+    /* output to every other slot for convenience */
+    y[offset +  0] = a18 + a12;
+    y[offset +  2] = m0  - a25;
+    y[offset +  4] = m7  - a20;
+    y[offset +  6] = m3;
+    y[offset +  8] = a21 - m6;
+    y[offset + 10] = a24 - m1;
+    y[offset + 12] = a12 - 2 * a18;
+    y[offset + 14] = a23 + m0;
+    y[offset + 16] = a22 + m7;
+}
+
+/* sdctII_scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */
+var sdctII_scale = [];
+for(var i = 0; i < 9; ++i) {
+    sdctII_scale[i] = 2 * Math.cos(Math.PI * (2 * i + 1) / (2 * 18));
+}
+
+
+sdctII = function (x /* [18] */, X /* [18] */) {
+    /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */
+
+    // var tmp = new Float64Array(new ArrayBuffer(8 * 9));
+
+    var tmp = [];
+
+    /* even input butterfly */
+
+    for (var i = 0; i < 9; ++i) {
+        tmp[i] = x[i] + x[18 - i - 1];
+    }
+
+    fastsdct(tmp, X, 0);
+
+    /* odd input butterfly and scaling */
+
+    for (var i = 0; i < 9; ++i) {
+        tmp[i] = (x[i] - x[18 - i - 1]) * sdctII_scale[i];
+    }
+
+    fastsdct(tmp, X, 1);
+
+    /* output accumulation */
+    
+    for (var i = 3; i < 18; i += 2) {
+        X[i] -= X[i - 2];
+    }
+}
+
+/* dctIV_scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */  
+var dctIV_scale = [];
+for(i = 0; i < 18; i++) {
+    dctIV_scale[i] = 2 * Math.cos(Math.PI * (2 * i + 1) / (4 * 18));
+}
+
+var dctIV = function (y /* [18] */, X /* [18] */) {
+    // var tmp = new Float64Array(new ArrayBuffer(8 * 18));
+    var tmp = [];
+
+    /* scaling */
+
+    for (var i = 0; i < 18; ++i) {
+        tmp[i] = y[i] * dctIV_scale[i];
+    }
+
+    /* SDCT-II */
+
+    sdctII(tmp, X);
+
+    /* scale reduction and output accumulation */
+
+    X[0] /= 2;
+    for (var i = 1; i < 18; ++i) {
+        X[i] = X[i] / 2 - X[i - 1];
+    }
+}
+
+/*
+ * NAME:    imdct36
+ * DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm
+ */
+var imdct36 = function (x /* [18] */, y /* [36] */) {
+    // var tmp = new Float64Array(new ArrayBuffer(8 * 18));
+    var tmp = [];
+
+    /* DCT-IV */
+    dctIV(x, tmp);
+
+    /* convert 18-point DCT-IV to 36-point IMDCT */
+
+    for (var i =  0; i <  9; ++i) {
+        y[i] =  tmp[9 + i];
+    }
+    for (var i =  9; i < 27; ++i) {
+        y[i] = -tmp[36 - (9 + i) - 1];
+    }
+    for (var i = 27; i < 36; ++i) {
+        y[i] = -tmp[i - 27];
+    }
+}
+
+/*
+ * NAME:    III_imdct_s()
+ * DESCRIPTION: perform IMDCT and windowing for short blocks
+ */
+Mad.III_imdct_s = function (X /* [18] */, z /* [36] */)
+{
+    var yptr = 0;
+    var wptr;
+    var Xptr = 0;
+    
+    // var imdct_s_y = new Float64Array(new ArrayBuffer(8 * 36));
+    var y = [];
+    var hi, lo;
+
+    /* IMDCT */
+    for (var w = 0; w < 3; ++w) {
+        var s = Mad.imdct_s;
+        var sptr = 0;
+
+        for (var i = 0; i < 3; ++i) {
+            lo =  X[Xptr + 0] * s[sptr][0] +
+                X[Xptr + 1] * s[sptr][1] +
+                X[Xptr + 2] * s[sptr][2] +
+                X[Xptr + 3] * s[sptr][3] +
+                X[Xptr + 4] * s[sptr][4] +
+                X[Xptr + 5] * s[sptr][5];
+
+
+            y[yptr + i + 0] = lo;
+            y[yptr + 5 - i] = -y[yptr + i + 0];
+
+            ++sptr;
+
+            lo =  X[Xptr + 0] * s[sptr][0] +
+                X[Xptr + 1] * s[sptr][1] +
+                X[Xptr + 2] * s[sptr][2] +
+                X[Xptr + 3] * s[sptr][3] +
+                X[Xptr + 4] * s[sptr][4] +
+                X[Xptr + 5] * s[sptr][5];
+
+            y[yptr +  i + 6] = lo;
+            y[yptr + 11 - i] = y[yptr + i + 6];
+
+            ++sptr;
+        }
+
+        yptr += 12;
+        Xptr += 6;
+    }
+
+    /* windowing, overlapping and concatenation */
+
+    yptr = 0;
+    var wptr = 0;
+
+    for (var i = 0; i < 6; ++i) {
+        z[i +  0] = 0;
+        z[i +  6] = y[yptr +  0 + 0] * window_s[wptr + 0];
+
+        lo = y[yptr +  0 + 6] * window_s[wptr + 6] +
+            y[yptr + 12 + 0] * window_s[wptr + 0];
+
+        z[i + 12] = lo;
+
+        lo = y[yptr + 12 + 6] * window_s[wptr + 6] +
+            y[yptr + 24 + 0] * window_s[wptr + 0];
+
+        z[i + 18] = lo;
+
+        z[i + 24] = y[yptr + 24 + 6] * window_s[wptr + 6];
+        z[i + 30] = 0;
+
+        ++yptr;
+        ++wptr;
+    }
+}
+
+/*
+ * NAME:    III_imdct_l()
+ * DESCRIPTION: perform IMDCT and windowing for long blocks
+ */
+Mad.III_imdct_l = function (X /* 18 */, z /* 36 */, block_type) {
+    /* IMDCT */
+    imdct36(X, z);
+
+    /* windowing */
+
+    switch (block_type) {
+    case 0:  /* normal window */
+        for (var i = 0; i < 36; ++i) z[i] = z[i] * window_l[i];
+        break;
+
+    case 1:  /* start block */
+        for (var i =  0; i < 18; ++i) z[i] = z[i] * window_l[i];
+        /*  (var i = 18; i < 24; ++i) z[i] unchanged */
+        for (var i = 24; i < 30; ++i) z[i] = z[i] * window_s[i - 18];
+        for (var i = 30; i < 36; ++i) z[i] = 0;
+        break;
+
+    case 3:  /* stop block */
+        for (var i =  0; i <  6; ++i) z[i] = 0;
+        for (var i =  6; i < 12; ++i) z[i] = z[i] * window_s[i - 6];
+        /*  (var i = 12; i < 18; ++i) z[i] unchanged */
+        for (var i = 18; i < 36; ++i) z[i] = z[i] * window_l[i];
+        break;
+    }
+}
+
+
+/*
+ * NAME:    III_freqinver()
+ * DESCRIPTION: perform subband frequency inversion for odd sample lines
+ */
+Mad.III_freqinver = function (sample /* [18][32] */, sb)
+{
+    for (var i = 1; i < 18; i += 2)
+        sample[i][sb] = -sample[i][sb];
+}
+
+/*
+ * NAME:    III_decode()
+ * DESCRIPTION: decode frame main_data
+ * 
+ * result struct:
+ */
+Mad.III_decode = function (ptr, frame, si, nch) {
+    var header = frame.header;
+    var sfreqi;
+    
+    {
+        var sfreq = header.samplerate;
+
+        if (header.flags & Mad.Flag.MPEG_2_5_EXT)
+            sfreq *= 2;
+
+        /* 48000 => 0, 44100 => 1, 32000 => 2,
+           24000 => 3, 22050 => 4, 16000 => 5 */
+        sfreqi = ((sfreq >>  7) & 0x000f) +
+            ((sfreq >> 15) & 0x0001) - 8;
+
+        if (header.flags & Mad.Flag.MPEG_2_5_EXT)
+            sfreqi += 3;
+    }
+    
+    /* scalefactors, Huffman decoding, requantization */
+    var ngr = (header.flags & Mad.Flag.LSF_EXT) ? 1 : 2;
+    
+    for (var gr = 0; gr < ngr; ++gr) {
+        var granule = si.gr[gr];
+        var sfbwidth = [];
+        /* unsigned char const *sfbwidth[2]; */
+        var l = 0;
+        // var xr = [ new Float64Array(new ArrayBuffer(8 * 576)), new Float64Array(new ArrayBuffer(8 * 576)) ];
+        var xr = [[], []];
+        var error;
+
+        for (var ch = 0; ch < nch; ++ch) {
+            var channel = granule.ch[ch];
+            var part2_length;
+
+            sfbwidth[ch] = sfbwidth_table[sfreqi].l;
+
+            if (channel.block_type === 2) {
+                sfbwidth[ch] = (channel.flags & Mad.mixed_block_flag) ?
+                    sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s;
+            }
+
+            if (header.flags & Mad.Flag.LSF_EXT) {
+                part2_length = Mad.III_scalefactors_lsf(ptr, channel,
+                                                        ch === 0 ? 0 : si.gr[1].ch[1], header.mode_extension);
+            } else {
+                part2_length = Mad.III_scalefactors(ptr, channel, si.gr[0].ch[ch],
+                                                    gr === 0 ? 0 : si.scfsi[ch]);
+            }
+
+            error = Mad.III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length);
+            
+            if (error)
+                return error;
+        }
+
+        if (Mad.debug) {
+            Mad.debug.huffdecode.write(Mad.debug.iteration + "\t");
+
+            for (var i = 0; i < 576; i++) {
+                Mad.debug.huffdecode.write(xr[0][i].toFixed(8) + "\t");
+            }
+            Mad.debug.huffdecode.write("\n");
+        }
+
+        /* joint stereo processing */
+        if ((header.mode === Mad.Mode.JOINT_STEREO) && (header.mode_extension != 0)) {
+            error = Mad.III_stereo(xr, granule, header, sfbwidth[0]);
+            
+            if (error)
+                return error;
+        }
+
+        /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */
+        for (var ch = 0; ch < nch; ++ch) {
+            var channel = granule.ch[ch];
+            var sample = frame.sbsample[ch].slice(18 * gr);
+            
+            var sb, l = 0, i, sblimit;
+            // var output = new Float64Array(new ArrayBuffer(8 * 36));
+            var output = [];
+
+            if (channel.block_type === 2) {
+                Mad.III_reorder(xr[ch], channel, sfbwidth[ch]);
+
+                /*
+                 * According to ISO/IEC 11172-3, "Alias reduction is not applied for
+                 * granules with block_type === 2 (short block)." However, other
+                 * sources suggest alias reduction should indeed be performed on the
+                 * lower two subbands of mixed blocks. Most other implementations do
+                 * this, so by default we will too.
+                 */
+                if (channel.flags & Mad.mixed_block_flag)
+                    Mad.III_aliasreduce(xr[ch], 36);
+            } else {
+                Mad.III_aliasreduce(xr[ch], 576);
+            }
+
+            /* subbands 0-1 */
+            if (channel.block_type != 2 || (channel.flags & Mad.mixed_block_flag)) {
+                var block_type = channel.block_type;
+                if (channel.flags & Mad.mixed_block_flag)
+                    block_type = 0;
+
+                /* long blocks */
+                for (var sb = 0; sb < 2; ++sb, l += 18) {
+                    Mad.III_imdct_l(xr[ch].slice(l, l + 18), output, block_type);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+
+                    // var sys = require('sys');
+                    // sys.print("\nblocktype: " + block_type + " sb: " + sb + "\n");
+                    // for (var i = 0; i < 18; i++) {
+                    //     sys.print(output[i].toFixed(8) + "\t");
+                    //     if (i % 8 === 7) sys.print("\n");
+                    // }
+
+                }
+            } else {
+                /* short blocks */
+                for (var sb = 0; sb < 2; ++sb, l += 18) {
+                    Mad.III_imdct_s(xr[ch].slice(l, l + 18), output);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+                }
+            }
+
+            Mad.III_freqinver(sample, 1);
+
+            /* (nonzero) subbands 2-31 */
+            i = 576;
+            while (i > 36 && xr[ch][i - 1] === 0)
+                --i;
+
+            sblimit = 32 - (((576 - i) / 18) << 0);
+
+            if (channel.block_type != 2) {
+                /* long blocks */
+                for (var sb = 2; sb < sblimit; ++sb, l += 18) {
+                    Mad.III_imdct_l(xr[ch].slice(l, l + 18), output, channel.block_type);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+
+                    if (sb & 1)
+                        Mad.III_freqinver(sample, sb);
+                }
+            } else {
+                /* short blocks */
+                for (var sb = 2; sb < sblimit; ++sb, l += 18) {
+                    Mad.III_imdct_s(xr[ch].slice(l, l + 18), output);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+
+                    if (sb & 1)
+                        Mad.III_freqinver(sample, sb);
+                }
+            }
+
+            // remaining (zero) subbands
+            for (var sb = sblimit; sb < 32; ++sb) {
+                Mad.III_overlap_z(frame.overlap[ch][sb], sample, sb);
+
+                if (sb & 1)
+                    Mad.III_freqinver(sample, sb);
+            }
+
+            if (Mad.debug) {
+                for (var i = 0; i < 18; i++) {
+                    Mad.debug.sample.write(Mad.debug.iteration * 18 + i + "\t");
+                    for (var j = 0; j < 32; j++) {
+                        Mad.debug.sample.write(sample[i][j].toFixed(8) + "\t");
+                    }
+                    Mad.debug.sample.write("\n");
+                }
+                Mad.debug.iteration += 1;
+            }       
+        }
+    }
+
+    return Mad.Error.NONE;
+}
+
+
+/*
+ * NAME:    layer.III()
+ * DESCRIPTION: decode a single Layer III frame
+ */
+Mad.layer_III = function (stream, frame) {
+    var header = frame.header;
+    var nch, next_md_begin = 0;
+    var si_len, data_bitlen, md_len = 0;
+    var frame_space, frame_used, frame_free;
+    var /* Mad.Error */ error;
+    var ptr;
+    var result = 0;
+
+    /* allocate Layer III dynamic structures */
+    nch = header.nchannels();
+    si_len = (header.flags & Mad.Flag.LSF_EXT) ?
+        (nch === 1 ? 9 : 17) : (nch === 1 ? 17 : 32);
+
+    /* check frame sanity */
+    if (stream.next_frame - stream.ptr.nextbyte() < si_len) {
+        stream.error = Mad.Error.BADFRAMELEN;
+        stream.md_len = 0;
+        return -1;
+    }
+
+    /* check CRC word */
+    if (header.flags & Mad.Flag.PROTECTION) {
+        header.crc_check = mad_bit_crc(stream.ptr, si_len * CHAR_BIT, header.crc_check);
+
+        if (header.crc_check != header.crc_target &&
+            !(frame.options & Mad.Option.IGNORECRC)) {
+            stream.error = Mad.Error.BADCRC;
+            result = -1;
+        }
+    }
+
+    /* decode frame side information */
+    var sideinfoResult = Mad.III_sideinfo(stream.ptr, nch, header.flags & Mad.Flag.LSF_EXT);
+    
+    stream.ptr = sideinfoResult.ptr;
+    var si = sideinfoResult.si;
+    var data_bitlen = sideinfoResult.data_bitlen;
+    var priv_bitlen = sideinfoResult.priv_bitlen;
+    
+    //console.log("We're at " + stream.ptr.offset + ", data_bitlen = " + data_bitlen + ", priv_bitlen = " + priv_bitlen);
+    
+    if (error && result === 0) {
+        stream.error = error;
+        result = -1;
+    }
+
+    header.flags        |= priv_bitlen;
+    header.private_bits |= si.private_bits;
+
+    /* find main_data of next frame */
+    {
+        var peek = new Mad.Bit(stream.stream, stream.next_frame);
+
+        header = peek.read(32);
+        
+        if (Mad.bitwiseAnd(header, 0xffe60000) /* syncword | layer */ === 0xffe20000) { 
+            if (!(Mad.bitwiseAnd(header, 0x00010000)))  /* protection_bit */
+                peek.skip(16);  /* crc_check */
+
+            next_md_begin = peek.read(Mad.bitwiseAnd(header, 0x00080000) /* ID */ ? 9 : 8);
+        }
+    }
+
+    /* find main_data of this frame */
+    frame_space = stream.next_frame - stream.ptr.nextbyte();
+
+    //console.log("next_frame = " + stream.next_frame + ", nextbyte = " + stream.ptr.nextbyte() + ", frame_space = " + frame_space);
+
+    //console.log("before, next_md_begin = " + next_md_begin);
+
+    if (next_md_begin > si.main_data_begin + frame_space)
+        next_md_begin = 0;
+
+    //console.log("so far, md_len = " + md_len + ", si.main_data_begin = " + si.main_data_begin + ", frame_space = " + frame_space + ", next_md_begin = " + next_md_begin);
+    
+    md_len = si.main_data_begin + frame_space - next_md_begin;
+
+    frame_used = 0;
+    
+    if (si.main_data_begin === 0) {
+        ptr = stream.ptr;
+        stream.md_len = 0;
+
+        frame_used = md_len;
+    } else {
+        //console.log("si.main_data_begin = " + si.main_data_begin + ", stream.md_len = " + stream.md_len);
+        if (si.main_data_begin > stream.md_len) {
+            if (result === 0) {
+                stream.error = Mad.Error.BADDATAPTR;
+                result = -1;
+            }
+        } else {
+            var old_md_len = stream.md_len;
+            
+            if (md_len > si.main_data_begin) {
+                if(!(stream.md_len + md_len - si.main_data_begin <= Mad.BUFFER_MDLEN)) {
+                    throw new Error("Assertion failed: (stream.md_len + md_len - si.main_data_begin <= MAD_BUFFER_MDLEN)");
+                }
+                
+                frame_used = md_len - si.main_data_begin;
+                
+                /* memcpy(dst, dstOffset, src, srcOffset, length) - returns a copy of dst with modified bytes */
+                //console.log("mem copy 1");
+                stream.main_data = Mad.Storage.memcpy(stream.main_data, stream.md_len, stream.ptr.stream, stream.ptr.nextbyte(), frame_used);
+
+                /*
+                // Keeping this here as a handy little reference
+                memcpy(*stream.main_data + stream.md_len,
+                mad_bit_nextbyte(&stream.ptr),
+                frame_used = md_len - si.main_data_begin
+                );
+                */
+                stream.md_len += frame_used;
+            }
+           
+            ptr = new Mad.Bit(stream.main_data, old_md_len - si.main_data_begin);
+
+            //console.log("main_data length = " + stream.main_data.length + ", old_md_len = " + old_md_len + ", main_data_begin = " + si.main_data_begin + " new ptr = ");
+            //console.log(ptr);
+        }
+    }
+
+    frame_free = frame_space - frame_used;
+
+    /* decode main_data */
+    if (result === 0) {
+        error = Mad.III_decode(ptr, frame, si, nch);
+        
+        if (error) {
+            stream.error = error;
+            result = -1;
+        }
+        
+        /* designate ancillary bits */
+        stream.anc_ptr    = ptr;
+        stream.anc_bitlen = md_len * CHAR_BIT - data_bitlen;
+    }
+    
+    // DEBUG
+    /*
+      console.log(
+      "main_data_begin:" + si.main_data_begin +
+      ", md_len:" + md_len +
+      ", frame_free:" + frame_free +
+      ", data_bitlen:" + data_bitlen +
+      ", anc_bitlen: " + stream.anc_bitlen);
+    */
+
+    /* preload main_data buffer with up to 511 bytes for next frame(s) */
+    if (frame_free >= next_md_begin) {
+        //console.log("mem copy 2");
+        stream.main_data = Mad.Storage.memcpy(stream.main_data, 0, stream.stream, stream.next_frame - next_md_begin, next_md_begin);
+        /*
+        // Keeping here for reference
+        memcpy(*stream.main_data, stream.next_frame - next_md_begin, next_md_begin);
+        */
+        stream.md_len = next_md_begin;
+    } else {
+        if (md_len < si.main_data_begin) {
+            var extra = si.main_data_begin - md_len;
+            if (extra + frame_free > next_md_begin)
+                extra = next_md_begin - frame_free;
+
+            if (extra < stream.md_len) {
+                //console.log("mem copy 3");
+                stream.main_data = Mad.Storage.memcpy(stream.main_data, 0, stream.main_data, stream.md_len - extra, extra);
+                /*
+                // Keeping here for reference
+                memmove(*stream.main_data, *stream.main_data + stream.md_len - extra, extra);
+                */
+                stream.md_len = extra;
+            }
+        } else {
+            stream.md_len = 0;
+        }
+
+        //console.log("mem copy 4");
+        stream.main_data = Mad.Storage.memcpy(stream.main_data, stream.md_len, stream.stream, stream.next_frame - frame_free, frame_free);
+        /*
+        // Keeping here for reference
+        memcpy(*stream.main_data + stream.md_len, stream.next_frame - frame_free, frame_free);
+        */
+        stream.md_len += frame_free;
+    }
+
+    return result;
+}
+
+Mad.III_exponents = function(channel, sfbwidth, exponents) {
+    var gain = channel.global_gain - 210;
+    var scalefac_multiplier = (channel.flags & Mad.scalefac_scale) ? 2 : 1;
+    
+    if (channel.block_type === 2) {
+        var sfbi = 0, l = 0;
+        
+        if (channel.flags & Mad.mixed_block_flag) {
+            var premask = (channel.flags & Mad.preflag) ? ~0 : 0;
+            
+            /* long block subbands 0-1 */
+            
+            while (l < 36) {
+                exponents[sfbi] = gain - ((channel.scalefac[sfbi] + (pretab[sfbi] & premask)) << scalefac_multiplier);
+                
+                l += sfbwidth[sfbi++]
+            }
+        }
+        
+        /* this is probably wrong for 8000 Hz short/mixed blocks */
+        
+        var gain0 = gain - 8 * channel.subblock_gain[0];
+        var gain1 = gain - 8 * channel.subblock_gain[1];
+        var gain2 = gain - 8 * channel.subblock_gain[2];
+        
+        while (l < 576) {
+            exponents[sfbi + 0] = gain0 - (channel.scalefac[sfbi + 0] << scalefac_multiplier);
+            exponents[sfbi + 1] = gain1 - (channel.scalefac[sfbi + 1] << scalefac_multiplier);
+            exponents[sfbi + 2] = gain2 - (channel.scalefac[sfbi + 2] << scalefac_multiplier);
+            
+            l    += 3 * sfbwidth[sfbi];
+            sfbi += 3;
+        }
+    } else { /* channel.block_type != 2 */
+        if (channel.flags & Mad.preflag) {
+            for (var sfbi = 0; sfbi < 22; ++sfbi) {
+                exponents[sfbi] = gain - ((channel.scalefac[sfbi] + pretab[sfbi]) << scalefac_multiplier);
+            }
+        } else {
+            for (var sfbi = 0; sfbi < 22; ++sfbi) {
+                exponents[sfbi] = gain - (channel.scalefac[sfbi] << scalefac_multiplier);
+            }
+        }
+    }
+}
+
+Mad.III_requantize = function(value, exp) {
+    // usual (x >> 0) tricks to make sure frac and exp stay integers
+    var frac = (exp % 4) >> 0;  /* assumes sign(frac) === sign(exp) */
+    exp = (exp / 4) >> 0;
+
+    var requantized = Math.pow(value, 4.0 / 3.0);
+    requantized *= Math.pow(2.0, (exp / 4.0));
+    
+    if(frac) {
+        requantized *= Math.pow(2.0, (frac / 4.0));
+    }
+    
+    if(exp < 0) {
+        requantized /= Math.pow(2.0, -exp * (3.0 / 4.0));
+    }
+
+    return requantized;
+}
+
+Mad.III_aliasreduce = function(xr, lines) {
+    var xrPointer = 0;
+    
+    for (xrPointer += 18; xrPointer < lines; xrPointer += 18) {
+        for (var i = 0; i < 8; ++i) {
+            var a = xr[xrPointer - i - 1];
+            var b = xr[xrPointer + i];
+
+            var lo =  a * cs[i] - b * ca[i];
+
+            xr[xrPointer - i - 1] = lo;
+
+            lo =  b * cs[i] + a * ca[i];
+
+            xr[xrPointer + i] = lo
+        }
+    }
+}
+
+Mad.III_overlap = function (output /* [36] */, overlap /* [18] */, sample /* [18][32] */, sb) {
+    for (var i = 0; i < 18; ++i) {
+        sample[i][sb] = output[i +  0] + overlap[i];
+        overlap[i]    = output[i + 18];
+    }
+}
+
+Mad.III_overlap_z = function (overlap /* [18] */, sample /* [18][32] */, sb) {
+    for (var i = 0; i < 18; ++i) {
+        sample[i][sb] = overlap[i];
+        overlap[i]    = 0;
+    }
+}
+
+// allocating typed arrays once and for all, outside the function
+// var reorder_tmp = new Float64Array(new ArrayBuffer(8 * 32 * 3 * 6));
+// var reorder_sbw = new Float64Array(new ArrayBuffer(8 * 3));
+// var reorder_sw  = new Float64Array(new ArrayBuffer(8 * 3));
+
+Mad.III_reorder = function (xr /* [576] */, channel, sfbwidth /* [39] */) {
+    var sfbwidthPointer = 0;
+    var tmp = [];
+
+    for (var i = 0; i < 32; i++) {
+        tmp[i] = [];
+        for (var j = 0; j < 3; j++) {
+            tmp[i][j] = [];
+            for (var k = 0; k < 6; k++) {
+                tmp[i][j][k] = 0;
+            }
+        }
+    }
+
+    var sbw = [];
+    var sw  = [];
+    
+    /* this is probably wrong for 8000 Hz mixed blocks */
+
+    var sb = 0;
+    if (channel.flags & Mad.mixed_block_flag) {
+        var sb = 2;
+
+        var l = 0;
+        while (l < 36)
+            l += sfbwidth[sfbwidthPointer++];
+    }
+
+    for (var w = 0; w < 3; ++w) {
+        sbw[w] = sb;
+        sw[w]  = 0;
+    }
+
+    f = sfbwidth[sfbwidthPointer++];
+    w = 0;
+
+    for (var l = 18 * sb; l < 576; ++l) {
+        if (f-- === 0) {
+            f = sfbwidth[sfbwidthPointer++] - 1;
+            w = (w + 1) % 3;
+        }
+        
+        tmp[sbw[w]][w][sw[w]++] = xr[l];
+
+        if (sw[w] === 6) {
+            sw[w] = 0;
+            ++sbw[w];
+        }
+    }
+
+    var tmp2 = [];
+    var ptr = 0;
+
+    for (var i = 0; i < 32; i++) {
+        for (var j = 0; j < 3; j++) {
+            for (var k = 0; k < 6; k++) {
+                tmp2[ptr++] = tmp[i][j][k];
+            }
+        }
+    }
+    
+    var len = (576 - 18 * sb);
+
+    for (var i = 0; i < len; i++) {
+        xr[18 * sb + i] = tmp2[sb + i];
+    }
+}
+
+Mad.III_stereo = function(xr /* [2][576] */, granule, header, sfbwidth) {
+    var modes = [];
+    var sfbi, l, n, i;
+
+    if (granule.ch[0].block_type !=
+        granule.ch[1].block_type ||
+        (granule.ch[0].flags & Mad.mixed_block_flag) !=
+        (granule.ch[1].flags & Mad.mixed_block_flag))
+        return Mad.Error.BADSTEREO;
+
+    for (i = 0; i < 39; ++i)
+        modes[i] = header.mode_extension;
+
+    /* intensity stereo */
+
+    if (header.mode_extension & Mad.I_STEREO) {
+        var right_ch = granule.ch[1];
+        var right_xr = xr[1];
+        var is_pos;
+
+        header.flags |= Mad.Flag.I_STEREO;
+
+        /* first determine which scalefactor bands are to be processed */
+
+        if (right_ch.block_type === 2) {
+            var lower, start, max, bound = [], w;
+
+            lower = start = max = bound[0] = bound[1] = bound[2] = 0;
+
+            sfbi = l = 0;
+
+            if (right_ch.flags & Mad.mixed_block_flag) {
+                while (l < 36) {
+                    n = sfbwidth[sfbi++];
+
+                    for (i = 0; i < n; ++i) {
+                        if (right_xr[i]) {
+                            lower = sfbi;
+                            break;
+                        }
+                    }
+
+                    right_xr += n;
+                    l += n;
+                }
+
+                start = sfbi;
+            }
+
+            w = 0;
+            while (l < 576) {
+                n = sfbwidth[sfbi++];
+
+                for (i = 0; i < n; ++i) {
+                    if (right_xr[i]) {
+                        max = bound[w] = sfbi;
+                        break;
+                    }
+                }
+
+                right_xr += n;
+                l += n;
+                w = (w + 1) % 3;
+            }
+
+            if (max)
+                lower = start;
+
+            /* long blocks */
+
+            for (i = 0; i < lower; ++i)
+                modes[i] = header.mode_extension & ~Mad.I_STEREO;
+
+            /* short blocks */
+
+            w = 0;
+            for (i = start; i < max; ++i) {
+                if (i < bound[w])
+                    modes[i] = header.mode_extension & ~Mad.I_STEREO;
+
+                w = (w + 1) % 3;
+            }
+        }
+        else {  /* right_ch.block_type != 2 */
+            var bound;
+
+            bound = 0;
+            for (sfbi = l = 0; l < 576; l += n) {
+                n = sfbwidth[sfbi++];
+
+                for (i = 0; i < n; ++i) {
+                    if (right_xr[i]) {
+                        bound = sfbi;
+                        break;
+                    }
+                }
+
+                right_xr += n;
+            }
+
+            for (i = 0; i < bound; ++i)
+                modes[i] = header.mode_extension & ~Mad.I_STEREO;
+        }
+
+        /* now do the actual processing */
+
+        if (header.flags & Mad.Flag.LSF_EXT) {
+            illegal_pos = granule[1].ch[1].scalefac;
+            var lsf_scale;
+
+            /* intensity_scale */
+            lsf_scale = is_lsf_table[right_ch.scalefac_compress & 0x1];
+
+            for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
+                n = sfbwidth[sfbi];
+
+                if (!(modes[sfbi] & Mad.I_STEREO))
+                    continue;
+
+                if (illegal_pos[sfbi]) {
+                    modes[sfbi] &= ~Mad.I_STEREO;
+                    continue;
+                }
+
+                is_pos = right_ch.scalefac[sfbi];
+
+                for (i = 0; i < n; ++i) {
+                    var left;
+
+                    left = xr[0][l + i];
+
+                    if (is_pos === 0)
+                        xr[1][l + i] = left;
+                    else {
+                        var opposite;
+
+                        opposite = left * lsf_scale[(is_pos - 1) / 2];
+
+                        if (is_pos & 1) {
+                            xr[0][l + i] = opposite;
+                            xr[1][l + i] = left;
+                        }
+                        else
+                            xr[1][l + i] = opposite;
+                    }
+                }
+            }
+        }
+        else {  /* !(header.flags & MAD_FLAG_LSF_EXT) */
+            for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
+                n = sfbwidth[sfbi];
+
+                if (!(modes[sfbi] & Mad.I_STEREO))
+                    continue;
+
+                is_pos = right_ch.scalefac[sfbi];
+
+                if (is_pos >= 7) {  /* illegal intensity position */
+                    modes[sfbi] &= ~Mad.I_STEREO;
+                    continue;
+                }
+
+                for (i = 0; i < n; ++i) {
+                    var left;
+
+                    left = xr[0][l + i];
+
+                    xr[0][l + i] = left * is_table[    is_pos];
+                    xr[1][l + i] = left * is_table[6 - is_pos];
+                }
+            }
+        }
+    }
+
+    /* middle/side stereo */
+
+    if (header.mode_extension & Mad.MS_STEREO) {
+        var invsqrt2;
+
+        header.flags |= Mad.Flag.MS_STEREO;
+
+        invsqrt2 = root_table[3 + -2];
+
+        for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
+            n = sfbwidth[sfbi];
+
+            if (modes[sfbi] != Mad.MS_STEREO)
+                continue;
+
+            for (i = 0; i < n; ++i) {
+                var m, s;
+
+                m = xr[0][l + i];
+                s = xr[1][l + i];
+
+                xr[0][l + i] = (m + s) * invsqrt2;  /* l = (m + s) / sqrt(2) */
+                xr[1][l + i] = (m - s) * invsqrt2;  /* r = (m - s) / sqrt(2) */
+            }
+        }
+    }
+
+    return Mad.Error.NONE;    
+};
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/mad.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/mad.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/mad.js	(revision 28388)
@@ -0,0 +1,171 @@
+
+/* Namespaces */
+Mad = {};
+Mad.ArrayBuffers = {};
+Mad.BinaryStrings = {};
+
+Mad.recoverable = function (error) {
+    return (error & 0xff00) != 0;
+};
+
+// change this value for testing
+Mad.enforceBinaryString = false;
+
+if (!Mad.enforceBinaryString && typeof(ArrayBuffer) === 'function' && typeof(Uint8Array) === 'function') {
+    console.log("Using ArrayBuffer");
+    Mad.Storage = {
+        backing: 'arraybuffer',
+
+        newBuffer: function (length) {
+            return new Uint8Array(length);
+        },
+
+        memcpy: function (dst, dstOffset, pSrc, srcOffset, length) {
+            while (pSrc.parentStream) {
+                srcOffset += pSrc.start;
+                pSrc = pSrc.parentStream;
+            }
+            var src = pSrc.subarray ? pSrc : pSrc.buffer;
+            var subarr = src.subarray(srcOffset, srcOffset + length);
+
+            // oh my, memcpy actually exists in JavaScript?
+            dst.set(subarr, dstOffset);
+            return dst;
+        }
+    };
+    Mad.FileStream = function (file, callback) {
+        return new Mad.ArrayBuffers.FileStream(file, callback);
+    }
+    Mad.AjaxStream = function (file, callback) {
+        return new Mad.ArrayBuffers.AjaxStream(file, callback);
+    }
+} else {
+    console.log("Using BinaryString");
+    Mad.Storage = {
+        backing: 'binarystring',
+
+        newBuffer: function (length) {
+            return Mad.mul("\0", length);
+        },
+
+        memcpy: function (dst, dstOffset, src, srcOffset, length) {
+            // this is a pretty weird memcpy actually - it constructs a new version of dst, because we have no other way to do it
+            return dst.slice(0, dstOffset) + src.slice(srcOffset, srcOffset + length) + dst.slice(dstOffset + length);
+        }
+    };
+    Mad.FileStream = function (file, callback) {
+        return new Mad.BinaryStrings.FileStream(file, callback);
+    }
+    Mad.AjaxStream = function (file, callback) {
+        return new Mad.BinaryStrings.AjaxStream(file, callback);
+    }
+}
+
+// credit: http://blog.stevenlevithan.com/archives/fast-string-multiply
+Mad.mul = function (str, num) {
+        var i = Math.ceil(Math.log(num) / Math.LN2), res = str;
+        do {
+            res += res;
+        } while (0 < --i);
+        return res.slice(0, str.length * num);
+};
+
+Mad.rshift = function (num, bits) {
+    return Math.floor(num / Math.pow(2, bits));
+};
+
+Mad.lshiftU32 = function (num, bits) {
+    return Mad.bitwiseAnd(Mad.lshift(num, bits), 4294967295 /* 2^32 - 1 */);
+};
+
+Mad.lshift = function (num, bits) {
+    return num * Math.pow(2, bits);
+};
+
+Mad.bitwiseOr = function (a, b) {
+    var w = 2147483648; // 2^31
+
+    var aHI = (a / w) << 0;
+    var aLO = a % w;
+    var bHI = (b / w) << 0;
+    var bLO = b % w;
+
+    return ((aHI | bHI) * w + (aLO | bLO));
+};
+
+Mad.bitwiseAnd = function (a, b) {
+    var w = 2147483648; // 2^31
+
+    var aHI = (a / w) << 0;
+    var aLO = a % w;
+    var bHI = (b / w) << 0;
+    var bLO = b % w;
+
+    return ((aHI & bHI) * w + (aLO & bLO));
+};
+
+/* Simple JavaScript Inheritance
+ * By John Resig http://ejohn.org/
+ * MIT Licensed.
+ */
+// Inspired by base2 and Prototype
+(function(){
+  var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
+  // The base Class implementation (does nothing)
+  this.Class = function(){};
+  
+  // Create a new Class that inherits from this class
+  Class.extend = function(prop) {
+    var _super = this.prototype;
+    
+    // Instantiate a base class (but only create the instance,
+    // don't run the init constructor)
+    initializing = true;
+    var prototype = new this();
+    initializing = false;
+    
+    // Copy the properties over onto the new prototype
+    for (var name in prop) {
+      // Check if we're overwriting an existing function
+      prototype[name] = typeof prop[name] === "function" && 
+        typeof _super[name] === "function" && fnTest.test(prop[name]) ?
+        (function(name, fn){
+          return function() {
+            var tmp = this._super;
+            
+            // Add a new ._super() method that is the same method
+            // but on the super-class
+            this._super = _super[name];
+            
+            // The method only need to be bound temporarily, so we
+            // remove it when we're done executing
+            var ret = fn.apply(this, arguments);        
+            this._super = tmp;
+            
+            return ret;
+          };
+        })(name, prop[name]) :
+        prop[name];
+    }
+    
+    // The dummy class constructor
+    function Class() {
+      // All construction is actually done in the init method
+      if ( !initializing && this.init )
+        this.init.apply(this, arguments);
+    }
+    
+    // Populate our constructed prototype object
+    Class.prototype = prototype;
+    
+    // Enforce the constructor to be what we expect
+    Class.prototype.constructor = Class;
+
+    // And make this class extendable
+    Class.extend = arguments.callee;
+    
+    return Class;
+  };
+})();
+
+
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/mp3file.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/mp3file.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/mp3file.js	(revision 28388)
@@ -0,0 +1,50 @@
+Mad.MP3File = function(stream) {
+    this.stream = stream;
+}
+
+Mad.MP3File.prototype.getID3v2Header = function() {
+    if (this.stream.strEquals(0, "ID3")) {
+        var headerStream = this.stream.substream(0, 10);
+        
+        headerStream.seek(3); // 'ID3'
+        
+        var major = headerStream.readU8();
+        var minor = headerStream.readU8();
+        
+        var flags = headerStream.readU8();
+        
+        var length = headerStream.readSyncInteger();
+        
+        return { version: '2.' + major + '.' + minor, major: major, minor: minor, flags: flags, length: length };
+    } else {
+        return null;
+    }
+}
+
+Mad.MP3File.prototype.getID3v2Stream = function() {
+    var header = this.getID3v2Header();
+    
+    if (header) {
+        if (header.major > 2) {
+            return new Mad.ID3v23Stream(header, this.stream.substream(10, header.length));
+        } else {
+            return new Mad.ID3v22Stream(header, this.stream.substream(10, header.length));
+        }
+    } else {
+        return null;
+    }
+}
+
+Mad.MP3File.prototype.getMpegStream = function() {
+    var id3header = this.getID3v2Header();
+    
+    if (id3header) {
+        var offset = 10 + id3header.length;
+    } else {
+        var offset = 0;
+    }
+    
+    var length = this.stream.length - offset;
+
+    return new Mad.Stream(this.stream.substream(offset), length);   
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/player.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/player.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/player.js	(revision 28388)
@@ -0,0 +1,151 @@
+
+Mad.Player = function (stream) {
+    this.stream = stream;
+    this.mp3 = new Mad.MP3File(stream);
+    this.id3  = this.mp3.getID3v2Stream();
+    this.mpeg = this.mp3.getMpegStream();
+
+    this.totalLength = this.id3 && ~~this.id3.toHash()['Length'];
+
+    // default onProgress handler
+    this.onProgress = function (playtime, total, preloaded) {
+        console.log("playtime = " + playtime + " / " + total + ", preloaded = " + preloaded);
+    }
+};
+
+// Create a device.
+Mad.Player.prototype.createDevice = function() {
+    var synth = new Mad.Synth();
+    this.frame = new Mad.Frame();
+    this.frame = Mad.Frame.decode(this.frame, this.mpeg);
+    if (this.frame === null) {
+        if (this.mpeg.error === Mad.Error.BUFLEN) {
+            console.log("End of file!");
+        }
+
+        console.log("First error! code = " + this.mpeg.error + ", recoverable ? = " + Mad.recoverable(this.mpeg.error));
+        return;
+    }
+
+    this.channelCount = this.frame.header.nchannels();
+    this.sampleRate = this.frame.header.samplerate;
+
+    console.log("this.playing " + this.channelCount + " channels, samplerate = " + this.sampleRate + " audio, mode " + this.frame.header.mode);
+
+    this.offset = 0;
+    this.absoluteFrameIndex = 0;
+    synth.frame(this.frame);
+
+    this.lastRebuffer = Date.now();
+    this.playing = false;
+    this.progress();
+
+    var self = this;	
+    var MAX_FRAMES_IN_BUFFER = 40;
+
+    this.refill = function (sampleBuffer) {
+        //console.log("delta = " + (Date.now() - self.lastRebuffer) + ", asked for " + sampleBuffer.length);
+        self.lastRebuffer = Date.now();
+
+        if(!self.playing) return; // empty sampleBuffer, no prob
+
+        var index = 0;
+
+        while (index < sampleBuffer.length) {
+            for (var i = 0; i < self.channelCount; ++i) {
+                sampleBuffer[index++] = synth.pcm.samples[i][self.offset];
+            }
+
+            self.offset++;
+
+            if (self.offset >= synth.pcm.samples[0].length) {
+                self.offset = 0;
+
+                self.frame = Mad.Frame.decode(self.frame, self.mpeg);
+                if (self.frame === null) {
+                    if (self.stream.error === Mad.Error.BUFLEN) {
+                        console.log("End of file!");
+                    }
+                    console.log("Error! code = " + self.mpeg.error);
+                    self.playing = false;
+                    self.onProgress(1.0, 1.0, 1.0);
+                    self.dev.kill();
+                } else {
+                    synth.frame(self.frame);
+                    self.absoluteFrameIndex++;
+                }
+            }
+        }
+
+        if (self.onPostProcessing) {
+            self.onPostProcessing.apply(this, arguments);
+        }
+
+    };
+
+    this.reinitDevice();
+};
+
+Mad.Player.prototype.reinitDevice = function() {
+    if(this.dev) this.dev.kill();
+    // The default value is the safest
+    var bufferSize = null;
+    var self = this;
+
+    var temp = Sink.sinks.moz.prototype.interval;
+    Sink.sinks.moz.prototype.interval = 100;
+
+    this.dev = Sink(function(){
+            return self.refill.apply(this, arguments);
+    }, this.channelCount, bufferSize, this.sampleRate);
+
+    this.dev.on && this.dev.on('error', function (e) {
+        console.log(e);
+    });
+
+    Sink.sinks.moz.prototype.interval = temp;
+}
+
+Mad.Player.prototype.setPlaying = function(playing) {
+    this.playing = playing;
+    if(playing) {
+        this.onPlay();
+    } else {
+        this.onPause();
+    }
+}
+
+Mad.Player.prototype.destroy = function() {
+    clearTimeout(this.progressTimeout);
+    if(this.dev) {
+        this.dev.kill();
+    }
+}
+
+Mad.Player.prototype.progress = function () {
+    var delta = Date.now() - this.lastRebuffer;
+
+    var playtime = ((this.absoluteFrameIndex * 1152 + this.offset) / this.sampleRate) + delta / 1000.0;
+    //console.log("delta = " + delta + ", contentLength = " + this.stream.contentLength + ", this.offset = " + this.mpeg.this_frame);
+    var total = this.totalLength ? this.totalLength : playtime * this.stream.contentLength / this.mpeg.this_frame;
+    var preloaded = this.stream.amountRead / this.stream.contentLength;
+    //console.log("amountRead = " + this.stream.amountRead + ", preloaded = " + preloaded);
+    this.onProgress(playtime, total, preloaded);
+
+    var that = this;
+    var nextCall = function() { that.progress(); };
+    this.progressTimeout = setTimeout(nextCall, 250);
+}
+
+Mad.Player.fromFile = function (file, callback) {
+    new Mad.FileStream(file, function (stream) {
+            callback(new Mad.Player(stream));
+            });
+};
+
+Mad.Player.fromURL = function (url, callback) {
+    var stream = new Mad.AjaxStream(url);
+    stream.requestAbsolute(1 * 1024, function () {
+            callback(new Mad.Player(stream));
+            });
+};
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/rq_table.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/rq_table.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/rq_table.js	(revision 28388)
@@ -0,0 +1,8734 @@
+/*
+ * This is the lookup table used to compute x^(4/3) for Layer III
+ * requantization. To maintain the best possible accuracy, the value is
+ * stored as a normalized mantissa with exponent. The requantization
+ * algorithm recombines these parts with appropriate scaling.
+ */
+
+/*
+ * table for requantization
+ *
+ * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3)
+ */
+ 
+Mad.rq_table /* 8207 */ = [
+  /*    0 */  [ 0.000000000,  0 ],
+  /*    1 */  [ 0.250000000,  2 ],
+  /*    2 */  [ 0.314980262,  3 ],
+  /*    3 */  [ 0.270421794,  4 ],
+  /*    4 */  [ 0.396850263,  4 ],
+  /*    5 */  [ 0.267183742,  5 ],
+  /*    6 */  [ 0.340710111,  5 ],
+  /*    7 */  [ 0.418453696,  5 ],
+  /*    8 */  [ 0.250000000,  6 ],
+  /*    9 */  [ 0.292511788,  6 ],
+  /*   10 */  [ 0.336630420,  6 ],
+  /*   11 */  [ 0.382246578,  6 ],
+  /*   12 */  [ 0.429267841,  6 ],
+  /*   13 */  [ 0.477614858,  6 ],
+  /*   14 */  [ 0.263609310,  7 ],
+  /*   15 */  [ 0.289009227,  7 ],
+
+  /*   16 */  [ 0.314980262,  7 ],
+  /*   17 */  [ 0.341498336,  7 ],
+  /*   18 */  [ 0.368541759,  7 ],
+  /*   19 */  [ 0.396090870,  7 ],
+  /*   20 */  [ 0.424127753,  7 ],
+  /*   21 */  [ 0.452635998,  7 ],
+  /*   22 */  [ 0.481600510,  7 ],
+  /*   23 */  [ 0.255503674,  8 ],
+  /*   24 */  [ 0.270421794,  8 ],
+  /*   25 */  [ 0.285548607,  8 ],
+  /*   26 */  [ 0.300878507,  8 ],
+  /*   27 */  [ 0.316406250,  8 ],
+  /*   28 */  [ 0.332126919,  8 ],
+  /*   29 */  [ 0.348035890,  8 ],
+  /*   30 */  [ 0.364128809,  8 ],
+  /*   31 */  [ 0.380401563,  8 ],
+
+  /*   32 */  [ 0.396850263,  8 ],
+  /*   33 */  [ 0.413471222,  8 ],
+  /*   34 */  [ 0.430260942,  8 ],
+  /*   35 */  [ 0.447216097,  8 ],
+  /*   36 */  [ 0.464333519,  8 ],
+  /*   37 */  [ 0.481610189,  8 ],
+  /*   38 */  [ 0.499043224,  8 ],
+  /*   39 */  [ 0.258314934,  9 ],
+  /*   40 */  [ 0.267183742,  9 ],
+  /*   41 */  [ 0.276126771,  9 ],
+  /*   42 */  [ 0.285142811,  9 ],
+  /*   43 */  [ 0.294230696,  9 ],
+  /*   44 */  [ 0.303389310,  9 ],
+  /*   45 */  [ 0.312617576,  9 ],
+  /*   46 */  [ 0.321914457,  9 ],
+  /*   47 */  [ 0.331278957,  9 ],
+
+  /*   48 */  [ 0.340710111,  9 ],
+  /*   49 */  [ 0.350206992,  9 ],
+  /*   50 */  [ 0.359768701,  9 ],
+  /*   51 */  [ 0.369394372,  9 ],
+  /*   52 */  [ 0.379083164,  9 ],
+  /*   53 */  [ 0.388834268,  9 ],
+  /*   54 */  [ 0.398646895,  9 ],
+  /*   55 */  [ 0.408520284,  9 ],
+  /*   56 */  [ 0.418453696,  9 ],
+  /*   57 */  [ 0.428446415,  9 ],
+  /*   58 */  [ 0.438497744,  9 ],
+  /*   59 */  [ 0.448607009,  9 ],
+  /*   60 */  [ 0.458773552,  9 ],
+  /*   61 */  [ 0.468996735,  9 ],
+  /*   62 */  [ 0.479275937,  9 ],
+  /*   63 */  [ 0.489610555,  9 ],
+
+  /*   64 */  [ 0.250000000, 10 ],
+  /*   65 */  [ 0.255221850, 10 ],
+  /*   66 */  [ 0.260470548, 10 ],
+  /*   67 */  [ 0.265745823, 10 ],
+  /*   68 */  [ 0.271047409, 10 ],
+  /*   69 */  [ 0.276375048, 10 ],
+  /*   70 */  [ 0.281728487, 10 ],
+  /*   71 */  [ 0.287107481, 10 ],
+  /*   72 */  [ 0.292511788, 10 ],
+  /*   73 */  [ 0.297941173, 10 ],
+  /*   74 */  [ 0.303395408, 10 ],
+  /*   75 */  [ 0.308874267, 10 ],
+  /*   76 */  [ 0.314377532, 10 ],
+  /*   77 */  [ 0.319904987, 10 ],
+  /*   78 */  [ 0.325456423, 10 ],
+  /*   79 */  [ 0.331031635, 10 ],
+
+  /*   80 */  [ 0.336630420, 10 ],
+  /*   81 */  [ 0.342252584, 10 ],
+  /*   82 */  [ 0.347897931, 10 ],
+  /*   83 */  [ 0.353566275, 10 ],
+  /*   84 */  [ 0.359257429, 10 ],
+  /*   85 */  [ 0.364971213, 10 ],
+  /*   86 */  [ 0.370707448, 10 ],
+  /*   87 */  [ 0.376465960, 10 ],
+  /*   88 */  [ 0.382246578, 10 ],
+  /*   89 */  [ 0.388049134, 10 ],
+  /*   90 */  [ 0.393873464, 10 ],
+  /*   91 */  [ 0.399719406, 10 ],
+  /*   92 */  [ 0.405586801, 10 ],
+  /*   93 */  [ 0.411475493, 10 ],
+  /*   94 */  [ 0.417385331, 10 ],
+  /*   95 */  [ 0.423316162, 10 ],
+
+  /*   96 */  [ 0.429267841, 10 ],
+  /*   97 */  [ 0.435240221, 10 ],
+  /*   98 */  [ 0.441233161, 10 ],
+  /*   99 */  [ 0.447246519, 10 ],
+  /*  100 */  [ 0.453280160, 10 ],
+  /*  101 */  [ 0.459333946, 10 ],
+  /*  102 */  [ 0.465407744, 10 ],
+  /*  103 */  [ 0.471501425, 10 ],
+  /*  104 */  [ 0.477614858, 10 ],
+  /*  105 */  [ 0.483747918, 10 ],
+  /*  106 */  [ 0.489900479, 10 ],
+  /*  107 */  [ 0.496072418, 10 ],
+  /*  108 */  [ 0.251131807, 11 ],
+  /*  109 */  [ 0.254236974, 11 ],
+  /*  110 */  [ 0.257351652, 11 ],
+  /*  111 */  [ 0.260475783, 11 ],
+
+  /*  112 */  [ 0.263609310, 11 ],
+  /*  113 */  [ 0.266752177, 11 ],
+  /*  114 */  [ 0.269904329, 11 ],
+  /*  115 */  [ 0.273065710, 11 ],
+  /*  116 */  [ 0.276236269, 11 ],
+  /*  117 */  [ 0.279415952, 11 ],
+  /*  118 */  [ 0.282604707, 11 ],
+  /*  119 */  [ 0.285802482, 11 ],
+  /*  120 */  [ 0.289009227, 11 ],
+  /*  121 */  [ 0.292224893, 11 ],
+  /*  122 */  [ 0.295449429, 11 ],
+  /*  123 */  [ 0.298682788, 11 ],
+  /*  124 */  [ 0.301924921, 11 ],
+  /*  125 */  [ 0.305175781, 11 ],
+  /*  126 */  [ 0.308435322, 11 ],
+  /*  127 */  [ 0.311703498, 11 ],
+
+  /*  128 */  [ 0.314980262, 11 ],
+  /*  129 */  [ 0.318265572, 11 ],
+  /*  130 */  [ 0.321559381, 11 ],
+  /*  131 */  [ 0.324861647, 11 ],
+  /*  132 */  [ 0.328172327, 11 ],
+  /*  133 */  [ 0.331491377, 11 ],
+  /*  134 */  [ 0.334818756, 11 ],
+  /*  135 */  [ 0.338154423, 11 ],
+  /*  136 */  [ 0.341498336, 11 ],
+  /*  137 */  [ 0.344850455, 11 ],
+  /*  138 */  [ 0.348210741, 11 ],
+  /*  139 */  [ 0.351579152, 11 ],
+  /*  140 */  [ 0.354955651, 11 ],
+  /*  141 */  [ 0.358340200, 11 ],
+  /*  142 */  [ 0.361732758, 11 ],
+  /*  143 */  [ 0.365133291, 11 ],
+
+  /*  144 */  [ 0.368541759, 11 ],
+  /*  145 */  [ 0.371958126, 11 ],
+  /*  146 */  [ 0.375382356, 11 ],
+  /*  147 */  [ 0.378814413, 11 ],
+  /*  148 */  [ 0.382254261, 11 ],
+  /*  149 */  [ 0.385701865, 11 ],
+  /*  150 */  [ 0.389157191, 11 ],
+  /*  151 */  [ 0.392620204, 11 ],
+  /*  152 */  [ 0.396090870, 11 ],
+  /*  153 */  [ 0.399569155, 11 ],
+  /*  154 */  [ 0.403055027, 11 ],
+  /*  155 */  [ 0.406548452, 11 ],
+  /*  156 */  [ 0.410049398, 11 ],
+  /*  157 */  [ 0.413557833, 11 ],
+  /*  158 */  [ 0.417073724, 11 ],
+  /*  159 */  [ 0.420597041, 11 ],
+
+  /*  160 */  [ 0.424127753, 11 ],
+  /*  161 */  [ 0.427665827, 11 ],
+  /*  162 */  [ 0.431211234, 11 ],
+  /*  163 */  [ 0.434763944, 11 ],
+  /*  164 */  [ 0.438323927, 11 ],
+  /*  165 */  [ 0.441891153, 11 ],
+  /*  166 */  [ 0.445465593, 11 ],
+  /*  167 */  [ 0.449047217, 11 ],
+  /*  168 */  [ 0.452635998, 11 ],
+  /*  169 */  [ 0.456231906, 11 ],
+  /*  170 */  [ 0.459834914, 11 ],
+  /*  171 */  [ 0.463444993, 11 ],
+  /*  172 */  [ 0.467062117, 11 ],
+  /*  173 */  [ 0.470686258, 11 ],
+  /*  174 */  [ 0.474317388, 11 ],
+  /*  175 */  [ 0.477955481, 11 ],
+
+  /*  176 */  [ 0.481600510, 11 ],
+  /*  177 */  [ 0.485252449, 11 ],
+  /*  178 */  [ 0.488911273, 11 ],
+  /*  179 */  [ 0.492576954, 11 ],
+  /*  180 */  [ 0.496249468, 11 ],
+  /*  181 */  [ 0.499928790, 11 ],
+  /*  182 */  [ 0.251807447, 12 ],
+  /*  183 */  [ 0.253653877, 12 ],
+  /*  184 */  [ 0.255503674, 12 ],
+  /*  185 */  [ 0.257356825, 12 ],
+  /*  186 */  [ 0.259213318, 12 ],
+  /*  187 */  [ 0.261073141, 12 ],
+  /*  188 */  [ 0.262936282, 12 ],
+  /*  189 */  [ 0.264802730, 12 ],
+  /*  190 */  [ 0.266672472, 12 ],
+  /*  191 */  [ 0.268545497, 12 ],
+
+  /*  192 */  [ 0.270421794, 12 ],
+  /*  193 */  [ 0.272301352, 12 ],
+  /*  194 */  [ 0.274184158, 12 ],
+  /*  195 */  [ 0.276070203, 12 ],
+  /*  196 */  [ 0.277959474, 12 ],
+  /*  197 */  [ 0.279851960, 12 ],
+  /*  198 */  [ 0.281747652, 12 ],
+  /*  199 */  [ 0.283646538, 12 ],
+  /*  200 */  [ 0.285548607, 12 ],
+  /*  201 */  [ 0.287453849, 12 ],
+  /*  202 */  [ 0.289362253, 12 ],
+  /*  203 */  [ 0.291273810, 12 ],
+  /*  204 */  [ 0.293188507, 12 ],
+  /*  205 */  [ 0.295106336, 12 ],
+  /*  206 */  [ 0.297027285, 12 ],
+  /*  207 */  [ 0.298951346, 12 ],
+
+  /*  208 */  [ 0.300878507, 12 ],
+  /*  209 */  [ 0.302808759, 12 ],
+  /*  210 */  [ 0.304742092, 12 ],
+  /*  211 */  [ 0.306678497, 12 ],
+  /*  212 */  [ 0.308617963, 12 ],
+  /*  213 */  [ 0.310560480, 12 ],
+  /*  214 */  [ 0.312506041, 12 ],
+  /*  215 */  [ 0.314454634, 12 ],
+  /*  216 */  [ 0.316406250, 12 ],
+  /*  217 */  [ 0.318360880, 12 ],
+  /*  218 */  [ 0.320318516, 12 ],
+  /*  219 */  [ 0.322279147, 12 ],
+  /*  220 */  [ 0.324242764, 12 ],
+  /*  221 */  [ 0.326209359, 12 ],
+  /*  222 */  [ 0.328178922, 12 ],
+  /*  223 */  [ 0.330151445, 12 ],
+
+  /*  224 */  [ 0.332126919, 12 ],
+  /*  225 */  [ 0.334105334, 12 ],
+  /*  226 */  [ 0.336086683, 12 ],
+  /*  227 */  [ 0.338070956, 12 ],
+  /*  228 */  [ 0.340058145, 12 ],
+  /*  229 */  [ 0.342048241, 12 ],
+  /*  230 */  [ 0.344041237, 12 ],
+  /*  231 */  [ 0.346037122, 12 ],
+  /*  232 */  [ 0.348035890, 12 ],
+  /*  233 */  [ 0.350037532, 12 ],
+  /*  234 */  [ 0.352042040, 12 ],
+  /*  235 */  [ 0.354049405, 12 ],
+  /*  236 */  [ 0.356059619, 12 ],
+  /*  237 */  [ 0.358072674, 12 ],
+  /*  238 */  [ 0.360088563, 12 ],
+  /*  239 */  [ 0.362107278, 12 ],
+
+  /*  240 */  [ 0.364128809, 12 ],
+  /*  241 */  [ 0.366153151, 12 ],
+  /*  242 */  [ 0.368180294, 12 ],
+  /*  243 */  [ 0.370210231, 12 ],
+  /*  244 */  [ 0.372242955, 12 ],
+  /*  245 */  [ 0.374278458, 12 ],
+  /*  246 */  [ 0.376316732, 12 ],
+  /*  247 */  [ 0.378357769, 12 ],
+  /*  248 */  [ 0.380401563, 12 ],
+  /*  249 */  [ 0.382448106, 12 ],
+  /*  250 */  [ 0.384497391, 12 ],
+  /*  251 */  [ 0.386549409, 12 ],
+  /*  252 */  [ 0.388604155, 12 ],
+  /*  253 */  [ 0.390661620, 12 ],
+  /*  254 */  [ 0.392721798, 12 ],
+  /*  255 */  [ 0.394784681, 12 ],
+
+  /*  256 */  [ 0.396850263, 12 ],
+  /*  257 */  [ 0.398918536, 12 ],
+  /*  258 */  [ 0.400989493, 12 ],
+  /*  259 */  [ 0.403063128, 12 ],
+  /*  260 */  [ 0.405139433, 12 ],
+  /*  261 */  [ 0.407218402, 12 ],
+  /*  262 */  [ 0.409300027, 12 ],
+  /*  263 */  [ 0.411384303, 12 ],
+  /*  264 */  [ 0.413471222, 12 ],
+  /*  265 */  [ 0.415560778, 12 ],
+  /*  266 */  [ 0.417652964, 12 ],
+  /*  267 */  [ 0.419747773, 12 ],
+  /*  268 */  [ 0.421845199, 12 ],
+  /*  269 */  [ 0.423945235, 12 ],
+  /*  270 */  [ 0.426047876, 12 ],
+  /*  271 */  [ 0.428153114, 12 ],
+
+  /*  272 */  [ 0.430260942, 12 ],
+  /*  273 */  [ 0.432371356, 12 ],
+  /*  274 */  [ 0.434484348, 12 ],
+  /*  275 */  [ 0.436599912, 12 ],
+  /*  276 */  [ 0.438718042, 12 ],
+  /*  277 */  [ 0.440838732, 12 ],
+  /*  278 */  [ 0.442961975, 12 ],
+  /*  279 */  [ 0.445087765, 12 ],
+  /*  280 */  [ 0.447216097, 12 ],
+  /*  281 */  [ 0.449346964, 12 ],
+  /*  282 */  [ 0.451480360, 12 ],
+  /*  283 */  [ 0.453616280, 12 ],
+  /*  284 */  [ 0.455754717, 12 ],
+  /*  285 */  [ 0.457895665, 12 ],
+  /*  286 */  [ 0.460039119, 12 ],
+  /*  287 */  [ 0.462185072, 12 ],
+
+  /*  288 */  [ 0.464333519, 12 ],
+  /*  289 */  [ 0.466484455, 12 ],
+  /*  290 */  [ 0.468637872, 12 ],
+  /*  291 */  [ 0.470793767, 12 ],
+  /*  292 */  [ 0.472952132, 12 ],
+  /*  293 */  [ 0.475112962, 12 ],
+  /*  294 */  [ 0.477276252, 12 ],
+  /*  295 */  [ 0.479441997, 12 ],
+  /*  296 */  [ 0.481610189, 12 ],
+  /*  297 */  [ 0.483780825, 12 ],
+  /*  298 */  [ 0.485953899, 12 ],
+  /*  299 */  [ 0.488129404, 12 ],
+  /*  300 */  [ 0.490307336, 12 ],
+  /*  301 */  [ 0.492487690, 12 ],
+  /*  302 */  [ 0.494670459, 12 ],
+  /*  303 */  [ 0.496855639, 12 ],
+
+  /*  304 */  [ 0.499043224, 12 ],
+  /*  305 */  [ 0.250616605, 13 ],
+  /*  306 */  [ 0.251712795, 13 ],
+  /*  307 */  [ 0.252810180, 13 ],
+  /*  308 */  [ 0.253908756, 13 ],
+  /*  309 */  [ 0.255008523, 13 ],
+  /*  310 */  [ 0.256109476, 13 ],
+  /*  311 */  [ 0.257211614, 13 ],
+  /*  312 */  [ 0.258314934, 13 ],
+  /*  313 */  [ 0.259419433, 13 ],
+  /*  314 */  [ 0.260525110, 13 ],
+  /*  315 */  [ 0.261631960, 13 ],
+  /*  316 */  [ 0.262739982, 13 ],
+  /*  317 */  [ 0.263849174, 13 ],
+  /*  318 */  [ 0.264959533, 13 ],
+  /*  319 */  [ 0.266071056, 13 ],
+
+  /*  320 */  [ 0.267183742, 13 ],
+  /*  321 */  [ 0.268297587, 13 ],
+  /*  322 */  [ 0.269412589, 13 ],
+  /*  323 */  [ 0.270528746, 13 ],
+  /*  324 */  [ 0.271646056, 13 ],
+  /*  325 */  [ 0.272764515, 13 ],
+  /*  326 */  [ 0.273884123, 13 ],
+  /*  327 */  [ 0.275004875, 13 ],
+  /*  328 */  [ 0.276126771, 13 ],
+  /*  329 */  [ 0.277249808, 13 ],
+  /*  330 */  [ 0.278373983, 13 ],
+  /*  331 */  [ 0.279499294, 13 ],
+  /*  332 */  [ 0.280625739, 13 ],
+  /*  333 */  [ 0.281753315, 13 ],
+  /*  334 */  [ 0.282882021, 13 ],
+  /*  335 */  [ 0.284011853, 13 ],
+
+  /*  336 */  [ 0.285142811, 13 ],
+  /*  337 */  [ 0.286274891, 13 ],
+  /*  338 */  [ 0.287408091, 13 ],
+  /*  339 */  [ 0.288542409, 13 ],
+  /*  340 */  [ 0.289677844, 13 ],
+  /*  341 */  [ 0.290814392, 13 ],
+  /*  342 */  [ 0.291952051, 13 ],
+  /*  343 */  [ 0.293090820, 13 ],
+  /*  344 */  [ 0.294230696, 13 ],
+  /*  345 */  [ 0.295371678, 13 ],
+  /*  346 */  [ 0.296513762, 13 ],
+  /*  347 */  [ 0.297656947, 13 ],
+  /*  348 */  [ 0.298801231, 13 ],
+  /*  349 */  [ 0.299946611, 13 ],
+  /*  350 */  [ 0.301093085, 13 ],
+  /*  351 */  [ 0.302240653, 13 ],
+
+  /*  352 */  [ 0.303389310, 13 ],
+  /*  353 */  [ 0.304539056, 13 ],
+  /*  354 */  [ 0.305689888, 13 ],
+  /*  355 */  [ 0.306841804, 13 ],
+  /*  356 */  [ 0.307994802, 13 ],
+  /*  357 */  [ 0.309148880, 13 ],
+  /*  358 */  [ 0.310304037, 13 ],
+  /*  359 */  [ 0.311460269, 13 ],
+  /*  360 */  [ 0.312617576, 13 ],
+  /*  361 */  [ 0.313775954, 13 ],
+  /*  362 */  [ 0.314935403, 13 ],
+  /*  363 */  [ 0.316095920, 13 ],
+  /*  364 */  [ 0.317257503, 13 ],
+  /*  365 */  [ 0.318420150, 13 ],
+  /*  366 */  [ 0.319583859, 13 ],
+  /*  367 */  [ 0.320748629, 13 ],
+
+  /*  368 */  [ 0.321914457, 13 ],
+  /*  369 */  [ 0.323081342, 13 ],
+  /*  370 */  [ 0.324249281, 13 ],
+  /*  371 */  [ 0.325418273, 13 ],
+  /*  372 */  [ 0.326588316, 13 ],
+  /*  373 */  [ 0.327759407, 13 ],
+  /*  374 */  [ 0.328931546, 13 ],
+  /*  375 */  [ 0.330104730, 13 ],
+  /*  376 */  [ 0.331278957, 13 ],
+  /*  377 */  [ 0.332454225, 13 ],
+  /*  378 */  [ 0.333630533, 13 ],
+  /*  379 */  [ 0.334807879, 13 ],
+  /*  380 */  [ 0.335986261, 13 ],
+  /*  381 */  [ 0.337165677, 13 ],
+  /*  382 */  [ 0.338346125, 13 ],
+  /*  383 */  [ 0.339527604, 13 ],
+
+  /*  384 */  [ 0.340710111, 13 ],
+  /*  385 */  [ 0.341893646, 13 ],
+  /*  386 */  [ 0.343078205, 13 ],
+  /*  387 */  [ 0.344263788, 13 ],
+  /*  388 */  [ 0.345450393, 13 ],
+  /*  389 */  [ 0.346638017, 13 ],
+  /*  390 */  [ 0.347826659, 13 ],
+  /*  391 */  [ 0.349016318, 13 ],
+  /*  392 */  [ 0.350206992, 13 ],
+  /*  393 */  [ 0.351398678, 13 ],
+  /*  394 */  [ 0.352591376, 13 ],
+  /*  395 */  [ 0.353785083, 13 ],
+  /*  396 */  [ 0.354979798, 13 ],
+  /*  397 */  [ 0.356175519, 13 ],
+  /*  398 */  [ 0.357372244, 13 ],
+  /*  399 */  [ 0.358569972, 13 ],
+
+  /*  400 */  [ 0.359768701, 13 ],
+  /*  401 */  [ 0.360968429, 13 ],
+  /*  402 */  [ 0.362169156, 13 ],
+  /*  403 */  [ 0.363370878, 13 ],
+  /*  404 */  [ 0.364573594, 13 ],
+  /*  405 */  [ 0.365777304, 13 ],
+  /*  406 */  [ 0.366982004, 13 ],
+  /*  407 */  [ 0.368187694, 13 ],
+  /*  408 */  [ 0.369394372, 13 ],
+  /*  409 */  [ 0.370602036, 13 ],
+  /*  410 */  [ 0.371810684, 13 ],
+  /*  411 */  [ 0.373020316, 13 ],
+  /*  412 */  [ 0.374230929, 13 ],
+  /*  413 */  [ 0.375442522, 13 ],
+  /*  414 */  [ 0.376655093, 13 ],
+  /*  415 */  [ 0.377868641, 13 ],
+
+  /*  416 */  [ 0.379083164, 13 ],
+  /*  417 */  [ 0.380298661, 13 ],
+  /*  418 */  [ 0.381515130, 13 ],
+  /*  419 */  [ 0.382732569, 13 ],
+  /*  420 */  [ 0.383950977, 13 ],
+  /*  421 */  [ 0.385170352, 13 ],
+  /*  422 */  [ 0.386390694, 13 ],
+  /*  423 */  [ 0.387611999, 13 ],
+  /*  424 */  [ 0.388834268, 13 ],
+  /*  425 */  [ 0.390057497, 13 ],
+  /*  426 */  [ 0.391281687, 13 ],
+  /*  427 */  [ 0.392506834, 13 ],
+  /*  428 */  [ 0.393732939, 13 ],
+  /*  429 */  [ 0.394959999, 13 ],
+  /*  430 */  [ 0.396188012, 13 ],
+  /*  431 */  [ 0.397416978, 13 ],
+
+  /*  432 */  [ 0.398646895, 13 ],
+  /*  433 */  [ 0.399877761, 13 ],
+  /*  434 */  [ 0.401109575, 13 ],
+  /*  435 */  [ 0.402342335, 13 ],
+  /*  436 */  [ 0.403576041, 13 ],
+  /*  437 */  [ 0.404810690, 13 ],
+  /*  438 */  [ 0.406046281, 13 ],
+  /*  439 */  [ 0.407282813, 13 ],
+  /*  440 */  [ 0.408520284, 13 ],
+  /*  441 */  [ 0.409758693, 13 ],
+  /*  442 */  [ 0.410998038, 13 ],
+  /*  443 */  [ 0.412238319, 13 ],
+  /*  444 */  [ 0.413479532, 13 ],
+  /*  445 */  [ 0.414721679, 13 ],
+  /*  446 */  [ 0.415964756, 13 ],
+  /*  447 */  [ 0.417208762, 13 ],
+
+  /*  448 */  [ 0.418453696, 13 ],
+  /*  449 */  [ 0.419699557, 13 ],
+  /*  450 */  [ 0.420946343, 13 ],
+  /*  451 */  [ 0.422194054, 13 ],
+  /*  452 */  [ 0.423442686, 13 ],
+  /*  453 */  [ 0.424692240, 13 ],
+  /*  454 */  [ 0.425942714, 13 ],
+  /*  455 */  [ 0.427194106, 13 ],
+  /*  456 */  [ 0.428446415, 13 ],
+  /*  457 */  [ 0.429699640, 13 ],
+  /*  458 */  [ 0.430953779, 13 ],
+  /*  459 */  [ 0.432208832, 13 ],
+  /*  460 */  [ 0.433464796, 13 ],
+  /*  461 */  [ 0.434721671, 13 ],
+  /*  462 */  [ 0.435979455, 13 ],
+  /*  463 */  [ 0.437238146, 13 ],
+
+  /*  464 */  [ 0.438497744, 13 ],
+  /*  465 */  [ 0.439758248, 13 ],
+  /*  466 */  [ 0.441019655, 13 ],
+  /*  467 */  [ 0.442281965, 13 ],
+  /*  468 */  [ 0.443545176, 13 ],
+  /*  469 */  [ 0.444809288, 13 ],
+  /*  470 */  [ 0.446074298, 13 ],
+  /*  471 */  [ 0.447340205, 13 ],
+  /*  472 */  [ 0.448607009, 13 ],
+  /*  473 */  [ 0.449874708, 13 ],
+  /*  474 */  [ 0.451143300, 13 ],
+  /*  475 */  [ 0.452412785, 13 ],
+  /*  476 */  [ 0.453683161, 13 ],
+  /*  477 */  [ 0.454954427, 13 ],
+  /*  478 */  [ 0.456226581, 13 ],
+  /*  479 */  [ 0.457499623, 13 ],
+
+  /*  480 */  [ 0.458773552, 13 ],
+  /*  481 */  [ 0.460048365, 13 ],
+  /*  482 */  [ 0.461324062, 13 ],
+  /*  483 */  [ 0.462600642, 13 ],
+  /*  484 */  [ 0.463878102, 13 ],
+  /*  485 */  [ 0.465156443, 13 ],
+  /*  486 */  [ 0.466435663, 13 ],
+  /*  487 */  [ 0.467715761, 13 ],
+  /*  488 */  [ 0.468996735, 13 ],
+  /*  489 */  [ 0.470278584, 13 ],
+  /*  490 */  [ 0.471561307, 13 ],
+  /*  491 */  [ 0.472844904, 13 ],
+  /*  492 */  [ 0.474129372, 13 ],
+  /*  493 */  [ 0.475414710, 13 ],
+  /*  494 */  [ 0.476700918, 13 ],
+  /*  495 */  [ 0.477987994, 13 ],
+
+  /*  496 */  [ 0.479275937, 13 ],
+  /*  497 */  [ 0.480564746, 13 ],
+  /*  498 */  [ 0.481854420, 13 ],
+  /*  499 */  [ 0.483144957, 13 ],
+  /*  500 */  [ 0.484436356, 13 ],
+  /*  501 */  [ 0.485728617, 13 ],
+  /*  502 */  [ 0.487021738, 13 ],
+  /*  503 */  [ 0.488315717, 13 ],
+  /*  504 */  [ 0.489610555, 13 ],
+  /*  505 */  [ 0.490906249, 13 ],
+  /*  506 */  [ 0.492202799, 13 ],
+  /*  507 */  [ 0.493500203, 13 ],
+  /*  508 */  [ 0.494798460, 13 ],
+  /*  509 */  [ 0.496097570, 13 ],
+  /*  510 */  [ 0.497397530, 13 ],
+  /*  511 */  [ 0.498698341, 13 ],
+
+  /*  512 */  [ 0.250000000, 14 ],
+  /*  513 */  [ 0.250651254, 14 ],
+  /*  514 */  [ 0.251302930, 14 ],
+  /*  515 */  [ 0.251955030, 14 ],
+  /*  516 */  [ 0.252607552, 14 ],
+  /*  517 */  [ 0.253260495, 14 ],
+  /*  518 */  [ 0.253913860, 14 ],
+  /*  519 */  [ 0.254567645, 14 ],
+  /*  520 */  [ 0.255221850, 14 ],
+  /*  521 */  [ 0.255876475, 14 ],
+  /*  522 */  [ 0.256531518, 14 ],
+  /*  523 */  [ 0.257186980, 14 ],
+  /*  524 */  [ 0.257842860, 14 ],
+  /*  525 */  [ 0.258499157, 14 ],
+  /*  526 */  [ 0.259155872, 14 ],
+  /*  527 */  [ 0.259813002, 14 ],
+
+  /*  528 */  [ 0.260470548, 14 ],
+  /*  529 */  [ 0.261128510, 14 ],
+  /*  530 */  [ 0.261786886, 14 ],
+  /*  531 */  [ 0.262445676, 14 ],
+  /*  532 */  [ 0.263104880, 14 ],
+  /*  533 */  [ 0.263764497, 14 ],
+  /*  534 */  [ 0.264424527, 14 ],
+  /*  535 */  [ 0.265084969, 14 ],
+  /*  536 */  [ 0.265745823, 14 ],
+  /*  537 */  [ 0.266407088, 14 ],
+  /*  538 */  [ 0.267068763, 14 ],
+  /*  539 */  [ 0.267730848, 14 ],
+  /*  540 */  [ 0.268393343, 14 ],
+  /*  541 */  [ 0.269056248, 14 ],
+  /*  542 */  [ 0.269719560, 14 ],
+  /*  543 */  [ 0.270383281, 14 ],
+
+  /*  544 */  [ 0.271047409, 14 ],
+  /*  545 */  [ 0.271711944, 14 ],
+  /*  546 */  [ 0.272376886, 14 ],
+  /*  547 */  [ 0.273042234, 14 ],
+  /*  548 */  [ 0.273707988, 14 ],
+  /*  549 */  [ 0.274374147, 14 ],
+  /*  550 */  [ 0.275040710, 14 ],
+  /*  551 */  [ 0.275707677, 14 ],
+  /*  552 */  [ 0.276375048, 14 ],
+  /*  553 */  [ 0.277042822, 14 ],
+  /*  554 */  [ 0.277710999, 14 ],
+  /*  555 */  [ 0.278379578, 14 ],
+  /*  556 */  [ 0.279048558, 14 ],
+  /*  557 */  [ 0.279717940, 14 ],
+  /*  558 */  [ 0.280387722, 14 ],
+  /*  559 */  [ 0.281057905, 14 ],
+
+  /*  560 */  [ 0.281728487, 14 ],
+  /*  561 */  [ 0.282399469, 14 ],
+  /*  562 */  [ 0.283070849, 14 ],
+  /*  563 */  [ 0.283742628, 14 ],
+  /*  564 */  [ 0.284414805, 14 ],
+  /*  565 */  [ 0.285087379, 14 ],
+  /*  566 */  [ 0.285760350, 14 ],
+  /*  567 */  [ 0.286433717, 14 ],
+  /*  568 */  [ 0.287107481, 14 ],
+  /*  569 */  [ 0.287781640, 14 ],
+  /*  570 */  [ 0.288456194, 14 ],
+  /*  571 */  [ 0.289131142, 14 ],
+  /*  572 */  [ 0.289806485, 14 ],
+  /*  573 */  [ 0.290482221, 14 ],
+  /*  574 */  [ 0.291158351, 14 ],
+  /*  575 */  [ 0.291834873, 14 ],
+
+  /*  576 */  [ 0.292511788, 14 ],
+  /*  577 */  [ 0.293189094, 14 ],
+  /*  578 */  [ 0.293866792, 14 ],
+  /*  579 */  [ 0.294544881, 14 ],
+  /*  580 */  [ 0.295223360, 14 ],
+  /*  581 */  [ 0.295902229, 14 ],
+  /*  582 */  [ 0.296581488, 14 ],
+  /*  583 */  [ 0.297261136, 14 ],
+  /*  584 */  [ 0.297941173, 14 ],
+  /*  585 */  [ 0.298621598, 14 ],
+  /*  586 */  [ 0.299302411, 14 ],
+  /*  587 */  [ 0.299983611, 14 ],
+  /*  588 */  [ 0.300665198, 14 ],
+  /*  589 */  [ 0.301347172, 14 ],
+  /*  590 */  [ 0.302029532, 14 ],
+  /*  591 */  [ 0.302712277, 14 ],
+
+  /*  592 */  [ 0.303395408, 14 ],
+  /*  593 */  [ 0.304078923, 14 ],
+  /*  594 */  [ 0.304762823, 14 ],
+  /*  595 */  [ 0.305447106, 14 ],
+  /*  596 */  [ 0.306131773, 14 ],
+  /*  597 */  [ 0.306816823, 14 ],
+  /*  598 */  [ 0.307502256, 14 ],
+  /*  599 */  [ 0.308188071, 14 ],
+  /*  600 */  [ 0.308874267, 14 ],
+  /*  601 */  [ 0.309560845, 14 ],
+  /*  602 */  [ 0.310247804, 14 ],
+  /*  603 */  [ 0.310935143, 14 ],
+  /*  604 */  [ 0.311622862, 14 ],
+  /*  605 */  [ 0.312310961, 14 ],
+  /*  606 */  [ 0.312999439, 14 ],
+  /*  607 */  [ 0.313688296, 14 ],
+
+  /*  608 */  [ 0.314377532, 14 ],
+  /*  609 */  [ 0.315067145, 14 ],
+  /*  610 */  [ 0.315757136, 14 ],
+  /*  611 */  [ 0.316447504, 14 ],
+  /*  612 */  [ 0.317138249, 14 ],
+  /*  613 */  [ 0.317829370, 14 ],
+  /*  614 */  [ 0.318520867, 14 ],
+  /*  615 */  [ 0.319212739, 14 ],
+  /*  616 */  [ 0.319904987, 14 ],
+  /*  617 */  [ 0.320597609, 14 ],
+  /*  618 */  [ 0.321290606, 14 ],
+  /*  619 */  [ 0.321983976, 14 ],
+  /*  620 */  [ 0.322677720, 14 ],
+  /*  621 */  [ 0.323371837, 14 ],
+  /*  622 */  [ 0.324066327, 14 ],
+  /*  623 */  [ 0.324761189, 14 ],
+
+  /*  624 */  [ 0.325456423, 14 ],
+  /*  625 */  [ 0.326152028, 14 ],
+  /*  626 */  [ 0.326848005, 14 ],
+  /*  627 */  [ 0.327544352, 14 ],
+  /*  628 */  [ 0.328241070, 14 ],
+  /*  629 */  [ 0.328938157, 14 ],
+  /*  630 */  [ 0.329635614, 14 ],
+  /*  631 */  [ 0.330333440, 14 ],
+  /*  632 */  [ 0.331031635, 14 ],
+  /*  633 */  [ 0.331730198, 14 ],
+  /*  634 */  [ 0.332429129, 14 ],
+  /*  635 */  [ 0.333128427, 14 ],
+  /*  636 */  [ 0.333828093, 14 ],
+  /*  637 */  [ 0.334528126, 14 ],
+  /*  638 */  [ 0.335228525, 14 ],
+  /*  639 */  [ 0.335929290, 14 ],
+
+  /*  640 */  [ 0.336630420, 14 ],
+  /*  641 */  [ 0.337331916, 14 ],
+  /*  642 */  [ 0.338033777, 14 ],
+  /*  643 */  [ 0.338736002, 14 ],
+  /*  644 */  [ 0.339438592, 14 ],
+  /*  645 */  [ 0.340141545, 14 ],
+  /*  646 */  [ 0.340844862, 14 ],
+  /*  647 */  [ 0.341548541, 14 ],
+  /*  648 */  [ 0.342252584, 14 ],
+  /*  649 */  [ 0.342956988, 14 ],
+  /*  650 */  [ 0.343661754, 14 ],
+  /*  651 */  [ 0.344366882, 14 ],
+  /*  652 */  [ 0.345072371, 14 ],
+  /*  653 */  [ 0.345778221, 14 ],
+  /*  654 */  [ 0.346484431, 14 ],
+  /*  655 */  [ 0.347191002, 14 ],
+
+  /*  656 */  [ 0.347897931, 14 ],
+  /*  657 */  [ 0.348605221, 14 ],
+  /*  658 */  [ 0.349312869, 14 ],
+  /*  659 */  [ 0.350020876, 14 ],
+  /*  660 */  [ 0.350729240, 14 ],
+  /*  661 */  [ 0.351437963, 14 ],
+  /*  662 */  [ 0.352147044, 14 ],
+  /*  663 */  [ 0.352856481, 14 ],
+  /*  664 */  [ 0.353566275, 14 ],
+  /*  665 */  [ 0.354276426, 14 ],
+  /*  666 */  [ 0.354986932, 14 ],
+  /*  667 */  [ 0.355697795, 14 ],
+  /*  668 */  [ 0.356409012, 14 ],
+  /*  669 */  [ 0.357120585, 14 ],
+  /*  670 */  [ 0.357832512, 14 ],
+  /*  671 */  [ 0.358544794, 14 ],
+
+  /*  672 */  [ 0.359257429, 14 ],
+  /*  673 */  [ 0.359970419, 14 ],
+  /*  674 */  [ 0.360683761, 14 ],
+  /*  675 */  [ 0.361397456, 14 ],
+  /*  676 */  [ 0.362111504, 14 ],
+  /*  677 */  [ 0.362825904, 14 ],
+  /*  678 */  [ 0.363540655, 14 ],
+  /*  679 */  [ 0.364255759, 14 ],
+  /*  680 */  [ 0.364971213, 14 ],
+  /*  681 */  [ 0.365687018, 14 ],
+  /*  682 */  [ 0.366403174, 14 ],
+  /*  683 */  [ 0.367119680, 14 ],
+  /*  684 */  [ 0.367836535, 14 ],
+  /*  685 */  [ 0.368553740, 14 ],
+  /*  686 */  [ 0.369271294, 14 ],
+  /*  687 */  [ 0.369989197, 14 ],
+
+  /*  688 */  [ 0.370707448, 14 ],
+  /*  689 */  [ 0.371426047, 14 ],
+  /*  690 */  [ 0.372144994, 14 ],
+  /*  691 */  [ 0.372864289, 14 ],
+  /*  692 */  [ 0.373583930, 14 ],
+  /*  693 */  [ 0.374303918, 14 ],
+  /*  694 */  [ 0.375024253, 14 ],
+  /*  695 */  [ 0.375744934, 14 ],
+  /*  696 */  [ 0.376465960, 14 ],
+  /*  697 */  [ 0.377187332, 14 ],
+  /*  698 */  [ 0.377909049, 14 ],
+  /*  699 */  [ 0.378631110, 14 ],
+  /*  700 */  [ 0.379353516, 14 ],
+  /*  701 */  [ 0.380076266, 14 ],
+  /*  702 */  [ 0.380799360, 14 ],
+  /*  703 */  [ 0.381522798, 14 ],
+
+  /*  704 */  [ 0.382246578, 14 ],
+  /*  705 */  [ 0.382970701, 14 ],
+  /*  706 */  [ 0.383695167, 14 ],
+  /*  707 */  [ 0.384419975, 14 ],
+  /*  708 */  [ 0.385145124, 14 ],
+  /*  709 */  [ 0.385870615, 14 ],
+  /*  710 */  [ 0.386596448, 14 ],
+  /*  711 */  [ 0.387322621, 14 ],
+  /*  712 */  [ 0.388049134, 14 ],
+  /*  713 */  [ 0.388775988, 14 ],
+  /*  714 */  [ 0.389503182, 14 ],
+  /*  715 */  [ 0.390230715, 14 ],
+  /*  716 */  [ 0.390958588, 14 ],
+  /*  717 */  [ 0.391686799, 14 ],
+  /*  718 */  [ 0.392415349, 14 ],
+  /*  719 */  [ 0.393144238, 14 ],
+
+  /*  720 */  [ 0.393873464, 14 ],
+  /*  721 */  [ 0.394603028, 14 ],
+  /*  722 */  [ 0.395332930, 14 ],
+  /*  723 */  [ 0.396063168, 14 ],
+  /*  724 */  [ 0.396793743, 14 ],
+  /*  725 */  [ 0.397524655, 14 ],
+  /*  726 */  [ 0.398255903, 14 ],
+  /*  727 */  [ 0.398987487, 14 ],
+  /*  728 */  [ 0.399719406, 14 ],
+  /*  729 */  [ 0.400451660, 14 ],
+  /*  730 */  [ 0.401184249, 14 ],
+  /*  731 */  [ 0.401917173, 14 ],
+  /*  732 */  [ 0.402650431, 14 ],
+  /*  733 */  [ 0.403384024, 14 ],
+  /*  734 */  [ 0.404117949, 14 ],
+  /*  735 */  [ 0.404852209, 14 ],
+
+  /*  736 */  [ 0.405586801, 14 ],
+  /*  737 */  [ 0.406321726, 14 ],
+  /*  738 */  [ 0.407056983, 14 ],
+  /*  739 */  [ 0.407792573, 14 ],
+  /*  740 */  [ 0.408528495, 14 ],
+  /*  741 */  [ 0.409264748, 14 ],
+  /*  742 */  [ 0.410001332, 14 ],
+  /*  743 */  [ 0.410738247, 14 ],
+  /*  744 */  [ 0.411475493, 14 ],
+  /*  745 */  [ 0.412213070, 14 ],
+  /*  746 */  [ 0.412950976, 14 ],
+  /*  747 */  [ 0.413689213, 14 ],
+  /*  748 */  [ 0.414427779, 14 ],
+  /*  749 */  [ 0.415166674, 14 ],
+  /*  750 */  [ 0.415905897, 14 ],
+  /*  751 */  [ 0.416645450, 14 ],
+
+  /*  752 */  [ 0.417385331, 14 ],
+  /*  753 */  [ 0.418125540, 14 ],
+  /*  754 */  [ 0.418866076, 14 ],
+  /*  755 */  [ 0.419606940, 14 ],
+  /*  756 */  [ 0.420348132, 14 ],
+  /*  757 */  [ 0.421089650, 14 ],
+  /*  758 */  [ 0.421831494, 14 ],
+  /*  759 */  [ 0.422573665, 14 ],
+  /*  760 */  [ 0.423316162, 14 ],
+  /*  761 */  [ 0.424058985, 14 ],
+  /*  762 */  [ 0.424802133, 14 ],
+  /*  763 */  [ 0.425545607, 14 ],
+  /*  764 */  [ 0.426289405, 14 ],
+  /*  765 */  [ 0.427033528, 14 ],
+  /*  766 */  [ 0.427777975, 14 ],
+  /*  767 */  [ 0.428522746, 14 ],
+
+  /*  768 */  [ 0.429267841, 14 ],
+  /*  769 */  [ 0.430013259, 14 ],
+  /*  770 */  [ 0.430759001, 14 ],
+  /*  771 */  [ 0.431505065, 14 ],
+  /*  772 */  [ 0.432251452, 14 ],
+  /*  773 */  [ 0.432998162, 14 ],
+  /*  774 */  [ 0.433745193, 14 ],
+  /*  775 */  [ 0.434492546, 14 ],
+  /*  776 */  [ 0.435240221, 14 ],
+  /*  777 */  [ 0.435988217, 14 ],
+  /*  778 */  [ 0.436736534, 14 ],
+  /*  779 */  [ 0.437485172, 14 ],
+  /*  780 */  [ 0.438234130, 14 ],
+  /*  781 */  [ 0.438983408, 14 ],
+  /*  782 */  [ 0.439733006, 14 ],
+  /*  783 */  [ 0.440482924, 14 ],
+
+  /*  784 */  [ 0.441233161, 14 ],
+  /*  785 */  [ 0.441983717, 14 ],
+  /*  786 */  [ 0.442734592, 14 ],
+  /*  787 */  [ 0.443485785, 14 ],
+  /*  788 */  [ 0.444237296, 14 ],
+  /*  789 */  [ 0.444989126, 14 ],
+  /*  790 */  [ 0.445741273, 14 ],
+  /*  791 */  [ 0.446493738, 14 ],
+  /*  792 */  [ 0.447246519, 14 ],
+  /*  793 */  [ 0.447999618, 14 ],
+  /*  794 */  [ 0.448753033, 14 ],
+  /*  795 */  [ 0.449506765, 14 ],
+  /*  796 */  [ 0.450260813, 14 ],
+  /*  797 */  [ 0.451015176, 14 ],
+  /*  798 */  [ 0.451769856, 14 ],
+  /*  799 */  [ 0.452524850, 14 ],
+
+  /*  800 */  [ 0.453280160, 14 ],
+  /*  801 */  [ 0.454035784, 14 ],
+  /*  802 */  [ 0.454791723, 14 ],
+  /*  803 */  [ 0.455547976, 14 ],
+  /*  804 */  [ 0.456304543, 14 ],
+  /*  805 */  [ 0.457061423, 14 ],
+  /*  806 */  [ 0.457818618, 14 ],
+  /*  807 */  [ 0.458576125, 14 ],
+  /*  808 */  [ 0.459333946, 14 ],
+  /*  809 */  [ 0.460092079, 14 ],
+  /*  810 */  [ 0.460850524, 14 ],
+  /*  811 */  [ 0.461609282, 14 ],
+  /*  812 */  [ 0.462368352, 14 ],
+  /*  813 */  [ 0.463127733, 14 ],
+  /*  814 */  [ 0.463887426, 14 ],
+  /*  815 */  [ 0.464647430, 14 ],
+
+  /*  816 */  [ 0.465407744, 14 ],
+  /*  817 */  [ 0.466168370, 14 ],
+  /*  818 */  [ 0.466929306, 14 ],
+  /*  819 */  [ 0.467690552, 14 ],
+  /*  820 */  [ 0.468452108, 14 ],
+  /*  821 */  [ 0.469213973, 14 ],
+  /*  822 */  [ 0.469976148, 14 ],
+  /*  823 */  [ 0.470738632, 14 ],
+  /*  824 */  [ 0.471501425, 14 ],
+  /*  825 */  [ 0.472264527, 14 ],
+  /*  826 */  [ 0.473027937, 14 ],
+  /*  827 */  [ 0.473791655, 14 ],
+  /*  828 */  [ 0.474555681, 14 ],
+  /*  829 */  [ 0.475320014, 14 ],
+  /*  830 */  [ 0.476084655, 14 ],
+  /*  831 */  [ 0.476849603, 14 ],
+
+  /*  832 */  [ 0.477614858, 14 ],
+  /*  833 */  [ 0.478380420, 14 ],
+  /*  834 */  [ 0.479146288, 14 ],
+  /*  835 */  [ 0.479912463, 14 ],
+  /*  836 */  [ 0.480678943, 14 ],
+  /*  837 */  [ 0.481445729, 14 ],
+  /*  838 */  [ 0.482212820, 14 ],
+  /*  839 */  [ 0.482980216, 14 ],
+  /*  840 */  [ 0.483747918, 14 ],
+  /*  841 */  [ 0.484515924, 14 ],
+  /*  842 */  [ 0.485284235, 14 ],
+  /*  843 */  [ 0.486052849, 14 ],
+  /*  844 */  [ 0.486821768, 14 ],
+  /*  845 */  [ 0.487590991, 14 ],
+  /*  846 */  [ 0.488360517, 14 ],
+  /*  847 */  [ 0.489130346, 14 ],
+
+  /*  848 */  [ 0.489900479, 14 ],
+  /*  849 */  [ 0.490670914, 14 ],
+  /*  850 */  [ 0.491441651, 14 ],
+  /*  851 */  [ 0.492212691, 14 ],
+  /*  852 */  [ 0.492984033, 14 ],
+  /*  853 */  [ 0.493755677, 14 ],
+  /*  854 */  [ 0.494527623, 14 ],
+  /*  855 */  [ 0.495299870, 14 ],
+  /*  856 */  [ 0.496072418, 14 ],
+  /*  857 */  [ 0.496845266, 14 ],
+  /*  858 */  [ 0.497618416, 14 ],
+  /*  859 */  [ 0.498391866, 14 ],
+  /*  860 */  [ 0.499165616, 14 ],
+  /*  861 */  [ 0.499939666, 14 ],
+  /*  862 */  [ 0.250357008, 15 ],
+  /*  863 */  [ 0.250744333, 15 ],
+
+  /*  864 */  [ 0.251131807, 15 ],
+  /*  865 */  [ 0.251519431, 15 ],
+  /*  866 */  [ 0.251907204, 15 ],
+  /*  867 */  [ 0.252295127, 15 ],
+  /*  868 */  [ 0.252683198, 15 ],
+  /*  869 */  [ 0.253071419, 15 ],
+  /*  870 */  [ 0.253459789, 15 ],
+  /*  871 */  [ 0.253848307, 15 ],
+  /*  872 */  [ 0.254236974, 15 ],
+  /*  873 */  [ 0.254625790, 15 ],
+  /*  874 */  [ 0.255014755, 15 ],
+  /*  875 */  [ 0.255403867, 15 ],
+  /*  876 */  [ 0.255793128, 15 ],
+  /*  877 */  [ 0.256182537, 15 ],
+  /*  878 */  [ 0.256572095, 15 ],
+  /*  879 */  [ 0.256961800, 15 ],
+
+  /*  880 */  [ 0.257351652, 15 ],
+  /*  881 */  [ 0.257741653, 15 ],
+  /*  882 */  [ 0.258131801, 15 ],
+  /*  883 */  [ 0.258522097, 15 ],
+  /*  884 */  [ 0.258912540, 15 ],
+  /*  885 */  [ 0.259303130, 15 ],
+  /*  886 */  [ 0.259693868, 15 ],
+  /*  887 */  [ 0.260084752, 15 ],
+  /*  888 */  [ 0.260475783, 15 ],
+  /*  889 */  [ 0.260866961, 15 ],
+  /*  890 */  [ 0.261258286, 15 ],
+  /*  891 */  [ 0.261649758, 15 ],
+  /*  892 */  [ 0.262041376, 15 ],
+  /*  893 */  [ 0.262433140, 15 ],
+  /*  894 */  [ 0.262825051, 15 ],
+  /*  895 */  [ 0.263217107, 15 ],
+
+  /*  896 */  [ 0.263609310, 15 ],
+  /*  897 */  [ 0.264001659, 15 ],
+  /*  898 */  [ 0.264394153, 15 ],
+  /*  899 */  [ 0.264786794, 15 ],
+  /*  900 */  [ 0.265179580, 15 ],
+  /*  901 */  [ 0.265572511, 15 ],
+  /*  902 */  [ 0.265965588, 15 ],
+  /*  903 */  [ 0.266358810, 15 ],
+  /*  904 */  [ 0.266752177, 15 ],
+  /*  905 */  [ 0.267145689, 15 ],
+  /*  906 */  [ 0.267539347, 15 ],
+  /*  907 */  [ 0.267933149, 15 ],
+  /*  908 */  [ 0.268327096, 15 ],
+  /*  909 */  [ 0.268721187, 15 ],
+  /*  910 */  [ 0.269115423, 15 ],
+  /*  911 */  [ 0.269509804, 15 ],
+
+  /*  912 */  [ 0.269904329, 15 ],
+  /*  913 */  [ 0.270298998, 15 ],
+  /*  914 */  [ 0.270693811, 15 ],
+  /*  915 */  [ 0.271088768, 15 ],
+  /*  916 */  [ 0.271483869, 15 ],
+  /*  917 */  [ 0.271879114, 15 ],
+  /*  918 */  [ 0.272274503, 15 ],
+  /*  919 */  [ 0.272670035, 15 ],
+  /*  920 */  [ 0.273065710, 15 ],
+  /*  921 */  [ 0.273461530, 15 ],
+  /*  922 */  [ 0.273857492, 15 ],
+  /*  923 */  [ 0.274253597, 15 ],
+  /*  924 */  [ 0.274649846, 15 ],
+  /*  925 */  [ 0.275046238, 15 ],
+  /*  926 */  [ 0.275442772, 15 ],
+  /*  927 */  [ 0.275839449, 15 ],
+
+  /*  928 */  [ 0.276236269, 15 ],
+  /*  929 */  [ 0.276633232, 15 ],
+  /*  930 */  [ 0.277030337, 15 ],
+  /*  931 */  [ 0.277427584, 15 ],
+  /*  932 */  [ 0.277824973, 15 ],
+  /*  933 */  [ 0.278222505, 15 ],
+  /*  934 */  [ 0.278620179, 15 ],
+  /*  935 */  [ 0.279017995, 15 ],
+  /*  936 */  [ 0.279415952, 15 ],
+  /*  937 */  [ 0.279814051, 15 ],
+  /*  938 */  [ 0.280212292, 15 ],
+  /*  939 */  [ 0.280610675, 15 ],
+  /*  940 */  [ 0.281009199, 15 ],
+  /*  941 */  [ 0.281407864, 15 ],
+  /*  942 */  [ 0.281806670, 15 ],
+  /*  943 */  [ 0.282205618, 15 ],
+
+  /*  944 */  [ 0.282604707, 15 ],
+  /*  945 */  [ 0.283003936, 15 ],
+  /*  946 */  [ 0.283403307, 15 ],
+  /*  947 */  [ 0.283802818, 15 ],
+  /*  948 */  [ 0.284202470, 15 ],
+  /*  949 */  [ 0.284602263, 15 ],
+  /*  950 */  [ 0.285002195, 15 ],
+  /*  951 */  [ 0.285402269, 15 ],
+  /*  952 */  [ 0.285802482, 15 ],
+  /*  953 */  [ 0.286202836, 15 ],
+  /*  954 */  [ 0.286603329, 15 ],
+  /*  955 */  [ 0.287003963, 15 ],
+  /*  956 */  [ 0.287404737, 15 ],
+  /*  957 */  [ 0.287805650, 15 ],
+  /*  958 */  [ 0.288206703, 15 ],
+  /*  959 */  [ 0.288607895, 15 ],
+
+  /*  960 */  [ 0.289009227, 15 ],
+  /*  961 */  [ 0.289410699, 15 ],
+  /*  962 */  [ 0.289812309, 15 ],
+  /*  963 */  [ 0.290214059, 15 ],
+  /*  964 */  [ 0.290615948, 15 ],
+  /*  965 */  [ 0.291017976, 15 ],
+  /*  966 */  [ 0.291420143, 15 ],
+  /*  967 */  [ 0.291822449, 15 ],
+  /*  968 */  [ 0.292224893, 15 ],
+  /*  969 */  [ 0.292627476, 15 ],
+  /*  970 */  [ 0.293030197, 15 ],
+  /*  971 */  [ 0.293433057, 15 ],
+  /*  972 */  [ 0.293836055, 15 ],
+  /*  973 */  [ 0.294239192, 15 ],
+  /*  974 */  [ 0.294642466, 15 ],
+  /*  975 */  [ 0.295045879, 15 ],
+
+  /*  976 */  [ 0.295449429, 15 ],
+  /*  977 */  [ 0.295853118, 15 ],
+  /*  978 */  [ 0.296256944, 15 ],
+  /*  979 */  [ 0.296660907, 15 ],
+  /*  980 */  [ 0.297065009, 15 ],
+  /*  981 */  [ 0.297469248, 15 ],
+  /*  982 */  [ 0.297873624, 15 ],
+  /*  983 */  [ 0.298278137, 15 ],
+  /*  984 */  [ 0.298682788, 15 ],
+  /*  985 */  [ 0.299087576, 15 ],
+  /*  986 */  [ 0.299492500, 15 ],
+  /*  987 */  [ 0.299897562, 15 ],
+  /*  988 */  [ 0.300302761, 15 ],
+  /*  989 */  [ 0.300708096, 15 ],
+  /*  990 */  [ 0.301113568, 15 ],
+  /*  991 */  [ 0.301519176, 15 ],
+
+  /*  992 */  [ 0.301924921, 15 ],
+  /*  993 */  [ 0.302330802, 15 ],
+  /*  994 */  [ 0.302736820, 15 ],
+  /*  995 */  [ 0.303142973, 15 ],
+  /*  996 */  [ 0.303549263, 15 ],
+  /*  997 */  [ 0.303955689, 15 ],
+  /*  998 */  [ 0.304362251, 15 ],
+  /*  999 */  [ 0.304768948, 15 ],
+  /* 1000 */  [ 0.305175781, 15 ],
+  /* 1001 */  [ 0.305582750, 15 ],
+  /* 1002 */  [ 0.305989854, 15 ],
+  /* 1003 */  [ 0.306397094, 15 ],
+  /* 1004 */  [ 0.306804470, 15 ],
+  /* 1005 */  [ 0.307211980, 15 ],
+  /* 1006 */  [ 0.307619626, 15 ],
+  /* 1007 */  [ 0.308027406, 15 ],
+
+  /* 1008 */  [ 0.308435322, 15 ],
+  /* 1009 */  [ 0.308843373, 15 ],
+  /* 1010 */  [ 0.309251558, 15 ],
+  /* 1011 */  [ 0.309659879, 15 ],
+  /* 1012 */  [ 0.310068333, 15 ],
+  /* 1013 */  [ 0.310476923, 15 ],
+  /* 1014 */  [ 0.310885647, 15 ],
+  /* 1015 */  [ 0.311294505, 15 ],
+  /* 1016 */  [ 0.311703498, 15 ],
+  /* 1017 */  [ 0.312112625, 15 ],
+  /* 1018 */  [ 0.312521885, 15 ],
+  /* 1019 */  [ 0.312931280, 15 ],
+  /* 1020 */  [ 0.313340809, 15 ],
+  /* 1021 */  [ 0.313750472, 15 ],
+  /* 1022 */  [ 0.314160269, 15 ],
+  /* 1023 */  [ 0.314570199, 15 ],
+
+  /* 1024 */  [ 0.314980262, 15 ],
+  /* 1025 */  [ 0.315390460, 15 ],
+  /* 1026 */  [ 0.315800790, 15 ],
+  /* 1027 */  [ 0.316211255, 15 ],
+  /* 1028 */  [ 0.316621852, 15 ],
+  /* 1029 */  [ 0.317032582, 15 ],
+  /* 1030 */  [ 0.317443446, 15 ],
+  /* 1031 */  [ 0.317854442, 15 ],
+  /* 1032 */  [ 0.318265572, 15 ],
+  /* 1033 */  [ 0.318676834, 15 ],
+  /* 1034 */  [ 0.319088229, 15 ],
+  /* 1035 */  [ 0.319499756, 15 ],
+  /* 1036 */  [ 0.319911417, 15 ],
+  /* 1037 */  [ 0.320323209, 15 ],
+  /* 1038 */  [ 0.320735134, 15 ],
+  /* 1039 */  [ 0.321147192, 15 ],
+
+  /* 1040 */  [ 0.321559381, 15 ],
+  /* 1041 */  [ 0.321971703, 15 ],
+  /* 1042 */  [ 0.322384156, 15 ],
+  /* 1043 */  [ 0.322796742, 15 ],
+  /* 1044 */  [ 0.323209460, 15 ],
+  /* 1045 */  [ 0.323622309, 15 ],
+  /* 1046 */  [ 0.324035290, 15 ],
+  /* 1047 */  [ 0.324448403, 15 ],
+  /* 1048 */  [ 0.324861647, 15 ],
+  /* 1049 */  [ 0.325275023, 15 ],
+  /* 1050 */  [ 0.325688530, 15 ],
+  /* 1051 */  [ 0.326102168, 15 ],
+  /* 1052 */  [ 0.326515938, 15 ],
+  /* 1053 */  [ 0.326929839, 15 ],
+  /* 1054 */  [ 0.327343870, 15 ],
+  /* 1055 */  [ 0.327758033, 15 ],
+
+  /* 1056 */  [ 0.328172327, 15 ],
+  /* 1057 */  [ 0.328586751, 15 ],
+  /* 1058 */  [ 0.329001306, 15 ],
+  /* 1059 */  [ 0.329415992, 15 ],
+  /* 1060 */  [ 0.329830808, 15 ],
+  /* 1061 */  [ 0.330245755, 15 ],
+  /* 1062 */  [ 0.330660832, 15 ],
+  /* 1063 */  [ 0.331076039, 15 ],
+  /* 1064 */  [ 0.331491377, 15 ],
+  /* 1065 */  [ 0.331906845, 15 ],
+  /* 1066 */  [ 0.332322443, 15 ],
+  /* 1067 */  [ 0.332738170, 15 ],
+  /* 1068 */  [ 0.333154028, 15 ],
+  /* 1069 */  [ 0.333570016, 15 ],
+  /* 1070 */  [ 0.333986133, 15 ],
+  /* 1071 */  [ 0.334402380, 15 ],
+
+  /* 1072 */  [ 0.334818756, 15 ],
+  /* 1073 */  [ 0.335235262, 15 ],
+  /* 1074 */  [ 0.335651898, 15 ],
+  /* 1075 */  [ 0.336068662, 15 ],
+  /* 1076 */  [ 0.336485556, 15 ],
+  /* 1077 */  [ 0.336902579, 15 ],
+  /* 1078 */  [ 0.337319732, 15 ],
+  /* 1079 */  [ 0.337737013, 15 ],
+  /* 1080 */  [ 0.338154423, 15 ],
+  /* 1081 */  [ 0.338571962, 15 ],
+  /* 1082 */  [ 0.338989630, 15 ],
+  /* 1083 */  [ 0.339407426, 15 ],
+  /* 1084 */  [ 0.339825351, 15 ],
+  /* 1085 */  [ 0.340243405, 15 ],
+  /* 1086 */  [ 0.340661587, 15 ],
+  /* 1087 */  [ 0.341079898, 15 ],
+
+  /* 1088 */  [ 0.341498336, 15 ],
+  /* 1089 */  [ 0.341916903, 15 ],
+  /* 1090 */  [ 0.342335598, 15 ],
+  /* 1091 */  [ 0.342754421, 15 ],
+  /* 1092 */  [ 0.343173373, 15 ],
+  /* 1093 */  [ 0.343592452, 15 ],
+  /* 1094 */  [ 0.344011659, 15 ],
+  /* 1095 */  [ 0.344430993, 15 ],
+  /* 1096 */  [ 0.344850455, 15 ],
+  /* 1097 */  [ 0.345270045, 15 ],
+  /* 1098 */  [ 0.345689763, 15 ],
+  /* 1099 */  [ 0.346109608, 15 ],
+  /* 1100 */  [ 0.346529580, 15 ],
+  /* 1101 */  [ 0.346949679, 15 ],
+  /* 1102 */  [ 0.347369906, 15 ],
+  /* 1103 */  [ 0.347790260, 15 ],
+
+  /* 1104 */  [ 0.348210741, 15 ],
+  /* 1105 */  [ 0.348631348, 15 ],
+  /* 1106 */  [ 0.349052083, 15 ],
+  /* 1107 */  [ 0.349472945, 15 ],
+  /* 1108 */  [ 0.349893933, 15 ],
+  /* 1109 */  [ 0.350315048, 15 ],
+  /* 1110 */  [ 0.350736290, 15 ],
+  /* 1111 */  [ 0.351157658, 15 ],
+  /* 1112 */  [ 0.351579152, 15 ],
+  /* 1113 */  [ 0.352000773, 15 ],
+  /* 1114 */  [ 0.352422520, 15 ],
+  /* 1115 */  [ 0.352844394, 15 ],
+  /* 1116 */  [ 0.353266393, 15 ],
+  /* 1117 */  [ 0.353688519, 15 ],
+  /* 1118 */  [ 0.354110771, 15 ],
+  /* 1119 */  [ 0.354533148, 15 ],
+
+  /* 1120 */  [ 0.354955651, 15 ],
+  /* 1121 */  [ 0.355378281, 15 ],
+  /* 1122 */  [ 0.355801035, 15 ],
+  /* 1123 */  [ 0.356223916, 15 ],
+  /* 1124 */  [ 0.356646922, 15 ],
+  /* 1125 */  [ 0.357070053, 15 ],
+  /* 1126 */  [ 0.357493310, 15 ],
+  /* 1127 */  [ 0.357916692, 15 ],
+  /* 1128 */  [ 0.358340200, 15 ],
+  /* 1129 */  [ 0.358763832, 15 ],
+  /* 1130 */  [ 0.359187590, 15 ],
+  /* 1131 */  [ 0.359611472, 15 ],
+  /* 1132 */  [ 0.360035480, 15 ],
+  /* 1133 */  [ 0.360459613, 15 ],
+  /* 1134 */  [ 0.360883870, 15 ],
+  /* 1135 */  [ 0.361308252, 15 ],
+
+  /* 1136 */  [ 0.361732758, 15 ],
+  /* 1137 */  [ 0.362157390, 15 ],
+  /* 1138 */  [ 0.362582145, 15 ],
+  /* 1139 */  [ 0.363007026, 15 ],
+  /* 1140 */  [ 0.363432030, 15 ],
+  /* 1141 */  [ 0.363857159, 15 ],
+  /* 1142 */  [ 0.364282412, 15 ],
+  /* 1143 */  [ 0.364707789, 15 ],
+  /* 1144 */  [ 0.365133291, 15 ],
+  /* 1145 */  [ 0.365558916, 15 ],
+  /* 1146 */  [ 0.365984665, 15 ],
+  /* 1147 */  [ 0.366410538, 15 ],
+  /* 1148 */  [ 0.366836535, 15 ],
+  /* 1149 */  [ 0.367262655, 15 ],
+  /* 1150 */  [ 0.367688900, 15 ],
+  /* 1151 */  [ 0.368115267, 15 ],
+
+  /* 1152 */  [ 0.368541759, 15 ],
+  /* 1153 */  [ 0.368968373, 15 ],
+  /* 1154 */  [ 0.369395111, 15 ],
+  /* 1155 */  [ 0.369821973, 15 ],
+  /* 1156 */  [ 0.370248957, 15 ],
+  /* 1157 */  [ 0.370676065, 15 ],
+  /* 1158 */  [ 0.371103295, 15 ],
+  /* 1159 */  [ 0.371530649, 15 ],
+  /* 1160 */  [ 0.371958126, 15 ],
+  /* 1161 */  [ 0.372385725, 15 ],
+  /* 1162 */  [ 0.372813448, 15 ],
+  /* 1163 */  [ 0.373241292, 15 ],
+  /* 1164 */  [ 0.373669260, 15 ],
+  /* 1165 */  [ 0.374097350, 15 ],
+  /* 1166 */  [ 0.374525563, 15 ],
+  /* 1167 */  [ 0.374953898, 15 ],
+
+  /* 1168 */  [ 0.375382356, 15 ],
+  /* 1169 */  [ 0.375810936, 15 ],
+  /* 1170 */  [ 0.376239638, 15 ],
+  /* 1171 */  [ 0.376668462, 15 ],
+  /* 1172 */  [ 0.377097408, 15 ],
+  /* 1173 */  [ 0.377526476, 15 ],
+  /* 1174 */  [ 0.377955667, 15 ],
+  /* 1175 */  [ 0.378384979, 15 ],
+  /* 1176 */  [ 0.378814413, 15 ],
+  /* 1177 */  [ 0.379243968, 15 ],
+  /* 1178 */  [ 0.379673646, 15 ],
+  /* 1179 */  [ 0.380103444, 15 ],
+  /* 1180 */  [ 0.380533365, 15 ],
+  /* 1181 */  [ 0.380963407, 15 ],
+  /* 1182 */  [ 0.381393570, 15 ],
+  /* 1183 */  [ 0.381823855, 15 ],
+
+  /* 1184 */  [ 0.382254261, 15 ],
+  /* 1185 */  [ 0.382684788, 15 ],
+  /* 1186 */  [ 0.383115436, 15 ],
+  /* 1187 */  [ 0.383546205, 15 ],
+  /* 1188 */  [ 0.383977096, 15 ],
+  /* 1189 */  [ 0.384408107, 15 ],
+  /* 1190 */  [ 0.384839239, 15 ],
+  /* 1191 */  [ 0.385270492, 15 ],
+  /* 1192 */  [ 0.385701865, 15 ],
+  /* 1193 */  [ 0.386133359, 15 ],
+  /* 1194 */  [ 0.386564974, 15 ],
+  /* 1195 */  [ 0.386996709, 15 ],
+  /* 1196 */  [ 0.387428565, 15 ],
+  /* 1197 */  [ 0.387860541, 15 ],
+  /* 1198 */  [ 0.388292637, 15 ],
+  /* 1199 */  [ 0.388724854, 15 ],
+
+  /* 1200 */  [ 0.389157191, 15 ],
+  /* 1201 */  [ 0.389589648, 15 ],
+  /* 1202 */  [ 0.390022225, 15 ],
+  /* 1203 */  [ 0.390454922, 15 ],
+  /* 1204 */  [ 0.390887739, 15 ],
+  /* 1205 */  [ 0.391320675, 15 ],
+  /* 1206 */  [ 0.391753732, 15 ],
+  /* 1207 */  [ 0.392186908, 15 ],
+  /* 1208 */  [ 0.392620204, 15 ],
+  /* 1209 */  [ 0.393053619, 15 ],
+  /* 1210 */  [ 0.393487154, 15 ],
+  /* 1211 */  [ 0.393920808, 15 ],
+  /* 1212 */  [ 0.394354582, 15 ],
+  /* 1213 */  [ 0.394788475, 15 ],
+  /* 1214 */  [ 0.395222488, 15 ],
+  /* 1215 */  [ 0.395656619, 15 ],
+
+  /* 1216 */  [ 0.396090870, 15 ],
+  /* 1217 */  [ 0.396525239, 15 ],
+  /* 1218 */  [ 0.396959728, 15 ],
+  /* 1219 */  [ 0.397394336, 15 ],
+  /* 1220 */  [ 0.397829062, 15 ],
+  /* 1221 */  [ 0.398263907, 15 ],
+  /* 1222 */  [ 0.398698871, 15 ],
+  /* 1223 */  [ 0.399133954, 15 ],
+  /* 1224 */  [ 0.399569155, 15 ],
+  /* 1225 */  [ 0.400004475, 15 ],
+  /* 1226 */  [ 0.400439913, 15 ],
+  /* 1227 */  [ 0.400875470, 15 ],
+  /* 1228 */  [ 0.401311145, 15 ],
+  /* 1229 */  [ 0.401746938, 15 ],
+  /* 1230 */  [ 0.402182850, 15 ],
+  /* 1231 */  [ 0.402618879, 15 ],
+
+  /* 1232 */  [ 0.403055027, 15 ],
+  /* 1233 */  [ 0.403491293, 15 ],
+  /* 1234 */  [ 0.403927676, 15 ],
+  /* 1235 */  [ 0.404364178, 15 ],
+  /* 1236 */  [ 0.404800797, 15 ],
+  /* 1237 */  [ 0.405237535, 15 ],
+  /* 1238 */  [ 0.405674390, 15 ],
+  /* 1239 */  [ 0.406111362, 15 ],
+  /* 1240 */  [ 0.406548452, 15 ],
+  /* 1241 */  [ 0.406985660, 15 ],
+  /* 1242 */  [ 0.407422985, 15 ],
+  /* 1243 */  [ 0.407860427, 15 ],
+  /* 1244 */  [ 0.408297987, 15 ],
+  /* 1245 */  [ 0.408735664, 15 ],
+  /* 1246 */  [ 0.409173458, 15 ],
+  /* 1247 */  [ 0.409611370, 15 ],
+
+  /* 1248 */  [ 0.410049398, 15 ],
+  /* 1249 */  [ 0.410487544, 15 ],
+  /* 1250 */  [ 0.410925806, 15 ],
+  /* 1251 */  [ 0.411364185, 15 ],
+  /* 1252 */  [ 0.411802681, 15 ],
+  /* 1253 */  [ 0.412241294, 15 ],
+  /* 1254 */  [ 0.412680024, 15 ],
+  /* 1255 */  [ 0.413118870, 15 ],
+  /* 1256 */  [ 0.413557833, 15 ],
+  /* 1257 */  [ 0.413996912, 15 ],
+  /* 1258 */  [ 0.414436108, 15 ],
+  /* 1259 */  [ 0.414875420, 15 ],
+  /* 1260 */  [ 0.415314849, 15 ],
+  /* 1261 */  [ 0.415754393, 15 ],
+  /* 1262 */  [ 0.416194054, 15 ],
+  /* 1263 */  [ 0.416633831, 15 ],
+
+  /* 1264 */  [ 0.417073724, 15 ],
+  /* 1265 */  [ 0.417513734, 15 ],
+  /* 1266 */  [ 0.417953859, 15 ],
+  /* 1267 */  [ 0.418394100, 15 ],
+  /* 1268 */  [ 0.418834457, 15 ],
+  /* 1269 */  [ 0.419274929, 15 ],
+  /* 1270 */  [ 0.419715518, 15 ],
+  /* 1271 */  [ 0.420156222, 15 ],
+  /* 1272 */  [ 0.420597041, 15 ],
+  /* 1273 */  [ 0.421037977, 15 ],
+  /* 1274 */  [ 0.421479027, 15 ],
+  /* 1275 */  [ 0.421920193, 15 ],
+  /* 1276 */  [ 0.422361475, 15 ],
+  /* 1277 */  [ 0.422802871, 15 ],
+  /* 1278 */  [ 0.423244383, 15 ],
+  /* 1279 */  [ 0.423686010, 15 ],
+
+  /* 1280 */  [ 0.424127753, 15 ],
+  /* 1281 */  [ 0.424569610, 15 ],
+  /* 1282 */  [ 0.425011582, 15 ],
+  /* 1283 */  [ 0.425453669, 15 ],
+  /* 1284 */  [ 0.425895871, 15 ],
+  /* 1285 */  [ 0.426338188, 15 ],
+  /* 1286 */  [ 0.426780620, 15 ],
+  /* 1287 */  [ 0.427223166, 15 ],
+  /* 1288 */  [ 0.427665827, 15 ],
+  /* 1289 */  [ 0.428108603, 15 ],
+  /* 1290 */  [ 0.428551493, 15 ],
+  /* 1291 */  [ 0.428994497, 15 ],
+  /* 1292 */  [ 0.429437616, 15 ],
+  /* 1293 */  [ 0.429880849, 15 ],
+  /* 1294 */  [ 0.430324197, 15 ],
+  /* 1295 */  [ 0.430767659, 15 ],
+
+  /* 1296 */  [ 0.431211234, 15 ],
+  /* 1297 */  [ 0.431654924, 15 ],
+  /* 1298 */  [ 0.432098728, 15 ],
+  /* 1299 */  [ 0.432542647, 15 ],
+  /* 1300 */  [ 0.432986678, 15 ],
+  /* 1301 */  [ 0.433430824, 15 ],
+  /* 1302 */  [ 0.433875084, 15 ],
+  /* 1303 */  [ 0.434319457, 15 ],
+  /* 1304 */  [ 0.434763944, 15 ],
+  /* 1305 */  [ 0.435208545, 15 ],
+  /* 1306 */  [ 0.435653259, 15 ],
+  /* 1307 */  [ 0.436098087, 15 ],
+  /* 1308 */  [ 0.436543029, 15 ],
+  /* 1309 */  [ 0.436988083, 15 ],
+  /* 1310 */  [ 0.437433251, 15 ],
+  /* 1311 */  [ 0.437878533, 15 ],
+
+  /* 1312 */  [ 0.438323927, 15 ],
+  /* 1313 */  [ 0.438769435, 15 ],
+  /* 1314 */  [ 0.439215056, 15 ],
+  /* 1315 */  [ 0.439660790, 15 ],
+  /* 1316 */  [ 0.440106636, 15 ],
+  /* 1317 */  [ 0.440552596, 15 ],
+  /* 1318 */  [ 0.440998669, 15 ],
+  /* 1319 */  [ 0.441444855, 15 ],
+  /* 1320 */  [ 0.441891153, 15 ],
+  /* 1321 */  [ 0.442337564, 15 ],
+  /* 1322 */  [ 0.442784088, 15 ],
+  /* 1323 */  [ 0.443230724, 15 ],
+  /* 1324 */  [ 0.443677473, 15 ],
+  /* 1325 */  [ 0.444124334, 15 ],
+  /* 1326 */  [ 0.444571308, 15 ],
+  /* 1327 */  [ 0.445018394, 15 ],
+
+  /* 1328 */  [ 0.445465593, 15 ],
+  /* 1329 */  [ 0.445912903, 15 ],
+  /* 1330 */  [ 0.446360326, 15 ],
+  /* 1331 */  [ 0.446807861, 15 ],
+  /* 1332 */  [ 0.447255509, 15 ],
+  /* 1333 */  [ 0.447703268, 15 ],
+  /* 1334 */  [ 0.448151139, 15 ],
+  /* 1335 */  [ 0.448599122, 15 ],
+  /* 1336 */  [ 0.449047217, 15 ],
+  /* 1337 */  [ 0.449495424, 15 ],
+  /* 1338 */  [ 0.449943742, 15 ],
+  /* 1339 */  [ 0.450392173, 15 ],
+  /* 1340 */  [ 0.450840715, 15 ],
+  /* 1341 */  [ 0.451289368, 15 ],
+  /* 1342 */  [ 0.451738133, 15 ],
+  /* 1343 */  [ 0.452187010, 15 ],
+
+  /* 1344 */  [ 0.452635998, 15 ],
+  /* 1345 */  [ 0.453085097, 15 ],
+  /* 1346 */  [ 0.453534308, 15 ],
+  /* 1347 */  [ 0.453983630, 15 ],
+  /* 1348 */  [ 0.454433063, 15 ],
+  /* 1349 */  [ 0.454882607, 15 ],
+  /* 1350 */  [ 0.455332262, 15 ],
+  /* 1351 */  [ 0.455782029, 15 ],
+  /* 1352 */  [ 0.456231906, 15 ],
+  /* 1353 */  [ 0.456681894, 15 ],
+  /* 1354 */  [ 0.457131993, 15 ],
+  /* 1355 */  [ 0.457582203, 15 ],
+  /* 1356 */  [ 0.458032524, 15 ],
+  /* 1357 */  [ 0.458482956, 15 ],
+  /* 1358 */  [ 0.458933498, 15 ],
+  /* 1359 */  [ 0.459384151, 15 ],
+
+  /* 1360 */  [ 0.459834914, 15 ],
+  /* 1361 */  [ 0.460285788, 15 ],
+  /* 1362 */  [ 0.460736772, 15 ],
+  /* 1363 */  [ 0.461187867, 15 ],
+  /* 1364 */  [ 0.461639071, 15 ],
+  /* 1365 */  [ 0.462090387, 15 ],
+  /* 1366 */  [ 0.462541812, 15 ],
+  /* 1367 */  [ 0.462993348, 15 ],
+  /* 1368 */  [ 0.463444993, 15 ],
+  /* 1369 */  [ 0.463896749, 15 ],
+  /* 1370 */  [ 0.464348615, 15 ],
+  /* 1371 */  [ 0.464800591, 15 ],
+  /* 1372 */  [ 0.465252676, 15 ],
+  /* 1373 */  [ 0.465704872, 15 ],
+  /* 1374 */  [ 0.466157177, 15 ],
+  /* 1375 */  [ 0.466609592, 15 ],
+
+  /* 1376 */  [ 0.467062117, 15 ],
+  /* 1377 */  [ 0.467514751, 15 ],
+  /* 1378 */  [ 0.467967495, 15 ],
+  /* 1379 */  [ 0.468420349, 15 ],
+  /* 1380 */  [ 0.468873312, 15 ],
+  /* 1381 */  [ 0.469326384, 15 ],
+  /* 1382 */  [ 0.469779566, 15 ],
+  /* 1383 */  [ 0.470232857, 15 ],
+  /* 1384 */  [ 0.470686258, 15 ],
+  /* 1385 */  [ 0.471139767, 15 ],
+  /* 1386 */  [ 0.471593386, 15 ],
+  /* 1387 */  [ 0.472047114, 15 ],
+  /* 1388 */  [ 0.472500951, 15 ],
+  /* 1389 */  [ 0.472954896, 15 ],
+  /* 1390 */  [ 0.473408951, 15 ],
+  /* 1391 */  [ 0.473863115, 15 ],
+
+  /* 1392 */  [ 0.474317388, 15 ],
+  /* 1393 */  [ 0.474771769, 15 ],
+  /* 1394 */  [ 0.475226259, 15 ],
+  /* 1395 */  [ 0.475680858, 15 ],
+  /* 1396 */  [ 0.476135565, 15 ],
+  /* 1397 */  [ 0.476590381, 15 ],
+  /* 1398 */  [ 0.477045306, 15 ],
+  /* 1399 */  [ 0.477500339, 15 ],
+  /* 1400 */  [ 0.477955481, 15 ],
+  /* 1401 */  [ 0.478410731, 15 ],
+  /* 1402 */  [ 0.478866089, 15 ],
+  /* 1403 */  [ 0.479321555, 15 ],
+  /* 1404 */  [ 0.479777130, 15 ],
+  /* 1405 */  [ 0.480232813, 15 ],
+  /* 1406 */  [ 0.480688604, 15 ],
+  /* 1407 */  [ 0.481144503, 15 ],
+
+  /* 1408 */  [ 0.481600510, 15 ],
+  /* 1409 */  [ 0.482056625, 15 ],
+  /* 1410 */  [ 0.482512848, 15 ],
+  /* 1411 */  [ 0.482969179, 15 ],
+  /* 1412 */  [ 0.483425618, 15 ],
+  /* 1413 */  [ 0.483882164, 15 ],
+  /* 1414 */  [ 0.484338818, 15 ],
+  /* 1415 */  [ 0.484795580, 15 ],
+  /* 1416 */  [ 0.485252449, 15 ],
+  /* 1417 */  [ 0.485709426, 15 ],
+  /* 1418 */  [ 0.486166511, 15 ],
+  /* 1419 */  [ 0.486623703, 15 ],
+  /* 1420 */  [ 0.487081002, 15 ],
+  /* 1421 */  [ 0.487538409, 15 ],
+  /* 1422 */  [ 0.487995923, 15 ],
+  /* 1423 */  [ 0.488453544, 15 ],
+
+  /* 1424 */  [ 0.488911273, 15 ],
+  /* 1425 */  [ 0.489369108, 15 ],
+  /* 1426 */  [ 0.489827051, 15 ],
+  /* 1427 */  [ 0.490285101, 15 ],
+  /* 1428 */  [ 0.490743258, 15 ],
+  /* 1429 */  [ 0.491201522, 15 ],
+  /* 1430 */  [ 0.491659892, 15 ],
+  /* 1431 */  [ 0.492118370, 15 ],
+  /* 1432 */  [ 0.492576954, 15 ],
+  /* 1433 */  [ 0.493035645, 15 ],
+  /* 1434 */  [ 0.493494443, 15 ],
+  /* 1435 */  [ 0.493953348, 15 ],
+  /* 1436 */  [ 0.494412359, 15 ],
+  /* 1437 */  [ 0.494871476, 15 ],
+  /* 1438 */  [ 0.495330701, 15 ],
+  /* 1439 */  [ 0.495790031, 15 ],
+
+  /* 1440 */  [ 0.496249468, 15 ],
+  /* 1441 */  [ 0.496709012, 15 ],
+  /* 1442 */  [ 0.497168662, 15 ],
+  /* 1443 */  [ 0.497628418, 15 ],
+  /* 1444 */  [ 0.498088280, 15 ],
+  /* 1445 */  [ 0.498548248, 15 ],
+  /* 1446 */  [ 0.499008323, 15 ],
+  /* 1447 */  [ 0.499468503, 15 ],
+  /* 1448 */  [ 0.499928790, 15 ],
+  /* 1449 */  [ 0.250194591, 16 ],
+  /* 1450 */  [ 0.250424840, 16 ],
+  /* 1451 */  [ 0.250655143, 16 ],
+  /* 1452 */  [ 0.250885498, 16 ],
+  /* 1453 */  [ 0.251115906, 16 ],
+  /* 1454 */  [ 0.251346367, 16 ],
+  /* 1455 */  [ 0.251576880, 16 ],
+
+  /* 1456 */  [ 0.251807447, 16 ],
+  /* 1457 */  [ 0.252038066, 16 ],
+  /* 1458 */  [ 0.252268738, 16 ],
+  /* 1459 */  [ 0.252499463, 16 ],
+  /* 1460 */  [ 0.252730240, 16 ],
+  /* 1461 */  [ 0.252961071, 16 ],
+  /* 1462 */  [ 0.253191953, 16 ],
+  /* 1463 */  [ 0.253422889, 16 ],
+  /* 1464 */  [ 0.253653877, 16 ],
+  /* 1465 */  [ 0.253884918, 16 ],
+  /* 1466 */  [ 0.254116011, 16 ],
+  /* 1467 */  [ 0.254347157, 16 ],
+  /* 1468 */  [ 0.254578356, 16 ],
+  /* 1469 */  [ 0.254809606, 16 ],
+  /* 1470 */  [ 0.255040910, 16 ],
+  /* 1471 */  [ 0.255272266, 16 ],
+
+  /* 1472 */  [ 0.255503674, 16 ],
+  /* 1473 */  [ 0.255735135, 16 ],
+  /* 1474 */  [ 0.255966648, 16 ],
+  /* 1475 */  [ 0.256198213, 16 ],
+  /* 1476 */  [ 0.256429831, 16 ],
+  /* 1477 */  [ 0.256661501, 16 ],
+  /* 1478 */  [ 0.256893223, 16 ],
+  /* 1479 */  [ 0.257124998, 16 ],
+  /* 1480 */  [ 0.257356825, 16 ],
+  /* 1481 */  [ 0.257588704, 16 ],
+  /* 1482 */  [ 0.257820635, 16 ],
+  /* 1483 */  [ 0.258052619, 16 ],
+  /* 1484 */  [ 0.258284654, 16 ],
+  /* 1485 */  [ 0.258516742, 16 ],
+  /* 1486 */  [ 0.258748882, 16 ],
+  /* 1487 */  [ 0.258981074, 16 ],
+
+  /* 1488 */  [ 0.259213318, 16 ],
+  /* 1489 */  [ 0.259445614, 16 ],
+  /* 1490 */  [ 0.259677962, 16 ],
+  /* 1491 */  [ 0.259910362, 16 ],
+  /* 1492 */  [ 0.260142814, 16 ],
+  /* 1493 */  [ 0.260375318, 16 ],
+  /* 1494 */  [ 0.260607874, 16 ],
+  /* 1495 */  [ 0.260840481, 16 ],
+  /* 1496 */  [ 0.261073141, 16 ],
+  /* 1497 */  [ 0.261305852, 16 ],
+  /* 1498 */  [ 0.261538616, 16 ],
+  /* 1499 */  [ 0.261771431, 16 ],
+  /* 1500 */  [ 0.262004297, 16 ],
+  /* 1501 */  [ 0.262237216, 16 ],
+  /* 1502 */  [ 0.262470186, 16 ],
+  /* 1503 */  [ 0.262703208, 16 ],
+
+  /* 1504 */  [ 0.262936282, 16 ],
+  /* 1505 */  [ 0.263169407, 16 ],
+  /* 1506 */  [ 0.263402584, 16 ],
+  /* 1507 */  [ 0.263635813, 16 ],
+  /* 1508 */  [ 0.263869093, 16 ],
+  /* 1509 */  [ 0.264102425, 16 ],
+  /* 1510 */  [ 0.264335808, 16 ],
+  /* 1511 */  [ 0.264569243, 16 ],
+  /* 1512 */  [ 0.264802730, 16 ],
+  /* 1513 */  [ 0.265036267, 16 ],
+  /* 1514 */  [ 0.265269857, 16 ],
+  /* 1515 */  [ 0.265503498, 16 ],
+  /* 1516 */  [ 0.265737190, 16 ],
+  /* 1517 */  [ 0.265970933, 16 ],
+  /* 1518 */  [ 0.266204728, 16 ],
+  /* 1519 */  [ 0.266438574, 16 ],
+
+  /* 1520 */  [ 0.266672472, 16 ],
+  /* 1521 */  [ 0.266906421, 16 ],
+  /* 1522 */  [ 0.267140421, 16 ],
+  /* 1523 */  [ 0.267374472, 16 ],
+  /* 1524 */  [ 0.267608575, 16 ],
+  /* 1525 */  [ 0.267842729, 16 ],
+  /* 1526 */  [ 0.268076934, 16 ],
+  /* 1527 */  [ 0.268311190, 16 ],
+  /* 1528 */  [ 0.268545497, 16 ],
+  /* 1529 */  [ 0.268779856, 16 ],
+  /* 1530 */  [ 0.269014265, 16 ],
+  /* 1531 */  [ 0.269248726, 16 ],
+  /* 1532 */  [ 0.269483238, 16 ],
+  /* 1533 */  [ 0.269717800, 16 ],
+  /* 1534 */  [ 0.269952414, 16 ],
+  /* 1535 */  [ 0.270187079, 16 ],
+
+  /* 1536 */  [ 0.270421794, 16 ],
+  /* 1537 */  [ 0.270656561, 16 ],
+  /* 1538 */  [ 0.270891379, 16 ],
+  /* 1539 */  [ 0.271126247, 16 ],
+  /* 1540 */  [ 0.271361166, 16 ],
+  /* 1541 */  [ 0.271596136, 16 ],
+  /* 1542 */  [ 0.271831157, 16 ],
+  /* 1543 */  [ 0.272066229, 16 ],
+  /* 1544 */  [ 0.272301352, 16 ],
+  /* 1545 */  [ 0.272536525, 16 ],
+  /* 1546 */  [ 0.272771749, 16 ],
+  /* 1547 */  [ 0.273007024, 16 ],
+  /* 1548 */  [ 0.273242350, 16 ],
+  /* 1549 */  [ 0.273477726, 16 ],
+  /* 1550 */  [ 0.273713153, 16 ],
+  /* 1551 */  [ 0.273948630, 16 ],
+
+  /* 1552 */  [ 0.274184158, 16 ],
+  /* 1553 */  [ 0.274419737, 16 ],
+  /* 1554 */  [ 0.274655366, 16 ],
+  /* 1555 */  [ 0.274891046, 16 ],
+  /* 1556 */  [ 0.275126776, 16 ],
+  /* 1557 */  [ 0.275362557, 16 ],
+  /* 1558 */  [ 0.275598389, 16 ],
+  /* 1559 */  [ 0.275834270, 16 ],
+  /* 1560 */  [ 0.276070203, 16 ],
+  /* 1561 */  [ 0.276306185, 16 ],
+  /* 1562 */  [ 0.276542218, 16 ],
+  /* 1563 */  [ 0.276778302, 16 ],
+  /* 1564 */  [ 0.277014435, 16 ],
+  /* 1565 */  [ 0.277250619, 16 ],
+  /* 1566 */  [ 0.277486854, 16 ],
+  /* 1567 */  [ 0.277723139, 16 ],
+
+  /* 1568 */  [ 0.277959474, 16 ],
+  /* 1569 */  [ 0.278195859, 16 ],
+  /* 1570 */  [ 0.278432294, 16 ],
+  /* 1571 */  [ 0.278668780, 16 ],
+  /* 1572 */  [ 0.278905316, 16 ],
+  /* 1573 */  [ 0.279141902, 16 ],
+  /* 1574 */  [ 0.279378538, 16 ],
+  /* 1575 */  [ 0.279615224, 16 ],
+  /* 1576 */  [ 0.279851960, 16 ],
+  /* 1577 */  [ 0.280088747, 16 ],
+  /* 1578 */  [ 0.280325583, 16 ],
+  /* 1579 */  [ 0.280562470, 16 ],
+  /* 1580 */  [ 0.280799406, 16 ],
+  /* 1581 */  [ 0.281036393, 16 ],
+  /* 1582 */  [ 0.281273429, 16 ],
+  /* 1583 */  [ 0.281510516, 16 ],
+
+  /* 1584 */  [ 0.281747652, 16 ],
+  /* 1585 */  [ 0.281984838, 16 ],
+  /* 1586 */  [ 0.282222075, 16 ],
+  /* 1587 */  [ 0.282459361, 16 ],
+  /* 1588 */  [ 0.282696697, 16 ],
+  /* 1589 */  [ 0.282934082, 16 ],
+  /* 1590 */  [ 0.283171518, 16 ],
+  /* 1591 */  [ 0.283409003, 16 ],
+  /* 1592 */  [ 0.283646538, 16 ],
+  /* 1593 */  [ 0.283884123, 16 ],
+  /* 1594 */  [ 0.284121757, 16 ],
+  /* 1595 */  [ 0.284359441, 16 ],
+  /* 1596 */  [ 0.284597175, 16 ],
+  /* 1597 */  [ 0.284834959, 16 ],
+  /* 1598 */  [ 0.285072792, 16 ],
+  /* 1599 */  [ 0.285310675, 16 ],
+
+  /* 1600 */  [ 0.285548607, 16 ],
+  /* 1601 */  [ 0.285786589, 16 ],
+  /* 1602 */  [ 0.286024621, 16 ],
+  /* 1603 */  [ 0.286262702, 16 ],
+  /* 1604 */  [ 0.286500832, 16 ],
+  /* 1605 */  [ 0.286739012, 16 ],
+  /* 1606 */  [ 0.286977242, 16 ],
+  /* 1607 */  [ 0.287215521, 16 ],
+  /* 1608 */  [ 0.287453849, 16 ],
+  /* 1609 */  [ 0.287692227, 16 ],
+  /* 1610 */  [ 0.287930654, 16 ],
+  /* 1611 */  [ 0.288169131, 16 ],
+  /* 1612 */  [ 0.288407657, 16 ],
+  /* 1613 */  [ 0.288646232, 16 ],
+  /* 1614 */  [ 0.288884857, 16 ],
+  /* 1615 */  [ 0.289123530, 16 ],
+
+  /* 1616 */  [ 0.289362253, 16 ],
+  /* 1617 */  [ 0.289601026, 16 ],
+  /* 1618 */  [ 0.289839847, 16 ],
+  /* 1619 */  [ 0.290078718, 16 ],
+  /* 1620 */  [ 0.290317638, 16 ],
+  /* 1621 */  [ 0.290556607, 16 ],
+  /* 1622 */  [ 0.290795626, 16 ],
+  /* 1623 */  [ 0.291034693, 16 ],
+  /* 1624 */  [ 0.291273810, 16 ],
+  /* 1625 */  [ 0.291512975, 16 ],
+  /* 1626 */  [ 0.291752190, 16 ],
+  /* 1627 */  [ 0.291991453, 16 ],
+  /* 1628 */  [ 0.292230766, 16 ],
+  /* 1629 */  [ 0.292470128, 16 ],
+  /* 1630 */  [ 0.292709539, 16 ],
+  /* 1631 */  [ 0.292948998, 16 ],
+
+  /* 1632 */  [ 0.293188507, 16 ],
+  /* 1633 */  [ 0.293428065, 16 ],
+  /* 1634 */  [ 0.293667671, 16 ],
+  /* 1635 */  [ 0.293907326, 16 ],
+  /* 1636 */  [ 0.294147031, 16 ],
+  /* 1637 */  [ 0.294386784, 16 ],
+  /* 1638 */  [ 0.294626585, 16 ],
+  /* 1639 */  [ 0.294866436, 16 ],
+  /* 1640 */  [ 0.295106336, 16 ],
+  /* 1641 */  [ 0.295346284, 16 ],
+  /* 1642 */  [ 0.295586281, 16 ],
+  /* 1643 */  [ 0.295826327, 16 ],
+  /* 1644 */  [ 0.296066421, 16 ],
+  /* 1645 */  [ 0.296306564, 16 ],
+  /* 1646 */  [ 0.296546756, 16 ],
+  /* 1647 */  [ 0.296786996, 16 ],
+
+  /* 1648 */  [ 0.297027285, 16 ],
+  /* 1649 */  [ 0.297267623, 16 ],
+  /* 1650 */  [ 0.297508009, 16 ],
+  /* 1651 */  [ 0.297748444, 16 ],
+  /* 1652 */  [ 0.297988927, 16 ],
+  /* 1653 */  [ 0.298229459, 16 ],
+  /* 1654 */  [ 0.298470039, 16 ],
+  /* 1655 */  [ 0.298710668, 16 ],
+  /* 1656 */  [ 0.298951346, 16 ],
+  /* 1657 */  [ 0.299192071, 16 ],
+  /* 1658 */  [ 0.299432846, 16 ],
+  /* 1659 */  [ 0.299673668, 16 ],
+  /* 1660 */  [ 0.299914539, 16 ],
+  /* 1661 */  [ 0.300155459, 16 ],
+  /* 1662 */  [ 0.300396426, 16 ],
+  /* 1663 */  [ 0.300637443, 16 ],
+
+  /* 1664 */  [ 0.300878507, 16 ],
+  /* 1665 */  [ 0.301119620, 16 ],
+  /* 1666 */  [ 0.301360781, 16 ],
+  /* 1667 */  [ 0.301601990, 16 ],
+  /* 1668 */  [ 0.301843247, 16 ],
+  /* 1669 */  [ 0.302084553, 16 ],
+  /* 1670 */  [ 0.302325907, 16 ],
+  /* 1671 */  [ 0.302567309, 16 ],
+  /* 1672 */  [ 0.302808759, 16 ],
+  /* 1673 */  [ 0.303050257, 16 ],
+  /* 1674 */  [ 0.303291804, 16 ],
+  /* 1675 */  [ 0.303533399, 16 ],
+  /* 1676 */  [ 0.303775041, 16 ],
+  /* 1677 */  [ 0.304016732, 16 ],
+  /* 1678 */  [ 0.304258471, 16 ],
+  /* 1679 */  [ 0.304500257, 16 ],
+
+  /* 1680 */  [ 0.304742092, 16 ],
+  /* 1681 */  [ 0.304983975, 16 ],
+  /* 1682 */  [ 0.305225906, 16 ],
+  /* 1683 */  [ 0.305467885, 16 ],
+  /* 1684 */  [ 0.305709911, 16 ],
+  /* 1685 */  [ 0.305951986, 16 ],
+  /* 1686 */  [ 0.306194108, 16 ],
+  /* 1687 */  [ 0.306436279, 16 ],
+  /* 1688 */  [ 0.306678497, 16 ],
+  /* 1689 */  [ 0.306920763, 16 ],
+  /* 1690 */  [ 0.307163077, 16 ],
+  /* 1691 */  [ 0.307405438, 16 ],
+  /* 1692 */  [ 0.307647848, 16 ],
+  /* 1693 */  [ 0.307890305, 16 ],
+  /* 1694 */  [ 0.308132810, 16 ],
+  /* 1695 */  [ 0.308375362, 16 ],
+
+  /* 1696 */  [ 0.308617963, 16 ],
+  /* 1697 */  [ 0.308860611, 16 ],
+  /* 1698 */  [ 0.309103306, 16 ],
+  /* 1699 */  [ 0.309346050, 16 ],
+  /* 1700 */  [ 0.309588841, 16 ],
+  /* 1701 */  [ 0.309831679, 16 ],
+  /* 1702 */  [ 0.310074565, 16 ],
+  /* 1703 */  [ 0.310317499, 16 ],
+  /* 1704 */  [ 0.310560480, 16 ],
+  /* 1705 */  [ 0.310803509, 16 ],
+  /* 1706 */  [ 0.311046586, 16 ],
+  /* 1707 */  [ 0.311289710, 16 ],
+  /* 1708 */  [ 0.311532881, 16 ],
+  /* 1709 */  [ 0.311776100, 16 ],
+  /* 1710 */  [ 0.312019366, 16 ],
+  /* 1711 */  [ 0.312262680, 16 ],
+
+  /* 1712 */  [ 0.312506041, 16 ],
+  /* 1713 */  [ 0.312749449, 16 ],
+  /* 1714 */  [ 0.312992905, 16 ],
+  /* 1715 */  [ 0.313236408, 16 ],
+  /* 1716 */  [ 0.313479959, 16 ],
+  /* 1717 */  [ 0.313723556, 16 ],
+  /* 1718 */  [ 0.313967202, 16 ],
+  /* 1719 */  [ 0.314210894, 16 ],
+  /* 1720 */  [ 0.314454634, 16 ],
+  /* 1721 */  [ 0.314698420, 16 ],
+  /* 1722 */  [ 0.314942255, 16 ],
+  /* 1723 */  [ 0.315186136, 16 ],
+  /* 1724 */  [ 0.315430064, 16 ],
+  /* 1725 */  [ 0.315674040, 16 ],
+  /* 1726 */  [ 0.315918063, 16 ],
+  /* 1727 */  [ 0.316162133, 16 ],
+
+  /* 1728 */  [ 0.316406250, 16 ],
+  /* 1729 */  [ 0.316650414, 16 ],
+  /* 1730 */  [ 0.316894625, 16 ],
+  /* 1731 */  [ 0.317138884, 16 ],
+  /* 1732 */  [ 0.317383189, 16 ],
+  /* 1733 */  [ 0.317627541, 16 ],
+  /* 1734 */  [ 0.317871941, 16 ],
+  /* 1735 */  [ 0.318116387, 16 ],
+  /* 1736 */  [ 0.318360880, 16 ],
+  /* 1737 */  [ 0.318605421, 16 ],
+  /* 1738 */  [ 0.318850008, 16 ],
+  /* 1739 */  [ 0.319094642, 16 ],
+  /* 1740 */  [ 0.319339323, 16 ],
+  /* 1741 */  [ 0.319584051, 16 ],
+  /* 1742 */  [ 0.319828826, 16 ],
+  /* 1743 */  [ 0.320073647, 16 ],
+
+  /* 1744 */  [ 0.320318516, 16 ],
+  /* 1745 */  [ 0.320563431, 16 ],
+  /* 1746 */  [ 0.320808393, 16 ],
+  /* 1747 */  [ 0.321053402, 16 ],
+  /* 1748 */  [ 0.321298457, 16 ],
+  /* 1749 */  [ 0.321543560, 16 ],
+  /* 1750 */  [ 0.321788709, 16 ],
+  /* 1751 */  [ 0.322033904, 16 ],
+  /* 1752 */  [ 0.322279147, 16 ],
+  /* 1753 */  [ 0.322524436, 16 ],
+  /* 1754 */  [ 0.322769771, 16 ],
+  /* 1755 */  [ 0.323015154, 16 ],
+  /* 1756 */  [ 0.323260583, 16 ],
+  /* 1757 */  [ 0.323506058, 16 ],
+  /* 1758 */  [ 0.323751580, 16 ],
+  /* 1759 */  [ 0.323997149, 16 ],
+
+  /* 1760 */  [ 0.324242764, 16 ],
+  /* 1761 */  [ 0.324488426, 16 ],
+  /* 1762 */  [ 0.324734134, 16 ],
+  /* 1763 */  [ 0.324979889, 16 ],
+  /* 1764 */  [ 0.325225690, 16 ],
+  /* 1765 */  [ 0.325471538, 16 ],
+  /* 1766 */  [ 0.325717432, 16 ],
+  /* 1767 */  [ 0.325963372, 16 ],
+  /* 1768 */  [ 0.326209359, 16 ],
+  /* 1769 */  [ 0.326455392, 16 ],
+  /* 1770 */  [ 0.326701472, 16 ],
+  /* 1771 */  [ 0.326947598, 16 ],
+  /* 1772 */  [ 0.327193770, 16 ],
+  /* 1773 */  [ 0.327439989, 16 ],
+  /* 1774 */  [ 0.327686254, 16 ],
+  /* 1775 */  [ 0.327932565, 16 ],
+
+  /* 1776 */  [ 0.328178922, 16 ],
+  /* 1777 */  [ 0.328425326, 16 ],
+  /* 1778 */  [ 0.328671776, 16 ],
+  /* 1779 */  [ 0.328918272, 16 ],
+  /* 1780 */  [ 0.329164814, 16 ],
+  /* 1781 */  [ 0.329411403, 16 ],
+  /* 1782 */  [ 0.329658038, 16 ],
+  /* 1783 */  [ 0.329904718, 16 ],
+  /* 1784 */  [ 0.330151445, 16 ],
+  /* 1785 */  [ 0.330398218, 16 ],
+  /* 1786 */  [ 0.330645037, 16 ],
+  /* 1787 */  [ 0.330891903, 16 ],
+  /* 1788 */  [ 0.331138814, 16 ],
+  /* 1789 */  [ 0.331385771, 16 ],
+  /* 1790 */  [ 0.331632774, 16 ],
+  /* 1791 */  [ 0.331879824, 16 ],
+
+  /* 1792 */  [ 0.332126919, 16 ],
+  /* 1793 */  [ 0.332374060, 16 ],
+  /* 1794 */  [ 0.332621247, 16 ],
+  /* 1795 */  [ 0.332868480, 16 ],
+  /* 1796 */  [ 0.333115759, 16 ],
+  /* 1797 */  [ 0.333363084, 16 ],
+  /* 1798 */  [ 0.333610455, 16 ],
+  /* 1799 */  [ 0.333857872, 16 ],
+  /* 1800 */  [ 0.334105334, 16 ],
+  /* 1801 */  [ 0.334352843, 16 ],
+  /* 1802 */  [ 0.334600397, 16 ],
+  /* 1803 */  [ 0.334847997, 16 ],
+  /* 1804 */  [ 0.335095642, 16 ],
+  /* 1805 */  [ 0.335343334, 16 ],
+  /* 1806 */  [ 0.335591071, 16 ],
+  /* 1807 */  [ 0.335838854, 16 ],
+
+  /* 1808 */  [ 0.336086683, 16 ],
+  /* 1809 */  [ 0.336334557, 16 ],
+  /* 1810 */  [ 0.336582477, 16 ],
+  /* 1811 */  [ 0.336830443, 16 ],
+  /* 1812 */  [ 0.337078454, 16 ],
+  /* 1813 */  [ 0.337326511, 16 ],
+  /* 1814 */  [ 0.337574614, 16 ],
+  /* 1815 */  [ 0.337822762, 16 ],
+  /* 1816 */  [ 0.338070956, 16 ],
+  /* 1817 */  [ 0.338319195, 16 ],
+  /* 1818 */  [ 0.338567480, 16 ],
+  /* 1819 */  [ 0.338815811, 16 ],
+  /* 1820 */  [ 0.339064186, 16 ],
+  /* 1821 */  [ 0.339312608, 16 ],
+  /* 1822 */  [ 0.339561075, 16 ],
+  /* 1823 */  [ 0.339809587, 16 ],
+
+  /* 1824 */  [ 0.340058145, 16 ],
+  /* 1825 */  [ 0.340306748, 16 ],
+  /* 1826 */  [ 0.340555397, 16 ],
+  /* 1827 */  [ 0.340804091, 16 ],
+  /* 1828 */  [ 0.341052830, 16 ],
+  /* 1829 */  [ 0.341301615, 16 ],
+  /* 1830 */  [ 0.341550445, 16 ],
+  /* 1831 */  [ 0.341799321, 16 ],
+  /* 1832 */  [ 0.342048241, 16 ],
+  /* 1833 */  [ 0.342297207, 16 ],
+  /* 1834 */  [ 0.342546219, 16 ],
+  /* 1835 */  [ 0.342795275, 16 ],
+  /* 1836 */  [ 0.343044377, 16 ],
+  /* 1837 */  [ 0.343293524, 16 ],
+  /* 1838 */  [ 0.343542717, 16 ],
+  /* 1839 */  [ 0.343791954, 16 ],
+
+  /* 1840 */  [ 0.344041237, 16 ],
+  /* 1841 */  [ 0.344290564, 16 ],
+  /* 1842 */  [ 0.344539937, 16 ],
+  /* 1843 */  [ 0.344789356, 16 ],
+  /* 1844 */  [ 0.345038819, 16 ],
+  /* 1845 */  [ 0.345288327, 16 ],
+  /* 1846 */  [ 0.345537880, 16 ],
+  /* 1847 */  [ 0.345787479, 16 ],
+  /* 1848 */  [ 0.346037122, 16 ],
+  /* 1849 */  [ 0.346286811, 16 ],
+  /* 1850 */  [ 0.346536545, 16 ],
+  /* 1851 */  [ 0.346786323, 16 ],
+  /* 1852 */  [ 0.347036147, 16 ],
+  /* 1853 */  [ 0.347286015, 16 ],
+  /* 1854 */  [ 0.347535929, 16 ],
+  /* 1855 */  [ 0.347785887, 16 ],
+
+  /* 1856 */  [ 0.348035890, 16 ],
+  /* 1857 */  [ 0.348285939, 16 ],
+  /* 1858 */  [ 0.348536032, 16 ],
+  /* 1859 */  [ 0.348786170, 16 ],
+  /* 1860 */  [ 0.349036353, 16 ],
+  /* 1861 */  [ 0.349286580, 16 ],
+  /* 1862 */  [ 0.349536853, 16 ],
+  /* 1863 */  [ 0.349787170, 16 ],
+  /* 1864 */  [ 0.350037532, 16 ],
+  /* 1865 */  [ 0.350287939, 16 ],
+  /* 1866 */  [ 0.350538391, 16 ],
+  /* 1867 */  [ 0.350788887, 16 ],
+  /* 1868 */  [ 0.351039428, 16 ],
+  /* 1869 */  [ 0.351290014, 16 ],
+  /* 1870 */  [ 0.351540645, 16 ],
+  /* 1871 */  [ 0.351791320, 16 ],
+
+  /* 1872 */  [ 0.352042040, 16 ],
+  /* 1873 */  [ 0.352292804, 16 ],
+  /* 1874 */  [ 0.352543613, 16 ],
+  /* 1875 */  [ 0.352794467, 16 ],
+  /* 1876 */  [ 0.353045365, 16 ],
+  /* 1877 */  [ 0.353296308, 16 ],
+  /* 1878 */  [ 0.353547296, 16 ],
+  /* 1879 */  [ 0.353798328, 16 ],
+  /* 1880 */  [ 0.354049405, 16 ],
+  /* 1881 */  [ 0.354300526, 16 ],
+  /* 1882 */  [ 0.354551691, 16 ],
+  /* 1883 */  [ 0.354802901, 16 ],
+  /* 1884 */  [ 0.355054156, 16 ],
+  /* 1885 */  [ 0.355305455, 16 ],
+  /* 1886 */  [ 0.355556799, 16 ],
+  /* 1887 */  [ 0.355808187, 16 ],
+
+  /* 1888 */  [ 0.356059619, 16 ],
+  /* 1889 */  [ 0.356311096, 16 ],
+  /* 1890 */  [ 0.356562617, 16 ],
+  /* 1891 */  [ 0.356814182, 16 ],
+  /* 1892 */  [ 0.357065792, 16 ],
+  /* 1893 */  [ 0.357317446, 16 ],
+  /* 1894 */  [ 0.357569145, 16 ],
+  /* 1895 */  [ 0.357820887, 16 ],
+  /* 1896 */  [ 0.358072674, 16 ],
+  /* 1897 */  [ 0.358324506, 16 ],
+  /* 1898 */  [ 0.358576381, 16 ],
+  /* 1899 */  [ 0.358828301, 16 ],
+  /* 1900 */  [ 0.359080265, 16 ],
+  /* 1901 */  [ 0.359332273, 16 ],
+  /* 1902 */  [ 0.359584326, 16 ],
+  /* 1903 */  [ 0.359836423, 16 ],
+
+  /* 1904 */  [ 0.360088563, 16 ],
+  /* 1905 */  [ 0.360340748, 16 ],
+  /* 1906 */  [ 0.360592977, 16 ],
+  /* 1907 */  [ 0.360845251, 16 ],
+  /* 1908 */  [ 0.361097568, 16 ],
+  /* 1909 */  [ 0.361349929, 16 ],
+  /* 1910 */  [ 0.361602335, 16 ],
+  /* 1911 */  [ 0.361854784, 16 ],
+  /* 1912 */  [ 0.362107278, 16 ],
+  /* 1913 */  [ 0.362359815, 16 ],
+  /* 1914 */  [ 0.362612397, 16 ],
+  /* 1915 */  [ 0.362865022, 16 ],
+  /* 1916 */  [ 0.363117692, 16 ],
+  /* 1917 */  [ 0.363370405, 16 ],
+  /* 1918 */  [ 0.363623163, 16 ],
+  /* 1919 */  [ 0.363875964, 16 ],
+
+  /* 1920 */  [ 0.364128809, 16 ],
+  /* 1921 */  [ 0.364381698, 16 ],
+  /* 1922 */  [ 0.364634632, 16 ],
+  /* 1923 */  [ 0.364887608, 16 ],
+  /* 1924 */  [ 0.365140629, 16 ],
+  /* 1925 */  [ 0.365393694, 16 ],
+  /* 1926 */  [ 0.365646802, 16 ],
+  /* 1927 */  [ 0.365899955, 16 ],
+  /* 1928 */  [ 0.366153151, 16 ],
+  /* 1929 */  [ 0.366406390, 16 ],
+  /* 1930 */  [ 0.366659674, 16 ],
+  /* 1931 */  [ 0.366913001, 16 ],
+  /* 1932 */  [ 0.367166372, 16 ],
+  /* 1933 */  [ 0.367419787, 16 ],
+  /* 1934 */  [ 0.367673246, 16 ],
+  /* 1935 */  [ 0.367926748, 16 ],
+
+  /* 1936 */  [ 0.368180294, 16 ],
+  /* 1937 */  [ 0.368433883, 16 ],
+  /* 1938 */  [ 0.368687517, 16 ],
+  /* 1939 */  [ 0.368941193, 16 ],
+  /* 1940 */  [ 0.369194914, 16 ],
+  /* 1941 */  [ 0.369448678, 16 ],
+  /* 1942 */  [ 0.369702485, 16 ],
+  /* 1943 */  [ 0.369956336, 16 ],
+  /* 1944 */  [ 0.370210231, 16 ],
+  /* 1945 */  [ 0.370464169, 16 ],
+  /* 1946 */  [ 0.370718151, 16 ],
+  /* 1947 */  [ 0.370972177, 16 ],
+  /* 1948 */  [ 0.371226245, 16 ],
+  /* 1949 */  [ 0.371480358, 16 ],
+  /* 1950 */  [ 0.371734513, 16 ],
+  /* 1951 */  [ 0.371988712, 16 ],
+
+  /* 1952 */  [ 0.372242955, 16 ],
+  /* 1953 */  [ 0.372497241, 16 ],
+  /* 1954 */  [ 0.372751570, 16 ],
+  /* 1955 */  [ 0.373005943, 16 ],
+  /* 1956 */  [ 0.373260359, 16 ],
+  /* 1957 */  [ 0.373514819, 16 ],
+  /* 1958 */  [ 0.373769322, 16 ],
+  /* 1959 */  [ 0.374023868, 16 ],
+  /* 1960 */  [ 0.374278458, 16 ],
+  /* 1961 */  [ 0.374533091, 16 ],
+  /* 1962 */  [ 0.374787767, 16 ],
+  /* 1963 */  [ 0.375042486, 16 ],
+  /* 1964 */  [ 0.375297249, 16 ],
+  /* 1965 */  [ 0.375552055, 16 ],
+  /* 1966 */  [ 0.375806904, 16 ],
+  /* 1967 */  [ 0.376061796, 16 ],
+
+  /* 1968 */  [ 0.376316732, 16 ],
+  /* 1969 */  [ 0.376571710, 16 ],
+  /* 1970 */  [ 0.376826732, 16 ],
+  /* 1971 */  [ 0.377081797, 16 ],
+  /* 1972 */  [ 0.377336905, 16 ],
+  /* 1973 */  [ 0.377592057, 16 ],
+  /* 1974 */  [ 0.377847251, 16 ],
+  /* 1975 */  [ 0.378102489, 16 ],
+  /* 1976 */  [ 0.378357769, 16 ],
+  /* 1977 */  [ 0.378613093, 16 ],
+  /* 1978 */  [ 0.378868460, 16 ],
+  /* 1979 */  [ 0.379123870, 16 ],
+  /* 1980 */  [ 0.379379322, 16 ],
+  /* 1981 */  [ 0.379634818, 16 ],
+  /* 1982 */  [ 0.379890357, 16 ],
+  /* 1983 */  [ 0.380145939, 16 ],
+
+  /* 1984 */  [ 0.380401563, 16 ],
+  /* 1985 */  [ 0.380657231, 16 ],
+  /* 1986 */  [ 0.380912942, 16 ],
+  /* 1987 */  [ 0.381168695, 16 ],
+  /* 1988 */  [ 0.381424492, 16 ],
+  /* 1989 */  [ 0.381680331, 16 ],
+  /* 1990 */  [ 0.381936213, 16 ],
+  /* 1991 */  [ 0.382192138, 16 ],
+  /* 1992 */  [ 0.382448106, 16 ],
+  /* 1993 */  [ 0.382704117, 16 ],
+  /* 1994 */  [ 0.382960171, 16 ],
+  /* 1995 */  [ 0.383216267, 16 ],
+  /* 1996 */  [ 0.383472406, 16 ],
+  /* 1997 */  [ 0.383728588, 16 ],
+  /* 1998 */  [ 0.383984813, 16 ],
+  /* 1999 */  [ 0.384241080, 16 ],
+
+  /* 2000 */  [ 0.384497391, 16 ],
+  /* 2001 */  [ 0.384753744, 16 ],
+  /* 2002 */  [ 0.385010139, 16 ],
+  /* 2003 */  [ 0.385266578, 16 ],
+  /* 2004 */  [ 0.385523059, 16 ],
+  /* 2005 */  [ 0.385779582, 16 ],
+  /* 2006 */  [ 0.386036149, 16 ],
+  /* 2007 */  [ 0.386292758, 16 ],
+  /* 2008 */  [ 0.386549409, 16 ],
+  /* 2009 */  [ 0.386806104, 16 ],
+  /* 2010 */  [ 0.387062840, 16 ],
+  /* 2011 */  [ 0.387319620, 16 ],
+  /* 2012 */  [ 0.387576442, 16 ],
+  /* 2013 */  [ 0.387833306, 16 ],
+  /* 2014 */  [ 0.388090213, 16 ],
+  /* 2015 */  [ 0.388347163, 16 ],
+
+  /* 2016 */  [ 0.388604155, 16 ],
+  /* 2017 */  [ 0.388861190, 16 ],
+  /* 2018 */  [ 0.389118267, 16 ],
+  /* 2019 */  [ 0.389375386, 16 ],
+  /* 2020 */  [ 0.389632548, 16 ],
+  /* 2021 */  [ 0.389889752, 16 ],
+  /* 2022 */  [ 0.390146999, 16 ],
+  /* 2023 */  [ 0.390404289, 16 ],
+  /* 2024 */  [ 0.390661620, 16 ],
+  /* 2025 */  [ 0.390918994, 16 ],
+  /* 2026 */  [ 0.391176411, 16 ],
+  /* 2027 */  [ 0.391433869, 16 ],
+  /* 2028 */  [ 0.391691371, 16 ],
+  /* 2029 */  [ 0.391948914, 16 ],
+  /* 2030 */  [ 0.392206500, 16 ],
+  /* 2031 */  [ 0.392464128, 16 ],
+
+  /* 2032 */  [ 0.392721798, 16 ],
+  /* 2033 */  [ 0.392979511, 16 ],
+  /* 2034 */  [ 0.393237266, 16 ],
+  /* 2035 */  [ 0.393495063, 16 ],
+  /* 2036 */  [ 0.393752902, 16 ],
+  /* 2037 */  [ 0.394010784, 16 ],
+  /* 2038 */  [ 0.394268707, 16 ],
+  /* 2039 */  [ 0.394526673, 16 ],
+  /* 2040 */  [ 0.394784681, 16 ],
+  /* 2041 */  [ 0.395042732, 16 ],
+  /* 2042 */  [ 0.395300824, 16 ],
+  /* 2043 */  [ 0.395558959, 16 ],
+  /* 2044 */  [ 0.395817135, 16 ],
+  /* 2045 */  [ 0.396075354, 16 ],
+  /* 2046 */  [ 0.396333615, 16 ],
+  /* 2047 */  [ 0.396591918, 16 ],
+
+  /* 2048 */  [ 0.396850263, 16 ],
+  /* 2049 */  [ 0.397108650, 16 ],
+  /* 2050 */  [ 0.397367079, 16 ],
+  /* 2051 */  [ 0.397625550, 16 ],
+  /* 2052 */  [ 0.397884063, 16 ],
+  /* 2053 */  [ 0.398142619, 16 ],
+  /* 2054 */  [ 0.398401216, 16 ],
+  /* 2055 */  [ 0.398659855, 16 ],
+  /* 2056 */  [ 0.398918536, 16 ],
+  /* 2057 */  [ 0.399177259, 16 ],
+  /* 2058 */  [ 0.399436024, 16 ],
+  /* 2059 */  [ 0.399694831, 16 ],
+  /* 2060 */  [ 0.399953679, 16 ],
+  /* 2061 */  [ 0.400212570, 16 ],
+  /* 2062 */  [ 0.400471503, 16 ],
+  /* 2063 */  [ 0.400730477, 16 ],
+
+  /* 2064 */  [ 0.400989493, 16 ],
+  /* 2065 */  [ 0.401248551, 16 ],
+  /* 2066 */  [ 0.401507651, 16 ],
+  /* 2067 */  [ 0.401766793, 16 ],
+  /* 2068 */  [ 0.402025976, 16 ],
+  /* 2069 */  [ 0.402285202, 16 ],
+  /* 2070 */  [ 0.402544469, 16 ],
+  /* 2071 */  [ 0.402803777, 16 ],
+  /* 2072 */  [ 0.403063128, 16 ],
+  /* 2073 */  [ 0.403322520, 16 ],
+  /* 2074 */  [ 0.403581954, 16 ],
+  /* 2075 */  [ 0.403841430, 16 ],
+  /* 2076 */  [ 0.404100947, 16 ],
+  /* 2077 */  [ 0.404360506, 16 ],
+  /* 2078 */  [ 0.404620107, 16 ],
+  /* 2079 */  [ 0.404879749, 16 ],
+
+  /* 2080 */  [ 0.405139433, 16 ],
+  /* 2081 */  [ 0.405399159, 16 ],
+  /* 2082 */  [ 0.405658926, 16 ],
+  /* 2083 */  [ 0.405918735, 16 ],
+  /* 2084 */  [ 0.406178585, 16 ],
+  /* 2085 */  [ 0.406438477, 16 ],
+  /* 2086 */  [ 0.406698410, 16 ],
+  /* 2087 */  [ 0.406958385, 16 ],
+  /* 2088 */  [ 0.407218402, 16 ],
+  /* 2089 */  [ 0.407478460, 16 ],
+  /* 2090 */  [ 0.407738559, 16 ],
+  /* 2091 */  [ 0.407998700, 16 ],
+  /* 2092 */  [ 0.408258883, 16 ],
+  /* 2093 */  [ 0.408519107, 16 ],
+  /* 2094 */  [ 0.408779372, 16 ],
+  /* 2095 */  [ 0.409039679, 16 ],
+
+  /* 2096 */  [ 0.409300027, 16 ],
+  /* 2097 */  [ 0.409560417, 16 ],
+  /* 2098 */  [ 0.409820848, 16 ],
+  /* 2099 */  [ 0.410081321, 16 ],
+  /* 2100 */  [ 0.410341834, 16 ],
+  /* 2101 */  [ 0.410602390, 16 ],
+  /* 2102 */  [ 0.410862986, 16 ],
+  /* 2103 */  [ 0.411123624, 16 ],
+  /* 2104 */  [ 0.411384303, 16 ],
+  /* 2105 */  [ 0.411645024, 16 ],
+  /* 2106 */  [ 0.411905785, 16 ],
+  /* 2107 */  [ 0.412166588, 16 ],
+  /* 2108 */  [ 0.412427433, 16 ],
+  /* 2109 */  [ 0.412688318, 16 ],
+  /* 2110 */  [ 0.412949245, 16 ],
+  /* 2111 */  [ 0.413210213, 16 ],
+
+  /* 2112 */  [ 0.413471222, 16 ],
+  /* 2113 */  [ 0.413732273, 16 ],
+  /* 2114 */  [ 0.413993364, 16 ],
+  /* 2115 */  [ 0.414254497, 16 ],
+  /* 2116 */  [ 0.414515671, 16 ],
+  /* 2117 */  [ 0.414776886, 16 ],
+  /* 2118 */  [ 0.415038142, 16 ],
+  /* 2119 */  [ 0.415299440, 16 ],
+  /* 2120 */  [ 0.415560778, 16 ],
+  /* 2121 */  [ 0.415822157, 16 ],
+  /* 2122 */  [ 0.416083578, 16 ],
+  /* 2123 */  [ 0.416345040, 16 ],
+  /* 2124 */  [ 0.416606542, 16 ],
+  /* 2125 */  [ 0.416868086, 16 ],
+  /* 2126 */  [ 0.417129671, 16 ],
+  /* 2127 */  [ 0.417391297, 16 ],
+
+  /* 2128 */  [ 0.417652964, 16 ],
+  /* 2129 */  [ 0.417914672, 16 ],
+  /* 2130 */  [ 0.418176420, 16 ],
+  /* 2131 */  [ 0.418438210, 16 ],
+  /* 2132 */  [ 0.418700041, 16 ],
+  /* 2133 */  [ 0.418961912, 16 ],
+  /* 2134 */  [ 0.419223825, 16 ],
+  /* 2135 */  [ 0.419485778, 16 ],
+  /* 2136 */  [ 0.419747773, 16 ],
+  /* 2137 */  [ 0.420009808, 16 ],
+  /* 2138 */  [ 0.420271884, 16 ],
+  /* 2139 */  [ 0.420534001, 16 ],
+  /* 2140 */  [ 0.420796159, 16 ],
+  /* 2141 */  [ 0.421058358, 16 ],
+  /* 2142 */  [ 0.421320597, 16 ],
+  /* 2143 */  [ 0.421582878, 16 ],
+
+  /* 2144 */  [ 0.421845199, 16 ],
+  /* 2145 */  [ 0.422107561, 16 ],
+  /* 2146 */  [ 0.422369964, 16 ],
+  /* 2147 */  [ 0.422632407, 16 ],
+  /* 2148 */  [ 0.422894891, 16 ],
+  /* 2149 */  [ 0.423157416, 16 ],
+  /* 2150 */  [ 0.423419982, 16 ],
+  /* 2151 */  [ 0.423682588, 16 ],
+  /* 2152 */  [ 0.423945235, 16 ],
+  /* 2153 */  [ 0.424207923, 16 ],
+  /* 2154 */  [ 0.424470652, 16 ],
+  /* 2155 */  [ 0.424733421, 16 ],
+  /* 2156 */  [ 0.424996230, 16 ],
+  /* 2157 */  [ 0.425259081, 16 ],
+  /* 2158 */  [ 0.425521972, 16 ],
+  /* 2159 */  [ 0.425784903, 16 ],
+
+  /* 2160 */  [ 0.426047876, 16 ],
+  /* 2161 */  [ 0.426310889, 16 ],
+  /* 2162 */  [ 0.426573942, 16 ],
+  /* 2163 */  [ 0.426837036, 16 ],
+  /* 2164 */  [ 0.427100170, 16 ],
+  /* 2165 */  [ 0.427363345, 16 ],
+  /* 2166 */  [ 0.427626561, 16 ],
+  /* 2167 */  [ 0.427889817, 16 ],
+  /* 2168 */  [ 0.428153114, 16 ],
+  /* 2169 */  [ 0.428416451, 16 ],
+  /* 2170 */  [ 0.428679828, 16 ],
+  /* 2171 */  [ 0.428943246, 16 ],
+  /* 2172 */  [ 0.429206704, 16 ],
+  /* 2173 */  [ 0.429470203, 16 ],
+  /* 2174 */  [ 0.429733743, 16 ],
+  /* 2175 */  [ 0.429997322, 16 ],
+
+  /* 2176 */  [ 0.430260942, 16 ],
+  /* 2177 */  [ 0.430524603, 16 ],
+  /* 2178 */  [ 0.430788304, 16 ],
+  /* 2179 */  [ 0.431052045, 16 ],
+  /* 2180 */  [ 0.431315826, 16 ],
+  /* 2181 */  [ 0.431579648, 16 ],
+  /* 2182 */  [ 0.431843511, 16 ],
+  /* 2183 */  [ 0.432107413, 16 ],
+  /* 2184 */  [ 0.432371356, 16 ],
+  /* 2185 */  [ 0.432635339, 16 ],
+  /* 2186 */  [ 0.432899362, 16 ],
+  /* 2187 */  [ 0.433163426, 16 ],
+  /* 2188 */  [ 0.433427530, 16 ],
+  /* 2189 */  [ 0.433691674, 16 ],
+  /* 2190 */  [ 0.433955859, 16 ],
+  /* 2191 */  [ 0.434220083, 16 ],
+
+  /* 2192 */  [ 0.434484348, 16 ],
+  /* 2193 */  [ 0.434748653, 16 ],
+  /* 2194 */  [ 0.435012998, 16 ],
+  /* 2195 */  [ 0.435277383, 16 ],
+  /* 2196 */  [ 0.435541809, 16 ],
+  /* 2197 */  [ 0.435806274, 16 ],
+  /* 2198 */  [ 0.436070780, 16 ],
+  /* 2199 */  [ 0.436335326, 16 ],
+  /* 2200 */  [ 0.436599912, 16 ],
+  /* 2201 */  [ 0.436864538, 16 ],
+  /* 2202 */  [ 0.437129204, 16 ],
+  /* 2203 */  [ 0.437393910, 16 ],
+  /* 2204 */  [ 0.437658657, 16 ],
+  /* 2205 */  [ 0.437923443, 16 ],
+  /* 2206 */  [ 0.438188269, 16 ],
+  /* 2207 */  [ 0.438453136, 16 ],
+
+  /* 2208 */  [ 0.438718042, 16 ],
+  /* 2209 */  [ 0.438982988, 16 ],
+  /* 2210 */  [ 0.439247975, 16 ],
+  /* 2211 */  [ 0.439513001, 16 ],
+  /* 2212 */  [ 0.439778067, 16 ],
+  /* 2213 */  [ 0.440043173, 16 ],
+  /* 2214 */  [ 0.440308320, 16 ],
+  /* 2215 */  [ 0.440573506, 16 ],
+  /* 2216 */  [ 0.440838732, 16 ],
+  /* 2217 */  [ 0.441103997, 16 ],
+  /* 2218 */  [ 0.441369303, 16 ],
+  /* 2219 */  [ 0.441634649, 16 ],
+  /* 2220 */  [ 0.441900034, 16 ],
+  /* 2221 */  [ 0.442165460, 16 ],
+  /* 2222 */  [ 0.442430925, 16 ],
+  /* 2223 */  [ 0.442696430, 16 ],
+
+  /* 2224 */  [ 0.442961975, 16 ],
+  /* 2225 */  [ 0.443227559, 16 ],
+  /* 2226 */  [ 0.443493184, 16 ],
+  /* 2227 */  [ 0.443758848, 16 ],
+  /* 2228 */  [ 0.444024552, 16 ],
+  /* 2229 */  [ 0.444290296, 16 ],
+  /* 2230 */  [ 0.444556079, 16 ],
+  /* 2231 */  [ 0.444821902, 16 ],
+  /* 2232 */  [ 0.445087765, 16 ],
+  /* 2233 */  [ 0.445353668, 16 ],
+  /* 2234 */  [ 0.445619610, 16 ],
+  /* 2235 */  [ 0.445885592, 16 ],
+  /* 2236 */  [ 0.446151614, 16 ],
+  /* 2237 */  [ 0.446417675, 16 ],
+  /* 2238 */  [ 0.446683776, 16 ],
+  /* 2239 */  [ 0.446949917, 16 ],
+
+  /* 2240 */  [ 0.447216097, 16 ],
+  /* 2241 */  [ 0.447482317, 16 ],
+  /* 2242 */  [ 0.447748576, 16 ],
+  /* 2243 */  [ 0.448014875, 16 ],
+  /* 2244 */  [ 0.448281214, 16 ],
+  /* 2245 */  [ 0.448547592, 16 ],
+  /* 2246 */  [ 0.448814010, 16 ],
+  /* 2247 */  [ 0.449080467, 16 ],
+  /* 2248 */  [ 0.449346964, 16 ],
+  /* 2249 */  [ 0.449613501, 16 ],
+  /* 2250 */  [ 0.449880076, 16 ],
+  /* 2251 */  [ 0.450146692, 16 ],
+  /* 2252 */  [ 0.450413347, 16 ],
+  /* 2253 */  [ 0.450680041, 16 ],
+  /* 2254 */  [ 0.450946775, 16 ],
+  /* 2255 */  [ 0.451213548, 16 ],
+
+  /* 2256 */  [ 0.451480360, 16 ],
+  /* 2257 */  [ 0.451747213, 16 ],
+  /* 2258 */  [ 0.452014104, 16 ],
+  /* 2259 */  [ 0.452281035, 16 ],
+  /* 2260 */  [ 0.452548005, 16 ],
+  /* 2261 */  [ 0.452815015, 16 ],
+  /* 2262 */  [ 0.453082064, 16 ],
+  /* 2263 */  [ 0.453349152, 16 ],
+  /* 2264 */  [ 0.453616280, 16 ],
+  /* 2265 */  [ 0.453883447, 16 ],
+  /* 2266 */  [ 0.454150653, 16 ],
+  /* 2267 */  [ 0.454417899, 16 ],
+  /* 2268 */  [ 0.454685184, 16 ],
+  /* 2269 */  [ 0.454952508, 16 ],
+  /* 2270 */  [ 0.455219872, 16 ],
+  /* 2271 */  [ 0.455487275, 16 ],
+
+  /* 2272 */  [ 0.455754717, 16 ],
+  /* 2273 */  [ 0.456022198, 16 ],
+  /* 2274 */  [ 0.456289719, 16 ],
+  /* 2275 */  [ 0.456557278, 16 ],
+  /* 2276 */  [ 0.456824877, 16 ],
+  /* 2277 */  [ 0.457092516, 16 ],
+  /* 2278 */  [ 0.457360193, 16 ],
+  /* 2279 */  [ 0.457627909, 16 ],
+  /* 2280 */  [ 0.457895665, 16 ],
+  /* 2281 */  [ 0.458163460, 16 ],
+  /* 2282 */  [ 0.458431294, 16 ],
+  /* 2283 */  [ 0.458699167, 16 ],
+  /* 2284 */  [ 0.458967079, 16 ],
+  /* 2285 */  [ 0.459235030, 16 ],
+  /* 2286 */  [ 0.459503021, 16 ],
+  /* 2287 */  [ 0.459771050, 16 ],
+
+  /* 2288 */  [ 0.460039119, 16 ],
+  /* 2289 */  [ 0.460307226, 16 ],
+  /* 2290 */  [ 0.460575373, 16 ],
+  /* 2291 */  [ 0.460843559, 16 ],
+  /* 2292 */  [ 0.461111783, 16 ],
+  /* 2293 */  [ 0.461380047, 16 ],
+  /* 2294 */  [ 0.461648350, 16 ],
+  /* 2295 */  [ 0.461916691, 16 ],
+  /* 2296 */  [ 0.462185072, 16 ],
+  /* 2297 */  [ 0.462453492, 16 ],
+  /* 2298 */  [ 0.462721950, 16 ],
+  /* 2299 */  [ 0.462990448, 16 ],
+  /* 2300 */  [ 0.463258984, 16 ],
+  /* 2301 */  [ 0.463527560, 16 ],
+  /* 2302 */  [ 0.463796174, 16 ],
+  /* 2303 */  [ 0.464064827, 16 ],
+
+  /* 2304 */  [ 0.464333519, 16 ],
+  /* 2305 */  [ 0.464602250, 16 ],
+  /* 2306 */  [ 0.464871020, 16 ],
+  /* 2307 */  [ 0.465139829, 16 ],
+  /* 2308 */  [ 0.465408676, 16 ],
+  /* 2309 */  [ 0.465677563, 16 ],
+  /* 2310 */  [ 0.465946488, 16 ],
+  /* 2311 */  [ 0.466215452, 16 ],
+  /* 2312 */  [ 0.466484455, 16 ],
+  /* 2313 */  [ 0.466753496, 16 ],
+  /* 2314 */  [ 0.467022577, 16 ],
+  /* 2315 */  [ 0.467291696, 16 ],
+  /* 2316 */  [ 0.467560854, 16 ],
+  /* 2317 */  [ 0.467830050, 16 ],
+  /* 2318 */  [ 0.468099285, 16 ],
+  /* 2319 */  [ 0.468368560, 16 ],
+
+  /* 2320 */  [ 0.468637872, 16 ],
+  /* 2321 */  [ 0.468907224, 16 ],
+  /* 2322 */  [ 0.469176614, 16 ],
+  /* 2323 */  [ 0.469446043, 16 ],
+  /* 2324 */  [ 0.469715510, 16 ],
+  /* 2325 */  [ 0.469985016, 16 ],
+  /* 2326 */  [ 0.470254561, 16 ],
+  /* 2327 */  [ 0.470524145, 16 ],
+  /* 2328 */  [ 0.470793767, 16 ],
+  /* 2329 */  [ 0.471063427, 16 ],
+  /* 2330 */  [ 0.471333126, 16 ],
+  /* 2331 */  [ 0.471602864, 16 ],
+  /* 2332 */  [ 0.471872641, 16 ],
+  /* 2333 */  [ 0.472142456, 16 ],
+  /* 2334 */  [ 0.472412309, 16 ],
+  /* 2335 */  [ 0.472682201, 16 ],
+
+  /* 2336 */  [ 0.472952132, 16 ],
+  /* 2337 */  [ 0.473222101, 16 ],
+  /* 2338 */  [ 0.473492108, 16 ],
+  /* 2339 */  [ 0.473762155, 16 ],
+  /* 2340 */  [ 0.474032239, 16 ],
+  /* 2341 */  [ 0.474302362, 16 ],
+  /* 2342 */  [ 0.474572524, 16 ],
+  /* 2343 */  [ 0.474842724, 16 ],
+  /* 2344 */  [ 0.475112962, 16 ],
+  /* 2345 */  [ 0.475383239, 16 ],
+  /* 2346 */  [ 0.475653554, 16 ],
+  /* 2347 */  [ 0.475923908, 16 ],
+  /* 2348 */  [ 0.476194300, 16 ],
+  /* 2349 */  [ 0.476464731, 16 ],
+  /* 2350 */  [ 0.476735200, 16 ],
+  /* 2351 */  [ 0.477005707, 16 ],
+
+  /* 2352 */  [ 0.477276252, 16 ],
+  /* 2353 */  [ 0.477546836, 16 ],
+  /* 2354 */  [ 0.477817459, 16 ],
+  /* 2355 */  [ 0.478088119, 16 ],
+  /* 2356 */  [ 0.478358818, 16 ],
+  /* 2357 */  [ 0.478629555, 16 ],
+  /* 2358 */  [ 0.478900331, 16 ],
+  /* 2359 */  [ 0.479171145, 16 ],
+  /* 2360 */  [ 0.479441997, 16 ],
+  /* 2361 */  [ 0.479712887, 16 ],
+  /* 2362 */  [ 0.479983816, 16 ],
+  /* 2363 */  [ 0.480254782, 16 ],
+  /* 2364 */  [ 0.480525787, 16 ],
+  /* 2365 */  [ 0.480796831, 16 ],
+  /* 2366 */  [ 0.481067912, 16 ],
+  /* 2367 */  [ 0.481339032, 16 ],
+
+  /* 2368 */  [ 0.481610189, 16 ],
+  /* 2369 */  [ 0.481881385, 16 ],
+  /* 2370 */  [ 0.482152620, 16 ],
+  /* 2371 */  [ 0.482423892, 16 ],
+  /* 2372 */  [ 0.482695202, 16 ],
+  /* 2373 */  [ 0.482966551, 16 ],
+  /* 2374 */  [ 0.483237938, 16 ],
+  /* 2375 */  [ 0.483509362, 16 ],
+  /* 2376 */  [ 0.483780825, 16 ],
+  /* 2377 */  [ 0.484052326, 16 ],
+  /* 2378 */  [ 0.484323865, 16 ],
+  /* 2379 */  [ 0.484595443, 16 ],
+  /* 2380 */  [ 0.484867058, 16 ],
+  /* 2381 */  [ 0.485138711, 16 ],
+  /* 2382 */  [ 0.485410402, 16 ],
+  /* 2383 */  [ 0.485682131, 16 ],
+
+  /* 2384 */  [ 0.485953899, 16 ],
+  /* 2385 */  [ 0.486225704, 16 ],
+  /* 2386 */  [ 0.486497547, 16 ],
+  /* 2387 */  [ 0.486769429, 16 ],
+  /* 2388 */  [ 0.487041348, 16 ],
+  /* 2389 */  [ 0.487313305, 16 ],
+  /* 2390 */  [ 0.487585300, 16 ],
+  /* 2391 */  [ 0.487857333, 16 ],
+  /* 2392 */  [ 0.488129404, 16 ],
+  /* 2393 */  [ 0.488401513, 16 ],
+  /* 2394 */  [ 0.488673660, 16 ],
+  /* 2395 */  [ 0.488945845, 16 ],
+  /* 2396 */  [ 0.489218067, 16 ],
+  /* 2397 */  [ 0.489490328, 16 ],
+  /* 2398 */  [ 0.489762626, 16 ],
+  /* 2399 */  [ 0.490034962, 16 ],
+
+  /* 2400 */  [ 0.490307336, 16 ],
+  /* 2401 */  [ 0.490579748, 16 ],
+  /* 2402 */  [ 0.490852198, 16 ],
+  /* 2403 */  [ 0.491124686, 16 ],
+  /* 2404 */  [ 0.491397211, 16 ],
+  /* 2405 */  [ 0.491669774, 16 ],
+  /* 2406 */  [ 0.491942375, 16 ],
+  /* 2407 */  [ 0.492215014, 16 ],
+  /* 2408 */  [ 0.492487690, 16 ],
+  /* 2409 */  [ 0.492760404, 16 ],
+  /* 2410 */  [ 0.493033156, 16 ],
+  /* 2411 */  [ 0.493305946, 16 ],
+  /* 2412 */  [ 0.493578773, 16 ],
+  /* 2413 */  [ 0.493851638, 16 ],
+  /* 2414 */  [ 0.494124541, 16 ],
+  /* 2415 */  [ 0.494397481, 16 ],
+
+  /* 2416 */  [ 0.494670459, 16 ],
+  /* 2417 */  [ 0.494943475, 16 ],
+  /* 2418 */  [ 0.495216529, 16 ],
+  /* 2419 */  [ 0.495489620, 16 ],
+  /* 2420 */  [ 0.495762748, 16 ],
+  /* 2421 */  [ 0.496035915, 16 ],
+  /* 2422 */  [ 0.496309119, 16 ],
+  /* 2423 */  [ 0.496582360, 16 ],
+  /* 2424 */  [ 0.496855639, 16 ],
+  /* 2425 */  [ 0.497128956, 16 ],
+  /* 2426 */  [ 0.497402310, 16 ],
+  /* 2427 */  [ 0.497675702, 16 ],
+  /* 2428 */  [ 0.497949132, 16 ],
+  /* 2429 */  [ 0.498222598, 16 ],
+  /* 2430 */  [ 0.498496103, 16 ],
+  /* 2431 */  [ 0.498769645, 16 ],
+
+  /* 2432 */  [ 0.499043224, 16 ],
+  /* 2433 */  [ 0.499316841, 16 ],
+  /* 2434 */  [ 0.499590496, 16 ],
+  /* 2435 */  [ 0.499864188, 16 ],
+  /* 2436 */  [ 0.250068959, 17 ],
+  /* 2437 */  [ 0.250205842, 17 ],
+  /* 2438 */  [ 0.250342744, 17 ],
+  /* 2439 */  [ 0.250479665, 17 ],
+  /* 2440 */  [ 0.250616605, 17 ],
+  /* 2441 */  [ 0.250753563, 17 ],
+  /* 2442 */  [ 0.250890540, 17 ],
+  /* 2443 */  [ 0.251027536, 17 ],
+  /* 2444 */  [ 0.251164550, 17 ],
+  /* 2445 */  [ 0.251301583, 17 ],
+  /* 2446 */  [ 0.251438635, 17 ],
+  /* 2447 */  [ 0.251575706, 17 ],
+
+  /* 2448 */  [ 0.251712795, 17 ],
+  /* 2449 */  [ 0.251849903, 17 ],
+  /* 2450 */  [ 0.251987029, 17 ],
+  /* 2451 */  [ 0.252124174, 17 ],
+  /* 2452 */  [ 0.252261338, 17 ],
+  /* 2453 */  [ 0.252398520, 17 ],
+  /* 2454 */  [ 0.252535721, 17 ],
+  /* 2455 */  [ 0.252672941, 17 ],
+  /* 2456 */  [ 0.252810180, 17 ],
+  /* 2457 */  [ 0.252947436, 17 ],
+  /* 2458 */  [ 0.253084712, 17 ],
+  /* 2459 */  [ 0.253222006, 17 ],
+  /* 2460 */  [ 0.253359319, 17 ],
+  /* 2461 */  [ 0.253496651, 17 ],
+  /* 2462 */  [ 0.253634001, 17 ],
+  /* 2463 */  [ 0.253771369, 17 ],
+
+  /* 2464 */  [ 0.253908756, 17 ],
+  /* 2465 */  [ 0.254046162, 17 ],
+  /* 2466 */  [ 0.254183587, 17 ],
+  /* 2467 */  [ 0.254321030, 17 ],
+  /* 2468 */  [ 0.254458491, 17 ],
+  /* 2469 */  [ 0.254595971, 17 ],
+  /* 2470 */  [ 0.254733470, 17 ],
+  /* 2471 */  [ 0.254870987, 17 ],
+  /* 2472 */  [ 0.255008523, 17 ],
+  /* 2473 */  [ 0.255146077, 17 ],
+  /* 2474 */  [ 0.255283650, 17 ],
+  /* 2475 */  [ 0.255421241, 17 ],
+  /* 2476 */  [ 0.255558851, 17 ],
+  /* 2477 */  [ 0.255696480, 17 ],
+  /* 2478 */  [ 0.255834127, 17 ],
+  /* 2479 */  [ 0.255971792, 17 ],
+
+  /* 2480 */  [ 0.256109476, 17 ],
+  /* 2481 */  [ 0.256247179, 17 ],
+  /* 2482 */  [ 0.256384900, 17 ],
+  /* 2483 */  [ 0.256522639, 17 ],
+  /* 2484 */  [ 0.256660397, 17 ],
+  /* 2485 */  [ 0.256798174, 17 ],
+  /* 2486 */  [ 0.256935969, 17 ],
+  /* 2487 */  [ 0.257073782, 17 ],
+  /* 2488 */  [ 0.257211614, 17 ],
+  /* 2489 */  [ 0.257349465, 17 ],
+  /* 2490 */  [ 0.257487334, 17 ],
+  /* 2491 */  [ 0.257625221, 17 ],
+  /* 2492 */  [ 0.257763127, 17 ],
+  /* 2493 */  [ 0.257901051, 17 ],
+  /* 2494 */  [ 0.258038994, 17 ],
+  /* 2495 */  [ 0.258176955, 17 ],
+
+  /* 2496 */  [ 0.258314934, 17 ],
+  /* 2497 */  [ 0.258452932, 17 ],
+  /* 2498 */  [ 0.258590948, 17 ],
+  /* 2499 */  [ 0.258728983, 17 ],
+  /* 2500 */  [ 0.258867036, 17 ],
+  /* 2501 */  [ 0.259005108, 17 ],
+  /* 2502 */  [ 0.259143198, 17 ],
+  /* 2503 */  [ 0.259281307, 17 ],
+  /* 2504 */  [ 0.259419433, 17 ],
+  /* 2505 */  [ 0.259557579, 17 ],
+  /* 2506 */  [ 0.259695742, 17 ],
+  /* 2507 */  [ 0.259833924, 17 ],
+  /* 2508 */  [ 0.259972124, 17 ],
+  /* 2509 */  [ 0.260110343, 17 ],
+  /* 2510 */  [ 0.260248580, 17 ],
+  /* 2511 */  [ 0.260386836, 17 ],
+
+  /* 2512 */  [ 0.260525110, 17 ],
+  /* 2513 */  [ 0.260663402, 17 ],
+  /* 2514 */  [ 0.260801712, 17 ],
+  /* 2515 */  [ 0.260940041, 17 ],
+  /* 2516 */  [ 0.261078388, 17 ],
+  /* 2517 */  [ 0.261216754, 17 ],
+  /* 2518 */  [ 0.261355137, 17 ],
+  /* 2519 */  [ 0.261493540, 17 ],
+  /* 2520 */  [ 0.261631960, 17 ],
+  /* 2521 */  [ 0.261770399, 17 ],
+  /* 2522 */  [ 0.261908856, 17 ],
+  /* 2523 */  [ 0.262047331, 17 ],
+  /* 2524 */  [ 0.262185825, 17 ],
+  /* 2525 */  [ 0.262324337, 17 ],
+  /* 2526 */  [ 0.262462867, 17 ],
+  /* 2527 */  [ 0.262601416, 17 ],
+
+  /* 2528 */  [ 0.262739982, 17 ],
+  /* 2529 */  [ 0.262878568, 17 ],
+  /* 2530 */  [ 0.263017171, 17 ],
+  /* 2531 */  [ 0.263155792, 17 ],
+  /* 2532 */  [ 0.263294432, 17 ],
+  /* 2533 */  [ 0.263433090, 17 ],
+  /* 2534 */  [ 0.263571767, 17 ],
+  /* 2535 */  [ 0.263710461, 17 ],
+  /* 2536 */  [ 0.263849174, 17 ],
+  /* 2537 */  [ 0.263987905, 17 ],
+  /* 2538 */  [ 0.264126655, 17 ],
+  /* 2539 */  [ 0.264265422, 17 ],
+  /* 2540 */  [ 0.264404208, 17 ],
+  /* 2541 */  [ 0.264543012, 17 ],
+  /* 2542 */  [ 0.264681834, 17 ],
+  /* 2543 */  [ 0.264820674, 17 ],
+
+  /* 2544 */  [ 0.264959533, 17 ],
+  /* 2545 */  [ 0.265098410, 17 ],
+  /* 2546 */  [ 0.265237305, 17 ],
+  /* 2547 */  [ 0.265376218, 17 ],
+  /* 2548 */  [ 0.265515149, 17 ],
+  /* 2549 */  [ 0.265654099, 17 ],
+  /* 2550 */  [ 0.265793066, 17 ],
+  /* 2551 */  [ 0.265932052, 17 ],
+  /* 2552 */  [ 0.266071056, 17 ],
+  /* 2553 */  [ 0.266210078, 17 ],
+  /* 2554 */  [ 0.266349119, 17 ],
+  /* 2555 */  [ 0.266488177, 17 ],
+  /* 2556 */  [ 0.266627254, 17 ],
+  /* 2557 */  [ 0.266766349, 17 ],
+  /* 2558 */  [ 0.266905462, 17 ],
+  /* 2559 */  [ 0.267044593, 17 ],
+
+  /* 2560 */  [ 0.267183742, 17 ],
+  /* 2561 */  [ 0.267322909, 17 ],
+  /* 2562 */  [ 0.267462094, 17 ],
+  /* 2563 */  [ 0.267601298, 17 ],
+  /* 2564 */  [ 0.267740519, 17 ],
+  /* 2565 */  [ 0.267879759, 17 ],
+  /* 2566 */  [ 0.268019017, 17 ],
+  /* 2567 */  [ 0.268158293, 17 ],
+  /* 2568 */  [ 0.268297587, 17 ],
+  /* 2569 */  [ 0.268436899, 17 ],
+  /* 2570 */  [ 0.268576229, 17 ],
+  /* 2571 */  [ 0.268715577, 17 ],
+  /* 2572 */  [ 0.268854943, 17 ],
+  /* 2573 */  [ 0.268994328, 17 ],
+  /* 2574 */  [ 0.269133730, 17 ],
+  /* 2575 */  [ 0.269273150, 17 ],
+
+  /* 2576 */  [ 0.269412589, 17 ],
+  /* 2577 */  [ 0.269552045, 17 ],
+  /* 2578 */  [ 0.269691520, 17 ],
+  /* 2579 */  [ 0.269831013, 17 ],
+  /* 2580 */  [ 0.269970523, 17 ],
+  /* 2581 */  [ 0.270110052, 17 ],
+  /* 2582 */  [ 0.270249599, 17 ],
+  /* 2583 */  [ 0.270389163, 17 ],
+  /* 2584 */  [ 0.270528746, 17 ],
+  /* 2585 */  [ 0.270668347, 17 ],
+  /* 2586 */  [ 0.270807965, 17 ],
+  /* 2587 */  [ 0.270947602, 17 ],
+  /* 2588 */  [ 0.271087257, 17 ],
+  /* 2589 */  [ 0.271226930, 17 ],
+  /* 2590 */  [ 0.271366620, 17 ],
+  /* 2591 */  [ 0.271506329, 17 ],
+
+  /* 2592 */  [ 0.271646056, 17 ],
+  /* 2593 */  [ 0.271785800, 17 ],
+  /* 2594 */  [ 0.271925563, 17 ],
+  /* 2595 */  [ 0.272065343, 17 ],
+  /* 2596 */  [ 0.272205142, 17 ],
+  /* 2597 */  [ 0.272344958, 17 ],
+  /* 2598 */  [ 0.272484793, 17 ],
+  /* 2599 */  [ 0.272624645, 17 ],
+  /* 2600 */  [ 0.272764515, 17 ],
+  /* 2601 */  [ 0.272904403, 17 ],
+  /* 2602 */  [ 0.273044310, 17 ],
+  /* 2603 */  [ 0.273184234, 17 ],
+  /* 2604 */  [ 0.273324176, 17 ],
+  /* 2605 */  [ 0.273464136, 17 ],
+  /* 2606 */  [ 0.273604113, 17 ],
+  /* 2607 */  [ 0.273744109, 17 ],
+
+  /* 2608 */  [ 0.273884123, 17 ],
+  /* 2609 */  [ 0.274024154, 17 ],
+  /* 2610 */  [ 0.274164204, 17 ],
+  /* 2611 */  [ 0.274304271, 17 ],
+  /* 2612 */  [ 0.274444356, 17 ],
+  /* 2613 */  [ 0.274584459, 17 ],
+  /* 2614 */  [ 0.274724580, 17 ],
+  /* 2615 */  [ 0.274864719, 17 ],
+  /* 2616 */  [ 0.275004875, 17 ],
+  /* 2617 */  [ 0.275145050, 17 ],
+  /* 2618 */  [ 0.275285242, 17 ],
+  /* 2619 */  [ 0.275425452, 17 ],
+  /* 2620 */  [ 0.275565681, 17 ],
+  /* 2621 */  [ 0.275705926, 17 ],
+  /* 2622 */  [ 0.275846190, 17 ],
+  /* 2623 */  [ 0.275986472, 17 ],
+
+  /* 2624 */  [ 0.276126771, 17 ],
+  /* 2625 */  [ 0.276267088, 17 ],
+  /* 2626 */  [ 0.276407423, 17 ],
+  /* 2627 */  [ 0.276547776, 17 ],
+  /* 2628 */  [ 0.276688147, 17 ],
+  /* 2629 */  [ 0.276828535, 17 ],
+  /* 2630 */  [ 0.276968942, 17 ],
+  /* 2631 */  [ 0.277109366, 17 ],
+  /* 2632 */  [ 0.277249808, 17 ],
+  /* 2633 */  [ 0.277390267, 17 ],
+  /* 2634 */  [ 0.277530745, 17 ],
+  /* 2635 */  [ 0.277671240, 17 ],
+  /* 2636 */  [ 0.277811753, 17 ],
+  /* 2637 */  [ 0.277952284, 17 ],
+  /* 2638 */  [ 0.278092832, 17 ],
+  /* 2639 */  [ 0.278233399, 17 ],
+
+  /* 2640 */  [ 0.278373983, 17 ],
+  /* 2641 */  [ 0.278514584, 17 ],
+  /* 2642 */  [ 0.278655204, 17 ],
+  /* 2643 */  [ 0.278795841, 17 ],
+  /* 2644 */  [ 0.278936496, 17 ],
+  /* 2645 */  [ 0.279077169, 17 ],
+  /* 2646 */  [ 0.279217860, 17 ],
+  /* 2647 */  [ 0.279358568, 17 ],
+  /* 2648 */  [ 0.279499294, 17 ],
+  /* 2649 */  [ 0.279640037, 17 ],
+  /* 2650 */  [ 0.279780799, 17 ],
+  /* 2651 */  [ 0.279921578, 17 ],
+  /* 2652 */  [ 0.280062375, 17 ],
+  /* 2653 */  [ 0.280203189, 17 ],
+  /* 2654 */  [ 0.280344021, 17 ],
+  /* 2655 */  [ 0.280484871, 17 ],
+
+  /* 2656 */  [ 0.280625739, 17 ],
+  /* 2657 */  [ 0.280766624, 17 ],
+  /* 2658 */  [ 0.280907527, 17 ],
+  /* 2659 */  [ 0.281048447, 17 ],
+  /* 2660 */  [ 0.281189385, 17 ],
+  /* 2661 */  [ 0.281330341, 17 ],
+  /* 2662 */  [ 0.281471315, 17 ],
+  /* 2663 */  [ 0.281612306, 17 ],
+  /* 2664 */  [ 0.281753315, 17 ],
+  /* 2665 */  [ 0.281894341, 17 ],
+  /* 2666 */  [ 0.282035386, 17 ],
+  /* 2667 */  [ 0.282176447, 17 ],
+  /* 2668 */  [ 0.282317527, 17 ],
+  /* 2669 */  [ 0.282458624, 17 ],
+  /* 2670 */  [ 0.282599738, 17 ],
+  /* 2671 */  [ 0.282740871, 17 ],
+
+  /* 2672 */  [ 0.282882021, 17 ],
+  /* 2673 */  [ 0.283023188, 17 ],
+  /* 2674 */  [ 0.283164373, 17 ],
+  /* 2675 */  [ 0.283305576, 17 ],
+  /* 2676 */  [ 0.283446796, 17 ],
+  /* 2677 */  [ 0.283588034, 17 ],
+  /* 2678 */  [ 0.283729290, 17 ],
+  /* 2679 */  [ 0.283870563, 17 ],
+  /* 2680 */  [ 0.284011853, 17 ],
+  /* 2681 */  [ 0.284153161, 17 ],
+  /* 2682 */  [ 0.284294487, 17 ],
+  /* 2683 */  [ 0.284435831, 17 ],
+  /* 2684 */  [ 0.284577192, 17 ],
+  /* 2685 */  [ 0.284718570, 17 ],
+  /* 2686 */  [ 0.284859966, 17 ],
+  /* 2687 */  [ 0.285001380, 17 ],
+
+  /* 2688 */  [ 0.285142811, 17 ],
+  /* 2689 */  [ 0.285284259, 17 ],
+  /* 2690 */  [ 0.285425726, 17 ],
+  /* 2691 */  [ 0.285567209, 17 ],
+  /* 2692 */  [ 0.285708711, 17 ],
+  /* 2693 */  [ 0.285850229, 17 ],
+  /* 2694 */  [ 0.285991766, 17 ],
+  /* 2695 */  [ 0.286133319, 17 ],
+  /* 2696 */  [ 0.286274891, 17 ],
+  /* 2697 */  [ 0.286416480, 17 ],
+  /* 2698 */  [ 0.286558086, 17 ],
+  /* 2699 */  [ 0.286699710, 17 ],
+  /* 2700 */  [ 0.286841351, 17 ],
+  /* 2701 */  [ 0.286983010, 17 ],
+  /* 2702 */  [ 0.287124686, 17 ],
+  /* 2703 */  [ 0.287266380, 17 ],
+
+  /* 2704 */  [ 0.287408091, 17 ],
+  /* 2705 */  [ 0.287549820, 17 ],
+  /* 2706 */  [ 0.287691566, 17 ],
+  /* 2707 */  [ 0.287833330, 17 ],
+  /* 2708 */  [ 0.287975111, 17 ],
+  /* 2709 */  [ 0.288116909, 17 ],
+  /* 2710 */  [ 0.288258725, 17 ],
+  /* 2711 */  [ 0.288400559, 17 ],
+  /* 2712 */  [ 0.288542409, 17 ],
+  /* 2713 */  [ 0.288684278, 17 ],
+  /* 2714 */  [ 0.288826163, 17 ],
+  /* 2715 */  [ 0.288968067, 17 ],
+  /* 2716 */  [ 0.289109987, 17 ],
+  /* 2717 */  [ 0.289251925, 17 ],
+  /* 2718 */  [ 0.289393881, 17 ],
+  /* 2719 */  [ 0.289535854, 17 ],
+
+  /* 2720 */  [ 0.289677844, 17 ],
+  /* 2721 */  [ 0.289819851, 17 ],
+  /* 2722 */  [ 0.289961876, 17 ],
+  /* 2723 */  [ 0.290103919, 17 ],
+  /* 2724 */  [ 0.290245979, 17 ],
+  /* 2725 */  [ 0.290388056, 17 ],
+  /* 2726 */  [ 0.290530150, 17 ],
+  /* 2727 */  [ 0.290672262, 17 ],
+  /* 2728 */  [ 0.290814392, 17 ],
+  /* 2729 */  [ 0.290956538, 17 ],
+  /* 2730 */  [ 0.291098703, 17 ],
+  /* 2731 */  [ 0.291240884, 17 ],
+  /* 2732 */  [ 0.291383083, 17 ],
+  /* 2733 */  [ 0.291525299, 17 ],
+  /* 2734 */  [ 0.291667532, 17 ],
+  /* 2735 */  [ 0.291809783, 17 ],
+
+  /* 2736 */  [ 0.291952051, 17 ],
+  /* 2737 */  [ 0.292094337, 17 ],
+  /* 2738 */  [ 0.292236640, 17 ],
+  /* 2739 */  [ 0.292378960, 17 ],
+  /* 2740 */  [ 0.292521297, 17 ],
+  /* 2741 */  [ 0.292663652, 17 ],
+  /* 2742 */  [ 0.292806024, 17 ],
+  /* 2743 */  [ 0.292948414, 17 ],
+  /* 2744 */  [ 0.293090820, 17 ],
+  /* 2745 */  [ 0.293233244, 17 ],
+  /* 2746 */  [ 0.293375686, 17 ],
+  /* 2747 */  [ 0.293518144, 17 ],
+  /* 2748 */  [ 0.293660620, 17 ],
+  /* 2749 */  [ 0.293803113, 17 ],
+  /* 2750 */  [ 0.293945624, 17 ],
+  /* 2751 */  [ 0.294088151, 17 ],
+
+  /* 2752 */  [ 0.294230696, 17 ],
+  /* 2753 */  [ 0.294373259, 17 ],
+  /* 2754 */  [ 0.294515838, 17 ],
+  /* 2755 */  [ 0.294658435, 17 ],
+  /* 2756 */  [ 0.294801049, 17 ],
+  /* 2757 */  [ 0.294943680, 17 ],
+  /* 2758 */  [ 0.295086329, 17 ],
+  /* 2759 */  [ 0.295228995, 17 ],
+  /* 2760 */  [ 0.295371678, 17 ],
+  /* 2761 */  [ 0.295514378, 17 ],
+  /* 2762 */  [ 0.295657095, 17 ],
+  /* 2763 */  [ 0.295799830, 17 ],
+  /* 2764 */  [ 0.295942582, 17 ],
+  /* 2765 */  [ 0.296085351, 17 ],
+  /* 2766 */  [ 0.296228138, 17 ],
+  /* 2767 */  [ 0.296370941, 17 ],
+
+  /* 2768 */  [ 0.296513762, 17 ],
+  /* 2769 */  [ 0.296656600, 17 ],
+  /* 2770 */  [ 0.296799455, 17 ],
+  /* 2771 */  [ 0.296942327, 17 ],
+  /* 2772 */  [ 0.297085217, 17 ],
+  /* 2773 */  [ 0.297228124, 17 ],
+  /* 2774 */  [ 0.297371048, 17 ],
+  /* 2775 */  [ 0.297513989, 17 ],
+  /* 2776 */  [ 0.297656947, 17 ],
+  /* 2777 */  [ 0.297799922, 17 ],
+  /* 2778 */  [ 0.297942915, 17 ],
+  /* 2779 */  [ 0.298085925, 17 ],
+  /* 2780 */  [ 0.298228951, 17 ],
+  /* 2781 */  [ 0.298371996, 17 ],
+  /* 2782 */  [ 0.298515057, 17 ],
+  /* 2783 */  [ 0.298658135, 17 ],
+
+  /* 2784 */  [ 0.298801231, 17 ],
+  /* 2785 */  [ 0.298944343, 17 ],
+  /* 2786 */  [ 0.299087473, 17 ],
+  /* 2787 */  [ 0.299230620, 17 ],
+  /* 2788 */  [ 0.299373784, 17 ],
+  /* 2789 */  [ 0.299516965, 17 ],
+  /* 2790 */  [ 0.299660163, 17 ],
+  /* 2791 */  [ 0.299803378, 17 ],
+  /* 2792 */  [ 0.299946611, 17 ],
+  /* 2793 */  [ 0.300089860, 17 ],
+  /* 2794 */  [ 0.300233127, 17 ],
+  /* 2795 */  [ 0.300376411, 17 ],
+  /* 2796 */  [ 0.300519711, 17 ],
+  /* 2797 */  [ 0.300663029, 17 ],
+  /* 2798 */  [ 0.300806364, 17 ],
+  /* 2799 */  [ 0.300949716, 17 ],
+
+  /* 2800 */  [ 0.301093085, 17 ],
+  /* 2801 */  [ 0.301236472, 17 ],
+  /* 2802 */  [ 0.301379875, 17 ],
+  /* 2803 */  [ 0.301523295, 17 ],
+  /* 2804 */  [ 0.301666733, 17 ],
+  /* 2805 */  [ 0.301810187, 17 ],
+  /* 2806 */  [ 0.301953659, 17 ],
+  /* 2807 */  [ 0.302097147, 17 ],
+  /* 2808 */  [ 0.302240653, 17 ],
+  /* 2809 */  [ 0.302384175, 17 ],
+  /* 2810 */  [ 0.302527715, 17 ],
+  /* 2811 */  [ 0.302671271, 17 ],
+  /* 2812 */  [ 0.302814845, 17 ],
+  /* 2813 */  [ 0.302958436, 17 ],
+  /* 2814 */  [ 0.303102044, 17 ],
+  /* 2815 */  [ 0.303245668, 17 ],
+
+  /* 2816 */  [ 0.303389310, 17 ],
+  /* 2817 */  [ 0.303532969, 17 ],
+  /* 2818 */  [ 0.303676645, 17 ],
+  /* 2819 */  [ 0.303820337, 17 ],
+  /* 2820 */  [ 0.303964047, 17 ],
+  /* 2821 */  [ 0.304107774, 17 ],
+  /* 2822 */  [ 0.304251517, 17 ],
+  /* 2823 */  [ 0.304395278, 17 ],
+  /* 2824 */  [ 0.304539056, 17 ],
+  /* 2825 */  [ 0.304682850, 17 ],
+  /* 2826 */  [ 0.304826662, 17 ],
+  /* 2827 */  [ 0.304970491, 17 ],
+  /* 2828 */  [ 0.305114336, 17 ],
+  /* 2829 */  [ 0.305258199, 17 ],
+  /* 2830 */  [ 0.305402078, 17 ],
+  /* 2831 */  [ 0.305545974, 17 ],
+
+  /* 2832 */  [ 0.305689888, 17 ],
+  /* 2833 */  [ 0.305833818, 17 ],
+  /* 2834 */  [ 0.305977765, 17 ],
+  /* 2835 */  [ 0.306121729, 17 ],
+  /* 2836 */  [ 0.306265710, 17 ],
+  /* 2837 */  [ 0.306409708, 17 ],
+  /* 2838 */  [ 0.306553723, 17 ],
+  /* 2839 */  [ 0.306697755, 17 ],
+  /* 2840 */  [ 0.306841804, 17 ],
+  /* 2841 */  [ 0.306985869, 17 ],
+  /* 2842 */  [ 0.307129952, 17 ],
+  /* 2843 */  [ 0.307274051, 17 ],
+  /* 2844 */  [ 0.307418168, 17 ],
+  /* 2845 */  [ 0.307562301, 17 ],
+  /* 2846 */  [ 0.307706451, 17 ],
+  /* 2847 */  [ 0.307850618, 17 ],
+
+  /* 2848 */  [ 0.307994802, 17 ],
+  /* 2849 */  [ 0.308139003, 17 ],
+  /* 2850 */  [ 0.308283220, 17 ],
+  /* 2851 */  [ 0.308427455, 17 ],
+  /* 2852 */  [ 0.308571706, 17 ],
+  /* 2853 */  [ 0.308715974, 17 ],
+  /* 2854 */  [ 0.308860260, 17 ],
+  /* 2855 */  [ 0.309004561, 17 ],
+  /* 2856 */  [ 0.309148880, 17 ],
+  /* 2857 */  [ 0.309293216, 17 ],
+  /* 2858 */  [ 0.309437568, 17 ],
+  /* 2859 */  [ 0.309581938, 17 ],
+  /* 2860 */  [ 0.309726324, 17 ],
+  /* 2861 */  [ 0.309870727, 17 ],
+  /* 2862 */  [ 0.310015147, 17 ],
+  /* 2863 */  [ 0.310159583, 17 ],
+
+  /* 2864 */  [ 0.310304037, 17 ],
+  /* 2865 */  [ 0.310448507, 17 ],
+  /* 2866 */  [ 0.310592994, 17 ],
+  /* 2867 */  [ 0.310737498, 17 ],
+  /* 2868 */  [ 0.310882018, 17 ],
+  /* 2869 */  [ 0.311026556, 17 ],
+  /* 2870 */  [ 0.311171110, 17 ],
+  /* 2871 */  [ 0.311315681, 17 ],
+  /* 2872 */  [ 0.311460269, 17 ],
+  /* 2873 */  [ 0.311604874, 17 ],
+  /* 2874 */  [ 0.311749495, 17 ],
+  /* 2875 */  [ 0.311894133, 17 ],
+  /* 2876 */  [ 0.312038788, 17 ],
+  /* 2877 */  [ 0.312183460, 17 ],
+  /* 2878 */  [ 0.312328148, 17 ],
+  /* 2879 */  [ 0.312472854, 17 ],
+
+  /* 2880 */  [ 0.312617576, 17 ],
+  /* 2881 */  [ 0.312762314, 17 ],
+  /* 2882 */  [ 0.312907070, 17 ],
+  /* 2883 */  [ 0.313051842, 17 ],
+  /* 2884 */  [ 0.313196631, 17 ],
+  /* 2885 */  [ 0.313341437, 17 ],
+  /* 2886 */  [ 0.313486259, 17 ],
+  /* 2887 */  [ 0.313631098, 17 ],
+  /* 2888 */  [ 0.313775954, 17 ],
+  /* 2889 */  [ 0.313920827, 17 ],
+  /* 2890 */  [ 0.314065716, 17 ],
+  /* 2891 */  [ 0.314210622, 17 ],
+  /* 2892 */  [ 0.314355545, 17 ],
+  /* 2893 */  [ 0.314500484, 17 ],
+  /* 2894 */  [ 0.314645440, 17 ],
+  /* 2895 */  [ 0.314790413, 17 ],
+
+  /* 2896 */  [ 0.314935403, 17 ],
+  /* 2897 */  [ 0.315080409, 17 ],
+  /* 2898 */  [ 0.315225432, 17 ],
+  /* 2899 */  [ 0.315370472, 17 ],
+  /* 2900 */  [ 0.315515528, 17 ],
+  /* 2901 */  [ 0.315660601, 17 ],
+  /* 2902 */  [ 0.315805690, 17 ],
+  /* 2903 */  [ 0.315950797, 17 ],
+  /* 2904 */  [ 0.316095920, 17 ],
+  /* 2905 */  [ 0.316241059, 17 ],
+  /* 2906 */  [ 0.316386216, 17 ],
+  /* 2907 */  [ 0.316531388, 17 ],
+  /* 2908 */  [ 0.316676578, 17 ],
+  /* 2909 */  [ 0.316821784, 17 ],
+  /* 2910 */  [ 0.316967007, 17 ],
+  /* 2911 */  [ 0.317112247, 17 ],
+
+  /* 2912 */  [ 0.317257503, 17 ],
+  /* 2913 */  [ 0.317402775, 17 ],
+  /* 2914 */  [ 0.317548065, 17 ],
+  /* 2915 */  [ 0.317693371, 17 ],
+  /* 2916 */  [ 0.317838693, 17 ],
+  /* 2917 */  [ 0.317984033, 17 ],
+  /* 2918 */  [ 0.318129388, 17 ],
+  /* 2919 */  [ 0.318274761, 17 ],
+  /* 2920 */  [ 0.318420150, 17 ],
+  /* 2921 */  [ 0.318565555, 17 ],
+  /* 2922 */  [ 0.318710978, 17 ],
+  /* 2923 */  [ 0.318856416, 17 ],
+  /* 2924 */  [ 0.319001872, 17 ],
+  /* 2925 */  [ 0.319147344, 17 ],
+  /* 2926 */  [ 0.319292832, 17 ],
+  /* 2927 */  [ 0.319438338, 17 ],
+
+  /* 2928 */  [ 0.319583859, 17 ],
+  /* 2929 */  [ 0.319729398, 17 ],
+  /* 2930 */  [ 0.319874952, 17 ],
+  /* 2931 */  [ 0.320020524, 17 ],
+  /* 2932 */  [ 0.320166112, 17 ],
+  /* 2933 */  [ 0.320311716, 17 ],
+  /* 2934 */  [ 0.320457337, 17 ],
+  /* 2935 */  [ 0.320602975, 17 ],
+  /* 2936 */  [ 0.320748629, 17 ],
+  /* 2937 */  [ 0.320894300, 17 ],
+  /* 2938 */  [ 0.321039987, 17 ],
+  /* 2939 */  [ 0.321185691, 17 ],
+  /* 2940 */  [ 0.321331411, 17 ],
+  /* 2941 */  [ 0.321477148, 17 ],
+  /* 2942 */  [ 0.321622901, 17 ],
+  /* 2943 */  [ 0.321768671, 17 ],
+
+  /* 2944 */  [ 0.321914457, 17 ],
+  /* 2945 */  [ 0.322060260, 17 ],
+  /* 2946 */  [ 0.322206079, 17 ],
+  /* 2947 */  [ 0.322351915, 17 ],
+  /* 2948 */  [ 0.322497768, 17 ],
+  /* 2949 */  [ 0.322643636, 17 ],
+  /* 2950 */  [ 0.322789522, 17 ],
+  /* 2951 */  [ 0.322935424, 17 ],
+  /* 2952 */  [ 0.323081342, 17 ],
+  /* 2953 */  [ 0.323227277, 17 ],
+  /* 2954 */  [ 0.323373228, 17 ],
+  /* 2955 */  [ 0.323519196, 17 ],
+  /* 2956 */  [ 0.323665180, 17 ],
+  /* 2957 */  [ 0.323811180, 17 ],
+  /* 2958 */  [ 0.323957197, 17 ],
+  /* 2959 */  [ 0.324103231, 17 ],
+
+  /* 2960 */  [ 0.324249281, 17 ],
+  /* 2961 */  [ 0.324395347, 17 ],
+  /* 2962 */  [ 0.324541430, 17 ],
+  /* 2963 */  [ 0.324687530, 17 ],
+  /* 2964 */  [ 0.324833646, 17 ],
+  /* 2965 */  [ 0.324979778, 17 ],
+  /* 2966 */  [ 0.325125926, 17 ],
+  /* 2967 */  [ 0.325272091, 17 ],
+  /* 2968 */  [ 0.325418273, 17 ],
+  /* 2969 */  [ 0.325564471, 17 ],
+  /* 2970 */  [ 0.325710685, 17 ],
+  /* 2971 */  [ 0.325856916, 17 ],
+  /* 2972 */  [ 0.326003163, 17 ],
+  /* 2973 */  [ 0.326149427, 17 ],
+  /* 2974 */  [ 0.326295707, 17 ],
+  /* 2975 */  [ 0.326442003, 17 ],
+
+  /* 2976 */  [ 0.326588316, 17 ],
+  /* 2977 */  [ 0.326734645, 17 ],
+  /* 2978 */  [ 0.326880990, 17 ],
+  /* 2979 */  [ 0.327027352, 17 ],
+  /* 2980 */  [ 0.327173730, 17 ],
+  /* 2981 */  [ 0.327320125, 17 ],
+  /* 2982 */  [ 0.327466536, 17 ],
+  /* 2983 */  [ 0.327612963, 17 ],
+  /* 2984 */  [ 0.327759407, 17 ],
+  /* 2985 */  [ 0.327905867, 17 ],
+  /* 2986 */  [ 0.328052344, 17 ],
+  /* 2987 */  [ 0.328198837, 17 ],
+  /* 2988 */  [ 0.328345346, 17 ],
+  /* 2989 */  [ 0.328491871, 17 ],
+  /* 2990 */  [ 0.328638413, 17 ],
+  /* 2991 */  [ 0.328784971, 17 ],
+
+  /* 2992 */  [ 0.328931546, 17 ],
+  /* 2993 */  [ 0.329078137, 17 ],
+  /* 2994 */  [ 0.329224744, 17 ],
+  /* 2995 */  [ 0.329371367, 17 ],
+  /* 2996 */  [ 0.329518007, 17 ],
+  /* 2997 */  [ 0.329664663, 17 ],
+  /* 2998 */  [ 0.329811336, 17 ],
+  /* 2999 */  [ 0.329958024, 17 ],
+  /* 3000 */  [ 0.330104730, 17 ],
+  /* 3001 */  [ 0.330251451, 17 ],
+  /* 3002 */  [ 0.330398189, 17 ],
+  /* 3003 */  [ 0.330544943, 17 ],
+  /* 3004 */  [ 0.330691713, 17 ],
+  /* 3005 */  [ 0.330838499, 17 ],
+  /* 3006 */  [ 0.330985302, 17 ],
+  /* 3007 */  [ 0.331132121, 17 ],
+
+  /* 3008 */  [ 0.331278957, 17 ],
+  /* 3009 */  [ 0.331425808, 17 ],
+  /* 3010 */  [ 0.331572676, 17 ],
+  /* 3011 */  [ 0.331719560, 17 ],
+  /* 3012 */  [ 0.331866461, 17 ],
+  /* 3013 */  [ 0.332013377, 17 ],
+  /* 3014 */  [ 0.332160310, 17 ],
+  /* 3015 */  [ 0.332307260, 17 ],
+  /* 3016 */  [ 0.332454225, 17 ],
+  /* 3017 */  [ 0.332601207, 17 ],
+  /* 3018 */  [ 0.332748205, 17 ],
+  /* 3019 */  [ 0.332895219, 17 ],
+  /* 3020 */  [ 0.333042249, 17 ],
+  /* 3021 */  [ 0.333189296, 17 ],
+  /* 3022 */  [ 0.333336359, 17 ],
+  /* 3023 */  [ 0.333483438, 17 ],
+
+  /* 3024 */  [ 0.333630533, 17 ],
+  /* 3025 */  [ 0.333777645, 17 ],
+  /* 3026 */  [ 0.333924772, 17 ],
+  /* 3027 */  [ 0.334071916, 17 ],
+  /* 3028 */  [ 0.334219076, 17 ],
+  /* 3029 */  [ 0.334366253, 17 ],
+  /* 3030 */  [ 0.334513445, 17 ],
+  /* 3031 */  [ 0.334660654, 17 ],
+  /* 3032 */  [ 0.334807879, 17 ],
+  /* 3033 */  [ 0.334955120, 17 ],
+  /* 3034 */  [ 0.335102377, 17 ],
+  /* 3035 */  [ 0.335249651, 17 ],
+  /* 3036 */  [ 0.335396941, 17 ],
+  /* 3037 */  [ 0.335544246, 17 ],
+  /* 3038 */  [ 0.335691568, 17 ],
+  /* 3039 */  [ 0.335838906, 17 ],
+
+  /* 3040 */  [ 0.335986261, 17 ],
+  /* 3041 */  [ 0.336133631, 17 ],
+  /* 3042 */  [ 0.336281018, 17 ],
+  /* 3043 */  [ 0.336428421, 17 ],
+  /* 3044 */  [ 0.336575840, 17 ],
+  /* 3045 */  [ 0.336723275, 17 ],
+  /* 3046 */  [ 0.336870726, 17 ],
+  /* 3047 */  [ 0.337018193, 17 ],
+  /* 3048 */  [ 0.337165677, 17 ],
+  /* 3049 */  [ 0.337313176, 17 ],
+  /* 3050 */  [ 0.337460692, 17 ],
+  /* 3051 */  [ 0.337608224, 17 ],
+  /* 3052 */  [ 0.337755772, 17 ],
+  /* 3053 */  [ 0.337903336, 17 ],
+  /* 3054 */  [ 0.338050916, 17 ],
+  /* 3055 */  [ 0.338198513, 17 ],
+
+  /* 3056 */  [ 0.338346125, 17 ],
+  /* 3057 */  [ 0.338493753, 17 ],
+  /* 3058 */  [ 0.338641398, 17 ],
+  /* 3059 */  [ 0.338789059, 17 ],
+  /* 3060 */  [ 0.338936736, 17 ],
+  /* 3061 */  [ 0.339084429, 17 ],
+  /* 3062 */  [ 0.339232138, 17 ],
+  /* 3063 */  [ 0.339379863, 17 ],
+  /* 3064 */  [ 0.339527604, 17 ],
+  /* 3065 */  [ 0.339675361, 17 ],
+  /* 3066 */  [ 0.339823134, 17 ],
+  /* 3067 */  [ 0.339970924, 17 ],
+  /* 3068 */  [ 0.340118729, 17 ],
+  /* 3069 */  [ 0.340266550, 17 ],
+  /* 3070 */  [ 0.340414388, 17 ],
+  /* 3071 */  [ 0.340562242, 17 ],
+
+  /* 3072 */  [ 0.340710111, 17 ],
+  /* 3073 */  [ 0.340857997, 17 ],
+  /* 3074 */  [ 0.341005899, 17 ],
+  /* 3075 */  [ 0.341153816, 17 ],
+  /* 3076 */  [ 0.341301750, 17 ],
+  /* 3077 */  [ 0.341449700, 17 ],
+  /* 3078 */  [ 0.341597666, 17 ],
+  /* 3079 */  [ 0.341745648, 17 ],
+  /* 3080 */  [ 0.341893646, 17 ],
+  /* 3081 */  [ 0.342041659, 17 ],
+  /* 3082 */  [ 0.342189689, 17 ],
+  /* 3083 */  [ 0.342337735, 17 ],
+  /* 3084 */  [ 0.342485797, 17 ],
+  /* 3085 */  [ 0.342633875, 17 ],
+  /* 3086 */  [ 0.342781969, 17 ],
+  /* 3087 */  [ 0.342930079, 17 ],
+
+  /* 3088 */  [ 0.343078205, 17 ],
+  /* 3089 */  [ 0.343226347, 17 ],
+  /* 3090 */  [ 0.343374505, 17 ],
+  /* 3091 */  [ 0.343522679, 17 ],
+  /* 3092 */  [ 0.343670869, 17 ],
+  /* 3093 */  [ 0.343819075, 17 ],
+  /* 3094 */  [ 0.343967296, 17 ],
+  /* 3095 */  [ 0.344115534, 17 ],
+  /* 3096 */  [ 0.344263788, 17 ],
+  /* 3097 */  [ 0.344412058, 17 ],
+  /* 3098 */  [ 0.344560343, 17 ],
+  /* 3099 */  [ 0.344708645, 17 ],
+  /* 3100 */  [ 0.344856963, 17 ],
+  /* 3101 */  [ 0.345005296, 17 ],
+  /* 3102 */  [ 0.345153646, 17 ],
+  /* 3103 */  [ 0.345302011, 17 ],
+
+  /* 3104 */  [ 0.345450393, 17 ],
+  /* 3105 */  [ 0.345598790, 17 ],
+  /* 3106 */  [ 0.345747203, 17 ],
+  /* 3107 */  [ 0.345895632, 17 ],
+  /* 3108 */  [ 0.346044077, 17 ],
+  /* 3109 */  [ 0.346192538, 17 ],
+  /* 3110 */  [ 0.346341015, 17 ],
+  /* 3111 */  [ 0.346489508, 17 ],
+  /* 3112 */  [ 0.346638017, 17 ],
+  /* 3113 */  [ 0.346786542, 17 ],
+  /* 3114 */  [ 0.346935082, 17 ],
+  /* 3115 */  [ 0.347083639, 17 ],
+  /* 3116 */  [ 0.347232211, 17 ],
+  /* 3117 */  [ 0.347380799, 17 ],
+  /* 3118 */  [ 0.347529403, 17 ],
+  /* 3119 */  [ 0.347678023, 17 ],
+
+  /* 3120 */  [ 0.347826659, 17 ],
+  /* 3121 */  [ 0.347975311, 17 ],
+  /* 3122 */  [ 0.348123979, 17 ],
+  /* 3123 */  [ 0.348272662, 17 ],
+  /* 3124 */  [ 0.348421362, 17 ],
+  /* 3125 */  [ 0.348570077, 17 ],
+  /* 3126 */  [ 0.348718808, 17 ],
+  /* 3127 */  [ 0.348867555, 17 ],
+  /* 3128 */  [ 0.349016318, 17 ],
+  /* 3129 */  [ 0.349165097, 17 ],
+  /* 3130 */  [ 0.349313892, 17 ],
+  /* 3131 */  [ 0.349462702, 17 ],
+  /* 3132 */  [ 0.349611528, 17 ],
+  /* 3133 */  [ 0.349760370, 17 ],
+  /* 3134 */  [ 0.349909228, 17 ],
+  /* 3135 */  [ 0.350058102, 17 ],
+
+  /* 3136 */  [ 0.350206992, 17 ],
+  /* 3137 */  [ 0.350355897, 17 ],
+  /* 3138 */  [ 0.350504818, 17 ],
+  /* 3139 */  [ 0.350653756, 17 ],
+  /* 3140 */  [ 0.350802708, 17 ],
+  /* 3141 */  [ 0.350951677, 17 ],
+  /* 3142 */  [ 0.351100662, 17 ],
+  /* 3143 */  [ 0.351249662, 17 ],
+  /* 3144 */  [ 0.351398678, 17 ],
+  /* 3145 */  [ 0.351547710, 17 ],
+  /* 3146 */  [ 0.351696758, 17 ],
+  /* 3147 */  [ 0.351845821, 17 ],
+  /* 3148 */  [ 0.351994901, 17 ],
+  /* 3149 */  [ 0.352143996, 17 ],
+  /* 3150 */  [ 0.352293107, 17 ],
+  /* 3151 */  [ 0.352442233, 17 ],
+
+  /* 3152 */  [ 0.352591376, 17 ],
+  /* 3153 */  [ 0.352740534, 17 ],
+  /* 3154 */  [ 0.352889708, 17 ],
+  /* 3155 */  [ 0.353038898, 17 ],
+  /* 3156 */  [ 0.353188103, 17 ],
+  /* 3157 */  [ 0.353337325, 17 ],
+  /* 3158 */  [ 0.353486562, 17 ],
+  /* 3159 */  [ 0.353635814, 17 ],
+  /* 3160 */  [ 0.353785083, 17 ],
+  /* 3161 */  [ 0.353934367, 17 ],
+  /* 3162 */  [ 0.354083667, 17 ],
+  /* 3163 */  [ 0.354232983, 17 ],
+  /* 3164 */  [ 0.354382314, 17 ],
+  /* 3165 */  [ 0.354531662, 17 ],
+  /* 3166 */  [ 0.354681025, 17 ],
+  /* 3167 */  [ 0.354830403, 17 ],
+
+  /* 3168 */  [ 0.354979798, 17 ],
+  /* 3169 */  [ 0.355129208, 17 ],
+  /* 3170 */  [ 0.355278634, 17 ],
+  /* 3171 */  [ 0.355428075, 17 ],
+  /* 3172 */  [ 0.355577533, 17 ],
+  /* 3173 */  [ 0.355727006, 17 ],
+  /* 3174 */  [ 0.355876494, 17 ],
+  /* 3175 */  [ 0.356025999, 17 ],
+  /* 3176 */  [ 0.356175519, 17 ],
+  /* 3177 */  [ 0.356325054, 17 ],
+  /* 3178 */  [ 0.356474606, 17 ],
+  /* 3179 */  [ 0.356624173, 17 ],
+  /* 3180 */  [ 0.356773756, 17 ],
+  /* 3181 */  [ 0.356923354, 17 ],
+  /* 3182 */  [ 0.357072969, 17 ],
+  /* 3183 */  [ 0.357222598, 17 ],
+
+  /* 3184 */  [ 0.357372244, 17 ],
+  /* 3185 */  [ 0.357521905, 17 ],
+  /* 3186 */  [ 0.357671582, 17 ],
+  /* 3187 */  [ 0.357821275, 17 ],
+  /* 3188 */  [ 0.357970983, 17 ],
+  /* 3189 */  [ 0.358120707, 17 ],
+  /* 3190 */  [ 0.358270446, 17 ],
+  /* 3191 */  [ 0.358420201, 17 ],
+  /* 3192 */  [ 0.358569972, 17 ],
+  /* 3193 */  [ 0.358719758, 17 ],
+  /* 3194 */  [ 0.358869560, 17 ],
+  /* 3195 */  [ 0.359019378, 17 ],
+  /* 3196 */  [ 0.359169211, 17 ],
+  /* 3197 */  [ 0.359319060, 17 ],
+  /* 3198 */  [ 0.359468925, 17 ],
+  /* 3199 */  [ 0.359618805, 17 ],
+
+  /* 3200 */  [ 0.359768701, 17 ],
+  /* 3201 */  [ 0.359918612, 17 ],
+  /* 3202 */  [ 0.360068540, 17 ],
+  /* 3203 */  [ 0.360218482, 17 ],
+  /* 3204 */  [ 0.360368440, 17 ],
+  /* 3205 */  [ 0.360518414, 17 ],
+  /* 3206 */  [ 0.360668404, 17 ],
+  /* 3207 */  [ 0.360818409, 17 ],
+  /* 3208 */  [ 0.360968429, 17 ],
+  /* 3209 */  [ 0.361118466, 17 ],
+  /* 3210 */  [ 0.361268517, 17 ],
+  /* 3211 */  [ 0.361418585, 17 ],
+  /* 3212 */  [ 0.361568668, 17 ],
+  /* 3213 */  [ 0.361718766, 17 ],
+  /* 3214 */  [ 0.361868881, 17 ],
+  /* 3215 */  [ 0.362019010, 17 ],
+
+  /* 3216 */  [ 0.362169156, 17 ],
+  /* 3217 */  [ 0.362319316, 17 ],
+  /* 3218 */  [ 0.362469493, 17 ],
+  /* 3219 */  [ 0.362619685, 17 ],
+  /* 3220 */  [ 0.362769892, 17 ],
+  /* 3221 */  [ 0.362920115, 17 ],
+  /* 3222 */  [ 0.363070354, 17 ],
+  /* 3223 */  [ 0.363220608, 17 ],
+  /* 3224 */  [ 0.363370878, 17 ],
+  /* 3225 */  [ 0.363521163, 17 ],
+  /* 3226 */  [ 0.363671464, 17 ],
+  /* 3227 */  [ 0.363821780, 17 ],
+  /* 3228 */  [ 0.363972112, 17 ],
+  /* 3229 */  [ 0.364122459, 17 ],
+  /* 3230 */  [ 0.364272822, 17 ],
+  /* 3231 */  [ 0.364423200, 17 ],
+
+  /* 3232 */  [ 0.364573594, 17 ],
+  /* 3233 */  [ 0.364724004, 17 ],
+  /* 3234 */  [ 0.364874429, 17 ],
+  /* 3235 */  [ 0.365024869, 17 ],
+  /* 3236 */  [ 0.365175325, 17 ],
+  /* 3237 */  [ 0.365325796, 17 ],
+  /* 3238 */  [ 0.365476283, 17 ],
+  /* 3239 */  [ 0.365626786, 17 ],
+  /* 3240 */  [ 0.365777304, 17 ],
+  /* 3241 */  [ 0.365927837, 17 ],
+  /* 3242 */  [ 0.366078386, 17 ],
+  /* 3243 */  [ 0.366228950, 17 ],
+  /* 3244 */  [ 0.366379530, 17 ],
+  /* 3245 */  [ 0.366530125, 17 ],
+  /* 3246 */  [ 0.366680736, 17 ],
+  /* 3247 */  [ 0.366831362, 17 ],
+
+  /* 3248 */  [ 0.366982004, 17 ],
+  /* 3249 */  [ 0.367132661, 17 ],
+  /* 3250 */  [ 0.367283334, 17 ],
+  /* 3251 */  [ 0.367434022, 17 ],
+  /* 3252 */  [ 0.367584725, 17 ],
+  /* 3253 */  [ 0.367735444, 17 ],
+  /* 3254 */  [ 0.367886179, 17 ],
+  /* 3255 */  [ 0.368036929, 17 ],
+  /* 3256 */  [ 0.368187694, 17 ],
+  /* 3257 */  [ 0.368338475, 17 ],
+  /* 3258 */  [ 0.368489271, 17 ],
+  /* 3259 */  [ 0.368640082, 17 ],
+  /* 3260 */  [ 0.368790909, 17 ],
+  /* 3261 */  [ 0.368941752, 17 ],
+  /* 3262 */  [ 0.369092610, 17 ],
+  /* 3263 */  [ 0.369243483, 17 ],
+
+  /* 3264 */  [ 0.369394372, 17 ],
+  /* 3265 */  [ 0.369545276, 17 ],
+  /* 3266 */  [ 0.369696195, 17 ],
+  /* 3267 */  [ 0.369847130, 17 ],
+  /* 3268 */  [ 0.369998080, 17 ],
+  /* 3269 */  [ 0.370149046, 17 ],
+  /* 3270 */  [ 0.370300027, 17 ],
+  /* 3271 */  [ 0.370451024, 17 ],
+  /* 3272 */  [ 0.370602036, 17 ],
+  /* 3273 */  [ 0.370753063, 17 ],
+  /* 3274 */  [ 0.370904105, 17 ],
+  /* 3275 */  [ 0.371055163, 17 ],
+  /* 3276 */  [ 0.371206237, 17 ],
+  /* 3277 */  [ 0.371357326, 17 ],
+  /* 3278 */  [ 0.371508430, 17 ],
+  /* 3279 */  [ 0.371659549, 17 ],
+
+  /* 3280 */  [ 0.371810684, 17 ],
+  /* 3281 */  [ 0.371961834, 17 ],
+  /* 3282 */  [ 0.372113000, 17 ],
+  /* 3283 */  [ 0.372264181, 17 ],
+  /* 3284 */  [ 0.372415377, 17 ],
+  /* 3285 */  [ 0.372566589, 17 ],
+  /* 3286 */  [ 0.372717816, 17 ],
+  /* 3287 */  [ 0.372869058, 17 ],
+  /* 3288 */  [ 0.373020316, 17 ],
+  /* 3289 */  [ 0.373171589, 17 ],
+  /* 3290 */  [ 0.373322877, 17 ],
+  /* 3291 */  [ 0.373474181, 17 ],
+  /* 3292 */  [ 0.373625500, 17 ],
+  /* 3293 */  [ 0.373776834, 17 ],
+  /* 3294 */  [ 0.373928184, 17 ],
+  /* 3295 */  [ 0.374079549, 17 ],
+
+  /* 3296 */  [ 0.374230929, 17 ],
+  /* 3297 */  [ 0.374382325, 17 ],
+  /* 3298 */  [ 0.374533735, 17 ],
+  /* 3299 */  [ 0.374685162, 17 ],
+  /* 3300 */  [ 0.374836603, 17 ],
+  /* 3301 */  [ 0.374988060, 17 ],
+  /* 3302 */  [ 0.375139532, 17 ],
+  /* 3303 */  [ 0.375291019, 17 ],
+  /* 3304 */  [ 0.375442522, 17 ],
+  /* 3305 */  [ 0.375594040, 17 ],
+  /* 3306 */  [ 0.375745573, 17 ],
+  /* 3307 */  [ 0.375897122, 17 ],
+  /* 3308 */  [ 0.376048685, 17 ],
+  /* 3309 */  [ 0.376200265, 17 ],
+  /* 3310 */  [ 0.376351859, 17 ],
+  /* 3311 */  [ 0.376503468, 17 ],
+
+  /* 3312 */  [ 0.376655093, 17 ],
+  /* 3313 */  [ 0.376806733, 17 ],
+  /* 3314 */  [ 0.376958389, 17 ],
+  /* 3315 */  [ 0.377110059, 17 ],
+  /* 3316 */  [ 0.377261745, 17 ],
+  /* 3317 */  [ 0.377413446, 17 ],
+  /* 3318 */  [ 0.377565163, 17 ],
+  /* 3319 */  [ 0.377716894, 17 ],
+  /* 3320 */  [ 0.377868641, 17 ],
+  /* 3321 */  [ 0.378020403, 17 ],
+  /* 3322 */  [ 0.378172181, 17 ],
+  /* 3323 */  [ 0.378323973, 17 ],
+  /* 3324 */  [ 0.378475781, 17 ],
+  /* 3325 */  [ 0.378627604, 17 ],
+  /* 3326 */  [ 0.378779442, 17 ],
+  /* 3327 */  [ 0.378931296, 17 ],
+
+  /* 3328 */  [ 0.379083164, 17 ],
+  /* 3329 */  [ 0.379235048, 17 ],
+  /* 3330 */  [ 0.379386947, 17 ],
+  /* 3331 */  [ 0.379538862, 17 ],
+  /* 3332 */  [ 0.379690791, 17 ],
+  /* 3333 */  [ 0.379842736, 17 ],
+  /* 3334 */  [ 0.379994696, 17 ],
+  /* 3335 */  [ 0.380146671, 17 ],
+  /* 3336 */  [ 0.380298661, 17 ],
+  /* 3337 */  [ 0.380450666, 17 ],
+  /* 3338 */  [ 0.380602687, 17 ],
+  /* 3339 */  [ 0.380754723, 17 ],
+  /* 3340 */  [ 0.380906774, 17 ],
+  /* 3341 */  [ 0.381058840, 17 ],
+  /* 3342 */  [ 0.381210921, 17 ],
+  /* 3343 */  [ 0.381363018, 17 ],
+
+  /* 3344 */  [ 0.381515130, 17 ],
+  /* 3345 */  [ 0.381667257, 17 ],
+  /* 3346 */  [ 0.381819399, 17 ],
+  /* 3347 */  [ 0.381971556, 17 ],
+  /* 3348 */  [ 0.382123728, 17 ],
+  /* 3349 */  [ 0.382275916, 17 ],
+  /* 3350 */  [ 0.382428118, 17 ],
+  /* 3351 */  [ 0.382580336, 17 ],
+  /* 3352 */  [ 0.382732569, 17 ],
+  /* 3353 */  [ 0.382884817, 17 ],
+  /* 3354 */  [ 0.383037080, 17 ],
+  /* 3355 */  [ 0.383189358, 17 ],
+  /* 3356 */  [ 0.383341652, 17 ],
+  /* 3357 */  [ 0.383493960, 17 ],
+  /* 3358 */  [ 0.383646284, 17 ],
+  /* 3359 */  [ 0.383798623, 17 ],
+
+  /* 3360 */  [ 0.383950977, 17 ],
+  /* 3361 */  [ 0.384103346, 17 ],
+  /* 3362 */  [ 0.384255730, 17 ],
+  /* 3363 */  [ 0.384408129, 17 ],
+  /* 3364 */  [ 0.384560544, 17 ],
+  /* 3365 */  [ 0.384712973, 17 ],
+  /* 3366 */  [ 0.384865418, 17 ],
+  /* 3367 */  [ 0.385017878, 17 ],
+  /* 3368 */  [ 0.385170352, 17 ],
+  /* 3369 */  [ 0.385322842, 17 ],
+  /* 3370 */  [ 0.385475347, 17 ],
+  /* 3371 */  [ 0.385627867, 17 ],
+  /* 3372 */  [ 0.385780402, 17 ],
+  /* 3373 */  [ 0.385932953, 17 ],
+  /* 3374 */  [ 0.386085518, 17 ],
+  /* 3375 */  [ 0.386238098, 17 ],
+
+  /* 3376 */  [ 0.386390694, 17 ],
+  /* 3377 */  [ 0.386543304, 17 ],
+  /* 3378 */  [ 0.386695930, 17 ],
+  /* 3379 */  [ 0.386848570, 17 ],
+  /* 3380 */  [ 0.387001226, 17 ],
+  /* 3381 */  [ 0.387153897, 17 ],
+  /* 3382 */  [ 0.387306582, 17 ],
+  /* 3383 */  [ 0.387459283, 17 ],
+  /* 3384 */  [ 0.387611999, 17 ],
+  /* 3385 */  [ 0.387764730, 17 ],
+  /* 3386 */  [ 0.387917476, 17 ],
+  /* 3387 */  [ 0.388070237, 17 ],
+  /* 3388 */  [ 0.388223013, 17 ],
+  /* 3389 */  [ 0.388375804, 17 ],
+  /* 3390 */  [ 0.388528610, 17 ],
+  /* 3391 */  [ 0.388681431, 17 ],
+
+  /* 3392 */  [ 0.388834268, 17 ],
+  /* 3393 */  [ 0.388987119, 17 ],
+  /* 3394 */  [ 0.389139985, 17 ],
+  /* 3395 */  [ 0.389292866, 17 ],
+  /* 3396 */  [ 0.389445762, 17 ],
+  /* 3397 */  [ 0.389598674, 17 ],
+  /* 3398 */  [ 0.389751600, 17 ],
+  /* 3399 */  [ 0.389904541, 17 ],
+  /* 3400 */  [ 0.390057497, 17 ],
+  /* 3401 */  [ 0.390210468, 17 ],
+  /* 3402 */  [ 0.390363455, 17 ],
+  /* 3403 */  [ 0.390516456, 17 ],
+  /* 3404 */  [ 0.390669472, 17 ],
+  /* 3405 */  [ 0.390822503, 17 ],
+  /* 3406 */  [ 0.390975549, 17 ],
+  /* 3407 */  [ 0.391128611, 17 ],
+
+  /* 3408 */  [ 0.391281687, 17 ],
+  /* 3409 */  [ 0.391434778, 17 ],
+  /* 3410 */  [ 0.391587884, 17 ],
+  /* 3411 */  [ 0.391741005, 17 ],
+  /* 3412 */  [ 0.391894141, 17 ],
+  /* 3413 */  [ 0.392047292, 17 ],
+  /* 3414 */  [ 0.392200458, 17 ],
+  /* 3415 */  [ 0.392353638, 17 ],
+  /* 3416 */  [ 0.392506834, 17 ],
+  /* 3417 */  [ 0.392660045, 17 ],
+  /* 3418 */  [ 0.392813271, 17 ],
+  /* 3419 */  [ 0.392966511, 17 ],
+  /* 3420 */  [ 0.393119767, 17 ],
+  /* 3421 */  [ 0.393273038, 17 ],
+  /* 3422 */  [ 0.393426323, 17 ],
+  /* 3423 */  [ 0.393579623, 17 ],
+
+  /* 3424 */  [ 0.393732939, 17 ],
+  /* 3425 */  [ 0.393886269, 17 ],
+  /* 3426 */  [ 0.394039614, 17 ],
+  /* 3427 */  [ 0.394192974, 17 ],
+  /* 3428 */  [ 0.394346349, 17 ],
+  /* 3429 */  [ 0.394499739, 17 ],
+  /* 3430 */  [ 0.394653144, 17 ],
+  /* 3431 */  [ 0.394806564, 17 ],
+  /* 3432 */  [ 0.394959999, 17 ],
+  /* 3433 */  [ 0.395113448, 17 ],
+  /* 3434 */  [ 0.395266913, 17 ],
+  /* 3435 */  [ 0.395420392, 17 ],
+  /* 3436 */  [ 0.395573886, 17 ],
+  /* 3437 */  [ 0.395727395, 17 ],
+  /* 3438 */  [ 0.395880919, 17 ],
+  /* 3439 */  [ 0.396034458, 17 ],
+
+  /* 3440 */  [ 0.396188012, 17 ],
+  /* 3441 */  [ 0.396341581, 17 ],
+  /* 3442 */  [ 0.396495164, 17 ],
+  /* 3443 */  [ 0.396648763, 17 ],
+  /* 3444 */  [ 0.396802376, 17 ],
+  /* 3445 */  [ 0.396956004, 17 ],
+  /* 3446 */  [ 0.397109647, 17 ],
+  /* 3447 */  [ 0.397263305, 17 ],
+  /* 3448 */  [ 0.397416978, 17 ],
+  /* 3449 */  [ 0.397570666, 17 ],
+  /* 3450 */  [ 0.397724368, 17 ],
+  /* 3451 */  [ 0.397878085, 17 ],
+  /* 3452 */  [ 0.398031818, 17 ],
+  /* 3453 */  [ 0.398185565, 17 ],
+  /* 3454 */  [ 0.398339326, 17 ],
+  /* 3455 */  [ 0.398493103, 17 ],
+
+  /* 3456 */  [ 0.398646895, 17 ],
+  /* 3457 */  [ 0.398800701, 17 ],
+  /* 3458 */  [ 0.398954522, 17 ],
+  /* 3459 */  [ 0.399108358, 17 ],
+  /* 3460 */  [ 0.399262209, 17 ],
+  /* 3461 */  [ 0.399416075, 17 ],
+  /* 3462 */  [ 0.399569955, 17 ],
+  /* 3463 */  [ 0.399723851, 17 ],
+  /* 3464 */  [ 0.399877761, 17 ],
+  /* 3465 */  [ 0.400031686, 17 ],
+  /* 3466 */  [ 0.400185625, 17 ],
+  /* 3467 */  [ 0.400339580, 17 ],
+  /* 3468 */  [ 0.400493549, 17 ],
+  /* 3469 */  [ 0.400647534, 17 ],
+  /* 3470 */  [ 0.400801533, 17 ],
+  /* 3471 */  [ 0.400955546, 17 ],
+
+  /* 3472 */  [ 0.401109575, 17 ],
+  /* 3473 */  [ 0.401263618, 17 ],
+  /* 3474 */  [ 0.401417676, 17 ],
+  /* 3475 */  [ 0.401571749, 17 ],
+  /* 3476 */  [ 0.401725837, 17 ],
+  /* 3477 */  [ 0.401879939, 17 ],
+  /* 3478 */  [ 0.402034056, 17 ],
+  /* 3479 */  [ 0.402188188, 17 ],
+  /* 3480 */  [ 0.402342335, 17 ],
+  /* 3481 */  [ 0.402496497, 17 ],
+  /* 3482 */  [ 0.402650673, 17 ],
+  /* 3483 */  [ 0.402804864, 17 ],
+  /* 3484 */  [ 0.402959070, 17 ],
+  /* 3485 */  [ 0.403113291, 17 ],
+  /* 3486 */  [ 0.403267526, 17 ],
+  /* 3487 */  [ 0.403421776, 17 ],
+
+  /* 3488 */  [ 0.403576041, 17 ],
+  /* 3489 */  [ 0.403730320, 17 ],
+  /* 3490 */  [ 0.403884615, 17 ],
+  /* 3491 */  [ 0.404038924, 17 ],
+  /* 3492 */  [ 0.404193247, 17 ],
+  /* 3493 */  [ 0.404347586, 17 ],
+  /* 3494 */  [ 0.404501939, 17 ],
+  /* 3495 */  [ 0.404656307, 17 ],
+  /* 3496 */  [ 0.404810690, 17 ],
+  /* 3497 */  [ 0.404965087, 17 ],
+  /* 3498 */  [ 0.405119499, 17 ],
+  /* 3499 */  [ 0.405273926, 17 ],
+  /* 3500 */  [ 0.405428368, 17 ],
+  /* 3501 */  [ 0.405582824, 17 ],
+  /* 3502 */  [ 0.405737295, 17 ],
+  /* 3503 */  [ 0.405891781, 17 ],
+
+  /* 3504 */  [ 0.406046281, 17 ],
+  /* 3505 */  [ 0.406200796, 17 ],
+  /* 3506 */  [ 0.406355326, 17 ],
+  /* 3507 */  [ 0.406509870, 17 ],
+  /* 3508 */  [ 0.406664429, 17 ],
+  /* 3509 */  [ 0.406819003, 17 ],
+  /* 3510 */  [ 0.406973592, 17 ],
+  /* 3511 */  [ 0.407128195, 17 ],
+  /* 3512 */  [ 0.407282813, 17 ],
+  /* 3513 */  [ 0.407437445, 17 ],
+  /* 3514 */  [ 0.407592093, 17 ],
+  /* 3515 */  [ 0.407746754, 17 ],
+  /* 3516 */  [ 0.407901431, 17 ],
+  /* 3517 */  [ 0.408056122, 17 ],
+  /* 3518 */  [ 0.408210828, 17 ],
+  /* 3519 */  [ 0.408365549, 17 ],
+
+  /* 3520 */  [ 0.408520284, 17 ],
+  /* 3521 */  [ 0.408675034, 17 ],
+  /* 3522 */  [ 0.408829798, 17 ],
+  /* 3523 */  [ 0.408984577, 17 ],
+  /* 3524 */  [ 0.409139371, 17 ],
+  /* 3525 */  [ 0.409294180, 17 ],
+  /* 3526 */  [ 0.409449003, 17 ],
+  /* 3527 */  [ 0.409603840, 17 ],
+  /* 3528 */  [ 0.409758693, 17 ],
+  /* 3529 */  [ 0.409913560, 17 ],
+  /* 3530 */  [ 0.410068441, 17 ],
+  /* 3531 */  [ 0.410223338, 17 ],
+  /* 3532 */  [ 0.410378249, 17 ],
+  /* 3533 */  [ 0.410533174, 17 ],
+  /* 3534 */  [ 0.410688114, 17 ],
+  /* 3535 */  [ 0.410843069, 17 ],
+
+  /* 3536 */  [ 0.410998038, 17 ],
+  /* 3537 */  [ 0.411153022, 17 ],
+  /* 3538 */  [ 0.411308021, 17 ],
+  /* 3539 */  [ 0.411463034, 17 ],
+  /* 3540 */  [ 0.411618062, 17 ],
+  /* 3541 */  [ 0.411773104, 17 ],
+  /* 3542 */  [ 0.411928161, 17 ],
+  /* 3543 */  [ 0.412083232, 17 ],
+  /* 3544 */  [ 0.412238319, 17 ],
+  /* 3545 */  [ 0.412393419, 17 ],
+  /* 3546 */  [ 0.412548535, 17 ],
+  /* 3547 */  [ 0.412703664, 17 ],
+  /* 3548 */  [ 0.412858809, 17 ],
+  /* 3549 */  [ 0.413013968, 17 ],
+  /* 3550 */  [ 0.413169142, 17 ],
+  /* 3551 */  [ 0.413324330, 17 ],
+
+  /* 3552 */  [ 0.413479532, 17 ],
+  /* 3553 */  [ 0.413634750, 17 ],
+  /* 3554 */  [ 0.413789982, 17 ],
+  /* 3555 */  [ 0.413945228, 17 ],
+  /* 3556 */  [ 0.414100489, 17 ],
+  /* 3557 */  [ 0.414255765, 17 ],
+  /* 3558 */  [ 0.414411055, 17 ],
+  /* 3559 */  [ 0.414566359, 17 ],
+  /* 3560 */  [ 0.414721679, 17 ],
+  /* 3561 */  [ 0.414877012, 17 ],
+  /* 3562 */  [ 0.415032361, 17 ],
+  /* 3563 */  [ 0.415187723, 17 ],
+  /* 3564 */  [ 0.415343101, 17 ],
+  /* 3565 */  [ 0.415498493, 17 ],
+  /* 3566 */  [ 0.415653899, 17 ],
+  /* 3567 */  [ 0.415809320, 17 ],
+
+  /* 3568 */  [ 0.415964756, 17 ],
+  /* 3569 */  [ 0.416120206, 17 ],
+  /* 3570 */  [ 0.416275670, 17 ],
+  /* 3571 */  [ 0.416431149, 17 ],
+  /* 3572 */  [ 0.416586643, 17 ],
+  /* 3573 */  [ 0.416742151, 17 ],
+  /* 3574 */  [ 0.416897673, 17 ],
+  /* 3575 */  [ 0.417053210, 17 ],
+  /* 3576 */  [ 0.417208762, 17 ],
+  /* 3577 */  [ 0.417364328, 17 ],
+  /* 3578 */  [ 0.417519909, 17 ],
+  /* 3579 */  [ 0.417675504, 17 ],
+  /* 3580 */  [ 0.417831113, 17 ],
+  /* 3581 */  [ 0.417986737, 17 ],
+  /* 3582 */  [ 0.418142376, 17 ],
+  /* 3583 */  [ 0.418298029, 17 ],
+
+  /* 3584 */  [ 0.418453696, 17 ],
+  /* 3585 */  [ 0.418609378, 17 ],
+  /* 3586 */  [ 0.418765075, 17 ],
+  /* 3587 */  [ 0.418920786, 17 ],
+  /* 3588 */  [ 0.419076511, 17 ],
+  /* 3589 */  [ 0.419232251, 17 ],
+  /* 3590 */  [ 0.419388005, 17 ],
+  /* 3591 */  [ 0.419543774, 17 ],
+  /* 3592 */  [ 0.419699557, 17 ],
+  /* 3593 */  [ 0.419855355, 17 ],
+  /* 3594 */  [ 0.420011167, 17 ],
+  /* 3595 */  [ 0.420166994, 17 ],
+  /* 3596 */  [ 0.420322835, 17 ],
+  /* 3597 */  [ 0.420478690, 17 ],
+  /* 3598 */  [ 0.420634560, 17 ],
+  /* 3599 */  [ 0.420790445, 17 ],
+
+  /* 3600 */  [ 0.420946343, 17 ],
+  /* 3601 */  [ 0.421102257, 17 ],
+  /* 3602 */  [ 0.421258184, 17 ],
+  /* 3603 */  [ 0.421414127, 17 ],
+  /* 3604 */  [ 0.421570083, 17 ],
+  /* 3605 */  [ 0.421726054, 17 ],
+  /* 3606 */  [ 0.421882040, 17 ],
+  /* 3607 */  [ 0.422038039, 17 ],
+  /* 3608 */  [ 0.422194054, 17 ],
+  /* 3609 */  [ 0.422350082, 17 ],
+  /* 3610 */  [ 0.422506125, 17 ],
+  /* 3611 */  [ 0.422662183, 17 ],
+  /* 3612 */  [ 0.422818255, 17 ],
+  /* 3613 */  [ 0.422974341, 17 ],
+  /* 3614 */  [ 0.423130442, 17 ],
+  /* 3615 */  [ 0.423286557, 17 ],
+
+  /* 3616 */  [ 0.423442686, 17 ],
+  /* 3617 */  [ 0.423598830, 17 ],
+  /* 3618 */  [ 0.423754988, 17 ],
+  /* 3619 */  [ 0.423911161, 17 ],
+  /* 3620 */  [ 0.424067348, 17 ],
+  /* 3621 */  [ 0.424223550, 17 ],
+  /* 3622 */  [ 0.424379765, 17 ],
+  /* 3623 */  [ 0.424535996, 17 ],
+  /* 3624 */  [ 0.424692240, 17 ],
+  /* 3625 */  [ 0.424848499, 17 ],
+  /* 3626 */  [ 0.425004772, 17 ],
+  /* 3627 */  [ 0.425161060, 17 ],
+  /* 3628 */  [ 0.425317362, 17 ],
+  /* 3629 */  [ 0.425473678, 17 ],
+  /* 3630 */  [ 0.425630009, 17 ],
+  /* 3631 */  [ 0.425786354, 17 ],
+
+  /* 3632 */  [ 0.425942714, 17 ],
+  /* 3633 */  [ 0.426099088, 17 ],
+  /* 3634 */  [ 0.426255476, 17 ],
+  /* 3635 */  [ 0.426411878, 17 ],
+  /* 3636 */  [ 0.426568295, 17 ],
+  /* 3637 */  [ 0.426724726, 17 ],
+  /* 3638 */  [ 0.426881172, 17 ],
+  /* 3639 */  [ 0.427037632, 17 ],
+  /* 3640 */  [ 0.427194106, 17 ],
+  /* 3641 */  [ 0.427350594, 17 ],
+  /* 3642 */  [ 0.427507097, 17 ],
+  /* 3643 */  [ 0.427663614, 17 ],
+  /* 3644 */  [ 0.427820146, 17 ],
+  /* 3645 */  [ 0.427976692, 17 ],
+  /* 3646 */  [ 0.428133252, 17 ],
+  /* 3647 */  [ 0.428289826, 17 ],
+
+  /* 3648 */  [ 0.428446415, 17 ],
+  /* 3649 */  [ 0.428603018, 17 ],
+  /* 3650 */  [ 0.428759635, 17 ],
+  /* 3651 */  [ 0.428916267, 17 ],
+  /* 3652 */  [ 0.429072913, 17 ],
+  /* 3653 */  [ 0.429229573, 17 ],
+  /* 3654 */  [ 0.429386248, 17 ],
+  /* 3655 */  [ 0.429542937, 17 ],
+  /* 3656 */  [ 0.429699640, 17 ],
+  /* 3657 */  [ 0.429856357, 17 ],
+  /* 3658 */  [ 0.430013089, 17 ],
+  /* 3659 */  [ 0.430169835, 17 ],
+  /* 3660 */  [ 0.430326595, 17 ],
+  /* 3661 */  [ 0.430483370, 17 ],
+  /* 3662 */  [ 0.430640159, 17 ],
+  /* 3663 */  [ 0.430796962, 17 ],
+
+  /* 3664 */  [ 0.430953779, 17 ],
+  /* 3665 */  [ 0.431110611, 17 ],
+  /* 3666 */  [ 0.431267457, 17 ],
+  /* 3667 */  [ 0.431424317, 17 ],
+  /* 3668 */  [ 0.431581192, 17 ],
+  /* 3669 */  [ 0.431738080, 17 ],
+  /* 3670 */  [ 0.431894983, 17 ],
+  /* 3671 */  [ 0.432051900, 17 ],
+  /* 3672 */  [ 0.432208832, 17 ],
+  /* 3673 */  [ 0.432365778, 17 ],
+  /* 3674 */  [ 0.432522737, 17 ],
+  /* 3675 */  [ 0.432679712, 17 ],
+  /* 3676 */  [ 0.432836700, 17 ],
+  /* 3677 */  [ 0.432993703, 17 ],
+  /* 3678 */  [ 0.433150720, 17 ],
+  /* 3679 */  [ 0.433307751, 17 ],
+
+  /* 3680 */  [ 0.433464796, 17 ],
+  /* 3681 */  [ 0.433621856, 17 ],
+  /* 3682 */  [ 0.433778929, 17 ],
+  /* 3683 */  [ 0.433936017, 17 ],
+  /* 3684 */  [ 0.434093120, 17 ],
+  /* 3685 */  [ 0.434250236, 17 ],
+  /* 3686 */  [ 0.434407367, 17 ],
+  /* 3687 */  [ 0.434564512, 17 ],
+  /* 3688 */  [ 0.434721671, 17 ],
+  /* 3689 */  [ 0.434878844, 17 ],
+  /* 3690 */  [ 0.435036032, 17 ],
+  /* 3691 */  [ 0.435193233, 17 ],
+  /* 3692 */  [ 0.435350449, 17 ],
+  /* 3693 */  [ 0.435507679, 17 ],
+  /* 3694 */  [ 0.435664924, 17 ],
+  /* 3695 */  [ 0.435822182, 17 ],
+
+  /* 3696 */  [ 0.435979455, 17 ],
+  /* 3697 */  [ 0.436136741, 17 ],
+  /* 3698 */  [ 0.436294042, 17 ],
+  /* 3699 */  [ 0.436451358, 17 ],
+  /* 3700 */  [ 0.436608687, 17 ],
+  /* 3701 */  [ 0.436766031, 17 ],
+  /* 3702 */  [ 0.436923388, 17 ],
+  /* 3703 */  [ 0.437080760, 17 ],
+  /* 3704 */  [ 0.437238146, 17 ],
+  /* 3705 */  [ 0.437395547, 17 ],
+  /* 3706 */  [ 0.437552961, 17 ],
+  /* 3707 */  [ 0.437710389, 17 ],
+  /* 3708 */  [ 0.437867832, 17 ],
+  /* 3709 */  [ 0.438025289, 17 ],
+  /* 3710 */  [ 0.438182760, 17 ],
+  /* 3711 */  [ 0.438340245, 17 ],
+
+  /* 3712 */  [ 0.438497744, 17 ],
+  /* 3713 */  [ 0.438655258, 17 ],
+  /* 3714 */  [ 0.438812785, 17 ],
+  /* 3715 */  [ 0.438970327, 17 ],
+  /* 3716 */  [ 0.439127883, 17 ],
+  /* 3717 */  [ 0.439285453, 17 ],
+  /* 3718 */  [ 0.439443037, 17 ],
+  /* 3719 */  [ 0.439600635, 17 ],
+  /* 3720 */  [ 0.439758248, 17 ],
+  /* 3721 */  [ 0.439915874, 17 ],
+  /* 3722 */  [ 0.440073515, 17 ],
+  /* 3723 */  [ 0.440231170, 17 ],
+  /* 3724 */  [ 0.440388839, 17 ],
+  /* 3725 */  [ 0.440546522, 17 ],
+  /* 3726 */  [ 0.440704219, 17 ],
+  /* 3727 */  [ 0.440861930, 17 ],
+
+  /* 3728 */  [ 0.441019655, 17 ],
+  /* 3729 */  [ 0.441177395, 17 ],
+  /* 3730 */  [ 0.441335148, 17 ],
+  /* 3731 */  [ 0.441492916, 17 ],
+  /* 3732 */  [ 0.441650697, 17 ],
+  /* 3733 */  [ 0.441808493, 17 ],
+  /* 3734 */  [ 0.441966303, 17 ],
+  /* 3735 */  [ 0.442124127, 17 ],
+  /* 3736 */  [ 0.442281965, 17 ],
+  /* 3737 */  [ 0.442439817, 17 ],
+  /* 3738 */  [ 0.442597683, 17 ],
+  /* 3739 */  [ 0.442755564, 17 ],
+  /* 3740 */  [ 0.442913458, 17 ],
+  /* 3741 */  [ 0.443071366, 17 ],
+  /* 3742 */  [ 0.443229289, 17 ],
+  /* 3743 */  [ 0.443387226, 17 ],
+
+  /* 3744 */  [ 0.443545176, 17 ],
+  /* 3745 */  [ 0.443703141, 17 ],
+  /* 3746 */  [ 0.443861120, 17 ],
+  /* 3747 */  [ 0.444019113, 17 ],
+  /* 3748 */  [ 0.444177119, 17 ],
+  /* 3749 */  [ 0.444335140, 17 ],
+  /* 3750 */  [ 0.444493175, 17 ],
+  /* 3751 */  [ 0.444651224, 17 ],
+  /* 3752 */  [ 0.444809288, 17 ],
+  /* 3753 */  [ 0.444967365, 17 ],
+  /* 3754 */  [ 0.445125456, 17 ],
+  /* 3755 */  [ 0.445283561, 17 ],
+  /* 3756 */  [ 0.445441680, 17 ],
+  /* 3757 */  [ 0.445599814, 17 ],
+  /* 3758 */  [ 0.445757961, 17 ],
+  /* 3759 */  [ 0.445916122, 17 ],
+
+  /* 3760 */  [ 0.446074298, 17 ],
+  /* 3761 */  [ 0.446232487, 17 ],
+  /* 3762 */  [ 0.446390690, 17 ],
+  /* 3763 */  [ 0.446548908, 17 ],
+  /* 3764 */  [ 0.446707139, 17 ],
+  /* 3765 */  [ 0.446865385, 17 ],
+  /* 3766 */  [ 0.447023644, 17 ],
+  /* 3767 */  [ 0.447181918, 17 ],
+  /* 3768 */  [ 0.447340205, 17 ],
+  /* 3769 */  [ 0.447498507, 17 ],
+  /* 3770 */  [ 0.447656822, 17 ],
+  /* 3771 */  [ 0.447815152, 17 ],
+  /* 3772 */  [ 0.447973495, 17 ],
+  /* 3773 */  [ 0.448131853, 17 ],
+  /* 3774 */  [ 0.448290224, 17 ],
+  /* 3775 */  [ 0.448448609, 17 ],
+
+  /* 3776 */  [ 0.448607009, 17 ],
+  /* 3777 */  [ 0.448765422, 17 ],
+  /* 3778 */  [ 0.448923850, 17 ],
+  /* 3779 */  [ 0.449082291, 17 ],
+  /* 3780 */  [ 0.449240746, 17 ],
+  /* 3781 */  [ 0.449399216, 17 ],
+  /* 3782 */  [ 0.449557699, 17 ],
+  /* 3783 */  [ 0.449716196, 17 ],
+  /* 3784 */  [ 0.449874708, 17 ],
+  /* 3785 */  [ 0.450033233, 17 ],
+  /* 3786 */  [ 0.450191772, 17 ],
+  /* 3787 */  [ 0.450350325, 17 ],
+  /* 3788 */  [ 0.450508892, 17 ],
+  /* 3789 */  [ 0.450667473, 17 ],
+  /* 3790 */  [ 0.450826068, 17 ],
+  /* 3791 */  [ 0.450984677, 17 ],
+
+  /* 3792 */  [ 0.451143300, 17 ],
+  /* 3793 */  [ 0.451301937, 17 ],
+  /* 3794 */  [ 0.451460588, 17 ],
+  /* 3795 */  [ 0.451619252, 17 ],
+  /* 3796 */  [ 0.451777931, 17 ],
+  /* 3797 */  [ 0.451936623, 17 ],
+  /* 3798 */  [ 0.452095330, 17 ],
+  /* 3799 */  [ 0.452254050, 17 ],
+  /* 3800 */  [ 0.452412785, 17 ],
+  /* 3801 */  [ 0.452571533, 17 ],
+  /* 3802 */  [ 0.452730295, 17 ],
+  /* 3803 */  [ 0.452889071, 17 ],
+  /* 3804 */  [ 0.453047861, 17 ],
+  /* 3805 */  [ 0.453206665, 17 ],
+  /* 3806 */  [ 0.453365483, 17 ],
+  /* 3807 */  [ 0.453524315, 17 ],
+
+  /* 3808 */  [ 0.453683161, 17 ],
+  /* 3809 */  [ 0.453842020, 17 ],
+  /* 3810 */  [ 0.454000894, 17 ],
+  /* 3811 */  [ 0.454159781, 17 ],
+  /* 3812 */  [ 0.454318683, 17 ],
+  /* 3813 */  [ 0.454477598, 17 ],
+  /* 3814 */  [ 0.454636527, 17 ],
+  /* 3815 */  [ 0.454795470, 17 ],
+  /* 3816 */  [ 0.454954427, 17 ],
+  /* 3817 */  [ 0.455113397, 17 ],
+  /* 3818 */  [ 0.455272382, 17 ],
+  /* 3819 */  [ 0.455431381, 17 ],
+  /* 3820 */  [ 0.455590393, 17 ],
+  /* 3821 */  [ 0.455749419, 17 ],
+  /* 3822 */  [ 0.455908459, 17 ],
+  /* 3823 */  [ 0.456067513, 17 ],
+
+  /* 3824 */  [ 0.456226581, 17 ],
+  /* 3825 */  [ 0.456385663, 17 ],
+  /* 3826 */  [ 0.456544759, 17 ],
+  /* 3827 */  [ 0.456703868, 17 ],
+  /* 3828 */  [ 0.456862992, 17 ],
+  /* 3829 */  [ 0.457022129, 17 ],
+  /* 3830 */  [ 0.457181280, 17 ],
+  /* 3831 */  [ 0.457340445, 17 ],
+  /* 3832 */  [ 0.457499623, 17 ],
+  /* 3833 */  [ 0.457658816, 17 ],
+  /* 3834 */  [ 0.457818022, 17 ],
+  /* 3835 */  [ 0.457977243, 17 ],
+  /* 3836 */  [ 0.458136477, 17 ],
+  /* 3837 */  [ 0.458295725, 17 ],
+  /* 3838 */  [ 0.458454987, 17 ],
+  /* 3839 */  [ 0.458614262, 17 ],
+
+  /* 3840 */  [ 0.458773552, 17 ],
+  /* 3841 */  [ 0.458932855, 17 ],
+  /* 3842 */  [ 0.459092172, 17 ],
+  /* 3843 */  [ 0.459251503, 17 ],
+  /* 3844 */  [ 0.459410848, 17 ],
+  /* 3845 */  [ 0.459570206, 17 ],
+  /* 3846 */  [ 0.459729579, 17 ],
+  /* 3847 */  [ 0.459888965, 17 ],
+  /* 3848 */  [ 0.460048365, 17 ],
+  /* 3849 */  [ 0.460207779, 17 ],
+  /* 3850 */  [ 0.460367206, 17 ],
+  /* 3851 */  [ 0.460526648, 17 ],
+  /* 3852 */  [ 0.460686103, 17 ],
+  /* 3853 */  [ 0.460845572, 17 ],
+  /* 3854 */  [ 0.461005055, 17 ],
+  /* 3855 */  [ 0.461164552, 17 ],
+
+  /* 3856 */  [ 0.461324062, 17 ],
+  /* 3857 */  [ 0.461483586, 17 ],
+  /* 3858 */  [ 0.461643124, 17 ],
+  /* 3859 */  [ 0.461802676, 17 ],
+  /* 3860 */  [ 0.461962242, 17 ],
+  /* 3861 */  [ 0.462121821, 17 ],
+  /* 3862 */  [ 0.462281414, 17 ],
+  /* 3863 */  [ 0.462441021, 17 ],
+  /* 3864 */  [ 0.462600642, 17 ],
+  /* 3865 */  [ 0.462760276, 17 ],
+  /* 3866 */  [ 0.462919924, 17 ],
+  /* 3867 */  [ 0.463079586, 17 ],
+  /* 3868 */  [ 0.463239262, 17 ],
+  /* 3869 */  [ 0.463398951, 17 ],
+  /* 3870 */  [ 0.463558655, 17 ],
+  /* 3871 */  [ 0.463718372, 17 ],
+
+  /* 3872 */  [ 0.463878102, 17 ],
+  /* 3873 */  [ 0.464037847, 17 ],
+  /* 3874 */  [ 0.464197605, 17 ],
+  /* 3875 */  [ 0.464357377, 17 ],
+  /* 3876 */  [ 0.464517163, 17 ],
+  /* 3877 */  [ 0.464676962, 17 ],
+  /* 3878 */  [ 0.464836776, 17 ],
+  /* 3879 */  [ 0.464996603, 17 ],
+  /* 3880 */  [ 0.465156443, 17 ],
+  /* 3881 */  [ 0.465316298, 17 ],
+  /* 3882 */  [ 0.465476166, 17 ],
+  /* 3883 */  [ 0.465636048, 17 ],
+  /* 3884 */  [ 0.465795943, 17 ],
+  /* 3885 */  [ 0.465955853, 17 ],
+  /* 3886 */  [ 0.466115776, 17 ],
+  /* 3887 */  [ 0.466275713, 17 ],
+
+  /* 3888 */  [ 0.466435663, 17 ],
+  /* 3889 */  [ 0.466595627, 17 ],
+  /* 3890 */  [ 0.466755605, 17 ],
+  /* 3891 */  [ 0.466915597, 17 ],
+  /* 3892 */  [ 0.467075602, 17 ],
+  /* 3893 */  [ 0.467235621, 17 ],
+  /* 3894 */  [ 0.467395654, 17 ],
+  /* 3895 */  [ 0.467555701, 17 ],
+  /* 3896 */  [ 0.467715761, 17 ],
+  /* 3897 */  [ 0.467875835, 17 ],
+  /* 3898 */  [ 0.468035922, 17 ],
+  /* 3899 */  [ 0.468196023, 17 ],
+  /* 3900 */  [ 0.468356138, 17 ],
+  /* 3901 */  [ 0.468516267, 17 ],
+  /* 3902 */  [ 0.468676409, 17 ],
+  /* 3903 */  [ 0.468836565, 17 ],
+
+  /* 3904 */  [ 0.468996735, 17 ],
+  /* 3905 */  [ 0.469156918, 17 ],
+  /* 3906 */  [ 0.469317115, 17 ],
+  /* 3907 */  [ 0.469477326, 17 ],
+  /* 3908 */  [ 0.469637550, 17 ],
+  /* 3909 */  [ 0.469797788, 17 ],
+  /* 3910 */  [ 0.469958040, 17 ],
+  /* 3911 */  [ 0.470118305, 17 ],
+  /* 3912 */  [ 0.470278584, 17 ],
+  /* 3913 */  [ 0.470438877, 17 ],
+  /* 3914 */  [ 0.470599183, 17 ],
+  /* 3915 */  [ 0.470759503, 17 ],
+  /* 3916 */  [ 0.470919836, 17 ],
+  /* 3917 */  [ 0.471080184, 17 ],
+  /* 3918 */  [ 0.471240545, 17 ],
+  /* 3919 */  [ 0.471400919, 17 ],
+
+  /* 3920 */  [ 0.471561307, 17 ],
+  /* 3921 */  [ 0.471721709, 17 ],
+  /* 3922 */  [ 0.471882125, 17 ],
+  /* 3923 */  [ 0.472042554, 17 ],
+  /* 3924 */  [ 0.472202996, 17 ],
+  /* 3925 */  [ 0.472363453, 17 ],
+  /* 3926 */  [ 0.472523923, 17 ],
+  /* 3927 */  [ 0.472684406, 17 ],
+  /* 3928 */  [ 0.472844904, 17 ],
+  /* 3929 */  [ 0.473005414, 17 ],
+  /* 3930 */  [ 0.473165939, 17 ],
+  /* 3931 */  [ 0.473326477, 17 ],
+  /* 3932 */  [ 0.473487029, 17 ],
+  /* 3933 */  [ 0.473647594, 17 ],
+  /* 3934 */  [ 0.473808173, 17 ],
+  /* 3935 */  [ 0.473968765, 17 ],
+
+  /* 3936 */  [ 0.474129372, 17 ],
+  /* 3937 */  [ 0.474289991, 17 ],
+  /* 3938 */  [ 0.474450625, 17 ],
+  /* 3939 */  [ 0.474611272, 17 ],
+  /* 3940 */  [ 0.474771932, 17 ],
+  /* 3941 */  [ 0.474932606, 17 ],
+  /* 3942 */  [ 0.475093294, 17 ],
+  /* 3943 */  [ 0.475253995, 17 ],
+  /* 3944 */  [ 0.475414710, 17 ],
+  /* 3945 */  [ 0.475575439, 17 ],
+  /* 3946 */  [ 0.475736181, 17 ],
+  /* 3947 */  [ 0.475896936, 17 ],
+  /* 3948 */  [ 0.476057705, 17 ],
+  /* 3949 */  [ 0.476218488, 17 ],
+  /* 3950 */  [ 0.476379285, 17 ],
+  /* 3951 */  [ 0.476540095, 17 ],
+
+  /* 3952 */  [ 0.476700918, 17 ],
+  /* 3953 */  [ 0.476861755, 17 ],
+  /* 3954 */  [ 0.477022606, 17 ],
+  /* 3955 */  [ 0.477183470, 17 ],
+  /* 3956 */  [ 0.477344348, 17 ],
+  /* 3957 */  [ 0.477505239, 17 ],
+  /* 3958 */  [ 0.477666144, 17 ],
+  /* 3959 */  [ 0.477827062, 17 ],
+  /* 3960 */  [ 0.477987994, 17 ],
+  /* 3961 */  [ 0.478148940, 17 ],
+  /* 3962 */  [ 0.478309899, 17 ],
+  /* 3963 */  [ 0.478470871, 17 ],
+  /* 3964 */  [ 0.478631857, 17 ],
+  /* 3965 */  [ 0.478792857, 17 ],
+  /* 3966 */  [ 0.478953870, 17 ],
+  /* 3967 */  [ 0.479114897, 17 ],
+
+  /* 3968 */  [ 0.479275937, 17 ],
+  /* 3969 */  [ 0.479436991, 17 ],
+  /* 3970 */  [ 0.479598058, 17 ],
+  /* 3971 */  [ 0.479759139, 17 ],
+  /* 3972 */  [ 0.479920233, 17 ],
+  /* 3973 */  [ 0.480081341, 17 ],
+  /* 3974 */  [ 0.480242463, 17 ],
+  /* 3975 */  [ 0.480403598, 17 ],
+  /* 3976 */  [ 0.480564746, 17 ],
+  /* 3977 */  [ 0.480725908, 17 ],
+  /* 3978 */  [ 0.480887083, 17 ],
+  /* 3979 */  [ 0.481048272, 17 ],
+  /* 3980 */  [ 0.481209475, 17 ],
+  /* 3981 */  [ 0.481370691, 17 ],
+  /* 3982 */  [ 0.481531920, 17 ],
+  /* 3983 */  [ 0.481693163, 17 ],
+
+  /* 3984 */  [ 0.481854420, 17 ],
+  /* 3985 */  [ 0.482015690, 17 ],
+  /* 3986 */  [ 0.482176973, 17 ],
+  /* 3987 */  [ 0.482338270, 17 ],
+  /* 3988 */  [ 0.482499580, 17 ],
+  /* 3989 */  [ 0.482660904, 17 ],
+  /* 3990 */  [ 0.482822242, 17 ],
+  /* 3991 */  [ 0.482983592, 17 ],
+  /* 3992 */  [ 0.483144957, 17 ],
+  /* 3993 */  [ 0.483306335, 17 ],
+  /* 3994 */  [ 0.483467726, 17 ],
+  /* 3995 */  [ 0.483629131, 17 ],
+  /* 3996 */  [ 0.483790549, 17 ],
+  /* 3997 */  [ 0.483951980, 17 ],
+  /* 3998 */  [ 0.484113426, 17 ],
+  /* 3999 */  [ 0.484274884, 17 ],
+
+  /* 4000 */  [ 0.484436356, 17 ],
+  /* 4001 */  [ 0.484597842, 17 ],
+  /* 4002 */  [ 0.484759341, 17 ],
+  /* 4003 */  [ 0.484920853, 17 ],
+  /* 4004 */  [ 0.485082379, 17 ],
+  /* 4005 */  [ 0.485243918, 17 ],
+  /* 4006 */  [ 0.485405471, 17 ],
+  /* 4007 */  [ 0.485567037, 17 ],
+  /* 4008 */  [ 0.485728617, 17 ],
+  /* 4009 */  [ 0.485890210, 17 ],
+  /* 4010 */  [ 0.486051817, 17 ],
+  /* 4011 */  [ 0.486213436, 17 ],
+  /* 4012 */  [ 0.486375070, 17 ],
+  /* 4013 */  [ 0.486536717, 17 ],
+  /* 4014 */  [ 0.486698377, 17 ],
+  /* 4015 */  [ 0.486860051, 17 ],
+
+  /* 4016 */  [ 0.487021738, 17 ],
+  /* 4017 */  [ 0.487183438, 17 ],
+  /* 4018 */  [ 0.487345152, 17 ],
+  /* 4019 */  [ 0.487506879, 17 ],
+  /* 4020 */  [ 0.487668620, 17 ],
+  /* 4021 */  [ 0.487830374, 17 ],
+  /* 4022 */  [ 0.487992142, 17 ],
+  /* 4023 */  [ 0.488153923, 17 ],
+  /* 4024 */  [ 0.488315717, 17 ],
+  /* 4025 */  [ 0.488477525, 17 ],
+  /* 4026 */  [ 0.488639346, 17 ],
+  /* 4027 */  [ 0.488801181, 17 ],
+  /* 4028 */  [ 0.488963029, 17 ],
+  /* 4029 */  [ 0.489124890, 17 ],
+  /* 4030 */  [ 0.489286765, 17 ],
+  /* 4031 */  [ 0.489448653, 17 ],
+
+  /* 4032 */  [ 0.489610555, 17 ],
+  /* 4033 */  [ 0.489772470, 17 ],
+  /* 4034 */  [ 0.489934398, 17 ],
+  /* 4035 */  [ 0.490096340, 17 ],
+  /* 4036 */  [ 0.490258295, 17 ],
+  /* 4037 */  [ 0.490420263, 17 ],
+  /* 4038 */  [ 0.490582245, 17 ],
+  /* 4039 */  [ 0.490744240, 17 ],
+  /* 4040 */  [ 0.490906249, 17 ],
+  /* 4041 */  [ 0.491068271, 17 ],
+  /* 4042 */  [ 0.491230306, 17 ],
+  /* 4043 */  [ 0.491392355, 17 ],
+  /* 4044 */  [ 0.491554417, 17 ],
+  /* 4045 */  [ 0.491716492, 17 ],
+  /* 4046 */  [ 0.491878581, 17 ],
+  /* 4047 */  [ 0.492040683, 17 ],
+
+  /* 4048 */  [ 0.492202799, 17 ],
+  /* 4049 */  [ 0.492364928, 17 ],
+  /* 4050 */  [ 0.492527070, 17 ],
+  /* 4051 */  [ 0.492689225, 17 ],
+  /* 4052 */  [ 0.492851394, 17 ],
+  /* 4053 */  [ 0.493013576, 17 ],
+  /* 4054 */  [ 0.493175772, 17 ],
+  /* 4055 */  [ 0.493337981, 17 ],
+  /* 4056 */  [ 0.493500203, 17 ],
+  /* 4057 */  [ 0.493662438, 17 ],
+  /* 4058 */  [ 0.493824687, 17 ],
+  /* 4059 */  [ 0.493986949, 17 ],
+  /* 4060 */  [ 0.494149225, 17 ],
+  /* 4061 */  [ 0.494311514, 17 ],
+  /* 4062 */  [ 0.494473816, 17 ],
+  /* 4063 */  [ 0.494636131, 17 ],
+
+  /* 4064 */  [ 0.494798460, 17 ],
+  /* 4065 */  [ 0.494960802, 17 ],
+  /* 4066 */  [ 0.495123158, 17 ],
+  /* 4067 */  [ 0.495285526, 17 ],
+  /* 4068 */  [ 0.495447908, 17 ],
+  /* 4069 */  [ 0.495610304, 17 ],
+  /* 4070 */  [ 0.495772712, 17 ],
+  /* 4071 */  [ 0.495935134, 17 ],
+  /* 4072 */  [ 0.496097570, 17 ],
+  /* 4073 */  [ 0.496260018, 17 ],
+  /* 4074 */  [ 0.496422480, 17 ],
+  /* 4075 */  [ 0.496584955, 17 ],
+  /* 4076 */  [ 0.496747444, 17 ],
+  /* 4077 */  [ 0.496909945, 17 ],
+  /* 4078 */  [ 0.497072460, 17 ],
+  /* 4079 */  [ 0.497234989, 17 ],
+
+  /* 4080 */  [ 0.497397530, 17 ],
+  /* 4081 */  [ 0.497560085, 17 ],
+  /* 4082 */  [ 0.497722653, 17 ],
+  /* 4083 */  [ 0.497885235, 17 ],
+  /* 4084 */  [ 0.498047829, 17 ],
+  /* 4085 */  [ 0.498210437, 17 ],
+  /* 4086 */  [ 0.498373058, 17 ],
+  /* 4087 */  [ 0.498535693, 17 ],
+  /* 4088 */  [ 0.498698341, 17 ],
+  /* 4089 */  [ 0.498861002, 17 ],
+  /* 4090 */  [ 0.499023676, 17 ],
+  /* 4091 */  [ 0.499186364, 17 ],
+  /* 4092 */  [ 0.499349064, 17 ],
+  /* 4093 */  [ 0.499511778, 17 ],
+  /* 4094 */  [ 0.499674506, 17 ],
+  /* 4095 */  [ 0.499837246, 17 ],
+
+  /* 4096 */  [ 0.250000000, 18 ],
+  /* 4097 */  [ 0.250081384, 18 ],
+  /* 4098 */  [ 0.250162774, 18 ],
+  /* 4099 */  [ 0.250244170, 18 ],
+  /* 4100 */  [ 0.250325574, 18 ],
+  /* 4101 */  [ 0.250406984, 18 ],
+  /* 4102 */  [ 0.250488400, 18 ],
+  /* 4103 */  [ 0.250569824, 18 ],
+  /* 4104 */  [ 0.250651254, 18 ],
+  /* 4105 */  [ 0.250732690, 18 ],
+  /* 4106 */  [ 0.250814133, 18 ],
+  /* 4107 */  [ 0.250895583, 18 ],
+  /* 4108 */  [ 0.250977039, 18 ],
+  /* 4109 */  [ 0.251058502, 18 ],
+  /* 4110 */  [ 0.251139971, 18 ],
+  /* 4111 */  [ 0.251221448, 18 ],
+
+  /* 4112 */  [ 0.251302930, 18 ],
+  /* 4113 */  [ 0.251384420, 18 ],
+  /* 4114 */  [ 0.251465916, 18 ],
+  /* 4115 */  [ 0.251547418, 18 ],
+  /* 4116 */  [ 0.251628927, 18 ],
+  /* 4117 */  [ 0.251710443, 18 ],
+  /* 4118 */  [ 0.251791965, 18 ],
+  /* 4119 */  [ 0.251873494, 18 ],
+  /* 4120 */  [ 0.251955030, 18 ],
+  /* 4121 */  [ 0.252036572, 18 ],
+  /* 4122 */  [ 0.252118121, 18 ],
+  /* 4123 */  [ 0.252199676, 18 ],
+  /* 4124 */  [ 0.252281238, 18 ],
+  /* 4125 */  [ 0.252362807, 18 ],
+  /* 4126 */  [ 0.252444382, 18 ],
+  /* 4127 */  [ 0.252525963, 18 ],
+
+  /* 4128 */  [ 0.252607552, 18 ],
+  /* 4129 */  [ 0.252689147, 18 ],
+  /* 4130 */  [ 0.252770748, 18 ],
+  /* 4131 */  [ 0.252852356, 18 ],
+  /* 4132 */  [ 0.252933971, 18 ],
+  /* 4133 */  [ 0.253015592, 18 ],
+  /* 4134 */  [ 0.253097220, 18 ],
+  /* 4135 */  [ 0.253178854, 18 ],
+  /* 4136 */  [ 0.253260495, 18 ],
+  /* 4137 */  [ 0.253342143, 18 ],
+  /* 4138 */  [ 0.253423797, 18 ],
+  /* 4139 */  [ 0.253505457, 18 ],
+  /* 4140 */  [ 0.253587125, 18 ],
+  /* 4141 */  [ 0.253668799, 18 ],
+  /* 4142 */  [ 0.253750479, 18 ],
+  /* 4143 */  [ 0.253832166, 18 ],
+
+  /* 4144 */  [ 0.253913860, 18 ],
+  /* 4145 */  [ 0.253995560, 18 ],
+  /* 4146 */  [ 0.254077266, 18 ],
+  /* 4147 */  [ 0.254158980, 18 ],
+  /* 4148 */  [ 0.254240700, 18 ],
+  /* 4149 */  [ 0.254322426, 18 ],
+  /* 4150 */  [ 0.254404159, 18 ],
+  /* 4151 */  [ 0.254485899, 18 ],
+  /* 4152 */  [ 0.254567645, 18 ],
+  /* 4153 */  [ 0.254649397, 18 ],
+  /* 4154 */  [ 0.254731157, 18 ],
+  /* 4155 */  [ 0.254812922, 18 ],
+  /* 4156 */  [ 0.254894695, 18 ],
+  /* 4157 */  [ 0.254976474, 18 ],
+  /* 4158 */  [ 0.255058259, 18 ],
+  /* 4159 */  [ 0.255140051, 18 ],
+
+  /* 4160 */  [ 0.255221850, 18 ],
+  /* 4161 */  [ 0.255303655, 18 ],
+  /* 4162 */  [ 0.255385467, 18 ],
+  /* 4163 */  [ 0.255467285, 18 ],
+  /* 4164 */  [ 0.255549110, 18 ],
+  /* 4165 */  [ 0.255630941, 18 ],
+  /* 4166 */  [ 0.255712779, 18 ],
+  /* 4167 */  [ 0.255794624, 18 ],
+  /* 4168 */  [ 0.255876475, 18 ],
+  /* 4169 */  [ 0.255958332, 18 ],
+  /* 4170 */  [ 0.256040196, 18 ],
+  /* 4171 */  [ 0.256122067, 18 ],
+  /* 4172 */  [ 0.256203944, 18 ],
+  /* 4173 */  [ 0.256285828, 18 ],
+  /* 4174 */  [ 0.256367718, 18 ],
+  /* 4175 */  [ 0.256449615, 18 ],
+
+  /* 4176 */  [ 0.256531518, 18 ],
+  /* 4177 */  [ 0.256613428, 18 ],
+  /* 4178 */  [ 0.256695344, 18 ],
+  /* 4179 */  [ 0.256777267, 18 ],
+  /* 4180 */  [ 0.256859197, 18 ],
+  /* 4181 */  [ 0.256941133, 18 ],
+  /* 4182 */  [ 0.257023076, 18 ],
+  /* 4183 */  [ 0.257105025, 18 ],
+  /* 4184 */  [ 0.257186980, 18 ],
+  /* 4185 */  [ 0.257268942, 18 ],
+  /* 4186 */  [ 0.257350911, 18 ],
+  /* 4187 */  [ 0.257432886, 18 ],
+  /* 4188 */  [ 0.257514868, 18 ],
+  /* 4189 */  [ 0.257596856, 18 ],
+  /* 4190 */  [ 0.257678851, 18 ],
+  /* 4191 */  [ 0.257760852, 18 ],
+
+  /* 4192 */  [ 0.257842860, 18 ],
+  /* 4193 */  [ 0.257924875, 18 ],
+  /* 4194 */  [ 0.258006895, 18 ],
+  /* 4195 */  [ 0.258088923, 18 ],
+  /* 4196 */  [ 0.258170957, 18 ],
+  /* 4197 */  [ 0.258252997, 18 ],
+  /* 4198 */  [ 0.258335044, 18 ],
+  /* 4199 */  [ 0.258417097, 18 ],
+  /* 4200 */  [ 0.258499157, 18 ],
+  /* 4201 */  [ 0.258581224, 18 ],
+  /* 4202 */  [ 0.258663297, 18 ],
+  /* 4203 */  [ 0.258745376, 18 ],
+  /* 4204 */  [ 0.258827462, 18 ],
+  /* 4205 */  [ 0.258909555, 18 ],
+  /* 4206 */  [ 0.258991654, 18 ],
+  /* 4207 */  [ 0.259073760, 18 ],
+
+  /* 4208 */  [ 0.259155872, 18 ],
+  /* 4209 */  [ 0.259237990, 18 ],
+  /* 4210 */  [ 0.259320115, 18 ],
+  /* 4211 */  [ 0.259402247, 18 ],
+  /* 4212 */  [ 0.259484385, 18 ],
+  /* 4213 */  [ 0.259566529, 18 ],
+  /* 4214 */  [ 0.259648680, 18 ],
+  /* 4215 */  [ 0.259730838, 18 ],
+  /* 4216 */  [ 0.259813002, 18 ],
+  /* 4217 */  [ 0.259895173, 18 ],
+  /* 4218 */  [ 0.259977350, 18 ],
+  /* 4219 */  [ 0.260059533, 18 ],
+  /* 4220 */  [ 0.260141723, 18 ],
+  /* 4221 */  [ 0.260223920, 18 ],
+  /* 4222 */  [ 0.260306123, 18 ],
+  /* 4223 */  [ 0.260388332, 18 ],
+
+  /* 4224 */  [ 0.260470548, 18 ],
+  /* 4225 */  [ 0.260552771, 18 ],
+  /* 4226 */  [ 0.260635000, 18 ],
+  /* 4227 */  [ 0.260717235, 18 ],
+  /* 4228 */  [ 0.260799477, 18 ],
+  /* 4229 */  [ 0.260881725, 18 ],
+  /* 4230 */  [ 0.260963980, 18 ],
+  /* 4231 */  [ 0.261046242, 18 ],
+  /* 4232 */  [ 0.261128510, 18 ],
+  /* 4233 */  [ 0.261210784, 18 ],
+  /* 4234 */  [ 0.261293065, 18 ],
+  /* 4235 */  [ 0.261375352, 18 ],
+  /* 4236 */  [ 0.261457646, 18 ],
+  /* 4237 */  [ 0.261539946, 18 ],
+  /* 4238 */  [ 0.261622253, 18 ],
+  /* 4239 */  [ 0.261704566, 18 ],
+
+  /* 4240 */  [ 0.261786886, 18 ],
+  /* 4241 */  [ 0.261869212, 18 ],
+  /* 4242 */  [ 0.261951545, 18 ],
+  /* 4243 */  [ 0.262033884, 18 ],
+  /* 4244 */  [ 0.262116229, 18 ],
+  /* 4245 */  [ 0.262198581, 18 ],
+  /* 4246 */  [ 0.262280940, 18 ],
+  /* 4247 */  [ 0.262363305, 18 ],
+  /* 4248 */  [ 0.262445676, 18 ],
+  /* 4249 */  [ 0.262528054, 18 ],
+  /* 4250 */  [ 0.262610438, 18 ],
+  /* 4251 */  [ 0.262692829, 18 ],
+  /* 4252 */  [ 0.262775227, 18 ],
+  /* 4253 */  [ 0.262857630, 18 ],
+  /* 4254 */  [ 0.262940040, 18 ],
+  /* 4255 */  [ 0.263022457, 18 ],
+
+  /* 4256 */  [ 0.263104880, 18 ],
+  /* 4257 */  [ 0.263187310, 18 ],
+  /* 4258 */  [ 0.263269746, 18 ],
+  /* 4259 */  [ 0.263352188, 18 ],
+  /* 4260 */  [ 0.263434637, 18 ],
+  /* 4261 */  [ 0.263517093, 18 ],
+  /* 4262 */  [ 0.263599554, 18 ],
+  /* 4263 */  [ 0.263682023, 18 ],
+  /* 4264 */  [ 0.263764497, 18 ],
+  /* 4265 */  [ 0.263846979, 18 ],
+  /* 4266 */  [ 0.263929466, 18 ],
+  /* 4267 */  [ 0.264011960, 18 ],
+  /* 4268 */  [ 0.264094461, 18 ],
+  /* 4269 */  [ 0.264176968, 18 ],
+  /* 4270 */  [ 0.264259481, 18 ],
+  /* 4271 */  [ 0.264342001, 18 ],
+
+  /* 4272 */  [ 0.264424527, 18 ],
+  /* 4273 */  [ 0.264507060, 18 ],
+  /* 4274 */  [ 0.264589599, 18 ],
+  /* 4275 */  [ 0.264672145, 18 ],
+  /* 4276 */  [ 0.264754697, 18 ],
+  /* 4277 */  [ 0.264837255, 18 ],
+  /* 4278 */  [ 0.264919820, 18 ],
+  /* 4279 */  [ 0.265002392, 18 ],
+  /* 4280 */  [ 0.265084969, 18 ],
+  /* 4281 */  [ 0.265167554, 18 ],
+  /* 4282 */  [ 0.265250144, 18 ],
+  /* 4283 */  [ 0.265332741, 18 ],
+  /* 4284 */  [ 0.265415345, 18 ],
+  /* 4285 */  [ 0.265497955, 18 ],
+  /* 4286 */  [ 0.265580571, 18 ],
+  /* 4287 */  [ 0.265663194, 18 ],
+
+  /* 4288 */  [ 0.265745823, 18 ],
+  /* 4289 */  [ 0.265828459, 18 ],
+  /* 4290 */  [ 0.265911101, 18 ],
+  /* 4291 */  [ 0.265993749, 18 ],
+  /* 4292 */  [ 0.266076404, 18 ],
+  /* 4293 */  [ 0.266159065, 18 ],
+  /* 4294 */  [ 0.266241733, 18 ],
+  /* 4295 */  [ 0.266324407, 18 ],
+  /* 4296 */  [ 0.266407088, 18 ],
+  /* 4297 */  [ 0.266489775, 18 ],
+  /* 4298 */  [ 0.266572468, 18 ],
+  /* 4299 */  [ 0.266655168, 18 ],
+  /* 4300 */  [ 0.266737874, 18 ],
+  /* 4301 */  [ 0.266820587, 18 ],
+  /* 4302 */  [ 0.266903306, 18 ],
+  /* 4303 */  [ 0.266986031, 18 ],
+
+  /* 4304 */  [ 0.267068763, 18 ],
+  /* 4305 */  [ 0.267151501, 18 ],
+  /* 4306 */  [ 0.267234246, 18 ],
+  /* 4307 */  [ 0.267316997, 18 ],
+  /* 4308 */  [ 0.267399755, 18 ],
+  /* 4309 */  [ 0.267482518, 18 ],
+  /* 4310 */  [ 0.267565289, 18 ],
+  /* 4311 */  [ 0.267648065, 18 ],
+  /* 4312 */  [ 0.267730848, 18 ],
+  /* 4313 */  [ 0.267813638, 18 ],
+  /* 4314 */  [ 0.267896434, 18 ],
+  /* 4315 */  [ 0.267979236, 18 ],
+  /* 4316 */  [ 0.268062045, 18 ],
+  /* 4317 */  [ 0.268144860, 18 ],
+  /* 4318 */  [ 0.268227681, 18 ],
+  /* 4319 */  [ 0.268310509, 18 ],
+
+  /* 4320 */  [ 0.268393343, 18 ],
+  /* 4321 */  [ 0.268476184, 18 ],
+  /* 4322 */  [ 0.268559031, 18 ],
+  /* 4323 */  [ 0.268641885, 18 ],
+  /* 4324 */  [ 0.268724744, 18 ],
+  /* 4325 */  [ 0.268807611, 18 ],
+  /* 4326 */  [ 0.268890483, 18 ],
+  /* 4327 */  [ 0.268973362, 18 ],
+  /* 4328 */  [ 0.269056248, 18 ],
+  /* 4329 */  [ 0.269139139, 18 ],
+  /* 4330 */  [ 0.269222037, 18 ],
+  /* 4331 */  [ 0.269304942, 18 ],
+  /* 4332 */  [ 0.269387853, 18 ],
+  /* 4333 */  [ 0.269470770, 18 ],
+  /* 4334 */  [ 0.269553694, 18 ],
+  /* 4335 */  [ 0.269636624, 18 ],
+
+  /* 4336 */  [ 0.269719560, 18 ],
+  /* 4337 */  [ 0.269802503, 18 ],
+  /* 4338 */  [ 0.269885452, 18 ],
+  /* 4339 */  [ 0.269968408, 18 ],
+  /* 4340 */  [ 0.270051370, 18 ],
+  /* 4341 */  [ 0.270134338, 18 ],
+  /* 4342 */  [ 0.270217312, 18 ],
+  /* 4343 */  [ 0.270300293, 18 ],
+  /* 4344 */  [ 0.270383281, 18 ],
+  /* 4345 */  [ 0.270466275, 18 ],
+  /* 4346 */  [ 0.270549275, 18 ],
+  /* 4347 */  [ 0.270632281, 18 ],
+  /* 4348 */  [ 0.270715294, 18 ],
+  /* 4349 */  [ 0.270798313, 18 ],
+  /* 4350 */  [ 0.270881339, 18 ],
+  /* 4351 */  [ 0.270964371, 18 ],
+
+  /* 4352 */  [ 0.271047409, 18 ],
+  /* 4353 */  [ 0.271130454, 18 ],
+  /* 4354 */  [ 0.271213505, 18 ],
+  /* 4355 */  [ 0.271296562, 18 ],
+  /* 4356 */  [ 0.271379626, 18 ],
+  /* 4357 */  [ 0.271462696, 18 ],
+  /* 4358 */  [ 0.271545772, 18 ],
+  /* 4359 */  [ 0.271628855, 18 ],
+  /* 4360 */  [ 0.271711944, 18 ],
+  /* 4361 */  [ 0.271795040, 18 ],
+  /* 4362 */  [ 0.271878142, 18 ],
+  /* 4363 */  [ 0.271961250, 18 ],
+  /* 4364 */  [ 0.272044365, 18 ],
+  /* 4365 */  [ 0.272127486, 18 ],
+  /* 4366 */  [ 0.272210613, 18 ],
+  /* 4367 */  [ 0.272293746, 18 ],
+
+  /* 4368 */  [ 0.272376886, 18 ],
+  /* 4369 */  [ 0.272460033, 18 ],
+  /* 4370 */  [ 0.272543185, 18 ],
+  /* 4371 */  [ 0.272626344, 18 ],
+  /* 4372 */  [ 0.272709510, 18 ],
+  /* 4373 */  [ 0.272792681, 18 ],
+  /* 4374 */  [ 0.272875859, 18 ],
+  /* 4375 */  [ 0.272959044, 18 ],
+  /* 4376 */  [ 0.273042234, 18 ],
+  /* 4377 */  [ 0.273125431, 18 ],
+  /* 4378 */  [ 0.273208635, 18 ],
+  /* 4379 */  [ 0.273291844, 18 ],
+  /* 4380 */  [ 0.273375060, 18 ],
+  /* 4381 */  [ 0.273458283, 18 ],
+  /* 4382 */  [ 0.273541511, 18 ],
+  /* 4383 */  [ 0.273624747, 18 ],
+
+  /* 4384 */  [ 0.273707988, 18 ],
+  /* 4385 */  [ 0.273791236, 18 ],
+  /* 4386 */  [ 0.273874490, 18 ],
+  /* 4387 */  [ 0.273957750, 18 ],
+  /* 4388 */  [ 0.274041017, 18 ],
+  /* 4389 */  [ 0.274124290, 18 ],
+  /* 4390 */  [ 0.274207569, 18 ],
+  /* 4391 */  [ 0.274290855, 18 ],
+  /* 4392 */  [ 0.274374147, 18 ],
+  /* 4393 */  [ 0.274457445, 18 ],
+  /* 4394 */  [ 0.274540749, 18 ],
+  /* 4395 */  [ 0.274624060, 18 ],
+  /* 4396 */  [ 0.274707378, 18 ],
+  /* 4397 */  [ 0.274790701, 18 ],
+  /* 4398 */  [ 0.274874031, 18 ],
+  /* 4399 */  [ 0.274957367, 18 ],
+
+  /* 4400 */  [ 0.275040710, 18 ],
+  /* 4401 */  [ 0.275124059, 18 ],
+  /* 4402 */  [ 0.275207414, 18 ],
+  /* 4403 */  [ 0.275290775, 18 ],
+  /* 4404 */  [ 0.275374143, 18 ],
+  /* 4405 */  [ 0.275457517, 18 ],
+  /* 4406 */  [ 0.275540897, 18 ],
+  /* 4407 */  [ 0.275624284, 18 ],
+  /* 4408 */  [ 0.275707677, 18 ],
+  /* 4409 */  [ 0.275791076, 18 ],
+  /* 4410 */  [ 0.275874482, 18 ],
+  /* 4411 */  [ 0.275957894, 18 ],
+  /* 4412 */  [ 0.276041312, 18 ],
+  /* 4413 */  [ 0.276124737, 18 ],
+  /* 4414 */  [ 0.276208167, 18 ],
+  /* 4415 */  [ 0.276291605, 18 ],
+
+  /* 4416 */  [ 0.276375048, 18 ],
+  /* 4417 */  [ 0.276458498, 18 ],
+  /* 4418 */  [ 0.276541954, 18 ],
+  /* 4419 */  [ 0.276625416, 18 ],
+  /* 4420 */  [ 0.276708885, 18 ],
+  /* 4421 */  [ 0.276792360, 18 ],
+  /* 4422 */  [ 0.276875841, 18 ],
+  /* 4423 */  [ 0.276959328, 18 ],
+  /* 4424 */  [ 0.277042822, 18 ],
+  /* 4425 */  [ 0.277126322, 18 ],
+  /* 4426 */  [ 0.277209829, 18 ],
+  /* 4427 */  [ 0.277293341, 18 ],
+  /* 4428 */  [ 0.277376860, 18 ],
+  /* 4429 */  [ 0.277460385, 18 ],
+  /* 4430 */  [ 0.277543917, 18 ],
+  /* 4431 */  [ 0.277627455, 18 ],
+
+  /* 4432 */  [ 0.277710999, 18 ],
+  /* 4433 */  [ 0.277794549, 18 ],
+  /* 4434 */  [ 0.277878106, 18 ],
+  /* 4435 */  [ 0.277961669, 18 ],
+  /* 4436 */  [ 0.278045238, 18 ],
+  /* 4437 */  [ 0.278128813, 18 ],
+  /* 4438 */  [ 0.278212395, 18 ],
+  /* 4439 */  [ 0.278295983, 18 ],
+  /* 4440 */  [ 0.278379578, 18 ],
+  /* 4441 */  [ 0.278463178, 18 ],
+  /* 4442 */  [ 0.278546785, 18 ],
+  /* 4443 */  [ 0.278630398, 18 ],
+  /* 4444 */  [ 0.278714018, 18 ],
+  /* 4445 */  [ 0.278797643, 18 ],
+  /* 4446 */  [ 0.278881275, 18 ],
+  /* 4447 */  [ 0.278964914, 18 ],
+
+  /* 4448 */  [ 0.279048558, 18 ],
+  /* 4449 */  [ 0.279132209, 18 ],
+  /* 4450 */  [ 0.279215866, 18 ],
+  /* 4451 */  [ 0.279299529, 18 ],
+  /* 4452 */  [ 0.279383199, 18 ],
+  /* 4453 */  [ 0.279466875, 18 ],
+  /* 4454 */  [ 0.279550557, 18 ],
+  /* 4455 */  [ 0.279634245, 18 ],
+  /* 4456 */  [ 0.279717940, 18 ],
+  /* 4457 */  [ 0.279801641, 18 ],
+  /* 4458 */  [ 0.279885348, 18 ],
+  /* 4459 */  [ 0.279969061, 18 ],
+  /* 4460 */  [ 0.280052781, 18 ],
+  /* 4461 */  [ 0.280136507, 18 ],
+  /* 4462 */  [ 0.280220239, 18 ],
+  /* 4463 */  [ 0.280303978, 18 ],
+
+  /* 4464 */  [ 0.280387722, 18 ],
+  /* 4465 */  [ 0.280471473, 18 ],
+  /* 4466 */  [ 0.280555230, 18 ],
+  /* 4467 */  [ 0.280638994, 18 ],
+  /* 4468 */  [ 0.280722764, 18 ],
+  /* 4469 */  [ 0.280806540, 18 ],
+  /* 4470 */  [ 0.280890322, 18 ],
+  /* 4471 */  [ 0.280974110, 18 ],
+  /* 4472 */  [ 0.281057905, 18 ],
+  /* 4473 */  [ 0.281141706, 18 ],
+  /* 4474 */  [ 0.281225513, 18 ],
+  /* 4475 */  [ 0.281309326, 18 ],
+  /* 4476 */  [ 0.281393146, 18 ],
+  /* 4477 */  [ 0.281476972, 18 ],
+  /* 4478 */  [ 0.281560804, 18 ],
+  /* 4479 */  [ 0.281644643, 18 ],
+
+  /* 4480 */  [ 0.281728487, 18 ],
+  /* 4481 */  [ 0.281812338, 18 ],
+  /* 4482 */  [ 0.281896195, 18 ],
+  /* 4483 */  [ 0.281980059, 18 ],
+  /* 4484 */  [ 0.282063928, 18 ],
+  /* 4485 */  [ 0.282147804, 18 ],
+  /* 4486 */  [ 0.282231686, 18 ],
+  /* 4487 */  [ 0.282315574, 18 ],
+  /* 4488 */  [ 0.282399469, 18 ],
+  /* 4489 */  [ 0.282483370, 18 ],
+  /* 4490 */  [ 0.282567277, 18 ],
+  /* 4491 */  [ 0.282651190, 18 ],
+  /* 4492 */  [ 0.282735109, 18 ],
+  /* 4493 */  [ 0.282819035, 18 ],
+  /* 4494 */  [ 0.282902967, 18 ],
+  /* 4495 */  [ 0.282986905, 18 ],
+
+  /* 4496 */  [ 0.283070849, 18 ],
+  /* 4497 */  [ 0.283154800, 18 ],
+  /* 4498 */  [ 0.283238757, 18 ],
+  /* 4499 */  [ 0.283322720, 18 ],
+  /* 4500 */  [ 0.283406689, 18 ],
+  /* 4501 */  [ 0.283490665, 18 ],
+  /* 4502 */  [ 0.283574646, 18 ],
+  /* 4503 */  [ 0.283658634, 18 ],
+  /* 4504 */  [ 0.283742628, 18 ],
+  /* 4505 */  [ 0.283826629, 18 ],
+  /* 4506 */  [ 0.283910635, 18 ],
+  /* 4507 */  [ 0.283994648, 18 ],
+  /* 4508 */  [ 0.284078667, 18 ],
+  /* 4509 */  [ 0.284162692, 18 ],
+  /* 4510 */  [ 0.284246723, 18 ],
+  /* 4511 */  [ 0.284330761, 18 ],
+
+  /* 4512 */  [ 0.284414805, 18 ],
+  /* 4513 */  [ 0.284498855, 18 ],
+  /* 4514 */  [ 0.284582911, 18 ],
+  /* 4515 */  [ 0.284666974, 18 ],
+  /* 4516 */  [ 0.284751042, 18 ],
+  /* 4517 */  [ 0.284835117, 18 ],
+  /* 4518 */  [ 0.284919198, 18 ],
+  /* 4519 */  [ 0.285003285, 18 ],
+  /* 4520 */  [ 0.285087379, 18 ],
+  /* 4521 */  [ 0.285171479, 18 ],
+  /* 4522 */  [ 0.285255584, 18 ],
+  /* 4523 */  [ 0.285339697, 18 ],
+  /* 4524 */  [ 0.285423815, 18 ],
+  /* 4525 */  [ 0.285507939, 18 ],
+  /* 4526 */  [ 0.285592070, 18 ],
+  /* 4527 */  [ 0.285676207, 18 ],
+
+  /* 4528 */  [ 0.285760350, 18 ],
+  /* 4529 */  [ 0.285844499, 18 ],
+  /* 4530 */  [ 0.285928655, 18 ],
+  /* 4531 */  [ 0.286012816, 18 ],
+  /* 4532 */  [ 0.286096984, 18 ],
+  /* 4533 */  [ 0.286181158, 18 ],
+  /* 4534 */  [ 0.286265338, 18 ],
+  /* 4535 */  [ 0.286349525, 18 ],
+  /* 4536 */  [ 0.286433717, 18 ],
+  /* 4537 */  [ 0.286517916, 18 ],
+  /* 4538 */  [ 0.286602121, 18 ],
+  /* 4539 */  [ 0.286686332, 18 ],
+  /* 4540 */  [ 0.286770550, 18 ],
+  /* 4541 */  [ 0.286854773, 18 ],
+  /* 4542 */  [ 0.286939003, 18 ],
+  /* 4543 */  [ 0.287023239, 18 ],
+
+  /* 4544 */  [ 0.287107481, 18 ],
+  /* 4545 */  [ 0.287191729, 18 ],
+  /* 4546 */  [ 0.287275983, 18 ],
+  /* 4547 */  [ 0.287360244, 18 ],
+  /* 4548 */  [ 0.287444511, 18 ],
+  /* 4549 */  [ 0.287528784, 18 ],
+  /* 4550 */  [ 0.287613063, 18 ],
+  /* 4551 */  [ 0.287697348, 18 ],
+  /* 4552 */  [ 0.287781640, 18 ],
+  /* 4553 */  [ 0.287865937, 18 ],
+  /* 4554 */  [ 0.287950241, 18 ],
+  /* 4555 */  [ 0.288034551, 18 ],
+  /* 4556 */  [ 0.288118867, 18 ],
+  /* 4557 */  [ 0.288203190, 18 ],
+  /* 4558 */  [ 0.288287518, 18 ],
+  /* 4559 */  [ 0.288371853, 18 ],
+
+  /* 4560 */  [ 0.288456194, 18 ],
+  /* 4561 */  [ 0.288540541, 18 ],
+  /* 4562 */  [ 0.288624894, 18 ],
+  /* 4563 */  [ 0.288709253, 18 ],
+  /* 4564 */  [ 0.288793619, 18 ],
+  /* 4565 */  [ 0.288877990, 18 ],
+  /* 4566 */  [ 0.288962368, 18 ],
+  /* 4567 */  [ 0.289046752, 18 ],
+  /* 4568 */  [ 0.289131142, 18 ],
+  /* 4569 */  [ 0.289215538, 18 ],
+  /* 4570 */  [ 0.289299941, 18 ],
+  /* 4571 */  [ 0.289384349, 18 ],
+  /* 4572 */  [ 0.289468764, 18 ],
+  /* 4573 */  [ 0.289553185, 18 ],
+  /* 4574 */  [ 0.289637612, 18 ],
+  /* 4575 */  [ 0.289722045, 18 ],
+
+  /* 4576 */  [ 0.289806485, 18 ],
+  /* 4577 */  [ 0.289890930, 18 ],
+  /* 4578 */  [ 0.289975382, 18 ],
+  /* 4579 */  [ 0.290059840, 18 ],
+  /* 4580 */  [ 0.290144304, 18 ],
+  /* 4581 */  [ 0.290228774, 18 ],
+  /* 4582 */  [ 0.290313250, 18 ],
+  /* 4583 */  [ 0.290397733, 18 ],
+  /* 4584 */  [ 0.290482221, 18 ],
+  /* 4585 */  [ 0.290566716, 18 ],
+  /* 4586 */  [ 0.290651217, 18 ],
+  /* 4587 */  [ 0.290735724, 18 ],
+  /* 4588 */  [ 0.290820237, 18 ],
+  /* 4589 */  [ 0.290904756, 18 ],
+  /* 4590 */  [ 0.290989281, 18 ],
+  /* 4591 */  [ 0.291073813, 18 ],
+
+  /* 4592 */  [ 0.291158351, 18 ],
+  /* 4593 */  [ 0.291242894, 18 ],
+  /* 4594 */  [ 0.291327444, 18 ],
+  /* 4595 */  [ 0.291412001, 18 ],
+  /* 4596 */  [ 0.291496563, 18 ],
+  /* 4597 */  [ 0.291581131, 18 ],
+  /* 4598 */  [ 0.291665706, 18 ],
+  /* 4599 */  [ 0.291750286, 18 ],
+  /* 4600 */  [ 0.291834873, 18 ],
+  /* 4601 */  [ 0.291919466, 18 ],
+  /* 4602 */  [ 0.292004065, 18 ],
+  /* 4603 */  [ 0.292088670, 18 ],
+  /* 4604 */  [ 0.292173281, 18 ],
+  /* 4605 */  [ 0.292257899, 18 ],
+  /* 4606 */  [ 0.292342522, 18 ],
+  /* 4607 */  [ 0.292427152, 18 ],
+
+  /* 4608 */  [ 0.292511788, 18 ],
+  /* 4609 */  [ 0.292596430, 18 ],
+  /* 4610 */  [ 0.292681078, 18 ],
+  /* 4611 */  [ 0.292765732, 18 ],
+  /* 4612 */  [ 0.292850392, 18 ],
+  /* 4613 */  [ 0.292935058, 18 ],
+  /* 4614 */  [ 0.293019731, 18 ],
+  /* 4615 */  [ 0.293104409, 18 ],
+  /* 4616 */  [ 0.293189094, 18 ],
+  /* 4617 */  [ 0.293273785, 18 ],
+  /* 4618 */  [ 0.293358482, 18 ],
+  /* 4619 */  [ 0.293443185, 18 ],
+  /* 4620 */  [ 0.293527894, 18 ],
+  /* 4621 */  [ 0.293612609, 18 ],
+  /* 4622 */  [ 0.293697331, 18 ],
+  /* 4623 */  [ 0.293782058, 18 ],
+
+  /* 4624 */  [ 0.293866792, 18 ],
+  /* 4625 */  [ 0.293951532, 18 ],
+  /* 4626 */  [ 0.294036278, 18 ],
+  /* 4627 */  [ 0.294121029, 18 ],
+  /* 4628 */  [ 0.294205788, 18 ],
+  /* 4629 */  [ 0.294290552, 18 ],
+  /* 4630 */  [ 0.294375322, 18 ],
+  /* 4631 */  [ 0.294460098, 18 ],
+  /* 4632 */  [ 0.294544881, 18 ],
+  /* 4633 */  [ 0.294629669, 18 ],
+  /* 4634 */  [ 0.294714464, 18 ],
+  /* 4635 */  [ 0.294799265, 18 ],
+  /* 4636 */  [ 0.294884072, 18 ],
+  /* 4637 */  [ 0.294968885, 18 ],
+  /* 4638 */  [ 0.295053704, 18 ],
+  /* 4639 */  [ 0.295138529, 18 ],
+
+  /* 4640 */  [ 0.295223360, 18 ],
+  /* 4641 */  [ 0.295308197, 18 ],
+  /* 4642 */  [ 0.295393041, 18 ],
+  /* 4643 */  [ 0.295477890, 18 ],
+  /* 4644 */  [ 0.295562746, 18 ],
+  /* 4645 */  [ 0.295647608, 18 ],
+  /* 4646 */  [ 0.295732476, 18 ],
+  /* 4647 */  [ 0.295817349, 18 ],
+  /* 4648 */  [ 0.295902229, 18 ],
+  /* 4649 */  [ 0.295987115, 18 ],
+  /* 4650 */  [ 0.296072008, 18 ],
+  /* 4651 */  [ 0.296156906, 18 ],
+  /* 4652 */  [ 0.296241810, 18 ],
+  /* 4653 */  [ 0.296326721, 18 ],
+  /* 4654 */  [ 0.296411637, 18 ],
+  /* 4655 */  [ 0.296496560, 18 ],
+
+  /* 4656 */  [ 0.296581488, 18 ],
+  /* 4657 */  [ 0.296666423, 18 ],
+  /* 4658 */  [ 0.296751364, 18 ],
+  /* 4659 */  [ 0.296836311, 18 ],
+  /* 4660 */  [ 0.296921264, 18 ],
+  /* 4661 */  [ 0.297006223, 18 ],
+  /* 4662 */  [ 0.297091188, 18 ],
+  /* 4663 */  [ 0.297176159, 18 ],
+  /* 4664 */  [ 0.297261136, 18 ],
+  /* 4665 */  [ 0.297346120, 18 ],
+  /* 4666 */  [ 0.297431109, 18 ],
+  /* 4667 */  [ 0.297516105, 18 ],
+  /* 4668 */  [ 0.297601106, 18 ],
+  /* 4669 */  [ 0.297686114, 18 ],
+  /* 4670 */  [ 0.297771128, 18 ],
+  /* 4671 */  [ 0.297856147, 18 ],
+
+  /* 4672 */  [ 0.297941173, 18 ],
+  /* 4673 */  [ 0.298026205, 18 ],
+  /* 4674 */  [ 0.298111243, 18 ],
+  /* 4675 */  [ 0.298196287, 18 ],
+  /* 4676 */  [ 0.298281337, 18 ],
+  /* 4677 */  [ 0.298366393, 18 ],
+  /* 4678 */  [ 0.298451456, 18 ],
+  /* 4679 */  [ 0.298536524, 18 ],
+  /* 4680 */  [ 0.298621598, 18 ],
+  /* 4681 */  [ 0.298706679, 18 ],
+  /* 4682 */  [ 0.298791765, 18 ],
+  /* 4683 */  [ 0.298876858, 18 ],
+  /* 4684 */  [ 0.298961956, 18 ],
+  /* 4685 */  [ 0.299047061, 18 ],
+  /* 4686 */  [ 0.299132172, 18 ],
+  /* 4687 */  [ 0.299217288, 18 ],
+
+  /* 4688 */  [ 0.299302411, 18 ],
+  /* 4689 */  [ 0.299387540, 18 ],
+  /* 4690 */  [ 0.299472675, 18 ],
+  /* 4691 */  [ 0.299557816, 18 ],
+  /* 4692 */  [ 0.299642963, 18 ],
+  /* 4693 */  [ 0.299728116, 18 ],
+  /* 4694 */  [ 0.299813275, 18 ],
+  /* 4695 */  [ 0.299898440, 18 ],
+  /* 4696 */  [ 0.299983611, 18 ],
+  /* 4697 */  [ 0.300068789, 18 ],
+  /* 4698 */  [ 0.300153972, 18 ],
+  /* 4699 */  [ 0.300239161, 18 ],
+  /* 4700 */  [ 0.300324357, 18 ],
+  /* 4701 */  [ 0.300409558, 18 ],
+  /* 4702 */  [ 0.300494765, 18 ],
+  /* 4703 */  [ 0.300579979, 18 ],
+
+  /* 4704 */  [ 0.300665198, 18 ],
+  /* 4705 */  [ 0.300750424, 18 ],
+  /* 4706 */  [ 0.300835656, 18 ],
+  /* 4707 */  [ 0.300920893, 18 ],
+  /* 4708 */  [ 0.301006137, 18 ],
+  /* 4709 */  [ 0.301091387, 18 ],
+  /* 4710 */  [ 0.301176643, 18 ],
+  /* 4711 */  [ 0.301261904, 18 ],
+  /* 4712 */  [ 0.301347172, 18 ],
+  /* 4713 */  [ 0.301432446, 18 ],
+  /* 4714 */  [ 0.301517726, 18 ],
+  /* 4715 */  [ 0.301603012, 18 ],
+  /* 4716 */  [ 0.301688304, 18 ],
+  /* 4717 */  [ 0.301773602, 18 ],
+  /* 4718 */  [ 0.301858906, 18 ],
+  /* 4719 */  [ 0.301944216, 18 ],
+
+  /* 4720 */  [ 0.302029532, 18 ],
+  /* 4721 */  [ 0.302114854, 18 ],
+  /* 4722 */  [ 0.302200182, 18 ],
+  /* 4723 */  [ 0.302285516, 18 ],
+  /* 4724 */  [ 0.302370856, 18 ],
+  /* 4725 */  [ 0.302456203, 18 ],
+  /* 4726 */  [ 0.302541555, 18 ],
+  /* 4727 */  [ 0.302626913, 18 ],
+  /* 4728 */  [ 0.302712277, 18 ],
+  /* 4729 */  [ 0.302797648, 18 ],
+  /* 4730 */  [ 0.302883024, 18 ],
+  /* 4731 */  [ 0.302968406, 18 ],
+  /* 4732 */  [ 0.303053794, 18 ],
+  /* 4733 */  [ 0.303139189, 18 ],
+  /* 4734 */  [ 0.303224589, 18 ],
+  /* 4735 */  [ 0.303309995, 18 ],
+
+  /* 4736 */  [ 0.303395408, 18 ],
+  /* 4737 */  [ 0.303480826, 18 ],
+  /* 4738 */  [ 0.303566251, 18 ],
+  /* 4739 */  [ 0.303651681, 18 ],
+  /* 4740 */  [ 0.303737117, 18 ],
+  /* 4741 */  [ 0.303822560, 18 ],
+  /* 4742 */  [ 0.303908008, 18 ],
+  /* 4743 */  [ 0.303993463, 18 ],
+  /* 4744 */  [ 0.304078923, 18 ],
+  /* 4745 */  [ 0.304164390, 18 ],
+  /* 4746 */  [ 0.304249862, 18 ],
+  /* 4747 */  [ 0.304335340, 18 ],
+  /* 4748 */  [ 0.304420825, 18 ],
+  /* 4749 */  [ 0.304506315, 18 ],
+  /* 4750 */  [ 0.304591812, 18 ],
+  /* 4751 */  [ 0.304677314, 18 ],
+
+  /* 4752 */  [ 0.304762823, 18 ],
+  /* 4753 */  [ 0.304848337, 18 ],
+  /* 4754 */  [ 0.304933858, 18 ],
+  /* 4755 */  [ 0.305019384, 18 ],
+  /* 4756 */  [ 0.305104917, 18 ],
+  /* 4757 */  [ 0.305190455, 18 ],
+  /* 4758 */  [ 0.305275999, 18 ],
+  /* 4759 */  [ 0.305361550, 18 ],
+  /* 4760 */  [ 0.305447106, 18 ],
+  /* 4761 */  [ 0.305532669, 18 ],
+  /* 4762 */  [ 0.305618237, 18 ],
+  /* 4763 */  [ 0.305703811, 18 ],
+  /* 4764 */  [ 0.305789392, 18 ],
+  /* 4765 */  [ 0.305874978, 18 ],
+  /* 4766 */  [ 0.305960571, 18 ],
+  /* 4767 */  [ 0.306046169, 18 ],
+
+  /* 4768 */  [ 0.306131773, 18 ],
+  /* 4769 */  [ 0.306217383, 18 ],
+  /* 4770 */  [ 0.306303000, 18 ],
+  /* 4771 */  [ 0.306388622, 18 ],
+  /* 4772 */  [ 0.306474250, 18 ],
+  /* 4773 */  [ 0.306559885, 18 ],
+  /* 4774 */  [ 0.306645525, 18 ],
+  /* 4775 */  [ 0.306731171, 18 ],
+  /* 4776 */  [ 0.306816823, 18 ],
+  /* 4777 */  [ 0.306902481, 18 ],
+  /* 4778 */  [ 0.306988145, 18 ],
+  /* 4779 */  [ 0.307073816, 18 ],
+  /* 4780 */  [ 0.307159492, 18 ],
+  /* 4781 */  [ 0.307245174, 18 ],
+  /* 4782 */  [ 0.307330862, 18 ],
+  /* 4783 */  [ 0.307416556, 18 ],
+
+  /* 4784 */  [ 0.307502256, 18 ],
+  /* 4785 */  [ 0.307587962, 18 ],
+  /* 4786 */  [ 0.307673674, 18 ],
+  /* 4787 */  [ 0.307759392, 18 ],
+  /* 4788 */  [ 0.307845115, 18 ],
+  /* 4789 */  [ 0.307930845, 18 ],
+  /* 4790 */  [ 0.308016581, 18 ],
+  /* 4791 */  [ 0.308102323, 18 ],
+  /* 4792 */  [ 0.308188071, 18 ],
+  /* 4793 */  [ 0.308273824, 18 ],
+  /* 4794 */  [ 0.308359584, 18 ],
+  /* 4795 */  [ 0.308445350, 18 ],
+  /* 4796 */  [ 0.308531121, 18 ],
+  /* 4797 */  [ 0.308616899, 18 ],
+  /* 4798 */  [ 0.308702682, 18 ],
+  /* 4799 */  [ 0.308788472, 18 ],
+
+  /* 4800 */  [ 0.308874267, 18 ],
+  /* 4801 */  [ 0.308960068, 18 ],
+  /* 4802 */  [ 0.309045876, 18 ],
+  /* 4803 */  [ 0.309131689, 18 ],
+  /* 4804 */  [ 0.309217508, 18 ],
+  /* 4805 */  [ 0.309303334, 18 ],
+  /* 4806 */  [ 0.309389165, 18 ],
+  /* 4807 */  [ 0.309475002, 18 ],
+  /* 4808 */  [ 0.309560845, 18 ],
+  /* 4809 */  [ 0.309646694, 18 ],
+  /* 4810 */  [ 0.309732549, 18 ],
+  /* 4811 */  [ 0.309818410, 18 ],
+  /* 4812 */  [ 0.309904277, 18 ],
+  /* 4813 */  [ 0.309990150, 18 ],
+  /* 4814 */  [ 0.310076028, 18 ],
+  /* 4815 */  [ 0.310161913, 18 ],
+
+  /* 4816 */  [ 0.310247804, 18 ],
+  /* 4817 */  [ 0.310333700, 18 ],
+  /* 4818 */  [ 0.310419603, 18 ],
+  /* 4819 */  [ 0.310505511, 18 ],
+  /* 4820 */  [ 0.310591426, 18 ],
+  /* 4821 */  [ 0.310677346, 18 ],
+  /* 4822 */  [ 0.310763272, 18 ],
+  /* 4823 */  [ 0.310849205, 18 ],
+  /* 4824 */  [ 0.310935143, 18 ],
+  /* 4825 */  [ 0.311021087, 18 ],
+  /* 4826 */  [ 0.311107037, 18 ],
+  /* 4827 */  [ 0.311192993, 18 ],
+  /* 4828 */  [ 0.311278955, 18 ],
+  /* 4829 */  [ 0.311364923, 18 ],
+  /* 4830 */  [ 0.311450897, 18 ],
+  /* 4831 */  [ 0.311536877, 18 ],
+
+  /* 4832 */  [ 0.311622862, 18 ],
+  /* 4833 */  [ 0.311708854, 18 ],
+  /* 4834 */  [ 0.311794851, 18 ],
+  /* 4835 */  [ 0.311880855, 18 ],
+  /* 4836 */  [ 0.311966864, 18 ],
+  /* 4837 */  [ 0.312052880, 18 ],
+  /* 4838 */  [ 0.312138901, 18 ],
+  /* 4839 */  [ 0.312224928, 18 ],
+  /* 4840 */  [ 0.312310961, 18 ],
+  /* 4841 */  [ 0.312397000, 18 ],
+  /* 4842 */  [ 0.312483045, 18 ],
+  /* 4843 */  [ 0.312569096, 18 ],
+  /* 4844 */  [ 0.312655153, 18 ],
+  /* 4845 */  [ 0.312741216, 18 ],
+  /* 4846 */  [ 0.312827284, 18 ],
+  /* 4847 */  [ 0.312913359, 18 ],
+
+  /* 4848 */  [ 0.312999439, 18 ],
+  /* 4849 */  [ 0.313085526, 18 ],
+  /* 4850 */  [ 0.313171618, 18 ],
+  /* 4851 */  [ 0.313257716, 18 ],
+  /* 4852 */  [ 0.313343820, 18 ],
+  /* 4853 */  [ 0.313429931, 18 ],
+  /* 4854 */  [ 0.313516047, 18 ],
+  /* 4855 */  [ 0.313602168, 18 ],
+  /* 4856 */  [ 0.313688296, 18 ],
+  /* 4857 */  [ 0.313774430, 18 ],
+  /* 4858 */  [ 0.313860570, 18 ],
+  /* 4859 */  [ 0.313946715, 18 ],
+  /* 4860 */  [ 0.314032867, 18 ],
+  /* 4861 */  [ 0.314119024, 18 ],
+  /* 4862 */  [ 0.314205187, 18 ],
+  /* 4863 */  [ 0.314291357, 18 ],
+
+  /* 4864 */  [ 0.314377532, 18 ],
+  /* 4865 */  [ 0.314463713, 18 ],
+  /* 4866 */  [ 0.314549900, 18 ],
+  /* 4867 */  [ 0.314636092, 18 ],
+  /* 4868 */  [ 0.314722291, 18 ],
+  /* 4869 */  [ 0.314808496, 18 ],
+  /* 4870 */  [ 0.314894706, 18 ],
+  /* 4871 */  [ 0.314980923, 18 ],
+  /* 4872 */  [ 0.315067145, 18 ],
+  /* 4873 */  [ 0.315153373, 18 ],
+  /* 4874 */  [ 0.315239607, 18 ],
+  /* 4875 */  [ 0.315325847, 18 ],
+  /* 4876 */  [ 0.315412093, 18 ],
+  /* 4877 */  [ 0.315498345, 18 ],
+  /* 4878 */  [ 0.315584603, 18 ],
+  /* 4879 */  [ 0.315670866, 18 ],
+
+  /* 4880 */  [ 0.315757136, 18 ],
+  /* 4881 */  [ 0.315843411, 18 ],
+  /* 4882 */  [ 0.315929693, 18 ],
+  /* 4883 */  [ 0.316015980, 18 ],
+  /* 4884 */  [ 0.316102273, 18 ],
+  /* 4885 */  [ 0.316188572, 18 ],
+  /* 4886 */  [ 0.316274877, 18 ],
+  /* 4887 */  [ 0.316361187, 18 ],
+  /* 4888 */  [ 0.316447504, 18 ],
+  /* 4889 */  [ 0.316533826, 18 ],
+  /* 4890 */  [ 0.316620155, 18 ],
+  /* 4891 */  [ 0.316706489, 18 ],
+  /* 4892 */  [ 0.316792829, 18 ],
+  /* 4893 */  [ 0.316879175, 18 ],
+  /* 4894 */  [ 0.316965527, 18 ],
+  /* 4895 */  [ 0.317051885, 18 ],
+
+  /* 4896 */  [ 0.317138249, 18 ],
+  /* 4897 */  [ 0.317224618, 18 ],
+  /* 4898 */  [ 0.317310994, 18 ],
+  /* 4899 */  [ 0.317397375, 18 ],
+  /* 4900 */  [ 0.317483762, 18 ],
+  /* 4901 */  [ 0.317570155, 18 ],
+  /* 4902 */  [ 0.317656554, 18 ],
+  /* 4903 */  [ 0.317742959, 18 ],
+  /* 4904 */  [ 0.317829370, 18 ],
+  /* 4905 */  [ 0.317915786, 18 ],
+  /* 4906 */  [ 0.318002209, 18 ],
+  /* 4907 */  [ 0.318088637, 18 ],
+  /* 4908 */  [ 0.318175071, 18 ],
+  /* 4909 */  [ 0.318261511, 18 ],
+  /* 4910 */  [ 0.318347957, 18 ],
+  /* 4911 */  [ 0.318434409, 18 ],
+
+  /* 4912 */  [ 0.318520867, 18 ],
+  /* 4913 */  [ 0.318607330, 18 ],
+  /* 4914 */  [ 0.318693800, 18 ],
+  /* 4915 */  [ 0.318780275, 18 ],
+  /* 4916 */  [ 0.318866756, 18 ],
+  /* 4917 */  [ 0.318953243, 18 ],
+  /* 4918 */  [ 0.319039736, 18 ],
+  /* 4919 */  [ 0.319126235, 18 ],
+  /* 4920 */  [ 0.319212739, 18 ],
+  /* 4921 */  [ 0.319299250, 18 ],
+  /* 4922 */  [ 0.319385766, 18 ],
+  /* 4923 */  [ 0.319472288, 18 ],
+  /* 4924 */  [ 0.319558816, 18 ],
+  /* 4925 */  [ 0.319645350, 18 ],
+  /* 4926 */  [ 0.319731890, 18 ],
+  /* 4927 */  [ 0.319818435, 18 ],
+
+  /* 4928 */  [ 0.319904987, 18 ],
+  /* 4929 */  [ 0.319991544, 18 ],
+  /* 4930 */  [ 0.320078107, 18 ],
+  /* 4931 */  [ 0.320164676, 18 ],
+  /* 4932 */  [ 0.320251251, 18 ],
+  /* 4933 */  [ 0.320337832, 18 ],
+  /* 4934 */  [ 0.320424419, 18 ],
+  /* 4935 */  [ 0.320511011, 18 ],
+  /* 4936 */  [ 0.320597609, 18 ],
+  /* 4937 */  [ 0.320684213, 18 ],
+  /* 4938 */  [ 0.320770823, 18 ],
+  /* 4939 */  [ 0.320857439, 18 ],
+  /* 4940 */  [ 0.320944061, 18 ],
+  /* 4941 */  [ 0.321030688, 18 ],
+  /* 4942 */  [ 0.321117322, 18 ],
+  /* 4943 */  [ 0.321203961, 18 ],
+
+  /* 4944 */  [ 0.321290606, 18 ],
+  /* 4945 */  [ 0.321377257, 18 ],
+  /* 4946 */  [ 0.321463913, 18 ],
+  /* 4947 */  [ 0.321550576, 18 ],
+  /* 4948 */  [ 0.321637244, 18 ],
+  /* 4949 */  [ 0.321723919, 18 ],
+  /* 4950 */  [ 0.321810599, 18 ],
+  /* 4951 */  [ 0.321897285, 18 ],
+  /* 4952 */  [ 0.321983976, 18 ],
+  /* 4953 */  [ 0.322070674, 18 ],
+  /* 4954 */  [ 0.322157377, 18 ],
+  /* 4955 */  [ 0.322244087, 18 ],
+  /* 4956 */  [ 0.322330802, 18 ],
+  /* 4957 */  [ 0.322417523, 18 ],
+  /* 4958 */  [ 0.322504249, 18 ],
+  /* 4959 */  [ 0.322590982, 18 ],
+
+  /* 4960 */  [ 0.322677720, 18 ],
+  /* 4961 */  [ 0.322764465, 18 ],
+  /* 4962 */  [ 0.322851215, 18 ],
+  /* 4963 */  [ 0.322937971, 18 ],
+  /* 4964 */  [ 0.323024732, 18 ],
+  /* 4965 */  [ 0.323111500, 18 ],
+  /* 4966 */  [ 0.323198273, 18 ],
+  /* 4967 */  [ 0.323285052, 18 ],
+  /* 4968 */  [ 0.323371837, 18 ],
+  /* 4969 */  [ 0.323458628, 18 ],
+  /* 4970 */  [ 0.323545425, 18 ],
+  /* 4971 */  [ 0.323632227, 18 ],
+  /* 4972 */  [ 0.323719036, 18 ],
+  /* 4973 */  [ 0.323805850, 18 ],
+  /* 4974 */  [ 0.323892670, 18 ],
+  /* 4975 */  [ 0.323979496, 18 ],
+
+  /* 4976 */  [ 0.324066327, 18 ],
+  /* 4977 */  [ 0.324153165, 18 ],
+  /* 4978 */  [ 0.324240008, 18 ],
+  /* 4979 */  [ 0.324326857, 18 ],
+  /* 4980 */  [ 0.324413712, 18 ],
+  /* 4981 */  [ 0.324500572, 18 ],
+  /* 4982 */  [ 0.324587439, 18 ],
+  /* 4983 */  [ 0.324674311, 18 ],
+  /* 4984 */  [ 0.324761189, 18 ],
+  /* 4985 */  [ 0.324848073, 18 ],
+  /* 4986 */  [ 0.324934963, 18 ],
+  /* 4987 */  [ 0.325021858, 18 ],
+  /* 4988 */  [ 0.325108760, 18 ],
+  /* 4989 */  [ 0.325195667, 18 ],
+  /* 4990 */  [ 0.325282580, 18 ],
+  /* 4991 */  [ 0.325369498, 18 ],
+
+  /* 4992 */  [ 0.325456423, 18 ],
+  /* 4993 */  [ 0.325543353, 18 ],
+  /* 4994 */  [ 0.325630290, 18 ],
+  /* 4995 */  [ 0.325717232, 18 ],
+  /* 4996 */  [ 0.325804179, 18 ],
+  /* 4997 */  [ 0.325891133, 18 ],
+  /* 4998 */  [ 0.325978092, 18 ],
+  /* 4999 */  [ 0.326065057, 18 ],
+  /* 5000 */  [ 0.326152028, 18 ],
+  /* 5001 */  [ 0.326239005, 18 ],
+  /* 5002 */  [ 0.326325988, 18 ],
+  /* 5003 */  [ 0.326412976, 18 ],
+  /* 5004 */  [ 0.326499970, 18 ],
+  /* 5005 */  [ 0.326586970, 18 ],
+  /* 5006 */  [ 0.326673976, 18 ],
+  /* 5007 */  [ 0.326760988, 18 ],
+
+  /* 5008 */  [ 0.326848005, 18 ],
+  /* 5009 */  [ 0.326935028, 18 ],
+  /* 5010 */  [ 0.327022057, 18 ],
+  /* 5011 */  [ 0.327109092, 18 ],
+  /* 5012 */  [ 0.327196132, 18 ],
+  /* 5013 */  [ 0.327283178, 18 ],
+  /* 5014 */  [ 0.327370231, 18 ],
+  /* 5015 */  [ 0.327457288, 18 ],
+  /* 5016 */  [ 0.327544352, 18 ],
+  /* 5017 */  [ 0.327631421, 18 ],
+  /* 5018 */  [ 0.327718497, 18 ],
+  /* 5019 */  [ 0.327805578, 18 ],
+  /* 5020 */  [ 0.327892665, 18 ],
+  /* 5021 */  [ 0.327979757, 18 ],
+  /* 5022 */  [ 0.328066855, 18 ],
+  /* 5023 */  [ 0.328153960, 18 ],
+
+  /* 5024 */  [ 0.328241070, 18 ],
+  /* 5025 */  [ 0.328328185, 18 ],
+  /* 5026 */  [ 0.328415307, 18 ],
+  /* 5027 */  [ 0.328502434, 18 ],
+  /* 5028 */  [ 0.328589567, 18 ],
+  /* 5029 */  [ 0.328676706, 18 ],
+  /* 5030 */  [ 0.328763850, 18 ],
+  /* 5031 */  [ 0.328851001, 18 ],
+  /* 5032 */  [ 0.328938157, 18 ],
+  /* 5033 */  [ 0.329025319, 18 ],
+  /* 5034 */  [ 0.329112486, 18 ],
+  /* 5035 */  [ 0.329199660, 18 ],
+  /* 5036 */  [ 0.329286839, 18 ],
+  /* 5037 */  [ 0.329374024, 18 ],
+  /* 5038 */  [ 0.329461215, 18 ],
+  /* 5039 */  [ 0.329548411, 18 ],
+
+  /* 5040 */  [ 0.329635614, 18 ],
+  /* 5041 */  [ 0.329722822, 18 ],
+  /* 5042 */  [ 0.329810036, 18 ],
+  /* 5043 */  [ 0.329897255, 18 ],
+  /* 5044 */  [ 0.329984481, 18 ],
+  /* 5045 */  [ 0.330071712, 18 ],
+  /* 5046 */  [ 0.330158949, 18 ],
+  /* 5047 */  [ 0.330246191, 18 ],
+  /* 5048 */  [ 0.330333440, 18 ],
+  /* 5049 */  [ 0.330420694, 18 ],
+  /* 5050 */  [ 0.330507954, 18 ],
+  /* 5051 */  [ 0.330595220, 18 ],
+  /* 5052 */  [ 0.330682491, 18 ],
+  /* 5053 */  [ 0.330769768, 18 ],
+  /* 5054 */  [ 0.330857051, 18 ],
+  /* 5055 */  [ 0.330944340, 18 ],
+
+  /* 5056 */  [ 0.331031635, 18 ],
+  /* 5057 */  [ 0.331118935, 18 ],
+  /* 5058 */  [ 0.331206241, 18 ],
+  /* 5059 */  [ 0.331293553, 18 ],
+  /* 5060 */  [ 0.331380870, 18 ],
+  /* 5061 */  [ 0.331468193, 18 ],
+  /* 5062 */  [ 0.331555522, 18 ],
+  /* 5063 */  [ 0.331642857, 18 ],
+  /* 5064 */  [ 0.331730198, 18 ],
+  /* 5065 */  [ 0.331817544, 18 ],
+  /* 5066 */  [ 0.331904896, 18 ],
+  /* 5067 */  [ 0.331992254, 18 ],
+  /* 5068 */  [ 0.332079617, 18 ],
+  /* 5069 */  [ 0.332166986, 18 ],
+  /* 5070 */  [ 0.332254361, 18 ],
+  /* 5071 */  [ 0.332341742, 18 ],
+
+  /* 5072 */  [ 0.332429129, 18 ],
+  /* 5073 */  [ 0.332516521, 18 ],
+  /* 5074 */  [ 0.332603919, 18 ],
+  /* 5075 */  [ 0.332691323, 18 ],
+  /* 5076 */  [ 0.332778732, 18 ],
+  /* 5077 */  [ 0.332866147, 18 ],
+  /* 5078 */  [ 0.332953568, 18 ],
+  /* 5079 */  [ 0.333040995, 18 ],
+  /* 5080 */  [ 0.333128427, 18 ],
+  /* 5081 */  [ 0.333215865, 18 ],
+  /* 5082 */  [ 0.333303309, 18 ],
+  /* 5083 */  [ 0.333390759, 18 ],
+  /* 5084 */  [ 0.333478214, 18 ],
+  /* 5085 */  [ 0.333565675, 18 ],
+  /* 5086 */  [ 0.333653142, 18 ],
+  /* 5087 */  [ 0.333740615, 18 ],
+
+  /* 5088 */  [ 0.333828093, 18 ],
+  /* 5089 */  [ 0.333915577, 18 ],
+  /* 5090 */  [ 0.334003067, 18 ],
+  /* 5091 */  [ 0.334090562, 18 ],
+  /* 5092 */  [ 0.334178063, 18 ],
+  /* 5093 */  [ 0.334265570, 18 ],
+  /* 5094 */  [ 0.334353083, 18 ],
+  /* 5095 */  [ 0.334440601, 18 ],
+  /* 5096 */  [ 0.334528126, 18 ],
+  /* 5097 */  [ 0.334615655, 18 ],
+  /* 5098 */  [ 0.334703191, 18 ],
+  /* 5099 */  [ 0.334790732, 18 ],
+  /* 5100 */  [ 0.334878279, 18 ],
+  /* 5101 */  [ 0.334965832, 18 ],
+  /* 5102 */  [ 0.335053391, 18 ],
+  /* 5103 */  [ 0.335140955, 18 ],
+
+  /* 5104 */  [ 0.335228525, 18 ],
+  /* 5105 */  [ 0.335316100, 18 ],
+  /* 5106 */  [ 0.335403682, 18 ],
+  /* 5107 */  [ 0.335491269, 18 ],
+  /* 5108 */  [ 0.335578861, 18 ],
+  /* 5109 */  [ 0.335666460, 18 ],
+  /* 5110 */  [ 0.335754064, 18 ],
+  /* 5111 */  [ 0.335841674, 18 ],
+  /* 5112 */  [ 0.335929290, 18 ],
+  /* 5113 */  [ 0.336016911, 18 ],
+  /* 5114 */  [ 0.336104538, 18 ],
+  /* 5115 */  [ 0.336192171, 18 ],
+  /* 5116 */  [ 0.336279809, 18 ],
+  /* 5117 */  [ 0.336367453, 18 ],
+  /* 5118 */  [ 0.336455103, 18 ],
+  /* 5119 */  [ 0.336542759, 18 ],
+
+  /* 5120 */  [ 0.336630420, 18 ],
+  /* 5121 */  [ 0.336718087, 18 ],
+  /* 5122 */  [ 0.336805760, 18 ],
+  /* 5123 */  [ 0.336893439, 18 ],
+  /* 5124 */  [ 0.336981123, 18 ],
+  /* 5125 */  [ 0.337068813, 18 ],
+  /* 5126 */  [ 0.337156508, 18 ],
+  /* 5127 */  [ 0.337244209, 18 ],
+  /* 5128 */  [ 0.337331916, 18 ],
+  /* 5129 */  [ 0.337419629, 18 ],
+  /* 5130 */  [ 0.337507347, 18 ],
+  /* 5131 */  [ 0.337595071, 18 ],
+  /* 5132 */  [ 0.337682801, 18 ],
+  /* 5133 */  [ 0.337770537, 18 ],
+  /* 5134 */  [ 0.337858278, 18 ],
+  /* 5135 */  [ 0.337946025, 18 ],
+
+  /* 5136 */  [ 0.338033777, 18 ],
+  /* 5137 */  [ 0.338121535, 18 ],
+  /* 5138 */  [ 0.338209299, 18 ],
+  /* 5139 */  [ 0.338297069, 18 ],
+  /* 5140 */  [ 0.338384844, 18 ],
+  /* 5141 */  [ 0.338472625, 18 ],
+  /* 5142 */  [ 0.338560412, 18 ],
+  /* 5143 */  [ 0.338648204, 18 ],
+  /* 5144 */  [ 0.338736002, 18 ],
+  /* 5145 */  [ 0.338823806, 18 ],
+  /* 5146 */  [ 0.338911616, 18 ],
+  /* 5147 */  [ 0.338999431, 18 ],
+  /* 5148 */  [ 0.339087252, 18 ],
+  /* 5149 */  [ 0.339175078, 18 ],
+  /* 5150 */  [ 0.339262910, 18 ],
+  /* 5151 */  [ 0.339350748, 18 ],
+
+  /* 5152 */  [ 0.339438592, 18 ],
+  /* 5153 */  [ 0.339526441, 18 ],
+  /* 5154 */  [ 0.339614296, 18 ],
+  /* 5155 */  [ 0.339702157, 18 ],
+  /* 5156 */  [ 0.339790023, 18 ],
+  /* 5157 */  [ 0.339877895, 18 ],
+  /* 5158 */  [ 0.339965773, 18 ],
+  /* 5159 */  [ 0.340053656, 18 ],
+  /* 5160 */  [ 0.340141545, 18 ],
+  /* 5161 */  [ 0.340229440, 18 ],
+  /* 5162 */  [ 0.340317340, 18 ],
+  /* 5163 */  [ 0.340405246, 18 ],
+  /* 5164 */  [ 0.340493158, 18 ],
+  /* 5165 */  [ 0.340581075, 18 ],
+  /* 5166 */  [ 0.340668999, 18 ],
+  /* 5167 */  [ 0.340756927, 18 ],
+
+  /* 5168 */  [ 0.340844862, 18 ],
+  /* 5169 */  [ 0.340932802, 18 ],
+  /* 5170 */  [ 0.341020748, 18 ],
+  /* 5171 */  [ 0.341108699, 18 ],
+  /* 5172 */  [ 0.341196656, 18 ],
+  /* 5173 */  [ 0.341284619, 18 ],
+  /* 5174 */  [ 0.341372587, 18 ],
+  /* 5175 */  [ 0.341460562, 18 ],
+  /* 5176 */  [ 0.341548541, 18 ],
+  /* 5177 */  [ 0.341636527, 18 ],
+  /* 5178 */  [ 0.341724518, 18 ],
+  /* 5179 */  [ 0.341812515, 18 ],
+  /* 5180 */  [ 0.341900517, 18 ],
+  /* 5181 */  [ 0.341988525, 18 ],
+  /* 5182 */  [ 0.342076539, 18 ],
+  /* 5183 */  [ 0.342164558, 18 ],
+
+  /* 5184 */  [ 0.342252584, 18 ],
+  /* 5185 */  [ 0.342340614, 18 ],
+  /* 5186 */  [ 0.342428651, 18 ],
+  /* 5187 */  [ 0.342516693, 18 ],
+  /* 5188 */  [ 0.342604741, 18 ],
+  /* 5189 */  [ 0.342692794, 18 ],
+  /* 5190 */  [ 0.342780853, 18 ],
+  /* 5191 */  [ 0.342868918, 18 ],
+  /* 5192 */  [ 0.342956988, 18 ],
+  /* 5193 */  [ 0.343045064, 18 ],
+  /* 5194 */  [ 0.343133146, 18 ],
+  /* 5195 */  [ 0.343221233, 18 ],
+  /* 5196 */  [ 0.343309326, 18 ],
+  /* 5197 */  [ 0.343397425, 18 ],
+  /* 5198 */  [ 0.343485529, 18 ],
+  /* 5199 */  [ 0.343573639, 18 ],
+
+  /* 5200 */  [ 0.343661754, 18 ],
+  /* 5201 */  [ 0.343749876, 18 ],
+  /* 5202 */  [ 0.343838003, 18 ],
+  /* 5203 */  [ 0.343926135, 18 ],
+  /* 5204 */  [ 0.344014273, 18 ],
+  /* 5205 */  [ 0.344102417, 18 ],
+  /* 5206 */  [ 0.344190566, 18 ],
+  /* 5207 */  [ 0.344278722, 18 ],
+  /* 5208 */  [ 0.344366882, 18 ],
+  /* 5209 */  [ 0.344455049, 18 ],
+  /* 5210 */  [ 0.344543221, 18 ],
+  /* 5211 */  [ 0.344631398, 18 ],
+  /* 5212 */  [ 0.344719582, 18 ],
+  /* 5213 */  [ 0.344807771, 18 ],
+  /* 5214 */  [ 0.344895965, 18 ],
+  /* 5215 */  [ 0.344984165, 18 ],
+
+  /* 5216 */  [ 0.345072371, 18 ],
+  /* 5217 */  [ 0.345160583, 18 ],
+  /* 5218 */  [ 0.345248800, 18 ],
+  /* 5219 */  [ 0.345337023, 18 ],
+  /* 5220 */  [ 0.345425251, 18 ],
+  /* 5221 */  [ 0.345513485, 18 ],
+  /* 5222 */  [ 0.345601725, 18 ],
+  /* 5223 */  [ 0.345689970, 18 ],
+  /* 5224 */  [ 0.345778221, 18 ],
+  /* 5225 */  [ 0.345866478, 18 ],
+  /* 5226 */  [ 0.345954740, 18 ],
+  /* 5227 */  [ 0.346043008, 18 ],
+  /* 5228 */  [ 0.346131281, 18 ],
+  /* 5229 */  [ 0.346219560, 18 ],
+  /* 5230 */  [ 0.346307845, 18 ],
+  /* 5231 */  [ 0.346396135, 18 ],
+
+  /* 5232 */  [ 0.346484431, 18 ],
+  /* 5233 */  [ 0.346572733, 18 ],
+  /* 5234 */  [ 0.346661040, 18 ],
+  /* 5235 */  [ 0.346749353, 18 ],
+  /* 5236 */  [ 0.346837671, 18 ],
+  /* 5237 */  [ 0.346925996, 18 ],
+  /* 5238 */  [ 0.347014325, 18 ],
+  /* 5239 */  [ 0.347102661, 18 ],
+  /* 5240 */  [ 0.347191002, 18 ],
+  /* 5241 */  [ 0.347279348, 18 ],
+  /* 5242 */  [ 0.347367700, 18 ],
+  /* 5243 */  [ 0.347456058, 18 ],
+  /* 5244 */  [ 0.347544422, 18 ],
+  /* 5245 */  [ 0.347632791, 18 ],
+  /* 5246 */  [ 0.347721165, 18 ],
+  /* 5247 */  [ 0.347809546, 18 ],
+
+  /* 5248 */  [ 0.347897931, 18 ],
+  /* 5249 */  [ 0.347986323, 18 ],
+  /* 5250 */  [ 0.348074720, 18 ],
+  /* 5251 */  [ 0.348163123, 18 ],
+  /* 5252 */  [ 0.348251531, 18 ],
+  /* 5253 */  [ 0.348339945, 18 ],
+  /* 5254 */  [ 0.348428365, 18 ],
+  /* 5255 */  [ 0.348516790, 18 ],
+  /* 5256 */  [ 0.348605221, 18 ],
+  /* 5257 */  [ 0.348693657, 18 ],
+  /* 5258 */  [ 0.348782099, 18 ],
+  /* 5259 */  [ 0.348870547, 18 ],
+  /* 5260 */  [ 0.348959000, 18 ],
+  /* 5261 */  [ 0.349047459, 18 ],
+  /* 5262 */  [ 0.349135923, 18 ],
+  /* 5263 */  [ 0.349224393, 18 ],
+
+  /* 5264 */  [ 0.349312869, 18 ],
+  /* 5265 */  [ 0.349401350, 18 ],
+  /* 5266 */  [ 0.349489837, 18 ],
+  /* 5267 */  [ 0.349578329, 18 ],
+  /* 5268 */  [ 0.349666827, 18 ],
+  /* 5269 */  [ 0.349755331, 18 ],
+  /* 5270 */  [ 0.349843840, 18 ],
+  /* 5271 */  [ 0.349932355, 18 ],
+  /* 5272 */  [ 0.350020876, 18 ],
+  /* 5273 */  [ 0.350109402, 18 ],
+  /* 5274 */  [ 0.350197933, 18 ],
+  /* 5275 */  [ 0.350286470, 18 ],
+  /* 5276 */  [ 0.350375013, 18 ],
+  /* 5277 */  [ 0.350463562, 18 ],
+  /* 5278 */  [ 0.350552116, 18 ],
+  /* 5279 */  [ 0.350640675, 18 ],
+
+  /* 5280 */  [ 0.350729240, 18 ],
+  /* 5281 */  [ 0.350817811, 18 ],
+  /* 5282 */  [ 0.350906388, 18 ],
+  /* 5283 */  [ 0.350994970, 18 ],
+  /* 5284 */  [ 0.351083557, 18 ],
+  /* 5285 */  [ 0.351172150, 18 ],
+  /* 5286 */  [ 0.351260749, 18 ],
+  /* 5287 */  [ 0.351349353, 18 ],
+  /* 5288 */  [ 0.351437963, 18 ],
+  /* 5289 */  [ 0.351526579, 18 ],
+  /* 5290 */  [ 0.351615200, 18 ],
+  /* 5291 */  [ 0.351703827, 18 ],
+  /* 5292 */  [ 0.351792459, 18 ],
+  /* 5293 */  [ 0.351881097, 18 ],
+  /* 5294 */  [ 0.351969740, 18 ],
+  /* 5295 */  [ 0.352058389, 18 ],
+
+  /* 5296 */  [ 0.352147044, 18 ],
+  /* 5297 */  [ 0.352235704, 18 ],
+  /* 5298 */  [ 0.352324369, 18 ],
+  /* 5299 */  [ 0.352413041, 18 ],
+  /* 5300 */  [ 0.352501718, 18 ],
+  /* 5301 */  [ 0.352590400, 18 ],
+  /* 5302 */  [ 0.352679088, 18 ],
+  /* 5303 */  [ 0.352767782, 18 ],
+  /* 5304 */  [ 0.352856481, 18 ],
+  /* 5305 */  [ 0.352945186, 18 ],
+  /* 5306 */  [ 0.353033896, 18 ],
+  /* 5307 */  [ 0.353122612, 18 ],
+  /* 5308 */  [ 0.353211333, 18 ],
+  /* 5309 */  [ 0.353300061, 18 ],
+  /* 5310 */  [ 0.353388793, 18 ],
+  /* 5311 */  [ 0.353477531, 18 ],
+
+  /* 5312 */  [ 0.353566275, 18 ],
+  /* 5313 */  [ 0.353655024, 18 ],
+  /* 5314 */  [ 0.353743779, 18 ],
+  /* 5315 */  [ 0.353832540, 18 ],
+  /* 5316 */  [ 0.353921306, 18 ],
+  /* 5317 */  [ 0.354010077, 18 ],
+  /* 5318 */  [ 0.354098855, 18 ],
+  /* 5319 */  [ 0.354187637, 18 ],
+  /* 5320 */  [ 0.354276426, 18 ],
+  /* 5321 */  [ 0.354365220, 18 ],
+  /* 5322 */  [ 0.354454019, 18 ],
+  /* 5323 */  [ 0.354542824, 18 ],
+  /* 5324 */  [ 0.354631635, 18 ],
+  /* 5325 */  [ 0.354720451, 18 ],
+  /* 5326 */  [ 0.354809272, 18 ],
+  /* 5327 */  [ 0.354898100, 18 ],
+
+  /* 5328 */  [ 0.354986932, 18 ],
+  /* 5329 */  [ 0.355075771, 18 ],
+  /* 5330 */  [ 0.355164615, 18 ],
+  /* 5331 */  [ 0.355253464, 18 ],
+  /* 5332 */  [ 0.355342319, 18 ],
+  /* 5333 */  [ 0.355431180, 18 ],
+  /* 5334 */  [ 0.355520046, 18 ],
+  /* 5335 */  [ 0.355608917, 18 ],
+  /* 5336 */  [ 0.355697795, 18 ],
+  /* 5337 */  [ 0.355786677, 18 ],
+  /* 5338 */  [ 0.355875566, 18 ],
+  /* 5339 */  [ 0.355964460, 18 ],
+  /* 5340 */  [ 0.356053359, 18 ],
+  /* 5341 */  [ 0.356142264, 18 ],
+  /* 5342 */  [ 0.356231175, 18 ],
+  /* 5343 */  [ 0.356320091, 18 ],
+
+  /* 5344 */  [ 0.356409012, 18 ],
+  /* 5345 */  [ 0.356497940, 18 ],
+  /* 5346 */  [ 0.356586872, 18 ],
+  /* 5347 */  [ 0.356675811, 18 ],
+  /* 5348 */  [ 0.356764754, 18 ],
+  /* 5349 */  [ 0.356853704, 18 ],
+  /* 5350 */  [ 0.356942659, 18 ],
+  /* 5351 */  [ 0.357031619, 18 ],
+  /* 5352 */  [ 0.357120585, 18 ],
+  /* 5353 */  [ 0.357209557, 18 ],
+  /* 5354 */  [ 0.357298534, 18 ],
+  /* 5355 */  [ 0.357387516, 18 ],
+  /* 5356 */  [ 0.357476504, 18 ],
+  /* 5357 */  [ 0.357565498, 18 ],
+  /* 5358 */  [ 0.357654497, 18 ],
+  /* 5359 */  [ 0.357743502, 18 ],
+
+  /* 5360 */  [ 0.357832512, 18 ],
+  /* 5361 */  [ 0.357921528, 18 ],
+  /* 5362 */  [ 0.358010550, 18 ],
+  /* 5363 */  [ 0.358099576, 18 ],
+  /* 5364 */  [ 0.358188609, 18 ],
+  /* 5365 */  [ 0.358277647, 18 ],
+  /* 5366 */  [ 0.358366690, 18 ],
+  /* 5367 */  [ 0.358455739, 18 ],
+  /* 5368 */  [ 0.358544794, 18 ],
+  /* 5369 */  [ 0.358633854, 18 ],
+  /* 5370 */  [ 0.358722920, 18 ],
+  /* 5371 */  [ 0.358811991, 18 ],
+  /* 5372 */  [ 0.358901067, 18 ],
+  /* 5373 */  [ 0.358990150, 18 ],
+  /* 5374 */  [ 0.359079237, 18 ],
+  /* 5375 */  [ 0.359168331, 18 ],
+
+  /* 5376 */  [ 0.359257429, 18 ],
+  /* 5377 */  [ 0.359346534, 18 ],
+  /* 5378 */  [ 0.359435644, 18 ],
+  /* 5379 */  [ 0.359524759, 18 ],
+  /* 5380 */  [ 0.359613880, 18 ],
+  /* 5381 */  [ 0.359703006, 18 ],
+  /* 5382 */  [ 0.359792138, 18 ],
+  /* 5383 */  [ 0.359881276, 18 ],
+  /* 5384 */  [ 0.359970419, 18 ],
+  /* 5385 */  [ 0.360059567, 18 ],
+  /* 5386 */  [ 0.360148721, 18 ],
+  /* 5387 */  [ 0.360237881, 18 ],
+  /* 5388 */  [ 0.360327046, 18 ],
+  /* 5389 */  [ 0.360416216, 18 ],
+  /* 5390 */  [ 0.360505392, 18 ],
+  /* 5391 */  [ 0.360594574, 18 ],
+
+  /* 5392 */  [ 0.360683761, 18 ],
+  /* 5393 */  [ 0.360772953, 18 ],
+  /* 5394 */  [ 0.360862152, 18 ],
+  /* 5395 */  [ 0.360951355, 18 ],
+  /* 5396 */  [ 0.361040564, 18 ],
+  /* 5397 */  [ 0.361129779, 18 ],
+  /* 5398 */  [ 0.361218999, 18 ],
+  /* 5399 */  [ 0.361308225, 18 ],
+  /* 5400 */  [ 0.361397456, 18 ],
+  /* 5401 */  [ 0.361486693, 18 ],
+  /* 5402 */  [ 0.361575935, 18 ],
+  /* 5403 */  [ 0.361665183, 18 ],
+  /* 5404 */  [ 0.361754436, 18 ],
+  /* 5405 */  [ 0.361843695, 18 ],
+  /* 5406 */  [ 0.361932959, 18 ],
+  /* 5407 */  [ 0.362022229, 18 ],
+
+  /* 5408 */  [ 0.362111504, 18 ],
+  /* 5409 */  [ 0.362200785, 18 ],
+  /* 5410 */  [ 0.362290071, 18 ],
+  /* 5411 */  [ 0.362379362, 18 ],
+  /* 5412 */  [ 0.362468660, 18 ],
+  /* 5413 */  [ 0.362557962, 18 ],
+  /* 5414 */  [ 0.362647271, 18 ],
+  /* 5415 */  [ 0.362736584, 18 ],
+  /* 5416 */  [ 0.362825904, 18 ],
+  /* 5417 */  [ 0.362915228, 18 ],
+  /* 5418 */  [ 0.363004559, 18 ],
+  /* 5419 */  [ 0.363093894, 18 ],
+  /* 5420 */  [ 0.363183236, 18 ],
+  /* 5421 */  [ 0.363272582, 18 ],
+  /* 5422 */  [ 0.363361935, 18 ],
+  /* 5423 */  [ 0.363451292, 18 ],
+
+  /* 5424 */  [ 0.363540655, 18 ],
+  /* 5425 */  [ 0.363630024, 18 ],
+  /* 5426 */  [ 0.363719398, 18 ],
+  /* 5427 */  [ 0.363808778, 18 ],
+  /* 5428 */  [ 0.363898163, 18 ],
+  /* 5429 */  [ 0.363987554, 18 ],
+  /* 5430 */  [ 0.364076950, 18 ],
+  /* 5431 */  [ 0.364166352, 18 ],
+  /* 5432 */  [ 0.364255759, 18 ],
+  /* 5433 */  [ 0.364345171, 18 ],
+  /* 5434 */  [ 0.364434589, 18 ],
+  /* 5435 */  [ 0.364524013, 18 ],
+  /* 5436 */  [ 0.364613442, 18 ],
+  /* 5437 */  [ 0.364702877, 18 ],
+  /* 5438 */  [ 0.364792317, 18 ],
+  /* 5439 */  [ 0.364881762, 18 ],
+
+  /* 5440 */  [ 0.364971213, 18 ],
+  /* 5441 */  [ 0.365060669, 18 ],
+  /* 5442 */  [ 0.365150131, 18 ],
+  /* 5443 */  [ 0.365239599, 18 ],
+  /* 5444 */  [ 0.365329072, 18 ],
+  /* 5445 */  [ 0.365418550, 18 ],
+  /* 5446 */  [ 0.365508034, 18 ],
+  /* 5447 */  [ 0.365597523, 18 ],
+  /* 5448 */  [ 0.365687018, 18 ],
+  /* 5449 */  [ 0.365776518, 18 ],
+  /* 5450 */  [ 0.365866024, 18 ],
+  /* 5451 */  [ 0.365955536, 18 ],
+  /* 5452 */  [ 0.366045052, 18 ],
+  /* 5453 */  [ 0.366134574, 18 ],
+  /* 5454 */  [ 0.366224102, 18 ],
+  /* 5455 */  [ 0.366313635, 18 ],
+
+  /* 5456 */  [ 0.366403174, 18 ],
+  /* 5457 */  [ 0.366492718, 18 ],
+  /* 5458 */  [ 0.366582267, 18 ],
+  /* 5459 */  [ 0.366671822, 18 ],
+  /* 5460 */  [ 0.366761383, 18 ],
+  /* 5461 */  [ 0.366850949, 18 ],
+  /* 5462 */  [ 0.366940520, 18 ],
+  /* 5463 */  [ 0.367030097, 18 ],
+  /* 5464 */  [ 0.367119680, 18 ],
+  /* 5465 */  [ 0.367209267, 18 ],
+  /* 5466 */  [ 0.367298861, 18 ],
+  /* 5467 */  [ 0.367388459, 18 ],
+  /* 5468 */  [ 0.367478064, 18 ],
+  /* 5469 */  [ 0.367567673, 18 ],
+  /* 5470 */  [ 0.367657288, 18 ],
+  /* 5471 */  [ 0.367746909, 18 ],
+
+  /* 5472 */  [ 0.367836535, 18 ],
+  /* 5473 */  [ 0.367926167, 18 ],
+  /* 5474 */  [ 0.368015804, 18 ],
+  /* 5475 */  [ 0.368105446, 18 ],
+  /* 5476 */  [ 0.368195094, 18 ],
+  /* 5477 */  [ 0.368284747, 18 ],
+  /* 5478 */  [ 0.368374406, 18 ],
+  /* 5479 */  [ 0.368464070, 18 ],
+  /* 5480 */  [ 0.368553740, 18 ],
+  /* 5481 */  [ 0.368643415, 18 ],
+  /* 5482 */  [ 0.368733096, 18 ],
+  /* 5483 */  [ 0.368822782, 18 ],
+  /* 5484 */  [ 0.368912473, 18 ],
+  /* 5485 */  [ 0.369002170, 18 ],
+  /* 5486 */  [ 0.369091873, 18 ],
+  /* 5487 */  [ 0.369181581, 18 ],
+
+  /* 5488 */  [ 0.369271294, 18 ],
+  /* 5489 */  [ 0.369361013, 18 ],
+  /* 5490 */  [ 0.369450737, 18 ],
+  /* 5491 */  [ 0.369540467, 18 ],
+  /* 5492 */  [ 0.369630202, 18 ],
+  /* 5493 */  [ 0.369719942, 18 ],
+  /* 5494 */  [ 0.369809688, 18 ],
+  /* 5495 */  [ 0.369899440, 18 ],
+  /* 5496 */  [ 0.369989197, 18 ],
+  /* 5497 */  [ 0.370078959, 18 ],
+  /* 5498 */  [ 0.370168727, 18 ],
+  /* 5499 */  [ 0.370258500, 18 ],
+  /* 5500 */  [ 0.370348279, 18 ],
+  /* 5501 */  [ 0.370438063, 18 ],
+  /* 5502 */  [ 0.370527853, 18 ],
+  /* 5503 */  [ 0.370617648, 18 ],
+
+  /* 5504 */  [ 0.370707448, 18 ],
+  /* 5505 */  [ 0.370797254, 18 ],
+  /* 5506 */  [ 0.370887065, 18 ],
+  /* 5507 */  [ 0.370976882, 18 ],
+  /* 5508 */  [ 0.371066704, 18 ],
+  /* 5509 */  [ 0.371156532, 18 ],
+  /* 5510 */  [ 0.371246365, 18 ],
+  /* 5511 */  [ 0.371336203, 18 ],
+  /* 5512 */  [ 0.371426047, 18 ],
+  /* 5513 */  [ 0.371515897, 18 ],
+  /* 5514 */  [ 0.371605751, 18 ],
+  /* 5515 */  [ 0.371695612, 18 ],
+  /* 5516 */  [ 0.371785477, 18 ],
+  /* 5517 */  [ 0.371875348, 18 ],
+  /* 5518 */  [ 0.371965225, 18 ],
+  /* 5519 */  [ 0.372055107, 18 ],
+
+  /* 5520 */  [ 0.372144994, 18 ],
+  /* 5521 */  [ 0.372234887, 18 ],
+  /* 5522 */  [ 0.372324785, 18 ],
+  /* 5523 */  [ 0.372414689, 18 ],
+  /* 5524 */  [ 0.372504598, 18 ],
+  /* 5525 */  [ 0.372594513, 18 ],
+  /* 5526 */  [ 0.372684433, 18 ],
+  /* 5527 */  [ 0.372774358, 18 ],
+  /* 5528 */  [ 0.372864289, 18 ],
+  /* 5529 */  [ 0.372954225, 18 ],
+  /* 5530 */  [ 0.373044167, 18 ],
+  /* 5531 */  [ 0.373134114, 18 ],
+  /* 5532 */  [ 0.373224066, 18 ],
+  /* 5533 */  [ 0.373314024, 18 ],
+  /* 5534 */  [ 0.373403987, 18 ],
+  /* 5535 */  [ 0.373493956, 18 ],
+
+  /* 5536 */  [ 0.373583930, 18 ],
+  /* 5537 */  [ 0.373673910, 18 ],
+  /* 5538 */  [ 0.373763895, 18 ],
+  /* 5539 */  [ 0.373853885, 18 ],
+  /* 5540 */  [ 0.373943881, 18 ],
+  /* 5541 */  [ 0.374033882, 18 ],
+  /* 5542 */  [ 0.374123889, 18 ],
+  /* 5543 */  [ 0.374213901, 18 ],
+  /* 5544 */  [ 0.374303918, 18 ],
+  /* 5545 */  [ 0.374393941, 18 ],
+  /* 5546 */  [ 0.374483970, 18 ],
+  /* 5547 */  [ 0.374574003, 18 ],
+  /* 5548 */  [ 0.374664042, 18 ],
+  /* 5549 */  [ 0.374754087, 18 ],
+  /* 5550 */  [ 0.374844137, 18 ],
+  /* 5551 */  [ 0.374934192, 18 ],
+
+  /* 5552 */  [ 0.375024253, 18 ],
+  /* 5553 */  [ 0.375114319, 18 ],
+  /* 5554 */  [ 0.375204391, 18 ],
+  /* 5555 */  [ 0.375294468, 18 ],
+  /* 5556 */  [ 0.375384550, 18 ],
+  /* 5557 */  [ 0.375474638, 18 ],
+  /* 5558 */  [ 0.375564731, 18 ],
+  /* 5559 */  [ 0.375654830, 18 ],
+  /* 5560 */  [ 0.375744934, 18 ],
+  /* 5561 */  [ 0.375835043, 18 ],
+  /* 5562 */  [ 0.375925158, 18 ],
+  /* 5563 */  [ 0.376015278, 18 ],
+  /* 5564 */  [ 0.376105404, 18 ],
+  /* 5565 */  [ 0.376195535, 18 ],
+  /* 5566 */  [ 0.376285671, 18 ],
+  /* 5567 */  [ 0.376375813, 18 ],
+
+  /* 5568 */  [ 0.376465960, 18 ],
+  /* 5569 */  [ 0.376556113, 18 ],
+  /* 5570 */  [ 0.376646271, 18 ],
+  /* 5571 */  [ 0.376736434, 18 ],
+  /* 5572 */  [ 0.376826603, 18 ],
+  /* 5573 */  [ 0.376916777, 18 ],
+  /* 5574 */  [ 0.377006957, 18 ],
+  /* 5575 */  [ 0.377097141, 18 ],
+  /* 5576 */  [ 0.377187332, 18 ],
+  /* 5577 */  [ 0.377277528, 18 ],
+  /* 5578 */  [ 0.377367729, 18 ],
+  /* 5579 */  [ 0.377457935, 18 ],
+  /* 5580 */  [ 0.377548147, 18 ],
+  /* 5581 */  [ 0.377638364, 18 ],
+  /* 5582 */  [ 0.377728587, 18 ],
+  /* 5583 */  [ 0.377818815, 18 ],
+
+  /* 5584 */  [ 0.377909049, 18 ],
+  /* 5585 */  [ 0.377999288, 18 ],
+  /* 5586 */  [ 0.378089532, 18 ],
+  /* 5587 */  [ 0.378179781, 18 ],
+  /* 5588 */  [ 0.378270036, 18 ],
+  /* 5589 */  [ 0.378360297, 18 ],
+  /* 5590 */  [ 0.378450563, 18 ],
+  /* 5591 */  [ 0.378540834, 18 ],
+  /* 5592 */  [ 0.378631110, 18 ],
+  /* 5593 */  [ 0.378721392, 18 ],
+  /* 5594 */  [ 0.378811680, 18 ],
+  /* 5595 */  [ 0.378901972, 18 ],
+  /* 5596 */  [ 0.378992270, 18 ],
+  /* 5597 */  [ 0.379082574, 18 ],
+  /* 5598 */  [ 0.379172883, 18 ],
+  /* 5599 */  [ 0.379263197, 18 ],
+
+  /* 5600 */  [ 0.379353516, 18 ],
+  /* 5601 */  [ 0.379443841, 18 ],
+  /* 5602 */  [ 0.379534172, 18 ],
+  /* 5603 */  [ 0.379624507, 18 ],
+  /* 5604 */  [ 0.379714848, 18 ],
+  /* 5605 */  [ 0.379805195, 18 ],
+  /* 5606 */  [ 0.379895547, 18 ],
+  /* 5607 */  [ 0.379985904, 18 ],
+  /* 5608 */  [ 0.380076266, 18 ],
+  /* 5609 */  [ 0.380166634, 18 ],
+  /* 5610 */  [ 0.380257008, 18 ],
+  /* 5611 */  [ 0.380347386, 18 ],
+  /* 5612 */  [ 0.380437770, 18 ],
+  /* 5613 */  [ 0.380528160, 18 ],
+  /* 5614 */  [ 0.380618555, 18 ],
+  /* 5615 */  [ 0.380708955, 18 ],
+
+  /* 5616 */  [ 0.380799360, 18 ],
+  /* 5617 */  [ 0.380889771, 18 ],
+  /* 5618 */  [ 0.380980187, 18 ],
+  /* 5619 */  [ 0.381070609, 18 ],
+  /* 5620 */  [ 0.381161036, 18 ],
+  /* 5621 */  [ 0.381251468, 18 ],
+  /* 5622 */  [ 0.381341906, 18 ],
+  /* 5623 */  [ 0.381432349, 18 ],
+  /* 5624 */  [ 0.381522798, 18 ],
+  /* 5625 */  [ 0.381613251, 18 ],
+  /* 5626 */  [ 0.381703711, 18 ],
+  /* 5627 */  [ 0.381794175, 18 ],
+  /* 5628 */  [ 0.381884645, 18 ],
+  /* 5629 */  [ 0.381975120, 18 ],
+  /* 5630 */  [ 0.382065601, 18 ],
+  /* 5631 */  [ 0.382156087, 18 ],
+
+  /* 5632 */  [ 0.382246578, 18 ],
+  /* 5633 */  [ 0.382337075, 18 ],
+  /* 5634 */  [ 0.382427577, 18 ],
+  /* 5635 */  [ 0.382518084, 18 ],
+  /* 5636 */  [ 0.382608597, 18 ],
+  /* 5637 */  [ 0.382699115, 18 ],
+  /* 5638 */  [ 0.382789638, 18 ],
+  /* 5639 */  [ 0.382880167, 18 ],
+  /* 5640 */  [ 0.382970701, 18 ],
+  /* 5641 */  [ 0.383061241, 18 ],
+  /* 5642 */  [ 0.383151786, 18 ],
+  /* 5643 */  [ 0.383242336, 18 ],
+  /* 5644 */  [ 0.383332891, 18 ],
+  /* 5645 */  [ 0.383423452, 18 ],
+  /* 5646 */  [ 0.383514018, 18 ],
+  /* 5647 */  [ 0.383604590, 18 ],
+
+  /* 5648 */  [ 0.383695167, 18 ],
+  /* 5649 */  [ 0.383785749, 18 ],
+  /* 5650 */  [ 0.383876337, 18 ],
+  /* 5651 */  [ 0.383966930, 18 ],
+  /* 5652 */  [ 0.384057528, 18 ],
+  /* 5653 */  [ 0.384148132, 18 ],
+  /* 5654 */  [ 0.384238741, 18 ],
+  /* 5655 */  [ 0.384329355, 18 ],
+  /* 5656 */  [ 0.384419975, 18 ],
+  /* 5657 */  [ 0.384510600, 18 ],
+  /* 5658 */  [ 0.384601230, 18 ],
+  /* 5659 */  [ 0.384691866, 18 ],
+  /* 5660 */  [ 0.384782507, 18 ],
+  /* 5661 */  [ 0.384873153, 18 ],
+  /* 5662 */  [ 0.384963805, 18 ],
+  /* 5663 */  [ 0.385054462, 18 ],
+
+  /* 5664 */  [ 0.385145124, 18 ],
+  /* 5665 */  [ 0.385235792, 18 ],
+  /* 5666 */  [ 0.385326465, 18 ],
+  /* 5667 */  [ 0.385417143, 18 ],
+  /* 5668 */  [ 0.385507827, 18 ],
+  /* 5669 */  [ 0.385598516, 18 ],
+  /* 5670 */  [ 0.385689211, 18 ],
+  /* 5671 */  [ 0.385779910, 18 ],
+  /* 5672 */  [ 0.385870615, 18 ],
+  /* 5673 */  [ 0.385961326, 18 ],
+  /* 5674 */  [ 0.386052041, 18 ],
+  /* 5675 */  [ 0.386142762, 18 ],
+  /* 5676 */  [ 0.386233489, 18 ],
+  /* 5677 */  [ 0.386324221, 18 ],
+  /* 5678 */  [ 0.386414958, 18 ],
+  /* 5679 */  [ 0.386505700, 18 ],
+
+  /* 5680 */  [ 0.386596448, 18 ],
+  /* 5681 */  [ 0.386687201, 18 ],
+  /* 5682 */  [ 0.386777959, 18 ],
+  /* 5683 */  [ 0.386868723, 18 ],
+  /* 5684 */  [ 0.386959492, 18 ],
+  /* 5685 */  [ 0.387050266, 18 ],
+  /* 5686 */  [ 0.387141045, 18 ],
+  /* 5687 */  [ 0.387231830, 18 ],
+  /* 5688 */  [ 0.387322621, 18 ],
+  /* 5689 */  [ 0.387413416, 18 ],
+  /* 5690 */  [ 0.387504217, 18 ],
+  /* 5691 */  [ 0.387595023, 18 ],
+  /* 5692 */  [ 0.387685835, 18 ],
+  /* 5693 */  [ 0.387776652, 18 ],
+  /* 5694 */  [ 0.387867474, 18 ],
+  /* 5695 */  [ 0.387958301, 18 ],
+
+  /* 5696 */  [ 0.388049134, 18 ],
+  /* 5697 */  [ 0.388139972, 18 ],
+  /* 5698 */  [ 0.388230816, 18 ],
+  /* 5699 */  [ 0.388321665, 18 ],
+  /* 5700 */  [ 0.388412519, 18 ],
+  /* 5701 */  [ 0.388503378, 18 ],
+  /* 5702 */  [ 0.388594243, 18 ],
+  /* 5703 */  [ 0.388685113, 18 ],
+  /* 5704 */  [ 0.388775988, 18 ],
+  /* 5705 */  [ 0.388866869, 18 ],
+  /* 5706 */  [ 0.388957755, 18 ],
+  /* 5707 */  [ 0.389048646, 18 ],
+  /* 5708 */  [ 0.389139542, 18 ],
+  /* 5709 */  [ 0.389230444, 18 ],
+  /* 5710 */  [ 0.389321352, 18 ],
+  /* 5711 */  [ 0.389412264, 18 ],
+
+  /* 5712 */  [ 0.389503182, 18 ],
+  /* 5713 */  [ 0.389594105, 18 ],
+  /* 5714 */  [ 0.389685033, 18 ],
+  /* 5715 */  [ 0.389775967, 18 ],
+  /* 5716 */  [ 0.389866906, 18 ],
+  /* 5717 */  [ 0.389957850, 18 ],
+  /* 5718 */  [ 0.390048800, 18 ],
+  /* 5719 */  [ 0.390139755, 18 ],
+  /* 5720 */  [ 0.390230715, 18 ],
+  /* 5721 */  [ 0.390321681, 18 ],
+  /* 5722 */  [ 0.390412651, 18 ],
+  /* 5723 */  [ 0.390503628, 18 ],
+  /* 5724 */  [ 0.390594609, 18 ],
+  /* 5725 */  [ 0.390685596, 18 ],
+  /* 5726 */  [ 0.390776588, 18 ],
+  /* 5727 */  [ 0.390867585, 18 ],
+
+  /* 5728 */  [ 0.390958588, 18 ],
+  /* 5729 */  [ 0.391049596, 18 ],
+  /* 5730 */  [ 0.391140609, 18 ],
+  /* 5731 */  [ 0.391231627, 18 ],
+  /* 5732 */  [ 0.391322651, 18 ],
+  /* 5733 */  [ 0.391413680, 18 ],
+  /* 5734 */  [ 0.391504714, 18 ],
+  /* 5735 */  [ 0.391595754, 18 ],
+  /* 5736 */  [ 0.391686799, 18 ],
+  /* 5737 */  [ 0.391777849, 18 ],
+  /* 5738 */  [ 0.391868905, 18 ],
+  /* 5739 */  [ 0.391959966, 18 ],
+  /* 5740 */  [ 0.392051032, 18 ],
+  /* 5741 */  [ 0.392142103, 18 ],
+  /* 5742 */  [ 0.392233180, 18 ],
+  /* 5743 */  [ 0.392324262, 18 ],
+
+  /* 5744 */  [ 0.392415349, 18 ],
+  /* 5745 */  [ 0.392506442, 18 ],
+  /* 5746 */  [ 0.392597540, 18 ],
+  /* 5747 */  [ 0.392688643, 18 ],
+  /* 5748 */  [ 0.392779751, 18 ],
+  /* 5749 */  [ 0.392870865, 18 ],
+  /* 5750 */  [ 0.392961984, 18 ],
+  /* 5751 */  [ 0.393053108, 18 ],
+  /* 5752 */  [ 0.393144238, 18 ],
+  /* 5753 */  [ 0.393235372, 18 ],
+  /* 5754 */  [ 0.393326513, 18 ],
+  /* 5755 */  [ 0.393417658, 18 ],
+  /* 5756 */  [ 0.393508809, 18 ],
+  /* 5757 */  [ 0.393599965, 18 ],
+  /* 5758 */  [ 0.393691126, 18 ],
+  /* 5759 */  [ 0.393782292, 18 ],
+
+  /* 5760 */  [ 0.393873464, 18 ],
+  /* 5761 */  [ 0.393964641, 18 ],
+  /* 5762 */  [ 0.394055823, 18 ],
+  /* 5763 */  [ 0.394147011, 18 ],
+  /* 5764 */  [ 0.394238204, 18 ],
+  /* 5765 */  [ 0.394329402, 18 ],
+  /* 5766 */  [ 0.394420605, 18 ],
+  /* 5767 */  [ 0.394511814, 18 ],
+  /* 5768 */  [ 0.394603028, 18 ],
+  /* 5769 */  [ 0.394694247, 18 ],
+  /* 5770 */  [ 0.394785472, 18 ],
+  /* 5771 */  [ 0.394876702, 18 ],
+  /* 5772 */  [ 0.394967937, 18 ],
+  /* 5773 */  [ 0.395059177, 18 ],
+  /* 5774 */  [ 0.395150423, 18 ],
+  /* 5775 */  [ 0.395241673, 18 ],
+
+  /* 5776 */  [ 0.395332930, 18 ],
+  /* 5777 */  [ 0.395424191, 18 ],
+  /* 5778 */  [ 0.395515458, 18 ],
+  /* 5779 */  [ 0.395606730, 18 ],
+  /* 5780 */  [ 0.395698007, 18 ],
+  /* 5781 */  [ 0.395789289, 18 ],
+  /* 5782 */  [ 0.395880577, 18 ],
+  /* 5783 */  [ 0.395971870, 18 ],
+  /* 5784 */  [ 0.396063168, 18 ],
+  /* 5785 */  [ 0.396154472, 18 ],
+  /* 5786 */  [ 0.396245780, 18 ],
+  /* 5787 */  [ 0.396337094, 18 ],
+  /* 5788 */  [ 0.396428414, 18 ],
+  /* 5789 */  [ 0.396519738, 18 ],
+  /* 5790 */  [ 0.396611068, 18 ],
+  /* 5791 */  [ 0.396702403, 18 ],
+
+  /* 5792 */  [ 0.396793743, 18 ],
+  /* 5793 */  [ 0.396885089, 18 ],
+  /* 5794 */  [ 0.396976440, 18 ],
+  /* 5795 */  [ 0.397067796, 18 ],
+  /* 5796 */  [ 0.397159157, 18 ],
+  /* 5797 */  [ 0.397250524, 18 ],
+  /* 5798 */  [ 0.397341896, 18 ],
+  /* 5799 */  [ 0.397433273, 18 ],
+  /* 5800 */  [ 0.397524655, 18 ],
+  /* 5801 */  [ 0.397616043, 18 ],
+  /* 5802 */  [ 0.397707436, 18 ],
+  /* 5803 */  [ 0.397798834, 18 ],
+  /* 5804 */  [ 0.397890237, 18 ],
+  /* 5805 */  [ 0.397981646, 18 ],
+  /* 5806 */  [ 0.398073059, 18 ],
+  /* 5807 */  [ 0.398164479, 18 ],
+
+  /* 5808 */  [ 0.398255903, 18 ],
+  /* 5809 */  [ 0.398347333, 18 ],
+  /* 5810 */  [ 0.398438767, 18 ],
+  /* 5811 */  [ 0.398530207, 18 ],
+  /* 5812 */  [ 0.398621653, 18 ],
+  /* 5813 */  [ 0.398713103, 18 ],
+  /* 5814 */  [ 0.398804559, 18 ],
+  /* 5815 */  [ 0.398896020, 18 ],
+  /* 5816 */  [ 0.398987487, 18 ],
+  /* 5817 */  [ 0.399078958, 18 ],
+  /* 5818 */  [ 0.399170435, 18 ],
+  /* 5819 */  [ 0.399261917, 18 ],
+  /* 5820 */  [ 0.399353404, 18 ],
+  /* 5821 */  [ 0.399444897, 18 ],
+  /* 5822 */  [ 0.399536395, 18 ],
+  /* 5823 */  [ 0.399627898, 18 ],
+
+  /* 5824 */  [ 0.399719406, 18 ],
+  /* 5825 */  [ 0.399810919, 18 ],
+  /* 5826 */  [ 0.399902438, 18 ],
+  /* 5827 */  [ 0.399993962, 18 ],
+  /* 5828 */  [ 0.400085491, 18 ],
+  /* 5829 */  [ 0.400177026, 18 ],
+  /* 5830 */  [ 0.400268565, 18 ],
+  /* 5831 */  [ 0.400360110, 18 ],
+  /* 5832 */  [ 0.400451660, 18 ],
+  /* 5833 */  [ 0.400543216, 18 ],
+  /* 5834 */  [ 0.400634776, 18 ],
+  /* 5835 */  [ 0.400726342, 18 ],
+  /* 5836 */  [ 0.400817913, 18 ],
+  /* 5837 */  [ 0.400909489, 18 ],
+  /* 5838 */  [ 0.401001071, 18 ],
+  /* 5839 */  [ 0.401092657, 18 ],
+
+  /* 5840 */  [ 0.401184249, 18 ],
+  /* 5841 */  [ 0.401275847, 18 ],
+  /* 5842 */  [ 0.401367449, 18 ],
+  /* 5843 */  [ 0.401459057, 18 ],
+  /* 5844 */  [ 0.401550670, 18 ],
+  /* 5845 */  [ 0.401642288, 18 ],
+  /* 5846 */  [ 0.401733911, 18 ],
+  /* 5847 */  [ 0.401825540, 18 ],
+  /* 5848 */  [ 0.401917173, 18 ],
+  /* 5849 */  [ 0.402008812, 18 ],
+  /* 5850 */  [ 0.402100457, 18 ],
+  /* 5851 */  [ 0.402192106, 18 ],
+  /* 5852 */  [ 0.402283761, 18 ],
+  /* 5853 */  [ 0.402375420, 18 ],
+  /* 5854 */  [ 0.402467086, 18 ],
+  /* 5855 */  [ 0.402558756, 18 ],
+
+  /* 5856 */  [ 0.402650431, 18 ],
+  /* 5857 */  [ 0.402742112, 18 ],
+  /* 5858 */  [ 0.402833798, 18 ],
+  /* 5859 */  [ 0.402925489, 18 ],
+  /* 5860 */  [ 0.403017186, 18 ],
+  /* 5861 */  [ 0.403108887, 18 ],
+  /* 5862 */  [ 0.403200594, 18 ],
+  /* 5863 */  [ 0.403292306, 18 ],
+  /* 5864 */  [ 0.403384024, 18 ],
+  /* 5865 */  [ 0.403475746, 18 ],
+  /* 5866 */  [ 0.403567474, 18 ],
+  /* 5867 */  [ 0.403659207, 18 ],
+  /* 5868 */  [ 0.403750945, 18 ],
+  /* 5869 */  [ 0.403842688, 18 ],
+  /* 5870 */  [ 0.403934437, 18 ],
+  /* 5871 */  [ 0.404026190, 18 ],
+
+  /* 5872 */  [ 0.404117949, 18 ],
+  /* 5873 */  [ 0.404209714, 18 ],
+  /* 5874 */  [ 0.404301483, 18 ],
+  /* 5875 */  [ 0.404393258, 18 ],
+  /* 5876 */  [ 0.404485037, 18 ],
+  /* 5877 */  [ 0.404576822, 18 ],
+  /* 5878 */  [ 0.404668613, 18 ],
+  /* 5879 */  [ 0.404760408, 18 ],
+  /* 5880 */  [ 0.404852209, 18 ],
+  /* 5881 */  [ 0.404944014, 18 ],
+  /* 5882 */  [ 0.405035825, 18 ],
+  /* 5883 */  [ 0.405127642, 18 ],
+  /* 5884 */  [ 0.405219463, 18 ],
+  /* 5885 */  [ 0.405311290, 18 ],
+  /* 5886 */  [ 0.405403122, 18 ],
+  /* 5887 */  [ 0.405494959, 18 ],
+
+  /* 5888 */  [ 0.405586801, 18 ],
+  /* 5889 */  [ 0.405678648, 18 ],
+  /* 5890 */  [ 0.405770501, 18 ],
+  /* 5891 */  [ 0.405862359, 18 ],
+  /* 5892 */  [ 0.405954222, 18 ],
+  /* 5893 */  [ 0.406046090, 18 ],
+  /* 5894 */  [ 0.406137963, 18 ],
+  /* 5895 */  [ 0.406229842, 18 ],
+  /* 5896 */  [ 0.406321726, 18 ],
+  /* 5897 */  [ 0.406413615, 18 ],
+  /* 5898 */  [ 0.406505509, 18 ],
+  /* 5899 */  [ 0.406597408, 18 ],
+  /* 5900 */  [ 0.406689313, 18 ],
+  /* 5901 */  [ 0.406781223, 18 ],
+  /* 5902 */  [ 0.406873138, 18 ],
+  /* 5903 */  [ 0.406965058, 18 ],
+
+  /* 5904 */  [ 0.407056983, 18 ],
+  /* 5905 */  [ 0.407148914, 18 ],
+  /* 5906 */  [ 0.407240850, 18 ],
+  /* 5907 */  [ 0.407332791, 18 ],
+  /* 5908 */  [ 0.407424737, 18 ],
+  /* 5909 */  [ 0.407516688, 18 ],
+  /* 5910 */  [ 0.407608645, 18 ],
+  /* 5911 */  [ 0.407700606, 18 ],
+  /* 5912 */  [ 0.407792573, 18 ],
+  /* 5913 */  [ 0.407884545, 18 ],
+  /* 5914 */  [ 0.407976522, 18 ],
+  /* 5915 */  [ 0.408068505, 18 ],
+  /* 5916 */  [ 0.408160492, 18 ],
+  /* 5917 */  [ 0.408252485, 18 ],
+  /* 5918 */  [ 0.408344483, 18 ],
+  /* 5919 */  [ 0.408436486, 18 ],
+
+  /* 5920 */  [ 0.408528495, 18 ],
+  /* 5921 */  [ 0.408620508, 18 ],
+  /* 5922 */  [ 0.408712527, 18 ],
+  /* 5923 */  [ 0.408804551, 18 ],
+  /* 5924 */  [ 0.408896580, 18 ],
+  /* 5925 */  [ 0.408988614, 18 ],
+  /* 5926 */  [ 0.409080653, 18 ],
+  /* 5927 */  [ 0.409172698, 18 ],
+  /* 5928 */  [ 0.409264748, 18 ],
+  /* 5929 */  [ 0.409356803, 18 ],
+  /* 5930 */  [ 0.409448863, 18 ],
+  /* 5931 */  [ 0.409540928, 18 ],
+  /* 5932 */  [ 0.409632999, 18 ],
+  /* 5933 */  [ 0.409725074, 18 ],
+  /* 5934 */  [ 0.409817155, 18 ],
+  /* 5935 */  [ 0.409909241, 18 ],
+
+  /* 5936 */  [ 0.410001332, 18 ],
+  /* 5937 */  [ 0.410093428, 18 ],
+  /* 5938 */  [ 0.410185530, 18 ],
+  /* 5939 */  [ 0.410277637, 18 ],
+  /* 5940 */  [ 0.410369748, 18 ],
+  /* 5941 */  [ 0.410461865, 18 ],
+  /* 5942 */  [ 0.410553988, 18 ],
+  /* 5943 */  [ 0.410646115, 18 ],
+  /* 5944 */  [ 0.410738247, 18 ],
+  /* 5945 */  [ 0.410830385, 18 ],
+  /* 5946 */  [ 0.410922528, 18 ],
+  /* 5947 */  [ 0.411014676, 18 ],
+  /* 5948 */  [ 0.411106829, 18 ],
+  /* 5949 */  [ 0.411198987, 18 ],
+  /* 5950 */  [ 0.411291151, 18 ],
+  /* 5951 */  [ 0.411383320, 18 ],
+
+  /* 5952 */  [ 0.411475493, 18 ],
+  /* 5953 */  [ 0.411567672, 18 ],
+  /* 5954 */  [ 0.411659857, 18 ],
+  /* 5955 */  [ 0.411752046, 18 ],
+  /* 5956 */  [ 0.411844240, 18 ],
+  /* 5957 */  [ 0.411936440, 18 ],
+  /* 5958 */  [ 0.412028645, 18 ],
+  /* 5959 */  [ 0.412120855, 18 ],
+  /* 5960 */  [ 0.412213070, 18 ],
+  /* 5961 */  [ 0.412305290, 18 ],
+  /* 5962 */  [ 0.412397516, 18 ],
+  /* 5963 */  [ 0.412489746, 18 ],
+  /* 5964 */  [ 0.412581982, 18 ],
+  /* 5965 */  [ 0.412674223, 18 ],
+  /* 5966 */  [ 0.412766469, 18 ],
+  /* 5967 */  [ 0.412858720, 18 ],
+
+  /* 5968 */  [ 0.412950976, 18 ],
+  /* 5969 */  [ 0.413043238, 18 ],
+  /* 5970 */  [ 0.413135505, 18 ],
+  /* 5971 */  [ 0.413227776, 18 ],
+  /* 5972 */  [ 0.413320053, 18 ],
+  /* 5973 */  [ 0.413412335, 18 ],
+  /* 5974 */  [ 0.413504623, 18 ],
+  /* 5975 */  [ 0.413596915, 18 ],
+  /* 5976 */  [ 0.413689213, 18 ],
+  /* 5977 */  [ 0.413781515, 18 ],
+  /* 5978 */  [ 0.413873823, 18 ],
+  /* 5979 */  [ 0.413966136, 18 ],
+  /* 5980 */  [ 0.414058454, 18 ],
+  /* 5981 */  [ 0.414150778, 18 ],
+  /* 5982 */  [ 0.414243106, 18 ],
+  /* 5983 */  [ 0.414335440, 18 ],
+
+  /* 5984 */  [ 0.414427779, 18 ],
+  /* 5985 */  [ 0.414520122, 18 ],
+  /* 5986 */  [ 0.414612471, 18 ],
+  /* 5987 */  [ 0.414704826, 18 ],
+  /* 5988 */  [ 0.414797185, 18 ],
+  /* 5989 */  [ 0.414889549, 18 ],
+  /* 5990 */  [ 0.414981919, 18 ],
+  /* 5991 */  [ 0.415074294, 18 ],
+  /* 5992 */  [ 0.415166674, 18 ],
+  /* 5993 */  [ 0.415259059, 18 ],
+  /* 5994 */  [ 0.415351449, 18 ],
+  /* 5995 */  [ 0.415443844, 18 ],
+  /* 5996 */  [ 0.415536244, 18 ],
+  /* 5997 */  [ 0.415628650, 18 ],
+  /* 5998 */  [ 0.415721061, 18 ],
+  /* 5999 */  [ 0.415813476, 18 ],
+
+  /* 6000 */  [ 0.415905897, 18 ],
+  /* 6001 */  [ 0.415998324, 18 ],
+  /* 6002 */  [ 0.416090755, 18 ],
+  /* 6003 */  [ 0.416183191, 18 ],
+  /* 6004 */  [ 0.416275633, 18 ],
+  /* 6005 */  [ 0.416368079, 18 ],
+  /* 6006 */  [ 0.416460531, 18 ],
+  /* 6007 */  [ 0.416552988, 18 ],
+  /* 6008 */  [ 0.416645450, 18 ],
+  /* 6009 */  [ 0.416737917, 18 ],
+  /* 6010 */  [ 0.416830389, 18 ],
+  /* 6011 */  [ 0.416922867, 18 ],
+  /* 6012 */  [ 0.417015349, 18 ],
+  /* 6013 */  [ 0.417107837, 18 ],
+  /* 6014 */  [ 0.417200330, 18 ],
+  /* 6015 */  [ 0.417292828, 18 ],
+
+  /* 6016 */  [ 0.417385331, 18 ],
+  /* 6017 */  [ 0.417477839, 18 ],
+  /* 6018 */  [ 0.417570352, 18 ],
+  /* 6019 */  [ 0.417662871, 18 ],
+  /* 6020 */  [ 0.417755394, 18 ],
+  /* 6021 */  [ 0.417847923, 18 ],
+  /* 6022 */  [ 0.417940457, 18 ],
+  /* 6023 */  [ 0.418032996, 18 ],
+  /* 6024 */  [ 0.418125540, 18 ],
+  /* 6025 */  [ 0.418218089, 18 ],
+  /* 6026 */  [ 0.418310643, 18 ],
+  /* 6027 */  [ 0.418403203, 18 ],
+  /* 6028 */  [ 0.418495767, 18 ],
+  /* 6029 */  [ 0.418588337, 18 ],
+  /* 6030 */  [ 0.418680911, 18 ],
+  /* 6031 */  [ 0.418773491, 18 ],
+
+  /* 6032 */  [ 0.418866076, 18 ],
+  /* 6033 */  [ 0.418958666, 18 ],
+  /* 6034 */  [ 0.419051262, 18 ],
+  /* 6035 */  [ 0.419143862, 18 ],
+  /* 6036 */  [ 0.419236467, 18 ],
+  /* 6037 */  [ 0.419329078, 18 ],
+  /* 6038 */  [ 0.419421694, 18 ],
+  /* 6039 */  [ 0.419514314, 18 ],
+  /* 6040 */  [ 0.419606940, 18 ],
+  /* 6041 */  [ 0.419699571, 18 ],
+  /* 6042 */  [ 0.419792208, 18 ],
+  /* 6043 */  [ 0.419884849, 18 ],
+  /* 6044 */  [ 0.419977495, 18 ],
+  /* 6045 */  [ 0.420070147, 18 ],
+  /* 6046 */  [ 0.420162803, 18 ],
+  /* 6047 */  [ 0.420255465, 18 ],
+
+  /* 6048 */  [ 0.420348132, 18 ],
+  /* 6049 */  [ 0.420440803, 18 ],
+  /* 6050 */  [ 0.420533481, 18 ],
+  /* 6051 */  [ 0.420626163, 18 ],
+  /* 6052 */  [ 0.420718850, 18 ],
+  /* 6053 */  [ 0.420811542, 18 ],
+  /* 6054 */  [ 0.420904240, 18 ],
+  /* 6055 */  [ 0.420996942, 18 ],
+  /* 6056 */  [ 0.421089650, 18 ],
+  /* 6057 */  [ 0.421182362, 18 ],
+  /* 6058 */  [ 0.421275080, 18 ],
+  /* 6059 */  [ 0.421367803, 18 ],
+  /* 6060 */  [ 0.421460531, 18 ],
+  /* 6061 */  [ 0.421553264, 18 ],
+  /* 6062 */  [ 0.421646003, 18 ],
+  /* 6063 */  [ 0.421738746, 18 ],
+
+  /* 6064 */  [ 0.421831494, 18 ],
+  /* 6065 */  [ 0.421924248, 18 ],
+  /* 6066 */  [ 0.422017007, 18 ],
+  /* 6067 */  [ 0.422109770, 18 ],
+  /* 6068 */  [ 0.422202539, 18 ],
+  /* 6069 */  [ 0.422295313, 18 ],
+  /* 6070 */  [ 0.422388092, 18 ],
+  /* 6071 */  [ 0.422480876, 18 ],
+  /* 6072 */  [ 0.422573665, 18 ],
+  /* 6073 */  [ 0.422666460, 18 ],
+  /* 6074 */  [ 0.422759259, 18 ],
+  /* 6075 */  [ 0.422852064, 18 ],
+  /* 6076 */  [ 0.422944873, 18 ],
+  /* 6077 */  [ 0.423037688, 18 ],
+  /* 6078 */  [ 0.423130508, 18 ],
+  /* 6079 */  [ 0.423223333, 18 ],
+
+  /* 6080 */  [ 0.423316162, 18 ],
+  /* 6081 */  [ 0.423408997, 18 ],
+  /* 6082 */  [ 0.423501838, 18 ],
+  /* 6083 */  [ 0.423594683, 18 ],
+  /* 6084 */  [ 0.423687533, 18 ],
+  /* 6085 */  [ 0.423780389, 18 ],
+  /* 6086 */  [ 0.423873249, 18 ],
+  /* 6087 */  [ 0.423966115, 18 ],
+  /* 6088 */  [ 0.424058985, 18 ],
+  /* 6089 */  [ 0.424151861, 18 ],
+  /* 6090 */  [ 0.424244742, 18 ],
+  /* 6091 */  [ 0.424337628, 18 ],
+  /* 6092 */  [ 0.424430519, 18 ],
+  /* 6093 */  [ 0.424523415, 18 ],
+  /* 6094 */  [ 0.424616316, 18 ],
+  /* 6095 */  [ 0.424709222, 18 ],
+
+  /* 6096 */  [ 0.424802133, 18 ],
+  /* 6097 */  [ 0.424895050, 18 ],
+  /* 6098 */  [ 0.424987971, 18 ],
+  /* 6099 */  [ 0.425080898, 18 ],
+  /* 6100 */  [ 0.425173829, 18 ],
+  /* 6101 */  [ 0.425266766, 18 ],
+  /* 6102 */  [ 0.425359708, 18 ],
+  /* 6103 */  [ 0.425452655, 18 ],
+  /* 6104 */  [ 0.425545607, 18 ],
+  /* 6105 */  [ 0.425638564, 18 ],
+  /* 6106 */  [ 0.425731526, 18 ],
+  /* 6107 */  [ 0.425824493, 18 ],
+  /* 6108 */  [ 0.425917465, 18 ],
+  /* 6109 */  [ 0.426010443, 18 ],
+  /* 6110 */  [ 0.426103425, 18 ],
+  /* 6111 */  [ 0.426196412, 18 ],
+
+  /* 6112 */  [ 0.426289405, 18 ],
+  /* 6113 */  [ 0.426382403, 18 ],
+  /* 6114 */  [ 0.426475405, 18 ],
+  /* 6115 */  [ 0.426568413, 18 ],
+  /* 6116 */  [ 0.426661426, 18 ],
+  /* 6117 */  [ 0.426754444, 18 ],
+  /* 6118 */  [ 0.426847467, 18 ],
+  /* 6119 */  [ 0.426940495, 18 ],
+  /* 6120 */  [ 0.427033528, 18 ],
+  /* 6121 */  [ 0.427126566, 18 ],
+  /* 6122 */  [ 0.427219609, 18 ],
+  /* 6123 */  [ 0.427312657, 18 ],
+  /* 6124 */  [ 0.427405711, 18 ],
+  /* 6125 */  [ 0.427498769, 18 ],
+  /* 6126 */  [ 0.427591833, 18 ],
+  /* 6127 */  [ 0.427684901, 18 ],
+
+  /* 6128 */  [ 0.427777975, 18 ],
+  /* 6129 */  [ 0.427871054, 18 ],
+  /* 6130 */  [ 0.427964137, 18 ],
+  /* 6131 */  [ 0.428057226, 18 ],
+  /* 6132 */  [ 0.428150320, 18 ],
+  /* 6133 */  [ 0.428243419, 18 ],
+  /* 6134 */  [ 0.428336523, 18 ],
+  /* 6135 */  [ 0.428429632, 18 ],
+  /* 6136 */  [ 0.428522746, 18 ],
+  /* 6137 */  [ 0.428615865, 18 ],
+  /* 6138 */  [ 0.428708989, 18 ],
+  /* 6139 */  [ 0.428802119, 18 ],
+  /* 6140 */  [ 0.428895253, 18 ],
+  /* 6141 */  [ 0.428988392, 18 ],
+  /* 6142 */  [ 0.429081537, 18 ],
+  /* 6143 */  [ 0.429174686, 18 ],
+
+  /* 6144 */  [ 0.429267841, 18 ],
+  /* 6145 */  [ 0.429361001, 18 ],
+  /* 6146 */  [ 0.429454165, 18 ],
+  /* 6147 */  [ 0.429547335, 18 ],
+  /* 6148 */  [ 0.429640510, 18 ],
+  /* 6149 */  [ 0.429733690, 18 ],
+  /* 6150 */  [ 0.429826874, 18 ],
+  /* 6151 */  [ 0.429920064, 18 ],
+  /* 6152 */  [ 0.430013259, 18 ],
+  /* 6153 */  [ 0.430106459, 18 ],
+  /* 6154 */  [ 0.430199664, 18 ],
+  /* 6155 */  [ 0.430292875, 18 ],
+  /* 6156 */  [ 0.430386090, 18 ],
+  /* 6157 */  [ 0.430479310, 18 ],
+  /* 6158 */  [ 0.430572535, 18 ],
+  /* 6159 */  [ 0.430665765, 18 ],
+
+  /* 6160 */  [ 0.430759001, 18 ],
+  /* 6161 */  [ 0.430852241, 18 ],
+  /* 6162 */  [ 0.430945487, 18 ],
+  /* 6163 */  [ 0.431038737, 18 ],
+  /* 6164 */  [ 0.431131993, 18 ],
+  /* 6165 */  [ 0.431225253, 18 ],
+  /* 6166 */  [ 0.431318519, 18 ],
+  /* 6167 */  [ 0.431411790, 18 ],
+  /* 6168 */  [ 0.431505065, 18 ],
+  /* 6169 */  [ 0.431598346, 18 ],
+  /* 6170 */  [ 0.431691632, 18 ],
+  /* 6171 */  [ 0.431784923, 18 ],
+  /* 6172 */  [ 0.431878218, 18 ],
+  /* 6173 */  [ 0.431971519, 18 ],
+  /* 6174 */  [ 0.432064825, 18 ],
+  /* 6175 */  [ 0.432158136, 18 ],
+
+  /* 6176 */  [ 0.432251452, 18 ],
+  /* 6177 */  [ 0.432344773, 18 ],
+  /* 6178 */  [ 0.432438099, 18 ],
+  /* 6179 */  [ 0.432531431, 18 ],
+  /* 6180 */  [ 0.432624767, 18 ],
+  /* 6181 */  [ 0.432718108, 18 ],
+  /* 6182 */  [ 0.432811454, 18 ],
+  /* 6183 */  [ 0.432904805, 18 ],
+  /* 6184 */  [ 0.432998162, 18 ],
+  /* 6185 */  [ 0.433091523, 18 ],
+  /* 6186 */  [ 0.433184889, 18 ],
+  /* 6187 */  [ 0.433278261, 18 ],
+  /* 6188 */  [ 0.433371637, 18 ],
+  /* 6189 */  [ 0.433465019, 18 ],
+  /* 6190 */  [ 0.433558405, 18 ],
+  /* 6191 */  [ 0.433651797, 18 ],
+
+  /* 6192 */  [ 0.433745193, 18 ],
+  /* 6193 */  [ 0.433838595, 18 ],
+  /* 6194 */  [ 0.433932001, 18 ],
+  /* 6195 */  [ 0.434025413, 18 ],
+  /* 6196 */  [ 0.434118830, 18 ],
+  /* 6197 */  [ 0.434212251, 18 ],
+  /* 6198 */  [ 0.434305678, 18 ],
+  /* 6199 */  [ 0.434399110, 18 ],
+  /* 6200 */  [ 0.434492546, 18 ],
+  /* 6201 */  [ 0.434585988, 18 ],
+  /* 6202 */  [ 0.434679435, 18 ],
+  /* 6203 */  [ 0.434772887, 18 ],
+  /* 6204 */  [ 0.434866344, 18 ],
+  /* 6205 */  [ 0.434959806, 18 ],
+  /* 6206 */  [ 0.435053272, 18 ],
+  /* 6207 */  [ 0.435146744, 18 ],
+
+  /* 6208 */  [ 0.435240221, 18 ],
+  /* 6209 */  [ 0.435333703, 18 ],
+  /* 6210 */  [ 0.435427190, 18 ],
+  /* 6211 */  [ 0.435520682, 18 ],
+  /* 6212 */  [ 0.435614179, 18 ],
+  /* 6213 */  [ 0.435707681, 18 ],
+  /* 6214 */  [ 0.435801188, 18 ],
+  /* 6215 */  [ 0.435894700, 18 ],
+  /* 6216 */  [ 0.435988217, 18 ],
+  /* 6217 */  [ 0.436081739, 18 ],
+  /* 6218 */  [ 0.436175266, 18 ],
+  /* 6219 */  [ 0.436268799, 18 ],
+  /* 6220 */  [ 0.436362336, 18 ],
+  /* 6221 */  [ 0.436455878, 18 ],
+  /* 6222 */  [ 0.436549425, 18 ],
+  /* 6223 */  [ 0.436642977, 18 ],
+
+  /* 6224 */  [ 0.436736534, 18 ],
+  /* 6225 */  [ 0.436830096, 18 ],
+  /* 6226 */  [ 0.436923664, 18 ],
+  /* 6227 */  [ 0.437017236, 18 ],
+  /* 6228 */  [ 0.437110813, 18 ],
+  /* 6229 */  [ 0.437204395, 18 ],
+  /* 6230 */  [ 0.437297982, 18 ],
+  /* 6231 */  [ 0.437391575, 18 ],
+  /* 6232 */  [ 0.437485172, 18 ],
+  /* 6233 */  [ 0.437578774, 18 ],
+  /* 6234 */  [ 0.437672381, 18 ],
+  /* 6235 */  [ 0.437765994, 18 ],
+  /* 6236 */  [ 0.437859611, 18 ],
+  /* 6237 */  [ 0.437953233, 18 ],
+  /* 6238 */  [ 0.438046860, 18 ],
+  /* 6239 */  [ 0.438140493, 18 ],
+
+  /* 6240 */  [ 0.438234130, 18 ],
+  /* 6241 */  [ 0.438327772, 18 ],
+  /* 6242 */  [ 0.438421419, 18 ],
+  /* 6243 */  [ 0.438515072, 18 ],
+  /* 6244 */  [ 0.438608729, 18 ],
+  /* 6245 */  [ 0.438702391, 18 ],
+  /* 6246 */  [ 0.438796059, 18 ],
+  /* 6247 */  [ 0.438889731, 18 ],
+  /* 6248 */  [ 0.438983408, 18 ],
+  /* 6249 */  [ 0.439077090, 18 ],
+  /* 6250 */  [ 0.439170778, 18 ],
+  /* 6251 */  [ 0.439264470, 18 ],
+  /* 6252 */  [ 0.439358167, 18 ],
+  /* 6253 */  [ 0.439451869, 18 ],
+  /* 6254 */  [ 0.439545577, 18 ],
+  /* 6255 */  [ 0.439639289, 18 ],
+
+  /* 6256 */  [ 0.439733006, 18 ],
+  /* 6257 */  [ 0.439826728, 18 ],
+  /* 6258 */  [ 0.439920456, 18 ],
+  /* 6259 */  [ 0.440014188, 18 ],
+  /* 6260 */  [ 0.440107925, 18 ],
+  /* 6261 */  [ 0.440201667, 18 ],
+  /* 6262 */  [ 0.440295414, 18 ],
+  /* 6263 */  [ 0.440389167, 18 ],
+  /* 6264 */  [ 0.440482924, 18 ],
+  /* 6265 */  [ 0.440576686, 18 ],
+  /* 6266 */  [ 0.440670453, 18 ],
+  /* 6267 */  [ 0.440764225, 18 ],
+  /* 6268 */  [ 0.440858002, 18 ],
+  /* 6269 */  [ 0.440951784, 18 ],
+  /* 6270 */  [ 0.441045572, 18 ],
+  /* 6271 */  [ 0.441139364, 18 ],
+
+  /* 6272 */  [ 0.441233161, 18 ],
+  /* 6273 */  [ 0.441326963, 18 ],
+  /* 6274 */  [ 0.441420770, 18 ],
+  /* 6275 */  [ 0.441514582, 18 ],
+  /* 6276 */  [ 0.441608399, 18 ],
+  /* 6277 */  [ 0.441702221, 18 ],
+  /* 6278 */  [ 0.441796048, 18 ],
+  /* 6279 */  [ 0.441889880, 18 ],
+  /* 6280 */  [ 0.441983717, 18 ],
+  /* 6281 */  [ 0.442077559, 18 ],
+  /* 6282 */  [ 0.442171406, 18 ],
+  /* 6283 */  [ 0.442265257, 18 ],
+  /* 6284 */  [ 0.442359114, 18 ],
+  /* 6285 */  [ 0.442452976, 18 ],
+  /* 6286 */  [ 0.442546843, 18 ],
+  /* 6287 */  [ 0.442640715, 18 ],
+
+  /* 6288 */  [ 0.442734592, 18 ],
+  /* 6289 */  [ 0.442828473, 18 ],
+  /* 6290 */  [ 0.442922360, 18 ],
+  /* 6291 */  [ 0.443016252, 18 ],
+  /* 6292 */  [ 0.443110148, 18 ],
+  /* 6293 */  [ 0.443204050, 18 ],
+  /* 6294 */  [ 0.443297957, 18 ],
+  /* 6295 */  [ 0.443391868, 18 ],
+  /* 6296 */  [ 0.443485785, 18 ],
+  /* 6297 */  [ 0.443579706, 18 ],
+  /* 6298 */  [ 0.443673633, 18 ],
+  /* 6299 */  [ 0.443767564, 18 ],
+  /* 6300 */  [ 0.443861501, 18 ],
+  /* 6301 */  [ 0.443955442, 18 ],
+  /* 6302 */  [ 0.444049389, 18 ],
+  /* 6303 */  [ 0.444143340, 18 ],
+
+  /* 6304 */  [ 0.444237296, 18 ],
+  /* 6305 */  [ 0.444331258, 18 ],
+  /* 6306 */  [ 0.444425224, 18 ],
+  /* 6307 */  [ 0.444519195, 18 ],
+  /* 6308 */  [ 0.444613171, 18 ],
+  /* 6309 */  [ 0.444707153, 18 ],
+  /* 6310 */  [ 0.444801139, 18 ],
+  /* 6311 */  [ 0.444895130, 18 ],
+  /* 6312 */  [ 0.444989126, 18 ],
+  /* 6313 */  [ 0.445083127, 18 ],
+  /* 6314 */  [ 0.445177133, 18 ],
+  /* 6315 */  [ 0.445271144, 18 ],
+  /* 6316 */  [ 0.445365160, 18 ],
+  /* 6317 */  [ 0.445459181, 18 ],
+  /* 6318 */  [ 0.445553206, 18 ],
+  /* 6319 */  [ 0.445647237, 18 ],
+
+  /* 6320 */  [ 0.445741273, 18 ],
+  /* 6321 */  [ 0.445835314, 18 ],
+  /* 6322 */  [ 0.445929359, 18 ],
+  /* 6323 */  [ 0.446023410, 18 ],
+  /* 6324 */  [ 0.446117466, 18 ],
+  /* 6325 */  [ 0.446211526, 18 ],
+  /* 6326 */  [ 0.446305592, 18 ],
+  /* 6327 */  [ 0.446399662, 18 ],
+  /* 6328 */  [ 0.446493738, 18 ],
+  /* 6329 */  [ 0.446587818, 18 ],
+  /* 6330 */  [ 0.446681903, 18 ],
+  /* 6331 */  [ 0.446775994, 18 ],
+  /* 6332 */  [ 0.446870089, 18 ],
+  /* 6333 */  [ 0.446964189, 18 ],
+  /* 6334 */  [ 0.447058294, 18 ],
+  /* 6335 */  [ 0.447152404, 18 ],
+
+  /* 6336 */  [ 0.447246519, 18 ],
+  /* 6337 */  [ 0.447340639, 18 ],
+  /* 6338 */  [ 0.447434764, 18 ],
+  /* 6339 */  [ 0.447528894, 18 ],
+  /* 6340 */  [ 0.447623029, 18 ],
+  /* 6341 */  [ 0.447717169, 18 ],
+  /* 6342 */  [ 0.447811314, 18 ],
+  /* 6343 */  [ 0.447905463, 18 ],
+  /* 6344 */  [ 0.447999618, 18 ],
+  /* 6345 */  [ 0.448093778, 18 ],
+  /* 6346 */  [ 0.448187942, 18 ],
+  /* 6347 */  [ 0.448282112, 18 ],
+  /* 6348 */  [ 0.448376286, 18 ],
+  /* 6349 */  [ 0.448470466, 18 ],
+  /* 6350 */  [ 0.448564650, 18 ],
+  /* 6351 */  [ 0.448658839, 18 ],
+
+  /* 6352 */  [ 0.448753033, 18 ],
+  /* 6353 */  [ 0.448847233, 18 ],
+  /* 6354 */  [ 0.448941437, 18 ],
+  /* 6355 */  [ 0.449035646, 18 ],
+  /* 6356 */  [ 0.449129860, 18 ],
+  /* 6357 */  [ 0.449224079, 18 ],
+  /* 6358 */  [ 0.449318303, 18 ],
+  /* 6359 */  [ 0.449412531, 18 ],
+  /* 6360 */  [ 0.449506765, 18 ],
+  /* 6361 */  [ 0.449601004, 18 ],
+  /* 6362 */  [ 0.449695247, 18 ],
+  /* 6363 */  [ 0.449789496, 18 ],
+  /* 6364 */  [ 0.449883749, 18 ],
+  /* 6365 */  [ 0.449978008, 18 ],
+  /* 6366 */  [ 0.450072271, 18 ],
+  /* 6367 */  [ 0.450166540, 18 ],
+
+  /* 6368 */  [ 0.450260813, 18 ],
+  /* 6369 */  [ 0.450355091, 18 ],
+  /* 6370 */  [ 0.450449374, 18 ],
+  /* 6371 */  [ 0.450543662, 18 ],
+  /* 6372 */  [ 0.450637955, 18 ],
+  /* 6373 */  [ 0.450732253, 18 ],
+  /* 6374 */  [ 0.450826556, 18 ],
+  /* 6375 */  [ 0.450920864, 18 ],
+  /* 6376 */  [ 0.451015176, 18 ],
+  /* 6377 */  [ 0.451109494, 18 ],
+  /* 6378 */  [ 0.451203817, 18 ],
+  /* 6379 */  [ 0.451298144, 18 ],
+  /* 6380 */  [ 0.451392477, 18 ],
+  /* 6381 */  [ 0.451486814, 18 ],
+  /* 6382 */  [ 0.451581156, 18 ],
+  /* 6383 */  [ 0.451675503, 18 ],
+
+  /* 6384 */  [ 0.451769856, 18 ],
+  /* 6385 */  [ 0.451864213, 18 ],
+  /* 6386 */  [ 0.451958575, 18 ],
+  /* 6387 */  [ 0.452052942, 18 ],
+  /* 6388 */  [ 0.452147313, 18 ],
+  /* 6389 */  [ 0.452241690, 18 ],
+  /* 6390 */  [ 0.452336072, 18 ],
+  /* 6391 */  [ 0.452430458, 18 ],
+  /* 6392 */  [ 0.452524850, 18 ],
+  /* 6393 */  [ 0.452619246, 18 ],
+  /* 6394 */  [ 0.452713648, 18 ],
+  /* 6395 */  [ 0.452808054, 18 ],
+  /* 6396 */  [ 0.452902465, 18 ],
+  /* 6397 */  [ 0.452996882, 18 ],
+  /* 6398 */  [ 0.453091303, 18 ],
+  /* 6399 */  [ 0.453185729, 18 ],
+
+  /* 6400 */  [ 0.453280160, 18 ],
+  /* 6401 */  [ 0.453374595, 18 ],
+  /* 6402 */  [ 0.453469036, 18 ],
+  /* 6403 */  [ 0.453563482, 18 ],
+  /* 6404 */  [ 0.453657932, 18 ],
+  /* 6405 */  [ 0.453752388, 18 ],
+  /* 6406 */  [ 0.453846848, 18 ],
+  /* 6407 */  [ 0.453941314, 18 ],
+  /* 6408 */  [ 0.454035784, 18 ],
+  /* 6409 */  [ 0.454130259, 18 ],
+  /* 6410 */  [ 0.454224739, 18 ],
+  /* 6411 */  [ 0.454319224, 18 ],
+  /* 6412 */  [ 0.454413714, 18 ],
+  /* 6413 */  [ 0.454508209, 18 ],
+  /* 6414 */  [ 0.454602708, 18 ],
+  /* 6415 */  [ 0.454697213, 18 ],
+
+  /* 6416 */  [ 0.454791723, 18 ],
+  /* 6417 */  [ 0.454886237, 18 ],
+  /* 6418 */  [ 0.454980756, 18 ],
+  /* 6419 */  [ 0.455075281, 18 ],
+  /* 6420 */  [ 0.455169810, 18 ],
+  /* 6421 */  [ 0.455264344, 18 ],
+  /* 6422 */  [ 0.455358883, 18 ],
+  /* 6423 */  [ 0.455453427, 18 ],
+  /* 6424 */  [ 0.455547976, 18 ],
+  /* 6425 */  [ 0.455642529, 18 ],
+  /* 6426 */  [ 0.455737088, 18 ],
+  /* 6427 */  [ 0.455831652, 18 ],
+  /* 6428 */  [ 0.455926220, 18 ],
+  /* 6429 */  [ 0.456020793, 18 ],
+  /* 6430 */  [ 0.456115372, 18 ],
+  /* 6431 */  [ 0.456209955, 18 ],
+
+  /* 6432 */  [ 0.456304543, 18 ],
+  /* 6433 */  [ 0.456399136, 18 ],
+  /* 6434 */  [ 0.456493733, 18 ],
+  /* 6435 */  [ 0.456588336, 18 ],
+  /* 6436 */  [ 0.456682944, 18 ],
+  /* 6437 */  [ 0.456777556, 18 ],
+  /* 6438 */  [ 0.456872174, 18 ],
+  /* 6439 */  [ 0.456966796, 18 ],
+  /* 6440 */  [ 0.457061423, 18 ],
+  /* 6441 */  [ 0.457156056, 18 ],
+  /* 6442 */  [ 0.457250693, 18 ],
+  /* 6443 */  [ 0.457345335, 18 ],
+  /* 6444 */  [ 0.457439981, 18 ],
+  /* 6445 */  [ 0.457534633, 18 ],
+  /* 6446 */  [ 0.457629290, 18 ],
+  /* 6447 */  [ 0.457723951, 18 ],
+
+  /* 6448 */  [ 0.457818618, 18 ],
+  /* 6449 */  [ 0.457913289, 18 ],
+  /* 6450 */  [ 0.458007965, 18 ],
+  /* 6451 */  [ 0.458102646, 18 ],
+  /* 6452 */  [ 0.458197332, 18 ],
+  /* 6453 */  [ 0.458292023, 18 ],
+  /* 6454 */  [ 0.458386719, 18 ],
+  /* 6455 */  [ 0.458481420, 18 ],
+  /* 6456 */  [ 0.458576125, 18 ],
+  /* 6457 */  [ 0.458670836, 18 ],
+  /* 6458 */  [ 0.458765551, 18 ],
+  /* 6459 */  [ 0.458860271, 18 ],
+  /* 6460 */  [ 0.458954996, 18 ],
+  /* 6461 */  [ 0.459049726, 18 ],
+  /* 6462 */  [ 0.459144461, 18 ],
+  /* 6463 */  [ 0.459239201, 18 ],
+
+  /* 6464 */  [ 0.459333946, 18 ],
+  /* 6465 */  [ 0.459428695, 18 ],
+  /* 6466 */  [ 0.459523450, 18 ],
+  /* 6467 */  [ 0.459618209, 18 ],
+  /* 6468 */  [ 0.459712973, 18 ],
+  /* 6469 */  [ 0.459807742, 18 ],
+  /* 6470 */  [ 0.459902516, 18 ],
+  /* 6471 */  [ 0.459997295, 18 ],
+  /* 6472 */  [ 0.460092079, 18 ],
+  /* 6473 */  [ 0.460186867, 18 ],
+  /* 6474 */  [ 0.460281661, 18 ],
+  /* 6475 */  [ 0.460376459, 18 ],
+  /* 6476 */  [ 0.460471262, 18 ],
+  /* 6477 */  [ 0.460566071, 18 ],
+  /* 6478 */  [ 0.460660884, 18 ],
+  /* 6479 */  [ 0.460755701, 18 ],
+
+  /* 6480 */  [ 0.460850524, 18 ],
+  /* 6481 */  [ 0.460945352, 18 ],
+  /* 6482 */  [ 0.461040184, 18 ],
+  /* 6483 */  [ 0.461135022, 18 ],
+  /* 6484 */  [ 0.461229864, 18 ],
+  /* 6485 */  [ 0.461324711, 18 ],
+  /* 6486 */  [ 0.461419563, 18 ],
+  /* 6487 */  [ 0.461514420, 18 ],
+  /* 6488 */  [ 0.461609282, 18 ],
+  /* 6489 */  [ 0.461704149, 18 ],
+  /* 6490 */  [ 0.461799020, 18 ],
+  /* 6491 */  [ 0.461893897, 18 ],
+  /* 6492 */  [ 0.461988778, 18 ],
+  /* 6493 */  [ 0.462083664, 18 ],
+  /* 6494 */  [ 0.462178555, 18 ],
+  /* 6495 */  [ 0.462273451, 18 ],
+
+  /* 6496 */  [ 0.462368352, 18 ],
+  /* 6497 */  [ 0.462463257, 18 ],
+  /* 6498 */  [ 0.462558168, 18 ],
+  /* 6499 */  [ 0.462653083, 18 ],
+  /* 6500 */  [ 0.462748003, 18 ],
+  /* 6501 */  [ 0.462842928, 18 ],
+  /* 6502 */  [ 0.462937858, 18 ],
+  /* 6503 */  [ 0.463032793, 18 ],
+  /* 6504 */  [ 0.463127733, 18 ],
+  /* 6505 */  [ 0.463222678, 18 ],
+  /* 6506 */  [ 0.463317627, 18 ],
+  /* 6507 */  [ 0.463412581, 18 ],
+  /* 6508 */  [ 0.463507540, 18 ],
+  /* 6509 */  [ 0.463602504, 18 ],
+  /* 6510 */  [ 0.463697473, 18 ],
+  /* 6511 */  [ 0.463792447, 18 ],
+
+  /* 6512 */  [ 0.463887426, 18 ],
+  /* 6513 */  [ 0.463982409, 18 ],
+  /* 6514 */  [ 0.464077398, 18 ],
+  /* 6515 */  [ 0.464172391, 18 ],
+  /* 6516 */  [ 0.464267389, 18 ],
+  /* 6517 */  [ 0.464362392, 18 ],
+  /* 6518 */  [ 0.464457399, 18 ],
+  /* 6519 */  [ 0.464552412, 18 ],
+  /* 6520 */  [ 0.464647430, 18 ],
+  /* 6521 */  [ 0.464742452, 18 ],
+  /* 6522 */  [ 0.464837479, 18 ],
+  /* 6523 */  [ 0.464932511, 18 ],
+  /* 6524 */  [ 0.465027548, 18 ],
+  /* 6525 */  [ 0.465122590, 18 ],
+  /* 6526 */  [ 0.465217637, 18 ],
+  /* 6527 */  [ 0.465312688, 18 ],
+
+  /* 6528 */  [ 0.465407744, 18 ],
+  /* 6529 */  [ 0.465502806, 18 ],
+  /* 6530 */  [ 0.465597872, 18 ],
+  /* 6531 */  [ 0.465692943, 18 ],
+  /* 6532 */  [ 0.465788018, 18 ],
+  /* 6533 */  [ 0.465883099, 18 ],
+  /* 6534 */  [ 0.465978184, 18 ],
+  /* 6535 */  [ 0.466073275, 18 ],
+  /* 6536 */  [ 0.466168370, 18 ],
+  /* 6537 */  [ 0.466263470, 18 ],
+  /* 6538 */  [ 0.466358575, 18 ],
+  /* 6539 */  [ 0.466453684, 18 ],
+  /* 6540 */  [ 0.466548799, 18 ],
+  /* 6541 */  [ 0.466643918, 18 ],
+  /* 6542 */  [ 0.466739043, 18 ],
+  /* 6543 */  [ 0.466834172, 18 ],
+
+  /* 6544 */  [ 0.466929306, 18 ],
+  /* 6545 */  [ 0.467024445, 18 ],
+  /* 6546 */  [ 0.467119588, 18 ],
+  /* 6547 */  [ 0.467214737, 18 ],
+  /* 6548 */  [ 0.467309890, 18 ],
+  /* 6549 */  [ 0.467405048, 18 ],
+  /* 6550 */  [ 0.467500211, 18 ],
+  /* 6551 */  [ 0.467595379, 18 ],
+  /* 6552 */  [ 0.467690552, 18 ],
+  /* 6553 */  [ 0.467785729, 18 ],
+  /* 6554 */  [ 0.467880912, 18 ],
+  /* 6555 */  [ 0.467976099, 18 ],
+  /* 6556 */  [ 0.468071291, 18 ],
+  /* 6557 */  [ 0.468166488, 18 ],
+  /* 6558 */  [ 0.468261690, 18 ],
+  /* 6559 */  [ 0.468356896, 18 ],
+
+  /* 6560 */  [ 0.468452108, 18 ],
+  /* 6561 */  [ 0.468547324, 18 ],
+  /* 6562 */  [ 0.468642545, 18 ],
+  /* 6563 */  [ 0.468737771, 18 ],
+  /* 6564 */  [ 0.468833002, 18 ],
+  /* 6565 */  [ 0.468928237, 18 ],
+  /* 6566 */  [ 0.469023478, 18 ],
+  /* 6567 */  [ 0.469118723, 18 ],
+  /* 6568 */  [ 0.469213973, 18 ],
+  /* 6569 */  [ 0.469309228, 18 ],
+  /* 6570 */  [ 0.469404488, 18 ],
+  /* 6571 */  [ 0.469499752, 18 ],
+  /* 6572 */  [ 0.469595022, 18 ],
+  /* 6573 */  [ 0.469690296, 18 ],
+  /* 6574 */  [ 0.469785575, 18 ],
+  /* 6575 */  [ 0.469880859, 18 ],
+
+  /* 6576 */  [ 0.469976148, 18 ],
+  /* 6577 */  [ 0.470071442, 18 ],
+  /* 6578 */  [ 0.470166740, 18 ],
+  /* 6579 */  [ 0.470262043, 18 ],
+  /* 6580 */  [ 0.470357351, 18 ],
+  /* 6581 */  [ 0.470452664, 18 ],
+  /* 6582 */  [ 0.470547982, 18 ],
+  /* 6583 */  [ 0.470643305, 18 ],
+  /* 6584 */  [ 0.470738632, 18 ],
+  /* 6585 */  [ 0.470833964, 18 ],
+  /* 6586 */  [ 0.470929301, 18 ],
+  /* 6587 */  [ 0.471024643, 18 ],
+  /* 6588 */  [ 0.471119990, 18 ],
+  /* 6589 */  [ 0.471215341, 18 ],
+  /* 6590 */  [ 0.471310698, 18 ],
+  /* 6591 */  [ 0.471406059, 18 ],
+
+  /* 6592 */  [ 0.471501425, 18 ],
+  /* 6593 */  [ 0.471596796, 18 ],
+  /* 6594 */  [ 0.471692171, 18 ],
+  /* 6595 */  [ 0.471787552, 18 ],
+  /* 6596 */  [ 0.471882937, 18 ],
+  /* 6597 */  [ 0.471978327, 18 ],
+  /* 6598 */  [ 0.472073722, 18 ],
+  /* 6599 */  [ 0.472169122, 18 ],
+  /* 6600 */  [ 0.472264527, 18 ],
+  /* 6601 */  [ 0.472359936, 18 ],
+  /* 6602 */  [ 0.472455350, 18 ],
+  /* 6603 */  [ 0.472550769, 18 ],
+  /* 6604 */  [ 0.472646193, 18 ],
+  /* 6605 */  [ 0.472741622, 18 ],
+  /* 6606 */  [ 0.472837055, 18 ],
+  /* 6607 */  [ 0.472932493, 18 ],
+
+  /* 6608 */  [ 0.473027937, 18 ],
+  /* 6609 */  [ 0.473123384, 18 ],
+  /* 6610 */  [ 0.473218837, 18 ],
+  /* 6611 */  [ 0.473314295, 18 ],
+  /* 6612 */  [ 0.473409757, 18 ],
+  /* 6613 */  [ 0.473505224, 18 ],
+  /* 6614 */  [ 0.473600696, 18 ],
+  /* 6615 */  [ 0.473696173, 18 ],
+  /* 6616 */  [ 0.473791655, 18 ],
+  /* 6617 */  [ 0.473887141, 18 ],
+  /* 6618 */  [ 0.473982632, 18 ],
+  /* 6619 */  [ 0.474078128, 18 ],
+  /* 6620 */  [ 0.474173629, 18 ],
+  /* 6621 */  [ 0.474269135, 18 ],
+  /* 6622 */  [ 0.474364645, 18 ],
+  /* 6623 */  [ 0.474460161, 18 ],
+
+  /* 6624 */  [ 0.474555681, 18 ],
+  /* 6625 */  [ 0.474651205, 18 ],
+  /* 6626 */  [ 0.474746735, 18 ],
+  /* 6627 */  [ 0.474842270, 18 ],
+  /* 6628 */  [ 0.474937809, 18 ],
+  /* 6629 */  [ 0.475033353, 18 ],
+  /* 6630 */  [ 0.475128902, 18 ],
+  /* 6631 */  [ 0.475224456, 18 ],
+  /* 6632 */  [ 0.475320014, 18 ],
+  /* 6633 */  [ 0.475415578, 18 ],
+  /* 6634 */  [ 0.475511146, 18 ],
+  /* 6635 */  [ 0.475606719, 18 ],
+  /* 6636 */  [ 0.475702296, 18 ],
+  /* 6637 */  [ 0.475797879, 18 ],
+  /* 6638 */  [ 0.475893466, 18 ],
+  /* 6639 */  [ 0.475989058, 18 ],
+
+  /* 6640 */  [ 0.476084655, 18 ],
+  /* 6641 */  [ 0.476180257, 18 ],
+  /* 6642 */  [ 0.476275863, 18 ],
+  /* 6643 */  [ 0.476371475, 18 ],
+  /* 6644 */  [ 0.476467091, 18 ],
+  /* 6645 */  [ 0.476562712, 18 ],
+  /* 6646 */  [ 0.476658338, 18 ],
+  /* 6647 */  [ 0.476753968, 18 ],
+  /* 6648 */  [ 0.476849603, 18 ],
+  /* 6649 */  [ 0.476945243, 18 ],
+  /* 6650 */  [ 0.477040888, 18 ],
+  /* 6651 */  [ 0.477136538, 18 ],
+  /* 6652 */  [ 0.477232193, 18 ],
+  /* 6653 */  [ 0.477327852, 18 ],
+  /* 6654 */  [ 0.477423516, 18 ],
+  /* 6655 */  [ 0.477519185, 18 ],
+
+  /* 6656 */  [ 0.477614858, 18 ],
+  /* 6657 */  [ 0.477710537, 18 ],
+  /* 6658 */  [ 0.477806220, 18 ],
+  /* 6659 */  [ 0.477901908, 18 ],
+  /* 6660 */  [ 0.477997601, 18 ],
+  /* 6661 */  [ 0.478093299, 18 ],
+  /* 6662 */  [ 0.478189001, 18 ],
+  /* 6663 */  [ 0.478284708, 18 ],
+  /* 6664 */  [ 0.478380420, 18 ],
+  /* 6665 */  [ 0.478476137, 18 ],
+  /* 6666 */  [ 0.478571858, 18 ],
+  /* 6667 */  [ 0.478667585, 18 ],
+  /* 6668 */  [ 0.478763316, 18 ],
+  /* 6669 */  [ 0.478859052, 18 ],
+  /* 6670 */  [ 0.478954793, 18 ],
+  /* 6671 */  [ 0.479050538, 18 ],
+
+  /* 6672 */  [ 0.479146288, 18 ],
+  /* 6673 */  [ 0.479242043, 18 ],
+  /* 6674 */  [ 0.479337803, 18 ],
+  /* 6675 */  [ 0.479433568, 18 ],
+  /* 6676 */  [ 0.479529337, 18 ],
+  /* 6677 */  [ 0.479625111, 18 ],
+  /* 6678 */  [ 0.479720890, 18 ],
+  /* 6679 */  [ 0.479816674, 18 ],
+  /* 6680 */  [ 0.479912463, 18 ],
+  /* 6681 */  [ 0.480008256, 18 ],
+  /* 6682 */  [ 0.480104054, 18 ],
+  /* 6683 */  [ 0.480199857, 18 ],
+  /* 6684 */  [ 0.480295664, 18 ],
+  /* 6685 */  [ 0.480391477, 18 ],
+  /* 6686 */  [ 0.480487294, 18 ],
+  /* 6687 */  [ 0.480583116, 18 ],
+
+  /* 6688 */  [ 0.480678943, 18 ],
+  /* 6689 */  [ 0.480774774, 18 ],
+  /* 6690 */  [ 0.480870611, 18 ],
+  /* 6691 */  [ 0.480966452, 18 ],
+  /* 6692 */  [ 0.481062298, 18 ],
+  /* 6693 */  [ 0.481158148, 18 ],
+  /* 6694 */  [ 0.481254004, 18 ],
+  /* 6695 */  [ 0.481349864, 18 ],
+  /* 6696 */  [ 0.481445729, 18 ],
+  /* 6697 */  [ 0.481541598, 18 ],
+  /* 6698 */  [ 0.481637473, 18 ],
+  /* 6699 */  [ 0.481733352, 18 ],
+  /* 6700 */  [ 0.481829236, 18 ],
+  /* 6701 */  [ 0.481925125, 18 ],
+  /* 6702 */  [ 0.482021019, 18 ],
+  /* 6703 */  [ 0.482116917, 18 ],
+
+  /* 6704 */  [ 0.482212820, 18 ],
+  /* 6705 */  [ 0.482308728, 18 ],
+  /* 6706 */  [ 0.482404640, 18 ],
+  /* 6707 */  [ 0.482500558, 18 ],
+  /* 6708 */  [ 0.482596480, 18 ],
+  /* 6709 */  [ 0.482692407, 18 ],
+  /* 6710 */  [ 0.482788339, 18 ],
+  /* 6711 */  [ 0.482884275, 18 ],
+  /* 6712 */  [ 0.482980216, 18 ],
+  /* 6713 */  [ 0.483076162, 18 ],
+  /* 6714 */  [ 0.483172113, 18 ],
+  /* 6715 */  [ 0.483268069, 18 ],
+  /* 6716 */  [ 0.483364029, 18 ],
+  /* 6717 */  [ 0.483459994, 18 ],
+  /* 6718 */  [ 0.483555964, 18 ],
+  /* 6719 */  [ 0.483651939, 18 ],
+
+  /* 6720 */  [ 0.483747918, 18 ],
+  /* 6721 */  [ 0.483843902, 18 ],
+  /* 6722 */  [ 0.483939891, 18 ],
+  /* 6723 */  [ 0.484035885, 18 ],
+  /* 6724 */  [ 0.484131883, 18 ],
+  /* 6725 */  [ 0.484227886, 18 ],
+  /* 6726 */  [ 0.484323894, 18 ],
+  /* 6727 */  [ 0.484419907, 18 ],
+  /* 6728 */  [ 0.484515924, 18 ],
+  /* 6729 */  [ 0.484611946, 18 ],
+  /* 6730 */  [ 0.484707973, 18 ],
+  /* 6731 */  [ 0.484804005, 18 ],
+  /* 6732 */  [ 0.484900041, 18 ],
+  /* 6733 */  [ 0.484996083, 18 ],
+  /* 6734 */  [ 0.485092128, 18 ],
+  /* 6735 */  [ 0.485188179, 18 ],
+
+  /* 6736 */  [ 0.485284235, 18 ],
+  /* 6737 */  [ 0.485380295, 18 ],
+  /* 6738 */  [ 0.485476360, 18 ],
+  /* 6739 */  [ 0.485572430, 18 ],
+  /* 6740 */  [ 0.485668504, 18 ],
+  /* 6741 */  [ 0.485764583, 18 ],
+  /* 6742 */  [ 0.485860667, 18 ],
+  /* 6743 */  [ 0.485956756, 18 ],
+  /* 6744 */  [ 0.486052849, 18 ],
+  /* 6745 */  [ 0.486148948, 18 ],
+  /* 6746 */  [ 0.486245051, 18 ],
+  /* 6747 */  [ 0.486341158, 18 ],
+  /* 6748 */  [ 0.486437271, 18 ],
+  /* 6749 */  [ 0.486533388, 18 ],
+  /* 6750 */  [ 0.486629510, 18 ],
+  /* 6751 */  [ 0.486725637, 18 ],
+
+  /* 6752 */  [ 0.486821768, 18 ],
+  /* 6753 */  [ 0.486917905, 18 ],
+  /* 6754 */  [ 0.487014045, 18 ],
+  /* 6755 */  [ 0.487110191, 18 ],
+  /* 6756 */  [ 0.487206342, 18 ],
+  /* 6757 */  [ 0.487302497, 18 ],
+  /* 6758 */  [ 0.487398657, 18 ],
+  /* 6759 */  [ 0.487494821, 18 ],
+  /* 6760 */  [ 0.487590991, 18 ],
+  /* 6761 */  [ 0.487687165, 18 ],
+  /* 6762 */  [ 0.487783344, 18 ],
+  /* 6763 */  [ 0.487879528, 18 ],
+  /* 6764 */  [ 0.487975716, 18 ],
+  /* 6765 */  [ 0.488071909, 18 ],
+  /* 6766 */  [ 0.488168107, 18 ],
+  /* 6767 */  [ 0.488264310, 18 ],
+
+  /* 6768 */  [ 0.488360517, 18 ],
+  /* 6769 */  [ 0.488456729, 18 ],
+  /* 6770 */  [ 0.488552946, 18 ],
+  /* 6771 */  [ 0.488649167, 18 ],
+  /* 6772 */  [ 0.488745394, 18 ],
+  /* 6773 */  [ 0.488841625, 18 ],
+  /* 6774 */  [ 0.488937860, 18 ],
+  /* 6775 */  [ 0.489034101, 18 ],
+  /* 6776 */  [ 0.489130346, 18 ],
+  /* 6777 */  [ 0.489226596, 18 ],
+  /* 6778 */  [ 0.489322851, 18 ],
+  /* 6779 */  [ 0.489419110, 18 ],
+  /* 6780 */  [ 0.489515375, 18 ],
+  /* 6781 */  [ 0.489611643, 18 ],
+  /* 6782 */  [ 0.489707917, 18 ],
+  /* 6783 */  [ 0.489804195, 18 ],
+
+  /* 6784 */  [ 0.489900479, 18 ],
+  /* 6785 */  [ 0.489996766, 18 ],
+  /* 6786 */  [ 0.490093059, 18 ],
+  /* 6787 */  [ 0.490189356, 18 ],
+  /* 6788 */  [ 0.490285658, 18 ],
+  /* 6789 */  [ 0.490381965, 18 ],
+  /* 6790 */  [ 0.490478277, 18 ],
+  /* 6791 */  [ 0.490574593, 18 ],
+  /* 6792 */  [ 0.490670914, 18 ],
+  /* 6793 */  [ 0.490767239, 18 ],
+  /* 6794 */  [ 0.490863570, 18 ],
+  /* 6795 */  [ 0.490959905, 18 ],
+  /* 6796 */  [ 0.491056245, 18 ],
+  /* 6797 */  [ 0.491152589, 18 ],
+  /* 6798 */  [ 0.491248939, 18 ],
+  /* 6799 */  [ 0.491345293, 18 ],
+
+  /* 6800 */  [ 0.491441651, 18 ],
+  /* 6801 */  [ 0.491538015, 18 ],
+  /* 6802 */  [ 0.491634383, 18 ],
+  /* 6803 */  [ 0.491730756, 18 ],
+  /* 6804 */  [ 0.491827134, 18 ],
+  /* 6805 */  [ 0.491923516, 18 ],
+  /* 6806 */  [ 0.492019903, 18 ],
+  /* 6807 */  [ 0.492116295, 18 ],
+  /* 6808 */  [ 0.492212691, 18 ],
+  /* 6809 */  [ 0.492309093, 18 ],
+  /* 6810 */  [ 0.492405499, 18 ],
+  /* 6811 */  [ 0.492501909, 18 ],
+  /* 6812 */  [ 0.492598325, 18 ],
+  /* 6813 */  [ 0.492694745, 18 ],
+  /* 6814 */  [ 0.492791170, 18 ],
+  /* 6815 */  [ 0.492887599, 18 ],
+
+  /* 6816 */  [ 0.492984033, 18 ],
+  /* 6817 */  [ 0.493080472, 18 ],
+  /* 6818 */  [ 0.493176916, 18 ],
+  /* 6819 */  [ 0.493273365, 18 ],
+  /* 6820 */  [ 0.493369818, 18 ],
+  /* 6821 */  [ 0.493466275, 18 ],
+  /* 6822 */  [ 0.493562738, 18 ],
+  /* 6823 */  [ 0.493659205, 18 ],
+  /* 6824 */  [ 0.493755677, 18 ],
+  /* 6825 */  [ 0.493852154, 18 ],
+  /* 6826 */  [ 0.493948635, 18 ],
+  /* 6827 */  [ 0.494045122, 18 ],
+  /* 6828 */  [ 0.494141612, 18 ],
+  /* 6829 */  [ 0.494238108, 18 ],
+  /* 6830 */  [ 0.494334608, 18 ],
+  /* 6831 */  [ 0.494431113, 18 ],
+
+  /* 6832 */  [ 0.494527623, 18 ],
+  /* 6833 */  [ 0.494624137, 18 ],
+  /* 6834 */  [ 0.494720656, 18 ],
+  /* 6835 */  [ 0.494817180, 18 ],
+  /* 6836 */  [ 0.494913709, 18 ],
+  /* 6837 */  [ 0.495010242, 18 ],
+  /* 6838 */  [ 0.495106780, 18 ],
+  /* 6839 */  [ 0.495203322, 18 ],
+  /* 6840 */  [ 0.495299870, 18 ],
+  /* 6841 */  [ 0.495396422, 18 ],
+  /* 6842 */  [ 0.495492978, 18 ],
+  /* 6843 */  [ 0.495589540, 18 ],
+  /* 6844 */  [ 0.495686106, 18 ],
+  /* 6845 */  [ 0.495782677, 18 ],
+  /* 6846 */  [ 0.495879252, 18 ],
+  /* 6847 */  [ 0.495975833, 18 ],
+
+  /* 6848 */  [ 0.496072418, 18 ],
+  /* 6849 */  [ 0.496169007, 18 ],
+  /* 6850 */  [ 0.496265602, 18 ],
+  /* 6851 */  [ 0.496362201, 18 ],
+  /* 6852 */  [ 0.496458804, 18 ],
+  /* 6853 */  [ 0.496555413, 18 ],
+  /* 6854 */  [ 0.496652026, 18 ],
+  /* 6855 */  [ 0.496748644, 18 ],
+  /* 6856 */  [ 0.496845266, 18 ],
+  /* 6857 */  [ 0.496941894, 18 ],
+  /* 6858 */  [ 0.497038526, 18 ],
+  /* 6859 */  [ 0.497135162, 18 ],
+  /* 6860 */  [ 0.497231804, 18 ],
+  /* 6861 */  [ 0.497328450, 18 ],
+  /* 6862 */  [ 0.497425100, 18 ],
+  /* 6863 */  [ 0.497521756, 18 ],
+
+  /* 6864 */  [ 0.497618416, 18 ],
+  /* 6865 */  [ 0.497715081, 18 ],
+  /* 6866 */  [ 0.497811750, 18 ],
+  /* 6867 */  [ 0.497908425, 18 ],
+  /* 6868 */  [ 0.498005103, 18 ],
+  /* 6869 */  [ 0.498101787, 18 ],
+  /* 6870 */  [ 0.498198475, 18 ],
+  /* 6871 */  [ 0.498295168, 18 ],
+  /* 6872 */  [ 0.498391866, 18 ],
+  /* 6873 */  [ 0.498488568, 18 ],
+  /* 6874 */  [ 0.498585275, 18 ],
+  /* 6875 */  [ 0.498681987, 18 ],
+  /* 6876 */  [ 0.498778704, 18 ],
+  /* 6877 */  [ 0.498875425, 18 ],
+  /* 6878 */  [ 0.498972150, 18 ],
+  /* 6879 */  [ 0.499068881, 18 ],
+
+  /* 6880 */  [ 0.499165616, 18 ],
+  /* 6881 */  [ 0.499262356, 18 ],
+  /* 6882 */  [ 0.499359101, 18 ],
+  /* 6883 */  [ 0.499455850, 18 ],
+  /* 6884 */  [ 0.499552604, 18 ],
+  /* 6885 */  [ 0.499649362, 18 ],
+  /* 6886 */  [ 0.499746126, 18 ],
+  /* 6887 */  [ 0.499842894, 18 ],
+  /* 6888 */  [ 0.499939666, 18 ],
+  /* 6889 */  [ 0.250018222, 19 ],
+  /* 6890 */  [ 0.250066613, 19 ],
+  /* 6891 */  [ 0.250115006, 19 ],
+  /* 6892 */  [ 0.250163402, 19 ],
+  /* 6893 */  [ 0.250211800, 19 ],
+  /* 6894 */  [ 0.250260200, 19 ],
+  /* 6895 */  [ 0.250308603, 19 ],
+
+  /* 6896 */  [ 0.250357008, 19 ],
+  /* 6897 */  [ 0.250405415, 19 ],
+  /* 6898 */  [ 0.250453825, 19 ],
+  /* 6899 */  [ 0.250502237, 19 ],
+  /* 6900 */  [ 0.250550652, 19 ],
+  /* 6901 */  [ 0.250599068, 19 ],
+  /* 6902 */  [ 0.250647488, 19 ],
+  /* 6903 */  [ 0.250695909, 19 ],
+  /* 6904 */  [ 0.250744333, 19 ],
+  /* 6905 */  [ 0.250792759, 19 ],
+  /* 6906 */  [ 0.250841187, 19 ],
+  /* 6907 */  [ 0.250889618, 19 ],
+  /* 6908 */  [ 0.250938051, 19 ],
+  /* 6909 */  [ 0.250986487, 19 ],
+  /* 6910 */  [ 0.251034924, 19 ],
+  /* 6911 */  [ 0.251083365, 19 ],
+
+  /* 6912 */  [ 0.251131807, 19 ],
+  /* 6913 */  [ 0.251180252, 19 ],
+  /* 6914 */  [ 0.251228699, 19 ],
+  /* 6915 */  [ 0.251277148, 19 ],
+  /* 6916 */  [ 0.251325600, 19 ],
+  /* 6917 */  [ 0.251374054, 19 ],
+  /* 6918 */  [ 0.251422511, 19 ],
+  /* 6919 */  [ 0.251470970, 19 ],
+  /* 6920 */  [ 0.251519431, 19 ],
+  /* 6921 */  [ 0.251567894, 19 ],
+  /* 6922 */  [ 0.251616360, 19 ],
+  /* 6923 */  [ 0.251664828, 19 ],
+  /* 6924 */  [ 0.251713299, 19 ],
+  /* 6925 */  [ 0.251761772, 19 ],
+  /* 6926 */  [ 0.251810247, 19 ],
+  /* 6927 */  [ 0.251858724, 19 ],
+
+  /* 6928 */  [ 0.251907204, 19 ],
+  /* 6929 */  [ 0.251955686, 19 ],
+  /* 6930 */  [ 0.252004171, 19 ],
+  /* 6931 */  [ 0.252052658, 19 ],
+  /* 6932 */  [ 0.252101147, 19 ],
+  /* 6933 */  [ 0.252149638, 19 ],
+  /* 6934 */  [ 0.252198132, 19 ],
+  /* 6935 */  [ 0.252246628, 19 ],
+  /* 6936 */  [ 0.252295127, 19 ],
+  /* 6937 */  [ 0.252343627, 19 ],
+  /* 6938 */  [ 0.252392131, 19 ],
+  /* 6939 */  [ 0.252440636, 19 ],
+  /* 6940 */  [ 0.252489144, 19 ],
+  /* 6941 */  [ 0.252537654, 19 ],
+  /* 6942 */  [ 0.252586166, 19 ],
+  /* 6943 */  [ 0.252634681, 19 ],
+
+  /* 6944 */  [ 0.252683198, 19 ],
+  /* 6945 */  [ 0.252731718, 19 ],
+  /* 6946 */  [ 0.252780240, 19 ],
+  /* 6947 */  [ 0.252828764, 19 ],
+  /* 6948 */  [ 0.252877290, 19 ],
+  /* 6949 */  [ 0.252925819, 19 ],
+  /* 6950 */  [ 0.252974350, 19 ],
+  /* 6951 */  [ 0.253022883, 19 ],
+  /* 6952 */  [ 0.253071419, 19 ],
+  /* 6953 */  [ 0.253119957, 19 ],
+  /* 6954 */  [ 0.253168498, 19 ],
+  /* 6955 */  [ 0.253217040, 19 ],
+  /* 6956 */  [ 0.253265585, 19 ],
+  /* 6957 */  [ 0.253314133, 19 ],
+  /* 6958 */  [ 0.253362682, 19 ],
+  /* 6959 */  [ 0.253411234, 19 ],
+
+  /* 6960 */  [ 0.253459789, 19 ],
+  /* 6961 */  [ 0.253508345, 19 ],
+  /* 6962 */  [ 0.253556904, 19 ],
+  /* 6963 */  [ 0.253605466, 19 ],
+  /* 6964 */  [ 0.253654029, 19 ],
+  /* 6965 */  [ 0.253702595, 19 ],
+  /* 6966 */  [ 0.253751164, 19 ],
+  /* 6967 */  [ 0.253799734, 19 ],
+  /* 6968 */  [ 0.253848307, 19 ],
+  /* 6969 */  [ 0.253896883, 19 ],
+  /* 6970 */  [ 0.253945460, 19 ],
+  /* 6971 */  [ 0.253994040, 19 ],
+  /* 6972 */  [ 0.254042622, 19 ],
+  /* 6973 */  [ 0.254091207, 19 ],
+  /* 6974 */  [ 0.254139794, 19 ],
+  /* 6975 */  [ 0.254188383, 19 ],
+
+  /* 6976 */  [ 0.254236974, 19 ],
+  /* 6977 */  [ 0.254285568, 19 ],
+  /* 6978 */  [ 0.254334165, 19 ],
+  /* 6979 */  [ 0.254382763, 19 ],
+  /* 6980 */  [ 0.254431364, 19 ],
+  /* 6981 */  [ 0.254479967, 19 ],
+  /* 6982 */  [ 0.254528572, 19 ],
+  /* 6983 */  [ 0.254577180, 19 ],
+  /* 6984 */  [ 0.254625790, 19 ],
+  /* 6985 */  [ 0.254674403, 19 ],
+  /* 6986 */  [ 0.254723017, 19 ],
+  /* 6987 */  [ 0.254771635, 19 ],
+  /* 6988 */  [ 0.254820254, 19 ],
+  /* 6989 */  [ 0.254868876, 19 ],
+  /* 6990 */  [ 0.254917500, 19 ],
+  /* 6991 */  [ 0.254966126, 19 ],
+
+  /* 6992 */  [ 0.255014755, 19 ],
+  /* 6993 */  [ 0.255063386, 19 ],
+  /* 6994 */  [ 0.255112019, 19 ],
+  /* 6995 */  [ 0.255160655, 19 ],
+  /* 6996 */  [ 0.255209292, 19 ],
+  /* 6997 */  [ 0.255257933, 19 ],
+  /* 6998 */  [ 0.255306575, 19 ],
+  /* 6999 */  [ 0.255355220, 19 ],
+  /* 7000 */  [ 0.255403867, 19 ],
+  /* 7001 */  [ 0.255452517, 19 ],
+  /* 7002 */  [ 0.255501169, 19 ],
+  /* 7003 */  [ 0.255549823, 19 ],
+  /* 7004 */  [ 0.255598479, 19 ],
+  /* 7005 */  [ 0.255647138, 19 ],
+  /* 7006 */  [ 0.255695799, 19 ],
+  /* 7007 */  [ 0.255744463, 19 ],
+
+  /* 7008 */  [ 0.255793128, 19 ],
+  /* 7009 */  [ 0.255841796, 19 ],
+  /* 7010 */  [ 0.255890467, 19 ],
+  /* 7011 */  [ 0.255939139, 19 ],
+  /* 7012 */  [ 0.255987814, 19 ],
+  /* 7013 */  [ 0.256036492, 19 ],
+  /* 7014 */  [ 0.256085171, 19 ],
+  /* 7015 */  [ 0.256133853, 19 ],
+  /* 7016 */  [ 0.256182537, 19 ],
+  /* 7017 */  [ 0.256231224, 19 ],
+  /* 7018 */  [ 0.256279913, 19 ],
+  /* 7019 */  [ 0.256328604, 19 ],
+  /* 7020 */  [ 0.256377297, 19 ],
+  /* 7021 */  [ 0.256425993, 19 ],
+  /* 7022 */  [ 0.256474691, 19 ],
+  /* 7023 */  [ 0.256523392, 19 ],
+
+  /* 7024 */  [ 0.256572095, 19 ],
+  /* 7025 */  [ 0.256620800, 19 ],
+  /* 7026 */  [ 0.256669507, 19 ],
+  /* 7027 */  [ 0.256718217, 19 ],
+  /* 7028 */  [ 0.256766929, 19 ],
+  /* 7029 */  [ 0.256815643, 19 ],
+  /* 7030 */  [ 0.256864359, 19 ],
+  /* 7031 */  [ 0.256913078, 19 ],
+  /* 7032 */  [ 0.256961800, 19 ],
+  /* 7033 */  [ 0.257010523, 19 ],
+  /* 7034 */  [ 0.257059249, 19 ],
+  /* 7035 */  [ 0.257107977, 19 ],
+  /* 7036 */  [ 0.257156708, 19 ],
+  /* 7037 */  [ 0.257205440, 19 ],
+  /* 7038 */  [ 0.257254175, 19 ],
+  /* 7039 */  [ 0.257302913, 19 ],
+
+  /* 7040 */  [ 0.257351652, 19 ],
+  /* 7041 */  [ 0.257400394, 19 ],
+  /* 7042 */  [ 0.257449139, 19 ],
+  /* 7043 */  [ 0.257497885, 19 ],
+  /* 7044 */  [ 0.257546634, 19 ],
+  /* 7045 */  [ 0.257595386, 19 ],
+  /* 7046 */  [ 0.257644139, 19 ],
+  /* 7047 */  [ 0.257692895, 19 ],
+  /* 7048 */  [ 0.257741653, 19 ],
+  /* 7049 */  [ 0.257790414, 19 ],
+  /* 7050 */  [ 0.257839176, 19 ],
+  /* 7051 */  [ 0.257887941, 19 ],
+  /* 7052 */  [ 0.257936709, 19 ],
+  /* 7053 */  [ 0.257985478, 19 ],
+  /* 7054 */  [ 0.258034250, 19 ],
+  /* 7055 */  [ 0.258083025, 19 ],
+
+  /* 7056 */  [ 0.258131801, 19 ],
+  /* 7057 */  [ 0.258180580, 19 ],
+  /* 7058 */  [ 0.258229361, 19 ],
+  /* 7059 */  [ 0.258278145, 19 ],
+  /* 7060 */  [ 0.258326931, 19 ],
+  /* 7061 */  [ 0.258375719, 19 ],
+  /* 7062 */  [ 0.258424509, 19 ],
+  /* 7063 */  [ 0.258473302, 19 ],
+  /* 7064 */  [ 0.258522097, 19 ],
+  /* 7065 */  [ 0.258570894, 19 ],
+  /* 7066 */  [ 0.258619694, 19 ],
+  /* 7067 */  [ 0.258668496, 19 ],
+  /* 7068 */  [ 0.258717300, 19 ],
+  /* 7069 */  [ 0.258766106, 19 ],
+  /* 7070 */  [ 0.258814915, 19 ],
+  /* 7071 */  [ 0.258863726, 19 ],
+
+  /* 7072 */  [ 0.258912540, 19 ],
+  /* 7073 */  [ 0.258961356, 19 ],
+  /* 7074 */  [ 0.259010174, 19 ],
+  /* 7075 */  [ 0.259058994, 19 ],
+  /* 7076 */  [ 0.259107817, 19 ],
+  /* 7077 */  [ 0.259156642, 19 ],
+  /* 7078 */  [ 0.259205469, 19 ],
+  /* 7079 */  [ 0.259254298, 19 ],
+  /* 7080 */  [ 0.259303130, 19 ],
+  /* 7081 */  [ 0.259351964, 19 ],
+  /* 7082 */  [ 0.259400801, 19 ],
+  /* 7083 */  [ 0.259449639, 19 ],
+  /* 7084 */  [ 0.259498480, 19 ],
+  /* 7085 */  [ 0.259547324, 19 ],
+  /* 7086 */  [ 0.259596169, 19 ],
+  /* 7087 */  [ 0.259645017, 19 ],
+
+  /* 7088 */  [ 0.259693868, 19 ],
+  /* 7089 */  [ 0.259742720, 19 ],
+  /* 7090 */  [ 0.259791575, 19 ],
+  /* 7091 */  [ 0.259840432, 19 ],
+  /* 7092 */  [ 0.259889291, 19 ],
+  /* 7093 */  [ 0.259938153, 19 ],
+  /* 7094 */  [ 0.259987017, 19 ],
+  /* 7095 */  [ 0.260035883, 19 ],
+  /* 7096 */  [ 0.260084752, 19 ],
+  /* 7097 */  [ 0.260133623, 19 ],
+  /* 7098 */  [ 0.260182496, 19 ],
+  /* 7099 */  [ 0.260231372, 19 ],
+  /* 7100 */  [ 0.260280249, 19 ],
+  /* 7101 */  [ 0.260329129, 19 ],
+  /* 7102 */  [ 0.260378012, 19 ],
+  /* 7103 */  [ 0.260426896, 19 ],
+
+  /* 7104 */  [ 0.260475783, 19 ],
+  /* 7105 */  [ 0.260524673, 19 ],
+  /* 7106 */  [ 0.260573564, 19 ],
+  /* 7107 */  [ 0.260622458, 19 ],
+  /* 7108 */  [ 0.260671354, 19 ],
+  /* 7109 */  [ 0.260720252, 19 ],
+  /* 7110 */  [ 0.260769153, 19 ],
+  /* 7111 */  [ 0.260818056, 19 ],
+  /* 7112 */  [ 0.260866961, 19 ],
+  /* 7113 */  [ 0.260915869, 19 ],
+  /* 7114 */  [ 0.260964779, 19 ],
+  /* 7115 */  [ 0.261013691, 19 ],
+  /* 7116 */  [ 0.261062606, 19 ],
+  /* 7117 */  [ 0.261111522, 19 ],
+  /* 7118 */  [ 0.261160441, 19 ],
+  /* 7119 */  [ 0.261209363, 19 ],
+
+  /* 7120 */  [ 0.261258286, 19 ],
+  /* 7121 */  [ 0.261307212, 19 ],
+  /* 7122 */  [ 0.261356140, 19 ],
+  /* 7123 */  [ 0.261405071, 19 ],
+  /* 7124 */  [ 0.261454004, 19 ],
+  /* 7125 */  [ 0.261502939, 19 ],
+  /* 7126 */  [ 0.261551876, 19 ],
+  /* 7127 */  [ 0.261600816, 19 ],
+  /* 7128 */  [ 0.261649758, 19 ],
+  /* 7129 */  [ 0.261698702, 19 ],
+  /* 7130 */  [ 0.261747649, 19 ],
+  /* 7131 */  [ 0.261796597, 19 ],
+  /* 7132 */  [ 0.261845548, 19 ],
+  /* 7133 */  [ 0.261894502, 19 ],
+  /* 7134 */  [ 0.261943458, 19 ],
+  /* 7135 */  [ 0.261992416, 19 ],
+
+  /* 7136 */  [ 0.262041376, 19 ],
+  /* 7137 */  [ 0.262090338, 19 ],
+  /* 7138 */  [ 0.262139303, 19 ],
+  /* 7139 */  [ 0.262188270, 19 ],
+  /* 7140 */  [ 0.262237240, 19 ],
+  /* 7141 */  [ 0.262286211, 19 ],
+  /* 7142 */  [ 0.262335185, 19 ],
+  /* 7143 */  [ 0.262384162, 19 ],
+  /* 7144 */  [ 0.262433140, 19 ],
+  /* 7145 */  [ 0.262482121, 19 ],
+  /* 7146 */  [ 0.262531104, 19 ],
+  /* 7147 */  [ 0.262580089, 19 ],
+  /* 7148 */  [ 0.262629077, 19 ],
+  /* 7149 */  [ 0.262678067, 19 ],
+  /* 7150 */  [ 0.262727059, 19 ],
+  /* 7151 */  [ 0.262776054, 19 ],
+
+  /* 7152 */  [ 0.262825051, 19 ],
+  /* 7153 */  [ 0.262874050, 19 ],
+  /* 7154 */  [ 0.262923051, 19 ],
+  /* 7155 */  [ 0.262972055, 19 ],
+  /* 7156 */  [ 0.263021061, 19 ],
+  /* 7157 */  [ 0.263070069, 19 ],
+  /* 7158 */  [ 0.263119079, 19 ],
+  /* 7159 */  [ 0.263168092, 19 ],
+  /* 7160 */  [ 0.263217107, 19 ],
+  /* 7161 */  [ 0.263266125, 19 ],
+  /* 7162 */  [ 0.263315144, 19 ],
+  /* 7163 */  [ 0.263364166, 19 ],
+  /* 7164 */  [ 0.263413191, 19 ],
+  /* 7165 */  [ 0.263462217, 19 ],
+  /* 7166 */  [ 0.263511246, 19 ],
+  /* 7167 */  [ 0.263560277, 19 ],
+
+  /* 7168 */  [ 0.263609310, 19 ],
+  /* 7169 */  [ 0.263658346, 19 ],
+  /* 7170 */  [ 0.263707384, 19 ],
+  /* 7171 */  [ 0.263756424, 19 ],
+  /* 7172 */  [ 0.263805466, 19 ],
+  /* 7173 */  [ 0.263854511, 19 ],
+  /* 7174 */  [ 0.263903558, 19 ],
+  /* 7175 */  [ 0.263952607, 19 ],
+  /* 7176 */  [ 0.264001659, 19 ],
+  /* 7177 */  [ 0.264050713, 19 ],
+  /* 7178 */  [ 0.264099769, 19 ],
+  /* 7179 */  [ 0.264148827, 19 ],
+  /* 7180 */  [ 0.264197888, 19 ],
+  /* 7181 */  [ 0.264246951, 19 ],
+  /* 7182 */  [ 0.264296016, 19 ],
+  /* 7183 */  [ 0.264345084, 19 ],
+
+  /* 7184 */  [ 0.264394153, 19 ],
+  /* 7185 */  [ 0.264443225, 19 ],
+  /* 7186 */  [ 0.264492300, 19 ],
+  /* 7187 */  [ 0.264541376, 19 ],
+  /* 7188 */  [ 0.264590455, 19 ],
+  /* 7189 */  [ 0.264639536, 19 ],
+  /* 7190 */  [ 0.264688620, 19 ],
+  /* 7191 */  [ 0.264737706, 19 ],
+  /* 7192 */  [ 0.264786794, 19 ],
+  /* 7193 */  [ 0.264835884, 19 ],
+  /* 7194 */  [ 0.264884976, 19 ],
+  /* 7195 */  [ 0.264934071, 19 ],
+  /* 7196 */  [ 0.264983168, 19 ],
+  /* 7197 */  [ 0.265032268, 19 ],
+  /* 7198 */  [ 0.265081369, 19 ],
+  /* 7199 */  [ 0.265130473, 19 ],
+
+  /* 7200 */  [ 0.265179580, 19 ],
+  /* 7201 */  [ 0.265228688, 19 ],
+  /* 7202 */  [ 0.265277799, 19 ],
+  /* 7203 */  [ 0.265326912, 19 ],
+  /* 7204 */  [ 0.265376027, 19 ],
+  /* 7205 */  [ 0.265425145, 19 ],
+  /* 7206 */  [ 0.265474264, 19 ],
+  /* 7207 */  [ 0.265523387, 19 ],
+  /* 7208 */  [ 0.265572511, 19 ],
+  /* 7209 */  [ 0.265621638, 19 ],
+  /* 7210 */  [ 0.265670766, 19 ],
+  /* 7211 */  [ 0.265719898, 19 ],
+  /* 7212 */  [ 0.265769031, 19 ],
+  /* 7213 */  [ 0.265818167, 19 ],
+  /* 7214 */  [ 0.265867305, 19 ],
+  /* 7215 */  [ 0.265916445, 19 ],
+
+  /* 7216 */  [ 0.265965588, 19 ],
+  /* 7217 */  [ 0.266014732, 19 ],
+  /* 7218 */  [ 0.266063880, 19 ],
+  /* 7219 */  [ 0.266113029, 19 ],
+  /* 7220 */  [ 0.266162181, 19 ],
+  /* 7221 */  [ 0.266211334, 19 ],
+  /* 7222 */  [ 0.266260491, 19 ],
+  /* 7223 */  [ 0.266309649, 19 ],
+  /* 7224 */  [ 0.266358810, 19 ],
+  /* 7225 */  [ 0.266407973, 19 ],
+  /* 7226 */  [ 0.266457138, 19 ],
+  /* 7227 */  [ 0.266506305, 19 ],
+  /* 7228 */  [ 0.266555475, 19 ],
+  /* 7229 */  [ 0.266604647, 19 ],
+  /* 7230 */  [ 0.266653822, 19 ],
+  /* 7231 */  [ 0.266702998, 19 ],
+
+  /* 7232 */  [ 0.266752177, 19 ],
+  /* 7233 */  [ 0.266801358, 19 ],
+  /* 7234 */  [ 0.266850541, 19 ],
+  /* 7235 */  [ 0.266899727, 19 ],
+  /* 7236 */  [ 0.266948915, 19 ],
+  /* 7237 */  [ 0.266998105, 19 ],
+  /* 7238 */  [ 0.267047298, 19 ],
+  /* 7239 */  [ 0.267096492, 19 ],
+  /* 7240 */  [ 0.267145689, 19 ],
+  /* 7241 */  [ 0.267194888, 19 ],
+  /* 7242 */  [ 0.267244090, 19 ],
+  /* 7243 */  [ 0.267293294, 19 ],
+  /* 7244 */  [ 0.267342500, 19 ],
+  /* 7245 */  [ 0.267391708, 19 ],
+  /* 7246 */  [ 0.267440919, 19 ],
+  /* 7247 */  [ 0.267490131, 19 ],
+
+  /* 7248 */  [ 0.267539347, 19 ],
+  /* 7249 */  [ 0.267588564, 19 ],
+  /* 7250 */  [ 0.267637783, 19 ],
+  /* 7251 */  [ 0.267687005, 19 ],
+  /* 7252 */  [ 0.267736229, 19 ],
+  /* 7253 */  [ 0.267785456, 19 ],
+  /* 7254 */  [ 0.267834685, 19 ],
+  /* 7255 */  [ 0.267883915, 19 ],
+  /* 7256 */  [ 0.267933149, 19 ],
+  /* 7257 */  [ 0.267982384, 19 ],
+  /* 7258 */  [ 0.268031622, 19 ],
+  /* 7259 */  [ 0.268080862, 19 ],
+  /* 7260 */  [ 0.268130104, 19 ],
+  /* 7261 */  [ 0.268179349, 19 ],
+  /* 7262 */  [ 0.268228595, 19 ],
+  /* 7263 */  [ 0.268277844, 19 ],
+
+  /* 7264 */  [ 0.268327096, 19 ],
+  /* 7265 */  [ 0.268376349, 19 ],
+  /* 7266 */  [ 0.268425605, 19 ],
+  /* 7267 */  [ 0.268474863, 19 ],
+  /* 7268 */  [ 0.268524123, 19 ],
+  /* 7269 */  [ 0.268573386, 19 ],
+  /* 7270 */  [ 0.268622651, 19 ],
+  /* 7271 */  [ 0.268671918, 19 ],
+  /* 7272 */  [ 0.268721187, 19 ],
+  /* 7273 */  [ 0.268770459, 19 ],
+  /* 7274 */  [ 0.268819733, 19 ],
+  /* 7275 */  [ 0.268869009, 19 ],
+  /* 7276 */  [ 0.268918287, 19 ],
+  /* 7277 */  [ 0.268967568, 19 ],
+  /* 7278 */  [ 0.269016851, 19 ],
+  /* 7279 */  [ 0.269066136, 19 ],
+
+  /* 7280 */  [ 0.269115423, 19 ],
+  /* 7281 */  [ 0.269164713, 19 ],
+  /* 7282 */  [ 0.269214005, 19 ],
+  /* 7283 */  [ 0.269263299, 19 ],
+  /* 7284 */  [ 0.269312595, 19 ],
+  /* 7285 */  [ 0.269361894, 19 ],
+  /* 7286 */  [ 0.269411195, 19 ],
+  /* 7287 */  [ 0.269460498, 19 ],
+  /* 7288 */  [ 0.269509804, 19 ],
+  /* 7289 */  [ 0.269559111, 19 ],
+  /* 7290 */  [ 0.269608421, 19 ],
+  /* 7291 */  [ 0.269657734, 19 ],
+  /* 7292 */  [ 0.269707048, 19 ],
+  /* 7293 */  [ 0.269756365, 19 ],
+  /* 7294 */  [ 0.269805684, 19 ],
+  /* 7295 */  [ 0.269855005, 19 ],
+
+  /* 7296 */  [ 0.269904329, 19 ],
+  /* 7297 */  [ 0.269953654, 19 ],
+  /* 7298 */  [ 0.270002982, 19 ],
+  /* 7299 */  [ 0.270052313, 19 ],
+  /* 7300 */  [ 0.270101645, 19 ],
+  /* 7301 */  [ 0.270150980, 19 ],
+  /* 7302 */  [ 0.270200317, 19 ],
+  /* 7303 */  [ 0.270249656, 19 ],
+  /* 7304 */  [ 0.270298998, 19 ],
+  /* 7305 */  [ 0.270348341, 19 ],
+  /* 7306 */  [ 0.270397687, 19 ],
+  /* 7307 */  [ 0.270447036, 19 ],
+  /* 7308 */  [ 0.270496386, 19 ],
+  /* 7309 */  [ 0.270545739, 19 ],
+  /* 7310 */  [ 0.270595094, 19 ],
+  /* 7311 */  [ 0.270644451, 19 ],
+
+  /* 7312 */  [ 0.270693811, 19 ],
+  /* 7313 */  [ 0.270743173, 19 ],
+  /* 7314 */  [ 0.270792537, 19 ],
+  /* 7315 */  [ 0.270841903, 19 ],
+  /* 7316 */  [ 0.270891271, 19 ],
+  /* 7317 */  [ 0.270940642, 19 ],
+  /* 7318 */  [ 0.270990015, 19 ],
+  /* 7319 */  [ 0.271039390, 19 ],
+  /* 7320 */  [ 0.271088768, 19 ],
+  /* 7321 */  [ 0.271138148, 19 ],
+  /* 7322 */  [ 0.271187530, 19 ],
+  /* 7323 */  [ 0.271236914, 19 ],
+  /* 7324 */  [ 0.271286301, 19 ],
+  /* 7325 */  [ 0.271335689, 19 ],
+  /* 7326 */  [ 0.271385080, 19 ],
+  /* 7327 */  [ 0.271434474, 19 ],
+
+  /* 7328 */  [ 0.271483869, 19 ],
+  /* 7329 */  [ 0.271533267, 19 ],
+  /* 7330 */  [ 0.271582667, 19 ],
+  /* 7331 */  [ 0.271632069, 19 ],
+  /* 7332 */  [ 0.271681474, 19 ],
+  /* 7333 */  [ 0.271730880, 19 ],
+  /* 7334 */  [ 0.271780289, 19 ],
+  /* 7335 */  [ 0.271829701, 19 ],
+  /* 7336 */  [ 0.271879114, 19 ],
+  /* 7337 */  [ 0.271928530, 19 ],
+  /* 7338 */  [ 0.271977948, 19 ],
+  /* 7339 */  [ 0.272027368, 19 ],
+  /* 7340 */  [ 0.272076790, 19 ],
+  /* 7341 */  [ 0.272126215, 19 ],
+  /* 7342 */  [ 0.272175642, 19 ],
+  /* 7343 */  [ 0.272225071, 19 ],
+
+  /* 7344 */  [ 0.272274503, 19 ],
+  /* 7345 */  [ 0.272323936, 19 ],
+  /* 7346 */  [ 0.272373372, 19 ],
+  /* 7347 */  [ 0.272422810, 19 ],
+  /* 7348 */  [ 0.272472251, 19 ],
+  /* 7349 */  [ 0.272521693, 19 ],
+  /* 7350 */  [ 0.272571138, 19 ],
+  /* 7351 */  [ 0.272620585, 19 ],
+  /* 7352 */  [ 0.272670035, 19 ],
+  /* 7353 */  [ 0.272719486, 19 ],
+  /* 7354 */  [ 0.272768940, 19 ],
+  /* 7355 */  [ 0.272818396, 19 ],
+  /* 7356 */  [ 0.272867855, 19 ],
+  /* 7357 */  [ 0.272917315, 19 ],
+  /* 7358 */  [ 0.272966778, 19 ],
+  /* 7359 */  [ 0.273016243, 19 ],
+
+  /* 7360 */  [ 0.273065710, 19 ],
+  /* 7361 */  [ 0.273115180, 19 ],
+  /* 7362 */  [ 0.273164652, 19 ],
+  /* 7363 */  [ 0.273214126, 19 ],
+  /* 7364 */  [ 0.273263602, 19 ],
+  /* 7365 */  [ 0.273313081, 19 ],
+  /* 7366 */  [ 0.273362561, 19 ],
+  /* 7367 */  [ 0.273412044, 19 ],
+  /* 7368 */  [ 0.273461530, 19 ],
+  /* 7369 */  [ 0.273511017, 19 ],
+  /* 7370 */  [ 0.273560507, 19 ],
+  /* 7371 */  [ 0.273609999, 19 ],
+  /* 7372 */  [ 0.273659493, 19 ],
+  /* 7373 */  [ 0.273708989, 19 ],
+  /* 7374 */  [ 0.273758488, 19 ],
+  /* 7375 */  [ 0.273807989, 19 ],
+
+  /* 7376 */  [ 0.273857492, 19 ],
+  /* 7377 */  [ 0.273906997, 19 ],
+  /* 7378 */  [ 0.273956505, 19 ],
+  /* 7379 */  [ 0.274006015, 19 ],
+  /* 7380 */  [ 0.274055527, 19 ],
+  /* 7381 */  [ 0.274105041, 19 ],
+  /* 7382 */  [ 0.274154558, 19 ],
+  /* 7383 */  [ 0.274204076, 19 ],
+  /* 7384 */  [ 0.274253597, 19 ],
+  /* 7385 */  [ 0.274303121, 19 ],
+  /* 7386 */  [ 0.274352646, 19 ],
+  /* 7387 */  [ 0.274402174, 19 ],
+  /* 7388 */  [ 0.274451704, 19 ],
+  /* 7389 */  [ 0.274501236, 19 ],
+  /* 7390 */  [ 0.274550771, 19 ],
+  /* 7391 */  [ 0.274600307, 19 ],
+
+  /* 7392 */  [ 0.274649846, 19 ],
+  /* 7393 */  [ 0.274699387, 19 ],
+  /* 7394 */  [ 0.274748931, 19 ],
+  /* 7395 */  [ 0.274798476, 19 ],
+  /* 7396 */  [ 0.274848024, 19 ],
+  /* 7397 */  [ 0.274897574, 19 ],
+  /* 7398 */  [ 0.274947126, 19 ],
+  /* 7399 */  [ 0.274996681, 19 ],
+  /* 7400 */  [ 0.275046238, 19 ],
+  /* 7401 */  [ 0.275095797, 19 ],
+  /* 7402 */  [ 0.275145358, 19 ],
+  /* 7403 */  [ 0.275194921, 19 ],
+  /* 7404 */  [ 0.275244487, 19 ],
+  /* 7405 */  [ 0.275294055, 19 ],
+  /* 7406 */  [ 0.275343625, 19 ],
+  /* 7407 */  [ 0.275393198, 19 ],
+
+  /* 7408 */  [ 0.275442772, 19 ],
+  /* 7409 */  [ 0.275492349, 19 ],
+  /* 7410 */  [ 0.275541928, 19 ],
+  /* 7411 */  [ 0.275591509, 19 ],
+  /* 7412 */  [ 0.275641093, 19 ],
+  /* 7413 */  [ 0.275690679, 19 ],
+  /* 7414 */  [ 0.275740267, 19 ],
+  /* 7415 */  [ 0.275789857, 19 ],
+  /* 7416 */  [ 0.275839449, 19 ],
+  /* 7417 */  [ 0.275889044, 19 ],
+  /* 7418 */  [ 0.275938641, 19 ],
+  /* 7419 */  [ 0.275988240, 19 ],
+  /* 7420 */  [ 0.276037842, 19 ],
+  /* 7421 */  [ 0.276087445, 19 ],
+  /* 7422 */  [ 0.276137051, 19 ],
+  /* 7423 */  [ 0.276186659, 19 ],
+
+  /* 7424 */  [ 0.276236269, 19 ],
+  /* 7425 */  [ 0.276285882, 19 ],
+  /* 7426 */  [ 0.276335497, 19 ],
+  /* 7427 */  [ 0.276385113, 19 ],
+  /* 7428 */  [ 0.276434733, 19 ],
+  /* 7429 */  [ 0.276484354, 19 ],
+  /* 7430 */  [ 0.276533978, 19 ],
+  /* 7431 */  [ 0.276583604, 19 ],
+  /* 7432 */  [ 0.276633232, 19 ],
+  /* 7433 */  [ 0.276682862, 19 ],
+  /* 7434 */  [ 0.276732495, 19 ],
+  /* 7435 */  [ 0.276782129, 19 ],
+  /* 7436 */  [ 0.276831766, 19 ],
+  /* 7437 */  [ 0.276881406, 19 ],
+  /* 7438 */  [ 0.276931047, 19 ],
+  /* 7439 */  [ 0.276980691, 19 ],
+
+  /* 7440 */  [ 0.277030337, 19 ],
+  /* 7441 */  [ 0.277079985, 19 ],
+  /* 7442 */  [ 0.277129635, 19 ],
+  /* 7443 */  [ 0.277179288, 19 ],
+  /* 7444 */  [ 0.277228942, 19 ],
+  /* 7445 */  [ 0.277278600, 19 ],
+  /* 7446 */  [ 0.277328259, 19 ],
+  /* 7447 */  [ 0.277377920, 19 ],
+  /* 7448 */  [ 0.277427584, 19 ],
+  /* 7449 */  [ 0.277477250, 19 ],
+  /* 7450 */  [ 0.277526918, 19 ],
+  /* 7451 */  [ 0.277576588, 19 ],
+  /* 7452 */  [ 0.277626261, 19 ],
+  /* 7453 */  [ 0.277675936, 19 ],
+  /* 7454 */  [ 0.277725613, 19 ],
+  /* 7455 */  [ 0.277775292, 19 ],
+
+  /* 7456 */  [ 0.277824973, 19 ],
+  /* 7457 */  [ 0.277874657, 19 ],
+  /* 7458 */  [ 0.277924343, 19 ],
+  /* 7459 */  [ 0.277974031, 19 ],
+  /* 7460 */  [ 0.278023722, 19 ],
+  /* 7461 */  [ 0.278073414, 19 ],
+  /* 7462 */  [ 0.278123109, 19 ],
+  /* 7463 */  [ 0.278172806, 19 ],
+  /* 7464 */  [ 0.278222505, 19 ],
+  /* 7465 */  [ 0.278272207, 19 ],
+  /* 7466 */  [ 0.278321910, 19 ],
+  /* 7467 */  [ 0.278371616, 19 ],
+  /* 7468 */  [ 0.278421324, 19 ],
+  /* 7469 */  [ 0.278471035, 19 ],
+  /* 7470 */  [ 0.278520747, 19 ],
+  /* 7471 */  [ 0.278570462, 19 ],
+
+  /* 7472 */  [ 0.278620179, 19 ],
+  /* 7473 */  [ 0.278669898, 19 ],
+  /* 7474 */  [ 0.278719619, 19 ],
+  /* 7475 */  [ 0.278769343, 19 ],
+  /* 7476 */  [ 0.278819069, 19 ],
+  /* 7477 */  [ 0.278868797, 19 ],
+  /* 7478 */  [ 0.278918527, 19 ],
+  /* 7479 */  [ 0.278968260, 19 ],
+  /* 7480 */  [ 0.279017995, 19 ],
+  /* 7481 */  [ 0.279067731, 19 ],
+  /* 7482 */  [ 0.279117471, 19 ],
+  /* 7483 */  [ 0.279167212, 19 ],
+  /* 7484 */  [ 0.279216956, 19 ],
+  /* 7485 */  [ 0.279266701, 19 ],
+  /* 7486 */  [ 0.279316449, 19 ],
+  /* 7487 */  [ 0.279366200, 19 ],
+
+  /* 7488 */  [ 0.279415952, 19 ],
+  /* 7489 */  [ 0.279465707, 19 ],
+  /* 7490 */  [ 0.279515464, 19 ],
+  /* 7491 */  [ 0.279565223, 19 ],
+  /* 7492 */  [ 0.279614984, 19 ],
+  /* 7493 */  [ 0.279664748, 19 ],
+  /* 7494 */  [ 0.279714513, 19 ],
+  /* 7495 */  [ 0.279764281, 19 ],
+  /* 7496 */  [ 0.279814051, 19 ],
+  /* 7497 */  [ 0.279863824, 19 ],
+  /* 7498 */  [ 0.279913598, 19 ],
+  /* 7499 */  [ 0.279963375, 19 ],
+  /* 7500 */  [ 0.280013154, 19 ],
+  /* 7501 */  [ 0.280062935, 19 ],
+  /* 7502 */  [ 0.280112719, 19 ],
+  /* 7503 */  [ 0.280162504, 19 ],
+
+  /* 7504 */  [ 0.280212292, 19 ],
+  /* 7505 */  [ 0.280262082, 19 ],
+  /* 7506 */  [ 0.280311875, 19 ],
+  /* 7507 */  [ 0.280361669, 19 ],
+  /* 7508 */  [ 0.280411466, 19 ],
+  /* 7509 */  [ 0.280461265, 19 ],
+  /* 7510 */  [ 0.280511066, 19 ],
+  /* 7511 */  [ 0.280560869, 19 ],
+  /* 7512 */  [ 0.280610675, 19 ],
+  /* 7513 */  [ 0.280660483, 19 ],
+  /* 7514 */  [ 0.280710292, 19 ],
+  /* 7515 */  [ 0.280760105, 19 ],
+  /* 7516 */  [ 0.280809919, 19 ],
+  /* 7517 */  [ 0.280859736, 19 ],
+  /* 7518 */  [ 0.280909554, 19 ],
+  /* 7519 */  [ 0.280959375, 19 ],
+
+  /* 7520 */  [ 0.281009199, 19 ],
+  /* 7521 */  [ 0.281059024, 19 ],
+  /* 7522 */  [ 0.281108852, 19 ],
+  /* 7523 */  [ 0.281158682, 19 ],
+  /* 7524 */  [ 0.281208514, 19 ],
+  /* 7525 */  [ 0.281258348, 19 ],
+  /* 7526 */  [ 0.281308184, 19 ],
+  /* 7527 */  [ 0.281358023, 19 ],
+  /* 7528 */  [ 0.281407864, 19 ],
+  /* 7529 */  [ 0.281457707, 19 ],
+  /* 7530 */  [ 0.281507552, 19 ],
+  /* 7531 */  [ 0.281557400, 19 ],
+  /* 7532 */  [ 0.281607250, 19 ],
+  /* 7533 */  [ 0.281657101, 19 ],
+  /* 7534 */  [ 0.281706956, 19 ],
+  /* 7535 */  [ 0.281756812, 19 ],
+
+  /* 7536 */  [ 0.281806670, 19 ],
+  /* 7537 */  [ 0.281856531, 19 ],
+  /* 7538 */  [ 0.281906394, 19 ],
+  /* 7539 */  [ 0.281956259, 19 ],
+  /* 7540 */  [ 0.282006127, 19 ],
+  /* 7541 */  [ 0.282055996, 19 ],
+  /* 7542 */  [ 0.282105868, 19 ],
+  /* 7543 */  [ 0.282155742, 19 ],
+  /* 7544 */  [ 0.282205618, 19 ],
+  /* 7545 */  [ 0.282255496, 19 ],
+  /* 7546 */  [ 0.282305377, 19 ],
+  /* 7547 */  [ 0.282355260, 19 ],
+  /* 7548 */  [ 0.282405145, 19 ],
+  /* 7549 */  [ 0.282455032, 19 ],
+  /* 7550 */  [ 0.282504921, 19 ],
+  /* 7551 */  [ 0.282554813, 19 ],
+
+  /* 7552 */  [ 0.282604707, 19 ],
+  /* 7553 */  [ 0.282654603, 19 ],
+  /* 7554 */  [ 0.282704501, 19 ],
+  /* 7555 */  [ 0.282754401, 19 ],
+  /* 7556 */  [ 0.282804304, 19 ],
+  /* 7557 */  [ 0.282854209, 19 ],
+  /* 7558 */  [ 0.282904116, 19 ],
+  /* 7559 */  [ 0.282954025, 19 ],
+  /* 7560 */  [ 0.283003936, 19 ],
+  /* 7561 */  [ 0.283053850, 19 ],
+  /* 7562 */  [ 0.283103766, 19 ],
+  /* 7563 */  [ 0.283153684, 19 ],
+  /* 7564 */  [ 0.283203604, 19 ],
+  /* 7565 */  [ 0.283253527, 19 ],
+  /* 7566 */  [ 0.283303451, 19 ],
+  /* 7567 */  [ 0.283353378, 19 ],
+
+  /* 7568 */  [ 0.283403307, 19 ],
+  /* 7569 */  [ 0.283453238, 19 ],
+  /* 7570 */  [ 0.283503172, 19 ],
+  /* 7571 */  [ 0.283553107, 19 ],
+  /* 7572 */  [ 0.283603045, 19 ],
+  /* 7573 */  [ 0.283652985, 19 ],
+  /* 7574 */  [ 0.283702927, 19 ],
+  /* 7575 */  [ 0.283752872, 19 ],
+  /* 7576 */  [ 0.283802818, 19 ],
+  /* 7577 */  [ 0.283852767, 19 ],
+  /* 7578 */  [ 0.283902718, 19 ],
+  /* 7579 */  [ 0.283952671, 19 ],
+  /* 7580 */  [ 0.284002627, 19 ],
+  /* 7581 */  [ 0.284052584, 19 ],
+  /* 7582 */  [ 0.284102544, 19 ],
+  /* 7583 */  [ 0.284152506, 19 ],
+
+  /* 7584 */  [ 0.284202470, 19 ],
+  /* 7585 */  [ 0.284252436, 19 ],
+  /* 7586 */  [ 0.284302405, 19 ],
+  /* 7587 */  [ 0.284352376, 19 ],
+  /* 7588 */  [ 0.284402349, 19 ],
+  /* 7589 */  [ 0.284452324, 19 ],
+  /* 7590 */  [ 0.284502301, 19 ],
+  /* 7591 */  [ 0.284552281, 19 ],
+  /* 7592 */  [ 0.284602263, 19 ],
+  /* 7593 */  [ 0.284652246, 19 ],
+  /* 7594 */  [ 0.284702233, 19 ],
+  /* 7595 */  [ 0.284752221, 19 ],
+  /* 7596 */  [ 0.284802211, 19 ],
+  /* 7597 */  [ 0.284852204, 19 ],
+  /* 7598 */  [ 0.284902199, 19 ],
+  /* 7599 */  [ 0.284952196, 19 ],
+
+  /* 7600 */  [ 0.285002195, 19 ],
+  /* 7601 */  [ 0.285052197, 19 ],
+  /* 7602 */  [ 0.285102201, 19 ],
+  /* 7603 */  [ 0.285152206, 19 ],
+  /* 7604 */  [ 0.285202214, 19 ],
+  /* 7605 */  [ 0.285252225, 19 ],
+  /* 7606 */  [ 0.285302237, 19 ],
+  /* 7607 */  [ 0.285352252, 19 ],
+  /* 7608 */  [ 0.285402269, 19 ],
+  /* 7609 */  [ 0.285452288, 19 ],
+  /* 7610 */  [ 0.285502309, 19 ],
+  /* 7611 */  [ 0.285552332, 19 ],
+  /* 7612 */  [ 0.285602358, 19 ],
+  /* 7613 */  [ 0.285652386, 19 ],
+  /* 7614 */  [ 0.285702416, 19 ],
+  /* 7615 */  [ 0.285752448, 19 ],
+
+  /* 7616 */  [ 0.285802482, 19 ],
+  /* 7617 */  [ 0.285852519, 19 ],
+  /* 7618 */  [ 0.285902557, 19 ],
+  /* 7619 */  [ 0.285952598, 19 ],
+  /* 7620 */  [ 0.286002641, 19 ],
+  /* 7621 */  [ 0.286052687, 19 ],
+  /* 7622 */  [ 0.286102734, 19 ],
+  /* 7623 */  [ 0.286152784, 19 ],
+  /* 7624 */  [ 0.286202836, 19 ],
+  /* 7625 */  [ 0.286252890, 19 ],
+  /* 7626 */  [ 0.286302946, 19 ],
+  /* 7627 */  [ 0.286353005, 19 ],
+  /* 7628 */  [ 0.286403065, 19 ],
+  /* 7629 */  [ 0.286453128, 19 ],
+  /* 7630 */  [ 0.286503193, 19 ],
+  /* 7631 */  [ 0.286553260, 19 ],
+
+  /* 7632 */  [ 0.286603329, 19 ],
+  /* 7633 */  [ 0.286653401, 19 ],
+  /* 7634 */  [ 0.286703475, 19 ],
+  /* 7635 */  [ 0.286753551, 19 ],
+  /* 7636 */  [ 0.286803629, 19 ],
+  /* 7637 */  [ 0.286853709, 19 ],
+  /* 7638 */  [ 0.286903792, 19 ],
+  /* 7639 */  [ 0.286953876, 19 ],
+  /* 7640 */  [ 0.287003963, 19 ],
+  /* 7641 */  [ 0.287054052, 19 ],
+  /* 7642 */  [ 0.287104143, 19 ],
+  /* 7643 */  [ 0.287154237, 19 ],
+  /* 7644 */  [ 0.287204332, 19 ],
+  /* 7645 */  [ 0.287254430, 19 ],
+  /* 7646 */  [ 0.287304530, 19 ],
+  /* 7647 */  [ 0.287354632, 19 ],
+
+  /* 7648 */  [ 0.287404737, 19 ],
+  /* 7649 */  [ 0.287454843, 19 ],
+  /* 7650 */  [ 0.287504952, 19 ],
+  /* 7651 */  [ 0.287555063, 19 ],
+  /* 7652 */  [ 0.287605176, 19 ],
+  /* 7653 */  [ 0.287655291, 19 ],
+  /* 7654 */  [ 0.287705409, 19 ],
+  /* 7655 */  [ 0.287755528, 19 ],
+  /* 7656 */  [ 0.287805650, 19 ],
+  /* 7657 */  [ 0.287855774, 19 ],
+  /* 7658 */  [ 0.287905900, 19 ],
+  /* 7659 */  [ 0.287956028, 19 ],
+  /* 7660 */  [ 0.288006159, 19 ],
+  /* 7661 */  [ 0.288056292, 19 ],
+  /* 7662 */  [ 0.288106427, 19 ],
+  /* 7663 */  [ 0.288156564, 19 ],
+
+  /* 7664 */  [ 0.288206703, 19 ],
+  /* 7665 */  [ 0.288256844, 19 ],
+  /* 7666 */  [ 0.288306988, 19 ],
+  /* 7667 */  [ 0.288357134, 19 ],
+  /* 7668 */  [ 0.288407282, 19 ],
+  /* 7669 */  [ 0.288457432, 19 ],
+  /* 7670 */  [ 0.288507584, 19 ],
+  /* 7671 */  [ 0.288557739, 19 ],
+  /* 7672 */  [ 0.288607895, 19 ],
+  /* 7673 */  [ 0.288658054, 19 ],
+  /* 7674 */  [ 0.288708215, 19 ],
+  /* 7675 */  [ 0.288758379, 19 ],
+  /* 7676 */  [ 0.288808544, 19 ],
+  /* 7677 */  [ 0.288858712, 19 ],
+  /* 7678 */  [ 0.288908881, 19 ],
+  /* 7679 */  [ 0.288959053, 19 ],
+
+  /* 7680 */  [ 0.289009227, 19 ],
+  /* 7681 */  [ 0.289059404, 19 ],
+  /* 7682 */  [ 0.289109582, 19 ],
+  /* 7683 */  [ 0.289159763, 19 ],
+  /* 7684 */  [ 0.289209946, 19 ],
+  /* 7685 */  [ 0.289260131, 19 ],
+  /* 7686 */  [ 0.289310318, 19 ],
+  /* 7687 */  [ 0.289360507, 19 ],
+  /* 7688 */  [ 0.289410699, 19 ],
+  /* 7689 */  [ 0.289460893, 19 ],
+  /* 7690 */  [ 0.289511088, 19 ],
+  /* 7691 */  [ 0.289561287, 19 ],
+  /* 7692 */  [ 0.289611487, 19 ],
+  /* 7693 */  [ 0.289661689, 19 ],
+  /* 7694 */  [ 0.289711894, 19 ],
+  /* 7695 */  [ 0.289762101, 19 ],
+
+  /* 7696 */  [ 0.289812309, 19 ],
+  /* 7697 */  [ 0.289862521, 19 ],
+  /* 7698 */  [ 0.289912734, 19 ],
+  /* 7699 */  [ 0.289962949, 19 ],
+  /* 7700 */  [ 0.290013167, 19 ],
+  /* 7701 */  [ 0.290063387, 19 ],
+  /* 7702 */  [ 0.290113609, 19 ],
+  /* 7703 */  [ 0.290163833, 19 ],
+  /* 7704 */  [ 0.290214059, 19 ],
+  /* 7705 */  [ 0.290264288, 19 ],
+  /* 7706 */  [ 0.290314519, 19 ],
+  /* 7707 */  [ 0.290364751, 19 ],
+  /* 7708 */  [ 0.290414986, 19 ],
+  /* 7709 */  [ 0.290465224, 19 ],
+  /* 7710 */  [ 0.290515463, 19 ],
+  /* 7711 */  [ 0.290565705, 19 ],
+
+  /* 7712 */  [ 0.290615948, 19 ],
+  /* 7713 */  [ 0.290666194, 19 ],
+  /* 7714 */  [ 0.290716442, 19 ],
+  /* 7715 */  [ 0.290766692, 19 ],
+  /* 7716 */  [ 0.290816945, 19 ],
+  /* 7717 */  [ 0.290867199, 19 ],
+  /* 7718 */  [ 0.290917456, 19 ],
+  /* 7719 */  [ 0.290967715, 19 ],
+  /* 7720 */  [ 0.291017976, 19 ],
+  /* 7721 */  [ 0.291068239, 19 ],
+  /* 7722 */  [ 0.291118505, 19 ],
+  /* 7723 */  [ 0.291168772, 19 ],
+  /* 7724 */  [ 0.291219042, 19 ],
+  /* 7725 */  [ 0.291269314, 19 ],
+  /* 7726 */  [ 0.291319588, 19 ],
+  /* 7727 */  [ 0.291369865, 19 ],
+
+  /* 7728 */  [ 0.291420143, 19 ],
+  /* 7729 */  [ 0.291470424, 19 ],
+  /* 7730 */  [ 0.291520706, 19 ],
+  /* 7731 */  [ 0.291570991, 19 ],
+  /* 7732 */  [ 0.291621278, 19 ],
+  /* 7733 */  [ 0.291671568, 19 ],
+  /* 7734 */  [ 0.291721859, 19 ],
+  /* 7735 */  [ 0.291772153, 19 ],
+  /* 7736 */  [ 0.291822449, 19 ],
+  /* 7737 */  [ 0.291872747, 19 ],
+  /* 7738 */  [ 0.291923047, 19 ],
+  /* 7739 */  [ 0.291973349, 19 ],
+  /* 7740 */  [ 0.292023653, 19 ],
+  /* 7741 */  [ 0.292073960, 19 ],
+  /* 7742 */  [ 0.292124269, 19 ],
+  /* 7743 */  [ 0.292174580, 19 ],
+
+  /* 7744 */  [ 0.292224893, 19 ],
+  /* 7745 */  [ 0.292275208, 19 ],
+  /* 7746 */  [ 0.292325526, 19 ],
+  /* 7747 */  [ 0.292375845, 19 ],
+  /* 7748 */  [ 0.292426167, 19 ],
+  /* 7749 */  [ 0.292476491, 19 ],
+  /* 7750 */  [ 0.292526817, 19 ],
+  /* 7751 */  [ 0.292577145, 19 ],
+  /* 7752 */  [ 0.292627476, 19 ],
+  /* 7753 */  [ 0.292677808, 19 ],
+  /* 7754 */  [ 0.292728143, 19 ],
+  /* 7755 */  [ 0.292778480, 19 ],
+  /* 7756 */  [ 0.292828819, 19 ],
+  /* 7757 */  [ 0.292879160, 19 ],
+  /* 7758 */  [ 0.292929504, 19 ],
+  /* 7759 */  [ 0.292979849, 19 ],
+
+  /* 7760 */  [ 0.293030197, 19 ],
+  /* 7761 */  [ 0.293080547, 19 ],
+  /* 7762 */  [ 0.293130899, 19 ],
+  /* 7763 */  [ 0.293181253, 19 ],
+  /* 7764 */  [ 0.293231610, 19 ],
+  /* 7765 */  [ 0.293281968, 19 ],
+  /* 7766 */  [ 0.293332329, 19 ],
+  /* 7767 */  [ 0.293382692, 19 ],
+  /* 7768 */  [ 0.293433057, 19 ],
+  /* 7769 */  [ 0.293483424, 19 ],
+  /* 7770 */  [ 0.293533794, 19 ],
+  /* 7771 */  [ 0.293584165, 19 ],
+  /* 7772 */  [ 0.293634539, 19 ],
+  /* 7773 */  [ 0.293684915, 19 ],
+  /* 7774 */  [ 0.293735293, 19 ],
+  /* 7775 */  [ 0.293785673, 19 ],
+
+  /* 7776 */  [ 0.293836055, 19 ],
+  /* 7777 */  [ 0.293886440, 19 ],
+  /* 7778 */  [ 0.293936826, 19 ],
+  /* 7779 */  [ 0.293987215, 19 ],
+  /* 7780 */  [ 0.294037606, 19 ],
+  /* 7781 */  [ 0.294087999, 19 ],
+  /* 7782 */  [ 0.294138395, 19 ],
+  /* 7783 */  [ 0.294188792, 19 ],
+  /* 7784 */  [ 0.294239192, 19 ],
+  /* 7785 */  [ 0.294289593, 19 ],
+  /* 7786 */  [ 0.294339997, 19 ],
+  /* 7787 */  [ 0.294390403, 19 ],
+  /* 7788 */  [ 0.294440812, 19 ],
+  /* 7789 */  [ 0.294491222, 19 ],
+  /* 7790 */  [ 0.294541635, 19 ],
+  /* 7791 */  [ 0.294592049, 19 ],
+
+  /* 7792 */  [ 0.294642466, 19 ],
+  /* 7793 */  [ 0.294692885, 19 ],
+  /* 7794 */  [ 0.294743306, 19 ],
+  /* 7795 */  [ 0.294793730, 19 ],
+  /* 7796 */  [ 0.294844155, 19 ],
+  /* 7797 */  [ 0.294894583, 19 ],
+  /* 7798 */  [ 0.294945013, 19 ],
+  /* 7799 */  [ 0.294995445, 19 ],
+  /* 7800 */  [ 0.295045879, 19 ],
+  /* 7801 */  [ 0.295096315, 19 ],
+  /* 7802 */  [ 0.295146753, 19 ],
+  /* 7803 */  [ 0.295197194, 19 ],
+  /* 7804 */  [ 0.295247637, 19 ],
+  /* 7805 */  [ 0.295298082, 19 ],
+  /* 7806 */  [ 0.295348529, 19 ],
+  /* 7807 */  [ 0.295398978, 19 ],
+
+  /* 7808 */  [ 0.295449429, 19 ],
+  /* 7809 */  [ 0.295499883, 19 ],
+  /* 7810 */  [ 0.295550338, 19 ],
+  /* 7811 */  [ 0.295600796, 19 ],
+  /* 7812 */  [ 0.295651256, 19 ],
+  /* 7813 */  [ 0.295701718, 19 ],
+  /* 7814 */  [ 0.295752183, 19 ],
+  /* 7815 */  [ 0.295802649, 19 ],
+  /* 7816 */  [ 0.295853118, 19 ],
+  /* 7817 */  [ 0.295903588, 19 ],
+  /* 7818 */  [ 0.295954061, 19 ],
+  /* 7819 */  [ 0.296004536, 19 ],
+  /* 7820 */  [ 0.296055013, 19 ],
+  /* 7821 */  [ 0.296105493, 19 ],
+  /* 7822 */  [ 0.296155974, 19 ],
+  /* 7823 */  [ 0.296206458, 19 ],
+
+  /* 7824 */  [ 0.296256944, 19 ],
+  /* 7825 */  [ 0.296307432, 19 ],
+  /* 7826 */  [ 0.296357922, 19 ],
+  /* 7827 */  [ 0.296408414, 19 ],
+  /* 7828 */  [ 0.296458908, 19 ],
+  /* 7829 */  [ 0.296509405, 19 ],
+  /* 7830 */  [ 0.296559904, 19 ],
+  /* 7831 */  [ 0.296610404, 19 ],
+  /* 7832 */  [ 0.296660907, 19 ],
+  /* 7833 */  [ 0.296711413, 19 ],
+  /* 7834 */  [ 0.296761920, 19 ],
+  /* 7835 */  [ 0.296812429, 19 ],
+  /* 7836 */  [ 0.296862941, 19 ],
+  /* 7837 */  [ 0.296913455, 19 ],
+  /* 7838 */  [ 0.296963971, 19 ],
+  /* 7839 */  [ 0.297014489, 19 ],
+
+  /* 7840 */  [ 0.297065009, 19 ],
+  /* 7841 */  [ 0.297115531, 19 ],
+  /* 7842 */  [ 0.297166056, 19 ],
+  /* 7843 */  [ 0.297216582, 19 ],
+  /* 7844 */  [ 0.297267111, 19 ],
+  /* 7845 */  [ 0.297317642, 19 ],
+  /* 7846 */  [ 0.297368175, 19 ],
+  /* 7847 */  [ 0.297418710, 19 ],
+  /* 7848 */  [ 0.297469248, 19 ],
+  /* 7849 */  [ 0.297519787, 19 ],
+  /* 7850 */  [ 0.297570329, 19 ],
+  /* 7851 */  [ 0.297620873, 19 ],
+  /* 7852 */  [ 0.297671418, 19 ],
+  /* 7853 */  [ 0.297721967, 19 ],
+  /* 7854 */  [ 0.297772517, 19 ],
+  /* 7855 */  [ 0.297823069, 19 ],
+
+  /* 7856 */  [ 0.297873624, 19 ],
+  /* 7857 */  [ 0.297924180, 19 ],
+  /* 7858 */  [ 0.297974739, 19 ],
+  /* 7859 */  [ 0.298025300, 19 ],
+  /* 7860 */  [ 0.298075863, 19 ],
+  /* 7861 */  [ 0.298126429, 19 ],
+  /* 7862 */  [ 0.298176996, 19 ],
+  /* 7863 */  [ 0.298227565, 19 ],
+  /* 7864 */  [ 0.298278137, 19 ],
+  /* 7865 */  [ 0.298328711, 19 ],
+  /* 7866 */  [ 0.298379287, 19 ],
+  /* 7867 */  [ 0.298429865, 19 ],
+  /* 7868 */  [ 0.298480445, 19 ],
+  /* 7869 */  [ 0.298531028, 19 ],
+  /* 7870 */  [ 0.298581612, 19 ],
+  /* 7871 */  [ 0.298632199, 19 ],
+
+  /* 7872 */  [ 0.298682788, 19 ],
+  /* 7873 */  [ 0.298733379, 19 ],
+  /* 7874 */  [ 0.298783972, 19 ],
+  /* 7875 */  [ 0.298834567, 19 ],
+  /* 7876 */  [ 0.298885165, 19 ],
+  /* 7877 */  [ 0.298935764, 19 ],
+  /* 7878 */  [ 0.298986366, 19 ],
+  /* 7879 */  [ 0.299036970, 19 ],
+  /* 7880 */  [ 0.299087576, 19 ],
+  /* 7881 */  [ 0.299138184, 19 ],
+  /* 7882 */  [ 0.299188794, 19 ],
+  /* 7883 */  [ 0.299239406, 19 ],
+  /* 7884 */  [ 0.299290021, 19 ],
+  /* 7885 */  [ 0.299340638, 19 ],
+  /* 7886 */  [ 0.299391256, 19 ],
+  /* 7887 */  [ 0.299441877, 19 ],
+
+  /* 7888 */  [ 0.299492500, 19 ],
+  /* 7889 */  [ 0.299543126, 19 ],
+  /* 7890 */  [ 0.299593753, 19 ],
+  /* 7891 */  [ 0.299644382, 19 ],
+  /* 7892 */  [ 0.299695014, 19 ],
+  /* 7893 */  [ 0.299745648, 19 ],
+  /* 7894 */  [ 0.299796284, 19 ],
+  /* 7895 */  [ 0.299846922, 19 ],
+  /* 7896 */  [ 0.299897562, 19 ],
+  /* 7897 */  [ 0.299948204, 19 ],
+  /* 7898 */  [ 0.299998849, 19 ],
+  /* 7899 */  [ 0.300049495, 19 ],
+  /* 7900 */  [ 0.300100144, 19 ],
+  /* 7901 */  [ 0.300150795, 19 ],
+  /* 7902 */  [ 0.300201448, 19 ],
+  /* 7903 */  [ 0.300252103, 19 ],
+
+  /* 7904 */  [ 0.300302761, 19 ],
+  /* 7905 */  [ 0.300353420, 19 ],
+  /* 7906 */  [ 0.300404082, 19 ],
+  /* 7907 */  [ 0.300454745, 19 ],
+  /* 7908 */  [ 0.300505411, 19 ],
+  /* 7909 */  [ 0.300556079, 19 ],
+  /* 7910 */  [ 0.300606749, 19 ],
+  /* 7911 */  [ 0.300657421, 19 ],
+  /* 7912 */  [ 0.300708096, 19 ],
+  /* 7913 */  [ 0.300758772, 19 ],
+  /* 7914 */  [ 0.300809451, 19 ],
+  /* 7915 */  [ 0.300860132, 19 ],
+  /* 7916 */  [ 0.300910815, 19 ],
+  /* 7917 */  [ 0.300961500, 19 ],
+  /* 7918 */  [ 0.301012187, 19 ],
+  /* 7919 */  [ 0.301062876, 19 ],
+
+  /* 7920 */  [ 0.301113568, 19 ],
+  /* 7921 */  [ 0.301164261, 19 ],
+  /* 7922 */  [ 0.301214957, 19 ],
+  /* 7923 */  [ 0.301265655, 19 ],
+  /* 7924 */  [ 0.301316355, 19 ],
+  /* 7925 */  [ 0.301367057, 19 ],
+  /* 7926 */  [ 0.301417761, 19 ],
+  /* 7927 */  [ 0.301468468, 19 ],
+  /* 7928 */  [ 0.301519176, 19 ],
+  /* 7929 */  [ 0.301569887, 19 ],
+  /* 7930 */  [ 0.301620599, 19 ],
+  /* 7931 */  [ 0.301671314, 19 ],
+  /* 7932 */  [ 0.301722031, 19 ],
+  /* 7933 */  [ 0.301772751, 19 ],
+  /* 7934 */  [ 0.301823472, 19 ],
+  /* 7935 */  [ 0.301874195, 19 ],
+
+  /* 7936 */  [ 0.301924921, 19 ],
+  /* 7937 */  [ 0.301975649, 19 ],
+  /* 7938 */  [ 0.302026378, 19 ],
+  /* 7939 */  [ 0.302077110, 19 ],
+  /* 7940 */  [ 0.302127845, 19 ],
+  /* 7941 */  [ 0.302178581, 19 ],
+  /* 7942 */  [ 0.302229319, 19 ],
+  /* 7943 */  [ 0.302280060, 19 ],
+  /* 7944 */  [ 0.302330802, 19 ],
+  /* 7945 */  [ 0.302381547, 19 ],
+  /* 7946 */  [ 0.302432294, 19 ],
+  /* 7947 */  [ 0.302483043, 19 ],
+  /* 7948 */  [ 0.302533794, 19 ],
+  /* 7949 */  [ 0.302584547, 19 ],
+  /* 7950 */  [ 0.302635303, 19 ],
+  /* 7951 */  [ 0.302686060, 19 ],
+
+  /* 7952 */  [ 0.302736820, 19 ],
+  /* 7953 */  [ 0.302787581, 19 ],
+  /* 7954 */  [ 0.302838345, 19 ],
+  /* 7955 */  [ 0.302889111, 19 ],
+  /* 7956 */  [ 0.302939879, 19 ],
+  /* 7957 */  [ 0.302990650, 19 ],
+  /* 7958 */  [ 0.303041422, 19 ],
+  /* 7959 */  [ 0.303092197, 19 ],
+  /* 7960 */  [ 0.303142973, 19 ],
+  /* 7961 */  [ 0.303193752, 19 ],
+  /* 7962 */  [ 0.303244533, 19 ],
+  /* 7963 */  [ 0.303295316, 19 ],
+  /* 7964 */  [ 0.303346101, 19 ],
+  /* 7965 */  [ 0.303396889, 19 ],
+  /* 7966 */  [ 0.303447678, 19 ],
+  /* 7967 */  [ 0.303498469, 19 ],
+
+  /* 7968 */  [ 0.303549263, 19 ],
+  /* 7969 */  [ 0.303600059, 19 ],
+  /* 7970 */  [ 0.303650857, 19 ],
+  /* 7971 */  [ 0.303701657, 19 ],
+  /* 7972 */  [ 0.303752459, 19 ],
+  /* 7973 */  [ 0.303803263, 19 ],
+  /* 7974 */  [ 0.303854070, 19 ],
+  /* 7975 */  [ 0.303904878, 19 ],
+  /* 7976 */  [ 0.303955689, 19 ],
+  /* 7977 */  [ 0.304006502, 19 ],
+  /* 7978 */  [ 0.304057317, 19 ],
+  /* 7979 */  [ 0.304108134, 19 ],
+  /* 7980 */  [ 0.304158953, 19 ],
+  /* 7981 */  [ 0.304209774, 19 ],
+  /* 7982 */  [ 0.304260597, 19 ],
+  /* 7983 */  [ 0.304311423, 19 ],
+
+  /* 7984 */  [ 0.304362251, 19 ],
+  /* 7985 */  [ 0.304413080, 19 ],
+  /* 7986 */  [ 0.304463912, 19 ],
+  /* 7987 */  [ 0.304514746, 19 ],
+  /* 7988 */  [ 0.304565582, 19 ],
+  /* 7989 */  [ 0.304616421, 19 ],
+  /* 7990 */  [ 0.304667261, 19 ],
+  /* 7991 */  [ 0.304718103, 19 ],
+  /* 7992 */  [ 0.304768948, 19 ],
+  /* 7993 */  [ 0.304819795, 19 ],
+  /* 7994 */  [ 0.304870644, 19 ],
+  /* 7995 */  [ 0.304921495, 19 ],
+  /* 7996 */  [ 0.304972348, 19 ],
+  /* 7997 */  [ 0.305023203, 19 ],
+  /* 7998 */  [ 0.305074060, 19 ],
+  /* 7999 */  [ 0.305124920, 19 ],
+
+  /* 8000 */  [ 0.305175781, 19 ],
+  /* 8001 */  [ 0.305226645, 19 ],
+  /* 8002 */  [ 0.305277511, 19 ],
+  /* 8003 */  [ 0.305328379, 19 ],
+  /* 8004 */  [ 0.305379249, 19 ],
+  /* 8005 */  [ 0.305430121, 19 ],
+  /* 8006 */  [ 0.305480995, 19 ],
+  /* 8007 */  [ 0.305531872, 19 ],
+  /* 8008 */  [ 0.305582750, 19 ],
+  /* 8009 */  [ 0.305633631, 19 ],
+  /* 8010 */  [ 0.305684513, 19 ],
+  /* 8011 */  [ 0.305735398, 19 ],
+  /* 8012 */  [ 0.305786285, 19 ],
+  /* 8013 */  [ 0.305837174, 19 ],
+  /* 8014 */  [ 0.305888066, 19 ],
+  /* 8015 */  [ 0.305938959, 19 ],
+
+  /* 8016 */  [ 0.305989854, 19 ],
+  /* 8017 */  [ 0.306040752, 19 ],
+  /* 8018 */  [ 0.306091652, 19 ],
+  /* 8019 */  [ 0.306142554, 19 ],
+  /* 8020 */  [ 0.306193457, 19 ],
+  /* 8021 */  [ 0.306244364, 19 ],
+  /* 8022 */  [ 0.306295272, 19 ],
+  /* 8023 */  [ 0.306346182, 19 ],
+  /* 8024 */  [ 0.306397094, 19 ],
+  /* 8025 */  [ 0.306448009, 19 ],
+  /* 8026 */  [ 0.306498925, 19 ],
+  /* 8027 */  [ 0.306549844, 19 ],
+  /* 8028 */  [ 0.306600765, 19 ],
+  /* 8029 */  [ 0.306651688, 19 ],
+  /* 8030 */  [ 0.306702613, 19 ],
+  /* 8031 */  [ 0.306753540, 19 ],
+
+  /* 8032 */  [ 0.306804470, 19 ],
+  /* 8033 */  [ 0.306855401, 19 ],
+  /* 8034 */  [ 0.306906334, 19 ],
+  /* 8035 */  [ 0.306957270, 19 ],
+  /* 8036 */  [ 0.307008208, 19 ],
+  /* 8037 */  [ 0.307059148, 19 ],
+  /* 8038 */  [ 0.307110090, 19 ],
+  /* 8039 */  [ 0.307161034, 19 ],
+  /* 8040 */  [ 0.307211980, 19 ],
+  /* 8041 */  [ 0.307262928, 19 ],
+  /* 8042 */  [ 0.307313879, 19 ],
+  /* 8043 */  [ 0.307364831, 19 ],
+  /* 8044 */  [ 0.307415786, 19 ],
+  /* 8045 */  [ 0.307466743, 19 ],
+  /* 8046 */  [ 0.307517702, 19 ],
+  /* 8047 */  [ 0.307568663, 19 ],
+
+  /* 8048 */  [ 0.307619626, 19 ],
+  /* 8049 */  [ 0.307670591, 19 ],
+  /* 8050 */  [ 0.307721558, 19 ],
+  /* 8051 */  [ 0.307772528, 19 ],
+  /* 8052 */  [ 0.307823499, 19 ],
+  /* 8053 */  [ 0.307874473, 19 ],
+  /* 8054 */  [ 0.307925449, 19 ],
+  /* 8055 */  [ 0.307976426, 19 ],
+  /* 8056 */  [ 0.308027406, 19 ],
+  /* 8057 */  [ 0.308078389, 19 ],
+  /* 8058 */  [ 0.308129373, 19 ],
+  /* 8059 */  [ 0.308180359, 19 ],
+  /* 8060 */  [ 0.308231347, 19 ],
+  /* 8061 */  [ 0.308282338, 19 ],
+  /* 8062 */  [ 0.308333331, 19 ],
+  /* 8063 */  [ 0.308384325, 19 ],
+
+  /* 8064 */  [ 0.308435322, 19 ],
+  /* 8065 */  [ 0.308486321, 19 ],
+  /* 8066 */  [ 0.308537322, 19 ],
+  /* 8067 */  [ 0.308588325, 19 ],
+  /* 8068 */  [ 0.308639331, 19 ],
+  /* 8069 */  [ 0.308690338, 19 ],
+  /* 8070 */  [ 0.308741348, 19 ],
+  /* 8071 */  [ 0.308792359, 19 ],
+  /* 8072 */  [ 0.308843373, 19 ],
+  /* 8073 */  [ 0.308894389, 19 ],
+  /* 8074 */  [ 0.308945407, 19 ],
+  /* 8075 */  [ 0.308996427, 19 ],
+  /* 8076 */  [ 0.309047449, 19 ],
+  /* 8077 */  [ 0.309098473, 19 ],
+  /* 8078 */  [ 0.309149499, 19 ],
+  /* 8079 */  [ 0.309200528, 19 ],
+
+  /* 8080 */  [ 0.309251558, 19 ],
+  /* 8081 */  [ 0.309302591, 19 ],
+  /* 8082 */  [ 0.309353626, 19 ],
+  /* 8083 */  [ 0.309404663, 19 ],
+  /* 8084 */  [ 0.309455702, 19 ],
+  /* 8085 */  [ 0.309506743, 19 ],
+  /* 8086 */  [ 0.309557786, 19 ],
+  /* 8087 */  [ 0.309608831, 19 ],
+  /* 8088 */  [ 0.309659879, 19 ],
+  /* 8089 */  [ 0.309710928, 19 ],
+  /* 8090 */  [ 0.309761980, 19 ],
+  /* 8091 */  [ 0.309813033, 19 ],
+  /* 8092 */  [ 0.309864089, 19 ],
+  /* 8093 */  [ 0.309915147, 19 ],
+  /* 8094 */  [ 0.309966207, 19 ],
+  /* 8095 */  [ 0.310017269, 19 ],
+
+  /* 8096 */  [ 0.310068333, 19 ],
+  /* 8097 */  [ 0.310119400, 19 ],
+  /* 8098 */  [ 0.310170468, 19 ],
+  /* 8099 */  [ 0.310221539, 19 ],
+  /* 8100 */  [ 0.310272611, 19 ],
+  /* 8101 */  [ 0.310323686, 19 ],
+  /* 8102 */  [ 0.310374763, 19 ],
+  /* 8103 */  [ 0.310425842, 19 ],
+  /* 8104 */  [ 0.310476923, 19 ],
+  /* 8105 */  [ 0.310528006, 19 ],
+  /* 8106 */  [ 0.310579091, 19 ],
+  /* 8107 */  [ 0.310630179, 19 ],
+  /* 8108 */  [ 0.310681268, 19 ],
+  /* 8109 */  [ 0.310732360, 19 ],
+  /* 8110 */  [ 0.310783453, 19 ],
+  /* 8111 */  [ 0.310834549, 19 ],
+
+  /* 8112 */  [ 0.310885647, 19 ],
+  /* 8113 */  [ 0.310936747, 19 ],
+  /* 8114 */  [ 0.310987849, 19 ],
+  /* 8115 */  [ 0.311038953, 19 ],
+  /* 8116 */  [ 0.311090059, 19 ],
+  /* 8117 */  [ 0.311141168, 19 ],
+  /* 8118 */  [ 0.311192278, 19 ],
+  /* 8119 */  [ 0.311243390, 19 ],
+  /* 8120 */  [ 0.311294505, 19 ],
+  /* 8121 */  [ 0.311345622, 19 ],
+  /* 8122 */  [ 0.311396741, 19 ],
+  /* 8123 */  [ 0.311447862, 19 ],
+  /* 8124 */  [ 0.311498985, 19 ],
+  /* 8125 */  [ 0.311550110, 19 ],
+  /* 8126 */  [ 0.311601237, 19 ],
+  /* 8127 */  [ 0.311652366, 19 ],
+
+  /* 8128 */  [ 0.311703498, 19 ],
+  /* 8129 */  [ 0.311754631, 19 ],
+  /* 8130 */  [ 0.311805767, 19 ],
+  /* 8131 */  [ 0.311856905, 19 ],
+  /* 8132 */  [ 0.311908044, 19 ],
+  /* 8133 */  [ 0.311959186, 19 ],
+  /* 8134 */  [ 0.312010330, 19 ],
+  /* 8135 */  [ 0.312061476, 19 ],
+  /* 8136 */  [ 0.312112625, 19 ],
+  /* 8137 */  [ 0.312163775, 19 ],
+  /* 8138 */  [ 0.312214927, 19 ],
+  /* 8139 */  [ 0.312266082, 19 ],
+  /* 8140 */  [ 0.312317238, 19 ],
+  /* 8141 */  [ 0.312368397, 19 ],
+  /* 8142 */  [ 0.312419558, 19 ],
+  /* 8143 */  [ 0.312470720, 19 ],
+
+  /* 8144 */  [ 0.312521885, 19 ],
+  /* 8145 */  [ 0.312573052, 19 ],
+  /* 8146 */  [ 0.312624222, 19 ],
+  /* 8147 */  [ 0.312675393, 19 ],
+  /* 8148 */  [ 0.312726566, 19 ],
+  /* 8149 */  [ 0.312777742, 19 ],
+  /* 8150 */  [ 0.312828919, 19 ],
+  /* 8151 */  [ 0.312880099, 19 ],
+  /* 8152 */  [ 0.312931280, 19 ],
+  /* 8153 */  [ 0.312982464, 19 ],
+  /* 8154 */  [ 0.313033650, 19 ],
+  /* 8155 */  [ 0.313084838, 19 ],
+  /* 8156 */  [ 0.313136028, 19 ],
+  /* 8157 */  [ 0.313187220, 19 ],
+  /* 8158 */  [ 0.313238414, 19 ],
+  /* 8159 */  [ 0.313289611, 19 ],
+
+  /* 8160 */  [ 0.313340809, 19 ],
+  /* 8161 */  [ 0.313392010, 19 ],
+  /* 8162 */  [ 0.313443212, 19 ],
+  /* 8163 */  [ 0.313494417, 19 ],
+  /* 8164 */  [ 0.313545624, 19 ],
+  /* 8165 */  [ 0.313596833, 19 ],
+  /* 8166 */  [ 0.313648044, 19 ],
+  /* 8167 */  [ 0.313699257, 19 ],
+  /* 8168 */  [ 0.313750472, 19 ],
+  /* 8169 */  [ 0.313801689, 19 ],
+  /* 8170 */  [ 0.313852909, 19 ],
+  /* 8171 */  [ 0.313904130, 19 ],
+  /* 8172 */  [ 0.313955354, 19 ],
+  /* 8173 */  [ 0.314006579, 19 ],
+  /* 8174 */  [ 0.314057807, 19 ],
+  /* 8175 */  [ 0.314109037, 19 ],
+
+  /* 8176 */  [ 0.314160269, 19 ],
+  /* 8177 */  [ 0.314211502, 19 ],
+  /* 8178 */  [ 0.314262739, 19 ],
+  /* 8179 */  [ 0.314313977, 19 ],
+  /* 8180 */  [ 0.314365217, 19 ],
+  /* 8181 */  [ 0.314416459, 19 ],
+  /* 8182 */  [ 0.314467704, 19 ],
+  /* 8183 */  [ 0.314518950, 19 ],
+  /* 8184 */  [ 0.314570199, 19 ],
+  /* 8185 */  [ 0.314621449, 19 ],
+  /* 8186 */  [ 0.314672702, 19 ],
+  /* 8187 */  [ 0.314723957, 19 ],
+  /* 8188 */  [ 0.314775214, 19 ],
+  /* 8189 */  [ 0.314826473, 19 ],
+  /* 8190 */  [ 0.314877734, 19 ],
+  /* 8191 */  [ 0.314928997, 19 ],
+
+  /* 8192 */  [ 0.314980262, 19 ],
+  /* 8193 */  [ 0.315031530, 19 ],
+  /* 8194 */  [ 0.315082799, 19 ],
+  /* 8195 */  [ 0.315134071, 19 ],
+  /* 8196 */  [ 0.315185344, 19 ],
+  /* 8197 */  [ 0.315236620, 19 ],
+  /* 8198 */  [ 0.315287898, 19 ],
+  /* 8199 */  [ 0.315339178, 19 ],
+  /* 8200 */  [ 0.315390460, 19 ],
+  /* 8201 */  [ 0.315441744, 19 ],
+  /* 8202 */  [ 0.315493030, 19 ],
+  /* 8203 */  [ 0.315544318, 19 ],
+  /* 8204 */  [ 0.315595608, 19 ],
+  /* 8205 */  [ 0.315646901, 19 ],
+  /* 8206 */  [ 0.315698195, 19 ]
+];
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/stream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/stream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/stream.js	(revision 28388)
@@ -0,0 +1,112 @@
+
+Mad.Error = {
+  NONE           : 0x0000,      /* no error */
+
+  BUFLEN         : 0x0001,      /* input buffer too small (or EOF) */
+  BUFPTR         : 0x0002,      /* invalid (null) buffer pointer */
+
+  NOMEM          : 0x0031,      /* not enough memory */
+
+  LOSTSYNC       : 0x0101,      /* lost synchronization */
+  BADLAYER       : 0x0102,      /* reserved header layer value */
+  BADBITRATE     : 0x0103,      /* forbidden bitrate value */
+  BADSAMPLERATE  : 0x0104,      /* reserved sample frequency value */
+  BADEMPHASIS    : 0x0105,      /* reserved emphasis value */
+
+  BADCRC         : 0x0201,      /* CRC check failed */
+  BADBITALLOC    : 0x0211,      /* forbidden bit allocation value */
+  BADSCALEFACTOR : 0x0221,      /* bad scalefactor index */
+  BADMODE        : 0x0222,      /* bad bitrate/mode combination */
+  BADFRAMELEN    : 0x0231,      /* bad frame length */
+  BADBIGVALUES   : 0x0232,      /* bad big_values count */
+  BADBLOCKTYPE   : 0x0233,      /* reserved block_type */
+  BADSCFSI       : 0x0234,      /* bad scalefactor selection info */
+  BADDATAPTR     : 0x0235,      /* bad main_data_begin pointer */
+  BADPART3LEN    : 0x0236,      /* bad audio data length */
+  BADHUFFTABLE   : 0x0237,      /* bad Huffman table select */
+  BADHUFFDATA    : 0x0238,      /* Huffman data overrun */
+  BADSTEREO      : 0x0239       /* incompatible block_type for JS */
+};
+
+Mad.BUFFER_GUARD = 8;
+Mad.BUFFER_MDLEN = (511 + 2048 + Mad.BUFFER_GUARD);
+
+Mad.Stream = function (stream) {
+    this.stream = stream;                           /* actual buffer (js doesn't have pointers!) */
+    this.buffer = 0;                                /* input bitstream buffer */
+    this.bufend = stream.length;                    /* input bitstream buffer */
+    this.skiplen = 0;                               /* bytes to skip before next frame */
+
+    this.sync = 0;                                  /* stream sync found */
+    this.freerate = 0;                              /* free bitrate (fixed) */
+
+    this.this_frame = 0;                            /* start of current frame */
+    this.next_frame = 0;                            /* start of next frame */
+    
+    this.ptr = new Mad.Bit(this.stream, this.buffer); /* current processing bit pointer */
+    
+    this.anc_ptr = /* MadBit */ null;               /* ancillary bits pointer */
+    this.anc_bitlen = 0;                            /* number of ancillary bits */
+
+    this.main_data = /* string */ Mad.Storage.newBuffer(Mad.BUFFER_MDLEN); /* Layer III main_data() */
+    this.md_len = 0; /* bytes in main_data */
+
+    var options = 0;                                /* decoding options (see below) */
+    var error = Mad.Error.NONE;                     /* error code (see above) */
+};
+
+Mad.Stream.fromFile = function(file, callback) {
+    var reader = new FileReader();
+    reader.onloadend = function (evt) {
+        callback(new Mad.Stream(evt.target.result));
+    };
+    reader.readAsBinaryString(file);
+};
+
+Mad.Stream.prototype.readShort = function(bBigEndian) {
+    return this.stream.readU16(bBigEndian);
+};
+    
+Mad.Stream.prototype.readSShort = function(bBigEndian) {
+    return this.stream.readI16(bBigEndian);
+};
+
+Mad.Stream.prototype.getU8 = function(index) {
+    return this.stream.getU8(index);
+};
+
+
+Mad.Stream.prototype.readU8 = function() {
+    return this.stream.readU8(index);
+};
+
+Mad.Stream.prototype.readChars = function(length) {
+    return this.stream.read(length);
+};
+
+Mad.Stream.prototype.peekChars = function(length) {
+    return this.stream.peek(length);
+}
+
+/*
+ * NAME:        stream->sync()
+ * DESCRIPTION: locate the next stream sync word
+ */
+Mad.Stream.prototype.doSync = function() {
+    var ptr = this.ptr.nextbyte();
+    var end = this.bufend;
+
+    while (ptr < end - 1 && !(this.getU8(ptr) === 0xff && (this.getU8(ptr + 1) & 0xe0) === 0xe0)) {
+        ++ptr;
+    }
+
+    if (end - ptr < Mad.BUFFER_GUARD) {
+        return -1;
+    }
+
+    this.ptr = new Mad.Bit(this.stream, ptr);
+    
+    return 0;
+}
+
+
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/synth.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/synth.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/experiments/src/synth.js	(revision 28388)
@@ -0,0 +1,1311 @@
+/*
+ * NAME:    synth.init()
+ * DESCRIPTION: initialize synth struct
+ */
+Mad.Synth = function () {
+    this.filter = [];
+    this.mute();
+    this.phase = 0;
+    
+    this.pcm = {
+        samplerate: 0,
+        channels: 0,
+        length: 0,
+        samples: [
+            // new Float64Array(new ArrayBuffer(8 * 1152)),
+            // new Float64Array(new ArrayBuffer(8 * 1152))
+            [],
+            []
+        ]
+    };
+    
+    // this.pcm.clone = function() {
+    //     var copy = {};
+    //     copy.samplerate = this.samplerate;
+    //     copy.channels = this.channels;
+    //     copy.length = this.length;
+    //     copy.samples = [
+    //         // new Float64Array(new ArrayBuffer(8 * 1152)),
+    //         // new Float64Array(new ArrayBuffer(8 * 1152))
+    //         [],
+    //         []
+    //     ];
+    //     copy.samples[0].set(this.samples[0]);
+    //     copy.samples[1].set(this.samples[1]);
+    //     return copy;
+    // }; 
+}
+
+/*
+ * NAME:    synth.mute()
+ * DESCRIPTION: zero all polyphase filterbank values, resetting synthesis
+ */
+Mad.Synth.prototype.mute = function () {
+    for (var ch = 0; ch < 2; ++ch) {
+        this.filter[ch] = [ [ [], [] ], [ [], [] ] ];
+        
+        for (var s = 0; s < 16; ++s) {
+            this.filter[ch][0][0][s] = [];
+            this.filter[ch][0][1][s] = [];
+            this.filter[ch][1][0][s] = [];
+            this.filter[ch][1][1][s] = [];
+            
+            for (var v = 0; v < 8; ++v) {
+                this.filter[ch][0][0][s][v] = 0;
+                this.filter[ch][0][1][s][v] = 0;
+                this.filter[ch][1][0][s][v] = 0;
+                this.filter[ch][1][1][s][v] = 0;
+            }
+        }
+    }
+};
+
+/* costab[i] = cos(PI / (2 * 32) * i) */
+var costab1  =  0.998795456;
+var costab2  =  0.995184727;
+var costab3  =  0.989176510;
+var costab4  =  0.980785280;
+var costab5  =  0.970031253;
+var costab6  =  0.956940336;
+var costab7  =  0.941544065;
+var costab8  =  0.923879533;
+var costab9  =  0.903989293;
+var costab10 =  0.881921264;
+var costab11 =  0.857728610;
+var costab12 =  0.831469612;
+var costab13 =  0.803207531;
+var costab14 =  0.773010453;
+var costab15 =  0.740951125;
+var costab16 =  0.707106781;
+var costab17 =  0.671558955;
+var costab18 =  0.634393284;
+var costab19 =  0.595699304;
+var costab20 =  0.555570233;
+var costab21 =  0.514102744;
+var costab22 =  0.471396737;
+var costab23 =  0.427555093;
+var costab24 =  0.382683432;
+var costab25 =  0.336889853;
+var costab26 =  0.290284677;
+var costab27 =  0.242980180;
+var costab28 =  0.195090322;
+var costab29 =  0.146730474;
+var costab30 =  0.098017140;
+var costab31 =  0.049067674;
+
+/*
+ * NAME:    dct32()
+ * DESCRIPTION: perform fast in[32].out[32] DCT
+ */
+Mad.Synth.dct32 = function (_in /* [32] */, slot, lo /* [16][8] */, hi /* [16][8] */) {
+    var t0,   t1,   t2,   t3,   t4,   t5,   t6,   t7;
+    var t8,   t9,   t10,  t11,  t12,  t13,  t14,  t15;
+    var t16,  t17,  t18,  t19,  t20,  t21,  t22,  t23;
+    var t24,  t25,  t26,  t27,  t28,  t29,  t30,  t31;
+    var t32,  t33,  t34,  t35,  t36,  t37,  t38,  t39;
+    var t40,  t41,  t42,  t43,  t44,  t45,  t46,  t47;
+    var t48,  t49,  t50,  t51,  t52,  t53,  t54,  t55;
+    var t56,  t57,  t58,  t59,  t60,  t61,  t62,  t63;
+    var t64,  t65,  t66,  t67,  t68,  t69,  t70,  t71;
+    var t72,  t73,  t74,  t75,  t76,  t77,  t78,  t79;
+    var t80,  t81,  t82,  t83,  t84,  t85,  t86,  t87;
+    var t88,  t89,  t90,  t91,  t92,  t93,  t94,  t95;
+    var t96,  t97,  t98,  t99,  t100, t101, t102, t103;
+    var t104, t105, t106, t107, t108, t109, t110, t111;
+    var t112, t113, t114, t115, t116, t117, t118, t119;
+    var t120, t121, t122, t123, t124, t125, t126, t127;
+    var t128, t129, t130, t131, t132, t133, t134, t135;
+    var t136, t137, t138, t139, t140, t141, t142, t143;
+    var t144, t145, t146, t147, t148, t149, t150, t151;
+    var t152, t153, t154, t155, t156, t157, t158, t159;
+    var t160, t161, t162, t163, t164, t165, t166, t167;
+    var t168, t169, t170, t171, t172, t173, t174, t175;
+    var t176;
+
+
+    // var sys = require('sys');
+    // for (i = 0; i < 32; i++) {
+    //     sys.print(_in[i].toFixed(8) + "\t");
+    //     if (i % 8 === 7) sys.print("\n");
+    // }
+
+    t0   = _in[0]  + _in[31];  t16  = ((_in[0]  - _in[31]) * (costab1));
+    t1   = _in[15] + _in[16];  t17  = ((_in[15] - _in[16]) * (costab31));
+
+    t41  = t16 + t17;
+    t59  = ((t16 - t17) * (costab2));
+    t33  = t0  + t1;
+    t50  = ((t0  - t1) * ( costab2));
+
+    t2   = _in[7]  + _in[24];  t18  = ((_in[7]  - _in[24]) * (costab15));
+    t3   = _in[8]  + _in[23];  t19  = ((_in[8]  - _in[23]) * (costab17));
+
+    t42  = t18 + t19;
+    t60  = ((t18 - t19) * (costab30));
+    t34  = t2  + t3;
+    t51  = ((t2  - t3) * ( costab30));
+
+    t4   = _in[3]  + _in[28];  t20  = ((_in[3]  - _in[28]) * (costab7));
+    t5   = _in[12] + _in[19];  t21  = ((_in[12] - _in[19]) * (costab25));
+
+    t43  = t20 + t21;
+    t61  = ((t20 - t21) * (costab14));
+    t35  = t4  + t5;
+    t52  = ((t4  - t5) * ( costab14));
+
+    t6   = _in[4]  + _in[27];  t22  = ((_in[4]  - _in[27]) * (costab9));
+    t7   = _in[11] + _in[20];  t23  = ((_in[11] - _in[20]) * (costab23));
+
+    t44  = t22 + t23;
+    t62  = ((t22 - t23) * (costab18));
+    t36  = t6  + t7;
+    t53  = ((t6  - t7) * ( costab18));
+
+    t8   = _in[1]  + _in[30];  t24  = ((_in[1]  - _in[30]) * (costab3));
+    t9   = _in[14] + _in[17];  t25  = ((_in[14] - _in[17]) * (costab29));
+
+    t45  = t24 + t25;
+    t63  = ((t24 - t25) * (costab6));
+    t37  = t8  + t9;
+    t54  = ((t8  - t9) * ( costab6));
+
+    t10  = _in[6]  + _in[25];  t26  = ((_in[6]  - _in[25]) * (costab13));
+    t11  = _in[9]  + _in[22];  t27  = ((_in[9]  - _in[22]) * (costab19));
+
+    t46  = t26 + t27;
+    t64  = ((t26 - t27) * (costab26));
+    t38  = t10 + t11;
+    t55  = ((t10 - t11) * (costab26));
+
+    t12  = _in[2]  + _in[29];  t28  = ((_in[2]  - _in[29]) * (costab5));
+    t13  = _in[13] + _in[18];  t29  = ((_in[13] - _in[18]) * (costab27));
+
+    t47  = t28 + t29;
+    t65  = ((t28 - t29) * (costab10));
+    t39  = t12 + t13;
+    t56  = ((t12 - t13) * (costab10));
+
+    t14  = _in[5]  + _in[26];  t30  = ((_in[5]  - _in[26]) * (costab11));
+    t15  = _in[10] + _in[21];  t31  = ((_in[10] - _in[21]) * (costab21));
+
+    t48  = t30 + t31;
+    t66  = ((t30 - t31) * (costab22));
+    t40  = t14 + t15;
+    t57  = ((t14 - t15) * (costab22));
+
+    t69  = t33 + t34;  t89  = ((t33 - t34) * (costab4));
+    t70  = t35 + t36;  t90  = ((t35 - t36) * (costab28));
+    t71  = t37 + t38;  t91  = ((t37 - t38) * (costab12));
+    t72  = t39 + t40;  t92  = ((t39 - t40) * (costab20));
+    t73  = t41 + t42;  t94  = ((t41 - t42) * (costab4));
+    t74  = t43 + t44;  t95  = ((t43 - t44) * (costab28));
+    t75  = t45 + t46;  t96  = ((t45 - t46) * (costab12));
+    t76  = t47 + t48;  t97  = ((t47 - t48) * (costab20));
+
+    t78  = t50 + t51;  t100 = ((t50 - t51) * (costab4));
+    t79  = t52 + t53;  t101 = ((t52 - t53) * (costab28));
+    t80  = t54 + t55;  t102 = ((t54 - t55) * (costab12));
+    t81  = t56 + t57;  t103 = ((t56 - t57) * (costab20));
+
+    t83  = t59 + t60;  t106 = ((t59 - t60) * (costab4));
+    t84  = t61 + t62;  t107 = ((t61 - t62) * (costab28));
+    t85  = t63 + t64;  t108 = ((t63 - t64) * (costab12));
+    t86  = t65 + t66;  t109 = ((t65 - t66) * (costab20));
+
+    t113 = t69  + t70;
+    t114 = t71  + t72;
+
+    /*  0 */ hi[15][slot] = t113 + t114;
+    /* 16 */ lo[ 0][slot] = ((t113 - t114) * (costab16));
+
+    t115 = t73  + t74;
+    t116 = t75  + t76;
+
+    t32  = t115 + t116;
+
+    /*  1 */ hi[14][slot] = t32;
+
+    t118 = t78  + t79;
+    t119 = t80  + t81;
+
+    t58  = t118 + t119;
+
+    /*  2 */ hi[13][slot] = t58;
+
+    t121 = t83  + t84;
+    t122 = t85  + t86;
+
+    t67  = t121 + t122;
+
+    t49  = (t67 * 2) - t32;
+
+    /*  3 */ hi[12][slot] = t49;
+
+    t125 = t89  + t90;
+    t126 = t91  + t92;
+
+    t93  = t125 + t126;
+
+    /*  4 */ hi[11][slot] = t93;
+
+    t128 = t94  + t95;
+    t129 = t96  + t97;
+
+    t98  = t128 + t129;
+
+    t68  = (t98 * 2) - t49;
+
+    /*  5 */ hi[10][slot] = t68;
+
+    t132 = t100 + t101;
+    t133 = t102 + t103;
+
+    t104 = t132 + t133;
+
+    t82  = (t104 * 2) - t58;
+
+    /*  6 */ hi[ 9][slot] = t82;
+
+    t136 = t106 + t107;
+    t137 = t108 + t109;
+
+    t110 = t136 + t137;
+
+    t87  = (t110 * 2) - t67;
+
+    t77  = (t87 * 2) - t68;
+
+    /*  7 */ hi[ 8][slot] = t77;
+
+    t141 = ((t69 - t70) * (costab8));
+    t142 = ((t71 - t72) * (costab24));
+    t143 = t141 + t142;
+
+    /*  8 */ hi[ 7][slot] = t143;
+    /* 24 */ lo[ 8][slot] =
+        (((t141 - t142) * (costab16) * 2)) - t143;
+
+    t144 = ((t73 - t74) * (costab8));
+    t145 = ((t75 - t76) * (costab24));
+    t146 = t144 + t145;
+
+    t88  = (t146 * 2) - t77;
+
+    /*  9 */ hi[ 6][slot] = t88;
+
+    t148 = ((t78 - t79) * (costab8));
+    t149 = ((t80 - t81) * (costab24));
+    t150 = t148 + t149;
+
+    t105 = (t150 * 2) - t82;
+
+    /* 10 */ hi[ 5][slot] = t105;
+
+    t152 = ((t83 - t84) * (costab8));
+    t153 = ((t85 - t86) * (costab24));
+    t154 = t152 + t153;
+
+    t111 = (t154 * 2) - t87;
+
+    t99  = (t111 * 2) - t88;
+
+    /* 11 */ hi[ 4][slot] = t99;
+
+    t157 = ((t89 - t90) * (costab8));
+    t158 = ((t91 - t92) * (costab24));
+    t159 = t157 + t158;
+
+    t127 = (t159 * 2) - t93;
+
+    /* 12 */ hi[ 3][slot] = t127;
+
+    t160 = (((t125 - t126) * (costab16) * 2)) - t127;
+
+    /* 20 */ lo[ 4][slot] = t160;
+    /* 28 */ lo[12][slot] =
+        (((((t157 - t158) * (costab16) * 2) - t159) * 2)) - t160;
+
+    t161 = ((t94 - t95) * (costab8));
+    t162 = ((t96 - t97) * (costab24));
+    t163 = t161 + t162;
+
+    t130 = (t163 * 2) - t98;
+
+    t112 = (t130 * 2) - t99;
+
+    /* 13 */ hi[ 2][slot] = t112;
+
+    t164 = (((t128 - t129) * (costab16) * 2)) - t130;
+
+    t166 = ((t100 - t101) * (costab8));
+    t167 = ((t102 - t103) * (costab24));
+    t168 = t166 + t167;
+
+    t134 = (t168 * 2) - t104;
+
+    t120 = (t134 * 2) - t105;
+
+    /* 14 */ hi[ 1][slot] = t120;
+
+    t135 = (((t118 - t119) * (costab16) * 2)) - t120;
+
+    /* 18 */ lo[ 2][slot] = t135;
+
+    t169 = (((t132 - t133) * (costab16) * 2)) - t134;
+
+    t151 = (t169 * 2) - t135;
+
+    /* 22 */ lo[ 6][slot] = t151;
+
+    t170 = (((((t148 - t149) * (costab16) * 2) - t150) * 2)) - t151;
+
+    /* 26 */ lo[10][slot] = t170;
+    /* 30 */ lo[14][slot] =
+        (((((((t166 - t167) * (costab16)) * 2 -
+             t168) * 2) - t169) * 2) - t170);
+
+    t171 = ((t106 - t107) * (costab8));
+    t172 = ((t108 - t109) * (costab24));
+    t173 = t171 + t172;
+
+    t138 = (t173 * 2) - t110;
+
+    t123 = (t138 * 2) - t111;
+
+    t139 = (((t121 - t122) * (costab16) * 2)) - t123;
+
+    t117 = (t123 * 2) - t112;
+
+    /* 15 */ hi[ 0][slot] = t117;
+
+    t124 = (((t115 - t116) * (costab16) * 2)) - t117;
+
+    /* 17 */ lo[ 1][slot] = t124;
+
+    t131 = (t139 * 2) - t124;
+
+    /* 19 */ lo[ 3][slot] = t131;
+
+    t140 = (t164 * 2) - t131;
+
+    /* 21 */ lo[ 5][slot] = t140;
+
+    t174 = (((t136 - t137) * (costab16) * 2)) - t138;
+
+    t155 = (t174 * 2) - t139;
+
+    t147 = (t155 * 2) - t140;
+
+    /* 23 */ lo[ 7][slot] = t147;
+
+    t156 = (((((t144 - t145) * (costab16) * 2) - t146) * 2)) - t147;
+
+    /* 25 */ lo[ 9][slot] = t156;
+
+    t175 = (((((t152 - t153) * (costab16) * 2) - t154) * 2)) - t155;
+
+    t165 = (t175 * 2) - t156;
+
+    /* 27 */ lo[11][slot] = t165;
+
+    t176 = (((((((t161 - t162) * (costab16) * 2)) -
+               t163) * 2) - t164) * 2) - t165;
+
+    /* 29 */ lo[13][slot] = t176;
+    /* 31 */ lo[15][slot] =
+        (((((((((t171 - t172) * (costab16)) * 2 -
+               t173) * 2) - t174) * 2) - t175) * 2) - t176);
+
+    /*
+     * Totals:
+     *  80 multiplies
+     *  80 additions
+     * 119 subtractions
+     *  49 shifts (not counting SSO)
+     */
+}
+
+var D /* [17][32] */ = [
+    /*
+     * These are the coefficients for the subband synthesis window. This is a
+     * reordered version of Table B.3 from ISO/IEC 11172-3.
+     */
+    [  0.000000000,   /*  0 */
+       -0.000442505,
+       0.003250122,
+       -0.007003784,
+       0.031082153,
+       -0.078628540,
+       0.100311279,
+       -0.572036743,
+       1.144989014,
+       0.572036743,
+       0.100311279,
+       0.078628540,
+       0.031082153,
+       0.007003784,
+       0.003250122,
+       0.000442505,
+
+       0.000000000,
+       -0.000442505,
+       0.003250122,
+       -0.007003784,
+       0.031082153,
+       -0.078628540,
+       0.100311279,
+       -0.572036743,
+       1.144989014,
+       0.572036743,
+       0.100311279,
+       0.078628540,
+       0.031082153,
+       0.007003784,
+       0.003250122,
+       0.000442505 ],
+
+    [ -0.000015259,   /*  1 */
+      -0.000473022,
+      0.003326416,
+      -0.007919312,
+      0.030517578,
+      -0.084182739,
+      0.090927124,
+      -0.600219727,
+      1.144287109,
+      0.543823242,
+      0.108856201,
+      0.073059082,
+      0.031478882,
+      0.006118774,
+      0.003173828,
+      0.000396729,
+
+      -0.000015259,
+      -0.000473022,
+      0.003326416,
+      -0.007919312,
+      0.030517578,
+      -0.084182739,
+      0.090927124,
+      -0.600219727,
+      1.144287109,
+      0.543823242,
+      0.108856201,
+      0.073059082,
+      0.031478882,
+      0.006118774,
+      0.003173828,
+      0.000396729 ],
+
+    [ -0.000015259,   /*  2 */
+      -0.000534058,
+      0.003387451,
+      -0.008865356,
+      0.029785156,
+      -0.089706421,
+      0.080688477,
+      -0.628295898,
+      1.142211914,
+      0.515609741,
+      0.116577148,
+      0.067520142,
+      0.031738281,
+      0.005294800,
+      0.003082275,
+      0.000366211,
+
+      -0.000015259,
+      -0.000534058,
+      0.003387451,
+      -0.008865356,
+      0.029785156,
+      -0.089706421,
+      0.080688477,
+      -0.628295898,
+      1.142211914,
+      0.515609741,
+      0.116577148,
+      0.067520142,
+      0.031738281,
+      0.005294800,
+      0.003082275,
+      0.000366211 ],
+
+    [ -0.000015259,   /*  3 */
+      -0.000579834,
+      0.003433228,
+      -0.009841919,
+      0.028884888,
+      -0.095169067,
+      0.069595337,
+      -0.656219482,
+      1.138763428,
+      0.487472534,
+      0.123474121,
+      0.061996460,
+      0.031845093,
+      0.004486084,
+      0.002990723,
+      0.000320435,
+
+      -0.000015259,
+      -0.000579834,
+      0.003433228,
+      -0.009841919,
+      0.028884888,
+      -0.095169067,
+      0.069595337,
+      -0.656219482,
+      1.138763428,
+      0.487472534,
+      0.123474121,
+      0.061996460,
+      0.031845093,
+      0.004486084,
+      0.002990723,
+      0.000320435 ],
+
+    [ -0.000015259,   /*  4 */
+      -0.000625610,
+      0.003463745,
+      -0.010848999,
+      0.027801514,
+      -0.100540161,
+      0.057617187,
+      -0.683914185,
+      1.133926392,
+      0.459472656,
+      0.129577637,
+      0.056533813,
+      0.031814575,
+      0.003723145,
+      0.002899170,
+      0.000289917,
+
+      -0.000015259,
+      -0.000625610,
+      0.003463745,
+      -0.010848999,
+      0.027801514,
+      -0.100540161,
+      0.057617187,
+      -0.683914185,
+      1.133926392,
+      0.459472656,
+      0.129577637,
+      0.056533813,
+      0.031814575,
+      0.003723145,
+      0.002899170,
+      0.000289917 ],
+
+    [ -0.000015259,   /*  5 */
+      -0.000686646,
+      0.003479004,
+      -0.011886597,
+      0.026535034,
+      -0.105819702,
+      0.044784546,
+      -0.711318970,
+      1.127746582,
+      0.431655884,
+      0.134887695,
+      0.051132202,
+      0.031661987,
+      0.003005981,
+      0.002792358,
+      0.000259399,
+
+      -0.000015259,
+      -0.000686646,
+      0.003479004,
+      -0.011886597,
+      0.026535034,
+      -0.105819702,
+      0.044784546,
+      -0.711318970,
+      1.127746582,
+      0.431655884,
+      0.134887695,
+      0.051132202,
+      0.031661987,
+      0.003005981,
+      0.002792358,
+      0.000259399 ],
+
+    [ -0.000015259,   /*  6 */
+      -0.000747681,
+      0.003479004,
+      -0.012939453,
+      0.025085449,
+      -0.110946655,
+      0.031082153,
+      -0.738372803,
+      1.120223999,
+      0.404083252,
+      0.139450073,
+      0.045837402,
+      0.031387329,
+      0.002334595,
+      0.002685547,
+      0.000244141,
+
+      -0.000015259,
+      -0.000747681,
+      0.003479004,
+      -0.012939453,
+      0.025085449,
+      -0.110946655,
+      0.031082153,
+      -0.738372803,
+      1.120223999,
+      0.404083252,
+      0.139450073,
+      0.045837402,
+      0.031387329,
+      0.002334595,
+      0.002685547,
+      0.000244141 ],
+
+    [ -0.000030518,   /*  7 */
+      -0.000808716,
+      0.003463745,
+      -0.014022827,
+      0.023422241,
+      -0.115921021,
+      0.016510010,
+      -0.765029907,
+      1.111373901,
+      0.376800537,
+      0.143264771,
+      0.040634155,
+      0.031005859,
+      0.001693726,
+      0.002578735,
+      0.000213623,
+
+      -0.000030518,
+      -0.000808716,
+      0.003463745,
+      -0.014022827,
+      0.023422241,
+      -0.115921021,
+      0.016510010,
+      -0.765029907,
+      1.111373901,
+      0.376800537,
+      0.143264771,
+      0.040634155,
+      0.031005859,
+      0.001693726,
+      0.002578735,
+      0.000213623 ],
+
+    [ -0.000030518,   /*  8 */
+      -0.000885010,
+      0.003417969,
+      -0.015121460,
+      0.021575928,
+      -0.120697021,
+      0.001068115,
+      -0.791213989,
+      1.101211548,
+      0.349868774,
+      0.146362305,
+      0.035552979,
+      0.030532837,
+      0.001098633,
+      0.002456665,
+      0.000198364,
+
+      -0.000030518,
+      -0.000885010,
+      0.003417969,
+      -0.015121460,
+      0.021575928,
+      -0.120697021,
+      0.001068115,
+      -0.791213989,
+      1.101211548,
+      0.349868774,
+      0.146362305,
+      0.035552979,
+      0.030532837,
+      0.001098633,
+      0.002456665,
+      0.000198364 ],
+
+    [ -0.000030518,   /*  9 */
+      -0.000961304,
+      0.003372192,
+      -0.016235352,
+      0.019531250,
+      -0.125259399,
+      -0.015228271,
+      -0.816864014,
+      1.089782715,
+      0.323318481,
+      0.148773193,
+      0.030609131,
+      0.029937744,
+      0.000549316,
+      0.002349854,
+      0.000167847,
+
+      -0.000030518,
+      -0.000961304,
+      0.003372192,
+      -0.016235352,
+      0.019531250,
+      -0.125259399,
+      -0.015228271,
+      -0.816864014,
+      1.089782715,
+      0.323318481,
+      0.148773193,
+      0.030609131,
+      0.029937744,
+      0.000549316,
+      0.002349854,
+      0.000167847 ],
+
+    [ -0.000030518,   /* 10 */
+      -0.001037598,
+      0.003280640,
+      -0.017349243,
+      0.017257690,
+      -0.129562378,
+      -0.032379150,
+      -0.841949463,
+      1.077117920,
+      0.297210693,
+      0.150497437,
+      0.025817871,
+      0.029281616,
+      0.000030518,
+      0.002243042,
+      0.000152588,
+
+      -0.000030518,
+      -0.001037598,
+      0.003280640,
+      -0.017349243,
+      0.017257690,
+      -0.129562378,
+      -0.032379150,
+      -0.841949463,
+      1.077117920,
+      0.297210693,
+      0.150497437,
+      0.025817871,
+      0.029281616,
+      0.000030518,
+      0.002243042,
+      0.000152588 ],
+
+    [ -0.000045776,   /* 11 */
+      -0.001113892,
+      0.003173828,
+      -0.018463135,
+      0.014801025,
+      -0.133590698,
+      -0.050354004,
+      -0.866363525,
+      1.063217163,
+      0.271591187,
+      0.151596069,
+      0.021179199,
+      0.028533936,
+      -0.000442505,
+      0.002120972,
+      0.000137329,
+
+      -0.000045776,
+      -0.001113892,
+      0.003173828,
+      -0.018463135,
+      0.014801025,
+      -0.133590698,
+      -0.050354004,
+      -0.866363525,
+      1.063217163,
+      0.271591187,
+      0.151596069,
+      0.021179199,
+      0.028533936,
+      -0.000442505,
+      0.002120972,
+      0.000137329 ],
+
+    [ -0.000045776,   /* 12 */
+      -0.001205444,
+      0.003051758,
+      -0.019577026,
+      0.012115479,
+      -0.137298584,
+      -0.069168091,
+      -0.890090942,
+      1.048156738,
+      0.246505737,
+      0.152069092,
+      0.016708374,
+      0.027725220,
+      -0.000869751,
+      0.002014160,
+      0.000122070,
+
+      -0.000045776,
+      -0.001205444,
+      0.003051758,
+      -0.019577026,
+      0.012115479,
+      -0.137298584,
+      -0.069168091,
+      -0.890090942,
+      1.048156738,
+      0.246505737,
+      0.152069092,
+      0.016708374,
+      0.027725220,
+      -0.000869751,
+      0.002014160,
+      0.000122070 ],
+
+    [ -0.000061035,   /* 13 */
+      -0.001296997,
+      0.002883911,
+      -0.020690918,
+      0.009231567,
+      -0.140670776,
+      -0.088775635,
+      -0.913055420,
+      1.031936646,
+      0.221984863,
+      0.151962280,
+      0.012420654,
+      0.026840210,
+      -0.001266479,
+      0.001907349,
+      0.000106812,
+
+      -0.000061035,
+      -0.001296997,
+      0.002883911,
+      -0.020690918,
+      0.009231567,
+      -0.140670776,
+      -0.088775635,
+      -0.913055420,
+      1.031936646,
+      0.221984863,
+      0.151962280,
+      0.012420654,
+      0.026840210,
+      -0.001266479,
+      0.001907349,
+      0.000106812 ],
+
+    [ -0.000061035,   /* 14 */
+      -0.001388550,
+      0.002700806,
+      -0.021789551,
+      0.006134033,
+      -0.143676758,
+      -0.109161377,
+      -0.935195923,
+      1.014617920,
+      0.198059082,
+      0.151306152,
+      0.008316040,
+      0.025909424,
+      -0.001617432,
+      0.001785278,
+      0.000106812,
+
+      -0.000061035,
+      -0.001388550,
+      0.002700806,
+      -0.021789551,
+      0.006134033,
+      -0.143676758,
+      -0.109161377,
+      -0.935195923,
+      1.014617920,
+      0.198059082,
+      0.151306152,
+      0.008316040,
+      0.025909424,
+      -0.001617432,
+      0.001785278,
+      0.000106812 ],
+
+    [ -0.000076294,   /* 15 */
+      -0.001480103,
+      0.002487183,
+      -0.022857666,
+      0.002822876,
+      -0.146255493,
+      -0.130310059,
+      -0.956481934,
+      0.996246338,
+      0.174789429,
+      0.150115967,
+      0.004394531,
+      0.024932861,
+      -0.001937866,
+      0.001693726,
+      0.000091553,
+
+      -0.000076294,
+      -0.001480103,
+      0.002487183,
+      -0.022857666,
+      0.002822876,
+      -0.146255493,
+      -0.130310059,
+      -0.956481934,
+      0.996246338,
+      0.174789429,
+      0.150115967,
+      0.004394531,
+      0.024932861,
+      -0.001937866,
+      0.001693726,
+      0.000091553 ],
+
+    [ -0.000076294,   /* 16 */
+      -0.001586914,
+      0.002227783,
+      -0.023910522,
+      -0.000686646,
+      -0.148422241,
+      -0.152206421,
+      -0.976852417,
+      0.976852417,
+      0.152206421,
+      0.148422241,
+      0.000686646,
+      0.023910522,
+      -0.002227783,
+      0.001586914,
+      0.000076294,
+
+      -0.000076294,
+      -0.001586914,
+      0.002227783,
+      -0.023910522,
+      -0.000686646,
+      -0.148422241,
+      -0.152206421,
+      -0.976852417,
+      0.976852417,
+      0.152206421,
+      0.148422241,
+      0.000686646,
+      0.023910522,
+      -0.002227783,
+      0.001586914,
+      0.000076294 ]
+];
+
+/*
+ * NAME:    synth.full()
+ * DESCRIPTION: perform full frequency PCM synthesis
+ */
+Mad.Synth.prototype.full = function(frame, nch, ns) {
+    var Dptr, hi, lo, ptr;
+    
+    for (var ch = 0; ch < nch; ++ch) {
+        var sbsample /* [36][32] */ = frame.sbsample[ch];
+        var filter = this.filter[ch]  /* [2][2][16][8] */;
+        var phase    = this.phase;
+        var pcm      = this.pcm.samples[ch];
+        var pcm1Ptr  = 0;
+        var pcm2Ptr  = 0;
+
+        for (var s = 0; s < ns; ++s) {
+            Mad.Synth.dct32(sbsample[s], phase >> 1, filter[0][phase & 1], filter[1][phase & 1]);
+
+            var pe = phase & ~1;
+            var po = ((phase - 1) & 0xf) | 1;
+
+            /* calculate 32 samples */
+            var fe = filter[0][ phase & 1];
+            var fx = filter[0][~phase & 1];
+            var fo = filter[1][~phase & 1];
+
+            var fePtr = 0;
+            var fxPtr = 0;
+            var foPtr = 0;
+            
+            Dptr = 0;
+
+            ptr = D[Dptr];
+            _fx = fx[fxPtr];
+            _fe = fe[fePtr];
+
+            lo =  _fx[0] * ptr[po +  0];
+            lo += _fx[1] * ptr[po + 14];
+            lo += _fx[2] * ptr[po + 12];
+            lo += _fx[3] * ptr[po + 10];
+            lo += _fx[4] * ptr[po +  8];
+            lo += _fx[5] * ptr[po +  6];
+            lo += _fx[6] * ptr[po +  4];
+            lo += _fx[7] * ptr[po +  2];
+            lo = -lo;                      
+            
+            lo += _fe[0] * ptr[pe +  0];
+            lo += _fe[1] * ptr[pe + 14];
+            lo += _fe[2] * ptr[pe + 12];
+            lo += _fe[3] * ptr[pe + 10];
+            lo += _fe[4] * ptr[pe +  8];
+            lo += _fe[5] * ptr[pe +  6];
+            lo += _fe[6] * ptr[pe +  4];
+            lo += _fe[7] * ptr[pe +  2];
+
+            pcm[pcm1Ptr++] = lo;
+            pcm2Ptr = pcm1Ptr + 30;
+
+            for (var sb = 1; sb < 16; ++sb) {
+                ++fePtr;
+                ++Dptr;
+
+                /* D[32 - sb][i] === -D[sb][31 - i] */
+
+                ptr = D[Dptr];
+                _fo = fo[foPtr];
+                _fe = fe[fePtr];
+
+                lo  = _fo[0] * ptr[po +  0];
+                lo += _fo[1] * ptr[po + 14];
+                lo += _fo[2] * ptr[po + 12];
+                lo += _fo[3] * ptr[po + 10];
+                lo += _fo[4] * ptr[po +  8];
+                lo += _fo[5] * ptr[po +  6];
+                lo += _fo[6] * ptr[po +  4];
+                lo += _fo[7] * ptr[po +  2];
+                lo = -lo;
+
+                lo += _fe[7] * ptr[pe + 2];
+                lo += _fe[6] * ptr[pe + 4];
+                lo += _fe[5] * ptr[pe + 6];
+                lo += _fe[4] * ptr[pe + 8];
+                lo += _fe[3] * ptr[pe + 10];
+                lo += _fe[2] * ptr[pe + 12];
+                lo += _fe[1] * ptr[pe + 14];
+                lo += _fe[0] * ptr[pe + 0];
+
+                pcm[pcm1Ptr++] = lo;
+
+                lo =  _fe[0] * ptr[-pe + 31 - 16];
+                lo += _fe[1] * ptr[-pe + 31 - 14];
+                lo += _fe[2] * ptr[-pe + 31 - 12];
+                lo += _fe[3] * ptr[-pe + 31 - 10];
+                lo += _fe[4] * ptr[-pe + 31 -  8];
+                lo += _fe[5] * ptr[-pe + 31 -  6];
+                lo += _fe[6] * ptr[-pe + 31 -  4];
+                lo += _fe[7] * ptr[-pe + 31 -  2];
+
+                lo += _fo[7] * ptr[-po + 31 -  2];
+                lo += _fo[6] * ptr[-po + 31 -  4];
+                lo += _fo[5] * ptr[-po + 31 -  6];
+                lo += _fo[4] * ptr[-po + 31 -  8];
+                lo += _fo[3] * ptr[-po + 31 - 10];
+                lo += _fo[2] * ptr[-po + 31 - 12];
+                lo += _fo[1] * ptr[-po + 31 - 14];
+                lo += _fo[0] * ptr[-po + 31 - 16];
+
+                pcm[pcm2Ptr--] = lo;
+                ++foPtr;
+            }
+
+            ++Dptr;
+
+            ptr = D[Dptr];
+            _fo = fo[foPtr];
+
+            lo  = _fo[0] * ptr[po +  0];
+            lo += _fo[1] * ptr[po + 14];
+            lo += _fo[2] * ptr[po + 12];
+            lo += _fo[3] * ptr[po + 10];
+            lo += _fo[4] * ptr[po +  8];
+            lo += _fo[5] * ptr[po +  6];
+            lo += _fo[6] * ptr[po +  4];
+            lo += _fo[7] * ptr[po +  2];
+
+            pcm[pcm1Ptr] = -lo;
+            pcm1Ptr += 16;
+            phase = (phase + 1) % 16;
+        }
+    }
+}
+
+
+/*
+ * NAME:    synth.half()
+ * DESCRIPTION: perform half frequency PCM synthesis
+ */
+
+// Yeah, I don't think so
+
+//static
+//void synth_half(struct mad_synth *synth, struct mad_frame const *frame,
+//      unsigned int nch, unsigned int ns)
+//{
+//  unsigned int phase, ch, s, sb, pe, po;
+//  mad_fixed_t *pcm1, *pcm2, filter[2][2][16][8];
+//  mad_fixed_t const (*sbsample)[36][32];
+//  register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8];
+//  register mad_fixed_t const (*Dptr)[32], *ptr;
+//  register mad_fixed64hi_t hi;
+//  register mad_fixed64lo_t lo;
+//
+//  for (ch = 0; ch < nch; ++ch) {
+//    sbsample = &frame.sbsample[ch];
+//    filter   = &synth.filter[ch];
+//    phase    = synth.phase;
+//    pcm1     = synth.pcm.samples[ch];
+//
+//    for (s = 0; s < ns; ++s) {
+//      dct32((*sbsample)[s], phase >> 1,
+//      filter[0][phase & 1], filter[1][phase & 1]);
+//
+//      pe = phase & ~1;
+//      po = ((phase - 1) & 0xf) | 1;
+//
+//      /* calculate 16 samples */
+//
+//      fe = &filter[0][ phase & 1][0];
+//      fx = &filter[0][~phase & 1][0];
+//      fo = &filter[1][~phase & 1][0];
+//
+//      Dptr = &D[0];
+//
+//      ptr = *Dptr + po;
+//      ML0(hi, lo, (*fx)[0], ptr[ 0]);
+//      MLA(hi, lo, (*fx)[1], ptr[14]);
+//      MLA(hi, lo, (*fx)[2], ptr[12]);
+//      MLA(hi, lo, (*fx)[3], ptr[10]);
+//      MLA(hi, lo, (*fx)[4], ptr[ 8]);
+//      MLA(hi, lo, (*fx)[5], ptr[ 6]);
+//      MLA(hi, lo, (*fx)[6], ptr[ 4]);
+//      MLA(hi, lo, (*fx)[7], ptr[ 2]);
+//      MLN(hi, lo);
+//
+//      ptr = *Dptr + pe;
+//      MLA(hi, lo, (*fe)[0], ptr[ 0]);
+//      MLA(hi, lo, (*fe)[1], ptr[14]);
+//      MLA(hi, lo, (*fe)[2], ptr[12]);
+//      MLA(hi, lo, (*fe)[3], ptr[10]);
+//      MLA(hi, lo, (*fe)[4], ptr[ 8]);
+//      MLA(hi, lo, (*fe)[5], ptr[ 6]);
+//      MLA(hi, lo, (*fe)[6], ptr[ 4]);
+//      MLA(hi, lo, (*fe)[7], ptr[ 2]);
+//
+//      *pcm1++ = MLZ(hi, lo);
+//
+//      pcm2 = pcm1 + 14;
+//
+//      for (sb = 1; sb < 16; ++sb) {
+//  ++fe;
+//  ++Dptr;
+//
+//  /* D[32 - sb][i] === -D[sb][31 - i] */
+//
+//  if (!(sb & 1)) {
+//    ptr = *Dptr + po;
+//    ML0(hi, lo, (*fo)[0], ptr[ 0]);
+//    MLA(hi, lo, (*fo)[1], ptr[14]);
+//    MLA(hi, lo, (*fo)[2], ptr[12]);
+//    MLA(hi, lo, (*fo)[3], ptr[10]);
+//    MLA(hi, lo, (*fo)[4], ptr[ 8]);
+//    MLA(hi, lo, (*fo)[5], ptr[ 6]);
+//    MLA(hi, lo, (*fo)[6], ptr[ 4]);
+//    MLA(hi, lo, (*fo)[7], ptr[ 2]);
+//    MLN(hi, lo);
+//
+//    ptr = *Dptr + pe;
+//    MLA(hi, lo, (*fe)[7], ptr[ 2]);
+//    MLA(hi, lo, (*fe)[6], ptr[ 4]);
+//    MLA(hi, lo, (*fe)[5], ptr[ 6]);
+//    MLA(hi, lo, (*fe)[4], ptr[ 8]);
+//    MLA(hi, lo, (*fe)[3], ptr[10]);
+//    MLA(hi, lo, (*fe)[2], ptr[12]);
+//    MLA(hi, lo, (*fe)[1], ptr[14]);
+//    MLA(hi, lo, (*fe)[0], ptr[ 0]);
+//
+//    *pcm1++ = MLZ(hi, lo);
+//
+//    ptr = *Dptr - po;
+//    ML0(hi, lo, (*fo)[7], ptr[31 -  2]);
+//    MLA(hi, lo, (*fo)[6], ptr[31 -  4]);
+//    MLA(hi, lo, (*fo)[5], ptr[31 -  6]);
+//    MLA(hi, lo, (*fo)[4], ptr[31 -  8]);
+//    MLA(hi, lo, (*fo)[3], ptr[31 - 10]);
+//    MLA(hi, lo, (*fo)[2], ptr[31 - 12]);
+//    MLA(hi, lo, (*fo)[1], ptr[31 - 14]);
+//    MLA(hi, lo, (*fo)[0], ptr[31 - 16]);
+//
+//    ptr = *Dptr - pe;
+//    MLA(hi, lo, (*fe)[0], ptr[31 - 16]);
+//    MLA(hi, lo, (*fe)[1], ptr[31 - 14]);
+//    MLA(hi, lo, (*fe)[2], ptr[31 - 12]);
+//    MLA(hi, lo, (*fe)[3], ptr[31 - 10]);
+//    MLA(hi, lo, (*fe)[4], ptr[31 -  8]);
+//    MLA(hi, lo, (*fe)[5], ptr[31 -  6]);
+//    MLA(hi, lo, (*fe)[6], ptr[31 -  4]);
+//    MLA(hi, lo, (*fe)[7], ptr[31 -  2]);
+//
+//    *pcm2-- = MLZ(hi, lo);
+//  }
+//
+//  ++fo;
+//      }
+//
+//      ++Dptr;
+//
+//      ptr = *Dptr + po;
+//      ML0(hi, lo, (*fo)[0], ptr[ 0]);
+//      MLA(hi, lo, (*fo)[1], ptr[14]);
+//      MLA(hi, lo, (*fo)[2], ptr[12]);
+//      MLA(hi, lo, (*fo)[3], ptr[10]);
+//      MLA(hi, lo, (*fo)[4], ptr[ 8]);
+//      MLA(hi, lo, (*fo)[5], ptr[ 6]);
+//      MLA(hi, lo, (*fo)[6], ptr[ 4]);
+//      MLA(hi, lo, (*fo)[7], ptr[ 2]);
+//
+//      *pcm1 = -MLZ(hi, lo);
+//      pcm1 += 8;
+//
+//      phase = (phase + 1) % 16;
+//    }
+//  }
+//}
+
+/*
+ * NAME:    synth.frame()
+ * DESCRIPTION: perform PCM synthesis of frame subband samples
+ */
+Mad.Synth.prototype.frame = function (frame) {
+    var nch = frame.header.nchannels();
+    var ns  = frame.header.nbsamples();
+
+    this.pcm.samplerate = frame.header.samplerate;
+    this.pcm.channels   = nch;
+    this.pcm.length     = 32 * ns;
+
+    // console.log("ns: " + ns);
+
+    /*
+     if (frame.options & Mad.Option.HALFSAMPLERATE) {
+     this.pcm.samplerate /= 2;
+     this.pcm.length     /= 2;
+
+     throw new Error("HALFSAMPLERATE is not supported. What do you think? As if I have the time for this");
+     }
+     */
+
+    this.full(frame, nch, ns);
+    this.phase = (this.phase + ns) % 16;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/index.html
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/index.html	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/index.html	(revision 28388)
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="UTF-8" />
+        <title>jsmad - javascript mp3 decoder</title>
+        <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" />
+    </head>
+    <body>
+        <div id="container">
+	<a href="http://github.com/nddrylliog/jsmad"><img style="position: absolute; top: 0; left: 0; border: 0;" src="images/github-banner.png" alt="Fork me on GitHub"></a>
+            <div id="header">
+                <h1>
+                    <span>JSMAD - JavaScript MPEG Audio Decoder</span>
+                </h1>
+                <div class="github">
+                    <a href="https://github.com/nddrylliog/jsmad">https://github.com/nddrylliog/jsmad</a>
+                </div>
+                <div class="select">
+                    <form id="streamData" action="#">
+                        <label for="ofm" class="ofm">official.fm track ID</label> 
+                        <input id="ofm" type="text" value="114579"/>
+                    </form>
+                    <span>or</span>
+                    <form id="uploadData">
+                        <label for="fileChooser">local MP3 file</label> 
+                        <input id="fileChooser" type="file" />
+                    </form>
+                </div>
+            </div>
+            <div id="content">
+                <div id="ID3">
+                    <div class="intro">
+                        <h2>jsmad is a pure JavaScript MP3 decoder</h2>
+                        <p style="text-align: center; width: 100%; margin-top: 15%;">Select a local file or enter an Official.fm track id :)</p>
+                    </div>
+                </div>
+                <div id="shareTrack"><label>Share your love for this track: <input type="text" readonly value="http://jsmad.org/play/114579" id="playUrl" /></div>
+            </div>
+            <div id="footer">
+                <p>
+                    Made in
+                    <a href="http://musichackday.org" class="mhd">
+                        <img src="images/mhd.png" alt="musichackday" />
+                    </a>
+                    by
+                    <a href="http://twitter.com/nddrylliog">@nddrylliog</a>
+                    <a href="http://twitter.com/antoinem">@antoinem</a>
+                    <a href="http://twitter.com/mgeorgi">@mgeorgi</a>
+                    <a href="http://twitter.com/jensnockert">@jensnockert</a>
+                </p>
+            </div>
+        </div>
+        <!--
+        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.js"></script>
+        <script type="text/javascript" src="src/jsmad.min.js"></script>
+        -->
+        <script type="text/javascript" src="scripts/jquery.js"></script>
+
+        <script type="text/javascript" src="src/mad.js"></script>
+        <script type="text/javascript" src="src/rq_table.js"></script>
+        <script type="text/javascript" src="src/imdct_s.js"></script>
+        <script type="text/javascript" src="src/huffman.js"></script>
+        <script type="text/javascript" src="src/bit.js"></script>
+        <script type="text/javascript" src="src/stream.js"></script>
+        <script type="text/javascript" src="src/layer3.js"></script>
+        <script type="text/javascript" src="src/frame.js"></script>
+        <script type="text/javascript" src="src/synth.js"></script>
+
+        <script type="text/javascript" src="src/arraybuffer/bytestream.js"></script>
+        <script type="text/javascript" src="src/arraybuffer/filestream.js"></script>
+        <script type="text/javascript" src="src/arraybuffer/substream.js"></script>
+        <script type="text/javascript" src="src/arraybuffer/arraystream.js"></script>
+        <script type="text/javascript" src="src/arraybuffer/ajaxstream.js"></script>
+
+        <script type="text/javascript" src="src/binarystring/bytestream.js"></script>
+        <script type="text/javascript" src="src/binarystring/filestream.js"></script>
+        <script type="text/javascript" src="src/binarystring/substream.js"></script>
+        <script type="text/javascript" src="src/binarystring/stringstream.js"></script>
+        <script type="text/javascript" src="src/binarystring/ajaxstream.js"></script>
+
+        <script type="text/javascript" src="src/id3v22stream.js"></script>
+        <script type="text/javascript" src="src/id3v23stream.js"></script>
+        <script type="text/javascript" src="src/mp3file.js"></script>
+
+        <script type="text/javascript" src="src/player.js"></script>
+        <script type="text/javascript" src="scripts/sink.min.js"></script>
+        <script type="text/javascript" src="officialfm.js"></script>
+        <script type="text/javascript" src="mhd.js"></script>
+       
+        <!-- 
+        <script>
+          var _gaq = [['_setAccount', 'UA-24032051-1'], ['_trackPageview']];
+          (function(d, t) {
+            var g = d.createElement(t),
+                s = d.getElementsByTagName(t)[0];
+            g.async = g.src = '//www.google-analytics.com/ga.js';
+            s.parentNode.insertBefore(g, s);
+          }(document, 'script'));
+        </script>
+        -->
+    </body>
+</html>
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/mhd.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/mhd.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/mhd.js	(revision 28388)
@@ -0,0 +1,301 @@
+
+( function()
+{
+    
+    var DEBUG = window.MHD_DEBUG || false;
+    
+    window.MHD = function( o )
+    {
+        this.options  = o;
+        this.ofm      = new OfficialFM( o.ofmAPIKey );
+        this.player   = null;
+        this.ofmTrack = null;
+        
+        // var globalPlayer = null;
+        // var ofm = new OfficialFM('Q5Bd7987TmfsNVOHP9Zt');
+        // var ofmTrack = null;
+    };
+    
+    MHD.MP3_URL = 'http://mp3.jsmad.org';
+    
+    MHD.prototype = {
+        
+        bindEvents : ( function()
+        {
+            var eventsBinded = false;
+            
+            return function()
+            {
+                if(eventsBinded) return;
+                
+                var self = this;
+                
+                this.el = {};
+                
+                for(key in this.options.el)
+                {
+                    this.el[key] = document.querySelector(this.options.el[key]);
+                }
+                
+                this.el.fileChooser.onchange = function( ev )
+                {
+                    self.readFile( ev );
+                };
+                
+                this.el.trackId.onkeypress = function(ev)
+                {
+                    // enter pressed ?
+                    if(ev.keyCode == 13) {
+                        
+                        self.playOfm();
+                        return false;
+                    }
+                };
+            };
+            
+        } )(),
+        
+        onPageLoad : function()
+        {
+            this.bindEvents();
+            this.checkLocation();
+            //this.playOfm();
+        },
+        
+        onPlayPause : function()
+        {
+            DEBUG && console.log("play/paused pressed.");
+        },
+        
+        onSeek : function(percentage)
+        {
+            DEBUG && console.log("seek " + percentage + "%");
+        },
+        
+        onProgress: function( current, total, preload )
+        {
+            DEBUG && console.log("current = " + current + ", total = " + total);
+            
+            this.el.preloadBar.style.width  = (preload * 360) + 'px';
+            this.el.progressBar.style.width = (current / total * 360) + 'px';
+        },
+        
+        checkLocation: function()
+        {
+            this.location = window.location;
+            
+            var match = /^\/play\/(\d+)\/?/.exec( this.location.pathname );
+            match && ( this.el.trackId.value = match[ 1 ] );
+        },
+        
+        playOfm : function()
+        {
+            var trackId = this.el.trackId.value,
+                url     = MHD.MP3_URL + "/mp3s/" + Math.floor( trackId / 1000 ) + "/" + trackId + ".mp3",
+                self    = this;
+            
+            this.el.playUrl.value = this.location.protocol + '//' + this.location.host + '/play/' + trackId;
+            
+            this.ofm.track( trackId, function( track )
+            {
+                self.ofmTrack = track;
+                Mad.Player.fromURL( url, function( player )
+                {
+                    setTimeout(function () { self.usePlayer( player ) }, 1000);
+                } );
+            } );
+        },
+        
+        readFile : function()
+        {
+            // uploadData is a form element
+            // fileChooser is input element of type 'file'
+            var file = document.forms['uploadData']['fileChooser'].files[0],
+                self = this;
+            
+            if (!file) return;
+            
+
+            Mad.Player.fromFile(file, function( player )
+            {
+                self.usePlayer( player );
+            });
+
+/*
+
+	    console.info("**** forcing hardwired URL");
+	    var url = "http://localhost:8383/greenstone3/sites/localsite/collect/js-dsp/import/AFIH.mp3"
+            Mad.Player.fromURL( url, function( player )
+                {
+                    setTimeout(function () { self.usePlayer( player ) }, 1000);
+                } );
+*/
+
+        },
+        
+        // TODO: Refactor this method.
+        usePlayer : function(player)
+        {
+            var self = this;
+            
+            if(this.player) player.destroy();
+            
+            this.player = player;
+            
+            // Workaround for MP3s without ID3, all is going to be undefined
+            if (player.id3 || true) {
+                
+                var id3        = player.id3 ? player.id3.toHash() : {},
+                    id3element = self.el.id3,
+                    id3string  = "<div class='player'><div class='picture'>",
+                    pictures   = id3['Attached picture'],
+                    artist     = this.ofmTrack ? this.ofmTrack.artist_string : id3['Lead artist/Lead performer/Soloist/Performing group'];
+                    
+                if(this.ofmTrack) {
+                    
+                    id3string += "<img class='picture' src='" + this.ofmTrack.picture_absolute_url.replace('_small', '_large') + "' />";
+                    
+                } else if (pictures) {
+                    
+                    var mime = pictures[0].mime,
+                        enc  = btoa(pictures[0].value);
+                    
+                    id3string += "<img class='picture' src='data:" + mime + ';base64,' + enc + "' />";
+                    
+                } else {
+                    
+                    id3string += "<img class='picture' src='../images/nopicture.png' />";
+                }
+                
+                id3string += "<a href='#' id='playpause' class='button play'></a>";
+                id3string += "<div class='timeline'><div id='preloadbar'><div id='progressbar'></div></div></div>";
+                
+                id3string += "</div></div>";
+                id3string += "<div class='info'>";
+                
+                id3string += "<h2 id='track_span'>" + (this.ofmTrack ? this.ofmTrack.title : id3['Title/Songname/Content description']) + "</h2>";
+                id3string += "<h3 id='artist_span'>" + artist + "</h3>";
+                id3string += "<div class='meta' id='meta_info'>";
+                
+                if(id3['Album/Movie/Show title']) {
+                    
+                    id3string += "<p><strong>Album:</strong> " + id3['Album/Movie/Show title'] + "</p>";
+                }
+                
+                if(id3['Track number/Position in set']) {
+                    
+                    id3string += "<p><strong>Track:</strong> " + id3['Track number/Position in set'] + "</p>";
+                }
+                
+                if(id3['Year']) {
+                    
+                    id3string += "<p><strong>Year:</strong> " + id3['Year'] + "</p>";
+                }
+                
+                id3string += "</div>";
+                id3string += "</div>";
+                
+                this.ofmTrack = null;
+                
+                id3element.innerHTML = id3string;
+                
+                // TODO: Make these elements configurable (will be part of the future refactor).
+                this.el.progressBar = document.getElementById( 'progressbar' );
+                this.el.preloadBar  = document.getElementById( 'preloadbar' );
+                this.el.playPause   = document.getElementById( 'playpause' );
+                
+                this.el.playPause.onclick = function( ev )
+                {
+                    player.setPlaying(!player.playing);
+                    
+                    return false;
+                };
+                
+                // musicbrainz + musicmetric queries
+                /* Disabled for now, as there is no backend to handle this request.
+                $.ajax({
+                    type: "GET",
+                    url: "http://jsmad.org/musicbrainz/" + escape(artist),
+                    dataType: "xml",
+                    success: function(xml) {
+                        var doc = $(xml);
+                        console.log("real artist name = " + doc.find('artist').children('name').text());
+                        var artist_id = doc.find('artist').attr('id');
+                        console.log("musicbrainz artist id = " + artist_id);
+                        
+                        var icons = {
+                            facebook: 'http://facebook.com/favicon.ico',
+                            lastfm: 'http://last.fm/favicon.ico',
+                            myspace: 'http://myspace.com/favicon.ico',
+                            twitter: 'http://twitter.com/favicon.ico',
+                            youtube: 'http://www.youtube.com/favicon.ico',
+                        };
+                        
+                        $.ajax({
+                            type: "GET",
+                            url: "http://jsmad.org/musicmetric/musicbrainz:" + artist_id,
+                            dataType: "json",
+                            success: function(json) {
+                                console.log("success? " + json.success);
+                                var up_img = '<img src="http://jsmad.org/images/up.png">';
+                                var down_img = '<img src="http://jsmad.org/images/down.png">';
+                                var equal_img = '<img src="http://jsmad.org/images/equal.png">';
+                                
+                                for(var platform in json.response.fans) {
+                                    if(!json.response.fans.hasOwnProperty(platform)) continue;
+                                    if(platform == "total") continue;
+                                    
+                                    var fans = json.response.fans[platform];
+                                    var previousFans = parseInt(fans.previous);
+                                    var  currentFans = parseInt(fans.current);
+                                    var    totalFans = parseInt(fans.total);
+                                    console.log("previous/current fans? " + previousFans + "/" + currentFans);
+                                    $('#meta_info').append('<p><strong>' + (Math.abs(currentFans - previousFans) < 5 ? equal_img : (currentFans > previousFans ? up_img : down_img)) + ' <img src="' + icons[platform] + '"> ' + platform + ': ' + (totalFans > 1000000 ? ((Math.floor(totalFans / 100000) / 10.0) + "M") : (totalFans > 1000 ? ((Math.floor(totalFans / 100) / 10.0) + "K") : totalFans)) + ' fans</strong>' + '</p>');
+                                }
+                                $('#artist_span').append(' <small>' + json.response.fans.total.total + ' fans</small>');
+                            }
+                        });
+                    }
+                });
+                */
+            }
+            
+            this.player.onProgress = function( current, total, preload )
+            {
+                self.onProgress(current, total, preload);
+            }
+            
+            this.player.onPlay = function()
+            {
+                self.el.playPause.className = 'button pause';
+            };
+            
+            this.player.onPause = function()
+            {
+                self.el.playPause.className = 'button play';
+            };
+            
+            this.player.createDevice();
+        }
+        
+    };
+    
+    var mhd = new MHD( {
+        ofmAPIKey : 'Q5Bd7987TmfsNVOHP9Zt',
+        el : {
+            // playPause  : '#playpause',
+            // preloadBar : '#preloadbar',
+            // progressBar: '#progressbar',
+            fileChooser: '#fileChooser',
+            trackId    : '#ofm',
+            id3        : '#ID3',
+            playUrl    : '#playUrl'
+        }
+    } );
+    
+    window.onload = function()
+    {
+        mhd.onPageLoad();
+    };
+    
+} )();
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/officialfm.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/officialfm.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/officialfm.js	(revision 28388)
@@ -0,0 +1,405 @@
+if(typeof jQuery == 'undefined') {
+    alert('jQuery must be loaded for officialfm-javascript to work.');
+}
+
+function OfficialFM(api_key, preload_player) {
+    this.api_key = api_key;
+    
+    if(preload_player) OfficialFM.is_player_loaded();
+}
+
+OfficialFM.VERSION = '0.0.1';
+OfficialFM.API_URL = 'http://api.official.fm/';
+
+OfficialFM.LOADING_TRIES_INTERVAL = 250; /* in ms */
+OfficialFM.MAX_LOADING_TRIES = 30000 / OfficialFM.LOADING_TRIES_INTERVAL; /* try loading for 30 seconds */
+
+OfficialFM.player_loading = false;
+OfficialFM.loading_tries = 0;
+
+OfficialFM.is_player_loaded = function () {
+    if (typeof OfficialFM.Player == "undefined") {
+        if (!OfficialFM.player_loading) {
+            OfficialFM.player_loading = true;
+            $.getScript("https://github.com/officialfm/officialfm-javascript/raw/master/player_api.js");
+        }
+        return false;
+    }
+    return true;
+}
+
+OfficialFM.with_player = function (callback) {
+    if(!callback) return;
+    
+    if(OfficialFM.is_player_loaded()) {
+        callback();
+    } else {
+        if(OfficialFM.loading_tries < OfficialFM.MAX_LOADING_TRIES) {
+            OfficialFM.loading_tries++;
+            setTimeout(function () {
+                OfficialFM.with_player(callback);
+            }, OfficialFM.LOADING_TRIES_INTERVAL);
+        }
+    }
+}
+
+/**
+ * Internal function used to query the server easily
+ */
+OfficialFM.prototype.call_api = function(sub_url, callback, other_params) {
+    var default_params = {
+        key: this.api_key,
+        format: 'json'
+    }
+    var params = default_params;
+    for (attrname in other_params) {
+        if(attrname == 'limit') {
+            params['api_max_responses'] = other_params[attrname];
+        } else if(attrname == 'embed') {
+            params['api_embed_codes'] = other_params[attrname];
+        } else {
+            params[attrname] = other_params[attrname];
+        }
+    }
+    
+    var url = OfficialFM.API_URL + sub_url;
+    $.ajax({
+        url: url,
+        data: params,
+        dataType: 'jsonp',
+        success: callback
+    });
+}
+
+/**
+ * Create an Official.fm player
+ * 
+ * Valid options:
+ * - container_id : string : id of the container. ex : 'player_container'
+ * - type : string : content type : track/playlist (todo : user, dynamic tracklist..)
+ * - id : content id : track/playlist's id
+ * - aspect : optional. string : aspect of player : [large], standard, artwork, small, mini. ex : 'artwork'
+ * - skin : optional. number : skin id (null = default skin). ex : 123
+ * - width : optional. string or number : width of player in pixel - or percentage when used with %. (valid only for artwork & small players). ex : '300' or '60%'
+ * - onReady : listener with no param. Called when player is ready to play.
+ * - onPlay : listener with 1 param track_id. Called when a track starts playing
+ * - onPause : listener with 1 param track_id. Called when a track is being paused
+ * - onProgress : listener with 1 param object {played_seconds, played_percent, total}. Called twice per second minimum.
+ * - onChangeTrack : listener with 1 param track_id. Called when player switch to another track
+ * - onChangeTracklist : listener with no param. Called when player switch to another tracklist
+ * - onTracklistEnd : listener with no param. Called when tracklist's end is reached.
+ *
+ * Subsequent calls to player() with the same div_id will replace
+ * previous instances of the player hosted in the given div
+ * 
+ */
+OfficialFM.prototype.player = function (options, callback) {
+    if(!options.hasOwnProperty('container_id')) {
+        options.container_id = 'player_container';
+    }
+        
+    if(!options.hasOwnProperty('type')) {
+        options.type = 'track';
+    }
+    
+    if(!options.hasOwnProperty('aspect')) {
+        options.aspect = 'small';
+    }
+    
+    OfficialFM.with_player(function() {
+        var _player = OfficialFM.Player.create(options);
+        /* Hack to add play_track to a player */
+        _player.play_track = function(track_id) {
+            this.play(track_id, OfficialFM.Player.build_feed('track', track_id));
+        }
+        callback(_player);
+    });
+}
+
+/**
+ * Create an Official.fm track player
+ * 
+ * @param div_id The ID of the div the player will be put in
+ * @param track_id content id : The ID of the track that should be played
+ * @param options :
+ *  - callback: function taking the player object as an argument
+ *  - all other options valid in OfficialFM.player()
+ * 
+ * Subsequent calls to track_player() with the same div_id will replace
+ * previous instances of the player hosted in the given div
+ * 
+ * Example:
+ *  ofm.track_player('player_div', 226556)
+ */
+OfficialFM.prototype.track_player = function (div_id, track_id, options) {
+    if(!options) options = {};
+    options.container_id = div_id;
+    options.type = 'track';
+    options.id = track_id;
+    if(!options.hasOwnProperty('callback')) options.callback = function() {};
+    
+    this.player(options, options.callback);
+}
+
+/**
+ * Create an Official.fm playlist player
+ * 
+ * @param div_id The ID of the div the player will be put in
+ * @param track_id content id : The ID of the track that should be played
+ * @param options :
+ *   - callback: function taking the player object as an argument
+ *   - all other options valid in OfficialFM.player()
+ * 
+ * Subsequent calls to playlist_player() with the same div_id will replace
+ * previous instances of the player hosted in the given div
+ */
+OfficialFM.prototype.playlist_player = function (div_id, playlist_id, options) {
+    if(!options) options = {};
+    options.container_id = div_id;
+    options.type = 'playlist';
+    options.id = playlist_id;
+    if(!options.hasOwnProperty('callback')) options.callback = function() {};
+    
+    this.player(options, options.callback);
+}
+
+/* ==================== users functions ===================== */
+
+/**
+ * Search for users
+ * 
+ * @param string search_param: a search parameter (eg +  name of the user)
+ * @param int limit (50) limit per page
+ * @User list
+ */
+OfficialFM.prototype.users = function (search_term, callback, options) {
+  this.call_api('search/users/' + encodeURI(search_term), callback, options);
+}
+
+OfficialFM.prototype.each_user = function (search_term, callback, options) {
+  this.users(search_term, function(users) { $.each(users, callback) }, options);
+}
+      
+/**
+ * Retrieve information about a specific user
+ * 
+ * @param string user_id: id or login
+ * @a User object
+ */
+OfficialFM.prototype.user = function (user_id, callback, options) {
+  this.call_api('user/' + user_id, function(data) { callback(data[0]); }, {});
+}
+
+/**
+ * Retrieve a list of the tracks of this user
+ *
+ * @param string user_id: id or login
+ * @param integer limit (50) limit per page
+ * @param bool embed (false) should embed codes be included in the response
+ * @array Track list
+ */
+OfficialFM.prototype.user_tracks = function (user_id, callback, options) {
+  this.call_api('user/' + user_id + '/tracks', callback, options);
+}
+
+OfficialFM.prototype.each_user_track = function (search_term, callback, options) {
+  this.user_tracks(search_term, function(user_tracks) { $.each(user_tracks, callback) }, options);
+}
+
+/**
+* Retrieve a list of the playlists of this user
+*
+* @param string user_id: id or login
+* @param integer limit (50) limit per page
+* @param bool embed (false) should embed codes be included in the response
+* @array Playlist list
+*/
+OfficialFM.prototype.user_playlists = function (user_id, callback, options) {
+  this.call_api('user/' + user_id + '/playlists', callback, options);
+}
+
+OfficialFM.prototype.each_user_playlists = function (search_term, callback, options) {
+  this.user_playlists(search_term, function(user_playlists) { $.each(user_playlists, callback) }, options);
+}
+
+/**
+ * Retrieve a list of the subscribers of this user
+ *
+ * @param string user_id: id or login
+ * @param integer limit (50) limit per page
+ * @array User list
+ */
+OfficialFM.prototype.user_subscribers = function (user_id, callback, options) {
+  this.call_api('user/' + user_id + '/subscribers', callback, options);
+}
+
+OfficialFM.prototype.each_user_subscribers = function (search_term, callback, options) {
+  this.user_subscribers(search_term, function(user_subscribers) { $.each(user_subscribers, callback) }, options);
+}
+
+/**
+ * Retrieve a list of the subscriptions of this user
+ *
+ * @param string user_id: id or login
+ * @param integer limit (50) limit per page
+ * @array User list
+ */
+OfficialFM.prototype.user_subscriptions = function (user_id, callback, options) {
+  this.call_api('user/' + user_id + '/subscriptions', callback, options);
+}
+
+OfficialFM.prototype.each_user_subscriptions = function (search_term, callback, options) {
+  this.user_subscriptions(search_term, function(user_subscriptions) { $.each(user_subscriptions, callback) }, options);
+}
+
+/**
+ * Retrieve a list of the contacts of this user
+ *
+ * @param string user_id: id or login
+ * @param integer limit (50) limit per page
+ * @param bool embed (false) should embed codes be included in the response
+ * @array User list
+ */
+OfficialFM.prototype.user_contacts = function (user_id, callback, options) {
+  this.call_api('user/' + user_id + '/contacts', callback, options);
+}
+
+OfficialFM.prototype.each_user_contacts = function (search_term, callback, options) {
+  this.user_contacts(search_term, function(user_contacts) { $.each(user_contacts, callback) }, options);
+}
+
+/* ==================== tracks functions ===================== */
+
+/**
+ * Search for tracks
+ *
+ * @param string search_param: a search parameter (eg +  name of the track)
+ * @param integer limit (50) limit per page (optional)
+ * @array Track list
+ */
+OfficialFM.prototype.tracks = function (search_term, callback, options) {
+  this.call_api('search/tracks/' + encodeURI(search_term), callback, options);
+}
+
+OfficialFM.prototype.each_track = function (search_term, callback, options) {
+  this.tracks(search_term, function(tracks) { $.each(tracks, callback) }, options);
+}
+
+/**
+ * Retrieve information about a specific track
+ *
+ * Note: http://official + fm/developers/simple_api#track_show
+ * says that api_max_responses is a valid parameter +  Why escapes me + 
+ *
+ * @param string track_id: id
+ * @param bool embed (false) should embed codes be included in the response
+ * @array Track
+ */
+OfficialFM.prototype.track = function (track_id, callback, options) {
+  this.call_api('track/' + track_id, function(data) { callback(data[0]); }, options);
+}
+
+/**
+ * Retrieve users that have voted for this track
+ *
+ * @param string track_id: id
+ * @param integer limit (50) limit per page
+ * @array User list
+ */
+OfficialFM.prototype.track_votes = function (track_id, callback, options) {
+  this.call_api('track/' + track_id + '/votes', callback, options);
+}
+
+OfficialFM.prototype.each_track_vote = function (search_term, callback, options) {
+  this.track_votes(search_term, function(track_votes) { $.each(track_votes, callback) }, options);
+}
+
+/**
+ * Retrieve 200 tracks of selected chart
+ *
+ * @param string charting: 'today', 'week', 'month', 'year' or 'all_time'
+ * @param string genre: Genre string ('Electronic', 'Rock', 'Jazz', ...) (optional)
+ * @param string country: ISO country id (CH, FR, UK) (optional)
+ * @param bool embed (false) should embed codes be included in the response (optional)
+ * @param integer limit (200) limit per page (optional)
+ * @array Track list
+ */
+OfficialFM.prototype.charts = function (charting, callback, options) {
+  this.call_api('tracks/charts', callback, $.extend({}, options, { charting: charting }));
+}
+
+OfficialFM.prototype.each_chart = function (search_term, callback, options) {
+  this.charts(search_term, function(charts) { $.each(charts, callback) }, options);
+}
+
+/**
+ * Retrieve 200 latest tracks
+ *
+ * @param string genre: Genre string (Electronic, Rock, Jazz,  +  +  + ) (optional)
+ * @param string country: ISO country id (CH, FR, UK) (optional)
+ * @param bool embed (false) should embed codes be included in the response (optional)
+ * @param integer limit (200) limit per page (optional)
+ * @array Track list
+ */
+OfficialFM.prototype.latest = function (callback, options) {
+    this.call_api('tracks/latest', callback, options);
+}
+
+OfficialFM.prototype.each_latest = function (callback, options) {
+  this.latest(function(latests) { $.each(latests, callback) }, options);
+}
+
+/* ==================== playlists functions ===================== */
+
+/**
+ * Search for playlists
+ *
+ * @param string search_param: a search parameter (eg +  name of the playlist)
+ * @param integer limit (50) limit per page (optional)
+ * @array Playlist list
+ */
+ OfficialFM.prototype.playlists = function (search_param, callback, options) {
+     this.call_api('search/playlists/' + encodeURI(search_param), function(result) {
+         callback($.map(result, OfficialFM.improve_playlist));
+     }, options);
+ }
+ 
+ OfficialFM.prototype.each_playlist = function (search_term, callback, options) {
+  this.playlists(search_term, function(playlists) { $.each(playlists, callback) }, options);
+ }
+ 
+/**
+ * Retrieve information about a specific playlist
+ *
+ * @param string playlist_id: id
+ * @param bool embed (false) should embed codes be included in the response
+ * @array Playlist
+ */
+ OfficialFM.prototype.playlist = function (playlist_id, callback, options) {
+    this.call_api('playlist/' + playlist_id, function(result) {
+        callback(OfficialFM.improve_playlist(result[0]));
+    }, options);
+ }
+ 
+/**
+ * Retrieve users that have voted for this playlist
+ *
+ * @param string playlist_id: id
+ * @param integer limit (50) limit per page
+ * @array User list
+ */
+ OfficialFM.prototype.playlist_votes = function (playlist_id, callback, options) {
+     this.call_api('playlist/' + playlist_id + '/votes', callback, options);
+ }
+ 
+ OfficialFM.prototype.each_playlist_vote = function (search_term, callback, options) {
+  this.playlist_votes(search_term, function(playlist_votes) { $.each(playlist_votes, callback) }, options);
+ }
+
+ /* Hack to improve playlist id lists (see issue #4 in sandbox-api) */
+ OfficialFM.improve_playlist = function (playlist) {
+     playlist.running_time = playlist['length'];
+     /* TODO: actually improve the item list ha*/
+     return playlist;
+ }
+
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/jquery.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/jquery.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/jquery.js	(revision 28388)
@@ -0,0 +1,9046 @@
+/*!
+ * jQuery JavaScript Library v1.6.4
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Sep 12 18:54:48 2011 -0400
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Check for digits
+	rdigit = /\d/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = (context ? context.ownerDocument || context : document);
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return (context || rootjQuery).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if (selector.selector !== undefined) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.6.4",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + (this.selector ? " " : "") + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, +i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.resolveWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).unbind( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery._Deferred();
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNaN: function( obj ) {
+		return obj == null || !rdigit.test( obj ) || isNaN( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw msg;
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return (new Function( "return " + data ))();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// The extra typeof function check is to prevent crashes
+			// in Safari 2 (See: #3039)
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array ) {
+		if ( !array ) {
+			return -1;
+		}
+
+		if ( indexOf ) {
+			return indexOf.call( array, elem );
+		}
+
+		for ( var i = 0, length = array.length; i < length; i++ ) {
+			if ( array[ i ] === elem ) {
+				return i;
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		if ( typeof context === "string" ) {
+			var tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( slice.call( arguments ) ) );
+			};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return (new Date()).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+var // Promise methods
+	promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
+	// Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+	// Create a simple deferred (one callbacks list)
+	_Deferred: function() {
+		var // callbacks list
+			callbacks = [],
+			// stored [ context , args ]
+			fired,
+			// to avoid firing when already doing so
+			firing,
+			// flag to know if the deferred has been cancelled
+			cancelled,
+			// the deferred itself
+			deferred  = {
+
+				// done( f1, f2, ...)
+				done: function() {
+					if ( !cancelled ) {
+						var args = arguments,
+							i,
+							length,
+							elem,
+							type,
+							_fired;
+						if ( fired ) {
+							_fired = fired;
+							fired = 0;
+						}
+						for ( i = 0, length = args.length; i < length; i++ ) {
+							elem = args[ i ];
+							type = jQuery.type( elem );
+							if ( type === "array" ) {
+								deferred.done.apply( deferred, elem );
+							} else if ( type === "function" ) {
+								callbacks.push( elem );
+							}
+						}
+						if ( _fired ) {
+							deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
+						}
+					}
+					return this;
+				},
+
+				// resolve with given context and args
+				resolveWith: function( context, args ) {
+					if ( !cancelled && !fired && !firing ) {
+						// make sure args are available (#8421)
+						args = args || [];
+						firing = 1;
+						try {
+							while( callbacks[ 0 ] ) {
+								callbacks.shift().apply( context, args );
+							}
+						}
+						finally {
+							fired = [ context, args ];
+							firing = 0;
+						}
+					}
+					return this;
+				},
+
+				// resolve with this as context and given arguments
+				resolve: function() {
+					deferred.resolveWith( this, arguments );
+					return this;
+				},
+
+				// Has this deferred been resolved?
+				isResolved: function() {
+					return !!( firing || fired );
+				},
+
+				// Cancel
+				cancel: function() {
+					cancelled = 1;
+					callbacks = [];
+					return this;
+				}
+			};
+
+		return deferred;
+	},
+
+	// Full fledged deferred (two callbacks list)
+	Deferred: function( func ) {
+		var deferred = jQuery._Deferred(),
+			failDeferred = jQuery._Deferred(),
+			promise;
+		// Add errorDeferred methods, then and promise
+		jQuery.extend( deferred, {
+			then: function( doneCallbacks, failCallbacks ) {
+				deferred.done( doneCallbacks ).fail( failCallbacks );
+				return this;
+			},
+			always: function() {
+				return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
+			},
+			fail: failDeferred.done,
+			rejectWith: failDeferred.resolveWith,
+			reject: failDeferred.resolve,
+			isRejected: failDeferred.isResolved,
+			pipe: function( fnDone, fnFail ) {
+				return jQuery.Deferred(function( newDefer ) {
+					jQuery.each( {
+						done: [ fnDone, "resolve" ],
+						fail: [ fnFail, "reject" ]
+					}, function( handler, data ) {
+						var fn = data[ 0 ],
+							action = data[ 1 ],
+							returned;
+						if ( jQuery.isFunction( fn ) ) {
+							deferred[ handler ](function() {
+								returned = fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise().then( newDefer.resolve, newDefer.reject );
+								} else {
+									newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+								}
+							});
+						} else {
+							deferred[ handler ]( newDefer[ action ] );
+						}
+					});
+				}).promise();
+			},
+			// Get a promise for this deferred
+			// If obj is provided, the promise aspect is added to the object
+			promise: function( obj ) {
+				if ( obj == null ) {
+					if ( promise ) {
+						return promise;
+					}
+					promise = obj = {};
+				}
+				var i = promiseMethods.length;
+				while( i-- ) {
+					obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
+				}
+				return obj;
+			}
+		});
+		// Make sure only one callback list will be used
+		deferred.done( failDeferred.cancel ).fail( deferred.cancel );
+		// Unexpose cancel
+		delete deferred.cancel;
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = arguments,
+			i = 0,
+			length = args.length,
+			count = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					// Strange bug in FF4:
+					// Values changed onto the arguments object sometimes end up as undefined values
+					// outside the $.when method. Cloning the object into a fresh array solves the issue
+					deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
+				}
+			};
+		}
+		if ( length > 1 ) {
+			for( ; i < length; i++ ) {
+				if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return deferred.promise();
+	}
+});
+
+
+
+jQuery.support = (function() {
+
+	var div = document.createElement( "div" ),
+		documentElement = document.documentElement,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		marginDiv,
+		support,
+		fragment,
+		body,
+		testElementParent,
+		testElement,
+		testElementStyle,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName( "tbody" ).length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName( "link" ).length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55$/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true
+	};
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains it's value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.firstChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	div.innerHTML = "";
+
+	// Figure out if the W3C box model works as expected
+	div.style.width = div.style.paddingLeft = "1px";
+
+	body = document.getElementsByTagName( "body" )[ 0 ];
+	// We use our own, invisible, body unless the body is already present
+	// in which case we use a div (#9239)
+	testElement = document.createElement( body ? "div" : "body" );
+	testElementStyle = {
+		visibility: "hidden",
+		width: 0,
+		height: 0,
+		border: 0,
+		margin: 0,
+		background: "none"
+	};
+	if ( body ) {
+		jQuery.extend( testElementStyle, {
+			position: "absolute",
+			left: "-1000px",
+			top: "-1000px"
+		});
+	}
+	for ( i in testElementStyle ) {
+		testElement.style[ i ] = testElementStyle[ i ];
+	}
+	testElement.appendChild( div );
+	testElementParent = body || documentElement;
+	testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	support.boxModel = div.offsetWidth === 2;
+
+	if ( "zoom" in div.style ) {
+		// Check if natively block-level elements act like inline-block
+		// elements when setting their display to 'inline' and giving
+		// them layout
+		// (IE < 8 does this)
+		div.style.display = "inline";
+		div.style.zoom = 1;
+		support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+		// Check if elements with layout shrink-wrap their children
+		// (IE 6 does this)
+		div.style.display = "";
+		div.innerHTML = "<div style='width:4px;'></div>";
+		support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+	}
+
+	div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+	tds = div.getElementsByTagName( "td" );
+
+	// Check if table cells still have offsetWidth/Height when they are set
+	// to display:none and there are still other visible table cells in a
+	// table row; if so, offsetWidth/Height are not reliable for use when
+	// determining if an element has been hidden directly using
+	// display:none (it is still safe to use offsets if a parent element is
+	// hidden; don safety goggles and see bug #4512 for more information).
+	// (only IE 8 fails this test)
+	isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+	tds[ 0 ].style.display = "";
+	tds[ 1 ].style.display = "none";
+
+	// Check if empty table cells still have offsetWidth/Height
+	// (IE < 8 fail this test)
+	support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+	div.innerHTML = "";
+
+	// Check if div with explicit width and no margin-right incorrectly
+	// gets computed margin-right based on width of container. For more
+	// info see bug #3333
+	// Fails in WebKit before Feb 2011 nightlies
+	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+	if ( document.defaultView && document.defaultView.getComputedStyle ) {
+		marginDiv = document.createElement( "div" );
+		marginDiv.style.width = "0";
+		marginDiv.style.marginRight = "0";
+		div.appendChild( marginDiv );
+		support.reliableMarginRight =
+			( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+	}
+
+	// Remove the body element we added
+	testElement.innerHTML = "";
+	testElementParent.removeChild( testElement );
+
+	// Technique from Juriy Zaytsev
+	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		} ) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	// Null connected elements to avoid leaks in IE
+	testElement = fragment = select = opt = body = marginDiv = div = input = null;
+
+	return support;
+})();
+
+// Keep track of boxModel
+jQuery.boxModel = jQuery.support.boxModel;
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ jQuery.expando ] = id = ++jQuery.uuid;
+			} else {
+				id = jQuery.expando;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
+			} else {
+				cache[ id ] = jQuery.extend(cache[ id ], name);
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// Internal jQuery data is stored in a separate object inside the object's data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data
+		if ( pvt ) {
+			if ( !thisCache[ internalKey ] ) {
+				thisCache[ internalKey ] = {};
+			}
+
+			thisCache = thisCache[ internalKey ];
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
+		// not attempt to inspect the internal events object using jQuery.data, as this
+		// internal data object is undocumented and subject to change.
+		if ( name === "events" && !thisCache[name] ) {
+			return thisCache[ internalKey ] && thisCache[ internalKey ].events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
+
+			if ( thisCache ) {
+
+				// Support interoperable removal of hyphenated or camelcased keys
+				if ( !thisCache[ name ] ) {
+					name = jQuery.camelCase( name );
+				}
+
+				delete thisCache[ name ];
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !isEmptyDataObject(thisCache) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( pvt ) {
+			delete cache[ id ][ internalKey ];
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		var internalCache = cache[ id ][ internalKey ];
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the entire user cache at once because it's faster than
+		// iterating through each key, but we need to continue to persist internal
+		// data if it existed
+		if ( internalCache ) {
+			cache[ id ] = {};
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+
+			cache[ id ][ internalKey ] = internalCache;
+
+		// Otherwise, we need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		} else if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ jQuery.expando ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( jQuery.expando );
+			} else {
+				elem[ jQuery.expando ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 ) {
+			    var attr = this[0].attributes, name;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		var parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var $this = jQuery( this ),
+					args = [ parts[0], value ];
+
+				$this.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				$this.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				!jQuery.isNaN( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
+// property to be considered empty objects; this property always exists in
+// order to make sure JSON.stringify does not expose internal metadata
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery.data( elem, deferDataKey, undefined, true );
+	if ( defer &&
+		( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
+		( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
+				!jQuery.data( elem, markDataKey, undefined, true ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.resolve();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = (type || "fx") + "mark";
+			jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
+			if ( count ) {
+				jQuery.data( elem, key, count, true );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		if ( elem ) {
+			type = (type || "fx") + "queue";
+			var q = jQuery.data( elem, type, undefined, true );
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery.data( elem, type, jQuery.makeArray(data), true );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			defer;
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift("inprogress");
+			}
+
+			fn.call(elem, function() {
+				jQuery.dequeue(elem, type);
+			});
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function() {
+			var queue = jQuery.queue( this, type, data );
+
+			if ( type === "fx" && queue[0] !== "inprogress" ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function() {
+			var elem = this;
+			setTimeout(function() {
+				jQuery.dequeue( elem, type );
+			}, time );
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
+				count++;
+				tmp.done( resolve );
+			}
+		}
+		resolve();
+		return defer.promise();
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	nodeHook, boolHook;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+	
+	prop: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.prop );
+	},
+	
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = (value || "").split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ";
+		for ( var i = 0, l = this.length; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret,
+			elem = this[0];
+		
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ? 
+					// handle most common string cases
+					ret.replace(rreturn, "") : 
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return undefined;
+		}
+
+		var isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+					var option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+	
+	attrFix: {
+		// Always normalize to ensure hook usage
+		tabindex: "tabIndex"
+	},
+	
+	attr: function( elem, name, value, pass ) {
+		var nType = elem.nodeType;
+		
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return undefined;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( !("getAttribute" in elem) ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		var ret, hooks,
+			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// Normalize the name if needed
+		if ( notxml ) {
+			name = jQuery.attrFix[ name ] || name;
+
+			hooks = jQuery.attrHooks[ name ];
+
+			if ( !hooks ) {
+				// Use boolHook for boolean attributes
+				if ( rboolean.test( name ) ) {
+					hooks = boolHook;
+
+				// Use nodeHook if available( IE6/7 )
+				} else if ( nodeHook ) {
+					hooks = nodeHook;
+				}
+			}
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return undefined;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, name ) {
+		var propName;
+		if ( elem.nodeType === 1 ) {
+			name = jQuery.attrFix[ name ] || name;
+
+			jQuery.attr( elem, name, "" );
+			elem.removeAttribute( name );
+
+			// Set corresponding property to false for boolean attributes
+			if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
+				elem[ propName ] = false;
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+	
+	prop: function( elem, name, value ) {
+		var nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return undefined;
+		}
+
+		var ret, hooks,
+			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return (elem[ name ] = value);
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+	
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabindex propHook to attrHooks for back-compat
+jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode;
+		return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !jQuery.support.getSetAttribute ) {
+	
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			// Return undefined if nodeValue is empty string
+			return ret && ret.nodeValue !== "" ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return (ret.nodeValue = value + "");
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return (elem.style.cssText = "" + value);
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
+			}
+		}
+	});
+});
+
+
+
+
+var rnamespaces = /\.(.*)$/,
+	rformElems = /^(?:textarea|input|select)$/i,
+	rperiod = /\./g,
+	rspaces = / /g,
+	rescape = /[^\w\s.|`]/g,
+	fcleanup = function( nm ) {
+		return nm.replace(rescape, "\\$&");
+	};
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+	// Bind an event to an element
+	// Original by Dean Edwards
+	add: function( elem, types, handler, data ) {
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		} else if ( !handler ) {
+			// Fixes bug #7229. Fix recommended by jdalton
+			return;
+		}
+
+		var handleObjIn, handleObj;
+
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// Make sure that the function being executed has a unique ID
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure
+		var elemData = jQuery._data( elem );
+
+		// If no elemData is found then we must be trying to bind to one of the
+		// banned noData elements
+		if ( !elemData ) {
+			return;
+		}
+
+		var events = elemData.events,
+			eventHandle = elemData.handle;
+
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+		}
+
+		// Add elem as a property of the handle function
+		// This is to prevent a memory leak with non-native events in IE.
+		eventHandle.elem = elem;
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		var type, i = 0, namespaces;
+
+		while ( (type = types[ i++ ]) ) {
+			handleObj = handleObjIn ?
+				jQuery.extend({}, handleObjIn) :
+				{ handler: handler, data: data };
+
+			// Namespaced event handlers
+			if ( type.indexOf(".") > -1 ) {
+				namespaces = type.split(".");
+				type = namespaces.shift();
+				handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+			} else {
+				namespaces = [];
+				handleObj.namespace = "";
+			}
+
+			handleObj.type = type;
+			if ( !handleObj.guid ) {
+				handleObj.guid = handler.guid;
+			}
+
+			// Get the current list of functions bound to this event
+			var handlers = events[ type ],
+				special = jQuery.event.special[ type ] || {};
+
+			// Init the event handler queue
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+
+				// Check for a special event handler
+				// Only use addEventListener/attachEvent if the special
+				// events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add the function to the element's handler list
+			handlers.push( handleObj );
+
+			// Keep track of which events have been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, pos ) {
+		// don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		}
+
+		var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			events = elemData && elemData.events;
+
+		if ( !elemData || !events ) {
+			return;
+		}
+
+		// types is actually an event object here
+		if ( types && types.type ) {
+			handler = types.handler;
+			types = types.type;
+		}
+
+		// Unbind all events for the element
+		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+			types = types || "";
+
+			for ( type in events ) {
+				jQuery.event.remove( elem, type + types );
+			}
+
+			return;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).unbind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		while ( (type = types[ i++ ]) ) {
+			origType = type;
+			handleObj = null;
+			all = type.indexOf(".") < 0;
+			namespaces = [];
+
+			if ( !all ) {
+				// Namespaced event handlers
+				namespaces = type.split(".");
+				type = namespaces.shift();
+
+				namespace = new RegExp("(^|\\.)" +
+					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+			}
+
+			eventType = events[ type ];
+
+			if ( !eventType ) {
+				continue;
+			}
+
+			if ( !handler ) {
+				for ( j = 0; j < eventType.length; j++ ) {
+					handleObj = eventType[ j ];
+
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						jQuery.event.remove( elem, origType, handleObj.handler, j );
+						eventType.splice( j--, 1 );
+					}
+				}
+
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+
+			for ( j = pos || 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( handler.guid === handleObj.guid ) {
+					// remove the given handler for the given type
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						if ( pos == null ) {
+							eventType.splice( j--, 1 );
+						}
+
+						if ( special.remove ) {
+							special.remove.call( elem, handleObj );
+						}
+					}
+
+					if ( pos != null ) {
+						break;
+					}
+				}
+			}
+
+			// remove generic event handler if no more handlers exist
+			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				ret = null;
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			var handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			delete elemData.events;
+			delete elemData.handle;
+
+			if ( jQuery.isEmptyObject( elemData ) ) {
+				jQuery.removeData( elem, undefined, true );
+			}
+		}
+	},
+	
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			exclusive;
+
+		if ( type.indexOf("!") >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf(".") >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join(".");
+		event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
+		
+		// triggerHandler() and global events don't bubble or run the default action
+		if ( onlyHandlers || !elem ) {
+			event.preventDefault();
+			event.stopPropagation();
+		}
+
+		// Handle a global trigger
+		if ( !elem ) {
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			jQuery.each( jQuery.cache, function() {
+				// internalKey variable is just used to make it easier to find
+				// and potentially change this stuff later; currently it just
+				// points to jQuery.expando
+				var internalKey = jQuery.expando,
+					internalCache = this[ internalKey ];
+				if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
+					jQuery.event.trigger( event, data, internalCache.handle.elem );
+				}
+			});
+			return;
+		}
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		event.target = elem;
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		var cur = elem,
+			// IE doesn't like method names with a colon (#3533, #8272)
+			ontype = type.indexOf(":") < 0 ? "on" + type : "";
+
+		// Fire event on the current element, then bubble up the DOM tree
+		do {
+			var handle = jQuery._data( cur, "handle" );
+
+			event.currentTarget = cur;
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Trigger an inline bound script
+			if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
+				event.result = false;
+				event.preventDefault();
+			}
+
+			// Bubble up to document, then to window
+			cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
+		} while ( cur && !event.isPropagationStopped() );
+
+		// If nobody prevented the default action, do it now
+		if ( !event.isDefaultPrevented() ) {
+			var old,
+				special = jQuery.event.special[ type ] || {};
+
+			if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction)() check here because IE6/7 fails that test.
+				// IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
+				try {
+					if ( ontype && elem[ type ] ) {
+						// Don't re-trigger an onFOO event when we call its FOO() method
+						old = elem[ ontype ];
+
+						if ( old ) {
+							elem[ ontype ] = null;
+						}
+
+						jQuery.event.triggered = type;
+						elem[ type ]();
+					}
+				} catch ( ieError ) {}
+
+				if ( old ) {
+					elem[ ontype ] = old;
+				}
+
+				jQuery.event.triggered = undefined;
+			}
+		}
+		
+		return event.result;
+	},
+
+	handle: function( event ) {
+		event = jQuery.event.fix( event || window.event );
+		// Snapshot the handlers list since a called handler may add/remove events.
+		var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
+			run_all = !event.exclusive && !event.namespace,
+			args = Array.prototype.slice.call( arguments, 0 );
+
+		// Use the fix-ed Event rather than the (read-only) native event
+		args[0] = event;
+		event.currentTarget = this;
+
+		for ( var j = 0, l = handlers.length; j < l; j++ ) {
+			var handleObj = handlers[ j ];
+
+			// Triggered event must 1) be non-exclusive and have no namespace, or
+			// 2) have namespace(s) a subset or equal to those in the bound event.
+			if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
+				// Pass in a reference to the handler function itself
+				// So that we can later remove it
+				event.handler = handleObj.handler;
+				event.data = handleObj.data;
+				event.handleObj = handleObj;
+
+				var ret = handleObj.handler.apply( this, args );
+
+				if ( ret !== undefined ) {
+					event.result = ret;
+					if ( ret === false ) {
+						event.preventDefault();
+						event.stopPropagation();
+					}
+				}
+
+				if ( event.isImmediatePropagationStopped() ) {
+					break;
+				}
+			}
+		}
+		return event.result;
+	},
+
+	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// store a copy of the original event object
+		// and "clone" to set read-only properties
+		var originalEvent = event;
+		event = jQuery.Event( originalEvent );
+
+		for ( var i = this.props.length, prop; i; ) {
+			prop = this.props[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary
+		if ( !event.target ) {
+			// Fixes #1925 where srcElement might not be defined either
+			event.target = event.srcElement || document;
+		}
+
+		// check if target is a textnode (safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Add relatedTarget, if necessary
+		if ( !event.relatedTarget && event.fromElement ) {
+			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+		}
+
+		// Calculate pageX/Y if missing and clientX/Y available
+		if ( event.pageX == null && event.clientX != null ) {
+			var eventDocument = event.target.ownerDocument || document,
+				doc = eventDocument.documentElement,
+				body = eventDocument.body;
+
+			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
+		}
+
+		// Add which for key events
+		if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+			event.which = event.charCode != null ? event.charCode : event.keyCode;
+		}
+
+		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+		if ( !event.metaKey && event.ctrlKey ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		// Add which for click: 1 === left; 2 === middle; 3 === right
+		// Note: button is not normalized, so don't use it
+		if ( !event.which && event.button !== undefined ) {
+			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+		}
+
+		return event;
+	},
+
+	// Deprecated, use jQuery.guid instead
+	guid: 1E8,
+
+	// Deprecated, use jQuery.proxy instead
+	proxy: jQuery.proxy,
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady,
+			teardown: jQuery.noop
+		},
+
+		live: {
+			add: function( handleObj ) {
+				jQuery.event.add( this,
+					liveConvert( handleObj.origType, handleObj.selector ),
+					jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
+			},
+
+			remove: function( handleObj ) {
+				jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+			}
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !this.preventDefault ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// timeStamp is buggy for some events on Firefox(#3843)
+	// So we won't rely on the native value
+	this.timeStamp = jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+
+	// Check if mouse(over|out) are still within the same parent element
+	var related = event.relatedTarget,
+		inside = false,
+		eventType = event.type;
+
+	event.type = event.data;
+
+	if ( related !== this ) {
+
+		if ( related ) {
+			inside = jQuery.contains( this, related );
+		}
+
+		if ( !inside ) {
+
+			jQuery.event.handle.apply( this, arguments );
+
+			event.type = eventType;
+		}
+	}
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+	event.type = event.data;
+	jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		setup: function( data ) {
+			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+		},
+		teardown: function( data ) {
+			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+		}
+	};
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function( data, namespaces ) {
+			if ( !jQuery.nodeName( this, "form" ) ) {
+				jQuery.event.add(this, "click.specialSubmit", function( e ) {
+					// Avoid triggering error on non-existent type attribute in IE VML (#7071)
+					var elem = e.target,
+						type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
+
+					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+					var elem = e.target,
+						type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
+
+					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+			} else {
+				return false;
+			}
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialSubmit" );
+		}
+	};
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+	var changeFilters,
+
+	getVal = function( elem ) {
+		var type = jQuery.nodeName( elem, "input" ) ? elem.type : "",
+			val = elem.value;
+
+		if ( type === "radio" || type === "checkbox" ) {
+			val = elem.checked;
+
+		} else if ( type === "select-multiple" ) {
+			val = elem.selectedIndex > -1 ?
+				jQuery.map( elem.options, function( elem ) {
+					return elem.selected;
+				}).join("-") :
+				"";
+
+		} else if ( jQuery.nodeName( elem, "select" ) ) {
+			val = elem.selectedIndex;
+		}
+
+		return val;
+	},
+
+	testChange = function testChange( e ) {
+		var elem = e.target, data, val;
+
+		if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+			return;
+		}
+
+		data = jQuery._data( elem, "_change_data" );
+		val = getVal(elem);
+
+		// the current data will be also retrieved by beforeactivate
+		if ( e.type !== "focusout" || elem.type !== "radio" ) {
+			jQuery._data( elem, "_change_data", val );
+		}
+
+		if ( data === undefined || val === data ) {
+			return;
+		}
+
+		if ( data != null || val ) {
+			e.type = "change";
+			e.liveFired = undefined;
+			jQuery.event.trigger( e, arguments[1], elem );
+		}
+	};
+
+	jQuery.event.special.change = {
+		filters: {
+			focusout: testChange,
+
+			beforedeactivate: testChange,
+
+			click: function( e ) {
+				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+				if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Change has to be called before submit
+			// Keydown will be called before keypress, which is used in submit-event delegation
+			keydown: function( e ) {
+				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+				if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
+					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+					type === "select-multiple" ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Beforeactivate happens also before the previous element is blurred
+			// with this event you can't trigger a change event, but you can store
+			// information
+			beforeactivate: function( e ) {
+				var elem = e.target;
+				jQuery._data( elem, "_change_data", getVal(elem) );
+			}
+		},
+
+		setup: function( data, namespaces ) {
+			if ( this.type === "file" ) {
+				return false;
+			}
+
+			for ( var type in changeFilters ) {
+				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+			}
+
+			return rformElems.test( this.nodeName );
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialChange" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+
+	changeFilters = jQuery.event.special.change.filters;
+
+	// Handle when the input is .focus()'d
+	changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+	// Piggyback on a donor event to simulate a different one.
+	// Fake originalEvent to avoid donor's stopPropagation, but if the
+	// simulated event prevents default then we do the same on the donor.
+	// Don't pass args or remember liveFired; they apply to the donor event.
+	var event = jQuery.extend( {}, args[ 0 ] );
+	event.type = type;
+	event.originalEvent = {};
+	event.liveFired = undefined;
+	jQuery.event.handle.call( elem, event );
+	if ( event.isDefaultPrevented() ) {
+		args[ 0 ].preventDefault();
+	}
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0;
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+
+		function handler( donor ) {
+			// Donor event is always a native one; fix it and switch its type.
+			// Let focusin/out handler cancel the donor focus/blur event.
+			var e = jQuery.event.fix( donor );
+			e.type = fix;
+			e.originalEvent = {};
+			jQuery.event.trigger( e, null, e.target );
+			if ( e.isDefaultPrevented() ) {
+				donor.preventDefault();
+			}
+		}
+	});
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+	jQuery.fn[ name ] = function( type, data, fn ) {
+		var handler;
+
+		// Handle object literals
+		if ( typeof type === "object" ) {
+			for ( var key in type ) {
+				this[ name ](key, data, type[key], fn);
+			}
+			return this;
+		}
+
+		if ( arguments.length === 2 || data === false ) {
+			fn = data;
+			data = undefined;
+		}
+
+		if ( name === "one" ) {
+			handler = function( event ) {
+				jQuery( this ).unbind( event, handler );
+				return fn.apply( this, arguments );
+			};
+			handler.guid = fn.guid || jQuery.guid++;
+		} else {
+			handler = fn;
+		}
+
+		if ( type === "unload" && name !== "one" ) {
+			this.one( type, data, fn );
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.add( this[i], type, handler, data );
+			}
+		}
+
+		return this;
+	};
+});
+
+jQuery.fn.extend({
+	unbind: function( type, fn ) {
+		// Handle object literals
+		if ( typeof type === "object" && !type.preventDefault ) {
+			for ( var key in type ) {
+				this.unbind(key, type[key]);
+			}
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.remove( this[i], type, fn );
+			}
+		}
+
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.live( types, data, fn, selector );
+	},
+
+	undelegate: function( selector, types, fn ) {
+		if ( arguments.length === 0 ) {
+			return this.unbind( "live" );
+
+		} else {
+			return this.die( types, null, fn, selector );
+		}
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+var liveMap = {
+	focus: "focusin",
+	blur: "focusout",
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+		var type, i = 0, match, namespaces, preType,
+			selector = origSelector || this.selector,
+			context = origSelector ? this : jQuery( this.context );
+
+		if ( typeof types === "object" && !types.preventDefault ) {
+			for ( var key in types ) {
+				context[ name ]( key, data, types[key], selector );
+			}
+
+			return this;
+		}
+
+		if ( name === "die" && !types &&
+					origSelector && origSelector.charAt(0) === "." ) {
+
+			context.unbind( origSelector );
+
+			return this;
+		}
+
+		if ( data === false || jQuery.isFunction( data ) ) {
+			fn = data || returnFalse;
+			data = undefined;
+		}
+
+		types = (types || "").split(" ");
+
+		while ( (type = types[ i++ ]) != null ) {
+			match = rnamespaces.exec( type );
+			namespaces = "";
+
+			if ( match )  {
+				namespaces = match[0];
+				type = type.replace( rnamespaces, "" );
+			}
+
+			if ( type === "hover" ) {
+				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+				continue;
+			}
+
+			preType = type;
+
+			if ( liveMap[ type ] ) {
+				types.push( liveMap[ type ] + namespaces );
+				type = type + namespaces;
+
+			} else {
+				type = (liveMap[ type ] || type) + namespaces;
+			}
+
+			if ( name === "live" ) {
+				// bind live handler
+				for ( var j = 0, l = context.length; j < l; j++ ) {
+					jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+				}
+
+			} else {
+				// unbind live handler
+				context.unbind( "live." + liveConvert( type, selector ), fn );
+			}
+		}
+
+		return this;
+	};
+});
+
+function liveHandler( event ) {
+	var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+		elems = [],
+		selectors = [],
+		events = jQuery._data( this, "events" );
+
+	// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
+	if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
+		return;
+	}
+
+	if ( event.namespace ) {
+		namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+	}
+
+	event.liveFired = this;
+
+	var live = events.live.slice(0);
+
+	for ( j = 0; j < live.length; j++ ) {
+		handleObj = live[j];
+
+		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+			selectors.push( handleObj.selector );
+
+		} else {
+			live.splice( j--, 1 );
+		}
+	}
+
+	match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+	for ( i = 0, l = match.length; i < l; i++ ) {
+		close = match[i];
+
+		for ( j = 0; j < live.length; j++ ) {
+			handleObj = live[j];
+
+			if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
+				elem = close.elem;
+				related = null;
+
+				// Those two events require additional checking
+				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+					event.type = handleObj.preType;
+					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+
+					// Make sure not to accidentally match a child element with the same selector
+					if ( related && jQuery.contains( elem, related ) ) {
+						related = elem;
+					}
+				}
+
+				if ( !related || related !== elem ) {
+					elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+				}
+			}
+		}
+	}
+
+	for ( i = 0, l = elems.length; i < l; i++ ) {
+		match = elems[i];
+
+		if ( maxLevel && match.level > maxLevel ) {
+			break;
+		}
+
+		event.currentTarget = match.elem;
+		event.data = match.handleObj.data;
+		event.handleObj = match.handleObj;
+
+		ret = match.handleObj.origHandler.apply( match.elem, arguments );
+
+		if ( ret === false || event.isPropagationStopped() ) {
+			maxLevel = match.level;
+
+			if ( ret === false ) {
+				stop = false;
+			}
+			if ( event.isImmediatePropagationStopped() ) {
+				break;
+			}
+		}
+	}
+
+	return stop;
+}
+
+function liveConvert( type, selector ) {
+	return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
+}
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.bind( name, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+	
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+	
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+		
+			parts.push( m[1] );
+		
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+				
+				set = posProcess( selector, set );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+		var match,
+			type = Expr.order[i];
+		
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			var left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( var type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				var found, item,
+					filter = Expr.filter[ type ],
+					left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							var pass = not ^ !!found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+			
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+			
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+	
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+		
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+			
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					if ( type === "first" ) { 
+						return true; 
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					return true;
+
+				case "nth":
+					var first = match[2],
+						last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+					
+					var doneName = match[0],
+						parent = elem.parentNode;
+	
+					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+						var count = 0;
+						
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						} 
+
+						parent.sizcache = doneName;
+					}
+					
+					var diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+		},
+		
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+	
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+	var ret = "", elem;
+
+	for ( var i = 0; elems[i]; i++ ) {
+		elem = elems[i];
+
+		// Get the text from text nodes and CDATA nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+			ret += elem.nodeValue;
+
+		// Traverse everything else, except comment nodes
+		} else if ( elem.nodeType !== 8 ) {
+			ret += Sizzle.getText( elem.childNodes );
+		}
+	}
+
+	return ret;
+};
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+	
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+				
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+					
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+				
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+						
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+							
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+					
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+		
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+	
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try { 
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+	
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem.sizcache = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+			
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem.sizcache = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833) 
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && ( typeof selector === "string" ?
+			jQuery.filter( selector, this ).length > 0 :
+			this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+		
+		// Array
+		if ( jQuery.isArray( selectors ) ) {
+			var match, selector,
+				matches = {},
+				level = 1;
+
+			if ( cur && selectors.length ) {
+				for ( i = 0, l = selectors.length; i < l; i++ ) {
+					selector = selectors[i];
+
+					if ( !matches[ selector ] ) {
+						matches[ selector ] = POS.test( selector ) ?
+							jQuery( selector, context || this.context ) :
+							selector;
+					}
+				}
+
+				while ( cur && cur.ownerDocument && cur !== context ) {
+					for ( selector in matches ) {
+						match = matches[ selector ];
+
+						if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
+							ret.push({ selector: selector, elem: cur, level: level });
+						}
+					}
+
+					cur = cur.parentNode;
+					level++;
+				}
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( elem.parentNode.firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until ),
+			// The variable 'args' was introduced in
+			// https://github.com/jquery/jquery/commit/52a0238
+			// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
+			// http://code.google.com/p/v8/issues/detail?id=1050
+			args = slice.call(arguments);
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, args.join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return (elem === qualifier) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+	});
+}
+
+
+
+
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	};
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		return this.each(function() {
+			jQuery( this ).wrapAll( html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery(arguments[0]);
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery(arguments[0]).toArray() );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnocache.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || (l > 1 && i < lastIndex) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var internalKey = jQuery.expando,
+		oldData = jQuery.data( src ),
+		curData = jQuery.data( dest, oldData );
+
+	// Switch to use the internal data object, if it exists, for the next
+	// stage of data copying
+	if ( (oldData = oldData[ internalKey ]) ) {
+		var events = oldData.events;
+				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
+
+		if ( events ) {
+			delete curData.handle;
+			curData.events = {};
+
+			for ( var type in events ) {
+				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+				}
+			}
+		}
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc;
+
+  // nodes may contain either an explicit document object,
+  // a jQuery collection or context object.
+  // If nodes[0] contains a valid object to assign to doc
+  if ( nodes && nodes[0] ) {
+    doc = nodes[0].ownerDocument || nodes[0];
+  }
+
+  // Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ args[0] ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = (i > 0 ? this.clone(true) : this).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( "getElementsByTagName" in elem ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( "querySelectorAll" in elem ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	if ( jQuery.nodeName( elem, "input" ) ) {
+		fixDefaultChecked( elem );
+	} else if ( "getElementsByTagName" in elem ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var clone = elem.cloneNode(true),
+				srcElements,
+				destElements,
+				i;
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName
+			// instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType;
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [], j;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div");
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ] && cache[ id ][ internalKey ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWH( elem, name, extra );
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				return val;
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat( value );
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				var ret;
+				jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						ret = curCSS( elem, "margin-right", "marginRight" );
+					} else {
+						ret = elem.style.marginRight;
+					}
+				});
+				return ret;
+			}
+		};
+	}
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+			return undefined;
+		}
+
+		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
+			style = elem.style;
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+			// Remember the original values
+			left = style.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : (ret || 0);
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		which = name === "width" ? cssWidth : cssHeight;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			jQuery.each( which, function() {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+				}
+			});
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ] || 0;
+	}
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		jQuery.each( which, function() {
+			val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+			}
+		});
+	}
+
+	return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+	
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for(; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for(; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.bind( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery._Deferred(),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.done;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					jQuery.error( e );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			});
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for( key in s.converters ) {
+				if( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+		( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[i];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = elem.style.display = "";
+					}
+
+					// Set elements which have been overridden with display: none
+					// in a stylesheet to whatever the default browser style is
+					// for such an element
+					if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+						jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[i];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data(elem, "olddisplay") || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				if ( this[i].style ) {
+					var display = jQuery.css( this[i], "display" );
+
+					if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
+						jQuery._data( this[i], "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed(speed, easing, callback);
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		return this[ optall.queue === false ? "each" : "queue" ](function() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p,
+				display, e,
+				parts, start, end, unit;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			for ( p in prop ) {
+
+				// property name normalization
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				val = prop[ name ];
+
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height
+					// animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+						if ( !jQuery.support.inlineBlockNeedsLayout ) {
+							this.style.display = "inline-block";
+
+						} else {
+							display = defaultDisplay( this.nodeName );
+
+							// inline-level elements accept inline-block;
+							// block-level elements need to be inline with layout
+							if ( display === "inline" ) {
+								this.style.display = "inline-block";
+
+							} else {
+								this.style.display = "inline";
+								this.style.zoom = 1;
+							}
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test(val) ) {
+					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ((end || 1) / e.cur()) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		});
+	},
+
+	stop: function( clearQueue, gotoEnd ) {
+		if ( clearQueue ) {
+			this.queue([]);
+		}
+
+		this.each(function() {
+			var timers = jQuery.timers,
+				i = timers.length;
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+			while ( i-- ) {
+				if ( timers[i].elem === this ) {
+					if (gotoEnd) {
+						// force the next step to be the last
+						timers[i](true);
+					}
+
+					timers.splice(i, 1);
+				}
+			}
+		});
+
+		// start the next in the queue if the last step wasn't forced
+		if ( !gotoEnd ) {
+			this.dequeue();
+		}
+
+		return this;
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show", 1),
+	slideUp: genFx("hide", 1),
+	slideToggle: genFx("toggle", 1),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
+
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue !== false ) {
+				jQuery.dequeue( this );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.start = from;
+		this.end = to;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+		this.now = this.start;
+		this.pos = this.state = 0;
+
+		function t( gotoEnd ) {
+			return self.step(gotoEnd);
+		}
+
+		t.elem = this.elem;
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any
+		// flash of content
+		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom(this.cur(), 0);
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options,
+			i, n;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( i in options.animatedProperties ) {
+				if ( options.animatedProperties[i] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function (index, value) {
+						elem.style[ "overflow" + value ] = options.overflow[index];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery(elem).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( var p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[p] );
+					}
+				}
+
+				// Execute the complete function
+				options.complete.call( elem );
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ((this.end - this.start) * this.pos);
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
+			if ( !timers[i]() ) {
+				timers.splice(i--, 1);
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		jQuery.offset.initialize();
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+	initialize: function() {
+		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+		container.innerHTML = html;
+		body.insertBefore( container, body.firstChild );
+		innerDiv = container.firstChild;
+		checkDiv = innerDiv.firstChild;
+		td = innerDiv.nextSibling.firstChild.firstChild;
+
+		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+		checkDiv.style.position = "fixed";
+		checkDiv.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+		checkDiv.style.position = checkDiv.style.top = "";
+
+		innerDiv.style.overflow = "hidden";
+		innerDiv.style.position = "relative";
+
+		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+		body.removeChild( container );
+		jQuery.offset.initialize = jQuery.noop;
+	},
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		jQuery.offset.initialize();
+
+		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if (options.top != null) {
+			props.top = (options.top - curOffset.top) + curTop;
+		}
+		if (options.left != null) {
+			props.left = (options.left - curOffset.left) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function( val ) {
+		var elem, win;
+
+		if ( val === undefined ) {
+			elem = this[ 0 ];
+
+			if ( !elem ) {
+				return null;
+			}
+
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+
+		// Set the scroll offset
+		return this.each(function() {
+			win = getWindow( this );
+
+			if ( win ) {
+				win.scrollTo(
+					!i ? val : jQuery( win ).scrollLeft(),
+					 i ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				this[ method ] = val;
+			}
+		});
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem && elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem && elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ],
+				body = elem.document.body;
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				body && body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNaN( ret ) ? orig : ret;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+})(window);
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/madcat.sh
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/madcat.sh	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/madcat.sh	(revision 28388)
@@ -0,0 +1,5 @@
+#!/usr/bin/env sh
+
+# Concatenates all the JSMad sources into a single .js file
+
+cat src/mad.js src/rq_table.js src/imdct_s.js src/huffman.js src/bit.js src/stream.js src/layer3.js src/frame.js src/synth.js src/arraybuffer/bytestream.js src/arraybuffer/filestream.js src/arraybuffer/substream.js src/arraybuffer/arraystream.js src/arraybuffer/ajaxstream.js src/binarystring/bytestream.js src/binarystring/filestream.js src/binarystring/substream.js src/binarystring/stringstream.js src/binarystring/ajaxstream.js src/id3v22stream.js src/id3v23stream.js src/mp3file.js src/player.js
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/sink.min.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/sink.min.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/sink.min.js	(revision 28388)
@@ -0,0 +1,1 @@
+(function(a){function b(a,c,d,e){var f=b.sinks,g;for(g in f)if(f.hasOwnProperty(g)&&f[g].enabled)try{return new f[g](a,c,d,e)}catch(h){}throw b.Error(2)}function c(){var a;for(a in c.prototype)c.prototype.hasOwnProperty(a)&&(this[a]=c.prototype[a]);this._listeners={}}function d(a){if(!d.hasOwnProperty(a))throw d(1);if(!(this instanceof d))return new d(a);var b;for(b in d[a])d[a].hasOwnProperty(b)&&(this[b]=d[a][b]);this.code=a}function e(a){this.boundTo=a,this.buffers=[],a.activeRecordings.push(this)}function f(){}function g(a,c,d,e){d=d||c.prototype,c.prototype=new b.SinkClass,c.prototype.type=a,c.enabled=!e;for(e in d)d.hasOwnProperty(e)&&(c.prototype[e]=d[e]);g[a]=c}c.prototype={_listeners:null,emit:function(a,b){if(this._listeners[a])for(var c=0;c<this._listeners[a].length;c++)this._listeners[a][c].apply(this,b);return this},on:function(a,b){return this._listeners[a]=this._listeners[a]||[],this._listeners[a].push(b),this},off:function(a,b){if(this._listeners[a]){if(!b)return delete this._listeners[a],this;for(var c=0;c<this._listeners[a].length;c++)this._listeners[a][c]===b&&this._listeners[a].splice(c--,1);this._listeners[a].length||delete this._listeners[a]}return this}},b.EventEmitter=c,d.prototype=new Error,d.prototype.toString=function(){return"SinkError 0x"+this.code.toString(16)+": "+this.message},d[1]={message:"No such error code.",explanation:"The error code does not exist."},d[2]={message:"No audio sink available.",explanation:"The audio device may be busy, or no supported output API is available for this browser."},d[16]={message:"Buffer underflow.",explanation:"Trying to recover..."},d[17]={message:"Critical recovery fail.",explanation:"The buffer underflow has reached a critical point, trying to recover, but will probably fail anyway."},d[18]={message:"Buffer size too large.",explanation:"Unable to allocate the buffer due to excessive length, please try a smaller buffer. Buffer size should probably be smaller than the sample rate."},b.Error=d,e.prototype={add:function(a){this.buffers.push(a)},clear:function(){this.buffers=[]},stop:function(){var a=this.boundTo.activeRecordings,b;for(b=0;b<a.length;b++)a[b]===this&&a.splice(b--,1)},join:function(){var a=0,b=0,c=this.buffers,d,e,f,g=c.length;for(f=0;f<g;f++)a+=c[f].length;d=new Float32Array(a);for(f=0;f<g;f++){for(e=0;e<c[f].length;e++)d[b+e]=c[f][e];b+=c[f].length}return d}},b.SinkClass=f,f.prototype={sampleRate:44100,channelCount:2,bufferSize:4096,writePosition:0,writeMode:"async",channelMode:"interleaved",previousHit:0,ringBuffer:null,ringOffset:0,start:function(a,c,d,e){this.channelCount=isNaN(c)||c===null?this.channelCount:c,this.bufferSize=isNaN(d)||d===null?this.bufferSize:d,this.sampleRate=isNaN(e)||e===null?this.sampleRate:e,this.readFn=a,this.activeRecordings=[],this.previousHit=+(new Date),this.asyncBuffers=[],this.syncBuffers=[],b.EventEmitter.call(this)},process:function(a,c){this.ringBuffer&&(this.channelMode==="interleaved"?this.ringSpin:this.ringSpinInterleaved).apply(this,arguments),this.writeBuffersSync.apply(this,arguments);if(this.channelMode==="interleaved")this.readFn&&this.readFn.apply(this,arguments),this.emit("audioprocess",arguments);else{var d=b.deinterleave(a,this.channelCount),e=[d].concat([].slice.call(arguments,1));this.readFn&&this.readFn.apply(this,e),this.emit("audioprocess",e),b.interleave(d,this.channelCount,a)}this.writeBuffersAsync.apply(this,arguments),this.recordData.apply(this,arguments),this.previousHit=+(new Date),this.writePosition+=a.length/c},record:function(){return new e(this)},recordData:function(a){var b=this.activeRecordings,c,d=b.length;for(c=0;c<d;c++)b[c].add(a)},writeBuffersAsync:function(a){var b=this.asyncBuffers,c=a.length,d,e,f,g,h;if(b)for(f=0;f<b.length;f++){d=b[f],e=d.b.length,h=d.d,d.d-=Math.min(h,c);for(g=0;g+h<c&&g<e;g++)a[g+h]+=d.b[g];d.b=d.b.subarray(g+h),f>=e&&b.splice(f--,1)}},writeBuffersSync:function(a){var b=this.syncBuffers,c=a.length,d=0,e=0;for(;d<c&&b.length;d++){a[d]+=b[0][e];if(b[0].length<=e){b.splice(0,1),e=0;continue}e++}b.length&&(b[0]=b[0].subarray(e))},writeBufferAsync:function(a,c){a=this.mode==="deinterleaved"?b.interleave(a,this.channelCount):a;var d=this.asyncBuffers;return d.push({b:a,d:isNaN(c)?~~((+(new Date)-this.previousHit)/1e3*this.sampleRate):c}),d.length},writeBufferSync:function(a){a=this.mode==="deinterleaved"?b.interleave(a,this.channelCount):a;var c=this.syncBuffers;return c.push(a),c.length},writeBuffer:function(){return this[this.writeMode==="async"?"writeBufferAsync":"writeBufferSync"].apply(this,arguments)},getSyncWriteOffset:function(){var a=this.syncBuffers,b=0,c;for(c=0;c<a.length;c++)b+=a[c].length;return b},getPlaybackTime:function(){return this.writePosition-this.bufferSize},ringSpin:function(a){var b=this.ringBuffer,c=a.length,d=b.length,e=this.ringOffset,f;for(f=0;f<c;f++)a[f]+=b[e],e=(e+1)%d;this.ringOffset=e},ringSpinDeinterleaved:function(a){var b=this.ringBuffer,c=a.length,d=b.length,e=b[0].length,f=d*e,g=this.ringOffset,h,i;for(h=0;h<c;h+=d){for(i=0;i<d;i++)a[h+i]+=b[i][g];g=(g+1)%e}this.ringOffset=i}},g("moz",function(){function l(){if(d){f=e.mozWriteAudio(d),c+=f;if(f<d.length)return d=d.subarray(f),d;d=null}g=e.mozCurrentSampleOffset(),h=Number(g+(j!==g?a.bufferSize:a.preBufferSize)*a.channelCount-c),g===j&&a.emit("error",[b.Error(16)]);if(h>0||j===g){try{i=new Float32Array(j===g?a.preBufferSize*a.channelCount:a.forceBufferSize?h<a.bufferSize*2?a.bufferSize*2:h:h)}catch(k){a.emit("error",[b.Error(18)]),a.kill();return}a.process(i,a.channelCount),f=a._audio.mozWriteAudio(i),f<i.length&&(d=i.subarray(f)),c+=f}j=g}var a=this,c=0,d=null,e=new Audio,f,g,h,i,j,k;a.start.apply(a,arguments),a.preBufferSize=isNaN(arguments[4])||arguments[4]===null?this.preBufferSize:arguments[4],e.mozSetup(a.channelCount,a.sampleRate),this._timers=[],this._timers.push(b.doInterval(function(){+(new Date)-a.previousHit>2e3&&(a._audio=e=new Audio,e.mozSetup(a.channelCount,a.sampleRate),c=0,a.emit("error",[b.Error(17)]))},1e3)),this._timers.push(b.doInterval(l,a.interval)),a._bufferFill=l,a._audio=e},{bufferSize:24576,preBufferSize:24576,forceBufferSize:!1,interval:20,kill:function(){while(this._timers.length)this._timers[0](),this._timers.splice(0,1);this.emit("kill")},getPlaybackTime:function(){return this._audio.mozCurrentSampleOffset()/this.channelCount}});var h=[];g("webkit",function(a,c,d,e){function k(a){var b=a.outputBuffer,c=b.numberOfChannels,d,e,g=b.length,h=b.size,i=new Array(c),j=new Float32Array(g*c),k;for(d=0;d<c;d++)i[d]=b.getChannelData(d);f.process(j,f.channelCount);for(d=0;d<g;d++)for(e=0;e<c;e++)i[e][d]=j[d*f.channelCount+e]}var f=this,i=new(window.AudioContext||webkitAudioContext),j=i.createJavaScriptNode(d,0,c);f.start.apply(f,arguments),g.webkit.forceSampleRate&&f.sampleRate!==i.sampleRate?k=function(c){var d=c.outputBuffer,e=d.numberOfChannels,g,h,j=d.length,k=d.size,l=new Array(e),m=new Float32Array(Math.floor(j*f.sampleRate/i.sampleRate)*e),n;for(g=0;g<e;g++)l[g]=d.getChannelData(g);f.process(m,f.channelCount),m=b.deinterleave(m,f.channelCount);for(h=0;h<e;h++){n=b.resample(m[h],f.sampleRate,i.sampleRate);for(g=0;g<j;g++)l[h][g]=n[g]}}:f.sampleRate=i.sampleRate,j.onaudioprocess=k,j.connect(i.destination),f._context=i,f._node=j,f._callback=k,h.push(j)},{kill:function(){this._node.disconnect(0);for(var a=0;a<h.length;a++)h[a]===this._node&&h.splice(a--,1);this._node=this._context=null,this.kill(),this.emit("kill")},getPlaybackTime:function(){return this._context.currentTime*this.sampleRate}}),g.webkit.fix82795=h,g("dummy",function(){function c(){var b=new Float32Array(a.bufferSize*a.channelCount);a.process(b,a.channelCount)}var a=this;a.start.apply(a,arguments),a._kill=b.doInterval(c,a.bufferSize/a.sampleRate*1e3),a._callback=c},{kill:function(){this._kill(),this.emit("kill")}},!0),b.sinks=b.devices=g,b.Recording=e,function(){function d(b){var e=null,f,g;try{return g=new a,g.append(b),f=c.createObjectURL(g.getBlob()),e=new Worker(f),e._terminate=e.terminate,e._url=f,g=null,e.terminate=function(){this._terminate,c.revokeObjectURL(this._url)},d.type="blob",e}catch(h){}try{return e=new Worker("data:text/javascript;base64,"+btoa(b)),d.type="data",e}catch(h){}return e}var a=typeof window=="undefined"?undefined:window.MozBlobBuilder||window.WebKitBlobBuilder||window.MSBlobBuilder||window.OBlobBuilder||window.BlobBuilder,c=typeof window=="undefined"?undefined:window.MozURL||window.webkitURL||window.MSURL||window.OURL||window.URL;d.ready=d.working=!1,b.EventEmitter.call(d),d.test=function(){function c(b){if(d.ready)return;d.ready=!0,d.working=b,d.emit("ready",[b]),d.off("ready"),b&&a&&a.terminate(),a=null}var a=d("this.onmessage=function(e){postMessage(e.data)}"),b="inlineWorker";d.ready=d.working=!1,a?(a.onmessage=function(a){c(a.data===b)},a.postMessage(b),setTimeout(function(){c(!1)},1e3)):c(!1)},b.inlineWorker=d,d.test()}(),b.doInterval=function(a,c){function f(f){b.inlineWorker.working&&!f?(d=b.inlineWorker('setInterval(function(){ postMessage("tic"); }, '+c+");"),d.onmessage=function(){a()},e=function(){d.terminate()}):(d=setInterval(a,c),e=function(){clearInterval(d)})}var d,e;return b.doInterval.backgroundWork||b.devices.moz.backgroundWork?b.inlineWorker.ready?f():b.inlineWorker.on("ready",function(){f()}):f(!0),function(){e?e():b.inlineWorker.ready||b.inlineWorker.on("ready",function(){e&&e()})}},b.doInterval.backgroundWork=!0,function(){function a(c,d){return c&&d?a[c]=d:c&&a[c]instanceof Function&&(b.interpolate=a[c]),a[c]}b.interpolation=a,a("linear",function(a,b){var c=Math.floor(b),d=c+1,e=b-c;return d=d<a.length?d:0,a[c]*(1-e)+a[d]*e}),a("nearest",function(a,b){return b>=a.length-.5?a[0]:a[Math.round(b)]}),a("linear")}(),b.resample=function(a,c,d,e,f){var g=arguments.length,h=g===2?c:g===3?c/d:e/c*f/d,i=a.length,j=Math.ceil(i/h),k=new Float32Array(j),l,m;for(l=0,m=0;l<i;l+=h)k[m++]=b.interpolate(a,l);return k},b.deinterleave=function(a,b){var c=a.length,d=c/b,e=[],f,g;for(f=0;f<b;f++){e[f]=new Float32Array(d);for(g=0;g<d;g++)e[f][g]=a[g*b+f]}return e},b.interleave=function(a,b,c){b=b||a.length;var d=a[0].length,e=a.length,f,g;c=c||new Float32Array(d*b);for(f=0;f<e;f++)for(g=0;g<d;g++)c[f+g*b]=a[f][g];return c},b.mix=function(a){var b=[].slice.call(arguments,1),c,d,e;for(e=0;e<b.length;e++){c=Math.max(a.length,b[e].length);for(d=0;d<c;d++)a[d]+=b[e][d]}return a},b.resetBuffer=function(a){var b=a.length,c;for(c=0;c<b;c++)a[c]=0;return a},b.clone=function(a,b){var c=a.length,d;b=b||new Float32Array(c);for(d=0;d<c;d++)b[d]=a[d];return b},b.createDeinterleaved=function(a,b){var c=new Array(b),d;for(d=0;d<b;d++)c[d]=new Float32Array(a);return c},a.Sink=b})(function(){return this}());
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/uglify
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/uglify	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/scripts/uglify	(revision 28388)
@@ -0,0 +1,65 @@
+#!/usr/bin/env node
+
+var sys    = require( 'sys' ),
+    path   = require( 'path' ),
+    fs     = require( 'fs' ),
+    uglify = require( 'uglify-js' );
+
+var root  = path.dirname( __dirname ) + '/',
+    files = [
+        'src/mad.js',
+        'src/rq_table.js',
+        'src/imdct_s.js',
+        'src/huffman.js',
+        'src/bit.js',
+        'src/stream.js',
+        'src/layer3.js',
+        'src/frame.js',
+        'src/synth.js',
+        'src/bytestream.js',
+        'src/filestream.js',
+        'src/substream.js',
+        'src/id3v22stream.js',
+        'src/id3v23stream.js',
+        'src/mp3file.js',
+        'src/ajaxstream.js',
+        'src/stringstream.js',
+        'src/player.js'
+    ],
+    i,
+    file,
+    code = '';
+    
+for( i = 0; i < files.length; i++ ) {
+    
+    console.log( 'Reading ' + files[ i ] + '...' );
+    
+    file  = root + files[ i ];
+    code += '\n/* File: ' + files[ i ] + ' */\n';
+    code += fs.readFileSync( file, 'utf-8' );
+}
+
+try {
+    
+    console.log( 'UglifyJS: Parsing the source code...' );
+    var ast = uglify.parser.parse( code );
+    
+    console.log( 'UglifyJS: Mangling the code...' );
+    ast = uglify.uglify.ast_mangle( ast ); // get a new AST with mangled names
+    
+    console.log( 'UglifyJS: Squeezing the code...' );
+    ast = uglify.uglify.ast_squeeze( ast ); // get an AST with compression optimizations
+    
+    console.log( 'UglifyJS: Generating the code...' );
+    var finalCode = uglify.uglify.gen_code( ast ); // compressed code here
+    
+    console.log( 'Writing the code into src/jsmad.min.js...' );
+    fs.writeFileSync( root + 'src/jsmad.min.js', finalCode, 'utf-8' );
+    
+    console.log( 'Success! The uglified source code has been stored into src/jsmad.min.js.' );
+    
+} catch( e )
+{
+    console.error( 'Error: something went wrong.' );
+    console.error( e.toString() );
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/ajaxstream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/ajaxstream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/ajaxstream.js	(revision 28388)
@@ -0,0 +1,159 @@
+Mad.ArrayBuffers.AjaxStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function (url) {
+        this.offset = 0;
+
+        var request = new XMLHttpRequest();
+        request.open('GET', url);
+        request.responseType = "arraybuffer";
+        
+        this.request = request;
+        this.amountRead = 0;
+        this.inProgress = true;
+        this.finalAmount = false;
+        this.callbacks = [];
+        this.buffer = new Uint8Array(0);
+        
+        var self = this;
+        
+        var iteration = 0;
+        
+        var ochange = function () {
+            console.log("ochange! callbacks.length = " + self.callbacks.length + ", iteration = " + iteration);
+            console.log("readyState = " + request.readyState + ", amountRead = " + self.amountRead + ", contentLength = " + self.contentLength);
+            iteration += 1;
+            if ((self.callbacks.length > 0 && iteration % 32 === 0) || iteration % 256 === 0) {
+                self.updateBuffer();
+                
+                var newCallbacks = [];
+                
+                for (var i = 0; i < self.callbacks.length; i++) {
+                    console.log("Handling callback " + i);
+                    var callback = self.callbacks[i];
+                    
+                    if (callback[0] < self.amountRead) {
+                        try {
+                                callback[1]();
+                        } catch (e) {
+                                console.log(e);
+                        }
+                    } else {
+                        newCallbacks.push(callback);
+                    }
+                }
+                
+                self.callbacks = newCallbacks;
+            }
+            
+            if (request.readyState === 4) {
+                self.updateBuffer();
+                self.amountRead = self.contentLength;
+                for (var i = 0; i < self.callbacks.length; i++) {
+                    var callback = self.callbacks[i];
+                    callback[1]();
+                }
+                
+                window.clearInterval(self.timer);
+                
+                self.inProgress = false;
+            }
+        }
+        
+        request.onprogress = ochange;
+        
+        this.timer = window.setInterval(ochange, 250);
+        
+        request.send(null);
+    },
+
+    updateBuffer: function() {
+        console.log("updateBuffer!");
+        if (!this.finalAmount && this.request.response) {
+            this.arrayBuffer = this.request.response;
+            this.buffer = new Uint8Array(this.arrayBuffer);
+            this.amountRead = this.buffer.length;
+            console.log("typeof buffer = " + typeof(this.arrayBuffer) + ", amountRead = " + this.amountRead);
+            this.contentLength = this.request.getResponseHeader('Content-Length');
+            if(!this.contentLength) {
+                // if the server doesn't send a Content-Length Header, just use amountRead instead
+                // it's less precise at first, but once everything is buffered it becomes accurate.
+                this.contentLength = this.amountRead;
+            }
+        
+            if (!this.inProgress) {
+                this.finalAmount = true;
+            }
+            
+            return true;
+        } else {
+            return false;
+        }
+    },
+
+    absoluteAvailable: function(n, updated) {
+        if (n > this.amountRead) {
+            if (updated) {
+                throw new Error("buffer underflow with absoluteAvailable!");
+            } else if (this.updateBuffer()) {
+                return this.absoluteAvailable(n, true);
+            } else {
+                return false;
+            }
+        } else {
+            return true;
+        }
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+
+    read: function(n) {
+        var result = this.peek(n);
+        this.seek(n);
+        return result;
+    },
+
+    peek: function(n) {
+        if (this.available(n)) {
+            var offset = this.offset;
+            
+            var result = this.get(offset, n);
+            
+            return result;
+        } else {
+            throw new Error("buffer underflow with peek!");
+        }
+    },
+
+    get: function(offset, length) {
+        if (offset + length < this.amountRead) {
+            var subarr = this.buffer.subarray(offset, offset + length);
+            return subarr;
+        } else {
+            throw 'TODO: THROW GET ERROR!';
+        }
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.buffer[offset];
+    },
+
+    substream: function (offset, length) {
+        return new Mad.ArrayBuffers.SubStream(this, offset, length);
+    },
+
+    requestAbsolute: function(n, callback) {
+        console.log("requestAbsolute(" + n + ", ...), amountRead = " + this.amountRead);
+        if (n < this.amountRead) {
+            console.log("all fine, calling callback :)");
+            callback();
+        } else {
+            console.log("pushing callback on queue");
+            this.callbacks.push([n, callback]);
+        }
+    },
+
+    request: function(n, callback) {
+        this.requestAbsolute(this.offset + n, callback);
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/arraystream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/arraystream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/arraystream.js	(revision 28388)
@@ -0,0 +1,55 @@
+
+Mad.ArrayBuffers.ArrayStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function (buffer) {
+        this.offset        = 0;
+        this.buffer        = buffer;
+        this.amountRead    = this.buffer.length;
+        this.contentLength = this.buffer.length;
+        this.length = this.amountRead;
+    },
+
+    substream: function (offset, length) {
+        return new Mad.ArrayBuffers.SubStream(this, offset, length);
+    },
+
+    absoluteAvailable: function(n, updated) {
+        return n < this.amountRead;
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.buffer[offset];
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+
+    read: function(n) {
+        var result = this.peek(n);
+        
+        this.seek(n);
+        
+        return result;
+    },
+
+    peek: function(n) {
+        if (this.available(n)) {
+            var offset = this.offset;
+            
+            var result = this.get(offset, n);
+            
+            return result;
+        } else {
+            throw 'TODO: THROW PEEK ERROR!';
+        }
+    },
+
+    get: function(offset, length) {
+        if (offset + length < this.contentLength) {
+            var subarr = this.buffer.subarray(offset, offset + length);
+            return subarr;
+        } else {
+            throw 'TODO: THROW GET ERROR!';
+        }
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/bytestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/bytestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/bytestream.js	(revision 28388)
@@ -0,0 +1,149 @@
+
+Mad.ArrayBuffers.ByteStream = Class.extend({
+    available: function(n) {
+        return this.absoluteAvailable(this.offset + n);
+    },
+
+    strEquals: function (offset, string) {
+        for (var i = 0; i < string.length; i++) {
+            if(this.getU8(offset + i, false) != string.charCodeAt(i)) return false;
+        }
+        return true;
+    },
+
+    getU8: function(offset, bigEndian) {
+        var bytes = this.get(offset, 1);
+        throw 'Wtf bytestream?'
+        return bytes[0];
+    },
+
+    getU16: function(offset, bigEndian) {
+        var bytes = this.get(offset, 2);
+        if (!bigEndian) {
+            bytes = bytes.reverse();
+        }
+        return (bytes[0] << 8) | bytes[1];
+    },
+
+    getU24: function(offset, bigEndian) {
+        var bytes = this.get(offset, 3);
+        if (!bigEndian) {
+            bytes = bytes.reverse();
+        }
+        return (bytes[0] << 16) | (bytes[1] << 8) | bytes[2];
+    },
+
+    getU32: function(offset, bigEndian) {
+        var bytes = this.get(offset, 4);
+        if (!bigEndian) {
+            bytes = bytes.reverse();
+        }
+        return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
+    },
+
+    getI8: function(offset, bigEndian) {
+        return this.getU8(offset, bigEndian) - 128;            // 2 ** 7
+    },
+
+    getI16: function(offset, bigEndian) {
+        return this.getU16(offset, bigEndian) - 65536;         // 2 ** 15
+    },
+
+    getI32: function(offset, bigEndian) {
+        return this.getU32(offset, bigEndian) - 2147483648;    // 2 ** 31
+    },
+
+    getSyncInteger: function(offset) {
+        var bytes = this.get(offset, 4);
+        return (bytes[0] << 21) | (bytes[1] << 14) | (bytes[2] << 7) | bytes[3];
+    },
+
+    peekU8: function(bigEndian) {
+        return this.getU8(this.offset, bigEndian);
+    },
+
+    peekU16: function(bigEndian) {
+        return this.getU16(this.offset, bigEndian);
+    },
+
+    peekU24: function(bigEndian) {
+        return this.getU24(this.offset, bigEndian);
+    },
+
+    peekU32: function(bigEndian) {
+        return this.getU32(this.offset, bigEndian);
+    },
+
+    peekI8: function(bigEndian) {
+        return this.getI8(this.offset, bigEndian);
+    },
+
+    peekI16: function(bigEndian) {
+        return this.getI16(this.offset, bigEndian);
+    },
+
+    peekI32: function(bigEndian) {
+        return this.getI32(this.offset, bigEndian);
+    },
+
+    peekSyncInteger: function() {
+        return this.getSyncInteger(this.offset);
+    },
+
+    readU8: function(bigEndian) {
+        var result = this.peekU8(bigEndian);
+        this.seek(1);
+        return result;
+    },
+
+    readU16: function(bigEndian) {
+        var result = this.peekU16(bigEndian);
+        this.seek(2);
+        return result;
+    },
+
+    readU24: function(bigEndian) {
+        var result = this.peekU24(bigEndian);
+        this.seek(3);
+        return result;
+    },
+
+    readU32: function(bigEndian) {
+        var result = this.peekU32(bigEndian);
+        this.seek(4);
+        return result;
+    },
+
+    readI8: function(bigEndian) {
+        var result = this.peekI8(bigEndian);
+        this.seek(1);
+        return result;
+    },
+
+    readI16: function(bigEndian) {
+        var result = this.peekI16(bigEndian);
+        this.seek(2);
+        return result;
+    },
+
+    readI32: function(bigEndian) {
+        var result = this.peekI32(bigEndian);
+        this.seek(4);
+        return result;
+    },
+
+    readSyncInteger: function() {
+        var result = this.getSyncInteger(this.offset);
+        this.seek(4);
+        return result;
+    },
+
+    readAsString: function(n) {
+        var arr = this.read(n);
+        var str = "";
+        for (var i = 0; i < n; i++) {
+            str += String.fromCharCode(arr[i]);
+        }
+        return str;
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/filestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/filestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/filestream.js	(revision 28388)
@@ -0,0 +1,75 @@
+
+Mad.ArrayBuffers.FileStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function (file, callback) {
+        this.offset        = 0;
+
+        // Check for the various File API support.
+        if (window.File && window.FileReader && window.FileList && window.Blob) {
+            // Great success! All the File APIs are supported.
+        } else {
+            alert('The File APIs are not fully supported in this browser.');
+            return null;
+        } 
+        
+        var self = this;
+        var reader = new FileReader();
+        reader.onload = function () {
+          self.buffer        = new Uint8Array(reader.result);
+          self.amountRead    = self.buffer.length;
+          self.contentLength = self.buffer.length;
+          self.length = self.amountRead;
+          
+          callback(self);
+        }
+        
+        reader.onerror = function () {
+            console.log("Error loading file " + file);
+        }
+
+        // Only supported from Firefox 7 and Chrome 'Something'
+        reader.readAsArrayBuffer(file);
+    },
+
+    substream: function (offset, length) {
+        return new Mad.ArrayBuffers.SubStream(this, offset, length);
+    },
+
+    absoluteAvailable: function(n, updated) {
+        return n < this.amountRead;
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.buffer[offset];
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+
+    read: function(n) {
+        var result = this.peek(n);
+        this.seek(n);
+        return result;
+    },
+
+    peek: function(n) {
+        if (this.available(n)) {
+            var offset = this.offset;
+            
+            var result = this.get(offset, n);
+            
+            return result;
+        } else {
+            throw 'TODO: THROW PEEK ERROR!';
+        }
+    },
+
+    get: function(offset, length) {
+        if (offset + length < this.contentLength) {
+            var subarr = this.buffer.subarray(offset, offset + length);
+            return subarr;
+        } else {
+            throw 'TODO: THROW GET ERROR!';
+        }
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/substream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/substream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/arraybuffer/substream.js	(revision 28388)
@@ -0,0 +1,59 @@
+
+Mad.ArrayBuffers.SubStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function(stream, offset, length) {
+        this.offset = 0; 
+        this.start = offset;
+        this.parentStream = stream;
+        this.length = length;
+    },
+
+    substream: function (offset, length) {
+        return new Mad.SubStream(this.parentStream, this.start + offset, length);
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.parentStream.getU8(this.start + offset, bigEndian);
+    },
+
+    getU16: function(offset, bigEndian) {
+        return this.parentStream.getU16(this.start + offset, bigEndian);
+    },
+
+    getU32: function(offset, bigEndian) {
+        return this.parentStream.getU32(this.start + offset, bigEndian);
+    },
+
+    absoluteAvailable: function(n) {
+        return this.parentStream.absoluteAvailable(this.start + n);
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+ 
+    read: function(n) {
+        var result = this.peek(n);
+        this.seek(n);
+        return result;
+    },
+               
+    peek: function(n) {
+        return this.get(this.offset, n);
+    },
+
+    get: function(offset, length) {
+        return this.parentStream.get(this.start + offset, length);
+    },
+
+    slice: function(start, end) {
+        return this.parentStream.get(this.start + start, end - start);
+    },
+
+    requestAbsolute: function(n, callback) {
+        this.parentStream.requestAbsolute(this.start + n)
+    },
+
+    request: function(n, callback) {
+        this.parentStream.requestAbsolute(this.start + this.offset + n)
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binaryajax.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binaryajax.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binaryajax.js	(revision 28388)
@@ -0,0 +1,278 @@
+
+/*
+ * Binary Ajax 0.1.10
+ * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/
+ * Licensed under the MPL License [http://www.nihilogic.dk/licenses/mpl-license.txt]
+ */
+
+
+var BinaryFile = function(strData, iDataOffset, iDataLength) {
+    var data = strData;
+    var dataOffset = iDataOffset || 0;
+    var dataLength = 0;
+
+    this.getRawData = function() {
+        return data;
+    }
+
+    if (typeof strData === "string") {
+        dataLength = iDataLength || data.length;
+
+        this.getByteAt = function(iOffset) {
+            return data.charCodeAt(iOffset + dataOffset) & 0xFF;
+        }
+
+        this.getBytesAt = function(iOffset, iLength) {
+            var aBytes = [];
+
+            for (var i = 0; i < iLength; i++) {
+                aBytes[i] = data.charCodeAt((iOffset + i) + dataOffset) & 0xFF
+            };
+
+            return aBytes;
+        }
+    } else if (typeof strData === "unknown") {
+        dataLength = iDataLength || IEBinary_getLength(data);
+
+        this.getByteAt = function(iOffset) {
+            return IEBinary_getByteAt(data, iOffset + dataOffset);
+        }
+
+        this.getBytesAt = function(iOffset, iLength) {
+            return new VBArray(IEBinary_getBytesAt(data, iOffset + dataOffset, iLength)).toArray();
+        }
+    }
+
+    this.getLength = function() {
+        return dataLength;
+    }
+
+    this.getSByteAt = function(iOffset) {
+        var iByte = this.getByteAt(iOffset);
+        if (iByte > 127)
+            return iByte - 256;
+        else
+            return iByte;
+    }
+
+    this.getShortAt = function(iOffset, bBigEndian) {
+        var iShort = bBigEndian ? 
+            (this.getByteAt(iOffset) << 8) + this.getByteAt(iOffset + 1)
+            : (this.getByteAt(iOffset + 1) << 8) + this.getByteAt(iOffset)
+            if (iShort < 0) iShort += 65536;
+        return iShort;
+    }
+    this.getSShortAt = function(iOffset, bBigEndian) {
+        var iUShort = this.getShortAt(iOffset, bBigEndian);
+        if (iUShort > 32767)
+            return iUShort - 65536;
+        else
+            return iUShort;
+    }
+    this.getLongAt = function(iOffset, bBigEndian) {
+        var iByte1 = this.getByteAt(iOffset),
+            iByte2 = this.getByteAt(iOffset + 1),
+            iByte3 = this.getByteAt(iOffset + 2),
+            iByte4 = this.getByteAt(iOffset + 3);
+
+        var iLong = bBigEndian ? 
+            (((((iByte1 << 8) + iByte2) << 8) + iByte3) << 8) + iByte4
+            : (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1;
+        if (iLong < 0) iLong += 4294967296;
+        return iLong;
+    }
+    this.getSLongAt = function(iOffset, bBigEndian) {
+        var iULong = this.getLongAt(iOffset, bBigEndian);
+        if (iULong > 2147483647)
+            return iULong - 4294967296;
+        else
+            return iULong;
+    }
+
+    this.getStringAt = function(iOffset, iLength) {
+        var aStr = [];
+
+        var aBytes = this.getBytesAt(iOffset, iLength);
+        for (var j=0; j < iLength; j++) {
+            aStr[j] = String.fromCharCode(aBytes[j]);
+        }
+        return aStr.join("");
+    }
+
+    this.getCharAt = function(iOffset) {
+        return String.fromCharCode(this.getByteAt(iOffset));
+    }
+    this.toBase64 = function() {
+        return window.btoa(data);
+    }
+    this.fromBase64 = function(strBase64) {
+        data = window.atob(strBase64);
+    }
+}
+
+
+var BinaryAjax = (function() {
+
+        function createRequest() {
+        var oHTTP = null;
+        if (window.ActiveXObject) {
+        oHTTP = new ActiveXObject("Microsoft.XMLHTTP");
+        } else if (window.XMLHttpRequest) {
+        oHTTP = new XMLHttpRequest();
+        }
+        return oHTTP;
+        }
+
+        function getHead(strURL, fncCallback, fncError) {
+        var oHTTP = createRequest();
+        if (oHTTP) {
+        if (fncCallback) {
+        if (typeof(oHTTP.onload) != "undefined") {
+        oHTTP.onload = function() {
+        if (oHTTP.status === "200") {
+        fncCallback(this);
+        } else {
+            if (fncError) fncError();
+        }
+        oHTTP = null;
+        };
+        } else {
+            oHTTP.onreadchange = function() {
+                if (oHTTP.readyState === 4) {
+                    if (oHTTP.status === "200") {
+                        fncCallback(this);
+                    } else {
+                        if (fncError) fncError();
+                    }
+                    oHTTP = null;
+                }
+            };
+        }
+        }
+        oHTTP.open("HEAD", strURL, true);
+        oHTTP.send(null);
+        } else {
+            if (fncError) fncError();
+        }
+        }
+
+        function sendRequest(strURL, fncCallback, fncError, aRange, bAcceptRanges, iFileSize) {
+            var oHTTP = createRequest();
+            if (oHTTP) {
+
+                var iDataOffset = 0;
+                if (aRange && !bAcceptRanges) {
+                    iDataOffset = aRange[0];
+                }
+                var iDataLen = 0;
+                if (aRange) {
+                    iDataLen = aRange[1]-aRange[0]+1;
+                }
+
+                if (fncCallback) {
+                    if (typeof(oHTTP.onload) != "undefined") {
+                        oHTTP.onload = function() {
+                            if (oHTTP.status === "200" || oHTTP.status === "206" || oHTTP.status === "0") {
+                                oHTTP.binaryResponse = new BinaryFile(oHTTP.responseText, iDataOffset, iDataLen);
+                                oHTTP.fileSize = iFileSize || oHTTP.getResponseHeader("Content-Length");
+                                fncCallback(oHTTP);
+                            } else {
+                                if (fncError) fncError();
+                            }
+                            oHTTP = null;
+                        };
+                    } else {
+                        oHTTP.onreadchange = function() {
+                            if (oHTTP.readyState === 4) {
+                                if (oHTTP.status === "200" || oHTTP.status === "206" || oHTTP.status === "0") {
+                                    // IE6 craps if we try to extend the XHR object
+                                    var oRes = {
+status : oHTTP.status,
+         // IE needs responseBody, Chrome/Safari needs responseText
+         binaryResponse : new BinaryFile(
+                 typeof oHTTP.responseBody === "unknown" ? oHTTP.responseBody : oHTTP.responseText, iDataOffset, iDataLen
+                 ),
+         fileSize : iFileSize || oHTTP.getResponseHeader("Content-Length")
+                                    };
+                                    fncCallback(oRes);
+                                } else {
+                                    if (fncError) fncError();
+                                }
+                                oHTTP = null;
+                            }
+                        };
+                    }
+                }
+                oHTTP.open("GET", strURL, true);
+
+                if (oHTTP.overrideMimeType) oHTTP.overrideMimeType('text/plain; charset=x-user-defined');
+
+                if (aRange && bAcceptRanges) {
+                    oHTTP.setRequestHeader("Range", "bytes=" + aRange[0] + "-" + aRange[1]);
+                }
+
+                oHTTP.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 1970 00:00:00 GMT");
+
+                oHTTP.send(null);
+            } else {
+                if (fncError) fncError();
+            }
+        }
+
+        return function(strURL, fncCallback, fncError, aRange) {
+
+            if (aRange) {
+                getHead(
+                        strURL, 
+                        function(oHTTP) {
+                        var iLength = parseInt(oHTTP.getResponseHeader("Content-Length"),10);
+                        var strAcceptRanges = oHTTP.getResponseHeader("Accept-Ranges");
+
+                        var iStart, iEnd;
+                        iStart = aRange[0];
+                        if (aRange[0] < 0) 
+                        iStart += iLength;
+                        iEnd = iStart + aRange[1] - 1;
+
+                        sendRequest(strURL, fncCallback, fncError, [iStart, iEnd], (strAcceptRanges === "bytes"), iLength);
+                        }
+                       );
+
+            } else {
+                sendRequest(strURL, fncCallback, fncError);
+            }
+        }
+
+}());
+
+/*
+   document.write(
+   "<script type='text/vbscript'>\r\n"
+   + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n"
+   + "	IEBinary_getByteAt = AscB(MidB(strBinary,iOffset+1,1))\r\n"
+   + "End Function\r\n"
+   + "Function IEBinary_getLength(strBinary)\r\n"
+   + "	IEBinary_getLength = LenB(strBinary)\r\n"
+   + "End Function\r\n"
+   + "</script>\r\n"
+   );
+   */
+
+document.write(
+        "<script type='text/vbscript'>\r\n"
+        + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n"
+        + "	IEBinary_getByteAt = AscB(MidB(strBinary, iOffset + 1, 1))\r\n"
+        + "End Function\r\n"
+        + "Function IEBinary_getBytesAt(strBinary, iOffset, iLength)\r\n"
+        + "  Dim aBytes()\r\n"
+        + "  ReDim aBytes(iLength - 1)\r\n"
+        + "  For i = 0 To iLength - 1\r\n"
+        + "   aBytes(i) = IEBinary_getByteAt(strBinary, iOffset + i)\r\n"  
+        + "  Next\r\n"
+        + "  IEBinary_getBytesAt = aBytes\r\n" 
+        + "End Function\r\n"
+        + "Function IEBinary_getLength(strBinary)\r\n"
+        + "	IEBinary_getLength = LenB(strBinary)\r\n"
+        + "End Function\r\n"
+        + "</script>\r\n"
+        );
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/ajaxstream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/ajaxstream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/ajaxstream.js	(revision 28388)
@@ -0,0 +1,166 @@
+Mad.BinaryStrings.AjaxStream = function(url) {
+    this.offset = 0; 
+    var request = window.XMLHttpRequest ? new XMLHttpRequest() :  ActiveXObject("Microsoft.XMLHTTP");
+    
+    // pseudo-binary XHR
+    request.overrideMimeType('text/plain; charset=x-user-defined');
+    request.open('GET', url);
+    
+    this.request = request;
+    this.amountRead = 0;
+    this.inProgress = true;
+    this.callbacks = [];
+    
+    var self = this;
+    
+    var iteration = 0;
+    
+    var ochange = function () {
+        iteration += 1;
+        if ((self.callbacks.length > 0 && iteration % 64 === 0) || iteration % 256 === 0) {
+            self.updateBuffer();
+            
+            var newCallbacks = [];
+            
+            for (var i = 0; i < self.callbacks.length; i++) {
+                var callback = self.callbacks[i];
+                
+                if (callback[0] < self.amountRead) {
+					try {
+						callback[1]();
+					} catch (e) {
+						console.log(e);
+					}
+                } else {
+                    newCallbacks.push(callback);
+                }
+            }
+            
+            self.callbacks = newCallbacks;
+        }
+        
+        if (request.readyState === 4) {
+			self.amountRead = self.contentLength;
+            for (var i = 0; i < self.callbacks.length; i++) {
+                var callback = self.callbacks[i];
+                callback[1]();
+            }
+            
+            window.clearInterval(self.timer);
+            
+            self.inProgress = false;
+        }
+    }
+    
+    request.onreadchange = ochange;
+    
+    this.timer = window.setInterval(ochange, 250);
+    
+    request.send(null);
+}
+
+Mad.BinaryStrings.AjaxStream.prototype = new Mad.BinaryStrings.ByteStream();
+
+Mad.BinaryStrings.AjaxStream.prototype.updateBuffer = function() {
+    if (!this.finalAmount) {
+        this.arrayBuffer = this.request.mozResponseArrayBuffer;
+        if(this.arrayBuffer) {
+			this.byteBuffer = new Uint8Array(this.arrayBuffer);
+			this.amountRead = this.arrayBuffer.byteLength;
+		} else {
+			this.buffer = this.request.responseText
+			this.amountRead = this.buffer.length;
+		}
+        
+		this.contentLength = this.request.getResponseHeader('Content-Length');
+		if(!this.contentLength) {
+			// if the server doesn't send a Content-Length Header, just use amountRead instead
+			// it's less precise at first, but once everything is buffered it becomes accurate.
+			this.contentLength = this.amountRead;
+		}
+    
+        if (!this.inProgress) {
+            this.finalAmount = true;
+        }
+        
+        return true;
+    } else {
+        return false;
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.absoluteAvailable = function(n, updated) {
+    if (n > this.amountRead) {
+        if (updated) {
+            throw new Error("buffer underflow with absoluteAvailable!");
+        } else if (this.updateBuffer()) {
+            return this.absoluteAvailable(n, true);
+        } else {
+            return false;
+        }
+    } else {
+        return true;
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.seek = function(n) {
+    this.offset += n;
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.peek = function(n) {
+    if (this.available(n)) {
+        var offset = this.offset;
+        
+        var result = this.get(offset, n);
+        
+        return result;
+    } else {
+        throw new Error("buffer underflow with peek!");
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.get = function(offset, length) {
+    if (this.absoluteAvailable(offset + length)) {
+		var tmpbuffer = "";
+		if(this.byteBuffer) {
+			for(var i = offset; i < offset + length; i += 1) {
+				tmpbuffer = tmpbuffer + String.fromCharCode(this.byteBuffer[i]);
+			}
+		} else {
+			for(var i = offset; i < offset + length; i += 1) {
+				tmpbuffer = tmpbuffer + String.fromCharCode(this.buffer.charCodeAt(i) & 0xff);
+			}
+		}
+		return tmpbuffer;
+    } else {
+		throw new Error("buffer underflow with get!");
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.getU8 = function(offset, bigEndian) {
+	if(this.byteBuffer) {
+		return this.byteBuffer[offset];
+	}
+		
+    return this.get(offset, 1).charCodeAt(0);
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.requestAbsolute = function(n, callback) {
+    if (n < this.amountRead) {
+        callback();
+    } else {
+        this.callbacks.push([n, callback]);
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.request = function(n, callback) {
+    this.requestAbsolute(this.offset + n, callback);
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/bytestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/bytestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/bytestream.js	(revision 28388)
@@ -0,0 +1,161 @@
+Mad.BinaryStrings.ByteStream = function(url) { }
+
+Mad.BinaryStrings.ByteStream.prototype.available = function(n) {
+    return this.absoluteAvailable(this.offset + n);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.strEquals = function (offset, string) {
+    for (var i = 0; i < string.length; i++) {
+        if(this.getU8(offset + i, false) != string.charCodeAt(i)) return false;
+    }
+    return true;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU8 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 1);
+    return bytes.charCodeAt(0);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU16 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 2);
+    
+    if (!bigEndian) {
+        bytes = bytes.reverse();
+    }
+    
+    return (bytes.charCodeAt(0) << 8) | bytes.charCodeAt(1);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU24 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 3);
+    
+    if (!bigEndian) {
+        bytes = bytes.reverse();
+    }
+    
+    return (bytes.charCodeAt(0) << 16) | (bytes.charCodeAt(1) << 8) | bytes.charCodeAt(2);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU32 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 4);
+    
+    if (!bigEndian) {
+        bytes = bytes.reverse();
+    }
+    
+    return (bytes.charCodeAt(0) << 24) | (bytes.charCodeAt(1) << 16) | (bytes.charCodeAt(2) << 8) | bytes.charCodeAt(3);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getI8 = function(offset, bigEndian) {
+    return this.getU8(offset, bigEndian) - 128;            // 2 ** 7
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getI16 = function(offset, bigEndian) {
+    return this.getU16(offset, bigEndian) - 65536;         // 2 ** 15
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getI32 = function(offset, bigEndian) {
+    return this.getU32(offset, bigEndian) - 2147483648;    // 2 ** 31
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getSyncInteger = function(offset) {
+    var bytes = this.get(offset, 4);
+    
+    return (bytes.charCodeAt(0) << 21) | (bytes.charCodeAt(1) << 14) | (bytes.charCodeAt(2) << 7) | bytes.charCodeAt(3);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU8 = function(bigEndian) {
+    return this.getU8(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU16 = function(bigEndian) {
+    return this.getU16(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU24 = function(bigEndian) {
+    return this.getU24(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU32 = function(bigEndian) {
+    return this.getU32(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekI8 = function(bigEndian) {
+    return this.getI8(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekI16 = function(bigEndian) {
+    return this.getI16(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekI32 = function(bigEndian) {
+    return this.getI32(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekSyncInteger = function() {
+    return this.getSyncInteger(this.offset);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU8 = function(bigEndian) {
+    var result = this.peekU8(bigEndian);
+    
+    this.seek(1);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU16 = function(bigEndian) {
+    var result = this.peekU16(bigEndian);
+    
+    this.seek(2);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU24 = function(bigEndian) {
+    var result = this.peekU24(bigEndian);
+    
+    this.seek(3);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU32 = function(bigEndian) {
+    var result = this.peekU32(bigEndian);
+    
+    this.seek(4);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readI8 = function(bigEndian) {
+    var result = this.peekI8(bigEndian);
+    
+    this.seek(1);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readI16 = function(bigEndian) {
+    var result = this.peekI16(bigEndian);
+    
+    this.seek(2);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readI32 = function(bigEndian) {
+    var result = this.peekI32(bigEndian);
+    
+    this.seek(4);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readSyncInteger = function() {
+    var result = this.getSyncInteger(this.offset);
+    
+    this.seek(4);
+    
+    return result;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/filestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/filestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/filestream.js	(revision 28388)
@@ -0,0 +1,62 @@
+Mad.BinaryStrings.FileStream = function(file, callback) {
+    this.offset = 0;
+    var self = this, reader = new FileReader();
+    
+    reader.onload = function () {
+      self['buffer']     = reader.result;
+      self['amountRead'] = self['buffer'].length;
+      self['contentLength'] = self['buffer'].length;
+      
+      self.length = self['amountRead'];
+      
+      callback(self);
+    }
+    
+    reader.onerror = function () {
+        console.log("Error!");
+    }
+    
+    reader.readAsBinaryString(file);
+}
+
+Mad.BinaryStrings.FileStream.prototype = new Mad.BinaryStrings.ByteStream();
+
+Mad.BinaryStrings.FileStream.prototype.absoluteAvailable = function(n, updated) {
+    return n < this['amountRead'];
+}
+
+Mad.BinaryStrings.FileStream.prototype.substream = function (offset, length) {
+    return new Mad.BinaryStrings.SubStream(this, offset, length);
+}
+
+Mad.BinaryStrings.FileStream.prototype.seek = function(n) {
+    this['offset'] += n;
+}
+
+Mad.BinaryStrings.FileStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.FileStream.prototype.peek = function(n) {
+    if (this.available(n)) {
+        var offset = this['offset'];
+        
+        var result = this.get(offset, n);
+        
+        return result;
+    } else {
+        throw 'TODO: THROW PEEK ERROR!';
+    }
+}
+
+Mad.BinaryStrings.FileStream.prototype.get = function(offset, length) {
+    if (this.absoluteAvailable(offset + length)) {
+        return this['buffer'].slice(offset, offset + length);
+    } else {
+        throw 'TODO: THROW GET ERROR!';
+    }
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/stringstream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/stringstream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/stringstream.js	(revision 28388)
@@ -0,0 +1,44 @@
+Mad.BinaryStrings.StringStream = function(string) {
+    this.offset = 0;
+    this.buffer = string;
+    this.amountRead = string.length;
+    this.length = string.length;
+}
+
+Mad.BinaryStrings.StringStream.prototype = new Mad.BinaryStrings.ByteStream();
+
+Mad.BinaryStrings.StringStream.prototype.absoluteAvailable = function(n, updated) {
+    return n < this['amountRead'];
+}
+
+Mad.BinaryStrings.StringStream.prototype.seek = function(n) {
+    this['offset'] += n;
+}
+
+Mad.BinaryStrings.StringStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.StringStream.prototype.peek = function(n) {
+    if (this.available(n)) {
+        var offset = this['offset'];
+        
+        var result = this.get(offset, n);
+        
+        return result;
+    } else {
+        throw 'TODO: THROW PEEK ERROR!';
+    }
+}
+
+Mad.BinaryStrings.StringStream.prototype.get = function(offset, length) {
+    if (this.absoluteAvailable(offset + length)) {
+        return this['buffer'].slice(offset, offset + length);
+    } else {
+        throw 'TODO: THROW GET ERROR!';
+    }
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/substream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/substream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/binarystring/substream.js	(revision 28388)
@@ -0,0 +1,50 @@
+
+Mad.BinaryStrings.SubStream = function(stream, offset, length) {
+    this.offset = 0;
+    this.start = offset;
+    this.parentStream = stream;
+    this.length = length;
+}
+
+Mad.BinaryStrings.SubStream.prototype = new Mad.BinaryStrings.ByteStream;
+
+Mad.BinaryStrings.SubStream.prototype.substream = function (offset, length) {
+    return new Mad.BinaryStrings.SubStream(this.parentStream, this.start + offset, length);
+}
+
+
+Mad.BinaryStrings.SubStream.prototype.absoluteAvailable = function(n) {
+    return this.parentStream.absoluteAvailable(this.start + n);
+}
+
+Mad.BinaryStrings.SubStream.prototype.seek = function(n) {
+    this.offset += n;
+}
+
+Mad.BinaryStrings.SubStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.SubStream.prototype.peek = function(n) {
+    return this.get(this.offset, n);
+}
+
+Mad.BinaryStrings.SubStream.prototype.get = function(offset, length) {
+    return this.parentStream.get(this.start + offset, length);
+}
+
+Mad.BinaryStrings.SubStream.prototype.slice = function(start, end) {
+    return this.parentStream.get(this.start + start, end - start);
+}
+
+Mad.BinaryStrings.SubStream.prototype.requestAbsolute = function(n, callback) {
+    this.parentStream.requestAbsolute(this.start + n)
+}
+
+Mad.BinaryStrings.SubStream.prototype.request = function(n, callback) {
+    this.parentStream.requestAbsolute(this.start + this.offset + n)
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/bit.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/bit.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/bit.js	(revision 28388)
@@ -0,0 +1,148 @@
+
+// Well duh.
+var CHAR_BIT = 8;
+
+/*
+ * NAME:    bit.init()
+ * DESCRIPTION: initialize bit pointer struct
+ */
+Mad.Bit = function (stream, offset) {
+    if (typeof(stream) === 'string') {
+        this.stream = new Mad.BinaryStrings.StringStream(stream);
+    } else if(stream instanceof Uint8Array) {
+        this.stream = new Mad.ArrayBuffers.ArrayStream(stream);
+    } else {
+        this.stream = stream;
+    }
+
+    this.offset = offset;
+
+    this.cache = 0;
+    this.left = CHAR_BIT;
+}
+
+Mad.Bit.prototype.clone = function() {
+    var c = new Mad.Bit(this.stream, this.offset);
+
+    c.cache = this.cache;
+    c.left = this.left;
+
+    return c;
+}
+
+/*
+ * NAME:    bit.length()
+ * DESCRIPTION: return number of bits between start and end points
+ */
+Mad.Bit.prototype.length = function(end) {
+    return this.left + CHAR_BIT * (end.offset - (this.offset + 1)) + (CHAR_BIT - end.left);
+}
+
+/*
+ * NAME:    bit.nextbyte()
+ * DESCRIPTION: return pointer to next unprocessed byte
+ */
+Mad.Bit.prototype.nextbyte = function() {
+    return this.left === CHAR_BIT ? this.offset : this.offset + 1;
+}
+
+/*
+ * NAME:    bit.skip()
+ * DESCRIPTION: advance bit pointer
+ */
+Mad.Bit.prototype.skip = function(len) {
+    this.offset += (len / CHAR_BIT) >> 0; // javascript trick to get integer divison
+    this.left   -= len % CHAR_BIT;
+
+    if (this.left > CHAR_BIT) {
+        this.offset++;
+        this.left += CHAR_BIT;
+    }
+
+    if (this.left < CHAR_BIT) {
+        this.cache = this.stream.getU8(this.offset);
+    }
+}
+
+/*
+ * NAME:    bit.read()
+ * DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value
+ */
+Mad.Bit.prototype.read = function(len) {
+    if(len > 16) {
+        return this.readBig(len);
+    }
+
+    var value = 0;
+
+    if (this.left === CHAR_BIT) {
+        this.cache = this.stream.getU8(this.offset);
+    }
+
+    if (len < this.left) {
+        value = (this.cache & ((1 << this.left) - 1)) >> (this.left - len);
+        this.left -= len;
+
+        return value;
+    }
+
+    /* remaining bits in current byte */
+    value = this.cache & ((1 << this.left) - 1);
+    len  -= this.left;
+
+    this.offset++;
+    this.left = CHAR_BIT;
+
+    /* more bytes */
+    while (len >= CHAR_BIT) {
+        value = (value << CHAR_BIT) | this.stream.getU8(this.offset++);
+        len  -= CHAR_BIT;
+    }
+
+    if (len > 0) {
+        this.cache = this.stream.getU8(this.offset);
+
+        value = (value << len) | (this.cache >> (CHAR_BIT - len));
+        this.left -= len;
+    }
+
+    return value;
+}
+
+Mad.Bit.prototype.readBig = function(len) {
+    var value = 0;
+
+    if (this.left === CHAR_BIT) {
+        this.cache = this.stream.getU8(this.offset);
+    }
+
+    if (len < this.left) {
+        value = (this.cache & ((1 << this.left) - 1)) >> (this.left - len);
+        this.left -= len;
+
+        return value;
+    }
+
+    /* remaining bits in current byte */
+    value = this.cache & ((1 << this.left) - 1);
+    len  -= this.left;
+
+    this.offset++;
+    this.left = CHAR_BIT;
+
+    /* more bytes */
+    while (len >= CHAR_BIT) {
+        value = Mad.bitwiseOr(Mad.lshift(value, CHAR_BIT), this.stream.getU8(this.offset++));
+        len  -= CHAR_BIT;
+    }
+
+    if (len > 0) {
+        this.cache = this.stream.getU8(this.offset);
+
+        value = Mad.bitwiseOr(Mad.lshift(value, len), (this.cache >> (CHAR_BIT - len)));
+        this.left -= len;
+    }
+
+    return value;
+}
+
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/frame.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/frame.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/frame.js	(revision 28388)
@@ -0,0 +1,411 @@
+
+var bitrate_table /* [5][15] */ = [
+/* MPEG-1 */
+[ 0,  32000,  64000,  96000, 128000, 160000, 192000, 224000,  /* Layer I   */
+    256000, 288000, 320000, 352000, 384000, 416000, 448000 ],
+    [ 0,  32000,  48000,  56000,  64000,  80000,  96000, 112000,  /* Layer II  */
+    128000, 160000, 192000, 224000, 256000, 320000, 384000 ],
+    [ 0,  32000,  40000,  48000,  56000,  64000,  80000,  96000,  /* Layer III */
+    112000, 128000, 160000, 192000, 224000, 256000, 320000 ],
+
+    /* MPEG-2 LSF */
+    [ 0,  32000,  48000,  56000,  64000,  80000,  96000, 112000,  /* Layer I   */
+    128000, 144000, 160000, 176000, 192000, 224000, 256000 ],
+    [ 0,   8000,  16000,  24000,  32000,  40000,  48000,  56000,  /* Layers    */
+    64000,  80000,  96000, 112000, 128000, 144000, 160000 ] /* II & III  */
+    ];
+
+    var samplerate_table /* [3] */ = [ 44100, 48000, 32000 ];
+
+    var decoder_table = [
+    function() { console.log("Layer I decoding is not implemented!"); },
+    function() { console.log("Layer II decoding is not implemented!"); },
+    Mad.layer_III
+    ];
+
+    Mad.Layer = {
+I: 1,
+   II: 2,
+   III: 3
+    };
+
+Mad.Mode = {
+SINGLE_CHANNEL      : 0,
+                      DUAL_CHANNEL        : 1,      /* dual channel */
+                      JOINT_STEREO        : 2,      /* joint (MS/intensity) stereo */
+                      STEREO              : 3       /* normal LR stereo */
+};
+
+Mad.Emphasis = {
+NONE       : 0,     /* no emphasis */
+             _50_15_US  : 1,     /* 50/15 microseconds emphasis */
+             CCITT_J_17 : 3,     /* CCITT J.17 emphasis */
+             RESERVED   : 2      /* unknown emphasis */
+};
+
+Mad.Header = function () {
+    this.layer          = 0;            /* audio layer (1, 2, or 3) */
+    this.mode           = 0;            /* channel mode (see above) */
+    this.mode_extension = 0;            /* additional mode info */
+    this.emphasis       = 0;            /* de-emphasis to use (see above) */    
+
+    this.bitrate        = 0;            /* stream bitrate (bps) */
+    this.samplerate     = 0;            /* sampling frequency (Hz) */
+
+    this.crc_check      = 0;            /* frame CRC accumulator */
+    this.crc_target     = 0;            /* final target CRC checksum */
+
+    this.flags          = 0;            /* flags (see below) */
+    this.private_bits   = 0;            /* private bits (see below) */
+
+    //this.duration       = mad_timer_zero;         /* audio playing time of frame */
+};
+
+Mad.Header.prototype.nchannels = function () {
+    return this.mode === 0 ? 1 : 2;
+}
+
+Mad.Header.prototype.nbsamples = function() {
+    return (this.layer === Mad.Layer.I ? 12 : 
+            ((this.layer === Mad.Layer.III && (this.flags & Mad.Flag.LSF_EXT)) ? 18 : 36));
+}
+
+/* libmad's decode_header */
+Mad.Header.actually_decode = function(stream) {
+    var header = new Mad.Header();
+
+    header.flags        = 0;
+    header.private_bits = 0;
+
+    /* header() */
+
+    /* syncword */
+    stream.ptr.skip(11);
+
+    /* MPEG 2.5 indicator (really part of syncword) */
+    if (stream.ptr.read(1) === 0) {
+        header.flags |= Mad.Flag.MPEG_2_5_EXT;
+    }
+
+    /* ID */
+    if (stream.ptr.read(1) === 0) {
+        header.flags |= Mad.Flag.LSF_EXT;
+    } else if (header.flags & Mad.Flag.MPEG_2_5_EXT) {
+        stream.error = Mad.Error.LOSTSYNC;
+        return null;
+    }
+
+    /* layer */
+    header.layer = 4 - stream.ptr.read(2);
+
+    if (header.layer === 4) {
+        stream.error = Mad.Error.BADLAYER;
+        return header;
+    }
+
+    /* protection_bit */
+    if (stream.ptr.read(1) === 0) {
+        header.flags    |= Mad.Flag.PROTECTION;
+        // TODO: crc
+        //header.crc_check = mad_bit_crc(stream.ptr, 16, 0xffff);
+        stream.ptr.skip(16);
+    }
+
+    /* bitrate_index */
+    var index = stream.ptr.read(4);
+    if (index === 15) {
+        stream.error = Mad.Error.BADBITRATE;
+        return header;
+    }
+
+    if (header.flags & Mad.Flag.LSF_EXT) {
+        header.bitrate = bitrate_table[3 + (header.layer >> 1)][index];
+    } else {
+        header.bitrate = bitrate_table[header.layer - 1][index];
+    }
+
+    /* sampling_frequency */
+    index = stream.ptr.read(2);
+
+    if (index === 3) {
+        stream.error = Mad.Error.BADSAMPLERATE;
+        return header;
+    }
+
+    header.samplerate = samplerate_table[index];
+
+    if (header.flags & Mad.Flag.LSF_EXT) {
+        header.samplerate /= 2;
+
+        if (header.flags & Mad.Flag.MPEG_2_5_EXT)
+            header.samplerate /= 2;
+    }
+
+    /* padding_bit */
+    if (stream.ptr.read(1))
+        header.flags |= Mad.Flag.PADDING;
+
+    /* private_bit */
+    if (stream.ptr.read(1))
+        header.private_bits |= Mad.Private.HEADER;
+
+    /* mode */
+    header.mode = 3 - stream.ptr.read(2);
+
+    /* mode_extension */
+    header.mode_extension = stream.ptr.read(2);
+
+    /* copyright */
+    if (stream.ptr.read(1))
+        header.flags |= Mad.Flag.COPYRIGHT;
+
+    /* original/copy */
+    if (stream.ptr.read(1))
+        header.flags |= Mad.Flag.ORIGINAL;
+
+    /* emphasis */
+    header.emphasis = stream.ptr.read(2);
+
+    /* error_check() */
+
+    /* crc_check */
+    if (header.flags & Mad.Flag.PROTECTION)
+        header.crc_target = stream.ptr.read(16);
+
+    return header;
+}
+
+/* libmad's mad_header_decode */
+Mad.Header.decode = function(stream) {
+    var header = null;
+
+    // those are actually pointers. javascript powa.
+    var ptr = stream.next_frame;
+    var end = stream.bufend;
+    var pad_slot = 0;
+    var N = 0;
+
+    /* stream skip */
+    if (stream.skiplen) {
+        if (!stream.sync)
+            ptr = stream.this_frame;
+
+        if (end - ptr < stream.skiplen) {
+            stream.skiplen   -= end - ptr;
+            stream.next_frame = end;
+
+            stream.error = Mad.Error.BUFLEN;
+            return null;
+        }
+
+        ptr += stream.skiplen;
+        stream.skiplen = 0;
+
+        stream.sync = 1;
+    }
+
+    // emulating goto in JS, yay! this was a 'sync:' label
+    var syncing = true;
+
+    while(syncing) {
+        syncing = false;
+
+        /* synchronize */
+        try {
+            if (stream.sync) {
+                if (end - ptr < Mad.BUFFER_GUARD) {
+                    stream.next_frame = ptr;
+
+                    stream.error = Mad.Error.BUFLEN;
+                    return null;
+                } else if (!(stream.getU8(ptr) === 0xff && (stream.getU8(ptr + 1) & 0xe0) === 0xe0)) {
+                    /* mark point where frame sync word was expected */
+                    stream.this_frame = ptr;
+                    stream.next_frame = ptr + 1;
+
+                    stream.error = Mad.Error.LOSTSYNC;
+                    return null;
+                }
+            } else {
+                stream.ptr = new Mad.Bit(stream.stream, ptr);
+
+                if (stream.doSync() === -1) {
+                    if (end - stream.next_frame >= Mad.BUFFER_GUARD)
+                        stream.next_frame = end - Mad.BUFFER_GUARD;
+                    stream.error = Mad.Error.BUFLEN;
+                    return null;
+                }
+
+                ptr = stream.ptr.nextbyte();
+            }
+        } catch (e) {
+            console.log("Synchronization error: " + e);
+
+            stream.error = Mad.Error.BUFLEN;
+
+            return null;
+        }
+
+        /* begin processing */
+        stream.this_frame = ptr;
+        stream.next_frame = ptr + 1;  /* possibly bogus sync word */
+
+        stream.ptr = new Mad.Bit(stream.stream, stream.this_frame);
+
+        header = Mad.Header.actually_decode(stream);
+        if(header === null) return null; // well Duh^2
+
+        //console.log("=============== Decoding layer " + header.layer + " audio mode " +
+        //     header.mode + " with " + header.bitrate +
+        //     " bps and a samplerate of " + header.samplerate);
+
+        /* calculate frame duration */
+        //mad_timer_set(&header.duration, 0, 32 * MAD_NSBSAMPLES(header), header.samplerate);
+
+        /* calculate free bit rate */
+        if (header.bitrate === 0) {
+            console.log("Uh oh, a free bitrate stream. We're fucked.");
+            stream.error = Mad.Error.BADDATAPTR; // best guess
+            return null;
+
+            //        if ((stream.freerate === 0 || !stream.sync ||
+            //                        (header.layer === Mad.Layer.III && stream.freerate > 640000)) &&
+            //                free_bitrate(stream, header) === -1)
+            //            return null;
+            //
+            //        header.bitrate = stream.freerate;
+            //        header.flags  |= Mad.Flag.FREEFORMAT;
+        }
+
+        /* calculate beginning of next frame */
+        pad_slot = (header.flags & Mad.Flag.PADDING) ? 1 : 0;
+
+        if (header.layer === Mad.Layer.I) {
+            N = (((12 * header.bitrate / header.samplerate) << 0) + pad_slot) * 4;
+        } else {
+            var slots_per_frame = (header.layer === Mad.Layer.III &&
+                    (header.flags & Mad.Flag.LSF_EXT)) ? 72 : 144;
+            //console.log("slots_per_frame = " + slots_per_frame + ", bitrate = " + header.bitrate + ", samplerate = " + header.samplerate);
+
+            N = ((slots_per_frame * header.bitrate / header.samplerate) << 0) + pad_slot;
+        }
+
+
+        /* verify there is enough data left in buffer to decode this frame */
+        if (N + Mad.BUFFER_GUARD > end - stream.this_frame) {
+            stream.next_frame = stream.this_frame;
+
+            stream.error = Mad.Error.BUFLEN;
+            return null;
+        }
+
+        stream.next_frame = stream.this_frame + N;
+
+        // console.log("N = " + N + ", pad_slot = " + pad_slot + ", next_frame = " + stream.next_frame);
+
+        if (!stream.sync) {
+            /* check that a valid frame header follows this frame */
+            ptr = stream.next_frame;
+            if (!(stream.getU8(ptr) === 0xff && (stream.getU8(ptr + 1) & 0xe0) === 0xe0)) {
+                ptr = stream.next_frame = stream.this_frame + 1;
+
+                // emulating 'goto sync'
+                syncing = true;
+                continue;
+            }
+            stream.sync = 1;
+        }
+    } // end of goto emulation (label 'sync')
+
+    header.flags |= Mad.Flag.INCOMPLETE;
+    return header;
+}
+
+Mad.Frame = function () {
+    this.header = new Mad.Header();     /* MPEG audio header */
+
+    this.options = 0;                   /* decoding options (from stream) */
+
+    // sbsample[2][36][32]
+    this.sbsample = [];   /* synthesis subband filter samples */
+    for(var ch = 0; ch < 2; ch++) {
+        this.sbsample[ch] = [];
+        for(var grp = 0; grp < 36; grp++) {
+            // this.sbsample[ch][grp] = new Float64Array(new ArrayBuffer(8 * 32));
+            this.sbsample[ch][grp] = [];
+            for(var i = 0; i < 32; i++) {
+                this.sbsample[ch][grp][i] = 0;
+            }
+        }
+    }
+
+    // overlap[2][32][18]
+    this.overlap = []; /* Layer III block overlap data */
+    for(var ch = 0; ch < 2; ch++) {
+        this.overlap[ch] = [];
+        for(var sb = 0; sb < 32; sb++) {
+            // this.overlap[ch][sb] = new Float64Array(new ArrayBuffer(8 * 18));
+            this.overlap[ch][sb] = [];
+            for(var i = 0; i < 18; i++) {
+                this.overlap[ch][sb][i] = 0;
+            }
+        }
+    }
+};
+
+Mad.Frame.decode = function(frame, stream) {
+    frame.options = stream.options;
+
+    /* header() */
+    /* error_check() */
+
+    if (!(frame.header.flags & Mad.Flag.INCOMPLETE)) {
+        frame.header = Mad.Header.decode(stream);
+        if(frame.header === null) {
+            // something went wrong
+            throw 'Header decoding failed';
+        }
+    }
+
+    frame.header.flags &= ~Mad.Flag.INCOMPLETE;
+
+    if (decoder_table[frame.header.layer - 1](stream, frame) === -1) {
+        if (!Mad.recoverable(stream.error)) {
+            stream.next_frame = stream.this_frame;
+        }
+        throw 'Decoder table error';
+    }
+
+    return frame;
+};
+
+Mad.sbsampleIndex = function (i, j, k) {
+    return i * 36 * 32 + j * 32 + k;
+};
+
+Mad.overlapIndex = function (i, j, k) {
+    return i * 32 * 18 + j * 18 + k;
+};
+
+Mad.Flag = {
+NPRIVATE_III   : 0x0007,   /* number of Layer III private bits */
+                 INCOMPLETE : 0x0008,   /* header but not data is decoded */
+
+                 PROTECTION : 0x0010,   /* frame has CRC protection */
+                 COPYRIGHT  : 0x0020,   /* frame is copyright */
+                 ORIGINAL   : 0x0040,   /* frame is original (else copy) */
+                 PADDING    : 0x0080,   /* frame has additional slot */
+
+                 I_STEREO   : 0x0100,   /* uses intensity joint stereo */
+                 MS_STEREO  : 0x0200,   /* uses middle/side joint stereo */
+                 FREEFORMAT : 0x0400,   /* uses free format bitrate */
+
+                 LSF_EXT    : 0x1000,   /* lower sampling freq. extension */
+                 MC_EXT : 0x2000,   /* multichannel audio extension */
+                 MPEG_2_5_EXT   : 0x4000    /* MPEG 2.5 (unofficial) extension */
+};
+
+Mad.Private = {
+HEADER  : 0x0100,   /* header private bit */
+          III : 0x001f    /* Layer III private bits (up to 5) */
+};
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/huffman.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/huffman.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/huffman.js	(revision 28388)
@@ -0,0 +1,3065 @@
+
+/*
+ * These are the Huffman code words for Layer III.
+ * The data for these tables are derived from Table B.7 of ISO/IEC 11172-3.
+ *
+ * These tables support decoding up to 4 Huffman code bits at a time.
+ */
+
+/*
+union huffquad {
+  struct {
+    unsigned short final  :  1;
+    unsigned short bits   :  3;
+    unsigned short offset : 12;
+  } ptr;
+  struct {
+    unsigned short final  :  1;
+    unsigned short hlen   :  3;
+    unsigned short v      :  1;
+    unsigned short w      :  1;
+    unsigned short x      :  1;
+    unsigned short y      :  1;
+  } value;
+  unsigned short final    :  1;
+};
+
+union huffpair {
+  struct {
+    unsigned short final  :  1;
+    unsigned short bits   :  3;
+    unsigned short offset : 12;
+  } ptr;
+  struct {
+    unsigned short final  :  1;
+    unsigned short hlen   :  3;
+    unsigned short x      :  4;
+    unsigned short y      :  4;
+  } value;
+  unsigned short final    :  1;
+};
+
+struct hufftable {
+  union huffpair const *table;
+  unsigned short linbits;
+  unsigned short startbits;
+};
+*/
+
+//extern union huffquad const *const mad_huff_quad_table[2];
+//extern struct hufftable const mad_huff_pair_table[32];
+
+Mad.huff_quad_table = []; /* 2 */
+Mad.huff_pair_table = []; /* 32 */
+
+var PTR = function(offs, bits) {
+    return {
+        'final':  0, // final is a reserved word in JavaScript and GSC will complain about it.
+        ptr: {
+            bits:   bits,
+            offset: offs
+        }
+    };
+};
+
+var huffquad_V = function (v, w, x, y, hlen) {
+    return {
+        'final':  1, // final is a reserved word in JavaScript and GSC will complain about it.
+        value: {
+            v: v,
+            w: w,
+            x: x,
+            y: y
+        }
+    };
+};
+
+/*
+# if defined(__GNUC__) ||  \
+    (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901)
+#  define PTR(offs, bits)	{ .ptr   = { 0, bits, offs       } }
+#  define V(v, w, x, y, hlen)	{ .value = { 1, hlen, v, w, x, y } }
+# else
+#  define PTR(offs, bits)	{ { 0, bits, offs } }
+#  if defined(WORDS_BIGENDIAN)
+#   define V(v, w, x, y, hlen)	{ { 1, hlen, (v << 11) | (w << 10) | (x <<  9) | (y <<  8) } }
+#  else
+#   define V(v, w, x, y, hlen)	{ { 1, hlen, (v <<  0) | (w <<  1) | (x <<  2) | (y <<  3) } }
+#  endif
+# endif
+*/
+
+/* huffquad */ var hufftabA = [
+  /* 0000 */ PTR(16, 2),
+  /* 0001 */ PTR(20, 2),
+  /* 0010 */ PTR(24, 1),
+  /* 0011 */ PTR(26, 1),
+  /* 0100 */ huffquad_V(0, 0, 1, 0, 4),
+  /* 0101 */ huffquad_V(0, 0, 0, 1, 4),
+  /* 0110 */ huffquad_V(0, 1, 0, 0, 4),
+  /* 0111 */ huffquad_V(1, 0, 0, 0, 4),
+  /* 1000 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1001 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1010 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1011 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1100 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1101 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1110 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1111 */ huffquad_V(0, 0, 0, 0, 1),
+
+  /* 0000 ... */
+  /* 00   */ huffquad_V(1, 0, 1, 1, 2),	/* 16 */
+  /* 01   */ huffquad_V(1, 1, 1, 1, 2),
+  /* 10   */ huffquad_V(1, 1, 0, 1, 2),
+  /* 11   */ huffquad_V(1, 1, 1, 0, 2),
+
+  /* 0001 ... */
+  /* 00   */ huffquad_V(0, 1, 1, 1, 2),	/* 20 */
+  /* 01   */ huffquad_V(0, 1, 0, 1, 2),
+  /* 10   */ huffquad_V(1, 0, 0, 1, 1),
+  /* 11   */ huffquad_V(1, 0, 0, 1, 1),
+
+  /* 0010 ... */
+  /* 0    */ huffquad_V(0, 1, 1, 0, 1),	/* 24 */
+  /* 1    */ huffquad_V(0, 0, 1, 1, 1),
+
+  /* 0011 ... */
+  /* 0    */ huffquad_V(1, 0, 1, 0, 1),	/* 26 */
+  /* 1    */ huffquad_V(1, 1, 0, 0, 1)
+];
+
+/* huffquad */ var hufftabB = [
+  /* 0000 */ huffquad_V(1, 1, 1, 1, 4),
+  /* 0001 */ huffquad_V(1, 1, 1, 0, 4),
+  /* 0010 */ huffquad_V(1, 1, 0, 1, 4),
+  /* 0011 */ huffquad_V(1, 1, 0, 0, 4),
+  /* 0100 */ huffquad_V(1, 0, 1, 1, 4),
+  /* 0101 */ huffquad_V(1, 0, 1, 0, 4),
+  /* 0110 */ huffquad_V(1, 0, 0, 1, 4),
+  /* 0111 */ huffquad_V(1, 0, 0, 0, 4),
+  /* 1000 */ huffquad_V(0, 1, 1, 1, 4),
+  /* 1001 */ huffquad_V(0, 1, 1, 0, 4),
+  /* 1010 */ huffquad_V(0, 1, 0, 1, 4),
+  /* 1011 */ huffquad_V(0, 1, 0, 0, 4),
+  /* 1100 */ huffquad_V(0, 0, 1, 1, 4),
+  /* 1101 */ huffquad_V(0, 0, 1, 0, 4),
+  /* 1110 */ huffquad_V(0, 0, 0, 1, 4),
+  /* 1111 */ huffquad_V(0, 0, 0, 0, 4)
+];
+
+/*
+# undef V
+# undef PTR
+
+# if defined(__GNUC__) ||  \
+    (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901)
+#  define PTR(offs, bits)	{ .ptr   = { 0, bits, offs } }
+#  define V(x, y, hlen)		{ .value = { 1, hlen, x, y } }
+# else
+#  define PTR(offs, bits)	{ { 0, bits, offs } }
+#  if defined(WORDS_BIGENDIAN)
+#   define V(x, y, hlen)	{ { 1, hlen, (x << 8) | (y << 4) } }
+#  else
+#   define V(x, y, hlen)	{ { 1, hlen, (x << 0) | (y << 4) } }
+#  endif
+# endif
+*/
+
+var V = function (x, y, hlen) {
+    return {
+        'final':  1, // final is a reserved word in JavaScript and GSC will complain about it.
+        value: {
+            x: x,
+            y: y,
+            hlen: hlen
+        }
+    };
+};
+
+var hufftab0 = [
+  /*      */ V(0, 0, 0)
+];
+
+var hufftab1 = [
+  /* 000  */ V(1, 1, 3),
+  /* 001  */ V(0, 1, 3),
+  /* 010  */ V(1, 0, 2),
+  /* 011  */ V(1, 0, 2),
+  /* 100  */ V(0, 0, 1),
+  /* 101  */ V(0, 0, 1),
+  /* 110  */ V(0, 0, 1),
+  /* 111  */ V(0, 0, 1)
+];
+
+var hufftab2 = [
+  /* 000  */ PTR(8, 3),
+  /* 001  */ V(1, 1, 3),
+  /* 010  */ V(0, 1, 3),
+  /* 011  */ V(1, 0, 3),
+  /* 100  */ V(0, 0, 1),
+  /* 101  */ V(0, 0, 1),
+  /* 110  */ V(0, 0, 1),
+  /* 111  */ V(0, 0, 1),
+
+  /* 000 ... */
+  /* 000  */ V(2, 2, 3),	/* 8 */
+  /* 001  */ V(0, 2, 3),
+  /* 010  */ V(1, 2, 2),
+  /* 011  */ V(1, 2, 2),
+  /* 100  */ V(2, 1, 2),
+  /* 101  */ V(2, 1, 2),
+  /* 110  */ V(2, 0, 2),
+  /* 111  */ V(2, 0, 2)
+];
+
+var hufftab3 = [
+  /* 000  */ PTR(8, 3),
+  /* 001  */ V(1, 0, 3),
+  /* 010  */ V(1, 1, 2),
+  /* 011  */ V(1, 1, 2),
+  /* 100  */ V(0, 1, 2),
+  /* 101  */ V(0, 1, 2),
+  /* 110  */ V(0, 0, 2),
+  /* 111  */ V(0, 0, 2),
+
+  /* 000 ... */
+  /* 000  */ V(2, 2, 3),	/* 8 */
+  /* 001  */ V(0, 2, 3),
+  /* 010  */ V(1, 2, 2),
+  /* 011  */ V(1, 2, 2),
+  /* 100  */ V(2, 1, 2),
+  /* 101  */ V(2, 1, 2),
+  /* 110  */ V(2, 0, 2),
+  /* 111  */ V(2, 0, 2)
+];
+
+var hufftab5 = [
+  /* 000  */ PTR(8, 4),
+  /* 001  */ V(1, 1, 3),
+  /* 010  */ V(0, 1, 3),
+  /* 011  */ V(1, 0, 3),
+  /* 100  */ V(0, 0, 1),
+  /* 101  */ V(0, 0, 1),
+  /* 110  */ V(0, 0, 1),
+  /* 111  */ V(0, 0, 1),
+
+  /* 000 ... */
+  /* 0000 */ PTR(24, 1),	/* 8 */
+  /* 0001 */ V(3, 2, 4),
+  /* 0010 */ V(3, 1, 3),
+  /* 0011 */ V(3, 1, 3),
+  /* 0100 */ V(1, 3, 4),
+  /* 0101 */ V(0, 3, 4),
+  /* 0110 */ V(3, 0, 4),
+  /* 0111 */ V(2, 2, 4),
+  /* 1000 */ V(1, 2, 3),
+  /* 1001 */ V(1, 2, 3),
+  /* 1010 */ V(2, 1, 3),
+  /* 1011 */ V(2, 1, 3),
+  /* 1100 */ V(0, 2, 3),
+  /* 1101 */ V(0, 2, 3),
+  /* 1110 */ V(2, 0, 3),
+  /* 1111 */ V(2, 0, 3),
+
+  /* 000 0000 ... */
+  /* 0    */ V(3, 3, 1),	/* 24 */
+  /* 1    */ V(2, 3, 1)
+];
+
+var hufftab6 = [
+  /* 0000 */ PTR(16, 3),
+  /* 0001 */ PTR(24, 1),
+  /* 0010 */ PTR(26, 1),
+  /* 0011 */ V(1, 2, 4),
+  /* 0100 */ V(2, 1, 4),
+  /* 0101 */ V(2, 0, 4),
+  /* 0110 */ V(0, 1, 3),
+  /* 0111 */ V(0, 1, 3),
+  /* 1000 */ V(1, 1, 2),
+  /* 1001 */ V(1, 1, 2),
+  /* 1010 */ V(1, 1, 2),
+  /* 1011 */ V(1, 1, 2),
+  /* 1100 */ V(1, 0, 3),
+  /* 1101 */ V(1, 0, 3),
+  /* 1110 */ V(0, 0, 3),
+  /* 1111 */ V(0, 0, 3),
+
+  /* 0000 ... */
+  /* 000  */ V(3, 3, 3),	/* 16 */
+  /* 001  */ V(0, 3, 3),
+  /* 010  */ V(2, 3, 2),
+  /* 011  */ V(2, 3, 2),
+  /* 100  */ V(3, 2, 2),
+  /* 101  */ V(3, 2, 2),
+  /* 110  */ V(3, 0, 2),
+  /* 111  */ V(3, 0, 2),
+
+  /* 0001 ... */
+  /* 0    */ V(1, 3, 1),	/* 24 */
+  /* 1    */ V(3, 1, 1),
+
+  /* 0010 ... */
+  /* 0    */ V(2, 2, 1),	/* 26 */
+  /* 1    */ V(0, 2, 1)
+];
+
+var hufftab7 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 2),
+  /* 0011 */ V(1, 1, 4),
+  /* 0100 */ V(0, 1, 3),
+  /* 0101 */ V(0, 1, 3),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(52, 2),	/* 16 */
+  /* 0001 */ PTR(56, 1),
+  /* 0010 */ PTR(58, 1),
+  /* 0011 */ V(1, 5, 4),
+  /* 0100 */ V(5, 1, 4),
+  /* 0101 */ PTR(60, 1),
+  /* 0110 */ V(5, 0, 4),
+  /* 0111 */ PTR(62, 1),
+  /* 1000 */ V(2, 4, 4),
+  /* 1001 */ V(4, 2, 4),
+  /* 1010 */ V(1, 4, 3),
+  /* 1011 */ V(1, 4, 3),
+  /* 1100 */ V(4, 1, 3),
+  /* 1101 */ V(4, 1, 3),
+  /* 1110 */ V(4, 0, 3),
+  /* 1111 */ V(4, 0, 3),
+
+  /* 0001 ... */
+  /* 0000 */ V(0, 4, 4),	/* 32 */
+  /* 0001 */ V(2, 3, 4),
+  /* 0010 */ V(3, 2, 4),
+  /* 0011 */ V(0, 3, 4),
+  /* 0100 */ V(1, 3, 3),
+  /* 0101 */ V(1, 3, 3),
+  /* 0110 */ V(3, 1, 3),
+  /* 0111 */ V(3, 1, 3),
+  /* 1000 */ V(3, 0, 3),
+  /* 1001 */ V(3, 0, 3),
+  /* 1010 */ V(2, 2, 3),
+  /* 1011 */ V(2, 2, 3),
+  /* 1100 */ V(1, 2, 2),
+  /* 1101 */ V(1, 2, 2),
+  /* 1110 */ V(1, 2, 2),
+  /* 1111 */ V(1, 2, 2),
+
+  /* 0010 ... */
+  /* 00   */ V(2, 1, 1),	/* 48 */
+  /* 01   */ V(2, 1, 1),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 00   */ V(5, 5, 2),	/* 52 */
+  /* 01   */ V(4, 5, 2),
+  /* 10   */ V(5, 4, 2),
+  /* 11   */ V(5, 3, 2),
+
+  /* 0000 0001 ... */
+  /* 0    */ V(3, 5, 1),	/* 56 */
+  /* 1    */ V(4, 4, 1),
+
+  /* 0000 0010 ... */
+  /* 0    */ V(2, 5, 1),	/* 58 */
+  /* 1    */ V(5, 2, 1),
+
+  /* 0000 0101 ... */
+  /* 0    */ V(0, 5, 1),	/* 60 */
+  /* 1    */ V(3, 4, 1),
+
+  /* 0000 0111 ... */
+  /* 0    */ V(4, 3, 1),	/* 62 */
+  /* 1    */ V(3, 3, 1)
+];
+
+var hufftab8 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ V(1, 2, 4),
+  /* 0011 */ V(2, 1, 4),
+  /* 0100 */ V(1, 1, 2),
+  /* 0101 */ V(1, 1, 2),
+  /* 0110 */ V(1, 1, 2),
+  /* 0111 */ V(1, 1, 2),
+  /* 1000 */ V(0, 1, 3),
+  /* 1001 */ V(0, 1, 3),
+  /* 1010 */ V(1, 0, 3),
+  /* 1011 */ V(1, 0, 3),
+  /* 1100 */ V(0, 0, 2),
+  /* 1101 */ V(0, 0, 2),
+  /* 1110 */ V(0, 0, 2),
+  /* 1111 */ V(0, 0, 2),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(48, 3),	/* 16 */
+  /* 0001 */ PTR(56, 2),
+  /* 0010 */ PTR(60, 1),
+  /* 0011 */ V(1, 5, 4),
+  /* 0100 */ V(5, 1, 4),
+  /* 0101 */ PTR(62, 1),
+  /* 0110 */ PTR(64, 1),
+  /* 0111 */ V(2, 4, 4),
+  /* 1000 */ V(4, 2, 4),
+  /* 1001 */ V(1, 4, 4),
+  /* 1010 */ V(4, 1, 3),
+  /* 1011 */ V(4, 1, 3),
+  /* 1100 */ V(0, 4, 4),
+  /* 1101 */ V(4, 0, 4),
+  /* 1110 */ V(2, 3, 4),
+  /* 1111 */ V(3, 2, 4),
+
+  /* 0001 ... */
+  /* 0000 */ V(1, 3, 4),	/* 32 */
+  /* 0001 */ V(3, 1, 4),
+  /* 0010 */ V(0, 3, 4),
+  /* 0011 */ V(3, 0, 4),
+  /* 0100 */ V(2, 2, 2),
+  /* 0101 */ V(2, 2, 2),
+  /* 0110 */ V(2, 2, 2),
+  /* 0111 */ V(2, 2, 2),
+  /* 1000 */ V(0, 2, 2),
+  /* 1001 */ V(0, 2, 2),
+  /* 1010 */ V(0, 2, 2),
+  /* 1011 */ V(0, 2, 2),
+  /* 1100 */ V(2, 0, 2),
+  /* 1101 */ V(2, 0, 2),
+  /* 1110 */ V(2, 0, 2),
+  /* 1111 */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 000  */ V(5, 5, 3),	/* 48 */
+  /* 001  */ V(5, 4, 3),
+  /* 010  */ V(4, 5, 2),
+  /* 011  */ V(4, 5, 2),
+  /* 100  */ V(5, 3, 1),
+  /* 101  */ V(5, 3, 1),
+  /* 110  */ V(5, 3, 1),
+  /* 111  */ V(5, 3, 1),
+
+  /* 0000 0001 ... */
+  /* 00   */ V(3, 5, 2),	/* 56 */
+  /* 01   */ V(4, 4, 2),
+  /* 10   */ V(2, 5, 1),
+  /* 11   */ V(2, 5, 1),
+
+  /* 0000 0010 ... */
+  /* 0    */ V(5, 2, 1),	/* 60 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0000 0101 ... */
+  /* 0    */ V(3, 4, 1),	/* 62 */
+  /* 1    */ V(4, 3, 1),
+
+  /* 0000 0110 ... */
+  /* 0    */ V(5, 0, 1),	/* 64 */
+  /* 1    */ V(3, 3, 1)
+];
+
+var hufftab9 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 3),
+  /* 0010 */ PTR(40, 2),
+  /* 0011 */ PTR(44, 2),
+  /* 0100 */ PTR(48, 1),
+  /* 0101 */ V(1, 2, 4),
+  /* 0110 */ V(2, 1, 4),
+  /* 0111 */ V(2, 0, 4),
+  /* 1000 */ V(1, 1, 3),
+  /* 1001 */ V(1, 1, 3),
+  /* 1010 */ V(0, 1, 3),
+  /* 1011 */ V(0, 1, 3),
+  /* 1100 */ V(1, 0, 3),
+  /* 1101 */ V(1, 0, 3),
+  /* 1110 */ V(0, 0, 3),
+  /* 1111 */ V(0, 0, 3),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(50, 1),	/* 16 */
+  /* 0001 */ V(3, 5, 4),
+  /* 0010 */ V(5, 3, 4),
+  /* 0011 */ PTR(52, 1),
+  /* 0100 */ V(4, 4, 4),
+  /* 0101 */ V(2, 5, 4),
+  /* 0110 */ V(5, 2, 4),
+  /* 0111 */ V(1, 5, 4),
+  /* 1000 */ V(5, 1, 3),
+  /* 1001 */ V(5, 1, 3),
+  /* 1010 */ V(3, 4, 3),
+  /* 1011 */ V(3, 4, 3),
+  /* 1100 */ V(4, 3, 3),
+  /* 1101 */ V(4, 3, 3),
+  /* 1110 */ V(5, 0, 4),
+  /* 1111 */ V(0, 4, 4),
+
+  /* 0001 ... */
+  /* 000  */ V(2, 4, 3),	/* 32 */
+  /* 001  */ V(4, 2, 3),
+  /* 010  */ V(3, 3, 3),
+  /* 011  */ V(4, 0, 3),
+  /* 100  */ V(1, 4, 2),
+  /* 101  */ V(1, 4, 2),
+  /* 110  */ V(4, 1, 2),
+  /* 111  */ V(4, 1, 2),
+
+  /* 0010 ... */
+  /* 00   */ V(2, 3, 2),	/* 40 */
+  /* 01   */ V(3, 2, 2),
+  /* 10   */ V(1, 3, 1),
+  /* 11   */ V(1, 3, 1),
+
+  /* 0011 ... */
+  /* 00   */ V(3, 1, 1),	/* 44 */
+  /* 01   */ V(3, 1, 1),
+  /* 10   */ V(0, 3, 2),
+  /* 11   */ V(3, 0, 2),
+
+  /* 0100 ... */
+  /* 0    */ V(2, 2, 1),	/* 48 */
+  /* 1    */ V(0, 2, 1),
+
+  /* 0000 0000 ... */
+  /* 0    */ V(5, 5, 1),	/* 50 */
+  /* 1    */ V(4, 5, 1),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(5, 4, 1),	/* 52 */
+  /* 1    */ V(0, 5, 1)
+];
+
+var hufftab10 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 2),
+  /* 0011 */ V(1, 1, 4),
+  /* 0100 */ V(0, 1, 3),
+  /* 0101 */ V(0, 1, 3),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(52, 3),	/* 16 */
+  /* 0001 */ PTR(60, 2),
+  /* 0010 */ PTR(64, 3),
+  /* 0011 */ PTR(72, 1),
+  /* 0100 */ PTR(74, 2),
+  /* 0101 */ PTR(78, 2),
+  /* 0110 */ PTR(82, 2),
+  /* 0111 */ V(1, 7, 4),
+  /* 1000 */ V(7, 1, 4),
+  /* 1001 */ PTR(86, 1),
+  /* 1010 */ PTR(88, 2),
+  /* 1011 */ PTR(92, 2),
+  /* 1100 */ V(1, 6, 4),
+  /* 1101 */ V(6, 1, 4),
+  /* 1110 */ V(6, 0, 4),
+  /* 1111 */ PTR(96, 1),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(98, 1),	/* 32 */
+  /* 0001 */ PTR(100, 1),
+  /* 0010 */ V(1, 4, 4),
+  /* 0011 */ V(4, 1, 4),
+  /* 0100 */ V(4, 0, 4),
+  /* 0101 */ V(2, 3, 4),
+  /* 0110 */ V(3, 2, 4),
+  /* 0111 */ V(0, 3, 4),
+  /* 1000 */ V(1, 3, 3),
+  /* 1001 */ V(1, 3, 3),
+  /* 1010 */ V(3, 1, 3),
+  /* 1011 */ V(3, 1, 3),
+  /* 1100 */ V(3, 0, 3),
+  /* 1101 */ V(3, 0, 3),
+  /* 1110 */ V(2, 2, 3),
+  /* 1111 */ V(2, 2, 3),
+
+  /* 0010 ... */
+  /* 00   */ V(1, 2, 2),	/* 48 */
+  /* 01   */ V(2, 1, 2),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 000  */ V(7, 7, 3),	/* 52 */
+  /* 001  */ V(6, 7, 3),
+  /* 010  */ V(7, 6, 3),
+  /* 011  */ V(5, 7, 3),
+  /* 100  */ V(7, 5, 3),
+  /* 101  */ V(6, 6, 3),
+  /* 110  */ V(4, 7, 2),
+  /* 111  */ V(4, 7, 2),
+
+  /* 0000 0001 ... */
+  /* 00   */ V(7, 4, 2),	/* 60 */
+  /* 01   */ V(5, 6, 2),
+  /* 10   */ V(6, 5, 2),
+  /* 11   */ V(3, 7, 2),
+
+  /* 0000 0010 ... */
+  /* 000  */ V(7, 3, 2),	/* 64 */
+  /* 001  */ V(7, 3, 2),
+  /* 010  */ V(4, 6, 2),
+  /* 011  */ V(4, 6, 2),
+  /* 100  */ V(5, 5, 3),
+  /* 101  */ V(5, 4, 3),
+  /* 110  */ V(6, 3, 2),
+  /* 111  */ V(6, 3, 2),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(2, 7, 1),	/* 72 */
+  /* 1    */ V(7, 2, 1),
+
+  /* 0000 0100 ... */
+  /* 00   */ V(6, 4, 2),	/* 74 */
+  /* 01   */ V(0, 7, 2),
+  /* 10   */ V(7, 0, 1),
+  /* 11   */ V(7, 0, 1),
+
+  /* 0000 0101 ... */
+  /* 00   */ V(6, 2, 1),	/* 78 */
+  /* 01   */ V(6, 2, 1),
+  /* 10   */ V(4, 5, 2),
+  /* 11   */ V(3, 5, 2),
+
+  /* 0000 0110 ... */
+  /* 00   */ V(0, 6, 1),	/* 82 */
+  /* 01   */ V(0, 6, 1),
+  /* 10   */ V(5, 3, 2),
+  /* 11   */ V(4, 4, 2),
+
+  /* 0000 1001 ... */
+  /* 0    */ V(3, 6, 1),	/* 86 */
+  /* 1    */ V(2, 6, 1),
+
+  /* 0000 1010 ... */
+  /* 00   */ V(2, 5, 2),	/* 88 */
+  /* 01   */ V(5, 2, 2),
+  /* 10   */ V(1, 5, 1),
+  /* 11   */ V(1, 5, 1),
+
+  /* 0000 1011 ... */
+  /* 00   */ V(5, 1, 1),	/* 92 */
+  /* 01   */ V(5, 1, 1),
+  /* 10   */ V(3, 4, 2),
+  /* 11   */ V(4, 3, 2),
+
+  /* 0000 1111 ... */
+  /* 0    */ V(0, 5, 1),	/* 96 */
+  /* 1    */ V(5, 0, 1),
+
+  /* 0001 0000 ... */
+  /* 0    */ V(2, 4, 1),	/* 98 */
+  /* 1    */ V(4, 2, 1),
+
+  /* 0001 0001 ... */
+  /* 0    */ V(3, 3, 1),	/* 100 */
+  /* 1    */ V(0, 4, 1)
+];
+
+var hufftab11 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 3),
+  /* 0100 */ V(1, 2, 4),
+  /* 0101 */ PTR(72, 1),
+  /* 0110 */ V(1, 1, 3),
+  /* 0111 */ V(1, 1, 3),
+  /* 1000 */ V(0, 1, 3),
+  /* 1001 */ V(0, 1, 3),
+  /* 1010 */ V(1, 0, 3),
+  /* 1011 */ V(1, 0, 3),
+  /* 1100 */ V(0, 0, 2),
+  /* 1101 */ V(0, 0, 2),
+  /* 1110 */ V(0, 0, 2),
+  /* 1111 */ V(0, 0, 2),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(74, 2),	/* 16 */
+  /* 0001 */ PTR(78, 3),
+  /* 0010 */ PTR(86, 2),
+  /* 0011 */ PTR(90, 1),
+  /* 0100 */ PTR(92, 2),
+  /* 0101 */ V(2, 7, 4),
+  /* 0110 */ V(7, 2, 4),
+  /* 0111 */ PTR(96, 1),
+  /* 1000 */ V(7, 1, 3),
+  /* 1001 */ V(7, 1, 3),
+  /* 1010 */ V(1, 7, 4),
+  /* 1011 */ V(7, 0, 4),
+  /* 1100 */ V(3, 6, 4),
+  /* 1101 */ V(6, 3, 4),
+  /* 1110 */ V(6, 0, 4),
+  /* 1111 */ PTR(98, 1),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(100, 1),	/* 32 */
+  /* 0001 */ V(1, 5, 4),
+  /* 0010 */ V(6, 2, 3),
+  /* 0011 */ V(6, 2, 3),
+  /* 0100 */ V(2, 6, 4),
+  /* 0101 */ V(0, 6, 4),
+  /* 0110 */ V(1, 6, 3),
+  /* 0111 */ V(1, 6, 3),
+  /* 1000 */ V(6, 1, 3),
+  /* 1001 */ V(6, 1, 3),
+  /* 1010 */ V(5, 1, 4),
+  /* 1011 */ V(3, 4, 4),
+  /* 1100 */ V(5, 0, 4),
+  /* 1101 */ PTR(102, 1),
+  /* 1110 */ V(2, 4, 4),
+  /* 1111 */ V(4, 2, 4),
+
+  /* 0010 ... */
+  /* 0000 */ V(1, 4, 4),	/* 48 */
+  /* 0001 */ V(4, 1, 4),
+  /* 0010 */ V(0, 4, 4),
+  /* 0011 */ V(4, 0, 4),
+  /* 0100 */ V(2, 3, 3),
+  /* 0101 */ V(2, 3, 3),
+  /* 0110 */ V(3, 2, 3),
+  /* 0111 */ V(3, 2, 3),
+  /* 1000 */ V(1, 3, 2),
+  /* 1001 */ V(1, 3, 2),
+  /* 1010 */ V(1, 3, 2),
+  /* 1011 */ V(1, 3, 2),
+  /* 1100 */ V(3, 1, 2),
+  /* 1101 */ V(3, 1, 2),
+  /* 1110 */ V(3, 1, 2),
+  /* 1111 */ V(3, 1, 2),
+
+  /* 0011 ... */
+  /* 000  */ V(0, 3, 3),	/* 64 */
+  /* 001  */ V(3, 0, 3),
+  /* 010  */ V(2, 2, 2),
+  /* 011  */ V(2, 2, 2),
+  /* 100  */ V(2, 1, 1),
+  /* 101  */ V(2, 1, 1),
+  /* 110  */ V(2, 1, 1),
+  /* 111  */ V(2, 1, 1),
+
+  /* 0101 ... */
+  /* 0    */ V(0, 2, 1),	/* 72 */
+  /* 1    */ V(2, 0, 1),
+
+  /* 0000 0000 ... */
+  /* 00   */ V(7, 7, 2),	/* 74 */
+  /* 01   */ V(6, 7, 2),
+  /* 10   */ V(7, 6, 2),
+  /* 11   */ V(7, 5, 2),
+
+  /* 0000 0001 ... */
+  /* 000  */ V(6, 6, 2),	/* 78 */
+  /* 001  */ V(6, 6, 2),
+  /* 010  */ V(4, 7, 2),
+  /* 011  */ V(4, 7, 2),
+  /* 100  */ V(7, 4, 2),
+  /* 101  */ V(7, 4, 2),
+  /* 110  */ V(5, 7, 3),
+  /* 111  */ V(5, 5, 3),
+
+  /* 0000 0010 ... */
+  /* 00   */ V(5, 6, 2),	/* 86 */
+  /* 01   */ V(6, 5, 2),
+  /* 10   */ V(3, 7, 1),
+  /* 11   */ V(3, 7, 1),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(7, 3, 1),	/* 90 */
+  /* 1    */ V(4, 6, 1),
+
+  /* 0000 0100 ... */
+  /* 00   */ V(4, 5, 2),	/* 92 */
+  /* 01   */ V(5, 4, 2),
+  /* 10   */ V(3, 5, 2),
+  /* 11   */ V(5, 3, 2),
+
+  /* 0000 0111 ... */
+  /* 0    */ V(6, 4, 1),	/* 96 */
+  /* 1    */ V(0, 7, 1),
+
+  /* 0000 1111 ... */
+  /* 0    */ V(4, 4, 1),	/* 98 */
+  /* 1    */ V(2, 5, 1),
+
+  /* 0001 0000 ... */
+  /* 0    */ V(5, 2, 1),	/* 100 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(4, 3, 1),	/* 102 */
+  /* 1    */ V(3, 3, 1)
+];
+
+var hufftab12 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 2),
+  /* 0100 */ PTR(68, 3),
+  /* 0101 */ PTR(76, 1),
+  /* 0110 */ V(1, 2, 4),
+  /* 0111 */ V(2, 1, 4),
+  /* 1000 */ PTR(78, 1),
+  /* 1001 */ V(0, 0, 4),
+  /* 1010 */ V(1, 1, 3),
+  /* 1011 */ V(1, 1, 3),
+  /* 1100 */ V(0, 1, 3),
+  /* 1101 */ V(0, 1, 3),
+  /* 1110 */ V(1, 0, 3),
+  /* 1111 */ V(1, 0, 3),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(80, 2),	/* 16 */
+  /* 0001 */ PTR(84, 1),
+  /* 0010 */ PTR(86, 1),
+  /* 0011 */ PTR(88, 1),
+  /* 0100 */ V(5, 6, 4),
+  /* 0101 */ V(3, 7, 4),
+  /* 0110 */ PTR(90, 1),
+  /* 0111 */ V(2, 7, 4),
+  /* 1000 */ V(7, 2, 4),
+  /* 1001 */ V(4, 6, 4),
+  /* 1010 */ V(6, 4, 4),
+  /* 1011 */ V(1, 7, 4),
+  /* 1100 */ V(7, 1, 4),
+  /* 1101 */ PTR(92, 1),
+  /* 1110 */ V(3, 6, 4),
+  /* 1111 */ V(6, 3, 4),
+
+  /* 0001 ... */
+  /* 0000 */ V(4, 5, 4),	/* 32 */
+  /* 0001 */ V(5, 4, 4),
+  /* 0010 */ V(4, 4, 4),
+  /* 0011 */ PTR(94, 1),
+  /* 0100 */ V(2, 6, 3),
+  /* 0101 */ V(2, 6, 3),
+  /* 0110 */ V(6, 2, 3),
+  /* 0111 */ V(6, 2, 3),
+  /* 1000 */ V(6, 1, 3),
+  /* 1001 */ V(6, 1, 3),
+  /* 1010 */ V(1, 6, 4),
+  /* 1011 */ V(6, 0, 4),
+  /* 1100 */ V(3, 5, 4),
+  /* 1101 */ V(5, 3, 4),
+  /* 1110 */ V(2, 5, 4),
+  /* 1111 */ V(5, 2, 4),
+
+  /* 0010 ... */
+  /* 0000 */ V(1, 5, 3),	/* 48 */
+  /* 0001 */ V(1, 5, 3),
+  /* 0010 */ V(5, 1, 3),
+  /* 0011 */ V(5, 1, 3),
+  /* 0100 */ V(3, 4, 3),
+  /* 0101 */ V(3, 4, 3),
+  /* 0110 */ V(4, 3, 3),
+  /* 0111 */ V(4, 3, 3),
+  /* 1000 */ V(5, 0, 4),
+  /* 1001 */ V(0, 4, 4),
+  /* 1010 */ V(2, 4, 3),
+  /* 1011 */ V(2, 4, 3),
+  /* 1100 */ V(4, 2, 3),
+  /* 1101 */ V(4, 2, 3),
+  /* 1110 */ V(1, 4, 3),
+  /* 1111 */ V(1, 4, 3),
+
+  /* 0011 ... */
+  /* 00   */ V(3, 3, 2),	/* 64 */
+  /* 01   */ V(4, 1, 2),
+  /* 10   */ V(2, 3, 2),
+  /* 11   */ V(3, 2, 2),
+
+  /* 0100 ... */
+  /* 000  */ V(4, 0, 3),	/* 68 */
+  /* 001  */ V(0, 3, 3),
+  /* 010  */ V(3, 0, 2),
+  /* 011  */ V(3, 0, 2),
+  /* 100  */ V(1, 3, 1),
+  /* 101  */ V(1, 3, 1),
+  /* 110  */ V(1, 3, 1),
+  /* 111  */ V(1, 3, 1),
+
+  /* 0101 ... */
+  /* 0    */ V(3, 1, 1),	/* 76 */
+  /* 1    */ V(2, 2, 1),
+
+  /* 1000 ... */
+  /* 0    */ V(0, 2, 1),	/* 78 */
+  /* 1    */ V(2, 0, 1),
+
+  /* 0000 0000 ... */
+  /* 00   */ V(7, 7, 2),	/* 80 */
+  /* 01   */ V(6, 7, 2),
+  /* 10   */ V(7, 6, 1),
+  /* 11   */ V(7, 6, 1),
+
+  /* 0000 0001 ... */
+  /* 0    */ V(5, 7, 1),	/* 84 */
+  /* 1    */ V(7, 5, 1),
+
+  /* 0000 0010 ... */
+  /* 0    */ V(6, 6, 1),	/* 86 */
+  /* 1    */ V(4, 7, 1),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(7, 4, 1),	/* 88 */
+  /* 1    */ V(6, 5, 1),
+
+  /* 0000 0110 ... */
+  /* 0    */ V(7, 3, 1),	/* 90 */
+  /* 1    */ V(5, 5, 1),
+
+  /* 0000 1101 ... */
+  /* 0    */ V(0, 7, 1),	/* 92 */
+  /* 1    */ V(7, 0, 1),
+
+  /* 0001 0011 ... */
+  /* 0    */ V(0, 6, 1),	/* 94 */
+  /* 1    */ V(0, 5, 1)
+];
+
+var hufftab13 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 2),
+  /* 0100 */ V(1, 1, 4),
+  /* 0101 */ V(0, 1, 4),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(68, 4),	/* 16 */
+  /* 0001 */ PTR(84, 4),
+  /* 0010 */ PTR(100, 4),
+  /* 0011 */ PTR(116, 4),
+  /* 0100 */ PTR(132, 4),
+  /* 0101 */ PTR(148, 4),
+  /* 0110 */ PTR(164, 3),
+  /* 0111 */ PTR(172, 3),
+  /* 1000 */ PTR(180, 3),
+  /* 1001 */ PTR(188, 3),
+  /* 1010 */ PTR(196, 3),
+  /* 1011 */ PTR(204, 3),
+  /* 1100 */ PTR(212, 1),
+  /* 1101 */ PTR(214, 2),
+  /* 1110 */ PTR(218, 3),
+  /* 1111 */ PTR(226, 1),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(228, 2),	/* 32 */
+  /* 0001 */ PTR(232, 2),
+  /* 0010 */ PTR(236, 2),
+  /* 0011 */ PTR(240, 2),
+  /* 0100 */ V(8, 1, 4),
+  /* 0101 */ PTR(244, 1),
+  /* 0110 */ PTR(246, 1),
+  /* 0111 */ PTR(248, 1),
+  /* 1000 */ PTR(250, 2),
+  /* 1001 */ PTR(254, 1),
+  /* 1010 */ V(1, 5, 4),
+  /* 1011 */ V(5, 1, 4),
+  /* 1100 */ PTR(256, 1),
+  /* 1101 */ PTR(258, 1),
+  /* 1110 */ PTR(260, 1),
+  /* 1111 */ V(1, 4, 4),
+
+  /* 0010 ... */
+  /* 0000 */ V(4, 1, 3),	/* 48 */
+  /* 0001 */ V(4, 1, 3),
+  /* 0010 */ V(0, 4, 4),
+  /* 0011 */ V(4, 0, 4),
+  /* 0100 */ V(2, 3, 4),
+  /* 0101 */ V(3, 2, 4),
+  /* 0110 */ V(1, 3, 3),
+  /* 0111 */ V(1, 3, 3),
+  /* 1000 */ V(3, 1, 3),
+  /* 1001 */ V(3, 1, 3),
+  /* 1010 */ V(0, 3, 3),
+  /* 1011 */ V(0, 3, 3),
+  /* 1100 */ V(3, 0, 3),
+  /* 1101 */ V(3, 0, 3),
+  /* 1110 */ V(2, 2, 3),
+  /* 1111 */ V(2, 2, 3),
+
+  /* 0011 ... */
+  /* 00   */ V(1, 2, 2),	/* 64 */
+  /* 01   */ V(2, 1, 2),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 0000 */ PTR(262, 4),	/* 68 */
+  /* 0001 */ PTR(278, 4),
+  /* 0010 */ PTR(294, 4),
+  /* 0011 */ PTR(310, 3),
+  /* 0100 */ PTR(318, 2),
+  /* 0101 */ PTR(322, 2),
+  /* 0110 */ PTR(326, 3),
+  /* 0111 */ PTR(334, 2),
+  /* 1000 */ PTR(338, 1),
+  /* 1001 */ PTR(340, 2),
+  /* 1010 */ PTR(344, 2),
+  /* 1011 */ PTR(348, 2),
+  /* 1100 */ PTR(352, 2),
+  /* 1101 */ PTR(356, 2),
+  /* 1110 */ V(1, 15, 4),
+  /* 1111 */ V(15, 1, 4),
+
+  /* 0000 0001 ... */
+  /* 0000 */ V(15, 0, 4),	/* 84 */
+  /* 0001 */ PTR(360, 1),
+  /* 0010 */ PTR(362, 1),
+  /* 0011 */ PTR(364, 1),
+  /* 0100 */ V(14, 2, 4),
+  /* 0101 */ PTR(366, 1),
+  /* 0110 */ V(1, 14, 4),
+  /* 0111 */ V(14, 1, 4),
+  /* 1000 */ PTR(368, 1),
+  /* 1001 */ PTR(370, 1),
+  /* 1010 */ PTR(372, 1),
+  /* 1011 */ PTR(374, 1),
+  /* 1100 */ PTR(376, 1),
+  /* 1101 */ PTR(378, 1),
+  /* 1110 */ V(12, 6, 4),
+  /* 1111 */ V(3, 13, 4),
+
+  /* 0000 0010 ... */
+  /* 0000 */ PTR(380, 1),	/* 100 */
+  /* 0001 */ V(2, 13, 4),
+  /* 0010 */ V(13, 2, 4),
+  /* 0011 */ V(1, 13, 4),
+  /* 0100 */ V(11, 7, 4),
+  /* 0101 */ PTR(382, 1),
+  /* 0110 */ PTR(384, 1),
+  /* 0111 */ V(12, 3, 4),
+  /* 1000 */ PTR(386, 1),
+  /* 1001 */ V(4, 11, 4),
+  /* 1010 */ V(13, 1, 3),
+  /* 1011 */ V(13, 1, 3),
+  /* 1100 */ V(0, 13, 4),
+  /* 1101 */ V(13, 0, 4),
+  /* 1110 */ V(8, 10, 4),
+  /* 1111 */ V(10, 8, 4),
+
+  /* 0000 0011 ... */
+  /* 0000 */ V(4, 12, 4),	/* 116 */
+  /* 0001 */ V(12, 4, 4),
+  /* 0010 */ V(6, 11, 4),
+  /* 0011 */ V(11, 6, 4),
+  /* 0100 */ V(3, 12, 3),
+  /* 0101 */ V(3, 12, 3),
+  /* 0110 */ V(2, 12, 3),
+  /* 0111 */ V(2, 12, 3),
+  /* 1000 */ V(12, 2, 3),
+  /* 1001 */ V(12, 2, 3),
+  /* 1010 */ V(5, 11, 3),
+  /* 1011 */ V(5, 11, 3),
+  /* 1100 */ V(11, 5, 4),
+  /* 1101 */ V(8, 9, 4),
+  /* 1110 */ V(1, 12, 3),
+  /* 1111 */ V(1, 12, 3),
+
+  /* 0000 0100 ... */
+  /* 0000 */ V(12, 1, 3),	/* 132 */
+  /* 0001 */ V(12, 1, 3),
+  /* 0010 */ V(9, 8, 4),
+  /* 0011 */ V(0, 12, 4),
+  /* 0100 */ V(12, 0, 3),
+  /* 0101 */ V(12, 0, 3),
+  /* 0110 */ V(11, 4, 4),
+  /* 0111 */ V(6, 10, 4),
+  /* 1000 */ V(10, 6, 4),
+  /* 1001 */ V(7, 9, 4),
+  /* 1010 */ V(3, 11, 3),
+  /* 1011 */ V(3, 11, 3),
+  /* 1100 */ V(11, 3, 3),
+  /* 1101 */ V(11, 3, 3),
+  /* 1110 */ V(8, 8, 4),
+  /* 1111 */ V(5, 10, 4),
+
+  /* 0000 0101 ... */
+  /* 0000 */ V(2, 11, 3),	/* 148 */
+  /* 0001 */ V(2, 11, 3),
+  /* 0010 */ V(10, 5, 4),
+  /* 0011 */ V(6, 9, 4),
+  /* 0100 */ V(10, 4, 3),
+  /* 0101 */ V(10, 4, 3),
+  /* 0110 */ V(7, 8, 4),
+  /* 0111 */ V(8, 7, 4),
+  /* 1000 */ V(9, 4, 3),
+  /* 1001 */ V(9, 4, 3),
+  /* 1010 */ V(7, 7, 4),
+  /* 1011 */ V(7, 6, 4),
+  /* 1100 */ V(11, 2, 2),
+  /* 1101 */ V(11, 2, 2),
+  /* 1110 */ V(11, 2, 2),
+  /* 1111 */ V(11, 2, 2),
+
+  /* 0000 0110 ... */
+  /* 000  */ V(1, 11, 2),	/* 164 */
+  /* 001  */ V(1, 11, 2),
+  /* 010  */ V(11, 1, 2),
+  /* 011  */ V(11, 1, 2),
+  /* 100  */ V(0, 11, 3),
+  /* 101  */ V(11, 0, 3),
+  /* 110  */ V(9, 6, 3),
+  /* 111  */ V(4, 10, 3),
+
+  /* 0000 0111 ... */
+  /* 000  */ V(3, 10, 3),	/* 172 */
+  /* 001  */ V(10, 3, 3),
+  /* 010  */ V(5, 9, 3),
+  /* 011  */ V(9, 5, 3),
+  /* 100  */ V(2, 10, 2),
+  /* 101  */ V(2, 10, 2),
+  /* 110  */ V(10, 2, 2),
+  /* 111  */ V(10, 2, 2),
+
+  /* 0000 1000 ... */
+  /* 000  */ V(1, 10, 2),	/* 180 */
+  /* 001  */ V(1, 10, 2),
+  /* 010  */ V(10, 1, 2),
+  /* 011  */ V(10, 1, 2),
+  /* 100  */ V(0, 10, 3),
+  /* 101  */ V(6, 8, 3),
+  /* 110  */ V(10, 0, 2),
+  /* 111  */ V(10, 0, 2),
+
+  /* 0000 1001 ... */
+  /* 000  */ V(8, 6, 3),	/* 188 */
+  /* 001  */ V(4, 9, 3),
+  /* 010  */ V(9, 3, 2),
+  /* 011  */ V(9, 3, 2),
+  /* 100  */ V(3, 9, 3),
+  /* 101  */ V(5, 8, 3),
+  /* 110  */ V(8, 5, 3),
+  /* 111  */ V(6, 7, 3),
+
+  /* 0000 1010 ... */
+  /* 000  */ V(2, 9, 2),	/* 196 */
+  /* 001  */ V(2, 9, 2),
+  /* 010  */ V(9, 2, 2),
+  /* 011  */ V(9, 2, 2),
+  /* 100  */ V(5, 7, 3),
+  /* 101  */ V(7, 5, 3),
+  /* 110  */ V(3, 8, 2),
+  /* 111  */ V(3, 8, 2),
+
+  /* 0000 1011 ... */
+  /* 000  */ V(8, 3, 2),	/* 204 */
+  /* 001  */ V(8, 3, 2),
+  /* 010  */ V(6, 6, 3),
+  /* 011  */ V(4, 7, 3),
+  /* 100  */ V(7, 4, 3),
+  /* 101  */ V(5, 6, 3),
+  /* 110  */ V(6, 5, 3),
+  /* 111  */ V(7, 3, 3),
+
+  /* 0000 1100 ... */
+  /* 0    */ V(1, 9, 1),	/* 212 */
+  /* 1    */ V(9, 1, 1),
+
+  /* 0000 1101 ... */
+  /* 00   */ V(0, 9, 2),	/* 214 */
+  /* 01   */ V(9, 0, 2),
+  /* 10   */ V(4, 8, 2),
+  /* 11   */ V(8, 4, 2),
+
+  /* 0000 1110 ... */
+  /* 000  */ V(7, 2, 2),	/* 218 */
+  /* 001  */ V(7, 2, 2),
+  /* 010  */ V(4, 6, 3),
+  /* 011  */ V(6, 4, 3),
+  /* 100  */ V(2, 8, 1),
+  /* 101  */ V(2, 8, 1),
+  /* 110  */ V(2, 8, 1),
+  /* 111  */ V(2, 8, 1),
+
+  /* 0000 1111 ... */
+  /* 0    */ V(8, 2, 1),	/* 226 */
+  /* 1    */ V(1, 8, 1),
+
+  /* 0001 0000 ... */
+  /* 00   */ V(3, 7, 2),	/* 228 */
+  /* 01   */ V(2, 7, 2),
+  /* 10   */ V(1, 7, 1),
+  /* 11   */ V(1, 7, 1),
+
+  /* 0001 0001 ... */
+  /* 00   */ V(7, 1, 1),	/* 232 */
+  /* 01   */ V(7, 1, 1),
+  /* 10   */ V(5, 5, 2),
+  /* 11   */ V(0, 7, 2),
+
+  /* 0001 0010 ... */
+  /* 00   */ V(7, 0, 2),	/* 236 */
+  /* 01   */ V(3, 6, 2),
+  /* 10   */ V(6, 3, 2),
+  /* 11   */ V(4, 5, 2),
+
+  /* 0001 0011 ... */
+  /* 00   */ V(5, 4, 2),	/* 240 */
+  /* 01   */ V(2, 6, 2),
+  /* 10   */ V(6, 2, 2),
+  /* 11   */ V(3, 5, 2),
+
+  /* 0001 0101 ... */
+  /* 0    */ V(0, 8, 1),	/* 244 */
+  /* 1    */ V(8, 0, 1),
+
+  /* 0001 0110 ... */
+  /* 0    */ V(1, 6, 1),	/* 246 */
+  /* 1    */ V(6, 1, 1),
+
+  /* 0001 0111 ... */
+  /* 0    */ V(0, 6, 1),	/* 248 */
+  /* 1    */ V(6, 0, 1),
+
+  /* 0001 1000 ... */
+  /* 00   */ V(5, 3, 2),	/* 250 */
+  /* 01   */ V(4, 4, 2),
+  /* 10   */ V(2, 5, 1),
+  /* 11   */ V(2, 5, 1),
+
+  /* 0001 1001 ... */
+  /* 0    */ V(5, 2, 1),	/* 254 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0001 1100 ... */
+  /* 0    */ V(3, 4, 1),	/* 256 */
+  /* 1    */ V(4, 3, 1),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(5, 0, 1),	/* 258 */
+  /* 1    */ V(2, 4, 1),
+
+  /* 0001 1110 ... */
+  /* 0    */ V(4, 2, 1),	/* 260 */
+  /* 1    */ V(3, 3, 1),
+
+  /* 0000 0000 0000 ... */
+  /* 0000 */ PTR(388, 3),	/* 262 */
+  /* 0001 */ V(15, 15, 4),
+  /* 0010 */ V(14, 15, 4),
+  /* 0011 */ V(13, 15, 4),
+  /* 0100 */ V(14, 14, 4),
+  /* 0101 */ V(12, 15, 4),
+  /* 0110 */ V(13, 14, 4),
+  /* 0111 */ V(11, 15, 4),
+  /* 1000 */ V(15, 11, 4),
+  /* 1001 */ V(12, 14, 4),
+  /* 1010 */ V(13, 12, 4),
+  /* 1011 */ PTR(396, 1),
+  /* 1100 */ V(14, 12, 3),
+  /* 1101 */ V(14, 12, 3),
+  /* 1110 */ V(13, 13, 3),
+  /* 1111 */ V(13, 13, 3),
+
+  /* 0000 0000 0001 ... */
+  /* 0000 */ V(15, 10, 4),	/* 278 */
+  /* 0001 */ V(12, 13, 4),
+  /* 0010 */ V(11, 14, 3),
+  /* 0011 */ V(11, 14, 3),
+  /* 0100 */ V(14, 11, 3),
+  /* 0101 */ V(14, 11, 3),
+  /* 0110 */ V(9, 15, 3),
+  /* 0111 */ V(9, 15, 3),
+  /* 1000 */ V(15, 9, 3),
+  /* 1001 */ V(15, 9, 3),
+  /* 1010 */ V(14, 10, 3),
+  /* 1011 */ V(14, 10, 3),
+  /* 1100 */ V(11, 13, 3),
+  /* 1101 */ V(11, 13, 3),
+  /* 1110 */ V(13, 11, 3),
+  /* 1111 */ V(13, 11, 3),
+
+  /* 0000 0000 0010 ... */
+  /* 0000 */ V(8, 15, 3),	/* 294 */
+  /* 0001 */ V(8, 15, 3),
+  /* 0010 */ V(15, 8, 3),
+  /* 0011 */ V(15, 8, 3),
+  /* 0100 */ V(12, 12, 3),
+  /* 0101 */ V(12, 12, 3),
+  /* 0110 */ V(10, 14, 4),
+  /* 0111 */ V(9, 14, 4),
+  /* 1000 */ V(8, 14, 3),
+  /* 1001 */ V(8, 14, 3),
+  /* 1010 */ V(7, 15, 4),
+  /* 1011 */ V(7, 14, 4),
+  /* 1100 */ V(15, 7, 2),
+  /* 1101 */ V(15, 7, 2),
+  /* 1110 */ V(15, 7, 2),
+  /* 1111 */ V(15, 7, 2),
+
+  /* 0000 0000 0011 ... */
+  /* 000  */ V(13, 10, 2),	/* 310 */
+  /* 001  */ V(13, 10, 2),
+  /* 010  */ V(10, 13, 3),
+  /* 011  */ V(11, 12, 3),
+  /* 100  */ V(12, 11, 3),
+  /* 101  */ V(15, 6, 3),
+  /* 110  */ V(6, 15, 2),
+  /* 111  */ V(6, 15, 2),
+
+  /* 0000 0000 0100 ... */
+  /* 00   */ V(14, 8, 2),	/* 318 */
+  /* 01   */ V(5, 15, 2),
+  /* 10   */ V(9, 13, 2),
+  /* 11   */ V(13, 9, 2),
+
+  /* 0000 0000 0101 ... */
+  /* 00   */ V(15, 5, 2),	/* 322 */
+  /* 01   */ V(14, 7, 2),
+  /* 10   */ V(10, 12, 2),
+  /* 11   */ V(11, 11, 2),
+
+  /* 0000 0000 0110 ... */
+  /* 000  */ V(4, 15, 2),	/* 326 */
+  /* 001  */ V(4, 15, 2),
+  /* 010  */ V(15, 4, 2),
+  /* 011  */ V(15, 4, 2),
+  /* 100  */ V(12, 10, 3),
+  /* 101  */ V(14, 6, 3),
+  /* 110  */ V(15, 3, 2),
+  /* 111  */ V(15, 3, 2),
+
+  /* 0000 0000 0111 ... */
+  /* 00   */ V(3, 15, 1),	/* 334 */
+  /* 01   */ V(3, 15, 1),
+  /* 10   */ V(8, 13, 2),
+  /* 11   */ V(13, 8, 2),
+
+  /* 0000 0000 1000 ... */
+  /* 0    */ V(2, 15, 1),	/* 338 */
+  /* 1    */ V(15, 2, 1),
+
+  /* 0000 0000 1001 ... */
+  /* 00   */ V(6, 14, 2),	/* 340 */
+  /* 01   */ V(9, 12, 2),
+  /* 10   */ V(0, 15, 1),
+  /* 11   */ V(0, 15, 1),
+
+  /* 0000 0000 1010 ... */
+  /* 00   */ V(12, 9, 2),	/* 344 */
+  /* 01   */ V(5, 14, 2),
+  /* 10   */ V(10, 11, 1),
+  /* 11   */ V(10, 11, 1),
+
+  /* 0000 0000 1011 ... */
+  /* 00   */ V(7, 13, 2),	/* 348 */
+  /* 01   */ V(13, 7, 2),
+  /* 10   */ V(4, 14, 1),
+  /* 11   */ V(4, 14, 1),
+
+  /* 0000 0000 1100 ... */
+  /* 00   */ V(12, 8, 2),	/* 352 */
+  /* 01   */ V(13, 6, 2),
+  /* 10   */ V(3, 14, 1),
+  /* 11   */ V(3, 14, 1),
+
+  /* 0000 0000 1101 ... */
+  /* 00   */ V(11, 9, 1),	/* 356 */
+  /* 01   */ V(11, 9, 1),
+  /* 10   */ V(9, 11, 2),
+  /* 11   */ V(10, 10, 2),
+
+  /* 0000 0001 0001 ... */
+  /* 0    */ V(11, 10, 1),	/* 360 */
+  /* 1    */ V(14, 5, 1),
+
+  /* 0000 0001 0010 ... */
+  /* 0    */ V(14, 4, 1),	/* 362 */
+  /* 1    */ V(8, 12, 1),
+
+  /* 0000 0001 0011 ... */
+  /* 0    */ V(6, 13, 1),	/* 364 */
+  /* 1    */ V(14, 3, 1),
+
+  /* 0000 0001 0101 ... */
+  /* 0    */ V(2, 14, 1),	/* 366 */
+  /* 1    */ V(0, 14, 1),
+
+  /* 0000 0001 1000 ... */
+  /* 0    */ V(14, 0, 1),	/* 368 */
+  /* 1    */ V(5, 13, 1),
+
+  /* 0000 0001 1001 ... */
+  /* 0    */ V(13, 5, 1),	/* 370 */
+  /* 1    */ V(7, 12, 1),
+
+  /* 0000 0001 1010 ... */
+  /* 0    */ V(12, 7, 1),	/* 372 */
+  /* 1    */ V(4, 13, 1),
+
+  /* 0000 0001 1011 ... */
+  /* 0    */ V(8, 11, 1),	/* 374 */
+  /* 1    */ V(11, 8, 1),
+
+  /* 0000 0001 1100 ... */
+  /* 0    */ V(13, 4, 1),	/* 376 */
+  /* 1    */ V(9, 10, 1),
+
+  /* 0000 0001 1101 ... */
+  /* 0    */ V(10, 9, 1),	/* 378 */
+  /* 1    */ V(6, 12, 1),
+
+  /* 0000 0010 0000 ... */
+  /* 0    */ V(13, 3, 1),	/* 380 */
+  /* 1    */ V(7, 11, 1),
+
+  /* 0000 0010 0101 ... */
+  /* 0    */ V(5, 12, 1),	/* 382 */
+  /* 1    */ V(12, 5, 1),
+
+  /* 0000 0010 0110 ... */
+  /* 0    */ V(9, 9, 1),	/* 384 */
+  /* 1    */ V(7, 10, 1),
+
+  /* 0000 0010 1000 ... */
+  /* 0    */ V(10, 7, 1),	/* 386 */
+  /* 1    */ V(9, 7, 1),
+
+  /* 0000 0000 0000 0000 ... */
+  /* 000  */ V(15, 14, 3),	/* 388 */
+  /* 001  */ V(15, 12, 3),
+  /* 010  */ V(15, 13, 2),
+  /* 011  */ V(15, 13, 2),
+  /* 100  */ V(14, 13, 1),
+  /* 101  */ V(14, 13, 1),
+  /* 110  */ V(14, 13, 1),
+  /* 111  */ V(14, 13, 1),
+
+  /* 0000 0000 0000 1011 ... */
+  /* 0    */ V(10, 15, 1),	/* 396 */
+  /* 1    */ V(14, 9, 1)
+];
+
+var hufftab15 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 4),
+  /* 0100 */ PTR(80, 4),
+  /* 0101 */ PTR(96, 3),
+  /* 0110 */ PTR(104, 3),
+  /* 0111 */ PTR(112, 2),
+  /* 1000 */ PTR(116, 1),
+  /* 1001 */ PTR(118, 1),
+  /* 1010 */ V(1, 1, 3),
+  /* 1011 */ V(1, 1, 3),
+  /* 1100 */ V(0, 1, 4),
+  /* 1101 */ V(1, 0, 4),
+  /* 1110 */ V(0, 0, 3),
+  /* 1111 */ V(0, 0, 3),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(120, 4),	/* 16 */
+  /* 0001 */ PTR(136, 4),
+  /* 0010 */ PTR(152, 4),
+  /* 0011 */ PTR(168, 4),
+  /* 0100 */ PTR(184, 4),
+  /* 0101 */ PTR(200, 3),
+  /* 0110 */ PTR(208, 3),
+  /* 0111 */ PTR(216, 4),
+  /* 1000 */ PTR(232, 3),
+  /* 1001 */ PTR(240, 3),
+  /* 1010 */ PTR(248, 3),
+  /* 1011 */ PTR(256, 3),
+  /* 1100 */ PTR(264, 2),
+  /* 1101 */ PTR(268, 3),
+  /* 1110 */ PTR(276, 3),
+  /* 1111 */ PTR(284, 2),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(288, 2),	/* 32 */
+  /* 0001 */ PTR(292, 2),
+  /* 0010 */ PTR(296, 2),
+  /* 0011 */ PTR(300, 2),
+  /* 0100 */ PTR(304, 2),
+  /* 0101 */ PTR(308, 2),
+  /* 0110 */ PTR(312, 2),
+  /* 0111 */ PTR(316, 2),
+  /* 1000 */ PTR(320, 1),
+  /* 1001 */ PTR(322, 1),
+  /* 1010 */ PTR(324, 1),
+  /* 1011 */ PTR(326, 2),
+  /* 1100 */ PTR(330, 1),
+  /* 1101 */ PTR(332, 1),
+  /* 1110 */ PTR(334, 2),
+  /* 1111 */ PTR(338, 1),
+
+  /* 0010 ... */
+  /* 0000 */ PTR(340, 1),	/* 48 */
+  /* 0001 */ PTR(342, 1),
+  /* 0010 */ V(9, 1, 4),
+  /* 0011 */ PTR(344, 1),
+  /* 0100 */ PTR(346, 1),
+  /* 0101 */ PTR(348, 1),
+  /* 0110 */ PTR(350, 1),
+  /* 0111 */ PTR(352, 1),
+  /* 1000 */ V(2, 8, 4),
+  /* 1001 */ V(8, 2, 4),
+  /* 1010 */ V(1, 8, 4),
+  /* 1011 */ V(8, 1, 4),
+  /* 1100 */ PTR(354, 1),
+  /* 1101 */ PTR(356, 1),
+  /* 1110 */ PTR(358, 1),
+  /* 1111 */ PTR(360, 1),
+
+  /* 0011 ... */
+  /* 0000 */ V(2, 7, 4),	/* 64 */
+  /* 0001 */ V(7, 2, 4),
+  /* 0010 */ V(6, 4, 4),
+  /* 0011 */ V(1, 7, 4),
+  /* 0100 */ V(5, 5, 4),
+  /* 0101 */ V(7, 1, 4),
+  /* 0110 */ PTR(362, 1),
+  /* 0111 */ V(3, 6, 4),
+  /* 1000 */ V(6, 3, 4),
+  /* 1001 */ V(4, 5, 4),
+  /* 1010 */ V(5, 4, 4),
+  /* 1011 */ V(2, 6, 4),
+  /* 1100 */ V(6, 2, 4),
+  /* 1101 */ V(1, 6, 4),
+  /* 1110 */ PTR(364, 1),
+  /* 1111 */ V(3, 5, 4),
+
+  /* 0100 ... */
+  /* 0000 */ V(6, 1, 3),	/* 80 */
+  /* 0001 */ V(6, 1, 3),
+  /* 0010 */ V(5, 3, 4),
+  /* 0011 */ V(4, 4, 4),
+  /* 0100 */ V(2, 5, 3),
+  /* 0101 */ V(2, 5, 3),
+  /* 0110 */ V(5, 2, 3),
+  /* 0111 */ V(5, 2, 3),
+  /* 1000 */ V(1, 5, 3),
+  /* 1001 */ V(1, 5, 3),
+  /* 1010 */ V(5, 1, 3),
+  /* 1011 */ V(5, 1, 3),
+  /* 1100 */ V(0, 5, 4),
+  /* 1101 */ V(5, 0, 4),
+  /* 1110 */ V(3, 4, 3),
+  /* 1111 */ V(3, 4, 3),
+
+  /* 0101 ... */
+  /* 000  */ V(4, 3, 3),	/* 96 */
+  /* 001  */ V(2, 4, 3),
+  /* 010  */ V(4, 2, 3),
+  /* 011  */ V(3, 3, 3),
+  /* 100  */ V(4, 1, 2),
+  /* 101  */ V(4, 1, 2),
+  /* 110  */ V(1, 4, 3),
+  /* 111  */ V(0, 4, 3),
+
+  /* 0110 ... */
+  /* 000  */ V(2, 3, 2),	/* 104 */
+  /* 001  */ V(2, 3, 2),
+  /* 010  */ V(3, 2, 2),
+  /* 011  */ V(3, 2, 2),
+  /* 100  */ V(4, 0, 3),
+  /* 101  */ V(0, 3, 3),
+  /* 110  */ V(1, 3, 2),
+  /* 111  */ V(1, 3, 2),
+
+  /* 0111 ... */
+  /* 00   */ V(3, 1, 2),	/* 112 */
+  /* 01   */ V(3, 0, 2),
+  /* 10   */ V(2, 2, 1),
+  /* 11   */ V(2, 2, 1),
+
+  /* 1000 ... */
+  /* 0    */ V(1, 2, 1),	/* 116 */
+  /* 1    */ V(2, 1, 1),
+
+  /* 1001 ... */
+  /* 0    */ V(0, 2, 1),	/* 118 */
+  /* 1    */ V(2, 0, 1),
+
+  /* 0000 0000 ... */
+  /* 0000 */ PTR(366, 1),	/* 120 */
+  /* 0001 */ PTR(368, 1),
+  /* 0010 */ V(14, 14, 4),
+  /* 0011 */ PTR(370, 1),
+  /* 0100 */ PTR(372, 1),
+  /* 0101 */ PTR(374, 1),
+  /* 0110 */ V(15, 11, 4),
+  /* 0111 */ PTR(376, 1),
+  /* 1000 */ V(13, 13, 4),
+  /* 1001 */ V(10, 15, 4),
+  /* 1010 */ V(15, 10, 4),
+  /* 1011 */ V(11, 14, 4),
+  /* 1100 */ V(14, 11, 4),
+  /* 1101 */ V(12, 13, 4),
+  /* 1110 */ V(13, 12, 4),
+  /* 1111 */ V(9, 15, 4),
+
+  /* 0000 0001 ... */
+  /* 0000 */ V(15, 9, 4),	/* 136 */
+  /* 0001 */ V(14, 10, 4),
+  /* 0010 */ V(11, 13, 4),
+  /* 0011 */ V(13, 11, 4),
+  /* 0100 */ V(8, 15, 4),
+  /* 0101 */ V(15, 8, 4),
+  /* 0110 */ V(12, 12, 4),
+  /* 0111 */ V(9, 14, 4),
+  /* 1000 */ V(14, 9, 4),
+  /* 1001 */ V(7, 15, 4),
+  /* 1010 */ V(15, 7, 4),
+  /* 1011 */ V(10, 13, 4),
+  /* 1100 */ V(13, 10, 4),
+  /* 1101 */ V(11, 12, 4),
+  /* 1110 */ V(6, 15, 4),
+  /* 1111 */ PTR(378, 1),
+
+  /* 0000 0010 ... */
+  /* 0000 */ V(12, 11, 3),	/* 152 */
+  /* 0001 */ V(12, 11, 3),
+  /* 0010 */ V(15, 6, 3),
+  /* 0011 */ V(15, 6, 3),
+  /* 0100 */ V(8, 14, 4),
+  /* 0101 */ V(14, 8, 4),
+  /* 0110 */ V(5, 15, 4),
+  /* 0111 */ V(9, 13, 4),
+  /* 1000 */ V(15, 5, 3),
+  /* 1001 */ V(15, 5, 3),
+  /* 1010 */ V(7, 14, 3),
+  /* 1011 */ V(7, 14, 3),
+  /* 1100 */ V(14, 7, 3),
+  /* 1101 */ V(14, 7, 3),
+  /* 1110 */ V(10, 12, 3),
+  /* 1111 */ V(10, 12, 3),
+
+  /* 0000 0011 ... */
+  /* 0000 */ V(12, 10, 3),	/* 168 */
+  /* 0001 */ V(12, 10, 3),
+  /* 0010 */ V(11, 11, 3),
+  /* 0011 */ V(11, 11, 3),
+  /* 0100 */ V(13, 9, 4),
+  /* 0101 */ V(8, 13, 4),
+  /* 0110 */ V(4, 15, 3),
+  /* 0111 */ V(4, 15, 3),
+  /* 1000 */ V(15, 4, 3),
+  /* 1001 */ V(15, 4, 3),
+  /* 1010 */ V(3, 15, 3),
+  /* 1011 */ V(3, 15, 3),
+  /* 1100 */ V(15, 3, 3),
+  /* 1101 */ V(15, 3, 3),
+  /* 1110 */ V(13, 8, 3),
+  /* 1111 */ V(13, 8, 3),
+
+  /* 0000 0100 ... */
+  /* 0000 */ V(14, 6, 3),	/* 184 */
+  /* 0001 */ V(14, 6, 3),
+  /* 0010 */ V(2, 15, 3),
+  /* 0011 */ V(2, 15, 3),
+  /* 0100 */ V(15, 2, 3),
+  /* 0101 */ V(15, 2, 3),
+  /* 0110 */ V(6, 14, 4),
+  /* 0111 */ V(15, 0, 4),
+  /* 1000 */ V(1, 15, 3),
+  /* 1001 */ V(1, 15, 3),
+  /* 1010 */ V(15, 1, 3),
+  /* 1011 */ V(15, 1, 3),
+  /* 1100 */ V(9, 12, 3),
+  /* 1101 */ V(9, 12, 3),
+  /* 1110 */ V(12, 9, 3),
+  /* 1111 */ V(12, 9, 3),
+
+  /* 0000 0101 ... */
+  /* 000  */ V(5, 14, 3),	/* 200 */
+  /* 001  */ V(10, 11, 3),
+  /* 010  */ V(11, 10, 3),
+  /* 011  */ V(14, 5, 3),
+  /* 100  */ V(7, 13, 3),
+  /* 101  */ V(13, 7, 3),
+  /* 110  */ V(4, 14, 3),
+  /* 111  */ V(14, 4, 3),
+
+  /* 0000 0110 ... */
+  /* 000  */ V(8, 12, 3),	/* 208 */
+  /* 001  */ V(12, 8, 3),
+  /* 010  */ V(3, 14, 3),
+  /* 011  */ V(6, 13, 3),
+  /* 100  */ V(13, 6, 3),
+  /* 101  */ V(14, 3, 3),
+  /* 110  */ V(9, 11, 3),
+  /* 111  */ V(11, 9, 3),
+
+  /* 0000 0111 ... */
+  /* 0000 */ V(2, 14, 3),	/* 216 */
+  /* 0001 */ V(2, 14, 3),
+  /* 0010 */ V(10, 10, 3),
+  /* 0011 */ V(10, 10, 3),
+  /* 0100 */ V(14, 2, 3),
+  /* 0101 */ V(14, 2, 3),
+  /* 0110 */ V(1, 14, 3),
+  /* 0111 */ V(1, 14, 3),
+  /* 1000 */ V(14, 1, 3),
+  /* 1001 */ V(14, 1, 3),
+  /* 1010 */ V(0, 14, 4),
+  /* 1011 */ V(14, 0, 4),
+  /* 1100 */ V(5, 13, 3),
+  /* 1101 */ V(5, 13, 3),
+  /* 1110 */ V(13, 5, 3),
+  /* 1111 */ V(13, 5, 3),
+
+  /* 0000 1000 ... */
+  /* 000  */ V(7, 12, 3),	/* 232 */
+  /* 001  */ V(12, 7, 3),
+  /* 010  */ V(4, 13, 3),
+  /* 011  */ V(8, 11, 3),
+  /* 100  */ V(13, 4, 2),
+  /* 101  */ V(13, 4, 2),
+  /* 110  */ V(11, 8, 3),
+  /* 111  */ V(9, 10, 3),
+
+  /* 0000 1001 ... */
+  /* 000  */ V(10, 9, 3),	/* 240 */
+  /* 001  */ V(6, 12, 3),
+  /* 010  */ V(12, 6, 3),
+  /* 011  */ V(3, 13, 3),
+  /* 100  */ V(13, 3, 2),
+  /* 101  */ V(13, 3, 2),
+  /* 110  */ V(13, 2, 2),
+  /* 111  */ V(13, 2, 2),
+
+  /* 0000 1010 ... */
+  /* 000  */ V(2, 13, 3),	/* 248 */
+  /* 001  */ V(0, 13, 3),
+  /* 010  */ V(1, 13, 2),
+  /* 011  */ V(1, 13, 2),
+  /* 100  */ V(7, 11, 2),
+  /* 101  */ V(7, 11, 2),
+  /* 110  */ V(11, 7, 2),
+  /* 111  */ V(11, 7, 2),
+
+  /* 0000 1011 ... */
+  /* 000  */ V(13, 1, 2),	/* 256 */
+  /* 001  */ V(13, 1, 2),
+  /* 010  */ V(5, 12, 3),
+  /* 011  */ V(13, 0, 3),
+  /* 100  */ V(12, 5, 2),
+  /* 101  */ V(12, 5, 2),
+  /* 110  */ V(8, 10, 2),
+  /* 111  */ V(8, 10, 2),
+
+  /* 0000 1100 ... */
+  /* 00   */ V(10, 8, 2),	/* 264 */
+  /* 01   */ V(4, 12, 2),
+  /* 10   */ V(12, 4, 2),
+  /* 11   */ V(6, 11, 2),
+
+  /* 0000 1101 ... */
+  /* 000  */ V(11, 6, 2),	/* 268 */
+  /* 001  */ V(11, 6, 2),
+  /* 010  */ V(9, 9, 3),
+  /* 011  */ V(0, 12, 3),
+  /* 100  */ V(3, 12, 2),
+  /* 101  */ V(3, 12, 2),
+  /* 110  */ V(12, 3, 2),
+  /* 111  */ V(12, 3, 2),
+
+  /* 0000 1110 ... */
+  /* 000  */ V(7, 10, 2),	/* 276 */
+  /* 001  */ V(7, 10, 2),
+  /* 010  */ V(10, 7, 2),
+  /* 011  */ V(10, 7, 2),
+  /* 100  */ V(10, 6, 2),
+  /* 101  */ V(10, 6, 2),
+  /* 110  */ V(12, 0, 3),
+  /* 111  */ V(0, 11, 3),
+
+  /* 0000 1111 ... */
+  /* 00   */ V(12, 2, 1),	/* 284 */
+  /* 01   */ V(12, 2, 1),
+  /* 10   */ V(2, 12, 2),
+  /* 11   */ V(5, 11, 2),
+
+  /* 0001 0000 ... */
+  /* 00   */ V(11, 5, 2),	/* 288 */
+  /* 01   */ V(1, 12, 2),
+  /* 10   */ V(8, 9, 2),
+  /* 11   */ V(9, 8, 2),
+
+  /* 0001 0001 ... */
+  /* 00   */ V(12, 1, 2),	/* 292 */
+  /* 01   */ V(4, 11, 2),
+  /* 10   */ V(11, 4, 2),
+  /* 11   */ V(6, 10, 2),
+
+  /* 0001 0010 ... */
+  /* 00   */ V(3, 11, 2),	/* 296 */
+  /* 01   */ V(7, 9, 2),
+  /* 10   */ V(11, 3, 1),
+  /* 11   */ V(11, 3, 1),
+
+  /* 0001 0011 ... */
+  /* 00   */ V(9, 7, 2),	/* 300 */
+  /* 01   */ V(8, 8, 2),
+  /* 10   */ V(2, 11, 2),
+  /* 11   */ V(5, 10, 2),
+
+  /* 0001 0100 ... */
+  /* 00   */ V(11, 2, 1),	/* 304 */
+  /* 01   */ V(11, 2, 1),
+  /* 10   */ V(10, 5, 2),
+  /* 11   */ V(1, 11, 2),
+
+  /* 0001 0101 ... */
+  /* 00   */ V(11, 1, 1),	/* 308 */
+  /* 01   */ V(11, 1, 1),
+  /* 10   */ V(11, 0, 2),
+  /* 11   */ V(6, 9, 2),
+
+  /* 0001 0110 ... */
+  /* 00   */ V(9, 6, 2),	/* 312 */
+  /* 01   */ V(4, 10, 2),
+  /* 10   */ V(10, 4, 2),
+  /* 11   */ V(7, 8, 2),
+
+  /* 0001 0111 ... */
+  /* 00   */ V(8, 7, 2),	/* 316 */
+  /* 01   */ V(3, 10, 2),
+  /* 10   */ V(10, 3, 1),
+  /* 11   */ V(10, 3, 1),
+
+  /* 0001 1000 ... */
+  /* 0    */ V(5, 9, 1),	/* 320 */
+  /* 1    */ V(9, 5, 1),
+
+  /* 0001 1001 ... */
+  /* 0    */ V(2, 10, 1),	/* 322 */
+  /* 1    */ V(10, 2, 1),
+
+  /* 0001 1010 ... */
+  /* 0    */ V(1, 10, 1),	/* 324 */
+  /* 1    */ V(10, 1, 1),
+
+  /* 0001 1011 ... */
+  /* 00   */ V(0, 10, 2),	/* 326 */
+  /* 01   */ V(10, 0, 2),
+  /* 10   */ V(6, 8, 1),
+  /* 11   */ V(6, 8, 1),
+
+  /* 0001 1100 ... */
+  /* 0    */ V(8, 6, 1),	/* 330 */
+  /* 1    */ V(4, 9, 1),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(9, 4, 1),	/* 332 */
+  /* 1    */ V(3, 9, 1),
+
+  /* 0001 1110 ... */
+  /* 00   */ V(9, 3, 1),	/* 334 */
+  /* 01   */ V(9, 3, 1),
+  /* 10   */ V(7, 7, 2),
+  /* 11   */ V(0, 9, 2),
+
+  /* 0001 1111 ... */
+  /* 0    */ V(5, 8, 1),	/* 338 */
+  /* 1    */ V(8, 5, 1),
+
+  /* 0010 0000 ... */
+  /* 0    */ V(2, 9, 1),	/* 340 */
+  /* 1    */ V(6, 7, 1),
+
+  /* 0010 0001 ... */
+  /* 0    */ V(7, 6, 1),	/* 342 */
+  /* 1    */ V(9, 2, 1),
+
+  /* 0010 0011 ... */
+  /* 0    */ V(1, 9, 1),	/* 344 */
+  /* 1    */ V(9, 0, 1),
+
+  /* 0010 0100 ... */
+  /* 0    */ V(4, 8, 1),	/* 346 */
+  /* 1    */ V(8, 4, 1),
+
+  /* 0010 0101 ... */
+  /* 0    */ V(5, 7, 1),	/* 348 */
+  /* 1    */ V(7, 5, 1),
+
+  /* 0010 0110 ... */
+  /* 0    */ V(3, 8, 1),	/* 350 */
+  /* 1    */ V(8, 3, 1),
+
+  /* 0010 0111 ... */
+  /* 0    */ V(6, 6, 1),	/* 352 */
+  /* 1    */ V(4, 7, 1),
+
+  /* 0010 1100 ... */
+  /* 0    */ V(7, 4, 1),	/* 354 */
+  /* 1    */ V(0, 8, 1),
+
+  /* 0010 1101 ... */
+  /* 0    */ V(8, 0, 1),	/* 356 */
+  /* 1    */ V(5, 6, 1),
+
+  /* 0010 1110 ... */
+  /* 0    */ V(6, 5, 1),	/* 358 */
+  /* 1    */ V(3, 7, 1),
+
+  /* 0010 1111 ... */
+  /* 0    */ V(7, 3, 1),	/* 360 */
+  /* 1    */ V(4, 6, 1),
+
+  /* 0011 0110 ... */
+  /* 0    */ V(0, 7, 1),	/* 362 */
+  /* 1    */ V(7, 0, 1),
+
+  /* 0011 1110 ... */
+  /* 0    */ V(0, 6, 1),	/* 364 */
+  /* 1    */ V(6, 0, 1),
+
+  /* 0000 0000 0000 ... */
+  /* 0    */ V(15, 15, 1),	/* 366 */
+  /* 1    */ V(14, 15, 1),
+
+  /* 0000 0000 0001 ... */
+  /* 0    */ V(15, 14, 1),	/* 368 */
+  /* 1    */ V(13, 15, 1),
+
+  /* 0000 0000 0011 ... */
+  /* 0    */ V(15, 13, 1),	/* 370 */
+  /* 1    */ V(12, 15, 1),
+
+  /* 0000 0000 0100 ... */
+  /* 0    */ V(15, 12, 1),	/* 372 */
+  /* 1    */ V(13, 14, 1),
+
+  /* 0000 0000 0101 ... */
+  /* 0    */ V(14, 13, 1),	/* 374 */
+  /* 1    */ V(11, 15, 1),
+
+  /* 0000 0000 0111 ... */
+  /* 0    */ V(12, 14, 1),	/* 376 */
+  /* 1    */ V(14, 12, 1),
+
+  /* 0000 0001 1111 ... */
+  /* 0    */ V(10, 14, 1),	/* 378 */
+  /* 1    */ V(0, 15, 1)
+];
+
+var hufftab16 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 2),
+  /* 0100 */ V(1, 1, 4),
+  /* 0101 */ V(0, 1, 4),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(68, 3),	/* 16 */
+  /* 0001 */ PTR(76, 3),
+  /* 0010 */ PTR(84, 2),
+  /* 0011 */ V(15, 15, 4),
+  /* 0100 */ PTR(88, 2),
+  /* 0101 */ PTR(92, 1),
+  /* 0110 */ PTR(94, 4),
+  /* 0111 */ V(15, 2, 4),
+  /* 1000 */ PTR(110, 1),
+  /* 1001 */ V(1, 15, 4),
+  /* 1010 */ V(15, 1, 4),
+  /* 1011 */ PTR(112, 4),
+  /* 1100 */ PTR(128, 4),
+  /* 1101 */ PTR(144, 4),
+  /* 1110 */ PTR(160, 4),
+  /* 1111 */ PTR(176, 4),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(192, 4),	/* 32 */
+  /* 0001 */ PTR(208, 3),
+  /* 0010 */ PTR(216, 3),
+  /* 0011 */ PTR(224, 3),
+  /* 0100 */ PTR(232, 3),
+  /* 0101 */ PTR(240, 3),
+  /* 0110 */ PTR(248, 3),
+  /* 0111 */ PTR(256, 3),
+  /* 1000 */ PTR(264, 2),
+  /* 1001 */ PTR(268, 2),
+  /* 1010 */ PTR(272, 1),
+  /* 1011 */ PTR(274, 2),
+  /* 1100 */ PTR(278, 2),
+  /* 1101 */ PTR(282, 1),
+  /* 1110 */ V(5, 1, 4),
+  /* 1111 */ PTR(284, 1),
+
+  /* 0010 ... */
+  /* 0000 */ PTR(286, 1),	/* 48 */
+  /* 0001 */ PTR(288, 1),
+  /* 0010 */ PTR(290, 1),
+  /* 0011 */ V(1, 4, 4),
+  /* 0100 */ V(4, 1, 4),
+  /* 0101 */ PTR(292, 1),
+  /* 0110 */ V(2, 3, 4),
+  /* 0111 */ V(3, 2, 4),
+  /* 1000 */ V(1, 3, 3),
+  /* 1001 */ V(1, 3, 3),
+  /* 1010 */ V(3, 1, 3),
+  /* 1011 */ V(3, 1, 3),
+  /* 1100 */ V(0, 3, 4),
+  /* 1101 */ V(3, 0, 4),
+  /* 1110 */ V(2, 2, 3),
+  /* 1111 */ V(2, 2, 3),
+
+  /* 0011 ... */
+  /* 00   */ V(1, 2, 2),	/* 64 */
+  /* 01   */ V(2, 1, 2),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 000  */ V(14, 15, 3),	/* 68 */
+  /* 001  */ V(15, 14, 3),
+  /* 010  */ V(13, 15, 3),
+  /* 011  */ V(15, 13, 3),
+  /* 100  */ V(12, 15, 3),
+  /* 101  */ V(15, 12, 3),
+  /* 110  */ V(11, 15, 3),
+  /* 111  */ V(15, 11, 3),
+
+  /* 0000 0001 ... */
+  /* 000  */ V(10, 15, 2),	/* 76 */
+  /* 001  */ V(10, 15, 2),
+  /* 010  */ V(15, 10, 3),
+  /* 011  */ V(9, 15, 3),
+  /* 100  */ V(15, 9, 3),
+  /* 101  */ V(15, 8, 3),
+  /* 110  */ V(8, 15, 2),
+  /* 111  */ V(8, 15, 2),
+
+  /* 0000 0010 ... */
+  /* 00   */ V(7, 15, 2),	/* 84 */
+  /* 01   */ V(15, 7, 2),
+  /* 10   */ V(6, 15, 2),
+  /* 11   */ V(15, 6, 2),
+
+  /* 0000 0100 ... */
+  /* 00   */ V(5, 15, 2),	/* 88 */
+  /* 01   */ V(15, 5, 2),
+  /* 10   */ V(4, 15, 1),
+  /* 11   */ V(4, 15, 1),
+
+  /* 0000 0101 ... */
+  /* 0    */ V(15, 4, 1),	/* 92 */
+  /* 1    */ V(15, 3, 1),
+
+  /* 0000 0110 ... */
+  /* 0000 */ V(15, 0, 1),	/* 94 */
+  /* 0001 */ V(15, 0, 1),
+  /* 0010 */ V(15, 0, 1),
+  /* 0011 */ V(15, 0, 1),
+  /* 0100 */ V(15, 0, 1),
+  /* 0101 */ V(15, 0, 1),
+  /* 0110 */ V(15, 0, 1),
+  /* 0111 */ V(15, 0, 1),
+  /* 1000 */ V(3, 15, 2),
+  /* 1001 */ V(3, 15, 2),
+  /* 1010 */ V(3, 15, 2),
+  /* 1011 */ V(3, 15, 2),
+  /* 1100 */ PTR(294, 4),
+  /* 1101 */ PTR(310, 3),
+  /* 1110 */ PTR(318, 3),
+  /* 1111 */ PTR(326, 3),
+
+  /* 0000 1000 ... */
+  /* 0    */ V(2, 15, 1),	/* 110 */
+  /* 1    */ V(0, 15, 1),
+
+  /* 0000 1011 ... */
+  /* 0000 */ PTR(334, 2),	/* 112 */
+  /* 0001 */ PTR(338, 2),
+  /* 0010 */ PTR(342, 2),
+  /* 0011 */ PTR(346, 1),
+  /* 0100 */ PTR(348, 2),
+  /* 0101 */ PTR(352, 2),
+  /* 0110 */ PTR(356, 1),
+  /* 0111 */ PTR(358, 2),
+  /* 1000 */ PTR(362, 2),
+  /* 1001 */ PTR(366, 2),
+  /* 1010 */ PTR(370, 2),
+  /* 1011 */ V(14, 3, 4),
+  /* 1100 */ PTR(374, 1),
+  /* 1101 */ PTR(376, 1),
+  /* 1110 */ PTR(378, 1),
+  /* 1111 */ PTR(380, 1),
+
+  /* 0000 1100 ... */
+  /* 0000 */ PTR(382, 1),	/* 128 */
+  /* 0001 */ PTR(384, 1),
+  /* 0010 */ PTR(386, 1),
+  /* 0011 */ V(0, 13, 4),
+  /* 0100 */ PTR(388, 1),
+  /* 0101 */ PTR(390, 1),
+  /* 0110 */ PTR(392, 1),
+  /* 0111 */ V(3, 12, 4),
+  /* 1000 */ PTR(394, 1),
+  /* 1001 */ V(1, 12, 4),
+  /* 1010 */ V(12, 0, 4),
+  /* 1011 */ PTR(396, 1),
+  /* 1100 */ V(14, 2, 3),
+  /* 1101 */ V(14, 2, 3),
+  /* 1110 */ V(2, 14, 4),
+  /* 1111 */ V(1, 14, 4),
+
+  /* 0000 1101 ... */
+  /* 0000 */ V(13, 3, 4),	/* 144 */
+  /* 0001 */ V(2, 13, 4),
+  /* 0010 */ V(13, 2, 4),
+  /* 0011 */ V(13, 1, 4),
+  /* 0100 */ V(3, 11, 4),
+  /* 0101 */ PTR(398, 1),
+  /* 0110 */ V(1, 13, 3),
+  /* 0111 */ V(1, 13, 3),
+  /* 1000 */ V(12, 4, 4),
+  /* 1001 */ V(6, 11, 4),
+  /* 1010 */ V(12, 3, 4),
+  /* 1011 */ V(10, 7, 4),
+  /* 1100 */ V(2, 12, 3),
+  /* 1101 */ V(2, 12, 3),
+  /* 1110 */ V(12, 2, 4),
+  /* 1111 */ V(11, 5, 4),
+
+  /* 0000 1110 ... */
+  /* 0000 */ V(12, 1, 4),	/* 160 */
+  /* 0001 */ V(0, 12, 4),
+  /* 0010 */ V(4, 11, 4),
+  /* 0011 */ V(11, 4, 4),
+  /* 0100 */ V(6, 10, 4),
+  /* 0101 */ V(10, 6, 4),
+  /* 0110 */ V(11, 3, 3),
+  /* 0111 */ V(11, 3, 3),
+  /* 1000 */ V(5, 10, 4),
+  /* 1001 */ V(10, 5, 4),
+  /* 1010 */ V(2, 11, 3),
+  /* 1011 */ V(2, 11, 3),
+  /* 1100 */ V(11, 2, 3),
+  /* 1101 */ V(11, 2, 3),
+  /* 1110 */ V(1, 11, 3),
+  /* 1111 */ V(1, 11, 3),
+
+  /* 0000 1111 ... */
+  /* 0000 */ V(11, 1, 3),	/* 176 */
+  /* 0001 */ V(11, 1, 3),
+  /* 0010 */ V(0, 11, 4),
+  /* 0011 */ V(11, 0, 4),
+  /* 0100 */ V(6, 9, 4),
+  /* 0101 */ V(9, 6, 4),
+  /* 0110 */ V(4, 10, 4),
+  /* 0111 */ V(10, 4, 4),
+  /* 1000 */ V(7, 8, 4),
+  /* 1001 */ V(8, 7, 4),
+  /* 1010 */ V(10, 3, 3),
+  /* 1011 */ V(10, 3, 3),
+  /* 1100 */ V(3, 10, 4),
+  /* 1101 */ V(5, 9, 4),
+  /* 1110 */ V(2, 10, 3),
+  /* 1111 */ V(2, 10, 3),
+
+  /* 0001 0000 ... */
+  /* 0000 */ V(9, 5, 4),	/* 192 */
+  /* 0001 */ V(6, 8, 4),
+  /* 0010 */ V(10, 1, 3),
+  /* 0011 */ V(10, 1, 3),
+  /* 0100 */ V(8, 6, 4),
+  /* 0101 */ V(7, 7, 4),
+  /* 0110 */ V(9, 4, 3),
+  /* 0111 */ V(9, 4, 3),
+  /* 1000 */ V(4, 9, 4),
+  /* 1001 */ V(5, 7, 4),
+  /* 1010 */ V(6, 7, 3),
+  /* 1011 */ V(6, 7, 3),
+  /* 1100 */ V(10, 2, 2),
+  /* 1101 */ V(10, 2, 2),
+  /* 1110 */ V(10, 2, 2),
+  /* 1111 */ V(10, 2, 2),
+
+  /* 0001 0001 ... */
+  /* 000  */ V(1, 10, 2),	/* 208 */
+  /* 001  */ V(1, 10, 2),
+  /* 010  */ V(0, 10, 3),
+  /* 011  */ V(10, 0, 3),
+  /* 100  */ V(3, 9, 3),
+  /* 101  */ V(9, 3, 3),
+  /* 110  */ V(5, 8, 3),
+  /* 111  */ V(8, 5, 3),
+
+  /* 0001 0010 ... */
+  /* 000  */ V(2, 9, 2),	/* 216 */
+  /* 001  */ V(2, 9, 2),
+  /* 010  */ V(9, 2, 2),
+  /* 011  */ V(9, 2, 2),
+  /* 100  */ V(7, 6, 3),
+  /* 101  */ V(0, 9, 3),
+  /* 110  */ V(1, 9, 2),
+  /* 111  */ V(1, 9, 2),
+
+  /* 0001 0011 ... */
+  /* 000  */ V(9, 1, 2),	/* 224 */
+  /* 001  */ V(9, 1, 2),
+  /* 010  */ V(9, 0, 3),
+  /* 011  */ V(4, 8, 3),
+  /* 100  */ V(8, 4, 3),
+  /* 101  */ V(7, 5, 3),
+  /* 110  */ V(3, 8, 3),
+  /* 111  */ V(8, 3, 3),
+
+  /* 0001 0100 ... */
+  /* 000  */ V(6, 6, 3),	/* 232 */
+  /* 001  */ V(2, 8, 3),
+  /* 010  */ V(8, 2, 2),
+  /* 011  */ V(8, 2, 2),
+  /* 100  */ V(4, 7, 3),
+  /* 101  */ V(7, 4, 3),
+  /* 110  */ V(1, 8, 2),
+  /* 111  */ V(1, 8, 2),
+
+  /* 0001 0101 ... */
+  /* 000  */ V(8, 1, 2),	/* 240 */
+  /* 001  */ V(8, 1, 2),
+  /* 010  */ V(8, 0, 2),
+  /* 011  */ V(8, 0, 2),
+  /* 100  */ V(0, 8, 3),
+  /* 101  */ V(5, 6, 3),
+  /* 110  */ V(3, 7, 2),
+  /* 111  */ V(3, 7, 2),
+
+  /* 0001 0110 ... */
+  /* 000  */ V(7, 3, 2),	/* 248 */
+  /* 001  */ V(7, 3, 2),
+  /* 010  */ V(6, 5, 3),
+  /* 011  */ V(4, 6, 3),
+  /* 100  */ V(2, 7, 2),
+  /* 101  */ V(2, 7, 2),
+  /* 110  */ V(7, 2, 2),
+  /* 111  */ V(7, 2, 2),
+
+  /* 0001 0111 ... */
+  /* 000  */ V(6, 4, 3),	/* 256 */
+  /* 001  */ V(5, 5, 3),
+  /* 010  */ V(0, 7, 2),
+  /* 011  */ V(0, 7, 2),
+  /* 100  */ V(1, 7, 1),
+  /* 101  */ V(1, 7, 1),
+  /* 110  */ V(1, 7, 1),
+  /* 111  */ V(1, 7, 1),
+
+  /* 0001 1000 ... */
+  /* 00   */ V(7, 1, 1),	/* 264  */
+  /* 01   */ V(7, 1, 1),
+  /* 10   */ V(7, 0, 2),
+  /* 11   */ V(3, 6, 2),
+
+  /* 0001 1001 ... */
+  /* 00   */ V(6, 3, 2),	/* 268 */
+  /* 01   */ V(4, 5, 2),
+  /* 10   */ V(5, 4, 2),
+  /* 11   */ V(2, 6, 2),
+
+  /* 0001 1010 ... */
+  /* 0    */ V(6, 2, 1),	/* 272 */
+  /* 1    */ V(1, 6, 1),
+
+  /* 0001 1011 ... */
+  /* 00   */ V(6, 1, 1),	/* 274 */
+  /* 01   */ V(6, 1, 1),
+  /* 10   */ V(0, 6, 2),
+  /* 11   */ V(6, 0, 2),
+
+  /* 0001 1100 ... */
+  /* 00   */ V(5, 3, 1),	/* 278 */
+  /* 01   */ V(5, 3, 1),
+  /* 10   */ V(3, 5, 2),
+  /* 11   */ V(4, 4, 2),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(2, 5, 1),	/* 282 */
+  /* 1    */ V(5, 2, 1),
+
+  /* 0001 1111 ... */
+  /* 0    */ V(1, 5, 1),	/* 284 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0010 0000 ... */
+  /* 0    */ V(3, 4, 1),	/* 286 */
+  /* 1    */ V(4, 3, 1),
+
+  /* 0010 0001 ... */
+  /* 0    */ V(5, 0, 1),	/* 288 */
+  /* 1    */ V(2, 4, 1),
+
+  /* 0010 0010 ... */
+  /* 0    */ V(4, 2, 1),	/* 290 */
+  /* 1    */ V(3, 3, 1),
+
+  /* 0010 0101 ... */
+  /* 0    */ V(0, 4, 1),	/* 292 */
+  /* 1    */ V(4, 0, 1),
+
+  /* 0000 0110 1100 ... */
+  /* 0000 */ V(12, 14, 4),	/* 294 */
+  /* 0001 */ PTR(400, 1),
+  /* 0010 */ V(13, 14, 3),
+  /* 0011 */ V(13, 14, 3),
+  /* 0100 */ V(14, 9, 3),
+  /* 0101 */ V(14, 9, 3),
+  /* 0110 */ V(14, 10, 4),
+  /* 0111 */ V(13, 9, 4),
+  /* 1000 */ V(14, 14, 2),
+  /* 1001 */ V(14, 14, 2),
+  /* 1010 */ V(14, 14, 2),
+  /* 1011 */ V(14, 14, 2),
+  /* 1100 */ V(14, 13, 3),
+  /* 1101 */ V(14, 13, 3),
+  /* 1110 */ V(14, 11, 3),
+  /* 1111 */ V(14, 11, 3),
+
+  /* 0000 0110 1101 ... */
+  /* 000  */ V(11, 14, 2),	/* 310 */
+  /* 001  */ V(11, 14, 2),
+  /* 010  */ V(12, 13, 2),
+  /* 011  */ V(12, 13, 2),
+  /* 100  */ V(13, 12, 3),
+  /* 101  */ V(13, 11, 3),
+  /* 110  */ V(10, 14, 2),
+  /* 111  */ V(10, 14, 2),
+
+  /* 0000 0110 1110 ... */
+  /* 000  */ V(12, 12, 2),	/* 318 */
+  /* 001  */ V(12, 12, 2),
+  /* 010  */ V(10, 13, 3),
+  /* 011  */ V(13, 10, 3),
+  /* 100  */ V(7, 14, 3),
+  /* 101  */ V(10, 12, 3),
+  /* 110  */ V(12, 10, 2),
+  /* 111  */ V(12, 10, 2),
+
+  /* 0000 0110 1111 ... */
+  /* 000  */ V(12, 9, 3),	/* 326 */
+  /* 001  */ V(7, 13, 3),
+  /* 010  */ V(5, 14, 2),
+  /* 011  */ V(5, 14, 2),
+  /* 100  */ V(11, 13, 1),
+  /* 101  */ V(11, 13, 1),
+  /* 110  */ V(11, 13, 1),
+  /* 111  */ V(11, 13, 1),
+
+  /* 0000 1011 0000 ... */
+  /* 00   */ V(9, 14, 1),	/* 334 */
+  /* 01   */ V(9, 14, 1),
+  /* 10   */ V(11, 12, 2),
+  /* 11   */ V(12, 11, 2),
+
+  /* 0000 1011 0001 ... */
+  /* 00   */ V(8, 14, 2),	/* 338 */
+  /* 01   */ V(14, 8, 2),
+  /* 10   */ V(9, 13, 2),
+  /* 11   */ V(14, 7, 2),
+
+  /* 0000 1011 0010 ... */
+  /* 00   */ V(11, 11, 2),	/* 342 */
+  /* 01   */ V(8, 13, 2),
+  /* 10   */ V(13, 8, 2),
+  /* 11   */ V(6, 14, 2),
+
+  /* 0000 1011 0011 ... */
+  /* 0    */ V(14, 6, 1),	/* 346 */
+  /* 1    */ V(9, 12, 1),
+
+  /* 0000 1011 0100 ... */
+  /* 00   */ V(10, 11, 2),	/* 348 */
+  /* 01   */ V(11, 10, 2),
+  /* 10   */ V(14, 5, 2),
+  /* 11   */ V(13, 7, 2),
+
+  /* 0000 1011 0101 ... */
+  /* 00   */ V(4, 14, 1),	/* 352 */
+  /* 01   */ V(4, 14, 1),
+  /* 10   */ V(14, 4, 2),
+  /* 11   */ V(8, 12, 2),
+
+  /* 0000 1011 0110 ... */
+  /* 0    */ V(12, 8, 1),	/* 356 */
+  /* 1    */ V(3, 14, 1),
+
+  /* 0000 1011 0111 ... */
+  /* 00   */ V(6, 13, 1),	/* 358 */
+  /* 01   */ V(6, 13, 1),
+  /* 10   */ V(13, 6, 2),
+  /* 11   */ V(9, 11, 2),
+
+  /* 0000 1011 1000 ... */
+  /* 00   */ V(11, 9, 2),	/* 362 */
+  /* 01   */ V(10, 10, 2),
+  /* 10   */ V(14, 1, 1),
+  /* 11   */ V(14, 1, 1),
+
+  /* 0000 1011 1001 ... */
+  /* 00   */ V(13, 4, 1),	/* 366 */
+  /* 01   */ V(13, 4, 1),
+  /* 10   */ V(11, 8, 2),
+  /* 11   */ V(10, 9, 2),
+
+  /* 0000 1011 1010 ... */
+  /* 00   */ V(7, 11, 1),	/* 370 */
+  /* 01   */ V(7, 11, 1),
+  /* 10   */ V(11, 7, 2),
+  /* 11   */ V(13, 0, 2),
+
+  /* 0000 1011 1100 ... */
+  /* 0    */ V(0, 14, 1),	/* 374 */
+  /* 1    */ V(14, 0, 1),
+
+  /* 0000 1011 1101 ... */
+  /* 0    */ V(5, 13, 1),	/* 376 */
+  /* 1    */ V(13, 5, 1),
+
+  /* 0000 1011 1110 ... */
+  /* 0    */ V(7, 12, 1),	/* 378 */
+  /* 1    */ V(12, 7, 1),
+
+  /* 0000 1011 1111 ... */
+  /* 0    */ V(4, 13, 1),	/* 380 */
+  /* 1    */ V(8, 11, 1),
+
+  /* 0000 1100 0000 ... */
+  /* 0    */ V(9, 10, 1),	/* 382 */
+  /* 1    */ V(6, 12, 1),
+
+  /* 0000 1100 0001 ... */
+  /* 0    */ V(12, 6, 1),	/* 384 */
+  /* 1    */ V(3, 13, 1),
+
+  /* 0000 1100 0010 ... */
+  /* 0    */ V(5, 12, 1),	/* 386 */
+  /* 1    */ V(12, 5, 1),
+
+  /* 0000 1100 0100 ... */
+  /* 0    */ V(8, 10, 1),	/* 388 */
+  /* 1    */ V(10, 8, 1),
+
+  /* 0000 1100 0101 ... */
+  /* 0    */ V(9, 9, 1),	/* 390 */
+  /* 1    */ V(4, 12, 1),
+
+  /* 0000 1100 0110 ... */
+  /* 0    */ V(11, 6, 1),	/* 392 */
+  /* 1    */ V(7, 10, 1),
+
+  /* 0000 1100 1000 ... */
+  /* 0    */ V(5, 11, 1),	/* 394 */
+  /* 1    */ V(8, 9, 1),
+
+  /* 0000 1100 1011 ... */
+  /* 0    */ V(9, 8, 1),	/* 396 */
+  /* 1    */ V(7, 9, 1),
+
+  /* 0000 1101 0101 ... */
+  /* 0    */ V(9, 7, 1),	/* 398 */
+  /* 1    */ V(8, 8, 1),
+
+  /* 0000 0110 1100 0001 ... */
+  /* 0    */ V(14, 12, 1),	/* 400 */
+  /* 1    */ V(13, 13, 1)
+];
+
+var hufftab24 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ V(15, 15, 4),
+  /* 0100 */ PTR(64, 4),
+  /* 0101 */ PTR(80, 4),
+  /* 0110 */ PTR(96, 4),
+  /* 0111 */ PTR(112, 4),
+  /* 1000 */ PTR(128, 4),
+  /* 1001 */ PTR(144, 4),
+  /* 1010 */ PTR(160, 3),
+  /* 1011 */ PTR(168, 2),
+  /* 1100 */ V(1, 1, 4),
+  /* 1101 */ V(0, 1, 4),
+  /* 1110 */ V(1, 0, 4),
+  /* 1111 */ V(0, 0, 4),
+
+  /* 0000 ... */
+  /* 0000 */ V(14, 15, 4),	/* 16 */
+  /* 0001 */ V(15, 14, 4),
+  /* 0010 */ V(13, 15, 4),
+  /* 0011 */ V(15, 13, 4),
+  /* 0100 */ V(12, 15, 4),
+  /* 0101 */ V(15, 12, 4),
+  /* 0110 */ V(11, 15, 4),
+  /* 0111 */ V(15, 11, 4),
+  /* 1000 */ V(15, 10, 3),
+  /* 1001 */ V(15, 10, 3),
+  /* 1010 */ V(10, 15, 4),
+  /* 1011 */ V(9, 15, 4),
+  /* 1100 */ V(15, 9, 3),
+  /* 1101 */ V(15, 9, 3),
+  /* 1110 */ V(15, 8, 3),
+  /* 1111 */ V(15, 8, 3),
+
+  /* 0001 ... */
+  /* 0000 */ V(8, 15, 4),	/* 32 */
+  /* 0001 */ V(7, 15, 4),
+  /* 0010 */ V(15, 7, 3),
+  /* 0011 */ V(15, 7, 3),
+  /* 0100 */ V(6, 15, 3),
+  /* 0101 */ V(6, 15, 3),
+  /* 0110 */ V(15, 6, 3),
+  /* 0111 */ V(15, 6, 3),
+  /* 1000 */ V(5, 15, 3),
+  /* 1001 */ V(5, 15, 3),
+  /* 1010 */ V(15, 5, 3),
+  /* 1011 */ V(15, 5, 3),
+  /* 1100 */ V(4, 15, 3),
+  /* 1101 */ V(4, 15, 3),
+  /* 1110 */ V(15, 4, 3),
+  /* 1111 */ V(15, 4, 3),
+
+  /* 0010 ... */
+  /* 0000 */ V(3, 15, 3),	/* 48 */
+  /* 0001 */ V(3, 15, 3),
+  /* 0010 */ V(15, 3, 3),
+  /* 0011 */ V(15, 3, 3),
+  /* 0100 */ V(2, 15, 3),
+  /* 0101 */ V(2, 15, 3),
+  /* 0110 */ V(15, 2, 3),
+  /* 0111 */ V(15, 2, 3),
+  /* 1000 */ V(15, 1, 3),
+  /* 1001 */ V(15, 1, 3),
+  /* 1010 */ V(1, 15, 4),
+  /* 1011 */ V(15, 0, 4),
+  /* 1100 */ PTR(172, 3),
+  /* 1101 */ PTR(180, 3),
+  /* 1110 */ PTR(188, 3),
+  /* 1111 */ PTR(196, 3),
+
+  /* 0100 ... */
+  /* 0000 */ PTR(204, 4),	/* 64 */
+  /* 0001 */ PTR(220, 3),
+  /* 0010 */ PTR(228, 3),
+  /* 0011 */ PTR(236, 3),
+  /* 0100 */ PTR(244, 2),
+  /* 0101 */ PTR(248, 2),
+  /* 0110 */ PTR(252, 2),
+  /* 0111 */ PTR(256, 2),
+  /* 1000 */ PTR(260, 2),
+  /* 1001 */ PTR(264, 2),
+  /* 1010 */ PTR(268, 2),
+  /* 1011 */ PTR(272, 2),
+  /* 1100 */ PTR(276, 2),
+  /* 1101 */ PTR(280, 3),
+  /* 1110 */ PTR(288, 2),
+  /* 1111 */ PTR(292, 2),
+
+  /* 0101 ... */
+  /* 0000 */ PTR(296, 2),	/* 80 */
+  /* 0001 */ PTR(300, 3),
+  /* 0010 */ PTR(308, 2),
+  /* 0011 */ PTR(312, 3),
+  /* 0100 */ PTR(320, 1),
+  /* 0101 */ PTR(322, 2),
+  /* 0110 */ PTR(326, 2),
+  /* 0111 */ PTR(330, 1),
+  /* 1000 */ PTR(332, 2),
+  /* 1001 */ PTR(336, 1),
+  /* 1010 */ PTR(338, 1),
+  /* 1011 */ PTR(340, 1),
+  /* 1100 */ PTR(342, 1),
+  /* 1101 */ PTR(344, 1),
+  /* 1110 */ PTR(346, 1),
+  /* 1111 */ PTR(348, 1),
+
+  /* 0110 ... */
+  /* 0000 */ PTR(350, 1),	/* 96 */
+  /* 0001 */ PTR(352, 1),
+  /* 0010 */ PTR(354, 1),
+  /* 0011 */ PTR(356, 1),
+  /* 0100 */ PTR(358, 1),
+  /* 0101 */ PTR(360, 1),
+  /* 0110 */ PTR(362, 1),
+  /* 0111 */ PTR(364, 1),
+  /* 1000 */ PTR(366, 1),
+  /* 1001 */ PTR(368, 1),
+  /* 1010 */ PTR(370, 2),
+  /* 1011 */ PTR(374, 1),
+  /* 1100 */ PTR(376, 2),
+  /* 1101 */ V(7, 3, 4),
+  /* 1110 */ PTR(380, 1),
+  /* 1111 */ V(7, 2, 4),
+
+  /* 0111 ... */
+  /* 0000 */ V(4, 6, 4),	/* 112 */
+  /* 0001 */ V(6, 4, 4),
+  /* 0010 */ V(5, 5, 4),
+  /* 0011 */ V(7, 1, 4),
+  /* 0100 */ V(3, 6, 4),
+  /* 0101 */ V(6, 3, 4),
+  /* 0110 */ V(4, 5, 4),
+  /* 0111 */ V(5, 4, 4),
+  /* 1000 */ V(2, 6, 4),
+  /* 1001 */ V(6, 2, 4),
+  /* 1010 */ V(1, 6, 4),
+  /* 1011 */ V(6, 1, 4),
+  /* 1100 */ PTR(382, 1),
+  /* 1101 */ V(3, 5, 4),
+  /* 1110 */ V(5, 3, 4),
+  /* 1111 */ V(4, 4, 4),
+
+  /* 1000 ... */
+  /* 0000 */ V(2, 5, 4),	/* 128 */
+  /* 0001 */ V(5, 2, 4),
+  /* 0010 */ V(1, 5, 4),
+  /* 0011 */ PTR(384, 1),
+  /* 0100 */ V(5, 1, 3),
+  /* 0101 */ V(5, 1, 3),
+  /* 0110 */ V(3, 4, 4),
+  /* 0111 */ V(4, 3, 4),
+  /* 1000 */ V(2, 4, 3),
+  /* 1001 */ V(2, 4, 3),
+  /* 1010 */ V(4, 2, 3),
+  /* 1011 */ V(4, 2, 3),
+  /* 1100 */ V(3, 3, 3),
+  /* 1101 */ V(3, 3, 3),
+  /* 1110 */ V(1, 4, 3),
+  /* 1111 */ V(1, 4, 3),
+
+  /* 1001 ... */
+  /* 0000 */ V(4, 1, 3),	/* 144 */
+  /* 0001 */ V(4, 1, 3),
+  /* 0010 */ V(0, 4, 4),
+  /* 0011 */ V(4, 0, 4),
+  /* 0100 */ V(2, 3, 3),
+  /* 0101 */ V(2, 3, 3),
+  /* 0110 */ V(3, 2, 3),
+  /* 0111 */ V(3, 2, 3),
+  /* 1000 */ V(1, 3, 2),
+  /* 1001 */ V(1, 3, 2),
+  /* 1010 */ V(1, 3, 2),
+  /* 1011 */ V(1, 3, 2),
+  /* 1100 */ V(3, 1, 2),
+  /* 1101 */ V(3, 1, 2),
+  /* 1110 */ V(3, 1, 2),
+  /* 1111 */ V(3, 1, 2),
+
+  /* 1010 ... */
+  /* 000  */ V(0, 3, 3),	/* 160 */
+  /* 001  */ V(3, 0, 3),
+  /* 010  */ V(2, 2, 2),
+  /* 011  */ V(2, 2, 2),
+  /* 100  */ V(1, 2, 1),
+  /* 101  */ V(1, 2, 1),
+  /* 110  */ V(1, 2, 1),
+  /* 111  */ V(1, 2, 1),
+
+  /* 1011 ... */
+  /* 00   */ V(2, 1, 1),	/* 168 */
+  /* 01   */ V(2, 1, 1),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0010 1100 ... */
+  /* 000  */ V(0, 15, 1),	/* 172 */
+  /* 001  */ V(0, 15, 1),
+  /* 010  */ V(0, 15, 1),
+  /* 011  */ V(0, 15, 1),
+  /* 100  */ V(14, 14, 3),
+  /* 101  */ V(13, 14, 3),
+  /* 110  */ V(14, 13, 3),
+  /* 111  */ V(12, 14, 3),
+
+  /* 0010 1101 ... */
+  /* 000  */ V(14, 12, 3),	/* 180 */
+  /* 001  */ V(13, 13, 3),
+  /* 010  */ V(11, 14, 3),
+  /* 011  */ V(14, 11, 3),
+  /* 100  */ V(12, 13, 3),
+  /* 101  */ V(13, 12, 3),
+  /* 110  */ V(10, 14, 3),
+  /* 111  */ V(14, 10, 3),
+
+  /* 0010 1110 ... */
+  /* 000  */ V(11, 13, 3),	/* 188 */
+  /* 001  */ V(13, 11, 3),
+  /* 010  */ V(12, 12, 3),
+  /* 011  */ V(9, 14, 3),
+  /* 100  */ V(14, 9, 3),
+  /* 101  */ V(10, 13, 3),
+  /* 110  */ V(13, 10, 3),
+  /* 111  */ V(11, 12, 3),
+
+  /* 0010 1111 ... */
+  /* 000  */ V(12, 11, 3),	/* 196 */
+  /* 001  */ V(8, 14, 3),
+  /* 010  */ V(14, 8, 3),
+  /* 011  */ V(9, 13, 3),
+  /* 100  */ V(13, 9, 3),
+  /* 101  */ V(7, 14, 3),
+  /* 110  */ V(14, 7, 3),
+  /* 111  */ V(10, 12, 3),
+
+  /* 0100 0000 ... */
+  /* 0000 */ V(12, 10, 3),	/* 204 */
+  /* 0001 */ V(12, 10, 3),
+  /* 0010 */ V(11, 11, 3),
+  /* 0011 */ V(11, 11, 3),
+  /* 0100 */ V(8, 13, 3),
+  /* 0101 */ V(8, 13, 3),
+  /* 0110 */ V(13, 8, 3),
+  /* 0111 */ V(13, 8, 3),
+  /* 1000 */ V(0, 14, 4),
+  /* 1001 */ V(14, 0, 4),
+  /* 1010 */ V(0, 13, 3),
+  /* 1011 */ V(0, 13, 3),
+  /* 1100 */ V(14, 6, 2),
+  /* 1101 */ V(14, 6, 2),
+  /* 1110 */ V(14, 6, 2),
+  /* 1111 */ V(14, 6, 2),
+
+  /* 0100 0001 ... */
+  /* 000  */ V(6, 14, 3),	/* 220 */
+  /* 001  */ V(9, 12, 3),
+  /* 010  */ V(12, 9, 2),
+  /* 011  */ V(12, 9, 2),
+  /* 100  */ V(5, 14, 2),
+  /* 101  */ V(5, 14, 2),
+  /* 110  */ V(11, 10, 2),
+  /* 111  */ V(11, 10, 2),
+
+  /* 0100 0010 ... */
+  /* 000  */ V(14, 5, 2),	/* 228 */
+  /* 001  */ V(14, 5, 2),
+  /* 010  */ V(10, 11, 3),
+  /* 011  */ V(7, 13, 3),
+  /* 100  */ V(13, 7, 2),
+  /* 101  */ V(13, 7, 2),
+  /* 110  */ V(14, 4, 2),
+  /* 111  */ V(14, 4, 2),
+
+  /* 0100 0011 ... */
+  /* 000  */ V(8, 12, 2),	/* 236 */
+  /* 001  */ V(8, 12, 2),
+  /* 010  */ V(12, 8, 2),
+  /* 011  */ V(12, 8, 2),
+  /* 100  */ V(4, 14, 3),
+  /* 101  */ V(2, 14, 3),
+  /* 110  */ V(3, 14, 2),
+  /* 111  */ V(3, 14, 2),
+
+  /* 0100 0100 ... */
+  /* 00   */ V(6, 13, 2),	/* 244 */
+  /* 01   */ V(13, 6, 2),
+  /* 10   */ V(14, 3, 2),
+  /* 11   */ V(9, 11, 2),
+
+  /* 0100 0101 ... */
+  /* 00   */ V(11, 9, 2),	/* 248 */
+  /* 01   */ V(10, 10, 2),
+  /* 10   */ V(14, 2, 2),
+  /* 11   */ V(1, 14, 2),
+
+  /* 0100 0110 ... */
+  /* 00   */ V(14, 1, 2),	/* 252 */
+  /* 01   */ V(5, 13, 2),
+  /* 10   */ V(13, 5, 2),
+  /* 11   */ V(7, 12, 2),
+
+  /* 0100 0111 ... */
+  /* 00   */ V(12, 7, 2),	/* 256 */
+  /* 01   */ V(4, 13, 2),
+  /* 10   */ V(8, 11, 2),
+  /* 11   */ V(11, 8, 2),
+
+  /* 0100 1000 ... */
+  /* 00   */ V(13, 4, 2),	/* 260 */
+  /* 01   */ V(9, 10, 2),
+  /* 10   */ V(10, 9, 2),
+  /* 11   */ V(6, 12, 2),
+
+  /* 0100 1001 ... */
+  /* 00   */ V(12, 6, 2),	/* 264 */
+  /* 01   */ V(3, 13, 2),
+  /* 10   */ V(13, 3, 2),
+  /* 11   */ V(2, 13, 2),
+
+  /* 0100 1010 ... */
+  /* 00   */ V(13, 2, 2),	/* 268 */
+  /* 01   */ V(1, 13, 2),
+  /* 10   */ V(7, 11, 2),
+  /* 11   */ V(11, 7, 2),
+
+  /* 0100 1011 ... */
+  /* 00   */ V(13, 1, 2),	/* 272 */
+  /* 01   */ V(5, 12, 2),
+  /* 10   */ V(12, 5, 2),
+  /* 11   */ V(8, 10, 2),
+
+  /* 0100 1100 ... */
+  /* 00   */ V(10, 8, 2),	/* 276 */
+  /* 01   */ V(9, 9, 2),
+  /* 10   */ V(4, 12, 2),
+  /* 11   */ V(12, 4, 2),
+
+  /* 0100 1101 ... */
+  /* 000  */ V(6, 11, 2),	/* 280 */
+  /* 001  */ V(6, 11, 2),
+  /* 010  */ V(11, 6, 2),
+  /* 011  */ V(11, 6, 2),
+  /* 100  */ V(13, 0, 3),
+  /* 101  */ V(0, 12, 3),
+  /* 110  */ V(3, 12, 2),
+  /* 111  */ V(3, 12, 2),
+
+  /* 0100 1110 ... */
+  /* 00   */ V(12, 3, 2),	/* 288 */
+  /* 01   */ V(7, 10, 2),
+  /* 10   */ V(10, 7, 2),
+  /* 11   */ V(2, 12, 2),
+
+  /* 0100 1111 ... */
+  /* 00   */ V(12, 2, 2),	/* 292 */
+  /* 01   */ V(5, 11, 2),
+  /* 10   */ V(11, 5, 2),
+  /* 11   */ V(1, 12, 2),
+
+  /* 0101 0000 ... */
+  /* 00   */ V(8, 9, 2),	/* 296 */
+  /* 01   */ V(9, 8, 2),
+  /* 10   */ V(12, 1, 2),
+  /* 11   */ V(4, 11, 2),
+
+  /* 0101 0001 ... */
+  /* 000  */ V(12, 0, 3),	/* 300 */
+  /* 001  */ V(0, 11, 3),
+  /* 010  */ V(3, 11, 2),
+  /* 011  */ V(3, 11, 2),
+  /* 100  */ V(11, 0, 3),
+  /* 101  */ V(0, 10, 3),
+  /* 110  */ V(1, 10, 2),
+  /* 111  */ V(1, 10, 2),
+
+  /* 0101 0010 ... */
+  /* 00   */ V(11, 4, 1),	/* 308 */
+  /* 01   */ V(11, 4, 1),
+  /* 10   */ V(6, 10, 2),
+  /* 11   */ V(10, 6, 2),
+
+  /* 0101 0011 ... */
+  /* 000  */ V(7, 9, 2),	/* 312 */
+  /* 001  */ V(7, 9, 2),
+  /* 010  */ V(9, 7, 2),
+  /* 011  */ V(9, 7, 2),
+  /* 100  */ V(10, 0, 3),
+  /* 101  */ V(0, 9, 3),
+  /* 110  */ V(9, 0, 2),
+  /* 111  */ V(9, 0, 2),
+
+  /* 0101 0100 ... */
+  /* 0    */ V(11, 3, 1),	/* 320 */
+  /* 1    */ V(8, 8, 1),
+
+  /* 0101 0101 ... */
+  /* 00   */ V(2, 11, 2),	/* 322 */
+  /* 01   */ V(5, 10, 2),
+  /* 10   */ V(11, 2, 1),
+  /* 11   */ V(11, 2, 1),
+
+  /* 0101 0110 ... */
+  /* 00   */ V(10, 5, 2),	/* 326 */
+  /* 01   */ V(1, 11, 2),
+  /* 10   */ V(11, 1, 2),
+  /* 11   */ V(6, 9, 2),
+
+  /* 0101 0111 ... */
+  /* 0    */ V(9, 6, 1),	/* 330 */
+  /* 1    */ V(10, 4, 1),
+
+  /* 0101 1000 ... */
+  /* 00   */ V(4, 10, 2),	/* 332 */
+  /* 01   */ V(7, 8, 2),
+  /* 10   */ V(8, 7, 1),
+  /* 11   */ V(8, 7, 1),
+
+  /* 0101 1001 ... */
+  /* 0    */ V(3, 10, 1),	/* 336 */
+  /* 1    */ V(10, 3, 1),
+
+  /* 0101 1010 ... */
+  /* 0    */ V(5, 9, 1),	/* 338 */
+  /* 1    */ V(9, 5, 1),
+
+  /* 0101 1011 ... */
+  /* 0    */ V(2, 10, 1),	/* 340 */
+  /* 1    */ V(10, 2, 1),
+
+  /* 0101 1100 ... */
+  /* 0    */ V(10, 1, 1),	/* 342 */
+  /* 1    */ V(6, 8, 1),
+
+  /* 0101 1101 ... */
+  /* 0    */ V(8, 6, 1),	/* 344 */
+  /* 1    */ V(7, 7, 1),
+
+  /* 0101 1110 ... */
+  /* 0    */ V(4, 9, 1),	/* 346 */
+  /* 1    */ V(9, 4, 1),
+
+  /* 0101 1111 ... */
+  /* 0    */ V(3, 9, 1),	/* 348 */
+  /* 1    */ V(9, 3, 1),
+
+  /* 0110 0000 ... */
+  /* 0    */ V(5, 8, 1),	/* 350 */
+  /* 1    */ V(8, 5, 1),
+
+  /* 0110 0001 ... */
+  /* 0    */ V(2, 9, 1),	/* 352 */
+  /* 1    */ V(6, 7, 1),
+
+  /* 0110 0010 ... */
+  /* 0    */ V(7, 6, 1),	/* 354 */
+  /* 1    */ V(9, 2, 1),
+
+  /* 0110 0011 ... */
+  /* 0    */ V(1, 9, 1),	/* 356 */
+  /* 1    */ V(9, 1, 1),
+
+  /* 0110 0100 ... */
+  /* 0    */ V(4, 8, 1),	/* 358 */
+  /* 1    */ V(8, 4, 1),
+
+  /* 0110 0101 ... */
+  /* 0    */ V(5, 7, 1),	/* 360 */
+  /* 1    */ V(7, 5, 1),
+
+  /* 0110 0110 ... */
+  /* 0    */ V(3, 8, 1),	/* 362 */
+  /* 1    */ V(8, 3, 1),
+
+  /* 0110 0111 ... */
+  /* 0    */ V(6, 6, 1),	/* 364 */
+  /* 1    */ V(2, 8, 1),
+
+  /* 0110 1000 ... */
+  /* 0    */ V(8, 2, 1),	/* 366 */
+  /* 1    */ V(1, 8, 1),
+
+  /* 0110 1001 ... */
+  /* 0    */ V(4, 7, 1),	/* 368 */
+  /* 1    */ V(7, 4, 1),
+
+  /* 0110 1010 ... */
+  /* 00   */ V(8, 1, 1),	/* 370 */
+  /* 01   */ V(8, 1, 1),
+  /* 10   */ V(0, 8, 2),
+  /* 11   */ V(8, 0, 2),
+
+  /* 0110 1011 ... */
+  /* 0    */ V(5, 6, 1),	/* 374 */
+  /* 1    */ V(6, 5, 1),
+
+  /* 0110 1100 ... */
+  /* 00   */ V(1, 7, 1),	/* 376 */
+  /* 01   */ V(1, 7, 1),
+  /* 10   */ V(0, 7, 2),
+  /* 11   */ V(7, 0, 2),
+
+  /* 0110 1110 ... */
+  /* 0    */ V(3, 7, 1),	/* 380  */
+  /* 1    */ V(2, 7, 1),
+
+  /* 0111 1100 ... */
+  /* 0    */ V(0, 6, 1),	/* 382 */
+  /* 1    */ V(6, 0, 1),
+
+  /* 1000 0011 ... */
+  /* 0    */ V(0, 5, 1),	/* 384 */
+  /* 1    */ V(5, 0, 1)
+];
+
+/* hufftable constructor */
+Mad.Hufftable = function(table, linbits, startbits) {
+    this.table = table;
+    this.linbits = linbits;
+    this.startbits = startbits;
+};
+
+/* external tables */
+Mad.huff_quad_table = [ hufftabA, hufftabB ];
+
+Mad.huff_pair_table = [
+  /*  0 */ new Mad.Hufftable(hufftab0,   0, 0),
+  /*  1 */ new Mad.Hufftable(hufftab1,   0, 3),
+  /*  2 */ new Mad.Hufftable(hufftab2,   0, 3),
+  /*  3 */ new Mad.Hufftable(hufftab3,   0, 3),
+  /*  4 */ null, //new Mad.Hufftable(0 /* not used */),
+  /*  5 */ new Mad.Hufftable(hufftab5,   0, 3),
+  /*  6 */ new Mad.Hufftable(hufftab6,   0, 4),
+  /*  7 */ new Mad.Hufftable(hufftab7,   0, 4),
+  /*  8 */ new Mad.Hufftable(hufftab8,   0, 4),
+  /*  9 */ new Mad.Hufftable(hufftab9,   0, 4),
+  /* 10 */ new Mad.Hufftable(hufftab10,  0, 4),
+  /* 11 */ new Mad.Hufftable(hufftab11,  0, 4),
+  /* 12 */ new Mad.Hufftable(hufftab12,  0, 4),
+  /* 13 */ new Mad.Hufftable(hufftab13,  0, 4),
+  /* 14 */ null, //new Mad.Hufftable(0 /* not used */),
+  /* 15 */ new Mad.Hufftable(hufftab15,  0, 4),
+  /* 16 */ new Mad.Hufftable(hufftab16,  1, 4),
+  /* 17 */ new Mad.Hufftable(hufftab16,  2, 4),
+  /* 18 */ new Mad.Hufftable(hufftab16,  3, 4),
+  /* 19 */ new Mad.Hufftable(hufftab16,  4, 4),
+  /* 20 */ new Mad.Hufftable(hufftab16,  6, 4),
+  /* 21 */ new Mad.Hufftable(hufftab16,  8, 4),
+  /* 22 */ new Mad.Hufftable(hufftab16, 10, 4),
+  /* 23 */ new Mad.Hufftable(hufftab16, 13, 4),
+  /* 24 */ new Mad.Hufftable(hufftab24,  4, 4),
+  /* 25 */ new Mad.Hufftable(hufftab24,  5, 4),
+  /* 26 */ new Mad.Hufftable(hufftab24,  6, 4),
+  /* 27 */ new Mad.Hufftable(hufftab24,  7, 4),
+  /* 28 */ new Mad.Hufftable(hufftab24,  8, 4),
+  /* 29 */ new Mad.Hufftable(hufftab24,  9, 4),
+  /* 30 */ new Mad.Hufftable(hufftab24, 11, 4),
+  /* 31 */ new Mad.Hufftable(hufftab24, 13, 4)
+];
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/id3v22stream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/id3v22stream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/id3v22stream.js	(revision 28388)
@@ -0,0 +1,341 @@
+var trimString = function (string) {
+    return string.replace(/\0$/, "");
+};
+
+var stringToEncoding = function(string, encoding) {
+    switch (encoding) {
+        case 0:
+            return trimString(string);
+        case 1:
+            var ix = 2, offset1 = 1, offset2 = 0;
+
+            if (string.slice(0, 2) === "\xFE\xFF") {
+                offset1 = 0, offset2 = 1;
+            } else {
+                offset1 = 1, offset2 = 0;
+            }
+
+            var result = "";
+
+            for (var ix = 2; ix < string.length; ix += 2) {
+                var byte1 = string[ix + offset1].charCodeAt(0);
+                var byte2 = string[ix + offset2].charCodeAt(0);
+
+                var word1 = (byte1 << 8) | byte2;
+
+                if (byte1 < 0xD8 || byte1 >= 0xE0) {
+                    result += String.fromCharCode(word1);
+                } else {
+                    ix += 2;
+
+                    var byte3 = string[ix + offset1].charCodeAt(0);
+                    var byte4 = string[ix + offset2].charCodeAt(0);
+
+                    var word2 = (byte3 << 8) | byte4;
+
+                    result += String.fromCharCode(word1, word2);
+                }
+            }
+
+            return trimString(result);
+        default:
+            return string;
+    }
+}
+
+var decodeIdentifierFrame = function(header, stream) {
+    var data = stream.read(header['length']);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'owner': array[0],
+            'identifier': array[1]
+    };
+}
+
+var decodeTextFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var data = stream.read(header['length'] - 1);
+
+    return {
+        'header': header,
+            'value': stringToEncoding(data, encoding)
+    };
+}
+
+var decodeCommentFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var language = stream.read(3);
+
+    var data = stream.read(header['length'] - 4);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'language': stringToEncoding(language, 0),
+            'description': stringToEncoding(array[0], 0),
+            'value': stringToEncoding(array[1], encoding)
+    };
+}
+
+var extendWithValueFrame = function(tags, frame) {
+    tags[frame['name']] = frame['value'];
+
+    return tags;
+}
+
+
+var extendWithIdentifierFrame = function(tags, frame) {
+    tags[frame['name']] = {
+        'owner': frame['value'],
+        'identifier': frame['identifier']
+    };
+
+    return tags;
+}
+
+var extendWithCommentFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']][frame['description']] = {
+        'language': frame['language'],
+        'value': frame['value']
+    };
+
+    return tags;
+}
+
+Mad.ID3v22Stream = function(header, stream) {
+    this.offset = 0;
+
+    this.header = header;
+    this.stream = stream;
+
+    this.decoders = {
+        'UFI': decodeIdentifierFrame,
+        'TT1': decodeTextFrame,
+        'TT2': decodeTextFrame,
+        'TT3': decodeTextFrame,
+        'TP1': decodeTextFrame,
+        'TP2': decodeTextFrame,
+        'TP3': decodeTextFrame,
+        'TP4': decodeTextFrame,
+        'TCM': decodeTextFrame,
+        'TXT': decodeTextFrame,
+        'TLA': decodeTextFrame,
+        'TCO': decodeTextFrame,
+        'TAL': decodeTextFrame,
+        'TPA': decodeTextFrame,
+        'TRK': decodeTextFrame,
+        'TRC': decodeTextFrame,
+        'TYE': decodeTextFrame,
+        'TDA': decodeTextFrame,
+        'TIM': decodeTextFrame,
+        'TRD': decodeTextFrame,
+        'TMT': decodeTextFrame,
+        'TFT': decodeTextFrame,
+        'TBP': decodeTextFrame,
+        'TCR': decodeTextFrame,
+        'TPB': decodeTextFrame,
+        'TEN': decodeTextFrame,
+        'TSS': decodeTextFrame,
+        'TOF': decodeTextFrame,
+        'TLE': decodeTextFrame,
+        'TSI': decodeTextFrame,
+        'TDY': decodeTextFrame,
+        'TKE': decodeTextFrame,
+        'TOT': decodeTextFrame,
+        'TOA': decodeTextFrame,
+        'TOL': decodeTextFrame,
+        'TOR': decodeTextFrame,
+
+        'COM': decodeCommentFrame
+    };
+
+    this.names = {
+        /* Identification Frames */
+        'TT1': 'Content group description',
+        'TT2': 'Title/Songname/Content description',
+        'TT3': 'Subtitle/Description refinement',
+        'TAL': 'Album/Movie/Show title',
+        'TOT': 'Original album/movie/show title',
+        'TRK': 'Track number/Position in set',
+        'TPA': 'Part of a set',
+        'TRC': 'ISRC',
+
+        /* Involved Persons Frames */
+        'TP1': 'Lead artist/Lead performer/Soloist/Performing group',
+        'TP2': 'Band/Orchestra/Accompaniment',
+        'TP3': 'Conductor',
+        'TP4': 'Interpreted, remixed, or otherwise modified by',
+        'TOA': 'Original artist/performer',
+        'TXT': 'Lyricist/Text writer',
+        'TOL': 'Original lyricist/text writer',
+        'TCO': 'Composer',
+        'TEN': 'Encoded by',
+
+        /* Derived and Subjective Properties Frames */
+        'TBP': 'BPM',
+        'TLE': 'Length',
+        'TKE': 'Initial key',
+        'TLA': 'Language',
+        'TMT': 'Media type',
+
+        /* Rights and Licence Frames */
+        'TCR': 'Copyright message',
+        'TPB': 'Publisher',
+
+        /* Other Text Frames */
+        'TOF': 'Original filename',
+        'TDY': 'Playlist delay',
+        'TSS': 'Software/Hardware and settings used for encoding',
+        'TFT': 'File type',
+
+        /* Buffering */
+        'BUF': 'Recommended buffer size',
+
+        /* Attached Picture Frame */
+        'PIC': 'Attached picture',
+
+        /* Unique Identifier Frame */
+        'UFI': 'Unique identifier',
+
+        /* Music CD Identifier Frame */
+        'MCI': 'Music CD identifier',
+
+        /* Comment Frame */
+        'COM': 'Comment',
+
+        /* User Defined URL Link Frame */
+        'WXX': 'User defined URL link',
+
+        /* Deprecated ID3v2 frames */
+        'TDA': 'Date',
+        'TIM': 'Time',
+        'TOR': 'Original release year',
+        'TRD': 'Recording dates',
+        'TSI': 'Size',
+        'TYE': 'Year'
+    };
+
+    this.extenders = {
+        'UFI': extendWithIdentifierFrame,
+        'TT1': extendWithValueFrame,
+        'TT2': extendWithValueFrame,
+        'TT3': extendWithValueFrame,
+        'TP1': extendWithValueFrame,
+        'TP2': extendWithValueFrame,
+        'TP3': extendWithValueFrame,
+        'TP4': extendWithValueFrame,
+        'TCM': extendWithValueFrame,
+        'TXT': extendWithValueFrame,
+        'TLA': extendWithValueFrame,
+        'TCO': extendWithValueFrame,
+        'TAL': extendWithValueFrame,
+        'TPA': extendWithValueFrame,
+        'TRK': extendWithValueFrame,
+        'TRC': extendWithValueFrame,
+        'TYE': extendWithValueFrame,
+        'TDA': extendWithValueFrame,
+        'TIM': extendWithValueFrame,
+        'TRD': extendWithValueFrame,
+        'TMT': extendWithValueFrame,
+        'TFT': extendWithValueFrame,
+        'TBP': extendWithValueFrame,
+        'TCR': extendWithValueFrame,
+        'TPB': extendWithValueFrame,
+        'TEN': extendWithValueFrame,
+        'TSS': extendWithValueFrame,
+        'TOF': extendWithValueFrame,
+        'TLE': extendWithValueFrame,
+        'TSI': extendWithValueFrame,
+        'TDY': extendWithValueFrame,
+        'TKE': extendWithValueFrame,
+        'TOT': extendWithValueFrame,
+        'TOA': extendWithValueFrame,
+        'TOL': extendWithValueFrame,
+        'TOR': extendWithValueFrame,
+
+        'COM': extendWithCommentFrame
+    };
+}
+
+Mad.ID3v22Stream.prototype.readFrame = function() {
+    if (this.offset >= this.header.length) {
+        return null;
+    }
+
+    var identifier = this.stream.read(3);
+
+    if (identifier.charCodeAt(0) === 0) {
+        this.offset = this.header.length + 1;
+
+        return null;
+    }
+
+    var length = this.stream.readU24(true);
+
+    var header = {
+identifier: identifier,
+            length: length
+    };
+
+    if (this.decoders[identifier]) {
+        var result = this.decoders[identifier](header, this.stream);
+    } else {
+        var result = {
+identifier: identifier,
+            header: header
+        };
+
+        this.stream.read(length);
+    }
+
+    result.name = this.names[identifier] ? this.names[identifier] : 'UNKNOWN';
+
+    this.offset += 10 + length;
+
+    return result;
+}
+
+Mad.ID3v22Stream.prototype.read = function() {
+    if (!this.array) {
+        this.array = [];
+
+        var frame = null;
+
+        try {
+            while (frame = this.readFrame()) {
+                this.array.push(frame);
+            }
+        } catch (e) {
+            throw(e);
+            //console.log("ID3 Error: " + e);
+        }
+    }
+
+    return this.array;
+}
+
+Mad.ID3v22Stream.prototype.toHash = function() {
+    var frames = this.read();
+
+    var hash = {};
+
+    for (var i = 0; i < frames.length; i++) {
+        var frame = frames[i];
+
+        var extender = this.extenders[frame['header']['identifier']];
+
+        if (extender) {
+            hash = extender(hash, frames[i]);
+        }
+    }
+
+    return hash;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/id3v23stream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/id3v23stream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/id3v23stream.js	(revision 28388)
@@ -0,0 +1,579 @@
+var trimString = function (string) {
+    return string.replace(/\0$/, "");
+};
+
+var stringToEncoding = function(string, encoding) {
+    switch (encoding) {
+        case 0:
+            return trimString(string);
+        case 1:
+            var ix = 2, offset1 = 1, offset2 = 0;
+
+            if (string.slice(0, 2) === "\xFE\xFF") {
+                offset1 = 0, offset2 = 1;
+            } else {
+                offset1 = 1, offset2 = 0;
+            }
+
+            var result = "";
+
+            for (var ix = 2; ix < string.length; ix += 2) {
+                var byte1 = string[ix + offset1].charCodeAt(0);
+                var byte2 = string[ix + offset2].charCodeAt(0);
+
+                var word1 = (byte1 << 8) | byte2;
+
+                if (byte1 < 0xD8 || byte1 >= 0xE0) {
+                    result += String.fromCharCode(word1);
+                } else {
+                    ix += 2;
+
+                    var byte3 = string[ix + offset1].charCodeAt(0);
+                    var byte4 = string[ix + offset2].charCodeAt(0);
+
+                    var word2 = (byte3 << 8) | byte4;
+
+                    result += String.fromCharCode(word1, word2);
+                }
+            }
+
+            return trimString(result);
+        default:
+            return string;
+    }
+}
+
+var decodeTerminatedString = function(header, stream) {
+
+    // skip text encoding (nobody cares, always ISO-8559-15)
+    stream.readAsString(1);
+
+    var c;
+
+    var mimetype = "";
+    while(true) {
+        c = stream.readAsString(1);
+        if(c === "\0") {
+            break;
+        }
+        mimetype += c;
+    }
+    console.log("mimetype = " + mimetype);
+
+    var filename = "";
+    while(true) {
+        c = stream.readAsString(1);
+        if(c === "\0") {
+            break;
+        }
+        filename += c;
+    }
+    console.log("filename = " + filename);
+
+    var contentDescription = "";
+    while(true) {
+        c = stream.readAsString(1);
+        if(c === "\0") {
+            break;
+        }
+        contentDescription += c;
+    }
+    console.log("contentDescription = " + contentDescription);
+
+    var objectName = stream.readAsString(4);
+
+    // skip 4 bytes, then read binary length
+    stream.readAsString(4);
+    var length = stream.readU32(true) - 4;
+
+    if(length > header.length) return null;
+    var value = stream.readAsString(length);
+
+    return {
+        'header': header,
+            'mimetype': mimetype,
+            'filename': filename,
+            'contentDescription': contentDescription,
+            'objectName': objectName,
+            'value': value
+    };
+}
+
+var decodeTextFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var data = stream.readAsString(header['length'] - 1);
+
+    return {
+        'header': header,
+            'value': stringToEncoding(data, encoding)
+    };
+}
+
+var decodeAttachedPictureFrame = function(header, stream) {
+    var encoding = stream.readU8();
+
+    var data = stream.readAsString(header['length'] - 1);
+
+    var array = data.split("\0");
+
+    return {
+        'header': header,
+            'mime': stringToEncoding(array[0], 0),
+            'type': array[1].charCodeAt(0),
+            'description': array[1].slice(1, array[1].length - 1),
+            'value': array.slice(2, array.length - 2).join("\0")
+    };
+}
+
+var decodeIdentifierFrame = function(header, stream) {
+    var data = stream.readAsString(header['length']);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'owner': array[0],
+            'identifier': array[1]
+    };
+}
+
+
+var decodeCommentFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var language = stream.readAsString(3);
+
+    var data = stream.readAsString(header['length'] - 4);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'language': stringToEncoding(language, 0),
+            'description': stringToEncoding(array[0], 0),
+            'value': stringToEncoding(array[1], encoding)
+    };
+}
+
+var decodeBinaryFrame = function(header, stream) {
+    var data = stream.readAsString(header['length']);
+
+    return {
+        'header': header,
+            'value': data
+    };
+}
+
+var decodeUserDefinedLinkFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var data = stream.readAsString(header['length'] - 1);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'description': stringToEncoding(array[0], 0),
+            'value': stringToEncoding(array[1], encoding)
+    };
+}
+
+var extendWithValueFrame = function(tags, frame) {
+    tags[frame['name']] = frame['value'];
+
+    return tags;
+}
+
+var extendWithPictureFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']].push({
+            'mime': frame['mime'],
+            'type': frame['type'],
+            'description': frame['description'],
+            'value': frame['value']
+            });
+
+    return tags;
+}
+
+var extendWithIdentifierFrame = function(tags, frame) {
+    tags[frame['name']] = {
+        'owner': frame['value'],
+        'identifier': frame['identifier']
+    };
+
+    return tags;
+}
+
+var extendWithCommentFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']][frame['description']] = {
+        'language': frame['language'],
+        'value': frame['value']
+    };
+
+    return tags;
+}
+
+var extendWithUserDefinedLinkFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = {}
+    }
+
+    tags[frame['name']][frame['description']] = frame['value'];
+
+    return tags;
+}
+
+var extendWithPrivateFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']].push(frame['value']);
+
+    return tags;
+}
+
+Mad.ID3v23Stream = function(header, stream) {
+    this.offset = 0;
+
+    this.header = header;
+    this.stream = stream;
+
+    this.decoders = {
+        /* Identification Frames */
+        'TIT1': decodeTextFrame,
+        'TIT2': decodeTextFrame,
+        'TIT3': decodeTextFrame,
+        'TALB': decodeTextFrame,
+        'TOAL': decodeTextFrame,
+        'TRCK': decodeTextFrame,
+        'TPOS': decodeTextFrame,
+        'TSST': decodeTextFrame,
+        'TSRC': decodeTextFrame,
+
+        /* Involved Persons Frames */
+        'TPE1': decodeTextFrame,
+        'TPE2': decodeTextFrame,
+        'TPE3': decodeTextFrame,
+        'TPE4': decodeTextFrame,
+        'TOPE': decodeTextFrame,
+        'TEXT': decodeTextFrame,
+        'TOLY': decodeTextFrame,
+        'TCOM': decodeTextFrame,
+        'TMCL': decodeTextFrame,
+        'TIPL': decodeTextFrame,
+        'TENC': decodeTextFrame,
+
+        /* Derived and Subjective Properties Frames */
+        'TBPM': decodeTextFrame,
+        'TLEN': decodeTextFrame,
+        'TKEY': decodeTextFrame,
+        'TLAN': decodeTextFrame,
+        'TCON': decodeTextFrame,
+        'TFLT': decodeTextFrame,
+        'TMED': decodeTextFrame,
+        'TMOO': decodeTextFrame,
+
+        /* Rights and Licence Frames */
+        'TCOP': decodeTextFrame,
+        'TPRO': decodeTextFrame,
+        'TPUB': decodeTextFrame,
+        'TOWN': decodeTextFrame,
+        'TRSN': decodeTextFrame,
+        'TRSO': decodeTextFrame,
+
+        /* Other Text Frames */
+        'TOFN': decodeTextFrame,
+        'TDLY': decodeTextFrame,
+        'TDEN': decodeTextFrame,
+        'TDOR': decodeTextFrame,
+        'TDRC': decodeTextFrame,
+        'TDRL': decodeTextFrame,
+        'TDTG': decodeTextFrame,
+        'TSSE': decodeTextFrame,
+        'TSOA': decodeTextFrame,
+        'TSOP': decodeTextFrame,
+        'TSOT': decodeTextFrame,
+
+        /* Attached Picture Frame */
+        'APIC': decodeAttachedPictureFrame,
+
+        /* Unique Identifier Frame */
+        'UFID': decodeIdentifierFrame,
+
+        /* Music CD Identifier Frame */
+        'MCDI': decodeBinaryFrame,
+
+        /* Comment Frame */
+        'COMM': decodeCommentFrame,
+
+        /* User Defined URL Link Frame */
+        'WXXX': decodeUserDefinedLinkFrame,
+
+        /* Private Frame */
+        'PRIV': decodeBinaryFrame,
+
+        /* Deprecated ID3v2 Frames */
+        'TDAT': decodeTextFrame,
+        'TIME': decodeTextFrame,
+        'TORY': decodeTextFrame,
+        'TRDA': decodeTextFrame,
+        'TSIZ': decodeTextFrame,
+        'TYER': decodeTextFrame,
+
+        /* General encapsulated object */
+        'GEOB': decodeTerminatedString
+    };
+
+    this.names = {
+        /* Identification Frames */
+        'TIT1': 'Content group description',
+        'TIT2': 'Title/Songname/Content description',
+        'TIT3': 'Subtitle/Description refinement',
+        'TALB': 'Album/Movie/Show title',
+        'TOAL': 'Original album/movie/show title',
+        'TRCK': 'Track number/Position in set',
+        'TPOS': 'Part of a set',
+        'TSST': 'Set subtitle',
+        'TSRC': 'ISRC',
+
+        /* Involved Persons Frames */
+        'TPE1': 'Lead artist/Lead performer/Soloist/Performing group',
+        'TPE2': 'Band/Orchestra/Accompaniment',
+        'TPE3': 'Conductor',
+        'TPE4': 'Interpreted, remixed, or otherwise modified by',
+        'TOPE': 'Original artist/performer',
+        'TEXT': 'Lyricist/Text writer',
+        'TOLY': 'Original lyricist/text writer',
+        'TCOM': 'Composer',
+        'TMCL': 'Musician credits list',
+        'TIPL': 'Involved people list',
+        'TENC': 'Encoded by',
+
+        /* Derived and Subjective Properties Frames */
+        'TBPM': 'BPM',
+        'TLEN': 'Length',
+        'TKEY': 'Initial key',
+        'TLAN': 'Language',
+        'TCON': 'Content type',
+        'TFLT': 'File type',
+        'TMED': 'Media type',
+        'TMOO': 'Mood',
+
+        /* Rights and Licence Frames */
+        'TCOP': 'Copyright message',
+        'TPRO': 'Produced notice',
+        'TPUB': 'Publisher',
+        'TOWN': 'File owner/licensee',
+        'TRSN': 'Internet radio station name',
+        'TRSO': 'Internet radio station owner',
+
+        /* Other Text Frames */
+        'TOFN': 'Original filename',
+        'TDLY': 'Playlist delay',
+        'TDEN': 'Encoding time',
+        'TDOR': 'Original release time',
+        'TDRC': 'Recording time',
+        'TDRL': 'Release time',
+        'TDTG': 'Tagging time',
+        'TSSE': 'Software/Hardware and settings used for encoding',
+        'TSOA': 'Album sort order',
+        'TSOP': 'Performer sort order',
+        'TSOT': 'Title sort order',
+
+        /* Attached Picture Frame */
+        'APIC': 'Attached picture',
+
+        /* Unique Identifier Frame */
+        'UFID': 'Unique identifier',
+
+        /* Music CD Identifier Frame */
+        'MCDI': 'Music CD identifier',
+
+        /* Comment Frame */
+        'COMM': 'Comment',
+
+        /* User Defined URL Link Frame */
+        'WXXX': 'User defined URL link',
+
+        /* Private Frame */
+        'PRIV': 'Private',
+
+        /* Deprecated ID3v2 frames */
+        'TDAT': 'Date',
+        'TIME': 'Time',
+        'TORY': 'Original release year',
+        'TRDA': 'Recording dates',
+        'TSIZ': 'Size',
+        'TYER': 'Year'
+    };
+
+    this.extenders = {
+        /* Identification Frames */
+        'TIT1': extendWithValueFrame,
+        'TIT2': extendWithValueFrame,
+        'TIT3': extendWithValueFrame,
+        'TALB': extendWithValueFrame,
+        'TOAL': extendWithValueFrame,
+        'TRCK': extendWithValueFrame,
+        'TPOS': extendWithValueFrame,
+        'TSST': extendWithValueFrame,
+        'TSRC': extendWithValueFrame,
+
+        /* Involved Persons Frames */
+        'TPE1': extendWithValueFrame,
+        'TPE2': extendWithValueFrame,
+        'TPE3': extendWithValueFrame,
+        'TPE4': extendWithValueFrame,
+        'TOPE': extendWithValueFrame,
+        'TEXT': extendWithValueFrame,
+        'TOLY': extendWithValueFrame,
+        'TCOM': extendWithValueFrame,
+        'TMCL': extendWithValueFrame,
+        'TIPL': extendWithValueFrame,
+        'TENC': extendWithValueFrame,
+
+        /* Derived and Subjective Properties Frames */
+        'TBPM': extendWithValueFrame,
+        'TLEN': extendWithValueFrame,
+        'TKEY': extendWithValueFrame,
+        'TLAN': extendWithValueFrame,
+        'TCON': extendWithValueFrame,
+        'TFLT': extendWithValueFrame,
+        'TMED': extendWithValueFrame,
+        'TMOO': extendWithValueFrame,
+
+        /* Rights and Licence Frames */
+        'TCOP': extendWithValueFrame,
+        'TPRO': extendWithValueFrame,
+        'TPUB': extendWithValueFrame,
+        'TOWN': extendWithValueFrame,
+        'TRSN': extendWithValueFrame,
+        'TRSO': extendWithValueFrame,
+
+        /* Other Text Frames */
+        'TOFN': extendWithValueFrame,
+        'TDLY': extendWithValueFrame,
+        'TDEN': extendWithValueFrame,
+        'TDOR': extendWithValueFrame,
+        'TDRC': extendWithValueFrame,
+        'TDRL': extendWithValueFrame,
+        'TDTG': extendWithValueFrame,
+        'TSSE': extendWithValueFrame,
+        'TSOA': extendWithValueFrame,
+        'TSOP': extendWithValueFrame,
+        'TSOT': extendWithValueFrame,
+
+        /* Attached Picture Frame */
+        'APIC': extendWithPictureFrame,
+
+        /* Unique Identifier Frame */
+        'UFID': extendWithIdentifierFrame,
+
+        /* Music CD Identifier */
+        'MCDI': extendWithValueFrame,
+
+        /* Comment Frame */
+        'COMM': extendWithCommentFrame,
+
+        /* User Defined URL Link Frame */
+        'WXXX': extendWithUserDefinedLinkFrame,
+
+        /* Private Frame */
+        'PRIV': extendWithPrivateFrame,
+
+        /* Deprecated ID3v2 Frames */
+        'TDAT': extendWithValueFrame,
+        'TIME': extendWithValueFrame,
+        'TORY': extendWithValueFrame,
+        'TRDA': extendWithValueFrame,
+        'TSIZ': extendWithValueFrame,
+        'TYER': extendWithValueFrame
+    };
+}
+
+Mad.ID3v23Stream.prototype.readFrame = function() {
+    if (this.offset >= this.header.length) {
+        return null;
+    }
+
+    var identifier = this.stream.readAsString(4);
+
+    if (identifier.charCodeAt(0) === 0) {
+        this.offset = this.header.length + 1;
+        return null;
+    }
+
+    var length = this.stream.readU32(true);
+    var flags = this.stream.readU16(true);
+
+    var header = {
+        'identifier': identifier,
+        'length': length,
+        'flags': flags
+    };
+
+    var result = null;
+
+    if (this.decoders[identifier]) {
+        result = this.decoders[identifier](header, this.stream);
+    } else {
+        result = {
+            'identifier': identifier,
+            'header': header
+        };
+
+        this.stream.readAsString(Math.min(length, this.header.length - this.offset));
+    }
+
+    if(result) {
+        result['name'] = this.names[identifier] ? this.names[identifier] : 'UNKNOWN';
+    }
+
+    this.offset += 10 + length;
+
+    return result;
+}
+
+Mad.ID3v23Stream.prototype.read = function() {
+    if (!this.array) {
+        this.array = [];
+
+        var frame = null;
+
+        //try {
+        while (frame = this.readFrame()) {
+            this.array.push(frame);
+        }
+        //} catch (e) {
+        //throw(e);
+        //console.log("ID3 Error: " + e);
+        //}
+    }
+
+    return this.array;
+}
+
+Mad.ID3v23Stream.prototype.toHash = function() {
+    var frames = this.read();
+
+    var hash = {};
+
+    for (var i = 0; i < frames.length; i++) {
+        var frame = frames[i];
+
+        var extender = this.extenders[frame['header']['identifier']];
+
+        if (extender) {
+            hash = extender(hash, frames[i]);
+        }
+    }
+
+    return hash;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/imdct_s.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/imdct_s.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/imdct_s.js	(revision 28388)
@@ -0,0 +1,43 @@
+Mad.imdct_s = [
+  /*  0 */  [ 0.608761429,
+              -0.923879533,
+              -0.130526192,
+               0.991444861,
+              -0.382683432,
+              -0.793353340 ],
+
+  /*  6 */  [ -0.793353340,
+               0.382683432,
+               0.991444861,
+               0.130526192,
+              -0.923879533,
+              -0.608761429 ],
+
+  /*  1 */  [  0.382683432,
+              -0.923879533,
+               0.923879533,
+              -0.382683432,
+              -0.382683432,
+               0.923879533 ],
+
+  /*  7 */  [ -0.923879533,
+              -0.382683432,
+               0.382683432,
+               0.923879533,
+               0.923879533,
+               0.382683432 ],
+
+  /*  2 */  [  0.130526192,
+              -0.382683432,
+               0.608761429,
+              -0.793353340,
+               0.923879533,
+              -0.991444861 ],
+
+  /*  8 */  [ -0.991444861,
+              -0.923879533,
+              -0.793353340,
+              -0.608761429,
+              -0.382683432,
+              -0.130526192 ]
+]
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/layer3.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/layer3.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/layer3.js	(revision 28388)
@@ -0,0 +1,1791 @@
+
+/*
+ * MPEG-1 scalefactor band widths
+ * derived from Table B.8 of ISO/IEC 11172-3
+ */
+var sfb_48000_long = [
+    4,  4,  4,  4,  4,  4,  6,  6,  6,   8,  10,
+    12, 16, 18, 22, 28, 34, 40, 46, 54,  54, 192
+];
+
+var sfb_44100_long = [
+    4,  4,  4,  4,  4,  4,  6,  6,  8,   8,  10,
+    12, 16, 20, 24, 28, 34, 42, 50, 54,  76, 158
+];
+
+var sfb_32000_long = [
+    4,  4,  4,  4,  4,  4,  6,  6,  8,  10,  12,
+    16, 20, 24, 30, 38, 46, 56, 68, 84, 102,  26
+];
+
+var sfb_48000_short = [
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+    6,  6,  6,  6,  6, 10, 10, 10, 12, 12, 12, 14, 14,
+    14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
+];
+
+var sfb_44100_short = [
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+    6,  6,  8,  8,  8, 10, 10, 10, 12, 12, 12, 14, 14,
+    14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
+];
+
+var sfb_32000_short = [
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+    6,  6,  8,  8,  8, 12, 12, 12, 16, 16, 16, 20, 20,
+    20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
+];
+
+var sfb_48000_mixed = [
+    /* long */   4,  4,  4,  4,  4,  4,  6,  6,
+    /* short */  4,  4,  4,  6,  6,  6,  6,  6,  6, 10,
+    10, 10, 12, 12, 12, 14, 14, 14, 16, 16,
+    16, 20, 20, 20, 26, 26, 26, 66, 66, 66
+];
+
+var sfb_44100_mixed = [
+    /* long */   4,  4,  4,  4,  4,  4,  6,  6,
+    /* short */  4,  4,  4,  6,  6,  6,  8,  8,  8, 10,
+    10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
+    18, 22, 22, 22, 30, 30, 30, 56, 56, 56
+];
+
+var sfb_32000_mixed = [
+    /* long */   4,  4,  4,  4,  4,  4,  6,  6,
+    /* short */  4,  4,  4,  6,  6,  6,  8,  8,  8, 12,
+    12, 12, 16, 16, 16, 20, 20, 20, 26, 26,
+    26, 34, 34, 34, 42, 42, 42, 12, 12, 12
+];
+
+var sfbwidth_table = [
+    { l: sfb_48000_long, s: sfb_48000_short, m: sfb_48000_mixed },
+    { l: sfb_44100_long, s: sfb_44100_short, m: sfb_44100_mixed },
+    { l: sfb_32000_long, s: sfb_32000_short, m: sfb_32000_mixed } /*, // fuck MPEG 2.5
+    { l: sfb_24000_long, s: sfb_24000_short, m: sfb_24000_mixed },
+    { l: sfb_22050_long, s: sfb_22050_short, m: sfb_22050_mixed },
+    { l: sfb_16000_long, s: sfb_16000_short, m: sfb_16000_mixed },
+    { l: sfb_12000_long, s: sfb_12000_short, m: sfb_12000_mixed },
+    { l: sfb_11025_long, s: sfb_11025_short, m: sfb_11025_mixed },
+    { l:  sfb_8000_long, s:  sfb_8000_short, m:  sfb_8000_mixed }*/
+];
+
+var pretab /* [22] */ = [
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
+];
+
+/*
+ * fractional powers of two
+ * used for requantization and joint stereo decoding
+ *
+ * root_table[3 + x] = 2^(x/4)
+ */
+var root_table /* 7 */ = [
+    /* 2^(-3/4) */ 0.59460355750136,
+    /* 2^(-2/4) */ 0.70710678118655,
+    /* 2^(-1/4) */ 0.84089641525371,
+    /* 2^( 0/4) */ 1.00000000000000,
+    /* 2^(+1/4) */ 1.18920711500272,
+    /* 2^(+2/4) */ 1.41421356237310,
+    /* 2^(+3/4) */ 1.68179283050743
+];
+
+var cs = [
+        +0.857492926 , +0.881741997,
+        +0.949628649 , +0.983314592,
+        +0.995517816 , +0.999160558,
+        +0.999899195 , +0.999993155
+];
+
+var ca = [
+        -0.514495755, -0.471731969,
+        -0.313377454, -0.181913200,
+        -0.094574193, -0.040965583,
+        -0.014198569, -0.003699975
+];
+
+
+Mad.count1table_select = 0x01;
+Mad.scalefac_scale     = 0x02;
+Mad.preflag            = 0x04;
+Mad.mixed_block_flag   = 0x08;
+
+Mad.I_STEREO  = 0x1;
+Mad.MS_STEREO = 0x2;
+
+/*
+ * windowing coefficients for long blocks
+ * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
+ *
+ * window_l[i] = sin((PI / 36) * (i + 1/2))
+ */
+var window_l /* [36] */ = [
+    0.043619387, 0.130526192,
+    0.216439614, 0.300705800,
+    0.382683432, 0.461748613,
+    0.537299608, 0.608761429,
+    0.675590208, 0.737277337,
+    0.793353340, 0.843391446,
+
+    0.887010833, 0.923879533,
+    0.953716951, 0.976296007,
+    0.991444861, 0.999048222,
+    0.999048222, 0.991444861,
+    0.976296007, 0.953716951,
+    0.923879533, 0.887010833,
+
+    0.843391446, 0.793353340,
+    0.737277337, 0.675590208,
+    0.608761429, 0.537299608,
+    0.461748613, 0.382683432,
+    0.300705800, 0.216439614,
+    0.130526192, 0.043619387
+];
+
+/*
+ * windowing coefficients for short blocks
+ * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
+ *
+ * window_s[i] = sin((PI / 12) * (i + 1/2))
+ */
+var window_s /* [12] */ = [
+    0.130526192, 0.382683432,
+    0.608761429, 0.793353340,
+    0.923879533, 0.991444861,
+    0.991444861, 0.923879533,
+    0.793353340, 0.608761429,
+    0.382683432, 0.130526192
+];
+
+/*
+ * coefficients for intensity stereo processing
+ * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3
+ *
+ * is_ratio[i] = tan(i * (PI / 12))
+ * is_table[i] = is_ratio[i] / (1 + is_ratio[i])
+ */
+var is_table /* [7] */ = [
+    0.000000000,
+    0.211324865,
+    0.366025404,
+    0.500000000,
+    0.633974596,
+    0.788675135,
+    1.000000000
+];
+
+/*
+ * coefficients for LSF intensity stereo processing
+ * derived from section 2.4.3.2 of ISO/IEC 13818-3
+ *
+ * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1)
+ * is_lsf_table[1][i] = (1 /      sqrt(2)) ^(i + 1)
+ */
+var is_lsf_table /* [2][15] */ = [
+    [
+        0.840896415,
+        0.707106781,
+        0.594603558,
+        0.500000000,
+        0.420448208,
+        0.353553391,
+        0.297301779,
+        0.250000000,
+        0.210224104,
+        0.176776695,
+        0.148650889,
+        0.125000000,
+        0.105112052,
+        0.088388348,
+        0.074325445
+    ], [
+        0.707106781,
+        0.500000000,
+        0.353553391,
+        0.250000000,
+        0.176776695,
+        0.125000000,
+        0.088388348,
+        0.062500000,
+        0.044194174,
+        0.031250000,
+        0.022097087,
+        0.015625000,
+        0.011048543,
+        0.007812500,
+        0.005524272
+    ]
+];
+
+Mad.SideInfo = function() {
+    this.gr = []; // array of Mad.Granule
+    this.scfsi = []; // array of ints
+};
+
+/*
+ * scalefactor bit lengths
+ * derived from section 2.4.2.7 of ISO/IEC 11172-3
+ */
+var sflen_table = [
+    { slen1: 0, slen2: 0 }, { slen1: 0, slen2: 1 }, { slen1: 0, slen2: 2 }, { slen1: 0, slen2: 3 },
+    { slen1: 3, slen2: 0 }, { slen1: 1, slen2: 1 }, { slen1: 1, slen2: 2 }, { slen1: 1, slen2: 3 },
+    { slen1: 2, slen2: 1 }, { slen1: 2, slen2: 2 }, { slen1: 2, slen2: 3 }, { slen1: 3, slen2: 1 },
+    { slen1: 3, slen2: 2 }, { slen1: 3, slen2: 3 }, { slen1: 4, slen2: 2 }, { slen1: 4, slen2: 3 }    
+];
+
+Mad.Granule = function() {
+    this.ch = []; // list of Mad.Channel 
+}
+
+Mad.Channel = function() {
+    this.table_select = []; // list of Numbers (I guess)
+    this.scalefac = []; // list of integers
+    this.subblock_gain = [];
+}
+
+
+/* we must take care that sz >= bits and sz < sizeof(long) lest bits === 0 */
+Mad.MASK = function (cache, sz, bits) {
+    // return Mad.bitwiseAnd(Mad.rshift(cache, sz - bits), Mad.lshift(1, bits) - 1);
+    return (((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1));
+}
+
+Mad.MASK1BIT = function (cache, sz) {
+    // return Mad.bitwiseAnd(cache, Mad.lshift(1, sz - 1));
+    return ((cache) & (1 << ((sz) - 1)));
+}
+
+var mad_III_huffdecode_exponents = new Int32Array(4 * 39);
+
+/*
+ * NAME:    III_huffdecode()
+ * DESCRIPTION: decode Huffman code words of one channel of one granule
+ */
+Mad.III_huffdecode = function(ptr, xr /* Float64Array(576) */, channel, sfbwidth, part2_length) {
+    var exponents = mad_III_huffdecode_exponents;
+    var expptr = 0;
+    var bits_left, cachesz;
+    var xrptr;
+    var sfbound;
+    var bitcache;
+    var sfbwidthptr = 0;
+    
+    bits_left = channel.part2_3_length - part2_length;
+    
+    if (bits_left < 0)
+        return Mad.Error.BADPART3LEN;
+
+    Mad.III_exponents(channel, sfbwidth, exponents);
+
+    var peek = ptr.clone();
+    ptr.skip(bits_left);
+    
+    /* align bit reads to byte boundaries */
+    cachesz  = peek.left;
+    cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;
+    
+    bitcache   = peek.read(cachesz);
+    //console.log("bitcache peek.read = " + bitcache);
+    bits_left -= cachesz;
+
+    xrptr = 0;
+
+    /* big_values */
+    {
+        var region = 0, rcount;
+        
+        // var reqcache = new Float64Array(new ArrayBuffer(8 * 16));
+        var reqcache = [];
+
+        sfbound = xrptr + sfbwidth[sfbwidthptr++];
+        rcount  = channel.region0_count + 1;
+
+        var entry = Mad.huff_pair_table[channel.table_select[region]];
+        var table     = entry.table;
+        var linbits   = entry.linbits;
+        var startbits = entry.startbits;
+
+        if (typeof(table) === 'undefined')
+            return Mad.Error.BADHUFFTABLE;
+
+        expptr = 0;
+        exp     = exponents[expptr++];
+        var reqhits = 0;
+        var big_values = channel.big_values;
+
+        while (big_values-- && cachesz + bits_left > 0) {
+            var pair;
+            var clumpsz, value;
+            var requantized;
+
+            //console.log("big_values = " + big_values + ", cachesz = " + cachesz + ", bits_left = " + bits_left);
+
+            if (xrptr === sfbound) {
+                sfbound += sfbwidth[sfbwidthptr++];
+
+                /* change table if region boundary */
+                if (--rcount === 0) {
+                    if (region === 0)
+                        rcount = channel.region1_count + 1;
+                    else
+                        rcount = 0;  /* all remaining */
+
+                    entry     = Mad.huff_pair_table[channel.table_select[++region]];
+                    table     = entry.table;
+                    linbits   = entry.linbits;
+                    startbits = entry.startbits;
+
+                    if (typeof(table) === 'undefined')
+                        return Mad.Error.BADHUFFTABLE;
+                }
+
+                if (exp != exponents[expptr]) {
+                    exp = exponents[expptr];
+                    reqhits = 0;
+                }
+
+                ++expptr;
+            }
+            
+
+            if (cachesz < 21) {
+                var bits       = ((32 - 1 - 21) + (21 - cachesz)) & ~7;
+                bitcache   = (bitcache << bits) | peek.read(bits);
+                cachesz   += bits;
+                bits_left -= bits;
+            }
+
+            /* hcod (0..19) */
+            clumpsz = startbits;
+            //console.log('getting pair, bitcache = ' + bitcache + ", cachesz = " + cachesz + ", clumpsz = " + clumpsz);
+            pair    = table[ (((bitcache) >> ((cachesz) - (clumpsz))) & ((1 << (clumpsz)) - 1))];
+            
+            while (!pair.final) {
+                //console.log('pair ' + JSON.stringify(pair) + ' is not final, cachesz = ' + cachesz + ' being subtracted clumpsz ' + clumpsz);
+                cachesz -= clumpsz;
+
+                clumpsz = pair.ptr.bits;
+                pair    = table[pair.ptr.offset +  (((bitcache) >> ((cachesz) - (clumpsz))) & ((1 << (clumpsz)) - 1))];
+            }
+
+            cachesz -= pair.value.hlen;
+
+            if (linbits) {
+                /* x (0..14) */
+                value = pair.value.x;
+                var x_final = false;
+
+                switch (value) {
+                case 0:
+                    xr[xrptr] = 0;
+                    break;
+
+                case 15:
+                    if (cachesz < linbits + 2) {
+                        bitcache   = (bitcache << 16) | peek.read(16);
+                        cachesz   += 16;
+                        bits_left -= 16;
+                    }
+
+                    value +=  (((bitcache) >> ((cachesz) - (linbits))) & ((1 << (linbits)) - 1));
+                    cachesz -= linbits;
+
+                    requantized = Mad.III_requantize(value, exp);
+                    x_final = true; // simulating goto, yay
+                    break;
+
+                default:
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        requantized = reqcache[value] = Mad.III_requantize(value, exp);
+                    }
+                    x_final = true;
+                }
+                
+                if(x_final) {
+                    xr[xrptr] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+
+                /* y (0..14) */
+                value = pair.value.y;
+                var y_final = false;
+
+                switch (value) {
+                case 0:
+                    xr[xrptr + 1] = 0;
+                    break;
+
+                case 15:
+                    if (cachesz < linbits + 1) {
+                        bitcache   = (bitcache << 16) | peek.read(16);
+                        cachesz   += 16;
+                        bits_left -= 16;
+                    }
+
+                    value +=  (((bitcache) >> ((cachesz) - (linbits))) & ((1 << (linbits)) - 1));
+                    cachesz -= linbits;
+
+                    requantized = Mad.III_requantize(value, exp);
+                    y_final = true;
+                    break; // simulating goto, yayzor
+
+                default:
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        reqcache[value] = Mad.III_requantize(value, exp);
+                        requantized = reqcache[value];
+                    }
+                    y_final = true;
+                }
+                
+                if(y_final) {
+                    xr[xrptr + 1] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+            } else {
+                /* x (0..1) */
+                value = pair.value.x;
+
+                if (value === 0) {
+                    xr[xrptr] = 0;
+                } else {
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        requantized = reqcache[value] = Mad.III_requantize(value, exp);
+                    }
+
+                    xr[xrptr] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+
+                /* y (0..1) */
+                value = pair.value.y;
+
+                if (value === 0)
+                    xr[xrptr + 1] = 0;
+                else {
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        requantized = reqcache[value] = Mad.III_requantize(value, exp);
+                    }
+
+                    xr[xrptr + 1] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+            }
+
+            xrptr += 2;
+            //console.log("big_values = " + big_values + ", cachesz = " + cachesz + ", bits_left = " + bits_left + ", xrptr = " + xrptr);
+        }
+    }
+
+    //console.log("bits_left (before big_values overrun) = " + bits_left + ", cachesz = " + cachesz);
+
+    if (cachesz + bits_left < 0)
+        return Mad.Error.BADHUFFDATA;  /* big_values overrun */
+
+    /* count1 */
+    {
+        var table = Mad.huff_quad_table[channel.flags & Mad.count1table_select];
+        var requantized = Mad.III_requantize(1, exp);
+
+        while (cachesz + bits_left > 0 && xrptr <= 572) {
+            /* hcod (1..6) */
+            if (cachesz < 10) {
+                bitcache   = (bitcache << 16) | peek.read(16);
+                cachesz   += 16;
+                bits_left -= 16;
+            }
+            
+            var quad = table[ (((bitcache) >> ((cachesz) - (4))) & ((1 << (4)) - 1))];
+
+            /* quad tables guaranteed to have at most one extra lookup */
+            if (!quad['final']) {
+                cachesz -= 4;
+
+                quad = table[quad.ptr.offset +
+                              (((bitcache) >> ((cachesz) - (quad.ptr.bits))) & ((1 << (quad.ptr.bits)) - 1))];
+            }
+
+            cachesz -= quad.value.hlen;
+
+            if (xrptr === sfbound) {
+                sfbound += sfbwidth[sfbwidthptr++];
+
+                if (exp != exponents[expptr]) {
+                    exp = exponents[expptr];
+                    requantized = Mad.III_requantize(1, exp);
+                }
+
+                ++expptr;
+            }
+
+            /* v (0..1) */
+            xr[xrptr] = quad.value.v ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            /* w (0..1) */
+            xr[xrptr + 1] = quad.value.w ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            xrptr += 2;
+
+            if (xrptr === sfbound) {
+                sfbound += sfbwidth[sfbwidthptr++];
+
+                if (exp != exponents[expptr]) {
+                    exp = exponents[expptr];
+                    requantized = Mad.III_requantize(1, exp);
+                }
+
+                ++expptr;
+            }
+
+            /* x (0..1) */
+            xr[xrptr] = quad.value.x ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            /* y (0..1) */
+            xr[xrptr + 1] = quad.value.y ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            xrptr += 2;
+        }
+
+        if (cachesz + bits_left < 0) {
+            //# if 0 && defined(DEBUG)
+            //console.log("huffman count1 overrun (" + (-(cachesz + bits_left)) + " bits)");
+            //# endif
+
+            /* technically the bitstream is misformatted, but apparently
+               some encoders are just a bit sloppy with stuffing bits */
+            xrptr -= 4;
+        }
+    }
+
+    if (!(-bits_left <= Mad.BUFFER_GUARD * CHAR_BIT)) {
+        throw new Error("assertion failed: (-bits_left <= Mad.BUFFER_GUARD * CHAR_BIT)");
+    }
+
+    /*
+      # if 0 && defined(DEBUG)
+      if (bits_left < 0)
+      console.log("read " + (-bits_left) + " bits too many");
+      else if (cachesz + bits_left > 0)
+      console.log((cachesz + bits_left) + " stuffing bits");
+      else
+      console.log("bits_left " + bits_left);
+      # endif
+    */
+
+    /* rzero */
+    while (xrptr < 576) {
+        xr[xrptr]     = 0;
+        xr[xrptr + 1] = 0;
+
+        xrptr += 2;
+    }
+
+    return Mad.Error.NONE;
+}
+
+/*
+ * NAME:    III_sideinfo()
+ * DESCRIPTION: decode frame side information from a bitstream
+ * 
+ * Since several values are passed by reference to this function, instead
+ * we're just returning a hash containing:
+ * {
+ *   ptr (Mad.Bit)
+ *   sideinfo (Mad.Sideinfo) 
+ *   data_bitlen (Number)
+ *   priv_bitlen (Number)
+ * }
+ */
+Mad.III_sideinfo = function (ptr, nch, lsf) {
+    
+    var si = new Mad.SideInfo();
+    var result = Mad.Error.NONE;
+
+    var data_bitlen = 0;
+    var priv_bitlen = lsf ? ((nch === 1) ? 1 : 2) : ((nch === 1) ? 5 : 3);
+    
+    si.main_data_begin = ptr.read(lsf ? 8 : 9);
+    si.private_bits    = ptr.read(priv_bitlen);
+
+    var ngr = 1;
+    if (!lsf) {
+        ngr = 2;
+
+        for (var ch = 0; ch < nch; ++ch)
+            si.scfsi[ch] = ptr.read(4);
+    }
+
+    for (var gr = 0; gr < ngr; ++gr) {
+        var granule = new Mad.Granule();
+        si.gr[gr] = granule;
+        
+        for (var ch = 0; ch < nch; ++ch) {
+            var channel = new Mad.Channel();
+            granule.ch[ch] = channel;
+            
+            channel.part2_3_length    = ptr.read(12);
+            channel.big_values        = ptr.read(9);
+            channel.global_gain       = ptr.read(8);
+            channel.scalefac_compress = ptr.read(lsf ? 9 : 4);
+
+            data_bitlen += channel.part2_3_length;
+
+            if (channel.big_values > 288 && result === 0)
+                result = Mad.Error.BADBIGVALUES;
+
+            channel.flags = 0;
+
+            /* window_switching_flag */
+            if (ptr.read(1)) {
+                channel.block_type = ptr.read(2);
+
+                if (channel.block_type === 0 && result === 0)
+                    result = Mad.Error.BADBLOCKTYPE;
+
+                if (!lsf && channel.block_type === 2 && si.scfsi[ch] && result === 0)
+                    result = Mad.Error.BADSCFSI;
+
+                channel.region0_count = 7;
+                channel.region1_count = 36;
+
+                if (ptr.read(1))
+                    channel.flags |= Mad.mixed_block_flag;
+                else if (channel.block_type === 2)
+                    channel.region0_count = 8;
+
+                for (var i = 0; i < 2; ++i)
+                    channel.table_select[i] = ptr.read(5);
+
+                for (var i = 0; i < 3; ++i)
+                    channel.subblock_gain[i] = ptr.read(3);
+            } else {
+                channel.block_type = 0;
+
+                for (var i = 0; i < 3; ++i)
+                    channel.table_select[i] = ptr.read(5);
+
+                channel.region0_count = ptr.read(4);
+                channel.region1_count = ptr.read(3);
+            }
+
+            /* [preflag,] scalefac_scale, count1table_select */
+            channel.flags |= ptr.read(lsf ? 2 : 3);
+        }
+    }
+
+    return {
+        ptr: ptr,
+        si: si,
+        data_bitlen: data_bitlen,
+        priv_bitlen: priv_bitlen
+    };
+}
+
+/*
+ * NAME:    III_scalefactors()
+ * DESCRIPTION: decode channel scalefactors of one granule from a bitstream
+ */
+Mad.III_scalefactors = function (ptr, channel, gr0ch, scfsi) {
+    var start; /* Mad.Bit */
+    var slen1, slen2, sfbi;
+
+    var start = ptr.clone();
+
+    var slen1 = sflen_table[channel.scalefac_compress].slen1;
+    var slen2 = sflen_table[channel.scalefac_compress].slen2;
+
+    if (channel.block_type === 2) {
+        sfbi = 0;
+
+        var nsfb = (channel.flags & Mad.mixed_block_flag) ? 8 + 3 * 3 : 6 * 3;
+        while (nsfb--)
+            channel.scalefac[sfbi++] = ptr.read(slen1);
+
+        nsfb = 6 * 3;
+        while (nsfb--)
+            channel.scalefac[sfbi++] = ptr.read(slen2);
+
+        nsfb = 1 * 3;
+        while (nsfb--)
+            channel.scalefac[sfbi++] = 0;
+    }
+    else {  /* channel.block_type != 2 */
+        if (scfsi & 0x8) {
+            for (var sfbi = 0; sfbi < 6; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 0; sfbi < 6; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen1);
+        }
+
+        if (scfsi & 0x4) {
+            for (var sfbi = 6; sfbi < 11; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 6; sfbi < 11; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen1);
+        }
+
+        if (scfsi & 0x2) {
+            for (var sfbi = 11; sfbi < 16; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 11; sfbi < 16; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen2);
+        }
+
+        if (scfsi & 0x1) {
+            for (var sfbi = 16; sfbi < 21; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 16; sfbi < 21; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen2);
+        }
+
+        channel.scalefac[21] = 0;
+    }
+
+    return start.length(ptr);
+}
+
+var c0 = 2 * Math.cos( 1 * Math.PI / 18);
+var c1 = 2 * Math.cos( 3 * Math.PI / 18);
+var c2 = 2 * Math.cos( 4 * Math.PI / 18);
+var c3 = 2 * Math.cos( 5 * Math.PI / 18);
+var c4 = 2 * Math.cos( 7 * Math.PI / 18);
+var c5 = 2 * Math.cos( 8 * Math.PI / 18);
+var c6 = 2 * Math.cos(16 * Math.PI / 18);
+
+var fastsdct = function (x /* [9] */, y /* [18] */, offset) {
+    var a0,  a1,  a2,  a3,  a4,  a5,  a6,  a7,  a8,  a9,  a10, a11, a12;
+    var a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25;
+    var m0,  m1,  m2,  m3,  m4,  m5,  m6,  m7;
+
+    a0 = x[3] + x[5];
+    a1 = x[3] - x[5];
+    a2 = x[6] + x[2];
+    a3 = x[6] - x[2];
+    a4 = x[1] + x[7];
+    a5 = x[1] - x[7];
+    a6 = x[8] + x[0];
+    a7 = x[8] - x[0];
+
+    a8  = a0  + a2;
+    a9  = a0  - a2;
+    a10 = a0  - a6;
+    a11 = a2  - a6;
+    a12 = a8  + a6;
+    a13 = a1  - a3;
+    a14 = a13 + a7;
+    a15 = a3  + a7;
+    a16 = a1  - a7;
+    a17 = a1  + a3;
+
+    m0 = a17 * -c3;
+    m1 = a16 * -c0;
+    m2 = a15 * -c4;
+    m3 = a14 * -c1;
+    m4 = a5  * -c1;
+    m5 = a11 * -c6;
+    m6 = a10 * -c5;
+    m7 = a9  * -c2;
+
+    a18 =     x[4] + a4;
+    a19 = 2 * x[4] - a4;
+    a20 = a19 + m5;
+    a21 = a19 - m5;
+    a22 = a19 + m6;
+    a23 = m4  + m2;
+    a24 = m4  - m2;
+    a25 = m4  + m1;
+
+    /* output to every other slot for convenience */
+    y[offset +  0] = a18 + a12;
+    y[offset +  2] = m0  - a25;
+    y[offset +  4] = m7  - a20;
+    y[offset +  6] = m3;
+    y[offset +  8] = a21 - m6;
+    y[offset + 10] = a24 - m1;
+    y[offset + 12] = a12 - 2 * a18;
+    y[offset + 14] = a23 + m0;
+    y[offset + 16] = a22 + m7;
+}
+
+/* sdctII_scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */
+var sdctII_scale = [];
+for(var i = 0; i < 9; ++i) {
+    sdctII_scale[i] = 2 * Math.cos(Math.PI * (2 * i + 1) / (2 * 18));
+}
+
+
+sdctII = function (x /* [18] */, X /* [18] */) {
+    /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */
+
+    // var tmp = new Float64Array(new ArrayBuffer(8 * 9));
+
+    var tmp = [];
+
+    /* even input butterfly */
+
+    for (var i = 0; i < 9; ++i) {
+        tmp[i] = x[i] + x[18 - i - 1];
+    }
+
+    fastsdct(tmp, X, 0);
+
+    /* odd input butterfly and scaling */
+
+    for (var i = 0; i < 9; ++i) {
+        tmp[i] = (x[i] - x[18 - i - 1]) * sdctII_scale[i];
+    }
+
+    fastsdct(tmp, X, 1);
+
+    /* output accumulation */
+    
+    for (var i = 3; i < 18; i += 2) {
+        X[i] -= X[i - 2];
+    }
+}
+
+/* dctIV_scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */  
+var dctIV_scale = [];
+for(i = 0; i < 18; i++) {
+    dctIV_scale[i] = 2 * Math.cos(Math.PI * (2 * i + 1) / (4 * 18));
+}
+
+var dctIV = function (y /* [18] */, X /* [18] */) {
+    // var tmp = new Float64Array(new ArrayBuffer(8 * 18));
+    var tmp = [];
+
+    /* scaling */
+
+    for (var i = 0; i < 18; ++i) {
+        tmp[i] = y[i] * dctIV_scale[i];
+    }
+
+    /* SDCT-II */
+
+    sdctII(tmp, X);
+
+    /* scale reduction and output accumulation */
+
+    X[0] /= 2;
+    for (var i = 1; i < 18; ++i) {
+        X[i] = X[i] / 2 - X[i - 1];
+    }
+}
+
+/*
+ * NAME:    imdct36
+ * DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm
+ */
+var imdct36 = function (x /* [18] */, y /* [36] */) {
+    // var tmp = new Float64Array(new ArrayBuffer(8 * 18));
+    var tmp = [];
+
+    /* DCT-IV */
+    dctIV(x, tmp);
+
+    /* convert 18-point DCT-IV to 36-point IMDCT */
+
+    for (var i =  0; i <  9; ++i) {
+        y[i] =  tmp[9 + i];
+    }
+    for (var i =  9; i < 27; ++i) {
+        y[i] = -tmp[36 - (9 + i) - 1];
+    }
+    for (var i = 27; i < 36; ++i) {
+        y[i] = -tmp[i - 27];
+    }
+}
+
+/*
+ * NAME:    III_imdct_s()
+ * DESCRIPTION: perform IMDCT and windowing for short blocks
+ */
+Mad.III_imdct_s = function (X /* [18] */, z /* [36] */)
+{
+    var yptr = 0;
+    var wptr;
+    var Xptr = 0;
+    
+    // var imdct_s_y = new Float64Array(new ArrayBuffer(8 * 36));
+    var y = [];
+    var hi, lo;
+
+    /* IMDCT */
+    for (var w = 0; w < 3; ++w) {
+        var s = Mad.imdct_s;
+        var sptr = 0;
+
+        for (var i = 0; i < 3; ++i) {
+            lo =  X[Xptr + 0] * s[sptr][0] +
+                X[Xptr + 1] * s[sptr][1] +
+                X[Xptr + 2] * s[sptr][2] +
+                X[Xptr + 3] * s[sptr][3] +
+                X[Xptr + 4] * s[sptr][4] +
+                X[Xptr + 5] * s[sptr][5];
+
+
+            y[yptr + i + 0] = lo;
+            y[yptr + 5 - i] = -y[yptr + i + 0];
+
+            ++sptr;
+
+            lo =  X[Xptr + 0] * s[sptr][0] +
+                X[Xptr + 1] * s[sptr][1] +
+                X[Xptr + 2] * s[sptr][2] +
+                X[Xptr + 3] * s[sptr][3] +
+                X[Xptr + 4] * s[sptr][4] +
+                X[Xptr + 5] * s[sptr][5];
+
+            y[yptr +  i + 6] = lo;
+            y[yptr + 11 - i] = y[yptr + i + 6];
+
+            ++sptr;
+        }
+
+        yptr += 12;
+        Xptr += 6;
+    }
+
+    /* windowing, overlapping and concatenation */
+
+    yptr = 0;
+    var wptr = 0;
+
+    for (var i = 0; i < 6; ++i) {
+        z[i +  0] = 0;
+        z[i +  6] = y[yptr +  0 + 0] * window_s[wptr + 0];
+
+        lo = y[yptr +  0 + 6] * window_s[wptr + 6] +
+            y[yptr + 12 + 0] * window_s[wptr + 0];
+
+        z[i + 12] = lo;
+
+        lo = y[yptr + 12 + 6] * window_s[wptr + 6] +
+            y[yptr + 24 + 0] * window_s[wptr + 0];
+
+        z[i + 18] = lo;
+
+        z[i + 24] = y[yptr + 24 + 6] * window_s[wptr + 6];
+        z[i + 30] = 0;
+
+        ++yptr;
+        ++wptr;
+    }
+}
+
+/*
+ * NAME:    III_imdct_l()
+ * DESCRIPTION: perform IMDCT and windowing for long blocks
+ */
+Mad.III_imdct_l = function (X /* 18 */, z /* 36 */, block_type) {
+    /* IMDCT */
+    imdct36(X, z);
+
+    /* windowing */
+
+    switch (block_type) {
+    case 0:  /* normal window */
+        for (var i = 0; i < 36; ++i) z[i] = z[i] * window_l[i];
+        break;
+
+    case 1:  /* start block */
+        for (var i =  0; i < 18; ++i) z[i] = z[i] * window_l[i];
+        /*  (var i = 18; i < 24; ++i) z[i] unchanged */
+        for (var i = 24; i < 30; ++i) z[i] = z[i] * window_s[i - 18];
+        for (var i = 30; i < 36; ++i) z[i] = 0;
+        break;
+
+    case 3:  /* stop block */
+        for (var i =  0; i <  6; ++i) z[i] = 0;
+        for (var i =  6; i < 12; ++i) z[i] = z[i] * window_s[i - 6];
+        /*  (var i = 12; i < 18; ++i) z[i] unchanged */
+        for (var i = 18; i < 36; ++i) z[i] = z[i] * window_l[i];
+        break;
+    }
+}
+
+
+/*
+ * NAME:    III_freqinver()
+ * DESCRIPTION: perform subband frequency inversion for odd sample lines
+ */
+Mad.III_freqinver = function (sample /* [18][32] */, sb)
+{
+    for (var i = 1; i < 18; i += 2)
+        sample[i][sb] = -sample[i][sb];
+}
+
+/*
+ * NAME:    III_decode()
+ * DESCRIPTION: decode frame main_data
+ * 
+ * result struct:
+ */
+Mad.III_decode = function (ptr, frame, si, nch) {
+    var header = frame.header;
+    var sfreqi;
+    
+    {
+        var sfreq = header.samplerate;
+
+        if (header.flags & Mad.Flag.MPEG_2_5_EXT)
+            sfreq *= 2;
+
+        /* 48000 => 0, 44100 => 1, 32000 => 2,
+           24000 => 3, 22050 => 4, 16000 => 5 */
+        sfreqi = ((sfreq >>  7) & 0x000f) +
+            ((sfreq >> 15) & 0x0001) - 8;
+
+        if (header.flags & Mad.Flag.MPEG_2_5_EXT)
+            sfreqi += 3;
+    }
+    
+    /* scalefactors, Huffman decoding, requantization */
+    var ngr = (header.flags & Mad.Flag.LSF_EXT) ? 1 : 2;
+    
+    for (var gr = 0; gr < ngr; ++gr) {
+        var granule = si.gr[gr];
+        var sfbwidth = [];
+        /* unsigned char const *sfbwidth[2]; */
+        var l = 0;
+        // var xr = [ new Float64Array(new ArrayBuffer(8 * 576)), new Float64Array(new ArrayBuffer(8 * 576)) ];
+        var xr = [[], []];
+        var error;
+
+        for (var ch = 0; ch < nch; ++ch) {
+            var channel = granule.ch[ch];
+            var part2_length;
+
+            sfbwidth[ch] = sfbwidth_table[sfreqi].l;
+
+            if (channel.block_type === 2) {
+                sfbwidth[ch] = (channel.flags & Mad.mixed_block_flag) ?
+                    sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s;
+            }
+
+            if (header.flags & Mad.Flag.LSF_EXT) {
+                part2_length = Mad.III_scalefactors_lsf(ptr, channel,
+                                                        ch === 0 ? 0 : si.gr[1].ch[1], header.mode_extension);
+            } else {
+                part2_length = Mad.III_scalefactors(ptr, channel, si.gr[0].ch[ch],
+                                                    gr === 0 ? 0 : si.scfsi[ch]);
+            }
+
+            error = Mad.III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length);
+            
+            if (error)
+                return error;
+        }
+
+        if (Mad.debug) {
+            Mad.debug.huffdecode.write(Mad.debug.iteration + "\t");
+
+            for (var i = 0; i < 576; i++) {
+                Mad.debug.huffdecode.write(xr[0][i].toFixed(8) + "\t");
+            }
+            Mad.debug.huffdecode.write("\n");
+        }
+
+        /* joint stereo processing */
+        if ((header.mode === Mad.Mode.JOINT_STEREO) && (header.mode_extension != 0)) {
+            error = Mad.III_stereo(xr, granule, header, sfbwidth[0]);
+            
+            if (error)
+                return error;
+        }
+
+        /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */
+        for (var ch = 0; ch < nch; ++ch) {
+            var channel = granule.ch[ch];
+            var sample = frame.sbsample[ch].slice(18 * gr);
+            
+            var sb, l = 0, i, sblimit;
+            // var output = new Float64Array(new ArrayBuffer(8 * 36));
+            var output = [];
+
+            if (channel.block_type === 2) {
+                Mad.III_reorder(xr[ch], channel, sfbwidth[ch]);
+
+                /*
+                 * According to ISO/IEC 11172-3, "Alias reduction is not applied for
+                 * granules with block_type === 2 (short block)." However, other
+                 * sources suggest alias reduction should indeed be performed on the
+                 * lower two subbands of mixed blocks. Most other implementations do
+                 * this, so by default we will too.
+                 */
+                if (channel.flags & Mad.mixed_block_flag)
+                    Mad.III_aliasreduce(xr[ch], 36);
+            } else {
+                Mad.III_aliasreduce(xr[ch], 576);
+            }
+
+            /* subbands 0-1 */
+            if (channel.block_type != 2 || (channel.flags & Mad.mixed_block_flag)) {
+                var block_type = channel.block_type;
+                if (channel.flags & Mad.mixed_block_flag)
+                    block_type = 0;
+
+                /* long blocks */
+                for (var sb = 0; sb < 2; ++sb, l += 18) {
+                    Mad.III_imdct_l(xr[ch].slice(l, l + 18), output, block_type);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+
+                    // var sys = require('sys');
+                    // sys.print("\nblocktype: " + block_type + " sb: " + sb + "\n");
+                    // for (var i = 0; i < 18; i++) {
+                    //     sys.print(output[i].toFixed(8) + "\t");
+                    //     if (i % 8 === 7) sys.print("\n");
+                    // }
+
+                }
+            } else {
+                /* short blocks */
+                for (var sb = 0; sb < 2; ++sb, l += 18) {
+                    Mad.III_imdct_s(xr[ch].slice(l, l + 18), output);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+                }
+            }
+
+            Mad.III_freqinver(sample, 1);
+
+            /* (nonzero) subbands 2-31 */
+            i = 576;
+            while (i > 36 && xr[ch][i - 1] === 0)
+                --i;
+
+            sblimit = 32 - (((576 - i) / 18) << 0);
+
+            if (channel.block_type != 2) {
+                /* long blocks */
+                for (var sb = 2; sb < sblimit; ++sb, l += 18) {
+                    Mad.III_imdct_l(xr[ch].slice(l, l + 18), output, channel.block_type);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+
+                    if (sb & 1)
+                        Mad.III_freqinver(sample, sb);
+                }
+            } else {
+                /* short blocks */
+                for (var sb = 2; sb < sblimit; ++sb, l += 18) {
+                    Mad.III_imdct_s(xr[ch].slice(l, l + 18), output);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+
+                    if (sb & 1)
+                        Mad.III_freqinver(sample, sb);
+                }
+            }
+
+            // remaining (zero) subbands
+            for (var sb = sblimit; sb < 32; ++sb) {
+                Mad.III_overlap_z(frame.overlap[ch][sb], sample, sb);
+
+                if (sb & 1)
+                    Mad.III_freqinver(sample, sb);
+            }
+
+            if (Mad.debug) {
+                for (var i = 0; i < 18; i++) {
+                    Mad.debug.sample.write(Mad.debug.iteration * 18 + i + "\t");
+                    for (var j = 0; j < 32; j++) {
+                        Mad.debug.sample.write(sample[i][j].toFixed(8) + "\t");
+                    }
+                    Mad.debug.sample.write("\n");
+                }
+                Mad.debug.iteration += 1;
+            }       
+        }
+    }
+
+    return Mad.Error.NONE;
+}
+
+
+/*
+ * NAME:    layer.III()
+ * DESCRIPTION: decode a single Layer III frame
+ */
+Mad.layer_III = function (stream, frame) {
+    var header = frame.header;
+    var nch, next_md_begin = 0;
+    var si_len, data_bitlen, md_len = 0;
+    var frame_space, frame_used, frame_free;
+    var /* Mad.Error */ error;
+    var ptr;
+    var result = 0;
+
+    /* allocate Layer III dynamic structures */
+    nch = header.nchannels();
+    si_len = (header.flags & Mad.Flag.LSF_EXT) ?
+        (nch === 1 ? 9 : 17) : (nch === 1 ? 17 : 32);
+
+    /* check frame sanity */
+    if (stream.next_frame - stream.ptr.nextbyte() < si_len) {
+        stream.error = Mad.Error.BADFRAMELEN;
+        stream.md_len = 0;
+        return -1;
+    }
+
+    /* check CRC word */
+    if (header.flags & Mad.Flag.PROTECTION) {
+        header.crc_check = mad_bit_crc(stream.ptr, si_len * CHAR_BIT, header.crc_check);
+
+        if (header.crc_check != header.crc_target &&
+            !(frame.options & Mad.Option.IGNORECRC)) {
+            stream.error = Mad.Error.BADCRC;
+            result = -1;
+        }
+    }
+
+    /* decode frame side information */
+    var sideinfoResult = Mad.III_sideinfo(stream.ptr, nch, header.flags & Mad.Flag.LSF_EXT);
+    
+    stream.ptr = sideinfoResult.ptr;
+    var si = sideinfoResult.si;
+    var data_bitlen = sideinfoResult.data_bitlen;
+    var priv_bitlen = sideinfoResult.priv_bitlen;
+    
+    //console.log("We're at " + stream.ptr.offset + ", data_bitlen = " + data_bitlen + ", priv_bitlen = " + priv_bitlen);
+    
+    if (error && result === 0) {
+        stream.error = error;
+        result = -1;
+    }
+
+    header.flags        |= priv_bitlen;
+    header.private_bits |= si.private_bits;
+
+    /* find main_data of next frame */
+    {
+        var peek = new Mad.Bit(stream.stream, stream.next_frame);
+
+        header = peek.read(32);
+        
+        if (Mad.bitwiseAnd(header, 0xffe60000) /* syncword | layer */ === 0xffe20000) { 
+            if (!(Mad.bitwiseAnd(header, 0x00010000)))  /* protection_bit */
+                peek.skip(16);  /* crc_check */
+
+            next_md_begin = peek.read(Mad.bitwiseAnd(header, 0x00080000) /* ID */ ? 9 : 8);
+        }
+    }
+
+    /* find main_data of this frame */
+    frame_space = stream.next_frame - stream.ptr.nextbyte();
+
+    //console.log("next_frame = " + stream.next_frame + ", nextbyte = " + stream.ptr.nextbyte() + ", frame_space = " + frame_space);
+
+    //console.log("before, next_md_begin = " + next_md_begin);
+
+    if (next_md_begin > si.main_data_begin + frame_space)
+        next_md_begin = 0;
+
+    //console.log("so far, md_len = " + md_len + ", si.main_data_begin = " + si.main_data_begin + ", frame_space = " + frame_space + ", next_md_begin = " + next_md_begin);
+    
+    md_len = si.main_data_begin + frame_space - next_md_begin;
+
+    frame_used = 0;
+    
+    if (si.main_data_begin === 0) {
+        ptr = stream.ptr;
+        stream.md_len = 0;
+
+        frame_used = md_len;
+    } else {
+        //console.log("si.main_data_begin = " + si.main_data_begin + ", stream.md_len = " + stream.md_len);
+        if (si.main_data_begin > stream.md_len) {
+            if (result === 0) {
+                stream.error = Mad.Error.BADDATAPTR;
+                result = -1;
+            }
+        } else {
+            var old_md_len = stream.md_len;
+            
+            if (md_len > si.main_data_begin) {
+                if(!(stream.md_len + md_len - si.main_data_begin <= Mad.BUFFER_MDLEN)) {
+                    throw new Error("Assertion failed: (stream.md_len + md_len - si.main_data_begin <= MAD_BUFFER_MDLEN)");
+                }
+                
+                frame_used = md_len - si.main_data_begin;
+                
+                /* memcpy(dst, dstOffset, src, srcOffset, length) - returns a copy of dst with modified bytes */
+                //console.log("mem copy 1");
+                stream.main_data = Mad.Storage.memcpy(stream.main_data, stream.md_len, stream.ptr.stream, stream.ptr.nextbyte(), frame_used);
+
+                /*
+                // Keeping this here as a handy little reference
+                memcpy(*stream.main_data + stream.md_len,
+                mad_bit_nextbyte(&stream.ptr),
+                frame_used = md_len - si.main_data_begin
+                );
+                */
+                stream.md_len += frame_used;
+            }
+           
+            ptr = new Mad.Bit(stream.main_data, old_md_len - si.main_data_begin);
+
+            //console.log("main_data length = " + stream.main_data.length + ", old_md_len = " + old_md_len + ", main_data_begin = " + si.main_data_begin + " new ptr = ");
+            //console.log(ptr);
+        }
+    }
+
+    frame_free = frame_space - frame_used;
+
+    /* decode main_data */
+    if (result === 0) {
+        error = Mad.III_decode(ptr, frame, si, nch);
+        
+        if (error) {
+            stream.error = error;
+            result = -1;
+        }
+        
+        /* designate ancillary bits */
+        stream.anc_ptr    = ptr;
+        stream.anc_bitlen = md_len * CHAR_BIT - data_bitlen;
+    }
+    
+    // DEBUG
+    /*
+      console.log(
+      "main_data_begin:" + si.main_data_begin +
+      ", md_len:" + md_len +
+      ", frame_free:" + frame_free +
+      ", data_bitlen:" + data_bitlen +
+      ", anc_bitlen: " + stream.anc_bitlen);
+    */
+
+    /* preload main_data buffer with up to 511 bytes for next frame(s) */
+    if (frame_free >= next_md_begin) {
+        //console.log("mem copy 2");
+        stream.main_data = Mad.Storage.memcpy(stream.main_data, 0, stream.stream, stream.next_frame - next_md_begin, next_md_begin);
+        /*
+        // Keeping here for reference
+        memcpy(*stream.main_data, stream.next_frame - next_md_begin, next_md_begin);
+        */
+        stream.md_len = next_md_begin;
+    } else {
+        if (md_len < si.main_data_begin) {
+            var extra = si.main_data_begin - md_len;
+            if (extra + frame_free > next_md_begin)
+                extra = next_md_begin - frame_free;
+
+            if (extra < stream.md_len) {
+                //console.log("mem copy 3");
+                stream.main_data = Mad.Storage.memcpy(stream.main_data, 0, stream.main_data, stream.md_len - extra, extra);
+                /*
+                // Keeping here for reference
+                memmove(*stream.main_data, *stream.main_data + stream.md_len - extra, extra);
+                */
+                stream.md_len = extra;
+            }
+        } else {
+            stream.md_len = 0;
+        }
+
+        //console.log("mem copy 4");
+        stream.main_data = Mad.Storage.memcpy(stream.main_data, stream.md_len, stream.stream, stream.next_frame - frame_free, frame_free);
+        /*
+        // Keeping here for reference
+        memcpy(*stream.main_data + stream.md_len, stream.next_frame - frame_free, frame_free);
+        */
+        stream.md_len += frame_free;
+    }
+
+    return result;
+}
+
+Mad.III_exponents = function(channel, sfbwidth, exponents) {
+    var gain = channel.global_gain - 210;
+    var scalefac_multiplier = (channel.flags & Mad.scalefac_scale) ? 2 : 1;
+    
+    if (channel.block_type === 2) {
+        var sfbi = 0, l = 0;
+        
+        if (channel.flags & Mad.mixed_block_flag) {
+            var premask = (channel.flags & Mad.preflag) ? ~0 : 0;
+            
+            /* long block subbands 0-1 */
+            
+            while (l < 36) {
+                exponents[sfbi] = gain - ((channel.scalefac[sfbi] + (pretab[sfbi] & premask)) << scalefac_multiplier);
+                
+                l += sfbwidth[sfbi++]
+            }
+        }
+        
+        /* this is probably wrong for 8000 Hz short/mixed blocks */
+        
+        var gain0 = gain - 8 * channel.subblock_gain[0];
+        var gain1 = gain - 8 * channel.subblock_gain[1];
+        var gain2 = gain - 8 * channel.subblock_gain[2];
+        
+        while (l < 576) {
+            exponents[sfbi + 0] = gain0 - (channel.scalefac[sfbi + 0] << scalefac_multiplier);
+            exponents[sfbi + 1] = gain1 - (channel.scalefac[sfbi + 1] << scalefac_multiplier);
+            exponents[sfbi + 2] = gain2 - (channel.scalefac[sfbi + 2] << scalefac_multiplier);
+            
+            l    += 3 * sfbwidth[sfbi];
+            sfbi += 3;
+        }
+    } else { /* channel.block_type != 2 */
+        if (channel.flags & Mad.preflag) {
+            for (var sfbi = 0; sfbi < 22; ++sfbi) {
+                exponents[sfbi] = gain - ((channel.scalefac[sfbi] + pretab[sfbi]) << scalefac_multiplier);
+            }
+        } else {
+            for (var sfbi = 0; sfbi < 22; ++sfbi) {
+                exponents[sfbi] = gain - (channel.scalefac[sfbi] << scalefac_multiplier);
+            }
+        }
+    }
+}
+
+Mad.III_requantize = function(value, exp) {
+    // usual (x >> 0) tricks to make sure frac and exp stay integers
+    var frac = (exp % 4) >> 0;  /* assumes sign(frac) === sign(exp) */
+    exp = (exp / 4) >> 0;
+
+    var requantized = Math.pow(value, 4.0 / 3.0);
+    requantized *= Math.pow(2.0, (exp / 4.0));
+    
+    if(frac) {
+        requantized *= Math.pow(2.0, (frac / 4.0));
+    }
+    
+    if(exp < 0) {
+        requantized /= Math.pow(2.0, -exp * (3.0 / 4.0));
+    }
+
+    return requantized;
+}
+
+Mad.III_aliasreduce = function(xr, lines) {
+    var xrPointer = 0;
+    
+    for (xrPointer += 18; xrPointer < lines; xrPointer += 18) {
+        for (var i = 0; i < 8; ++i) {
+            var a = xr[xrPointer - i - 1];
+            var b = xr[xrPointer + i];
+
+            var lo =  a * cs[i] - b * ca[i];
+
+            xr[xrPointer - i - 1] = lo;
+
+            lo =  b * cs[i] + a * ca[i];
+
+            xr[xrPointer + i] = lo
+        }
+    }
+}
+
+Mad.III_overlap = function (output /* [36] */, overlap /* [18] */, sample /* [18][32] */, sb) {
+    for (var i = 0; i < 18; ++i) {
+        sample[i][sb] = output[i +  0] + overlap[i];
+        overlap[i]    = output[i + 18];
+    }
+}
+
+Mad.III_overlap_z = function (overlap /* [18] */, sample /* [18][32] */, sb) {
+    for (var i = 0; i < 18; ++i) {
+        sample[i][sb] = overlap[i];
+        overlap[i]    = 0;
+    }
+}
+
+// allocating typed arrays once and for all, outside the function
+// var reorder_tmp = new Float64Array(new ArrayBuffer(8 * 32 * 3 * 6));
+// var reorder_sbw = new Float64Array(new ArrayBuffer(8 * 3));
+// var reorder_sw  = new Float64Array(new ArrayBuffer(8 * 3));
+
+Mad.III_reorder = function (xr /* [576] */, channel, sfbwidth /* [39] */) {
+    var sfbwidthPointer = 0;
+    var tmp = [];
+
+    for (var i = 0; i < 32; i++) {
+        tmp[i] = [];
+        for (var j = 0; j < 3; j++) {
+            tmp[i][j] = [];
+            for (var k = 0; k < 6; k++) {
+                tmp[i][j][k] = 0;
+            }
+        }
+    }
+
+    var sbw = [];
+    var sw  = [];
+    
+    /* this is probably wrong for 8000 Hz mixed blocks */
+
+    var sb = 0;
+    if (channel.flags & Mad.mixed_block_flag) {
+        var sb = 2;
+
+        var l = 0;
+        while (l < 36)
+            l += sfbwidth[sfbwidthPointer++];
+    }
+
+    for (var w = 0; w < 3; ++w) {
+        sbw[w] = sb;
+        sw[w]  = 0;
+    }
+
+    f = sfbwidth[sfbwidthPointer++];
+    w = 0;
+
+    for (var l = 18 * sb; l < 576; ++l) {
+        if (f-- === 0) {
+            f = sfbwidth[sfbwidthPointer++] - 1;
+            w = (w + 1) % 3;
+        }
+        
+        tmp[sbw[w]][w][sw[w]++] = xr[l];
+
+        if (sw[w] === 6) {
+            sw[w] = 0;
+            ++sbw[w];
+        }
+    }
+
+    var tmp2 = [];
+    var ptr = 0;
+
+    for (var i = 0; i < 32; i++) {
+        for (var j = 0; j < 3; j++) {
+            for (var k = 0; k < 6; k++) {
+                tmp2[ptr++] = tmp[i][j][k];
+            }
+        }
+    }
+    
+    var len = (576 - 18 * sb);
+
+    for (var i = 0; i < len; i++) {
+        xr[18 * sb + i] = tmp2[sb + i];
+    }
+}
+
+Mad.III_stereo = function(xr /* [2][576] */, granule, header, sfbwidth) {
+    var modes = [];
+    var sfbi, l, n, i;
+
+    if (granule.ch[0].block_type !=
+        granule.ch[1].block_type ||
+        (granule.ch[0].flags & Mad.mixed_block_flag) !=
+        (granule.ch[1].flags & Mad.mixed_block_flag))
+        return Mad.Error.BADSTEREO;
+
+    for (i = 0; i < 39; ++i)
+        modes[i] = header.mode_extension;
+
+    /* intensity stereo */
+
+    if (header.mode_extension & Mad.I_STEREO) {
+        var right_ch = granule.ch[1];
+        var right_xr = xr[1];
+        var is_pos;
+
+        header.flags |= Mad.Flag.I_STEREO;
+
+        /* first determine which scalefactor bands are to be processed */
+
+        if (right_ch.block_type === 2) {
+            var lower, start, max, bound = [], w;
+
+            lower = start = max = bound[0] = bound[1] = bound[2] = 0;
+
+            sfbi = l = 0;
+
+            if (right_ch.flags & Mad.mixed_block_flag) {
+                while (l < 36) {
+                    n = sfbwidth[sfbi++];
+
+                    for (i = 0; i < n; ++i) {
+                        if (right_xr[i]) {
+                            lower = sfbi;
+                            break;
+                        }
+                    }
+
+                    right_xr += n;
+                    l += n;
+                }
+
+                start = sfbi;
+            }
+
+            w = 0;
+            while (l < 576) {
+                n = sfbwidth[sfbi++];
+
+                for (i = 0; i < n; ++i) {
+                    if (right_xr[i]) {
+                        max = bound[w] = sfbi;
+                        break;
+                    }
+                }
+
+                right_xr += n;
+                l += n;
+                w = (w + 1) % 3;
+            }
+
+            if (max)
+                lower = start;
+
+            /* long blocks */
+
+            for (i = 0; i < lower; ++i)
+                modes[i] = header.mode_extension & ~Mad.I_STEREO;
+
+            /* short blocks */
+
+            w = 0;
+            for (i = start; i < max; ++i) {
+                if (i < bound[w])
+                    modes[i] = header.mode_extension & ~Mad.I_STEREO;
+
+                w = (w + 1) % 3;
+            }
+        }
+        else {  /* right_ch.block_type != 2 */
+            var bound;
+
+            bound = 0;
+            for (sfbi = l = 0; l < 576; l += n) {
+                n = sfbwidth[sfbi++];
+
+                for (i = 0; i < n; ++i) {
+                    if (right_xr[i]) {
+                        bound = sfbi;
+                        break;
+                    }
+                }
+
+                right_xr += n;
+            }
+
+            for (i = 0; i < bound; ++i)
+                modes[i] = header.mode_extension & ~Mad.I_STEREO;
+        }
+
+        /* now do the actual processing */
+
+        if (header.flags & Mad.Flag.LSF_EXT) {
+            illegal_pos = granule[1].ch[1].scalefac;
+            var lsf_scale;
+
+            /* intensity_scale */
+            lsf_scale = is_lsf_table[right_ch.scalefac_compress & 0x1];
+
+            for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
+                n = sfbwidth[sfbi];
+
+                if (!(modes[sfbi] & Mad.I_STEREO))
+                    continue;
+
+                if (illegal_pos[sfbi]) {
+                    modes[sfbi] &= ~Mad.I_STEREO;
+                    continue;
+                }
+
+                is_pos = right_ch.scalefac[sfbi];
+
+                for (i = 0; i < n; ++i) {
+                    var left;
+
+                    left = xr[0][l + i];
+
+                    if (is_pos === 0)
+                        xr[1][l + i] = left;
+                    else {
+                        var opposite;
+
+                        opposite = left * lsf_scale[(is_pos - 1) / 2];
+
+                        if (is_pos & 1) {
+                            xr[0][l + i] = opposite;
+                            xr[1][l + i] = left;
+                        }
+                        else
+                            xr[1][l + i] = opposite;
+                    }
+                }
+            }
+        }
+        else {  /* !(header.flags & MAD_FLAG_LSF_EXT) */
+            for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
+                n = sfbwidth[sfbi];
+
+                if (!(modes[sfbi] & Mad.I_STEREO))
+                    continue;
+
+                is_pos = right_ch.scalefac[sfbi];
+
+                if (is_pos >= 7) {  /* illegal intensity position */
+                    modes[sfbi] &= ~Mad.I_STEREO;
+                    continue;
+                }
+
+                for (i = 0; i < n; ++i) {
+                    var left;
+
+                    left = xr[0][l + i];
+
+                    xr[0][l + i] = left * is_table[    is_pos];
+                    xr[1][l + i] = left * is_table[6 - is_pos];
+                }
+            }
+        }
+    }
+
+    /* middle/side stereo */
+
+    if (header.mode_extension & Mad.MS_STEREO) {
+        var invsqrt2;
+
+        header.flags |= Mad.Flag.MS_STEREO;
+
+        invsqrt2 = root_table[3 + -2];
+
+        for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
+            n = sfbwidth[sfbi];
+
+            if (modes[sfbi] != Mad.MS_STEREO)
+                continue;
+
+            for (i = 0; i < n; ++i) {
+                var m, s;
+
+                m = xr[0][l + i];
+                s = xr[1][l + i];
+
+                xr[0][l + i] = (m + s) * invsqrt2;  /* l = (m + s) / sqrt(2) */
+                xr[1][l + i] = (m - s) * invsqrt2;  /* r = (m - s) / sqrt(2) */
+            }
+        }
+    }
+
+    return Mad.Error.NONE;    
+};
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/mad.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/mad.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/mad.js	(revision 28388)
@@ -0,0 +1,171 @@
+
+/* Namespaces */
+Mad = {};
+Mad.ArrayBuffers = {};
+Mad.BinaryStrings = {};
+
+Mad.recoverable = function (error) {
+    return (error & 0xff00) != 0;
+};
+
+// change this value for testing
+Mad.enforceBinaryString = false;
+
+if (!Mad.enforceBinaryString && typeof(ArrayBuffer) === 'function' && typeof(Uint8Array) === 'function') {
+    console.log("Using ArrayBuffer");
+    Mad.Storage = {
+        backing: 'arraybuffer',
+
+        newBuffer: function (length) {
+            return new Uint8Array(length);
+        },
+
+        memcpy: function (dst, dstOffset, pSrc, srcOffset, length) {
+            while (pSrc.parentStream) {
+                srcOffset += pSrc.start;
+                pSrc = pSrc.parentStream;
+            }
+            var src = pSrc.subarray ? pSrc : pSrc.buffer;
+            var subarr = src.subarray(srcOffset, srcOffset + length);
+
+            // oh my, memcpy actually exists in JavaScript?
+            dst.set(subarr, dstOffset);
+            return dst;
+        }
+    };
+    Mad.FileStream = function (file, callback) {
+        return new Mad.ArrayBuffers.FileStream(file, callback);
+    }
+    Mad.AjaxStream = function (file, callback) {
+        return new Mad.ArrayBuffers.AjaxStream(file, callback);
+    }
+} else {
+    console.log("Using BinaryString");
+    Mad.Storage = {
+        backing: 'binarystring',
+
+        newBuffer: function (length) {
+            return Mad.mul("\0", length);
+        },
+
+        memcpy: function (dst, dstOffset, src, srcOffset, length) {
+            // this is a pretty weird memcpy actually - it constructs a new version of dst, because we have no other way to do it
+            return dst.slice(0, dstOffset) + src.slice(srcOffset, srcOffset + length) + dst.slice(dstOffset + length);
+        }
+    };
+    Mad.FileStream = function (file, callback) {
+        return new Mad.BinaryStrings.FileStream(file, callback);
+    }
+    Mad.AjaxStream = function (file, callback) {
+        return new Mad.BinaryStrings.AjaxStream(file, callback);
+    }
+}
+
+// credit: http://blog.stevenlevithan.com/archives/fast-string-multiply
+Mad.mul = function (str, num) {
+        var i = Math.ceil(Math.log(num) / Math.LN2), res = str;
+        do {
+            res += res;
+        } while (0 < --i);
+        return res.slice(0, str.length * num);
+};
+
+Mad.rshift = function (num, bits) {
+    return Math.floor(num / Math.pow(2, bits));
+};
+
+Mad.lshiftU32 = function (num, bits) {
+    return Mad.bitwiseAnd(Mad.lshift(num, bits), 4294967295 /* 2^32 - 1 */);
+};
+
+Mad.lshift = function (num, bits) {
+    return num * Math.pow(2, bits);
+};
+
+Mad.bitwiseOr = function (a, b) {
+    var w = 2147483648; // 2^31
+
+    var aHI = (a / w) << 0;
+    var aLO = a % w;
+    var bHI = (b / w) << 0;
+    var bLO = b % w;
+
+    return ((aHI | bHI) * w + (aLO | bLO));
+};
+
+Mad.bitwiseAnd = function (a, b) {
+    var w = 2147483648; // 2^31
+
+    var aHI = (a / w) << 0;
+    var aLO = a % w;
+    var bHI = (b / w) << 0;
+    var bLO = b % w;
+
+    return ((aHI & bHI) * w + (aLO & bLO));
+};
+
+/* Simple JavaScript Inheritance
+ * By John Resig http://ejohn.org/
+ * MIT Licensed.
+ */
+// Inspired by base2 and Prototype
+(function(){
+  var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
+  // The base Class implementation (does nothing)
+  this.Class = function(){};
+  
+  // Create a new Class that inherits from this class
+  Class.extend = function(prop) {
+    var _super = this.prototype;
+    
+    // Instantiate a base class (but only create the instance,
+    // don't run the init constructor)
+    initializing = true;
+    var prototype = new this();
+    initializing = false;
+    
+    // Copy the properties over onto the new prototype
+    for (var name in prop) {
+      // Check if we're overwriting an existing function
+      prototype[name] = typeof prop[name] === "function" && 
+        typeof _super[name] === "function" && fnTest.test(prop[name]) ?
+        (function(name, fn){
+          return function() {
+            var tmp = this._super;
+            
+            // Add a new ._super() method that is the same method
+            // but on the super-class
+            this._super = _super[name];
+            
+            // The method only need to be bound temporarily, so we
+            // remove it when we're done executing
+            var ret = fn.apply(this, arguments);        
+            this._super = tmp;
+            
+            return ret;
+          };
+        })(name, prop[name]) :
+        prop[name];
+    }
+    
+    // The dummy class constructor
+    function Class() {
+      // All construction is actually done in the init method
+      if ( !initializing && this.init )
+        this.init.apply(this, arguments);
+    }
+    
+    // Populate our constructed prototype object
+    Class.prototype = prototype;
+    
+    // Enforce the constructor to be what we expect
+    Class.prototype.constructor = Class;
+
+    // And make this class extendable
+    Class.extend = arguments.callee;
+    
+    return Class;
+  };
+})();
+
+
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/mp3file.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/mp3file.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/mp3file.js	(revision 28388)
@@ -0,0 +1,50 @@
+Mad.MP3File = function(stream) {
+    this.stream = stream;
+}
+
+Mad.MP3File.prototype.getID3v2Header = function() {
+    if (this.stream.strEquals(0, "ID3")) {
+        var headerStream = this.stream.substream(0, 10);
+        
+        headerStream.seek(3); // 'ID3'
+        
+        var major = headerStream.readU8();
+        var minor = headerStream.readU8();
+        
+        var flags = headerStream.readU8();
+        
+        var length = headerStream.readSyncInteger();
+        
+        return { version: '2.' + major + '.' + minor, major: major, minor: minor, flags: flags, length: length };
+    } else {
+        return null;
+    }
+}
+
+Mad.MP3File.prototype.getID3v2Stream = function() {
+    var header = this.getID3v2Header();
+    
+    if (header) {
+        if (header.major > 2) {
+            return new Mad.ID3v23Stream(header, this.stream.substream(10, header.length));
+        } else {
+            return new Mad.ID3v22Stream(header, this.stream.substream(10, header.length));
+        }
+    } else {
+        return null;
+    }
+}
+
+Mad.MP3File.prototype.getMpegStream = function() {
+    var id3header = this.getID3v2Header();
+    
+    if (id3header) {
+        var offset = 10 + id3header.length;
+    } else {
+        var offset = 0;
+    }
+    
+    var length = this.stream.length - offset;
+
+    return new Mad.Stream(this.stream.substream(offset), length);   
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/player.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/player.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/player.js	(revision 28388)
@@ -0,0 +1,151 @@
+
+Mad.Player = function (stream) {
+    this.stream = stream;
+    this.mp3 = new Mad.MP3File(stream);
+    this.id3  = this.mp3.getID3v2Stream();
+    this.mpeg = this.mp3.getMpegStream();
+
+    this.totalLength = this.id3 && ~~this.id3.toHash()['Length'];
+
+    // default onProgress handler
+    this.onProgress = function (playtime, total, preloaded) {
+        console.log("playtime = " + playtime + " / " + total + ", preloaded = " + preloaded);
+    }
+};
+
+// Create a device.
+Mad.Player.prototype.createDevice = function() {
+    var synth = new Mad.Synth();
+    this.frame = new Mad.Frame();
+    this.frame = Mad.Frame.decode(this.frame, this.mpeg);
+    if (this.frame === null) {
+        if (this.mpeg.error === Mad.Error.BUFLEN) {
+            console.log("End of file!");
+        }
+
+        console.log("First error! code = " + this.mpeg.error + ", recoverable ? = " + Mad.recoverable(this.mpeg.error));
+        return;
+    }
+
+    this.channelCount = this.frame.header.nchannels();
+    this.sampleRate = this.frame.header.samplerate;
+
+    console.log("this.playing " + this.channelCount + " channels, samplerate = " + this.sampleRate + " audio, mode " + this.frame.header.mode);
+
+    this.offset = 0;
+    this.absoluteFrameIndex = 0;
+    synth.frame(this.frame);
+
+    this.lastRebuffer = Date.now();
+    this.playing = false;
+    this.progress();
+
+    var self = this;	
+    var MAX_FRAMES_IN_BUFFER = 40;
+
+    this.refill = function (sampleBuffer) {
+        //console.log("delta = " + (Date.now() - self.lastRebuffer) + ", asked for " + sampleBuffer.length);
+        self.lastRebuffer = Date.now();
+
+        if(!self.playing) return; // empty sampleBuffer, no prob
+
+        var index = 0;
+
+        while (index < sampleBuffer.length) {
+            for (var i = 0; i < self.channelCount; ++i) {
+                sampleBuffer[index++] = synth.pcm.samples[i][self.offset];
+            }
+
+            self.offset++;
+
+            if (self.offset >= synth.pcm.samples[0].length) {
+                self.offset = 0;
+
+                self.frame = Mad.Frame.decode(self.frame, self.mpeg);
+                if (self.frame === null) {
+                    if (self.stream.error === Mad.Error.BUFLEN) {
+                        console.log("End of file!");
+                    }
+                    console.log("Error! code = " + self.mpeg.error);
+                    self.playing = false;
+                    self.onProgress(1.0, 1.0, 1.0);
+                    self.dev.kill();
+                } else {
+                    synth.frame(self.frame);
+                    self.absoluteFrameIndex++;
+                }
+            }
+        }
+
+        if (self.onPostProcessing) {
+            self.onPostProcessing.apply(this, arguments);
+        }
+
+    };
+
+    this.reinitDevice();
+};
+
+Mad.Player.prototype.reinitDevice = function() {
+    if(this.dev) this.dev.kill();
+    // The default value is the safest
+    var bufferSize = null;
+    var self = this;
+
+    var temp = Sink.sinks.moz.prototype.interval;
+    Sink.sinks.moz.prototype.interval = 100;
+
+    this.dev = Sink(function(){
+            return self.refill.apply(this, arguments);
+    }, this.channelCount, bufferSize, this.sampleRate);
+
+    this.dev.on && this.dev.on('error', function (e) {
+        console.log(e);
+    });
+
+    Sink.sinks.moz.prototype.interval = temp;
+}
+
+Mad.Player.prototype.setPlaying = function(playing) {
+    this.playing = playing;
+    if(playing) {
+        this.onPlay();
+    } else {
+        this.onPause();
+    }
+}
+
+Mad.Player.prototype.destroy = function() {
+    clearTimeout(this.progressTimeout);
+    if(this.dev) {
+        this.dev.kill();
+    }
+}
+
+Mad.Player.prototype.progress = function () {
+    var delta = Date.now() - this.lastRebuffer;
+
+    var playtime = ((this.absoluteFrameIndex * 1152 + this.offset) / this.sampleRate) + delta / 1000.0;
+    //console.log("delta = " + delta + ", contentLength = " + this.stream.contentLength + ", this.offset = " + this.mpeg.this_frame);
+    var total = this.totalLength ? this.totalLength : playtime * this.stream.contentLength / this.mpeg.this_frame;
+    var preloaded = this.stream.amountRead / this.stream.contentLength;
+    //console.log("amountRead = " + this.stream.amountRead + ", preloaded = " + preloaded);
+    this.onProgress(playtime, total, preloaded);
+
+    var that = this;
+    var nextCall = function() { that.progress(); };
+    this.progressTimeout = setTimeout(nextCall, 250);
+}
+
+Mad.Player.fromFile = function (file, callback) {
+    new Mad.FileStream(file, function (stream) {
+            callback(new Mad.Player(stream));
+            });
+};
+
+Mad.Player.fromURL = function (url, callback) {
+    var stream = new Mad.AjaxStream(url);
+    stream.requestAbsolute(1 * 1024, function () {
+            callback(new Mad.Player(stream));
+            });
+};
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/rq_table.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/rq_table.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/rq_table.js	(revision 28388)
@@ -0,0 +1,8734 @@
+/*
+ * This is the lookup table used to compute x^(4/3) for Layer III
+ * requantization. To maintain the best possible accuracy, the value is
+ * stored as a normalized mantissa with exponent. The requantization
+ * algorithm recombines these parts with appropriate scaling.
+ */
+
+/*
+ * table for requantization
+ *
+ * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3)
+ */
+ 
+Mad.rq_table /* 8207 */ = [
+  /*    0 */  [ 0.000000000,  0 ],
+  /*    1 */  [ 0.250000000,  2 ],
+  /*    2 */  [ 0.314980262,  3 ],
+  /*    3 */  [ 0.270421794,  4 ],
+  /*    4 */  [ 0.396850263,  4 ],
+  /*    5 */  [ 0.267183742,  5 ],
+  /*    6 */  [ 0.340710111,  5 ],
+  /*    7 */  [ 0.418453696,  5 ],
+  /*    8 */  [ 0.250000000,  6 ],
+  /*    9 */  [ 0.292511788,  6 ],
+  /*   10 */  [ 0.336630420,  6 ],
+  /*   11 */  [ 0.382246578,  6 ],
+  /*   12 */  [ 0.429267841,  6 ],
+  /*   13 */  [ 0.477614858,  6 ],
+  /*   14 */  [ 0.263609310,  7 ],
+  /*   15 */  [ 0.289009227,  7 ],
+
+  /*   16 */  [ 0.314980262,  7 ],
+  /*   17 */  [ 0.341498336,  7 ],
+  /*   18 */  [ 0.368541759,  7 ],
+  /*   19 */  [ 0.396090870,  7 ],
+  /*   20 */  [ 0.424127753,  7 ],
+  /*   21 */  [ 0.452635998,  7 ],
+  /*   22 */  [ 0.481600510,  7 ],
+  /*   23 */  [ 0.255503674,  8 ],
+  /*   24 */  [ 0.270421794,  8 ],
+  /*   25 */  [ 0.285548607,  8 ],
+  /*   26 */  [ 0.300878507,  8 ],
+  /*   27 */  [ 0.316406250,  8 ],
+  /*   28 */  [ 0.332126919,  8 ],
+  /*   29 */  [ 0.348035890,  8 ],
+  /*   30 */  [ 0.364128809,  8 ],
+  /*   31 */  [ 0.380401563,  8 ],
+
+  /*   32 */  [ 0.396850263,  8 ],
+  /*   33 */  [ 0.413471222,  8 ],
+  /*   34 */  [ 0.430260942,  8 ],
+  /*   35 */  [ 0.447216097,  8 ],
+  /*   36 */  [ 0.464333519,  8 ],
+  /*   37 */  [ 0.481610189,  8 ],
+  /*   38 */  [ 0.499043224,  8 ],
+  /*   39 */  [ 0.258314934,  9 ],
+  /*   40 */  [ 0.267183742,  9 ],
+  /*   41 */  [ 0.276126771,  9 ],
+  /*   42 */  [ 0.285142811,  9 ],
+  /*   43 */  [ 0.294230696,  9 ],
+  /*   44 */  [ 0.303389310,  9 ],
+  /*   45 */  [ 0.312617576,  9 ],
+  /*   46 */  [ 0.321914457,  9 ],
+  /*   47 */  [ 0.331278957,  9 ],
+
+  /*   48 */  [ 0.340710111,  9 ],
+  /*   49 */  [ 0.350206992,  9 ],
+  /*   50 */  [ 0.359768701,  9 ],
+  /*   51 */  [ 0.369394372,  9 ],
+  /*   52 */  [ 0.379083164,  9 ],
+  /*   53 */  [ 0.388834268,  9 ],
+  /*   54 */  [ 0.398646895,  9 ],
+  /*   55 */  [ 0.408520284,  9 ],
+  /*   56 */  [ 0.418453696,  9 ],
+  /*   57 */  [ 0.428446415,  9 ],
+  /*   58 */  [ 0.438497744,  9 ],
+  /*   59 */  [ 0.448607009,  9 ],
+  /*   60 */  [ 0.458773552,  9 ],
+  /*   61 */  [ 0.468996735,  9 ],
+  /*   62 */  [ 0.479275937,  9 ],
+  /*   63 */  [ 0.489610555,  9 ],
+
+  /*   64 */  [ 0.250000000, 10 ],
+  /*   65 */  [ 0.255221850, 10 ],
+  /*   66 */  [ 0.260470548, 10 ],
+  /*   67 */  [ 0.265745823, 10 ],
+  /*   68 */  [ 0.271047409, 10 ],
+  /*   69 */  [ 0.276375048, 10 ],
+  /*   70 */  [ 0.281728487, 10 ],
+  /*   71 */  [ 0.287107481, 10 ],
+  /*   72 */  [ 0.292511788, 10 ],
+  /*   73 */  [ 0.297941173, 10 ],
+  /*   74 */  [ 0.303395408, 10 ],
+  /*   75 */  [ 0.308874267, 10 ],
+  /*   76 */  [ 0.314377532, 10 ],
+  /*   77 */  [ 0.319904987, 10 ],
+  /*   78 */  [ 0.325456423, 10 ],
+  /*   79 */  [ 0.331031635, 10 ],
+
+  /*   80 */  [ 0.336630420, 10 ],
+  /*   81 */  [ 0.342252584, 10 ],
+  /*   82 */  [ 0.347897931, 10 ],
+  /*   83 */  [ 0.353566275, 10 ],
+  /*   84 */  [ 0.359257429, 10 ],
+  /*   85 */  [ 0.364971213, 10 ],
+  /*   86 */  [ 0.370707448, 10 ],
+  /*   87 */  [ 0.376465960, 10 ],
+  /*   88 */  [ 0.382246578, 10 ],
+  /*   89 */  [ 0.388049134, 10 ],
+  /*   90 */  [ 0.393873464, 10 ],
+  /*   91 */  [ 0.399719406, 10 ],
+  /*   92 */  [ 0.405586801, 10 ],
+  /*   93 */  [ 0.411475493, 10 ],
+  /*   94 */  [ 0.417385331, 10 ],
+  /*   95 */  [ 0.423316162, 10 ],
+
+  /*   96 */  [ 0.429267841, 10 ],
+  /*   97 */  [ 0.435240221, 10 ],
+  /*   98 */  [ 0.441233161, 10 ],
+  /*   99 */  [ 0.447246519, 10 ],
+  /*  100 */  [ 0.453280160, 10 ],
+  /*  101 */  [ 0.459333946, 10 ],
+  /*  102 */  [ 0.465407744, 10 ],
+  /*  103 */  [ 0.471501425, 10 ],
+  /*  104 */  [ 0.477614858, 10 ],
+  /*  105 */  [ 0.483747918, 10 ],
+  /*  106 */  [ 0.489900479, 10 ],
+  /*  107 */  [ 0.496072418, 10 ],
+  /*  108 */  [ 0.251131807, 11 ],
+  /*  109 */  [ 0.254236974, 11 ],
+  /*  110 */  [ 0.257351652, 11 ],
+  /*  111 */  [ 0.260475783, 11 ],
+
+  /*  112 */  [ 0.263609310, 11 ],
+  /*  113 */  [ 0.266752177, 11 ],
+  /*  114 */  [ 0.269904329, 11 ],
+  /*  115 */  [ 0.273065710, 11 ],
+  /*  116 */  [ 0.276236269, 11 ],
+  /*  117 */  [ 0.279415952, 11 ],
+  /*  118 */  [ 0.282604707, 11 ],
+  /*  119 */  [ 0.285802482, 11 ],
+  /*  120 */  [ 0.289009227, 11 ],
+  /*  121 */  [ 0.292224893, 11 ],
+  /*  122 */  [ 0.295449429, 11 ],
+  /*  123 */  [ 0.298682788, 11 ],
+  /*  124 */  [ 0.301924921, 11 ],
+  /*  125 */  [ 0.305175781, 11 ],
+  /*  126 */  [ 0.308435322, 11 ],
+  /*  127 */  [ 0.311703498, 11 ],
+
+  /*  128 */  [ 0.314980262, 11 ],
+  /*  129 */  [ 0.318265572, 11 ],
+  /*  130 */  [ 0.321559381, 11 ],
+  /*  131 */  [ 0.324861647, 11 ],
+  /*  132 */  [ 0.328172327, 11 ],
+  /*  133 */  [ 0.331491377, 11 ],
+  /*  134 */  [ 0.334818756, 11 ],
+  /*  135 */  [ 0.338154423, 11 ],
+  /*  136 */  [ 0.341498336, 11 ],
+  /*  137 */  [ 0.344850455, 11 ],
+  /*  138 */  [ 0.348210741, 11 ],
+  /*  139 */  [ 0.351579152, 11 ],
+  /*  140 */  [ 0.354955651, 11 ],
+  /*  141 */  [ 0.358340200, 11 ],
+  /*  142 */  [ 0.361732758, 11 ],
+  /*  143 */  [ 0.365133291, 11 ],
+
+  /*  144 */  [ 0.368541759, 11 ],
+  /*  145 */  [ 0.371958126, 11 ],
+  /*  146 */  [ 0.375382356, 11 ],
+  /*  147 */  [ 0.378814413, 11 ],
+  /*  148 */  [ 0.382254261, 11 ],
+  /*  149 */  [ 0.385701865, 11 ],
+  /*  150 */  [ 0.389157191, 11 ],
+  /*  151 */  [ 0.392620204, 11 ],
+  /*  152 */  [ 0.396090870, 11 ],
+  /*  153 */  [ 0.399569155, 11 ],
+  /*  154 */  [ 0.403055027, 11 ],
+  /*  155 */  [ 0.406548452, 11 ],
+  /*  156 */  [ 0.410049398, 11 ],
+  /*  157 */  [ 0.413557833, 11 ],
+  /*  158 */  [ 0.417073724, 11 ],
+  /*  159 */  [ 0.420597041, 11 ],
+
+  /*  160 */  [ 0.424127753, 11 ],
+  /*  161 */  [ 0.427665827, 11 ],
+  /*  162 */  [ 0.431211234, 11 ],
+  /*  163 */  [ 0.434763944, 11 ],
+  /*  164 */  [ 0.438323927, 11 ],
+  /*  165 */  [ 0.441891153, 11 ],
+  /*  166 */  [ 0.445465593, 11 ],
+  /*  167 */  [ 0.449047217, 11 ],
+  /*  168 */  [ 0.452635998, 11 ],
+  /*  169 */  [ 0.456231906, 11 ],
+  /*  170 */  [ 0.459834914, 11 ],
+  /*  171 */  [ 0.463444993, 11 ],
+  /*  172 */  [ 0.467062117, 11 ],
+  /*  173 */  [ 0.470686258, 11 ],
+  /*  174 */  [ 0.474317388, 11 ],
+  /*  175 */  [ 0.477955481, 11 ],
+
+  /*  176 */  [ 0.481600510, 11 ],
+  /*  177 */  [ 0.485252449, 11 ],
+  /*  178 */  [ 0.488911273, 11 ],
+  /*  179 */  [ 0.492576954, 11 ],
+  /*  180 */  [ 0.496249468, 11 ],
+  /*  181 */  [ 0.499928790, 11 ],
+  /*  182 */  [ 0.251807447, 12 ],
+  /*  183 */  [ 0.253653877, 12 ],
+  /*  184 */  [ 0.255503674, 12 ],
+  /*  185 */  [ 0.257356825, 12 ],
+  /*  186 */  [ 0.259213318, 12 ],
+  /*  187 */  [ 0.261073141, 12 ],
+  /*  188 */  [ 0.262936282, 12 ],
+  /*  189 */  [ 0.264802730, 12 ],
+  /*  190 */  [ 0.266672472, 12 ],
+  /*  191 */  [ 0.268545497, 12 ],
+
+  /*  192 */  [ 0.270421794, 12 ],
+  /*  193 */  [ 0.272301352, 12 ],
+  /*  194 */  [ 0.274184158, 12 ],
+  /*  195 */  [ 0.276070203, 12 ],
+  /*  196 */  [ 0.277959474, 12 ],
+  /*  197 */  [ 0.279851960, 12 ],
+  /*  198 */  [ 0.281747652, 12 ],
+  /*  199 */  [ 0.283646538, 12 ],
+  /*  200 */  [ 0.285548607, 12 ],
+  /*  201 */  [ 0.287453849, 12 ],
+  /*  202 */  [ 0.289362253, 12 ],
+  /*  203 */  [ 0.291273810, 12 ],
+  /*  204 */  [ 0.293188507, 12 ],
+  /*  205 */  [ 0.295106336, 12 ],
+  /*  206 */  [ 0.297027285, 12 ],
+  /*  207 */  [ 0.298951346, 12 ],
+
+  /*  208 */  [ 0.300878507, 12 ],
+  /*  209 */  [ 0.302808759, 12 ],
+  /*  210 */  [ 0.304742092, 12 ],
+  /*  211 */  [ 0.306678497, 12 ],
+  /*  212 */  [ 0.308617963, 12 ],
+  /*  213 */  [ 0.310560480, 12 ],
+  /*  214 */  [ 0.312506041, 12 ],
+  /*  215 */  [ 0.314454634, 12 ],
+  /*  216 */  [ 0.316406250, 12 ],
+  /*  217 */  [ 0.318360880, 12 ],
+  /*  218 */  [ 0.320318516, 12 ],
+  /*  219 */  [ 0.322279147, 12 ],
+  /*  220 */  [ 0.324242764, 12 ],
+  /*  221 */  [ 0.326209359, 12 ],
+  /*  222 */  [ 0.328178922, 12 ],
+  /*  223 */  [ 0.330151445, 12 ],
+
+  /*  224 */  [ 0.332126919, 12 ],
+  /*  225 */  [ 0.334105334, 12 ],
+  /*  226 */  [ 0.336086683, 12 ],
+  /*  227 */  [ 0.338070956, 12 ],
+  /*  228 */  [ 0.340058145, 12 ],
+  /*  229 */  [ 0.342048241, 12 ],
+  /*  230 */  [ 0.344041237, 12 ],
+  /*  231 */  [ 0.346037122, 12 ],
+  /*  232 */  [ 0.348035890, 12 ],
+  /*  233 */  [ 0.350037532, 12 ],
+  /*  234 */  [ 0.352042040, 12 ],
+  /*  235 */  [ 0.354049405, 12 ],
+  /*  236 */  [ 0.356059619, 12 ],
+  /*  237 */  [ 0.358072674, 12 ],
+  /*  238 */  [ 0.360088563, 12 ],
+  /*  239 */  [ 0.362107278, 12 ],
+
+  /*  240 */  [ 0.364128809, 12 ],
+  /*  241 */  [ 0.366153151, 12 ],
+  /*  242 */  [ 0.368180294, 12 ],
+  /*  243 */  [ 0.370210231, 12 ],
+  /*  244 */  [ 0.372242955, 12 ],
+  /*  245 */  [ 0.374278458, 12 ],
+  /*  246 */  [ 0.376316732, 12 ],
+  /*  247 */  [ 0.378357769, 12 ],
+  /*  248 */  [ 0.380401563, 12 ],
+  /*  249 */  [ 0.382448106, 12 ],
+  /*  250 */  [ 0.384497391, 12 ],
+  /*  251 */  [ 0.386549409, 12 ],
+  /*  252 */  [ 0.388604155, 12 ],
+  /*  253 */  [ 0.390661620, 12 ],
+  /*  254 */  [ 0.392721798, 12 ],
+  /*  255 */  [ 0.394784681, 12 ],
+
+  /*  256 */  [ 0.396850263, 12 ],
+  /*  257 */  [ 0.398918536, 12 ],
+  /*  258 */  [ 0.400989493, 12 ],
+  /*  259 */  [ 0.403063128, 12 ],
+  /*  260 */  [ 0.405139433, 12 ],
+  /*  261 */  [ 0.407218402, 12 ],
+  /*  262 */  [ 0.409300027, 12 ],
+  /*  263 */  [ 0.411384303, 12 ],
+  /*  264 */  [ 0.413471222, 12 ],
+  /*  265 */  [ 0.415560778, 12 ],
+  /*  266 */  [ 0.417652964, 12 ],
+  /*  267 */  [ 0.419747773, 12 ],
+  /*  268 */  [ 0.421845199, 12 ],
+  /*  269 */  [ 0.423945235, 12 ],
+  /*  270 */  [ 0.426047876, 12 ],
+  /*  271 */  [ 0.428153114, 12 ],
+
+  /*  272 */  [ 0.430260942, 12 ],
+  /*  273 */  [ 0.432371356, 12 ],
+  /*  274 */  [ 0.434484348, 12 ],
+  /*  275 */  [ 0.436599912, 12 ],
+  /*  276 */  [ 0.438718042, 12 ],
+  /*  277 */  [ 0.440838732, 12 ],
+  /*  278 */  [ 0.442961975, 12 ],
+  /*  279 */  [ 0.445087765, 12 ],
+  /*  280 */  [ 0.447216097, 12 ],
+  /*  281 */  [ 0.449346964, 12 ],
+  /*  282 */  [ 0.451480360, 12 ],
+  /*  283 */  [ 0.453616280, 12 ],
+  /*  284 */  [ 0.455754717, 12 ],
+  /*  285 */  [ 0.457895665, 12 ],
+  /*  286 */  [ 0.460039119, 12 ],
+  /*  287 */  [ 0.462185072, 12 ],
+
+  /*  288 */  [ 0.464333519, 12 ],
+  /*  289 */  [ 0.466484455, 12 ],
+  /*  290 */  [ 0.468637872, 12 ],
+  /*  291 */  [ 0.470793767, 12 ],
+  /*  292 */  [ 0.472952132, 12 ],
+  /*  293 */  [ 0.475112962, 12 ],
+  /*  294 */  [ 0.477276252, 12 ],
+  /*  295 */  [ 0.479441997, 12 ],
+  /*  296 */  [ 0.481610189, 12 ],
+  /*  297 */  [ 0.483780825, 12 ],
+  /*  298 */  [ 0.485953899, 12 ],
+  /*  299 */  [ 0.488129404, 12 ],
+  /*  300 */  [ 0.490307336, 12 ],
+  /*  301 */  [ 0.492487690, 12 ],
+  /*  302 */  [ 0.494670459, 12 ],
+  /*  303 */  [ 0.496855639, 12 ],
+
+  /*  304 */  [ 0.499043224, 12 ],
+  /*  305 */  [ 0.250616605, 13 ],
+  /*  306 */  [ 0.251712795, 13 ],
+  /*  307 */  [ 0.252810180, 13 ],
+  /*  308 */  [ 0.253908756, 13 ],
+  /*  309 */  [ 0.255008523, 13 ],
+  /*  310 */  [ 0.256109476, 13 ],
+  /*  311 */  [ 0.257211614, 13 ],
+  /*  312 */  [ 0.258314934, 13 ],
+  /*  313 */  [ 0.259419433, 13 ],
+  /*  314 */  [ 0.260525110, 13 ],
+  /*  315 */  [ 0.261631960, 13 ],
+  /*  316 */  [ 0.262739982, 13 ],
+  /*  317 */  [ 0.263849174, 13 ],
+  /*  318 */  [ 0.264959533, 13 ],
+  /*  319 */  [ 0.266071056, 13 ],
+
+  /*  320 */  [ 0.267183742, 13 ],
+  /*  321 */  [ 0.268297587, 13 ],
+  /*  322 */  [ 0.269412589, 13 ],
+  /*  323 */  [ 0.270528746, 13 ],
+  /*  324 */  [ 0.271646056, 13 ],
+  /*  325 */  [ 0.272764515, 13 ],
+  /*  326 */  [ 0.273884123, 13 ],
+  /*  327 */  [ 0.275004875, 13 ],
+  /*  328 */  [ 0.276126771, 13 ],
+  /*  329 */  [ 0.277249808, 13 ],
+  /*  330 */  [ 0.278373983, 13 ],
+  /*  331 */  [ 0.279499294, 13 ],
+  /*  332 */  [ 0.280625739, 13 ],
+  /*  333 */  [ 0.281753315, 13 ],
+  /*  334 */  [ 0.282882021, 13 ],
+  /*  335 */  [ 0.284011853, 13 ],
+
+  /*  336 */  [ 0.285142811, 13 ],
+  /*  337 */  [ 0.286274891, 13 ],
+  /*  338 */  [ 0.287408091, 13 ],
+  /*  339 */  [ 0.288542409, 13 ],
+  /*  340 */  [ 0.289677844, 13 ],
+  /*  341 */  [ 0.290814392, 13 ],
+  /*  342 */  [ 0.291952051, 13 ],
+  /*  343 */  [ 0.293090820, 13 ],
+  /*  344 */  [ 0.294230696, 13 ],
+  /*  345 */  [ 0.295371678, 13 ],
+  /*  346 */  [ 0.296513762, 13 ],
+  /*  347 */  [ 0.297656947, 13 ],
+  /*  348 */  [ 0.298801231, 13 ],
+  /*  349 */  [ 0.299946611, 13 ],
+  /*  350 */  [ 0.301093085, 13 ],
+  /*  351 */  [ 0.302240653, 13 ],
+
+  /*  352 */  [ 0.303389310, 13 ],
+  /*  353 */  [ 0.304539056, 13 ],
+  /*  354 */  [ 0.305689888, 13 ],
+  /*  355 */  [ 0.306841804, 13 ],
+  /*  356 */  [ 0.307994802, 13 ],
+  /*  357 */  [ 0.309148880, 13 ],
+  /*  358 */  [ 0.310304037, 13 ],
+  /*  359 */  [ 0.311460269, 13 ],
+  /*  360 */  [ 0.312617576, 13 ],
+  /*  361 */  [ 0.313775954, 13 ],
+  /*  362 */  [ 0.314935403, 13 ],
+  /*  363 */  [ 0.316095920, 13 ],
+  /*  364 */  [ 0.317257503, 13 ],
+  /*  365 */  [ 0.318420150, 13 ],
+  /*  366 */  [ 0.319583859, 13 ],
+  /*  367 */  [ 0.320748629, 13 ],
+
+  /*  368 */  [ 0.321914457, 13 ],
+  /*  369 */  [ 0.323081342, 13 ],
+  /*  370 */  [ 0.324249281, 13 ],
+  /*  371 */  [ 0.325418273, 13 ],
+  /*  372 */  [ 0.326588316, 13 ],
+  /*  373 */  [ 0.327759407, 13 ],
+  /*  374 */  [ 0.328931546, 13 ],
+  /*  375 */  [ 0.330104730, 13 ],
+  /*  376 */  [ 0.331278957, 13 ],
+  /*  377 */  [ 0.332454225, 13 ],
+  /*  378 */  [ 0.333630533, 13 ],
+  /*  379 */  [ 0.334807879, 13 ],
+  /*  380 */  [ 0.335986261, 13 ],
+  /*  381 */  [ 0.337165677, 13 ],
+  /*  382 */  [ 0.338346125, 13 ],
+  /*  383 */  [ 0.339527604, 13 ],
+
+  /*  384 */  [ 0.340710111, 13 ],
+  /*  385 */  [ 0.341893646, 13 ],
+  /*  386 */  [ 0.343078205, 13 ],
+  /*  387 */  [ 0.344263788, 13 ],
+  /*  388 */  [ 0.345450393, 13 ],
+  /*  389 */  [ 0.346638017, 13 ],
+  /*  390 */  [ 0.347826659, 13 ],
+  /*  391 */  [ 0.349016318, 13 ],
+  /*  392 */  [ 0.350206992, 13 ],
+  /*  393 */  [ 0.351398678, 13 ],
+  /*  394 */  [ 0.352591376, 13 ],
+  /*  395 */  [ 0.353785083, 13 ],
+  /*  396 */  [ 0.354979798, 13 ],
+  /*  397 */  [ 0.356175519, 13 ],
+  /*  398 */  [ 0.357372244, 13 ],
+  /*  399 */  [ 0.358569972, 13 ],
+
+  /*  400 */  [ 0.359768701, 13 ],
+  /*  401 */  [ 0.360968429, 13 ],
+  /*  402 */  [ 0.362169156, 13 ],
+  /*  403 */  [ 0.363370878, 13 ],
+  /*  404 */  [ 0.364573594, 13 ],
+  /*  405 */  [ 0.365777304, 13 ],
+  /*  406 */  [ 0.366982004, 13 ],
+  /*  407 */  [ 0.368187694, 13 ],
+  /*  408 */  [ 0.369394372, 13 ],
+  /*  409 */  [ 0.370602036, 13 ],
+  /*  410 */  [ 0.371810684, 13 ],
+  /*  411 */  [ 0.373020316, 13 ],
+  /*  412 */  [ 0.374230929, 13 ],
+  /*  413 */  [ 0.375442522, 13 ],
+  /*  414 */  [ 0.376655093, 13 ],
+  /*  415 */  [ 0.377868641, 13 ],
+
+  /*  416 */  [ 0.379083164, 13 ],
+  /*  417 */  [ 0.380298661, 13 ],
+  /*  418 */  [ 0.381515130, 13 ],
+  /*  419 */  [ 0.382732569, 13 ],
+  /*  420 */  [ 0.383950977, 13 ],
+  /*  421 */  [ 0.385170352, 13 ],
+  /*  422 */  [ 0.386390694, 13 ],
+  /*  423 */  [ 0.387611999, 13 ],
+  /*  424 */  [ 0.388834268, 13 ],
+  /*  425 */  [ 0.390057497, 13 ],
+  /*  426 */  [ 0.391281687, 13 ],
+  /*  427 */  [ 0.392506834, 13 ],
+  /*  428 */  [ 0.393732939, 13 ],
+  /*  429 */  [ 0.394959999, 13 ],
+  /*  430 */  [ 0.396188012, 13 ],
+  /*  431 */  [ 0.397416978, 13 ],
+
+  /*  432 */  [ 0.398646895, 13 ],
+  /*  433 */  [ 0.399877761, 13 ],
+  /*  434 */  [ 0.401109575, 13 ],
+  /*  435 */  [ 0.402342335, 13 ],
+  /*  436 */  [ 0.403576041, 13 ],
+  /*  437 */  [ 0.404810690, 13 ],
+  /*  438 */  [ 0.406046281, 13 ],
+  /*  439 */  [ 0.407282813, 13 ],
+  /*  440 */  [ 0.408520284, 13 ],
+  /*  441 */  [ 0.409758693, 13 ],
+  /*  442 */  [ 0.410998038, 13 ],
+  /*  443 */  [ 0.412238319, 13 ],
+  /*  444 */  [ 0.413479532, 13 ],
+  /*  445 */  [ 0.414721679, 13 ],
+  /*  446 */  [ 0.415964756, 13 ],
+  /*  447 */  [ 0.417208762, 13 ],
+
+  /*  448 */  [ 0.418453696, 13 ],
+  /*  449 */  [ 0.419699557, 13 ],
+  /*  450 */  [ 0.420946343, 13 ],
+  /*  451 */  [ 0.422194054, 13 ],
+  /*  452 */  [ 0.423442686, 13 ],
+  /*  453 */  [ 0.424692240, 13 ],
+  /*  454 */  [ 0.425942714, 13 ],
+  /*  455 */  [ 0.427194106, 13 ],
+  /*  456 */  [ 0.428446415, 13 ],
+  /*  457 */  [ 0.429699640, 13 ],
+  /*  458 */  [ 0.430953779, 13 ],
+  /*  459 */  [ 0.432208832, 13 ],
+  /*  460 */  [ 0.433464796, 13 ],
+  /*  461 */  [ 0.434721671, 13 ],
+  /*  462 */  [ 0.435979455, 13 ],
+  /*  463 */  [ 0.437238146, 13 ],
+
+  /*  464 */  [ 0.438497744, 13 ],
+  /*  465 */  [ 0.439758248, 13 ],
+  /*  466 */  [ 0.441019655, 13 ],
+  /*  467 */  [ 0.442281965, 13 ],
+  /*  468 */  [ 0.443545176, 13 ],
+  /*  469 */  [ 0.444809288, 13 ],
+  /*  470 */  [ 0.446074298, 13 ],
+  /*  471 */  [ 0.447340205, 13 ],
+  /*  472 */  [ 0.448607009, 13 ],
+  /*  473 */  [ 0.449874708, 13 ],
+  /*  474 */  [ 0.451143300, 13 ],
+  /*  475 */  [ 0.452412785, 13 ],
+  /*  476 */  [ 0.453683161, 13 ],
+  /*  477 */  [ 0.454954427, 13 ],
+  /*  478 */  [ 0.456226581, 13 ],
+  /*  479 */  [ 0.457499623, 13 ],
+
+  /*  480 */  [ 0.458773552, 13 ],
+  /*  481 */  [ 0.460048365, 13 ],
+  /*  482 */  [ 0.461324062, 13 ],
+  /*  483 */  [ 0.462600642, 13 ],
+  /*  484 */  [ 0.463878102, 13 ],
+  /*  485 */  [ 0.465156443, 13 ],
+  /*  486 */  [ 0.466435663, 13 ],
+  /*  487 */  [ 0.467715761, 13 ],
+  /*  488 */  [ 0.468996735, 13 ],
+  /*  489 */  [ 0.470278584, 13 ],
+  /*  490 */  [ 0.471561307, 13 ],
+  /*  491 */  [ 0.472844904, 13 ],
+  /*  492 */  [ 0.474129372, 13 ],
+  /*  493 */  [ 0.475414710, 13 ],
+  /*  494 */  [ 0.476700918, 13 ],
+  /*  495 */  [ 0.477987994, 13 ],
+
+  /*  496 */  [ 0.479275937, 13 ],
+  /*  497 */  [ 0.480564746, 13 ],
+  /*  498 */  [ 0.481854420, 13 ],
+  /*  499 */  [ 0.483144957, 13 ],
+  /*  500 */  [ 0.484436356, 13 ],
+  /*  501 */  [ 0.485728617, 13 ],
+  /*  502 */  [ 0.487021738, 13 ],
+  /*  503 */  [ 0.488315717, 13 ],
+  /*  504 */  [ 0.489610555, 13 ],
+  /*  505 */  [ 0.490906249, 13 ],
+  /*  506 */  [ 0.492202799, 13 ],
+  /*  507 */  [ 0.493500203, 13 ],
+  /*  508 */  [ 0.494798460, 13 ],
+  /*  509 */  [ 0.496097570, 13 ],
+  /*  510 */  [ 0.497397530, 13 ],
+  /*  511 */  [ 0.498698341, 13 ],
+
+  /*  512 */  [ 0.250000000, 14 ],
+  /*  513 */  [ 0.250651254, 14 ],
+  /*  514 */  [ 0.251302930, 14 ],
+  /*  515 */  [ 0.251955030, 14 ],
+  /*  516 */  [ 0.252607552, 14 ],
+  /*  517 */  [ 0.253260495, 14 ],
+  /*  518 */  [ 0.253913860, 14 ],
+  /*  519 */  [ 0.254567645, 14 ],
+  /*  520 */  [ 0.255221850, 14 ],
+  /*  521 */  [ 0.255876475, 14 ],
+  /*  522 */  [ 0.256531518, 14 ],
+  /*  523 */  [ 0.257186980, 14 ],
+  /*  524 */  [ 0.257842860, 14 ],
+  /*  525 */  [ 0.258499157, 14 ],
+  /*  526 */  [ 0.259155872, 14 ],
+  /*  527 */  [ 0.259813002, 14 ],
+
+  /*  528 */  [ 0.260470548, 14 ],
+  /*  529 */  [ 0.261128510, 14 ],
+  /*  530 */  [ 0.261786886, 14 ],
+  /*  531 */  [ 0.262445676, 14 ],
+  /*  532 */  [ 0.263104880, 14 ],
+  /*  533 */  [ 0.263764497, 14 ],
+  /*  534 */  [ 0.264424527, 14 ],
+  /*  535 */  [ 0.265084969, 14 ],
+  /*  536 */  [ 0.265745823, 14 ],
+  /*  537 */  [ 0.266407088, 14 ],
+  /*  538 */  [ 0.267068763, 14 ],
+  /*  539 */  [ 0.267730848, 14 ],
+  /*  540 */  [ 0.268393343, 14 ],
+  /*  541 */  [ 0.269056248, 14 ],
+  /*  542 */  [ 0.269719560, 14 ],
+  /*  543 */  [ 0.270383281, 14 ],
+
+  /*  544 */  [ 0.271047409, 14 ],
+  /*  545 */  [ 0.271711944, 14 ],
+  /*  546 */  [ 0.272376886, 14 ],
+  /*  547 */  [ 0.273042234, 14 ],
+  /*  548 */  [ 0.273707988, 14 ],
+  /*  549 */  [ 0.274374147, 14 ],
+  /*  550 */  [ 0.275040710, 14 ],
+  /*  551 */  [ 0.275707677, 14 ],
+  /*  552 */  [ 0.276375048, 14 ],
+  /*  553 */  [ 0.277042822, 14 ],
+  /*  554 */  [ 0.277710999, 14 ],
+  /*  555 */  [ 0.278379578, 14 ],
+  /*  556 */  [ 0.279048558, 14 ],
+  /*  557 */  [ 0.279717940, 14 ],
+  /*  558 */  [ 0.280387722, 14 ],
+  /*  559 */  [ 0.281057905, 14 ],
+
+  /*  560 */  [ 0.281728487, 14 ],
+  /*  561 */  [ 0.282399469, 14 ],
+  /*  562 */  [ 0.283070849, 14 ],
+  /*  563 */  [ 0.283742628, 14 ],
+  /*  564 */  [ 0.284414805, 14 ],
+  /*  565 */  [ 0.285087379, 14 ],
+  /*  566 */  [ 0.285760350, 14 ],
+  /*  567 */  [ 0.286433717, 14 ],
+  /*  568 */  [ 0.287107481, 14 ],
+  /*  569 */  [ 0.287781640, 14 ],
+  /*  570 */  [ 0.288456194, 14 ],
+  /*  571 */  [ 0.289131142, 14 ],
+  /*  572 */  [ 0.289806485, 14 ],
+  /*  573 */  [ 0.290482221, 14 ],
+  /*  574 */  [ 0.291158351, 14 ],
+  /*  575 */  [ 0.291834873, 14 ],
+
+  /*  576 */  [ 0.292511788, 14 ],
+  /*  577 */  [ 0.293189094, 14 ],
+  /*  578 */  [ 0.293866792, 14 ],
+  /*  579 */  [ 0.294544881, 14 ],
+  /*  580 */  [ 0.295223360, 14 ],
+  /*  581 */  [ 0.295902229, 14 ],
+  /*  582 */  [ 0.296581488, 14 ],
+  /*  583 */  [ 0.297261136, 14 ],
+  /*  584 */  [ 0.297941173, 14 ],
+  /*  585 */  [ 0.298621598, 14 ],
+  /*  586 */  [ 0.299302411, 14 ],
+  /*  587 */  [ 0.299983611, 14 ],
+  /*  588 */  [ 0.300665198, 14 ],
+  /*  589 */  [ 0.301347172, 14 ],
+  /*  590 */  [ 0.302029532, 14 ],
+  /*  591 */  [ 0.302712277, 14 ],
+
+  /*  592 */  [ 0.303395408, 14 ],
+  /*  593 */  [ 0.304078923, 14 ],
+  /*  594 */  [ 0.304762823, 14 ],
+  /*  595 */  [ 0.305447106, 14 ],
+  /*  596 */  [ 0.306131773, 14 ],
+  /*  597 */  [ 0.306816823, 14 ],
+  /*  598 */  [ 0.307502256, 14 ],
+  /*  599 */  [ 0.308188071, 14 ],
+  /*  600 */  [ 0.308874267, 14 ],
+  /*  601 */  [ 0.309560845, 14 ],
+  /*  602 */  [ 0.310247804, 14 ],
+  /*  603 */  [ 0.310935143, 14 ],
+  /*  604 */  [ 0.311622862, 14 ],
+  /*  605 */  [ 0.312310961, 14 ],
+  /*  606 */  [ 0.312999439, 14 ],
+  /*  607 */  [ 0.313688296, 14 ],
+
+  /*  608 */  [ 0.314377532, 14 ],
+  /*  609 */  [ 0.315067145, 14 ],
+  /*  610 */  [ 0.315757136, 14 ],
+  /*  611 */  [ 0.316447504, 14 ],
+  /*  612 */  [ 0.317138249, 14 ],
+  /*  613 */  [ 0.317829370, 14 ],
+  /*  614 */  [ 0.318520867, 14 ],
+  /*  615 */  [ 0.319212739, 14 ],
+  /*  616 */  [ 0.319904987, 14 ],
+  /*  617 */  [ 0.320597609, 14 ],
+  /*  618 */  [ 0.321290606, 14 ],
+  /*  619 */  [ 0.321983976, 14 ],
+  /*  620 */  [ 0.322677720, 14 ],
+  /*  621 */  [ 0.323371837, 14 ],
+  /*  622 */  [ 0.324066327, 14 ],
+  /*  623 */  [ 0.324761189, 14 ],
+
+  /*  624 */  [ 0.325456423, 14 ],
+  /*  625 */  [ 0.326152028, 14 ],
+  /*  626 */  [ 0.326848005, 14 ],
+  /*  627 */  [ 0.327544352, 14 ],
+  /*  628 */  [ 0.328241070, 14 ],
+  /*  629 */  [ 0.328938157, 14 ],
+  /*  630 */  [ 0.329635614, 14 ],
+  /*  631 */  [ 0.330333440, 14 ],
+  /*  632 */  [ 0.331031635, 14 ],
+  /*  633 */  [ 0.331730198, 14 ],
+  /*  634 */  [ 0.332429129, 14 ],
+  /*  635 */  [ 0.333128427, 14 ],
+  /*  636 */  [ 0.333828093, 14 ],
+  /*  637 */  [ 0.334528126, 14 ],
+  /*  638 */  [ 0.335228525, 14 ],
+  /*  639 */  [ 0.335929290, 14 ],
+
+  /*  640 */  [ 0.336630420, 14 ],
+  /*  641 */  [ 0.337331916, 14 ],
+  /*  642 */  [ 0.338033777, 14 ],
+  /*  643 */  [ 0.338736002, 14 ],
+  /*  644 */  [ 0.339438592, 14 ],
+  /*  645 */  [ 0.340141545, 14 ],
+  /*  646 */  [ 0.340844862, 14 ],
+  /*  647 */  [ 0.341548541, 14 ],
+  /*  648 */  [ 0.342252584, 14 ],
+  /*  649 */  [ 0.342956988, 14 ],
+  /*  650 */  [ 0.343661754, 14 ],
+  /*  651 */  [ 0.344366882, 14 ],
+  /*  652 */  [ 0.345072371, 14 ],
+  /*  653 */  [ 0.345778221, 14 ],
+  /*  654 */  [ 0.346484431, 14 ],
+  /*  655 */  [ 0.347191002, 14 ],
+
+  /*  656 */  [ 0.347897931, 14 ],
+  /*  657 */  [ 0.348605221, 14 ],
+  /*  658 */  [ 0.349312869, 14 ],
+  /*  659 */  [ 0.350020876, 14 ],
+  /*  660 */  [ 0.350729240, 14 ],
+  /*  661 */  [ 0.351437963, 14 ],
+  /*  662 */  [ 0.352147044, 14 ],
+  /*  663 */  [ 0.352856481, 14 ],
+  /*  664 */  [ 0.353566275, 14 ],
+  /*  665 */  [ 0.354276426, 14 ],
+  /*  666 */  [ 0.354986932, 14 ],
+  /*  667 */  [ 0.355697795, 14 ],
+  /*  668 */  [ 0.356409012, 14 ],
+  /*  669 */  [ 0.357120585, 14 ],
+  /*  670 */  [ 0.357832512, 14 ],
+  /*  671 */  [ 0.358544794, 14 ],
+
+  /*  672 */  [ 0.359257429, 14 ],
+  /*  673 */  [ 0.359970419, 14 ],
+  /*  674 */  [ 0.360683761, 14 ],
+  /*  675 */  [ 0.361397456, 14 ],
+  /*  676 */  [ 0.362111504, 14 ],
+  /*  677 */  [ 0.362825904, 14 ],
+  /*  678 */  [ 0.363540655, 14 ],
+  /*  679 */  [ 0.364255759, 14 ],
+  /*  680 */  [ 0.364971213, 14 ],
+  /*  681 */  [ 0.365687018, 14 ],
+  /*  682 */  [ 0.366403174, 14 ],
+  /*  683 */  [ 0.367119680, 14 ],
+  /*  684 */  [ 0.367836535, 14 ],
+  /*  685 */  [ 0.368553740, 14 ],
+  /*  686 */  [ 0.369271294, 14 ],
+  /*  687 */  [ 0.369989197, 14 ],
+
+  /*  688 */  [ 0.370707448, 14 ],
+  /*  689 */  [ 0.371426047, 14 ],
+  /*  690 */  [ 0.372144994, 14 ],
+  /*  691 */  [ 0.372864289, 14 ],
+  /*  692 */  [ 0.373583930, 14 ],
+  /*  693 */  [ 0.374303918, 14 ],
+  /*  694 */  [ 0.375024253, 14 ],
+  /*  695 */  [ 0.375744934, 14 ],
+  /*  696 */  [ 0.376465960, 14 ],
+  /*  697 */  [ 0.377187332, 14 ],
+  /*  698 */  [ 0.377909049, 14 ],
+  /*  699 */  [ 0.378631110, 14 ],
+  /*  700 */  [ 0.379353516, 14 ],
+  /*  701 */  [ 0.380076266, 14 ],
+  /*  702 */  [ 0.380799360, 14 ],
+  /*  703 */  [ 0.381522798, 14 ],
+
+  /*  704 */  [ 0.382246578, 14 ],
+  /*  705 */  [ 0.382970701, 14 ],
+  /*  706 */  [ 0.383695167, 14 ],
+  /*  707 */  [ 0.384419975, 14 ],
+  /*  708 */  [ 0.385145124, 14 ],
+  /*  709 */  [ 0.385870615, 14 ],
+  /*  710 */  [ 0.386596448, 14 ],
+  /*  711 */  [ 0.387322621, 14 ],
+  /*  712 */  [ 0.388049134, 14 ],
+  /*  713 */  [ 0.388775988, 14 ],
+  /*  714 */  [ 0.389503182, 14 ],
+  /*  715 */  [ 0.390230715, 14 ],
+  /*  716 */  [ 0.390958588, 14 ],
+  /*  717 */  [ 0.391686799, 14 ],
+  /*  718 */  [ 0.392415349, 14 ],
+  /*  719 */  [ 0.393144238, 14 ],
+
+  /*  720 */  [ 0.393873464, 14 ],
+  /*  721 */  [ 0.394603028, 14 ],
+  /*  722 */  [ 0.395332930, 14 ],
+  /*  723 */  [ 0.396063168, 14 ],
+  /*  724 */  [ 0.396793743, 14 ],
+  /*  725 */  [ 0.397524655, 14 ],
+  /*  726 */  [ 0.398255903, 14 ],
+  /*  727 */  [ 0.398987487, 14 ],
+  /*  728 */  [ 0.399719406, 14 ],
+  /*  729 */  [ 0.400451660, 14 ],
+  /*  730 */  [ 0.401184249, 14 ],
+  /*  731 */  [ 0.401917173, 14 ],
+  /*  732 */  [ 0.402650431, 14 ],
+  /*  733 */  [ 0.403384024, 14 ],
+  /*  734 */  [ 0.404117949, 14 ],
+  /*  735 */  [ 0.404852209, 14 ],
+
+  /*  736 */  [ 0.405586801, 14 ],
+  /*  737 */  [ 0.406321726, 14 ],
+  /*  738 */  [ 0.407056983, 14 ],
+  /*  739 */  [ 0.407792573, 14 ],
+  /*  740 */  [ 0.408528495, 14 ],
+  /*  741 */  [ 0.409264748, 14 ],
+  /*  742 */  [ 0.410001332, 14 ],
+  /*  743 */  [ 0.410738247, 14 ],
+  /*  744 */  [ 0.411475493, 14 ],
+  /*  745 */  [ 0.412213070, 14 ],
+  /*  746 */  [ 0.412950976, 14 ],
+  /*  747 */  [ 0.413689213, 14 ],
+  /*  748 */  [ 0.414427779, 14 ],
+  /*  749 */  [ 0.415166674, 14 ],
+  /*  750 */  [ 0.415905897, 14 ],
+  /*  751 */  [ 0.416645450, 14 ],
+
+  /*  752 */  [ 0.417385331, 14 ],
+  /*  753 */  [ 0.418125540, 14 ],
+  /*  754 */  [ 0.418866076, 14 ],
+  /*  755 */  [ 0.419606940, 14 ],
+  /*  756 */  [ 0.420348132, 14 ],
+  /*  757 */  [ 0.421089650, 14 ],
+  /*  758 */  [ 0.421831494, 14 ],
+  /*  759 */  [ 0.422573665, 14 ],
+  /*  760 */  [ 0.423316162, 14 ],
+  /*  761 */  [ 0.424058985, 14 ],
+  /*  762 */  [ 0.424802133, 14 ],
+  /*  763 */  [ 0.425545607, 14 ],
+  /*  764 */  [ 0.426289405, 14 ],
+  /*  765 */  [ 0.427033528, 14 ],
+  /*  766 */  [ 0.427777975, 14 ],
+  /*  767 */  [ 0.428522746, 14 ],
+
+  /*  768 */  [ 0.429267841, 14 ],
+  /*  769 */  [ 0.430013259, 14 ],
+  /*  770 */  [ 0.430759001, 14 ],
+  /*  771 */  [ 0.431505065, 14 ],
+  /*  772 */  [ 0.432251452, 14 ],
+  /*  773 */  [ 0.432998162, 14 ],
+  /*  774 */  [ 0.433745193, 14 ],
+  /*  775 */  [ 0.434492546, 14 ],
+  /*  776 */  [ 0.435240221, 14 ],
+  /*  777 */  [ 0.435988217, 14 ],
+  /*  778 */  [ 0.436736534, 14 ],
+  /*  779 */  [ 0.437485172, 14 ],
+  /*  780 */  [ 0.438234130, 14 ],
+  /*  781 */  [ 0.438983408, 14 ],
+  /*  782 */  [ 0.439733006, 14 ],
+  /*  783 */  [ 0.440482924, 14 ],
+
+  /*  784 */  [ 0.441233161, 14 ],
+  /*  785 */  [ 0.441983717, 14 ],
+  /*  786 */  [ 0.442734592, 14 ],
+  /*  787 */  [ 0.443485785, 14 ],
+  /*  788 */  [ 0.444237296, 14 ],
+  /*  789 */  [ 0.444989126, 14 ],
+  /*  790 */  [ 0.445741273, 14 ],
+  /*  791 */  [ 0.446493738, 14 ],
+  /*  792 */  [ 0.447246519, 14 ],
+  /*  793 */  [ 0.447999618, 14 ],
+  /*  794 */  [ 0.448753033, 14 ],
+  /*  795 */  [ 0.449506765, 14 ],
+  /*  796 */  [ 0.450260813, 14 ],
+  /*  797 */  [ 0.451015176, 14 ],
+  /*  798 */  [ 0.451769856, 14 ],
+  /*  799 */  [ 0.452524850, 14 ],
+
+  /*  800 */  [ 0.453280160, 14 ],
+  /*  801 */  [ 0.454035784, 14 ],
+  /*  802 */  [ 0.454791723, 14 ],
+  /*  803 */  [ 0.455547976, 14 ],
+  /*  804 */  [ 0.456304543, 14 ],
+  /*  805 */  [ 0.457061423, 14 ],
+  /*  806 */  [ 0.457818618, 14 ],
+  /*  807 */  [ 0.458576125, 14 ],
+  /*  808 */  [ 0.459333946, 14 ],
+  /*  809 */  [ 0.460092079, 14 ],
+  /*  810 */  [ 0.460850524, 14 ],
+  /*  811 */  [ 0.461609282, 14 ],
+  /*  812 */  [ 0.462368352, 14 ],
+  /*  813 */  [ 0.463127733, 14 ],
+  /*  814 */  [ 0.463887426, 14 ],
+  /*  815 */  [ 0.464647430, 14 ],
+
+  /*  816 */  [ 0.465407744, 14 ],
+  /*  817 */  [ 0.466168370, 14 ],
+  /*  818 */  [ 0.466929306, 14 ],
+  /*  819 */  [ 0.467690552, 14 ],
+  /*  820 */  [ 0.468452108, 14 ],
+  /*  821 */  [ 0.469213973, 14 ],
+  /*  822 */  [ 0.469976148, 14 ],
+  /*  823 */  [ 0.470738632, 14 ],
+  /*  824 */  [ 0.471501425, 14 ],
+  /*  825 */  [ 0.472264527, 14 ],
+  /*  826 */  [ 0.473027937, 14 ],
+  /*  827 */  [ 0.473791655, 14 ],
+  /*  828 */  [ 0.474555681, 14 ],
+  /*  829 */  [ 0.475320014, 14 ],
+  /*  830 */  [ 0.476084655, 14 ],
+  /*  831 */  [ 0.476849603, 14 ],
+
+  /*  832 */  [ 0.477614858, 14 ],
+  /*  833 */  [ 0.478380420, 14 ],
+  /*  834 */  [ 0.479146288, 14 ],
+  /*  835 */  [ 0.479912463, 14 ],
+  /*  836 */  [ 0.480678943, 14 ],
+  /*  837 */  [ 0.481445729, 14 ],
+  /*  838 */  [ 0.482212820, 14 ],
+  /*  839 */  [ 0.482980216, 14 ],
+  /*  840 */  [ 0.483747918, 14 ],
+  /*  841 */  [ 0.484515924, 14 ],
+  /*  842 */  [ 0.485284235, 14 ],
+  /*  843 */  [ 0.486052849, 14 ],
+  /*  844 */  [ 0.486821768, 14 ],
+  /*  845 */  [ 0.487590991, 14 ],
+  /*  846 */  [ 0.488360517, 14 ],
+  /*  847 */  [ 0.489130346, 14 ],
+
+  /*  848 */  [ 0.489900479, 14 ],
+  /*  849 */  [ 0.490670914, 14 ],
+  /*  850 */  [ 0.491441651, 14 ],
+  /*  851 */  [ 0.492212691, 14 ],
+  /*  852 */  [ 0.492984033, 14 ],
+  /*  853 */  [ 0.493755677, 14 ],
+  /*  854 */  [ 0.494527623, 14 ],
+  /*  855 */  [ 0.495299870, 14 ],
+  /*  856 */  [ 0.496072418, 14 ],
+  /*  857 */  [ 0.496845266, 14 ],
+  /*  858 */  [ 0.497618416, 14 ],
+  /*  859 */  [ 0.498391866, 14 ],
+  /*  860 */  [ 0.499165616, 14 ],
+  /*  861 */  [ 0.499939666, 14 ],
+  /*  862 */  [ 0.250357008, 15 ],
+  /*  863 */  [ 0.250744333, 15 ],
+
+  /*  864 */  [ 0.251131807, 15 ],
+  /*  865 */  [ 0.251519431, 15 ],
+  /*  866 */  [ 0.251907204, 15 ],
+  /*  867 */  [ 0.252295127, 15 ],
+  /*  868 */  [ 0.252683198, 15 ],
+  /*  869 */  [ 0.253071419, 15 ],
+  /*  870 */  [ 0.253459789, 15 ],
+  /*  871 */  [ 0.253848307, 15 ],
+  /*  872 */  [ 0.254236974, 15 ],
+  /*  873 */  [ 0.254625790, 15 ],
+  /*  874 */  [ 0.255014755, 15 ],
+  /*  875 */  [ 0.255403867, 15 ],
+  /*  876 */  [ 0.255793128, 15 ],
+  /*  877 */  [ 0.256182537, 15 ],
+  /*  878 */  [ 0.256572095, 15 ],
+  /*  879 */  [ 0.256961800, 15 ],
+
+  /*  880 */  [ 0.257351652, 15 ],
+  /*  881 */  [ 0.257741653, 15 ],
+  /*  882 */  [ 0.258131801, 15 ],
+  /*  883 */  [ 0.258522097, 15 ],
+  /*  884 */  [ 0.258912540, 15 ],
+  /*  885 */  [ 0.259303130, 15 ],
+  /*  886 */  [ 0.259693868, 15 ],
+  /*  887 */  [ 0.260084752, 15 ],
+  /*  888 */  [ 0.260475783, 15 ],
+  /*  889 */  [ 0.260866961, 15 ],
+  /*  890 */  [ 0.261258286, 15 ],
+  /*  891 */  [ 0.261649758, 15 ],
+  /*  892 */  [ 0.262041376, 15 ],
+  /*  893 */  [ 0.262433140, 15 ],
+  /*  894 */  [ 0.262825051, 15 ],
+  /*  895 */  [ 0.263217107, 15 ],
+
+  /*  896 */  [ 0.263609310, 15 ],
+  /*  897 */  [ 0.264001659, 15 ],
+  /*  898 */  [ 0.264394153, 15 ],
+  /*  899 */  [ 0.264786794, 15 ],
+  /*  900 */  [ 0.265179580, 15 ],
+  /*  901 */  [ 0.265572511, 15 ],
+  /*  902 */  [ 0.265965588, 15 ],
+  /*  903 */  [ 0.266358810, 15 ],
+  /*  904 */  [ 0.266752177, 15 ],
+  /*  905 */  [ 0.267145689, 15 ],
+  /*  906 */  [ 0.267539347, 15 ],
+  /*  907 */  [ 0.267933149, 15 ],
+  /*  908 */  [ 0.268327096, 15 ],
+  /*  909 */  [ 0.268721187, 15 ],
+  /*  910 */  [ 0.269115423, 15 ],
+  /*  911 */  [ 0.269509804, 15 ],
+
+  /*  912 */  [ 0.269904329, 15 ],
+  /*  913 */  [ 0.270298998, 15 ],
+  /*  914 */  [ 0.270693811, 15 ],
+  /*  915 */  [ 0.271088768, 15 ],
+  /*  916 */  [ 0.271483869, 15 ],
+  /*  917 */  [ 0.271879114, 15 ],
+  /*  918 */  [ 0.272274503, 15 ],
+  /*  919 */  [ 0.272670035, 15 ],
+  /*  920 */  [ 0.273065710, 15 ],
+  /*  921 */  [ 0.273461530, 15 ],
+  /*  922 */  [ 0.273857492, 15 ],
+  /*  923 */  [ 0.274253597, 15 ],
+  /*  924 */  [ 0.274649846, 15 ],
+  /*  925 */  [ 0.275046238, 15 ],
+  /*  926 */  [ 0.275442772, 15 ],
+  /*  927 */  [ 0.275839449, 15 ],
+
+  /*  928 */  [ 0.276236269, 15 ],
+  /*  929 */  [ 0.276633232, 15 ],
+  /*  930 */  [ 0.277030337, 15 ],
+  /*  931 */  [ 0.277427584, 15 ],
+  /*  932 */  [ 0.277824973, 15 ],
+  /*  933 */  [ 0.278222505, 15 ],
+  /*  934 */  [ 0.278620179, 15 ],
+  /*  935 */  [ 0.279017995, 15 ],
+  /*  936 */  [ 0.279415952, 15 ],
+  /*  937 */  [ 0.279814051, 15 ],
+  /*  938 */  [ 0.280212292, 15 ],
+  /*  939 */  [ 0.280610675, 15 ],
+  /*  940 */  [ 0.281009199, 15 ],
+  /*  941 */  [ 0.281407864, 15 ],
+  /*  942 */  [ 0.281806670, 15 ],
+  /*  943 */  [ 0.282205618, 15 ],
+
+  /*  944 */  [ 0.282604707, 15 ],
+  /*  945 */  [ 0.283003936, 15 ],
+  /*  946 */  [ 0.283403307, 15 ],
+  /*  947 */  [ 0.283802818, 15 ],
+  /*  948 */  [ 0.284202470, 15 ],
+  /*  949 */  [ 0.284602263, 15 ],
+  /*  950 */  [ 0.285002195, 15 ],
+  /*  951 */  [ 0.285402269, 15 ],
+  /*  952 */  [ 0.285802482, 15 ],
+  /*  953 */  [ 0.286202836, 15 ],
+  /*  954 */  [ 0.286603329, 15 ],
+  /*  955 */  [ 0.287003963, 15 ],
+  /*  956 */  [ 0.287404737, 15 ],
+  /*  957 */  [ 0.287805650, 15 ],
+  /*  958 */  [ 0.288206703, 15 ],
+  /*  959 */  [ 0.288607895, 15 ],
+
+  /*  960 */  [ 0.289009227, 15 ],
+  /*  961 */  [ 0.289410699, 15 ],
+  /*  962 */  [ 0.289812309, 15 ],
+  /*  963 */  [ 0.290214059, 15 ],
+  /*  964 */  [ 0.290615948, 15 ],
+  /*  965 */  [ 0.291017976, 15 ],
+  /*  966 */  [ 0.291420143, 15 ],
+  /*  967 */  [ 0.291822449, 15 ],
+  /*  968 */  [ 0.292224893, 15 ],
+  /*  969 */  [ 0.292627476, 15 ],
+  /*  970 */  [ 0.293030197, 15 ],
+  /*  971 */  [ 0.293433057, 15 ],
+  /*  972 */  [ 0.293836055, 15 ],
+  /*  973 */  [ 0.294239192, 15 ],
+  /*  974 */  [ 0.294642466, 15 ],
+  /*  975 */  [ 0.295045879, 15 ],
+
+  /*  976 */  [ 0.295449429, 15 ],
+  /*  977 */  [ 0.295853118, 15 ],
+  /*  978 */  [ 0.296256944, 15 ],
+  /*  979 */  [ 0.296660907, 15 ],
+  /*  980 */  [ 0.297065009, 15 ],
+  /*  981 */  [ 0.297469248, 15 ],
+  /*  982 */  [ 0.297873624, 15 ],
+  /*  983 */  [ 0.298278137, 15 ],
+  /*  984 */  [ 0.298682788, 15 ],
+  /*  985 */  [ 0.299087576, 15 ],
+  /*  986 */  [ 0.299492500, 15 ],
+  /*  987 */  [ 0.299897562, 15 ],
+  /*  988 */  [ 0.300302761, 15 ],
+  /*  989 */  [ 0.300708096, 15 ],
+  /*  990 */  [ 0.301113568, 15 ],
+  /*  991 */  [ 0.301519176, 15 ],
+
+  /*  992 */  [ 0.301924921, 15 ],
+  /*  993 */  [ 0.302330802, 15 ],
+  /*  994 */  [ 0.302736820, 15 ],
+  /*  995 */  [ 0.303142973, 15 ],
+  /*  996 */  [ 0.303549263, 15 ],
+  /*  997 */  [ 0.303955689, 15 ],
+  /*  998 */  [ 0.304362251, 15 ],
+  /*  999 */  [ 0.304768948, 15 ],
+  /* 1000 */  [ 0.305175781, 15 ],
+  /* 1001 */  [ 0.305582750, 15 ],
+  /* 1002 */  [ 0.305989854, 15 ],
+  /* 1003 */  [ 0.306397094, 15 ],
+  /* 1004 */  [ 0.306804470, 15 ],
+  /* 1005 */  [ 0.307211980, 15 ],
+  /* 1006 */  [ 0.307619626, 15 ],
+  /* 1007 */  [ 0.308027406, 15 ],
+
+  /* 1008 */  [ 0.308435322, 15 ],
+  /* 1009 */  [ 0.308843373, 15 ],
+  /* 1010 */  [ 0.309251558, 15 ],
+  /* 1011 */  [ 0.309659879, 15 ],
+  /* 1012 */  [ 0.310068333, 15 ],
+  /* 1013 */  [ 0.310476923, 15 ],
+  /* 1014 */  [ 0.310885647, 15 ],
+  /* 1015 */  [ 0.311294505, 15 ],
+  /* 1016 */  [ 0.311703498, 15 ],
+  /* 1017 */  [ 0.312112625, 15 ],
+  /* 1018 */  [ 0.312521885, 15 ],
+  /* 1019 */  [ 0.312931280, 15 ],
+  /* 1020 */  [ 0.313340809, 15 ],
+  /* 1021 */  [ 0.313750472, 15 ],
+  /* 1022 */  [ 0.314160269, 15 ],
+  /* 1023 */  [ 0.314570199, 15 ],
+
+  /* 1024 */  [ 0.314980262, 15 ],
+  /* 1025 */  [ 0.315390460, 15 ],
+  /* 1026 */  [ 0.315800790, 15 ],
+  /* 1027 */  [ 0.316211255, 15 ],
+  /* 1028 */  [ 0.316621852, 15 ],
+  /* 1029 */  [ 0.317032582, 15 ],
+  /* 1030 */  [ 0.317443446, 15 ],
+  /* 1031 */  [ 0.317854442, 15 ],
+  /* 1032 */  [ 0.318265572, 15 ],
+  /* 1033 */  [ 0.318676834, 15 ],
+  /* 1034 */  [ 0.319088229, 15 ],
+  /* 1035 */  [ 0.319499756, 15 ],
+  /* 1036 */  [ 0.319911417, 15 ],
+  /* 1037 */  [ 0.320323209, 15 ],
+  /* 1038 */  [ 0.320735134, 15 ],
+  /* 1039 */  [ 0.321147192, 15 ],
+
+  /* 1040 */  [ 0.321559381, 15 ],
+  /* 1041 */  [ 0.321971703, 15 ],
+  /* 1042 */  [ 0.322384156, 15 ],
+  /* 1043 */  [ 0.322796742, 15 ],
+  /* 1044 */  [ 0.323209460, 15 ],
+  /* 1045 */  [ 0.323622309, 15 ],
+  /* 1046 */  [ 0.324035290, 15 ],
+  /* 1047 */  [ 0.324448403, 15 ],
+  /* 1048 */  [ 0.324861647, 15 ],
+  /* 1049 */  [ 0.325275023, 15 ],
+  /* 1050 */  [ 0.325688530, 15 ],
+  /* 1051 */  [ 0.326102168, 15 ],
+  /* 1052 */  [ 0.326515938, 15 ],
+  /* 1053 */  [ 0.326929839, 15 ],
+  /* 1054 */  [ 0.327343870, 15 ],
+  /* 1055 */  [ 0.327758033, 15 ],
+
+  /* 1056 */  [ 0.328172327, 15 ],
+  /* 1057 */  [ 0.328586751, 15 ],
+  /* 1058 */  [ 0.329001306, 15 ],
+  /* 1059 */  [ 0.329415992, 15 ],
+  /* 1060 */  [ 0.329830808, 15 ],
+  /* 1061 */  [ 0.330245755, 15 ],
+  /* 1062 */  [ 0.330660832, 15 ],
+  /* 1063 */  [ 0.331076039, 15 ],
+  /* 1064 */  [ 0.331491377, 15 ],
+  /* 1065 */  [ 0.331906845, 15 ],
+  /* 1066 */  [ 0.332322443, 15 ],
+  /* 1067 */  [ 0.332738170, 15 ],
+  /* 1068 */  [ 0.333154028, 15 ],
+  /* 1069 */  [ 0.333570016, 15 ],
+  /* 1070 */  [ 0.333986133, 15 ],
+  /* 1071 */  [ 0.334402380, 15 ],
+
+  /* 1072 */  [ 0.334818756, 15 ],
+  /* 1073 */  [ 0.335235262, 15 ],
+  /* 1074 */  [ 0.335651898, 15 ],
+  /* 1075 */  [ 0.336068662, 15 ],
+  /* 1076 */  [ 0.336485556, 15 ],
+  /* 1077 */  [ 0.336902579, 15 ],
+  /* 1078 */  [ 0.337319732, 15 ],
+  /* 1079 */  [ 0.337737013, 15 ],
+  /* 1080 */  [ 0.338154423, 15 ],
+  /* 1081 */  [ 0.338571962, 15 ],
+  /* 1082 */  [ 0.338989630, 15 ],
+  /* 1083 */  [ 0.339407426, 15 ],
+  /* 1084 */  [ 0.339825351, 15 ],
+  /* 1085 */  [ 0.340243405, 15 ],
+  /* 1086 */  [ 0.340661587, 15 ],
+  /* 1087 */  [ 0.341079898, 15 ],
+
+  /* 1088 */  [ 0.341498336, 15 ],
+  /* 1089 */  [ 0.341916903, 15 ],
+  /* 1090 */  [ 0.342335598, 15 ],
+  /* 1091 */  [ 0.342754421, 15 ],
+  /* 1092 */  [ 0.343173373, 15 ],
+  /* 1093 */  [ 0.343592452, 15 ],
+  /* 1094 */  [ 0.344011659, 15 ],
+  /* 1095 */  [ 0.344430993, 15 ],
+  /* 1096 */  [ 0.344850455, 15 ],
+  /* 1097 */  [ 0.345270045, 15 ],
+  /* 1098 */  [ 0.345689763, 15 ],
+  /* 1099 */  [ 0.346109608, 15 ],
+  /* 1100 */  [ 0.346529580, 15 ],
+  /* 1101 */  [ 0.346949679, 15 ],
+  /* 1102 */  [ 0.347369906, 15 ],
+  /* 1103 */  [ 0.347790260, 15 ],
+
+  /* 1104 */  [ 0.348210741, 15 ],
+  /* 1105 */  [ 0.348631348, 15 ],
+  /* 1106 */  [ 0.349052083, 15 ],
+  /* 1107 */  [ 0.349472945, 15 ],
+  /* 1108 */  [ 0.349893933, 15 ],
+  /* 1109 */  [ 0.350315048, 15 ],
+  /* 1110 */  [ 0.350736290, 15 ],
+  /* 1111 */  [ 0.351157658, 15 ],
+  /* 1112 */  [ 0.351579152, 15 ],
+  /* 1113 */  [ 0.352000773, 15 ],
+  /* 1114 */  [ 0.352422520, 15 ],
+  /* 1115 */  [ 0.352844394, 15 ],
+  /* 1116 */  [ 0.353266393, 15 ],
+  /* 1117 */  [ 0.353688519, 15 ],
+  /* 1118 */  [ 0.354110771, 15 ],
+  /* 1119 */  [ 0.354533148, 15 ],
+
+  /* 1120 */  [ 0.354955651, 15 ],
+  /* 1121 */  [ 0.355378281, 15 ],
+  /* 1122 */  [ 0.355801035, 15 ],
+  /* 1123 */  [ 0.356223916, 15 ],
+  /* 1124 */  [ 0.356646922, 15 ],
+  /* 1125 */  [ 0.357070053, 15 ],
+  /* 1126 */  [ 0.357493310, 15 ],
+  /* 1127 */  [ 0.357916692, 15 ],
+  /* 1128 */  [ 0.358340200, 15 ],
+  /* 1129 */  [ 0.358763832, 15 ],
+  /* 1130 */  [ 0.359187590, 15 ],
+  /* 1131 */  [ 0.359611472, 15 ],
+  /* 1132 */  [ 0.360035480, 15 ],
+  /* 1133 */  [ 0.360459613, 15 ],
+  /* 1134 */  [ 0.360883870, 15 ],
+  /* 1135 */  [ 0.361308252, 15 ],
+
+  /* 1136 */  [ 0.361732758, 15 ],
+  /* 1137 */  [ 0.362157390, 15 ],
+  /* 1138 */  [ 0.362582145, 15 ],
+  /* 1139 */  [ 0.363007026, 15 ],
+  /* 1140 */  [ 0.363432030, 15 ],
+  /* 1141 */  [ 0.363857159, 15 ],
+  /* 1142 */  [ 0.364282412, 15 ],
+  /* 1143 */  [ 0.364707789, 15 ],
+  /* 1144 */  [ 0.365133291, 15 ],
+  /* 1145 */  [ 0.365558916, 15 ],
+  /* 1146 */  [ 0.365984665, 15 ],
+  /* 1147 */  [ 0.366410538, 15 ],
+  /* 1148 */  [ 0.366836535, 15 ],
+  /* 1149 */  [ 0.367262655, 15 ],
+  /* 1150 */  [ 0.367688900, 15 ],
+  /* 1151 */  [ 0.368115267, 15 ],
+
+  /* 1152 */  [ 0.368541759, 15 ],
+  /* 1153 */  [ 0.368968373, 15 ],
+  /* 1154 */  [ 0.369395111, 15 ],
+  /* 1155 */  [ 0.369821973, 15 ],
+  /* 1156 */  [ 0.370248957, 15 ],
+  /* 1157 */  [ 0.370676065, 15 ],
+  /* 1158 */  [ 0.371103295, 15 ],
+  /* 1159 */  [ 0.371530649, 15 ],
+  /* 1160 */  [ 0.371958126, 15 ],
+  /* 1161 */  [ 0.372385725, 15 ],
+  /* 1162 */  [ 0.372813448, 15 ],
+  /* 1163 */  [ 0.373241292, 15 ],
+  /* 1164 */  [ 0.373669260, 15 ],
+  /* 1165 */  [ 0.374097350, 15 ],
+  /* 1166 */  [ 0.374525563, 15 ],
+  /* 1167 */  [ 0.374953898, 15 ],
+
+  /* 1168 */  [ 0.375382356, 15 ],
+  /* 1169 */  [ 0.375810936, 15 ],
+  /* 1170 */  [ 0.376239638, 15 ],
+  /* 1171 */  [ 0.376668462, 15 ],
+  /* 1172 */  [ 0.377097408, 15 ],
+  /* 1173 */  [ 0.377526476, 15 ],
+  /* 1174 */  [ 0.377955667, 15 ],
+  /* 1175 */  [ 0.378384979, 15 ],
+  /* 1176 */  [ 0.378814413, 15 ],
+  /* 1177 */  [ 0.379243968, 15 ],
+  /* 1178 */  [ 0.379673646, 15 ],
+  /* 1179 */  [ 0.380103444, 15 ],
+  /* 1180 */  [ 0.380533365, 15 ],
+  /* 1181 */  [ 0.380963407, 15 ],
+  /* 1182 */  [ 0.381393570, 15 ],
+  /* 1183 */  [ 0.381823855, 15 ],
+
+  /* 1184 */  [ 0.382254261, 15 ],
+  /* 1185 */  [ 0.382684788, 15 ],
+  /* 1186 */  [ 0.383115436, 15 ],
+  /* 1187 */  [ 0.383546205, 15 ],
+  /* 1188 */  [ 0.383977096, 15 ],
+  /* 1189 */  [ 0.384408107, 15 ],
+  /* 1190 */  [ 0.384839239, 15 ],
+  /* 1191 */  [ 0.385270492, 15 ],
+  /* 1192 */  [ 0.385701865, 15 ],
+  /* 1193 */  [ 0.386133359, 15 ],
+  /* 1194 */  [ 0.386564974, 15 ],
+  /* 1195 */  [ 0.386996709, 15 ],
+  /* 1196 */  [ 0.387428565, 15 ],
+  /* 1197 */  [ 0.387860541, 15 ],
+  /* 1198 */  [ 0.388292637, 15 ],
+  /* 1199 */  [ 0.388724854, 15 ],
+
+  /* 1200 */  [ 0.389157191, 15 ],
+  /* 1201 */  [ 0.389589648, 15 ],
+  /* 1202 */  [ 0.390022225, 15 ],
+  /* 1203 */  [ 0.390454922, 15 ],
+  /* 1204 */  [ 0.390887739, 15 ],
+  /* 1205 */  [ 0.391320675, 15 ],
+  /* 1206 */  [ 0.391753732, 15 ],
+  /* 1207 */  [ 0.392186908, 15 ],
+  /* 1208 */  [ 0.392620204, 15 ],
+  /* 1209 */  [ 0.393053619, 15 ],
+  /* 1210 */  [ 0.393487154, 15 ],
+  /* 1211 */  [ 0.393920808, 15 ],
+  /* 1212 */  [ 0.394354582, 15 ],
+  /* 1213 */  [ 0.394788475, 15 ],
+  /* 1214 */  [ 0.395222488, 15 ],
+  /* 1215 */  [ 0.395656619, 15 ],
+
+  /* 1216 */  [ 0.396090870, 15 ],
+  /* 1217 */  [ 0.396525239, 15 ],
+  /* 1218 */  [ 0.396959728, 15 ],
+  /* 1219 */  [ 0.397394336, 15 ],
+  /* 1220 */  [ 0.397829062, 15 ],
+  /* 1221 */  [ 0.398263907, 15 ],
+  /* 1222 */  [ 0.398698871, 15 ],
+  /* 1223 */  [ 0.399133954, 15 ],
+  /* 1224 */  [ 0.399569155, 15 ],
+  /* 1225 */  [ 0.400004475, 15 ],
+  /* 1226 */  [ 0.400439913, 15 ],
+  /* 1227 */  [ 0.400875470, 15 ],
+  /* 1228 */  [ 0.401311145, 15 ],
+  /* 1229 */  [ 0.401746938, 15 ],
+  /* 1230 */  [ 0.402182850, 15 ],
+  /* 1231 */  [ 0.402618879, 15 ],
+
+  /* 1232 */  [ 0.403055027, 15 ],
+  /* 1233 */  [ 0.403491293, 15 ],
+  /* 1234 */  [ 0.403927676, 15 ],
+  /* 1235 */  [ 0.404364178, 15 ],
+  /* 1236 */  [ 0.404800797, 15 ],
+  /* 1237 */  [ 0.405237535, 15 ],
+  /* 1238 */  [ 0.405674390, 15 ],
+  /* 1239 */  [ 0.406111362, 15 ],
+  /* 1240 */  [ 0.406548452, 15 ],
+  /* 1241 */  [ 0.406985660, 15 ],
+  /* 1242 */  [ 0.407422985, 15 ],
+  /* 1243 */  [ 0.407860427, 15 ],
+  /* 1244 */  [ 0.408297987, 15 ],
+  /* 1245 */  [ 0.408735664, 15 ],
+  /* 1246 */  [ 0.409173458, 15 ],
+  /* 1247 */  [ 0.409611370, 15 ],
+
+  /* 1248 */  [ 0.410049398, 15 ],
+  /* 1249 */  [ 0.410487544, 15 ],
+  /* 1250 */  [ 0.410925806, 15 ],
+  /* 1251 */  [ 0.411364185, 15 ],
+  /* 1252 */  [ 0.411802681, 15 ],
+  /* 1253 */  [ 0.412241294, 15 ],
+  /* 1254 */  [ 0.412680024, 15 ],
+  /* 1255 */  [ 0.413118870, 15 ],
+  /* 1256 */  [ 0.413557833, 15 ],
+  /* 1257 */  [ 0.413996912, 15 ],
+  /* 1258 */  [ 0.414436108, 15 ],
+  /* 1259 */  [ 0.414875420, 15 ],
+  /* 1260 */  [ 0.415314849, 15 ],
+  /* 1261 */  [ 0.415754393, 15 ],
+  /* 1262 */  [ 0.416194054, 15 ],
+  /* 1263 */  [ 0.416633831, 15 ],
+
+  /* 1264 */  [ 0.417073724, 15 ],
+  /* 1265 */  [ 0.417513734, 15 ],
+  /* 1266 */  [ 0.417953859, 15 ],
+  /* 1267 */  [ 0.418394100, 15 ],
+  /* 1268 */  [ 0.418834457, 15 ],
+  /* 1269 */  [ 0.419274929, 15 ],
+  /* 1270 */  [ 0.419715518, 15 ],
+  /* 1271 */  [ 0.420156222, 15 ],
+  /* 1272 */  [ 0.420597041, 15 ],
+  /* 1273 */  [ 0.421037977, 15 ],
+  /* 1274 */  [ 0.421479027, 15 ],
+  /* 1275 */  [ 0.421920193, 15 ],
+  /* 1276 */  [ 0.422361475, 15 ],
+  /* 1277 */  [ 0.422802871, 15 ],
+  /* 1278 */  [ 0.423244383, 15 ],
+  /* 1279 */  [ 0.423686010, 15 ],
+
+  /* 1280 */  [ 0.424127753, 15 ],
+  /* 1281 */  [ 0.424569610, 15 ],
+  /* 1282 */  [ 0.425011582, 15 ],
+  /* 1283 */  [ 0.425453669, 15 ],
+  /* 1284 */  [ 0.425895871, 15 ],
+  /* 1285 */  [ 0.426338188, 15 ],
+  /* 1286 */  [ 0.426780620, 15 ],
+  /* 1287 */  [ 0.427223166, 15 ],
+  /* 1288 */  [ 0.427665827, 15 ],
+  /* 1289 */  [ 0.428108603, 15 ],
+  /* 1290 */  [ 0.428551493, 15 ],
+  /* 1291 */  [ 0.428994497, 15 ],
+  /* 1292 */  [ 0.429437616, 15 ],
+  /* 1293 */  [ 0.429880849, 15 ],
+  /* 1294 */  [ 0.430324197, 15 ],
+  /* 1295 */  [ 0.430767659, 15 ],
+
+  /* 1296 */  [ 0.431211234, 15 ],
+  /* 1297 */  [ 0.431654924, 15 ],
+  /* 1298 */  [ 0.432098728, 15 ],
+  /* 1299 */  [ 0.432542647, 15 ],
+  /* 1300 */  [ 0.432986678, 15 ],
+  /* 1301 */  [ 0.433430824, 15 ],
+  /* 1302 */  [ 0.433875084, 15 ],
+  /* 1303 */  [ 0.434319457, 15 ],
+  /* 1304 */  [ 0.434763944, 15 ],
+  /* 1305 */  [ 0.435208545, 15 ],
+  /* 1306 */  [ 0.435653259, 15 ],
+  /* 1307 */  [ 0.436098087, 15 ],
+  /* 1308 */  [ 0.436543029, 15 ],
+  /* 1309 */  [ 0.436988083, 15 ],
+  /* 1310 */  [ 0.437433251, 15 ],
+  /* 1311 */  [ 0.437878533, 15 ],
+
+  /* 1312 */  [ 0.438323927, 15 ],
+  /* 1313 */  [ 0.438769435, 15 ],
+  /* 1314 */  [ 0.439215056, 15 ],
+  /* 1315 */  [ 0.439660790, 15 ],
+  /* 1316 */  [ 0.440106636, 15 ],
+  /* 1317 */  [ 0.440552596, 15 ],
+  /* 1318 */  [ 0.440998669, 15 ],
+  /* 1319 */  [ 0.441444855, 15 ],
+  /* 1320 */  [ 0.441891153, 15 ],
+  /* 1321 */  [ 0.442337564, 15 ],
+  /* 1322 */  [ 0.442784088, 15 ],
+  /* 1323 */  [ 0.443230724, 15 ],
+  /* 1324 */  [ 0.443677473, 15 ],
+  /* 1325 */  [ 0.444124334, 15 ],
+  /* 1326 */  [ 0.444571308, 15 ],
+  /* 1327 */  [ 0.445018394, 15 ],
+
+  /* 1328 */  [ 0.445465593, 15 ],
+  /* 1329 */  [ 0.445912903, 15 ],
+  /* 1330 */  [ 0.446360326, 15 ],
+  /* 1331 */  [ 0.446807861, 15 ],
+  /* 1332 */  [ 0.447255509, 15 ],
+  /* 1333 */  [ 0.447703268, 15 ],
+  /* 1334 */  [ 0.448151139, 15 ],
+  /* 1335 */  [ 0.448599122, 15 ],
+  /* 1336 */  [ 0.449047217, 15 ],
+  /* 1337 */  [ 0.449495424, 15 ],
+  /* 1338 */  [ 0.449943742, 15 ],
+  /* 1339 */  [ 0.450392173, 15 ],
+  /* 1340 */  [ 0.450840715, 15 ],
+  /* 1341 */  [ 0.451289368, 15 ],
+  /* 1342 */  [ 0.451738133, 15 ],
+  /* 1343 */  [ 0.452187010, 15 ],
+
+  /* 1344 */  [ 0.452635998, 15 ],
+  /* 1345 */  [ 0.453085097, 15 ],
+  /* 1346 */  [ 0.453534308, 15 ],
+  /* 1347 */  [ 0.453983630, 15 ],
+  /* 1348 */  [ 0.454433063, 15 ],
+  /* 1349 */  [ 0.454882607, 15 ],
+  /* 1350 */  [ 0.455332262, 15 ],
+  /* 1351 */  [ 0.455782029, 15 ],
+  /* 1352 */  [ 0.456231906, 15 ],
+  /* 1353 */  [ 0.456681894, 15 ],
+  /* 1354 */  [ 0.457131993, 15 ],
+  /* 1355 */  [ 0.457582203, 15 ],
+  /* 1356 */  [ 0.458032524, 15 ],
+  /* 1357 */  [ 0.458482956, 15 ],
+  /* 1358 */  [ 0.458933498, 15 ],
+  /* 1359 */  [ 0.459384151, 15 ],
+
+  /* 1360 */  [ 0.459834914, 15 ],
+  /* 1361 */  [ 0.460285788, 15 ],
+  /* 1362 */  [ 0.460736772, 15 ],
+  /* 1363 */  [ 0.461187867, 15 ],
+  /* 1364 */  [ 0.461639071, 15 ],
+  /* 1365 */  [ 0.462090387, 15 ],
+  /* 1366 */  [ 0.462541812, 15 ],
+  /* 1367 */  [ 0.462993348, 15 ],
+  /* 1368 */  [ 0.463444993, 15 ],
+  /* 1369 */  [ 0.463896749, 15 ],
+  /* 1370 */  [ 0.464348615, 15 ],
+  /* 1371 */  [ 0.464800591, 15 ],
+  /* 1372 */  [ 0.465252676, 15 ],
+  /* 1373 */  [ 0.465704872, 15 ],
+  /* 1374 */  [ 0.466157177, 15 ],
+  /* 1375 */  [ 0.466609592, 15 ],
+
+  /* 1376 */  [ 0.467062117, 15 ],
+  /* 1377 */  [ 0.467514751, 15 ],
+  /* 1378 */  [ 0.467967495, 15 ],
+  /* 1379 */  [ 0.468420349, 15 ],
+  /* 1380 */  [ 0.468873312, 15 ],
+  /* 1381 */  [ 0.469326384, 15 ],
+  /* 1382 */  [ 0.469779566, 15 ],
+  /* 1383 */  [ 0.470232857, 15 ],
+  /* 1384 */  [ 0.470686258, 15 ],
+  /* 1385 */  [ 0.471139767, 15 ],
+  /* 1386 */  [ 0.471593386, 15 ],
+  /* 1387 */  [ 0.472047114, 15 ],
+  /* 1388 */  [ 0.472500951, 15 ],
+  /* 1389 */  [ 0.472954896, 15 ],
+  /* 1390 */  [ 0.473408951, 15 ],
+  /* 1391 */  [ 0.473863115, 15 ],
+
+  /* 1392 */  [ 0.474317388, 15 ],
+  /* 1393 */  [ 0.474771769, 15 ],
+  /* 1394 */  [ 0.475226259, 15 ],
+  /* 1395 */  [ 0.475680858, 15 ],
+  /* 1396 */  [ 0.476135565, 15 ],
+  /* 1397 */  [ 0.476590381, 15 ],
+  /* 1398 */  [ 0.477045306, 15 ],
+  /* 1399 */  [ 0.477500339, 15 ],
+  /* 1400 */  [ 0.477955481, 15 ],
+  /* 1401 */  [ 0.478410731, 15 ],
+  /* 1402 */  [ 0.478866089, 15 ],
+  /* 1403 */  [ 0.479321555, 15 ],
+  /* 1404 */  [ 0.479777130, 15 ],
+  /* 1405 */  [ 0.480232813, 15 ],
+  /* 1406 */  [ 0.480688604, 15 ],
+  /* 1407 */  [ 0.481144503, 15 ],
+
+  /* 1408 */  [ 0.481600510, 15 ],
+  /* 1409 */  [ 0.482056625, 15 ],
+  /* 1410 */  [ 0.482512848, 15 ],
+  /* 1411 */  [ 0.482969179, 15 ],
+  /* 1412 */  [ 0.483425618, 15 ],
+  /* 1413 */  [ 0.483882164, 15 ],
+  /* 1414 */  [ 0.484338818, 15 ],
+  /* 1415 */  [ 0.484795580, 15 ],
+  /* 1416 */  [ 0.485252449, 15 ],
+  /* 1417 */  [ 0.485709426, 15 ],
+  /* 1418 */  [ 0.486166511, 15 ],
+  /* 1419 */  [ 0.486623703, 15 ],
+  /* 1420 */  [ 0.487081002, 15 ],
+  /* 1421 */  [ 0.487538409, 15 ],
+  /* 1422 */  [ 0.487995923, 15 ],
+  /* 1423 */  [ 0.488453544, 15 ],
+
+  /* 1424 */  [ 0.488911273, 15 ],
+  /* 1425 */  [ 0.489369108, 15 ],
+  /* 1426 */  [ 0.489827051, 15 ],
+  /* 1427 */  [ 0.490285101, 15 ],
+  /* 1428 */  [ 0.490743258, 15 ],
+  /* 1429 */  [ 0.491201522, 15 ],
+  /* 1430 */  [ 0.491659892, 15 ],
+  /* 1431 */  [ 0.492118370, 15 ],
+  /* 1432 */  [ 0.492576954, 15 ],
+  /* 1433 */  [ 0.493035645, 15 ],
+  /* 1434 */  [ 0.493494443, 15 ],
+  /* 1435 */  [ 0.493953348, 15 ],
+  /* 1436 */  [ 0.494412359, 15 ],
+  /* 1437 */  [ 0.494871476, 15 ],
+  /* 1438 */  [ 0.495330701, 15 ],
+  /* 1439 */  [ 0.495790031, 15 ],
+
+  /* 1440 */  [ 0.496249468, 15 ],
+  /* 1441 */  [ 0.496709012, 15 ],
+  /* 1442 */  [ 0.497168662, 15 ],
+  /* 1443 */  [ 0.497628418, 15 ],
+  /* 1444 */  [ 0.498088280, 15 ],
+  /* 1445 */  [ 0.498548248, 15 ],
+  /* 1446 */  [ 0.499008323, 15 ],
+  /* 1447 */  [ 0.499468503, 15 ],
+  /* 1448 */  [ 0.499928790, 15 ],
+  /* 1449 */  [ 0.250194591, 16 ],
+  /* 1450 */  [ 0.250424840, 16 ],
+  /* 1451 */  [ 0.250655143, 16 ],
+  /* 1452 */  [ 0.250885498, 16 ],
+  /* 1453 */  [ 0.251115906, 16 ],
+  /* 1454 */  [ 0.251346367, 16 ],
+  /* 1455 */  [ 0.251576880, 16 ],
+
+  /* 1456 */  [ 0.251807447, 16 ],
+  /* 1457 */  [ 0.252038066, 16 ],
+  /* 1458 */  [ 0.252268738, 16 ],
+  /* 1459 */  [ 0.252499463, 16 ],
+  /* 1460 */  [ 0.252730240, 16 ],
+  /* 1461 */  [ 0.252961071, 16 ],
+  /* 1462 */  [ 0.253191953, 16 ],
+  /* 1463 */  [ 0.253422889, 16 ],
+  /* 1464 */  [ 0.253653877, 16 ],
+  /* 1465 */  [ 0.253884918, 16 ],
+  /* 1466 */  [ 0.254116011, 16 ],
+  /* 1467 */  [ 0.254347157, 16 ],
+  /* 1468 */  [ 0.254578356, 16 ],
+  /* 1469 */  [ 0.254809606, 16 ],
+  /* 1470 */  [ 0.255040910, 16 ],
+  /* 1471 */  [ 0.255272266, 16 ],
+
+  /* 1472 */  [ 0.255503674, 16 ],
+  /* 1473 */  [ 0.255735135, 16 ],
+  /* 1474 */  [ 0.255966648, 16 ],
+  /* 1475 */  [ 0.256198213, 16 ],
+  /* 1476 */  [ 0.256429831, 16 ],
+  /* 1477 */  [ 0.256661501, 16 ],
+  /* 1478 */  [ 0.256893223, 16 ],
+  /* 1479 */  [ 0.257124998, 16 ],
+  /* 1480 */  [ 0.257356825, 16 ],
+  /* 1481 */  [ 0.257588704, 16 ],
+  /* 1482 */  [ 0.257820635, 16 ],
+  /* 1483 */  [ 0.258052619, 16 ],
+  /* 1484 */  [ 0.258284654, 16 ],
+  /* 1485 */  [ 0.258516742, 16 ],
+  /* 1486 */  [ 0.258748882, 16 ],
+  /* 1487 */  [ 0.258981074, 16 ],
+
+  /* 1488 */  [ 0.259213318, 16 ],
+  /* 1489 */  [ 0.259445614, 16 ],
+  /* 1490 */  [ 0.259677962, 16 ],
+  /* 1491 */  [ 0.259910362, 16 ],
+  /* 1492 */  [ 0.260142814, 16 ],
+  /* 1493 */  [ 0.260375318, 16 ],
+  /* 1494 */  [ 0.260607874, 16 ],
+  /* 1495 */  [ 0.260840481, 16 ],
+  /* 1496 */  [ 0.261073141, 16 ],
+  /* 1497 */  [ 0.261305852, 16 ],
+  /* 1498 */  [ 0.261538616, 16 ],
+  /* 1499 */  [ 0.261771431, 16 ],
+  /* 1500 */  [ 0.262004297, 16 ],
+  /* 1501 */  [ 0.262237216, 16 ],
+  /* 1502 */  [ 0.262470186, 16 ],
+  /* 1503 */  [ 0.262703208, 16 ],
+
+  /* 1504 */  [ 0.262936282, 16 ],
+  /* 1505 */  [ 0.263169407, 16 ],
+  /* 1506 */  [ 0.263402584, 16 ],
+  /* 1507 */  [ 0.263635813, 16 ],
+  /* 1508 */  [ 0.263869093, 16 ],
+  /* 1509 */  [ 0.264102425, 16 ],
+  /* 1510 */  [ 0.264335808, 16 ],
+  /* 1511 */  [ 0.264569243, 16 ],
+  /* 1512 */  [ 0.264802730, 16 ],
+  /* 1513 */  [ 0.265036267, 16 ],
+  /* 1514 */  [ 0.265269857, 16 ],
+  /* 1515 */  [ 0.265503498, 16 ],
+  /* 1516 */  [ 0.265737190, 16 ],
+  /* 1517 */  [ 0.265970933, 16 ],
+  /* 1518 */  [ 0.266204728, 16 ],
+  /* 1519 */  [ 0.266438574, 16 ],
+
+  /* 1520 */  [ 0.266672472, 16 ],
+  /* 1521 */  [ 0.266906421, 16 ],
+  /* 1522 */  [ 0.267140421, 16 ],
+  /* 1523 */  [ 0.267374472, 16 ],
+  /* 1524 */  [ 0.267608575, 16 ],
+  /* 1525 */  [ 0.267842729, 16 ],
+  /* 1526 */  [ 0.268076934, 16 ],
+  /* 1527 */  [ 0.268311190, 16 ],
+  /* 1528 */  [ 0.268545497, 16 ],
+  /* 1529 */  [ 0.268779856, 16 ],
+  /* 1530 */  [ 0.269014265, 16 ],
+  /* 1531 */  [ 0.269248726, 16 ],
+  /* 1532 */  [ 0.269483238, 16 ],
+  /* 1533 */  [ 0.269717800, 16 ],
+  /* 1534 */  [ 0.269952414, 16 ],
+  /* 1535 */  [ 0.270187079, 16 ],
+
+  /* 1536 */  [ 0.270421794, 16 ],
+  /* 1537 */  [ 0.270656561, 16 ],
+  /* 1538 */  [ 0.270891379, 16 ],
+  /* 1539 */  [ 0.271126247, 16 ],
+  /* 1540 */  [ 0.271361166, 16 ],
+  /* 1541 */  [ 0.271596136, 16 ],
+  /* 1542 */  [ 0.271831157, 16 ],
+  /* 1543 */  [ 0.272066229, 16 ],
+  /* 1544 */  [ 0.272301352, 16 ],
+  /* 1545 */  [ 0.272536525, 16 ],
+  /* 1546 */  [ 0.272771749, 16 ],
+  /* 1547 */  [ 0.273007024, 16 ],
+  /* 1548 */  [ 0.273242350, 16 ],
+  /* 1549 */  [ 0.273477726, 16 ],
+  /* 1550 */  [ 0.273713153, 16 ],
+  /* 1551 */  [ 0.273948630, 16 ],
+
+  /* 1552 */  [ 0.274184158, 16 ],
+  /* 1553 */  [ 0.274419737, 16 ],
+  /* 1554 */  [ 0.274655366, 16 ],
+  /* 1555 */  [ 0.274891046, 16 ],
+  /* 1556 */  [ 0.275126776, 16 ],
+  /* 1557 */  [ 0.275362557, 16 ],
+  /* 1558 */  [ 0.275598389, 16 ],
+  /* 1559 */  [ 0.275834270, 16 ],
+  /* 1560 */  [ 0.276070203, 16 ],
+  /* 1561 */  [ 0.276306185, 16 ],
+  /* 1562 */  [ 0.276542218, 16 ],
+  /* 1563 */  [ 0.276778302, 16 ],
+  /* 1564 */  [ 0.277014435, 16 ],
+  /* 1565 */  [ 0.277250619, 16 ],
+  /* 1566 */  [ 0.277486854, 16 ],
+  /* 1567 */  [ 0.277723139, 16 ],
+
+  /* 1568 */  [ 0.277959474, 16 ],
+  /* 1569 */  [ 0.278195859, 16 ],
+  /* 1570 */  [ 0.278432294, 16 ],
+  /* 1571 */  [ 0.278668780, 16 ],
+  /* 1572 */  [ 0.278905316, 16 ],
+  /* 1573 */  [ 0.279141902, 16 ],
+  /* 1574 */  [ 0.279378538, 16 ],
+  /* 1575 */  [ 0.279615224, 16 ],
+  /* 1576 */  [ 0.279851960, 16 ],
+  /* 1577 */  [ 0.280088747, 16 ],
+  /* 1578 */  [ 0.280325583, 16 ],
+  /* 1579 */  [ 0.280562470, 16 ],
+  /* 1580 */  [ 0.280799406, 16 ],
+  /* 1581 */  [ 0.281036393, 16 ],
+  /* 1582 */  [ 0.281273429, 16 ],
+  /* 1583 */  [ 0.281510516, 16 ],
+
+  /* 1584 */  [ 0.281747652, 16 ],
+  /* 1585 */  [ 0.281984838, 16 ],
+  /* 1586 */  [ 0.282222075, 16 ],
+  /* 1587 */  [ 0.282459361, 16 ],
+  /* 1588 */  [ 0.282696697, 16 ],
+  /* 1589 */  [ 0.282934082, 16 ],
+  /* 1590 */  [ 0.283171518, 16 ],
+  /* 1591 */  [ 0.283409003, 16 ],
+  /* 1592 */  [ 0.283646538, 16 ],
+  /* 1593 */  [ 0.283884123, 16 ],
+  /* 1594 */  [ 0.284121757, 16 ],
+  /* 1595 */  [ 0.284359441, 16 ],
+  /* 1596 */  [ 0.284597175, 16 ],
+  /* 1597 */  [ 0.284834959, 16 ],
+  /* 1598 */  [ 0.285072792, 16 ],
+  /* 1599 */  [ 0.285310675, 16 ],
+
+  /* 1600 */  [ 0.285548607, 16 ],
+  /* 1601 */  [ 0.285786589, 16 ],
+  /* 1602 */  [ 0.286024621, 16 ],
+  /* 1603 */  [ 0.286262702, 16 ],
+  /* 1604 */  [ 0.286500832, 16 ],
+  /* 1605 */  [ 0.286739012, 16 ],
+  /* 1606 */  [ 0.286977242, 16 ],
+  /* 1607 */  [ 0.287215521, 16 ],
+  /* 1608 */  [ 0.287453849, 16 ],
+  /* 1609 */  [ 0.287692227, 16 ],
+  /* 1610 */  [ 0.287930654, 16 ],
+  /* 1611 */  [ 0.288169131, 16 ],
+  /* 1612 */  [ 0.288407657, 16 ],
+  /* 1613 */  [ 0.288646232, 16 ],
+  /* 1614 */  [ 0.288884857, 16 ],
+  /* 1615 */  [ 0.289123530, 16 ],
+
+  /* 1616 */  [ 0.289362253, 16 ],
+  /* 1617 */  [ 0.289601026, 16 ],
+  /* 1618 */  [ 0.289839847, 16 ],
+  /* 1619 */  [ 0.290078718, 16 ],
+  /* 1620 */  [ 0.290317638, 16 ],
+  /* 1621 */  [ 0.290556607, 16 ],
+  /* 1622 */  [ 0.290795626, 16 ],
+  /* 1623 */  [ 0.291034693, 16 ],
+  /* 1624 */  [ 0.291273810, 16 ],
+  /* 1625 */  [ 0.291512975, 16 ],
+  /* 1626 */  [ 0.291752190, 16 ],
+  /* 1627 */  [ 0.291991453, 16 ],
+  /* 1628 */  [ 0.292230766, 16 ],
+  /* 1629 */  [ 0.292470128, 16 ],
+  /* 1630 */  [ 0.292709539, 16 ],
+  /* 1631 */  [ 0.292948998, 16 ],
+
+  /* 1632 */  [ 0.293188507, 16 ],
+  /* 1633 */  [ 0.293428065, 16 ],
+  /* 1634 */  [ 0.293667671, 16 ],
+  /* 1635 */  [ 0.293907326, 16 ],
+  /* 1636 */  [ 0.294147031, 16 ],
+  /* 1637 */  [ 0.294386784, 16 ],
+  /* 1638 */  [ 0.294626585, 16 ],
+  /* 1639 */  [ 0.294866436, 16 ],
+  /* 1640 */  [ 0.295106336, 16 ],
+  /* 1641 */  [ 0.295346284, 16 ],
+  /* 1642 */  [ 0.295586281, 16 ],
+  /* 1643 */  [ 0.295826327, 16 ],
+  /* 1644 */  [ 0.296066421, 16 ],
+  /* 1645 */  [ 0.296306564, 16 ],
+  /* 1646 */  [ 0.296546756, 16 ],
+  /* 1647 */  [ 0.296786996, 16 ],
+
+  /* 1648 */  [ 0.297027285, 16 ],
+  /* 1649 */  [ 0.297267623, 16 ],
+  /* 1650 */  [ 0.297508009, 16 ],
+  /* 1651 */  [ 0.297748444, 16 ],
+  /* 1652 */  [ 0.297988927, 16 ],
+  /* 1653 */  [ 0.298229459, 16 ],
+  /* 1654 */  [ 0.298470039, 16 ],
+  /* 1655 */  [ 0.298710668, 16 ],
+  /* 1656 */  [ 0.298951346, 16 ],
+  /* 1657 */  [ 0.299192071, 16 ],
+  /* 1658 */  [ 0.299432846, 16 ],
+  /* 1659 */  [ 0.299673668, 16 ],
+  /* 1660 */  [ 0.299914539, 16 ],
+  /* 1661 */  [ 0.300155459, 16 ],
+  /* 1662 */  [ 0.300396426, 16 ],
+  /* 1663 */  [ 0.300637443, 16 ],
+
+  /* 1664 */  [ 0.300878507, 16 ],
+  /* 1665 */  [ 0.301119620, 16 ],
+  /* 1666 */  [ 0.301360781, 16 ],
+  /* 1667 */  [ 0.301601990, 16 ],
+  /* 1668 */  [ 0.301843247, 16 ],
+  /* 1669 */  [ 0.302084553, 16 ],
+  /* 1670 */  [ 0.302325907, 16 ],
+  /* 1671 */  [ 0.302567309, 16 ],
+  /* 1672 */  [ 0.302808759, 16 ],
+  /* 1673 */  [ 0.303050257, 16 ],
+  /* 1674 */  [ 0.303291804, 16 ],
+  /* 1675 */  [ 0.303533399, 16 ],
+  /* 1676 */  [ 0.303775041, 16 ],
+  /* 1677 */  [ 0.304016732, 16 ],
+  /* 1678 */  [ 0.304258471, 16 ],
+  /* 1679 */  [ 0.304500257, 16 ],
+
+  /* 1680 */  [ 0.304742092, 16 ],
+  /* 1681 */  [ 0.304983975, 16 ],
+  /* 1682 */  [ 0.305225906, 16 ],
+  /* 1683 */  [ 0.305467885, 16 ],
+  /* 1684 */  [ 0.305709911, 16 ],
+  /* 1685 */  [ 0.305951986, 16 ],
+  /* 1686 */  [ 0.306194108, 16 ],
+  /* 1687 */  [ 0.306436279, 16 ],
+  /* 1688 */  [ 0.306678497, 16 ],
+  /* 1689 */  [ 0.306920763, 16 ],
+  /* 1690 */  [ 0.307163077, 16 ],
+  /* 1691 */  [ 0.307405438, 16 ],
+  /* 1692 */  [ 0.307647848, 16 ],
+  /* 1693 */  [ 0.307890305, 16 ],
+  /* 1694 */  [ 0.308132810, 16 ],
+  /* 1695 */  [ 0.308375362, 16 ],
+
+  /* 1696 */  [ 0.308617963, 16 ],
+  /* 1697 */  [ 0.308860611, 16 ],
+  /* 1698 */  [ 0.309103306, 16 ],
+  /* 1699 */  [ 0.309346050, 16 ],
+  /* 1700 */  [ 0.309588841, 16 ],
+  /* 1701 */  [ 0.309831679, 16 ],
+  /* 1702 */  [ 0.310074565, 16 ],
+  /* 1703 */  [ 0.310317499, 16 ],
+  /* 1704 */  [ 0.310560480, 16 ],
+  /* 1705 */  [ 0.310803509, 16 ],
+  /* 1706 */  [ 0.311046586, 16 ],
+  /* 1707 */  [ 0.311289710, 16 ],
+  /* 1708 */  [ 0.311532881, 16 ],
+  /* 1709 */  [ 0.311776100, 16 ],
+  /* 1710 */  [ 0.312019366, 16 ],
+  /* 1711 */  [ 0.312262680, 16 ],
+
+  /* 1712 */  [ 0.312506041, 16 ],
+  /* 1713 */  [ 0.312749449, 16 ],
+  /* 1714 */  [ 0.312992905, 16 ],
+  /* 1715 */  [ 0.313236408, 16 ],
+  /* 1716 */  [ 0.313479959, 16 ],
+  /* 1717 */  [ 0.313723556, 16 ],
+  /* 1718 */  [ 0.313967202, 16 ],
+  /* 1719 */  [ 0.314210894, 16 ],
+  /* 1720 */  [ 0.314454634, 16 ],
+  /* 1721 */  [ 0.314698420, 16 ],
+  /* 1722 */  [ 0.314942255, 16 ],
+  /* 1723 */  [ 0.315186136, 16 ],
+  /* 1724 */  [ 0.315430064, 16 ],
+  /* 1725 */  [ 0.315674040, 16 ],
+  /* 1726 */  [ 0.315918063, 16 ],
+  /* 1727 */  [ 0.316162133, 16 ],
+
+  /* 1728 */  [ 0.316406250, 16 ],
+  /* 1729 */  [ 0.316650414, 16 ],
+  /* 1730 */  [ 0.316894625, 16 ],
+  /* 1731 */  [ 0.317138884, 16 ],
+  /* 1732 */  [ 0.317383189, 16 ],
+  /* 1733 */  [ 0.317627541, 16 ],
+  /* 1734 */  [ 0.317871941, 16 ],
+  /* 1735 */  [ 0.318116387, 16 ],
+  /* 1736 */  [ 0.318360880, 16 ],
+  /* 1737 */  [ 0.318605421, 16 ],
+  /* 1738 */  [ 0.318850008, 16 ],
+  /* 1739 */  [ 0.319094642, 16 ],
+  /* 1740 */  [ 0.319339323, 16 ],
+  /* 1741 */  [ 0.319584051, 16 ],
+  /* 1742 */  [ 0.319828826, 16 ],
+  /* 1743 */  [ 0.320073647, 16 ],
+
+  /* 1744 */  [ 0.320318516, 16 ],
+  /* 1745 */  [ 0.320563431, 16 ],
+  /* 1746 */  [ 0.320808393, 16 ],
+  /* 1747 */  [ 0.321053402, 16 ],
+  /* 1748 */  [ 0.321298457, 16 ],
+  /* 1749 */  [ 0.321543560, 16 ],
+  /* 1750 */  [ 0.321788709, 16 ],
+  /* 1751 */  [ 0.322033904, 16 ],
+  /* 1752 */  [ 0.322279147, 16 ],
+  /* 1753 */  [ 0.322524436, 16 ],
+  /* 1754 */  [ 0.322769771, 16 ],
+  /* 1755 */  [ 0.323015154, 16 ],
+  /* 1756 */  [ 0.323260583, 16 ],
+  /* 1757 */  [ 0.323506058, 16 ],
+  /* 1758 */  [ 0.323751580, 16 ],
+  /* 1759 */  [ 0.323997149, 16 ],
+
+  /* 1760 */  [ 0.324242764, 16 ],
+  /* 1761 */  [ 0.324488426, 16 ],
+  /* 1762 */  [ 0.324734134, 16 ],
+  /* 1763 */  [ 0.324979889, 16 ],
+  /* 1764 */  [ 0.325225690, 16 ],
+  /* 1765 */  [ 0.325471538, 16 ],
+  /* 1766 */  [ 0.325717432, 16 ],
+  /* 1767 */  [ 0.325963372, 16 ],
+  /* 1768 */  [ 0.326209359, 16 ],
+  /* 1769 */  [ 0.326455392, 16 ],
+  /* 1770 */  [ 0.326701472, 16 ],
+  /* 1771 */  [ 0.326947598, 16 ],
+  /* 1772 */  [ 0.327193770, 16 ],
+  /* 1773 */  [ 0.327439989, 16 ],
+  /* 1774 */  [ 0.327686254, 16 ],
+  /* 1775 */  [ 0.327932565, 16 ],
+
+  /* 1776 */  [ 0.328178922, 16 ],
+  /* 1777 */  [ 0.328425326, 16 ],
+  /* 1778 */  [ 0.328671776, 16 ],
+  /* 1779 */  [ 0.328918272, 16 ],
+  /* 1780 */  [ 0.329164814, 16 ],
+  /* 1781 */  [ 0.329411403, 16 ],
+  /* 1782 */  [ 0.329658038, 16 ],
+  /* 1783 */  [ 0.329904718, 16 ],
+  /* 1784 */  [ 0.330151445, 16 ],
+  /* 1785 */  [ 0.330398218, 16 ],
+  /* 1786 */  [ 0.330645037, 16 ],
+  /* 1787 */  [ 0.330891903, 16 ],
+  /* 1788 */  [ 0.331138814, 16 ],
+  /* 1789 */  [ 0.331385771, 16 ],
+  /* 1790 */  [ 0.331632774, 16 ],
+  /* 1791 */  [ 0.331879824, 16 ],
+
+  /* 1792 */  [ 0.332126919, 16 ],
+  /* 1793 */  [ 0.332374060, 16 ],
+  /* 1794 */  [ 0.332621247, 16 ],
+  /* 1795 */  [ 0.332868480, 16 ],
+  /* 1796 */  [ 0.333115759, 16 ],
+  /* 1797 */  [ 0.333363084, 16 ],
+  /* 1798 */  [ 0.333610455, 16 ],
+  /* 1799 */  [ 0.333857872, 16 ],
+  /* 1800 */  [ 0.334105334, 16 ],
+  /* 1801 */  [ 0.334352843, 16 ],
+  /* 1802 */  [ 0.334600397, 16 ],
+  /* 1803 */  [ 0.334847997, 16 ],
+  /* 1804 */  [ 0.335095642, 16 ],
+  /* 1805 */  [ 0.335343334, 16 ],
+  /* 1806 */  [ 0.335591071, 16 ],
+  /* 1807 */  [ 0.335838854, 16 ],
+
+  /* 1808 */  [ 0.336086683, 16 ],
+  /* 1809 */  [ 0.336334557, 16 ],
+  /* 1810 */  [ 0.336582477, 16 ],
+  /* 1811 */  [ 0.336830443, 16 ],
+  /* 1812 */  [ 0.337078454, 16 ],
+  /* 1813 */  [ 0.337326511, 16 ],
+  /* 1814 */  [ 0.337574614, 16 ],
+  /* 1815 */  [ 0.337822762, 16 ],
+  /* 1816 */  [ 0.338070956, 16 ],
+  /* 1817 */  [ 0.338319195, 16 ],
+  /* 1818 */  [ 0.338567480, 16 ],
+  /* 1819 */  [ 0.338815811, 16 ],
+  /* 1820 */  [ 0.339064186, 16 ],
+  /* 1821 */  [ 0.339312608, 16 ],
+  /* 1822 */  [ 0.339561075, 16 ],
+  /* 1823 */  [ 0.339809587, 16 ],
+
+  /* 1824 */  [ 0.340058145, 16 ],
+  /* 1825 */  [ 0.340306748, 16 ],
+  /* 1826 */  [ 0.340555397, 16 ],
+  /* 1827 */  [ 0.340804091, 16 ],
+  /* 1828 */  [ 0.341052830, 16 ],
+  /* 1829 */  [ 0.341301615, 16 ],
+  /* 1830 */  [ 0.341550445, 16 ],
+  /* 1831 */  [ 0.341799321, 16 ],
+  /* 1832 */  [ 0.342048241, 16 ],
+  /* 1833 */  [ 0.342297207, 16 ],
+  /* 1834 */  [ 0.342546219, 16 ],
+  /* 1835 */  [ 0.342795275, 16 ],
+  /* 1836 */  [ 0.343044377, 16 ],
+  /* 1837 */  [ 0.343293524, 16 ],
+  /* 1838 */  [ 0.343542717, 16 ],
+  /* 1839 */  [ 0.343791954, 16 ],
+
+  /* 1840 */  [ 0.344041237, 16 ],
+  /* 1841 */  [ 0.344290564, 16 ],
+  /* 1842 */  [ 0.344539937, 16 ],
+  /* 1843 */  [ 0.344789356, 16 ],
+  /* 1844 */  [ 0.345038819, 16 ],
+  /* 1845 */  [ 0.345288327, 16 ],
+  /* 1846 */  [ 0.345537880, 16 ],
+  /* 1847 */  [ 0.345787479, 16 ],
+  /* 1848 */  [ 0.346037122, 16 ],
+  /* 1849 */  [ 0.346286811, 16 ],
+  /* 1850 */  [ 0.346536545, 16 ],
+  /* 1851 */  [ 0.346786323, 16 ],
+  /* 1852 */  [ 0.347036147, 16 ],
+  /* 1853 */  [ 0.347286015, 16 ],
+  /* 1854 */  [ 0.347535929, 16 ],
+  /* 1855 */  [ 0.347785887, 16 ],
+
+  /* 1856 */  [ 0.348035890, 16 ],
+  /* 1857 */  [ 0.348285939, 16 ],
+  /* 1858 */  [ 0.348536032, 16 ],
+  /* 1859 */  [ 0.348786170, 16 ],
+  /* 1860 */  [ 0.349036353, 16 ],
+  /* 1861 */  [ 0.349286580, 16 ],
+  /* 1862 */  [ 0.349536853, 16 ],
+  /* 1863 */  [ 0.349787170, 16 ],
+  /* 1864 */  [ 0.350037532, 16 ],
+  /* 1865 */  [ 0.350287939, 16 ],
+  /* 1866 */  [ 0.350538391, 16 ],
+  /* 1867 */  [ 0.350788887, 16 ],
+  /* 1868 */  [ 0.351039428, 16 ],
+  /* 1869 */  [ 0.351290014, 16 ],
+  /* 1870 */  [ 0.351540645, 16 ],
+  /* 1871 */  [ 0.351791320, 16 ],
+
+  /* 1872 */  [ 0.352042040, 16 ],
+  /* 1873 */  [ 0.352292804, 16 ],
+  /* 1874 */  [ 0.352543613, 16 ],
+  /* 1875 */  [ 0.352794467, 16 ],
+  /* 1876 */  [ 0.353045365, 16 ],
+  /* 1877 */  [ 0.353296308, 16 ],
+  /* 1878 */  [ 0.353547296, 16 ],
+  /* 1879 */  [ 0.353798328, 16 ],
+  /* 1880 */  [ 0.354049405, 16 ],
+  /* 1881 */  [ 0.354300526, 16 ],
+  /* 1882 */  [ 0.354551691, 16 ],
+  /* 1883 */  [ 0.354802901, 16 ],
+  /* 1884 */  [ 0.355054156, 16 ],
+  /* 1885 */  [ 0.355305455, 16 ],
+  /* 1886 */  [ 0.355556799, 16 ],
+  /* 1887 */  [ 0.355808187, 16 ],
+
+  /* 1888 */  [ 0.356059619, 16 ],
+  /* 1889 */  [ 0.356311096, 16 ],
+  /* 1890 */  [ 0.356562617, 16 ],
+  /* 1891 */  [ 0.356814182, 16 ],
+  /* 1892 */  [ 0.357065792, 16 ],
+  /* 1893 */  [ 0.357317446, 16 ],
+  /* 1894 */  [ 0.357569145, 16 ],
+  /* 1895 */  [ 0.357820887, 16 ],
+  /* 1896 */  [ 0.358072674, 16 ],
+  /* 1897 */  [ 0.358324506, 16 ],
+  /* 1898 */  [ 0.358576381, 16 ],
+  /* 1899 */  [ 0.358828301, 16 ],
+  /* 1900 */  [ 0.359080265, 16 ],
+  /* 1901 */  [ 0.359332273, 16 ],
+  /* 1902 */  [ 0.359584326, 16 ],
+  /* 1903 */  [ 0.359836423, 16 ],
+
+  /* 1904 */  [ 0.360088563, 16 ],
+  /* 1905 */  [ 0.360340748, 16 ],
+  /* 1906 */  [ 0.360592977, 16 ],
+  /* 1907 */  [ 0.360845251, 16 ],
+  /* 1908 */  [ 0.361097568, 16 ],
+  /* 1909 */  [ 0.361349929, 16 ],
+  /* 1910 */  [ 0.361602335, 16 ],
+  /* 1911 */  [ 0.361854784, 16 ],
+  /* 1912 */  [ 0.362107278, 16 ],
+  /* 1913 */  [ 0.362359815, 16 ],
+  /* 1914 */  [ 0.362612397, 16 ],
+  /* 1915 */  [ 0.362865022, 16 ],
+  /* 1916 */  [ 0.363117692, 16 ],
+  /* 1917 */  [ 0.363370405, 16 ],
+  /* 1918 */  [ 0.363623163, 16 ],
+  /* 1919 */  [ 0.363875964, 16 ],
+
+  /* 1920 */  [ 0.364128809, 16 ],
+  /* 1921 */  [ 0.364381698, 16 ],
+  /* 1922 */  [ 0.364634632, 16 ],
+  /* 1923 */  [ 0.364887608, 16 ],
+  /* 1924 */  [ 0.365140629, 16 ],
+  /* 1925 */  [ 0.365393694, 16 ],
+  /* 1926 */  [ 0.365646802, 16 ],
+  /* 1927 */  [ 0.365899955, 16 ],
+  /* 1928 */  [ 0.366153151, 16 ],
+  /* 1929 */  [ 0.366406390, 16 ],
+  /* 1930 */  [ 0.366659674, 16 ],
+  /* 1931 */  [ 0.366913001, 16 ],
+  /* 1932 */  [ 0.367166372, 16 ],
+  /* 1933 */  [ 0.367419787, 16 ],
+  /* 1934 */  [ 0.367673246, 16 ],
+  /* 1935 */  [ 0.367926748, 16 ],
+
+  /* 1936 */  [ 0.368180294, 16 ],
+  /* 1937 */  [ 0.368433883, 16 ],
+  /* 1938 */  [ 0.368687517, 16 ],
+  /* 1939 */  [ 0.368941193, 16 ],
+  /* 1940 */  [ 0.369194914, 16 ],
+  /* 1941 */  [ 0.369448678, 16 ],
+  /* 1942 */  [ 0.369702485, 16 ],
+  /* 1943 */  [ 0.369956336, 16 ],
+  /* 1944 */  [ 0.370210231, 16 ],
+  /* 1945 */  [ 0.370464169, 16 ],
+  /* 1946 */  [ 0.370718151, 16 ],
+  /* 1947 */  [ 0.370972177, 16 ],
+  /* 1948 */  [ 0.371226245, 16 ],
+  /* 1949 */  [ 0.371480358, 16 ],
+  /* 1950 */  [ 0.371734513, 16 ],
+  /* 1951 */  [ 0.371988712, 16 ],
+
+  /* 1952 */  [ 0.372242955, 16 ],
+  /* 1953 */  [ 0.372497241, 16 ],
+  /* 1954 */  [ 0.372751570, 16 ],
+  /* 1955 */  [ 0.373005943, 16 ],
+  /* 1956 */  [ 0.373260359, 16 ],
+  /* 1957 */  [ 0.373514819, 16 ],
+  /* 1958 */  [ 0.373769322, 16 ],
+  /* 1959 */  [ 0.374023868, 16 ],
+  /* 1960 */  [ 0.374278458, 16 ],
+  /* 1961 */  [ 0.374533091, 16 ],
+  /* 1962 */  [ 0.374787767, 16 ],
+  /* 1963 */  [ 0.375042486, 16 ],
+  /* 1964 */  [ 0.375297249, 16 ],
+  /* 1965 */  [ 0.375552055, 16 ],
+  /* 1966 */  [ 0.375806904, 16 ],
+  /* 1967 */  [ 0.376061796, 16 ],
+
+  /* 1968 */  [ 0.376316732, 16 ],
+  /* 1969 */  [ 0.376571710, 16 ],
+  /* 1970 */  [ 0.376826732, 16 ],
+  /* 1971 */  [ 0.377081797, 16 ],
+  /* 1972 */  [ 0.377336905, 16 ],
+  /* 1973 */  [ 0.377592057, 16 ],
+  /* 1974 */  [ 0.377847251, 16 ],
+  /* 1975 */  [ 0.378102489, 16 ],
+  /* 1976 */  [ 0.378357769, 16 ],
+  /* 1977 */  [ 0.378613093, 16 ],
+  /* 1978 */  [ 0.378868460, 16 ],
+  /* 1979 */  [ 0.379123870, 16 ],
+  /* 1980 */  [ 0.379379322, 16 ],
+  /* 1981 */  [ 0.379634818, 16 ],
+  /* 1982 */  [ 0.379890357, 16 ],
+  /* 1983 */  [ 0.380145939, 16 ],
+
+  /* 1984 */  [ 0.380401563, 16 ],
+  /* 1985 */  [ 0.380657231, 16 ],
+  /* 1986 */  [ 0.380912942, 16 ],
+  /* 1987 */  [ 0.381168695, 16 ],
+  /* 1988 */  [ 0.381424492, 16 ],
+  /* 1989 */  [ 0.381680331, 16 ],
+  /* 1990 */  [ 0.381936213, 16 ],
+  /* 1991 */  [ 0.382192138, 16 ],
+  /* 1992 */  [ 0.382448106, 16 ],
+  /* 1993 */  [ 0.382704117, 16 ],
+  /* 1994 */  [ 0.382960171, 16 ],
+  /* 1995 */  [ 0.383216267, 16 ],
+  /* 1996 */  [ 0.383472406, 16 ],
+  /* 1997 */  [ 0.383728588, 16 ],
+  /* 1998 */  [ 0.383984813, 16 ],
+  /* 1999 */  [ 0.384241080, 16 ],
+
+  /* 2000 */  [ 0.384497391, 16 ],
+  /* 2001 */  [ 0.384753744, 16 ],
+  /* 2002 */  [ 0.385010139, 16 ],
+  /* 2003 */  [ 0.385266578, 16 ],
+  /* 2004 */  [ 0.385523059, 16 ],
+  /* 2005 */  [ 0.385779582, 16 ],
+  /* 2006 */  [ 0.386036149, 16 ],
+  /* 2007 */  [ 0.386292758, 16 ],
+  /* 2008 */  [ 0.386549409, 16 ],
+  /* 2009 */  [ 0.386806104, 16 ],
+  /* 2010 */  [ 0.387062840, 16 ],
+  /* 2011 */  [ 0.387319620, 16 ],
+  /* 2012 */  [ 0.387576442, 16 ],
+  /* 2013 */  [ 0.387833306, 16 ],
+  /* 2014 */  [ 0.388090213, 16 ],
+  /* 2015 */  [ 0.388347163, 16 ],
+
+  /* 2016 */  [ 0.388604155, 16 ],
+  /* 2017 */  [ 0.388861190, 16 ],
+  /* 2018 */  [ 0.389118267, 16 ],
+  /* 2019 */  [ 0.389375386, 16 ],
+  /* 2020 */  [ 0.389632548, 16 ],
+  /* 2021 */  [ 0.389889752, 16 ],
+  /* 2022 */  [ 0.390146999, 16 ],
+  /* 2023 */  [ 0.390404289, 16 ],
+  /* 2024 */  [ 0.390661620, 16 ],
+  /* 2025 */  [ 0.390918994, 16 ],
+  /* 2026 */  [ 0.391176411, 16 ],
+  /* 2027 */  [ 0.391433869, 16 ],
+  /* 2028 */  [ 0.391691371, 16 ],
+  /* 2029 */  [ 0.391948914, 16 ],
+  /* 2030 */  [ 0.392206500, 16 ],
+  /* 2031 */  [ 0.392464128, 16 ],
+
+  /* 2032 */  [ 0.392721798, 16 ],
+  /* 2033 */  [ 0.392979511, 16 ],
+  /* 2034 */  [ 0.393237266, 16 ],
+  /* 2035 */  [ 0.393495063, 16 ],
+  /* 2036 */  [ 0.393752902, 16 ],
+  /* 2037 */  [ 0.394010784, 16 ],
+  /* 2038 */  [ 0.394268707, 16 ],
+  /* 2039 */  [ 0.394526673, 16 ],
+  /* 2040 */  [ 0.394784681, 16 ],
+  /* 2041 */  [ 0.395042732, 16 ],
+  /* 2042 */  [ 0.395300824, 16 ],
+  /* 2043 */  [ 0.395558959, 16 ],
+  /* 2044 */  [ 0.395817135, 16 ],
+  /* 2045 */  [ 0.396075354, 16 ],
+  /* 2046 */  [ 0.396333615, 16 ],
+  /* 2047 */  [ 0.396591918, 16 ],
+
+  /* 2048 */  [ 0.396850263, 16 ],
+  /* 2049 */  [ 0.397108650, 16 ],
+  /* 2050 */  [ 0.397367079, 16 ],
+  /* 2051 */  [ 0.397625550, 16 ],
+  /* 2052 */  [ 0.397884063, 16 ],
+  /* 2053 */  [ 0.398142619, 16 ],
+  /* 2054 */  [ 0.398401216, 16 ],
+  /* 2055 */  [ 0.398659855, 16 ],
+  /* 2056 */  [ 0.398918536, 16 ],
+  /* 2057 */  [ 0.399177259, 16 ],
+  /* 2058 */  [ 0.399436024, 16 ],
+  /* 2059 */  [ 0.399694831, 16 ],
+  /* 2060 */  [ 0.399953679, 16 ],
+  /* 2061 */  [ 0.400212570, 16 ],
+  /* 2062 */  [ 0.400471503, 16 ],
+  /* 2063 */  [ 0.400730477, 16 ],
+
+  /* 2064 */  [ 0.400989493, 16 ],
+  /* 2065 */  [ 0.401248551, 16 ],
+  /* 2066 */  [ 0.401507651, 16 ],
+  /* 2067 */  [ 0.401766793, 16 ],
+  /* 2068 */  [ 0.402025976, 16 ],
+  /* 2069 */  [ 0.402285202, 16 ],
+  /* 2070 */  [ 0.402544469, 16 ],
+  /* 2071 */  [ 0.402803777, 16 ],
+  /* 2072 */  [ 0.403063128, 16 ],
+  /* 2073 */  [ 0.403322520, 16 ],
+  /* 2074 */  [ 0.403581954, 16 ],
+  /* 2075 */  [ 0.403841430, 16 ],
+  /* 2076 */  [ 0.404100947, 16 ],
+  /* 2077 */  [ 0.404360506, 16 ],
+  /* 2078 */  [ 0.404620107, 16 ],
+  /* 2079 */  [ 0.404879749, 16 ],
+
+  /* 2080 */  [ 0.405139433, 16 ],
+  /* 2081 */  [ 0.405399159, 16 ],
+  /* 2082 */  [ 0.405658926, 16 ],
+  /* 2083 */  [ 0.405918735, 16 ],
+  /* 2084 */  [ 0.406178585, 16 ],
+  /* 2085 */  [ 0.406438477, 16 ],
+  /* 2086 */  [ 0.406698410, 16 ],
+  /* 2087 */  [ 0.406958385, 16 ],
+  /* 2088 */  [ 0.407218402, 16 ],
+  /* 2089 */  [ 0.407478460, 16 ],
+  /* 2090 */  [ 0.407738559, 16 ],
+  /* 2091 */  [ 0.407998700, 16 ],
+  /* 2092 */  [ 0.408258883, 16 ],
+  /* 2093 */  [ 0.408519107, 16 ],
+  /* 2094 */  [ 0.408779372, 16 ],
+  /* 2095 */  [ 0.409039679, 16 ],
+
+  /* 2096 */  [ 0.409300027, 16 ],
+  /* 2097 */  [ 0.409560417, 16 ],
+  /* 2098 */  [ 0.409820848, 16 ],
+  /* 2099 */  [ 0.410081321, 16 ],
+  /* 2100 */  [ 0.410341834, 16 ],
+  /* 2101 */  [ 0.410602390, 16 ],
+  /* 2102 */  [ 0.410862986, 16 ],
+  /* 2103 */  [ 0.411123624, 16 ],
+  /* 2104 */  [ 0.411384303, 16 ],
+  /* 2105 */  [ 0.411645024, 16 ],
+  /* 2106 */  [ 0.411905785, 16 ],
+  /* 2107 */  [ 0.412166588, 16 ],
+  /* 2108 */  [ 0.412427433, 16 ],
+  /* 2109 */  [ 0.412688318, 16 ],
+  /* 2110 */  [ 0.412949245, 16 ],
+  /* 2111 */  [ 0.413210213, 16 ],
+
+  /* 2112 */  [ 0.413471222, 16 ],
+  /* 2113 */  [ 0.413732273, 16 ],
+  /* 2114 */  [ 0.413993364, 16 ],
+  /* 2115 */  [ 0.414254497, 16 ],
+  /* 2116 */  [ 0.414515671, 16 ],
+  /* 2117 */  [ 0.414776886, 16 ],
+  /* 2118 */  [ 0.415038142, 16 ],
+  /* 2119 */  [ 0.415299440, 16 ],
+  /* 2120 */  [ 0.415560778, 16 ],
+  /* 2121 */  [ 0.415822157, 16 ],
+  /* 2122 */  [ 0.416083578, 16 ],
+  /* 2123 */  [ 0.416345040, 16 ],
+  /* 2124 */  [ 0.416606542, 16 ],
+  /* 2125 */  [ 0.416868086, 16 ],
+  /* 2126 */  [ 0.417129671, 16 ],
+  /* 2127 */  [ 0.417391297, 16 ],
+
+  /* 2128 */  [ 0.417652964, 16 ],
+  /* 2129 */  [ 0.417914672, 16 ],
+  /* 2130 */  [ 0.418176420, 16 ],
+  /* 2131 */  [ 0.418438210, 16 ],
+  /* 2132 */  [ 0.418700041, 16 ],
+  /* 2133 */  [ 0.418961912, 16 ],
+  /* 2134 */  [ 0.419223825, 16 ],
+  /* 2135 */  [ 0.419485778, 16 ],
+  /* 2136 */  [ 0.419747773, 16 ],
+  /* 2137 */  [ 0.420009808, 16 ],
+  /* 2138 */  [ 0.420271884, 16 ],
+  /* 2139 */  [ 0.420534001, 16 ],
+  /* 2140 */  [ 0.420796159, 16 ],
+  /* 2141 */  [ 0.421058358, 16 ],
+  /* 2142 */  [ 0.421320597, 16 ],
+  /* 2143 */  [ 0.421582878, 16 ],
+
+  /* 2144 */  [ 0.421845199, 16 ],
+  /* 2145 */  [ 0.422107561, 16 ],
+  /* 2146 */  [ 0.422369964, 16 ],
+  /* 2147 */  [ 0.422632407, 16 ],
+  /* 2148 */  [ 0.422894891, 16 ],
+  /* 2149 */  [ 0.423157416, 16 ],
+  /* 2150 */  [ 0.423419982, 16 ],
+  /* 2151 */  [ 0.423682588, 16 ],
+  /* 2152 */  [ 0.423945235, 16 ],
+  /* 2153 */  [ 0.424207923, 16 ],
+  /* 2154 */  [ 0.424470652, 16 ],
+  /* 2155 */  [ 0.424733421, 16 ],
+  /* 2156 */  [ 0.424996230, 16 ],
+  /* 2157 */  [ 0.425259081, 16 ],
+  /* 2158 */  [ 0.425521972, 16 ],
+  /* 2159 */  [ 0.425784903, 16 ],
+
+  /* 2160 */  [ 0.426047876, 16 ],
+  /* 2161 */  [ 0.426310889, 16 ],
+  /* 2162 */  [ 0.426573942, 16 ],
+  /* 2163 */  [ 0.426837036, 16 ],
+  /* 2164 */  [ 0.427100170, 16 ],
+  /* 2165 */  [ 0.427363345, 16 ],
+  /* 2166 */  [ 0.427626561, 16 ],
+  /* 2167 */  [ 0.427889817, 16 ],
+  /* 2168 */  [ 0.428153114, 16 ],
+  /* 2169 */  [ 0.428416451, 16 ],
+  /* 2170 */  [ 0.428679828, 16 ],
+  /* 2171 */  [ 0.428943246, 16 ],
+  /* 2172 */  [ 0.429206704, 16 ],
+  /* 2173 */  [ 0.429470203, 16 ],
+  /* 2174 */  [ 0.429733743, 16 ],
+  /* 2175 */  [ 0.429997322, 16 ],
+
+  /* 2176 */  [ 0.430260942, 16 ],
+  /* 2177 */  [ 0.430524603, 16 ],
+  /* 2178 */  [ 0.430788304, 16 ],
+  /* 2179 */  [ 0.431052045, 16 ],
+  /* 2180 */  [ 0.431315826, 16 ],
+  /* 2181 */  [ 0.431579648, 16 ],
+  /* 2182 */  [ 0.431843511, 16 ],
+  /* 2183 */  [ 0.432107413, 16 ],
+  /* 2184 */  [ 0.432371356, 16 ],
+  /* 2185 */  [ 0.432635339, 16 ],
+  /* 2186 */  [ 0.432899362, 16 ],
+  /* 2187 */  [ 0.433163426, 16 ],
+  /* 2188 */  [ 0.433427530, 16 ],
+  /* 2189 */  [ 0.433691674, 16 ],
+  /* 2190 */  [ 0.433955859, 16 ],
+  /* 2191 */  [ 0.434220083, 16 ],
+
+  /* 2192 */  [ 0.434484348, 16 ],
+  /* 2193 */  [ 0.434748653, 16 ],
+  /* 2194 */  [ 0.435012998, 16 ],
+  /* 2195 */  [ 0.435277383, 16 ],
+  /* 2196 */  [ 0.435541809, 16 ],
+  /* 2197 */  [ 0.435806274, 16 ],
+  /* 2198 */  [ 0.436070780, 16 ],
+  /* 2199 */  [ 0.436335326, 16 ],
+  /* 2200 */  [ 0.436599912, 16 ],
+  /* 2201 */  [ 0.436864538, 16 ],
+  /* 2202 */  [ 0.437129204, 16 ],
+  /* 2203 */  [ 0.437393910, 16 ],
+  /* 2204 */  [ 0.437658657, 16 ],
+  /* 2205 */  [ 0.437923443, 16 ],
+  /* 2206 */  [ 0.438188269, 16 ],
+  /* 2207 */  [ 0.438453136, 16 ],
+
+  /* 2208 */  [ 0.438718042, 16 ],
+  /* 2209 */  [ 0.438982988, 16 ],
+  /* 2210 */  [ 0.439247975, 16 ],
+  /* 2211 */  [ 0.439513001, 16 ],
+  /* 2212 */  [ 0.439778067, 16 ],
+  /* 2213 */  [ 0.440043173, 16 ],
+  /* 2214 */  [ 0.440308320, 16 ],
+  /* 2215 */  [ 0.440573506, 16 ],
+  /* 2216 */  [ 0.440838732, 16 ],
+  /* 2217 */  [ 0.441103997, 16 ],
+  /* 2218 */  [ 0.441369303, 16 ],
+  /* 2219 */  [ 0.441634649, 16 ],
+  /* 2220 */  [ 0.441900034, 16 ],
+  /* 2221 */  [ 0.442165460, 16 ],
+  /* 2222 */  [ 0.442430925, 16 ],
+  /* 2223 */  [ 0.442696430, 16 ],
+
+  /* 2224 */  [ 0.442961975, 16 ],
+  /* 2225 */  [ 0.443227559, 16 ],
+  /* 2226 */  [ 0.443493184, 16 ],
+  /* 2227 */  [ 0.443758848, 16 ],
+  /* 2228 */  [ 0.444024552, 16 ],
+  /* 2229 */  [ 0.444290296, 16 ],
+  /* 2230 */  [ 0.444556079, 16 ],
+  /* 2231 */  [ 0.444821902, 16 ],
+  /* 2232 */  [ 0.445087765, 16 ],
+  /* 2233 */  [ 0.445353668, 16 ],
+  /* 2234 */  [ 0.445619610, 16 ],
+  /* 2235 */  [ 0.445885592, 16 ],
+  /* 2236 */  [ 0.446151614, 16 ],
+  /* 2237 */  [ 0.446417675, 16 ],
+  /* 2238 */  [ 0.446683776, 16 ],
+  /* 2239 */  [ 0.446949917, 16 ],
+
+  /* 2240 */  [ 0.447216097, 16 ],
+  /* 2241 */  [ 0.447482317, 16 ],
+  /* 2242 */  [ 0.447748576, 16 ],
+  /* 2243 */  [ 0.448014875, 16 ],
+  /* 2244 */  [ 0.448281214, 16 ],
+  /* 2245 */  [ 0.448547592, 16 ],
+  /* 2246 */  [ 0.448814010, 16 ],
+  /* 2247 */  [ 0.449080467, 16 ],
+  /* 2248 */  [ 0.449346964, 16 ],
+  /* 2249 */  [ 0.449613501, 16 ],
+  /* 2250 */  [ 0.449880076, 16 ],
+  /* 2251 */  [ 0.450146692, 16 ],
+  /* 2252 */  [ 0.450413347, 16 ],
+  /* 2253 */  [ 0.450680041, 16 ],
+  /* 2254 */  [ 0.450946775, 16 ],
+  /* 2255 */  [ 0.451213548, 16 ],
+
+  /* 2256 */  [ 0.451480360, 16 ],
+  /* 2257 */  [ 0.451747213, 16 ],
+  /* 2258 */  [ 0.452014104, 16 ],
+  /* 2259 */  [ 0.452281035, 16 ],
+  /* 2260 */  [ 0.452548005, 16 ],
+  /* 2261 */  [ 0.452815015, 16 ],
+  /* 2262 */  [ 0.453082064, 16 ],
+  /* 2263 */  [ 0.453349152, 16 ],
+  /* 2264 */  [ 0.453616280, 16 ],
+  /* 2265 */  [ 0.453883447, 16 ],
+  /* 2266 */  [ 0.454150653, 16 ],
+  /* 2267 */  [ 0.454417899, 16 ],
+  /* 2268 */  [ 0.454685184, 16 ],
+  /* 2269 */  [ 0.454952508, 16 ],
+  /* 2270 */  [ 0.455219872, 16 ],
+  /* 2271 */  [ 0.455487275, 16 ],
+
+  /* 2272 */  [ 0.455754717, 16 ],
+  /* 2273 */  [ 0.456022198, 16 ],
+  /* 2274 */  [ 0.456289719, 16 ],
+  /* 2275 */  [ 0.456557278, 16 ],
+  /* 2276 */  [ 0.456824877, 16 ],
+  /* 2277 */  [ 0.457092516, 16 ],
+  /* 2278 */  [ 0.457360193, 16 ],
+  /* 2279 */  [ 0.457627909, 16 ],
+  /* 2280 */  [ 0.457895665, 16 ],
+  /* 2281 */  [ 0.458163460, 16 ],
+  /* 2282 */  [ 0.458431294, 16 ],
+  /* 2283 */  [ 0.458699167, 16 ],
+  /* 2284 */  [ 0.458967079, 16 ],
+  /* 2285 */  [ 0.459235030, 16 ],
+  /* 2286 */  [ 0.459503021, 16 ],
+  /* 2287 */  [ 0.459771050, 16 ],
+
+  /* 2288 */  [ 0.460039119, 16 ],
+  /* 2289 */  [ 0.460307226, 16 ],
+  /* 2290 */  [ 0.460575373, 16 ],
+  /* 2291 */  [ 0.460843559, 16 ],
+  /* 2292 */  [ 0.461111783, 16 ],
+  /* 2293 */  [ 0.461380047, 16 ],
+  /* 2294 */  [ 0.461648350, 16 ],
+  /* 2295 */  [ 0.461916691, 16 ],
+  /* 2296 */  [ 0.462185072, 16 ],
+  /* 2297 */  [ 0.462453492, 16 ],
+  /* 2298 */  [ 0.462721950, 16 ],
+  /* 2299 */  [ 0.462990448, 16 ],
+  /* 2300 */  [ 0.463258984, 16 ],
+  /* 2301 */  [ 0.463527560, 16 ],
+  /* 2302 */  [ 0.463796174, 16 ],
+  /* 2303 */  [ 0.464064827, 16 ],
+
+  /* 2304 */  [ 0.464333519, 16 ],
+  /* 2305 */  [ 0.464602250, 16 ],
+  /* 2306 */  [ 0.464871020, 16 ],
+  /* 2307 */  [ 0.465139829, 16 ],
+  /* 2308 */  [ 0.465408676, 16 ],
+  /* 2309 */  [ 0.465677563, 16 ],
+  /* 2310 */  [ 0.465946488, 16 ],
+  /* 2311 */  [ 0.466215452, 16 ],
+  /* 2312 */  [ 0.466484455, 16 ],
+  /* 2313 */  [ 0.466753496, 16 ],
+  /* 2314 */  [ 0.467022577, 16 ],
+  /* 2315 */  [ 0.467291696, 16 ],
+  /* 2316 */  [ 0.467560854, 16 ],
+  /* 2317 */  [ 0.467830050, 16 ],
+  /* 2318 */  [ 0.468099285, 16 ],
+  /* 2319 */  [ 0.468368560, 16 ],
+
+  /* 2320 */  [ 0.468637872, 16 ],
+  /* 2321 */  [ 0.468907224, 16 ],
+  /* 2322 */  [ 0.469176614, 16 ],
+  /* 2323 */  [ 0.469446043, 16 ],
+  /* 2324 */  [ 0.469715510, 16 ],
+  /* 2325 */  [ 0.469985016, 16 ],
+  /* 2326 */  [ 0.470254561, 16 ],
+  /* 2327 */  [ 0.470524145, 16 ],
+  /* 2328 */  [ 0.470793767, 16 ],
+  /* 2329 */  [ 0.471063427, 16 ],
+  /* 2330 */  [ 0.471333126, 16 ],
+  /* 2331 */  [ 0.471602864, 16 ],
+  /* 2332 */  [ 0.471872641, 16 ],
+  /* 2333 */  [ 0.472142456, 16 ],
+  /* 2334 */  [ 0.472412309, 16 ],
+  /* 2335 */  [ 0.472682201, 16 ],
+
+  /* 2336 */  [ 0.472952132, 16 ],
+  /* 2337 */  [ 0.473222101, 16 ],
+  /* 2338 */  [ 0.473492108, 16 ],
+  /* 2339 */  [ 0.473762155, 16 ],
+  /* 2340 */  [ 0.474032239, 16 ],
+  /* 2341 */  [ 0.474302362, 16 ],
+  /* 2342 */  [ 0.474572524, 16 ],
+  /* 2343 */  [ 0.474842724, 16 ],
+  /* 2344 */  [ 0.475112962, 16 ],
+  /* 2345 */  [ 0.475383239, 16 ],
+  /* 2346 */  [ 0.475653554, 16 ],
+  /* 2347 */  [ 0.475923908, 16 ],
+  /* 2348 */  [ 0.476194300, 16 ],
+  /* 2349 */  [ 0.476464731, 16 ],
+  /* 2350 */  [ 0.476735200, 16 ],
+  /* 2351 */  [ 0.477005707, 16 ],
+
+  /* 2352 */  [ 0.477276252, 16 ],
+  /* 2353 */  [ 0.477546836, 16 ],
+  /* 2354 */  [ 0.477817459, 16 ],
+  /* 2355 */  [ 0.478088119, 16 ],
+  /* 2356 */  [ 0.478358818, 16 ],
+  /* 2357 */  [ 0.478629555, 16 ],
+  /* 2358 */  [ 0.478900331, 16 ],
+  /* 2359 */  [ 0.479171145, 16 ],
+  /* 2360 */  [ 0.479441997, 16 ],
+  /* 2361 */  [ 0.479712887, 16 ],
+  /* 2362 */  [ 0.479983816, 16 ],
+  /* 2363 */  [ 0.480254782, 16 ],
+  /* 2364 */  [ 0.480525787, 16 ],
+  /* 2365 */  [ 0.480796831, 16 ],
+  /* 2366 */  [ 0.481067912, 16 ],
+  /* 2367 */  [ 0.481339032, 16 ],
+
+  /* 2368 */  [ 0.481610189, 16 ],
+  /* 2369 */  [ 0.481881385, 16 ],
+  /* 2370 */  [ 0.482152620, 16 ],
+  /* 2371 */  [ 0.482423892, 16 ],
+  /* 2372 */  [ 0.482695202, 16 ],
+  /* 2373 */  [ 0.482966551, 16 ],
+  /* 2374 */  [ 0.483237938, 16 ],
+  /* 2375 */  [ 0.483509362, 16 ],
+  /* 2376 */  [ 0.483780825, 16 ],
+  /* 2377 */  [ 0.484052326, 16 ],
+  /* 2378 */  [ 0.484323865, 16 ],
+  /* 2379 */  [ 0.484595443, 16 ],
+  /* 2380 */  [ 0.484867058, 16 ],
+  /* 2381 */  [ 0.485138711, 16 ],
+  /* 2382 */  [ 0.485410402, 16 ],
+  /* 2383 */  [ 0.485682131, 16 ],
+
+  /* 2384 */  [ 0.485953899, 16 ],
+  /* 2385 */  [ 0.486225704, 16 ],
+  /* 2386 */  [ 0.486497547, 16 ],
+  /* 2387 */  [ 0.486769429, 16 ],
+  /* 2388 */  [ 0.487041348, 16 ],
+  /* 2389 */  [ 0.487313305, 16 ],
+  /* 2390 */  [ 0.487585300, 16 ],
+  /* 2391 */  [ 0.487857333, 16 ],
+  /* 2392 */  [ 0.488129404, 16 ],
+  /* 2393 */  [ 0.488401513, 16 ],
+  /* 2394 */  [ 0.488673660, 16 ],
+  /* 2395 */  [ 0.488945845, 16 ],
+  /* 2396 */  [ 0.489218067, 16 ],
+  /* 2397 */  [ 0.489490328, 16 ],
+  /* 2398 */  [ 0.489762626, 16 ],
+  /* 2399 */  [ 0.490034962, 16 ],
+
+  /* 2400 */  [ 0.490307336, 16 ],
+  /* 2401 */  [ 0.490579748, 16 ],
+  /* 2402 */  [ 0.490852198, 16 ],
+  /* 2403 */  [ 0.491124686, 16 ],
+  /* 2404 */  [ 0.491397211, 16 ],
+  /* 2405 */  [ 0.491669774, 16 ],
+  /* 2406 */  [ 0.491942375, 16 ],
+  /* 2407 */  [ 0.492215014, 16 ],
+  /* 2408 */  [ 0.492487690, 16 ],
+  /* 2409 */  [ 0.492760404, 16 ],
+  /* 2410 */  [ 0.493033156, 16 ],
+  /* 2411 */  [ 0.493305946, 16 ],
+  /* 2412 */  [ 0.493578773, 16 ],
+  /* 2413 */  [ 0.493851638, 16 ],
+  /* 2414 */  [ 0.494124541, 16 ],
+  /* 2415 */  [ 0.494397481, 16 ],
+
+  /* 2416 */  [ 0.494670459, 16 ],
+  /* 2417 */  [ 0.494943475, 16 ],
+  /* 2418 */  [ 0.495216529, 16 ],
+  /* 2419 */  [ 0.495489620, 16 ],
+  /* 2420 */  [ 0.495762748, 16 ],
+  /* 2421 */  [ 0.496035915, 16 ],
+  /* 2422 */  [ 0.496309119, 16 ],
+  /* 2423 */  [ 0.496582360, 16 ],
+  /* 2424 */  [ 0.496855639, 16 ],
+  /* 2425 */  [ 0.497128956, 16 ],
+  /* 2426 */  [ 0.497402310, 16 ],
+  /* 2427 */  [ 0.497675702, 16 ],
+  /* 2428 */  [ 0.497949132, 16 ],
+  /* 2429 */  [ 0.498222598, 16 ],
+  /* 2430 */  [ 0.498496103, 16 ],
+  /* 2431 */  [ 0.498769645, 16 ],
+
+  /* 2432 */  [ 0.499043224, 16 ],
+  /* 2433 */  [ 0.499316841, 16 ],
+  /* 2434 */  [ 0.499590496, 16 ],
+  /* 2435 */  [ 0.499864188, 16 ],
+  /* 2436 */  [ 0.250068959, 17 ],
+  /* 2437 */  [ 0.250205842, 17 ],
+  /* 2438 */  [ 0.250342744, 17 ],
+  /* 2439 */  [ 0.250479665, 17 ],
+  /* 2440 */  [ 0.250616605, 17 ],
+  /* 2441 */  [ 0.250753563, 17 ],
+  /* 2442 */  [ 0.250890540, 17 ],
+  /* 2443 */  [ 0.251027536, 17 ],
+  /* 2444 */  [ 0.251164550, 17 ],
+  /* 2445 */  [ 0.251301583, 17 ],
+  /* 2446 */  [ 0.251438635, 17 ],
+  /* 2447 */  [ 0.251575706, 17 ],
+
+  /* 2448 */  [ 0.251712795, 17 ],
+  /* 2449 */  [ 0.251849903, 17 ],
+  /* 2450 */  [ 0.251987029, 17 ],
+  /* 2451 */  [ 0.252124174, 17 ],
+  /* 2452 */  [ 0.252261338, 17 ],
+  /* 2453 */  [ 0.252398520, 17 ],
+  /* 2454 */  [ 0.252535721, 17 ],
+  /* 2455 */  [ 0.252672941, 17 ],
+  /* 2456 */  [ 0.252810180, 17 ],
+  /* 2457 */  [ 0.252947436, 17 ],
+  /* 2458 */  [ 0.253084712, 17 ],
+  /* 2459 */  [ 0.253222006, 17 ],
+  /* 2460 */  [ 0.253359319, 17 ],
+  /* 2461 */  [ 0.253496651, 17 ],
+  /* 2462 */  [ 0.253634001, 17 ],
+  /* 2463 */  [ 0.253771369, 17 ],
+
+  /* 2464 */  [ 0.253908756, 17 ],
+  /* 2465 */  [ 0.254046162, 17 ],
+  /* 2466 */  [ 0.254183587, 17 ],
+  /* 2467 */  [ 0.254321030, 17 ],
+  /* 2468 */  [ 0.254458491, 17 ],
+  /* 2469 */  [ 0.254595971, 17 ],
+  /* 2470 */  [ 0.254733470, 17 ],
+  /* 2471 */  [ 0.254870987, 17 ],
+  /* 2472 */  [ 0.255008523, 17 ],
+  /* 2473 */  [ 0.255146077, 17 ],
+  /* 2474 */  [ 0.255283650, 17 ],
+  /* 2475 */  [ 0.255421241, 17 ],
+  /* 2476 */  [ 0.255558851, 17 ],
+  /* 2477 */  [ 0.255696480, 17 ],
+  /* 2478 */  [ 0.255834127, 17 ],
+  /* 2479 */  [ 0.255971792, 17 ],
+
+  /* 2480 */  [ 0.256109476, 17 ],
+  /* 2481 */  [ 0.256247179, 17 ],
+  /* 2482 */  [ 0.256384900, 17 ],
+  /* 2483 */  [ 0.256522639, 17 ],
+  /* 2484 */  [ 0.256660397, 17 ],
+  /* 2485 */  [ 0.256798174, 17 ],
+  /* 2486 */  [ 0.256935969, 17 ],
+  /* 2487 */  [ 0.257073782, 17 ],
+  /* 2488 */  [ 0.257211614, 17 ],
+  /* 2489 */  [ 0.257349465, 17 ],
+  /* 2490 */  [ 0.257487334, 17 ],
+  /* 2491 */  [ 0.257625221, 17 ],
+  /* 2492 */  [ 0.257763127, 17 ],
+  /* 2493 */  [ 0.257901051, 17 ],
+  /* 2494 */  [ 0.258038994, 17 ],
+  /* 2495 */  [ 0.258176955, 17 ],
+
+  /* 2496 */  [ 0.258314934, 17 ],
+  /* 2497 */  [ 0.258452932, 17 ],
+  /* 2498 */  [ 0.258590948, 17 ],
+  /* 2499 */  [ 0.258728983, 17 ],
+  /* 2500 */  [ 0.258867036, 17 ],
+  /* 2501 */  [ 0.259005108, 17 ],
+  /* 2502 */  [ 0.259143198, 17 ],
+  /* 2503 */  [ 0.259281307, 17 ],
+  /* 2504 */  [ 0.259419433, 17 ],
+  /* 2505 */  [ 0.259557579, 17 ],
+  /* 2506 */  [ 0.259695742, 17 ],
+  /* 2507 */  [ 0.259833924, 17 ],
+  /* 2508 */  [ 0.259972124, 17 ],
+  /* 2509 */  [ 0.260110343, 17 ],
+  /* 2510 */  [ 0.260248580, 17 ],
+  /* 2511 */  [ 0.260386836, 17 ],
+
+  /* 2512 */  [ 0.260525110, 17 ],
+  /* 2513 */  [ 0.260663402, 17 ],
+  /* 2514 */  [ 0.260801712, 17 ],
+  /* 2515 */  [ 0.260940041, 17 ],
+  /* 2516 */  [ 0.261078388, 17 ],
+  /* 2517 */  [ 0.261216754, 17 ],
+  /* 2518 */  [ 0.261355137, 17 ],
+  /* 2519 */  [ 0.261493540, 17 ],
+  /* 2520 */  [ 0.261631960, 17 ],
+  /* 2521 */  [ 0.261770399, 17 ],
+  /* 2522 */  [ 0.261908856, 17 ],
+  /* 2523 */  [ 0.262047331, 17 ],
+  /* 2524 */  [ 0.262185825, 17 ],
+  /* 2525 */  [ 0.262324337, 17 ],
+  /* 2526 */  [ 0.262462867, 17 ],
+  /* 2527 */  [ 0.262601416, 17 ],
+
+  /* 2528 */  [ 0.262739982, 17 ],
+  /* 2529 */  [ 0.262878568, 17 ],
+  /* 2530 */  [ 0.263017171, 17 ],
+  /* 2531 */  [ 0.263155792, 17 ],
+  /* 2532 */  [ 0.263294432, 17 ],
+  /* 2533 */  [ 0.263433090, 17 ],
+  /* 2534 */  [ 0.263571767, 17 ],
+  /* 2535 */  [ 0.263710461, 17 ],
+  /* 2536 */  [ 0.263849174, 17 ],
+  /* 2537 */  [ 0.263987905, 17 ],
+  /* 2538 */  [ 0.264126655, 17 ],
+  /* 2539 */  [ 0.264265422, 17 ],
+  /* 2540 */  [ 0.264404208, 17 ],
+  /* 2541 */  [ 0.264543012, 17 ],
+  /* 2542 */  [ 0.264681834, 17 ],
+  /* 2543 */  [ 0.264820674, 17 ],
+
+  /* 2544 */  [ 0.264959533, 17 ],
+  /* 2545 */  [ 0.265098410, 17 ],
+  /* 2546 */  [ 0.265237305, 17 ],
+  /* 2547 */  [ 0.265376218, 17 ],
+  /* 2548 */  [ 0.265515149, 17 ],
+  /* 2549 */  [ 0.265654099, 17 ],
+  /* 2550 */  [ 0.265793066, 17 ],
+  /* 2551 */  [ 0.265932052, 17 ],
+  /* 2552 */  [ 0.266071056, 17 ],
+  /* 2553 */  [ 0.266210078, 17 ],
+  /* 2554 */  [ 0.266349119, 17 ],
+  /* 2555 */  [ 0.266488177, 17 ],
+  /* 2556 */  [ 0.266627254, 17 ],
+  /* 2557 */  [ 0.266766349, 17 ],
+  /* 2558 */  [ 0.266905462, 17 ],
+  /* 2559 */  [ 0.267044593, 17 ],
+
+  /* 2560 */  [ 0.267183742, 17 ],
+  /* 2561 */  [ 0.267322909, 17 ],
+  /* 2562 */  [ 0.267462094, 17 ],
+  /* 2563 */  [ 0.267601298, 17 ],
+  /* 2564 */  [ 0.267740519, 17 ],
+  /* 2565 */  [ 0.267879759, 17 ],
+  /* 2566 */  [ 0.268019017, 17 ],
+  /* 2567 */  [ 0.268158293, 17 ],
+  /* 2568 */  [ 0.268297587, 17 ],
+  /* 2569 */  [ 0.268436899, 17 ],
+  /* 2570 */  [ 0.268576229, 17 ],
+  /* 2571 */  [ 0.268715577, 17 ],
+  /* 2572 */  [ 0.268854943, 17 ],
+  /* 2573 */  [ 0.268994328, 17 ],
+  /* 2574 */  [ 0.269133730, 17 ],
+  /* 2575 */  [ 0.269273150, 17 ],
+
+  /* 2576 */  [ 0.269412589, 17 ],
+  /* 2577 */  [ 0.269552045, 17 ],
+  /* 2578 */  [ 0.269691520, 17 ],
+  /* 2579 */  [ 0.269831013, 17 ],
+  /* 2580 */  [ 0.269970523, 17 ],
+  /* 2581 */  [ 0.270110052, 17 ],
+  /* 2582 */  [ 0.270249599, 17 ],
+  /* 2583 */  [ 0.270389163, 17 ],
+  /* 2584 */  [ 0.270528746, 17 ],
+  /* 2585 */  [ 0.270668347, 17 ],
+  /* 2586 */  [ 0.270807965, 17 ],
+  /* 2587 */  [ 0.270947602, 17 ],
+  /* 2588 */  [ 0.271087257, 17 ],
+  /* 2589 */  [ 0.271226930, 17 ],
+  /* 2590 */  [ 0.271366620, 17 ],
+  /* 2591 */  [ 0.271506329, 17 ],
+
+  /* 2592 */  [ 0.271646056, 17 ],
+  /* 2593 */  [ 0.271785800, 17 ],
+  /* 2594 */  [ 0.271925563, 17 ],
+  /* 2595 */  [ 0.272065343, 17 ],
+  /* 2596 */  [ 0.272205142, 17 ],
+  /* 2597 */  [ 0.272344958, 17 ],
+  /* 2598 */  [ 0.272484793, 17 ],
+  /* 2599 */  [ 0.272624645, 17 ],
+  /* 2600 */  [ 0.272764515, 17 ],
+  /* 2601 */  [ 0.272904403, 17 ],
+  /* 2602 */  [ 0.273044310, 17 ],
+  /* 2603 */  [ 0.273184234, 17 ],
+  /* 2604 */  [ 0.273324176, 17 ],
+  /* 2605 */  [ 0.273464136, 17 ],
+  /* 2606 */  [ 0.273604113, 17 ],
+  /* 2607 */  [ 0.273744109, 17 ],
+
+  /* 2608 */  [ 0.273884123, 17 ],
+  /* 2609 */  [ 0.274024154, 17 ],
+  /* 2610 */  [ 0.274164204, 17 ],
+  /* 2611 */  [ 0.274304271, 17 ],
+  /* 2612 */  [ 0.274444356, 17 ],
+  /* 2613 */  [ 0.274584459, 17 ],
+  /* 2614 */  [ 0.274724580, 17 ],
+  /* 2615 */  [ 0.274864719, 17 ],
+  /* 2616 */  [ 0.275004875, 17 ],
+  /* 2617 */  [ 0.275145050, 17 ],
+  /* 2618 */  [ 0.275285242, 17 ],
+  /* 2619 */  [ 0.275425452, 17 ],
+  /* 2620 */  [ 0.275565681, 17 ],
+  /* 2621 */  [ 0.275705926, 17 ],
+  /* 2622 */  [ 0.275846190, 17 ],
+  /* 2623 */  [ 0.275986472, 17 ],
+
+  /* 2624 */  [ 0.276126771, 17 ],
+  /* 2625 */  [ 0.276267088, 17 ],
+  /* 2626 */  [ 0.276407423, 17 ],
+  /* 2627 */  [ 0.276547776, 17 ],
+  /* 2628 */  [ 0.276688147, 17 ],
+  /* 2629 */  [ 0.276828535, 17 ],
+  /* 2630 */  [ 0.276968942, 17 ],
+  /* 2631 */  [ 0.277109366, 17 ],
+  /* 2632 */  [ 0.277249808, 17 ],
+  /* 2633 */  [ 0.277390267, 17 ],
+  /* 2634 */  [ 0.277530745, 17 ],
+  /* 2635 */  [ 0.277671240, 17 ],
+  /* 2636 */  [ 0.277811753, 17 ],
+  /* 2637 */  [ 0.277952284, 17 ],
+  /* 2638 */  [ 0.278092832, 17 ],
+  /* 2639 */  [ 0.278233399, 17 ],
+
+  /* 2640 */  [ 0.278373983, 17 ],
+  /* 2641 */  [ 0.278514584, 17 ],
+  /* 2642 */  [ 0.278655204, 17 ],
+  /* 2643 */  [ 0.278795841, 17 ],
+  /* 2644 */  [ 0.278936496, 17 ],
+  /* 2645 */  [ 0.279077169, 17 ],
+  /* 2646 */  [ 0.279217860, 17 ],
+  /* 2647 */  [ 0.279358568, 17 ],
+  /* 2648 */  [ 0.279499294, 17 ],
+  /* 2649 */  [ 0.279640037, 17 ],
+  /* 2650 */  [ 0.279780799, 17 ],
+  /* 2651 */  [ 0.279921578, 17 ],
+  /* 2652 */  [ 0.280062375, 17 ],
+  /* 2653 */  [ 0.280203189, 17 ],
+  /* 2654 */  [ 0.280344021, 17 ],
+  /* 2655 */  [ 0.280484871, 17 ],
+
+  /* 2656 */  [ 0.280625739, 17 ],
+  /* 2657 */  [ 0.280766624, 17 ],
+  /* 2658 */  [ 0.280907527, 17 ],
+  /* 2659 */  [ 0.281048447, 17 ],
+  /* 2660 */  [ 0.281189385, 17 ],
+  /* 2661 */  [ 0.281330341, 17 ],
+  /* 2662 */  [ 0.281471315, 17 ],
+  /* 2663 */  [ 0.281612306, 17 ],
+  /* 2664 */  [ 0.281753315, 17 ],
+  /* 2665 */  [ 0.281894341, 17 ],
+  /* 2666 */  [ 0.282035386, 17 ],
+  /* 2667 */  [ 0.282176447, 17 ],
+  /* 2668 */  [ 0.282317527, 17 ],
+  /* 2669 */  [ 0.282458624, 17 ],
+  /* 2670 */  [ 0.282599738, 17 ],
+  /* 2671 */  [ 0.282740871, 17 ],
+
+  /* 2672 */  [ 0.282882021, 17 ],
+  /* 2673 */  [ 0.283023188, 17 ],
+  /* 2674 */  [ 0.283164373, 17 ],
+  /* 2675 */  [ 0.283305576, 17 ],
+  /* 2676 */  [ 0.283446796, 17 ],
+  /* 2677 */  [ 0.283588034, 17 ],
+  /* 2678 */  [ 0.283729290, 17 ],
+  /* 2679 */  [ 0.283870563, 17 ],
+  /* 2680 */  [ 0.284011853, 17 ],
+  /* 2681 */  [ 0.284153161, 17 ],
+  /* 2682 */  [ 0.284294487, 17 ],
+  /* 2683 */  [ 0.284435831, 17 ],
+  /* 2684 */  [ 0.284577192, 17 ],
+  /* 2685 */  [ 0.284718570, 17 ],
+  /* 2686 */  [ 0.284859966, 17 ],
+  /* 2687 */  [ 0.285001380, 17 ],
+
+  /* 2688 */  [ 0.285142811, 17 ],
+  /* 2689 */  [ 0.285284259, 17 ],
+  /* 2690 */  [ 0.285425726, 17 ],
+  /* 2691 */  [ 0.285567209, 17 ],
+  /* 2692 */  [ 0.285708711, 17 ],
+  /* 2693 */  [ 0.285850229, 17 ],
+  /* 2694 */  [ 0.285991766, 17 ],
+  /* 2695 */  [ 0.286133319, 17 ],
+  /* 2696 */  [ 0.286274891, 17 ],
+  /* 2697 */  [ 0.286416480, 17 ],
+  /* 2698 */  [ 0.286558086, 17 ],
+  /* 2699 */  [ 0.286699710, 17 ],
+  /* 2700 */  [ 0.286841351, 17 ],
+  /* 2701 */  [ 0.286983010, 17 ],
+  /* 2702 */  [ 0.287124686, 17 ],
+  /* 2703 */  [ 0.287266380, 17 ],
+
+  /* 2704 */  [ 0.287408091, 17 ],
+  /* 2705 */  [ 0.287549820, 17 ],
+  /* 2706 */  [ 0.287691566, 17 ],
+  /* 2707 */  [ 0.287833330, 17 ],
+  /* 2708 */  [ 0.287975111, 17 ],
+  /* 2709 */  [ 0.288116909, 17 ],
+  /* 2710 */  [ 0.288258725, 17 ],
+  /* 2711 */  [ 0.288400559, 17 ],
+  /* 2712 */  [ 0.288542409, 17 ],
+  /* 2713 */  [ 0.288684278, 17 ],
+  /* 2714 */  [ 0.288826163, 17 ],
+  /* 2715 */  [ 0.288968067, 17 ],
+  /* 2716 */  [ 0.289109987, 17 ],
+  /* 2717 */  [ 0.289251925, 17 ],
+  /* 2718 */  [ 0.289393881, 17 ],
+  /* 2719 */  [ 0.289535854, 17 ],
+
+  /* 2720 */  [ 0.289677844, 17 ],
+  /* 2721 */  [ 0.289819851, 17 ],
+  /* 2722 */  [ 0.289961876, 17 ],
+  /* 2723 */  [ 0.290103919, 17 ],
+  /* 2724 */  [ 0.290245979, 17 ],
+  /* 2725 */  [ 0.290388056, 17 ],
+  /* 2726 */  [ 0.290530150, 17 ],
+  /* 2727 */  [ 0.290672262, 17 ],
+  /* 2728 */  [ 0.290814392, 17 ],
+  /* 2729 */  [ 0.290956538, 17 ],
+  /* 2730 */  [ 0.291098703, 17 ],
+  /* 2731 */  [ 0.291240884, 17 ],
+  /* 2732 */  [ 0.291383083, 17 ],
+  /* 2733 */  [ 0.291525299, 17 ],
+  /* 2734 */  [ 0.291667532, 17 ],
+  /* 2735 */  [ 0.291809783, 17 ],
+
+  /* 2736 */  [ 0.291952051, 17 ],
+  /* 2737 */  [ 0.292094337, 17 ],
+  /* 2738 */  [ 0.292236640, 17 ],
+  /* 2739 */  [ 0.292378960, 17 ],
+  /* 2740 */  [ 0.292521297, 17 ],
+  /* 2741 */  [ 0.292663652, 17 ],
+  /* 2742 */  [ 0.292806024, 17 ],
+  /* 2743 */  [ 0.292948414, 17 ],
+  /* 2744 */  [ 0.293090820, 17 ],
+  /* 2745 */  [ 0.293233244, 17 ],
+  /* 2746 */  [ 0.293375686, 17 ],
+  /* 2747 */  [ 0.293518144, 17 ],
+  /* 2748 */  [ 0.293660620, 17 ],
+  /* 2749 */  [ 0.293803113, 17 ],
+  /* 2750 */  [ 0.293945624, 17 ],
+  /* 2751 */  [ 0.294088151, 17 ],
+
+  /* 2752 */  [ 0.294230696, 17 ],
+  /* 2753 */  [ 0.294373259, 17 ],
+  /* 2754 */  [ 0.294515838, 17 ],
+  /* 2755 */  [ 0.294658435, 17 ],
+  /* 2756 */  [ 0.294801049, 17 ],
+  /* 2757 */  [ 0.294943680, 17 ],
+  /* 2758 */  [ 0.295086329, 17 ],
+  /* 2759 */  [ 0.295228995, 17 ],
+  /* 2760 */  [ 0.295371678, 17 ],
+  /* 2761 */  [ 0.295514378, 17 ],
+  /* 2762 */  [ 0.295657095, 17 ],
+  /* 2763 */  [ 0.295799830, 17 ],
+  /* 2764 */  [ 0.295942582, 17 ],
+  /* 2765 */  [ 0.296085351, 17 ],
+  /* 2766 */  [ 0.296228138, 17 ],
+  /* 2767 */  [ 0.296370941, 17 ],
+
+  /* 2768 */  [ 0.296513762, 17 ],
+  /* 2769 */  [ 0.296656600, 17 ],
+  /* 2770 */  [ 0.296799455, 17 ],
+  /* 2771 */  [ 0.296942327, 17 ],
+  /* 2772 */  [ 0.297085217, 17 ],
+  /* 2773 */  [ 0.297228124, 17 ],
+  /* 2774 */  [ 0.297371048, 17 ],
+  /* 2775 */  [ 0.297513989, 17 ],
+  /* 2776 */  [ 0.297656947, 17 ],
+  /* 2777 */  [ 0.297799922, 17 ],
+  /* 2778 */  [ 0.297942915, 17 ],
+  /* 2779 */  [ 0.298085925, 17 ],
+  /* 2780 */  [ 0.298228951, 17 ],
+  /* 2781 */  [ 0.298371996, 17 ],
+  /* 2782 */  [ 0.298515057, 17 ],
+  /* 2783 */  [ 0.298658135, 17 ],
+
+  /* 2784 */  [ 0.298801231, 17 ],
+  /* 2785 */  [ 0.298944343, 17 ],
+  /* 2786 */  [ 0.299087473, 17 ],
+  /* 2787 */  [ 0.299230620, 17 ],
+  /* 2788 */  [ 0.299373784, 17 ],
+  /* 2789 */  [ 0.299516965, 17 ],
+  /* 2790 */  [ 0.299660163, 17 ],
+  /* 2791 */  [ 0.299803378, 17 ],
+  /* 2792 */  [ 0.299946611, 17 ],
+  /* 2793 */  [ 0.300089860, 17 ],
+  /* 2794 */  [ 0.300233127, 17 ],
+  /* 2795 */  [ 0.300376411, 17 ],
+  /* 2796 */  [ 0.300519711, 17 ],
+  /* 2797 */  [ 0.300663029, 17 ],
+  /* 2798 */  [ 0.300806364, 17 ],
+  /* 2799 */  [ 0.300949716, 17 ],
+
+  /* 2800 */  [ 0.301093085, 17 ],
+  /* 2801 */  [ 0.301236472, 17 ],
+  /* 2802 */  [ 0.301379875, 17 ],
+  /* 2803 */  [ 0.301523295, 17 ],
+  /* 2804 */  [ 0.301666733, 17 ],
+  /* 2805 */  [ 0.301810187, 17 ],
+  /* 2806 */  [ 0.301953659, 17 ],
+  /* 2807 */  [ 0.302097147, 17 ],
+  /* 2808 */  [ 0.302240653, 17 ],
+  /* 2809 */  [ 0.302384175, 17 ],
+  /* 2810 */  [ 0.302527715, 17 ],
+  /* 2811 */  [ 0.302671271, 17 ],
+  /* 2812 */  [ 0.302814845, 17 ],
+  /* 2813 */  [ 0.302958436, 17 ],
+  /* 2814 */  [ 0.303102044, 17 ],
+  /* 2815 */  [ 0.303245668, 17 ],
+
+  /* 2816 */  [ 0.303389310, 17 ],
+  /* 2817 */  [ 0.303532969, 17 ],
+  /* 2818 */  [ 0.303676645, 17 ],
+  /* 2819 */  [ 0.303820337, 17 ],
+  /* 2820 */  [ 0.303964047, 17 ],
+  /* 2821 */  [ 0.304107774, 17 ],
+  /* 2822 */  [ 0.304251517, 17 ],
+  /* 2823 */  [ 0.304395278, 17 ],
+  /* 2824 */  [ 0.304539056, 17 ],
+  /* 2825 */  [ 0.304682850, 17 ],
+  /* 2826 */  [ 0.304826662, 17 ],
+  /* 2827 */  [ 0.304970491, 17 ],
+  /* 2828 */  [ 0.305114336, 17 ],
+  /* 2829 */  [ 0.305258199, 17 ],
+  /* 2830 */  [ 0.305402078, 17 ],
+  /* 2831 */  [ 0.305545974, 17 ],
+
+  /* 2832 */  [ 0.305689888, 17 ],
+  /* 2833 */  [ 0.305833818, 17 ],
+  /* 2834 */  [ 0.305977765, 17 ],
+  /* 2835 */  [ 0.306121729, 17 ],
+  /* 2836 */  [ 0.306265710, 17 ],
+  /* 2837 */  [ 0.306409708, 17 ],
+  /* 2838 */  [ 0.306553723, 17 ],
+  /* 2839 */  [ 0.306697755, 17 ],
+  /* 2840 */  [ 0.306841804, 17 ],
+  /* 2841 */  [ 0.306985869, 17 ],
+  /* 2842 */  [ 0.307129952, 17 ],
+  /* 2843 */  [ 0.307274051, 17 ],
+  /* 2844 */  [ 0.307418168, 17 ],
+  /* 2845 */  [ 0.307562301, 17 ],
+  /* 2846 */  [ 0.307706451, 17 ],
+  /* 2847 */  [ 0.307850618, 17 ],
+
+  /* 2848 */  [ 0.307994802, 17 ],
+  /* 2849 */  [ 0.308139003, 17 ],
+  /* 2850 */  [ 0.308283220, 17 ],
+  /* 2851 */  [ 0.308427455, 17 ],
+  /* 2852 */  [ 0.308571706, 17 ],
+  /* 2853 */  [ 0.308715974, 17 ],
+  /* 2854 */  [ 0.308860260, 17 ],
+  /* 2855 */  [ 0.309004561, 17 ],
+  /* 2856 */  [ 0.309148880, 17 ],
+  /* 2857 */  [ 0.309293216, 17 ],
+  /* 2858 */  [ 0.309437568, 17 ],
+  /* 2859 */  [ 0.309581938, 17 ],
+  /* 2860 */  [ 0.309726324, 17 ],
+  /* 2861 */  [ 0.309870727, 17 ],
+  /* 2862 */  [ 0.310015147, 17 ],
+  /* 2863 */  [ 0.310159583, 17 ],
+
+  /* 2864 */  [ 0.310304037, 17 ],
+  /* 2865 */  [ 0.310448507, 17 ],
+  /* 2866 */  [ 0.310592994, 17 ],
+  /* 2867 */  [ 0.310737498, 17 ],
+  /* 2868 */  [ 0.310882018, 17 ],
+  /* 2869 */  [ 0.311026556, 17 ],
+  /* 2870 */  [ 0.311171110, 17 ],
+  /* 2871 */  [ 0.311315681, 17 ],
+  /* 2872 */  [ 0.311460269, 17 ],
+  /* 2873 */  [ 0.311604874, 17 ],
+  /* 2874 */  [ 0.311749495, 17 ],
+  /* 2875 */  [ 0.311894133, 17 ],
+  /* 2876 */  [ 0.312038788, 17 ],
+  /* 2877 */  [ 0.312183460, 17 ],
+  /* 2878 */  [ 0.312328148, 17 ],
+  /* 2879 */  [ 0.312472854, 17 ],
+
+  /* 2880 */  [ 0.312617576, 17 ],
+  /* 2881 */  [ 0.312762314, 17 ],
+  /* 2882 */  [ 0.312907070, 17 ],
+  /* 2883 */  [ 0.313051842, 17 ],
+  /* 2884 */  [ 0.313196631, 17 ],
+  /* 2885 */  [ 0.313341437, 17 ],
+  /* 2886 */  [ 0.313486259, 17 ],
+  /* 2887 */  [ 0.313631098, 17 ],
+  /* 2888 */  [ 0.313775954, 17 ],
+  /* 2889 */  [ 0.313920827, 17 ],
+  /* 2890 */  [ 0.314065716, 17 ],
+  /* 2891 */  [ 0.314210622, 17 ],
+  /* 2892 */  [ 0.314355545, 17 ],
+  /* 2893 */  [ 0.314500484, 17 ],
+  /* 2894 */  [ 0.314645440, 17 ],
+  /* 2895 */  [ 0.314790413, 17 ],
+
+  /* 2896 */  [ 0.314935403, 17 ],
+  /* 2897 */  [ 0.315080409, 17 ],
+  /* 2898 */  [ 0.315225432, 17 ],
+  /* 2899 */  [ 0.315370472, 17 ],
+  /* 2900 */  [ 0.315515528, 17 ],
+  /* 2901 */  [ 0.315660601, 17 ],
+  /* 2902 */  [ 0.315805690, 17 ],
+  /* 2903 */  [ 0.315950797, 17 ],
+  /* 2904 */  [ 0.316095920, 17 ],
+  /* 2905 */  [ 0.316241059, 17 ],
+  /* 2906 */  [ 0.316386216, 17 ],
+  /* 2907 */  [ 0.316531388, 17 ],
+  /* 2908 */  [ 0.316676578, 17 ],
+  /* 2909 */  [ 0.316821784, 17 ],
+  /* 2910 */  [ 0.316967007, 17 ],
+  /* 2911 */  [ 0.317112247, 17 ],
+
+  /* 2912 */  [ 0.317257503, 17 ],
+  /* 2913 */  [ 0.317402775, 17 ],
+  /* 2914 */  [ 0.317548065, 17 ],
+  /* 2915 */  [ 0.317693371, 17 ],
+  /* 2916 */  [ 0.317838693, 17 ],
+  /* 2917 */  [ 0.317984033, 17 ],
+  /* 2918 */  [ 0.318129388, 17 ],
+  /* 2919 */  [ 0.318274761, 17 ],
+  /* 2920 */  [ 0.318420150, 17 ],
+  /* 2921 */  [ 0.318565555, 17 ],
+  /* 2922 */  [ 0.318710978, 17 ],
+  /* 2923 */  [ 0.318856416, 17 ],
+  /* 2924 */  [ 0.319001872, 17 ],
+  /* 2925 */  [ 0.319147344, 17 ],
+  /* 2926 */  [ 0.319292832, 17 ],
+  /* 2927 */  [ 0.319438338, 17 ],
+
+  /* 2928 */  [ 0.319583859, 17 ],
+  /* 2929 */  [ 0.319729398, 17 ],
+  /* 2930 */  [ 0.319874952, 17 ],
+  /* 2931 */  [ 0.320020524, 17 ],
+  /* 2932 */  [ 0.320166112, 17 ],
+  /* 2933 */  [ 0.320311716, 17 ],
+  /* 2934 */  [ 0.320457337, 17 ],
+  /* 2935 */  [ 0.320602975, 17 ],
+  /* 2936 */  [ 0.320748629, 17 ],
+  /* 2937 */  [ 0.320894300, 17 ],
+  /* 2938 */  [ 0.321039987, 17 ],
+  /* 2939 */  [ 0.321185691, 17 ],
+  /* 2940 */  [ 0.321331411, 17 ],
+  /* 2941 */  [ 0.321477148, 17 ],
+  /* 2942 */  [ 0.321622901, 17 ],
+  /* 2943 */  [ 0.321768671, 17 ],
+
+  /* 2944 */  [ 0.321914457, 17 ],
+  /* 2945 */  [ 0.322060260, 17 ],
+  /* 2946 */  [ 0.322206079, 17 ],
+  /* 2947 */  [ 0.322351915, 17 ],
+  /* 2948 */  [ 0.322497768, 17 ],
+  /* 2949 */  [ 0.322643636, 17 ],
+  /* 2950 */  [ 0.322789522, 17 ],
+  /* 2951 */  [ 0.322935424, 17 ],
+  /* 2952 */  [ 0.323081342, 17 ],
+  /* 2953 */  [ 0.323227277, 17 ],
+  /* 2954 */  [ 0.323373228, 17 ],
+  /* 2955 */  [ 0.323519196, 17 ],
+  /* 2956 */  [ 0.323665180, 17 ],
+  /* 2957 */  [ 0.323811180, 17 ],
+  /* 2958 */  [ 0.323957197, 17 ],
+  /* 2959 */  [ 0.324103231, 17 ],
+
+  /* 2960 */  [ 0.324249281, 17 ],
+  /* 2961 */  [ 0.324395347, 17 ],
+  /* 2962 */  [ 0.324541430, 17 ],
+  /* 2963 */  [ 0.324687530, 17 ],
+  /* 2964 */  [ 0.324833646, 17 ],
+  /* 2965 */  [ 0.324979778, 17 ],
+  /* 2966 */  [ 0.325125926, 17 ],
+  /* 2967 */  [ 0.325272091, 17 ],
+  /* 2968 */  [ 0.325418273, 17 ],
+  /* 2969 */  [ 0.325564471, 17 ],
+  /* 2970 */  [ 0.325710685, 17 ],
+  /* 2971 */  [ 0.325856916, 17 ],
+  /* 2972 */  [ 0.326003163, 17 ],
+  /* 2973 */  [ 0.326149427, 17 ],
+  /* 2974 */  [ 0.326295707, 17 ],
+  /* 2975 */  [ 0.326442003, 17 ],
+
+  /* 2976 */  [ 0.326588316, 17 ],
+  /* 2977 */  [ 0.326734645, 17 ],
+  /* 2978 */  [ 0.326880990, 17 ],
+  /* 2979 */  [ 0.327027352, 17 ],
+  /* 2980 */  [ 0.327173730, 17 ],
+  /* 2981 */  [ 0.327320125, 17 ],
+  /* 2982 */  [ 0.327466536, 17 ],
+  /* 2983 */  [ 0.327612963, 17 ],
+  /* 2984 */  [ 0.327759407, 17 ],
+  /* 2985 */  [ 0.327905867, 17 ],
+  /* 2986 */  [ 0.328052344, 17 ],
+  /* 2987 */  [ 0.328198837, 17 ],
+  /* 2988 */  [ 0.328345346, 17 ],
+  /* 2989 */  [ 0.328491871, 17 ],
+  /* 2990 */  [ 0.328638413, 17 ],
+  /* 2991 */  [ 0.328784971, 17 ],
+
+  /* 2992 */  [ 0.328931546, 17 ],
+  /* 2993 */  [ 0.329078137, 17 ],
+  /* 2994 */  [ 0.329224744, 17 ],
+  /* 2995 */  [ 0.329371367, 17 ],
+  /* 2996 */  [ 0.329518007, 17 ],
+  /* 2997 */  [ 0.329664663, 17 ],
+  /* 2998 */  [ 0.329811336, 17 ],
+  /* 2999 */  [ 0.329958024, 17 ],
+  /* 3000 */  [ 0.330104730, 17 ],
+  /* 3001 */  [ 0.330251451, 17 ],
+  /* 3002 */  [ 0.330398189, 17 ],
+  /* 3003 */  [ 0.330544943, 17 ],
+  /* 3004 */  [ 0.330691713, 17 ],
+  /* 3005 */  [ 0.330838499, 17 ],
+  /* 3006 */  [ 0.330985302, 17 ],
+  /* 3007 */  [ 0.331132121, 17 ],
+
+  /* 3008 */  [ 0.331278957, 17 ],
+  /* 3009 */  [ 0.331425808, 17 ],
+  /* 3010 */  [ 0.331572676, 17 ],
+  /* 3011 */  [ 0.331719560, 17 ],
+  /* 3012 */  [ 0.331866461, 17 ],
+  /* 3013 */  [ 0.332013377, 17 ],
+  /* 3014 */  [ 0.332160310, 17 ],
+  /* 3015 */  [ 0.332307260, 17 ],
+  /* 3016 */  [ 0.332454225, 17 ],
+  /* 3017 */  [ 0.332601207, 17 ],
+  /* 3018 */  [ 0.332748205, 17 ],
+  /* 3019 */  [ 0.332895219, 17 ],
+  /* 3020 */  [ 0.333042249, 17 ],
+  /* 3021 */  [ 0.333189296, 17 ],
+  /* 3022 */  [ 0.333336359, 17 ],
+  /* 3023 */  [ 0.333483438, 17 ],
+
+  /* 3024 */  [ 0.333630533, 17 ],
+  /* 3025 */  [ 0.333777645, 17 ],
+  /* 3026 */  [ 0.333924772, 17 ],
+  /* 3027 */  [ 0.334071916, 17 ],
+  /* 3028 */  [ 0.334219076, 17 ],
+  /* 3029 */  [ 0.334366253, 17 ],
+  /* 3030 */  [ 0.334513445, 17 ],
+  /* 3031 */  [ 0.334660654, 17 ],
+  /* 3032 */  [ 0.334807879, 17 ],
+  /* 3033 */  [ 0.334955120, 17 ],
+  /* 3034 */  [ 0.335102377, 17 ],
+  /* 3035 */  [ 0.335249651, 17 ],
+  /* 3036 */  [ 0.335396941, 17 ],
+  /* 3037 */  [ 0.335544246, 17 ],
+  /* 3038 */  [ 0.335691568, 17 ],
+  /* 3039 */  [ 0.335838906, 17 ],
+
+  /* 3040 */  [ 0.335986261, 17 ],
+  /* 3041 */  [ 0.336133631, 17 ],
+  /* 3042 */  [ 0.336281018, 17 ],
+  /* 3043 */  [ 0.336428421, 17 ],
+  /* 3044 */  [ 0.336575840, 17 ],
+  /* 3045 */  [ 0.336723275, 17 ],
+  /* 3046 */  [ 0.336870726, 17 ],
+  /* 3047 */  [ 0.337018193, 17 ],
+  /* 3048 */  [ 0.337165677, 17 ],
+  /* 3049 */  [ 0.337313176, 17 ],
+  /* 3050 */  [ 0.337460692, 17 ],
+  /* 3051 */  [ 0.337608224, 17 ],
+  /* 3052 */  [ 0.337755772, 17 ],
+  /* 3053 */  [ 0.337903336, 17 ],
+  /* 3054 */  [ 0.338050916, 17 ],
+  /* 3055 */  [ 0.338198513, 17 ],
+
+  /* 3056 */  [ 0.338346125, 17 ],
+  /* 3057 */  [ 0.338493753, 17 ],
+  /* 3058 */  [ 0.338641398, 17 ],
+  /* 3059 */  [ 0.338789059, 17 ],
+  /* 3060 */  [ 0.338936736, 17 ],
+  /* 3061 */  [ 0.339084429, 17 ],
+  /* 3062 */  [ 0.339232138, 17 ],
+  /* 3063 */  [ 0.339379863, 17 ],
+  /* 3064 */  [ 0.339527604, 17 ],
+  /* 3065 */  [ 0.339675361, 17 ],
+  /* 3066 */  [ 0.339823134, 17 ],
+  /* 3067 */  [ 0.339970924, 17 ],
+  /* 3068 */  [ 0.340118729, 17 ],
+  /* 3069 */  [ 0.340266550, 17 ],
+  /* 3070 */  [ 0.340414388, 17 ],
+  /* 3071 */  [ 0.340562242, 17 ],
+
+  /* 3072 */  [ 0.340710111, 17 ],
+  /* 3073 */  [ 0.340857997, 17 ],
+  /* 3074 */  [ 0.341005899, 17 ],
+  /* 3075 */  [ 0.341153816, 17 ],
+  /* 3076 */  [ 0.341301750, 17 ],
+  /* 3077 */  [ 0.341449700, 17 ],
+  /* 3078 */  [ 0.341597666, 17 ],
+  /* 3079 */  [ 0.341745648, 17 ],
+  /* 3080 */  [ 0.341893646, 17 ],
+  /* 3081 */  [ 0.342041659, 17 ],
+  /* 3082 */  [ 0.342189689, 17 ],
+  /* 3083 */  [ 0.342337735, 17 ],
+  /* 3084 */  [ 0.342485797, 17 ],
+  /* 3085 */  [ 0.342633875, 17 ],
+  /* 3086 */  [ 0.342781969, 17 ],
+  /* 3087 */  [ 0.342930079, 17 ],
+
+  /* 3088 */  [ 0.343078205, 17 ],
+  /* 3089 */  [ 0.343226347, 17 ],
+  /* 3090 */  [ 0.343374505, 17 ],
+  /* 3091 */  [ 0.343522679, 17 ],
+  /* 3092 */  [ 0.343670869, 17 ],
+  /* 3093 */  [ 0.343819075, 17 ],
+  /* 3094 */  [ 0.343967296, 17 ],
+  /* 3095 */  [ 0.344115534, 17 ],
+  /* 3096 */  [ 0.344263788, 17 ],
+  /* 3097 */  [ 0.344412058, 17 ],
+  /* 3098 */  [ 0.344560343, 17 ],
+  /* 3099 */  [ 0.344708645, 17 ],
+  /* 3100 */  [ 0.344856963, 17 ],
+  /* 3101 */  [ 0.345005296, 17 ],
+  /* 3102 */  [ 0.345153646, 17 ],
+  /* 3103 */  [ 0.345302011, 17 ],
+
+  /* 3104 */  [ 0.345450393, 17 ],
+  /* 3105 */  [ 0.345598790, 17 ],
+  /* 3106 */  [ 0.345747203, 17 ],
+  /* 3107 */  [ 0.345895632, 17 ],
+  /* 3108 */  [ 0.346044077, 17 ],
+  /* 3109 */  [ 0.346192538, 17 ],
+  /* 3110 */  [ 0.346341015, 17 ],
+  /* 3111 */  [ 0.346489508, 17 ],
+  /* 3112 */  [ 0.346638017, 17 ],
+  /* 3113 */  [ 0.346786542, 17 ],
+  /* 3114 */  [ 0.346935082, 17 ],
+  /* 3115 */  [ 0.347083639, 17 ],
+  /* 3116 */  [ 0.347232211, 17 ],
+  /* 3117 */  [ 0.347380799, 17 ],
+  /* 3118 */  [ 0.347529403, 17 ],
+  /* 3119 */  [ 0.347678023, 17 ],
+
+  /* 3120 */  [ 0.347826659, 17 ],
+  /* 3121 */  [ 0.347975311, 17 ],
+  /* 3122 */  [ 0.348123979, 17 ],
+  /* 3123 */  [ 0.348272662, 17 ],
+  /* 3124 */  [ 0.348421362, 17 ],
+  /* 3125 */  [ 0.348570077, 17 ],
+  /* 3126 */  [ 0.348718808, 17 ],
+  /* 3127 */  [ 0.348867555, 17 ],
+  /* 3128 */  [ 0.349016318, 17 ],
+  /* 3129 */  [ 0.349165097, 17 ],
+  /* 3130 */  [ 0.349313892, 17 ],
+  /* 3131 */  [ 0.349462702, 17 ],
+  /* 3132 */  [ 0.349611528, 17 ],
+  /* 3133 */  [ 0.349760370, 17 ],
+  /* 3134 */  [ 0.349909228, 17 ],
+  /* 3135 */  [ 0.350058102, 17 ],
+
+  /* 3136 */  [ 0.350206992, 17 ],
+  /* 3137 */  [ 0.350355897, 17 ],
+  /* 3138 */  [ 0.350504818, 17 ],
+  /* 3139 */  [ 0.350653756, 17 ],
+  /* 3140 */  [ 0.350802708, 17 ],
+  /* 3141 */  [ 0.350951677, 17 ],
+  /* 3142 */  [ 0.351100662, 17 ],
+  /* 3143 */  [ 0.351249662, 17 ],
+  /* 3144 */  [ 0.351398678, 17 ],
+  /* 3145 */  [ 0.351547710, 17 ],
+  /* 3146 */  [ 0.351696758, 17 ],
+  /* 3147 */  [ 0.351845821, 17 ],
+  /* 3148 */  [ 0.351994901, 17 ],
+  /* 3149 */  [ 0.352143996, 17 ],
+  /* 3150 */  [ 0.352293107, 17 ],
+  /* 3151 */  [ 0.352442233, 17 ],
+
+  /* 3152 */  [ 0.352591376, 17 ],
+  /* 3153 */  [ 0.352740534, 17 ],
+  /* 3154 */  [ 0.352889708, 17 ],
+  /* 3155 */  [ 0.353038898, 17 ],
+  /* 3156 */  [ 0.353188103, 17 ],
+  /* 3157 */  [ 0.353337325, 17 ],
+  /* 3158 */  [ 0.353486562, 17 ],
+  /* 3159 */  [ 0.353635814, 17 ],
+  /* 3160 */  [ 0.353785083, 17 ],
+  /* 3161 */  [ 0.353934367, 17 ],
+  /* 3162 */  [ 0.354083667, 17 ],
+  /* 3163 */  [ 0.354232983, 17 ],
+  /* 3164 */  [ 0.354382314, 17 ],
+  /* 3165 */  [ 0.354531662, 17 ],
+  /* 3166 */  [ 0.354681025, 17 ],
+  /* 3167 */  [ 0.354830403, 17 ],
+
+  /* 3168 */  [ 0.354979798, 17 ],
+  /* 3169 */  [ 0.355129208, 17 ],
+  /* 3170 */  [ 0.355278634, 17 ],
+  /* 3171 */  [ 0.355428075, 17 ],
+  /* 3172 */  [ 0.355577533, 17 ],
+  /* 3173 */  [ 0.355727006, 17 ],
+  /* 3174 */  [ 0.355876494, 17 ],
+  /* 3175 */  [ 0.356025999, 17 ],
+  /* 3176 */  [ 0.356175519, 17 ],
+  /* 3177 */  [ 0.356325054, 17 ],
+  /* 3178 */  [ 0.356474606, 17 ],
+  /* 3179 */  [ 0.356624173, 17 ],
+  /* 3180 */  [ 0.356773756, 17 ],
+  /* 3181 */  [ 0.356923354, 17 ],
+  /* 3182 */  [ 0.357072969, 17 ],
+  /* 3183 */  [ 0.357222598, 17 ],
+
+  /* 3184 */  [ 0.357372244, 17 ],
+  /* 3185 */  [ 0.357521905, 17 ],
+  /* 3186 */  [ 0.357671582, 17 ],
+  /* 3187 */  [ 0.357821275, 17 ],
+  /* 3188 */  [ 0.357970983, 17 ],
+  /* 3189 */  [ 0.358120707, 17 ],
+  /* 3190 */  [ 0.358270446, 17 ],
+  /* 3191 */  [ 0.358420201, 17 ],
+  /* 3192 */  [ 0.358569972, 17 ],
+  /* 3193 */  [ 0.358719758, 17 ],
+  /* 3194 */  [ 0.358869560, 17 ],
+  /* 3195 */  [ 0.359019378, 17 ],
+  /* 3196 */  [ 0.359169211, 17 ],
+  /* 3197 */  [ 0.359319060, 17 ],
+  /* 3198 */  [ 0.359468925, 17 ],
+  /* 3199 */  [ 0.359618805, 17 ],
+
+  /* 3200 */  [ 0.359768701, 17 ],
+  /* 3201 */  [ 0.359918612, 17 ],
+  /* 3202 */  [ 0.360068540, 17 ],
+  /* 3203 */  [ 0.360218482, 17 ],
+  /* 3204 */  [ 0.360368440, 17 ],
+  /* 3205 */  [ 0.360518414, 17 ],
+  /* 3206 */  [ 0.360668404, 17 ],
+  /* 3207 */  [ 0.360818409, 17 ],
+  /* 3208 */  [ 0.360968429, 17 ],
+  /* 3209 */  [ 0.361118466, 17 ],
+  /* 3210 */  [ 0.361268517, 17 ],
+  /* 3211 */  [ 0.361418585, 17 ],
+  /* 3212 */  [ 0.361568668, 17 ],
+  /* 3213 */  [ 0.361718766, 17 ],
+  /* 3214 */  [ 0.361868881, 17 ],
+  /* 3215 */  [ 0.362019010, 17 ],
+
+  /* 3216 */  [ 0.362169156, 17 ],
+  /* 3217 */  [ 0.362319316, 17 ],
+  /* 3218 */  [ 0.362469493, 17 ],
+  /* 3219 */  [ 0.362619685, 17 ],
+  /* 3220 */  [ 0.362769892, 17 ],
+  /* 3221 */  [ 0.362920115, 17 ],
+  /* 3222 */  [ 0.363070354, 17 ],
+  /* 3223 */  [ 0.363220608, 17 ],
+  /* 3224 */  [ 0.363370878, 17 ],
+  /* 3225 */  [ 0.363521163, 17 ],
+  /* 3226 */  [ 0.363671464, 17 ],
+  /* 3227 */  [ 0.363821780, 17 ],
+  /* 3228 */  [ 0.363972112, 17 ],
+  /* 3229 */  [ 0.364122459, 17 ],
+  /* 3230 */  [ 0.364272822, 17 ],
+  /* 3231 */  [ 0.364423200, 17 ],
+
+  /* 3232 */  [ 0.364573594, 17 ],
+  /* 3233 */  [ 0.364724004, 17 ],
+  /* 3234 */  [ 0.364874429, 17 ],
+  /* 3235 */  [ 0.365024869, 17 ],
+  /* 3236 */  [ 0.365175325, 17 ],
+  /* 3237 */  [ 0.365325796, 17 ],
+  /* 3238 */  [ 0.365476283, 17 ],
+  /* 3239 */  [ 0.365626786, 17 ],
+  /* 3240 */  [ 0.365777304, 17 ],
+  /* 3241 */  [ 0.365927837, 17 ],
+  /* 3242 */  [ 0.366078386, 17 ],
+  /* 3243 */  [ 0.366228950, 17 ],
+  /* 3244 */  [ 0.366379530, 17 ],
+  /* 3245 */  [ 0.366530125, 17 ],
+  /* 3246 */  [ 0.366680736, 17 ],
+  /* 3247 */  [ 0.366831362, 17 ],
+
+  /* 3248 */  [ 0.366982004, 17 ],
+  /* 3249 */  [ 0.367132661, 17 ],
+  /* 3250 */  [ 0.367283334, 17 ],
+  /* 3251 */  [ 0.367434022, 17 ],
+  /* 3252 */  [ 0.367584725, 17 ],
+  /* 3253 */  [ 0.367735444, 17 ],
+  /* 3254 */  [ 0.367886179, 17 ],
+  /* 3255 */  [ 0.368036929, 17 ],
+  /* 3256 */  [ 0.368187694, 17 ],
+  /* 3257 */  [ 0.368338475, 17 ],
+  /* 3258 */  [ 0.368489271, 17 ],
+  /* 3259 */  [ 0.368640082, 17 ],
+  /* 3260 */  [ 0.368790909, 17 ],
+  /* 3261 */  [ 0.368941752, 17 ],
+  /* 3262 */  [ 0.369092610, 17 ],
+  /* 3263 */  [ 0.369243483, 17 ],
+
+  /* 3264 */  [ 0.369394372, 17 ],
+  /* 3265 */  [ 0.369545276, 17 ],
+  /* 3266 */  [ 0.369696195, 17 ],
+  /* 3267 */  [ 0.369847130, 17 ],
+  /* 3268 */  [ 0.369998080, 17 ],
+  /* 3269 */  [ 0.370149046, 17 ],
+  /* 3270 */  [ 0.370300027, 17 ],
+  /* 3271 */  [ 0.370451024, 17 ],
+  /* 3272 */  [ 0.370602036, 17 ],
+  /* 3273 */  [ 0.370753063, 17 ],
+  /* 3274 */  [ 0.370904105, 17 ],
+  /* 3275 */  [ 0.371055163, 17 ],
+  /* 3276 */  [ 0.371206237, 17 ],
+  /* 3277 */  [ 0.371357326, 17 ],
+  /* 3278 */  [ 0.371508430, 17 ],
+  /* 3279 */  [ 0.371659549, 17 ],
+
+  /* 3280 */  [ 0.371810684, 17 ],
+  /* 3281 */  [ 0.371961834, 17 ],
+  /* 3282 */  [ 0.372113000, 17 ],
+  /* 3283 */  [ 0.372264181, 17 ],
+  /* 3284 */  [ 0.372415377, 17 ],
+  /* 3285 */  [ 0.372566589, 17 ],
+  /* 3286 */  [ 0.372717816, 17 ],
+  /* 3287 */  [ 0.372869058, 17 ],
+  /* 3288 */  [ 0.373020316, 17 ],
+  /* 3289 */  [ 0.373171589, 17 ],
+  /* 3290 */  [ 0.373322877, 17 ],
+  /* 3291 */  [ 0.373474181, 17 ],
+  /* 3292 */  [ 0.373625500, 17 ],
+  /* 3293 */  [ 0.373776834, 17 ],
+  /* 3294 */  [ 0.373928184, 17 ],
+  /* 3295 */  [ 0.374079549, 17 ],
+
+  /* 3296 */  [ 0.374230929, 17 ],
+  /* 3297 */  [ 0.374382325, 17 ],
+  /* 3298 */  [ 0.374533735, 17 ],
+  /* 3299 */  [ 0.374685162, 17 ],
+  /* 3300 */  [ 0.374836603, 17 ],
+  /* 3301 */  [ 0.374988060, 17 ],
+  /* 3302 */  [ 0.375139532, 17 ],
+  /* 3303 */  [ 0.375291019, 17 ],
+  /* 3304 */  [ 0.375442522, 17 ],
+  /* 3305 */  [ 0.375594040, 17 ],
+  /* 3306 */  [ 0.375745573, 17 ],
+  /* 3307 */  [ 0.375897122, 17 ],
+  /* 3308 */  [ 0.376048685, 17 ],
+  /* 3309 */  [ 0.376200265, 17 ],
+  /* 3310 */  [ 0.376351859, 17 ],
+  /* 3311 */  [ 0.376503468, 17 ],
+
+  /* 3312 */  [ 0.376655093, 17 ],
+  /* 3313 */  [ 0.376806733, 17 ],
+  /* 3314 */  [ 0.376958389, 17 ],
+  /* 3315 */  [ 0.377110059, 17 ],
+  /* 3316 */  [ 0.377261745, 17 ],
+  /* 3317 */  [ 0.377413446, 17 ],
+  /* 3318 */  [ 0.377565163, 17 ],
+  /* 3319 */  [ 0.377716894, 17 ],
+  /* 3320 */  [ 0.377868641, 17 ],
+  /* 3321 */  [ 0.378020403, 17 ],
+  /* 3322 */  [ 0.378172181, 17 ],
+  /* 3323 */  [ 0.378323973, 17 ],
+  /* 3324 */  [ 0.378475781, 17 ],
+  /* 3325 */  [ 0.378627604, 17 ],
+  /* 3326 */  [ 0.378779442, 17 ],
+  /* 3327 */  [ 0.378931296, 17 ],
+
+  /* 3328 */  [ 0.379083164, 17 ],
+  /* 3329 */  [ 0.379235048, 17 ],
+  /* 3330 */  [ 0.379386947, 17 ],
+  /* 3331 */  [ 0.379538862, 17 ],
+  /* 3332 */  [ 0.379690791, 17 ],
+  /* 3333 */  [ 0.379842736, 17 ],
+  /* 3334 */  [ 0.379994696, 17 ],
+  /* 3335 */  [ 0.380146671, 17 ],
+  /* 3336 */  [ 0.380298661, 17 ],
+  /* 3337 */  [ 0.380450666, 17 ],
+  /* 3338 */  [ 0.380602687, 17 ],
+  /* 3339 */  [ 0.380754723, 17 ],
+  /* 3340 */  [ 0.380906774, 17 ],
+  /* 3341 */  [ 0.381058840, 17 ],
+  /* 3342 */  [ 0.381210921, 17 ],
+  /* 3343 */  [ 0.381363018, 17 ],
+
+  /* 3344 */  [ 0.381515130, 17 ],
+  /* 3345 */  [ 0.381667257, 17 ],
+  /* 3346 */  [ 0.381819399, 17 ],
+  /* 3347 */  [ 0.381971556, 17 ],
+  /* 3348 */  [ 0.382123728, 17 ],
+  /* 3349 */  [ 0.382275916, 17 ],
+  /* 3350 */  [ 0.382428118, 17 ],
+  /* 3351 */  [ 0.382580336, 17 ],
+  /* 3352 */  [ 0.382732569, 17 ],
+  /* 3353 */  [ 0.382884817, 17 ],
+  /* 3354 */  [ 0.383037080, 17 ],
+  /* 3355 */  [ 0.383189358, 17 ],
+  /* 3356 */  [ 0.383341652, 17 ],
+  /* 3357 */  [ 0.383493960, 17 ],
+  /* 3358 */  [ 0.383646284, 17 ],
+  /* 3359 */  [ 0.383798623, 17 ],
+
+  /* 3360 */  [ 0.383950977, 17 ],
+  /* 3361 */  [ 0.384103346, 17 ],
+  /* 3362 */  [ 0.384255730, 17 ],
+  /* 3363 */  [ 0.384408129, 17 ],
+  /* 3364 */  [ 0.384560544, 17 ],
+  /* 3365 */  [ 0.384712973, 17 ],
+  /* 3366 */  [ 0.384865418, 17 ],
+  /* 3367 */  [ 0.385017878, 17 ],
+  /* 3368 */  [ 0.385170352, 17 ],
+  /* 3369 */  [ 0.385322842, 17 ],
+  /* 3370 */  [ 0.385475347, 17 ],
+  /* 3371 */  [ 0.385627867, 17 ],
+  /* 3372 */  [ 0.385780402, 17 ],
+  /* 3373 */  [ 0.385932953, 17 ],
+  /* 3374 */  [ 0.386085518, 17 ],
+  /* 3375 */  [ 0.386238098, 17 ],
+
+  /* 3376 */  [ 0.386390694, 17 ],
+  /* 3377 */  [ 0.386543304, 17 ],
+  /* 3378 */  [ 0.386695930, 17 ],
+  /* 3379 */  [ 0.386848570, 17 ],
+  /* 3380 */  [ 0.387001226, 17 ],
+  /* 3381 */  [ 0.387153897, 17 ],
+  /* 3382 */  [ 0.387306582, 17 ],
+  /* 3383 */  [ 0.387459283, 17 ],
+  /* 3384 */  [ 0.387611999, 17 ],
+  /* 3385 */  [ 0.387764730, 17 ],
+  /* 3386 */  [ 0.387917476, 17 ],
+  /* 3387 */  [ 0.388070237, 17 ],
+  /* 3388 */  [ 0.388223013, 17 ],
+  /* 3389 */  [ 0.388375804, 17 ],
+  /* 3390 */  [ 0.388528610, 17 ],
+  /* 3391 */  [ 0.388681431, 17 ],
+
+  /* 3392 */  [ 0.388834268, 17 ],
+  /* 3393 */  [ 0.388987119, 17 ],
+  /* 3394 */  [ 0.389139985, 17 ],
+  /* 3395 */  [ 0.389292866, 17 ],
+  /* 3396 */  [ 0.389445762, 17 ],
+  /* 3397 */  [ 0.389598674, 17 ],
+  /* 3398 */  [ 0.389751600, 17 ],
+  /* 3399 */  [ 0.389904541, 17 ],
+  /* 3400 */  [ 0.390057497, 17 ],
+  /* 3401 */  [ 0.390210468, 17 ],
+  /* 3402 */  [ 0.390363455, 17 ],
+  /* 3403 */  [ 0.390516456, 17 ],
+  /* 3404 */  [ 0.390669472, 17 ],
+  /* 3405 */  [ 0.390822503, 17 ],
+  /* 3406 */  [ 0.390975549, 17 ],
+  /* 3407 */  [ 0.391128611, 17 ],
+
+  /* 3408 */  [ 0.391281687, 17 ],
+  /* 3409 */  [ 0.391434778, 17 ],
+  /* 3410 */  [ 0.391587884, 17 ],
+  /* 3411 */  [ 0.391741005, 17 ],
+  /* 3412 */  [ 0.391894141, 17 ],
+  /* 3413 */  [ 0.392047292, 17 ],
+  /* 3414 */  [ 0.392200458, 17 ],
+  /* 3415 */  [ 0.392353638, 17 ],
+  /* 3416 */  [ 0.392506834, 17 ],
+  /* 3417 */  [ 0.392660045, 17 ],
+  /* 3418 */  [ 0.392813271, 17 ],
+  /* 3419 */  [ 0.392966511, 17 ],
+  /* 3420 */  [ 0.393119767, 17 ],
+  /* 3421 */  [ 0.393273038, 17 ],
+  /* 3422 */  [ 0.393426323, 17 ],
+  /* 3423 */  [ 0.393579623, 17 ],
+
+  /* 3424 */  [ 0.393732939, 17 ],
+  /* 3425 */  [ 0.393886269, 17 ],
+  /* 3426 */  [ 0.394039614, 17 ],
+  /* 3427 */  [ 0.394192974, 17 ],
+  /* 3428 */  [ 0.394346349, 17 ],
+  /* 3429 */  [ 0.394499739, 17 ],
+  /* 3430 */  [ 0.394653144, 17 ],
+  /* 3431 */  [ 0.394806564, 17 ],
+  /* 3432 */  [ 0.394959999, 17 ],
+  /* 3433 */  [ 0.395113448, 17 ],
+  /* 3434 */  [ 0.395266913, 17 ],
+  /* 3435 */  [ 0.395420392, 17 ],
+  /* 3436 */  [ 0.395573886, 17 ],
+  /* 3437 */  [ 0.395727395, 17 ],
+  /* 3438 */  [ 0.395880919, 17 ],
+  /* 3439 */  [ 0.396034458, 17 ],
+
+  /* 3440 */  [ 0.396188012, 17 ],
+  /* 3441 */  [ 0.396341581, 17 ],
+  /* 3442 */  [ 0.396495164, 17 ],
+  /* 3443 */  [ 0.396648763, 17 ],
+  /* 3444 */  [ 0.396802376, 17 ],
+  /* 3445 */  [ 0.396956004, 17 ],
+  /* 3446 */  [ 0.397109647, 17 ],
+  /* 3447 */  [ 0.397263305, 17 ],
+  /* 3448 */  [ 0.397416978, 17 ],
+  /* 3449 */  [ 0.397570666, 17 ],
+  /* 3450 */  [ 0.397724368, 17 ],
+  /* 3451 */  [ 0.397878085, 17 ],
+  /* 3452 */  [ 0.398031818, 17 ],
+  /* 3453 */  [ 0.398185565, 17 ],
+  /* 3454 */  [ 0.398339326, 17 ],
+  /* 3455 */  [ 0.398493103, 17 ],
+
+  /* 3456 */  [ 0.398646895, 17 ],
+  /* 3457 */  [ 0.398800701, 17 ],
+  /* 3458 */  [ 0.398954522, 17 ],
+  /* 3459 */  [ 0.399108358, 17 ],
+  /* 3460 */  [ 0.399262209, 17 ],
+  /* 3461 */  [ 0.399416075, 17 ],
+  /* 3462 */  [ 0.399569955, 17 ],
+  /* 3463 */  [ 0.399723851, 17 ],
+  /* 3464 */  [ 0.399877761, 17 ],
+  /* 3465 */  [ 0.400031686, 17 ],
+  /* 3466 */  [ 0.400185625, 17 ],
+  /* 3467 */  [ 0.400339580, 17 ],
+  /* 3468 */  [ 0.400493549, 17 ],
+  /* 3469 */  [ 0.400647534, 17 ],
+  /* 3470 */  [ 0.400801533, 17 ],
+  /* 3471 */  [ 0.400955546, 17 ],
+
+  /* 3472 */  [ 0.401109575, 17 ],
+  /* 3473 */  [ 0.401263618, 17 ],
+  /* 3474 */  [ 0.401417676, 17 ],
+  /* 3475 */  [ 0.401571749, 17 ],
+  /* 3476 */  [ 0.401725837, 17 ],
+  /* 3477 */  [ 0.401879939, 17 ],
+  /* 3478 */  [ 0.402034056, 17 ],
+  /* 3479 */  [ 0.402188188, 17 ],
+  /* 3480 */  [ 0.402342335, 17 ],
+  /* 3481 */  [ 0.402496497, 17 ],
+  /* 3482 */  [ 0.402650673, 17 ],
+  /* 3483 */  [ 0.402804864, 17 ],
+  /* 3484 */  [ 0.402959070, 17 ],
+  /* 3485 */  [ 0.403113291, 17 ],
+  /* 3486 */  [ 0.403267526, 17 ],
+  /* 3487 */  [ 0.403421776, 17 ],
+
+  /* 3488 */  [ 0.403576041, 17 ],
+  /* 3489 */  [ 0.403730320, 17 ],
+  /* 3490 */  [ 0.403884615, 17 ],
+  /* 3491 */  [ 0.404038924, 17 ],
+  /* 3492 */  [ 0.404193247, 17 ],
+  /* 3493 */  [ 0.404347586, 17 ],
+  /* 3494 */  [ 0.404501939, 17 ],
+  /* 3495 */  [ 0.404656307, 17 ],
+  /* 3496 */  [ 0.404810690, 17 ],
+  /* 3497 */  [ 0.404965087, 17 ],
+  /* 3498 */  [ 0.405119499, 17 ],
+  /* 3499 */  [ 0.405273926, 17 ],
+  /* 3500 */  [ 0.405428368, 17 ],
+  /* 3501 */  [ 0.405582824, 17 ],
+  /* 3502 */  [ 0.405737295, 17 ],
+  /* 3503 */  [ 0.405891781, 17 ],
+
+  /* 3504 */  [ 0.406046281, 17 ],
+  /* 3505 */  [ 0.406200796, 17 ],
+  /* 3506 */  [ 0.406355326, 17 ],
+  /* 3507 */  [ 0.406509870, 17 ],
+  /* 3508 */  [ 0.406664429, 17 ],
+  /* 3509 */  [ 0.406819003, 17 ],
+  /* 3510 */  [ 0.406973592, 17 ],
+  /* 3511 */  [ 0.407128195, 17 ],
+  /* 3512 */  [ 0.407282813, 17 ],
+  /* 3513 */  [ 0.407437445, 17 ],
+  /* 3514 */  [ 0.407592093, 17 ],
+  /* 3515 */  [ 0.407746754, 17 ],
+  /* 3516 */  [ 0.407901431, 17 ],
+  /* 3517 */  [ 0.408056122, 17 ],
+  /* 3518 */  [ 0.408210828, 17 ],
+  /* 3519 */  [ 0.408365549, 17 ],
+
+  /* 3520 */  [ 0.408520284, 17 ],
+  /* 3521 */  [ 0.408675034, 17 ],
+  /* 3522 */  [ 0.408829798, 17 ],
+  /* 3523 */  [ 0.408984577, 17 ],
+  /* 3524 */  [ 0.409139371, 17 ],
+  /* 3525 */  [ 0.409294180, 17 ],
+  /* 3526 */  [ 0.409449003, 17 ],
+  /* 3527 */  [ 0.409603840, 17 ],
+  /* 3528 */  [ 0.409758693, 17 ],
+  /* 3529 */  [ 0.409913560, 17 ],
+  /* 3530 */  [ 0.410068441, 17 ],
+  /* 3531 */  [ 0.410223338, 17 ],
+  /* 3532 */  [ 0.410378249, 17 ],
+  /* 3533 */  [ 0.410533174, 17 ],
+  /* 3534 */  [ 0.410688114, 17 ],
+  /* 3535 */  [ 0.410843069, 17 ],
+
+  /* 3536 */  [ 0.410998038, 17 ],
+  /* 3537 */  [ 0.411153022, 17 ],
+  /* 3538 */  [ 0.411308021, 17 ],
+  /* 3539 */  [ 0.411463034, 17 ],
+  /* 3540 */  [ 0.411618062, 17 ],
+  /* 3541 */  [ 0.411773104, 17 ],
+  /* 3542 */  [ 0.411928161, 17 ],
+  /* 3543 */  [ 0.412083232, 17 ],
+  /* 3544 */  [ 0.412238319, 17 ],
+  /* 3545 */  [ 0.412393419, 17 ],
+  /* 3546 */  [ 0.412548535, 17 ],
+  /* 3547 */  [ 0.412703664, 17 ],
+  /* 3548 */  [ 0.412858809, 17 ],
+  /* 3549 */  [ 0.413013968, 17 ],
+  /* 3550 */  [ 0.413169142, 17 ],
+  /* 3551 */  [ 0.413324330, 17 ],
+
+  /* 3552 */  [ 0.413479532, 17 ],
+  /* 3553 */  [ 0.413634750, 17 ],
+  /* 3554 */  [ 0.413789982, 17 ],
+  /* 3555 */  [ 0.413945228, 17 ],
+  /* 3556 */  [ 0.414100489, 17 ],
+  /* 3557 */  [ 0.414255765, 17 ],
+  /* 3558 */  [ 0.414411055, 17 ],
+  /* 3559 */  [ 0.414566359, 17 ],
+  /* 3560 */  [ 0.414721679, 17 ],
+  /* 3561 */  [ 0.414877012, 17 ],
+  /* 3562 */  [ 0.415032361, 17 ],
+  /* 3563 */  [ 0.415187723, 17 ],
+  /* 3564 */  [ 0.415343101, 17 ],
+  /* 3565 */  [ 0.415498493, 17 ],
+  /* 3566 */  [ 0.415653899, 17 ],
+  /* 3567 */  [ 0.415809320, 17 ],
+
+  /* 3568 */  [ 0.415964756, 17 ],
+  /* 3569 */  [ 0.416120206, 17 ],
+  /* 3570 */  [ 0.416275670, 17 ],
+  /* 3571 */  [ 0.416431149, 17 ],
+  /* 3572 */  [ 0.416586643, 17 ],
+  /* 3573 */  [ 0.416742151, 17 ],
+  /* 3574 */  [ 0.416897673, 17 ],
+  /* 3575 */  [ 0.417053210, 17 ],
+  /* 3576 */  [ 0.417208762, 17 ],
+  /* 3577 */  [ 0.417364328, 17 ],
+  /* 3578 */  [ 0.417519909, 17 ],
+  /* 3579 */  [ 0.417675504, 17 ],
+  /* 3580 */  [ 0.417831113, 17 ],
+  /* 3581 */  [ 0.417986737, 17 ],
+  /* 3582 */  [ 0.418142376, 17 ],
+  /* 3583 */  [ 0.418298029, 17 ],
+
+  /* 3584 */  [ 0.418453696, 17 ],
+  /* 3585 */  [ 0.418609378, 17 ],
+  /* 3586 */  [ 0.418765075, 17 ],
+  /* 3587 */  [ 0.418920786, 17 ],
+  /* 3588 */  [ 0.419076511, 17 ],
+  /* 3589 */  [ 0.419232251, 17 ],
+  /* 3590 */  [ 0.419388005, 17 ],
+  /* 3591 */  [ 0.419543774, 17 ],
+  /* 3592 */  [ 0.419699557, 17 ],
+  /* 3593 */  [ 0.419855355, 17 ],
+  /* 3594 */  [ 0.420011167, 17 ],
+  /* 3595 */  [ 0.420166994, 17 ],
+  /* 3596 */  [ 0.420322835, 17 ],
+  /* 3597 */  [ 0.420478690, 17 ],
+  /* 3598 */  [ 0.420634560, 17 ],
+  /* 3599 */  [ 0.420790445, 17 ],
+
+  /* 3600 */  [ 0.420946343, 17 ],
+  /* 3601 */  [ 0.421102257, 17 ],
+  /* 3602 */  [ 0.421258184, 17 ],
+  /* 3603 */  [ 0.421414127, 17 ],
+  /* 3604 */  [ 0.421570083, 17 ],
+  /* 3605 */  [ 0.421726054, 17 ],
+  /* 3606 */  [ 0.421882040, 17 ],
+  /* 3607 */  [ 0.422038039, 17 ],
+  /* 3608 */  [ 0.422194054, 17 ],
+  /* 3609 */  [ 0.422350082, 17 ],
+  /* 3610 */  [ 0.422506125, 17 ],
+  /* 3611 */  [ 0.422662183, 17 ],
+  /* 3612 */  [ 0.422818255, 17 ],
+  /* 3613 */  [ 0.422974341, 17 ],
+  /* 3614 */  [ 0.423130442, 17 ],
+  /* 3615 */  [ 0.423286557, 17 ],
+
+  /* 3616 */  [ 0.423442686, 17 ],
+  /* 3617 */  [ 0.423598830, 17 ],
+  /* 3618 */  [ 0.423754988, 17 ],
+  /* 3619 */  [ 0.423911161, 17 ],
+  /* 3620 */  [ 0.424067348, 17 ],
+  /* 3621 */  [ 0.424223550, 17 ],
+  /* 3622 */  [ 0.424379765, 17 ],
+  /* 3623 */  [ 0.424535996, 17 ],
+  /* 3624 */  [ 0.424692240, 17 ],
+  /* 3625 */  [ 0.424848499, 17 ],
+  /* 3626 */  [ 0.425004772, 17 ],
+  /* 3627 */  [ 0.425161060, 17 ],
+  /* 3628 */  [ 0.425317362, 17 ],
+  /* 3629 */  [ 0.425473678, 17 ],
+  /* 3630 */  [ 0.425630009, 17 ],
+  /* 3631 */  [ 0.425786354, 17 ],
+
+  /* 3632 */  [ 0.425942714, 17 ],
+  /* 3633 */  [ 0.426099088, 17 ],
+  /* 3634 */  [ 0.426255476, 17 ],
+  /* 3635 */  [ 0.426411878, 17 ],
+  /* 3636 */  [ 0.426568295, 17 ],
+  /* 3637 */  [ 0.426724726, 17 ],
+  /* 3638 */  [ 0.426881172, 17 ],
+  /* 3639 */  [ 0.427037632, 17 ],
+  /* 3640 */  [ 0.427194106, 17 ],
+  /* 3641 */  [ 0.427350594, 17 ],
+  /* 3642 */  [ 0.427507097, 17 ],
+  /* 3643 */  [ 0.427663614, 17 ],
+  /* 3644 */  [ 0.427820146, 17 ],
+  /* 3645 */  [ 0.427976692, 17 ],
+  /* 3646 */  [ 0.428133252, 17 ],
+  /* 3647 */  [ 0.428289826, 17 ],
+
+  /* 3648 */  [ 0.428446415, 17 ],
+  /* 3649 */  [ 0.428603018, 17 ],
+  /* 3650 */  [ 0.428759635, 17 ],
+  /* 3651 */  [ 0.428916267, 17 ],
+  /* 3652 */  [ 0.429072913, 17 ],
+  /* 3653 */  [ 0.429229573, 17 ],
+  /* 3654 */  [ 0.429386248, 17 ],
+  /* 3655 */  [ 0.429542937, 17 ],
+  /* 3656 */  [ 0.429699640, 17 ],
+  /* 3657 */  [ 0.429856357, 17 ],
+  /* 3658 */  [ 0.430013089, 17 ],
+  /* 3659 */  [ 0.430169835, 17 ],
+  /* 3660 */  [ 0.430326595, 17 ],
+  /* 3661 */  [ 0.430483370, 17 ],
+  /* 3662 */  [ 0.430640159, 17 ],
+  /* 3663 */  [ 0.430796962, 17 ],
+
+  /* 3664 */  [ 0.430953779, 17 ],
+  /* 3665 */  [ 0.431110611, 17 ],
+  /* 3666 */  [ 0.431267457, 17 ],
+  /* 3667 */  [ 0.431424317, 17 ],
+  /* 3668 */  [ 0.431581192, 17 ],
+  /* 3669 */  [ 0.431738080, 17 ],
+  /* 3670 */  [ 0.431894983, 17 ],
+  /* 3671 */  [ 0.432051900, 17 ],
+  /* 3672 */  [ 0.432208832, 17 ],
+  /* 3673 */  [ 0.432365778, 17 ],
+  /* 3674 */  [ 0.432522737, 17 ],
+  /* 3675 */  [ 0.432679712, 17 ],
+  /* 3676 */  [ 0.432836700, 17 ],
+  /* 3677 */  [ 0.432993703, 17 ],
+  /* 3678 */  [ 0.433150720, 17 ],
+  /* 3679 */  [ 0.433307751, 17 ],
+
+  /* 3680 */  [ 0.433464796, 17 ],
+  /* 3681 */  [ 0.433621856, 17 ],
+  /* 3682 */  [ 0.433778929, 17 ],
+  /* 3683 */  [ 0.433936017, 17 ],
+  /* 3684 */  [ 0.434093120, 17 ],
+  /* 3685 */  [ 0.434250236, 17 ],
+  /* 3686 */  [ 0.434407367, 17 ],
+  /* 3687 */  [ 0.434564512, 17 ],
+  /* 3688 */  [ 0.434721671, 17 ],
+  /* 3689 */  [ 0.434878844, 17 ],
+  /* 3690 */  [ 0.435036032, 17 ],
+  /* 3691 */  [ 0.435193233, 17 ],
+  /* 3692 */  [ 0.435350449, 17 ],
+  /* 3693 */  [ 0.435507679, 17 ],
+  /* 3694 */  [ 0.435664924, 17 ],
+  /* 3695 */  [ 0.435822182, 17 ],
+
+  /* 3696 */  [ 0.435979455, 17 ],
+  /* 3697 */  [ 0.436136741, 17 ],
+  /* 3698 */  [ 0.436294042, 17 ],
+  /* 3699 */  [ 0.436451358, 17 ],
+  /* 3700 */  [ 0.436608687, 17 ],
+  /* 3701 */  [ 0.436766031, 17 ],
+  /* 3702 */  [ 0.436923388, 17 ],
+  /* 3703 */  [ 0.437080760, 17 ],
+  /* 3704 */  [ 0.437238146, 17 ],
+  /* 3705 */  [ 0.437395547, 17 ],
+  /* 3706 */  [ 0.437552961, 17 ],
+  /* 3707 */  [ 0.437710389, 17 ],
+  /* 3708 */  [ 0.437867832, 17 ],
+  /* 3709 */  [ 0.438025289, 17 ],
+  /* 3710 */  [ 0.438182760, 17 ],
+  /* 3711 */  [ 0.438340245, 17 ],
+
+  /* 3712 */  [ 0.438497744, 17 ],
+  /* 3713 */  [ 0.438655258, 17 ],
+  /* 3714 */  [ 0.438812785, 17 ],
+  /* 3715 */  [ 0.438970327, 17 ],
+  /* 3716 */  [ 0.439127883, 17 ],
+  /* 3717 */  [ 0.439285453, 17 ],
+  /* 3718 */  [ 0.439443037, 17 ],
+  /* 3719 */  [ 0.439600635, 17 ],
+  /* 3720 */  [ 0.439758248, 17 ],
+  /* 3721 */  [ 0.439915874, 17 ],
+  /* 3722 */  [ 0.440073515, 17 ],
+  /* 3723 */  [ 0.440231170, 17 ],
+  /* 3724 */  [ 0.440388839, 17 ],
+  /* 3725 */  [ 0.440546522, 17 ],
+  /* 3726 */  [ 0.440704219, 17 ],
+  /* 3727 */  [ 0.440861930, 17 ],
+
+  /* 3728 */  [ 0.441019655, 17 ],
+  /* 3729 */  [ 0.441177395, 17 ],
+  /* 3730 */  [ 0.441335148, 17 ],
+  /* 3731 */  [ 0.441492916, 17 ],
+  /* 3732 */  [ 0.441650697, 17 ],
+  /* 3733 */  [ 0.441808493, 17 ],
+  /* 3734 */  [ 0.441966303, 17 ],
+  /* 3735 */  [ 0.442124127, 17 ],
+  /* 3736 */  [ 0.442281965, 17 ],
+  /* 3737 */  [ 0.442439817, 17 ],
+  /* 3738 */  [ 0.442597683, 17 ],
+  /* 3739 */  [ 0.442755564, 17 ],
+  /* 3740 */  [ 0.442913458, 17 ],
+  /* 3741 */  [ 0.443071366, 17 ],
+  /* 3742 */  [ 0.443229289, 17 ],
+  /* 3743 */  [ 0.443387226, 17 ],
+
+  /* 3744 */  [ 0.443545176, 17 ],
+  /* 3745 */  [ 0.443703141, 17 ],
+  /* 3746 */  [ 0.443861120, 17 ],
+  /* 3747 */  [ 0.444019113, 17 ],
+  /* 3748 */  [ 0.444177119, 17 ],
+  /* 3749 */  [ 0.444335140, 17 ],
+  /* 3750 */  [ 0.444493175, 17 ],
+  /* 3751 */  [ 0.444651224, 17 ],
+  /* 3752 */  [ 0.444809288, 17 ],
+  /* 3753 */  [ 0.444967365, 17 ],
+  /* 3754 */  [ 0.445125456, 17 ],
+  /* 3755 */  [ 0.445283561, 17 ],
+  /* 3756 */  [ 0.445441680, 17 ],
+  /* 3757 */  [ 0.445599814, 17 ],
+  /* 3758 */  [ 0.445757961, 17 ],
+  /* 3759 */  [ 0.445916122, 17 ],
+
+  /* 3760 */  [ 0.446074298, 17 ],
+  /* 3761 */  [ 0.446232487, 17 ],
+  /* 3762 */  [ 0.446390690, 17 ],
+  /* 3763 */  [ 0.446548908, 17 ],
+  /* 3764 */  [ 0.446707139, 17 ],
+  /* 3765 */  [ 0.446865385, 17 ],
+  /* 3766 */  [ 0.447023644, 17 ],
+  /* 3767 */  [ 0.447181918, 17 ],
+  /* 3768 */  [ 0.447340205, 17 ],
+  /* 3769 */  [ 0.447498507, 17 ],
+  /* 3770 */  [ 0.447656822, 17 ],
+  /* 3771 */  [ 0.447815152, 17 ],
+  /* 3772 */  [ 0.447973495, 17 ],
+  /* 3773 */  [ 0.448131853, 17 ],
+  /* 3774 */  [ 0.448290224, 17 ],
+  /* 3775 */  [ 0.448448609, 17 ],
+
+  /* 3776 */  [ 0.448607009, 17 ],
+  /* 3777 */  [ 0.448765422, 17 ],
+  /* 3778 */  [ 0.448923850, 17 ],
+  /* 3779 */  [ 0.449082291, 17 ],
+  /* 3780 */  [ 0.449240746, 17 ],
+  /* 3781 */  [ 0.449399216, 17 ],
+  /* 3782 */  [ 0.449557699, 17 ],
+  /* 3783 */  [ 0.449716196, 17 ],
+  /* 3784 */  [ 0.449874708, 17 ],
+  /* 3785 */  [ 0.450033233, 17 ],
+  /* 3786 */  [ 0.450191772, 17 ],
+  /* 3787 */  [ 0.450350325, 17 ],
+  /* 3788 */  [ 0.450508892, 17 ],
+  /* 3789 */  [ 0.450667473, 17 ],
+  /* 3790 */  [ 0.450826068, 17 ],
+  /* 3791 */  [ 0.450984677, 17 ],
+
+  /* 3792 */  [ 0.451143300, 17 ],
+  /* 3793 */  [ 0.451301937, 17 ],
+  /* 3794 */  [ 0.451460588, 17 ],
+  /* 3795 */  [ 0.451619252, 17 ],
+  /* 3796 */  [ 0.451777931, 17 ],
+  /* 3797 */  [ 0.451936623, 17 ],
+  /* 3798 */  [ 0.452095330, 17 ],
+  /* 3799 */  [ 0.452254050, 17 ],
+  /* 3800 */  [ 0.452412785, 17 ],
+  /* 3801 */  [ 0.452571533, 17 ],
+  /* 3802 */  [ 0.452730295, 17 ],
+  /* 3803 */  [ 0.452889071, 17 ],
+  /* 3804 */  [ 0.453047861, 17 ],
+  /* 3805 */  [ 0.453206665, 17 ],
+  /* 3806 */  [ 0.453365483, 17 ],
+  /* 3807 */  [ 0.453524315, 17 ],
+
+  /* 3808 */  [ 0.453683161, 17 ],
+  /* 3809 */  [ 0.453842020, 17 ],
+  /* 3810 */  [ 0.454000894, 17 ],
+  /* 3811 */  [ 0.454159781, 17 ],
+  /* 3812 */  [ 0.454318683, 17 ],
+  /* 3813 */  [ 0.454477598, 17 ],
+  /* 3814 */  [ 0.454636527, 17 ],
+  /* 3815 */  [ 0.454795470, 17 ],
+  /* 3816 */  [ 0.454954427, 17 ],
+  /* 3817 */  [ 0.455113397, 17 ],
+  /* 3818 */  [ 0.455272382, 17 ],
+  /* 3819 */  [ 0.455431381, 17 ],
+  /* 3820 */  [ 0.455590393, 17 ],
+  /* 3821 */  [ 0.455749419, 17 ],
+  /* 3822 */  [ 0.455908459, 17 ],
+  /* 3823 */  [ 0.456067513, 17 ],
+
+  /* 3824 */  [ 0.456226581, 17 ],
+  /* 3825 */  [ 0.456385663, 17 ],
+  /* 3826 */  [ 0.456544759, 17 ],
+  /* 3827 */  [ 0.456703868, 17 ],
+  /* 3828 */  [ 0.456862992, 17 ],
+  /* 3829 */  [ 0.457022129, 17 ],
+  /* 3830 */  [ 0.457181280, 17 ],
+  /* 3831 */  [ 0.457340445, 17 ],
+  /* 3832 */  [ 0.457499623, 17 ],
+  /* 3833 */  [ 0.457658816, 17 ],
+  /* 3834 */  [ 0.457818022, 17 ],
+  /* 3835 */  [ 0.457977243, 17 ],
+  /* 3836 */  [ 0.458136477, 17 ],
+  /* 3837 */  [ 0.458295725, 17 ],
+  /* 3838 */  [ 0.458454987, 17 ],
+  /* 3839 */  [ 0.458614262, 17 ],
+
+  /* 3840 */  [ 0.458773552, 17 ],
+  /* 3841 */  [ 0.458932855, 17 ],
+  /* 3842 */  [ 0.459092172, 17 ],
+  /* 3843 */  [ 0.459251503, 17 ],
+  /* 3844 */  [ 0.459410848, 17 ],
+  /* 3845 */  [ 0.459570206, 17 ],
+  /* 3846 */  [ 0.459729579, 17 ],
+  /* 3847 */  [ 0.459888965, 17 ],
+  /* 3848 */  [ 0.460048365, 17 ],
+  /* 3849 */  [ 0.460207779, 17 ],
+  /* 3850 */  [ 0.460367206, 17 ],
+  /* 3851 */  [ 0.460526648, 17 ],
+  /* 3852 */  [ 0.460686103, 17 ],
+  /* 3853 */  [ 0.460845572, 17 ],
+  /* 3854 */  [ 0.461005055, 17 ],
+  /* 3855 */  [ 0.461164552, 17 ],
+
+  /* 3856 */  [ 0.461324062, 17 ],
+  /* 3857 */  [ 0.461483586, 17 ],
+  /* 3858 */  [ 0.461643124, 17 ],
+  /* 3859 */  [ 0.461802676, 17 ],
+  /* 3860 */  [ 0.461962242, 17 ],
+  /* 3861 */  [ 0.462121821, 17 ],
+  /* 3862 */  [ 0.462281414, 17 ],
+  /* 3863 */  [ 0.462441021, 17 ],
+  /* 3864 */  [ 0.462600642, 17 ],
+  /* 3865 */  [ 0.462760276, 17 ],
+  /* 3866 */  [ 0.462919924, 17 ],
+  /* 3867 */  [ 0.463079586, 17 ],
+  /* 3868 */  [ 0.463239262, 17 ],
+  /* 3869 */  [ 0.463398951, 17 ],
+  /* 3870 */  [ 0.463558655, 17 ],
+  /* 3871 */  [ 0.463718372, 17 ],
+
+  /* 3872 */  [ 0.463878102, 17 ],
+  /* 3873 */  [ 0.464037847, 17 ],
+  /* 3874 */  [ 0.464197605, 17 ],
+  /* 3875 */  [ 0.464357377, 17 ],
+  /* 3876 */  [ 0.464517163, 17 ],
+  /* 3877 */  [ 0.464676962, 17 ],
+  /* 3878 */  [ 0.464836776, 17 ],
+  /* 3879 */  [ 0.464996603, 17 ],
+  /* 3880 */  [ 0.465156443, 17 ],
+  /* 3881 */  [ 0.465316298, 17 ],
+  /* 3882 */  [ 0.465476166, 17 ],
+  /* 3883 */  [ 0.465636048, 17 ],
+  /* 3884 */  [ 0.465795943, 17 ],
+  /* 3885 */  [ 0.465955853, 17 ],
+  /* 3886 */  [ 0.466115776, 17 ],
+  /* 3887 */  [ 0.466275713, 17 ],
+
+  /* 3888 */  [ 0.466435663, 17 ],
+  /* 3889 */  [ 0.466595627, 17 ],
+  /* 3890 */  [ 0.466755605, 17 ],
+  /* 3891 */  [ 0.466915597, 17 ],
+  /* 3892 */  [ 0.467075602, 17 ],
+  /* 3893 */  [ 0.467235621, 17 ],
+  /* 3894 */  [ 0.467395654, 17 ],
+  /* 3895 */  [ 0.467555701, 17 ],
+  /* 3896 */  [ 0.467715761, 17 ],
+  /* 3897 */  [ 0.467875835, 17 ],
+  /* 3898 */  [ 0.468035922, 17 ],
+  /* 3899 */  [ 0.468196023, 17 ],
+  /* 3900 */  [ 0.468356138, 17 ],
+  /* 3901 */  [ 0.468516267, 17 ],
+  /* 3902 */  [ 0.468676409, 17 ],
+  /* 3903 */  [ 0.468836565, 17 ],
+
+  /* 3904 */  [ 0.468996735, 17 ],
+  /* 3905 */  [ 0.469156918, 17 ],
+  /* 3906 */  [ 0.469317115, 17 ],
+  /* 3907 */  [ 0.469477326, 17 ],
+  /* 3908 */  [ 0.469637550, 17 ],
+  /* 3909 */  [ 0.469797788, 17 ],
+  /* 3910 */  [ 0.469958040, 17 ],
+  /* 3911 */  [ 0.470118305, 17 ],
+  /* 3912 */  [ 0.470278584, 17 ],
+  /* 3913 */  [ 0.470438877, 17 ],
+  /* 3914 */  [ 0.470599183, 17 ],
+  /* 3915 */  [ 0.470759503, 17 ],
+  /* 3916 */  [ 0.470919836, 17 ],
+  /* 3917 */  [ 0.471080184, 17 ],
+  /* 3918 */  [ 0.471240545, 17 ],
+  /* 3919 */  [ 0.471400919, 17 ],
+
+  /* 3920 */  [ 0.471561307, 17 ],
+  /* 3921 */  [ 0.471721709, 17 ],
+  /* 3922 */  [ 0.471882125, 17 ],
+  /* 3923 */  [ 0.472042554, 17 ],
+  /* 3924 */  [ 0.472202996, 17 ],
+  /* 3925 */  [ 0.472363453, 17 ],
+  /* 3926 */  [ 0.472523923, 17 ],
+  /* 3927 */  [ 0.472684406, 17 ],
+  /* 3928 */  [ 0.472844904, 17 ],
+  /* 3929 */  [ 0.473005414, 17 ],
+  /* 3930 */  [ 0.473165939, 17 ],
+  /* 3931 */  [ 0.473326477, 17 ],
+  /* 3932 */  [ 0.473487029, 17 ],
+  /* 3933 */  [ 0.473647594, 17 ],
+  /* 3934 */  [ 0.473808173, 17 ],
+  /* 3935 */  [ 0.473968765, 17 ],
+
+  /* 3936 */  [ 0.474129372, 17 ],
+  /* 3937 */  [ 0.474289991, 17 ],
+  /* 3938 */  [ 0.474450625, 17 ],
+  /* 3939 */  [ 0.474611272, 17 ],
+  /* 3940 */  [ 0.474771932, 17 ],
+  /* 3941 */  [ 0.474932606, 17 ],
+  /* 3942 */  [ 0.475093294, 17 ],
+  /* 3943 */  [ 0.475253995, 17 ],
+  /* 3944 */  [ 0.475414710, 17 ],
+  /* 3945 */  [ 0.475575439, 17 ],
+  /* 3946 */  [ 0.475736181, 17 ],
+  /* 3947 */  [ 0.475896936, 17 ],
+  /* 3948 */  [ 0.476057705, 17 ],
+  /* 3949 */  [ 0.476218488, 17 ],
+  /* 3950 */  [ 0.476379285, 17 ],
+  /* 3951 */  [ 0.476540095, 17 ],
+
+  /* 3952 */  [ 0.476700918, 17 ],
+  /* 3953 */  [ 0.476861755, 17 ],
+  /* 3954 */  [ 0.477022606, 17 ],
+  /* 3955 */  [ 0.477183470, 17 ],
+  /* 3956 */  [ 0.477344348, 17 ],
+  /* 3957 */  [ 0.477505239, 17 ],
+  /* 3958 */  [ 0.477666144, 17 ],
+  /* 3959 */  [ 0.477827062, 17 ],
+  /* 3960 */  [ 0.477987994, 17 ],
+  /* 3961 */  [ 0.478148940, 17 ],
+  /* 3962 */  [ 0.478309899, 17 ],
+  /* 3963 */  [ 0.478470871, 17 ],
+  /* 3964 */  [ 0.478631857, 17 ],
+  /* 3965 */  [ 0.478792857, 17 ],
+  /* 3966 */  [ 0.478953870, 17 ],
+  /* 3967 */  [ 0.479114897, 17 ],
+
+  /* 3968 */  [ 0.479275937, 17 ],
+  /* 3969 */  [ 0.479436991, 17 ],
+  /* 3970 */  [ 0.479598058, 17 ],
+  /* 3971 */  [ 0.479759139, 17 ],
+  /* 3972 */  [ 0.479920233, 17 ],
+  /* 3973 */  [ 0.480081341, 17 ],
+  /* 3974 */  [ 0.480242463, 17 ],
+  /* 3975 */  [ 0.480403598, 17 ],
+  /* 3976 */  [ 0.480564746, 17 ],
+  /* 3977 */  [ 0.480725908, 17 ],
+  /* 3978 */  [ 0.480887083, 17 ],
+  /* 3979 */  [ 0.481048272, 17 ],
+  /* 3980 */  [ 0.481209475, 17 ],
+  /* 3981 */  [ 0.481370691, 17 ],
+  /* 3982 */  [ 0.481531920, 17 ],
+  /* 3983 */  [ 0.481693163, 17 ],
+
+  /* 3984 */  [ 0.481854420, 17 ],
+  /* 3985 */  [ 0.482015690, 17 ],
+  /* 3986 */  [ 0.482176973, 17 ],
+  /* 3987 */  [ 0.482338270, 17 ],
+  /* 3988 */  [ 0.482499580, 17 ],
+  /* 3989 */  [ 0.482660904, 17 ],
+  /* 3990 */  [ 0.482822242, 17 ],
+  /* 3991 */  [ 0.482983592, 17 ],
+  /* 3992 */  [ 0.483144957, 17 ],
+  /* 3993 */  [ 0.483306335, 17 ],
+  /* 3994 */  [ 0.483467726, 17 ],
+  /* 3995 */  [ 0.483629131, 17 ],
+  /* 3996 */  [ 0.483790549, 17 ],
+  /* 3997 */  [ 0.483951980, 17 ],
+  /* 3998 */  [ 0.484113426, 17 ],
+  /* 3999 */  [ 0.484274884, 17 ],
+
+  /* 4000 */  [ 0.484436356, 17 ],
+  /* 4001 */  [ 0.484597842, 17 ],
+  /* 4002 */  [ 0.484759341, 17 ],
+  /* 4003 */  [ 0.484920853, 17 ],
+  /* 4004 */  [ 0.485082379, 17 ],
+  /* 4005 */  [ 0.485243918, 17 ],
+  /* 4006 */  [ 0.485405471, 17 ],
+  /* 4007 */  [ 0.485567037, 17 ],
+  /* 4008 */  [ 0.485728617, 17 ],
+  /* 4009 */  [ 0.485890210, 17 ],
+  /* 4010 */  [ 0.486051817, 17 ],
+  /* 4011 */  [ 0.486213436, 17 ],
+  /* 4012 */  [ 0.486375070, 17 ],
+  /* 4013 */  [ 0.486536717, 17 ],
+  /* 4014 */  [ 0.486698377, 17 ],
+  /* 4015 */  [ 0.486860051, 17 ],
+
+  /* 4016 */  [ 0.487021738, 17 ],
+  /* 4017 */  [ 0.487183438, 17 ],
+  /* 4018 */  [ 0.487345152, 17 ],
+  /* 4019 */  [ 0.487506879, 17 ],
+  /* 4020 */  [ 0.487668620, 17 ],
+  /* 4021 */  [ 0.487830374, 17 ],
+  /* 4022 */  [ 0.487992142, 17 ],
+  /* 4023 */  [ 0.488153923, 17 ],
+  /* 4024 */  [ 0.488315717, 17 ],
+  /* 4025 */  [ 0.488477525, 17 ],
+  /* 4026 */  [ 0.488639346, 17 ],
+  /* 4027 */  [ 0.488801181, 17 ],
+  /* 4028 */  [ 0.488963029, 17 ],
+  /* 4029 */  [ 0.489124890, 17 ],
+  /* 4030 */  [ 0.489286765, 17 ],
+  /* 4031 */  [ 0.489448653, 17 ],
+
+  /* 4032 */  [ 0.489610555, 17 ],
+  /* 4033 */  [ 0.489772470, 17 ],
+  /* 4034 */  [ 0.489934398, 17 ],
+  /* 4035 */  [ 0.490096340, 17 ],
+  /* 4036 */  [ 0.490258295, 17 ],
+  /* 4037 */  [ 0.490420263, 17 ],
+  /* 4038 */  [ 0.490582245, 17 ],
+  /* 4039 */  [ 0.490744240, 17 ],
+  /* 4040 */  [ 0.490906249, 17 ],
+  /* 4041 */  [ 0.491068271, 17 ],
+  /* 4042 */  [ 0.491230306, 17 ],
+  /* 4043 */  [ 0.491392355, 17 ],
+  /* 4044 */  [ 0.491554417, 17 ],
+  /* 4045 */  [ 0.491716492, 17 ],
+  /* 4046 */  [ 0.491878581, 17 ],
+  /* 4047 */  [ 0.492040683, 17 ],
+
+  /* 4048 */  [ 0.492202799, 17 ],
+  /* 4049 */  [ 0.492364928, 17 ],
+  /* 4050 */  [ 0.492527070, 17 ],
+  /* 4051 */  [ 0.492689225, 17 ],
+  /* 4052 */  [ 0.492851394, 17 ],
+  /* 4053 */  [ 0.493013576, 17 ],
+  /* 4054 */  [ 0.493175772, 17 ],
+  /* 4055 */  [ 0.493337981, 17 ],
+  /* 4056 */  [ 0.493500203, 17 ],
+  /* 4057 */  [ 0.493662438, 17 ],
+  /* 4058 */  [ 0.493824687, 17 ],
+  /* 4059 */  [ 0.493986949, 17 ],
+  /* 4060 */  [ 0.494149225, 17 ],
+  /* 4061 */  [ 0.494311514, 17 ],
+  /* 4062 */  [ 0.494473816, 17 ],
+  /* 4063 */  [ 0.494636131, 17 ],
+
+  /* 4064 */  [ 0.494798460, 17 ],
+  /* 4065 */  [ 0.494960802, 17 ],
+  /* 4066 */  [ 0.495123158, 17 ],
+  /* 4067 */  [ 0.495285526, 17 ],
+  /* 4068 */  [ 0.495447908, 17 ],
+  /* 4069 */  [ 0.495610304, 17 ],
+  /* 4070 */  [ 0.495772712, 17 ],
+  /* 4071 */  [ 0.495935134, 17 ],
+  /* 4072 */  [ 0.496097570, 17 ],
+  /* 4073 */  [ 0.496260018, 17 ],
+  /* 4074 */  [ 0.496422480, 17 ],
+  /* 4075 */  [ 0.496584955, 17 ],
+  /* 4076 */  [ 0.496747444, 17 ],
+  /* 4077 */  [ 0.496909945, 17 ],
+  /* 4078 */  [ 0.497072460, 17 ],
+  /* 4079 */  [ 0.497234989, 17 ],
+
+  /* 4080 */  [ 0.497397530, 17 ],
+  /* 4081 */  [ 0.497560085, 17 ],
+  /* 4082 */  [ 0.497722653, 17 ],
+  /* 4083 */  [ 0.497885235, 17 ],
+  /* 4084 */  [ 0.498047829, 17 ],
+  /* 4085 */  [ 0.498210437, 17 ],
+  /* 4086 */  [ 0.498373058, 17 ],
+  /* 4087 */  [ 0.498535693, 17 ],
+  /* 4088 */  [ 0.498698341, 17 ],
+  /* 4089 */  [ 0.498861002, 17 ],
+  /* 4090 */  [ 0.499023676, 17 ],
+  /* 4091 */  [ 0.499186364, 17 ],
+  /* 4092 */  [ 0.499349064, 17 ],
+  /* 4093 */  [ 0.499511778, 17 ],
+  /* 4094 */  [ 0.499674506, 17 ],
+  /* 4095 */  [ 0.499837246, 17 ],
+
+  /* 4096 */  [ 0.250000000, 18 ],
+  /* 4097 */  [ 0.250081384, 18 ],
+  /* 4098 */  [ 0.250162774, 18 ],
+  /* 4099 */  [ 0.250244170, 18 ],
+  /* 4100 */  [ 0.250325574, 18 ],
+  /* 4101 */  [ 0.250406984, 18 ],
+  /* 4102 */  [ 0.250488400, 18 ],
+  /* 4103 */  [ 0.250569824, 18 ],
+  /* 4104 */  [ 0.250651254, 18 ],
+  /* 4105 */  [ 0.250732690, 18 ],
+  /* 4106 */  [ 0.250814133, 18 ],
+  /* 4107 */  [ 0.250895583, 18 ],
+  /* 4108 */  [ 0.250977039, 18 ],
+  /* 4109 */  [ 0.251058502, 18 ],
+  /* 4110 */  [ 0.251139971, 18 ],
+  /* 4111 */  [ 0.251221448, 18 ],
+
+  /* 4112 */  [ 0.251302930, 18 ],
+  /* 4113 */  [ 0.251384420, 18 ],
+  /* 4114 */  [ 0.251465916, 18 ],
+  /* 4115 */  [ 0.251547418, 18 ],
+  /* 4116 */  [ 0.251628927, 18 ],
+  /* 4117 */  [ 0.251710443, 18 ],
+  /* 4118 */  [ 0.251791965, 18 ],
+  /* 4119 */  [ 0.251873494, 18 ],
+  /* 4120 */  [ 0.251955030, 18 ],
+  /* 4121 */  [ 0.252036572, 18 ],
+  /* 4122 */  [ 0.252118121, 18 ],
+  /* 4123 */  [ 0.252199676, 18 ],
+  /* 4124 */  [ 0.252281238, 18 ],
+  /* 4125 */  [ 0.252362807, 18 ],
+  /* 4126 */  [ 0.252444382, 18 ],
+  /* 4127 */  [ 0.252525963, 18 ],
+
+  /* 4128 */  [ 0.252607552, 18 ],
+  /* 4129 */  [ 0.252689147, 18 ],
+  /* 4130 */  [ 0.252770748, 18 ],
+  /* 4131 */  [ 0.252852356, 18 ],
+  /* 4132 */  [ 0.252933971, 18 ],
+  /* 4133 */  [ 0.253015592, 18 ],
+  /* 4134 */  [ 0.253097220, 18 ],
+  /* 4135 */  [ 0.253178854, 18 ],
+  /* 4136 */  [ 0.253260495, 18 ],
+  /* 4137 */  [ 0.253342143, 18 ],
+  /* 4138 */  [ 0.253423797, 18 ],
+  /* 4139 */  [ 0.253505457, 18 ],
+  /* 4140 */  [ 0.253587125, 18 ],
+  /* 4141 */  [ 0.253668799, 18 ],
+  /* 4142 */  [ 0.253750479, 18 ],
+  /* 4143 */  [ 0.253832166, 18 ],
+
+  /* 4144 */  [ 0.253913860, 18 ],
+  /* 4145 */  [ 0.253995560, 18 ],
+  /* 4146 */  [ 0.254077266, 18 ],
+  /* 4147 */  [ 0.254158980, 18 ],
+  /* 4148 */  [ 0.254240700, 18 ],
+  /* 4149 */  [ 0.254322426, 18 ],
+  /* 4150 */  [ 0.254404159, 18 ],
+  /* 4151 */  [ 0.254485899, 18 ],
+  /* 4152 */  [ 0.254567645, 18 ],
+  /* 4153 */  [ 0.254649397, 18 ],
+  /* 4154 */  [ 0.254731157, 18 ],
+  /* 4155 */  [ 0.254812922, 18 ],
+  /* 4156 */  [ 0.254894695, 18 ],
+  /* 4157 */  [ 0.254976474, 18 ],
+  /* 4158 */  [ 0.255058259, 18 ],
+  /* 4159 */  [ 0.255140051, 18 ],
+
+  /* 4160 */  [ 0.255221850, 18 ],
+  /* 4161 */  [ 0.255303655, 18 ],
+  /* 4162 */  [ 0.255385467, 18 ],
+  /* 4163 */  [ 0.255467285, 18 ],
+  /* 4164 */  [ 0.255549110, 18 ],
+  /* 4165 */  [ 0.255630941, 18 ],
+  /* 4166 */  [ 0.255712779, 18 ],
+  /* 4167 */  [ 0.255794624, 18 ],
+  /* 4168 */  [ 0.255876475, 18 ],
+  /* 4169 */  [ 0.255958332, 18 ],
+  /* 4170 */  [ 0.256040196, 18 ],
+  /* 4171 */  [ 0.256122067, 18 ],
+  /* 4172 */  [ 0.256203944, 18 ],
+  /* 4173 */  [ 0.256285828, 18 ],
+  /* 4174 */  [ 0.256367718, 18 ],
+  /* 4175 */  [ 0.256449615, 18 ],
+
+  /* 4176 */  [ 0.256531518, 18 ],
+  /* 4177 */  [ 0.256613428, 18 ],
+  /* 4178 */  [ 0.256695344, 18 ],
+  /* 4179 */  [ 0.256777267, 18 ],
+  /* 4180 */  [ 0.256859197, 18 ],
+  /* 4181 */  [ 0.256941133, 18 ],
+  /* 4182 */  [ 0.257023076, 18 ],
+  /* 4183 */  [ 0.257105025, 18 ],
+  /* 4184 */  [ 0.257186980, 18 ],
+  /* 4185 */  [ 0.257268942, 18 ],
+  /* 4186 */  [ 0.257350911, 18 ],
+  /* 4187 */  [ 0.257432886, 18 ],
+  /* 4188 */  [ 0.257514868, 18 ],
+  /* 4189 */  [ 0.257596856, 18 ],
+  /* 4190 */  [ 0.257678851, 18 ],
+  /* 4191 */  [ 0.257760852, 18 ],
+
+  /* 4192 */  [ 0.257842860, 18 ],
+  /* 4193 */  [ 0.257924875, 18 ],
+  /* 4194 */  [ 0.258006895, 18 ],
+  /* 4195 */  [ 0.258088923, 18 ],
+  /* 4196 */  [ 0.258170957, 18 ],
+  /* 4197 */  [ 0.258252997, 18 ],
+  /* 4198 */  [ 0.258335044, 18 ],
+  /* 4199 */  [ 0.258417097, 18 ],
+  /* 4200 */  [ 0.258499157, 18 ],
+  /* 4201 */  [ 0.258581224, 18 ],
+  /* 4202 */  [ 0.258663297, 18 ],
+  /* 4203 */  [ 0.258745376, 18 ],
+  /* 4204 */  [ 0.258827462, 18 ],
+  /* 4205 */  [ 0.258909555, 18 ],
+  /* 4206 */  [ 0.258991654, 18 ],
+  /* 4207 */  [ 0.259073760, 18 ],
+
+  /* 4208 */  [ 0.259155872, 18 ],
+  /* 4209 */  [ 0.259237990, 18 ],
+  /* 4210 */  [ 0.259320115, 18 ],
+  /* 4211 */  [ 0.259402247, 18 ],
+  /* 4212 */  [ 0.259484385, 18 ],
+  /* 4213 */  [ 0.259566529, 18 ],
+  /* 4214 */  [ 0.259648680, 18 ],
+  /* 4215 */  [ 0.259730838, 18 ],
+  /* 4216 */  [ 0.259813002, 18 ],
+  /* 4217 */  [ 0.259895173, 18 ],
+  /* 4218 */  [ 0.259977350, 18 ],
+  /* 4219 */  [ 0.260059533, 18 ],
+  /* 4220 */  [ 0.260141723, 18 ],
+  /* 4221 */  [ 0.260223920, 18 ],
+  /* 4222 */  [ 0.260306123, 18 ],
+  /* 4223 */  [ 0.260388332, 18 ],
+
+  /* 4224 */  [ 0.260470548, 18 ],
+  /* 4225 */  [ 0.260552771, 18 ],
+  /* 4226 */  [ 0.260635000, 18 ],
+  /* 4227 */  [ 0.260717235, 18 ],
+  /* 4228 */  [ 0.260799477, 18 ],
+  /* 4229 */  [ 0.260881725, 18 ],
+  /* 4230 */  [ 0.260963980, 18 ],
+  /* 4231 */  [ 0.261046242, 18 ],
+  /* 4232 */  [ 0.261128510, 18 ],
+  /* 4233 */  [ 0.261210784, 18 ],
+  /* 4234 */  [ 0.261293065, 18 ],
+  /* 4235 */  [ 0.261375352, 18 ],
+  /* 4236 */  [ 0.261457646, 18 ],
+  /* 4237 */  [ 0.261539946, 18 ],
+  /* 4238 */  [ 0.261622253, 18 ],
+  /* 4239 */  [ 0.261704566, 18 ],
+
+  /* 4240 */  [ 0.261786886, 18 ],
+  /* 4241 */  [ 0.261869212, 18 ],
+  /* 4242 */  [ 0.261951545, 18 ],
+  /* 4243 */  [ 0.262033884, 18 ],
+  /* 4244 */  [ 0.262116229, 18 ],
+  /* 4245 */  [ 0.262198581, 18 ],
+  /* 4246 */  [ 0.262280940, 18 ],
+  /* 4247 */  [ 0.262363305, 18 ],
+  /* 4248 */  [ 0.262445676, 18 ],
+  /* 4249 */  [ 0.262528054, 18 ],
+  /* 4250 */  [ 0.262610438, 18 ],
+  /* 4251 */  [ 0.262692829, 18 ],
+  /* 4252 */  [ 0.262775227, 18 ],
+  /* 4253 */  [ 0.262857630, 18 ],
+  /* 4254 */  [ 0.262940040, 18 ],
+  /* 4255 */  [ 0.263022457, 18 ],
+
+  /* 4256 */  [ 0.263104880, 18 ],
+  /* 4257 */  [ 0.263187310, 18 ],
+  /* 4258 */  [ 0.263269746, 18 ],
+  /* 4259 */  [ 0.263352188, 18 ],
+  /* 4260 */  [ 0.263434637, 18 ],
+  /* 4261 */  [ 0.263517093, 18 ],
+  /* 4262 */  [ 0.263599554, 18 ],
+  /* 4263 */  [ 0.263682023, 18 ],
+  /* 4264 */  [ 0.263764497, 18 ],
+  /* 4265 */  [ 0.263846979, 18 ],
+  /* 4266 */  [ 0.263929466, 18 ],
+  /* 4267 */  [ 0.264011960, 18 ],
+  /* 4268 */  [ 0.264094461, 18 ],
+  /* 4269 */  [ 0.264176968, 18 ],
+  /* 4270 */  [ 0.264259481, 18 ],
+  /* 4271 */  [ 0.264342001, 18 ],
+
+  /* 4272 */  [ 0.264424527, 18 ],
+  /* 4273 */  [ 0.264507060, 18 ],
+  /* 4274 */  [ 0.264589599, 18 ],
+  /* 4275 */  [ 0.264672145, 18 ],
+  /* 4276 */  [ 0.264754697, 18 ],
+  /* 4277 */  [ 0.264837255, 18 ],
+  /* 4278 */  [ 0.264919820, 18 ],
+  /* 4279 */  [ 0.265002392, 18 ],
+  /* 4280 */  [ 0.265084969, 18 ],
+  /* 4281 */  [ 0.265167554, 18 ],
+  /* 4282 */  [ 0.265250144, 18 ],
+  /* 4283 */  [ 0.265332741, 18 ],
+  /* 4284 */  [ 0.265415345, 18 ],
+  /* 4285 */  [ 0.265497955, 18 ],
+  /* 4286 */  [ 0.265580571, 18 ],
+  /* 4287 */  [ 0.265663194, 18 ],
+
+  /* 4288 */  [ 0.265745823, 18 ],
+  /* 4289 */  [ 0.265828459, 18 ],
+  /* 4290 */  [ 0.265911101, 18 ],
+  /* 4291 */  [ 0.265993749, 18 ],
+  /* 4292 */  [ 0.266076404, 18 ],
+  /* 4293 */  [ 0.266159065, 18 ],
+  /* 4294 */  [ 0.266241733, 18 ],
+  /* 4295 */  [ 0.266324407, 18 ],
+  /* 4296 */  [ 0.266407088, 18 ],
+  /* 4297 */  [ 0.266489775, 18 ],
+  /* 4298 */  [ 0.266572468, 18 ],
+  /* 4299 */  [ 0.266655168, 18 ],
+  /* 4300 */  [ 0.266737874, 18 ],
+  /* 4301 */  [ 0.266820587, 18 ],
+  /* 4302 */  [ 0.266903306, 18 ],
+  /* 4303 */  [ 0.266986031, 18 ],
+
+  /* 4304 */  [ 0.267068763, 18 ],
+  /* 4305 */  [ 0.267151501, 18 ],
+  /* 4306 */  [ 0.267234246, 18 ],
+  /* 4307 */  [ 0.267316997, 18 ],
+  /* 4308 */  [ 0.267399755, 18 ],
+  /* 4309 */  [ 0.267482518, 18 ],
+  /* 4310 */  [ 0.267565289, 18 ],
+  /* 4311 */  [ 0.267648065, 18 ],
+  /* 4312 */  [ 0.267730848, 18 ],
+  /* 4313 */  [ 0.267813638, 18 ],
+  /* 4314 */  [ 0.267896434, 18 ],
+  /* 4315 */  [ 0.267979236, 18 ],
+  /* 4316 */  [ 0.268062045, 18 ],
+  /* 4317 */  [ 0.268144860, 18 ],
+  /* 4318 */  [ 0.268227681, 18 ],
+  /* 4319 */  [ 0.268310509, 18 ],
+
+  /* 4320 */  [ 0.268393343, 18 ],
+  /* 4321 */  [ 0.268476184, 18 ],
+  /* 4322 */  [ 0.268559031, 18 ],
+  /* 4323 */  [ 0.268641885, 18 ],
+  /* 4324 */  [ 0.268724744, 18 ],
+  /* 4325 */  [ 0.268807611, 18 ],
+  /* 4326 */  [ 0.268890483, 18 ],
+  /* 4327 */  [ 0.268973362, 18 ],
+  /* 4328 */  [ 0.269056248, 18 ],
+  /* 4329 */  [ 0.269139139, 18 ],
+  /* 4330 */  [ 0.269222037, 18 ],
+  /* 4331 */  [ 0.269304942, 18 ],
+  /* 4332 */  [ 0.269387853, 18 ],
+  /* 4333 */  [ 0.269470770, 18 ],
+  /* 4334 */  [ 0.269553694, 18 ],
+  /* 4335 */  [ 0.269636624, 18 ],
+
+  /* 4336 */  [ 0.269719560, 18 ],
+  /* 4337 */  [ 0.269802503, 18 ],
+  /* 4338 */  [ 0.269885452, 18 ],
+  /* 4339 */  [ 0.269968408, 18 ],
+  /* 4340 */  [ 0.270051370, 18 ],
+  /* 4341 */  [ 0.270134338, 18 ],
+  /* 4342 */  [ 0.270217312, 18 ],
+  /* 4343 */  [ 0.270300293, 18 ],
+  /* 4344 */  [ 0.270383281, 18 ],
+  /* 4345 */  [ 0.270466275, 18 ],
+  /* 4346 */  [ 0.270549275, 18 ],
+  /* 4347 */  [ 0.270632281, 18 ],
+  /* 4348 */  [ 0.270715294, 18 ],
+  /* 4349 */  [ 0.270798313, 18 ],
+  /* 4350 */  [ 0.270881339, 18 ],
+  /* 4351 */  [ 0.270964371, 18 ],
+
+  /* 4352 */  [ 0.271047409, 18 ],
+  /* 4353 */  [ 0.271130454, 18 ],
+  /* 4354 */  [ 0.271213505, 18 ],
+  /* 4355 */  [ 0.271296562, 18 ],
+  /* 4356 */  [ 0.271379626, 18 ],
+  /* 4357 */  [ 0.271462696, 18 ],
+  /* 4358 */  [ 0.271545772, 18 ],
+  /* 4359 */  [ 0.271628855, 18 ],
+  /* 4360 */  [ 0.271711944, 18 ],
+  /* 4361 */  [ 0.271795040, 18 ],
+  /* 4362 */  [ 0.271878142, 18 ],
+  /* 4363 */  [ 0.271961250, 18 ],
+  /* 4364 */  [ 0.272044365, 18 ],
+  /* 4365 */  [ 0.272127486, 18 ],
+  /* 4366 */  [ 0.272210613, 18 ],
+  /* 4367 */  [ 0.272293746, 18 ],
+
+  /* 4368 */  [ 0.272376886, 18 ],
+  /* 4369 */  [ 0.272460033, 18 ],
+  /* 4370 */  [ 0.272543185, 18 ],
+  /* 4371 */  [ 0.272626344, 18 ],
+  /* 4372 */  [ 0.272709510, 18 ],
+  /* 4373 */  [ 0.272792681, 18 ],
+  /* 4374 */  [ 0.272875859, 18 ],
+  /* 4375 */  [ 0.272959044, 18 ],
+  /* 4376 */  [ 0.273042234, 18 ],
+  /* 4377 */  [ 0.273125431, 18 ],
+  /* 4378 */  [ 0.273208635, 18 ],
+  /* 4379 */  [ 0.273291844, 18 ],
+  /* 4380 */  [ 0.273375060, 18 ],
+  /* 4381 */  [ 0.273458283, 18 ],
+  /* 4382 */  [ 0.273541511, 18 ],
+  /* 4383 */  [ 0.273624747, 18 ],
+
+  /* 4384 */  [ 0.273707988, 18 ],
+  /* 4385 */  [ 0.273791236, 18 ],
+  /* 4386 */  [ 0.273874490, 18 ],
+  /* 4387 */  [ 0.273957750, 18 ],
+  /* 4388 */  [ 0.274041017, 18 ],
+  /* 4389 */  [ 0.274124290, 18 ],
+  /* 4390 */  [ 0.274207569, 18 ],
+  /* 4391 */  [ 0.274290855, 18 ],
+  /* 4392 */  [ 0.274374147, 18 ],
+  /* 4393 */  [ 0.274457445, 18 ],
+  /* 4394 */  [ 0.274540749, 18 ],
+  /* 4395 */  [ 0.274624060, 18 ],
+  /* 4396 */  [ 0.274707378, 18 ],
+  /* 4397 */  [ 0.274790701, 18 ],
+  /* 4398 */  [ 0.274874031, 18 ],
+  /* 4399 */  [ 0.274957367, 18 ],
+
+  /* 4400 */  [ 0.275040710, 18 ],
+  /* 4401 */  [ 0.275124059, 18 ],
+  /* 4402 */  [ 0.275207414, 18 ],
+  /* 4403 */  [ 0.275290775, 18 ],
+  /* 4404 */  [ 0.275374143, 18 ],
+  /* 4405 */  [ 0.275457517, 18 ],
+  /* 4406 */  [ 0.275540897, 18 ],
+  /* 4407 */  [ 0.275624284, 18 ],
+  /* 4408 */  [ 0.275707677, 18 ],
+  /* 4409 */  [ 0.275791076, 18 ],
+  /* 4410 */  [ 0.275874482, 18 ],
+  /* 4411 */  [ 0.275957894, 18 ],
+  /* 4412 */  [ 0.276041312, 18 ],
+  /* 4413 */  [ 0.276124737, 18 ],
+  /* 4414 */  [ 0.276208167, 18 ],
+  /* 4415 */  [ 0.276291605, 18 ],
+
+  /* 4416 */  [ 0.276375048, 18 ],
+  /* 4417 */  [ 0.276458498, 18 ],
+  /* 4418 */  [ 0.276541954, 18 ],
+  /* 4419 */  [ 0.276625416, 18 ],
+  /* 4420 */  [ 0.276708885, 18 ],
+  /* 4421 */  [ 0.276792360, 18 ],
+  /* 4422 */  [ 0.276875841, 18 ],
+  /* 4423 */  [ 0.276959328, 18 ],
+  /* 4424 */  [ 0.277042822, 18 ],
+  /* 4425 */  [ 0.277126322, 18 ],
+  /* 4426 */  [ 0.277209829, 18 ],
+  /* 4427 */  [ 0.277293341, 18 ],
+  /* 4428 */  [ 0.277376860, 18 ],
+  /* 4429 */  [ 0.277460385, 18 ],
+  /* 4430 */  [ 0.277543917, 18 ],
+  /* 4431 */  [ 0.277627455, 18 ],
+
+  /* 4432 */  [ 0.277710999, 18 ],
+  /* 4433 */  [ 0.277794549, 18 ],
+  /* 4434 */  [ 0.277878106, 18 ],
+  /* 4435 */  [ 0.277961669, 18 ],
+  /* 4436 */  [ 0.278045238, 18 ],
+  /* 4437 */  [ 0.278128813, 18 ],
+  /* 4438 */  [ 0.278212395, 18 ],
+  /* 4439 */  [ 0.278295983, 18 ],
+  /* 4440 */  [ 0.278379578, 18 ],
+  /* 4441 */  [ 0.278463178, 18 ],
+  /* 4442 */  [ 0.278546785, 18 ],
+  /* 4443 */  [ 0.278630398, 18 ],
+  /* 4444 */  [ 0.278714018, 18 ],
+  /* 4445 */  [ 0.278797643, 18 ],
+  /* 4446 */  [ 0.278881275, 18 ],
+  /* 4447 */  [ 0.278964914, 18 ],
+
+  /* 4448 */  [ 0.279048558, 18 ],
+  /* 4449 */  [ 0.279132209, 18 ],
+  /* 4450 */  [ 0.279215866, 18 ],
+  /* 4451 */  [ 0.279299529, 18 ],
+  /* 4452 */  [ 0.279383199, 18 ],
+  /* 4453 */  [ 0.279466875, 18 ],
+  /* 4454 */  [ 0.279550557, 18 ],
+  /* 4455 */  [ 0.279634245, 18 ],
+  /* 4456 */  [ 0.279717940, 18 ],
+  /* 4457 */  [ 0.279801641, 18 ],
+  /* 4458 */  [ 0.279885348, 18 ],
+  /* 4459 */  [ 0.279969061, 18 ],
+  /* 4460 */  [ 0.280052781, 18 ],
+  /* 4461 */  [ 0.280136507, 18 ],
+  /* 4462 */  [ 0.280220239, 18 ],
+  /* 4463 */  [ 0.280303978, 18 ],
+
+  /* 4464 */  [ 0.280387722, 18 ],
+  /* 4465 */  [ 0.280471473, 18 ],
+  /* 4466 */  [ 0.280555230, 18 ],
+  /* 4467 */  [ 0.280638994, 18 ],
+  /* 4468 */  [ 0.280722764, 18 ],
+  /* 4469 */  [ 0.280806540, 18 ],
+  /* 4470 */  [ 0.280890322, 18 ],
+  /* 4471 */  [ 0.280974110, 18 ],
+  /* 4472 */  [ 0.281057905, 18 ],
+  /* 4473 */  [ 0.281141706, 18 ],
+  /* 4474 */  [ 0.281225513, 18 ],
+  /* 4475 */  [ 0.281309326, 18 ],
+  /* 4476 */  [ 0.281393146, 18 ],
+  /* 4477 */  [ 0.281476972, 18 ],
+  /* 4478 */  [ 0.281560804, 18 ],
+  /* 4479 */  [ 0.281644643, 18 ],
+
+  /* 4480 */  [ 0.281728487, 18 ],
+  /* 4481 */  [ 0.281812338, 18 ],
+  /* 4482 */  [ 0.281896195, 18 ],
+  /* 4483 */  [ 0.281980059, 18 ],
+  /* 4484 */  [ 0.282063928, 18 ],
+  /* 4485 */  [ 0.282147804, 18 ],
+  /* 4486 */  [ 0.282231686, 18 ],
+  /* 4487 */  [ 0.282315574, 18 ],
+  /* 4488 */  [ 0.282399469, 18 ],
+  /* 4489 */  [ 0.282483370, 18 ],
+  /* 4490 */  [ 0.282567277, 18 ],
+  /* 4491 */  [ 0.282651190, 18 ],
+  /* 4492 */  [ 0.282735109, 18 ],
+  /* 4493 */  [ 0.282819035, 18 ],
+  /* 4494 */  [ 0.282902967, 18 ],
+  /* 4495 */  [ 0.282986905, 18 ],
+
+  /* 4496 */  [ 0.283070849, 18 ],
+  /* 4497 */  [ 0.283154800, 18 ],
+  /* 4498 */  [ 0.283238757, 18 ],
+  /* 4499 */  [ 0.283322720, 18 ],
+  /* 4500 */  [ 0.283406689, 18 ],
+  /* 4501 */  [ 0.283490665, 18 ],
+  /* 4502 */  [ 0.283574646, 18 ],
+  /* 4503 */  [ 0.283658634, 18 ],
+  /* 4504 */  [ 0.283742628, 18 ],
+  /* 4505 */  [ 0.283826629, 18 ],
+  /* 4506 */  [ 0.283910635, 18 ],
+  /* 4507 */  [ 0.283994648, 18 ],
+  /* 4508 */  [ 0.284078667, 18 ],
+  /* 4509 */  [ 0.284162692, 18 ],
+  /* 4510 */  [ 0.284246723, 18 ],
+  /* 4511 */  [ 0.284330761, 18 ],
+
+  /* 4512 */  [ 0.284414805, 18 ],
+  /* 4513 */  [ 0.284498855, 18 ],
+  /* 4514 */  [ 0.284582911, 18 ],
+  /* 4515 */  [ 0.284666974, 18 ],
+  /* 4516 */  [ 0.284751042, 18 ],
+  /* 4517 */  [ 0.284835117, 18 ],
+  /* 4518 */  [ 0.284919198, 18 ],
+  /* 4519 */  [ 0.285003285, 18 ],
+  /* 4520 */  [ 0.285087379, 18 ],
+  /* 4521 */  [ 0.285171479, 18 ],
+  /* 4522 */  [ 0.285255584, 18 ],
+  /* 4523 */  [ 0.285339697, 18 ],
+  /* 4524 */  [ 0.285423815, 18 ],
+  /* 4525 */  [ 0.285507939, 18 ],
+  /* 4526 */  [ 0.285592070, 18 ],
+  /* 4527 */  [ 0.285676207, 18 ],
+
+  /* 4528 */  [ 0.285760350, 18 ],
+  /* 4529 */  [ 0.285844499, 18 ],
+  /* 4530 */  [ 0.285928655, 18 ],
+  /* 4531 */  [ 0.286012816, 18 ],
+  /* 4532 */  [ 0.286096984, 18 ],
+  /* 4533 */  [ 0.286181158, 18 ],
+  /* 4534 */  [ 0.286265338, 18 ],
+  /* 4535 */  [ 0.286349525, 18 ],
+  /* 4536 */  [ 0.286433717, 18 ],
+  /* 4537 */  [ 0.286517916, 18 ],
+  /* 4538 */  [ 0.286602121, 18 ],
+  /* 4539 */  [ 0.286686332, 18 ],
+  /* 4540 */  [ 0.286770550, 18 ],
+  /* 4541 */  [ 0.286854773, 18 ],
+  /* 4542 */  [ 0.286939003, 18 ],
+  /* 4543 */  [ 0.287023239, 18 ],
+
+  /* 4544 */  [ 0.287107481, 18 ],
+  /* 4545 */  [ 0.287191729, 18 ],
+  /* 4546 */  [ 0.287275983, 18 ],
+  /* 4547 */  [ 0.287360244, 18 ],
+  /* 4548 */  [ 0.287444511, 18 ],
+  /* 4549 */  [ 0.287528784, 18 ],
+  /* 4550 */  [ 0.287613063, 18 ],
+  /* 4551 */  [ 0.287697348, 18 ],
+  /* 4552 */  [ 0.287781640, 18 ],
+  /* 4553 */  [ 0.287865937, 18 ],
+  /* 4554 */  [ 0.287950241, 18 ],
+  /* 4555 */  [ 0.288034551, 18 ],
+  /* 4556 */  [ 0.288118867, 18 ],
+  /* 4557 */  [ 0.288203190, 18 ],
+  /* 4558 */  [ 0.288287518, 18 ],
+  /* 4559 */  [ 0.288371853, 18 ],
+
+  /* 4560 */  [ 0.288456194, 18 ],
+  /* 4561 */  [ 0.288540541, 18 ],
+  /* 4562 */  [ 0.288624894, 18 ],
+  /* 4563 */  [ 0.288709253, 18 ],
+  /* 4564 */  [ 0.288793619, 18 ],
+  /* 4565 */  [ 0.288877990, 18 ],
+  /* 4566 */  [ 0.288962368, 18 ],
+  /* 4567 */  [ 0.289046752, 18 ],
+  /* 4568 */  [ 0.289131142, 18 ],
+  /* 4569 */  [ 0.289215538, 18 ],
+  /* 4570 */  [ 0.289299941, 18 ],
+  /* 4571 */  [ 0.289384349, 18 ],
+  /* 4572 */  [ 0.289468764, 18 ],
+  /* 4573 */  [ 0.289553185, 18 ],
+  /* 4574 */  [ 0.289637612, 18 ],
+  /* 4575 */  [ 0.289722045, 18 ],
+
+  /* 4576 */  [ 0.289806485, 18 ],
+  /* 4577 */  [ 0.289890930, 18 ],
+  /* 4578 */  [ 0.289975382, 18 ],
+  /* 4579 */  [ 0.290059840, 18 ],
+  /* 4580 */  [ 0.290144304, 18 ],
+  /* 4581 */  [ 0.290228774, 18 ],
+  /* 4582 */  [ 0.290313250, 18 ],
+  /* 4583 */  [ 0.290397733, 18 ],
+  /* 4584 */  [ 0.290482221, 18 ],
+  /* 4585 */  [ 0.290566716, 18 ],
+  /* 4586 */  [ 0.290651217, 18 ],
+  /* 4587 */  [ 0.290735724, 18 ],
+  /* 4588 */  [ 0.290820237, 18 ],
+  /* 4589 */  [ 0.290904756, 18 ],
+  /* 4590 */  [ 0.290989281, 18 ],
+  /* 4591 */  [ 0.291073813, 18 ],
+
+  /* 4592 */  [ 0.291158351, 18 ],
+  /* 4593 */  [ 0.291242894, 18 ],
+  /* 4594 */  [ 0.291327444, 18 ],
+  /* 4595 */  [ 0.291412001, 18 ],
+  /* 4596 */  [ 0.291496563, 18 ],
+  /* 4597 */  [ 0.291581131, 18 ],
+  /* 4598 */  [ 0.291665706, 18 ],
+  /* 4599 */  [ 0.291750286, 18 ],
+  /* 4600 */  [ 0.291834873, 18 ],
+  /* 4601 */  [ 0.291919466, 18 ],
+  /* 4602 */  [ 0.292004065, 18 ],
+  /* 4603 */  [ 0.292088670, 18 ],
+  /* 4604 */  [ 0.292173281, 18 ],
+  /* 4605 */  [ 0.292257899, 18 ],
+  /* 4606 */  [ 0.292342522, 18 ],
+  /* 4607 */  [ 0.292427152, 18 ],
+
+  /* 4608 */  [ 0.292511788, 18 ],
+  /* 4609 */  [ 0.292596430, 18 ],
+  /* 4610 */  [ 0.292681078, 18 ],
+  /* 4611 */  [ 0.292765732, 18 ],
+  /* 4612 */  [ 0.292850392, 18 ],
+  /* 4613 */  [ 0.292935058, 18 ],
+  /* 4614 */  [ 0.293019731, 18 ],
+  /* 4615 */  [ 0.293104409, 18 ],
+  /* 4616 */  [ 0.293189094, 18 ],
+  /* 4617 */  [ 0.293273785, 18 ],
+  /* 4618 */  [ 0.293358482, 18 ],
+  /* 4619 */  [ 0.293443185, 18 ],
+  /* 4620 */  [ 0.293527894, 18 ],
+  /* 4621 */  [ 0.293612609, 18 ],
+  /* 4622 */  [ 0.293697331, 18 ],
+  /* 4623 */  [ 0.293782058, 18 ],
+
+  /* 4624 */  [ 0.293866792, 18 ],
+  /* 4625 */  [ 0.293951532, 18 ],
+  /* 4626 */  [ 0.294036278, 18 ],
+  /* 4627 */  [ 0.294121029, 18 ],
+  /* 4628 */  [ 0.294205788, 18 ],
+  /* 4629 */  [ 0.294290552, 18 ],
+  /* 4630 */  [ 0.294375322, 18 ],
+  /* 4631 */  [ 0.294460098, 18 ],
+  /* 4632 */  [ 0.294544881, 18 ],
+  /* 4633 */  [ 0.294629669, 18 ],
+  /* 4634 */  [ 0.294714464, 18 ],
+  /* 4635 */  [ 0.294799265, 18 ],
+  /* 4636 */  [ 0.294884072, 18 ],
+  /* 4637 */  [ 0.294968885, 18 ],
+  /* 4638 */  [ 0.295053704, 18 ],
+  /* 4639 */  [ 0.295138529, 18 ],
+
+  /* 4640 */  [ 0.295223360, 18 ],
+  /* 4641 */  [ 0.295308197, 18 ],
+  /* 4642 */  [ 0.295393041, 18 ],
+  /* 4643 */  [ 0.295477890, 18 ],
+  /* 4644 */  [ 0.295562746, 18 ],
+  /* 4645 */  [ 0.295647608, 18 ],
+  /* 4646 */  [ 0.295732476, 18 ],
+  /* 4647 */  [ 0.295817349, 18 ],
+  /* 4648 */  [ 0.295902229, 18 ],
+  /* 4649 */  [ 0.295987115, 18 ],
+  /* 4650 */  [ 0.296072008, 18 ],
+  /* 4651 */  [ 0.296156906, 18 ],
+  /* 4652 */  [ 0.296241810, 18 ],
+  /* 4653 */  [ 0.296326721, 18 ],
+  /* 4654 */  [ 0.296411637, 18 ],
+  /* 4655 */  [ 0.296496560, 18 ],
+
+  /* 4656 */  [ 0.296581488, 18 ],
+  /* 4657 */  [ 0.296666423, 18 ],
+  /* 4658 */  [ 0.296751364, 18 ],
+  /* 4659 */  [ 0.296836311, 18 ],
+  /* 4660 */  [ 0.296921264, 18 ],
+  /* 4661 */  [ 0.297006223, 18 ],
+  /* 4662 */  [ 0.297091188, 18 ],
+  /* 4663 */  [ 0.297176159, 18 ],
+  /* 4664 */  [ 0.297261136, 18 ],
+  /* 4665 */  [ 0.297346120, 18 ],
+  /* 4666 */  [ 0.297431109, 18 ],
+  /* 4667 */  [ 0.297516105, 18 ],
+  /* 4668 */  [ 0.297601106, 18 ],
+  /* 4669 */  [ 0.297686114, 18 ],
+  /* 4670 */  [ 0.297771128, 18 ],
+  /* 4671 */  [ 0.297856147, 18 ],
+
+  /* 4672 */  [ 0.297941173, 18 ],
+  /* 4673 */  [ 0.298026205, 18 ],
+  /* 4674 */  [ 0.298111243, 18 ],
+  /* 4675 */  [ 0.298196287, 18 ],
+  /* 4676 */  [ 0.298281337, 18 ],
+  /* 4677 */  [ 0.298366393, 18 ],
+  /* 4678 */  [ 0.298451456, 18 ],
+  /* 4679 */  [ 0.298536524, 18 ],
+  /* 4680 */  [ 0.298621598, 18 ],
+  /* 4681 */  [ 0.298706679, 18 ],
+  /* 4682 */  [ 0.298791765, 18 ],
+  /* 4683 */  [ 0.298876858, 18 ],
+  /* 4684 */  [ 0.298961956, 18 ],
+  /* 4685 */  [ 0.299047061, 18 ],
+  /* 4686 */  [ 0.299132172, 18 ],
+  /* 4687 */  [ 0.299217288, 18 ],
+
+  /* 4688 */  [ 0.299302411, 18 ],
+  /* 4689 */  [ 0.299387540, 18 ],
+  /* 4690 */  [ 0.299472675, 18 ],
+  /* 4691 */  [ 0.299557816, 18 ],
+  /* 4692 */  [ 0.299642963, 18 ],
+  /* 4693 */  [ 0.299728116, 18 ],
+  /* 4694 */  [ 0.299813275, 18 ],
+  /* 4695 */  [ 0.299898440, 18 ],
+  /* 4696 */  [ 0.299983611, 18 ],
+  /* 4697 */  [ 0.300068789, 18 ],
+  /* 4698 */  [ 0.300153972, 18 ],
+  /* 4699 */  [ 0.300239161, 18 ],
+  /* 4700 */  [ 0.300324357, 18 ],
+  /* 4701 */  [ 0.300409558, 18 ],
+  /* 4702 */  [ 0.300494765, 18 ],
+  /* 4703 */  [ 0.300579979, 18 ],
+
+  /* 4704 */  [ 0.300665198, 18 ],
+  /* 4705 */  [ 0.300750424, 18 ],
+  /* 4706 */  [ 0.300835656, 18 ],
+  /* 4707 */  [ 0.300920893, 18 ],
+  /* 4708 */  [ 0.301006137, 18 ],
+  /* 4709 */  [ 0.301091387, 18 ],
+  /* 4710 */  [ 0.301176643, 18 ],
+  /* 4711 */  [ 0.301261904, 18 ],
+  /* 4712 */  [ 0.301347172, 18 ],
+  /* 4713 */  [ 0.301432446, 18 ],
+  /* 4714 */  [ 0.301517726, 18 ],
+  /* 4715 */  [ 0.301603012, 18 ],
+  /* 4716 */  [ 0.301688304, 18 ],
+  /* 4717 */  [ 0.301773602, 18 ],
+  /* 4718 */  [ 0.301858906, 18 ],
+  /* 4719 */  [ 0.301944216, 18 ],
+
+  /* 4720 */  [ 0.302029532, 18 ],
+  /* 4721 */  [ 0.302114854, 18 ],
+  /* 4722 */  [ 0.302200182, 18 ],
+  /* 4723 */  [ 0.302285516, 18 ],
+  /* 4724 */  [ 0.302370856, 18 ],
+  /* 4725 */  [ 0.302456203, 18 ],
+  /* 4726 */  [ 0.302541555, 18 ],
+  /* 4727 */  [ 0.302626913, 18 ],
+  /* 4728 */  [ 0.302712277, 18 ],
+  /* 4729 */  [ 0.302797648, 18 ],
+  /* 4730 */  [ 0.302883024, 18 ],
+  /* 4731 */  [ 0.302968406, 18 ],
+  /* 4732 */  [ 0.303053794, 18 ],
+  /* 4733 */  [ 0.303139189, 18 ],
+  /* 4734 */  [ 0.303224589, 18 ],
+  /* 4735 */  [ 0.303309995, 18 ],
+
+  /* 4736 */  [ 0.303395408, 18 ],
+  /* 4737 */  [ 0.303480826, 18 ],
+  /* 4738 */  [ 0.303566251, 18 ],
+  /* 4739 */  [ 0.303651681, 18 ],
+  /* 4740 */  [ 0.303737117, 18 ],
+  /* 4741 */  [ 0.303822560, 18 ],
+  /* 4742 */  [ 0.303908008, 18 ],
+  /* 4743 */  [ 0.303993463, 18 ],
+  /* 4744 */  [ 0.304078923, 18 ],
+  /* 4745 */  [ 0.304164390, 18 ],
+  /* 4746 */  [ 0.304249862, 18 ],
+  /* 4747 */  [ 0.304335340, 18 ],
+  /* 4748 */  [ 0.304420825, 18 ],
+  /* 4749 */  [ 0.304506315, 18 ],
+  /* 4750 */  [ 0.304591812, 18 ],
+  /* 4751 */  [ 0.304677314, 18 ],
+
+  /* 4752 */  [ 0.304762823, 18 ],
+  /* 4753 */  [ 0.304848337, 18 ],
+  /* 4754 */  [ 0.304933858, 18 ],
+  /* 4755 */  [ 0.305019384, 18 ],
+  /* 4756 */  [ 0.305104917, 18 ],
+  /* 4757 */  [ 0.305190455, 18 ],
+  /* 4758 */  [ 0.305275999, 18 ],
+  /* 4759 */  [ 0.305361550, 18 ],
+  /* 4760 */  [ 0.305447106, 18 ],
+  /* 4761 */  [ 0.305532669, 18 ],
+  /* 4762 */  [ 0.305618237, 18 ],
+  /* 4763 */  [ 0.305703811, 18 ],
+  /* 4764 */  [ 0.305789392, 18 ],
+  /* 4765 */  [ 0.305874978, 18 ],
+  /* 4766 */  [ 0.305960571, 18 ],
+  /* 4767 */  [ 0.306046169, 18 ],
+
+  /* 4768 */  [ 0.306131773, 18 ],
+  /* 4769 */  [ 0.306217383, 18 ],
+  /* 4770 */  [ 0.306303000, 18 ],
+  /* 4771 */  [ 0.306388622, 18 ],
+  /* 4772 */  [ 0.306474250, 18 ],
+  /* 4773 */  [ 0.306559885, 18 ],
+  /* 4774 */  [ 0.306645525, 18 ],
+  /* 4775 */  [ 0.306731171, 18 ],
+  /* 4776 */  [ 0.306816823, 18 ],
+  /* 4777 */  [ 0.306902481, 18 ],
+  /* 4778 */  [ 0.306988145, 18 ],
+  /* 4779 */  [ 0.307073816, 18 ],
+  /* 4780 */  [ 0.307159492, 18 ],
+  /* 4781 */  [ 0.307245174, 18 ],
+  /* 4782 */  [ 0.307330862, 18 ],
+  /* 4783 */  [ 0.307416556, 18 ],
+
+  /* 4784 */  [ 0.307502256, 18 ],
+  /* 4785 */  [ 0.307587962, 18 ],
+  /* 4786 */  [ 0.307673674, 18 ],
+  /* 4787 */  [ 0.307759392, 18 ],
+  /* 4788 */  [ 0.307845115, 18 ],
+  /* 4789 */  [ 0.307930845, 18 ],
+  /* 4790 */  [ 0.308016581, 18 ],
+  /* 4791 */  [ 0.308102323, 18 ],
+  /* 4792 */  [ 0.308188071, 18 ],
+  /* 4793 */  [ 0.308273824, 18 ],
+  /* 4794 */  [ 0.308359584, 18 ],
+  /* 4795 */  [ 0.308445350, 18 ],
+  /* 4796 */  [ 0.308531121, 18 ],
+  /* 4797 */  [ 0.308616899, 18 ],
+  /* 4798 */  [ 0.308702682, 18 ],
+  /* 4799 */  [ 0.308788472, 18 ],
+
+  /* 4800 */  [ 0.308874267, 18 ],
+  /* 4801 */  [ 0.308960068, 18 ],
+  /* 4802 */  [ 0.309045876, 18 ],
+  /* 4803 */  [ 0.309131689, 18 ],
+  /* 4804 */  [ 0.309217508, 18 ],
+  /* 4805 */  [ 0.309303334, 18 ],
+  /* 4806 */  [ 0.309389165, 18 ],
+  /* 4807 */  [ 0.309475002, 18 ],
+  /* 4808 */  [ 0.309560845, 18 ],
+  /* 4809 */  [ 0.309646694, 18 ],
+  /* 4810 */  [ 0.309732549, 18 ],
+  /* 4811 */  [ 0.309818410, 18 ],
+  /* 4812 */  [ 0.309904277, 18 ],
+  /* 4813 */  [ 0.309990150, 18 ],
+  /* 4814 */  [ 0.310076028, 18 ],
+  /* 4815 */  [ 0.310161913, 18 ],
+
+  /* 4816 */  [ 0.310247804, 18 ],
+  /* 4817 */  [ 0.310333700, 18 ],
+  /* 4818 */  [ 0.310419603, 18 ],
+  /* 4819 */  [ 0.310505511, 18 ],
+  /* 4820 */  [ 0.310591426, 18 ],
+  /* 4821 */  [ 0.310677346, 18 ],
+  /* 4822 */  [ 0.310763272, 18 ],
+  /* 4823 */  [ 0.310849205, 18 ],
+  /* 4824 */  [ 0.310935143, 18 ],
+  /* 4825 */  [ 0.311021087, 18 ],
+  /* 4826 */  [ 0.311107037, 18 ],
+  /* 4827 */  [ 0.311192993, 18 ],
+  /* 4828 */  [ 0.311278955, 18 ],
+  /* 4829 */  [ 0.311364923, 18 ],
+  /* 4830 */  [ 0.311450897, 18 ],
+  /* 4831 */  [ 0.311536877, 18 ],
+
+  /* 4832 */  [ 0.311622862, 18 ],
+  /* 4833 */  [ 0.311708854, 18 ],
+  /* 4834 */  [ 0.311794851, 18 ],
+  /* 4835 */  [ 0.311880855, 18 ],
+  /* 4836 */  [ 0.311966864, 18 ],
+  /* 4837 */  [ 0.312052880, 18 ],
+  /* 4838 */  [ 0.312138901, 18 ],
+  /* 4839 */  [ 0.312224928, 18 ],
+  /* 4840 */  [ 0.312310961, 18 ],
+  /* 4841 */  [ 0.312397000, 18 ],
+  /* 4842 */  [ 0.312483045, 18 ],
+  /* 4843 */  [ 0.312569096, 18 ],
+  /* 4844 */  [ 0.312655153, 18 ],
+  /* 4845 */  [ 0.312741216, 18 ],
+  /* 4846 */  [ 0.312827284, 18 ],
+  /* 4847 */  [ 0.312913359, 18 ],
+
+  /* 4848 */  [ 0.312999439, 18 ],
+  /* 4849 */  [ 0.313085526, 18 ],
+  /* 4850 */  [ 0.313171618, 18 ],
+  /* 4851 */  [ 0.313257716, 18 ],
+  /* 4852 */  [ 0.313343820, 18 ],
+  /* 4853 */  [ 0.313429931, 18 ],
+  /* 4854 */  [ 0.313516047, 18 ],
+  /* 4855 */  [ 0.313602168, 18 ],
+  /* 4856 */  [ 0.313688296, 18 ],
+  /* 4857 */  [ 0.313774430, 18 ],
+  /* 4858 */  [ 0.313860570, 18 ],
+  /* 4859 */  [ 0.313946715, 18 ],
+  /* 4860 */  [ 0.314032867, 18 ],
+  /* 4861 */  [ 0.314119024, 18 ],
+  /* 4862 */  [ 0.314205187, 18 ],
+  /* 4863 */  [ 0.314291357, 18 ],
+
+  /* 4864 */  [ 0.314377532, 18 ],
+  /* 4865 */  [ 0.314463713, 18 ],
+  /* 4866 */  [ 0.314549900, 18 ],
+  /* 4867 */  [ 0.314636092, 18 ],
+  /* 4868 */  [ 0.314722291, 18 ],
+  /* 4869 */  [ 0.314808496, 18 ],
+  /* 4870 */  [ 0.314894706, 18 ],
+  /* 4871 */  [ 0.314980923, 18 ],
+  /* 4872 */  [ 0.315067145, 18 ],
+  /* 4873 */  [ 0.315153373, 18 ],
+  /* 4874 */  [ 0.315239607, 18 ],
+  /* 4875 */  [ 0.315325847, 18 ],
+  /* 4876 */  [ 0.315412093, 18 ],
+  /* 4877 */  [ 0.315498345, 18 ],
+  /* 4878 */  [ 0.315584603, 18 ],
+  /* 4879 */  [ 0.315670866, 18 ],
+
+  /* 4880 */  [ 0.315757136, 18 ],
+  /* 4881 */  [ 0.315843411, 18 ],
+  /* 4882 */  [ 0.315929693, 18 ],
+  /* 4883 */  [ 0.316015980, 18 ],
+  /* 4884 */  [ 0.316102273, 18 ],
+  /* 4885 */  [ 0.316188572, 18 ],
+  /* 4886 */  [ 0.316274877, 18 ],
+  /* 4887 */  [ 0.316361187, 18 ],
+  /* 4888 */  [ 0.316447504, 18 ],
+  /* 4889 */  [ 0.316533826, 18 ],
+  /* 4890 */  [ 0.316620155, 18 ],
+  /* 4891 */  [ 0.316706489, 18 ],
+  /* 4892 */  [ 0.316792829, 18 ],
+  /* 4893 */  [ 0.316879175, 18 ],
+  /* 4894 */  [ 0.316965527, 18 ],
+  /* 4895 */  [ 0.317051885, 18 ],
+
+  /* 4896 */  [ 0.317138249, 18 ],
+  /* 4897 */  [ 0.317224618, 18 ],
+  /* 4898 */  [ 0.317310994, 18 ],
+  /* 4899 */  [ 0.317397375, 18 ],
+  /* 4900 */  [ 0.317483762, 18 ],
+  /* 4901 */  [ 0.317570155, 18 ],
+  /* 4902 */  [ 0.317656554, 18 ],
+  /* 4903 */  [ 0.317742959, 18 ],
+  /* 4904 */  [ 0.317829370, 18 ],
+  /* 4905 */  [ 0.317915786, 18 ],
+  /* 4906 */  [ 0.318002209, 18 ],
+  /* 4907 */  [ 0.318088637, 18 ],
+  /* 4908 */  [ 0.318175071, 18 ],
+  /* 4909 */  [ 0.318261511, 18 ],
+  /* 4910 */  [ 0.318347957, 18 ],
+  /* 4911 */  [ 0.318434409, 18 ],
+
+  /* 4912 */  [ 0.318520867, 18 ],
+  /* 4913 */  [ 0.318607330, 18 ],
+  /* 4914 */  [ 0.318693800, 18 ],
+  /* 4915 */  [ 0.318780275, 18 ],
+  /* 4916 */  [ 0.318866756, 18 ],
+  /* 4917 */  [ 0.318953243, 18 ],
+  /* 4918 */  [ 0.319039736, 18 ],
+  /* 4919 */  [ 0.319126235, 18 ],
+  /* 4920 */  [ 0.319212739, 18 ],
+  /* 4921 */  [ 0.319299250, 18 ],
+  /* 4922 */  [ 0.319385766, 18 ],
+  /* 4923 */  [ 0.319472288, 18 ],
+  /* 4924 */  [ 0.319558816, 18 ],
+  /* 4925 */  [ 0.319645350, 18 ],
+  /* 4926 */  [ 0.319731890, 18 ],
+  /* 4927 */  [ 0.319818435, 18 ],
+
+  /* 4928 */  [ 0.319904987, 18 ],
+  /* 4929 */  [ 0.319991544, 18 ],
+  /* 4930 */  [ 0.320078107, 18 ],
+  /* 4931 */  [ 0.320164676, 18 ],
+  /* 4932 */  [ 0.320251251, 18 ],
+  /* 4933 */  [ 0.320337832, 18 ],
+  /* 4934 */  [ 0.320424419, 18 ],
+  /* 4935 */  [ 0.320511011, 18 ],
+  /* 4936 */  [ 0.320597609, 18 ],
+  /* 4937 */  [ 0.320684213, 18 ],
+  /* 4938 */  [ 0.320770823, 18 ],
+  /* 4939 */  [ 0.320857439, 18 ],
+  /* 4940 */  [ 0.320944061, 18 ],
+  /* 4941 */  [ 0.321030688, 18 ],
+  /* 4942 */  [ 0.321117322, 18 ],
+  /* 4943 */  [ 0.321203961, 18 ],
+
+  /* 4944 */  [ 0.321290606, 18 ],
+  /* 4945 */  [ 0.321377257, 18 ],
+  /* 4946 */  [ 0.321463913, 18 ],
+  /* 4947 */  [ 0.321550576, 18 ],
+  /* 4948 */  [ 0.321637244, 18 ],
+  /* 4949 */  [ 0.321723919, 18 ],
+  /* 4950 */  [ 0.321810599, 18 ],
+  /* 4951 */  [ 0.321897285, 18 ],
+  /* 4952 */  [ 0.321983976, 18 ],
+  /* 4953 */  [ 0.322070674, 18 ],
+  /* 4954 */  [ 0.322157377, 18 ],
+  /* 4955 */  [ 0.322244087, 18 ],
+  /* 4956 */  [ 0.322330802, 18 ],
+  /* 4957 */  [ 0.322417523, 18 ],
+  /* 4958 */  [ 0.322504249, 18 ],
+  /* 4959 */  [ 0.322590982, 18 ],
+
+  /* 4960 */  [ 0.322677720, 18 ],
+  /* 4961 */  [ 0.322764465, 18 ],
+  /* 4962 */  [ 0.322851215, 18 ],
+  /* 4963 */  [ 0.322937971, 18 ],
+  /* 4964 */  [ 0.323024732, 18 ],
+  /* 4965 */  [ 0.323111500, 18 ],
+  /* 4966 */  [ 0.323198273, 18 ],
+  /* 4967 */  [ 0.323285052, 18 ],
+  /* 4968 */  [ 0.323371837, 18 ],
+  /* 4969 */  [ 0.323458628, 18 ],
+  /* 4970 */  [ 0.323545425, 18 ],
+  /* 4971 */  [ 0.323632227, 18 ],
+  /* 4972 */  [ 0.323719036, 18 ],
+  /* 4973 */  [ 0.323805850, 18 ],
+  /* 4974 */  [ 0.323892670, 18 ],
+  /* 4975 */  [ 0.323979496, 18 ],
+
+  /* 4976 */  [ 0.324066327, 18 ],
+  /* 4977 */  [ 0.324153165, 18 ],
+  /* 4978 */  [ 0.324240008, 18 ],
+  /* 4979 */  [ 0.324326857, 18 ],
+  /* 4980 */  [ 0.324413712, 18 ],
+  /* 4981 */  [ 0.324500572, 18 ],
+  /* 4982 */  [ 0.324587439, 18 ],
+  /* 4983 */  [ 0.324674311, 18 ],
+  /* 4984 */  [ 0.324761189, 18 ],
+  /* 4985 */  [ 0.324848073, 18 ],
+  /* 4986 */  [ 0.324934963, 18 ],
+  /* 4987 */  [ 0.325021858, 18 ],
+  /* 4988 */  [ 0.325108760, 18 ],
+  /* 4989 */  [ 0.325195667, 18 ],
+  /* 4990 */  [ 0.325282580, 18 ],
+  /* 4991 */  [ 0.325369498, 18 ],
+
+  /* 4992 */  [ 0.325456423, 18 ],
+  /* 4993 */  [ 0.325543353, 18 ],
+  /* 4994 */  [ 0.325630290, 18 ],
+  /* 4995 */  [ 0.325717232, 18 ],
+  /* 4996 */  [ 0.325804179, 18 ],
+  /* 4997 */  [ 0.325891133, 18 ],
+  /* 4998 */  [ 0.325978092, 18 ],
+  /* 4999 */  [ 0.326065057, 18 ],
+  /* 5000 */  [ 0.326152028, 18 ],
+  /* 5001 */  [ 0.326239005, 18 ],
+  /* 5002 */  [ 0.326325988, 18 ],
+  /* 5003 */  [ 0.326412976, 18 ],
+  /* 5004 */  [ 0.326499970, 18 ],
+  /* 5005 */  [ 0.326586970, 18 ],
+  /* 5006 */  [ 0.326673976, 18 ],
+  /* 5007 */  [ 0.326760988, 18 ],
+
+  /* 5008 */  [ 0.326848005, 18 ],
+  /* 5009 */  [ 0.326935028, 18 ],
+  /* 5010 */  [ 0.327022057, 18 ],
+  /* 5011 */  [ 0.327109092, 18 ],
+  /* 5012 */  [ 0.327196132, 18 ],
+  /* 5013 */  [ 0.327283178, 18 ],
+  /* 5014 */  [ 0.327370231, 18 ],
+  /* 5015 */  [ 0.327457288, 18 ],
+  /* 5016 */  [ 0.327544352, 18 ],
+  /* 5017 */  [ 0.327631421, 18 ],
+  /* 5018 */  [ 0.327718497, 18 ],
+  /* 5019 */  [ 0.327805578, 18 ],
+  /* 5020 */  [ 0.327892665, 18 ],
+  /* 5021 */  [ 0.327979757, 18 ],
+  /* 5022 */  [ 0.328066855, 18 ],
+  /* 5023 */  [ 0.328153960, 18 ],
+
+  /* 5024 */  [ 0.328241070, 18 ],
+  /* 5025 */  [ 0.328328185, 18 ],
+  /* 5026 */  [ 0.328415307, 18 ],
+  /* 5027 */  [ 0.328502434, 18 ],
+  /* 5028 */  [ 0.328589567, 18 ],
+  /* 5029 */  [ 0.328676706, 18 ],
+  /* 5030 */  [ 0.328763850, 18 ],
+  /* 5031 */  [ 0.328851001, 18 ],
+  /* 5032 */  [ 0.328938157, 18 ],
+  /* 5033 */  [ 0.329025319, 18 ],
+  /* 5034 */  [ 0.329112486, 18 ],
+  /* 5035 */  [ 0.329199660, 18 ],
+  /* 5036 */  [ 0.329286839, 18 ],
+  /* 5037 */  [ 0.329374024, 18 ],
+  /* 5038 */  [ 0.329461215, 18 ],
+  /* 5039 */  [ 0.329548411, 18 ],
+
+  /* 5040 */  [ 0.329635614, 18 ],
+  /* 5041 */  [ 0.329722822, 18 ],
+  /* 5042 */  [ 0.329810036, 18 ],
+  /* 5043 */  [ 0.329897255, 18 ],
+  /* 5044 */  [ 0.329984481, 18 ],
+  /* 5045 */  [ 0.330071712, 18 ],
+  /* 5046 */  [ 0.330158949, 18 ],
+  /* 5047 */  [ 0.330246191, 18 ],
+  /* 5048 */  [ 0.330333440, 18 ],
+  /* 5049 */  [ 0.330420694, 18 ],
+  /* 5050 */  [ 0.330507954, 18 ],
+  /* 5051 */  [ 0.330595220, 18 ],
+  /* 5052 */  [ 0.330682491, 18 ],
+  /* 5053 */  [ 0.330769768, 18 ],
+  /* 5054 */  [ 0.330857051, 18 ],
+  /* 5055 */  [ 0.330944340, 18 ],
+
+  /* 5056 */  [ 0.331031635, 18 ],
+  /* 5057 */  [ 0.331118935, 18 ],
+  /* 5058 */  [ 0.331206241, 18 ],
+  /* 5059 */  [ 0.331293553, 18 ],
+  /* 5060 */  [ 0.331380870, 18 ],
+  /* 5061 */  [ 0.331468193, 18 ],
+  /* 5062 */  [ 0.331555522, 18 ],
+  /* 5063 */  [ 0.331642857, 18 ],
+  /* 5064 */  [ 0.331730198, 18 ],
+  /* 5065 */  [ 0.331817544, 18 ],
+  /* 5066 */  [ 0.331904896, 18 ],
+  /* 5067 */  [ 0.331992254, 18 ],
+  /* 5068 */  [ 0.332079617, 18 ],
+  /* 5069 */  [ 0.332166986, 18 ],
+  /* 5070 */  [ 0.332254361, 18 ],
+  /* 5071 */  [ 0.332341742, 18 ],
+
+  /* 5072 */  [ 0.332429129, 18 ],
+  /* 5073 */  [ 0.332516521, 18 ],
+  /* 5074 */  [ 0.332603919, 18 ],
+  /* 5075 */  [ 0.332691323, 18 ],
+  /* 5076 */  [ 0.332778732, 18 ],
+  /* 5077 */  [ 0.332866147, 18 ],
+  /* 5078 */  [ 0.332953568, 18 ],
+  /* 5079 */  [ 0.333040995, 18 ],
+  /* 5080 */  [ 0.333128427, 18 ],
+  /* 5081 */  [ 0.333215865, 18 ],
+  /* 5082 */  [ 0.333303309, 18 ],
+  /* 5083 */  [ 0.333390759, 18 ],
+  /* 5084 */  [ 0.333478214, 18 ],
+  /* 5085 */  [ 0.333565675, 18 ],
+  /* 5086 */  [ 0.333653142, 18 ],
+  /* 5087 */  [ 0.333740615, 18 ],
+
+  /* 5088 */  [ 0.333828093, 18 ],
+  /* 5089 */  [ 0.333915577, 18 ],
+  /* 5090 */  [ 0.334003067, 18 ],
+  /* 5091 */  [ 0.334090562, 18 ],
+  /* 5092 */  [ 0.334178063, 18 ],
+  /* 5093 */  [ 0.334265570, 18 ],
+  /* 5094 */  [ 0.334353083, 18 ],
+  /* 5095 */  [ 0.334440601, 18 ],
+  /* 5096 */  [ 0.334528126, 18 ],
+  /* 5097 */  [ 0.334615655, 18 ],
+  /* 5098 */  [ 0.334703191, 18 ],
+  /* 5099 */  [ 0.334790732, 18 ],
+  /* 5100 */  [ 0.334878279, 18 ],
+  /* 5101 */  [ 0.334965832, 18 ],
+  /* 5102 */  [ 0.335053391, 18 ],
+  /* 5103 */  [ 0.335140955, 18 ],
+
+  /* 5104 */  [ 0.335228525, 18 ],
+  /* 5105 */  [ 0.335316100, 18 ],
+  /* 5106 */  [ 0.335403682, 18 ],
+  /* 5107 */  [ 0.335491269, 18 ],
+  /* 5108 */  [ 0.335578861, 18 ],
+  /* 5109 */  [ 0.335666460, 18 ],
+  /* 5110 */  [ 0.335754064, 18 ],
+  /* 5111 */  [ 0.335841674, 18 ],
+  /* 5112 */  [ 0.335929290, 18 ],
+  /* 5113 */  [ 0.336016911, 18 ],
+  /* 5114 */  [ 0.336104538, 18 ],
+  /* 5115 */  [ 0.336192171, 18 ],
+  /* 5116 */  [ 0.336279809, 18 ],
+  /* 5117 */  [ 0.336367453, 18 ],
+  /* 5118 */  [ 0.336455103, 18 ],
+  /* 5119 */  [ 0.336542759, 18 ],
+
+  /* 5120 */  [ 0.336630420, 18 ],
+  /* 5121 */  [ 0.336718087, 18 ],
+  /* 5122 */  [ 0.336805760, 18 ],
+  /* 5123 */  [ 0.336893439, 18 ],
+  /* 5124 */  [ 0.336981123, 18 ],
+  /* 5125 */  [ 0.337068813, 18 ],
+  /* 5126 */  [ 0.337156508, 18 ],
+  /* 5127 */  [ 0.337244209, 18 ],
+  /* 5128 */  [ 0.337331916, 18 ],
+  /* 5129 */  [ 0.337419629, 18 ],
+  /* 5130 */  [ 0.337507347, 18 ],
+  /* 5131 */  [ 0.337595071, 18 ],
+  /* 5132 */  [ 0.337682801, 18 ],
+  /* 5133 */  [ 0.337770537, 18 ],
+  /* 5134 */  [ 0.337858278, 18 ],
+  /* 5135 */  [ 0.337946025, 18 ],
+
+  /* 5136 */  [ 0.338033777, 18 ],
+  /* 5137 */  [ 0.338121535, 18 ],
+  /* 5138 */  [ 0.338209299, 18 ],
+  /* 5139 */  [ 0.338297069, 18 ],
+  /* 5140 */  [ 0.338384844, 18 ],
+  /* 5141 */  [ 0.338472625, 18 ],
+  /* 5142 */  [ 0.338560412, 18 ],
+  /* 5143 */  [ 0.338648204, 18 ],
+  /* 5144 */  [ 0.338736002, 18 ],
+  /* 5145 */  [ 0.338823806, 18 ],
+  /* 5146 */  [ 0.338911616, 18 ],
+  /* 5147 */  [ 0.338999431, 18 ],
+  /* 5148 */  [ 0.339087252, 18 ],
+  /* 5149 */  [ 0.339175078, 18 ],
+  /* 5150 */  [ 0.339262910, 18 ],
+  /* 5151 */  [ 0.339350748, 18 ],
+
+  /* 5152 */  [ 0.339438592, 18 ],
+  /* 5153 */  [ 0.339526441, 18 ],
+  /* 5154 */  [ 0.339614296, 18 ],
+  /* 5155 */  [ 0.339702157, 18 ],
+  /* 5156 */  [ 0.339790023, 18 ],
+  /* 5157 */  [ 0.339877895, 18 ],
+  /* 5158 */  [ 0.339965773, 18 ],
+  /* 5159 */  [ 0.340053656, 18 ],
+  /* 5160 */  [ 0.340141545, 18 ],
+  /* 5161 */  [ 0.340229440, 18 ],
+  /* 5162 */  [ 0.340317340, 18 ],
+  /* 5163 */  [ 0.340405246, 18 ],
+  /* 5164 */  [ 0.340493158, 18 ],
+  /* 5165 */  [ 0.340581075, 18 ],
+  /* 5166 */  [ 0.340668999, 18 ],
+  /* 5167 */  [ 0.340756927, 18 ],
+
+  /* 5168 */  [ 0.340844862, 18 ],
+  /* 5169 */  [ 0.340932802, 18 ],
+  /* 5170 */  [ 0.341020748, 18 ],
+  /* 5171 */  [ 0.341108699, 18 ],
+  /* 5172 */  [ 0.341196656, 18 ],
+  /* 5173 */  [ 0.341284619, 18 ],
+  /* 5174 */  [ 0.341372587, 18 ],
+  /* 5175 */  [ 0.341460562, 18 ],
+  /* 5176 */  [ 0.341548541, 18 ],
+  /* 5177 */  [ 0.341636527, 18 ],
+  /* 5178 */  [ 0.341724518, 18 ],
+  /* 5179 */  [ 0.341812515, 18 ],
+  /* 5180 */  [ 0.341900517, 18 ],
+  /* 5181 */  [ 0.341988525, 18 ],
+  /* 5182 */  [ 0.342076539, 18 ],
+  /* 5183 */  [ 0.342164558, 18 ],
+
+  /* 5184 */  [ 0.342252584, 18 ],
+  /* 5185 */  [ 0.342340614, 18 ],
+  /* 5186 */  [ 0.342428651, 18 ],
+  /* 5187 */  [ 0.342516693, 18 ],
+  /* 5188 */  [ 0.342604741, 18 ],
+  /* 5189 */  [ 0.342692794, 18 ],
+  /* 5190 */  [ 0.342780853, 18 ],
+  /* 5191 */  [ 0.342868918, 18 ],
+  /* 5192 */  [ 0.342956988, 18 ],
+  /* 5193 */  [ 0.343045064, 18 ],
+  /* 5194 */  [ 0.343133146, 18 ],
+  /* 5195 */  [ 0.343221233, 18 ],
+  /* 5196 */  [ 0.343309326, 18 ],
+  /* 5197 */  [ 0.343397425, 18 ],
+  /* 5198 */  [ 0.343485529, 18 ],
+  /* 5199 */  [ 0.343573639, 18 ],
+
+  /* 5200 */  [ 0.343661754, 18 ],
+  /* 5201 */  [ 0.343749876, 18 ],
+  /* 5202 */  [ 0.343838003, 18 ],
+  /* 5203 */  [ 0.343926135, 18 ],
+  /* 5204 */  [ 0.344014273, 18 ],
+  /* 5205 */  [ 0.344102417, 18 ],
+  /* 5206 */  [ 0.344190566, 18 ],
+  /* 5207 */  [ 0.344278722, 18 ],
+  /* 5208 */  [ 0.344366882, 18 ],
+  /* 5209 */  [ 0.344455049, 18 ],
+  /* 5210 */  [ 0.344543221, 18 ],
+  /* 5211 */  [ 0.344631398, 18 ],
+  /* 5212 */  [ 0.344719582, 18 ],
+  /* 5213 */  [ 0.344807771, 18 ],
+  /* 5214 */  [ 0.344895965, 18 ],
+  /* 5215 */  [ 0.344984165, 18 ],
+
+  /* 5216 */  [ 0.345072371, 18 ],
+  /* 5217 */  [ 0.345160583, 18 ],
+  /* 5218 */  [ 0.345248800, 18 ],
+  /* 5219 */  [ 0.345337023, 18 ],
+  /* 5220 */  [ 0.345425251, 18 ],
+  /* 5221 */  [ 0.345513485, 18 ],
+  /* 5222 */  [ 0.345601725, 18 ],
+  /* 5223 */  [ 0.345689970, 18 ],
+  /* 5224 */  [ 0.345778221, 18 ],
+  /* 5225 */  [ 0.345866478, 18 ],
+  /* 5226 */  [ 0.345954740, 18 ],
+  /* 5227 */  [ 0.346043008, 18 ],
+  /* 5228 */  [ 0.346131281, 18 ],
+  /* 5229 */  [ 0.346219560, 18 ],
+  /* 5230 */  [ 0.346307845, 18 ],
+  /* 5231 */  [ 0.346396135, 18 ],
+
+  /* 5232 */  [ 0.346484431, 18 ],
+  /* 5233 */  [ 0.346572733, 18 ],
+  /* 5234 */  [ 0.346661040, 18 ],
+  /* 5235 */  [ 0.346749353, 18 ],
+  /* 5236 */  [ 0.346837671, 18 ],
+  /* 5237 */  [ 0.346925996, 18 ],
+  /* 5238 */  [ 0.347014325, 18 ],
+  /* 5239 */  [ 0.347102661, 18 ],
+  /* 5240 */  [ 0.347191002, 18 ],
+  /* 5241 */  [ 0.347279348, 18 ],
+  /* 5242 */  [ 0.347367700, 18 ],
+  /* 5243 */  [ 0.347456058, 18 ],
+  /* 5244 */  [ 0.347544422, 18 ],
+  /* 5245 */  [ 0.347632791, 18 ],
+  /* 5246 */  [ 0.347721165, 18 ],
+  /* 5247 */  [ 0.347809546, 18 ],
+
+  /* 5248 */  [ 0.347897931, 18 ],
+  /* 5249 */  [ 0.347986323, 18 ],
+  /* 5250 */  [ 0.348074720, 18 ],
+  /* 5251 */  [ 0.348163123, 18 ],
+  /* 5252 */  [ 0.348251531, 18 ],
+  /* 5253 */  [ 0.348339945, 18 ],
+  /* 5254 */  [ 0.348428365, 18 ],
+  /* 5255 */  [ 0.348516790, 18 ],
+  /* 5256 */  [ 0.348605221, 18 ],
+  /* 5257 */  [ 0.348693657, 18 ],
+  /* 5258 */  [ 0.348782099, 18 ],
+  /* 5259 */  [ 0.348870547, 18 ],
+  /* 5260 */  [ 0.348959000, 18 ],
+  /* 5261 */  [ 0.349047459, 18 ],
+  /* 5262 */  [ 0.349135923, 18 ],
+  /* 5263 */  [ 0.349224393, 18 ],
+
+  /* 5264 */  [ 0.349312869, 18 ],
+  /* 5265 */  [ 0.349401350, 18 ],
+  /* 5266 */  [ 0.349489837, 18 ],
+  /* 5267 */  [ 0.349578329, 18 ],
+  /* 5268 */  [ 0.349666827, 18 ],
+  /* 5269 */  [ 0.349755331, 18 ],
+  /* 5270 */  [ 0.349843840, 18 ],
+  /* 5271 */  [ 0.349932355, 18 ],
+  /* 5272 */  [ 0.350020876, 18 ],
+  /* 5273 */  [ 0.350109402, 18 ],
+  /* 5274 */  [ 0.350197933, 18 ],
+  /* 5275 */  [ 0.350286470, 18 ],
+  /* 5276 */  [ 0.350375013, 18 ],
+  /* 5277 */  [ 0.350463562, 18 ],
+  /* 5278 */  [ 0.350552116, 18 ],
+  /* 5279 */  [ 0.350640675, 18 ],
+
+  /* 5280 */  [ 0.350729240, 18 ],
+  /* 5281 */  [ 0.350817811, 18 ],
+  /* 5282 */  [ 0.350906388, 18 ],
+  /* 5283 */  [ 0.350994970, 18 ],
+  /* 5284 */  [ 0.351083557, 18 ],
+  /* 5285 */  [ 0.351172150, 18 ],
+  /* 5286 */  [ 0.351260749, 18 ],
+  /* 5287 */  [ 0.351349353, 18 ],
+  /* 5288 */  [ 0.351437963, 18 ],
+  /* 5289 */  [ 0.351526579, 18 ],
+  /* 5290 */  [ 0.351615200, 18 ],
+  /* 5291 */  [ 0.351703827, 18 ],
+  /* 5292 */  [ 0.351792459, 18 ],
+  /* 5293 */  [ 0.351881097, 18 ],
+  /* 5294 */  [ 0.351969740, 18 ],
+  /* 5295 */  [ 0.352058389, 18 ],
+
+  /* 5296 */  [ 0.352147044, 18 ],
+  /* 5297 */  [ 0.352235704, 18 ],
+  /* 5298 */  [ 0.352324369, 18 ],
+  /* 5299 */  [ 0.352413041, 18 ],
+  /* 5300 */  [ 0.352501718, 18 ],
+  /* 5301 */  [ 0.352590400, 18 ],
+  /* 5302 */  [ 0.352679088, 18 ],
+  /* 5303 */  [ 0.352767782, 18 ],
+  /* 5304 */  [ 0.352856481, 18 ],
+  /* 5305 */  [ 0.352945186, 18 ],
+  /* 5306 */  [ 0.353033896, 18 ],
+  /* 5307 */  [ 0.353122612, 18 ],
+  /* 5308 */  [ 0.353211333, 18 ],
+  /* 5309 */  [ 0.353300061, 18 ],
+  /* 5310 */  [ 0.353388793, 18 ],
+  /* 5311 */  [ 0.353477531, 18 ],
+
+  /* 5312 */  [ 0.353566275, 18 ],
+  /* 5313 */  [ 0.353655024, 18 ],
+  /* 5314 */  [ 0.353743779, 18 ],
+  /* 5315 */  [ 0.353832540, 18 ],
+  /* 5316 */  [ 0.353921306, 18 ],
+  /* 5317 */  [ 0.354010077, 18 ],
+  /* 5318 */  [ 0.354098855, 18 ],
+  /* 5319 */  [ 0.354187637, 18 ],
+  /* 5320 */  [ 0.354276426, 18 ],
+  /* 5321 */  [ 0.354365220, 18 ],
+  /* 5322 */  [ 0.354454019, 18 ],
+  /* 5323 */  [ 0.354542824, 18 ],
+  /* 5324 */  [ 0.354631635, 18 ],
+  /* 5325 */  [ 0.354720451, 18 ],
+  /* 5326 */  [ 0.354809272, 18 ],
+  /* 5327 */  [ 0.354898100, 18 ],
+
+  /* 5328 */  [ 0.354986932, 18 ],
+  /* 5329 */  [ 0.355075771, 18 ],
+  /* 5330 */  [ 0.355164615, 18 ],
+  /* 5331 */  [ 0.355253464, 18 ],
+  /* 5332 */  [ 0.355342319, 18 ],
+  /* 5333 */  [ 0.355431180, 18 ],
+  /* 5334 */  [ 0.355520046, 18 ],
+  /* 5335 */  [ 0.355608917, 18 ],
+  /* 5336 */  [ 0.355697795, 18 ],
+  /* 5337 */  [ 0.355786677, 18 ],
+  /* 5338 */  [ 0.355875566, 18 ],
+  /* 5339 */  [ 0.355964460, 18 ],
+  /* 5340 */  [ 0.356053359, 18 ],
+  /* 5341 */  [ 0.356142264, 18 ],
+  /* 5342 */  [ 0.356231175, 18 ],
+  /* 5343 */  [ 0.356320091, 18 ],
+
+  /* 5344 */  [ 0.356409012, 18 ],
+  /* 5345 */  [ 0.356497940, 18 ],
+  /* 5346 */  [ 0.356586872, 18 ],
+  /* 5347 */  [ 0.356675811, 18 ],
+  /* 5348 */  [ 0.356764754, 18 ],
+  /* 5349 */  [ 0.356853704, 18 ],
+  /* 5350 */  [ 0.356942659, 18 ],
+  /* 5351 */  [ 0.357031619, 18 ],
+  /* 5352 */  [ 0.357120585, 18 ],
+  /* 5353 */  [ 0.357209557, 18 ],
+  /* 5354 */  [ 0.357298534, 18 ],
+  /* 5355 */  [ 0.357387516, 18 ],
+  /* 5356 */  [ 0.357476504, 18 ],
+  /* 5357 */  [ 0.357565498, 18 ],
+  /* 5358 */  [ 0.357654497, 18 ],
+  /* 5359 */  [ 0.357743502, 18 ],
+
+  /* 5360 */  [ 0.357832512, 18 ],
+  /* 5361 */  [ 0.357921528, 18 ],
+  /* 5362 */  [ 0.358010550, 18 ],
+  /* 5363 */  [ 0.358099576, 18 ],
+  /* 5364 */  [ 0.358188609, 18 ],
+  /* 5365 */  [ 0.358277647, 18 ],
+  /* 5366 */  [ 0.358366690, 18 ],
+  /* 5367 */  [ 0.358455739, 18 ],
+  /* 5368 */  [ 0.358544794, 18 ],
+  /* 5369 */  [ 0.358633854, 18 ],
+  /* 5370 */  [ 0.358722920, 18 ],
+  /* 5371 */  [ 0.358811991, 18 ],
+  /* 5372 */  [ 0.358901067, 18 ],
+  /* 5373 */  [ 0.358990150, 18 ],
+  /* 5374 */  [ 0.359079237, 18 ],
+  /* 5375 */  [ 0.359168331, 18 ],
+
+  /* 5376 */  [ 0.359257429, 18 ],
+  /* 5377 */  [ 0.359346534, 18 ],
+  /* 5378 */  [ 0.359435644, 18 ],
+  /* 5379 */  [ 0.359524759, 18 ],
+  /* 5380 */  [ 0.359613880, 18 ],
+  /* 5381 */  [ 0.359703006, 18 ],
+  /* 5382 */  [ 0.359792138, 18 ],
+  /* 5383 */  [ 0.359881276, 18 ],
+  /* 5384 */  [ 0.359970419, 18 ],
+  /* 5385 */  [ 0.360059567, 18 ],
+  /* 5386 */  [ 0.360148721, 18 ],
+  /* 5387 */  [ 0.360237881, 18 ],
+  /* 5388 */  [ 0.360327046, 18 ],
+  /* 5389 */  [ 0.360416216, 18 ],
+  /* 5390 */  [ 0.360505392, 18 ],
+  /* 5391 */  [ 0.360594574, 18 ],
+
+  /* 5392 */  [ 0.360683761, 18 ],
+  /* 5393 */  [ 0.360772953, 18 ],
+  /* 5394 */  [ 0.360862152, 18 ],
+  /* 5395 */  [ 0.360951355, 18 ],
+  /* 5396 */  [ 0.361040564, 18 ],
+  /* 5397 */  [ 0.361129779, 18 ],
+  /* 5398 */  [ 0.361218999, 18 ],
+  /* 5399 */  [ 0.361308225, 18 ],
+  /* 5400 */  [ 0.361397456, 18 ],
+  /* 5401 */  [ 0.361486693, 18 ],
+  /* 5402 */  [ 0.361575935, 18 ],
+  /* 5403 */  [ 0.361665183, 18 ],
+  /* 5404 */  [ 0.361754436, 18 ],
+  /* 5405 */  [ 0.361843695, 18 ],
+  /* 5406 */  [ 0.361932959, 18 ],
+  /* 5407 */  [ 0.362022229, 18 ],
+
+  /* 5408 */  [ 0.362111504, 18 ],
+  /* 5409 */  [ 0.362200785, 18 ],
+  /* 5410 */  [ 0.362290071, 18 ],
+  /* 5411 */  [ 0.362379362, 18 ],
+  /* 5412 */  [ 0.362468660, 18 ],
+  /* 5413 */  [ 0.362557962, 18 ],
+  /* 5414 */  [ 0.362647271, 18 ],
+  /* 5415 */  [ 0.362736584, 18 ],
+  /* 5416 */  [ 0.362825904, 18 ],
+  /* 5417 */  [ 0.362915228, 18 ],
+  /* 5418 */  [ 0.363004559, 18 ],
+  /* 5419 */  [ 0.363093894, 18 ],
+  /* 5420 */  [ 0.363183236, 18 ],
+  /* 5421 */  [ 0.363272582, 18 ],
+  /* 5422 */  [ 0.363361935, 18 ],
+  /* 5423 */  [ 0.363451292, 18 ],
+
+  /* 5424 */  [ 0.363540655, 18 ],
+  /* 5425 */  [ 0.363630024, 18 ],
+  /* 5426 */  [ 0.363719398, 18 ],
+  /* 5427 */  [ 0.363808778, 18 ],
+  /* 5428 */  [ 0.363898163, 18 ],
+  /* 5429 */  [ 0.363987554, 18 ],
+  /* 5430 */  [ 0.364076950, 18 ],
+  /* 5431 */  [ 0.364166352, 18 ],
+  /* 5432 */  [ 0.364255759, 18 ],
+  /* 5433 */  [ 0.364345171, 18 ],
+  /* 5434 */  [ 0.364434589, 18 ],
+  /* 5435 */  [ 0.364524013, 18 ],
+  /* 5436 */  [ 0.364613442, 18 ],
+  /* 5437 */  [ 0.364702877, 18 ],
+  /* 5438 */  [ 0.364792317, 18 ],
+  /* 5439 */  [ 0.364881762, 18 ],
+
+  /* 5440 */  [ 0.364971213, 18 ],
+  /* 5441 */  [ 0.365060669, 18 ],
+  /* 5442 */  [ 0.365150131, 18 ],
+  /* 5443 */  [ 0.365239599, 18 ],
+  /* 5444 */  [ 0.365329072, 18 ],
+  /* 5445 */  [ 0.365418550, 18 ],
+  /* 5446 */  [ 0.365508034, 18 ],
+  /* 5447 */  [ 0.365597523, 18 ],
+  /* 5448 */  [ 0.365687018, 18 ],
+  /* 5449 */  [ 0.365776518, 18 ],
+  /* 5450 */  [ 0.365866024, 18 ],
+  /* 5451 */  [ 0.365955536, 18 ],
+  /* 5452 */  [ 0.366045052, 18 ],
+  /* 5453 */  [ 0.366134574, 18 ],
+  /* 5454 */  [ 0.366224102, 18 ],
+  /* 5455 */  [ 0.366313635, 18 ],
+
+  /* 5456 */  [ 0.366403174, 18 ],
+  /* 5457 */  [ 0.366492718, 18 ],
+  /* 5458 */  [ 0.366582267, 18 ],
+  /* 5459 */  [ 0.366671822, 18 ],
+  /* 5460 */  [ 0.366761383, 18 ],
+  /* 5461 */  [ 0.366850949, 18 ],
+  /* 5462 */  [ 0.366940520, 18 ],
+  /* 5463 */  [ 0.367030097, 18 ],
+  /* 5464 */  [ 0.367119680, 18 ],
+  /* 5465 */  [ 0.367209267, 18 ],
+  /* 5466 */  [ 0.367298861, 18 ],
+  /* 5467 */  [ 0.367388459, 18 ],
+  /* 5468 */  [ 0.367478064, 18 ],
+  /* 5469 */  [ 0.367567673, 18 ],
+  /* 5470 */  [ 0.367657288, 18 ],
+  /* 5471 */  [ 0.367746909, 18 ],
+
+  /* 5472 */  [ 0.367836535, 18 ],
+  /* 5473 */  [ 0.367926167, 18 ],
+  /* 5474 */  [ 0.368015804, 18 ],
+  /* 5475 */  [ 0.368105446, 18 ],
+  /* 5476 */  [ 0.368195094, 18 ],
+  /* 5477 */  [ 0.368284747, 18 ],
+  /* 5478 */  [ 0.368374406, 18 ],
+  /* 5479 */  [ 0.368464070, 18 ],
+  /* 5480 */  [ 0.368553740, 18 ],
+  /* 5481 */  [ 0.368643415, 18 ],
+  /* 5482 */  [ 0.368733096, 18 ],
+  /* 5483 */  [ 0.368822782, 18 ],
+  /* 5484 */  [ 0.368912473, 18 ],
+  /* 5485 */  [ 0.369002170, 18 ],
+  /* 5486 */  [ 0.369091873, 18 ],
+  /* 5487 */  [ 0.369181581, 18 ],
+
+  /* 5488 */  [ 0.369271294, 18 ],
+  /* 5489 */  [ 0.369361013, 18 ],
+  /* 5490 */  [ 0.369450737, 18 ],
+  /* 5491 */  [ 0.369540467, 18 ],
+  /* 5492 */  [ 0.369630202, 18 ],
+  /* 5493 */  [ 0.369719942, 18 ],
+  /* 5494 */  [ 0.369809688, 18 ],
+  /* 5495 */  [ 0.369899440, 18 ],
+  /* 5496 */  [ 0.369989197, 18 ],
+  /* 5497 */  [ 0.370078959, 18 ],
+  /* 5498 */  [ 0.370168727, 18 ],
+  /* 5499 */  [ 0.370258500, 18 ],
+  /* 5500 */  [ 0.370348279, 18 ],
+  /* 5501 */  [ 0.370438063, 18 ],
+  /* 5502 */  [ 0.370527853, 18 ],
+  /* 5503 */  [ 0.370617648, 18 ],
+
+  /* 5504 */  [ 0.370707448, 18 ],
+  /* 5505 */  [ 0.370797254, 18 ],
+  /* 5506 */  [ 0.370887065, 18 ],
+  /* 5507 */  [ 0.370976882, 18 ],
+  /* 5508 */  [ 0.371066704, 18 ],
+  /* 5509 */  [ 0.371156532, 18 ],
+  /* 5510 */  [ 0.371246365, 18 ],
+  /* 5511 */  [ 0.371336203, 18 ],
+  /* 5512 */  [ 0.371426047, 18 ],
+  /* 5513 */  [ 0.371515897, 18 ],
+  /* 5514 */  [ 0.371605751, 18 ],
+  /* 5515 */  [ 0.371695612, 18 ],
+  /* 5516 */  [ 0.371785477, 18 ],
+  /* 5517 */  [ 0.371875348, 18 ],
+  /* 5518 */  [ 0.371965225, 18 ],
+  /* 5519 */  [ 0.372055107, 18 ],
+
+  /* 5520 */  [ 0.372144994, 18 ],
+  /* 5521 */  [ 0.372234887, 18 ],
+  /* 5522 */  [ 0.372324785, 18 ],
+  /* 5523 */  [ 0.372414689, 18 ],
+  /* 5524 */  [ 0.372504598, 18 ],
+  /* 5525 */  [ 0.372594513, 18 ],
+  /* 5526 */  [ 0.372684433, 18 ],
+  /* 5527 */  [ 0.372774358, 18 ],
+  /* 5528 */  [ 0.372864289, 18 ],
+  /* 5529 */  [ 0.372954225, 18 ],
+  /* 5530 */  [ 0.373044167, 18 ],
+  /* 5531 */  [ 0.373134114, 18 ],
+  /* 5532 */  [ 0.373224066, 18 ],
+  /* 5533 */  [ 0.373314024, 18 ],
+  /* 5534 */  [ 0.373403987, 18 ],
+  /* 5535 */  [ 0.373493956, 18 ],
+
+  /* 5536 */  [ 0.373583930, 18 ],
+  /* 5537 */  [ 0.373673910, 18 ],
+  /* 5538 */  [ 0.373763895, 18 ],
+  /* 5539 */  [ 0.373853885, 18 ],
+  /* 5540 */  [ 0.373943881, 18 ],
+  /* 5541 */  [ 0.374033882, 18 ],
+  /* 5542 */  [ 0.374123889, 18 ],
+  /* 5543 */  [ 0.374213901, 18 ],
+  /* 5544 */  [ 0.374303918, 18 ],
+  /* 5545 */  [ 0.374393941, 18 ],
+  /* 5546 */  [ 0.374483970, 18 ],
+  /* 5547 */  [ 0.374574003, 18 ],
+  /* 5548 */  [ 0.374664042, 18 ],
+  /* 5549 */  [ 0.374754087, 18 ],
+  /* 5550 */  [ 0.374844137, 18 ],
+  /* 5551 */  [ 0.374934192, 18 ],
+
+  /* 5552 */  [ 0.375024253, 18 ],
+  /* 5553 */  [ 0.375114319, 18 ],
+  /* 5554 */  [ 0.375204391, 18 ],
+  /* 5555 */  [ 0.375294468, 18 ],
+  /* 5556 */  [ 0.375384550, 18 ],
+  /* 5557 */  [ 0.375474638, 18 ],
+  /* 5558 */  [ 0.375564731, 18 ],
+  /* 5559 */  [ 0.375654830, 18 ],
+  /* 5560 */  [ 0.375744934, 18 ],
+  /* 5561 */  [ 0.375835043, 18 ],
+  /* 5562 */  [ 0.375925158, 18 ],
+  /* 5563 */  [ 0.376015278, 18 ],
+  /* 5564 */  [ 0.376105404, 18 ],
+  /* 5565 */  [ 0.376195535, 18 ],
+  /* 5566 */  [ 0.376285671, 18 ],
+  /* 5567 */  [ 0.376375813, 18 ],
+
+  /* 5568 */  [ 0.376465960, 18 ],
+  /* 5569 */  [ 0.376556113, 18 ],
+  /* 5570 */  [ 0.376646271, 18 ],
+  /* 5571 */  [ 0.376736434, 18 ],
+  /* 5572 */  [ 0.376826603, 18 ],
+  /* 5573 */  [ 0.376916777, 18 ],
+  /* 5574 */  [ 0.377006957, 18 ],
+  /* 5575 */  [ 0.377097141, 18 ],
+  /* 5576 */  [ 0.377187332, 18 ],
+  /* 5577 */  [ 0.377277528, 18 ],
+  /* 5578 */  [ 0.377367729, 18 ],
+  /* 5579 */  [ 0.377457935, 18 ],
+  /* 5580 */  [ 0.377548147, 18 ],
+  /* 5581 */  [ 0.377638364, 18 ],
+  /* 5582 */  [ 0.377728587, 18 ],
+  /* 5583 */  [ 0.377818815, 18 ],
+
+  /* 5584 */  [ 0.377909049, 18 ],
+  /* 5585 */  [ 0.377999288, 18 ],
+  /* 5586 */  [ 0.378089532, 18 ],
+  /* 5587 */  [ 0.378179781, 18 ],
+  /* 5588 */  [ 0.378270036, 18 ],
+  /* 5589 */  [ 0.378360297, 18 ],
+  /* 5590 */  [ 0.378450563, 18 ],
+  /* 5591 */  [ 0.378540834, 18 ],
+  /* 5592 */  [ 0.378631110, 18 ],
+  /* 5593 */  [ 0.378721392, 18 ],
+  /* 5594 */  [ 0.378811680, 18 ],
+  /* 5595 */  [ 0.378901972, 18 ],
+  /* 5596 */  [ 0.378992270, 18 ],
+  /* 5597 */  [ 0.379082574, 18 ],
+  /* 5598 */  [ 0.379172883, 18 ],
+  /* 5599 */  [ 0.379263197, 18 ],
+
+  /* 5600 */  [ 0.379353516, 18 ],
+  /* 5601 */  [ 0.379443841, 18 ],
+  /* 5602 */  [ 0.379534172, 18 ],
+  /* 5603 */  [ 0.379624507, 18 ],
+  /* 5604 */  [ 0.379714848, 18 ],
+  /* 5605 */  [ 0.379805195, 18 ],
+  /* 5606 */  [ 0.379895547, 18 ],
+  /* 5607 */  [ 0.379985904, 18 ],
+  /* 5608 */  [ 0.380076266, 18 ],
+  /* 5609 */  [ 0.380166634, 18 ],
+  /* 5610 */  [ 0.380257008, 18 ],
+  /* 5611 */  [ 0.380347386, 18 ],
+  /* 5612 */  [ 0.380437770, 18 ],
+  /* 5613 */  [ 0.380528160, 18 ],
+  /* 5614 */  [ 0.380618555, 18 ],
+  /* 5615 */  [ 0.380708955, 18 ],
+
+  /* 5616 */  [ 0.380799360, 18 ],
+  /* 5617 */  [ 0.380889771, 18 ],
+  /* 5618 */  [ 0.380980187, 18 ],
+  /* 5619 */  [ 0.381070609, 18 ],
+  /* 5620 */  [ 0.381161036, 18 ],
+  /* 5621 */  [ 0.381251468, 18 ],
+  /* 5622 */  [ 0.381341906, 18 ],
+  /* 5623 */  [ 0.381432349, 18 ],
+  /* 5624 */  [ 0.381522798, 18 ],
+  /* 5625 */  [ 0.381613251, 18 ],
+  /* 5626 */  [ 0.381703711, 18 ],
+  /* 5627 */  [ 0.381794175, 18 ],
+  /* 5628 */  [ 0.381884645, 18 ],
+  /* 5629 */  [ 0.381975120, 18 ],
+  /* 5630 */  [ 0.382065601, 18 ],
+  /* 5631 */  [ 0.382156087, 18 ],
+
+  /* 5632 */  [ 0.382246578, 18 ],
+  /* 5633 */  [ 0.382337075, 18 ],
+  /* 5634 */  [ 0.382427577, 18 ],
+  /* 5635 */  [ 0.382518084, 18 ],
+  /* 5636 */  [ 0.382608597, 18 ],
+  /* 5637 */  [ 0.382699115, 18 ],
+  /* 5638 */  [ 0.382789638, 18 ],
+  /* 5639 */  [ 0.382880167, 18 ],
+  /* 5640 */  [ 0.382970701, 18 ],
+  /* 5641 */  [ 0.383061241, 18 ],
+  /* 5642 */  [ 0.383151786, 18 ],
+  /* 5643 */  [ 0.383242336, 18 ],
+  /* 5644 */  [ 0.383332891, 18 ],
+  /* 5645 */  [ 0.383423452, 18 ],
+  /* 5646 */  [ 0.383514018, 18 ],
+  /* 5647 */  [ 0.383604590, 18 ],
+
+  /* 5648 */  [ 0.383695167, 18 ],
+  /* 5649 */  [ 0.383785749, 18 ],
+  /* 5650 */  [ 0.383876337, 18 ],
+  /* 5651 */  [ 0.383966930, 18 ],
+  /* 5652 */  [ 0.384057528, 18 ],
+  /* 5653 */  [ 0.384148132, 18 ],
+  /* 5654 */  [ 0.384238741, 18 ],
+  /* 5655 */  [ 0.384329355, 18 ],
+  /* 5656 */  [ 0.384419975, 18 ],
+  /* 5657 */  [ 0.384510600, 18 ],
+  /* 5658 */  [ 0.384601230, 18 ],
+  /* 5659 */  [ 0.384691866, 18 ],
+  /* 5660 */  [ 0.384782507, 18 ],
+  /* 5661 */  [ 0.384873153, 18 ],
+  /* 5662 */  [ 0.384963805, 18 ],
+  /* 5663 */  [ 0.385054462, 18 ],
+
+  /* 5664 */  [ 0.385145124, 18 ],
+  /* 5665 */  [ 0.385235792, 18 ],
+  /* 5666 */  [ 0.385326465, 18 ],
+  /* 5667 */  [ 0.385417143, 18 ],
+  /* 5668 */  [ 0.385507827, 18 ],
+  /* 5669 */  [ 0.385598516, 18 ],
+  /* 5670 */  [ 0.385689211, 18 ],
+  /* 5671 */  [ 0.385779910, 18 ],
+  /* 5672 */  [ 0.385870615, 18 ],
+  /* 5673 */  [ 0.385961326, 18 ],
+  /* 5674 */  [ 0.386052041, 18 ],
+  /* 5675 */  [ 0.386142762, 18 ],
+  /* 5676 */  [ 0.386233489, 18 ],
+  /* 5677 */  [ 0.386324221, 18 ],
+  /* 5678 */  [ 0.386414958, 18 ],
+  /* 5679 */  [ 0.386505700, 18 ],
+
+  /* 5680 */  [ 0.386596448, 18 ],
+  /* 5681 */  [ 0.386687201, 18 ],
+  /* 5682 */  [ 0.386777959, 18 ],
+  /* 5683 */  [ 0.386868723, 18 ],
+  /* 5684 */  [ 0.386959492, 18 ],
+  /* 5685 */  [ 0.387050266, 18 ],
+  /* 5686 */  [ 0.387141045, 18 ],
+  /* 5687 */  [ 0.387231830, 18 ],
+  /* 5688 */  [ 0.387322621, 18 ],
+  /* 5689 */  [ 0.387413416, 18 ],
+  /* 5690 */  [ 0.387504217, 18 ],
+  /* 5691 */  [ 0.387595023, 18 ],
+  /* 5692 */  [ 0.387685835, 18 ],
+  /* 5693 */  [ 0.387776652, 18 ],
+  /* 5694 */  [ 0.387867474, 18 ],
+  /* 5695 */  [ 0.387958301, 18 ],
+
+  /* 5696 */  [ 0.388049134, 18 ],
+  /* 5697 */  [ 0.388139972, 18 ],
+  /* 5698 */  [ 0.388230816, 18 ],
+  /* 5699 */  [ 0.388321665, 18 ],
+  /* 5700 */  [ 0.388412519, 18 ],
+  /* 5701 */  [ 0.388503378, 18 ],
+  /* 5702 */  [ 0.388594243, 18 ],
+  /* 5703 */  [ 0.388685113, 18 ],
+  /* 5704 */  [ 0.388775988, 18 ],
+  /* 5705 */  [ 0.388866869, 18 ],
+  /* 5706 */  [ 0.388957755, 18 ],
+  /* 5707 */  [ 0.389048646, 18 ],
+  /* 5708 */  [ 0.389139542, 18 ],
+  /* 5709 */  [ 0.389230444, 18 ],
+  /* 5710 */  [ 0.389321352, 18 ],
+  /* 5711 */  [ 0.389412264, 18 ],
+
+  /* 5712 */  [ 0.389503182, 18 ],
+  /* 5713 */  [ 0.389594105, 18 ],
+  /* 5714 */  [ 0.389685033, 18 ],
+  /* 5715 */  [ 0.389775967, 18 ],
+  /* 5716 */  [ 0.389866906, 18 ],
+  /* 5717 */  [ 0.389957850, 18 ],
+  /* 5718 */  [ 0.390048800, 18 ],
+  /* 5719 */  [ 0.390139755, 18 ],
+  /* 5720 */  [ 0.390230715, 18 ],
+  /* 5721 */  [ 0.390321681, 18 ],
+  /* 5722 */  [ 0.390412651, 18 ],
+  /* 5723 */  [ 0.390503628, 18 ],
+  /* 5724 */  [ 0.390594609, 18 ],
+  /* 5725 */  [ 0.390685596, 18 ],
+  /* 5726 */  [ 0.390776588, 18 ],
+  /* 5727 */  [ 0.390867585, 18 ],
+
+  /* 5728 */  [ 0.390958588, 18 ],
+  /* 5729 */  [ 0.391049596, 18 ],
+  /* 5730 */  [ 0.391140609, 18 ],
+  /* 5731 */  [ 0.391231627, 18 ],
+  /* 5732 */  [ 0.391322651, 18 ],
+  /* 5733 */  [ 0.391413680, 18 ],
+  /* 5734 */  [ 0.391504714, 18 ],
+  /* 5735 */  [ 0.391595754, 18 ],
+  /* 5736 */  [ 0.391686799, 18 ],
+  /* 5737 */  [ 0.391777849, 18 ],
+  /* 5738 */  [ 0.391868905, 18 ],
+  /* 5739 */  [ 0.391959966, 18 ],
+  /* 5740 */  [ 0.392051032, 18 ],
+  /* 5741 */  [ 0.392142103, 18 ],
+  /* 5742 */  [ 0.392233180, 18 ],
+  /* 5743 */  [ 0.392324262, 18 ],
+
+  /* 5744 */  [ 0.392415349, 18 ],
+  /* 5745 */  [ 0.392506442, 18 ],
+  /* 5746 */  [ 0.392597540, 18 ],
+  /* 5747 */  [ 0.392688643, 18 ],
+  /* 5748 */  [ 0.392779751, 18 ],
+  /* 5749 */  [ 0.392870865, 18 ],
+  /* 5750 */  [ 0.392961984, 18 ],
+  /* 5751 */  [ 0.393053108, 18 ],
+  /* 5752 */  [ 0.393144238, 18 ],
+  /* 5753 */  [ 0.393235372, 18 ],
+  /* 5754 */  [ 0.393326513, 18 ],
+  /* 5755 */  [ 0.393417658, 18 ],
+  /* 5756 */  [ 0.393508809, 18 ],
+  /* 5757 */  [ 0.393599965, 18 ],
+  /* 5758 */  [ 0.393691126, 18 ],
+  /* 5759 */  [ 0.393782292, 18 ],
+
+  /* 5760 */  [ 0.393873464, 18 ],
+  /* 5761 */  [ 0.393964641, 18 ],
+  /* 5762 */  [ 0.394055823, 18 ],
+  /* 5763 */  [ 0.394147011, 18 ],
+  /* 5764 */  [ 0.394238204, 18 ],
+  /* 5765 */  [ 0.394329402, 18 ],
+  /* 5766 */  [ 0.394420605, 18 ],
+  /* 5767 */  [ 0.394511814, 18 ],
+  /* 5768 */  [ 0.394603028, 18 ],
+  /* 5769 */  [ 0.394694247, 18 ],
+  /* 5770 */  [ 0.394785472, 18 ],
+  /* 5771 */  [ 0.394876702, 18 ],
+  /* 5772 */  [ 0.394967937, 18 ],
+  /* 5773 */  [ 0.395059177, 18 ],
+  /* 5774 */  [ 0.395150423, 18 ],
+  /* 5775 */  [ 0.395241673, 18 ],
+
+  /* 5776 */  [ 0.395332930, 18 ],
+  /* 5777 */  [ 0.395424191, 18 ],
+  /* 5778 */  [ 0.395515458, 18 ],
+  /* 5779 */  [ 0.395606730, 18 ],
+  /* 5780 */  [ 0.395698007, 18 ],
+  /* 5781 */  [ 0.395789289, 18 ],
+  /* 5782 */  [ 0.395880577, 18 ],
+  /* 5783 */  [ 0.395971870, 18 ],
+  /* 5784 */  [ 0.396063168, 18 ],
+  /* 5785 */  [ 0.396154472, 18 ],
+  /* 5786 */  [ 0.396245780, 18 ],
+  /* 5787 */  [ 0.396337094, 18 ],
+  /* 5788 */  [ 0.396428414, 18 ],
+  /* 5789 */  [ 0.396519738, 18 ],
+  /* 5790 */  [ 0.396611068, 18 ],
+  /* 5791 */  [ 0.396702403, 18 ],
+
+  /* 5792 */  [ 0.396793743, 18 ],
+  /* 5793 */  [ 0.396885089, 18 ],
+  /* 5794 */  [ 0.396976440, 18 ],
+  /* 5795 */  [ 0.397067796, 18 ],
+  /* 5796 */  [ 0.397159157, 18 ],
+  /* 5797 */  [ 0.397250524, 18 ],
+  /* 5798 */  [ 0.397341896, 18 ],
+  /* 5799 */  [ 0.397433273, 18 ],
+  /* 5800 */  [ 0.397524655, 18 ],
+  /* 5801 */  [ 0.397616043, 18 ],
+  /* 5802 */  [ 0.397707436, 18 ],
+  /* 5803 */  [ 0.397798834, 18 ],
+  /* 5804 */  [ 0.397890237, 18 ],
+  /* 5805 */  [ 0.397981646, 18 ],
+  /* 5806 */  [ 0.398073059, 18 ],
+  /* 5807 */  [ 0.398164479, 18 ],
+
+  /* 5808 */  [ 0.398255903, 18 ],
+  /* 5809 */  [ 0.398347333, 18 ],
+  /* 5810 */  [ 0.398438767, 18 ],
+  /* 5811 */  [ 0.398530207, 18 ],
+  /* 5812 */  [ 0.398621653, 18 ],
+  /* 5813 */  [ 0.398713103, 18 ],
+  /* 5814 */  [ 0.398804559, 18 ],
+  /* 5815 */  [ 0.398896020, 18 ],
+  /* 5816 */  [ 0.398987487, 18 ],
+  /* 5817 */  [ 0.399078958, 18 ],
+  /* 5818 */  [ 0.399170435, 18 ],
+  /* 5819 */  [ 0.399261917, 18 ],
+  /* 5820 */  [ 0.399353404, 18 ],
+  /* 5821 */  [ 0.399444897, 18 ],
+  /* 5822 */  [ 0.399536395, 18 ],
+  /* 5823 */  [ 0.399627898, 18 ],
+
+  /* 5824 */  [ 0.399719406, 18 ],
+  /* 5825 */  [ 0.399810919, 18 ],
+  /* 5826 */  [ 0.399902438, 18 ],
+  /* 5827 */  [ 0.399993962, 18 ],
+  /* 5828 */  [ 0.400085491, 18 ],
+  /* 5829 */  [ 0.400177026, 18 ],
+  /* 5830 */  [ 0.400268565, 18 ],
+  /* 5831 */  [ 0.400360110, 18 ],
+  /* 5832 */  [ 0.400451660, 18 ],
+  /* 5833 */  [ 0.400543216, 18 ],
+  /* 5834 */  [ 0.400634776, 18 ],
+  /* 5835 */  [ 0.400726342, 18 ],
+  /* 5836 */  [ 0.400817913, 18 ],
+  /* 5837 */  [ 0.400909489, 18 ],
+  /* 5838 */  [ 0.401001071, 18 ],
+  /* 5839 */  [ 0.401092657, 18 ],
+
+  /* 5840 */  [ 0.401184249, 18 ],
+  /* 5841 */  [ 0.401275847, 18 ],
+  /* 5842 */  [ 0.401367449, 18 ],
+  /* 5843 */  [ 0.401459057, 18 ],
+  /* 5844 */  [ 0.401550670, 18 ],
+  /* 5845 */  [ 0.401642288, 18 ],
+  /* 5846 */  [ 0.401733911, 18 ],
+  /* 5847 */  [ 0.401825540, 18 ],
+  /* 5848 */  [ 0.401917173, 18 ],
+  /* 5849 */  [ 0.402008812, 18 ],
+  /* 5850 */  [ 0.402100457, 18 ],
+  /* 5851 */  [ 0.402192106, 18 ],
+  /* 5852 */  [ 0.402283761, 18 ],
+  /* 5853 */  [ 0.402375420, 18 ],
+  /* 5854 */  [ 0.402467086, 18 ],
+  /* 5855 */  [ 0.402558756, 18 ],
+
+  /* 5856 */  [ 0.402650431, 18 ],
+  /* 5857 */  [ 0.402742112, 18 ],
+  /* 5858 */  [ 0.402833798, 18 ],
+  /* 5859 */  [ 0.402925489, 18 ],
+  /* 5860 */  [ 0.403017186, 18 ],
+  /* 5861 */  [ 0.403108887, 18 ],
+  /* 5862 */  [ 0.403200594, 18 ],
+  /* 5863 */  [ 0.403292306, 18 ],
+  /* 5864 */  [ 0.403384024, 18 ],
+  /* 5865 */  [ 0.403475746, 18 ],
+  /* 5866 */  [ 0.403567474, 18 ],
+  /* 5867 */  [ 0.403659207, 18 ],
+  /* 5868 */  [ 0.403750945, 18 ],
+  /* 5869 */  [ 0.403842688, 18 ],
+  /* 5870 */  [ 0.403934437, 18 ],
+  /* 5871 */  [ 0.404026190, 18 ],
+
+  /* 5872 */  [ 0.404117949, 18 ],
+  /* 5873 */  [ 0.404209714, 18 ],
+  /* 5874 */  [ 0.404301483, 18 ],
+  /* 5875 */  [ 0.404393258, 18 ],
+  /* 5876 */  [ 0.404485037, 18 ],
+  /* 5877 */  [ 0.404576822, 18 ],
+  /* 5878 */  [ 0.404668613, 18 ],
+  /* 5879 */  [ 0.404760408, 18 ],
+  /* 5880 */  [ 0.404852209, 18 ],
+  /* 5881 */  [ 0.404944014, 18 ],
+  /* 5882 */  [ 0.405035825, 18 ],
+  /* 5883 */  [ 0.405127642, 18 ],
+  /* 5884 */  [ 0.405219463, 18 ],
+  /* 5885 */  [ 0.405311290, 18 ],
+  /* 5886 */  [ 0.405403122, 18 ],
+  /* 5887 */  [ 0.405494959, 18 ],
+
+  /* 5888 */  [ 0.405586801, 18 ],
+  /* 5889 */  [ 0.405678648, 18 ],
+  /* 5890 */  [ 0.405770501, 18 ],
+  /* 5891 */  [ 0.405862359, 18 ],
+  /* 5892 */  [ 0.405954222, 18 ],
+  /* 5893 */  [ 0.406046090, 18 ],
+  /* 5894 */  [ 0.406137963, 18 ],
+  /* 5895 */  [ 0.406229842, 18 ],
+  /* 5896 */  [ 0.406321726, 18 ],
+  /* 5897 */  [ 0.406413615, 18 ],
+  /* 5898 */  [ 0.406505509, 18 ],
+  /* 5899 */  [ 0.406597408, 18 ],
+  /* 5900 */  [ 0.406689313, 18 ],
+  /* 5901 */  [ 0.406781223, 18 ],
+  /* 5902 */  [ 0.406873138, 18 ],
+  /* 5903 */  [ 0.406965058, 18 ],
+
+  /* 5904 */  [ 0.407056983, 18 ],
+  /* 5905 */  [ 0.407148914, 18 ],
+  /* 5906 */  [ 0.407240850, 18 ],
+  /* 5907 */  [ 0.407332791, 18 ],
+  /* 5908 */  [ 0.407424737, 18 ],
+  /* 5909 */  [ 0.407516688, 18 ],
+  /* 5910 */  [ 0.407608645, 18 ],
+  /* 5911 */  [ 0.407700606, 18 ],
+  /* 5912 */  [ 0.407792573, 18 ],
+  /* 5913 */  [ 0.407884545, 18 ],
+  /* 5914 */  [ 0.407976522, 18 ],
+  /* 5915 */  [ 0.408068505, 18 ],
+  /* 5916 */  [ 0.408160492, 18 ],
+  /* 5917 */  [ 0.408252485, 18 ],
+  /* 5918 */  [ 0.408344483, 18 ],
+  /* 5919 */  [ 0.408436486, 18 ],
+
+  /* 5920 */  [ 0.408528495, 18 ],
+  /* 5921 */  [ 0.408620508, 18 ],
+  /* 5922 */  [ 0.408712527, 18 ],
+  /* 5923 */  [ 0.408804551, 18 ],
+  /* 5924 */  [ 0.408896580, 18 ],
+  /* 5925 */  [ 0.408988614, 18 ],
+  /* 5926 */  [ 0.409080653, 18 ],
+  /* 5927 */  [ 0.409172698, 18 ],
+  /* 5928 */  [ 0.409264748, 18 ],
+  /* 5929 */  [ 0.409356803, 18 ],
+  /* 5930 */  [ 0.409448863, 18 ],
+  /* 5931 */  [ 0.409540928, 18 ],
+  /* 5932 */  [ 0.409632999, 18 ],
+  /* 5933 */  [ 0.409725074, 18 ],
+  /* 5934 */  [ 0.409817155, 18 ],
+  /* 5935 */  [ 0.409909241, 18 ],
+
+  /* 5936 */  [ 0.410001332, 18 ],
+  /* 5937 */  [ 0.410093428, 18 ],
+  /* 5938 */  [ 0.410185530, 18 ],
+  /* 5939 */  [ 0.410277637, 18 ],
+  /* 5940 */  [ 0.410369748, 18 ],
+  /* 5941 */  [ 0.410461865, 18 ],
+  /* 5942 */  [ 0.410553988, 18 ],
+  /* 5943 */  [ 0.410646115, 18 ],
+  /* 5944 */  [ 0.410738247, 18 ],
+  /* 5945 */  [ 0.410830385, 18 ],
+  /* 5946 */  [ 0.410922528, 18 ],
+  /* 5947 */  [ 0.411014676, 18 ],
+  /* 5948 */  [ 0.411106829, 18 ],
+  /* 5949 */  [ 0.411198987, 18 ],
+  /* 5950 */  [ 0.411291151, 18 ],
+  /* 5951 */  [ 0.411383320, 18 ],
+
+  /* 5952 */  [ 0.411475493, 18 ],
+  /* 5953 */  [ 0.411567672, 18 ],
+  /* 5954 */  [ 0.411659857, 18 ],
+  /* 5955 */  [ 0.411752046, 18 ],
+  /* 5956 */  [ 0.411844240, 18 ],
+  /* 5957 */  [ 0.411936440, 18 ],
+  /* 5958 */  [ 0.412028645, 18 ],
+  /* 5959 */  [ 0.412120855, 18 ],
+  /* 5960 */  [ 0.412213070, 18 ],
+  /* 5961 */  [ 0.412305290, 18 ],
+  /* 5962 */  [ 0.412397516, 18 ],
+  /* 5963 */  [ 0.412489746, 18 ],
+  /* 5964 */  [ 0.412581982, 18 ],
+  /* 5965 */  [ 0.412674223, 18 ],
+  /* 5966 */  [ 0.412766469, 18 ],
+  /* 5967 */  [ 0.412858720, 18 ],
+
+  /* 5968 */  [ 0.412950976, 18 ],
+  /* 5969 */  [ 0.413043238, 18 ],
+  /* 5970 */  [ 0.413135505, 18 ],
+  /* 5971 */  [ 0.413227776, 18 ],
+  /* 5972 */  [ 0.413320053, 18 ],
+  /* 5973 */  [ 0.413412335, 18 ],
+  /* 5974 */  [ 0.413504623, 18 ],
+  /* 5975 */  [ 0.413596915, 18 ],
+  /* 5976 */  [ 0.413689213, 18 ],
+  /* 5977 */  [ 0.413781515, 18 ],
+  /* 5978 */  [ 0.413873823, 18 ],
+  /* 5979 */  [ 0.413966136, 18 ],
+  /* 5980 */  [ 0.414058454, 18 ],
+  /* 5981 */  [ 0.414150778, 18 ],
+  /* 5982 */  [ 0.414243106, 18 ],
+  /* 5983 */  [ 0.414335440, 18 ],
+
+  /* 5984 */  [ 0.414427779, 18 ],
+  /* 5985 */  [ 0.414520122, 18 ],
+  /* 5986 */  [ 0.414612471, 18 ],
+  /* 5987 */  [ 0.414704826, 18 ],
+  /* 5988 */  [ 0.414797185, 18 ],
+  /* 5989 */  [ 0.414889549, 18 ],
+  /* 5990 */  [ 0.414981919, 18 ],
+  /* 5991 */  [ 0.415074294, 18 ],
+  /* 5992 */  [ 0.415166674, 18 ],
+  /* 5993 */  [ 0.415259059, 18 ],
+  /* 5994 */  [ 0.415351449, 18 ],
+  /* 5995 */  [ 0.415443844, 18 ],
+  /* 5996 */  [ 0.415536244, 18 ],
+  /* 5997 */  [ 0.415628650, 18 ],
+  /* 5998 */  [ 0.415721061, 18 ],
+  /* 5999 */  [ 0.415813476, 18 ],
+
+  /* 6000 */  [ 0.415905897, 18 ],
+  /* 6001 */  [ 0.415998324, 18 ],
+  /* 6002 */  [ 0.416090755, 18 ],
+  /* 6003 */  [ 0.416183191, 18 ],
+  /* 6004 */  [ 0.416275633, 18 ],
+  /* 6005 */  [ 0.416368079, 18 ],
+  /* 6006 */  [ 0.416460531, 18 ],
+  /* 6007 */  [ 0.416552988, 18 ],
+  /* 6008 */  [ 0.416645450, 18 ],
+  /* 6009 */  [ 0.416737917, 18 ],
+  /* 6010 */  [ 0.416830389, 18 ],
+  /* 6011 */  [ 0.416922867, 18 ],
+  /* 6012 */  [ 0.417015349, 18 ],
+  /* 6013 */  [ 0.417107837, 18 ],
+  /* 6014 */  [ 0.417200330, 18 ],
+  /* 6015 */  [ 0.417292828, 18 ],
+
+  /* 6016 */  [ 0.417385331, 18 ],
+  /* 6017 */  [ 0.417477839, 18 ],
+  /* 6018 */  [ 0.417570352, 18 ],
+  /* 6019 */  [ 0.417662871, 18 ],
+  /* 6020 */  [ 0.417755394, 18 ],
+  /* 6021 */  [ 0.417847923, 18 ],
+  /* 6022 */  [ 0.417940457, 18 ],
+  /* 6023 */  [ 0.418032996, 18 ],
+  /* 6024 */  [ 0.418125540, 18 ],
+  /* 6025 */  [ 0.418218089, 18 ],
+  /* 6026 */  [ 0.418310643, 18 ],
+  /* 6027 */  [ 0.418403203, 18 ],
+  /* 6028 */  [ 0.418495767, 18 ],
+  /* 6029 */  [ 0.418588337, 18 ],
+  /* 6030 */  [ 0.418680911, 18 ],
+  /* 6031 */  [ 0.418773491, 18 ],
+
+  /* 6032 */  [ 0.418866076, 18 ],
+  /* 6033 */  [ 0.418958666, 18 ],
+  /* 6034 */  [ 0.419051262, 18 ],
+  /* 6035 */  [ 0.419143862, 18 ],
+  /* 6036 */  [ 0.419236467, 18 ],
+  /* 6037 */  [ 0.419329078, 18 ],
+  /* 6038 */  [ 0.419421694, 18 ],
+  /* 6039 */  [ 0.419514314, 18 ],
+  /* 6040 */  [ 0.419606940, 18 ],
+  /* 6041 */  [ 0.419699571, 18 ],
+  /* 6042 */  [ 0.419792208, 18 ],
+  /* 6043 */  [ 0.419884849, 18 ],
+  /* 6044 */  [ 0.419977495, 18 ],
+  /* 6045 */  [ 0.420070147, 18 ],
+  /* 6046 */  [ 0.420162803, 18 ],
+  /* 6047 */  [ 0.420255465, 18 ],
+
+  /* 6048 */  [ 0.420348132, 18 ],
+  /* 6049 */  [ 0.420440803, 18 ],
+  /* 6050 */  [ 0.420533481, 18 ],
+  /* 6051 */  [ 0.420626163, 18 ],
+  /* 6052 */  [ 0.420718850, 18 ],
+  /* 6053 */  [ 0.420811542, 18 ],
+  /* 6054 */  [ 0.420904240, 18 ],
+  /* 6055 */  [ 0.420996942, 18 ],
+  /* 6056 */  [ 0.421089650, 18 ],
+  /* 6057 */  [ 0.421182362, 18 ],
+  /* 6058 */  [ 0.421275080, 18 ],
+  /* 6059 */  [ 0.421367803, 18 ],
+  /* 6060 */  [ 0.421460531, 18 ],
+  /* 6061 */  [ 0.421553264, 18 ],
+  /* 6062 */  [ 0.421646003, 18 ],
+  /* 6063 */  [ 0.421738746, 18 ],
+
+  /* 6064 */  [ 0.421831494, 18 ],
+  /* 6065 */  [ 0.421924248, 18 ],
+  /* 6066 */  [ 0.422017007, 18 ],
+  /* 6067 */  [ 0.422109770, 18 ],
+  /* 6068 */  [ 0.422202539, 18 ],
+  /* 6069 */  [ 0.422295313, 18 ],
+  /* 6070 */  [ 0.422388092, 18 ],
+  /* 6071 */  [ 0.422480876, 18 ],
+  /* 6072 */  [ 0.422573665, 18 ],
+  /* 6073 */  [ 0.422666460, 18 ],
+  /* 6074 */  [ 0.422759259, 18 ],
+  /* 6075 */  [ 0.422852064, 18 ],
+  /* 6076 */  [ 0.422944873, 18 ],
+  /* 6077 */  [ 0.423037688, 18 ],
+  /* 6078 */  [ 0.423130508, 18 ],
+  /* 6079 */  [ 0.423223333, 18 ],
+
+  /* 6080 */  [ 0.423316162, 18 ],
+  /* 6081 */  [ 0.423408997, 18 ],
+  /* 6082 */  [ 0.423501838, 18 ],
+  /* 6083 */  [ 0.423594683, 18 ],
+  /* 6084 */  [ 0.423687533, 18 ],
+  /* 6085 */  [ 0.423780389, 18 ],
+  /* 6086 */  [ 0.423873249, 18 ],
+  /* 6087 */  [ 0.423966115, 18 ],
+  /* 6088 */  [ 0.424058985, 18 ],
+  /* 6089 */  [ 0.424151861, 18 ],
+  /* 6090 */  [ 0.424244742, 18 ],
+  /* 6091 */  [ 0.424337628, 18 ],
+  /* 6092 */  [ 0.424430519, 18 ],
+  /* 6093 */  [ 0.424523415, 18 ],
+  /* 6094 */  [ 0.424616316, 18 ],
+  /* 6095 */  [ 0.424709222, 18 ],
+
+  /* 6096 */  [ 0.424802133, 18 ],
+  /* 6097 */  [ 0.424895050, 18 ],
+  /* 6098 */  [ 0.424987971, 18 ],
+  /* 6099 */  [ 0.425080898, 18 ],
+  /* 6100 */  [ 0.425173829, 18 ],
+  /* 6101 */  [ 0.425266766, 18 ],
+  /* 6102 */  [ 0.425359708, 18 ],
+  /* 6103 */  [ 0.425452655, 18 ],
+  /* 6104 */  [ 0.425545607, 18 ],
+  /* 6105 */  [ 0.425638564, 18 ],
+  /* 6106 */  [ 0.425731526, 18 ],
+  /* 6107 */  [ 0.425824493, 18 ],
+  /* 6108 */  [ 0.425917465, 18 ],
+  /* 6109 */  [ 0.426010443, 18 ],
+  /* 6110 */  [ 0.426103425, 18 ],
+  /* 6111 */  [ 0.426196412, 18 ],
+
+  /* 6112 */  [ 0.426289405, 18 ],
+  /* 6113 */  [ 0.426382403, 18 ],
+  /* 6114 */  [ 0.426475405, 18 ],
+  /* 6115 */  [ 0.426568413, 18 ],
+  /* 6116 */  [ 0.426661426, 18 ],
+  /* 6117 */  [ 0.426754444, 18 ],
+  /* 6118 */  [ 0.426847467, 18 ],
+  /* 6119 */  [ 0.426940495, 18 ],
+  /* 6120 */  [ 0.427033528, 18 ],
+  /* 6121 */  [ 0.427126566, 18 ],
+  /* 6122 */  [ 0.427219609, 18 ],
+  /* 6123 */  [ 0.427312657, 18 ],
+  /* 6124 */  [ 0.427405711, 18 ],
+  /* 6125 */  [ 0.427498769, 18 ],
+  /* 6126 */  [ 0.427591833, 18 ],
+  /* 6127 */  [ 0.427684901, 18 ],
+
+  /* 6128 */  [ 0.427777975, 18 ],
+  /* 6129 */  [ 0.427871054, 18 ],
+  /* 6130 */  [ 0.427964137, 18 ],
+  /* 6131 */  [ 0.428057226, 18 ],
+  /* 6132 */  [ 0.428150320, 18 ],
+  /* 6133 */  [ 0.428243419, 18 ],
+  /* 6134 */  [ 0.428336523, 18 ],
+  /* 6135 */  [ 0.428429632, 18 ],
+  /* 6136 */  [ 0.428522746, 18 ],
+  /* 6137 */  [ 0.428615865, 18 ],
+  /* 6138 */  [ 0.428708989, 18 ],
+  /* 6139 */  [ 0.428802119, 18 ],
+  /* 6140 */  [ 0.428895253, 18 ],
+  /* 6141 */  [ 0.428988392, 18 ],
+  /* 6142 */  [ 0.429081537, 18 ],
+  /* 6143 */  [ 0.429174686, 18 ],
+
+  /* 6144 */  [ 0.429267841, 18 ],
+  /* 6145 */  [ 0.429361001, 18 ],
+  /* 6146 */  [ 0.429454165, 18 ],
+  /* 6147 */  [ 0.429547335, 18 ],
+  /* 6148 */  [ 0.429640510, 18 ],
+  /* 6149 */  [ 0.429733690, 18 ],
+  /* 6150 */  [ 0.429826874, 18 ],
+  /* 6151 */  [ 0.429920064, 18 ],
+  /* 6152 */  [ 0.430013259, 18 ],
+  /* 6153 */  [ 0.430106459, 18 ],
+  /* 6154 */  [ 0.430199664, 18 ],
+  /* 6155 */  [ 0.430292875, 18 ],
+  /* 6156 */  [ 0.430386090, 18 ],
+  /* 6157 */  [ 0.430479310, 18 ],
+  /* 6158 */  [ 0.430572535, 18 ],
+  /* 6159 */  [ 0.430665765, 18 ],
+
+  /* 6160 */  [ 0.430759001, 18 ],
+  /* 6161 */  [ 0.430852241, 18 ],
+  /* 6162 */  [ 0.430945487, 18 ],
+  /* 6163 */  [ 0.431038737, 18 ],
+  /* 6164 */  [ 0.431131993, 18 ],
+  /* 6165 */  [ 0.431225253, 18 ],
+  /* 6166 */  [ 0.431318519, 18 ],
+  /* 6167 */  [ 0.431411790, 18 ],
+  /* 6168 */  [ 0.431505065, 18 ],
+  /* 6169 */  [ 0.431598346, 18 ],
+  /* 6170 */  [ 0.431691632, 18 ],
+  /* 6171 */  [ 0.431784923, 18 ],
+  /* 6172 */  [ 0.431878218, 18 ],
+  /* 6173 */  [ 0.431971519, 18 ],
+  /* 6174 */  [ 0.432064825, 18 ],
+  /* 6175 */  [ 0.432158136, 18 ],
+
+  /* 6176 */  [ 0.432251452, 18 ],
+  /* 6177 */  [ 0.432344773, 18 ],
+  /* 6178 */  [ 0.432438099, 18 ],
+  /* 6179 */  [ 0.432531431, 18 ],
+  /* 6180 */  [ 0.432624767, 18 ],
+  /* 6181 */  [ 0.432718108, 18 ],
+  /* 6182 */  [ 0.432811454, 18 ],
+  /* 6183 */  [ 0.432904805, 18 ],
+  /* 6184 */  [ 0.432998162, 18 ],
+  /* 6185 */  [ 0.433091523, 18 ],
+  /* 6186 */  [ 0.433184889, 18 ],
+  /* 6187 */  [ 0.433278261, 18 ],
+  /* 6188 */  [ 0.433371637, 18 ],
+  /* 6189 */  [ 0.433465019, 18 ],
+  /* 6190 */  [ 0.433558405, 18 ],
+  /* 6191 */  [ 0.433651797, 18 ],
+
+  /* 6192 */  [ 0.433745193, 18 ],
+  /* 6193 */  [ 0.433838595, 18 ],
+  /* 6194 */  [ 0.433932001, 18 ],
+  /* 6195 */  [ 0.434025413, 18 ],
+  /* 6196 */  [ 0.434118830, 18 ],
+  /* 6197 */  [ 0.434212251, 18 ],
+  /* 6198 */  [ 0.434305678, 18 ],
+  /* 6199 */  [ 0.434399110, 18 ],
+  /* 6200 */  [ 0.434492546, 18 ],
+  /* 6201 */  [ 0.434585988, 18 ],
+  /* 6202 */  [ 0.434679435, 18 ],
+  /* 6203 */  [ 0.434772887, 18 ],
+  /* 6204 */  [ 0.434866344, 18 ],
+  /* 6205 */  [ 0.434959806, 18 ],
+  /* 6206 */  [ 0.435053272, 18 ],
+  /* 6207 */  [ 0.435146744, 18 ],
+
+  /* 6208 */  [ 0.435240221, 18 ],
+  /* 6209 */  [ 0.435333703, 18 ],
+  /* 6210 */  [ 0.435427190, 18 ],
+  /* 6211 */  [ 0.435520682, 18 ],
+  /* 6212 */  [ 0.435614179, 18 ],
+  /* 6213 */  [ 0.435707681, 18 ],
+  /* 6214 */  [ 0.435801188, 18 ],
+  /* 6215 */  [ 0.435894700, 18 ],
+  /* 6216 */  [ 0.435988217, 18 ],
+  /* 6217 */  [ 0.436081739, 18 ],
+  /* 6218 */  [ 0.436175266, 18 ],
+  /* 6219 */  [ 0.436268799, 18 ],
+  /* 6220 */  [ 0.436362336, 18 ],
+  /* 6221 */  [ 0.436455878, 18 ],
+  /* 6222 */  [ 0.436549425, 18 ],
+  /* 6223 */  [ 0.436642977, 18 ],
+
+  /* 6224 */  [ 0.436736534, 18 ],
+  /* 6225 */  [ 0.436830096, 18 ],
+  /* 6226 */  [ 0.436923664, 18 ],
+  /* 6227 */  [ 0.437017236, 18 ],
+  /* 6228 */  [ 0.437110813, 18 ],
+  /* 6229 */  [ 0.437204395, 18 ],
+  /* 6230 */  [ 0.437297982, 18 ],
+  /* 6231 */  [ 0.437391575, 18 ],
+  /* 6232 */  [ 0.437485172, 18 ],
+  /* 6233 */  [ 0.437578774, 18 ],
+  /* 6234 */  [ 0.437672381, 18 ],
+  /* 6235 */  [ 0.437765994, 18 ],
+  /* 6236 */  [ 0.437859611, 18 ],
+  /* 6237 */  [ 0.437953233, 18 ],
+  /* 6238 */  [ 0.438046860, 18 ],
+  /* 6239 */  [ 0.438140493, 18 ],
+
+  /* 6240 */  [ 0.438234130, 18 ],
+  /* 6241 */  [ 0.438327772, 18 ],
+  /* 6242 */  [ 0.438421419, 18 ],
+  /* 6243 */  [ 0.438515072, 18 ],
+  /* 6244 */  [ 0.438608729, 18 ],
+  /* 6245 */  [ 0.438702391, 18 ],
+  /* 6246 */  [ 0.438796059, 18 ],
+  /* 6247 */  [ 0.438889731, 18 ],
+  /* 6248 */  [ 0.438983408, 18 ],
+  /* 6249 */  [ 0.439077090, 18 ],
+  /* 6250 */  [ 0.439170778, 18 ],
+  /* 6251 */  [ 0.439264470, 18 ],
+  /* 6252 */  [ 0.439358167, 18 ],
+  /* 6253 */  [ 0.439451869, 18 ],
+  /* 6254 */  [ 0.439545577, 18 ],
+  /* 6255 */  [ 0.439639289, 18 ],
+
+  /* 6256 */  [ 0.439733006, 18 ],
+  /* 6257 */  [ 0.439826728, 18 ],
+  /* 6258 */  [ 0.439920456, 18 ],
+  /* 6259 */  [ 0.440014188, 18 ],
+  /* 6260 */  [ 0.440107925, 18 ],
+  /* 6261 */  [ 0.440201667, 18 ],
+  /* 6262 */  [ 0.440295414, 18 ],
+  /* 6263 */  [ 0.440389167, 18 ],
+  /* 6264 */  [ 0.440482924, 18 ],
+  /* 6265 */  [ 0.440576686, 18 ],
+  /* 6266 */  [ 0.440670453, 18 ],
+  /* 6267 */  [ 0.440764225, 18 ],
+  /* 6268 */  [ 0.440858002, 18 ],
+  /* 6269 */  [ 0.440951784, 18 ],
+  /* 6270 */  [ 0.441045572, 18 ],
+  /* 6271 */  [ 0.441139364, 18 ],
+
+  /* 6272 */  [ 0.441233161, 18 ],
+  /* 6273 */  [ 0.441326963, 18 ],
+  /* 6274 */  [ 0.441420770, 18 ],
+  /* 6275 */  [ 0.441514582, 18 ],
+  /* 6276 */  [ 0.441608399, 18 ],
+  /* 6277 */  [ 0.441702221, 18 ],
+  /* 6278 */  [ 0.441796048, 18 ],
+  /* 6279 */  [ 0.441889880, 18 ],
+  /* 6280 */  [ 0.441983717, 18 ],
+  /* 6281 */  [ 0.442077559, 18 ],
+  /* 6282 */  [ 0.442171406, 18 ],
+  /* 6283 */  [ 0.442265257, 18 ],
+  /* 6284 */  [ 0.442359114, 18 ],
+  /* 6285 */  [ 0.442452976, 18 ],
+  /* 6286 */  [ 0.442546843, 18 ],
+  /* 6287 */  [ 0.442640715, 18 ],
+
+  /* 6288 */  [ 0.442734592, 18 ],
+  /* 6289 */  [ 0.442828473, 18 ],
+  /* 6290 */  [ 0.442922360, 18 ],
+  /* 6291 */  [ 0.443016252, 18 ],
+  /* 6292 */  [ 0.443110148, 18 ],
+  /* 6293 */  [ 0.443204050, 18 ],
+  /* 6294 */  [ 0.443297957, 18 ],
+  /* 6295 */  [ 0.443391868, 18 ],
+  /* 6296 */  [ 0.443485785, 18 ],
+  /* 6297 */  [ 0.443579706, 18 ],
+  /* 6298 */  [ 0.443673633, 18 ],
+  /* 6299 */  [ 0.443767564, 18 ],
+  /* 6300 */  [ 0.443861501, 18 ],
+  /* 6301 */  [ 0.443955442, 18 ],
+  /* 6302 */  [ 0.444049389, 18 ],
+  /* 6303 */  [ 0.444143340, 18 ],
+
+  /* 6304 */  [ 0.444237296, 18 ],
+  /* 6305 */  [ 0.444331258, 18 ],
+  /* 6306 */  [ 0.444425224, 18 ],
+  /* 6307 */  [ 0.444519195, 18 ],
+  /* 6308 */  [ 0.444613171, 18 ],
+  /* 6309 */  [ 0.444707153, 18 ],
+  /* 6310 */  [ 0.444801139, 18 ],
+  /* 6311 */  [ 0.444895130, 18 ],
+  /* 6312 */  [ 0.444989126, 18 ],
+  /* 6313 */  [ 0.445083127, 18 ],
+  /* 6314 */  [ 0.445177133, 18 ],
+  /* 6315 */  [ 0.445271144, 18 ],
+  /* 6316 */  [ 0.445365160, 18 ],
+  /* 6317 */  [ 0.445459181, 18 ],
+  /* 6318 */  [ 0.445553206, 18 ],
+  /* 6319 */  [ 0.445647237, 18 ],
+
+  /* 6320 */  [ 0.445741273, 18 ],
+  /* 6321 */  [ 0.445835314, 18 ],
+  /* 6322 */  [ 0.445929359, 18 ],
+  /* 6323 */  [ 0.446023410, 18 ],
+  /* 6324 */  [ 0.446117466, 18 ],
+  /* 6325 */  [ 0.446211526, 18 ],
+  /* 6326 */  [ 0.446305592, 18 ],
+  /* 6327 */  [ 0.446399662, 18 ],
+  /* 6328 */  [ 0.446493738, 18 ],
+  /* 6329 */  [ 0.446587818, 18 ],
+  /* 6330 */  [ 0.446681903, 18 ],
+  /* 6331 */  [ 0.446775994, 18 ],
+  /* 6332 */  [ 0.446870089, 18 ],
+  /* 6333 */  [ 0.446964189, 18 ],
+  /* 6334 */  [ 0.447058294, 18 ],
+  /* 6335 */  [ 0.447152404, 18 ],
+
+  /* 6336 */  [ 0.447246519, 18 ],
+  /* 6337 */  [ 0.447340639, 18 ],
+  /* 6338 */  [ 0.447434764, 18 ],
+  /* 6339 */  [ 0.447528894, 18 ],
+  /* 6340 */  [ 0.447623029, 18 ],
+  /* 6341 */  [ 0.447717169, 18 ],
+  /* 6342 */  [ 0.447811314, 18 ],
+  /* 6343 */  [ 0.447905463, 18 ],
+  /* 6344 */  [ 0.447999618, 18 ],
+  /* 6345 */  [ 0.448093778, 18 ],
+  /* 6346 */  [ 0.448187942, 18 ],
+  /* 6347 */  [ 0.448282112, 18 ],
+  /* 6348 */  [ 0.448376286, 18 ],
+  /* 6349 */  [ 0.448470466, 18 ],
+  /* 6350 */  [ 0.448564650, 18 ],
+  /* 6351 */  [ 0.448658839, 18 ],
+
+  /* 6352 */  [ 0.448753033, 18 ],
+  /* 6353 */  [ 0.448847233, 18 ],
+  /* 6354 */  [ 0.448941437, 18 ],
+  /* 6355 */  [ 0.449035646, 18 ],
+  /* 6356 */  [ 0.449129860, 18 ],
+  /* 6357 */  [ 0.449224079, 18 ],
+  /* 6358 */  [ 0.449318303, 18 ],
+  /* 6359 */  [ 0.449412531, 18 ],
+  /* 6360 */  [ 0.449506765, 18 ],
+  /* 6361 */  [ 0.449601004, 18 ],
+  /* 6362 */  [ 0.449695247, 18 ],
+  /* 6363 */  [ 0.449789496, 18 ],
+  /* 6364 */  [ 0.449883749, 18 ],
+  /* 6365 */  [ 0.449978008, 18 ],
+  /* 6366 */  [ 0.450072271, 18 ],
+  /* 6367 */  [ 0.450166540, 18 ],
+
+  /* 6368 */  [ 0.450260813, 18 ],
+  /* 6369 */  [ 0.450355091, 18 ],
+  /* 6370 */  [ 0.450449374, 18 ],
+  /* 6371 */  [ 0.450543662, 18 ],
+  /* 6372 */  [ 0.450637955, 18 ],
+  /* 6373 */  [ 0.450732253, 18 ],
+  /* 6374 */  [ 0.450826556, 18 ],
+  /* 6375 */  [ 0.450920864, 18 ],
+  /* 6376 */  [ 0.451015176, 18 ],
+  /* 6377 */  [ 0.451109494, 18 ],
+  /* 6378 */  [ 0.451203817, 18 ],
+  /* 6379 */  [ 0.451298144, 18 ],
+  /* 6380 */  [ 0.451392477, 18 ],
+  /* 6381 */  [ 0.451486814, 18 ],
+  /* 6382 */  [ 0.451581156, 18 ],
+  /* 6383 */  [ 0.451675503, 18 ],
+
+  /* 6384 */  [ 0.451769856, 18 ],
+  /* 6385 */  [ 0.451864213, 18 ],
+  /* 6386 */  [ 0.451958575, 18 ],
+  /* 6387 */  [ 0.452052942, 18 ],
+  /* 6388 */  [ 0.452147313, 18 ],
+  /* 6389 */  [ 0.452241690, 18 ],
+  /* 6390 */  [ 0.452336072, 18 ],
+  /* 6391 */  [ 0.452430458, 18 ],
+  /* 6392 */  [ 0.452524850, 18 ],
+  /* 6393 */  [ 0.452619246, 18 ],
+  /* 6394 */  [ 0.452713648, 18 ],
+  /* 6395 */  [ 0.452808054, 18 ],
+  /* 6396 */  [ 0.452902465, 18 ],
+  /* 6397 */  [ 0.452996882, 18 ],
+  /* 6398 */  [ 0.453091303, 18 ],
+  /* 6399 */  [ 0.453185729, 18 ],
+
+  /* 6400 */  [ 0.453280160, 18 ],
+  /* 6401 */  [ 0.453374595, 18 ],
+  /* 6402 */  [ 0.453469036, 18 ],
+  /* 6403 */  [ 0.453563482, 18 ],
+  /* 6404 */  [ 0.453657932, 18 ],
+  /* 6405 */  [ 0.453752388, 18 ],
+  /* 6406 */  [ 0.453846848, 18 ],
+  /* 6407 */  [ 0.453941314, 18 ],
+  /* 6408 */  [ 0.454035784, 18 ],
+  /* 6409 */  [ 0.454130259, 18 ],
+  /* 6410 */  [ 0.454224739, 18 ],
+  /* 6411 */  [ 0.454319224, 18 ],
+  /* 6412 */  [ 0.454413714, 18 ],
+  /* 6413 */  [ 0.454508209, 18 ],
+  /* 6414 */  [ 0.454602708, 18 ],
+  /* 6415 */  [ 0.454697213, 18 ],
+
+  /* 6416 */  [ 0.454791723, 18 ],
+  /* 6417 */  [ 0.454886237, 18 ],
+  /* 6418 */  [ 0.454980756, 18 ],
+  /* 6419 */  [ 0.455075281, 18 ],
+  /* 6420 */  [ 0.455169810, 18 ],
+  /* 6421 */  [ 0.455264344, 18 ],
+  /* 6422 */  [ 0.455358883, 18 ],
+  /* 6423 */  [ 0.455453427, 18 ],
+  /* 6424 */  [ 0.455547976, 18 ],
+  /* 6425 */  [ 0.455642529, 18 ],
+  /* 6426 */  [ 0.455737088, 18 ],
+  /* 6427 */  [ 0.455831652, 18 ],
+  /* 6428 */  [ 0.455926220, 18 ],
+  /* 6429 */  [ 0.456020793, 18 ],
+  /* 6430 */  [ 0.456115372, 18 ],
+  /* 6431 */  [ 0.456209955, 18 ],
+
+  /* 6432 */  [ 0.456304543, 18 ],
+  /* 6433 */  [ 0.456399136, 18 ],
+  /* 6434 */  [ 0.456493733, 18 ],
+  /* 6435 */  [ 0.456588336, 18 ],
+  /* 6436 */  [ 0.456682944, 18 ],
+  /* 6437 */  [ 0.456777556, 18 ],
+  /* 6438 */  [ 0.456872174, 18 ],
+  /* 6439 */  [ 0.456966796, 18 ],
+  /* 6440 */  [ 0.457061423, 18 ],
+  /* 6441 */  [ 0.457156056, 18 ],
+  /* 6442 */  [ 0.457250693, 18 ],
+  /* 6443 */  [ 0.457345335, 18 ],
+  /* 6444 */  [ 0.457439981, 18 ],
+  /* 6445 */  [ 0.457534633, 18 ],
+  /* 6446 */  [ 0.457629290, 18 ],
+  /* 6447 */  [ 0.457723951, 18 ],
+
+  /* 6448 */  [ 0.457818618, 18 ],
+  /* 6449 */  [ 0.457913289, 18 ],
+  /* 6450 */  [ 0.458007965, 18 ],
+  /* 6451 */  [ 0.458102646, 18 ],
+  /* 6452 */  [ 0.458197332, 18 ],
+  /* 6453 */  [ 0.458292023, 18 ],
+  /* 6454 */  [ 0.458386719, 18 ],
+  /* 6455 */  [ 0.458481420, 18 ],
+  /* 6456 */  [ 0.458576125, 18 ],
+  /* 6457 */  [ 0.458670836, 18 ],
+  /* 6458 */  [ 0.458765551, 18 ],
+  /* 6459 */  [ 0.458860271, 18 ],
+  /* 6460 */  [ 0.458954996, 18 ],
+  /* 6461 */  [ 0.459049726, 18 ],
+  /* 6462 */  [ 0.459144461, 18 ],
+  /* 6463 */  [ 0.459239201, 18 ],
+
+  /* 6464 */  [ 0.459333946, 18 ],
+  /* 6465 */  [ 0.459428695, 18 ],
+  /* 6466 */  [ 0.459523450, 18 ],
+  /* 6467 */  [ 0.459618209, 18 ],
+  /* 6468 */  [ 0.459712973, 18 ],
+  /* 6469 */  [ 0.459807742, 18 ],
+  /* 6470 */  [ 0.459902516, 18 ],
+  /* 6471 */  [ 0.459997295, 18 ],
+  /* 6472 */  [ 0.460092079, 18 ],
+  /* 6473 */  [ 0.460186867, 18 ],
+  /* 6474 */  [ 0.460281661, 18 ],
+  /* 6475 */  [ 0.460376459, 18 ],
+  /* 6476 */  [ 0.460471262, 18 ],
+  /* 6477 */  [ 0.460566071, 18 ],
+  /* 6478 */  [ 0.460660884, 18 ],
+  /* 6479 */  [ 0.460755701, 18 ],
+
+  /* 6480 */  [ 0.460850524, 18 ],
+  /* 6481 */  [ 0.460945352, 18 ],
+  /* 6482 */  [ 0.461040184, 18 ],
+  /* 6483 */  [ 0.461135022, 18 ],
+  /* 6484 */  [ 0.461229864, 18 ],
+  /* 6485 */  [ 0.461324711, 18 ],
+  /* 6486 */  [ 0.461419563, 18 ],
+  /* 6487 */  [ 0.461514420, 18 ],
+  /* 6488 */  [ 0.461609282, 18 ],
+  /* 6489 */  [ 0.461704149, 18 ],
+  /* 6490 */  [ 0.461799020, 18 ],
+  /* 6491 */  [ 0.461893897, 18 ],
+  /* 6492 */  [ 0.461988778, 18 ],
+  /* 6493 */  [ 0.462083664, 18 ],
+  /* 6494 */  [ 0.462178555, 18 ],
+  /* 6495 */  [ 0.462273451, 18 ],
+
+  /* 6496 */  [ 0.462368352, 18 ],
+  /* 6497 */  [ 0.462463257, 18 ],
+  /* 6498 */  [ 0.462558168, 18 ],
+  /* 6499 */  [ 0.462653083, 18 ],
+  /* 6500 */  [ 0.462748003, 18 ],
+  /* 6501 */  [ 0.462842928, 18 ],
+  /* 6502 */  [ 0.462937858, 18 ],
+  /* 6503 */  [ 0.463032793, 18 ],
+  /* 6504 */  [ 0.463127733, 18 ],
+  /* 6505 */  [ 0.463222678, 18 ],
+  /* 6506 */  [ 0.463317627, 18 ],
+  /* 6507 */  [ 0.463412581, 18 ],
+  /* 6508 */  [ 0.463507540, 18 ],
+  /* 6509 */  [ 0.463602504, 18 ],
+  /* 6510 */  [ 0.463697473, 18 ],
+  /* 6511 */  [ 0.463792447, 18 ],
+
+  /* 6512 */  [ 0.463887426, 18 ],
+  /* 6513 */  [ 0.463982409, 18 ],
+  /* 6514 */  [ 0.464077398, 18 ],
+  /* 6515 */  [ 0.464172391, 18 ],
+  /* 6516 */  [ 0.464267389, 18 ],
+  /* 6517 */  [ 0.464362392, 18 ],
+  /* 6518 */  [ 0.464457399, 18 ],
+  /* 6519 */  [ 0.464552412, 18 ],
+  /* 6520 */  [ 0.464647430, 18 ],
+  /* 6521 */  [ 0.464742452, 18 ],
+  /* 6522 */  [ 0.464837479, 18 ],
+  /* 6523 */  [ 0.464932511, 18 ],
+  /* 6524 */  [ 0.465027548, 18 ],
+  /* 6525 */  [ 0.465122590, 18 ],
+  /* 6526 */  [ 0.465217637, 18 ],
+  /* 6527 */  [ 0.465312688, 18 ],
+
+  /* 6528 */  [ 0.465407744, 18 ],
+  /* 6529 */  [ 0.465502806, 18 ],
+  /* 6530 */  [ 0.465597872, 18 ],
+  /* 6531 */  [ 0.465692943, 18 ],
+  /* 6532 */  [ 0.465788018, 18 ],
+  /* 6533 */  [ 0.465883099, 18 ],
+  /* 6534 */  [ 0.465978184, 18 ],
+  /* 6535 */  [ 0.466073275, 18 ],
+  /* 6536 */  [ 0.466168370, 18 ],
+  /* 6537 */  [ 0.466263470, 18 ],
+  /* 6538 */  [ 0.466358575, 18 ],
+  /* 6539 */  [ 0.466453684, 18 ],
+  /* 6540 */  [ 0.466548799, 18 ],
+  /* 6541 */  [ 0.466643918, 18 ],
+  /* 6542 */  [ 0.466739043, 18 ],
+  /* 6543 */  [ 0.466834172, 18 ],
+
+  /* 6544 */  [ 0.466929306, 18 ],
+  /* 6545 */  [ 0.467024445, 18 ],
+  /* 6546 */  [ 0.467119588, 18 ],
+  /* 6547 */  [ 0.467214737, 18 ],
+  /* 6548 */  [ 0.467309890, 18 ],
+  /* 6549 */  [ 0.467405048, 18 ],
+  /* 6550 */  [ 0.467500211, 18 ],
+  /* 6551 */  [ 0.467595379, 18 ],
+  /* 6552 */  [ 0.467690552, 18 ],
+  /* 6553 */  [ 0.467785729, 18 ],
+  /* 6554 */  [ 0.467880912, 18 ],
+  /* 6555 */  [ 0.467976099, 18 ],
+  /* 6556 */  [ 0.468071291, 18 ],
+  /* 6557 */  [ 0.468166488, 18 ],
+  /* 6558 */  [ 0.468261690, 18 ],
+  /* 6559 */  [ 0.468356896, 18 ],
+
+  /* 6560 */  [ 0.468452108, 18 ],
+  /* 6561 */  [ 0.468547324, 18 ],
+  /* 6562 */  [ 0.468642545, 18 ],
+  /* 6563 */  [ 0.468737771, 18 ],
+  /* 6564 */  [ 0.468833002, 18 ],
+  /* 6565 */  [ 0.468928237, 18 ],
+  /* 6566 */  [ 0.469023478, 18 ],
+  /* 6567 */  [ 0.469118723, 18 ],
+  /* 6568 */  [ 0.469213973, 18 ],
+  /* 6569 */  [ 0.469309228, 18 ],
+  /* 6570 */  [ 0.469404488, 18 ],
+  /* 6571 */  [ 0.469499752, 18 ],
+  /* 6572 */  [ 0.469595022, 18 ],
+  /* 6573 */  [ 0.469690296, 18 ],
+  /* 6574 */  [ 0.469785575, 18 ],
+  /* 6575 */  [ 0.469880859, 18 ],
+
+  /* 6576 */  [ 0.469976148, 18 ],
+  /* 6577 */  [ 0.470071442, 18 ],
+  /* 6578 */  [ 0.470166740, 18 ],
+  /* 6579 */  [ 0.470262043, 18 ],
+  /* 6580 */  [ 0.470357351, 18 ],
+  /* 6581 */  [ 0.470452664, 18 ],
+  /* 6582 */  [ 0.470547982, 18 ],
+  /* 6583 */  [ 0.470643305, 18 ],
+  /* 6584 */  [ 0.470738632, 18 ],
+  /* 6585 */  [ 0.470833964, 18 ],
+  /* 6586 */  [ 0.470929301, 18 ],
+  /* 6587 */  [ 0.471024643, 18 ],
+  /* 6588 */  [ 0.471119990, 18 ],
+  /* 6589 */  [ 0.471215341, 18 ],
+  /* 6590 */  [ 0.471310698, 18 ],
+  /* 6591 */  [ 0.471406059, 18 ],
+
+  /* 6592 */  [ 0.471501425, 18 ],
+  /* 6593 */  [ 0.471596796, 18 ],
+  /* 6594 */  [ 0.471692171, 18 ],
+  /* 6595 */  [ 0.471787552, 18 ],
+  /* 6596 */  [ 0.471882937, 18 ],
+  /* 6597 */  [ 0.471978327, 18 ],
+  /* 6598 */  [ 0.472073722, 18 ],
+  /* 6599 */  [ 0.472169122, 18 ],
+  /* 6600 */  [ 0.472264527, 18 ],
+  /* 6601 */  [ 0.472359936, 18 ],
+  /* 6602 */  [ 0.472455350, 18 ],
+  /* 6603 */  [ 0.472550769, 18 ],
+  /* 6604 */  [ 0.472646193, 18 ],
+  /* 6605 */  [ 0.472741622, 18 ],
+  /* 6606 */  [ 0.472837055, 18 ],
+  /* 6607 */  [ 0.472932493, 18 ],
+
+  /* 6608 */  [ 0.473027937, 18 ],
+  /* 6609 */  [ 0.473123384, 18 ],
+  /* 6610 */  [ 0.473218837, 18 ],
+  /* 6611 */  [ 0.473314295, 18 ],
+  /* 6612 */  [ 0.473409757, 18 ],
+  /* 6613 */  [ 0.473505224, 18 ],
+  /* 6614 */  [ 0.473600696, 18 ],
+  /* 6615 */  [ 0.473696173, 18 ],
+  /* 6616 */  [ 0.473791655, 18 ],
+  /* 6617 */  [ 0.473887141, 18 ],
+  /* 6618 */  [ 0.473982632, 18 ],
+  /* 6619 */  [ 0.474078128, 18 ],
+  /* 6620 */  [ 0.474173629, 18 ],
+  /* 6621 */  [ 0.474269135, 18 ],
+  /* 6622 */  [ 0.474364645, 18 ],
+  /* 6623 */  [ 0.474460161, 18 ],
+
+  /* 6624 */  [ 0.474555681, 18 ],
+  /* 6625 */  [ 0.474651205, 18 ],
+  /* 6626 */  [ 0.474746735, 18 ],
+  /* 6627 */  [ 0.474842270, 18 ],
+  /* 6628 */  [ 0.474937809, 18 ],
+  /* 6629 */  [ 0.475033353, 18 ],
+  /* 6630 */  [ 0.475128902, 18 ],
+  /* 6631 */  [ 0.475224456, 18 ],
+  /* 6632 */  [ 0.475320014, 18 ],
+  /* 6633 */  [ 0.475415578, 18 ],
+  /* 6634 */  [ 0.475511146, 18 ],
+  /* 6635 */  [ 0.475606719, 18 ],
+  /* 6636 */  [ 0.475702296, 18 ],
+  /* 6637 */  [ 0.475797879, 18 ],
+  /* 6638 */  [ 0.475893466, 18 ],
+  /* 6639 */  [ 0.475989058, 18 ],
+
+  /* 6640 */  [ 0.476084655, 18 ],
+  /* 6641 */  [ 0.476180257, 18 ],
+  /* 6642 */  [ 0.476275863, 18 ],
+  /* 6643 */  [ 0.476371475, 18 ],
+  /* 6644 */  [ 0.476467091, 18 ],
+  /* 6645 */  [ 0.476562712, 18 ],
+  /* 6646 */  [ 0.476658338, 18 ],
+  /* 6647 */  [ 0.476753968, 18 ],
+  /* 6648 */  [ 0.476849603, 18 ],
+  /* 6649 */  [ 0.476945243, 18 ],
+  /* 6650 */  [ 0.477040888, 18 ],
+  /* 6651 */  [ 0.477136538, 18 ],
+  /* 6652 */  [ 0.477232193, 18 ],
+  /* 6653 */  [ 0.477327852, 18 ],
+  /* 6654 */  [ 0.477423516, 18 ],
+  /* 6655 */  [ 0.477519185, 18 ],
+
+  /* 6656 */  [ 0.477614858, 18 ],
+  /* 6657 */  [ 0.477710537, 18 ],
+  /* 6658 */  [ 0.477806220, 18 ],
+  /* 6659 */  [ 0.477901908, 18 ],
+  /* 6660 */  [ 0.477997601, 18 ],
+  /* 6661 */  [ 0.478093299, 18 ],
+  /* 6662 */  [ 0.478189001, 18 ],
+  /* 6663 */  [ 0.478284708, 18 ],
+  /* 6664 */  [ 0.478380420, 18 ],
+  /* 6665 */  [ 0.478476137, 18 ],
+  /* 6666 */  [ 0.478571858, 18 ],
+  /* 6667 */  [ 0.478667585, 18 ],
+  /* 6668 */  [ 0.478763316, 18 ],
+  /* 6669 */  [ 0.478859052, 18 ],
+  /* 6670 */  [ 0.478954793, 18 ],
+  /* 6671 */  [ 0.479050538, 18 ],
+
+  /* 6672 */  [ 0.479146288, 18 ],
+  /* 6673 */  [ 0.479242043, 18 ],
+  /* 6674 */  [ 0.479337803, 18 ],
+  /* 6675 */  [ 0.479433568, 18 ],
+  /* 6676 */  [ 0.479529337, 18 ],
+  /* 6677 */  [ 0.479625111, 18 ],
+  /* 6678 */  [ 0.479720890, 18 ],
+  /* 6679 */  [ 0.479816674, 18 ],
+  /* 6680 */  [ 0.479912463, 18 ],
+  /* 6681 */  [ 0.480008256, 18 ],
+  /* 6682 */  [ 0.480104054, 18 ],
+  /* 6683 */  [ 0.480199857, 18 ],
+  /* 6684 */  [ 0.480295664, 18 ],
+  /* 6685 */  [ 0.480391477, 18 ],
+  /* 6686 */  [ 0.480487294, 18 ],
+  /* 6687 */  [ 0.480583116, 18 ],
+
+  /* 6688 */  [ 0.480678943, 18 ],
+  /* 6689 */  [ 0.480774774, 18 ],
+  /* 6690 */  [ 0.480870611, 18 ],
+  /* 6691 */  [ 0.480966452, 18 ],
+  /* 6692 */  [ 0.481062298, 18 ],
+  /* 6693 */  [ 0.481158148, 18 ],
+  /* 6694 */  [ 0.481254004, 18 ],
+  /* 6695 */  [ 0.481349864, 18 ],
+  /* 6696 */  [ 0.481445729, 18 ],
+  /* 6697 */  [ 0.481541598, 18 ],
+  /* 6698 */  [ 0.481637473, 18 ],
+  /* 6699 */  [ 0.481733352, 18 ],
+  /* 6700 */  [ 0.481829236, 18 ],
+  /* 6701 */  [ 0.481925125, 18 ],
+  /* 6702 */  [ 0.482021019, 18 ],
+  /* 6703 */  [ 0.482116917, 18 ],
+
+  /* 6704 */  [ 0.482212820, 18 ],
+  /* 6705 */  [ 0.482308728, 18 ],
+  /* 6706 */  [ 0.482404640, 18 ],
+  /* 6707 */  [ 0.482500558, 18 ],
+  /* 6708 */  [ 0.482596480, 18 ],
+  /* 6709 */  [ 0.482692407, 18 ],
+  /* 6710 */  [ 0.482788339, 18 ],
+  /* 6711 */  [ 0.482884275, 18 ],
+  /* 6712 */  [ 0.482980216, 18 ],
+  /* 6713 */  [ 0.483076162, 18 ],
+  /* 6714 */  [ 0.483172113, 18 ],
+  /* 6715 */  [ 0.483268069, 18 ],
+  /* 6716 */  [ 0.483364029, 18 ],
+  /* 6717 */  [ 0.483459994, 18 ],
+  /* 6718 */  [ 0.483555964, 18 ],
+  /* 6719 */  [ 0.483651939, 18 ],
+
+  /* 6720 */  [ 0.483747918, 18 ],
+  /* 6721 */  [ 0.483843902, 18 ],
+  /* 6722 */  [ 0.483939891, 18 ],
+  /* 6723 */  [ 0.484035885, 18 ],
+  /* 6724 */  [ 0.484131883, 18 ],
+  /* 6725 */  [ 0.484227886, 18 ],
+  /* 6726 */  [ 0.484323894, 18 ],
+  /* 6727 */  [ 0.484419907, 18 ],
+  /* 6728 */  [ 0.484515924, 18 ],
+  /* 6729 */  [ 0.484611946, 18 ],
+  /* 6730 */  [ 0.484707973, 18 ],
+  /* 6731 */  [ 0.484804005, 18 ],
+  /* 6732 */  [ 0.484900041, 18 ],
+  /* 6733 */  [ 0.484996083, 18 ],
+  /* 6734 */  [ 0.485092128, 18 ],
+  /* 6735 */  [ 0.485188179, 18 ],
+
+  /* 6736 */  [ 0.485284235, 18 ],
+  /* 6737 */  [ 0.485380295, 18 ],
+  /* 6738 */  [ 0.485476360, 18 ],
+  /* 6739 */  [ 0.485572430, 18 ],
+  /* 6740 */  [ 0.485668504, 18 ],
+  /* 6741 */  [ 0.485764583, 18 ],
+  /* 6742 */  [ 0.485860667, 18 ],
+  /* 6743 */  [ 0.485956756, 18 ],
+  /* 6744 */  [ 0.486052849, 18 ],
+  /* 6745 */  [ 0.486148948, 18 ],
+  /* 6746 */  [ 0.486245051, 18 ],
+  /* 6747 */  [ 0.486341158, 18 ],
+  /* 6748 */  [ 0.486437271, 18 ],
+  /* 6749 */  [ 0.486533388, 18 ],
+  /* 6750 */  [ 0.486629510, 18 ],
+  /* 6751 */  [ 0.486725637, 18 ],
+
+  /* 6752 */  [ 0.486821768, 18 ],
+  /* 6753 */  [ 0.486917905, 18 ],
+  /* 6754 */  [ 0.487014045, 18 ],
+  /* 6755 */  [ 0.487110191, 18 ],
+  /* 6756 */  [ 0.487206342, 18 ],
+  /* 6757 */  [ 0.487302497, 18 ],
+  /* 6758 */  [ 0.487398657, 18 ],
+  /* 6759 */  [ 0.487494821, 18 ],
+  /* 6760 */  [ 0.487590991, 18 ],
+  /* 6761 */  [ 0.487687165, 18 ],
+  /* 6762 */  [ 0.487783344, 18 ],
+  /* 6763 */  [ 0.487879528, 18 ],
+  /* 6764 */  [ 0.487975716, 18 ],
+  /* 6765 */  [ 0.488071909, 18 ],
+  /* 6766 */  [ 0.488168107, 18 ],
+  /* 6767 */  [ 0.488264310, 18 ],
+
+  /* 6768 */  [ 0.488360517, 18 ],
+  /* 6769 */  [ 0.488456729, 18 ],
+  /* 6770 */  [ 0.488552946, 18 ],
+  /* 6771 */  [ 0.488649167, 18 ],
+  /* 6772 */  [ 0.488745394, 18 ],
+  /* 6773 */  [ 0.488841625, 18 ],
+  /* 6774 */  [ 0.488937860, 18 ],
+  /* 6775 */  [ 0.489034101, 18 ],
+  /* 6776 */  [ 0.489130346, 18 ],
+  /* 6777 */  [ 0.489226596, 18 ],
+  /* 6778 */  [ 0.489322851, 18 ],
+  /* 6779 */  [ 0.489419110, 18 ],
+  /* 6780 */  [ 0.489515375, 18 ],
+  /* 6781 */  [ 0.489611643, 18 ],
+  /* 6782 */  [ 0.489707917, 18 ],
+  /* 6783 */  [ 0.489804195, 18 ],
+
+  /* 6784 */  [ 0.489900479, 18 ],
+  /* 6785 */  [ 0.489996766, 18 ],
+  /* 6786 */  [ 0.490093059, 18 ],
+  /* 6787 */  [ 0.490189356, 18 ],
+  /* 6788 */  [ 0.490285658, 18 ],
+  /* 6789 */  [ 0.490381965, 18 ],
+  /* 6790 */  [ 0.490478277, 18 ],
+  /* 6791 */  [ 0.490574593, 18 ],
+  /* 6792 */  [ 0.490670914, 18 ],
+  /* 6793 */  [ 0.490767239, 18 ],
+  /* 6794 */  [ 0.490863570, 18 ],
+  /* 6795 */  [ 0.490959905, 18 ],
+  /* 6796 */  [ 0.491056245, 18 ],
+  /* 6797 */  [ 0.491152589, 18 ],
+  /* 6798 */  [ 0.491248939, 18 ],
+  /* 6799 */  [ 0.491345293, 18 ],
+
+  /* 6800 */  [ 0.491441651, 18 ],
+  /* 6801 */  [ 0.491538015, 18 ],
+  /* 6802 */  [ 0.491634383, 18 ],
+  /* 6803 */  [ 0.491730756, 18 ],
+  /* 6804 */  [ 0.491827134, 18 ],
+  /* 6805 */  [ 0.491923516, 18 ],
+  /* 6806 */  [ 0.492019903, 18 ],
+  /* 6807 */  [ 0.492116295, 18 ],
+  /* 6808 */  [ 0.492212691, 18 ],
+  /* 6809 */  [ 0.492309093, 18 ],
+  /* 6810 */  [ 0.492405499, 18 ],
+  /* 6811 */  [ 0.492501909, 18 ],
+  /* 6812 */  [ 0.492598325, 18 ],
+  /* 6813 */  [ 0.492694745, 18 ],
+  /* 6814 */  [ 0.492791170, 18 ],
+  /* 6815 */  [ 0.492887599, 18 ],
+
+  /* 6816 */  [ 0.492984033, 18 ],
+  /* 6817 */  [ 0.493080472, 18 ],
+  /* 6818 */  [ 0.493176916, 18 ],
+  /* 6819 */  [ 0.493273365, 18 ],
+  /* 6820 */  [ 0.493369818, 18 ],
+  /* 6821 */  [ 0.493466275, 18 ],
+  /* 6822 */  [ 0.493562738, 18 ],
+  /* 6823 */  [ 0.493659205, 18 ],
+  /* 6824 */  [ 0.493755677, 18 ],
+  /* 6825 */  [ 0.493852154, 18 ],
+  /* 6826 */  [ 0.493948635, 18 ],
+  /* 6827 */  [ 0.494045122, 18 ],
+  /* 6828 */  [ 0.494141612, 18 ],
+  /* 6829 */  [ 0.494238108, 18 ],
+  /* 6830 */  [ 0.494334608, 18 ],
+  /* 6831 */  [ 0.494431113, 18 ],
+
+  /* 6832 */  [ 0.494527623, 18 ],
+  /* 6833 */  [ 0.494624137, 18 ],
+  /* 6834 */  [ 0.494720656, 18 ],
+  /* 6835 */  [ 0.494817180, 18 ],
+  /* 6836 */  [ 0.494913709, 18 ],
+  /* 6837 */  [ 0.495010242, 18 ],
+  /* 6838 */  [ 0.495106780, 18 ],
+  /* 6839 */  [ 0.495203322, 18 ],
+  /* 6840 */  [ 0.495299870, 18 ],
+  /* 6841 */  [ 0.495396422, 18 ],
+  /* 6842 */  [ 0.495492978, 18 ],
+  /* 6843 */  [ 0.495589540, 18 ],
+  /* 6844 */  [ 0.495686106, 18 ],
+  /* 6845 */  [ 0.495782677, 18 ],
+  /* 6846 */  [ 0.495879252, 18 ],
+  /* 6847 */  [ 0.495975833, 18 ],
+
+  /* 6848 */  [ 0.496072418, 18 ],
+  /* 6849 */  [ 0.496169007, 18 ],
+  /* 6850 */  [ 0.496265602, 18 ],
+  /* 6851 */  [ 0.496362201, 18 ],
+  /* 6852 */  [ 0.496458804, 18 ],
+  /* 6853 */  [ 0.496555413, 18 ],
+  /* 6854 */  [ 0.496652026, 18 ],
+  /* 6855 */  [ 0.496748644, 18 ],
+  /* 6856 */  [ 0.496845266, 18 ],
+  /* 6857 */  [ 0.496941894, 18 ],
+  /* 6858 */  [ 0.497038526, 18 ],
+  /* 6859 */  [ 0.497135162, 18 ],
+  /* 6860 */  [ 0.497231804, 18 ],
+  /* 6861 */  [ 0.497328450, 18 ],
+  /* 6862 */  [ 0.497425100, 18 ],
+  /* 6863 */  [ 0.497521756, 18 ],
+
+  /* 6864 */  [ 0.497618416, 18 ],
+  /* 6865 */  [ 0.497715081, 18 ],
+  /* 6866 */  [ 0.497811750, 18 ],
+  /* 6867 */  [ 0.497908425, 18 ],
+  /* 6868 */  [ 0.498005103, 18 ],
+  /* 6869 */  [ 0.498101787, 18 ],
+  /* 6870 */  [ 0.498198475, 18 ],
+  /* 6871 */  [ 0.498295168, 18 ],
+  /* 6872 */  [ 0.498391866, 18 ],
+  /* 6873 */  [ 0.498488568, 18 ],
+  /* 6874 */  [ 0.498585275, 18 ],
+  /* 6875 */  [ 0.498681987, 18 ],
+  /* 6876 */  [ 0.498778704, 18 ],
+  /* 6877 */  [ 0.498875425, 18 ],
+  /* 6878 */  [ 0.498972150, 18 ],
+  /* 6879 */  [ 0.499068881, 18 ],
+
+  /* 6880 */  [ 0.499165616, 18 ],
+  /* 6881 */  [ 0.499262356, 18 ],
+  /* 6882 */  [ 0.499359101, 18 ],
+  /* 6883 */  [ 0.499455850, 18 ],
+  /* 6884 */  [ 0.499552604, 18 ],
+  /* 6885 */  [ 0.499649362, 18 ],
+  /* 6886 */  [ 0.499746126, 18 ],
+  /* 6887 */  [ 0.499842894, 18 ],
+  /* 6888 */  [ 0.499939666, 18 ],
+  /* 6889 */  [ 0.250018222, 19 ],
+  /* 6890 */  [ 0.250066613, 19 ],
+  /* 6891 */  [ 0.250115006, 19 ],
+  /* 6892 */  [ 0.250163402, 19 ],
+  /* 6893 */  [ 0.250211800, 19 ],
+  /* 6894 */  [ 0.250260200, 19 ],
+  /* 6895 */  [ 0.250308603, 19 ],
+
+  /* 6896 */  [ 0.250357008, 19 ],
+  /* 6897 */  [ 0.250405415, 19 ],
+  /* 6898 */  [ 0.250453825, 19 ],
+  /* 6899 */  [ 0.250502237, 19 ],
+  /* 6900 */  [ 0.250550652, 19 ],
+  /* 6901 */  [ 0.250599068, 19 ],
+  /* 6902 */  [ 0.250647488, 19 ],
+  /* 6903 */  [ 0.250695909, 19 ],
+  /* 6904 */  [ 0.250744333, 19 ],
+  /* 6905 */  [ 0.250792759, 19 ],
+  /* 6906 */  [ 0.250841187, 19 ],
+  /* 6907 */  [ 0.250889618, 19 ],
+  /* 6908 */  [ 0.250938051, 19 ],
+  /* 6909 */  [ 0.250986487, 19 ],
+  /* 6910 */  [ 0.251034924, 19 ],
+  /* 6911 */  [ 0.251083365, 19 ],
+
+  /* 6912 */  [ 0.251131807, 19 ],
+  /* 6913 */  [ 0.251180252, 19 ],
+  /* 6914 */  [ 0.251228699, 19 ],
+  /* 6915 */  [ 0.251277148, 19 ],
+  /* 6916 */  [ 0.251325600, 19 ],
+  /* 6917 */  [ 0.251374054, 19 ],
+  /* 6918 */  [ 0.251422511, 19 ],
+  /* 6919 */  [ 0.251470970, 19 ],
+  /* 6920 */  [ 0.251519431, 19 ],
+  /* 6921 */  [ 0.251567894, 19 ],
+  /* 6922 */  [ 0.251616360, 19 ],
+  /* 6923 */  [ 0.251664828, 19 ],
+  /* 6924 */  [ 0.251713299, 19 ],
+  /* 6925 */  [ 0.251761772, 19 ],
+  /* 6926 */  [ 0.251810247, 19 ],
+  /* 6927 */  [ 0.251858724, 19 ],
+
+  /* 6928 */  [ 0.251907204, 19 ],
+  /* 6929 */  [ 0.251955686, 19 ],
+  /* 6930 */  [ 0.252004171, 19 ],
+  /* 6931 */  [ 0.252052658, 19 ],
+  /* 6932 */  [ 0.252101147, 19 ],
+  /* 6933 */  [ 0.252149638, 19 ],
+  /* 6934 */  [ 0.252198132, 19 ],
+  /* 6935 */  [ 0.252246628, 19 ],
+  /* 6936 */  [ 0.252295127, 19 ],
+  /* 6937 */  [ 0.252343627, 19 ],
+  /* 6938 */  [ 0.252392131, 19 ],
+  /* 6939 */  [ 0.252440636, 19 ],
+  /* 6940 */  [ 0.252489144, 19 ],
+  /* 6941 */  [ 0.252537654, 19 ],
+  /* 6942 */  [ 0.252586166, 19 ],
+  /* 6943 */  [ 0.252634681, 19 ],
+
+  /* 6944 */  [ 0.252683198, 19 ],
+  /* 6945 */  [ 0.252731718, 19 ],
+  /* 6946 */  [ 0.252780240, 19 ],
+  /* 6947 */  [ 0.252828764, 19 ],
+  /* 6948 */  [ 0.252877290, 19 ],
+  /* 6949 */  [ 0.252925819, 19 ],
+  /* 6950 */  [ 0.252974350, 19 ],
+  /* 6951 */  [ 0.253022883, 19 ],
+  /* 6952 */  [ 0.253071419, 19 ],
+  /* 6953 */  [ 0.253119957, 19 ],
+  /* 6954 */  [ 0.253168498, 19 ],
+  /* 6955 */  [ 0.253217040, 19 ],
+  /* 6956 */  [ 0.253265585, 19 ],
+  /* 6957 */  [ 0.253314133, 19 ],
+  /* 6958 */  [ 0.253362682, 19 ],
+  /* 6959 */  [ 0.253411234, 19 ],
+
+  /* 6960 */  [ 0.253459789, 19 ],
+  /* 6961 */  [ 0.253508345, 19 ],
+  /* 6962 */  [ 0.253556904, 19 ],
+  /* 6963 */  [ 0.253605466, 19 ],
+  /* 6964 */  [ 0.253654029, 19 ],
+  /* 6965 */  [ 0.253702595, 19 ],
+  /* 6966 */  [ 0.253751164, 19 ],
+  /* 6967 */  [ 0.253799734, 19 ],
+  /* 6968 */  [ 0.253848307, 19 ],
+  /* 6969 */  [ 0.253896883, 19 ],
+  /* 6970 */  [ 0.253945460, 19 ],
+  /* 6971 */  [ 0.253994040, 19 ],
+  /* 6972 */  [ 0.254042622, 19 ],
+  /* 6973 */  [ 0.254091207, 19 ],
+  /* 6974 */  [ 0.254139794, 19 ],
+  /* 6975 */  [ 0.254188383, 19 ],
+
+  /* 6976 */  [ 0.254236974, 19 ],
+  /* 6977 */  [ 0.254285568, 19 ],
+  /* 6978 */  [ 0.254334165, 19 ],
+  /* 6979 */  [ 0.254382763, 19 ],
+  /* 6980 */  [ 0.254431364, 19 ],
+  /* 6981 */  [ 0.254479967, 19 ],
+  /* 6982 */  [ 0.254528572, 19 ],
+  /* 6983 */  [ 0.254577180, 19 ],
+  /* 6984 */  [ 0.254625790, 19 ],
+  /* 6985 */  [ 0.254674403, 19 ],
+  /* 6986 */  [ 0.254723017, 19 ],
+  /* 6987 */  [ 0.254771635, 19 ],
+  /* 6988 */  [ 0.254820254, 19 ],
+  /* 6989 */  [ 0.254868876, 19 ],
+  /* 6990 */  [ 0.254917500, 19 ],
+  /* 6991 */  [ 0.254966126, 19 ],
+
+  /* 6992 */  [ 0.255014755, 19 ],
+  /* 6993 */  [ 0.255063386, 19 ],
+  /* 6994 */  [ 0.255112019, 19 ],
+  /* 6995 */  [ 0.255160655, 19 ],
+  /* 6996 */  [ 0.255209292, 19 ],
+  /* 6997 */  [ 0.255257933, 19 ],
+  /* 6998 */  [ 0.255306575, 19 ],
+  /* 6999 */  [ 0.255355220, 19 ],
+  /* 7000 */  [ 0.255403867, 19 ],
+  /* 7001 */  [ 0.255452517, 19 ],
+  /* 7002 */  [ 0.255501169, 19 ],
+  /* 7003 */  [ 0.255549823, 19 ],
+  /* 7004 */  [ 0.255598479, 19 ],
+  /* 7005 */  [ 0.255647138, 19 ],
+  /* 7006 */  [ 0.255695799, 19 ],
+  /* 7007 */  [ 0.255744463, 19 ],
+
+  /* 7008 */  [ 0.255793128, 19 ],
+  /* 7009 */  [ 0.255841796, 19 ],
+  /* 7010 */  [ 0.255890467, 19 ],
+  /* 7011 */  [ 0.255939139, 19 ],
+  /* 7012 */  [ 0.255987814, 19 ],
+  /* 7013 */  [ 0.256036492, 19 ],
+  /* 7014 */  [ 0.256085171, 19 ],
+  /* 7015 */  [ 0.256133853, 19 ],
+  /* 7016 */  [ 0.256182537, 19 ],
+  /* 7017 */  [ 0.256231224, 19 ],
+  /* 7018 */  [ 0.256279913, 19 ],
+  /* 7019 */  [ 0.256328604, 19 ],
+  /* 7020 */  [ 0.256377297, 19 ],
+  /* 7021 */  [ 0.256425993, 19 ],
+  /* 7022 */  [ 0.256474691, 19 ],
+  /* 7023 */  [ 0.256523392, 19 ],
+
+  /* 7024 */  [ 0.256572095, 19 ],
+  /* 7025 */  [ 0.256620800, 19 ],
+  /* 7026 */  [ 0.256669507, 19 ],
+  /* 7027 */  [ 0.256718217, 19 ],
+  /* 7028 */  [ 0.256766929, 19 ],
+  /* 7029 */  [ 0.256815643, 19 ],
+  /* 7030 */  [ 0.256864359, 19 ],
+  /* 7031 */  [ 0.256913078, 19 ],
+  /* 7032 */  [ 0.256961800, 19 ],
+  /* 7033 */  [ 0.257010523, 19 ],
+  /* 7034 */  [ 0.257059249, 19 ],
+  /* 7035 */  [ 0.257107977, 19 ],
+  /* 7036 */  [ 0.257156708, 19 ],
+  /* 7037 */  [ 0.257205440, 19 ],
+  /* 7038 */  [ 0.257254175, 19 ],
+  /* 7039 */  [ 0.257302913, 19 ],
+
+  /* 7040 */  [ 0.257351652, 19 ],
+  /* 7041 */  [ 0.257400394, 19 ],
+  /* 7042 */  [ 0.257449139, 19 ],
+  /* 7043 */  [ 0.257497885, 19 ],
+  /* 7044 */  [ 0.257546634, 19 ],
+  /* 7045 */  [ 0.257595386, 19 ],
+  /* 7046 */  [ 0.257644139, 19 ],
+  /* 7047 */  [ 0.257692895, 19 ],
+  /* 7048 */  [ 0.257741653, 19 ],
+  /* 7049 */  [ 0.257790414, 19 ],
+  /* 7050 */  [ 0.257839176, 19 ],
+  /* 7051 */  [ 0.257887941, 19 ],
+  /* 7052 */  [ 0.257936709, 19 ],
+  /* 7053 */  [ 0.257985478, 19 ],
+  /* 7054 */  [ 0.258034250, 19 ],
+  /* 7055 */  [ 0.258083025, 19 ],
+
+  /* 7056 */  [ 0.258131801, 19 ],
+  /* 7057 */  [ 0.258180580, 19 ],
+  /* 7058 */  [ 0.258229361, 19 ],
+  /* 7059 */  [ 0.258278145, 19 ],
+  /* 7060 */  [ 0.258326931, 19 ],
+  /* 7061 */  [ 0.258375719, 19 ],
+  /* 7062 */  [ 0.258424509, 19 ],
+  /* 7063 */  [ 0.258473302, 19 ],
+  /* 7064 */  [ 0.258522097, 19 ],
+  /* 7065 */  [ 0.258570894, 19 ],
+  /* 7066 */  [ 0.258619694, 19 ],
+  /* 7067 */  [ 0.258668496, 19 ],
+  /* 7068 */  [ 0.258717300, 19 ],
+  /* 7069 */  [ 0.258766106, 19 ],
+  /* 7070 */  [ 0.258814915, 19 ],
+  /* 7071 */  [ 0.258863726, 19 ],
+
+  /* 7072 */  [ 0.258912540, 19 ],
+  /* 7073 */  [ 0.258961356, 19 ],
+  /* 7074 */  [ 0.259010174, 19 ],
+  /* 7075 */  [ 0.259058994, 19 ],
+  /* 7076 */  [ 0.259107817, 19 ],
+  /* 7077 */  [ 0.259156642, 19 ],
+  /* 7078 */  [ 0.259205469, 19 ],
+  /* 7079 */  [ 0.259254298, 19 ],
+  /* 7080 */  [ 0.259303130, 19 ],
+  /* 7081 */  [ 0.259351964, 19 ],
+  /* 7082 */  [ 0.259400801, 19 ],
+  /* 7083 */  [ 0.259449639, 19 ],
+  /* 7084 */  [ 0.259498480, 19 ],
+  /* 7085 */  [ 0.259547324, 19 ],
+  /* 7086 */  [ 0.259596169, 19 ],
+  /* 7087 */  [ 0.259645017, 19 ],
+
+  /* 7088 */  [ 0.259693868, 19 ],
+  /* 7089 */  [ 0.259742720, 19 ],
+  /* 7090 */  [ 0.259791575, 19 ],
+  /* 7091 */  [ 0.259840432, 19 ],
+  /* 7092 */  [ 0.259889291, 19 ],
+  /* 7093 */  [ 0.259938153, 19 ],
+  /* 7094 */  [ 0.259987017, 19 ],
+  /* 7095 */  [ 0.260035883, 19 ],
+  /* 7096 */  [ 0.260084752, 19 ],
+  /* 7097 */  [ 0.260133623, 19 ],
+  /* 7098 */  [ 0.260182496, 19 ],
+  /* 7099 */  [ 0.260231372, 19 ],
+  /* 7100 */  [ 0.260280249, 19 ],
+  /* 7101 */  [ 0.260329129, 19 ],
+  /* 7102 */  [ 0.260378012, 19 ],
+  /* 7103 */  [ 0.260426896, 19 ],
+
+  /* 7104 */  [ 0.260475783, 19 ],
+  /* 7105 */  [ 0.260524673, 19 ],
+  /* 7106 */  [ 0.260573564, 19 ],
+  /* 7107 */  [ 0.260622458, 19 ],
+  /* 7108 */  [ 0.260671354, 19 ],
+  /* 7109 */  [ 0.260720252, 19 ],
+  /* 7110 */  [ 0.260769153, 19 ],
+  /* 7111 */  [ 0.260818056, 19 ],
+  /* 7112 */  [ 0.260866961, 19 ],
+  /* 7113 */  [ 0.260915869, 19 ],
+  /* 7114 */  [ 0.260964779, 19 ],
+  /* 7115 */  [ 0.261013691, 19 ],
+  /* 7116 */  [ 0.261062606, 19 ],
+  /* 7117 */  [ 0.261111522, 19 ],
+  /* 7118 */  [ 0.261160441, 19 ],
+  /* 7119 */  [ 0.261209363, 19 ],
+
+  /* 7120 */  [ 0.261258286, 19 ],
+  /* 7121 */  [ 0.261307212, 19 ],
+  /* 7122 */  [ 0.261356140, 19 ],
+  /* 7123 */  [ 0.261405071, 19 ],
+  /* 7124 */  [ 0.261454004, 19 ],
+  /* 7125 */  [ 0.261502939, 19 ],
+  /* 7126 */  [ 0.261551876, 19 ],
+  /* 7127 */  [ 0.261600816, 19 ],
+  /* 7128 */  [ 0.261649758, 19 ],
+  /* 7129 */  [ 0.261698702, 19 ],
+  /* 7130 */  [ 0.261747649, 19 ],
+  /* 7131 */  [ 0.261796597, 19 ],
+  /* 7132 */  [ 0.261845548, 19 ],
+  /* 7133 */  [ 0.261894502, 19 ],
+  /* 7134 */  [ 0.261943458, 19 ],
+  /* 7135 */  [ 0.261992416, 19 ],
+
+  /* 7136 */  [ 0.262041376, 19 ],
+  /* 7137 */  [ 0.262090338, 19 ],
+  /* 7138 */  [ 0.262139303, 19 ],
+  /* 7139 */  [ 0.262188270, 19 ],
+  /* 7140 */  [ 0.262237240, 19 ],
+  /* 7141 */  [ 0.262286211, 19 ],
+  /* 7142 */  [ 0.262335185, 19 ],
+  /* 7143 */  [ 0.262384162, 19 ],
+  /* 7144 */  [ 0.262433140, 19 ],
+  /* 7145 */  [ 0.262482121, 19 ],
+  /* 7146 */  [ 0.262531104, 19 ],
+  /* 7147 */  [ 0.262580089, 19 ],
+  /* 7148 */  [ 0.262629077, 19 ],
+  /* 7149 */  [ 0.262678067, 19 ],
+  /* 7150 */  [ 0.262727059, 19 ],
+  /* 7151 */  [ 0.262776054, 19 ],
+
+  /* 7152 */  [ 0.262825051, 19 ],
+  /* 7153 */  [ 0.262874050, 19 ],
+  /* 7154 */  [ 0.262923051, 19 ],
+  /* 7155 */  [ 0.262972055, 19 ],
+  /* 7156 */  [ 0.263021061, 19 ],
+  /* 7157 */  [ 0.263070069, 19 ],
+  /* 7158 */  [ 0.263119079, 19 ],
+  /* 7159 */  [ 0.263168092, 19 ],
+  /* 7160 */  [ 0.263217107, 19 ],
+  /* 7161 */  [ 0.263266125, 19 ],
+  /* 7162 */  [ 0.263315144, 19 ],
+  /* 7163 */  [ 0.263364166, 19 ],
+  /* 7164 */  [ 0.263413191, 19 ],
+  /* 7165 */  [ 0.263462217, 19 ],
+  /* 7166 */  [ 0.263511246, 19 ],
+  /* 7167 */  [ 0.263560277, 19 ],
+
+  /* 7168 */  [ 0.263609310, 19 ],
+  /* 7169 */  [ 0.263658346, 19 ],
+  /* 7170 */  [ 0.263707384, 19 ],
+  /* 7171 */  [ 0.263756424, 19 ],
+  /* 7172 */  [ 0.263805466, 19 ],
+  /* 7173 */  [ 0.263854511, 19 ],
+  /* 7174 */  [ 0.263903558, 19 ],
+  /* 7175 */  [ 0.263952607, 19 ],
+  /* 7176 */  [ 0.264001659, 19 ],
+  /* 7177 */  [ 0.264050713, 19 ],
+  /* 7178 */  [ 0.264099769, 19 ],
+  /* 7179 */  [ 0.264148827, 19 ],
+  /* 7180 */  [ 0.264197888, 19 ],
+  /* 7181 */  [ 0.264246951, 19 ],
+  /* 7182 */  [ 0.264296016, 19 ],
+  /* 7183 */  [ 0.264345084, 19 ],
+
+  /* 7184 */  [ 0.264394153, 19 ],
+  /* 7185 */  [ 0.264443225, 19 ],
+  /* 7186 */  [ 0.264492300, 19 ],
+  /* 7187 */  [ 0.264541376, 19 ],
+  /* 7188 */  [ 0.264590455, 19 ],
+  /* 7189 */  [ 0.264639536, 19 ],
+  /* 7190 */  [ 0.264688620, 19 ],
+  /* 7191 */  [ 0.264737706, 19 ],
+  /* 7192 */  [ 0.264786794, 19 ],
+  /* 7193 */  [ 0.264835884, 19 ],
+  /* 7194 */  [ 0.264884976, 19 ],
+  /* 7195 */  [ 0.264934071, 19 ],
+  /* 7196 */  [ 0.264983168, 19 ],
+  /* 7197 */  [ 0.265032268, 19 ],
+  /* 7198 */  [ 0.265081369, 19 ],
+  /* 7199 */  [ 0.265130473, 19 ],
+
+  /* 7200 */  [ 0.265179580, 19 ],
+  /* 7201 */  [ 0.265228688, 19 ],
+  /* 7202 */  [ 0.265277799, 19 ],
+  /* 7203 */  [ 0.265326912, 19 ],
+  /* 7204 */  [ 0.265376027, 19 ],
+  /* 7205 */  [ 0.265425145, 19 ],
+  /* 7206 */  [ 0.265474264, 19 ],
+  /* 7207 */  [ 0.265523387, 19 ],
+  /* 7208 */  [ 0.265572511, 19 ],
+  /* 7209 */  [ 0.265621638, 19 ],
+  /* 7210 */  [ 0.265670766, 19 ],
+  /* 7211 */  [ 0.265719898, 19 ],
+  /* 7212 */  [ 0.265769031, 19 ],
+  /* 7213 */  [ 0.265818167, 19 ],
+  /* 7214 */  [ 0.265867305, 19 ],
+  /* 7215 */  [ 0.265916445, 19 ],
+
+  /* 7216 */  [ 0.265965588, 19 ],
+  /* 7217 */  [ 0.266014732, 19 ],
+  /* 7218 */  [ 0.266063880, 19 ],
+  /* 7219 */  [ 0.266113029, 19 ],
+  /* 7220 */  [ 0.266162181, 19 ],
+  /* 7221 */  [ 0.266211334, 19 ],
+  /* 7222 */  [ 0.266260491, 19 ],
+  /* 7223 */  [ 0.266309649, 19 ],
+  /* 7224 */  [ 0.266358810, 19 ],
+  /* 7225 */  [ 0.266407973, 19 ],
+  /* 7226 */  [ 0.266457138, 19 ],
+  /* 7227 */  [ 0.266506305, 19 ],
+  /* 7228 */  [ 0.266555475, 19 ],
+  /* 7229 */  [ 0.266604647, 19 ],
+  /* 7230 */  [ 0.266653822, 19 ],
+  /* 7231 */  [ 0.266702998, 19 ],
+
+  /* 7232 */  [ 0.266752177, 19 ],
+  /* 7233 */  [ 0.266801358, 19 ],
+  /* 7234 */  [ 0.266850541, 19 ],
+  /* 7235 */  [ 0.266899727, 19 ],
+  /* 7236 */  [ 0.266948915, 19 ],
+  /* 7237 */  [ 0.266998105, 19 ],
+  /* 7238 */  [ 0.267047298, 19 ],
+  /* 7239 */  [ 0.267096492, 19 ],
+  /* 7240 */  [ 0.267145689, 19 ],
+  /* 7241 */  [ 0.267194888, 19 ],
+  /* 7242 */  [ 0.267244090, 19 ],
+  /* 7243 */  [ 0.267293294, 19 ],
+  /* 7244 */  [ 0.267342500, 19 ],
+  /* 7245 */  [ 0.267391708, 19 ],
+  /* 7246 */  [ 0.267440919, 19 ],
+  /* 7247 */  [ 0.267490131, 19 ],
+
+  /* 7248 */  [ 0.267539347, 19 ],
+  /* 7249 */  [ 0.267588564, 19 ],
+  /* 7250 */  [ 0.267637783, 19 ],
+  /* 7251 */  [ 0.267687005, 19 ],
+  /* 7252 */  [ 0.267736229, 19 ],
+  /* 7253 */  [ 0.267785456, 19 ],
+  /* 7254 */  [ 0.267834685, 19 ],
+  /* 7255 */  [ 0.267883915, 19 ],
+  /* 7256 */  [ 0.267933149, 19 ],
+  /* 7257 */  [ 0.267982384, 19 ],
+  /* 7258 */  [ 0.268031622, 19 ],
+  /* 7259 */  [ 0.268080862, 19 ],
+  /* 7260 */  [ 0.268130104, 19 ],
+  /* 7261 */  [ 0.268179349, 19 ],
+  /* 7262 */  [ 0.268228595, 19 ],
+  /* 7263 */  [ 0.268277844, 19 ],
+
+  /* 7264 */  [ 0.268327096, 19 ],
+  /* 7265 */  [ 0.268376349, 19 ],
+  /* 7266 */  [ 0.268425605, 19 ],
+  /* 7267 */  [ 0.268474863, 19 ],
+  /* 7268 */  [ 0.268524123, 19 ],
+  /* 7269 */  [ 0.268573386, 19 ],
+  /* 7270 */  [ 0.268622651, 19 ],
+  /* 7271 */  [ 0.268671918, 19 ],
+  /* 7272 */  [ 0.268721187, 19 ],
+  /* 7273 */  [ 0.268770459, 19 ],
+  /* 7274 */  [ 0.268819733, 19 ],
+  /* 7275 */  [ 0.268869009, 19 ],
+  /* 7276 */  [ 0.268918287, 19 ],
+  /* 7277 */  [ 0.268967568, 19 ],
+  /* 7278 */  [ 0.269016851, 19 ],
+  /* 7279 */  [ 0.269066136, 19 ],
+
+  /* 7280 */  [ 0.269115423, 19 ],
+  /* 7281 */  [ 0.269164713, 19 ],
+  /* 7282 */  [ 0.269214005, 19 ],
+  /* 7283 */  [ 0.269263299, 19 ],
+  /* 7284 */  [ 0.269312595, 19 ],
+  /* 7285 */  [ 0.269361894, 19 ],
+  /* 7286 */  [ 0.269411195, 19 ],
+  /* 7287 */  [ 0.269460498, 19 ],
+  /* 7288 */  [ 0.269509804, 19 ],
+  /* 7289 */  [ 0.269559111, 19 ],
+  /* 7290 */  [ 0.269608421, 19 ],
+  /* 7291 */  [ 0.269657734, 19 ],
+  /* 7292 */  [ 0.269707048, 19 ],
+  /* 7293 */  [ 0.269756365, 19 ],
+  /* 7294 */  [ 0.269805684, 19 ],
+  /* 7295 */  [ 0.269855005, 19 ],
+
+  /* 7296 */  [ 0.269904329, 19 ],
+  /* 7297 */  [ 0.269953654, 19 ],
+  /* 7298 */  [ 0.270002982, 19 ],
+  /* 7299 */  [ 0.270052313, 19 ],
+  /* 7300 */  [ 0.270101645, 19 ],
+  /* 7301 */  [ 0.270150980, 19 ],
+  /* 7302 */  [ 0.270200317, 19 ],
+  /* 7303 */  [ 0.270249656, 19 ],
+  /* 7304 */  [ 0.270298998, 19 ],
+  /* 7305 */  [ 0.270348341, 19 ],
+  /* 7306 */  [ 0.270397687, 19 ],
+  /* 7307 */  [ 0.270447036, 19 ],
+  /* 7308 */  [ 0.270496386, 19 ],
+  /* 7309 */  [ 0.270545739, 19 ],
+  /* 7310 */  [ 0.270595094, 19 ],
+  /* 7311 */  [ 0.270644451, 19 ],
+
+  /* 7312 */  [ 0.270693811, 19 ],
+  /* 7313 */  [ 0.270743173, 19 ],
+  /* 7314 */  [ 0.270792537, 19 ],
+  /* 7315 */  [ 0.270841903, 19 ],
+  /* 7316 */  [ 0.270891271, 19 ],
+  /* 7317 */  [ 0.270940642, 19 ],
+  /* 7318 */  [ 0.270990015, 19 ],
+  /* 7319 */  [ 0.271039390, 19 ],
+  /* 7320 */  [ 0.271088768, 19 ],
+  /* 7321 */  [ 0.271138148, 19 ],
+  /* 7322 */  [ 0.271187530, 19 ],
+  /* 7323 */  [ 0.271236914, 19 ],
+  /* 7324 */  [ 0.271286301, 19 ],
+  /* 7325 */  [ 0.271335689, 19 ],
+  /* 7326 */  [ 0.271385080, 19 ],
+  /* 7327 */  [ 0.271434474, 19 ],
+
+  /* 7328 */  [ 0.271483869, 19 ],
+  /* 7329 */  [ 0.271533267, 19 ],
+  /* 7330 */  [ 0.271582667, 19 ],
+  /* 7331 */  [ 0.271632069, 19 ],
+  /* 7332 */  [ 0.271681474, 19 ],
+  /* 7333 */  [ 0.271730880, 19 ],
+  /* 7334 */  [ 0.271780289, 19 ],
+  /* 7335 */  [ 0.271829701, 19 ],
+  /* 7336 */  [ 0.271879114, 19 ],
+  /* 7337 */  [ 0.271928530, 19 ],
+  /* 7338 */  [ 0.271977948, 19 ],
+  /* 7339 */  [ 0.272027368, 19 ],
+  /* 7340 */  [ 0.272076790, 19 ],
+  /* 7341 */  [ 0.272126215, 19 ],
+  /* 7342 */  [ 0.272175642, 19 ],
+  /* 7343 */  [ 0.272225071, 19 ],
+
+  /* 7344 */  [ 0.272274503, 19 ],
+  /* 7345 */  [ 0.272323936, 19 ],
+  /* 7346 */  [ 0.272373372, 19 ],
+  /* 7347 */  [ 0.272422810, 19 ],
+  /* 7348 */  [ 0.272472251, 19 ],
+  /* 7349 */  [ 0.272521693, 19 ],
+  /* 7350 */  [ 0.272571138, 19 ],
+  /* 7351 */  [ 0.272620585, 19 ],
+  /* 7352 */  [ 0.272670035, 19 ],
+  /* 7353 */  [ 0.272719486, 19 ],
+  /* 7354 */  [ 0.272768940, 19 ],
+  /* 7355 */  [ 0.272818396, 19 ],
+  /* 7356 */  [ 0.272867855, 19 ],
+  /* 7357 */  [ 0.272917315, 19 ],
+  /* 7358 */  [ 0.272966778, 19 ],
+  /* 7359 */  [ 0.273016243, 19 ],
+
+  /* 7360 */  [ 0.273065710, 19 ],
+  /* 7361 */  [ 0.273115180, 19 ],
+  /* 7362 */  [ 0.273164652, 19 ],
+  /* 7363 */  [ 0.273214126, 19 ],
+  /* 7364 */  [ 0.273263602, 19 ],
+  /* 7365 */  [ 0.273313081, 19 ],
+  /* 7366 */  [ 0.273362561, 19 ],
+  /* 7367 */  [ 0.273412044, 19 ],
+  /* 7368 */  [ 0.273461530, 19 ],
+  /* 7369 */  [ 0.273511017, 19 ],
+  /* 7370 */  [ 0.273560507, 19 ],
+  /* 7371 */  [ 0.273609999, 19 ],
+  /* 7372 */  [ 0.273659493, 19 ],
+  /* 7373 */  [ 0.273708989, 19 ],
+  /* 7374 */  [ 0.273758488, 19 ],
+  /* 7375 */  [ 0.273807989, 19 ],
+
+  /* 7376 */  [ 0.273857492, 19 ],
+  /* 7377 */  [ 0.273906997, 19 ],
+  /* 7378 */  [ 0.273956505, 19 ],
+  /* 7379 */  [ 0.274006015, 19 ],
+  /* 7380 */  [ 0.274055527, 19 ],
+  /* 7381 */  [ 0.274105041, 19 ],
+  /* 7382 */  [ 0.274154558, 19 ],
+  /* 7383 */  [ 0.274204076, 19 ],
+  /* 7384 */  [ 0.274253597, 19 ],
+  /* 7385 */  [ 0.274303121, 19 ],
+  /* 7386 */  [ 0.274352646, 19 ],
+  /* 7387 */  [ 0.274402174, 19 ],
+  /* 7388 */  [ 0.274451704, 19 ],
+  /* 7389 */  [ 0.274501236, 19 ],
+  /* 7390 */  [ 0.274550771, 19 ],
+  /* 7391 */  [ 0.274600307, 19 ],
+
+  /* 7392 */  [ 0.274649846, 19 ],
+  /* 7393 */  [ 0.274699387, 19 ],
+  /* 7394 */  [ 0.274748931, 19 ],
+  /* 7395 */  [ 0.274798476, 19 ],
+  /* 7396 */  [ 0.274848024, 19 ],
+  /* 7397 */  [ 0.274897574, 19 ],
+  /* 7398 */  [ 0.274947126, 19 ],
+  /* 7399 */  [ 0.274996681, 19 ],
+  /* 7400 */  [ 0.275046238, 19 ],
+  /* 7401 */  [ 0.275095797, 19 ],
+  /* 7402 */  [ 0.275145358, 19 ],
+  /* 7403 */  [ 0.275194921, 19 ],
+  /* 7404 */  [ 0.275244487, 19 ],
+  /* 7405 */  [ 0.275294055, 19 ],
+  /* 7406 */  [ 0.275343625, 19 ],
+  /* 7407 */  [ 0.275393198, 19 ],
+
+  /* 7408 */  [ 0.275442772, 19 ],
+  /* 7409 */  [ 0.275492349, 19 ],
+  /* 7410 */  [ 0.275541928, 19 ],
+  /* 7411 */  [ 0.275591509, 19 ],
+  /* 7412 */  [ 0.275641093, 19 ],
+  /* 7413 */  [ 0.275690679, 19 ],
+  /* 7414 */  [ 0.275740267, 19 ],
+  /* 7415 */  [ 0.275789857, 19 ],
+  /* 7416 */  [ 0.275839449, 19 ],
+  /* 7417 */  [ 0.275889044, 19 ],
+  /* 7418 */  [ 0.275938641, 19 ],
+  /* 7419 */  [ 0.275988240, 19 ],
+  /* 7420 */  [ 0.276037842, 19 ],
+  /* 7421 */  [ 0.276087445, 19 ],
+  /* 7422 */  [ 0.276137051, 19 ],
+  /* 7423 */  [ 0.276186659, 19 ],
+
+  /* 7424 */  [ 0.276236269, 19 ],
+  /* 7425 */  [ 0.276285882, 19 ],
+  /* 7426 */  [ 0.276335497, 19 ],
+  /* 7427 */  [ 0.276385113, 19 ],
+  /* 7428 */  [ 0.276434733, 19 ],
+  /* 7429 */  [ 0.276484354, 19 ],
+  /* 7430 */  [ 0.276533978, 19 ],
+  /* 7431 */  [ 0.276583604, 19 ],
+  /* 7432 */  [ 0.276633232, 19 ],
+  /* 7433 */  [ 0.276682862, 19 ],
+  /* 7434 */  [ 0.276732495, 19 ],
+  /* 7435 */  [ 0.276782129, 19 ],
+  /* 7436 */  [ 0.276831766, 19 ],
+  /* 7437 */  [ 0.276881406, 19 ],
+  /* 7438 */  [ 0.276931047, 19 ],
+  /* 7439 */  [ 0.276980691, 19 ],
+
+  /* 7440 */  [ 0.277030337, 19 ],
+  /* 7441 */  [ 0.277079985, 19 ],
+  /* 7442 */  [ 0.277129635, 19 ],
+  /* 7443 */  [ 0.277179288, 19 ],
+  /* 7444 */  [ 0.277228942, 19 ],
+  /* 7445 */  [ 0.277278600, 19 ],
+  /* 7446 */  [ 0.277328259, 19 ],
+  /* 7447 */  [ 0.277377920, 19 ],
+  /* 7448 */  [ 0.277427584, 19 ],
+  /* 7449 */  [ 0.277477250, 19 ],
+  /* 7450 */  [ 0.277526918, 19 ],
+  /* 7451 */  [ 0.277576588, 19 ],
+  /* 7452 */  [ 0.277626261, 19 ],
+  /* 7453 */  [ 0.277675936, 19 ],
+  /* 7454 */  [ 0.277725613, 19 ],
+  /* 7455 */  [ 0.277775292, 19 ],
+
+  /* 7456 */  [ 0.277824973, 19 ],
+  /* 7457 */  [ 0.277874657, 19 ],
+  /* 7458 */  [ 0.277924343, 19 ],
+  /* 7459 */  [ 0.277974031, 19 ],
+  /* 7460 */  [ 0.278023722, 19 ],
+  /* 7461 */  [ 0.278073414, 19 ],
+  /* 7462 */  [ 0.278123109, 19 ],
+  /* 7463 */  [ 0.278172806, 19 ],
+  /* 7464 */  [ 0.278222505, 19 ],
+  /* 7465 */  [ 0.278272207, 19 ],
+  /* 7466 */  [ 0.278321910, 19 ],
+  /* 7467 */  [ 0.278371616, 19 ],
+  /* 7468 */  [ 0.278421324, 19 ],
+  /* 7469 */  [ 0.278471035, 19 ],
+  /* 7470 */  [ 0.278520747, 19 ],
+  /* 7471 */  [ 0.278570462, 19 ],
+
+  /* 7472 */  [ 0.278620179, 19 ],
+  /* 7473 */  [ 0.278669898, 19 ],
+  /* 7474 */  [ 0.278719619, 19 ],
+  /* 7475 */  [ 0.278769343, 19 ],
+  /* 7476 */  [ 0.278819069, 19 ],
+  /* 7477 */  [ 0.278868797, 19 ],
+  /* 7478 */  [ 0.278918527, 19 ],
+  /* 7479 */  [ 0.278968260, 19 ],
+  /* 7480 */  [ 0.279017995, 19 ],
+  /* 7481 */  [ 0.279067731, 19 ],
+  /* 7482 */  [ 0.279117471, 19 ],
+  /* 7483 */  [ 0.279167212, 19 ],
+  /* 7484 */  [ 0.279216956, 19 ],
+  /* 7485 */  [ 0.279266701, 19 ],
+  /* 7486 */  [ 0.279316449, 19 ],
+  /* 7487 */  [ 0.279366200, 19 ],
+
+  /* 7488 */  [ 0.279415952, 19 ],
+  /* 7489 */  [ 0.279465707, 19 ],
+  /* 7490 */  [ 0.279515464, 19 ],
+  /* 7491 */  [ 0.279565223, 19 ],
+  /* 7492 */  [ 0.279614984, 19 ],
+  /* 7493 */  [ 0.279664748, 19 ],
+  /* 7494 */  [ 0.279714513, 19 ],
+  /* 7495 */  [ 0.279764281, 19 ],
+  /* 7496 */  [ 0.279814051, 19 ],
+  /* 7497 */  [ 0.279863824, 19 ],
+  /* 7498 */  [ 0.279913598, 19 ],
+  /* 7499 */  [ 0.279963375, 19 ],
+  /* 7500 */  [ 0.280013154, 19 ],
+  /* 7501 */  [ 0.280062935, 19 ],
+  /* 7502 */  [ 0.280112719, 19 ],
+  /* 7503 */  [ 0.280162504, 19 ],
+
+  /* 7504 */  [ 0.280212292, 19 ],
+  /* 7505 */  [ 0.280262082, 19 ],
+  /* 7506 */  [ 0.280311875, 19 ],
+  /* 7507 */  [ 0.280361669, 19 ],
+  /* 7508 */  [ 0.280411466, 19 ],
+  /* 7509 */  [ 0.280461265, 19 ],
+  /* 7510 */  [ 0.280511066, 19 ],
+  /* 7511 */  [ 0.280560869, 19 ],
+  /* 7512 */  [ 0.280610675, 19 ],
+  /* 7513 */  [ 0.280660483, 19 ],
+  /* 7514 */  [ 0.280710292, 19 ],
+  /* 7515 */  [ 0.280760105, 19 ],
+  /* 7516 */  [ 0.280809919, 19 ],
+  /* 7517 */  [ 0.280859736, 19 ],
+  /* 7518 */  [ 0.280909554, 19 ],
+  /* 7519 */  [ 0.280959375, 19 ],
+
+  /* 7520 */  [ 0.281009199, 19 ],
+  /* 7521 */  [ 0.281059024, 19 ],
+  /* 7522 */  [ 0.281108852, 19 ],
+  /* 7523 */  [ 0.281158682, 19 ],
+  /* 7524 */  [ 0.281208514, 19 ],
+  /* 7525 */  [ 0.281258348, 19 ],
+  /* 7526 */  [ 0.281308184, 19 ],
+  /* 7527 */  [ 0.281358023, 19 ],
+  /* 7528 */  [ 0.281407864, 19 ],
+  /* 7529 */  [ 0.281457707, 19 ],
+  /* 7530 */  [ 0.281507552, 19 ],
+  /* 7531 */  [ 0.281557400, 19 ],
+  /* 7532 */  [ 0.281607250, 19 ],
+  /* 7533 */  [ 0.281657101, 19 ],
+  /* 7534 */  [ 0.281706956, 19 ],
+  /* 7535 */  [ 0.281756812, 19 ],
+
+  /* 7536 */  [ 0.281806670, 19 ],
+  /* 7537 */  [ 0.281856531, 19 ],
+  /* 7538 */  [ 0.281906394, 19 ],
+  /* 7539 */  [ 0.281956259, 19 ],
+  /* 7540 */  [ 0.282006127, 19 ],
+  /* 7541 */  [ 0.282055996, 19 ],
+  /* 7542 */  [ 0.282105868, 19 ],
+  /* 7543 */  [ 0.282155742, 19 ],
+  /* 7544 */  [ 0.282205618, 19 ],
+  /* 7545 */  [ 0.282255496, 19 ],
+  /* 7546 */  [ 0.282305377, 19 ],
+  /* 7547 */  [ 0.282355260, 19 ],
+  /* 7548 */  [ 0.282405145, 19 ],
+  /* 7549 */  [ 0.282455032, 19 ],
+  /* 7550 */  [ 0.282504921, 19 ],
+  /* 7551 */  [ 0.282554813, 19 ],
+
+  /* 7552 */  [ 0.282604707, 19 ],
+  /* 7553 */  [ 0.282654603, 19 ],
+  /* 7554 */  [ 0.282704501, 19 ],
+  /* 7555 */  [ 0.282754401, 19 ],
+  /* 7556 */  [ 0.282804304, 19 ],
+  /* 7557 */  [ 0.282854209, 19 ],
+  /* 7558 */  [ 0.282904116, 19 ],
+  /* 7559 */  [ 0.282954025, 19 ],
+  /* 7560 */  [ 0.283003936, 19 ],
+  /* 7561 */  [ 0.283053850, 19 ],
+  /* 7562 */  [ 0.283103766, 19 ],
+  /* 7563 */  [ 0.283153684, 19 ],
+  /* 7564 */  [ 0.283203604, 19 ],
+  /* 7565 */  [ 0.283253527, 19 ],
+  /* 7566 */  [ 0.283303451, 19 ],
+  /* 7567 */  [ 0.283353378, 19 ],
+
+  /* 7568 */  [ 0.283403307, 19 ],
+  /* 7569 */  [ 0.283453238, 19 ],
+  /* 7570 */  [ 0.283503172, 19 ],
+  /* 7571 */  [ 0.283553107, 19 ],
+  /* 7572 */  [ 0.283603045, 19 ],
+  /* 7573 */  [ 0.283652985, 19 ],
+  /* 7574 */  [ 0.283702927, 19 ],
+  /* 7575 */  [ 0.283752872, 19 ],
+  /* 7576 */  [ 0.283802818, 19 ],
+  /* 7577 */  [ 0.283852767, 19 ],
+  /* 7578 */  [ 0.283902718, 19 ],
+  /* 7579 */  [ 0.283952671, 19 ],
+  /* 7580 */  [ 0.284002627, 19 ],
+  /* 7581 */  [ 0.284052584, 19 ],
+  /* 7582 */  [ 0.284102544, 19 ],
+  /* 7583 */  [ 0.284152506, 19 ],
+
+  /* 7584 */  [ 0.284202470, 19 ],
+  /* 7585 */  [ 0.284252436, 19 ],
+  /* 7586 */  [ 0.284302405, 19 ],
+  /* 7587 */  [ 0.284352376, 19 ],
+  /* 7588 */  [ 0.284402349, 19 ],
+  /* 7589 */  [ 0.284452324, 19 ],
+  /* 7590 */  [ 0.284502301, 19 ],
+  /* 7591 */  [ 0.284552281, 19 ],
+  /* 7592 */  [ 0.284602263, 19 ],
+  /* 7593 */  [ 0.284652246, 19 ],
+  /* 7594 */  [ 0.284702233, 19 ],
+  /* 7595 */  [ 0.284752221, 19 ],
+  /* 7596 */  [ 0.284802211, 19 ],
+  /* 7597 */  [ 0.284852204, 19 ],
+  /* 7598 */  [ 0.284902199, 19 ],
+  /* 7599 */  [ 0.284952196, 19 ],
+
+  /* 7600 */  [ 0.285002195, 19 ],
+  /* 7601 */  [ 0.285052197, 19 ],
+  /* 7602 */  [ 0.285102201, 19 ],
+  /* 7603 */  [ 0.285152206, 19 ],
+  /* 7604 */  [ 0.285202214, 19 ],
+  /* 7605 */  [ 0.285252225, 19 ],
+  /* 7606 */  [ 0.285302237, 19 ],
+  /* 7607 */  [ 0.285352252, 19 ],
+  /* 7608 */  [ 0.285402269, 19 ],
+  /* 7609 */  [ 0.285452288, 19 ],
+  /* 7610 */  [ 0.285502309, 19 ],
+  /* 7611 */  [ 0.285552332, 19 ],
+  /* 7612 */  [ 0.285602358, 19 ],
+  /* 7613 */  [ 0.285652386, 19 ],
+  /* 7614 */  [ 0.285702416, 19 ],
+  /* 7615 */  [ 0.285752448, 19 ],
+
+  /* 7616 */  [ 0.285802482, 19 ],
+  /* 7617 */  [ 0.285852519, 19 ],
+  /* 7618 */  [ 0.285902557, 19 ],
+  /* 7619 */  [ 0.285952598, 19 ],
+  /* 7620 */  [ 0.286002641, 19 ],
+  /* 7621 */  [ 0.286052687, 19 ],
+  /* 7622 */  [ 0.286102734, 19 ],
+  /* 7623 */  [ 0.286152784, 19 ],
+  /* 7624 */  [ 0.286202836, 19 ],
+  /* 7625 */  [ 0.286252890, 19 ],
+  /* 7626 */  [ 0.286302946, 19 ],
+  /* 7627 */  [ 0.286353005, 19 ],
+  /* 7628 */  [ 0.286403065, 19 ],
+  /* 7629 */  [ 0.286453128, 19 ],
+  /* 7630 */  [ 0.286503193, 19 ],
+  /* 7631 */  [ 0.286553260, 19 ],
+
+  /* 7632 */  [ 0.286603329, 19 ],
+  /* 7633 */  [ 0.286653401, 19 ],
+  /* 7634 */  [ 0.286703475, 19 ],
+  /* 7635 */  [ 0.286753551, 19 ],
+  /* 7636 */  [ 0.286803629, 19 ],
+  /* 7637 */  [ 0.286853709, 19 ],
+  /* 7638 */  [ 0.286903792, 19 ],
+  /* 7639 */  [ 0.286953876, 19 ],
+  /* 7640 */  [ 0.287003963, 19 ],
+  /* 7641 */  [ 0.287054052, 19 ],
+  /* 7642 */  [ 0.287104143, 19 ],
+  /* 7643 */  [ 0.287154237, 19 ],
+  /* 7644 */  [ 0.287204332, 19 ],
+  /* 7645 */  [ 0.287254430, 19 ],
+  /* 7646 */  [ 0.287304530, 19 ],
+  /* 7647 */  [ 0.287354632, 19 ],
+
+  /* 7648 */  [ 0.287404737, 19 ],
+  /* 7649 */  [ 0.287454843, 19 ],
+  /* 7650 */  [ 0.287504952, 19 ],
+  /* 7651 */  [ 0.287555063, 19 ],
+  /* 7652 */  [ 0.287605176, 19 ],
+  /* 7653 */  [ 0.287655291, 19 ],
+  /* 7654 */  [ 0.287705409, 19 ],
+  /* 7655 */  [ 0.287755528, 19 ],
+  /* 7656 */  [ 0.287805650, 19 ],
+  /* 7657 */  [ 0.287855774, 19 ],
+  /* 7658 */  [ 0.287905900, 19 ],
+  /* 7659 */  [ 0.287956028, 19 ],
+  /* 7660 */  [ 0.288006159, 19 ],
+  /* 7661 */  [ 0.288056292, 19 ],
+  /* 7662 */  [ 0.288106427, 19 ],
+  /* 7663 */  [ 0.288156564, 19 ],
+
+  /* 7664 */  [ 0.288206703, 19 ],
+  /* 7665 */  [ 0.288256844, 19 ],
+  /* 7666 */  [ 0.288306988, 19 ],
+  /* 7667 */  [ 0.288357134, 19 ],
+  /* 7668 */  [ 0.288407282, 19 ],
+  /* 7669 */  [ 0.288457432, 19 ],
+  /* 7670 */  [ 0.288507584, 19 ],
+  /* 7671 */  [ 0.288557739, 19 ],
+  /* 7672 */  [ 0.288607895, 19 ],
+  /* 7673 */  [ 0.288658054, 19 ],
+  /* 7674 */  [ 0.288708215, 19 ],
+  /* 7675 */  [ 0.288758379, 19 ],
+  /* 7676 */  [ 0.288808544, 19 ],
+  /* 7677 */  [ 0.288858712, 19 ],
+  /* 7678 */  [ 0.288908881, 19 ],
+  /* 7679 */  [ 0.288959053, 19 ],
+
+  /* 7680 */  [ 0.289009227, 19 ],
+  /* 7681 */  [ 0.289059404, 19 ],
+  /* 7682 */  [ 0.289109582, 19 ],
+  /* 7683 */  [ 0.289159763, 19 ],
+  /* 7684 */  [ 0.289209946, 19 ],
+  /* 7685 */  [ 0.289260131, 19 ],
+  /* 7686 */  [ 0.289310318, 19 ],
+  /* 7687 */  [ 0.289360507, 19 ],
+  /* 7688 */  [ 0.289410699, 19 ],
+  /* 7689 */  [ 0.289460893, 19 ],
+  /* 7690 */  [ 0.289511088, 19 ],
+  /* 7691 */  [ 0.289561287, 19 ],
+  /* 7692 */  [ 0.289611487, 19 ],
+  /* 7693 */  [ 0.289661689, 19 ],
+  /* 7694 */  [ 0.289711894, 19 ],
+  /* 7695 */  [ 0.289762101, 19 ],
+
+  /* 7696 */  [ 0.289812309, 19 ],
+  /* 7697 */  [ 0.289862521, 19 ],
+  /* 7698 */  [ 0.289912734, 19 ],
+  /* 7699 */  [ 0.289962949, 19 ],
+  /* 7700 */  [ 0.290013167, 19 ],
+  /* 7701 */  [ 0.290063387, 19 ],
+  /* 7702 */  [ 0.290113609, 19 ],
+  /* 7703 */  [ 0.290163833, 19 ],
+  /* 7704 */  [ 0.290214059, 19 ],
+  /* 7705 */  [ 0.290264288, 19 ],
+  /* 7706 */  [ 0.290314519, 19 ],
+  /* 7707 */  [ 0.290364751, 19 ],
+  /* 7708 */  [ 0.290414986, 19 ],
+  /* 7709 */  [ 0.290465224, 19 ],
+  /* 7710 */  [ 0.290515463, 19 ],
+  /* 7711 */  [ 0.290565705, 19 ],
+
+  /* 7712 */  [ 0.290615948, 19 ],
+  /* 7713 */  [ 0.290666194, 19 ],
+  /* 7714 */  [ 0.290716442, 19 ],
+  /* 7715 */  [ 0.290766692, 19 ],
+  /* 7716 */  [ 0.290816945, 19 ],
+  /* 7717 */  [ 0.290867199, 19 ],
+  /* 7718 */  [ 0.290917456, 19 ],
+  /* 7719 */  [ 0.290967715, 19 ],
+  /* 7720 */  [ 0.291017976, 19 ],
+  /* 7721 */  [ 0.291068239, 19 ],
+  /* 7722 */  [ 0.291118505, 19 ],
+  /* 7723 */  [ 0.291168772, 19 ],
+  /* 7724 */  [ 0.291219042, 19 ],
+  /* 7725 */  [ 0.291269314, 19 ],
+  /* 7726 */  [ 0.291319588, 19 ],
+  /* 7727 */  [ 0.291369865, 19 ],
+
+  /* 7728 */  [ 0.291420143, 19 ],
+  /* 7729 */  [ 0.291470424, 19 ],
+  /* 7730 */  [ 0.291520706, 19 ],
+  /* 7731 */  [ 0.291570991, 19 ],
+  /* 7732 */  [ 0.291621278, 19 ],
+  /* 7733 */  [ 0.291671568, 19 ],
+  /* 7734 */  [ 0.291721859, 19 ],
+  /* 7735 */  [ 0.291772153, 19 ],
+  /* 7736 */  [ 0.291822449, 19 ],
+  /* 7737 */  [ 0.291872747, 19 ],
+  /* 7738 */  [ 0.291923047, 19 ],
+  /* 7739 */  [ 0.291973349, 19 ],
+  /* 7740 */  [ 0.292023653, 19 ],
+  /* 7741 */  [ 0.292073960, 19 ],
+  /* 7742 */  [ 0.292124269, 19 ],
+  /* 7743 */  [ 0.292174580, 19 ],
+
+  /* 7744 */  [ 0.292224893, 19 ],
+  /* 7745 */  [ 0.292275208, 19 ],
+  /* 7746 */  [ 0.292325526, 19 ],
+  /* 7747 */  [ 0.292375845, 19 ],
+  /* 7748 */  [ 0.292426167, 19 ],
+  /* 7749 */  [ 0.292476491, 19 ],
+  /* 7750 */  [ 0.292526817, 19 ],
+  /* 7751 */  [ 0.292577145, 19 ],
+  /* 7752 */  [ 0.292627476, 19 ],
+  /* 7753 */  [ 0.292677808, 19 ],
+  /* 7754 */  [ 0.292728143, 19 ],
+  /* 7755 */  [ 0.292778480, 19 ],
+  /* 7756 */  [ 0.292828819, 19 ],
+  /* 7757 */  [ 0.292879160, 19 ],
+  /* 7758 */  [ 0.292929504, 19 ],
+  /* 7759 */  [ 0.292979849, 19 ],
+
+  /* 7760 */  [ 0.293030197, 19 ],
+  /* 7761 */  [ 0.293080547, 19 ],
+  /* 7762 */  [ 0.293130899, 19 ],
+  /* 7763 */  [ 0.293181253, 19 ],
+  /* 7764 */  [ 0.293231610, 19 ],
+  /* 7765 */  [ 0.293281968, 19 ],
+  /* 7766 */  [ 0.293332329, 19 ],
+  /* 7767 */  [ 0.293382692, 19 ],
+  /* 7768 */  [ 0.293433057, 19 ],
+  /* 7769 */  [ 0.293483424, 19 ],
+  /* 7770 */  [ 0.293533794, 19 ],
+  /* 7771 */  [ 0.293584165, 19 ],
+  /* 7772 */  [ 0.293634539, 19 ],
+  /* 7773 */  [ 0.293684915, 19 ],
+  /* 7774 */  [ 0.293735293, 19 ],
+  /* 7775 */  [ 0.293785673, 19 ],
+
+  /* 7776 */  [ 0.293836055, 19 ],
+  /* 7777 */  [ 0.293886440, 19 ],
+  /* 7778 */  [ 0.293936826, 19 ],
+  /* 7779 */  [ 0.293987215, 19 ],
+  /* 7780 */  [ 0.294037606, 19 ],
+  /* 7781 */  [ 0.294087999, 19 ],
+  /* 7782 */  [ 0.294138395, 19 ],
+  /* 7783 */  [ 0.294188792, 19 ],
+  /* 7784 */  [ 0.294239192, 19 ],
+  /* 7785 */  [ 0.294289593, 19 ],
+  /* 7786 */  [ 0.294339997, 19 ],
+  /* 7787 */  [ 0.294390403, 19 ],
+  /* 7788 */  [ 0.294440812, 19 ],
+  /* 7789 */  [ 0.294491222, 19 ],
+  /* 7790 */  [ 0.294541635, 19 ],
+  /* 7791 */  [ 0.294592049, 19 ],
+
+  /* 7792 */  [ 0.294642466, 19 ],
+  /* 7793 */  [ 0.294692885, 19 ],
+  /* 7794 */  [ 0.294743306, 19 ],
+  /* 7795 */  [ 0.294793730, 19 ],
+  /* 7796 */  [ 0.294844155, 19 ],
+  /* 7797 */  [ 0.294894583, 19 ],
+  /* 7798 */  [ 0.294945013, 19 ],
+  /* 7799 */  [ 0.294995445, 19 ],
+  /* 7800 */  [ 0.295045879, 19 ],
+  /* 7801 */  [ 0.295096315, 19 ],
+  /* 7802 */  [ 0.295146753, 19 ],
+  /* 7803 */  [ 0.295197194, 19 ],
+  /* 7804 */  [ 0.295247637, 19 ],
+  /* 7805 */  [ 0.295298082, 19 ],
+  /* 7806 */  [ 0.295348529, 19 ],
+  /* 7807 */  [ 0.295398978, 19 ],
+
+  /* 7808 */  [ 0.295449429, 19 ],
+  /* 7809 */  [ 0.295499883, 19 ],
+  /* 7810 */  [ 0.295550338, 19 ],
+  /* 7811 */  [ 0.295600796, 19 ],
+  /* 7812 */  [ 0.295651256, 19 ],
+  /* 7813 */  [ 0.295701718, 19 ],
+  /* 7814 */  [ 0.295752183, 19 ],
+  /* 7815 */  [ 0.295802649, 19 ],
+  /* 7816 */  [ 0.295853118, 19 ],
+  /* 7817 */  [ 0.295903588, 19 ],
+  /* 7818 */  [ 0.295954061, 19 ],
+  /* 7819 */  [ 0.296004536, 19 ],
+  /* 7820 */  [ 0.296055013, 19 ],
+  /* 7821 */  [ 0.296105493, 19 ],
+  /* 7822 */  [ 0.296155974, 19 ],
+  /* 7823 */  [ 0.296206458, 19 ],
+
+  /* 7824 */  [ 0.296256944, 19 ],
+  /* 7825 */  [ 0.296307432, 19 ],
+  /* 7826 */  [ 0.296357922, 19 ],
+  /* 7827 */  [ 0.296408414, 19 ],
+  /* 7828 */  [ 0.296458908, 19 ],
+  /* 7829 */  [ 0.296509405, 19 ],
+  /* 7830 */  [ 0.296559904, 19 ],
+  /* 7831 */  [ 0.296610404, 19 ],
+  /* 7832 */  [ 0.296660907, 19 ],
+  /* 7833 */  [ 0.296711413, 19 ],
+  /* 7834 */  [ 0.296761920, 19 ],
+  /* 7835 */  [ 0.296812429, 19 ],
+  /* 7836 */  [ 0.296862941, 19 ],
+  /* 7837 */  [ 0.296913455, 19 ],
+  /* 7838 */  [ 0.296963971, 19 ],
+  /* 7839 */  [ 0.297014489, 19 ],
+
+  /* 7840 */  [ 0.297065009, 19 ],
+  /* 7841 */  [ 0.297115531, 19 ],
+  /* 7842 */  [ 0.297166056, 19 ],
+  /* 7843 */  [ 0.297216582, 19 ],
+  /* 7844 */  [ 0.297267111, 19 ],
+  /* 7845 */  [ 0.297317642, 19 ],
+  /* 7846 */  [ 0.297368175, 19 ],
+  /* 7847 */  [ 0.297418710, 19 ],
+  /* 7848 */  [ 0.297469248, 19 ],
+  /* 7849 */  [ 0.297519787, 19 ],
+  /* 7850 */  [ 0.297570329, 19 ],
+  /* 7851 */  [ 0.297620873, 19 ],
+  /* 7852 */  [ 0.297671418, 19 ],
+  /* 7853 */  [ 0.297721967, 19 ],
+  /* 7854 */  [ 0.297772517, 19 ],
+  /* 7855 */  [ 0.297823069, 19 ],
+
+  /* 7856 */  [ 0.297873624, 19 ],
+  /* 7857 */  [ 0.297924180, 19 ],
+  /* 7858 */  [ 0.297974739, 19 ],
+  /* 7859 */  [ 0.298025300, 19 ],
+  /* 7860 */  [ 0.298075863, 19 ],
+  /* 7861 */  [ 0.298126429, 19 ],
+  /* 7862 */  [ 0.298176996, 19 ],
+  /* 7863 */  [ 0.298227565, 19 ],
+  /* 7864 */  [ 0.298278137, 19 ],
+  /* 7865 */  [ 0.298328711, 19 ],
+  /* 7866 */  [ 0.298379287, 19 ],
+  /* 7867 */  [ 0.298429865, 19 ],
+  /* 7868 */  [ 0.298480445, 19 ],
+  /* 7869 */  [ 0.298531028, 19 ],
+  /* 7870 */  [ 0.298581612, 19 ],
+  /* 7871 */  [ 0.298632199, 19 ],
+
+  /* 7872 */  [ 0.298682788, 19 ],
+  /* 7873 */  [ 0.298733379, 19 ],
+  /* 7874 */  [ 0.298783972, 19 ],
+  /* 7875 */  [ 0.298834567, 19 ],
+  /* 7876 */  [ 0.298885165, 19 ],
+  /* 7877 */  [ 0.298935764, 19 ],
+  /* 7878 */  [ 0.298986366, 19 ],
+  /* 7879 */  [ 0.299036970, 19 ],
+  /* 7880 */  [ 0.299087576, 19 ],
+  /* 7881 */  [ 0.299138184, 19 ],
+  /* 7882 */  [ 0.299188794, 19 ],
+  /* 7883 */  [ 0.299239406, 19 ],
+  /* 7884 */  [ 0.299290021, 19 ],
+  /* 7885 */  [ 0.299340638, 19 ],
+  /* 7886 */  [ 0.299391256, 19 ],
+  /* 7887 */  [ 0.299441877, 19 ],
+
+  /* 7888 */  [ 0.299492500, 19 ],
+  /* 7889 */  [ 0.299543126, 19 ],
+  /* 7890 */  [ 0.299593753, 19 ],
+  /* 7891 */  [ 0.299644382, 19 ],
+  /* 7892 */  [ 0.299695014, 19 ],
+  /* 7893 */  [ 0.299745648, 19 ],
+  /* 7894 */  [ 0.299796284, 19 ],
+  /* 7895 */  [ 0.299846922, 19 ],
+  /* 7896 */  [ 0.299897562, 19 ],
+  /* 7897 */  [ 0.299948204, 19 ],
+  /* 7898 */  [ 0.299998849, 19 ],
+  /* 7899 */  [ 0.300049495, 19 ],
+  /* 7900 */  [ 0.300100144, 19 ],
+  /* 7901 */  [ 0.300150795, 19 ],
+  /* 7902 */  [ 0.300201448, 19 ],
+  /* 7903 */  [ 0.300252103, 19 ],
+
+  /* 7904 */  [ 0.300302761, 19 ],
+  /* 7905 */  [ 0.300353420, 19 ],
+  /* 7906 */  [ 0.300404082, 19 ],
+  /* 7907 */  [ 0.300454745, 19 ],
+  /* 7908 */  [ 0.300505411, 19 ],
+  /* 7909 */  [ 0.300556079, 19 ],
+  /* 7910 */  [ 0.300606749, 19 ],
+  /* 7911 */  [ 0.300657421, 19 ],
+  /* 7912 */  [ 0.300708096, 19 ],
+  /* 7913 */  [ 0.300758772, 19 ],
+  /* 7914 */  [ 0.300809451, 19 ],
+  /* 7915 */  [ 0.300860132, 19 ],
+  /* 7916 */  [ 0.300910815, 19 ],
+  /* 7917 */  [ 0.300961500, 19 ],
+  /* 7918 */  [ 0.301012187, 19 ],
+  /* 7919 */  [ 0.301062876, 19 ],
+
+  /* 7920 */  [ 0.301113568, 19 ],
+  /* 7921 */  [ 0.301164261, 19 ],
+  /* 7922 */  [ 0.301214957, 19 ],
+  /* 7923 */  [ 0.301265655, 19 ],
+  /* 7924 */  [ 0.301316355, 19 ],
+  /* 7925 */  [ 0.301367057, 19 ],
+  /* 7926 */  [ 0.301417761, 19 ],
+  /* 7927 */  [ 0.301468468, 19 ],
+  /* 7928 */  [ 0.301519176, 19 ],
+  /* 7929 */  [ 0.301569887, 19 ],
+  /* 7930 */  [ 0.301620599, 19 ],
+  /* 7931 */  [ 0.301671314, 19 ],
+  /* 7932 */  [ 0.301722031, 19 ],
+  /* 7933 */  [ 0.301772751, 19 ],
+  /* 7934 */  [ 0.301823472, 19 ],
+  /* 7935 */  [ 0.301874195, 19 ],
+
+  /* 7936 */  [ 0.301924921, 19 ],
+  /* 7937 */  [ 0.301975649, 19 ],
+  /* 7938 */  [ 0.302026378, 19 ],
+  /* 7939 */  [ 0.302077110, 19 ],
+  /* 7940 */  [ 0.302127845, 19 ],
+  /* 7941 */  [ 0.302178581, 19 ],
+  /* 7942 */  [ 0.302229319, 19 ],
+  /* 7943 */  [ 0.302280060, 19 ],
+  /* 7944 */  [ 0.302330802, 19 ],
+  /* 7945 */  [ 0.302381547, 19 ],
+  /* 7946 */  [ 0.302432294, 19 ],
+  /* 7947 */  [ 0.302483043, 19 ],
+  /* 7948 */  [ 0.302533794, 19 ],
+  /* 7949 */  [ 0.302584547, 19 ],
+  /* 7950 */  [ 0.302635303, 19 ],
+  /* 7951 */  [ 0.302686060, 19 ],
+
+  /* 7952 */  [ 0.302736820, 19 ],
+  /* 7953 */  [ 0.302787581, 19 ],
+  /* 7954 */  [ 0.302838345, 19 ],
+  /* 7955 */  [ 0.302889111, 19 ],
+  /* 7956 */  [ 0.302939879, 19 ],
+  /* 7957 */  [ 0.302990650, 19 ],
+  /* 7958 */  [ 0.303041422, 19 ],
+  /* 7959 */  [ 0.303092197, 19 ],
+  /* 7960 */  [ 0.303142973, 19 ],
+  /* 7961 */  [ 0.303193752, 19 ],
+  /* 7962 */  [ 0.303244533, 19 ],
+  /* 7963 */  [ 0.303295316, 19 ],
+  /* 7964 */  [ 0.303346101, 19 ],
+  /* 7965 */  [ 0.303396889, 19 ],
+  /* 7966 */  [ 0.303447678, 19 ],
+  /* 7967 */  [ 0.303498469, 19 ],
+
+  /* 7968 */  [ 0.303549263, 19 ],
+  /* 7969 */  [ 0.303600059, 19 ],
+  /* 7970 */  [ 0.303650857, 19 ],
+  /* 7971 */  [ 0.303701657, 19 ],
+  /* 7972 */  [ 0.303752459, 19 ],
+  /* 7973 */  [ 0.303803263, 19 ],
+  /* 7974 */  [ 0.303854070, 19 ],
+  /* 7975 */  [ 0.303904878, 19 ],
+  /* 7976 */  [ 0.303955689, 19 ],
+  /* 7977 */  [ 0.304006502, 19 ],
+  /* 7978 */  [ 0.304057317, 19 ],
+  /* 7979 */  [ 0.304108134, 19 ],
+  /* 7980 */  [ 0.304158953, 19 ],
+  /* 7981 */  [ 0.304209774, 19 ],
+  /* 7982 */  [ 0.304260597, 19 ],
+  /* 7983 */  [ 0.304311423, 19 ],
+
+  /* 7984 */  [ 0.304362251, 19 ],
+  /* 7985 */  [ 0.304413080, 19 ],
+  /* 7986 */  [ 0.304463912, 19 ],
+  /* 7987 */  [ 0.304514746, 19 ],
+  /* 7988 */  [ 0.304565582, 19 ],
+  /* 7989 */  [ 0.304616421, 19 ],
+  /* 7990 */  [ 0.304667261, 19 ],
+  /* 7991 */  [ 0.304718103, 19 ],
+  /* 7992 */  [ 0.304768948, 19 ],
+  /* 7993 */  [ 0.304819795, 19 ],
+  /* 7994 */  [ 0.304870644, 19 ],
+  /* 7995 */  [ 0.304921495, 19 ],
+  /* 7996 */  [ 0.304972348, 19 ],
+  /* 7997 */  [ 0.305023203, 19 ],
+  /* 7998 */  [ 0.305074060, 19 ],
+  /* 7999 */  [ 0.305124920, 19 ],
+
+  /* 8000 */  [ 0.305175781, 19 ],
+  /* 8001 */  [ 0.305226645, 19 ],
+  /* 8002 */  [ 0.305277511, 19 ],
+  /* 8003 */  [ 0.305328379, 19 ],
+  /* 8004 */  [ 0.305379249, 19 ],
+  /* 8005 */  [ 0.305430121, 19 ],
+  /* 8006 */  [ 0.305480995, 19 ],
+  /* 8007 */  [ 0.305531872, 19 ],
+  /* 8008 */  [ 0.305582750, 19 ],
+  /* 8009 */  [ 0.305633631, 19 ],
+  /* 8010 */  [ 0.305684513, 19 ],
+  /* 8011 */  [ 0.305735398, 19 ],
+  /* 8012 */  [ 0.305786285, 19 ],
+  /* 8013 */  [ 0.305837174, 19 ],
+  /* 8014 */  [ 0.305888066, 19 ],
+  /* 8015 */  [ 0.305938959, 19 ],
+
+  /* 8016 */  [ 0.305989854, 19 ],
+  /* 8017 */  [ 0.306040752, 19 ],
+  /* 8018 */  [ 0.306091652, 19 ],
+  /* 8019 */  [ 0.306142554, 19 ],
+  /* 8020 */  [ 0.306193457, 19 ],
+  /* 8021 */  [ 0.306244364, 19 ],
+  /* 8022 */  [ 0.306295272, 19 ],
+  /* 8023 */  [ 0.306346182, 19 ],
+  /* 8024 */  [ 0.306397094, 19 ],
+  /* 8025 */  [ 0.306448009, 19 ],
+  /* 8026 */  [ 0.306498925, 19 ],
+  /* 8027 */  [ 0.306549844, 19 ],
+  /* 8028 */  [ 0.306600765, 19 ],
+  /* 8029 */  [ 0.306651688, 19 ],
+  /* 8030 */  [ 0.306702613, 19 ],
+  /* 8031 */  [ 0.306753540, 19 ],
+
+  /* 8032 */  [ 0.306804470, 19 ],
+  /* 8033 */  [ 0.306855401, 19 ],
+  /* 8034 */  [ 0.306906334, 19 ],
+  /* 8035 */  [ 0.306957270, 19 ],
+  /* 8036 */  [ 0.307008208, 19 ],
+  /* 8037 */  [ 0.307059148, 19 ],
+  /* 8038 */  [ 0.307110090, 19 ],
+  /* 8039 */  [ 0.307161034, 19 ],
+  /* 8040 */  [ 0.307211980, 19 ],
+  /* 8041 */  [ 0.307262928, 19 ],
+  /* 8042 */  [ 0.307313879, 19 ],
+  /* 8043 */  [ 0.307364831, 19 ],
+  /* 8044 */  [ 0.307415786, 19 ],
+  /* 8045 */  [ 0.307466743, 19 ],
+  /* 8046 */  [ 0.307517702, 19 ],
+  /* 8047 */  [ 0.307568663, 19 ],
+
+  /* 8048 */  [ 0.307619626, 19 ],
+  /* 8049 */  [ 0.307670591, 19 ],
+  /* 8050 */  [ 0.307721558, 19 ],
+  /* 8051 */  [ 0.307772528, 19 ],
+  /* 8052 */  [ 0.307823499, 19 ],
+  /* 8053 */  [ 0.307874473, 19 ],
+  /* 8054 */  [ 0.307925449, 19 ],
+  /* 8055 */  [ 0.307976426, 19 ],
+  /* 8056 */  [ 0.308027406, 19 ],
+  /* 8057 */  [ 0.308078389, 19 ],
+  /* 8058 */  [ 0.308129373, 19 ],
+  /* 8059 */  [ 0.308180359, 19 ],
+  /* 8060 */  [ 0.308231347, 19 ],
+  /* 8061 */  [ 0.308282338, 19 ],
+  /* 8062 */  [ 0.308333331, 19 ],
+  /* 8063 */  [ 0.308384325, 19 ],
+
+  /* 8064 */  [ 0.308435322, 19 ],
+  /* 8065 */  [ 0.308486321, 19 ],
+  /* 8066 */  [ 0.308537322, 19 ],
+  /* 8067 */  [ 0.308588325, 19 ],
+  /* 8068 */  [ 0.308639331, 19 ],
+  /* 8069 */  [ 0.308690338, 19 ],
+  /* 8070 */  [ 0.308741348, 19 ],
+  /* 8071 */  [ 0.308792359, 19 ],
+  /* 8072 */  [ 0.308843373, 19 ],
+  /* 8073 */  [ 0.308894389, 19 ],
+  /* 8074 */  [ 0.308945407, 19 ],
+  /* 8075 */  [ 0.308996427, 19 ],
+  /* 8076 */  [ 0.309047449, 19 ],
+  /* 8077 */  [ 0.309098473, 19 ],
+  /* 8078 */  [ 0.309149499, 19 ],
+  /* 8079 */  [ 0.309200528, 19 ],
+
+  /* 8080 */  [ 0.309251558, 19 ],
+  /* 8081 */  [ 0.309302591, 19 ],
+  /* 8082 */  [ 0.309353626, 19 ],
+  /* 8083 */  [ 0.309404663, 19 ],
+  /* 8084 */  [ 0.309455702, 19 ],
+  /* 8085 */  [ 0.309506743, 19 ],
+  /* 8086 */  [ 0.309557786, 19 ],
+  /* 8087 */  [ 0.309608831, 19 ],
+  /* 8088 */  [ 0.309659879, 19 ],
+  /* 8089 */  [ 0.309710928, 19 ],
+  /* 8090 */  [ 0.309761980, 19 ],
+  /* 8091 */  [ 0.309813033, 19 ],
+  /* 8092 */  [ 0.309864089, 19 ],
+  /* 8093 */  [ 0.309915147, 19 ],
+  /* 8094 */  [ 0.309966207, 19 ],
+  /* 8095 */  [ 0.310017269, 19 ],
+
+  /* 8096 */  [ 0.310068333, 19 ],
+  /* 8097 */  [ 0.310119400, 19 ],
+  /* 8098 */  [ 0.310170468, 19 ],
+  /* 8099 */  [ 0.310221539, 19 ],
+  /* 8100 */  [ 0.310272611, 19 ],
+  /* 8101 */  [ 0.310323686, 19 ],
+  /* 8102 */  [ 0.310374763, 19 ],
+  /* 8103 */  [ 0.310425842, 19 ],
+  /* 8104 */  [ 0.310476923, 19 ],
+  /* 8105 */  [ 0.310528006, 19 ],
+  /* 8106 */  [ 0.310579091, 19 ],
+  /* 8107 */  [ 0.310630179, 19 ],
+  /* 8108 */  [ 0.310681268, 19 ],
+  /* 8109 */  [ 0.310732360, 19 ],
+  /* 8110 */  [ 0.310783453, 19 ],
+  /* 8111 */  [ 0.310834549, 19 ],
+
+  /* 8112 */  [ 0.310885647, 19 ],
+  /* 8113 */  [ 0.310936747, 19 ],
+  /* 8114 */  [ 0.310987849, 19 ],
+  /* 8115 */  [ 0.311038953, 19 ],
+  /* 8116 */  [ 0.311090059, 19 ],
+  /* 8117 */  [ 0.311141168, 19 ],
+  /* 8118 */  [ 0.311192278, 19 ],
+  /* 8119 */  [ 0.311243390, 19 ],
+  /* 8120 */  [ 0.311294505, 19 ],
+  /* 8121 */  [ 0.311345622, 19 ],
+  /* 8122 */  [ 0.311396741, 19 ],
+  /* 8123 */  [ 0.311447862, 19 ],
+  /* 8124 */  [ 0.311498985, 19 ],
+  /* 8125 */  [ 0.311550110, 19 ],
+  /* 8126 */  [ 0.311601237, 19 ],
+  /* 8127 */  [ 0.311652366, 19 ],
+
+  /* 8128 */  [ 0.311703498, 19 ],
+  /* 8129 */  [ 0.311754631, 19 ],
+  /* 8130 */  [ 0.311805767, 19 ],
+  /* 8131 */  [ 0.311856905, 19 ],
+  /* 8132 */  [ 0.311908044, 19 ],
+  /* 8133 */  [ 0.311959186, 19 ],
+  /* 8134 */  [ 0.312010330, 19 ],
+  /* 8135 */  [ 0.312061476, 19 ],
+  /* 8136 */  [ 0.312112625, 19 ],
+  /* 8137 */  [ 0.312163775, 19 ],
+  /* 8138 */  [ 0.312214927, 19 ],
+  /* 8139 */  [ 0.312266082, 19 ],
+  /* 8140 */  [ 0.312317238, 19 ],
+  /* 8141 */  [ 0.312368397, 19 ],
+  /* 8142 */  [ 0.312419558, 19 ],
+  /* 8143 */  [ 0.312470720, 19 ],
+
+  /* 8144 */  [ 0.312521885, 19 ],
+  /* 8145 */  [ 0.312573052, 19 ],
+  /* 8146 */  [ 0.312624222, 19 ],
+  /* 8147 */  [ 0.312675393, 19 ],
+  /* 8148 */  [ 0.312726566, 19 ],
+  /* 8149 */  [ 0.312777742, 19 ],
+  /* 8150 */  [ 0.312828919, 19 ],
+  /* 8151 */  [ 0.312880099, 19 ],
+  /* 8152 */  [ 0.312931280, 19 ],
+  /* 8153 */  [ 0.312982464, 19 ],
+  /* 8154 */  [ 0.313033650, 19 ],
+  /* 8155 */  [ 0.313084838, 19 ],
+  /* 8156 */  [ 0.313136028, 19 ],
+  /* 8157 */  [ 0.313187220, 19 ],
+  /* 8158 */  [ 0.313238414, 19 ],
+  /* 8159 */  [ 0.313289611, 19 ],
+
+  /* 8160 */  [ 0.313340809, 19 ],
+  /* 8161 */  [ 0.313392010, 19 ],
+  /* 8162 */  [ 0.313443212, 19 ],
+  /* 8163 */  [ 0.313494417, 19 ],
+  /* 8164 */  [ 0.313545624, 19 ],
+  /* 8165 */  [ 0.313596833, 19 ],
+  /* 8166 */  [ 0.313648044, 19 ],
+  /* 8167 */  [ 0.313699257, 19 ],
+  /* 8168 */  [ 0.313750472, 19 ],
+  /* 8169 */  [ 0.313801689, 19 ],
+  /* 8170 */  [ 0.313852909, 19 ],
+  /* 8171 */  [ 0.313904130, 19 ],
+  /* 8172 */  [ 0.313955354, 19 ],
+  /* 8173 */  [ 0.314006579, 19 ],
+  /* 8174 */  [ 0.314057807, 19 ],
+  /* 8175 */  [ 0.314109037, 19 ],
+
+  /* 8176 */  [ 0.314160269, 19 ],
+  /* 8177 */  [ 0.314211502, 19 ],
+  /* 8178 */  [ 0.314262739, 19 ],
+  /* 8179 */  [ 0.314313977, 19 ],
+  /* 8180 */  [ 0.314365217, 19 ],
+  /* 8181 */  [ 0.314416459, 19 ],
+  /* 8182 */  [ 0.314467704, 19 ],
+  /* 8183 */  [ 0.314518950, 19 ],
+  /* 8184 */  [ 0.314570199, 19 ],
+  /* 8185 */  [ 0.314621449, 19 ],
+  /* 8186 */  [ 0.314672702, 19 ],
+  /* 8187 */  [ 0.314723957, 19 ],
+  /* 8188 */  [ 0.314775214, 19 ],
+  /* 8189 */  [ 0.314826473, 19 ],
+  /* 8190 */  [ 0.314877734, 19 ],
+  /* 8191 */  [ 0.314928997, 19 ],
+
+  /* 8192 */  [ 0.314980262, 19 ],
+  /* 8193 */  [ 0.315031530, 19 ],
+  /* 8194 */  [ 0.315082799, 19 ],
+  /* 8195 */  [ 0.315134071, 19 ],
+  /* 8196 */  [ 0.315185344, 19 ],
+  /* 8197 */  [ 0.315236620, 19 ],
+  /* 8198 */  [ 0.315287898, 19 ],
+  /* 8199 */  [ 0.315339178, 19 ],
+  /* 8200 */  [ 0.315390460, 19 ],
+  /* 8201 */  [ 0.315441744, 19 ],
+  /* 8202 */  [ 0.315493030, 19 ],
+  /* 8203 */  [ 0.315544318, 19 ],
+  /* 8204 */  [ 0.315595608, 19 ],
+  /* 8205 */  [ 0.315646901, 19 ],
+  /* 8206 */  [ 0.315698195, 19 ]
+];
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/stream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/stream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/stream.js	(revision 28388)
@@ -0,0 +1,112 @@
+
+Mad.Error = {
+  NONE           : 0x0000,      /* no error */
+
+  BUFLEN         : 0x0001,      /* input buffer too small (or EOF) */
+  BUFPTR         : 0x0002,      /* invalid (null) buffer pointer */
+
+  NOMEM          : 0x0031,      /* not enough memory */
+
+  LOSTSYNC       : 0x0101,      /* lost synchronization */
+  BADLAYER       : 0x0102,      /* reserved header layer value */
+  BADBITRATE     : 0x0103,      /* forbidden bitrate value */
+  BADSAMPLERATE  : 0x0104,      /* reserved sample frequency value */
+  BADEMPHASIS    : 0x0105,      /* reserved emphasis value */
+
+  BADCRC         : 0x0201,      /* CRC check failed */
+  BADBITALLOC    : 0x0211,      /* forbidden bit allocation value */
+  BADSCALEFACTOR : 0x0221,      /* bad scalefactor index */
+  BADMODE        : 0x0222,      /* bad bitrate/mode combination */
+  BADFRAMELEN    : 0x0231,      /* bad frame length */
+  BADBIGVALUES   : 0x0232,      /* bad big_values count */
+  BADBLOCKTYPE   : 0x0233,      /* reserved block_type */
+  BADSCFSI       : 0x0234,      /* bad scalefactor selection info */
+  BADDATAPTR     : 0x0235,      /* bad main_data_begin pointer */
+  BADPART3LEN    : 0x0236,      /* bad audio data length */
+  BADHUFFTABLE   : 0x0237,      /* bad Huffman table select */
+  BADHUFFDATA    : 0x0238,      /* Huffman data overrun */
+  BADSTEREO      : 0x0239       /* incompatible block_type for JS */
+};
+
+Mad.BUFFER_GUARD = 8;
+Mad.BUFFER_MDLEN = (511 + 2048 + Mad.BUFFER_GUARD);
+
+Mad.Stream = function (stream) {
+    this.stream = stream;                           /* actual buffer (js doesn't have pointers!) */
+    this.buffer = 0;                                /* input bitstream buffer */
+    this.bufend = stream.length;                    /* input bitstream buffer */
+    this.skiplen = 0;                               /* bytes to skip before next frame */
+
+    this.sync = 0;                                  /* stream sync found */
+    this.freerate = 0;                              /* free bitrate (fixed) */
+
+    this.this_frame = 0;                            /* start of current frame */
+    this.next_frame = 0;                            /* start of next frame */
+    
+    this.ptr = new Mad.Bit(this.stream, this.buffer); /* current processing bit pointer */
+    
+    this.anc_ptr = /* MadBit */ null;               /* ancillary bits pointer */
+    this.anc_bitlen = 0;                            /* number of ancillary bits */
+
+    this.main_data = /* string */ Mad.Storage.newBuffer(Mad.BUFFER_MDLEN); /* Layer III main_data() */
+    this.md_len = 0; /* bytes in main_data */
+
+    var options = 0;                                /* decoding options (see below) */
+    var error = Mad.Error.NONE;                     /* error code (see above) */
+};
+
+Mad.Stream.fromFile = function(file, callback) {
+    var reader = new FileReader();
+    reader.onloadend = function (evt) {
+        callback(new Mad.Stream(evt.target.result));
+    };
+    reader.readAsBinaryString(file);
+};
+
+Mad.Stream.prototype.readShort = function(bBigEndian) {
+    return this.stream.readU16(bBigEndian);
+};
+    
+Mad.Stream.prototype.readSShort = function(bBigEndian) {
+    return this.stream.readI16(bBigEndian);
+};
+
+Mad.Stream.prototype.getU8 = function(index) {
+    return this.stream.getU8(index);
+};
+
+
+Mad.Stream.prototype.readU8 = function() {
+    return this.stream.readU8(index);
+};
+
+Mad.Stream.prototype.readChars = function(length) {
+    return this.stream.read(length);
+};
+
+Mad.Stream.prototype.peekChars = function(length) {
+    return this.stream.peek(length);
+}
+
+/*
+ * NAME:        stream->sync()
+ * DESCRIPTION: locate the next stream sync word
+ */
+Mad.Stream.prototype.doSync = function() {
+    var ptr = this.ptr.nextbyte();
+    var end = this.bufend;
+
+    while (ptr < end - 1 && !(this.getU8(ptr) === 0xff && (this.getU8(ptr + 1) & 0xe0) === 0xe0)) {
+        ++ptr;
+    }
+
+    if (end - ptr < Mad.BUFFER_GUARD) {
+        return -1;
+    }
+
+    this.ptr = new Mad.Bit(this.stream, ptr);
+    
+    return 0;
+}
+
+
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/synth.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/synth.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/src/synth.js	(revision 28388)
@@ -0,0 +1,1311 @@
+/*
+ * NAME:    synth.init()
+ * DESCRIPTION: initialize synth struct
+ */
+Mad.Synth = function () {
+    this.filter = [];
+    this.mute();
+    this.phase = 0;
+    
+    this.pcm = {
+        samplerate: 0,
+        channels: 0,
+        length: 0,
+        samples: [
+            // new Float64Array(new ArrayBuffer(8 * 1152)),
+            // new Float64Array(new ArrayBuffer(8 * 1152))
+            [],
+            []
+        ]
+    };
+    
+    // this.pcm.clone = function() {
+    //     var copy = {};
+    //     copy.samplerate = this.samplerate;
+    //     copy.channels = this.channels;
+    //     copy.length = this.length;
+    //     copy.samples = [
+    //         // new Float64Array(new ArrayBuffer(8 * 1152)),
+    //         // new Float64Array(new ArrayBuffer(8 * 1152))
+    //         [],
+    //         []
+    //     ];
+    //     copy.samples[0].set(this.samples[0]);
+    //     copy.samples[1].set(this.samples[1]);
+    //     return copy;
+    // }; 
+}
+
+/*
+ * NAME:    synth.mute()
+ * DESCRIPTION: zero all polyphase filterbank values, resetting synthesis
+ */
+Mad.Synth.prototype.mute = function () {
+    for (var ch = 0; ch < 2; ++ch) {
+        this.filter[ch] = [ [ [], [] ], [ [], [] ] ];
+        
+        for (var s = 0; s < 16; ++s) {
+            this.filter[ch][0][0][s] = [];
+            this.filter[ch][0][1][s] = [];
+            this.filter[ch][1][0][s] = [];
+            this.filter[ch][1][1][s] = [];
+            
+            for (var v = 0; v < 8; ++v) {
+                this.filter[ch][0][0][s][v] = 0;
+                this.filter[ch][0][1][s][v] = 0;
+                this.filter[ch][1][0][s][v] = 0;
+                this.filter[ch][1][1][s][v] = 0;
+            }
+        }
+    }
+};
+
+/* costab[i] = cos(PI / (2 * 32) * i) */
+var costab1  =  0.998795456;
+var costab2  =  0.995184727;
+var costab3  =  0.989176510;
+var costab4  =  0.980785280;
+var costab5  =  0.970031253;
+var costab6  =  0.956940336;
+var costab7  =  0.941544065;
+var costab8  =  0.923879533;
+var costab9  =  0.903989293;
+var costab10 =  0.881921264;
+var costab11 =  0.857728610;
+var costab12 =  0.831469612;
+var costab13 =  0.803207531;
+var costab14 =  0.773010453;
+var costab15 =  0.740951125;
+var costab16 =  0.707106781;
+var costab17 =  0.671558955;
+var costab18 =  0.634393284;
+var costab19 =  0.595699304;
+var costab20 =  0.555570233;
+var costab21 =  0.514102744;
+var costab22 =  0.471396737;
+var costab23 =  0.427555093;
+var costab24 =  0.382683432;
+var costab25 =  0.336889853;
+var costab26 =  0.290284677;
+var costab27 =  0.242980180;
+var costab28 =  0.195090322;
+var costab29 =  0.146730474;
+var costab30 =  0.098017140;
+var costab31 =  0.049067674;
+
+/*
+ * NAME:    dct32()
+ * DESCRIPTION: perform fast in[32].out[32] DCT
+ */
+Mad.Synth.dct32 = function (_in /* [32] */, slot, lo /* [16][8] */, hi /* [16][8] */) {
+    var t0,   t1,   t2,   t3,   t4,   t5,   t6,   t7;
+    var t8,   t9,   t10,  t11,  t12,  t13,  t14,  t15;
+    var t16,  t17,  t18,  t19,  t20,  t21,  t22,  t23;
+    var t24,  t25,  t26,  t27,  t28,  t29,  t30,  t31;
+    var t32,  t33,  t34,  t35,  t36,  t37,  t38,  t39;
+    var t40,  t41,  t42,  t43,  t44,  t45,  t46,  t47;
+    var t48,  t49,  t50,  t51,  t52,  t53,  t54,  t55;
+    var t56,  t57,  t58,  t59,  t60,  t61,  t62,  t63;
+    var t64,  t65,  t66,  t67,  t68,  t69,  t70,  t71;
+    var t72,  t73,  t74,  t75,  t76,  t77,  t78,  t79;
+    var t80,  t81,  t82,  t83,  t84,  t85,  t86,  t87;
+    var t88,  t89,  t90,  t91,  t92,  t93,  t94,  t95;
+    var t96,  t97,  t98,  t99,  t100, t101, t102, t103;
+    var t104, t105, t106, t107, t108, t109, t110, t111;
+    var t112, t113, t114, t115, t116, t117, t118, t119;
+    var t120, t121, t122, t123, t124, t125, t126, t127;
+    var t128, t129, t130, t131, t132, t133, t134, t135;
+    var t136, t137, t138, t139, t140, t141, t142, t143;
+    var t144, t145, t146, t147, t148, t149, t150, t151;
+    var t152, t153, t154, t155, t156, t157, t158, t159;
+    var t160, t161, t162, t163, t164, t165, t166, t167;
+    var t168, t169, t170, t171, t172, t173, t174, t175;
+    var t176;
+
+
+    // var sys = require('sys');
+    // for (i = 0; i < 32; i++) {
+    //     sys.print(_in[i].toFixed(8) + "\t");
+    //     if (i % 8 === 7) sys.print("\n");
+    // }
+
+    t0   = _in[0]  + _in[31];  t16  = ((_in[0]  - _in[31]) * (costab1));
+    t1   = _in[15] + _in[16];  t17  = ((_in[15] - _in[16]) * (costab31));
+
+    t41  = t16 + t17;
+    t59  = ((t16 - t17) * (costab2));
+    t33  = t0  + t1;
+    t50  = ((t0  - t1) * ( costab2));
+
+    t2   = _in[7]  + _in[24];  t18  = ((_in[7]  - _in[24]) * (costab15));
+    t3   = _in[8]  + _in[23];  t19  = ((_in[8]  - _in[23]) * (costab17));
+
+    t42  = t18 + t19;
+    t60  = ((t18 - t19) * (costab30));
+    t34  = t2  + t3;
+    t51  = ((t2  - t3) * ( costab30));
+
+    t4   = _in[3]  + _in[28];  t20  = ((_in[3]  - _in[28]) * (costab7));
+    t5   = _in[12] + _in[19];  t21  = ((_in[12] - _in[19]) * (costab25));
+
+    t43  = t20 + t21;
+    t61  = ((t20 - t21) * (costab14));
+    t35  = t4  + t5;
+    t52  = ((t4  - t5) * ( costab14));
+
+    t6   = _in[4]  + _in[27];  t22  = ((_in[4]  - _in[27]) * (costab9));
+    t7   = _in[11] + _in[20];  t23  = ((_in[11] - _in[20]) * (costab23));
+
+    t44  = t22 + t23;
+    t62  = ((t22 - t23) * (costab18));
+    t36  = t6  + t7;
+    t53  = ((t6  - t7) * ( costab18));
+
+    t8   = _in[1]  + _in[30];  t24  = ((_in[1]  - _in[30]) * (costab3));
+    t9   = _in[14] + _in[17];  t25  = ((_in[14] - _in[17]) * (costab29));
+
+    t45  = t24 + t25;
+    t63  = ((t24 - t25) * (costab6));
+    t37  = t8  + t9;
+    t54  = ((t8  - t9) * ( costab6));
+
+    t10  = _in[6]  + _in[25];  t26  = ((_in[6]  - _in[25]) * (costab13));
+    t11  = _in[9]  + _in[22];  t27  = ((_in[9]  - _in[22]) * (costab19));
+
+    t46  = t26 + t27;
+    t64  = ((t26 - t27) * (costab26));
+    t38  = t10 + t11;
+    t55  = ((t10 - t11) * (costab26));
+
+    t12  = _in[2]  + _in[29];  t28  = ((_in[2]  - _in[29]) * (costab5));
+    t13  = _in[13] + _in[18];  t29  = ((_in[13] - _in[18]) * (costab27));
+
+    t47  = t28 + t29;
+    t65  = ((t28 - t29) * (costab10));
+    t39  = t12 + t13;
+    t56  = ((t12 - t13) * (costab10));
+
+    t14  = _in[5]  + _in[26];  t30  = ((_in[5]  - _in[26]) * (costab11));
+    t15  = _in[10] + _in[21];  t31  = ((_in[10] - _in[21]) * (costab21));
+
+    t48  = t30 + t31;
+    t66  = ((t30 - t31) * (costab22));
+    t40  = t14 + t15;
+    t57  = ((t14 - t15) * (costab22));
+
+    t69  = t33 + t34;  t89  = ((t33 - t34) * (costab4));
+    t70  = t35 + t36;  t90  = ((t35 - t36) * (costab28));
+    t71  = t37 + t38;  t91  = ((t37 - t38) * (costab12));
+    t72  = t39 + t40;  t92  = ((t39 - t40) * (costab20));
+    t73  = t41 + t42;  t94  = ((t41 - t42) * (costab4));
+    t74  = t43 + t44;  t95  = ((t43 - t44) * (costab28));
+    t75  = t45 + t46;  t96  = ((t45 - t46) * (costab12));
+    t76  = t47 + t48;  t97  = ((t47 - t48) * (costab20));
+
+    t78  = t50 + t51;  t100 = ((t50 - t51) * (costab4));
+    t79  = t52 + t53;  t101 = ((t52 - t53) * (costab28));
+    t80  = t54 + t55;  t102 = ((t54 - t55) * (costab12));
+    t81  = t56 + t57;  t103 = ((t56 - t57) * (costab20));
+
+    t83  = t59 + t60;  t106 = ((t59 - t60) * (costab4));
+    t84  = t61 + t62;  t107 = ((t61 - t62) * (costab28));
+    t85  = t63 + t64;  t108 = ((t63 - t64) * (costab12));
+    t86  = t65 + t66;  t109 = ((t65 - t66) * (costab20));
+
+    t113 = t69  + t70;
+    t114 = t71  + t72;
+
+    /*  0 */ hi[15][slot] = t113 + t114;
+    /* 16 */ lo[ 0][slot] = ((t113 - t114) * (costab16));
+
+    t115 = t73  + t74;
+    t116 = t75  + t76;
+
+    t32  = t115 + t116;
+
+    /*  1 */ hi[14][slot] = t32;
+
+    t118 = t78  + t79;
+    t119 = t80  + t81;
+
+    t58  = t118 + t119;
+
+    /*  2 */ hi[13][slot] = t58;
+
+    t121 = t83  + t84;
+    t122 = t85  + t86;
+
+    t67  = t121 + t122;
+
+    t49  = (t67 * 2) - t32;
+
+    /*  3 */ hi[12][slot] = t49;
+
+    t125 = t89  + t90;
+    t126 = t91  + t92;
+
+    t93  = t125 + t126;
+
+    /*  4 */ hi[11][slot] = t93;
+
+    t128 = t94  + t95;
+    t129 = t96  + t97;
+
+    t98  = t128 + t129;
+
+    t68  = (t98 * 2) - t49;
+
+    /*  5 */ hi[10][slot] = t68;
+
+    t132 = t100 + t101;
+    t133 = t102 + t103;
+
+    t104 = t132 + t133;
+
+    t82  = (t104 * 2) - t58;
+
+    /*  6 */ hi[ 9][slot] = t82;
+
+    t136 = t106 + t107;
+    t137 = t108 + t109;
+
+    t110 = t136 + t137;
+
+    t87  = (t110 * 2) - t67;
+
+    t77  = (t87 * 2) - t68;
+
+    /*  7 */ hi[ 8][slot] = t77;
+
+    t141 = ((t69 - t70) * (costab8));
+    t142 = ((t71 - t72) * (costab24));
+    t143 = t141 + t142;
+
+    /*  8 */ hi[ 7][slot] = t143;
+    /* 24 */ lo[ 8][slot] =
+        (((t141 - t142) * (costab16) * 2)) - t143;
+
+    t144 = ((t73 - t74) * (costab8));
+    t145 = ((t75 - t76) * (costab24));
+    t146 = t144 + t145;
+
+    t88  = (t146 * 2) - t77;
+
+    /*  9 */ hi[ 6][slot] = t88;
+
+    t148 = ((t78 - t79) * (costab8));
+    t149 = ((t80 - t81) * (costab24));
+    t150 = t148 + t149;
+
+    t105 = (t150 * 2) - t82;
+
+    /* 10 */ hi[ 5][slot] = t105;
+
+    t152 = ((t83 - t84) * (costab8));
+    t153 = ((t85 - t86) * (costab24));
+    t154 = t152 + t153;
+
+    t111 = (t154 * 2) - t87;
+
+    t99  = (t111 * 2) - t88;
+
+    /* 11 */ hi[ 4][slot] = t99;
+
+    t157 = ((t89 - t90) * (costab8));
+    t158 = ((t91 - t92) * (costab24));
+    t159 = t157 + t158;
+
+    t127 = (t159 * 2) - t93;
+
+    /* 12 */ hi[ 3][slot] = t127;
+
+    t160 = (((t125 - t126) * (costab16) * 2)) - t127;
+
+    /* 20 */ lo[ 4][slot] = t160;
+    /* 28 */ lo[12][slot] =
+        (((((t157 - t158) * (costab16) * 2) - t159) * 2)) - t160;
+
+    t161 = ((t94 - t95) * (costab8));
+    t162 = ((t96 - t97) * (costab24));
+    t163 = t161 + t162;
+
+    t130 = (t163 * 2) - t98;
+
+    t112 = (t130 * 2) - t99;
+
+    /* 13 */ hi[ 2][slot] = t112;
+
+    t164 = (((t128 - t129) * (costab16) * 2)) - t130;
+
+    t166 = ((t100 - t101) * (costab8));
+    t167 = ((t102 - t103) * (costab24));
+    t168 = t166 + t167;
+
+    t134 = (t168 * 2) - t104;
+
+    t120 = (t134 * 2) - t105;
+
+    /* 14 */ hi[ 1][slot] = t120;
+
+    t135 = (((t118 - t119) * (costab16) * 2)) - t120;
+
+    /* 18 */ lo[ 2][slot] = t135;
+
+    t169 = (((t132 - t133) * (costab16) * 2)) - t134;
+
+    t151 = (t169 * 2) - t135;
+
+    /* 22 */ lo[ 6][slot] = t151;
+
+    t170 = (((((t148 - t149) * (costab16) * 2) - t150) * 2)) - t151;
+
+    /* 26 */ lo[10][slot] = t170;
+    /* 30 */ lo[14][slot] =
+        (((((((t166 - t167) * (costab16)) * 2 -
+             t168) * 2) - t169) * 2) - t170);
+
+    t171 = ((t106 - t107) * (costab8));
+    t172 = ((t108 - t109) * (costab24));
+    t173 = t171 + t172;
+
+    t138 = (t173 * 2) - t110;
+
+    t123 = (t138 * 2) - t111;
+
+    t139 = (((t121 - t122) * (costab16) * 2)) - t123;
+
+    t117 = (t123 * 2) - t112;
+
+    /* 15 */ hi[ 0][slot] = t117;
+
+    t124 = (((t115 - t116) * (costab16) * 2)) - t117;
+
+    /* 17 */ lo[ 1][slot] = t124;
+
+    t131 = (t139 * 2) - t124;
+
+    /* 19 */ lo[ 3][slot] = t131;
+
+    t140 = (t164 * 2) - t131;
+
+    /* 21 */ lo[ 5][slot] = t140;
+
+    t174 = (((t136 - t137) * (costab16) * 2)) - t138;
+
+    t155 = (t174 * 2) - t139;
+
+    t147 = (t155 * 2) - t140;
+
+    /* 23 */ lo[ 7][slot] = t147;
+
+    t156 = (((((t144 - t145) * (costab16) * 2) - t146) * 2)) - t147;
+
+    /* 25 */ lo[ 9][slot] = t156;
+
+    t175 = (((((t152 - t153) * (costab16) * 2) - t154) * 2)) - t155;
+
+    t165 = (t175 * 2) - t156;
+
+    /* 27 */ lo[11][slot] = t165;
+
+    t176 = (((((((t161 - t162) * (costab16) * 2)) -
+               t163) * 2) - t164) * 2) - t165;
+
+    /* 29 */ lo[13][slot] = t176;
+    /* 31 */ lo[15][slot] =
+        (((((((((t171 - t172) * (costab16)) * 2 -
+               t173) * 2) - t174) * 2) - t175) * 2) - t176);
+
+    /*
+     * Totals:
+     *  80 multiplies
+     *  80 additions
+     * 119 subtractions
+     *  49 shifts (not counting SSO)
+     */
+}
+
+var D /* [17][32] */ = [
+    /*
+     * These are the coefficients for the subband synthesis window. This is a
+     * reordered version of Table B.3 from ISO/IEC 11172-3.
+     */
+    [  0.000000000,   /*  0 */
+       -0.000442505,
+       0.003250122,
+       -0.007003784,
+       0.031082153,
+       -0.078628540,
+       0.100311279,
+       -0.572036743,
+       1.144989014,
+       0.572036743,
+       0.100311279,
+       0.078628540,
+       0.031082153,
+       0.007003784,
+       0.003250122,
+       0.000442505,
+
+       0.000000000,
+       -0.000442505,
+       0.003250122,
+       -0.007003784,
+       0.031082153,
+       -0.078628540,
+       0.100311279,
+       -0.572036743,
+       1.144989014,
+       0.572036743,
+       0.100311279,
+       0.078628540,
+       0.031082153,
+       0.007003784,
+       0.003250122,
+       0.000442505 ],
+
+    [ -0.000015259,   /*  1 */
+      -0.000473022,
+      0.003326416,
+      -0.007919312,
+      0.030517578,
+      -0.084182739,
+      0.090927124,
+      -0.600219727,
+      1.144287109,
+      0.543823242,
+      0.108856201,
+      0.073059082,
+      0.031478882,
+      0.006118774,
+      0.003173828,
+      0.000396729,
+
+      -0.000015259,
+      -0.000473022,
+      0.003326416,
+      -0.007919312,
+      0.030517578,
+      -0.084182739,
+      0.090927124,
+      -0.600219727,
+      1.144287109,
+      0.543823242,
+      0.108856201,
+      0.073059082,
+      0.031478882,
+      0.006118774,
+      0.003173828,
+      0.000396729 ],
+
+    [ -0.000015259,   /*  2 */
+      -0.000534058,
+      0.003387451,
+      -0.008865356,
+      0.029785156,
+      -0.089706421,
+      0.080688477,
+      -0.628295898,
+      1.142211914,
+      0.515609741,
+      0.116577148,
+      0.067520142,
+      0.031738281,
+      0.005294800,
+      0.003082275,
+      0.000366211,
+
+      -0.000015259,
+      -0.000534058,
+      0.003387451,
+      -0.008865356,
+      0.029785156,
+      -0.089706421,
+      0.080688477,
+      -0.628295898,
+      1.142211914,
+      0.515609741,
+      0.116577148,
+      0.067520142,
+      0.031738281,
+      0.005294800,
+      0.003082275,
+      0.000366211 ],
+
+    [ -0.000015259,   /*  3 */
+      -0.000579834,
+      0.003433228,
+      -0.009841919,
+      0.028884888,
+      -0.095169067,
+      0.069595337,
+      -0.656219482,
+      1.138763428,
+      0.487472534,
+      0.123474121,
+      0.061996460,
+      0.031845093,
+      0.004486084,
+      0.002990723,
+      0.000320435,
+
+      -0.000015259,
+      -0.000579834,
+      0.003433228,
+      -0.009841919,
+      0.028884888,
+      -0.095169067,
+      0.069595337,
+      -0.656219482,
+      1.138763428,
+      0.487472534,
+      0.123474121,
+      0.061996460,
+      0.031845093,
+      0.004486084,
+      0.002990723,
+      0.000320435 ],
+
+    [ -0.000015259,   /*  4 */
+      -0.000625610,
+      0.003463745,
+      -0.010848999,
+      0.027801514,
+      -0.100540161,
+      0.057617187,
+      -0.683914185,
+      1.133926392,
+      0.459472656,
+      0.129577637,
+      0.056533813,
+      0.031814575,
+      0.003723145,
+      0.002899170,
+      0.000289917,
+
+      -0.000015259,
+      -0.000625610,
+      0.003463745,
+      -0.010848999,
+      0.027801514,
+      -0.100540161,
+      0.057617187,
+      -0.683914185,
+      1.133926392,
+      0.459472656,
+      0.129577637,
+      0.056533813,
+      0.031814575,
+      0.003723145,
+      0.002899170,
+      0.000289917 ],
+
+    [ -0.000015259,   /*  5 */
+      -0.000686646,
+      0.003479004,
+      -0.011886597,
+      0.026535034,
+      -0.105819702,
+      0.044784546,
+      -0.711318970,
+      1.127746582,
+      0.431655884,
+      0.134887695,
+      0.051132202,
+      0.031661987,
+      0.003005981,
+      0.002792358,
+      0.000259399,
+
+      -0.000015259,
+      -0.000686646,
+      0.003479004,
+      -0.011886597,
+      0.026535034,
+      -0.105819702,
+      0.044784546,
+      -0.711318970,
+      1.127746582,
+      0.431655884,
+      0.134887695,
+      0.051132202,
+      0.031661987,
+      0.003005981,
+      0.002792358,
+      0.000259399 ],
+
+    [ -0.000015259,   /*  6 */
+      -0.000747681,
+      0.003479004,
+      -0.012939453,
+      0.025085449,
+      -0.110946655,
+      0.031082153,
+      -0.738372803,
+      1.120223999,
+      0.404083252,
+      0.139450073,
+      0.045837402,
+      0.031387329,
+      0.002334595,
+      0.002685547,
+      0.000244141,
+
+      -0.000015259,
+      -0.000747681,
+      0.003479004,
+      -0.012939453,
+      0.025085449,
+      -0.110946655,
+      0.031082153,
+      -0.738372803,
+      1.120223999,
+      0.404083252,
+      0.139450073,
+      0.045837402,
+      0.031387329,
+      0.002334595,
+      0.002685547,
+      0.000244141 ],
+
+    [ -0.000030518,   /*  7 */
+      -0.000808716,
+      0.003463745,
+      -0.014022827,
+      0.023422241,
+      -0.115921021,
+      0.016510010,
+      -0.765029907,
+      1.111373901,
+      0.376800537,
+      0.143264771,
+      0.040634155,
+      0.031005859,
+      0.001693726,
+      0.002578735,
+      0.000213623,
+
+      -0.000030518,
+      -0.000808716,
+      0.003463745,
+      -0.014022827,
+      0.023422241,
+      -0.115921021,
+      0.016510010,
+      -0.765029907,
+      1.111373901,
+      0.376800537,
+      0.143264771,
+      0.040634155,
+      0.031005859,
+      0.001693726,
+      0.002578735,
+      0.000213623 ],
+
+    [ -0.000030518,   /*  8 */
+      -0.000885010,
+      0.003417969,
+      -0.015121460,
+      0.021575928,
+      -0.120697021,
+      0.001068115,
+      -0.791213989,
+      1.101211548,
+      0.349868774,
+      0.146362305,
+      0.035552979,
+      0.030532837,
+      0.001098633,
+      0.002456665,
+      0.000198364,
+
+      -0.000030518,
+      -0.000885010,
+      0.003417969,
+      -0.015121460,
+      0.021575928,
+      -0.120697021,
+      0.001068115,
+      -0.791213989,
+      1.101211548,
+      0.349868774,
+      0.146362305,
+      0.035552979,
+      0.030532837,
+      0.001098633,
+      0.002456665,
+      0.000198364 ],
+
+    [ -0.000030518,   /*  9 */
+      -0.000961304,
+      0.003372192,
+      -0.016235352,
+      0.019531250,
+      -0.125259399,
+      -0.015228271,
+      -0.816864014,
+      1.089782715,
+      0.323318481,
+      0.148773193,
+      0.030609131,
+      0.029937744,
+      0.000549316,
+      0.002349854,
+      0.000167847,
+
+      -0.000030518,
+      -0.000961304,
+      0.003372192,
+      -0.016235352,
+      0.019531250,
+      -0.125259399,
+      -0.015228271,
+      -0.816864014,
+      1.089782715,
+      0.323318481,
+      0.148773193,
+      0.030609131,
+      0.029937744,
+      0.000549316,
+      0.002349854,
+      0.000167847 ],
+
+    [ -0.000030518,   /* 10 */
+      -0.001037598,
+      0.003280640,
+      -0.017349243,
+      0.017257690,
+      -0.129562378,
+      -0.032379150,
+      -0.841949463,
+      1.077117920,
+      0.297210693,
+      0.150497437,
+      0.025817871,
+      0.029281616,
+      0.000030518,
+      0.002243042,
+      0.000152588,
+
+      -0.000030518,
+      -0.001037598,
+      0.003280640,
+      -0.017349243,
+      0.017257690,
+      -0.129562378,
+      -0.032379150,
+      -0.841949463,
+      1.077117920,
+      0.297210693,
+      0.150497437,
+      0.025817871,
+      0.029281616,
+      0.000030518,
+      0.002243042,
+      0.000152588 ],
+
+    [ -0.000045776,   /* 11 */
+      -0.001113892,
+      0.003173828,
+      -0.018463135,
+      0.014801025,
+      -0.133590698,
+      -0.050354004,
+      -0.866363525,
+      1.063217163,
+      0.271591187,
+      0.151596069,
+      0.021179199,
+      0.028533936,
+      -0.000442505,
+      0.002120972,
+      0.000137329,
+
+      -0.000045776,
+      -0.001113892,
+      0.003173828,
+      -0.018463135,
+      0.014801025,
+      -0.133590698,
+      -0.050354004,
+      -0.866363525,
+      1.063217163,
+      0.271591187,
+      0.151596069,
+      0.021179199,
+      0.028533936,
+      -0.000442505,
+      0.002120972,
+      0.000137329 ],
+
+    [ -0.000045776,   /* 12 */
+      -0.001205444,
+      0.003051758,
+      -0.019577026,
+      0.012115479,
+      -0.137298584,
+      -0.069168091,
+      -0.890090942,
+      1.048156738,
+      0.246505737,
+      0.152069092,
+      0.016708374,
+      0.027725220,
+      -0.000869751,
+      0.002014160,
+      0.000122070,
+
+      -0.000045776,
+      -0.001205444,
+      0.003051758,
+      -0.019577026,
+      0.012115479,
+      -0.137298584,
+      -0.069168091,
+      -0.890090942,
+      1.048156738,
+      0.246505737,
+      0.152069092,
+      0.016708374,
+      0.027725220,
+      -0.000869751,
+      0.002014160,
+      0.000122070 ],
+
+    [ -0.000061035,   /* 13 */
+      -0.001296997,
+      0.002883911,
+      -0.020690918,
+      0.009231567,
+      -0.140670776,
+      -0.088775635,
+      -0.913055420,
+      1.031936646,
+      0.221984863,
+      0.151962280,
+      0.012420654,
+      0.026840210,
+      -0.001266479,
+      0.001907349,
+      0.000106812,
+
+      -0.000061035,
+      -0.001296997,
+      0.002883911,
+      -0.020690918,
+      0.009231567,
+      -0.140670776,
+      -0.088775635,
+      -0.913055420,
+      1.031936646,
+      0.221984863,
+      0.151962280,
+      0.012420654,
+      0.026840210,
+      -0.001266479,
+      0.001907349,
+      0.000106812 ],
+
+    [ -0.000061035,   /* 14 */
+      -0.001388550,
+      0.002700806,
+      -0.021789551,
+      0.006134033,
+      -0.143676758,
+      -0.109161377,
+      -0.935195923,
+      1.014617920,
+      0.198059082,
+      0.151306152,
+      0.008316040,
+      0.025909424,
+      -0.001617432,
+      0.001785278,
+      0.000106812,
+
+      -0.000061035,
+      -0.001388550,
+      0.002700806,
+      -0.021789551,
+      0.006134033,
+      -0.143676758,
+      -0.109161377,
+      -0.935195923,
+      1.014617920,
+      0.198059082,
+      0.151306152,
+      0.008316040,
+      0.025909424,
+      -0.001617432,
+      0.001785278,
+      0.000106812 ],
+
+    [ -0.000076294,   /* 15 */
+      -0.001480103,
+      0.002487183,
+      -0.022857666,
+      0.002822876,
+      -0.146255493,
+      -0.130310059,
+      -0.956481934,
+      0.996246338,
+      0.174789429,
+      0.150115967,
+      0.004394531,
+      0.024932861,
+      -0.001937866,
+      0.001693726,
+      0.000091553,
+
+      -0.000076294,
+      -0.001480103,
+      0.002487183,
+      -0.022857666,
+      0.002822876,
+      -0.146255493,
+      -0.130310059,
+      -0.956481934,
+      0.996246338,
+      0.174789429,
+      0.150115967,
+      0.004394531,
+      0.024932861,
+      -0.001937866,
+      0.001693726,
+      0.000091553 ],
+
+    [ -0.000076294,   /* 16 */
+      -0.001586914,
+      0.002227783,
+      -0.023910522,
+      -0.000686646,
+      -0.148422241,
+      -0.152206421,
+      -0.976852417,
+      0.976852417,
+      0.152206421,
+      0.148422241,
+      0.000686646,
+      0.023910522,
+      -0.002227783,
+      0.001586914,
+      0.000076294,
+
+      -0.000076294,
+      -0.001586914,
+      0.002227783,
+      -0.023910522,
+      -0.000686646,
+      -0.148422241,
+      -0.152206421,
+      -0.976852417,
+      0.976852417,
+      0.152206421,
+      0.148422241,
+      0.000686646,
+      0.023910522,
+      -0.002227783,
+      0.001586914,
+      0.000076294 ]
+];
+
+/*
+ * NAME:    synth.full()
+ * DESCRIPTION: perform full frequency PCM synthesis
+ */
+Mad.Synth.prototype.full = function(frame, nch, ns) {
+    var Dptr, hi, lo, ptr;
+    
+    for (var ch = 0; ch < nch; ++ch) {
+        var sbsample /* [36][32] */ = frame.sbsample[ch];
+        var filter = this.filter[ch]  /* [2][2][16][8] */;
+        var phase    = this.phase;
+        var pcm      = this.pcm.samples[ch];
+        var pcm1Ptr  = 0;
+        var pcm2Ptr  = 0;
+
+        for (var s = 0; s < ns; ++s) {
+            Mad.Synth.dct32(sbsample[s], phase >> 1, filter[0][phase & 1], filter[1][phase & 1]);
+
+            var pe = phase & ~1;
+            var po = ((phase - 1) & 0xf) | 1;
+
+            /* calculate 32 samples */
+            var fe = filter[0][ phase & 1];
+            var fx = filter[0][~phase & 1];
+            var fo = filter[1][~phase & 1];
+
+            var fePtr = 0;
+            var fxPtr = 0;
+            var foPtr = 0;
+            
+            Dptr = 0;
+
+            ptr = D[Dptr];
+            _fx = fx[fxPtr];
+            _fe = fe[fePtr];
+
+            lo =  _fx[0] * ptr[po +  0];
+            lo += _fx[1] * ptr[po + 14];
+            lo += _fx[2] * ptr[po + 12];
+            lo += _fx[3] * ptr[po + 10];
+            lo += _fx[4] * ptr[po +  8];
+            lo += _fx[5] * ptr[po +  6];
+            lo += _fx[6] * ptr[po +  4];
+            lo += _fx[7] * ptr[po +  2];
+            lo = -lo;                      
+            
+            lo += _fe[0] * ptr[pe +  0];
+            lo += _fe[1] * ptr[pe + 14];
+            lo += _fe[2] * ptr[pe + 12];
+            lo += _fe[3] * ptr[pe + 10];
+            lo += _fe[4] * ptr[pe +  8];
+            lo += _fe[5] * ptr[pe +  6];
+            lo += _fe[6] * ptr[pe +  4];
+            lo += _fe[7] * ptr[pe +  2];
+
+            pcm[pcm1Ptr++] = lo;
+            pcm2Ptr = pcm1Ptr + 30;
+
+            for (var sb = 1; sb < 16; ++sb) {
+                ++fePtr;
+                ++Dptr;
+
+                /* D[32 - sb][i] === -D[sb][31 - i] */
+
+                ptr = D[Dptr];
+                _fo = fo[foPtr];
+                _fe = fe[fePtr];
+
+                lo  = _fo[0] * ptr[po +  0];
+                lo += _fo[1] * ptr[po + 14];
+                lo += _fo[2] * ptr[po + 12];
+                lo += _fo[3] * ptr[po + 10];
+                lo += _fo[4] * ptr[po +  8];
+                lo += _fo[5] * ptr[po +  6];
+                lo += _fo[6] * ptr[po +  4];
+                lo += _fo[7] * ptr[po +  2];
+                lo = -lo;
+
+                lo += _fe[7] * ptr[pe + 2];
+                lo += _fe[6] * ptr[pe + 4];
+                lo += _fe[5] * ptr[pe + 6];
+                lo += _fe[4] * ptr[pe + 8];
+                lo += _fe[3] * ptr[pe + 10];
+                lo += _fe[2] * ptr[pe + 12];
+                lo += _fe[1] * ptr[pe + 14];
+                lo += _fe[0] * ptr[pe + 0];
+
+                pcm[pcm1Ptr++] = lo;
+
+                lo =  _fe[0] * ptr[-pe + 31 - 16];
+                lo += _fe[1] * ptr[-pe + 31 - 14];
+                lo += _fe[2] * ptr[-pe + 31 - 12];
+                lo += _fe[3] * ptr[-pe + 31 - 10];
+                lo += _fe[4] * ptr[-pe + 31 -  8];
+                lo += _fe[5] * ptr[-pe + 31 -  6];
+                lo += _fe[6] * ptr[-pe + 31 -  4];
+                lo += _fe[7] * ptr[-pe + 31 -  2];
+
+                lo += _fo[7] * ptr[-po + 31 -  2];
+                lo += _fo[6] * ptr[-po + 31 -  4];
+                lo += _fo[5] * ptr[-po + 31 -  6];
+                lo += _fo[4] * ptr[-po + 31 -  8];
+                lo += _fo[3] * ptr[-po + 31 - 10];
+                lo += _fo[2] * ptr[-po + 31 - 12];
+                lo += _fo[1] * ptr[-po + 31 - 14];
+                lo += _fo[0] * ptr[-po + 31 - 16];
+
+                pcm[pcm2Ptr--] = lo;
+                ++foPtr;
+            }
+
+            ++Dptr;
+
+            ptr = D[Dptr];
+            _fo = fo[foPtr];
+
+            lo  = _fo[0] * ptr[po +  0];
+            lo += _fo[1] * ptr[po + 14];
+            lo += _fo[2] * ptr[po + 12];
+            lo += _fo[3] * ptr[po + 10];
+            lo += _fo[4] * ptr[po +  8];
+            lo += _fo[5] * ptr[po +  6];
+            lo += _fo[6] * ptr[po +  4];
+            lo += _fo[7] * ptr[po +  2];
+
+            pcm[pcm1Ptr] = -lo;
+            pcm1Ptr += 16;
+            phase = (phase + 1) % 16;
+        }
+    }
+}
+
+
+/*
+ * NAME:    synth.half()
+ * DESCRIPTION: perform half frequency PCM synthesis
+ */
+
+// Yeah, I don't think so
+
+//static
+//void synth_half(struct mad_synth *synth, struct mad_frame const *frame,
+//      unsigned int nch, unsigned int ns)
+//{
+//  unsigned int phase, ch, s, sb, pe, po;
+//  mad_fixed_t *pcm1, *pcm2, filter[2][2][16][8];
+//  mad_fixed_t const (*sbsample)[36][32];
+//  register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8];
+//  register mad_fixed_t const (*Dptr)[32], *ptr;
+//  register mad_fixed64hi_t hi;
+//  register mad_fixed64lo_t lo;
+//
+//  for (ch = 0; ch < nch; ++ch) {
+//    sbsample = &frame.sbsample[ch];
+//    filter   = &synth.filter[ch];
+//    phase    = synth.phase;
+//    pcm1     = synth.pcm.samples[ch];
+//
+//    for (s = 0; s < ns; ++s) {
+//      dct32((*sbsample)[s], phase >> 1,
+//      filter[0][phase & 1], filter[1][phase & 1]);
+//
+//      pe = phase & ~1;
+//      po = ((phase - 1) & 0xf) | 1;
+//
+//      /* calculate 16 samples */
+//
+//      fe = &filter[0][ phase & 1][0];
+//      fx = &filter[0][~phase & 1][0];
+//      fo = &filter[1][~phase & 1][0];
+//
+//      Dptr = &D[0];
+//
+//      ptr = *Dptr + po;
+//      ML0(hi, lo, (*fx)[0], ptr[ 0]);
+//      MLA(hi, lo, (*fx)[1], ptr[14]);
+//      MLA(hi, lo, (*fx)[2], ptr[12]);
+//      MLA(hi, lo, (*fx)[3], ptr[10]);
+//      MLA(hi, lo, (*fx)[4], ptr[ 8]);
+//      MLA(hi, lo, (*fx)[5], ptr[ 6]);
+//      MLA(hi, lo, (*fx)[6], ptr[ 4]);
+//      MLA(hi, lo, (*fx)[7], ptr[ 2]);
+//      MLN(hi, lo);
+//
+//      ptr = *Dptr + pe;
+//      MLA(hi, lo, (*fe)[0], ptr[ 0]);
+//      MLA(hi, lo, (*fe)[1], ptr[14]);
+//      MLA(hi, lo, (*fe)[2], ptr[12]);
+//      MLA(hi, lo, (*fe)[3], ptr[10]);
+//      MLA(hi, lo, (*fe)[4], ptr[ 8]);
+//      MLA(hi, lo, (*fe)[5], ptr[ 6]);
+//      MLA(hi, lo, (*fe)[6], ptr[ 4]);
+//      MLA(hi, lo, (*fe)[7], ptr[ 2]);
+//
+//      *pcm1++ = MLZ(hi, lo);
+//
+//      pcm2 = pcm1 + 14;
+//
+//      for (sb = 1; sb < 16; ++sb) {
+//  ++fe;
+//  ++Dptr;
+//
+//  /* D[32 - sb][i] === -D[sb][31 - i] */
+//
+//  if (!(sb & 1)) {
+//    ptr = *Dptr + po;
+//    ML0(hi, lo, (*fo)[0], ptr[ 0]);
+//    MLA(hi, lo, (*fo)[1], ptr[14]);
+//    MLA(hi, lo, (*fo)[2], ptr[12]);
+//    MLA(hi, lo, (*fo)[3], ptr[10]);
+//    MLA(hi, lo, (*fo)[4], ptr[ 8]);
+//    MLA(hi, lo, (*fo)[5], ptr[ 6]);
+//    MLA(hi, lo, (*fo)[6], ptr[ 4]);
+//    MLA(hi, lo, (*fo)[7], ptr[ 2]);
+//    MLN(hi, lo);
+//
+//    ptr = *Dptr + pe;
+//    MLA(hi, lo, (*fe)[7], ptr[ 2]);
+//    MLA(hi, lo, (*fe)[6], ptr[ 4]);
+//    MLA(hi, lo, (*fe)[5], ptr[ 6]);
+//    MLA(hi, lo, (*fe)[4], ptr[ 8]);
+//    MLA(hi, lo, (*fe)[3], ptr[10]);
+//    MLA(hi, lo, (*fe)[2], ptr[12]);
+//    MLA(hi, lo, (*fe)[1], ptr[14]);
+//    MLA(hi, lo, (*fe)[0], ptr[ 0]);
+//
+//    *pcm1++ = MLZ(hi, lo);
+//
+//    ptr = *Dptr - po;
+//    ML0(hi, lo, (*fo)[7], ptr[31 -  2]);
+//    MLA(hi, lo, (*fo)[6], ptr[31 -  4]);
+//    MLA(hi, lo, (*fo)[5], ptr[31 -  6]);
+//    MLA(hi, lo, (*fo)[4], ptr[31 -  8]);
+//    MLA(hi, lo, (*fo)[3], ptr[31 - 10]);
+//    MLA(hi, lo, (*fo)[2], ptr[31 - 12]);
+//    MLA(hi, lo, (*fo)[1], ptr[31 - 14]);
+//    MLA(hi, lo, (*fo)[0], ptr[31 - 16]);
+//
+//    ptr = *Dptr - pe;
+//    MLA(hi, lo, (*fe)[0], ptr[31 - 16]);
+//    MLA(hi, lo, (*fe)[1], ptr[31 - 14]);
+//    MLA(hi, lo, (*fe)[2], ptr[31 - 12]);
+//    MLA(hi, lo, (*fe)[3], ptr[31 - 10]);
+//    MLA(hi, lo, (*fe)[4], ptr[31 -  8]);
+//    MLA(hi, lo, (*fe)[5], ptr[31 -  6]);
+//    MLA(hi, lo, (*fe)[6], ptr[31 -  4]);
+//    MLA(hi, lo, (*fe)[7], ptr[31 -  2]);
+//
+//    *pcm2-- = MLZ(hi, lo);
+//  }
+//
+//  ++fo;
+//      }
+//
+//      ++Dptr;
+//
+//      ptr = *Dptr + po;
+//      ML0(hi, lo, (*fo)[0], ptr[ 0]);
+//      MLA(hi, lo, (*fo)[1], ptr[14]);
+//      MLA(hi, lo, (*fo)[2], ptr[12]);
+//      MLA(hi, lo, (*fo)[3], ptr[10]);
+//      MLA(hi, lo, (*fo)[4], ptr[ 8]);
+//      MLA(hi, lo, (*fo)[5], ptr[ 6]);
+//      MLA(hi, lo, (*fo)[6], ptr[ 4]);
+//      MLA(hi, lo, (*fo)[7], ptr[ 2]);
+//
+//      *pcm1 = -MLZ(hi, lo);
+//      pcm1 += 8;
+//
+//      phase = (phase + 1) % 16;
+//    }
+//  }
+//}
+
+/*
+ * NAME:    synth.frame()
+ * DESCRIPTION: perform PCM synthesis of frame subband samples
+ */
+Mad.Synth.prototype.frame = function (frame) {
+    var nch = frame.header.nchannels();
+    var ns  = frame.header.nbsamples();
+
+    this.pcm.samplerate = frame.header.samplerate;
+    this.pcm.channels   = nch;
+    this.pcm.length     = 32 * ns;
+
+    // console.log("ns: " + ns);
+
+    /*
+     if (frame.options & Mad.Option.HALFSAMPLERATE) {
+     this.pcm.samplerate /= 2;
+     this.pcm.length     /= 2;
+
+     throw new Error("HALFSAMPLERATE is not supported. What do you think? As if I have the time for this");
+     }
+     */
+
+    this.full(frame, nch, ns);
+    this.phase = (this.phase + ns) % 16;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/aliasreduce.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/aliasreduce.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/aliasreduce.js	(revision 28388)
@@ -0,0 +1,158 @@
+require('./typed-array.js');
+require('../../mad.js');
+require('../../layer3.js');
+
+var xr = [
+        -0.00049903,0.00151888,-0.00044203,-0.00307714,0.00167362,0.00613469,-0.00406994,-0.01457764,
+    0.01214388,0.06229898,-0.14182327,0.92929485,0.13768128,0.06171946,-0.01344565,-0.01477975,
+    0.00646184,0.00701636,0.00416800,0.00344713,-0.00471758,-0.00237028,0.00517955,0.00416800,
+    0.00312281,0.00100904,-0.00067976,-0.00012207,0.00016437,0.00004844,-0.00006523,-0.00001923,
+    0.00003301,0.00001923,-0.00001923,-0.00001923,-0.00001211,-0.00001211,0.00000481,0.00000825,
+        -0.00000191,-0.00000191,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000539,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000381,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000191,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000381,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000270,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000763,0.00000000,
+    0.00000000,0.00000763,-0.00000763,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000763,0.00000763,0.00000000,
+    0.00000000,-0.00000763,0.00000000,0.00000000,0.00000000,0.00000000,0.00000763,0.00000000,
+        -0.00000763,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000763,0.00000000,0.00000763,
+        -0.00000763,-0.00000763,0.00000000,-0.00000763,-0.00000763,0.00000000,0.00000763,0.00000763,
+    0.00000000,-0.00000763,-0.00000763,-0.00000763,0.00000000,0.00000000,0.00000000,-0.00000763,
+        -0.00000763,0.00000000,-0.00000763,0.00000000,-0.00000763,0.00000000,0.00000000,0.00000000,
+    0.00001923,0.00000763,0.00000000,0.00000763,0.00000000,0.00000763,0.00000000,0.00000000,
+        -0.00000763,-0.00000763,0.00000000,0.00000763,0.00000763,-0.00000763,0.00000000,0.00000000,
+        -0.00000763,0.00000763,0.00000763,0.00000000,-0.00000763,0.00000000,0.00001923,-0.00000763,
+    0.00000000,0.00000763,0.00000000,0.00000763,0.00000000,-0.00001923,-0.00000763,0.00000763,
+    0.00000763,-0.00000763,-0.00000763,-0.00000763,0.00000763,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
+];
+var xr2 = [
+        -0.00049903,0.00151888,-0.00044203,-0.00307714,0.00167362,0.00613469,-0.00406994,-0.01457764,
+    0.01214388,0.06229898,-0.14181857,0.92924551,0.13773644,0.06193267,-0.01365250,-0.01551367,
+    0.00732380,0.00816090,-0.00003586,-0.00000878,0.00015169,0.00011521,-0.00068073,-0.00147570,
+        -0.01007217,0.00153378,-0.00067976,-0.00012207,0.00016437,0.00004844,-0.00006526,-0.00001932,
+    0.00003396,0.00001976,-0.00002267,-0.00002272,-0.00000050,-0.00000161,-0.00000146,0.00000211,
+        -0.00000008,0.00000076,-0.00000069,-0.00000061,0.00000000,0.00000000,0.00000000,0.00000544,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000373,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000190,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+        -0.00000003,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000381,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,-0.00000006,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000269,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000001,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000763,0.00000000,
+    0.00000000,0.00000724,-0.00000673,0.00000000,0.00000000,0.00000360,-0.00000239,0.00000000,
+    0.00000000,0.00000031,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,-0.00000139,0.00000000,0.00000000,0.00001046,0.00000262,0.00000000,
+    0.00000000,-0.00000750,0.00000000,0.00000000,0.00000000,0.00000000,0.00000763,0.00000000,
+        -0.00000760,0.00000011,0.00000000,-0.00000072,-0.00000139,-0.00000725,-0.00000360,0.00000262,
+        -0.00001047,-0.00000673,0.00000239,-0.00000750,-0.00000760,0.00000000,0.00000763,0.00000765,
+    0.00000000,-0.00000763,-0.00000760,-0.00000736,0.00000000,0.00000000,0.00000000,-0.00000964,
+        -0.00000673,-0.00000393,-0.00000655,0.00000360,-0.00000486,0.00000000,0.00000000,0.00000000,
+    0.00001933,0.00000765,0.00000000,0.00000763,0.00000000,0.00000773,0.00000031,-0.00000072,
+        -0.00000750,-0.00000725,-0.00000360,0.00001046,0.00000262,-0.00000673,0.00000239,0.00000139,
+        -0.00000760,0.00000762,0.00000751,0.00000000,-0.00000763,0.00000000,0.00001922,-0.00000752,
+        -0.00000031,0.00000687,-0.00000139,0.00000963,0.00000360,-0.00002041,0.00000335,0.00000672,
+    0.00000485,-0.00000750,-0.00000832,-0.00000763,0.00000773,-0.00000007,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
+];
+
+Mad.III_aliasreduce(xr, 576);
+
+for (var i = 0; i < 576; i++) {
+    console.log(Math.abs(xr[i] - xr2[i]));
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/check.rb
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/check.rb	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/check.rb	(revision 28388)
@@ -0,0 +1,18 @@
+# Dir.chdir("../../../libmad") do
+#   system("make minimad && ./minimad < one_second_beep.mp3 > ../jsmad/experiments/node/libmad.txt")
+# end
+
+# system("node test.js > jsmad.txt")
+
+libmad = File.readlines(ARGV[0])
+jsmad = File.readlines(ARGV[1])
+
+diffs = []
+
+libmad.zip(jsmad) do |a, b|
+  a.split("\t").zip(b.split("\t")) do |x, y|
+    diffs << (x.to_f - y.to_f).abs
+  end
+end
+
+puts diffs.max
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/dct.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/dct.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/dct.js	(revision 28388)
@@ -0,0 +1,40 @@
+require('./typed-array.js');
+require('../../mad.js');
+require('../../synth.js');
+
+var _in = [-24885929,47196,16460,331490,-41214,-9529,22626,8736,-7265,-6506,12615,-7664,11799,-5896,-5173,-4064,5503,-2814,8527,-8558,-2798,-11028,-11343,-4432,6220,2036,-1558,5120,0,0,0,0];
+var lo = [-17429241,-16475780,-15459112,-14484372,-13536059,-12581038,-11687286,-10701390,-9665573,-8622052,-7557596,-6432024,-5223547,-3996414,-2651606,-1281770];
+var hi = [-18405790,-19328854,-20162190,-20939601,-21600256,-22213828,-22816256,-23239559,-23583918,-23939478,-24126106,-24292333,-24437136,-24456072,-24497924,-24537443];
+
+function fixToFloat(x) {
+    return x / (1 << 28);
+}
+
+function floatArray(list) {
+    var result = [];
+    for (var i = 0; i < list.length; i++) {
+        result[i] = fixToFloat(list[i]);
+    }
+    return result;
+}
+
+lo = floatArray(lo);
+hi = floatArray(hi);
+
+var _lo = [];
+var _hi = [];
+
+for (var i = 0; i < 16; i++) {
+    _lo[i] = [];
+    _hi[i] = [];
+}
+
+Mad.Synth.dct32(floatArray(_in), 0, _lo, _hi);
+
+for (var i = 0; i < 16; i++) {
+    console.log(Math.abs(_lo[i][0] - lo[i]));
+}
+
+for (var i = 0; i < 16; i++) {
+    console.log(Math.abs(_hi[i][0] - hi[i]));
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/fastdsct.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/fastdsct.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/fastdsct.js	(revision 28388)
@@ -0,0 +1,19 @@
+var fs = require('fs');
+var sys = require('sys');
+
+require('./typed-array.js');
+require('../../mad.js');
+require('../../id3.js');
+require('../../layer3.js');
+var x = [
+-0.00188436,-0.00002753,0.00420964,0.00203913,-0.00782420,-0.00490182,0.01520704,0.01104762,-0.03868370,-0.04013703,0.37942966,-0.46913085,-0.27882083,-0.02320458,0.01611372,0.00400412,-0.00274224,-0.00063538];
+var X = [
+-0.43594157,0.53499295,0.26976736,-0.95755410,0.85856501,0.13600542,-1.19115227,1.15186305,0.17104355,-1.59530227,1.05767249,0.86786658,-1.50597779,0.15820546,1.25546645,-0.87142866,-0.66177376,1.18015846];
+
+var _X = [];
+
+sdctII(x, _X);
+
+for (var i = 0; i < 18; i++) {
+    console.log(Math.abs(_X[i] - X[i]));
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/full_frame.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/full_frame.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/full_frame.js	(revision 28388)
@@ -0,0 +1,921 @@
+var fs = require('fs');
+var sys = require('sys');
+
+require('./typed-array.js');
+require('../../mad.js');
+require('../../id3.js');
+require('../../layer3.js');
+require('../../synth.js');
+require("../../mad.js");
+require("../../rq_table.js");
+require("../../imdct_s.js");
+require("../../huffman.js");
+require("../../bit.js");
+require("../../stream.js");
+require("../../id3.js");
+require("../../layer3.js");
+require("../../frame.js");
+require("../../synth.js");
+
+var sbsamples = [];
+var pcm = [];
+
+sbsamples.push([
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+]);
+pcm.push([
+    0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,]);
+
+sbsamples.push([
+    [
+            -0.00000008,0.00000137,-0.00000035,-0.00000018,0.00000039,-0.00000016,0.00000013,0.00000010,0.00000000,-0.00000024,0.00000009,-0.00000012,0.00000012,-0.00000010,0.00000026,-0.00000034,0.00000008,0.00000006,-0.00000007,0.00000018,-0.00000006,0.00000013,0.00000013,0.00000002,0.00000009,0.00000019,-0.00000002,-0.00000064,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00000039,-0.00000219,0.00000112,0.00000089,-0.00000143,0.00000073,-0.00000003,-0.00000091,0.00000031,0.00000073,0.00000034,0.00000086,-0.00000013,0.00000003,0.00000104,-0.00000027,-0.00000149,0.00000014,0.00000018,0.00000012,-0.00000052,0.00000002,0.00000069,-0.00000002,-0.00000016,-0.00000046,0.00000064,0.00000094,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00000881,-0.00000376,0.00000117,-0.00000010,0.00000036,-0.00000023,-0.00000112,-0.00000007,-0.00000060,0.00000137,0.00000141,-0.00000035,0.00000312,-0.00000085,-0.00000099,-0.00000003,-0.00000122,0.00000102,-0.00000075,-0.00000020,-0.00000064,-0.00000030,0.00000077,0.00000007,-0.00000032,-0.00000124,-0.00000002,0.00000440,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000329,-0.00000143,-0.00000150,-0.00000111,0.00000171,0.00000226,0.00000354,-0.00000131,-0.00000096,-0.00000069,0.00000180,0.00000095,0.00000253,0.00000054,0.00000285,0.00000207,-0.00000116,-0.00000063,-0.00000088,0.00000124,-0.00000094,-0.00000018,0.00000016,-0.00000009,0.00000078,0.00000071,0.00000101,-0.00000205,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00000494,0.00000414,-0.00000689,0.00000393,-0.00000321,-0.00000310,-0.00000097,-0.00000088,0.00000093,0.00000038,0.00000118,-0.00000145,-0.00000210,0.00000340,0.00000108,-0.00000219,-0.00000125,-0.00000243,-0.00000207,-0.00000015,0.00000019,0.00000134,-0.00000032,0.00000006,-0.00000141,0.00000015,0.00000009,-0.00000484,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000096,0.00000346,-0.00000178,0.00000453,-0.00000684,-0.00000153,0.00000073,-0.00000299,-0.00000216,-0.00000011,-0.00000119,-0.00000227,0.00000002,-0.00000020,-0.00000117,0.00000151,0.00000466,0.00000253,-0.00000192,-0.00000004,0.00000030,0.00000305,0.00000010,-0.00000014,0.00000115,-0.00000346,0.00000084,-0.00000293,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000473,0.00000456,0.00000285,-0.00000393,0.00000127,0.00000033,-0.00000130,0.00000177,0.00000540,-0.00000060,0.00000066,-0.00000317,-0.00000104,0.00000484,0.00000012,0.00000070,-0.00000178,-0.00000159,0.00000162,0.00000213,0.00000176,0.00000424,0.00000138,0.00000014,-0.00000079,-0.00000031,0.00000011,0.00000941,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000410,-0.00000189,-0.00000148,-0.00000837,0.00000360,-0.00000219,0.00000092,0.00000029,-0.00000146,-0.00000207,-0.00000165,0.00000089,0.00000036,-0.00000075,-0.00000685,-0.00000120,0.00000201,0.00000203,-0.00000072,-0.00000167,0.00000092,0.00000351,0.00000214,-0.00000003,-0.00000037,0.00000154,0.00000047,0.00000358,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00001113,-0.00000718,-0.00000337,0.00000225,0.00000207,-0.00000026,-0.00000383,-0.00000180,0.00000143,-0.00000292,-0.00000007,0.00000111,0.00000121,0.00000041,-0.00000081,0.00000529,-0.00000180,0.00000297,0.00000364,0.00000118,0.00000109,0.00000259,0.00000102,0.00000008,0.00000106,-0.00000327,-0.00000005,-0.00000750,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00001216,-0.00000783,0.00000367,0.00000246,-0.00000226,-0.00000029,0.00000417,-0.00000196,-0.00000156,-0.00000318,0.00000007,0.00000121,-0.00000133,0.00000045,0.00000088,0.00000578,0.00000195,0.00000324,-0.00000397,0.00000129,-0.00000119,0.00000283,-0.00000111,0.00000010,-0.00000116,-0.00000357,0.00000005,-0.00000817,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00000535,-0.00000247,0.00000192,-0.00001091,-0.00000470,-0.00000286,-0.00000121,0.00000037,0.00000190,-0.00000270,0.00000214,0.00000115,-0.00000047,-0.00000099,0.00000893,-0.00000156,-0.00000263,0.00000264,0.00000094,-0.00000218,-0.00000120,0.00000457,-0.00000279,-0.00000004,0.00000048,0.00000201,-0.00000061,0.00000466,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00000744,0.00000716,-0.00000448,-0.00000617,-0.00000199,0.00000052,0.00000203,0.00000279,-0.00000848,-0.00000094,-0.00000104,-0.00000497,0.00000163,0.00000760,-0.00000019,0.00000111,0.00000278,-0.00000248,-0.00000255,0.00000336,-0.00000276,0.00000666,-0.00000217,0.00000023,0.00000124,-0.00000049,-0.00000018,0.00001478,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00000184,0.00000663,0.00000342,0.00000870,0.00001313,-0.00000295,-0.00000140,-0.00000575,0.00000415,-0.00000021,0.00000228,-0.00000436,-0.00000004,-0.00000039,0.00000225,0.00000289,-0.00000896,0.00000485,0.00000368,-0.00000009,-0.00000059,0.00000585,-0.00000019,-0.00000027,-0.00000222,-0.00000665,-0.00000162,-0.00000564,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00001191,0.00001001,0.00001663,0.00000949,0.00000774,-0.00000747,0.00000234,-0.00000210,-0.00000225,0.00000093,-0.00000285,-0.00000349,0.00000506,0.00000821,-0.00000262,-0.00000529,0.00000301,-0.00000586,0.00000501,-0.00000035,-0.00000047,0.00000324,0.00000077,0.00000016,0.00000339,0.00000037,-0.00000022,-0.00001167,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00001045,-0.00000454,0.00000474,-0.00000353,-0.00000544,0.00000716,-0.00001124,-0.00000416,0.00000305,-0.00000220,-0.00000572,0.00000302,-0.00000805,0.00000170,-0.00000905,0.00000658,0.00000368,-0.00000202,0.00000278,0.00000393,0.00000299,-0.00000058,-0.00000053,-0.00000028,-0.00000248,0.00000225,-0.00000320,-0.00000650,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00003971,-0.00001695,-0.00000528,-0.00000043,-0.00000163,-0.00000102,0.00000503,-0.00000029,0.00000269,0.00000622,-0.00000636,-0.00000157,-0.00001407,-0.00000382,0.00000444,-0.00000011,0.00000548,0.00000460,0.00000339,-0.00000088,0.00000286,-0.00000133,-0.00000350,0.00000032,0.00000145,-0.00000558,0.00000008,0.00001984,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000298,-0.00001662,-0.00000850,0.00000676,0.00001087,0.00000553,0.00000019,-0.00000692,-0.00000240,0.00000550,-0.00000259,0.00000652,0.00000100,0.00000018,-0.00000792,-0.00000206,0.00001129,0.00000106,-0.00000137,0.00000089,0.00000391,0.00000013,-0.00000526,-0.00000019,0.00000120,-0.00000349,-0.00000485,0.00000711,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00000172,0.00003151,0.00000805,-0.00000397,-0.00000900,-0.00000351,-0.00000314,0.00000222,-0.00000009,-0.00000546,-0.00000218,-0.00000266,-0.00000275,-0.00000224,-0.00000598,-0.00000776,-0.00000196,0.00000144,0.00000166,0.00000412,0.00000131,0.00000305,-0.00000314,0.00000056,-0.00000219,0.00000433,0.00000044,-0.00001471,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00000943,-0.00000976,-0.00001014,0.00000292,0.00001245,-0.00000252,0.00000406,0.00000612,-0.00000241,0.00000315,0.00000365,-0.00000230,-0.00000086,-0.00000724,-0.00000409,-0.00000759,0.00000057,0.00001121,0.00000762,-0.00000109,-0.00000073,0.00000226,0.00000063,-0.00000013,0.00000329,-0.00000257,-0.00000606,-0.00001684,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00001619,-0.00000606,0.00000019,0.00000338,0.00000289,0.00000131,0.00000557,-0.00000441,-0.00000441,-0.00000847,0.00000420,-0.00000057,-0.00000288,0.00000680,-0.00000255,0.00000117,0.00000506,-0.00000019,0.00000432,0.00000396,-0.00000366,-0.00000071,0.00000424,0.00000088,-0.00000088,-0.00000451,0.00000055,0.00001032,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00017760,0.00008741,-0.00002348,0.00000344,0.00000206,-0.00000132,0.00000386,-0.00000083,-0.00000543,-0.00000206,-0.00000664,-0.00000038,0.00001438,-0.00000785,-0.00000138,-0.00000516,0.00000472,-0.00000031,0.00001325,0.00000534,-0.00000379,-0.00000664,0.00000310,-0.00000101,-0.00000020,0.00000066,-0.00000585,0.00003051,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00081702,-0.00057124,-0.00012147,-0.00003627,-0.00002135,-0.00000750,-0.00000842,-0.00000232,-0.00000609,-0.00000142,-0.00000867,-0.00000492,0.00000297,-0.00000380,0.00000302,0.00000834,0.00000726,-0.00000379,-0.00000304,0.00000154,-0.00000279,-0.00000368,-0.00000105,0.00000178,0.00000654,0.00000402,0.00000079,-0.00001033,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00045995,0.00231569,-0.00016212,-0.00000114,0.00003829,-0.00004625,0.00004387,-0.00003704,0.00003105,-0.00003977,0.00003191,-0.00003067,0.00002380,-0.00002772,0.00001402,-0.00001230,0.00002081,-0.00001535,0.00001693,-0.00000389,0.00001170,-0.00001082,0.00000405,-0.00001064,0.00000302,-0.00001432,0.00000249,-0.00003682,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00505592,-0.00621317,-0.00027023,-0.00003403,0.00001341,0.00000567,0.00001193,0.00001035,0.00000736,0.00000683,0.00000454,0.00001112,0.00000066,0.00000466,-0.00000356,-0.00000264,-0.00000136,-0.00000741,-0.00000140,0.00001017,0.00000534,0.00001230,-0.00000316,0.00000078,0.00000960,-0.00000107,-0.00000114,-0.00000669,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.01417062,0.01312837,0.00028520,-0.00050376,0.00044954,-0.00038842,0.00033978,-0.00029039,0.00025574,-0.00022439,0.00019675,-0.00017296,0.00016154,-0.00014456,0.00013379,-0.00012425,0.00011440,-0.00010207,0.00009434,-0.00008259,0.00008407,-0.00005168,0.00006806,-0.00006136,0.00004973,-0.00005190,0.00005065,0.00005489,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.00652570,-0.01337593,0.00354612,0.00203090,0.00123096,0.00082191,0.00056929,0.00040882,0.00029149,0.00021011,0.00015221,0.00011386,0.00009053,0.00006147,0.00004090,0.00002856,0.00001839,0.00000248,-0.00000955,-0.00001603,-0.00002867,-0.00002896,-0.00002753,-0.00004388,-0.00003503,-0.00006644,-0.00005557,0.00007301,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.15627334,0.04211956,0.00143095,-0.00289439,0.00274330,-0.00240328,0.00209925,-0.00183704,0.00162816,-0.00145964,0.00130296,-0.00117469,0.00105781,-0.00094431,0.00086801,-0.00079173,0.00069983,-0.00065254,0.00057854,-0.00053030,0.00047495,-0.00043267,0.00037556,-0.00033665,0.00028931,-0.00028838,0.00029826,-0.00023406,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.26060572,-0.11652350,-0.02750102,-0.01283133,-0.00731072,-0.00461712,-0.00310289,-0.00214586,-0.00153741,-0.00110150,-0.00078690,-0.00056999,-0.00037156,-0.00021927,-0.00012178,-0.00003671,0.00005886,0.00010400,0.00015954,0.00020132,0.00025548,0.00026516,0.00029422,0.00029246,0.00035105,0.00025755,0.00022886,0.00017960,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.73286559,0.04117592,-0.00658035,0.00256132,-0.00137358,0.00087923,-0.00064477,0.00050696,-0.00038571,0.00031606,-0.00026210,0.00022916,-0.00021574,0.00017680,-0.00016272,0.00014647,-0.00012910,0.00010104,-0.00010007,0.00008726,-0.00008808,0.00008424,-0.00005173,0.00006827,-0.00007518,-0.00000676,-0.00002302,-0.00003024,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.66468197,-0.01184708,-0.00469369,-0.00210000,-0.00115811,-0.00074709,-0.00048711,-0.00033646,-0.00024535,-0.00017398,-0.00011210,-0.00006815,-0.00005183,-0.00001789,-0.00002117,-0.00000723,0.00001505,0.00001966,0.00001682,0.00003628,0.00003535,0.00004571,0.00004634,0.00004390,0.00007062,0.00000379,0.00000667,-0.00000723,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.07279154,-0.00654671,-0.00084123,0.00032320,-0.00016651,0.00005594,-0.00002520,0.00002053,-0.00001050,0.00000368,0.00000508,-0.00000579,-0.00001201,0.00001379,-0.00001479,-0.00000491,-0.00000091,0.00000944,0.00000260,0.00000015,0.00000669,0.00000159,0.00000240,0.00000016,-0.00001413,-0.00000620,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.76031951,0.00199867,-0.00063324,-0.00029752,-0.00018633,-0.00009917,-0.00006701,-0.00003655,-0.00006249,-0.00004331,-0.00001703,-0.00000519,0.00000241,-0.00001674,-0.00001322,-0.00000638,-0.00000116,-0.00000192,0.00000696,0.00000302,0.00001142,0.00000220,0.00000795,0.00001693,0.00000838,0.00002785,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.55000097,0.00607531,-0.00003481,0.00000041,0.00001083,0.00000028,0.00001105,-0.00000259,-0.00000503,0.00000489,0.00000023,-0.00000414,0.00000073,-0.00000557,0.00001089,-0.00000082,-0.00000243,-0.00001033,0.00000875,0.00000429,-0.00000975,0.00000021,0.00000108,0.00000225,-0.00000614,-0.00001020,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.29281906,-0.00810818,-0.00002228,-0.00000430,-0.00001276,-0.00000561,0.00000706,-0.00000342,-0.00000385,-0.00000636,0.00000018,-0.00000357,0.00000595,0.00000014,0.00001375,0.00000063,-0.00000187,0.00000792,0.00000672,-0.00000636,-0.00000120,-0.00000970,-0.00000177,-0.00000453,0.00000234,-0.00002807,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.79850607,0.00054626,0.00001353,0.00000019,-0.00000563,-0.00000417,0.00000111,-0.00000550,-0.00000970,0.00000716,-0.00000706,-0.00000324,0.00000324,0.00001233,-0.00000324,0.00000264,-0.00000048,0.00000079,0.00000288,0.00000099,0.00000250,0.00000672,-0.00000210,0.00000601,-0.00001036,-0.00000297,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.38041764,0.00762338,0.00001046,0.00000057,-0.00000704,-0.00000197,0.00000973,0.00000269,-0.00000138,-0.00000551,0.00000067,-0.00000355,-0.00000698,-0.00000110,-0.00000734,0.00000065,-0.00000012,-0.00000124,0.00000034,-0.00001144,-0.00000121,0.00000590,-0.00000471,0.00001040,-0.00003279,0.00005787,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+]);
+pcm.push([
+    0.00000000,
+    0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+    0.00000000,0.00000000,-0.00000000,0.00000000,0.00000000,-0.00000000,-0.00000000,0.00000000,
+    0.00000000,0.00000000,-0.00000000,-0.00000000,0.00000000,-0.00000000,-0.00000000,-0.00000000,
+        -0.00000000,-0.00000000,-0.00000000,-0.00000000,-0.00000000,-0.00000000,-0.00000000,0.00000000,
+    0.00000000,-0.00000000,0.00000000,-0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+        -0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,
+        -0.00000000,-0.00000000,0.00000000,-0.00000000,-0.00000000,0.00000000,-0.00000000,0.00000000,
+    0.00000000,0.00000000,0.00000000,-0.00000000,0.00000000,-0.00000000,0.00000000,-0.00000001,
+        -0.00000000,0.00000000,-0.00000001,-0.00000001,-0.00000002,-0.00000001,-0.00000001,-0.00000001,
+        -0.00000001,-0.00000000,0.00000000,-0.00000001,-0.00000001,-0.00000000,0.00000000,0.00000000,
+        -0.00000001,-0.00000001,-0.00000001,-0.00000001,-0.00000001,-0.00000000,-0.00000001,-0.00000002,
+        -0.00000001,-0.00000001,-0.00000002,-0.00000001,-0.00000001,0.00000000,-0.00000002,-0.00000002,
+    0.00000001,-0.00000000,0.00000000,-0.00000000,0.00000003,0.00000003,0.00000001,0.00000001,
+        -0.00000001,0.00000002,-0.00000000,-0.00000001,0.00000001,-0.00000000,0.00000000,0.00000001,
+    0.00000000,-0.00000001,0.00000000,-0.00000002,-0.00000001,0.00000001,-0.00000003,-0.00000002,
+        -0.00000002,0.00000001,0.00000002,-0.00000003,-0.00000003,-0.00000002,0.00000001,-0.00000007,
+        -0.00000007,-0.00000001,-0.00000005,-0.00000006,-0.00000009,-0.00000008,-0.00000006,-0.00000012,
+        -0.00000003,0.00000003,0.00000001,-0.00000008,-0.00000009,-0.00000001,-0.00000003,0.00000004,
+        -0.00000004,-0.00000005,-0.00000012,-0.00000013,0.00000004,-0.00000002,-0.00000011,-0.00000023,
+        -0.00000010,-0.00000013,-0.00000022,-0.00000009,-0.00000011,0.00000004,-0.00000023,-0.00000023,
+    0.00000010,-0.00000001,-0.00000006,-0.00000003,0.00000020,0.00000015,-0.00000001,-0.00000011,
+        -0.00000015,0.00000008,-0.00000007,-0.00000021,-0.00000010,-0.00000012,-0.00000012,-0.00000007,
+        -0.00000018,-0.00000020,-0.00000023,-0.00000031,-0.00000014,0.00000001,-0.00000026,-0.00000035,
+        -0.00000009,0.00000007,0.00000027,-0.00000013,-0.00000030,0.00000007,0.00000007,-0.00000049,
+        -0.00000063,0.00000012,-0.00000005,-0.00000013,-0.00000020,-0.00000031,-0.00000017,-0.00000062,
+        -0.00000017,0.00000015,0.00000019,-0.00000031,-0.00000061,-0.00000031,-0.00000028,0.00000041,
+    0.00000007,-0.00000015,-0.00000070,-0.00000089,0.00000027,0.00000007,-0.00000082,-0.00000148,
+        -0.00000076,-0.00000086,-0.00000128,-0.00000060,-0.00000054,-0.00000029,-0.00000130,-0.00000130,
+    0.00000013,-0.00000019,-0.00000090,-0.00000058,0.00000015,-0.00000036,-0.00000099,-0.00000132,
+        -0.00000129,0.00000005,-0.00000038,-0.00000153,-0.00000095,-0.00000083,-0.00000070,-0.00000065,
+        -0.00000108,-0.00000114,-0.00000081,-0.00000179,-0.00000068,0.00000124,-0.00000147,-0.00000093,
+    0.00000072,0.00000244,0.00000284,-0.00000016,-0.00000047,0.00000019,0.00000194,-0.00000411,
+        -0.00000409,0.00000133,-0.00000137,-0.00000133,-0.00000473,-0.00000249,-0.00000236,-0.00000584,
+        -0.00000441,-0.00000149,0.00000208,-0.00000454,-0.00000364,-0.00000179,0.00000035,0.00000249,
+        -0.00000223,-0.00000148,-0.00000445,-0.00000124,0.00000088,0.00000360,0.00000086,-0.00000410,
+        -0.00000026,-0.00000263,0.00000280,0.00000018,0.00000223,0.00000132,-0.00000837,-0.00000477,
+        -0.00000073,0.00000397,-0.00000666,-0.00000115,0.00000349,-0.00000223,-0.00000147,-0.00001279,
+        -0.00000535,-0.00000292,-0.00000555,-0.00001247,-0.00001638,-0.00001132,-0.00001534,-0.00001020,
+        -0.00001206,-0.00000822,-0.00001651,-0.00001547,-0.00000439,-0.00000819,-0.00000799,-0.00002120,
+        -0.00001485,-0.00001905,-0.00001132,-0.00000415,-0.00001522,0.00000274,-0.00000735,-0.00000084,
+        -0.00000551,-0.00001038,0.00000960,0.00000456,0.00001288,0.00000228,0.00000248,0.00000071,
+    0.00000035,0.00001142,0.00000035,0.00000422,-0.00000274,0.00000146,0.00000558,0.00001128,
+    0.00000605,-0.00001068,-0.00000205,-0.00000132,0.00000760,-0.00001942,-0.00002185,0.00000260,
+    0.00000523,0.00001565,-0.00000089,0.00001426,0.00001461,0.00000541,0.00000118,-0.00000733,
+    0.00001404,0.00000215,0.00001027,0.00000623,-0.00000542,0.00000804,0.00000867,0.00000606,
+        -0.00000234,0.00001863,0.00000470,-0.00000499,0.00000874,0.00000439,0.00000300,-0.00001450,
+        -0.00000688,-0.00001212,-0.00001125,-0.00000341,-0.00000013,0.00000813,-0.00001255,0.00000204,
+    0.00000623,-0.00000847,-0.00001782,-0.00000898,0.00001240,0.00000177,-0.00000414,-0.00000995,
+    0.00000443,-0.00000171,-0.00001005,-0.00000028,-0.00001827,-0.00001875,-0.00001051,0.00000002,
+        -0.00001488,-0.00001886,-0.00001187,-0.00000536,0.00000889,-0.00001380,-0.00001037,-0.00000785,
+        -0.00000393,0.00000305,0.00002316,0.00003676,0.00000786,0.00002560,0.00001797,0.00002473,
+    0.00001574,-0.00001384,0.00001937,0.00000092,-0.00001741,-0.00001923,0.00000333,0.00000390,
+        -0.00001405,0.00001619,0.00001414,0.00001830,0.00000687,0.00000750,0.00001543,-0.00000047,
+        -0.00000427,-0.00000298,-0.00000505,-0.00002184,0.00001291,-0.00000435,0.00000012,0.00003660,
+    0.00000254,0.00001824,0.00001695,0.00002877,0.00001664,0.00001935,0.00003403,0.00000111,
+    0.00003817,-0.00000313,-0.00002212,-0.00000969,-0.00001374,0.00002273,0.00000072,0.00000482,
+    0.00000034,-0.00000194,-0.00001268,-0.00000572,0.00001346,-0.00001237,0.00001705,0.00001077,
+    0.00000750,-0.00000299,-0.00001435,0.00000070,0.00000129,0.00001583,-0.00002142,-0.00000648,
+        -0.00001263,-0.00001568,0.00001226,-0.00001859,0.00000462,0.00000474,0.00000823,0.00000071,
+    0.00000099,0.00002778,0.00003266,0.00003619,-0.00001817,0.00001002,0.00003725,0.00001670,
+    0.00000894,-0.00000376,0.00001564,0.00000361,0.00001288,-0.00001086,-0.00001029,0.00000891,
+        -0.00000332,0.00001635,0.00000344,0.00003618,0.00002095,-0.00000913,-0.00000004,-0.00000090,
+    0.00000223,-0.00002941,0.00000621,-0.00000200,-0.00000874,0.00001117,-0.00001106,0.00000820,
+    0.00000226,0.00001907,0.00001642,0.00001299,0.00002550,0.00002148,0.00002992,0.00001033,
+    0.00001214,-0.00000237,-0.00000727,-0.00000521,0.00000064,-0.00000405,-0.00000997,0.00001791,
+        -0.00001929,-0.00002080,-0.00002441,-0.00000447,0.00000990,-0.00003525,-0.00000750,-0.00001848,
+        -0.00000547,-0.00002166,-0.00003305,0.00000958,-0.00001652,-0.00001701,-0.00004446,-0.00002392,
+        -0.00000555,-0.00002918,-0.00001442,-0.00002491,-0.00002521,-0.00003569,-0.00002894,-0.00003475,
+        -0.00002465,-0.00000665,-0.00000634,0.00000411,-0.00001110,0.00001207,0.00000613,0.00001041,
+    0.00000086,-0.00000482,0.00001304,-0.00001748,0.00001534,-0.00001223,-0.00002790,-0.00001034,
+        -0.00001939,-0.00002350,-0.00004579,0.00000767,0.00000283,0.00000326,0.00000393,-0.00000434,
+    0.00001147,-0.00003666,-0.00001653,-0.00001641,-0.00000528,-0.00000726,-0.00003237,-0.00002456,
+        -0.00001265,0.00003504,-0.00003020,-0.00003301,0.00001056,0.00002477,0.00003969,-0.00000002,
+    0.00001360,0.00000646,0.00003309,0.00000874,0.00000315,0.00002984,-0.00001514,0.00001596,
+        -0.00002542,-0.00001659,0.00001365,0.00000251,0.00000363,-0.00003142,-0.00001027,-0.00001800,
+    0.00001886,0.00000417,-0.00000856,0.00001889,-0.00002039,-0.00000713,-0.00001982,-0.00000648,
+        -0.00002358,0.00000810,0.00002573,-0.00001846,-0.00001489,-0.00008883,-0.00002390,-0.00002145,
+        -0.00003943,0.00001647,-0.00002710,0.00001336,0.00000718,0.00002210,0.00000062,0.00001043,
+    0.00006401,-0.00000376,0.00004340,0.00002680,-0.00001413,0.00000228,-0.00001461,-0.00002146,
+        -0.00002079,0.00000012,-0.00001557,0.00000747,0.00001513,0.00004183,0.00002903,-0.00000846,
+    0.00003805,0.00001410,-0.00001762,-0.00004943,0.00000109,-0.00000396,-0.00005306,0.00000350,
+        -0.00001050,0.00002537,0.00000964,0.00001534,0.00008370,0.00006642,0.00006497,0.00004653,
+    0.00004655,0.00001432,0.00002885,0.00005754,0.00003508,0.00003012,-0.00000380,0.00001765,
+    0.00002999,0.00001859,-0.00001906,-0.00001926,-0.00000296,-0.00002731,0.00001276,0.00000554,
+        -0.00000842,-0.00001550,0.00001797,0.00004327,-0.00000583,-0.00002853,-0.00003045,0.00001806,
+        -0.00001387,-0.00001846,0.00000966,0.00000907,0.00001987,-0.00002521,-0.00000549,-0.00003974,
+        -0.00004872,-0.00002772,-0.00001030,0.00000452,-0.00005760,0.00000565,0.00000248,-0.00001995,
+        -0.00000448,0.00001021,0.00001980,-0.00002522,0.00003211,-0.00000088,0.00002561,0.00003869,
+        -0.00002156,0.00000280,-0.00000970,0.00005527,0.00001791,0.00002798,0.00007387,0.00007816,
+    0.00009193,-0.00003567,-0.00000844,0.00003068,0.00003158,0.00000547,-0.00003244,0.00002511,
+    0.00002399,0.00004974,0.00002508,0.00002768,0.00000784,0.00001689,0.00006865,0.00002578,
+    0.00004499,0.00000779,0.00004673,0.00005862,0.00008070,0.00010012,0.00001466,0.00008764,
+    0.00005123,0.00008066,0.00008504,0.00003900,0.00010877,0.00003405,0.00002960,-0.00001267,
+        -0.00001585,0.00000522,-0.00000259,0.00004703,-0.00001866,-0.00000587,0.00000111,0.00000549,
+        -0.00000051,-0.00002170,-0.00001425,-0.00006483,-0.00005928,-0.00004986,-0.00000773,-0.00005208,
+        -0.00007749,-0.00003907,-0.00002752,0.00002833,-0.00003083,-0.00001807,0.00001903,0.00001228,
+        -0.00003192,-0.00005928,0.00000284,-0.00002842,0.00001444,0.00001672,0.00000528,0.00000830,
+        -0.00001381,0.00003824,0.00002250,0.00005566,0.00004102,0.00002446,0.00000717,-0.00001179,
+    0.00004119,0.00003947,0.00007647,0.00001028,0.00001344,0.00007387,0.00005507,0.00002702,
+        -0.00001638,0.00003845,-0.00000994,-0.00002523,-0.00002262,-0.00000405,0.00003554,-0.00004921,
+        -0.00000106,0.00000358,-0.00001029,-0.00002004,-0.00000463,0.00002638,-0.00002100,0.00003245,
+    0.00000599,-0.00000108,-0.00002514,-0.00002921,0.00001899,-0.00000853,0.00001669,0.00000033,
+    0.00003245,-0.00000036,0.00002642,0.00001769,-0.00007075,0.00003188,0.00001354,0.00002474,
+        -0.00001838,0.00000583,0.00009210,0.00001630,0.00005771,0.00003579,0.00007667,0.00004239,
+    0.00001387,0.00009208,0.00001771,0.00003617,0.00001439,-0.00001279,-0.00002687,-0.00003082,
+        -0.00002123,-0.00002823,0.00001968,-0.00000524,0.00001517,-0.00002328,-0.00000503,0.00000898,
+        -0.00003665,-0.00000932,-0.00003056,0.00001886,-0.00003817,-0.00004233,-0.00002479,-0.00003723,
+    0.00001562,-0.00002688,0.00003726,-0.00000412,-0.00003387,-0.00004477,-0.00005549,-0.00000203,
+        -0.00005961,-0.00001729,-0.00003911,-0.00002959,-0.00003664,-0.00004655,0.00000044,-0.00006139,
+        -0.00003514,-0.00008993,-0.00005682,-0.00001771,-0.00003888,-0.00002943,-0.00007858,-0.00003367,
+        -0.00008729,-0.00006625,-0.00005937,-0.00005167,-0.00004040,-0.00007244,-0.00000434,-0.00010880,
+        -0.00006853,0.00000775,0.00001420,-0.00003378,-0.00008877,0.00001336,-0.00004789,0.00005398,
+    0.00001390,-0.00005085,0.00002649,0.00000643,0.00004566,-0.00003792,0.00001679,0.00000787,
+        -0.00000529,0.00004679,0.00001584,0.00006368,-0.00003860,0.00004152,0.00003929,0.00002001,
+    0.00004418,0.00001537,0.00011261,0.00001662,0.00006402,0.00000526,0.00003174,0.00014937,
+    0.00004781,0.00011459,0.00002525,0.00006979,0.00009399,0.00003934,0.00008246,0.00006162,
+    0.00006819,-0.00001628,0.00006242,0.00006909,0.00001547,0.00001569,0.00000633,0.00003885,
+        -0.00000248,0.00005015,-0.00002368,0.00002412,0.00003072,-0.00002366,0.00005420,-0.00002303,
+    0.00005159,0.00000555,0.00005808,0.00006868,-0.00005731,0.00002230,-0.00002822,-0.00000655,
+        -0.00002479,-0.00002375,-0.00001094,-0.00005498,-0.00000923,-0.00006397,-0.00002196,-0.00000681,
+    0.00002795,-0.00001686,-0.00000034,0.00004169,-0.00003120,0.00001109,-0.00002604,-0.00000553,
+        -0.00001754,0.00001252,-0.00002874,-0.00011781,0.00000015,-0.00005477,-0.00002109,-0.00004278,
+        -0.00000727,0.00003014,0.00000345,0.00005978,-0.00000922,0.00010992,0.00000245,0.00002886,
+    0.00009285,0.00004846,0.00009714,-0.00002519,0.00010120,0.00000429,0.00003267,0.00007400,
+        -0.00000709,0.00009648,-0.00005412,0.00008349,-0.00000869,-0.00000070,0.00009784,-0.00000520,
+    0.00006271,0.00002170,0.00013540,0.00001867,0.00010352,0.00008763,-0.00000710,0.00016705,
+    0.00000876,0.00010017,0.00002002,0.00004838,0.00003519,0.00004452,0.00012979,-0.00005310,
+    0.00016172,0.00000627,0.00004716,0.00008987,-0.00005846,0.00008991,-0.00005766,0.00008291,
+        -0.00003659,0.00005890,0.00002420,-0.00005683,0.00016654,-0.00006613,0.00015276,0.00003249,
+        -0.00001545,0.00003896,-0.00006189,0.00016541,-0.00004371,0.00002991,0.00002525,0.00001304,
+    0.00002173,-0.00003598,0.00006392,-0.00007511,0.00000800,-0.00007659,0.00003291,0.00000606,
+        -0.00002044,0.00002912,-0.00011198,0.00000102,-0.00013671,-0.00002738,-0.00006262,-0.00004340,
+        -0.00001188,-0.00008291,0.00009087,-0.00012342,0.00007055,-0.00006663,0.00002219,0.00003728,
+        -0.00015572,0.00012482,-0.00012441,0.00005617,-0.00007623,0.00001702,0.00009337,-0.00013407,
+    0.00018833,-0.00004830,0.00010982,-0.00001944,0.00007035,0.00008586,-0.00006414,0.00018585,
+        -0.00007275,0.00023358,-0.00009571,0.00008658,0.00011542,0.00000021,0.00021937,-0.00020861,
+    0.00035752,-0.00021305,0.00019230,-0.00001061,-0.00027937,0.00038305,-0.00052403,0.00057340,
+        -0.00041902,0.00025288,0.00016652,-0.00062519,0.00123414,-0.00151654,0.00190139,-0.00202624,
+    0.00197827,0.04843578,0.10139885,0.14859653,0.19914444,0.24630621,0.29402776,0.33987236,
+    0.38460139,0.42784647,0.46912881,0.50901892,0.54639096,0.58222183,0.61520464,0.64625436,
+    0.67421918,0.69999586,0.72303042,0.74273850,0.76022424,0.77388358,0.78543153,0.79337799,
+    0.79812313,0.80020613,0.79836741,0.79418918,0.78636390,0.77562721,0.76201570,0.74505514,
+    0.72543778,0.70286639,0.67760630,0.64948390,0.61899782,0.58603327,0.55072986,0.51329051,
+    0.47387554,0.43251541,0.38944384,0.34503195,0.29895681,0.25207311,0.20394801,]);
+
+sbsamples.push([
+    [
+            -0.47771208,-0.00697481,0.00000423,0.00000510,0.00000780,0.00000069,0.00000240,0.00000069,-0.00000000,0.00000204,0.00000000,-0.00000326,0.00000070,-0.00000596,0.00000125,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000580,0.00000572,-0.00000461,-0.00000126,0.00000072,0.00000744,-0.00002361,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.78320405,-0.00174987,0.00000202,0.00000319,0.00000189,-0.00000520,0.00000057,0.00000349,-0.00000573,-0.00000381,0.00000000,-0.00000190,0.00000460,0.00000382,0.00000269,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000348,-0.00000731,-0.00000840,-0.00000640,-0.00000768,-0.00000984,-0.00001771,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.18270260,0.00845652,-0.00000010,-0.00000145,0.00000042,-0.00000261,-0.00000342,-0.00000262,-0.00000000,-0.00000396,0.00000000,-0.00000056,-0.00000261,0.00000213,0.00000064,0.00000000,0.00000000,0.00000000,0.00000000,-0.00001119,-0.00000297,0.00000078,0.00001275,0.00000402,0.00000944,-0.00000965,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.62917816,-0.00538315,-0.00000007,0.00000111,0.00000032,0.00000200,-0.00000262,0.00000201,-0.00000000,0.00000304,0.00000000,0.00000043,-0.00000200,-0.00000424,-0.00000624,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000183,0.00000726,-0.00000060,-0.00000845,0.00000246,0.00000383,0.00000549,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.71326943,-0.00389659,0.00000083,-0.00000132,0.00000078,0.00000215,0.00000023,-0.00000145,-0.00000238,0.00000158,0.00000000,0.00000079,0.00000190,0.00000381,0.00000651,0.00000000,0.00000000,0.00000000,0.00000000,0.00000460,0.00000460,-0.00001269,0.00002082,-0.00001635,-0.00000091,0.00000710,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.02766476,0.00865582,0.00000056,-0.00000067,0.00000102,-0.00000009,0.00000031,-0.00000009,-0.00000000,-0.00000027,0.00000000,0.00000043,0.00000009,-0.00000424,-0.00000415,0.00000000,0.00000000,0.00000000,0.00000000,0.00000356,-0.00000535,0.00000060,-0.00000635,0.00001594,-0.00000244,0.00001217,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.73666061,-0.00338789,-0.00000055,-0.00000015,0.00000000,0.00000000,0.00000006,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000064,0.00000206,0.00000325,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000037,-0.00000392,-0.00000104,0.00000364,-0.00001734,0.00000623,-0.00001645,0.00000061,-0.00000403,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.59359702,-0.00582189,-0.00000067,0.00000143,0.00000000,0.00000000,-0.00000038,-0.00000003,0.00000000,0.00000000,0.00000000,0.00000000,0.00000096,0.00000185,-0.00000191,0.00000000,0.00000000,0.00000000,0.00000000,0.00000652,0.00000184,-0.00000698,0.00000483,0.00002599,0.00000041,0.00001919,-0.00000124,0.00002107,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.23599912,0.00827236,0.00000081,-0.00000124,0.00000000,0.00000000,0.00000010,0.00000002,0.00000000,0.00000000,0.00000000,0.00000000,0.00000362,-0.00000392,0.00000056,0.00000000,0.00000000,0.00000000,0.00000000,0.00000503,-0.00000165,-0.00000683,0.00000530,-0.00003105,0.00002014,0.00000770,0.00000068,-0.00001761,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.79262510,-0.00115491,-0.00000106,-0.00000161,0.00000000,0.00000000,-0.00000014,0.00000003,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000473,0.00000310,0.00000043,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000386,0.00000377,-0.00000888,0.00000841,-0.00001940,0.00000767,0.00002515,-0.00000089,-0.00002294,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.43231451,-0.00732946,0.00000161,0.00000346,0.00000000,0.00000000,0.00000090,-0.00000007,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000234,-0.00000094,-0.00000079,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000270,0.00000316,-0.00000069,-0.00000464,-0.00001427,-0.00001943,0.00000808,0.00000298,0.00005085,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.42802759,0.00731482,0.00000415,-0.00000113,0.00000000,0.00000000,-0.00000048,0.00000005,0.00000000,0.00000000,0.00000000,0.00000000,0.00000481,-0.00000016,0.00000042,0.00000000,0.00000000,0.00000000,0.00000000,0.00000005,-0.00000586,-0.00000778,-0.00001069,-0.00000671,-0.00001354,-0.00000133,-0.00000468,-0.00003058,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.79321596,0.00116980,-0.00000202,-0.00000279,0.00000000,0.00000000,-0.00000161,0.00000002,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000033,0.00000003,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000045,-0.00000866,-0.00000502,0.00002354,0.00001708,0.00002408,0.00000791,0.00000037,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.24089192,-0.00831728,-0.00000279,0.00000349,0.00000000,0.00000000,0.00000249,-0.00000007,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000000,-0.00000015,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000535,-0.00000680,0.00001081,0.00000058,0.00002932,0.00001130,-0.00001652,0.00000523,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.59014124,0.00589870,0.00000026,-0.00000017,0.00000000,0.00000000,-0.00000014,0.00000007,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000159,0.00000013,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000359,-0.00000174,-0.00000591,0.00000792,-0.00000539,0.00002240,0.00000371,-0.00000550,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.73856245,0.00328640,-0.00000355,-0.00000336,0.00000000,0.00000000,-0.00000306,-0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000298,-0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000324,-0.00000512,-0.00000758,-0.00000395,0.00000557,0.00000181,0.00001790,0.00001752,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.03273452,-0.00861292,-0.00000304,0.00000300,0.00000000,0.00000000,0.00000292,-0.00000006,0.00000000,0.00000000,0.00000000,0.00000000,0.00000610,-0.00000012,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000529,-0.00001412,0.00000295,-0.00000707,0.00002587,-0.00000162,0.00000728,-0.00001902,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.71099538,0.00392645,0.00000281,0.00000082,0.00000000,0.00000000,0.00000082,0.00000008,0.00000000,0.00000000,0.00000000,0.00000000,0.00000098,0.00000015,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000017,0.00000254,0.00002739,-0.00002347,0.00000785,0.00002353,0.00000033,-0.00000568,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.63225831,0.00528599,0.00000062,-0.00000370,-0.00000012,-0.00000000,-0.00000387,-0.00000003,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000744,-0.00000004,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000005,-0.00000494,-0.00000309,-0.00001647,-0.00001257,0.00000767,-0.00001287,-0.00000136,0.00002698,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.17780061,-0.00842351,-0.00000003,0.00000228,0.00000021,0.00000000,0.00000252,-0.00000005,0.00000000,0.00000000,0.00000000,0.00000000,0.00000250,-0.00000009,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000001,-0.00000056,0.00000211,-0.00002019,-0.00000182,-0.00000938,-0.00000924,-0.00000028,0.00000634,-0.00001417,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.78212549,0.00178970,0.00000372,0.00000171,0.00000027,0.00000000,0.00000193,0.00000009,0.00000000,0.00000000,0.00000000,0.00000000,0.00000380,0.00000015,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000001,0.00000103,0.00000363,0.00000188,-0.00000173,0.00001691,-0.00000130,0.00001701,0.00000927,-0.00001091,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.48179376,0.00694529,-0.00000135,-0.00000359,-0.00000082,0.00000000,-0.00000412,-0.00000003,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000197,-0.00000007,0.00000000,0.00000000,0.00000000,0.00000000,0.00000002,0.00000007,-0.00000348,-0.00000101,-0.00000668,0.00002170,0.00001017,-0.00000389,-0.00000162,0.00001113,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.37582038,-0.00766132,-0.00000072,0.00000132,0.00000039,-0.00000001,0.00000150,-0.00000004,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000005,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000001,-0.00000191,-0.00000210,-0.00001536,-0.00000562,0.00000479,0.00000257,-0.00002010,0.00002802,0.00000443,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.79879883,-0.00047850,0.00000576,0.00000230,0.00000083,0.00000002,0.00000250,0.00000010,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000229,0.00000014,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000002,0.00000183,0.00000435,0.00000572,-0.00000332,0.00000168,0.00000562,-0.00001738,0.00001234,-0.00000222,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.29779066,0.00804882,0.00000082,-0.00000302,-0.00000138,0.00000001,-0.00000326,-0.00000004,0.00000000,0.00000000,0.00000000,0.00000000,0.00000054,-0.00000010,0.00000000,0.00000000,0.00000000,0.00000000,0.00000003,0.00000086,0.00000006,0.00000066,-0.00001232,-0.00000741,-0.00002138,-0.00000860,0.00003972,-0.00001714,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.54762804,-0.00635696,0.00000072,0.00000036,0.00000021,-0.00000001,0.00000040,-0.00000003,0.00000000,0.00000000,0.00000000,0.00000000,0.00000483,-0.00000001,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000000,-0.00000326,-0.00000437,-0.00000756,0.00000821,-0.00000922,0.00000502,0.00001743,0.00002356,0.00002590,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.75954587,-0.00267205,0.00000625,0.00000238,0.00000154,0.00000001,0.00000238,0.00000007,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000337,0.00000010,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000005,0.00000195,0.00000228,0.00001043,0.00000610,0.00000992,0.00001044,0.00000259,-0.00000606,-0.00001764,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.09293538,0.00861745,0.00000012,-0.00000211,-0.00000169,0.00000002,-0.00000218,-0.00000001,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000309,-0.00000009,0.00000000,0.00000000,0.00000000,0.00000000,0.00000005,0.00000213,0.00000279,0.00000333,-0.00000278,-0.00000207,0.00000237,-0.00000495,-0.00001144,0.00000823,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.68115554,-0.00457321,0.00000048,-0.00000035,-0.00000027,-0.00000002,-0.00000033,-0.00000003,0.00000000,0.00000000,0.00000000,0.00000000,0.00000371,0.00000001,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000425,-0.00000361,-0.00000166,0.00000408,-0.00000023,-0.00000686,0.00002304,0.00000475,-0.00000270,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.66735557,-0.00476745,0.00000668,0.00000197,0.00000216,0.00000002,0.00000225,0.00000006,0.00000000,0.00000000,0.00000000,0.00000000,0.00000034,0.00000006,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000006,0.00000136,-0.00000025,0.00000345,-0.00000655,0.00000322,-0.00002275,-0.00002568,-0.00000398,-0.00000551,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.11837150,0.00858445,-0.00000153,-0.00000113,-0.00000161,0.00000003,-0.00000161,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000120,-0.00000007,0.00000000,0.00000000,0.00000000,0.00000000,0.00000004,0.00000352,0.00000285,-0.00000658,0.00000129,0.00000205,-0.00000488,-0.00002326,-0.00002386,0.00001249,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.76719414,-0.00245302,-0.00000208,-0.00000060,-0.00000096,-0.00000002,-0.00000096,-0.00000002,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000002,0.00000000,0.00000000,0.00000000,0.00000000,0.00000003,-0.00000460,-0.00000136,0.00000078,0.00000972,0.00001412,0.00001249,-0.00001432,-0.00000235,-0.00001125,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.52860402,-0.00649889,0.00000714,0.00000114,0.00000257,0.00000000,0.00000269,0.00000001,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000062,0.00000002,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000008,0.00000022,-0.00000096,0.00000064,-0.00000606,0.00000266,-0.00001013,-0.00003136,-0.00000064,0.00000833,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.32150608,0.00793018,0.00000076,-0.00000031,-0.00000123,0.00000003,-0.00000137,0.00000003,0.00000000,0.00000000,0.00000000,0.00000000,0.00000084,-0.00000003,0.00000000,0.00000000,0.00000000,0.00000000,0.00000004,0.00000466,0.00000105,-0.00001944,-0.00000491,0.00001657,0.00000123,0.00000272,-0.00000895,-0.00001112,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.79973340,-0.00017016,-0.00000177,-0.00000035,-0.00000162,-0.00000002,-0.00000202,-0.00000003,0.00000000,0.00000000,0.00000000,0.00000000,0.00000033,0.00000001,0.00000000,0.00000000,0.00000000,0.00000000,0.00000003,-0.00000425,-0.00000017,-0.00000993,-0.00000633,-0.00000967,0.00000039,-0.00000466,-0.00003419,0.00001131,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.35286002,-0.00781556,0.00000555,0.00000016,0.00000262,0.00000000,0.00000356,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000033,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000006,-0.00000117,0.00000018,0.00000406,-0.00000895,-0.00002397,0.00001502,-0.00000231,0.00002452,-0.00000223,0.00000000,0.00000000,0.00000000,0.00000000],
+]);
+pcm.push([
+    0.15507160,
+    0.10577622,0.05566323,0.00571578,-0.04455139,-0.09442589,-0.14402476,-0.19309847,-0.24113798,
+        -0.28861430,-0.33462411,-0.37952563,-0.42293703,-0.46466415,-0.50463556,-0.54235496,-0.57824145,
+        -0.61165918,-0.64285054,-0.67138061,-0.69720218,-0.72052030,-0.74072635,-0.75836350,-0.77281417,
+        -0.78415803,-0.79256549,-0.79765908,-0.79995154,-0.79886448,-0.79473717,-0.78754019,-0.77702706,
+        -0.76371184,-0.74718298,-0.72781179,-0.70567553,-0.68061335,-0.65297716,-0.62263683,-0.58993279,
+        -0.55496595,-0.51766066,-0.47851284,-0.43736840,-0.39446419,-0.35023417,-0.30442584,-0.25752365,
+        -0.20958930,-0.16074004,-0.11145500,-0.06152127,-0.01145839,0.03867947,0.08879526,0.13827804,
+    0.18738424,0.23577219,0.28313443,0.32947878,0.37437948,0.41802170,0.45996451,0.49996611,
+    0.53818683,0.57421450,0.60806981,0.63943824,0.66824216,0.69455320,0.71796379,0.73867925,
+    0.75644224,0.77114323,0.78298050,0.79174002,0.79743872,0.79995019,0.79921107,0.79538112,
+    0.78838419,0.77838577,0.76533783,0.74918586,0.73022092,0.70829100,0.68346760,0.65606740,
+    0.62612035,0.59380718,0.55907004,0.52200886,0.48291810,0.44198420,0.39947132,0.35533520,
+    0.30972872,0.26296886,0.21512453,0.16639271,0.11701329,0.06719265,0.01712428,-0.03304206,
+        -0.08300601,-0.13275230,-0.18190307,-0.23034045,-0.27797665,-0.32434943,-0.36951078,-0.41324482,
+        -0.45530037,-0.49562744,-0.53396352,-0.57028940,-0.60433634,-0.63598851,-0.66517356,-0.69167705,
+        -0.71547027,-0.73648364,-0.75458166,-0.76979891,-0.78187920,-0.79092352,-0.79698813,-0.79979021,
+        -0.79940626,-0.79592378,-0.78938009,-0.77968804,-0.76695122,-0.75123408,-0.73246355,-0.71086025,
+        -0.68648990,-0.65938532,-0.62966337,-0.59748444,-0.56306458,-0.52629152,-0.48746016,-0.44684047,
+        -0.40433768,-0.36035633,-0.31490638,-0.26811483,-0.22047343,-0.17185213,-0.12253131,-0.07274202,
+        -0.02267837,0.02744479,0.07749909,0.12715965,0.17641823,0.22498624,0.27254303,0.31920032,
+    0.36457498,0.40845261,0.45074956,0.49123394,0.52988632,0.56638145,0.60062497,0.63257173,
+    0.66198976,0.68891366,0.71297657,0.73433331,0.75282283,0.76819927,0.78079430,0.79015312,
+    0.79638412,0.79963653,0.79963921,0.79660714,0.79030081,0.78090935,0.76852943,0.75302266,
+    0.73472700,0.71338277,0.68924611,0.66255269,0.63305717,0.60124348,0.56699258,0.53044257,
+    0.49199464,0.45142228,0.40924428,0.36541418,0.32003110,0.27350286,0.22580674,0.17735036,
+    0.12814221,0.07832793,0.02841552,-0.02179646,-0.07183026,-0.12156141,-0.17097840,-0.21953465,
+        -0.26729304,-0.31397954,-0.35947737,-0.40362703,-0.44603938,-0.48680931,-0.52556067,-0.56233082,
+        -0.59689323,-0.62904172,-0.65884701,-0.68595078,-0.71045087,-0.73209941,-0.75077097,-0.76669116,
+        -0.77942301,-0.78917409,-0.79586732,-0.79930822,-0.79980974,-0.79700461,-0.79114321,-0.78217357,
+        -0.76997949,-0.75509204,-0.73691322,-0.71593144,-0.69229189,-0.66559149,-0.63664733,-0.60503436,
+        -0.57095860,-0.53488989,-0.49642485,-0.45624467,-0.41418679,-0.37035274,-0.32539837,-0.27882428,
+        -0.23135185,-0.18299010,-0.13371115,-0.08414972,-0.03404489,0.01607741,0.06610303,0.11604722,
+    0.16528215,0.21406647,0.26194103,0.30869813,0.35442310,0.39859990,0.44124640,0.48220973,
+    0.52122740,0.55827787,0.59302835,0.62556485,0.65550920,0.68291613,0.70777543,0.72962428,
+    0.74880186,0.76495757,0.77805452,0.78827951,0.79518585,0.79907374,0.79983782,0.79740429,
+    0.79196971,0.78326504,0.77154391,0.75681414,0.73903840,0.71848315,0.69502104,0.66882456,
+    0.64007840,0.60874361,0.57503859,0.53905130,0.50098084,0.46090505,0.41904516,0.37557787,
+    0.33055934,0.28429090,0.23692426,0.18856178,0.13950600,0.08988297,0.03989682,-0.01022271,
+        -0.06033975,-0.11017046,-0.15956999,-0.20839502,-0.25633229,-0.30333138,-0.34913330,-0.39350310,
+        -0.43636820,-0.47755443,-0.51676342,-0.55405659,-0.58914724,-0.62184140,-0.65220217,-0.67991363,
+        -0.70498940,-0.72731790,-0.74672738,-0.76329649,-0.77679065,-0.78727337,-0.79466336,-0.79887019,
+        -0.79999790,-0.79796370,-0.79282117,-0.78455949,-0.77313351,-0.75877672,-0.74137088,-0.72108898,
+        -0.69801387,-0.67205101,-0.64359948,-0.61256972,-0.57908431,-0.54336978,-0.50547882,-0.46567765,
+        -0.42401332,-0.38064272,-0.33585256,-0.28964010,-0.24237020,-0.19416271,-0.14510917,-0.09554145,
+        -0.04561070,0.00452615,0.05466123,0.10455386,0.15401275,0.20294946,0.25098203,0.29809234,
+    0.34404437,0.38858759,0.43164647,0.47301541,0.51247201,0.54993543,0.58527790,0.61832100,
+    0.64891243,0.67691981,0.70231524,0.72495146,0.74469676,0.76155537,0.77537679,0.78618621,
+    0.79396443,0.79854570,0.79997757,0.79834215,0.79350958,0.78556918,0.77456649,0.76045129,
+    0.74345231,0.72347412,0.70064033,0.67512343,0.64686445,0.61613715,0.58298614,0.54744597,
+    0.50988479,0.47027262,0.42875323,0.38565255,0.34099313,0.29493071,0.24781963,0.19969099,
+    0.15068319,0.10127034,0.05133168,0.00112255,-0.04887536,-0.09889752,-0.14840671,-0.19731337,
+        -0.24560302,-0.29275461,-0.33879029,-0.38359772,-0.42679219,-0.46835638,-0.50808922,-0.54577197,
+        -0.58136504,-0.61468771,-0.64553951,-0.67388983,-0.69959498,-0.72253523,-0.74265410,-0.75984639,
+        -0.77402017,-0.78523598,-0.79327456,-0.79824872,-0.80012850,-0.79872828,-0.79431954,-0.78678345,
+        -0.77603429,-0.76238648,-0.74566964,-0.72596494,-0.70353891,-0.67823441,-0.65032071,-0.61984660,
+        -0.58690920,-0.55171548,-0.51432649,-0.47491698,-0.43362242,-0.39064797,-0.34613976,-0.30026712,
+        -0.25322318,-0.20513405,-0.15632560,-0.10683734,-0.05694606,-0.00685354,0.04331057,0.09327868,
+    0.14282766,0.19193816,0.24020286,0.28748937,0.33380250,0.37859979,0.42203457,0.46387562,
+    0.50367891,0.54173554,0.57752536,0.61105134,0.64227883,0.67083641,0.69687413,0.72012687,
+    0.74053759,0.75808927,0.77261966,0.78411661,0.79253863,0.79788218,0.79999259,0.79908594,
+    0.79498077,0.78765455,0.77743531,0.76401442,0.74759091,0.72835066,0.70610892,0.68113831,
+    0.65358708,0.62328449,0.59067561,0.55574694,0.51849867,0.47942883,0.43825011,0.39549534,
+    0.35120139,0.30535287,0.25853957,0.21051946,0.16177373,0.11236108,0.06252517,0.01242071,
+        -0.03774391,-0.08765389,-0.13739089,-0.18642366,-0.23484150,-0.28230314,-0.32856606,-0.37373865,
+        -0.41719618,-0.45920671,-0.49935617,-0.53746066,-0.57359406,-0.60739233,-0.63878835,-0.66773489,
+        -0.69404837,-0.71752784,-0.73837095,-0.75619940,-0.77101971,-0.78298743,-0.79160052,-0.79739419,
+        -0.79993510,-0.79919720,-0.79559673,-0.78862187,-0.77863522,-0.76569904,-0.74957546,-0.73055550,
+        -0.70882471,-0.68406468,-0.65680579,-0.62693936,-0.59442605,-0.55988681,-0.52284612,-0.48398139,
+        -0.44312534,-0.40041385,-0.35643071,-0.31064351,-0.26404166,-0.21613764,-0.16738863,-0.11821219,
+        -0.06822969,-0.01830431,0.03188741,0.08193322,0.13158631,0.18077692,0.22922115,0.27683799,
+    0.32323882,0.36857165,0.41222276,0.45439705,0.49480549,0.53312867,0.56955871,0.60354361,
+    0.63532249,0.66451699,0.69110072,0.71506659,0.73606158,0.75430948,0.76949197,0.78174002,
+    0.79083968,0.79687940,0.79977333,0.79947647,0.79617621,0.78956763,0.78002429,0.76725992,
+    0.75159553,0.73296444,0.71132542,0.68718148,0.65996514,0.63044107,0.59836201,0.56381942,
+    0.52728813,0.48842262,0.44784524,0.40538908,0.36141429,0.31596437,0.26929237,0.22160897,
+    0.17292607,0.12378359,0.07393599,0.02390860,-0.02619098,-0.07630283,-0.12594847,-0.17524493,
+        -0.22375062,-0.27146562,-0.31800883,-0.36340259,-0.40733736,-0.44957682,-0.49027735,-0.52877271,
+        -0.56538751,-0.59976157,-0.63160899,-0.66128526,-0.68805733,-0.71229101,-0.73373443,-0.75217111,
+        -0.76784972,-0.78030766,-0.78981300,-0.79623475,-0.79940596,-0.79958766,-0.79654678,-0.79032911,
+        -0.78116795,-0.76878180,-0.75340850,-0.73519957,-0.71388781,-0.68993440,-0.66326055,-0.63385509,
+        -0.60213969,-0.56793626,-0.53150445,-0.49304976,-0.45261109,-0.41037993,-0.36660339,-0.32129740,
+        -0.27477919,-0.22720866,-0.17864693,-0.12952526,-0.07976824,-0.02972617,0.02033390,0.07050318,
+    0.12021720,0.16953956,0.21825022,0.26595228,0.31277070,0.35827636,0.40233502,0.44496513,
+    0.48567570,0.52458704,0.56140809,0.59597906,0.62831105,0.65805395,0.68529450,0.70982090,
+    0.73152490,0.75043417,0.76628854,0.77923458,0.78906010,0.79577456,0.79943931,0.79984212,
+    0.79720974,0.79141317,0.78244115,0.77053797,0.75548730,0.73748517,0.71664647,0.69294203,
+    0.66649283,0.63749005,0.60594454,0.57196383,0.53588499,0.49751478,0.45731886,0.41532820,
+    0.37157476,0.32655941,0.28008339,0.23258900,0.18421826,0.13498825,0.08541858,0.03532633,
+        -0.01477011,-0.06484403,-0.11473218,-0.16403499,-0.21287276,-0.26068776,-0.30759189,-0.35330334,
+        -0.39745937,-0.44034482,-0.48118893,-0.52033515,-0.55744565,-0.59217586,-0.62484653,-0.65485557,
+        -0.68237299,-0.70720481,-0.72922605,-0.74844128,-0.76463242,-0.77791303,-0.78803121,-0.79515110,
+        -0.79912784,-0.79991295,-0.79760982,-0.79213348,-0.78357504,-0.77190652,-0.75726750,-0.73956251,
+        -0.71903032,-0.69566485,-0.66949744,-0.64081709,-0.60949649,-0.57585344,-0.53994668,-0.50186725,
+        -0.46190444,-0.42002708,-0.37657016,-0.33162137,-0.28535774,-0.23798769,-0.18965918,-0.14060415,
+        -0.09097694,-0.04101835,0.00910538,0.05920997,0.10908890,0.15849958,0.20731498,0.25533469,
+    0.30228295,0.34816432,0.39253706,0.43546109,0.47665035,0.51592761,0.55326233,0.58832587,
+    0.62117033,0.65148481,0.67930143,0.70446485,0.72679437,0.74634066,0.76287453,0.77649561,
+    0.78697658,0.79449356,0.79875756,0.79993129,0.79808378,0.79283885,0.78476034,0.77346095,
+    0.75904202,0.74183632,0.72155612,0.69850742,0.67272528,0.64425441,0.61327140,0.57990355,
+    0.54425748,0.50642941,0.46664515,0.42501644,0.38172179,0.33690182,0.29085885,0.24349315,
+    0.19532315,0.14639453,0.09668971,0.04690656,-0.00334118,-0.05347545,-0.10324832,-0.15293046,
+        -0.20168273,-0.24986268,-0.29703749,-0.34290206,-0.38759225,-0.43066986,-0.47204307,-0.51164045,
+        -0.54919641,-0.58446375,-0.61765405,-0.64827292,-0.67631250,-0.70189850,-0.72443204,-0.74433977,
+        -0.76131546,-0.77514821,-0.78608132,-0.79387774,-0.79847651,-0.80006347,-0.79848070,-0.79362738,
+        -0.78588958,-0.77485202,-0.76084599,-0.74396436,-0.72392739,-0.70126848,-0.67571063,-0.64754651,
+        -0.61688536,-0.58370727,-0.54834545,-0.51071000,-0.47120359,-0.42975251,-0.38660385,-0.34205031,
+        -0.29598906,-0.24886341,-0.20081323,-0.15184127,-0.10233852,-0.05250254,-0.00230419,0.04777662,
+    0.09765118,0.14732742,0.19617089,0.24444608,0.29166985,0.33771908,0.38254234,0.42573931,
+    0.46741192,0.50707113,0.54487647,0.58052890,0.61379018,0.64482563,0.67312435,0.69891457,
+    0.72190262,0.74208933,0.75933970,0.77358232,0.78489645,0.79293755,0.79804298,0.79997636,
+    0.79863175,0.79432043,0.78680206,0.77616311,0.76258564,0.74590676,0.72630315,0.70394937,
+    0.67871439,0.65087996,0.62049124,0.58757452,0.55248176,0.51511645,0.47577437,0.43458040,
+    0.39161900,0.34717564,0.30136060,0.25431451,0.20631710,0.15750641,0.10801518,0.05819605,
+    0.00809823,-0.04208842,-0.09196099,-0.14164831,-0.19065844,-0.23892391,-0.28636430,-0.33252611,
+        -0.37750958,-0.42094435,-0.46268909,-0.50272900,-0.54067724,-0.57656309,-0.61019121,-0.64136292,
+        -0.67010447,-0.69615947,-0.71943512,-0.74001440,-0.75752601,-0.77216774,-0.78378070,-0.79220160,
+        -0.79768724,-0.79987947,-0.79899348,-0.79501035,-0.78781560,-0.77758804,-0.76428789,-0.74797715,
+        -0.72870118,-0.70666219,-0.68171889,-0.65417549,-0.62410701,-0.59142571,-0.55658142,-0.51949228,
+        -0.48031682,-0.43930115,-0.39658040,-0.35223827,-0.30654111,-0.25969340,-0.21172166,-0.16299281,
+        -0.11361890,-0.06375809,-0.01369681,0.03646564,0.08642498,0.13614517,0.18518911,0.23361013,
+    0.28112734,0.32738716,0.37258596,0.41614909,0.45812030,0.49837235,0.53651251,0.57270509,
+    0.60651635,0.63804435,0.66700314,0.69335331,0.71706092,0.73778754,0.75577474,0.77072884,
+    0.78261215,0.79150385,0.79720866,0.79983724,0.79927948,0.79560810,0.78883009,0.77888148,
+    0.76599495,0.74998715,0.73105320,0.70933393,0.68468489,0.65746983,0.62761284,0.59527417,
+    0.56069107,0.52377552,0.48492024,0.44406387,0.40150660,0.35739977,0.31181774,0.26508573,
+    0.21724355,0.16859524,0.11927125,0.06947467,0.01942960,-0.03076202,-0.08073668,-0.13048747,
+        -0.17966133,-0.22812297,-0.27578558,-0.32220520,-0.36750309,-0.41130468,-0.45337986,-0.49394036,
+        -0.53229337,-0.56866550,-0.60288457,-0.63450118,-0.66390906,-0.69051976,-0.71441583,-0.73567147,
+        -0.75379080,-0.76919856,-0.78140903,-0.79060364,-0.79677568,-0.79959320,-0.79959212,-0.79614390,
+        -0.78972166,-0.78026999,-0.76746947,-0.75205478,-0.73335098,-0.71191677,-0.68768918,-0.66065243,
+        -0.63121473,-0.59902358,-0.56478084,-0.52807453,-0.48937471,-0.44886333,-0.40636918,-0.36251392,
+        -0.31702740,-0.27044532,-0.22273670,-0.17410839,-0.12495939,-0.07505868,-0.02512532,0.02506481,
+    0.07512217,0.12481276,0.17414704,0.22266965,0.27043253,0.31700331,0.36242315,0.40642761,
+    0.44870401,0.48944023,0.52801412,0.56464883,0.59910322,0.63105458,0.66065490,0.68763376,
+    0.71184440,0.73330138,0.75194286,0.76747888,0.78012176,0.78967989,0.79603707,0.79945303,
+    0.79957430,0.79660697,0.79052861,0.78128622,0.76906478,0.75373756,0.73548635,0.71435311,
+    0.69039807,0.66375412,0.63449588,0.60271199,0.56860719,0.53223676,0.49380140,0.45342462,
+    0.41121709,0.36747313,0.32221242,0.27574106,0.22819380,0.17966313,0.13052881,0.08079803,
+    0.03081844,-0.01932163,-0.06940019,-0.11913272,-0.16852635,-0.21711722,-0.26490317,-0.31174590,
+        -0.35720730,-0.40139544,-0.44392802,-0.48473589,-0.52366275,-0.56051723,-0.59516976,-0.62746251,
+        -0.65734451,-0.68456919,-0.70918068,-0.73097613,-0.74986627,-0.76587475,-0.77880156,-0.78874283,
+        -0.79551797,-0.79922321,-0.79974052,-0.79714225,-0.79145372,-0.78255324,-0.77066712,-0.75571066,
+        -0.73779950,-0.71695670,-0.69334328,-0.66700481,-0.63794002,-0.60654109,-0.57263540,-0.53648625,
+        -0.49834661,-0.45807232,-0.41615081,-0.37250416,-0.32742480,-0.28108294,-0.23354556,]);
+
+sbsamples.push([
+    [
+        0.50216155,0.00680032,-0.00000137,0.00000002,-0.00000058,0.00000003,-0.00000080,0.00000006,0.00000000,0.00000000,0.00000000,-0.00000009,-0.00000001,-0.00000007,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000525,-0.00000006,-0.00000599,0.00000445,-0.00000310,-0.00001131,0.00001628,0.00003374,-0.00000330,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.77637817,0.00204130,-0.00000362,-0.00000051,-0.00000213,-0.00000002,-0.00000268,0.00000015,0.00000000,0.00000000,0.00000000,-0.00000029,0.00000075,0.00000023,0.00000000,0.00000000,0.00000000,0.00000000,0.00000006,-0.00000326,-0.00000049,-0.00001189,-0.00001135,-0.00002057,-0.00002578,0.00000041,-0.00001184,-0.00000020,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.15264365,-0.00849133,0.00000627,0.00000083,0.00000234,-0.00000002,0.00000275,-0.00000032,0.00000000,0.00000000,0.00000000,-0.00000053,-0.00000007,-0.00000018,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000007,-0.00000244,0.00000098,-0.00000479,-0.00000908,0.00000258,0.00003650,0.00000526,0.00001343,0.00000331,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.64767570,0.00511821,0.00000143,0.00000013,0.00000011,0.00000003,0.00000011,0.00000001,0.00000000,0.00000000,0.00000000,-0.00000075,-0.00000225,-0.00000024,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000513,-0.00000132,0.00001240,-0.00001029,0.00000305,-0.00000489,0.00001032,0.00000368,-0.00000642,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.69887244,0.00417438,-0.00000535,-0.00000162,-0.00000231,-0.00000001,-0.00000245,0.00000057,0.00000000,0.00000000,0.00000000,-0.00000095,-0.00000123,0.00000100,0.00000000,0.00000000,0.00000000,0.00000000,0.00000006,-0.00000191,0.00000142,0.00000137,-0.00000798,-0.00000595,0.00000275,-0.00001842,0.00002215,0.00001305,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.05840594,-0.00858688,0.00000083,0.00000151,0.00000176,-0.00000002,0.00000187,-0.00000057,0.00000000,0.00000000,0.00000000,-0.00000114,-0.00000017,-0.00000178,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000005,-0.00000323,-0.00000136,-0.00000923,0.00000063,0.00000544,-0.00000980,-0.00000194,-0.00002692,-0.00001855,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.74810072,0.00303342,-0.00000215,0.00000079,0.00000068,0.00000002,0.00000073,-0.00000025,0.00000000,0.00000000,0.00000000,-0.00000138,0.00000308,0.00000219,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000002,0.00000433,0.00000132,0.00000820,-0.00000423,-0.00000631,-0.00001073,0.00001138,0.00001177,0.00001635,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.57249557,0.00607473,-0.00000795,-0.00000273,-0.00000212,-0.00000000,-0.00000251,0.00000100,0.00000000,0.00000000,0.00000000,-0.00000166,-0.00000111,-0.00000187,0.00000000,0.00000000,0.00000000,0.00000000,0.00000006,-0.00000056,-0.00000156,0.00000058,0.00000003,0.00000245,-0.00001120,-0.00002222,0.00000409,-0.00001255,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.26536369,-0.00818151,-0.00000205,0.00000160,0.00000107,-0.00000002,0.00000142,-0.00000063,0.00000000,0.00000000,0.00000000,-0.00000193,0.00000099,0.00000077,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000003,-0.00000335,0.00000205,-0.00001401,-0.00000666,-0.00001334,-0.00000415,-0.00001009,-0.00003539,0.00001825,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.79630931,0.00084112,-0.00000279,0.00000184,0.00000098,0.00000002,0.00000147,-0.00000061,0.00000000,0.00000000,0.00000000,-0.00000210,-0.00000109,0.00000085,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000003,0.00000307,-0.00000260,-0.00000224,-0.00000399,-0.00000886,0.00003206,-0.00001457,-0.00000020,-0.00002839,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.40613560,0.00745760,-0.00000765,-0.00000356,-0.00000163,0.00000000,-0.00000295,0.00000131,0.00000000,0.00000000,0.00000000,-0.00000216,0.00000145,-0.00000244,0.00000000,0.00000000,0.00000000,0.00000000,0.00000004,0.00000043,0.00000294,-0.00001122,0.00000600,0.00000441,0.00001729,0.00001524,0.00000967,0.00002427,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.45376957,-0.00712484,-0.00000182,0.00000112,0.00000044,-0.00000001,0.00000097,-0.00000046,0.00000000,0.00000000,0.00000000,-0.00000216,-0.00000485,0.00000345,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000001,-0.00000276,-0.00000299,-0.00001517,-0.00000104,-0.00000496,0.00001144,0.00001976,0.00000644,-0.00000340,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.78877775,-0.00144935,0.00000110,0.00000299,0.00000092,0.00000001,0.00000249,-0.00000104,0.00000000,0.00000000,0.00000000,-0.00000219,0.00000032,-0.00000342,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000003,0.00000168,0.00000285,-0.00000034,0.00001022,0.00001344,-0.00001504,-0.00001122,-0.00002144,-0.00001078,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.21147646,0.00832181,-0.00000233,-0.00000384,-0.00000096,0.00000001,-0.00000330,0.00000143,0.00000000,0.00000000,0.00000000,-0.00000228,0.00000297,0.00000242,0.00000000,0.00000000,0.00000000,0.00000000,0.00000002,0.00000079,-0.00000273,-0.00001055,-0.00001044,0.00000188,-0.00000643,0.00001089,0.00001194,0.00000141,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.61044634,-0.00556441,-0.00000138,0.00000017,0.00000003,-0.00000001,0.00000018,-0.00000014,0.00000000,0.00000000,0.00000000,-0.00000238,0.00000712,-0.00000078,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000162,0.00000266,-0.00001091,-0.00000583,-0.00001576,-0.00000672,-0.00000676,0.00000406,0.00001305,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.72609369,-0.00364673,-0.00000073,0.00000393,0.00000052,0.00000001,0.00000323,-0.00000137,0.00000000,0.00000000,0.00000000,-0.00000238,0.00000031,-0.00000079,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000001,0.00000054,-0.00000264,-0.00001275,0.00000951,-0.00000910,-0.00000677,0.00000498,-0.00001034,-0.00000269,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.00204458,0.00864864,-0.00000090,-0.00000355,-0.00000028,0.00000000,-0.00000284,0.00000132,0.00000000,0.00000000,0.00000000,-0.00000223,-0.00000569,0.00000172,0.00000000,0.00000000,0.00000000,0.00000000,0.00000001,0.00000043,0.00000258,-0.00000409,0.00001711,0.00000864,-0.00000840,0.00000615,-0.00001165,-0.00002746,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.72451023,-0.00367096,0.00000170,-0.00000097,-0.00000003,0.00000000,-0.00000070,0.00000028,0.00000000,0.00000000,0.00000000,-0.00000196,0.00000020,-0.00000158,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000023,-0.00000245,-0.00000712,0.00000737,-0.00001279,-0.00002363,0.00002263,-0.00002812,0.00003846,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.61297018,-0.00555157,0.00000301,0.00000441,0.00000009,0.00000000,0.00000330,-0.00000154,0.00000000,0.00000003,0.00000009,-0.00000185,0.00000074,0.00000046,0.00000000,0.00000004,0.00000000,0.00000000,0.00000000,0.00000000,0.00000235,0.00000794,-0.00001628,0.00000263,0.00002210,-0.00000726,0.00002150,-0.00000975,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.20761948,0.00837083,0.00000180,-0.00000272,-0.00000018,0.00000000,-0.00000226,0.00000103,0.00000000,-0.00000018,0.00000010,-0.00000179,0.00000665,0.00000121,-0.00000058,0.00000047,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000222,0.00000598,0.00001043,-0.00000235,-0.00000047,-0.00002842,0.00002187,-0.00002930,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.78804777,-0.00148897,0.00000065,-0.00000206,-0.00000023,-0.00000001,-0.00000174,0.00000064,0.00000000,-0.00000049,-0.00000039,-0.00000112,-0.00000143,-0.00000260,-0.00000020,-0.00000087,0.00000000,0.00000000,0.00000000,0.00000000,0.00000033,0.00001693,0.00000692,0.00000681,-0.00001235,-0.00001486,0.00001498,0.00003564,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.45692677,-0.00710386,0.00000235,0.00000432,0.00000068,0.00000000,0.00000386,-0.00000150,0.00000000,-0.00000036,-0.00000052,-0.00000034,0.00000448,0.00000314,0.00000127,-0.00000006,0.00000000,0.00000000,0.00000000,0.00000000,0.00000105,0.00001146,0.00000097,-0.00000907,0.00000369,-0.00000947,0.00000879,-0.00000582,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.40269846,0.00747478,0.00000041,-0.00000158,-0.00000033,0.00000001,-0.00000149,0.00000063,0.00000000,0.00000034,0.00000036,-0.00000061,0.00000137,-0.00000256,0.00000067,0.00000160,0.00000000,0.00000000,0.00000000,0.00000000,0.00000173,0.00001041,0.00001043,-0.00000037,-0.00001362,0.00002392,0.00000478,-0.00002162,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.79654199,0.00078673,-0.00000126,-0.00000273,-0.00000071,-0.00000001,-0.00000250,0.00000090,0.00000000,0.00000103,0.00000104,-0.00000175,0.00000074,0.00000107,-0.00000184,-0.00000154,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000375,-0.00000297,-0.00000798,0.00001205,0.00001062,0.00001962,-0.00000618,0.00001708,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.26905691,-0.00813939,0.00000092,0.00000362,0.00000115,-0.00000001,0.00000340,-0.00000127,0.00000000,0.00000089,0.00000013,-0.00000207,-0.00000301,0.00000080,-0.00000134,-0.00000074,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000022,-0.00000213,-0.00001232,-0.00002440,0.00000576,-0.00002080,-0.00001180,0.00000460,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.56964684,0.00606401,-0.00000280,-0.00000043,-0.00000018,0.00000002,-0.00000047,0.00000022,0.00000000,-0.00000018,-0.00000133,-0.00000042,-0.00000039,-0.00000242,0.00000218,0.00000274,0.00000000,0.00000000,0.00000000,0.00000000,0.00000378,-0.00000497,0.00002257,0.00000083,-0.00003531,-0.00000054,0.00000206,-0.00001438,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.74948363,0.00305202,-0.00000489,-0.00000285,-0.00000129,-0.00000002,-0.00000275,0.00000093,0.00000000,-0.00000135,-0.00000095,0.00000178,0.00000603,0.00000324,0.00000210,-0.00000165,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000237,0.00000673,-0.00000627,0.00000500,-0.00000530,0.00000420,-0.00000454,0.00000954,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.06237446,-0.00864292,0.00000191,0.00000255,0.00000140,-0.00000001,0.00000267,-0.00000091,0.00000000,-0.00000147,0.00000103,0.00000204,0.00000328,-0.00000314,-0.00000230,-0.00000180,0.00000000,0.00000000,0.00000000,0.00000000,0.00000279,0.00000482,-0.00000246,-0.00000251,-0.00000425,-0.00000501,-0.00000393,-0.00000218,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.69687517,0.00422246,0.00000113,0.00000041,0.00000023,0.00000002,0.00000037,-0.00000009,0.00000000,-0.00000024,0.00000173,-0.00000020,0.00000169,0.00000230,-0.00000285,0.00000356,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000564,0.00001786,0.00000931,0.00001342,0.00001684,0.00002643,0.00000098,-0.00000554,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.65008159,0.00509351,-0.00000251,-0.00000234,-0.00000181,-0.00000001,-0.00000294,0.00000078,0.00000000,0.00000140,-0.00000020,-0.00000231,-0.00000383,-0.00000123,0.00000210,-0.00000115,0.00000000,0.00000000,0.00000000,0.00000000,0.00000167,0.00000512,-0.00000574,0.00001615,-0.00000466,0.00000144,-0.00001343,0.00001135,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.14867888,-0.00853837,0.00000295,0.00000136,0.00000135,-0.00000003,0.00000214,-0.00000053,0.00000000,0.00000197,-0.00000200,-0.00000153,0.00000218,0.00000037,0.00000352,-0.00000297,0.00000000,0.00000000,0.00000000,0.00000000,0.00000503,0.00001644,-0.00000332,-0.00001155,-0.00000652,-0.00000431,0.00000498,-0.00000469,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.77539862,0.00212060,0.00000046,0.00000072,0.00000080,0.00000003,0.00000126,-0.00000019,0.00000000,0.00000082,-0.00000088,0.00000159,-0.00000103,-0.00000009,-0.00000163,0.00000387,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000088,0.00000380,-0.00000441,-0.00001749,-0.00001051,-0.00002275,-0.00000956,-0.00001307,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.50519433,0.00673610,-0.00000617,-0.00000137,-0.00000216,-0.00000001,-0.00000354,0.00000046,0.00000000,-0.00000115,0.00000164,0.00000346,0.00000293,0.00000033,-0.00000405,-0.00000019,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000844,0.00001816,0.00000174,-0.00002018,-0.00000032,-0.00000034,0.00000678,0.00002412,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.34927145,-0.00778829,0.00000071,0.00000039,0.00000102,-0.00000003,0.00000176,-0.00000020,0.00000000,-0.00000221,0.00000174,0.00000176,-0.00000177,-0.00000094,0.00000092,-0.00000393,0.00000000,0.00000000,0.00000000,0.00000000,0.00000672,-0.00000650,0.00000984,0.00002375,0.00000044,-0.00000565,-0.00000792,-0.00001858,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+        0.79982167,-0.00015507,0.00000216,0.00000041,0.00000136,0.00000002,0.00000247,-0.00000009,0.00000000,-0.00000137,-0.00000079,-0.00000174,0.00000215,0.00000152,0.00000441,0.00000357,0.00000000,0.00000000,0.00000000,0.00000000,0.00000141,-0.00000292,-0.00000176,0.00000368,-0.00000461,-0.00002627,0.00001206,0.00000268,0.00000000,0.00000000,0.00000000,0.00000000],
+    [
+            -0.32522729,0.00791328,-0.00000485,-0.00000017,-0.00000221,0.00000001,-0.00000428,0.00000009,0.00000000,0.00000069,-0.00000216,-0.00000305,-0.00000117,-0.00000188,-0.00000013,0.00000098,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000268,-0.00000104,-0.00000921,0.00001280,0.00000854,0.00001386,-0.00001070,0.00001378,0.00000000,0.00000000,0.00000000,0.00000000],
+]);
+pcm.push([
+        -0.18523202,
+        -0.13606985,-0.08642357,-0.03648722,0.01373664,0.06375306,0.11359356,0.16299612,0.21169399,
+    0.25964174,0.30653397,0.35216771,0.39654073,0.43921769,0.48025969,0.51942831,0.55643034,
+    0.59144467,0.62391630,0.65407912,0.68169625,0.70643118,0.72868417,0.74780617,0.76414371,
+    0.77752060,0.78764695,0.79491328,0.79885793,0.79979540,0.79756286,0.79210262,0.78371775,
+    0.77205274,0.75749268,0.73994082,0.71938029,0.69614530,0.67004606,0.64139235,0.61018969,
+    0.57657902,0.54074156,0.50271046,0.46281214,0.42098905,0.37756529,0.33266595,0.28637718,
+    0.23911501,0.19073746,0.14172436,0.09217972,0.04209889,-0.00791229,-0.05804198,-0.10796348,
+        -0.15730760,-0.20623966,-0.25415892,-0.30123429,-0.34706601,-0.39147732,-0.43451557,-0.47561809,
+        -0.51505782,-0.55237179,-0.58747825,-0.62043800,-0.65074789,-0.67868648,-0.70384296,-0.72625914,
+        -0.74587569,-0.76247196,-0.77615054,-0.78674903,-0.79426166,-0.79863513,-0.79990122,-0.79799920,
+        -0.79298044,-0.78483295,-0.77356053,-0.75937988,-0.74203785,-0.72189159,-0.69897094,-0.67308080,
+        -0.64482183,-0.61387221,-0.58047030,-0.54495532,-0.50713303,-0.46738849,-0.42583477,-0.38254770,
+        -0.33780828,-0.29171716,-0.24448382,-0.19628455,-0.14731947,-0.09777498,-0.04785819,0.00228361,
+    0.05236501,0.10229710,0.15176921,0.20069565,0.24881641,0.29591741,0.34196961,0.38652442,
+    0.42969859,0.47112203,0.51062683,0.54831409,0.58360355,0.61679709,0.64749169,0.67558287,
+    0.70120052,0.72384446,0.74379731,0.76078079,0.77473840,0.78574932,0.79351646,0.79835905,
+    0.79991977,0.79835701,0.79379454,0.78587284,0.77508751,0.76117448,0.74419040,0.72444275,
+    0.70170676,0.67628338,0.64820279,0.61756663,0.58450259,0.54912532,0.51162580,0.47207021,
+    0.43071224,0.38761156,0.34299944,0.29708512,0.24994041,0.20184143,0.15299345,0.10345661,
+    0.05356988,0.00348664,-0.04663510,-0.09660732,-0.14613106,-0.19511111,-0.24338234,-0.29056989,
+        -0.33671050,-0.38156452,-0.42476307,-0.46646558,-0.50626963,-0.54401149,-0.57974639,-0.61313098,
+        -0.64406173,-0.67258645,-0.69836408,-0.72141761,-0.74172173,-0.75898308,-0.77331620,-0.78469389,
+        -0.79283654,-0.79795990,-0.79995214,-0.79873139,-0.79445370,-0.78698808,-0.77650704,-0.76288806,
+        -0.74634522,-0.72688849,-0.70443350,-0.67940587,-0.65156895,-0.62118882,-0.58844798,-0.55330314,
+        -0.51605451,-0.47672141,-0.43559298,-0.39262751,-0.34825467,-0.30245225,-0.25540053,-0.20751986,
+        -0.15859416,-0.10923524,-0.05938857,-0.00921496,0.04080244,0.09086874,0.14043788,0.18950522,
+    0.23784229,0.28520459,0.33148776,0.37641256,0.41995085,0.46170640,0.50178396,0.53982318,
+    0.57570716,0.60949671,0.64059260,0.66949932,0.69558461,0.71888957,0.73962196,0.75712553,
+    0.77191271,0.78355949,0.79209742,0.79762421,0.79990298,0.79915556,0.79513922,0.78813087,
+    0.77791246,0.76469275,0.74851156,0.72925150,0.70734197,0.68241056,0.65494257,0.62493477,
+    0.59227580,0.55754716,0.52039752,0.48134350,0.44039562,0.39756141,0.35346226,0.30763575,
+    0.26082863,0.21299036,0.16411973,0.11487748,0.06495411,0.01488607,-0.03522288,-0.08530012,
+        -0.13488069,-0.18410581,-0.23247967,-0.27998092,-0.32644325,-0.37150167,-0.41518239,-0.45724984,
+        -0.49741612,-0.53573815,-0.57192780,-0.60578121,-0.63742096,-0.66642056,-0.69277720,-0.71662722,
+        -0.73737538,-0.75538430,-0.77048293,-0.78233440,-0.79134907,-0.79712277,-0.79976739,-0.79934602,
+        -0.79571680,-0.78901200,-0.77913346,-0.76628906,-0.75035992,-0.73148207,-0.70980939,-0.68524082,
+        -0.65807159,-0.62828229,-0.59599883,-0.56141238,-0.52461741,-0.48571989,-0.44498748,-0.40244156,
+        -0.35831488,-0.31286497,-0.26606245,-0.21832697,-0.16967960,-0.12033731,-0.07060830,-0.02048146,
+    0.02958263,0.07966479,0.12937040,0.17849778,0.22711566,0.27461233,0.32115822,0.36650651,
+    0.41021771,0.45253193,0.49291996,0.53140434,0.56789068,0.60200985,0.63384780,0.66320751,
+    0.68988165,0.71393302,0.73516647,0.75343291,0.76886556,0.78117613,0.79043354,0.79667540,
+    0.79962140,0.79960466,0.79631488,0.78994114,0.78055052,0.76790277,0.75240365,0.73388980,
+    0.71244850,0.68827716,0.66136347,0.63185544,0.59985418,0.56551491,0.52897025,0.49029174,
+    0.44974324,0.40742199,0.36343077,0.31810906,0.27149709,0.22374180,0.17527032,0.12593952,
+    0.07621926,0.02621942,-0.02402145,-0.07400033,-0.12381868,-0.17309018,-0.22164683,-0.26943893,
+        -0.31604105,-0.36154604,-0.40548263,-0.44793006,-0.48861482,-0.52726775,-0.56401611,-0.59842861,
+        -0.63050979,-0.66013911,-0.68717552,-0.71145244,-0.73300850,-0.75167696,-0.76726992,-0.78007842,
+        -0.78961725,-0.79614019,-0.79957505,-0.79974549,-0.79691767,-0.79083189,-0.78174176,-0.76948938,
+        -0.75431045,-0.73611066,-0.71495799,-0.69120605,-0.66444504,-0.63533664,-0.60362410,-0.56942919,
+        -0.53326617,-0.49470915,-0.45445156,-0.41227397,-0.36849238,-0.32335957,-0.27674893,-0.22933908,
+        -0.18075655,-0.13158909,-0.08197533,-0.03184583,0.01818251,0.06832628,0.11807429,0.16743817,
+    0.21611827,0.26390063,0.31074755,0.35627444,0.40047503,0.44305442,0.48390959,0.52286372,
+    0.55977934,0.59447675,0.62681342,0.65679374,0.68403050,0.70875401,0.73058125,0.74951322,
+    0.76565472,0.77860077,0.78862886,0.79552156,0.79923736,0.79989788,0.79732261,0.79172460,
+    0.78292159,0.77104598,0.75622231,0.73834313,0.71760170,0.69403544,0.66775068,0.63879558,
+    0.60742887,0.57360897,0.53749618,0.49937661,0.45919345,0.41725207,0.37370333,0.32860124,
+    0.28227676,0.23483068,0.18643698,0.13733467,0.08768894,0.03765539,-0.01244098,-0.06256716,
+        -0.11240646,-0.16181349,-0.21061349,-0.25852682,-0.30549257,-0.35118361,-0.39554774,-0.43839326,
+        -0.47939299,-0.51864067,-0.55576975,-0.59070583,-0.62342135,-0.65355561,-0.68119606,-0.70617710,
+        -0.72832205,-0.74769515,-0.76402182,-0.77744102,-0.78776523,-0.79494995,-0.79913260,-0.80002580,
+        -0.79789865,-0.79259821,-0.78411181,-0.77269162,-0.75809360,-0.74059055,-0.72019595,-0.69688050,
+        -0.67091595,-0.64227705,-0.61112482,-0.57756202,-0.54177021,-0.50379242,-0.46381269,-0.42216862,
+        -0.37864737,-0.33376761,-0.28761806,-0.24014809,-0.19198278,-0.14287532,-0.09329550,-0.04333415,
+    0.00685699,0.05688217,0.10685458,0.15625420,0.20514046,0.25323209,0.30017279,0.34617089,
+    0.39058609,0.43359319,0.47491911,0.51424853,0.55170745,0.58688767,0.61981874,0.65029516,
+    0.67822507,0.70350441,0.72594326,0.74569263,0.76233490,0.77609650,0.78677044,0.79433551,
+    0.79884340,0.80009021,0.79837002,0.79332196,0.78530404,0.77413993,0.75988072,0.74281587,
+    0.72258676,0.69976348,0.67401450,0.64564247,0.61488867,0.58144998,0.54599179,0.50822129,
+    0.46848746,0.42698808,0.38370968,0.33897817,0.29290679,0.24568402,0.19745697,0.14857246,
+    0.09893368,0.04902501,-0.00104688,-0.05132506,-0.10105120,-0.15072465,-0.19962798,-0.24769508,
+        -0.29504970,-0.34086318,-0.38568136,-0.42880246,-0.47021161,-0.50998244,-0.54743346,-0.58303036,
+        -0.61619274,-0.64691363,-0.67519590,-0.70073025,-0.72355675,-0.74352440,-0.76059203,-0.77462824,
+        -0.78568533,-0.79360908,-0.79841486,-0.80011246,-0.79865114,-0.79405129,-0.78632013,-0.77554668,
+        -0.76161671,-0.74483460,-0.72504606,-0.70240602,-0.67708848,-0.64897736,-0.61841677,-0.58539556,
+        -0.55011034,-0.51255349,-0.47309740,-0.43178510,-0.38860445,-0.34420044,-0.29818103,-0.25102520,
+        -0.20308317,-0.15405305,-0.10467603,-0.05474506,-0.00458614,0.04548984,0.09548490,0.14501233,
+    0.19404357,0.24230470,0.28957171,0.33575993,0.38058105,0.42389013,0.46563464,0.50545095,
+    0.54326887,0.57910551,0.61241535,0.64358742,0.67210498,0.69788429,0.72114522,0.74135048,
+    0.75881946,0.77318693,0.78456079,0.79287446,0.79796823,0.80012436,0.79890738,0.79471923,
+    0.78736570,0.77683800,0.76342219,0.74682914,0.72742293,0.70509910,0.68000673,0.65229423,
+    0.62196804,0.58920791,0.55413009,0.51690561,0.47758513,0.43648011,0.39358319,0.34911194,
+    0.30342340,0.25634307,0.20840547,0.15961709,0.11011035,0.06032203,0.01018411,-0.03996015,
+        -0.08994148,-0.13958040,-0.18865587,-0.23699862,-0.28437239,-0.33072082,-0.37565209,-0.41919009,
+        -0.46108398,-0.50108561,-0.53921202,-0.57517780,-0.60887079,-0.64018760,-0.66897904,-0.69516834,
+        -0.71857592,-0.73924051,-0.75692462,-0.77164231,-0.78343535,-0.79197345,-0.79753991,-0.79995510,
+        -0.79909996,-0.79531892,-0.78823699,-0.77813622,-0.76503626,-0.74878800,-0.72969685,-0.70775365,
+        -0.68295121,-0.65550834,-0.62554903,-0.59298625,-0.55823698,-0.52124225,-0.48216084,-0.44128950,
+        -0.39854801,-0.35434650,-0.30872197,-0.26185796,-0.21403851,-0.16526662,-0.11594645,-0.06611114,
+        -0.01606574,0.03406729,0.08409339,0.13376291,0.18293061,0.23131261,0.27885603,0.32527144,
+    0.37042570,0.41415530,0.45613257,0.49648422,0.53476717,0.57099497,0.60502348,0.63655465,
+    0.66569159,0.69216217,0.71592932,0.73690317,0.75493276,0.77000302,0.78207872,0.79108262,
+    0.79697381,0.79972752,0.79929661,0.79580513,0.78912084,0.77938716,0.76656295,0.75067472,
+    0.73196157,0.71025525,0.68583051,0.65869351,0.62893039,0.59672075,0.56219902,0.52542731,
+    0.48657360,0.44590189,0.40332628,0.35931325,0.31386679,0.26707424,0.21937875,0.17071250,
+    0.12141448,0.07164327,0.02162896,-0.02856125,-0.07858144,-0.12824835,-0.17754292,-0.22597615,
+        -0.27364806,-0.32023561,-0.36546099,-0.40939318,-0.45159384,-0.49208900,-0.53061917,-0.56711408,
+        -0.60130731,-0.63317961,-0.66261001,-0.68929655,-0.71349898,-0.73468059,-0.75304436,-0.76856625,
+        -0.78083233,-0.79028975,-0.79648028,-0.79956821,-0.79958909,-0.79637560,-0.79007962,-0.78069152,
+        -0.76821779,-0.75267106,-0.73428738,-0.71292084,-0.68877889,-0.66194637,-0.63250652,-0.60056247,
+        -0.56627841,-0.52981702,-0.49112580,-0.45068321,-0.40837479,-0.36441665,-0.31917251,-0.27252364,
+        -0.22489100,-0.17634865,-0.12715565,-0.07731957,-0.02737398,0.02278194,0.07293547,0.12252111,
+    0.17200434,0.22051099,0.26824115,0.31504603,0.36032920,0.40455614,0.44684114,0.48763979,
+    0.52640809,0.56300228,0.59770333,0.62962176,0.65946477,0.68647398,0.71079349,0.73255361,
+    0.75108240,0.76700450,0.77965694,0.78936376,0.79600859,0.79936975,0.79977473,0.79690249,
+    0.79097408,0.78191038,0.76980237,0.75458805,0.73654683,0.71550800,0.69162521,0.66521245,
+    0.63589165,0.60437025,0.57031345,0.53400179,0.49575021,0.45530651,0.41332256,0.36954586,
+    0.32438368,0.27792908,0.23035414,0.18198875,0.13273385,0.08313440,0.03308173,-0.01710944,
+        -0.06708081,-0.11697217,-0.16629093,-0.21498524,-0.26288631,-0.30967684,-0.35522478,-0.39951842,
+        -0.44211114,-0.48300853,-0.52207600,-0.55892961,-0.59375313,-0.62619083,-0.65611341,-0.68351833,
+        -0.70821169,-0.73011381,-0.74917157,-0.76536771,-0.77833192,-0.78848135,-0.79538798,-0.79917846,
+        -0.79998631,-0.79735455,-0.79188091,-0.78310766,-0.77134910,-0.75655732,-0.73870246,-0.71812667,
+        -0.69446840,-0.66838328,-0.63944539,-0.60803157,-0.57440667,-0.53819835,-0.50022275,-0.46005271,
+        -0.41813886,-0.37465281,-0.32955078,-0.28330962,-0.23581899,-0.18749578,-0.13840424,-0.08873422,
+        -0.03880610,0.01138446,0.06146632,0.11129853,0.16071333,0.20951928,0.25744225,0.30442897,
+    0.35018271,0.39450549,0.43737384,0.47848184,0.51768572,0.55488022,0.58990471,0.62254979,
+    0.65287387,0.68055169,0.70547942,0.72784682,0.74709526,0.76361502,0.77707368,0.78737492,
+    0.79478377,0.79885633,0.79997239,0.79783180,0.79259978,0.78425990,0.77275819,0.75839069,
+    0.74081720,0.72055322,0.69732291,0.67136314,0.64290153,0.61168360,0.57828193,0.54248570,
+    0.50455961,0.46470921,0.42297149,0.37964177,0.33474197,0.28858437,0.24129875,0.19298394,
+    0.14402208,0.09442490,0.04443070,-0.00562621,-0.05577442,-0.10568646,-0.15507117,-0.20402762,
+        -0.25202318,-0.29910874,-0.34503536,-0.38952627,-0.43260127,-0.47384460,-0.51336423,-0.55076805,
+        -0.58598011,-0.61906365,-0.64947664,-0.67757526,-0.70287194,-0.72537279,-0.74517202,-0.76189474,
+        -0.77573987,-0.78644158,-0.79409172,-0.79865743,-0.80000141,-0.79828081,-0.79340265,-0.78534600,
+        -0.77431792,-0.76018368,-0.74299566,-0.72307405,-0.70009110,-0.67447310,-0.64627312,-0.61533490,
+        -0.58222225,-0.54662575,-0.50895440,-0.46931400,-0.42776816,-0.38461657,-0.33985719,-0.29386974,
+        -0.24660784,-0.19848268,-0.14956952,-0.09994879,-0.05015814,0.00008417,0.05016474,0.10001195,
+    0.14968145,0.19850823,0.24669463,0.29394643,0.33988194,0.38463315,0.42783176,0.46929482,
+    0.50900040,0.54668707,0.58212702,0.61542736,0.64622347,0.67445011,0.70015857,0.72296071,
+    0.74298340,0.76017779,0.77421732,0.78535643,0.79338461,0.79815369,0.80003048,0.79857827,
+    0.79398768,0.78645983,0.77557761,0.76190609,0.74512416,0.72532671,0.70287316,0.67748350,
+    0.64954498,0.61899122,0.58601935,0.55078791,0.51330279,0.47389989,0.43258661,0.38953734,
+    0.34506774,0.29912215,0.25205215,0.20405122,0.15510129,0.10568113,0.05581196,0.00563032,
+        -0.04436769,-0.09443828,-0.14400385,-0.19296171,-0.24132632,-0.28851683,-0.33476147,-0.37967047,
+        -0.42295226,-0.46474309,-0.50456281,-0.54250660,-0.57829082,-0.61178171,-0.64288958,-0.67141888,
+        -0.69741955,-0.72057257,-0.74093350,-0.75842237,-0.77282503,-0.78428502,-0.79268871,-0.79787127,
+        -0.79999647,-0.79899310,-0.79474182,-0.78753588,-0.77711822,-0.76362213,-0.74724790,-0.72779797,
+        -0.70561416,-0.68059553,-0.65289591,-0.62266108,-0.58992933,-0.55494412,-0.51774002,-0.47851403,
+        -0.43739012,-0.39455017,-0.35017780,-0.30443143,-0.25750665,-0.20947630,-0.16073419,-0.11131814,
+        -0.06141506,-0.01137848,0.03881337,0.08879579,0.13839019,0.18754808,0.23586136,0.28330300,
+    0.32963684,0.37464042,0.41820304,0.46013485,0.50018391,0.53834219,0.57436664,0.60810337,
+    0.63951298,0.66832783,0.69458503,0.71809597,0.73877046,0.75656781,0.77132369,0.78317693,
+    0.79180533,0.79742854,0.79992025,0.79914575,0.79543839,0.78842606,0.77835251,0.76537160,
+    0.74912732,0.73010410,0.70825343,0.68343793,0.65614158,0.62614717,0.59367426,0.55898655,
+    0.52199624,0.48300597,0.44211162,0.39946296,0.35527634,0.30963460,0.26287565,]);
+
+var ns = 36;
+var synth = new Mad.Synth();
+
+for (var i = 0; i < 1000; i++) {
+    for (var x = 0; x < sbsamples.length; x++) {    
+        var frame = new Mad.Frame();
+        frame.sbsample[0] = sbsamples[x];
+        synth.full(frame, 1, ns);
+        synth.phase = (synth.phase + ns) % 16;
+
+        // for (var i = 0; i < 1152; i++) {
+        //     console.log(Math.abs(synth.pcm.samples[0][i] - pcm[x][i]));
+        // }
+    }
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/graph.svg
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/graph.svg	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/graph.svg	(revision 28388)
@@ -0,0 +1,3020 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<desc>Produced by GNUPLOT 4.4 patchlevel 2 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,444.0 L575.0,444.0 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,444.0 L62.9,444.0 M575.0,444.0 L566.0,444.0 '></path>
+	<g transform="translate(45.6,448.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>-1.5</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,372.8 L575.0,372.8 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,372.8 L62.9,372.8 M575.0,372.8 L566.0,372.8 '></path>
+	<g transform="translate(45.6,377.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>-1</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,301.6 L575.0,301.6 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,301.6 L62.9,301.6 M575.0,301.6 L566.0,301.6 '></path>
+	<g transform="translate(45.6,306.1)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>-0.5</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,230.4 L575.0,230.4 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,230.4 L62.9,230.4 M575.0,230.4 L566.0,230.4 '></path>
+	<g transform="translate(45.6,234.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,159.1 L575.0,159.1 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,159.1 L62.9,159.1 M575.0,159.1 L566.0,159.1 '></path>
+	<g transform="translate(45.6,163.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.5</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,87.9 L575.0,87.9 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,87.9 L62.9,87.9 M575.0,87.9 L566.0,87.9 '></path>
+	<g transform="translate(45.6,92.4)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,16.7 L575.0,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,16.7 L62.9,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(45.6,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1.5</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,444.0 L53.9,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,444.0 L53.9,435.0 M53.9,16.7 L53.9,25.7 '></path>
+	<g transform="translate(53.9,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M106.0,444.0 L106.0,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M106.0,444.0 L106.0,435.0 M106.0,16.7 L106.0,25.7 '></path>
+	<g transform="translate(106.0,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 5000</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M158.1,444.0 L158.1,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M158.1,444.0 L158.1,435.0 M158.1,16.7 L158.1,25.7 '></path>
+	<g transform="translate(158.1,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 10000</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M210.2,444.0 L210.2,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M210.2,444.0 L210.2,435.0 M210.2,16.7 L210.2,25.7 '></path>
+	<g transform="translate(210.2,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 15000</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M262.3,444.0 L262.3,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M262.3,444.0 L262.3,435.0 M262.3,16.7 L262.3,25.7 '></path>
+	<g transform="translate(262.3,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 20000</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M314.4,444.0 L314.4,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M314.4,444.0 L314.4,435.0 M314.4,16.7 L314.4,25.7 '></path>
+	<g transform="translate(314.4,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 25000</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M366.6,444.0 L366.6,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M366.6,444.0 L366.6,435.0 M366.6,16.7 L366.6,25.7 '></path>
+	<g transform="translate(366.6,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 30000</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M418.7,444.0 L418.7,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M418.7,444.0 L418.7,435.0 M418.7,16.7 L418.7,25.7 '></path>
+	<g transform="translate(418.7,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 35000</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M470.8,444.0 L470.8,61.7 M470.8,25.7 L470.8,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M470.8,444.0 L470.8,435.0 M470.8,16.7 L470.8,25.7 '></path>
+	<g transform="translate(470.8,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 40000</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M522.9,444.0 L522.9,61.7 M522.9,25.7 L522.9,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M522.9,444.0 L522.9,435.0 M522.9,16.7 L522.9,25.7 '></path>
+	<g transform="translate(522.9,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 45000</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M575.0,444.0 L575.0,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M575.0,444.0 L575.0,435.0 M575.0,16.7 L575.0,25.7 '></path>
+	<g transform="translate(575.0,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 50000</text>
+	</g>
+	<path  d='M53.9,16.7 L53.9,444.0 L575.0,444.0 L575.0,16.7 L53.9,16.7 Z '></path>
+</g>
+	<a xlink:title="Plot #1">
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<g transform="translate(507.9,39.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>jsmad</text>
+	</g>
+	<path  d='M516.2,34.7 L558.4,34.7 M53.9,230.4 L54.0,230.4 L54.1,230.4 L54.2,230.4 L54.3,230.4 L54.4,230.4 
+		L54.5,230.4 L54.6,230.4 L54.7,230.4 L54.8,230.4 L54.9,230.4 L55.0,230.4 L55.1,230.4 L55.2,230.4 
+		L55.3,230.4 L55.4,230.4 L55.5,230.4 L55.6,230.4 L55.7,230.4 L55.8,230.4 L55.9,230.4 L56.0,230.4 
+		L56.1,230.4 L56.2,230.4 L56.3,230.4 L56.4,230.4 L56.5,230.4 L56.6,230.4 L56.7,230.4 L56.8,230.4 
+		L56.9,230.4 L57.0,230.4 L57.1,230.4 L57.2,230.4 L57.3,230.4 L57.4,230.4 L57.5,230.4 L57.6,230.4 
+		L57.7,230.4 L57.8,230.4 L57.9,230.4 L58.0,230.4 L58.1,230.4 L58.2,230.4 L58.3,230.4 L58.4,230.4 
+		L58.5,230.4 L58.6,230.4 L58.7,230.4 L58.8,230.4 L58.9,230.4 L59.0,230.4 L59.1,230.4 L59.2,230.4 
+		L59.3,230.4 L59.4,230.4 L59.5,230.4 L59.6,230.4 L59.7,230.4 L59.8,230.4 L59.9,230.4 L60.0,230.4 
+		L60.1,230.4 L60.2,230.4 L60.3,230.4 L60.4,230.4 L60.5,230.4 L60.6,230.4 L60.7,230.4 L60.8,230.4 
+		L60.9,230.4 L61.0,230.4 L61.1,230.4 L61.2,230.4 L61.3,230.4 L61.4,230.4 L61.5,230.4 L61.6,230.4 
+		L61.7,230.4 L61.8,230.4 L61.9,230.4 L62.0,230.4 L62.1,230.4 L62.2,230.4 L62.3,230.4 L62.4,230.4 
+		L62.5,230.4 L62.6,230.4 L62.7,230.4 L62.8,230.4 L62.9,230.4 L63.0,230.4 L63.1,230.4 L63.2,230.4 
+		L63.3,230.4 L63.4,230.4 L63.5,230.4 L63.6,230.4 L63.7,230.4 L63.8,230.4 L63.9,230.4 L64.0,230.4 
+		L64.1,230.4 L64.2,230.4 L64.3,230.4 L64.4,230.4 L64.5,230.4 L64.6,230.4 L64.7,230.4 L64.8,230.4 
+		L64.9,230.4 L65.0,230.4 L65.1,230.4 L65.2,230.4 L65.3,230.4 L65.4,230.4 L65.5,230.4 L65.6,230.4 
+		L65.7,230.4 L65.8,230.4 L65.9,230.4 L65.9,233.9 L65.9,233.7 L65.9,233.5 L65.9,233.1 L66.0,232.5 
+		L66.0,231.7 L66.0,230.6 L66.0,229.4 L66.0,228.0 L66.0,226.8 L66.0,225.7 L66.0,225.0 L66.0,224.8 
+		L66.1,225.0 L66.1,225.8 L66.1,226.9 L66.1,228.3 L66.1,232.0 L66.1,231.1 L66.1,231.0 L66.1,231.2 
+		L66.1,231.3 L66.1,231.4 L66.2,231.4 L66.2,231.3 L66.2,231.2 L66.2,231.1 L66.2,231.0 L66.2,230.9 
+		L66.2,230.8 L66.2,230.7 L66.3,230.6 L66.3,230.5 L66.3,230.2 L66.4,230.2 L66.4,230.3 L66.5,230.3 
+		L66.5,230.4 L66.6,230.4 L66.7,230.3 L66.8,230.3 L66.8,230.4 L66.9,230.4 L67.0,230.4 L67.0,230.3 
+		L67.0,230.4 L67.1,230.4 L67.1,230.3 L67.2,230.3 L67.2,230.4 L67.2,230.3 L67.3,230.3 L67.3,230.4 
+		L67.3,230.3 L67.4,230.3 L67.4,230.4 L67.5,230.4 L67.6,230.4 L67.6,230.3 L67.7,230.3 L67.8,230.3 
+		L67.8,230.4 L67.9,230.4 L68.0,230.4 L68.0,230.3 L68.1,230.3 L68.2,230.4 L68.3,230.4 L68.3,230.3 
+		L68.4,230.3 L68.5,230.3 L68.5,230.4 L68.6,230.4 L68.7,230.4 L68.7,230.3 L68.8,230.3 L68.9,230.3 
+		L68.9,230.4 L69.0,230.4 L69.1,230.4 L69.1,230.3 L69.2,230.3 L69.3,230.3 L69.3,230.4 L69.4,230.4 
+		L69.5,230.4 L69.5,230.3 L69.6,230.3 L69.7,230.4 L69.8,230.4 L69.8,230.3 L69.9,230.3 L70.0,230.3 
+		L70.0,230.4 L70.1,230.4 L70.2,230.4 L70.2,230.3 L70.3,230.3 L70.4,230.3 L70.4,230.4 L70.5,230.4 
+		L70.6,230.4 L70.6,230.3 L70.7,230.3 L70.8,230.3 L70.8,230.4 L70.9,230.4 L71.0,230.4 L71.0,230.3 
+		L71.1,230.3 L71.1,230.4 L71.2,230.4 L71.3,230.4 L71.4,230.4 L71.5,230.4 L71.6,230.4 L71.7,230.4 
+		L71.8,230.4 L71.9,230.4 L71.9,236.2 L71.9,217.7 L71.9,237.0 L71.9,114.6 L72.0,229.6 L72.0,228.5 
+		L72.0,239.3 L72.0,145.0 L72.0,229.1 L72.0,230.0 L72.0,242.0 L72.0,207.0 L72.0,182.5 L72.0,244.8 
+		L72.1,231.8 L72.1,227.8 L72.1,159.5 L72.1,224.0 L72.1,230.4 L72.1,231.1 L72.1,138.9 L72.1,226.7 
+		L72.1,230.3 L72.1,231.3 L72.2,234.4 L72.2,228.1 L72.2,232.4 L72.2,228.1 L72.2,231.3 L72.2,230.2 
+		L72.2,230.4 L72.2,230.6 L72.3,230.2 L72.3,230.4 L72.3,229.9 L72.3,231.3 L72.3,229.4 L72.3,231.1 
+		L72.3,230.4 L72.3,230.3 L72.3,230.4 L72.4,230.4 L72.4,229.6 L72.4,231.3 L72.4,230.6 L72.4,229.9 
+		L72.5,230.8 L72.5,229.9 L72.5,230.3 L72.5,230.4 L72.5,230.3 L72.5,230.4 L72.5,230.3 L72.5,230.4 
+		L72.6,230.4 L72.6,230.8 L72.6,229.8 L72.6,230.2 L72.6,230.6 L72.6,230.1 L72.6,230.6 L72.7,230.1 
+		L72.7,230.7 L72.7,230.4 L72.7,230.3 L72.7,230.4 L72.7,230.3 L72.7,230.4 L72.7,230.3 L72.8,230.4 
+		L72.9,230.2 L72.9,230.5 L72.9,230.2 L72.9,230.5 L72.9,230.1 L72.9,230.3 L72.9,230.5 L72.9,230.2 
+		L72.9,230.5 L73.0,230.3 L73.0,230.4 L73.0,230.3 L73.0,230.4 L73.0,230.3 L73.0,230.4 L73.0,230.3 
+		L73.0,230.4 L73.1,230.4 L73.2,230.2 L73.2,230.5 L73.2,230.4 L73.2,230.3 L73.2,230.5 L73.2,230.2 
+		L73.2,230.5 L73.2,230.2 L73.2,230.3 L73.3,230.4 L73.3,230.3 L73.3,230.4 L73.3,230.3 L73.3,230.4 
+		L73.3,230.3 L73.3,230.4 L73.3,230.3 L73.3,230.4 L73.4,230.3 L73.4,230.4 L73.4,230.3 L73.4,230.4 
+		L73.5,230.4 L73.5,230.3 L73.5,230.4 L73.6,230.4 L73.6,230.3 L73.6,230.4 L73.6,230.3 L73.6,230.4 
+		L73.6,230.3 L73.6,230.4 L73.6,230.3 L73.6,230.4 L73.7,230.3 L73.7,230.4 L73.7,230.3 L73.7,230.4 
+		L73.8,230.3 L73.8,230.4 L73.9,230.4 L74.0,230.4 L74.0,230.3 L74.0,230.4 L74.0,230.3 L74.0,230.4 
+		L74.0,230.3 L74.0,230.4 L74.1,230.3 L74.1,230.4 L74.1,230.3 L74.1,230.4 L74.1,230.3 L74.1,230.4 
+		L74.1,230.3 L74.1,230.4 L74.1,230.3 L74.2,230.4 L74.2,230.3 L74.2,230.4 L74.3,230.3 L74.3,230.4 
+		L74.4,230.4 L74.5,230.4 L74.5,230.3 L74.5,230.4 L74.5,230.3 L74.5,230.4 L74.6,230.3 L74.6,230.4 
+		L74.6,230.3 L74.6,230.4 L74.6,230.3 L74.6,230.4 L74.6,230.3 L74.6,230.4 L74.7,230.3 L74.7,230.4 
+		L74.7,230.3 L74.7,230.4 L74.7,230.3 L74.7,230.4 L74.7,230.3 L74.7,230.4 L74.8,230.3 L74.8,230.4 
+		L74.8,230.3 L74.8,230.4 L74.9,230.4 L75.0,230.4 L75.1,230.4 L75.2,230.4 L75.2,230.3 L75.3,230.4 
+		L75.3,230.3 L75.3,230.4 L75.3,230.3 L75.3,230.4 L75.3,230.3 L75.3,230.4 L75.3,230.3 L75.3,230.4 
+		L75.4,230.3 L75.4,230.4 L75.4,230.3 L75.4,230.4 L75.4,230.3 L75.4,230.4 L75.4,230.3 L75.5,230.4 
+		L75.5,230.3 L75.5,230.4 L75.5,230.3 L75.5,230.4 L75.6,230.4 L75.6,230.3 L75.6,230.4 L75.7,230.4 
+		L75.7,230.3 L75.7,230.4 L75.8,230.4 L75.8,230.3 L75.8,230.4 L75.9,230.4 L76.0,230.4 L76.0,230.3 
+		L76.0,230.4 L76.1,230.4 L76.1,230.3 L76.1,230.4 L76.1,230.3 L76.1,230.4 L76.2,230.4 L76.2,230.3 
+		L76.2,230.4 L76.2,230.3 L76.2,230.4 L76.3,230.3 L76.3,230.4 L76.3,230.3 L76.3,230.4 L76.3,230.3 
+		L76.3,230.4 L76.4,230.4 L76.5,230.4 L76.6,230.4 L76.7,230.4 L76.8,230.4 L76.8,230.3 L76.8,230.4 
+		L76.8,230.3 L76.8,230.4 L76.9,230.3 L76.9,230.4 L76.9,230.3 L76.9,230.4 L76.9,230.3 L76.9,230.4 
+		L77.0,230.4 L77.1,230.4 L77.2,230.4 L77.3,230.4 L77.3,230.3 L77.3,230.4 L77.3,230.3 L77.4,230.4 
+		L77.5,230.4 L77.5,230.3 L77.5,230.4 L77.6,230.4 L77.7,230.4 L77.8,230.4 L77.9,230.4 L77.9,230.1 
+		L77.9,230.8 L77.9,230.1 L77.9,230.8 L78.0,229.3 L78.0,231.7 L78.0,230.2 L78.0,229.2 L78.0,230.8 
+		L78.0,228.7 L78.0,273.8 L78.0,334.0 L78.0,198.7 L78.0,246.1 L78.1,223.7 L78.1,234.1 L78.1,227.7 
+		L78.1,232.1 L78.1,231.4 L78.1,229.0 L78.1,231.5 L78.1,229.2 L78.1,231.7 L78.2,229.4 L78.2,230.7 
+		L78.2,230.0 L78.2,230.4 L78.2,230.3 L78.2,230.4 L78.2,230.3 L78.2,230.4 L78.2,230.3 L78.3,230.4 
+		L78.3,230.3 L78.3,230.4 L78.3,230.3 L78.3,230.4 L78.3,230.3 L78.4,230.4 L78.5,230.4 L78.6,230.4 
+		L78.7,230.4 L78.8,230.4 L78.9,230.4 L79.0,230.4 L79.1,230.4 L79.2,230.4 L79.2,230.3 L79.2,230.4 
+		L79.3,230.4 L79.4,230.4 L79.5,230.4 L79.6,230.4 L79.7,230.4 L79.8,230.4 L79.9,230.4 L80.0,230.4 
+		L80.1,230.4 L80.2,230.4 L80.2,230.3 L80.3,230.4 L80.3,230.3 L80.3,230.4 L80.4,230.4 L80.5,230.4 
+		L80.6,230.4 L80.7,230.4 L80.8,230.4 L80.9,230.4 L81.0,230.4 L81.1,230.4 L81.2,230.4 L81.3,230.4 
+		L81.4,230.4 L81.5,230.4 L81.6,230.4 L81.7,230.4 L81.8,230.4 L81.9,230.4 L81.9,230.3 L81.9,230.4 
+		L82.0,230.4 L82.0,230.3 L82.0,230.4 L82.1,230.4 L82.1,230.3 L82.1,230.4 L82.2,230.4 L82.2,230.3 
+		L82.2,230.4 L82.2,230.3 L82.2,230.4 L82.2,230.3 L82.2,230.4 L82.3,230.4 L82.4,230.4 L82.4,230.3 
+		L82.4,230.4 L82.4,230.3 L82.4,230.4 L82.4,230.3 L82.4,230.4 L82.5,230.3 L82.5,230.4 L82.5,230.3 
+		L82.5,230.4 L82.6,230.4 L82.6,230.3 L82.6,230.4 L82.6,230.3 L82.6,230.4 L82.7,230.4 L82.7,230.3 
+		L82.7,230.4 L82.8,230.4 L82.8,230.3 L82.8,230.4 L82.8,230.3 L82.9,230.4 L82.9,230.3 L82.9,230.4 
+		L82.9,230.3 L82.9,230.4 L82.9,230.3 L82.9,230.4 L83.0,230.4 L83.0,230.3 L83.0,230.4 L83.0,230.3 
+		L83.0,230.4 L83.0,230.3 L83.0,230.4 L83.1,230.3 L83.1,230.4 L83.2,230.4 L83.3,230.4 L83.4,230.4 
+		L83.5,230.4 L83.6,230.4 L83.7,230.4 L83.8,230.4 L83.9,230.4 L83.9,230.1 L84.0,230.9 L84.0,229.2 
+		L84.0,228.9 L84.0,233.6 L84.0,236.5 L84.0,191.9 L84.0,320.9 L84.0,267.6 L84.1,236.5 L84.1,227.0 
+		L84.1,228.7 L84.1,231.6 L84.1,231.3 L84.1,230.9 L84.1,231.0 L84.1,229.8 L84.1,230.9 L84.2,231.5 
+		L84.2,230.7 L84.2,230.6 L84.2,230.3 L84.2,230.4 L84.2,230.3 L84.2,230.4 L84.3,230.4 L84.3,230.3 
+		L84.3,230.4 L84.3,230.3 L84.4,230.4 L84.5,230.4 L84.6,230.4 L84.7,230.4 L84.8,230.4 L84.9,230.4 
+		L85.0,230.4 L85.1,230.4 L85.2,230.4 L85.3,230.4 L85.4,230.4 L85.5,230.4 L85.6,230.4 L85.7,230.4 
+		L85.8,230.4 L85.9,230.4 L86.0,230.4 L86.1,230.4 L86.2,230.4 L86.3,230.4 L86.4,230.4 L86.5,230.4 
+		L86.6,230.4 L86.7,230.4 L86.8,230.4 L86.9,230.4 L87.0,230.4 L87.1,230.4 L87.2,230.4 L87.3,230.4 
+		L87.4,230.4 L87.5,230.4 L87.5,230.3 L87.6,230.4 L87.7,230.4 L87.8,230.4 L87.9,230.4 L87.9,230.3 
+		L87.9,230.4 L87.9,230.3 L87.9,230.4 L88.0,230.4 L88.0,230.3 L88.1,230.4 L88.1,230.3 L88.1,230.4 
+		L88.2,230.4 L88.2,230.3 L88.2,230.4 L88.3,230.3 L88.3,230.4 L88.3,230.3 L88.3,230.4 L88.4,230.3 
+		L88.4,230.4 L88.4,230.3 L88.4,230.4 L88.5,230.4 L88.5,230.3 L88.5,230.4 L88.6,230.3 L88.6,230.4 
+		L88.7,230.3 L88.7,230.4 L88.7,230.3 L88.7,230.4 L88.7,230.3 L88.7,230.4 L88.7,230.3 L88.7,230.4 
+		L88.8,230.3 L88.8,230.4 L88.8,230.3 L88.8,230.4 L88.8,230.3 L88.8,230.4 L88.9,230.3 L88.9,230.4 
+		L88.9,230.3 L88.9,230.4 L88.9,230.3 L88.9,230.4 L89.0,230.4 L89.0,230.3 L89.0,230.4 L89.0,230.3 
+		L89.1,230.4 L89.2,230.4 L89.3,230.4 L89.4,230.4 L89.5,230.4 L89.6,230.4 L89.7,230.4 L89.8,230.4 
+		L89.9,230.4 L89.9,230.6 L89.9,230.0 L89.9,230.8 L90.0,230.8 L90.0,229.6 L90.0,229.5 L90.0,232.1 
+		L90.0,232.8 L90.0,222.7 L90.0,200.5 L90.0,115.2 L90.0,259.2 L90.1,222.9 L90.1,228.1 L90.1,231.8 
+		L90.1,230.8 L90.1,230.1 L90.1,230.2 L90.1,230.6 L90.1,230.8 L90.1,230.0 L90.1,229.7 L90.2,231.2 
+		L90.2,230.0 L90.2,230.6 L90.2,230.4 L90.2,230.3 L90.2,230.4 L90.2,230.3 L90.3,230.3 L90.3,230.4 
+		L90.3,230.3 L90.3,230.4 L90.4,230.4 L90.5,230.4 L90.5,230.3 L90.6,230.4 L90.7,230.4 L90.8,230.4 
+		L90.9,230.4 L91.0,230.4 L91.1,230.4 L91.1,230.3 L91.2,230.4 L91.3,230.4 L91.4,230.4 L91.5,230.4 
+		L91.6,230.4 L91.7,230.4 L91.8,230.4 L91.9,230.4 L92.0,230.4 L92.1,230.4 L92.2,230.3 L92.2,230.4 
+		L92.3,230.4 L92.3,230.3 L92.3,230.4 L92.4,230.4 L92.5,230.4 L92.6,230.4 L92.7,230.4 L92.8,230.4 
+		L92.9,230.4 L93.0,230.4 L93.1,230.4 L93.2,230.4 L93.3,230.4 L93.4,230.4 L93.5,230.4 L93.6,230.4 
+		L93.7,230.4 L93.8,230.4 L93.9,230.4 L94.0,230.4 L94.0,230.3 L94.0,230.4 L94.0,230.3 L94.0,230.4 
+		L94.1,230.4 L94.1,230.3 L94.1,230.4 L94.2,230.3 L94.2,230.4 L94.2,230.3 L94.3,230.4 L94.3,230.3 
+		L94.4,230.4 L94.4,230.3 L94.4,230.4 L94.4,230.3 L94.4,230.4 L94.5,230.3 L94.5,230.4 L94.5,230.3 
+		L94.5,230.4 L94.5,230.3 L94.5,230.4 L94.6,230.4 L94.6,230.3 L94.6,230.4 L94.6,230.3 L94.6,230.4 
+		L94.7,230.4 L94.7,230.3 L94.7,230.4 L94.8,230.4 L94.8,230.3 L94.8,230.4 L94.9,230.4 L94.9,230.3 
+		L94.9,230.4 L94.9,230.3 L94.9,230.4 L95.0,230.3 L95.0,230.4 L95.0,230.3 L95.0,230.4 L95.1,230.3 
+		L95.1,230.4 L95.2,230.4 L95.3,230.4 L95.4,230.4 L95.5,230.4 L95.6,230.4 L95.7,230.4 L95.8,230.4 
+		L95.9,230.4 L95.9,230.3 L95.9,230.6 L96.0,230.6 L96.0,229.8 L96.0,231.5 L96.0,231.7 L96.0,227.0 
+		L96.0,224.5 L96.0,269.9 L96.0,144.2 L96.0,192.0 L96.1,224.5 L96.1,233.8 L96.1,231.9 L96.1,229.1 
+		L96.1,229.4 L96.1,229.8 L96.1,229.7 L96.1,230.9 L96.2,229.9 L96.2,229.2 L96.2,230.1 L96.2,230.4 
+		L96.2,230.3 L96.2,230.4 L96.3,230.3 L96.3,230.4 L96.3,230.3 L96.3,230.4 L96.4,230.4 L96.4,230.3 
+		L96.4,230.4 L96.5,230.4 L96.6,230.4 L96.7,230.4 L96.8,230.4 L96.8,230.3 L96.8,230.4 L96.9,230.4 
+		L97.0,230.4 L97.1,230.4 L97.2,230.4 L97.2,230.3 L97.2,230.4 L97.3,230.4 L97.4,230.4 L97.5,230.4 
+		L97.6,230.4 L97.7,230.4 L97.8,230.4 L97.9,230.4 L97.9,230.3 L97.9,230.4 L98.0,230.4 L98.1,230.4 
+		L98.2,230.4 L98.3,230.4 L98.4,230.4 L98.5,230.4 L98.6,230.4 L98.6,230.3 L98.6,230.4 L98.7,230.4 
+		L98.8,230.4 L98.9,230.4 L99.0,230.4 L99.1,230.4 L99.2,230.4 L99.3,230.4 L99.4,230.4 L99.5,230.4 
+		L99.6,230.4 L99.7,230.4 L99.8,230.3 L99.8,230.4 L99.9,230.4 L100.0,230.4 L100.0,230.3 L100.0,230.4 
+		L100.0,230.3 L100.0,230.4 L100.1,230.4 L100.2,230.4 L100.2,230.3 L100.2,230.4 L100.3,230.4 L100.4,230.3 
+		L100.4,230.4 L100.5,230.4 L100.5,230.3 L100.5,230.4 L100.5,230.3 L100.5,230.4 L100.5,230.3 L100.5,230.4 
+		L100.6,230.4 L100.6,230.3 L100.6,230.4 L100.6,230.3 L100.7,230.4 L100.7,230.3 L100.8,230.3 L100.8,230.4 
+		L100.8,230.3 L100.8,230.4 L100.8,230.3 L100.8,230.4 L100.9,230.4 L100.9,230.3 L100.9,230.4 L101.0,230.3 
+		L101.0,230.4 L101.0,230.3 L101.0,230.4 L101.0,230.3 L101.1,230.3 L101.1,230.4 L101.2,230.4 L101.3,230.4 
+		L101.4,230.4 L101.5,230.4 L101.6,230.4 L101.7,230.4 L101.8,230.4 L101.9,230.4 L101.9,230.1 L101.9,230.7 
+		L102.0,229.9 L102.0,231.2 L102.0,228.5 L102.0,228.0 L102.0,238.2 L102.0,258.7 L102.0,348.8 L102.0,203.0 
+		L102.1,238.0 L102.1,232.4 L102.1,228.8 L102.1,230.0 L102.1,230.7 L102.1,230.5 L102.1,230.2 L102.1,229.9 
+		L102.1,230.7 L102.2,231.0 L102.2,229.5 L102.2,230.8 L102.2,230.1 L102.2,230.3 L102.2,230.4 L102.2,230.3 
+		L102.2,230.4 L102.3,230.4 L102.3,230.3 L102.3,230.4 L102.3,230.3 L102.3,230.4 L102.4,230.3 L102.4,230.4 
+		L102.5,230.4 L102.6,230.4 L102.7,230.4 L102.8,230.4 L102.9,230.4 L103.0,230.4 L103.1,230.4 L103.2,230.4 
+		L103.3,230.4 L103.4,230.4 L103.5,230.4 L103.6,230.4 L103.7,230.4 L103.8,230.4 L103.9,230.4 L104.0,230.4 
+		L104.1,230.4 L104.2,230.4 L104.3,230.4 L104.4,230.4 L104.5,230.4 L104.6,230.4 L104.7,230.4 L104.8,230.4 
+		L104.9,230.4 L105.0,230.4 L105.1,230.4 L105.2,230.4 L105.3,230.4 L105.4,230.4 L105.5,230.4 L105.6,230.4 
+		L105.7,230.4 L105.8,230.4 L105.9,230.4 L106.0,230.4 L106.0,230.3 L106.0,230.4 L106.1,230.3 L106.1,230.4 
+		L106.1,230.3 L106.1,230.4 L106.1,230.3 L106.1,230.4 L106.2,230.4 L106.3,230.4 L106.3,230.3 L106.3,230.4 
+		L106.4,230.4 L106.4,230.3 L106.4,230.4 L106.4,230.3 L106.4,230.4 L106.5,230.4 L106.5,230.3 L106.5,230.4 
+		L106.5,230.3 L106.5,230.4 L106.6,230.4 L106.6,230.3 L106.7,230.4 L106.7,230.3 L106.7,230.4 L106.7,230.3 
+		L106.7,230.4 L106.8,230.3 L106.8,230.4 L106.8,230.3 L106.8,230.4 L106.9,230.4 L106.9,230.3 L106.9,230.4 
+		L106.9,230.3 L106.9,230.4 L106.9,230.3 L106.9,230.4 L107.0,230.3 L107.0,230.4 L107.0,230.3 L107.0,230.4 
+		L107.1,230.4 L107.2,230.4 L107.3,230.4 L107.4,230.4 L107.5,230.4 L107.6,230.4 L107.7,230.4 L107.8,230.4 
+		L107.9,230.4 L107.9,230.1 L108.0,230.1 L108.0,230.9 L108.0,229.2 L108.0,229.1 L108.0,233.8 L108.0,235.9 
+		L108.0,189.7 L108.0,311.9 L108.1,269.7 L108.1,235.9 L108.1,226.9 L108.1,228.8 L108.1,231.6 L108.1,231.3 
+		L108.1,230.9 L108.1,231.0 L108.1,229.9 L108.1,229.7 L108.2,230.8 L108.2,231.5 L108.2,230.6 L108.2,230.3 
+		L108.2,230.4 L108.2,230.3 L108.3,230.3 L108.3,230.4 L108.3,230.3 L108.3,230.4 L108.3,230.3 L108.4,230.3 
+		L108.4,230.4 L108.5,230.4 L108.6,230.4 L108.7,230.4 L108.8,230.4 L108.9,230.4 L109.0,230.4 L109.1,230.4 
+		L109.2,230.4 L109.3,230.4 L109.4,230.4 L109.5,230.4 L109.6,230.4 L109.7,230.4 L109.8,230.4 L109.9,230.4 
+		L110.0,230.4 L110.1,230.4 L110.1,230.3 L110.1,230.4 L110.2,230.4 L110.3,230.4 L110.4,230.4 L110.5,230.4 
+		L110.6,230.4 L110.7,230.4 L110.8,230.4 L110.8,230.3 L110.8,230.4 L110.9,230.4 L111.0,230.4 L111.1,230.4 
+		L111.2,230.4 L111.3,230.4 L111.4,230.4 L111.5,230.4 L111.6,230.3 L111.6,230.4 L111.6,230.3 L111.7,230.4 
+		L111.8,230.4 L111.9,230.4 L111.9,230.3 L111.9,230.4 L112.0,230.4 L112.0,230.3 L112.0,230.4 L112.1,230.4 
+		L112.1,230.3 L112.1,230.4 L112.1,230.3 L112.1,230.4 L112.2,230.3 L112.2,230.4 L112.2,230.3 L112.2,230.4 
+		L112.3,230.4 L112.3,230.3 L112.3,230.4 L112.3,230.3 L112.3,230.4 L112.4,230.4 L112.4,230.3 L112.4,230.4 
+		L112.4,230.3 L112.5,230.4 L112.5,230.3 L112.5,230.4 L112.5,230.3 L112.5,230.4 L112.5,230.3 L112.5,230.4 
+		L112.6,230.3 L112.6,230.4 L112.6,230.3 L112.6,230.4 L112.6,230.3 L112.7,230.4 L112.7,230.3 L112.7,230.4 
+		L112.8,230.4 L112.8,230.3 L112.9,230.4 L112.9,230.3 L112.9,230.4 L112.9,230.3 L113.0,230.3 L113.0,230.4 
+		L113.0,230.3 L113.0,230.4 L113.1,230.4 L113.1,230.3 L113.1,230.4 L113.2,230.4 L113.3,230.4 L113.4,230.4 
+		L113.5,230.4 L113.6,230.4 L113.7,230.4 L113.8,230.4 L113.9,230.4 L113.9,230.6 L113.9,230.0 L114.0,230.0 
+		L114.0,230.8 L114.0,229.5 L114.0,229.6 L114.0,232.2 L114.0,232.6 L114.0,222.3 L114.0,203.6 L114.0,108.8 
+		L114.1,256.2 L114.1,222.5 L114.1,228.4 L114.1,231.9 L114.1,230.7 L114.1,230.0 L114.1,230.1 L114.1,230.5 
+		L114.1,230.9 L114.1,230.0 L114.2,229.7 L114.2,231.1 L114.2,229.9 L114.2,230.5 L114.2,230.4 L114.2,230.3 
+		L114.2,230.4 L114.3,230.3 L114.3,230.4 L114.3,230.3 L114.4,230.4 L114.4,230.3 L114.4,230.4 L114.5,230.4 
+		L114.6,230.3 L114.6,230.4 L114.7,230.4 L114.8,230.4 L114.9,230.4 L115.0,230.4 L115.1,230.4 L115.2,230.4 
+		L115.2,230.3 L115.2,230.4 L115.3,230.4 L115.4,230.4 L115.5,230.4 L115.6,230.4 L115.7,230.4 L115.8,230.4 
+		L115.9,230.4 L116.0,230.4 L116.1,230.4 L116.2,230.4 L116.2,230.3 L116.2,230.4 L116.3,230.4 L116.4,230.3 
+		L116.4,230.4 L116.5,230.4 L116.6,230.4 L116.7,230.4 L116.8,230.4 L116.9,230.4 L117.0,230.4 L117.1,230.4 
+		L117.2,230.4 L117.3,230.4 L117.4,230.4 L117.5,230.4 L117.6,230.4 L117.7,230.4 L117.8,230.4 L117.9,230.4 
+		L118.0,230.4 L118.1,230.4 L118.1,230.3 L118.1,230.4 L118.1,230.3 L118.1,230.4 L118.2,230.4 L118.2,230.3 
+		L118.2,230.4 L118.3,230.4 L118.4,230.4 L118.4,230.3 L118.4,230.4 L118.5,230.4 L118.5,230.3 L118.5,230.4 
+		L118.5,230.3 L118.5,230.4 L118.5,230.3 L118.6,230.4 L118.6,230.3 L118.6,230.4 L118.6,230.3 L118.6,230.4 
+		L118.7,230.3 L118.7,230.4 L118.7,230.3 L118.7,230.4 L118.8,230.4 L118.8,230.3 L118.8,230.4 L118.8,230.3 
+		L118.8,230.4 L118.9,230.4 L118.9,230.3 L118.9,230.4 L118.9,230.3 L118.9,230.4 L119.0,230.3 L119.0,230.4 
+		L119.1,230.4 L119.1,230.3 L119.1,230.4 L119.2,230.4 L119.3,230.4 L119.4,230.4 L119.5,230.4 L119.6,230.4 
+		L119.7,230.4 L119.8,230.4 L119.9,230.4 L119.9,230.2 L119.9,230.3 L120.0,230.6 L120.0,229.8 L120.0,229.9 
+		L120.0,231.6 L120.0,226.8 L120.0,225.1 L120.0,272.0 L120.0,153.5 L120.1,190.0 L120.1,225.1 L120.1,233.9 
+		L120.1,231.8 L120.1,229.1 L120.1,229.4 L120.1,229.8 L120.1,229.7 L120.1,230.8 L120.2,231.0 L120.2,229.9 
+		L120.2,229.1 L120.2,230.1 L120.2,230.4 L120.2,230.3 L120.2,230.4 L120.3,230.4 L120.3,230.3 L120.3,230.4 
+		L120.3,230.3 L120.4,230.4 L120.4,230.3 L120.4,230.4 L120.4,230.3 L120.4,230.4 L120.5,230.4 L120.6,230.4 
+		L120.7,230.4 L120.8,230.4 L120.9,230.4 L121.0,230.4 L121.1,230.4 L121.2,230.4 L121.2,230.3 L121.2,230.4 
+		L121.3,230.4 L121.4,230.4 L121.5,230.4 L121.6,230.4 L121.7,230.4 L121.8,230.4 L121.9,230.4 L122.0,230.4 
+		L122.1,230.3 L122.1,230.4 L122.2,230.4 L122.3,230.4 L122.4,230.4 L122.4,230.3 L122.4,230.4 L122.5,230.4 
+		L122.6,230.4 L122.7,230.4 L122.8,230.4 L122.9,230.4 L123.0,230.4 L123.1,230.4 L123.2,230.4 L123.3,230.4 
+		L123.4,230.4 L123.5,230.4 L123.6,230.4 L123.7,230.4 L123.7,230.3 L123.7,230.4 L123.8,230.4 L123.8,230.3 
+		L123.8,230.4 L123.8,230.3 L123.8,230.4 L123.9,230.4 L123.9,230.3 L123.9,230.4 L124.0,230.4 L124.0,230.3 
+		L124.0,230.4 L124.1,230.4 L124.1,230.3 L124.1,230.4 L124.2,230.3 L124.2,230.4 L124.2,230.3 L124.2,230.4 
+		L124.3,230.4 L124.3,230.3 L124.3,230.4 L124.3,230.3 L124.4,230.4 L124.4,230.3 L124.4,230.4 L124.5,230.3 
+		L124.5,230.4 L124.5,230.3 L124.5,230.4 L124.6,230.4 L124.6,230.3 L124.6,230.4 L124.6,230.3 L124.6,230.4 
+		L124.7,230.4 L124.7,230.3 L124.7,230.4 L124.7,230.3 L124.7,230.4 L124.8,230.4 L124.8,230.3 L124.8,230.4 
+		L124.9,230.4 L124.9,230.3 L124.9,230.4 L124.9,230.3 L124.9,230.4 L124.9,230.3 L124.9,230.4 L124.9,230.3 
+		L124.9,230.4 L125.0,230.4 L125.0,230.3 L125.0,230.4 L125.0,230.3 L125.0,230.4 L125.1,230.4 L125.1,230.3 
+		L125.1,230.4 L125.1,230.3 L125.1,230.4 L125.2,230.4 L125.3,230.4 L125.4,230.4 L125.5,230.4 L125.6,230.4 
+		L125.7,230.4 L125.8,230.4 L125.9,230.4 L125.9,230.1 L125.9,230.7 L126.0,230.6 L126.0,229.9 L126.0,230.0 
+		L126.0,231.2 L126.0,231.1 L126.0,228.4 L126.0,228.3 L126.0,238.6 L126.0,255.5 L126.1,354.9 L126.1,206.1 
+		L126.1,238.4 L126.1,232.2 L126.1,228.7 L126.1,230.1 L126.1,230.8 L126.1,230.6 L126.1,230.2 L126.1,229.8 
+		L126.2,230.7 L126.2,231.0 L126.2,229.6 L126.2,230.8 L126.2,230.2 L126.2,230.3 L126.2,230.4 L126.2,230.3 
+		L126.3,230.4 L126.3,230.3 L126.3,230.4 L126.4,230.4 L126.4,230.3 L126.4,230.4 L126.5,230.4 L126.6,230.4 
+		L126.7,230.4 L126.8,230.4 L126.9,230.4 L127.0,230.4 L127.1,230.4 L127.2,230.4 L127.3,230.4 L127.4,230.4 
+		L127.5,230.4 L127.6,230.4 L127.7,230.4 L127.8,230.4 L127.9,230.4 L127.9,230.3 L127.9,230.4 L128.0,230.4 
+		L128.1,230.4 L128.2,230.4 L128.3,230.4 L128.4,230.4 L128.5,230.4 L128.6,230.4 L128.7,230.4 L128.8,230.4 
+		L128.9,230.4 L129.0,230.4 L129.1,230.4 L129.2,230.4 L129.3,230.4 L129.4,230.4 L129.5,230.4 L129.6,230.4 
+		L129.7,230.4 L129.8,230.4 L129.8,230.3 L129.8,230.4 L129.9,230.4 L129.9,230.3 L129.9,230.4 L130.0,230.4 
+		L130.1,230.4 L130.1,230.3 L130.1,230.4 L130.2,230.3 L130.2,230.4 L130.3,230.4 L130.3,230.3 L130.3,230.4 
+		L130.3,230.3 L130.3,230.4 L130.4,230.4 L130.4,230.3 L130.4,230.4 L130.4,230.3 L130.4,230.4 L130.5,230.4 
+		L130.5,230.3 L130.5,230.4 L130.5,230.3 L130.5,230.4 L130.6,230.4 L130.6,230.3 L130.6,230.4 L130.6,230.3 
+		L130.6,230.4 L130.7,230.4 L130.7,230.3 L130.8,230.4 L130.8,230.3 L130.8,230.4 L130.8,230.3 L130.8,230.4 
+		L130.9,230.4 L130.9,230.3 L130.9,230.4 L130.9,230.3 L131.0,230.3 L131.0,230.4 L131.1,230.4 L131.2,230.4 
+		L131.3,230.4 L131.4,230.4 L131.5,230.4 L131.6,230.4 L131.7,230.4 L131.8,230.4 L131.9,230.4 L131.9,230.5 
+		L132.0,230.4 L132.0,230.1 L132.0,230.2 L132.0,230.9 L132.0,230.8 L132.0,229.1 L132.0,229.2 L132.0,233.9 
+		L132.0,235.2 L132.0,187.7 L132.1,302.4 L132.1,271.7 L132.1,235.3 L132.1,226.7 L132.1,229.0 L132.1,231.7 
+		L132.1,231.3 L132.1,230.9 L132.1,231.0 L132.1,229.9 L132.2,229.7 L132.2,230.8 L132.2,231.6 L132.2,230.6 
+		L132.2,230.7 L132.2,230.3 L132.2,230.4 L132.3,230.3 L132.3,230.4 L132.3,230.3 L132.3,230.4 L132.4,230.3 
+		L132.4,230.4 L132.5,230.4 L132.6,230.4 L132.7,230.4 L132.8,230.4 L132.9,230.4 L133.0,230.4 L133.1,230.4 
+		L133.2,230.4 L133.3,230.4 L133.4,230.4 L133.5,230.4 L133.6,230.4 L133.7,230.4 L133.8,230.4 L133.9,230.4 
+		L133.9,230.3 L133.9,230.4 L134.0,230.4 L134.1,230.4 L134.2,230.4 L134.3,230.4 L134.4,230.4 L134.5,230.4 
+		L134.6,230.4 L134.7,230.4 L134.7,230.3 L134.7,230.4 L134.8,230.4 L134.8,230.3 L134.8,230.4 L134.9,230.4 
+		L135.0,230.4 L135.1,230.4 L135.2,230.4 L135.3,230.4 L135.4,230.4 L135.5,230.4 L135.6,230.4 L135.6,230.3 
+		L135.6,230.4 L135.7,230.4 L135.8,230.4 L135.9,230.4 L135.9,230.3 L135.9,230.4 L136.0,230.4 L136.0,230.3 
+		L136.0,230.4 L136.0,230.3 L136.0,230.4 L136.0,230.3 L136.0,230.4 L136.0,230.3 L136.1,230.3 L136.1,230.4 
+		L136.2,230.4 L136.2,230.3 L136.2,230.4 L136.2,230.3 L136.2,230.4 L136.3,230.3 L136.3,230.4 L136.3,230.3 
+		L136.3,230.4 L136.4,230.4 L136.4,230.3 L136.4,230.4 L136.4,230.3 L136.5,230.4 L136.5,230.3 L136.5,230.4 
+		L136.5,230.3 L136.5,230.4 L136.6,230.3 L136.6,230.4 L136.6,230.3 L136.6,230.4 L136.6,230.3 L136.7,230.4 
+		L136.7,230.3 L136.7,230.4 L136.8,230.3 L136.8,230.4 L136.8,230.3 L136.8,230.4 L136.8,230.3 L136.8,230.4 
+		L136.9,230.4 L136.9,230.3 L136.9,230.4 L136.9,230.3 L136.9,230.4 L136.9,230.3 L136.9,230.4 L137.0,230.4 
+		L137.0,230.3 L137.0,230.4 L137.1,230.3 L137.1,230.4 L137.2,230.4 L137.3,230.4 L137.4,230.4 L137.5,230.4 
+		L137.6,230.4 L137.7,230.4 L137.8,230.4 L137.9,230.4 L137.9,230.6 L138.0,230.0 L138.0,230.1 L138.0,230.8 
+		L138.0,230.7 L138.0,229.5 L138.0,229.7 L138.0,232.3 L138.0,221.9 L138.0,206.8 L138.1,103.0 L138.1,253.0 
+		L138.1,222.1 L138.1,228.7 L138.1,232.1 L138.1,230.6 L138.1,229.9 L138.1,230.1 L138.1,230.4 L138.2,230.9 
+		L138.2,230.1 L138.2,229.7 L138.2,231.0 L138.2,229.9 L138.2,230.5 L138.2,230.4 L138.2,230.3 L138.2,230.4 
+		L138.3,230.4 L138.3,230.3 L138.3,230.4 L138.3,230.3 L138.4,230.3 L138.4,230.4 L138.4,230.3 L138.4,230.4 
+		L138.5,230.4 L138.6,230.4 L138.6,230.3 L138.6,230.4 L138.7,230.4 L138.8,230.4 L138.9,230.4 L139.0,230.4 
+		L139.1,230.4 L139.2,230.4 L139.3,230.4 L139.4,230.4 L139.5,230.4 L139.6,230.4 L139.7,230.4 L139.8,230.4 
+		L139.9,230.4 L140.0,230.4 L140.1,230.4 L140.2,230.4 L140.3,230.4 L140.4,230.4 L140.5,230.4 L140.6,230.4 
+		L140.7,230.4 L140.8,230.4 L140.9,230.4 L141.0,230.4 L141.1,230.4 L141.2,230.4 L141.3,230.4 L141.4,230.4 
+		L141.5,230.4 L141.6,230.4 L141.7,230.4 L141.8,230.4 L141.9,230.4 L142.0,230.4 L142.1,230.4 L142.2,230.3 
+		L142.2,230.4 L142.2,230.3 L142.2,230.4 L142.2,230.3 L142.2,230.4 L142.3,230.4 L142.4,230.4 L142.5,230.4 
+		L142.5,230.3 L142.5,230.4 L142.5,230.3 L142.5,230.4 L142.5,230.3 L142.6,230.4 L142.7,230.3 L142.7,230.4 
+		L142.7,230.3 L142.7,230.4 L142.8,230.4 L142.8,230.3 L142.8,230.4 L142.8,230.3 L142.8,230.4 L142.8,230.3 
+		L142.9,230.4 L142.9,230.3 L142.9,230.4 L142.9,230.3 L142.9,230.4 L142.9,230.3 L142.9,230.4 L143.0,230.4 
+		L143.0,230.3 L143.0,230.4 L143.0,230.3 L143.1,230.4 L143.1,230.3 L143.1,230.4 L143.2,230.4 L143.3,230.4 
+		L143.4,230.4 L143.5,230.4 L143.6,230.4 L143.7,230.4 L143.8,230.4 L143.9,230.4 L143.9,230.2 L144.0,230.3 
+		L144.0,230.6 L144.0,230.5 L144.0,229.8 L144.0,229.9 L144.0,231.6 L144.0,231.4 L144.0,226.7 L144.0,225.8 
+		L144.1,273.9 L144.1,163.2 L144.1,188.2 L144.1,225.7 L144.1,234.0 L144.1,231.7 L144.1,229.0 L144.1,229.4 
+		L144.1,229.8 L144.1,229.7 L144.2,230.8 L144.2,231.0 L144.2,230.0 L144.2,229.1 L144.2,230.1 L144.2,230.0 
+		L144.2,230.4 L144.2,230.3 L144.3,230.4 L144.3,230.3 L144.3,230.4 L144.3,230.3 L144.4,230.3 L144.4,230.4 
+		L144.4,230.3 L144.4,230.4 L144.4,230.3 L144.4,230.4 L144.5,230.4 L144.6,230.4 L144.7,230.4 L144.8,230.4 
+		L144.8,230.3 L144.8,230.4 L144.9,230.4 L145.0,230.4 L145.1,230.4 L145.2,230.4 L145.2,230.3 L145.2,230.4 
+		L145.3,230.4 L145.4,230.4 L145.5,230.4 L145.6,230.4 L145.7,230.4 L145.8,230.4 L145.9,230.4 L146.0,230.4 
+		L146.1,230.4 L146.1,230.3 L146.1,230.4 L146.2,230.4 L146.2,230.3 L146.2,230.4 L146.3,230.4 L146.4,230.4 
+		L146.5,230.4 L146.6,230.4 L146.7,230.4 L146.8,230.4 L146.9,230.4 L147.0,230.4 L147.0,230.3 L147.0,230.4 
+		L147.1,230.4 L147.2,230.4 L147.3,230.4 L147.4,230.4 L147.5,230.4 L147.6,230.4 L147.7,230.4 L147.8,230.4 
+		L147.8,230.3 L147.8,230.4 L147.9,230.4 L148.0,230.4 L148.0,230.3 L148.0,230.4 L148.1,230.4 L148.1,230.3 
+		L148.1,230.4 L148.1,230.3 L148.2,230.3 L148.2,230.4 L148.2,230.3 L148.2,230.4 L148.2,230.3 L148.2,230.4 
+		L148.3,230.3 L148.3,230.4 L148.3,230.3 L148.3,230.4 L148.3,230.3 L148.3,230.4 L148.4,230.4 L148.4,230.3 
+		L148.4,230.4 L148.4,230.3 L148.4,230.4 L148.5,230.4 L148.5,230.3 L148.5,230.4 L148.5,230.3 L148.6,230.4 
+		L148.6,230.3 L148.6,230.4 L148.6,230.3 L148.7,230.4 L148.7,230.3 L148.7,230.4 L148.7,230.3 L148.8,230.4 
+		L148.8,230.3 L148.8,230.4 L148.8,230.3 L148.8,230.4 L148.9,230.4 L148.9,230.3 L148.9,230.4 L148.9,230.3 
+		L148.9,230.4 L148.9,230.3 L148.9,230.4 L148.9,230.3 L149.0,230.3 L149.0,230.4 L149.0,230.3 L149.0,230.4 
+		L149.1,230.4 L149.1,230.3 L149.1,230.4 L149.2,230.4 L149.3,230.4 L149.4,230.4 L149.5,230.4 L149.6,230.4 
+		L149.7,230.4 L149.8,230.4 L149.9,230.4 L149.9,230.1 L150.0,230.7 L150.0,230.6 L150.0,229.9 L150.0,230.0 
+		L150.0,231.2 L150.0,231.0 L150.0,228.3 L150.0,228.6 L150.0,239.0 L150.1,252.2 L150.1,360.3 L150.1,209.3 
+		L150.1,238.8 L150.1,231.9 L150.1,228.6 L150.1,230.2 L150.1,230.8 L150.1,230.6 L150.1,230.3 L150.2,229.8 
+		L150.2,230.6 L150.2,231.1 L150.2,229.7 L150.2,230.8 L150.2,230.2 L150.2,230.3 L150.2,230.4 L150.3,230.3 
+		L150.3,230.4 L150.3,230.3 L150.4,230.4 L150.4,230.3 L150.4,230.4 L150.5,230.4 L150.6,230.4 L150.7,230.4 
+		L150.8,230.4 L150.9,230.4 L151.0,230.4 L151.1,230.4 L151.2,230.4 L151.3,230.4 L151.4,230.4 L151.5,230.4 
+		L151.6,230.4 L151.7,230.4 L151.8,230.4 L151.9,230.4 L152.0,230.4 L152.1,230.4 L152.2,230.4 L152.3,230.4 
+		L152.4,230.4 L152.5,230.4 L152.6,230.4 L152.7,230.4 L152.8,230.4 L152.9,230.4 L153.0,230.4 L153.1,230.4 
+		L153.2,230.4 L153.3,230.4 L153.4,230.4 L153.5,230.4 L153.6,230.4 L153.7,230.4 L153.8,230.4 L153.9,230.4 
+		L154.0,230.4 L154.1,230.4 L154.2,230.4 L154.3,230.4 L154.4,230.4 L154.5,230.4 L154.6,230.4 L154.7,230.4 
+		L154.8,230.4 L154.9,230.4 L155.0,230.4 L155.1,230.4 L155.2,230.4 L155.3,230.4 L155.4,230.4 L155.5,230.4 
+		L155.6,230.4 L155.7,230.4 L155.8,230.4 L155.9,230.4 L156.0,230.5 L156.0,230.4 L156.0,230.0 L156.0,230.2 
+		L156.0,231.0 L156.0,230.7 L156.0,229.1 L156.0,229.4 L156.0,234.1 L156.0,234.6 L156.1,186.0 L156.1,292.5 
+		L156.1,273.3 L156.1,234.7 L156.1,226.6 L156.1,229.1 L156.1,231.7 L156.1,231.2 L156.1,230.9 L156.2,231.0 
+		L156.2,229.9 L156.2,229.7 L156.2,230.7 L156.2,231.6 L156.2,230.6 L156.2,230.7 L156.2,230.3 L156.2,230.4 
+		L156.3,230.4 L156.3,230.3 L156.3,230.4 L156.3,230.3 L156.3,230.4 L156.4,230.4 L156.4,230.3 L156.4,230.4 
+		L156.5,230.4 L156.6,230.4 L156.7,230.4 L156.8,230.4 L156.9,230.4 L157.0,230.4 L157.1,230.4 L157.2,230.4 
+		L157.3,230.4 L157.4,230.4 L157.5,230.4 L157.6,230.4 L157.7,230.4 L157.8,230.4 L157.9,230.4 L157.9,230.3 
+		L157.9,230.4 L157.9,230.3 L158.0,230.3 L158.0,230.4 L158.0,230.3 L158.0,230.4 L158.1,230.4 L158.2,230.4 
+		L158.2,230.3 L158.2,230.4 L158.3,230.4 L158.4,230.4 L158.5,230.4 L158.5,230.3 L158.5,230.4 L158.6,230.4 
+		L158.7,230.4 L158.8,230.4 L158.8,230.3 L158.8,230.4 L158.9,230.4 L159.0,230.4 L159.1,230.4 L159.2,230.4 
+		L159.3,230.4 L159.4,230.4 L159.5,230.4 L159.6,230.4 L159.6,230.3 L159.6,230.4 L159.7,230.4 L159.8,230.4 
+		L159.9,230.4 L159.9,230.3 L159.9,230.4 L159.9,230.3 L159.9,230.4 L160.0,230.4 L160.1,230.4 L160.1,230.3 
+		L160.2,230.4 L160.2,230.3 L160.2,230.4 L160.2,230.3 L160.2,230.4 L160.2,230.3 L160.2,230.4 L160.3,230.4 
+		L160.3,230.3 L160.3,230.4 L160.3,230.3 L160.3,230.4 L160.3,230.3 L160.3,230.4 L160.4,230.3 L160.4,230.4 
+		L160.4,230.3 L160.4,230.4 L160.4,230.3 L160.4,230.4 L160.4,230.3 L160.4,230.4 L160.5,230.4 L160.5,230.3 
+		L160.5,230.4 L160.5,230.3 L160.5,230.4 L160.5,230.3 L160.6,230.3 L160.6,230.4 L160.6,230.3 L160.6,230.4 
+		L160.7,230.3 L160.7,230.4 L160.7,230.3 L160.8,230.3 L160.8,230.4 L160.8,230.3 L160.8,230.4 L160.9,230.4 
+		L160.9,230.3 L160.9,230.4 L160.9,230.3 L160.9,230.4 L160.9,230.3 L160.9,230.4 L160.9,230.3 L161.0,230.4 
+		L161.0,230.3 L161.0,230.4 L161.0,230.3 L161.0,230.4 L161.0,230.3 L161.1,230.3 L161.1,230.4 L161.1,230.3 
+		L161.1,230.4 L161.2,230.4 L161.3,230.4 L161.4,230.4 L161.5,230.4 L161.6,230.4 L161.7,230.4 L161.8,230.4 
+		L161.9,230.4 L162.0,230.6 L162.0,230.0 L162.0,230.1 L162.0,230.9 L162.0,230.7 L162.0,229.5 L162.0,229.8 
+		L162.0,232.4 L162.0,232.0 L162.0,221.6 L162.1,210.2 L162.1,98.0 L162.1,249.8 L162.1,221.8 L162.1,229.0 
+		L162.1,232.2 L162.1,230.5 L162.1,229.8 L162.1,230.1 L162.2,230.4 L162.2,230.9 L162.2,230.1 L162.2,229.6 
+		L162.2,230.9 L162.2,229.9 L162.2,230.5 L162.2,230.4 L162.2,230.3 L162.3,230.4 L162.3,230.3 L162.3,230.4 
+		L162.4,230.4 L162.4,230.3 L162.4,230.4 L162.4,230.3 L162.5,230.4 L162.6,230.4 L162.6,230.3 L162.6,230.4 
+		L162.7,230.4 L162.8,230.4 L162.9,230.4 L163.0,230.4 L163.1,230.4 L163.2,230.4 L163.2,230.3 L163.2,230.4 
+		L163.3,230.4 L163.4,230.4 L163.5,230.4 L163.6,230.4 L163.7,230.4 L163.8,230.4 L163.9,230.4 L164.0,230.4 
+		L164.1,230.4 L164.2,230.4 L164.3,230.4 L164.4,230.4 L164.5,230.4 L164.6,230.4 L164.7,230.4 L164.8,230.4 
+		L164.9,230.4 L165.0,230.4 L165.1,230.4 L165.2,230.4 L165.3,230.4 L165.4,230.4 L165.5,230.4 L165.6,230.4 
+		L165.7,230.4 L165.8,230.4 L165.9,230.4 L166.0,230.4 L166.1,230.4 L166.1,230.3 L166.1,230.4 L166.2,230.4 
+		L166.2,230.3 L166.2,230.4 L166.3,230.4 L166.4,230.4 L166.4,230.3 L166.4,230.4 L166.5,230.4 L166.6,230.3 
+		L166.6,230.4 L166.6,230.3 L166.6,230.4 L166.7,230.4 L166.7,230.3 L166.7,230.4 L166.7,230.3 L166.8,230.4 
+		L166.8,230.3 L166.8,230.4 L166.8,230.3 L166.9,230.4 L166.9,230.3 L166.9,230.4 L166.9,230.3 L166.9,230.4 
+		L167.0,230.4 L167.1,230.4 L167.2,230.4 L167.3,230.4 L167.4,230.4 L167.5,230.4 L167.6,230.4 L167.7,230.4 
+		L167.8,230.4 L167.9,230.4 L168.0,230.2 L168.0,230.4 L168.0,230.7 L168.0,230.5 L168.0,229.7 L168.0,230.0 
+		L168.0,231.7 L168.0,231.3 L168.0,226.5 L168.1,226.5 L168.1,275.5 L168.1,173.2 L168.1,186.6 L168.1,226.4 
+		L168.1,234.2 L168.1,231.5 L168.1,229.0 L168.1,229.5 L168.1,229.8 L168.2,229.7 L168.2,230.7 L168.2,231.0 
+		L168.2,230.0 L168.2,229.0 L168.2,230.2 L168.2,230.0 L168.2,230.4 L168.3,230.3 L168.3,230.4 L168.3,230.3 
+		L168.3,230.4 L168.4,230.3 L168.4,230.4 L168.4,230.3 L168.5,230.4 L168.6,230.4 L168.7,230.4 L168.8,230.4 
+		L168.8,230.3 L168.8,230.4 L168.9,230.4 L169.0,230.4 L169.1,230.4 L169.2,230.4 L169.2,230.3 L169.2,230.4 
+		L169.3,230.4 L169.4,230.4 L169.5,230.4 L169.6,230.4 L169.7,230.4 L169.8,230.4 L169.9,230.4 L170.0,230.4 
+		L170.1,230.4 L170.2,230.4 L170.3,230.4 L170.3,230.3 L170.3,230.4 L170.3,230.3 L170.3,230.4 L170.4,230.4 
+		L170.4,230.3 L170.4,230.4 L170.5,230.4 L170.6,230.4 L170.7,230.4 L170.8,230.4 L170.9,230.4 L171.0,230.4 
+		L171.1,230.4 L171.2,230.4 L171.3,230.4 L171.4,230.4 L171.5,230.4 L171.6,230.4 L171.7,230.4 L171.7,230.3 
+		L171.8,230.4 L171.9,230.3 L171.9,230.4 L172.0,230.3 L172.0,230.4 L172.0,230.3 L172.0,230.4 L172.0,230.3 
+		L172.1,230.4 L172.1,230.3 L172.1,230.4 L172.2,230.4 L172.2,230.3 L172.2,230.4 L172.2,230.3 L172.2,230.4 
+		L172.3,230.4 L172.3,230.3 L172.3,230.4 L172.3,230.3 L172.3,230.4 L172.3,230.3 L172.4,230.4 L172.4,230.3 
+		L172.4,230.4 L172.5,230.4 L172.5,230.3 L172.5,230.4 L172.5,230.3 L172.5,230.4 L172.5,230.3 L172.5,230.4 
+		L172.5,230.3 L172.6,230.4 L172.6,230.3 L172.6,230.4 L172.6,230.3 L172.7,230.4 L172.7,230.3 L172.7,230.4 
+		L172.7,230.3 L172.7,230.4 L172.7,230.3 L172.8,230.4 L172.8,230.3 L172.8,230.4 L172.9,230.4 L172.9,230.3 
+		L172.9,230.4 L172.9,230.3 L172.9,230.4 L173.0,230.3 L173.0,230.4 L173.0,230.3 L173.0,230.4 L173.0,230.3 
+		L173.0,230.4 L173.0,230.3 L173.1,230.4 L173.1,230.3 L173.1,230.4 L173.2,230.4 L173.3,230.4 L173.4,230.4 
+		L173.5,230.4 L173.6,230.4 L173.7,230.4 L173.8,230.4 L173.9,230.4 L174.0,230.4 L174.0,230.1 L174.0,230.7 
+		L174.0,230.6 L174.0,229.8 L174.0,230.0 L174.0,231.3 L174.0,230.9 L174.0,228.3 L174.0,228.8 L174.1,239.3 
+		L174.1,248.7 L174.1,364.9 L174.1,212.6 L174.1,239.1 L174.1,231.6 L174.1,228.5 L174.1,230.3 L174.1,230.9 
+		L174.1,230.7 L174.2,230.3 L174.2,229.8 L174.2,230.6 L174.2,231.1 L174.2,229.8 L174.2,230.8 L174.2,230.2 
+		L174.2,230.3 L174.2,230.4 L174.3,230.4 L174.3,230.3 L174.3,230.4 L174.3,230.3 L174.4,230.4 L174.4,230.3 
+		L174.4,230.4 L174.5,230.4 L174.6,230.4 L174.7,230.4 L174.8,230.4 L174.9,230.4 L175.0,230.4 L175.1,230.4 
+		L175.2,230.4 L175.3,230.4 L175.4,230.4 L175.5,230.4 L175.6,230.4 L175.7,230.4 L175.8,230.4 L175.9,230.4 
+		L176.0,230.3 L176.0,230.4 L176.0,230.3 L176.0,230.4 L176.1,230.3 L176.1,230.4 L176.1,230.3 L176.1,230.4 
+		L176.2,230.4 L176.2,230.3 L176.2,230.4 L176.3,230.4 L176.3,230.3 L176.4,230.4 L176.4,230.3 L176.4,230.4 
+		L176.5,230.4 L176.6,230.4 L176.7,230.4 L176.8,230.4 L176.9,230.4 L177.0,230.4 L177.1,230.4 L177.2,230.4 
+		L177.3,230.4 L177.4,230.4 L177.5,230.4 L177.6,230.4 L177.7,230.4 L177.8,230.4 L177.9,230.4 L178.0,230.4 
+		L178.0,230.3 L178.0,230.4 L178.1,230.4 L178.1,230.3 L178.1,230.4 L178.1,230.3 L178.2,230.4 L178.3,230.4 
+		L178.3,230.3 L178.3,230.4 L178.3,230.3 L178.3,230.4 L178.3,230.3 L178.3,230.4 L178.4,230.4 L178.4,230.3 
+		L178.4,230.4 L178.5,230.3 L178.5,230.4 L178.5,230.3 L178.6,230.4 L178.6,230.3 L178.6,230.4 L178.7,230.3 
+		L178.7,230.4 L178.7,230.3 L178.7,230.4 L178.8,230.4 L178.8,230.3 L178.8,230.4 L178.9,230.4 L178.9,230.3 
+		L178.9,230.4 L178.9,230.3 L178.9,230.4 L179.0,230.3 L179.0,230.4 L179.0,230.3 L179.0,230.4 L179.0,230.3 
+		L179.0,230.4 L179.0,230.3 L179.1,230.4 L179.1,230.3 L179.1,230.4 L179.2,230.4 L179.3,230.4 L179.4,230.4 
+		L179.5,230.4 L179.6,230.4 L179.7,230.4 L179.8,230.4 L179.9,230.4 L180.0,230.4 L180.0,230.5 L180.0,230.3 
+		L180.0,230.0 L180.0,230.2 L180.0,231.0 L180.0,230.7 L180.0,229.0 L180.0,229.5 L180.0,234.2 L180.1,233.9 
+		L180.1,184.5 L180.1,282.3 L180.1,274.8 L180.1,234.0 L180.1,226.5 L180.1,229.2 L180.1,231.7 L180.1,231.2 
+		L180.2,230.9 L180.2,231.0 L180.2,230.0 L180.2,229.7 L180.2,230.7 L180.2,231.7 L180.2,230.5 L180.2,230.7 
+		L180.2,230.3 L180.3,230.4 L180.3,230.3 L180.3,230.4 L180.3,230.3 L180.4,230.3 L180.4,230.4 L180.4,230.3 
+		L180.4,230.4 L180.5,230.4 L180.6,230.4 L180.6,230.3 L180.6,230.4 L180.7,230.4 L180.8,230.4 L180.9,230.4 
+		L181.0,230.4 L181.1,230.4 L181.2,230.4 L181.3,230.4 L181.4,230.4 L181.5,230.4 L181.6,230.4 L181.7,230.4 
+		L181.8,230.4 L181.9,230.4 L182.0,230.4 L182.0,230.3 L182.0,230.4 L182.1,230.4 L182.2,230.4 L182.3,230.4 
+		L182.3,230.3 L182.3,230.4 L182.4,230.3 L182.4,230.4 L182.4,230.3 L182.4,230.4 L182.5,230.4 L182.5,230.3 
+		L182.5,230.4 L182.6,230.4 L182.6,230.3 L182.6,230.4 L182.7,230.4 L182.7,230.3 L182.7,230.4 L182.8,230.3 
+		L182.8,230.4 L182.8,230.3 L182.8,230.4 L182.8,230.3 L182.9,230.4 L182.9,230.3 L182.9,230.4 L182.9,230.3 
+		L183.0,230.4 L183.0,230.3 L183.1,230.4 L183.2,230.4 L183.2,230.3 L183.2,230.4 L183.3,230.4 L183.4,230.4 
+		L183.5,230.4 L183.5,230.3 L183.5,230.4 L183.6,230.4 L183.6,230.3 L183.6,230.4 L183.6,230.3 L183.7,230.4 
+		L183.7,230.3 L183.7,230.4 L183.8,230.3 L183.8,230.4 L183.8,230.3 L183.8,230.4 L183.9,230.3 L183.9,230.4 
+		L183.9,230.3 L184.0,230.3 L184.0,230.4 L184.1,230.3 L184.1,230.4 L184.1,230.3 L184.2,230.4 L184.2,230.3 
+		L184.2,230.4 L184.2,230.3 L184.3,230.4 L184.3,230.3 L184.3,230.4 L184.4,230.3 L184.4,230.4 L184.4,230.3 
+		L184.4,230.4 L184.5,230.4 L184.5,230.3 L184.5,230.4 L184.5,230.3 L184.5,230.4 L184.5,230.3 L184.5,230.4 
+		L184.6,230.4 L184.6,230.3 L184.6,230.4 L184.6,230.3 L184.6,230.4 L184.6,230.3 L184.7,230.4 L184.7,230.3 
+		L184.7,230.4 L184.7,230.3 L184.7,230.4 L184.7,230.3 L184.7,230.4 L184.8,230.3 L184.8,230.4 L184.8,230.3 
+		L184.8,230.4 L184.8,230.3 L184.9,230.4 L184.9,230.3 L184.9,230.4 L185.0,230.4 L185.0,230.3 L185.0,230.4 
+		L185.0,230.3 L185.0,230.4 L185.1,230.4 L185.1,230.3 L185.1,230.4 L185.1,230.3 L185.1,230.4 L185.2,230.4 
+		L185.3,230.4 L185.4,230.4 L185.5,230.4 L185.6,230.4 L185.7,230.4 L185.8,230.4 L185.9,230.4 L186.0,230.4 
+		L186.0,230.6 L186.0,230.0 L186.0,230.1 L186.0,230.9 L186.0,230.6 L186.0,229.4 L186.0,229.9 L186.0,232.5 
+		L186.1,231.7 L186.1,221.3 L186.1,213.7 L186.1,93.9 L186.1,246.4 L186.1,221.5 L186.1,229.3 L186.1,232.2 
+		L186.1,230.4 L186.1,229.8 L186.2,230.0 L186.2,230.3 L186.2,231.0 L186.2,230.2 L186.2,229.6 L186.2,230.8 
+		L186.2,229.9 L186.2,230.5 L186.2,230.4 L186.2,230.3 L186.3,230.3 L186.3,230.4 L186.3,230.3 L186.3,230.4 
+		L186.4,230.4 L186.4,230.3 L186.4,230.4 L186.5,230.3 L186.5,230.4 L186.6,230.4 L186.6,230.3 L186.6,230.4 
+		L186.7,230.4 L186.8,230.4 L186.9,230.4 L187.0,230.4 L187.1,230.4 L187.2,230.4 L187.3,230.4 L187.4,230.4 
+		L187.5,230.4 L187.6,230.4 L187.7,230.4 L187.8,230.4 L187.9,230.4 L188.0,230.4 L188.1,230.4 L188.2,230.4 
+		L188.3,230.4 L188.4,230.4 L188.5,230.4 L188.6,230.4 L188.7,230.4 L188.8,230.4 L188.9,230.4 L189.0,230.4 
+		L189.1,230.4 L189.2,230.4 L189.3,230.4 L189.4,230.4 L189.5,230.4 L189.6,230.4 L189.7,230.4 L189.8,230.4 
+		L189.9,230.4 L190.0,230.4 L190.1,230.4 L190.1,230.3 L190.2,230.4 L190.2,230.3 L190.2,230.4 L190.2,230.3 
+		L190.2,230.4 L190.3,230.4 L190.3,230.3 L190.3,230.4 L190.4,230.4 L190.4,230.3 L190.4,230.4 L190.5,230.4 
+		L190.5,230.3 L190.5,230.4 L190.6,230.4 L190.6,230.3 L190.6,230.4 L190.6,230.3 L190.6,230.4 L190.6,230.3 
+		L190.6,230.4 L190.7,230.4 L190.7,230.3 L190.7,230.4 L190.7,230.3 L190.7,230.4 L190.8,230.4 L190.8,230.3 
+		L190.8,230.4 L190.8,230.3 L190.9,230.4 L190.9,230.3 L190.9,230.4 L190.9,230.3 L190.9,230.4 L191.0,230.4 
+		L191.0,230.3 L191.0,230.4 L191.0,230.3 L191.1,230.4 L191.2,230.4 L191.3,230.4 L191.4,230.4 L191.5,230.4 
+		L191.6,230.4 L191.7,230.4 L191.8,230.4 L191.9,230.4 L192.0,230.4 L192.0,230.2 L192.0,230.4 L192.0,230.7 
+		L192.0,230.4 L192.0,229.7 L192.0,230.1 L192.0,231.7 L192.0,231.1 L192.1,226.4 L192.1,227.2 L192.1,276.9 
+		L192.1,183.7 L192.1,185.3 L192.1,227.1 L192.1,234.3 L192.1,231.4 L192.1,229.0 L192.1,229.5 L192.2,229.9 
+		L192.2,229.7 L192.2,230.7 L192.2,231.0 L192.2,230.1 L192.2,229.0 L192.2,230.2 L192.2,230.0 L192.2,230.4 
+		L192.3,230.4 L192.3,230.3 L192.3,230.4 L192.3,230.3 L192.3,230.4 L192.4,230.4 L192.4,230.3 L192.4,230.4 
+		L192.4,230.3 L192.4,230.4 L192.5,230.4 L192.5,230.3 L192.5,230.4 L192.6,230.4 L192.7,230.4 L192.8,230.4 
+		L192.8,230.3 L192.8,230.4 L192.9,230.4 L193.0,230.4 L193.1,230.4 L193.2,230.4 L193.2,230.3 L193.2,230.4 
+		L193.3,230.4 L193.4,230.4 L193.5,230.4 L193.6,230.4 L193.7,230.4 L193.8,230.4 L193.9,230.4 L194.0,230.3 
+		L194.0,230.4 L194.1,230.4 L194.1,230.3 L194.1,230.4 L194.1,230.3 L194.2,230.4 L194.2,230.3 L194.2,230.4 
+		L194.3,230.4 L194.4,230.4 L194.5,230.3 L194.5,230.4 L194.5,230.3 L194.5,230.4 L194.5,230.3 L194.6,230.4 
+		L194.6,230.3 L194.7,230.4 L194.8,230.4 L194.8,230.3 L194.8,230.4 L194.9,230.3 L194.9,230.4 L195.0,230.4 
+		L195.0,230.3 L195.0,230.4 L195.1,230.4 L195.1,230.3 L195.1,230.4 L195.2,230.4 L195.3,230.4 L195.4,230.4 
+		L195.5,230.4 L195.6,230.4 L195.6,230.3 L195.6,230.4 L195.7,230.3 L195.7,230.4 L195.7,230.3 L195.7,230.4 
+		L195.8,230.4 L195.8,230.3 L195.8,230.4 L195.8,230.3 L195.8,230.4 L195.8,230.3 L195.9,230.4 L195.9,230.3 
+		L195.9,230.4 L195.9,230.3 L195.9,230.4 L195.9,230.3 L195.9,230.4 L196.0,230.3 L196.0,230.4 L196.0,230.3 
+		L196.0,230.4 L196.0,230.3 L196.1,230.4 L196.1,230.3 L196.1,230.4 L196.1,230.3 L196.1,230.4 L196.2,230.3 
+		L196.2,230.4 L196.2,230.3 L196.2,230.4 L196.2,230.3 L196.3,230.3 L196.3,230.4 L196.3,230.3 L196.3,230.4 
+		L196.4,230.4 L196.4,230.3 L196.5,230.4 L196.5,230.3 L196.5,230.4 L196.5,230.3 L196.5,230.4 L196.5,230.3 
+		L196.5,230.4 L196.5,230.3 L196.6,230.4 L196.6,230.3 L196.6,230.4 L196.6,230.3 L196.7,230.4 L196.7,230.3 
+		L196.7,230.4 L196.7,230.3 L196.7,230.4 L196.8,230.4 L196.8,230.3 L196.8,230.4 L196.8,230.3 L196.8,230.4 
+		L196.8,230.3 L196.8,230.4 L196.9,230.3 L196.9,230.4 L196.9,230.3 L196.9,230.4 L196.9,230.3 L197.0,230.4 
+		L197.0,230.3 L197.0,230.4 L197.0,230.3 L197.0,230.4 L197.0,230.3 L197.0,230.4 L197.1,230.4 L197.1,230.3 
+		L197.1,230.4 L197.2,230.4 L197.3,230.4 L197.4,230.4 L197.5,230.4 L197.6,230.4 L197.7,230.4 L197.8,230.4 
+		L197.9,230.4 L198.0,230.4 L198.0,230.1 L198.0,230.7 L198.0,230.6 L198.0,229.8 L198.0,230.1 L198.0,231.3 
+		L198.0,230.8 L198.0,228.2 L198.1,229.1 L198.1,239.6 L198.1,245.2 L198.1,368.6 L198.1,216.1 L198.1,239.3 
+		L198.1,231.3 L198.1,228.4 L198.1,230.4 L198.2,231.0 L198.2,230.7 L198.2,230.4 L198.2,229.7 L198.2,230.5 
+		L198.2,231.1 L198.2,229.9 L198.2,230.8 L198.2,230.2 L198.3,230.4 L198.3,230.3 L198.3,230.4 L198.3,230.3 
+		L198.4,230.3 L198.4,230.4 L198.4,230.3 L198.4,230.4 L198.5,230.4 L198.6,230.4 L198.7,230.4 L198.8,230.4 
+		L198.9,230.4 L199.0,230.4 L199.1,230.4 L199.2,230.4 L199.2,230.3 L199.2,230.4 L199.3,230.4 L199.3,230.3 
+		L199.4,230.4 L199.5,230.4 L199.6,230.4 L199.7,230.4 L199.8,230.4 L199.9,230.4 L200.0,230.4 L200.1,230.4 
+		L200.1,230.3 L200.1,230.4 L200.2,230.4 L200.2,230.3 L200.2,230.4 L200.3,230.4 L200.3,230.3 L200.4,230.4 
+		L200.5,230.4 L200.6,230.4 L200.7,230.4 L200.8,230.4 L200.9,230.4 L201.0,230.4 L201.1,230.4 L201.2,230.4 
+		L201.3,230.4 L201.4,230.4 L201.5,230.4 L201.6,230.4 L201.7,230.4 L201.8,230.4 L201.9,230.4 L202.0,230.4 
+		L202.1,230.4 L202.2,230.4 L202.3,230.3 L202.3,230.4 L202.4,230.4 L202.4,230.3 L202.4,230.4 L202.4,230.3 
+		L202.5,230.4 L202.6,230.4 L202.6,230.3 L202.6,230.4 L202.7,230.4 L202.7,230.3 L202.7,230.4 L202.7,230.3 
+		L202.7,230.4 L202.8,230.4 L202.8,230.3 L202.8,230.4 L202.8,230.3 L202.8,230.4 L202.9,230.4 L202.9,230.3 
+		L202.9,230.4 L202.9,230.3 L202.9,230.4 L202.9,230.3 L203.0,230.4 L203.0,230.3 L203.0,230.4 L203.0,230.3 
+		L203.0,230.4 L203.0,230.3 L203.0,230.4 L203.1,230.4 L203.1,230.3 L203.1,230.4 L203.2,230.4 L203.3,230.4 
+		L203.4,230.4 L203.5,230.4 L203.6,230.4 L203.7,230.4 L203.8,230.4 L203.9,230.4 L204.0,230.4 L204.0,230.5 
+		L204.0,230.3 L204.0,230.0 L204.0,230.3 L204.0,231.0 L204.0,230.6 L204.0,229.0 L204.0,229.7 L204.1,234.3 
+		L204.1,233.2 L204.1,183.3 L204.1,271.7 L204.1,275.9 L204.1,233.3 L204.1,226.4 L204.1,229.4 L204.1,231.7 
+		L204.2,231.1 L204.2,230.8 L204.2,231.0 L204.2,230.0 L204.2,229.7 L204.2,230.6 L204.2,231.7 L204.2,230.5 
+		L204.2,230.7 L204.2,230.3 L204.3,230.3 L204.3,230.4 L204.3,230.3 L204.3,230.4 L204.3,230.3 L204.4,230.3 
+		L204.4,230.4 L204.4,230.3 L204.4,230.4 L204.5,230.3 L204.5,230.4 L204.6,230.4 L204.7,230.4 L204.8,230.4 
+		L204.9,230.4 L205.0,230.4 L205.1,230.4 L205.2,230.4 L205.3,230.4 L205.4,230.4 L205.5,230.4 L205.6,230.4 
+		L205.7,230.4 L205.8,230.4 L205.8,230.3 L205.8,230.4 L205.9,230.4 L206.0,230.4 L206.0,230.3 L206.0,230.4 
+		L206.1,230.4 L206.2,230.4 L206.2,230.3 L206.2,230.4 L206.3,230.4 L206.4,230.4 L206.5,230.4 L206.5,230.3 
+		L206.5,230.4 L206.5,230.3 L206.6,230.4 L206.7,230.4 L206.7,230.3 L206.7,230.4 L206.8,230.4 L206.8,230.3 
+		L206.8,230.4 L206.9,230.3 L206.9,230.4 L207.0,230.4 L207.1,230.4 L207.2,230.4 L207.2,230.3 L207.2,230.4 
+		L207.3,230.4 L207.4,230.4 L207.5,230.4 L207.6,230.4 L207.6,230.3 L207.6,230.4 L207.6,230.3 L207.6,230.4 
+		L207.6,230.3 L207.7,230.4 L207.8,230.4 L207.8,230.3 L207.8,230.4 L207.8,230.3 L207.8,230.4 L207.9,230.4 
+		L207.9,230.3 L207.9,230.4 L208.0,230.4 L208.0,230.3 L208.0,230.4 L208.0,230.3 L208.0,230.4 L208.0,230.3 
+		L208.0,230.4 L208.1,230.4 L208.1,230.3 L208.1,230.4 L208.1,230.3 L208.1,230.4 L208.1,230.3 L208.1,230.4 
+		L208.1,230.3 L208.2,230.4 L208.2,230.3 L208.2,230.4 L208.3,230.4 L208.3,230.3 L208.3,230.4 L208.4,230.3 
+		L208.4,230.4 L208.4,230.3 L208.4,230.4 L208.4,230.3 L208.4,230.4 L208.5,230.4 L208.5,230.3 L208.6,230.4 
+		L208.6,230.3 L208.6,230.4 L208.7,230.4 L208.7,230.3 L208.7,230.4 L208.7,230.3 L208.7,230.4 L208.7,230.3 
+		L208.7,230.4 L208.7,230.3 L208.7,230.4 L208.8,230.4 L208.8,230.3 L208.8,230.4 L208.8,230.3 L208.8,230.4 
+		L208.8,230.3 L208.8,230.4 L208.8,230.3 L208.9,230.4 L208.9,230.3 L208.9,230.4 L209.0,230.4 L209.0,230.3 
+		L209.0,230.4 L209.0,230.3 L209.0,230.4 L209.0,230.3 L209.0,230.4 L209.1,230.4 L209.1,230.3 L209.1,230.4 
+		L209.1,230.3 L209.1,230.4 L209.2,230.4 L209.3,230.4 L209.4,230.4 L209.5,230.4 L209.6,230.4 L209.7,230.4 
+		L209.8,230.4 L209.9,230.4 L210.0,230.4 L210.0,230.6 L210.0,230.0 L210.0,230.1 L210.0,230.9 L210.0,230.6 
+		L210.0,229.4 L210.0,230.0 L210.1,232.5 L210.1,231.4 L210.1,221.0 L210.1,217.3 L210.1,90.5 L210.1,242.9 
+		L210.1,221.2 L210.1,229.6 L210.1,232.3 L210.1,230.3 L210.2,229.7 L210.2,230.0 L210.2,230.3 L210.2,231.0 
+		L210.2,230.2 L210.2,229.6 L210.2,230.7 L210.2,229.9 L210.2,230.4 L210.3,230.5 L210.3,230.3 L210.3,230.4 
+		L210.3,230.3 L210.3,230.4 L210.4,230.4 L210.4,230.3 L210.4,230.4 L210.5,230.4 L210.6,230.4 L210.7,230.4 
+		L210.8,230.4 L210.9,230.4 L211.0,230.4 L211.1,230.4 L211.2,230.4 L211.3,230.4 L211.4,230.4 L211.5,230.4 
+		L211.6,230.4 L211.7,230.4 L211.8,230.4 L211.9,230.4 L212.0,230.4 L212.1,230.4 L212.2,230.4 L212.3,230.4 
+		L212.4,230.4 L212.5,230.4 L212.6,230.4 L212.7,230.4 L212.8,230.4 L212.9,230.4 L213.0,230.4 L213.1,230.4 
+		L213.2,230.4 L213.3,230.4 L213.4,230.4 L213.5,230.4 L213.6,230.4 L213.7,230.4 L213.8,230.4 L213.9,230.4 
+		L214.0,230.4 L214.1,230.4 L214.2,230.4 L214.3,230.4 L214.4,230.4 L214.5,230.4 L214.6,230.4 L214.7,230.4 
+		L214.8,230.4 L214.9,230.4 L215.0,230.4 L215.1,230.4 L215.2,230.4 L215.3,230.4 L215.4,230.4 L215.5,230.4 
+		L215.6,230.4 L215.7,230.4 L215.8,230.4 L215.9,230.4 L216.0,230.4 L216.0,230.2 L216.0,230.4 L216.0,230.7 
+		L216.0,230.4 L216.0,229.7 L216.0,230.1 L216.0,231.7 L216.1,230.9 L216.1,226.4 L216.1,227.9 L216.1,277.9 
+		L216.1,194.4 L216.1,184.3 L216.1,227.8 L216.1,234.3 L216.1,231.2 L216.1,229.0 L216.2,229.6 L216.2,229.9 
+		L216.2,229.7 L216.2,230.6 L216.2,231.0 L216.2,230.1 L216.2,229.0 L216.2,230.2 L216.2,230.0 L216.3,230.4 
+		L216.3,230.3 L216.3,230.4 L216.3,230.3 L216.3,230.4 L216.4,230.4 L216.4,230.3 L216.4,230.4 L216.4,230.3 
+		L216.4,230.4 L216.5,230.4 L216.5,230.3 L216.5,230.4 L216.6,230.4 L216.7,230.4 L216.8,230.4 L216.8,230.3 
+		L216.9,230.4 L217.0,230.4 L217.1,230.4 L217.2,230.4 L217.2,230.3 L217.2,230.4 L217.3,230.4 L217.4,230.4 
+		L217.5,230.4 L217.6,230.4 L217.7,230.4 L217.8,230.4 L217.9,230.4 L218.0,230.4 L218.0,230.3 L218.0,230.4 
+		L218.1,230.4 L218.2,230.4 L218.2,230.3 L218.3,230.4 L218.3,230.3 L218.3,230.4 L218.3,230.3 L218.3,230.4 
+		L218.4,230.4 L218.4,230.3 L218.4,230.4 L218.5,230.4 L218.6,230.4 L218.6,230.3 L218.6,230.4 L218.6,230.3 
+		L218.7,230.4 L218.8,230.4 L218.9,230.4 L218.9,230.3 L218.9,230.4 L219.0,230.4 L219.1,230.4 L219.2,230.4 
+		L219.3,230.4 L219.4,230.4 L219.5,230.4 L219.6,230.4 L219.7,230.4 L219.7,230.3 L219.7,230.4 L219.7,230.3 
+		L219.8,230.4 L219.8,230.3 L219.9,230.4 L220.0,230.4 L220.0,230.3 L220.0,230.4 L220.0,230.3 L220.1,230.4 
+		L220.1,230.3 L220.1,230.4 L220.1,230.3 L220.1,230.4 L220.1,230.3 L220.2,230.4 L220.2,230.3 L220.2,230.4 
+		L220.3,230.3 L220.3,230.4 L220.3,230.3 L220.3,230.4 L220.3,230.3 L220.3,230.4 L220.4,230.3 L220.4,230.4 
+		L220.4,230.3 L220.4,230.4 L220.4,230.3 L220.4,230.4 L220.5,230.4 L220.5,230.3 L220.5,230.4 L220.6,230.4 
+		L220.6,230.3 L220.6,230.4 L220.6,230.3 L220.6,230.4 L220.7,230.4 L220.7,230.3 L220.7,230.4 L220.7,230.3 
+		L220.7,230.4 L220.7,230.3 L220.7,230.4 L220.8,230.4 L220.8,230.3 L220.8,230.4 L220.8,230.3 L220.9,230.4 
+		L220.9,230.3 L220.9,230.4 L220.9,230.3 L220.9,230.4 L221.0,230.4 L221.0,230.3 L221.0,230.4 L221.0,230.3 
+		L221.1,230.3 L221.1,230.4 L221.1,230.3 L221.1,230.4 L221.1,230.3 L221.1,230.4 L221.2,230.4 L221.3,230.4 
+		L221.4,230.4 L221.5,230.4 L221.6,230.4 L221.7,230.4 L221.8,230.4 L221.9,230.4 L222.0,230.4 L222.0,230.1 
+		L222.0,230.7 L222.0,230.5 L222.0,229.8 L222.0,230.1 L222.0,231.3 L222.0,230.7 L222.1,228.2 L222.1,229.5 
+		L222.1,239.8 L222.1,241.6 L222.1,371.6 L222.1,219.6 L222.1,239.6 L222.1,231.0 L222.1,228.3 L222.2,230.5 
+		L222.2,231.0 L222.2,230.7 L222.2,230.4 L222.2,229.7 L222.2,230.5 L222.2,231.1 L222.2,230.0 L222.2,230.8 
+		L222.2,230.3 L222.3,230.2 L222.3,230.4 L222.3,230.3 L222.3,230.4 L222.3,230.3 L222.4,230.3 L222.4,230.4 
+		L222.4,230.3 L222.4,230.4 L222.5,230.4 L222.6,230.4 L222.7,230.4 L222.8,230.4 L222.9,230.4 L223.0,230.4 
+		L223.1,230.4 L223.2,230.4 L223.3,230.4 L223.4,230.4 L223.5,230.4 L223.6,230.4 L223.7,230.4 L223.8,230.4 
+		L223.9,230.4 L224.0,230.4 L224.1,230.4 L224.2,230.4 L224.3,230.4 L224.4,230.4 L224.5,230.4 L224.6,230.4 
+		L224.7,230.4 L224.8,230.4 L224.9,230.4 L225.0,230.4 L225.1,230.4 L225.2,230.4 L225.3,230.4 L225.4,230.4 
+		L225.5,230.4 L225.6,230.4 L225.7,230.4 L225.8,230.4 L225.9,230.4 L226.0,230.4 L226.1,230.4 L226.2,230.4 
+		L226.3,230.4 L226.4,230.4 L226.5,230.4 L226.6,230.4 L226.7,230.4 L226.8,230.4 L226.9,230.4 L227.0,230.4 
+		L227.1,230.4 L227.2,230.4 L227.3,230.4 L227.4,230.4 L227.5,230.4 L227.6,230.4 L227.7,230.4 L227.8,230.4 
+		L227.9,230.4 L228.0,230.4 L228.0,230.5 L228.0,230.3 L228.0,230.0 L228.0,230.3 L228.0,231.0 L228.0,230.5 
+		L228.1,229.0 L228.1,229.8 L228.1,234.4 L228.1,232.5 L228.1,182.3 L228.1,260.9 L228.1,276.8 L228.1,232.6 
+		L228.1,226.4 L228.1,229.5 L228.2,231.7 L228.2,231.1 L228.2,230.8 L228.2,231.0 L228.2,230.1 L228.2,229.7 
+		L228.2,230.5 L228.2,231.8 L228.2,230.4 L228.3,230.4 L228.3,230.3 L228.3,230.4 L228.3,230.3 L228.4,230.3 
+		L228.4,230.4 L228.4,230.3 L228.4,230.4 L228.5,230.4 L228.6,230.4 L228.7,230.4 L228.8,230.4 L228.9,230.4 
+		L229.0,230.4 L229.0,230.3 L229.0,230.4 L229.1,230.4 L229.2,230.4 L229.3,230.4 L229.4,230.4 L229.5,230.4 
+		L229.6,230.4 L229.7,230.4 L229.8,230.4 L229.9,230.4 L230.0,230.4 L230.1,230.4 L230.2,230.4 L230.3,230.4 
+		L230.4,230.4 L230.4,230.3 L230.4,230.4 L230.4,230.3 L230.5,230.4 L230.5,230.3 L230.5,230.4 L230.5,230.3 
+		L230.5,230.4 L230.6,230.4 L230.6,230.3 L230.6,230.4 L230.7,230.4 L230.7,230.3 L230.7,230.4 L230.8,230.4 
+		L230.9,230.3 L230.9,230.4 L231.0,230.4 L231.0,230.3 L231.0,230.4 L231.1,230.4 L231.2,230.4 L231.2,230.3 
+		L231.3,230.4 L231.4,230.4 L231.5,230.4 L231.6,230.4 L231.6,230.3 L231.6,230.4 L231.7,230.4 L231.7,230.3 
+		L231.7,230.4 L231.7,230.3 L231.7,230.4 L231.8,230.4 L231.9,230.4 L231.9,230.3 L231.9,230.4 L232.0,230.4 
+		L232.0,230.3 L232.0,230.4 L232.1,230.4 L232.1,230.3 L232.2,230.3 L232.2,230.4 L232.2,230.3 L232.2,230.4 
+		L232.3,230.4 L232.3,230.3 L232.3,230.4 L232.4,230.3 L232.4,230.4 L232.4,230.3 L232.4,230.4 L232.5,230.4 
+		L232.5,230.3 L232.5,230.4 L232.5,230.3 L232.6,230.4 L232.6,230.3 L232.6,230.4 L232.6,230.3 L232.6,230.4 
+		L232.7,230.3 L232.7,230.4 L232.7,230.3 L232.7,230.4 L232.7,230.3 L232.8,230.4 L232.8,230.3 L232.8,230.4 
+		L232.8,230.3 L232.9,230.3 L232.9,230.4 L232.9,230.3 L232.9,230.4 L232.9,230.3 L232.9,230.4 L233.0,230.4 
+		L233.0,230.3 L233.0,230.4 L233.1,230.4 L233.1,230.3 L233.1,230.4 L233.1,230.3 L233.1,230.4 L233.2,230.4 
+		L233.3,230.4 L233.4,230.4 L233.5,230.4 L233.6,230.4 L233.7,230.4 L233.8,230.4 L233.9,230.4 L234.0,230.4 
+		L234.0,230.6 L234.0,230.0 L234.0,230.2 L234.0,230.9 L234.0,230.5 L234.0,229.4 L234.1,230.1 L234.1,232.6 
+		L234.1,231.1 L234.1,220.9 L234.1,221.0 L234.1,87.9 L234.1,239.3 L234.1,221.0 L234.1,229.9 L234.1,232.4 
+		L234.2,230.1 L234.2,229.7 L234.2,229.9 L234.2,230.2 L234.2,231.0 L234.2,230.3 L234.2,229.6 L234.2,230.6 
+		L234.2,229.9 L234.3,230.4 L234.3,230.5 L234.3,230.3 L234.3,230.4 L234.3,230.3 L234.3,230.4 L234.4,230.4 
+		L234.4,230.3 L234.4,230.4 L234.4,230.3 L234.4,230.4 L234.5,230.4 L234.6,230.4 L234.7,230.4 L234.8,230.4 
+		L234.9,230.4 L235.0,230.4 L235.1,230.4 L235.2,230.4 L235.3,230.4 L235.4,230.4 L235.5,230.4 L235.6,230.4 
+		L235.7,230.4 L235.8,230.4 L235.9,230.4 L236.0,230.4 L236.1,230.4 L236.2,230.4 L236.3,230.4 L236.4,230.4 
+		L236.5,230.4 L236.6,230.4 L236.7,230.4 L236.8,230.4 L236.9,230.4 L237.0,230.4 L237.1,230.4 L237.2,230.4 
+		L237.3,230.4 L237.4,230.4 L237.5,230.4 L237.6,230.4 L237.7,230.4 L237.8,230.4 L237.9,230.4 L238.0,230.4 
+		L238.1,230.4 L238.2,230.4 L238.3,230.4 L238.4,230.4 L238.5,230.4 L238.6,230.4 L238.7,230.4 L238.8,230.4 
+		L238.9,230.4 L239.0,230.4 L239.1,230.4 L239.2,230.4 L239.3,230.4 L239.4,230.4 L239.5,230.4 L239.6,230.4 
+		L239.7,230.4 L239.8,230.4 L239.9,230.4 L240.0,230.4 L240.0,230.1 L240.0,230.4 L240.0,230.7 L240.0,230.4 
+		L240.0,229.7 L240.0,230.2 L240.1,231.7 L240.1,230.8 L240.1,226.3 L240.1,228.6 L240.1,278.7 L240.1,205.3 
+		L240.1,183.5 L240.1,228.5 L240.1,234.4 L240.2,231.1 L240.2,229.0 L240.2,229.6 L240.2,229.9 L240.2,229.7 
+		L240.2,230.6 L240.2,231.0 L240.2,230.2 L240.2,228.9 L240.2,230.3 L240.3,230.0 L240.3,230.4 L240.3,230.3 
+		L240.3,230.4 L240.3,230.3 L240.3,230.4 L240.4,230.4 L240.4,230.3 L240.4,230.4 L240.4,230.3 L240.4,230.4 
+		L240.5,230.4 L240.5,230.3 L240.5,230.4 L240.6,230.4 L240.7,230.4 L240.8,230.4 L240.9,230.3 L240.9,230.4 
+		L241.0,230.4 L241.1,230.4 L241.2,230.4 L241.2,230.3 L241.2,230.4 L241.3,230.4 L241.4,230.4 L241.5,230.4 
+		L241.6,230.4 L241.7,230.4 L241.8,230.4 L241.9,230.4 L241.9,230.3 L241.9,230.4 L242.0,230.4 L242.1,230.4 
+		L242.1,230.3 L242.1,230.4 L242.2,230.4 L242.2,230.3 L242.2,230.4 L242.3,230.4 L242.3,230.3 L242.3,230.4 
+		L242.3,230.3 L242.3,230.4 L242.4,230.4 L242.4,230.3 L242.4,230.4 L242.4,230.3 L242.4,230.4 L242.5,230.4 
+		L242.6,230.4 L242.7,230.4 L242.7,230.3 L242.7,230.4 L242.7,230.3 L242.7,230.4 L242.8,230.4 L242.9,230.4 
+		L243.0,230.4 L243.1,230.4 L243.2,230.4 L243.3,230.4 L243.4,230.4 L243.5,230.4 L243.6,230.3 L243.6,230.4 
+		L243.6,230.3 L243.6,230.4 L243.7,230.3 L243.7,230.4 L243.8,230.4 L243.8,230.3 L243.8,230.4 L243.9,230.4 
+		L243.9,230.3 L243.9,230.4 L244.0,230.4 L244.0,230.3 L244.0,230.4 L244.1,230.3 L244.1,230.4 L244.1,230.3 
+		L244.1,230.4 L244.2,230.4 L244.2,230.3 L244.2,230.4 L244.2,230.3 L244.2,230.4 L244.2,230.3 L244.3,230.4 
+		L244.3,230.3 L244.3,230.4 L244.3,230.3 L244.4,230.4 L244.4,230.3 L244.4,230.4 L244.4,230.3 L244.4,230.4 
+		L244.4,230.3 L244.4,230.4 L244.5,230.4 L244.5,230.3 L244.5,230.4 L244.6,230.4 L244.6,230.3 L244.6,230.4 
+		L244.6,230.3 L244.7,230.4 L244.7,230.3 L244.7,230.4 L244.8,230.4 L244.8,230.3 L244.8,230.4 L244.8,230.3 
+		L244.8,230.4 L244.8,230.3 L244.9,230.3 L244.9,230.4 L244.9,230.3 L244.9,230.4 L244.9,230.3 L244.9,230.4 
+		L244.9,230.3 L244.9,230.4 L245.0,230.4 L245.0,230.3 L245.0,230.4 L245.0,230.3 L245.0,230.4 L245.1,230.4 
+		L245.1,230.3 L245.1,230.4 L245.1,230.3 L245.1,230.4 L245.2,230.4 L245.3,230.4 L245.4,230.4 L245.5,230.4 
+		L245.6,230.4 L245.7,230.4 L245.8,230.4 L245.9,230.4 L246.0,230.4 L246.0,230.1 L246.0,230.7 L246.0,230.5 
+		L246.0,229.8 L246.0,230.2 L246.1,231.3 L246.1,230.6 L246.1,228.1 L246.1,229.8 L246.1,239.9 L246.1,237.8 
+		L246.1,373.8 L246.1,223.2 L246.1,239.7 L246.1,230.7 L246.2,228.3 L246.2,230.6 L246.2,231.1 L246.2,230.8 
+		L246.2,230.5 L246.2,229.7 L246.2,230.4 L246.2,231.1 L246.2,230.1 L246.2,230.8 L246.3,230.3 L246.3,230.2 
+		L246.3,230.4 L246.3,230.3 L246.3,230.4 L246.4,230.3 L246.4,230.4 L246.4,230.3 L246.4,230.4 L246.5,230.4 
+		L246.6,230.4 L246.7,230.4 L246.8,230.4 L246.9,230.4 L247.0,230.4 L247.1,230.4 L247.2,230.4 L247.3,230.4 
+		L247.4,230.4 L247.5,230.4 L247.6,230.4 L247.7,230.4 L247.8,230.4 L247.9,230.4 L248.0,230.4 L248.1,230.4 
+		L248.2,230.4 L248.3,230.4 L248.4,230.3 L248.4,230.4 L248.4,230.3 L248.4,230.4 L248.5,230.4 L248.6,230.4 
+		L248.7,230.4 L248.8,230.4 L248.9,230.4 L249.0,230.4 L249.1,230.4 L249.2,230.4 L249.3,230.4 L249.4,230.4 
+		L249.5,230.4 L249.6,230.4 L249.7,230.4 L249.8,230.4 L249.9,230.4 L250.0,230.4 L250.1,230.4 L250.1,230.3 
+		L250.1,230.4 L250.2,230.4 L250.3,230.4 L250.3,230.3 L250.4,230.4 L250.4,230.3 L250.4,230.4 L250.4,230.3 
+		L250.5,230.4 L250.5,230.3 L250.5,230.4 L250.5,230.3 L250.5,230.4 L250.6,230.4 L250.6,230.3 L250.6,230.4 
+		L250.6,230.3 L250.6,230.4 L250.6,230.3 L250.7,230.3 L250.7,230.4 L250.7,230.3 L250.7,230.4 L250.8,230.3 
+		L250.8,230.4 L250.8,230.3 L250.8,230.4 L250.8,230.3 L250.8,230.4 L250.9,230.4 L250.9,230.3 L250.9,230.4 
+		L250.9,230.3 L251.0,230.4 L251.0,230.3 L251.0,230.4 L251.0,230.3 L251.0,230.4 L251.1,230.4 L251.2,230.4 
+		L251.3,230.4 L251.4,230.4 L251.5,230.4 L251.6,230.4 L251.7,230.4 L251.8,230.4 L251.9,230.4 L252.0,230.4 
+		L252.0,230.6 L252.0,230.2 L252.0,230.0 L252.0,230.4 L252.0,231.0 L252.1,230.5 L252.1,228.9 L252.1,230.0 
+		L252.1,234.4 L252.1,231.7 L252.1,181.7 L252.1,249.9 L252.1,277.4 L252.1,231.9 L252.1,226.3 L252.2,229.7 
+		L252.2,231.7 L252.2,231.0 L252.2,230.8 L252.2,231.0 L252.2,230.1 L252.2,229.6 L252.2,230.5 L252.2,231.8 
+		L252.3,230.4 L252.3,230.3 L252.3,230.4 L252.4,230.3 L252.4,230.4 L252.4,230.3 L252.4,230.4 L252.5,230.4 
+		L252.5,230.3 L252.5,230.4 L252.6,230.4 L252.7,230.4 L252.8,230.4 L252.9,230.4 L253.0,230.4 L253.1,230.4 
+		L253.2,230.4 L253.3,230.4 L253.4,230.4 L253.5,230.4 L253.6,230.4 L253.7,230.4 L253.8,230.4 L253.9,230.4 
+		L254.0,230.4 L254.1,230.4 L254.1,230.3 L254.1,230.4 L254.1,230.3 L254.1,230.4 L254.1,230.3 L254.1,230.4 
+		L254.2,230.4 L254.2,230.3 L254.2,230.4 L254.3,230.4 L254.4,230.4 L254.5,230.4 L254.5,230.3 L254.5,230.4 
+		L254.6,230.3 L254.6,230.4 L254.6,230.3 L254.6,230.4 L254.6,230.3 L254.6,230.4 L254.7,230.4 L254.8,230.4 
+		L254.8,230.3 L254.8,230.4 L254.8,230.3 L254.8,230.4 L254.9,230.4 L254.9,230.3 L254.9,230.4 L255.0,230.4 
+		L255.1,230.4 L255.2,230.4 L255.3,230.3 L255.3,230.4 L255.4,230.4 L255.5,230.4 L255.6,230.4 L255.6,230.3 
+		L255.6,230.4 L255.7,230.4 L255.7,230.3 L255.7,230.4 L255.7,230.3 L255.7,230.4 L255.8,230.4 L255.8,230.3 
+		L255.8,230.4 L255.8,230.3 L255.8,230.4 L255.9,230.4 L255.9,230.3 L256.0,230.4 L256.0,230.3 L256.0,230.4 
+		L256.0,230.3 L256.0,230.4 L256.1,230.4 L256.1,230.3 L256.1,230.4 L256.1,230.3 L256.1,230.4 L256.1,230.3 
+		L256.1,230.4 L256.2,230.3 L256.2,230.4 L256.2,230.3 L256.2,230.4 L256.2,230.3 L256.3,230.3 L256.3,230.4 
+		L256.3,230.3 L256.3,230.4 L256.4,230.4 L256.4,230.3 L256.4,230.4 L256.4,230.3 L256.4,230.4 L256.5,230.3 
+		L256.5,230.4 L256.5,230.3 L256.5,230.4 L256.5,230.3 L256.6,230.4 L256.6,230.3 L256.6,230.4 L256.6,230.3 
+		L256.7,230.3 L256.7,230.4 L256.7,230.3 L256.8,230.3 L256.8,230.4 L256.8,230.3 L256.8,230.4 L256.8,230.3 
+		L256.8,230.4 L256.8,230.3 L256.9,230.3 L256.9,230.4 L256.9,230.3 L257.0,230.4 L257.0,230.3 L257.0,230.4 
+		L257.0,230.3 L257.1,230.4 L257.1,230.3 L257.1,230.4 L257.1,230.3 L257.1,230.4 L257.1,230.3 L257.1,230.4 
+		L257.2,230.4 L257.3,230.4 L257.4,230.4 L257.5,230.4 L257.6,230.4 L257.7,230.4 L257.8,230.4 L257.9,230.4 
+		L258.0,230.4 L258.0,230.6 L258.0,230.0 L258.0,230.2 L258.0,230.9 L258.0,230.5 L258.1,229.4 L258.1,230.2 
+		L258.1,232.6 L258.1,230.8 L258.1,220.7 L258.1,224.7 L258.1,86.2 L258.1,235.7 L258.1,220.9 L258.2,230.2 
+		L258.2,232.4 L258.2,230.1 L258.2,229.6 L258.2,229.9 L258.2,230.2 L258.2,231.0 L258.2,230.3 L258.2,229.6 
+		L258.2,230.5 L258.3,229.9 L258.3,230.4 L258.3,230.5 L258.3,230.3 L258.3,230.4 L258.3,230.3 L258.4,230.4 
+		L258.4,230.3 L258.4,230.4 L258.4,230.3 L258.4,230.4 L258.5,230.4 L258.6,230.4 L258.7,230.4 L258.8,230.4 
+		L258.9,230.4 L259.0,230.4 L259.1,230.4 L259.2,230.4 L259.3,230.4 L259.4,230.4 L259.5,230.4 L259.6,230.4 
+		L259.7,230.4 L259.8,230.4 L259.9,230.4 L260.0,230.4 L260.1,230.4 L260.2,230.4 L260.3,230.4 L260.4,230.4 
+		L260.5,230.4 L260.6,230.4 L260.7,230.4 L260.8,230.4 L260.9,230.4 L261.0,230.4 L261.1,230.4 L261.2,230.4 
+		L261.3,230.4 L261.4,230.4 L261.5,230.4 L261.6,230.4 L261.7,230.4 L261.8,230.4 L261.9,230.4 L262.0,230.4 
+		L262.1,230.4 L262.2,230.4 L262.3,230.4 L262.4,230.4 L262.5,230.4 L262.6,230.4 L262.7,230.4 L262.8,230.4 
+		L262.9,230.4 L263.0,230.4 L263.1,230.4 L263.2,230.4 L263.3,230.4 L263.4,230.4 L263.5,230.4 L263.6,230.4 
+		L263.7,230.4 L263.8,230.4 L263.9,230.4 L264.0,230.4 L264.0,230.1 L264.0,230.5 L264.0,230.7 L264.0,230.3 
+		L264.0,229.7 L264.1,230.3 L264.1,231.8 L264.1,230.6 L264.1,226.2 L264.1,229.3 L264.1,279.2 L264.1,216.4 
+		L264.1,183.1 L264.1,229.2 L264.2,234.4 L264.2,230.9 L264.2,229.1 L264.2,229.7 L264.2,229.9 L264.2,229.7 
+		L264.2,230.5 L264.2,231.1 L264.2,230.2 L264.2,228.9 L264.3,230.3 L264.3,230.4 L264.3,230.3 L264.3,230.4 
+		L264.3,230.3 L264.4,230.3 L264.4,230.4 L264.4,230.3 L264.4,230.4 L264.4,230.3 L264.5,230.4 L264.5,230.3 
+		L264.5,230.4 L264.6,230.4 L264.7,230.4 L264.8,230.4 L264.9,230.4 L264.9,230.3 L264.9,230.4 L265.0,230.4 
+		L265.1,230.4 L265.2,230.4 L265.2,230.3 L265.3,230.4 L265.4,230.4 L265.5,230.4 L265.6,230.4 L265.7,230.4 
+		L265.8,230.4 L265.9,230.4 L266.0,230.4 L266.0,230.3 L266.1,230.4 L266.1,230.3 L266.1,230.4 L266.2,230.4 
+		L266.3,230.4 L266.3,230.3 L266.4,230.4 L266.4,230.3 L266.4,230.4 L266.5,230.4 L266.5,230.3 L266.5,230.4 
+		L266.5,230.3 L266.6,230.4 L266.6,230.3 L266.6,230.4 L266.6,230.3 L266.6,230.4 L266.6,230.3 L266.6,230.4 
+		L266.6,230.3 L266.6,230.4 L266.7,230.4 L266.8,230.4 L266.8,230.3 L266.8,230.4 L266.8,230.3 L266.8,230.4 
+		L266.9,230.4 L267.0,230.4 L267.1,230.4 L267.1,230.3 L267.1,230.4 L267.1,230.3 L267.1,230.4 L267.2,230.4 
+		L267.3,230.4 L267.4,230.4 L267.5,230.4 L267.6,230.4 L267.7,230.4 L267.7,230.3 L267.7,230.4 L267.8,230.4 
+		L267.8,230.3 L267.8,230.4 L267.9,230.4 L267.9,230.3 L267.9,230.4 L268.0,230.4 L268.0,230.3 L268.0,230.4 
+		L268.0,230.3 L268.0,230.4 L268.1,230.4 L268.1,230.3 L268.1,230.4 L268.2,230.3 L268.2,230.4 L268.2,230.3 
+		L268.2,230.4 L268.2,230.3 L268.3,230.4 L268.3,230.3 L268.4,230.3 L268.4,230.4 L268.4,230.3 L268.4,230.4 
+		L268.5,230.4 L268.5,230.3 L268.5,230.4 L268.5,230.3 L268.5,230.4 L268.6,230.4 L268.6,230.3 L268.6,230.4 
+		L268.6,230.3 L268.6,230.4 L268.6,230.3 L268.6,230.4 L268.7,230.4 L268.7,230.3 L268.7,230.4 L268.7,230.3 
+		L268.7,230.4 L268.8,230.4 L268.8,230.3 L268.8,230.4 L268.9,230.4 L268.9,230.3 L268.9,230.4 L268.9,230.3 
+		L268.9,230.4 L269.0,230.4 L269.0,230.3 L269.0,230.4 L269.0,230.3 L269.1,230.3 L269.1,230.4 L269.1,230.3 
+		L269.1,230.4 L269.1,230.3 L269.2,230.4 L269.3,230.4 L269.4,230.4 L269.5,230.4 L269.6,230.4 L269.7,230.4 
+		L269.8,230.4 L269.9,230.4 L270.0,230.4 L270.0,230.1 L270.0,230.7 L270.0,230.5 L270.0,229.8 L270.1,230.2 
+		L270.1,231.3 L270.1,230.5 L270.1,228.1 L270.1,230.1 L270.1,240.0 L270.1,234.1 L270.1,375.0 L270.1,226.8 
+		L270.1,239.8 L270.2,230.4 L270.2,228.2 L270.2,230.7 L270.2,231.1 L270.2,230.8 L270.2,230.5 L270.2,229.7 
+		L270.2,230.3 L270.2,231.1 L270.3,230.2 L270.3,230.8 L270.3,230.3 L270.3,230.2 L270.3,230.4 L270.3,230.3 
+		L270.3,230.4 L270.4,230.4 L270.4,230.3 L270.4,230.4 L270.4,230.3 L270.4,230.4 L270.5,230.4 L270.6,230.4 
+		L270.7,230.4 L270.8,230.4 L270.9,230.4 L271.0,230.4 L271.1,230.4 L271.2,230.4 L271.3,230.4 L271.3,230.3 
+		L271.3,230.4 L271.4,230.4 L271.5,230.4 L271.6,230.4 L271.7,230.4 L271.8,230.4 L271.9,230.4 L272.0,230.4 
+		L272.1,230.4 L272.2,230.4 L272.3,230.4 L272.4,230.4 L272.5,230.4 L272.6,230.4 L272.7,230.4 L272.8,230.4 
+		L272.9,230.4 L273.0,230.4 L273.1,230.4 L273.2,230.4 L273.3,230.4 L273.4,230.4 L273.5,230.4 L273.6,230.4 
+		L273.7,230.4 L273.8,230.4 L273.9,230.4 L274.0,230.4 L274.1,230.4 L274.1,230.3 L274.1,230.4 L274.2,230.4 
+		L274.2,230.3 L274.2,230.4 L274.2,230.3 L274.2,230.4 L274.3,230.4 L274.3,230.3 L274.3,230.4 L274.4,230.4 
+		L274.4,230.3 L274.4,230.4 L274.5,230.4 L274.5,230.3 L274.5,230.4 L274.5,230.3 L274.6,230.4 L274.6,230.3 
+		L274.6,230.4 L274.6,230.3 L274.6,230.4 L274.6,230.3 L274.6,230.4 L274.6,230.3 L274.6,230.4 L274.7,230.4 
+		L274.7,230.3 L274.7,230.4 L274.8,230.3 L274.8,230.4 L274.8,230.3 L274.8,230.4 L274.8,230.3 L274.8,230.4 
+		L274.9,230.4 L274.9,230.3 L274.9,230.4 L275.0,230.3 L275.0,230.4 L275.0,230.3 L275.0,230.4 L275.1,230.3 
+		L275.1,230.4 L275.1,230.3 L275.1,230.4 L275.2,230.4 L275.3,230.4 L275.4,230.4 L275.5,230.4 L275.6,230.4 
+		L275.7,230.4 L275.8,230.4 L275.9,230.4 L276.0,230.4 L276.0,230.6 L276.0,230.2 L276.0,230.0 L276.0,230.4 
+		L276.1,231.0 L276.1,230.4 L276.1,228.9 L276.1,230.2 L276.1,234.5 L276.1,231.0 L276.1,181.3 L276.1,238.8 
+		L276.1,277.8 L276.1,231.1 L276.2,226.3 L276.2,229.9 L276.2,231.6 L276.2,231.0 L276.2,230.7 L276.2,231.0 
+		L276.2,230.2 L276.2,229.6 L276.2,230.4 L276.3,231.8 L276.3,230.4 L276.3,230.7 L276.3,230.3 L276.3,230.4 
+		L276.3,230.3 L276.3,230.4 L276.4,230.4 L276.4,230.3 L276.4,230.4 L276.4,230.3 L276.4,230.4 L276.5,230.4 
+		L276.6,230.4 L276.7,230.4 L276.8,230.4 L276.9,230.4 L277.0,230.4 L277.0,230.3 L277.0,230.4 L277.1,230.4 
+		L277.2,230.4 L277.3,230.4 L277.4,230.4 L277.5,230.4 L277.6,230.4 L277.7,230.4 L277.8,230.4 L277.9,230.4 
+		L277.9,230.3 L277.9,230.4 L278.0,230.4 L278.0,230.3 L278.0,230.4 L278.1,230.4 L278.1,230.3 L278.1,230.4 
+		L278.2,230.4 L278.3,230.4 L278.3,230.3 L278.3,230.4 L278.3,230.3 L278.4,230.4 L278.4,230.3 L278.4,230.4 
+		L278.4,230.3 L278.4,230.4 L278.5,230.4 L278.6,230.4 L278.6,230.3 L278.6,230.4 L278.7,230.4 L278.7,230.3 
+		L278.7,230.4 L278.8,230.4 L278.8,230.3 L278.8,230.4 L278.9,230.4 L278.9,230.3 L278.9,230.4 L278.9,230.3 
+		L278.9,230.4 L279.0,230.4 L279.1,230.3 L279.1,230.4 L279.2,230.4 L279.3,230.4 L279.4,230.4 L279.5,230.4 
+		L279.6,230.4 L279.6,230.3 L279.6,230.4 L279.6,230.3 L279.7,230.4 L279.7,230.3 L279.7,230.4 L279.8,230.4 
+		L279.8,230.3 L279.9,230.4 L279.9,230.3 L279.9,230.4 L280.0,230.4 L280.0,230.3 L280.0,230.4 L280.0,230.3 
+		L280.0,230.4 L280.1,230.3 L280.1,230.4 L280.1,230.3 L280.1,230.4 L280.2,230.4 L280.2,230.3 L280.2,230.4 
+		L280.2,230.3 L280.3,230.3 L280.3,230.4 L280.3,230.3 L280.3,230.4 L280.3,230.3 L280.4,230.4 L280.4,230.3 
+		L280.4,230.4 L280.4,230.3 L280.4,230.4 L280.4,230.3 L280.5,230.4 L280.5,230.3 L280.5,230.4 L280.5,230.3 
+		L280.5,230.4 L280.5,230.3 L280.6,230.3 L280.6,230.4 L280.6,230.3 L280.6,230.4 L280.6,230.3 L280.7,230.3 
+		L280.7,230.4 L280.8,230.4 L280.8,230.3 L280.8,230.4 L280.8,230.3 L280.8,230.4 L280.9,230.3 L280.9,230.4 
+		L280.9,230.3 L280.9,230.4 L281.0,230.3 L281.0,230.4 L281.0,230.3 L281.0,230.4 L281.0,230.3 L281.0,230.4 
+		L281.0,230.3 L281.1,230.3 L281.1,230.4 L281.1,230.3 L281.1,230.4 L281.1,230.3 L281.1,230.4 L281.2,230.3 
+		L281.2,230.4 L281.3,230.4 L281.4,230.4 L281.5,230.4 L281.6,230.4 L281.7,230.4 L281.8,230.4 L281.9,230.4 
+		L282.0,230.4 L282.0,230.5 L282.0,230.0 L282.0,230.2 L282.0,230.9 L282.1,230.4 L282.1,229.4 L282.1,230.3 
+		L282.1,232.6 L282.1,230.5 L282.1,220.7 L282.1,228.5 L282.1,85.3 L282.1,232.1 L282.2,220.8 L282.2,230.5 
+		L282.2,232.5 L282.2,230.0 L282.2,229.5 L282.2,229.9 L282.2,230.1 L282.2,231.0 L282.2,230.4 L282.2,229.6 
+		L282.3,230.4 L282.3,229.9 L282.3,230.4 L282.3,230.5 L282.3,230.3 L282.3,230.4 L282.4,230.3 L282.4,230.4 
+		L282.4,230.3 L282.4,230.4 L282.5,230.4 L282.5,230.3 L282.5,230.4 L282.6,230.4 L282.6,230.3 L282.7,230.4 
+		L282.8,230.4 L282.9,230.4 L283.0,230.4 L283.1,230.4 L283.2,230.4 L283.2,230.3 L283.3,230.3 L283.3,230.4 
+		L283.4,230.4 L283.5,230.4 L283.6,230.4 L283.7,230.4 L283.8,230.4 L283.9,230.4 L284.0,230.4 L284.1,230.4 
+		L284.2,230.4 L284.3,230.4 L284.4,230.4 L284.5,230.4 L284.6,230.4 L284.7,230.4 L284.8,230.4 L284.9,230.4 
+		L285.0,230.4 L285.1,230.4 L285.2,230.4 L285.3,230.4 L285.4,230.4 L285.5,230.4 L285.6,230.4 L285.7,230.4 
+		L285.8,230.4 L285.9,230.4 L286.0,230.4 L286.0,230.3 L286.0,230.4 L286.1,230.4 L286.1,230.3 L286.1,230.4 
+		L286.2,230.4 L286.3,230.3 L286.3,230.4 L286.3,230.3 L286.3,230.4 L286.4,230.3 L286.4,230.4 L286.4,230.3 
+		L286.4,230.4 L286.5,230.4 L286.6,230.4 L286.6,230.3 L286.6,230.4 L286.6,230.3 L286.6,230.4 L286.7,230.4 
+		L286.7,230.3 L286.7,230.4 L286.7,230.3 L286.8,230.4 L286.8,230.3 L286.8,230.4 L286.8,230.3 L286.9,230.4 
+		L286.9,230.3 L286.9,230.4 L286.9,230.3 L286.9,230.4 L286.9,230.3 L286.9,230.4 L287.0,230.4 L287.0,230.3 
+		L287.0,230.4 L287.1,230.4 L287.1,230.3 L287.1,230.4 L287.1,230.3 L287.2,230.4 L287.3,230.4 L287.4,230.4 
+		L287.5,230.4 L287.6,230.4 L287.7,230.4 L287.8,230.4 L287.9,230.4 L288.0,230.4 L288.0,230.1 L288.0,230.5 
+		L288.0,230.7 L288.1,230.3 L288.1,229.7 L288.1,230.4 L288.1,231.8 L288.1,230.4 L288.1,226.2 L288.1,230.1 
+		L288.1,279.4 L288.1,227.5 L288.1,182.9 L288.2,229.9 L288.2,234.4 L288.2,230.8 L288.2,229.1 L288.2,229.7 
+		L288.2,230.0 L288.2,229.7 L288.2,230.5 L288.2,231.0 L288.2,230.3 L288.3,228.9 L288.3,230.3 L288.3,230.0 
+		L288.3,230.4 L288.3,230.3 L288.3,230.4 L288.4,230.3 L288.4,230.4 L288.4,230.3 L288.4,230.4 L288.5,230.3 
+		L288.5,230.4 L288.5,230.3 L288.5,230.4 L288.6,230.4 L288.7,230.4 L288.8,230.4 L288.9,230.4 L288.9,230.3 
+		L288.9,230.4 L289.0,230.4 L289.1,230.4 L289.2,230.4 L289.3,230.3 L289.3,230.4 L289.4,230.4 L289.5,230.4 
+		L289.6,230.4 L289.7,230.4 L289.8,230.4 L289.9,230.4 L289.9,230.3 L289.9,230.4 L290.0,230.4 L290.1,230.4 
+		L290.1,230.3 L290.1,230.4 L290.1,230.3 L290.1,230.4 L290.2,230.4 L290.3,230.4 L290.3,230.3 L290.3,230.4 
+		L290.4,230.4 L290.4,230.3 L290.4,230.4 L290.5,230.4 L290.6,230.4 L290.7,230.4 L290.7,230.3 L290.7,230.4 
+		L290.7,230.3 L290.7,230.4 L290.8,230.4 L290.8,230.3 L290.8,230.4 L290.9,230.4 L291.0,230.4 L291.0,230.3 
+		L291.0,230.4 L291.1,230.4 L291.2,230.4 L291.3,230.4 L291.4,230.4 L291.5,230.4 L291.6,230.4 L291.6,230.3 
+		L291.6,230.4 L291.7,230.4 L291.8,230.4 L291.8,230.3 L291.8,230.4 L291.8,230.3 L291.8,230.4 L291.9,230.4 
+		L291.9,230.3 L291.9,230.4 L291.9,230.3 L291.9,230.4 L291.9,230.3 L291.9,230.4 L292.0,230.4 L292.0,230.3 
+		L292.0,230.4 L292.0,230.3 L292.1,230.4 L292.1,230.3 L292.1,230.4 L292.1,230.3 L292.2,230.4 L292.2,230.3 
+		L292.2,230.4 L292.2,230.3 L292.2,230.4 L292.3,230.3 L292.3,230.4 L292.3,230.3 L292.3,230.4 L292.4,230.3 
+		L292.4,230.4 L292.4,230.3 L292.4,230.4 L292.4,230.3 L292.4,230.4 L292.4,230.3 L292.5,230.4 L292.5,230.3 
+		L292.5,230.4 L292.5,230.3 L292.5,230.4 L292.5,230.3 L292.5,230.4 L292.6,230.3 L292.6,230.4 L292.6,230.3 
+		L292.6,230.4 L292.6,230.3 L292.6,230.4 L292.6,230.3 L292.7,230.4 L292.7,230.3 L292.7,230.4 L292.7,230.3 
+		L292.7,230.4 L292.8,230.3 L292.8,230.4 L292.8,230.3 L292.9,230.3 L292.9,230.4 L292.9,230.3 L292.9,230.4 
+		L292.9,230.3 L292.9,230.4 L292.9,230.3 L293.0,230.4 L293.0,230.3 L293.0,230.4 L293.0,230.3 L293.0,230.4 
+		L293.1,230.3 L293.1,230.4 L293.1,230.3 L293.1,230.4 L293.1,230.3 L293.1,230.4 L293.1,230.3 L293.2,230.3 
+		L293.2,230.4 L293.2,230.3 L293.2,230.4 L293.3,230.4 L293.4,230.4 L293.5,230.4 L293.6,230.4 L293.7,230.4 
+		L293.8,230.4 L293.9,230.4 L294.0,230.4 L294.0,230.2 L294.0,230.7 L294.0,230.5 L294.1,229.8 L294.1,230.3 
+		L294.1,231.3 L294.1,230.4 L294.1,228.1 L294.1,230.4 L294.1,240.0 L294.1,230.3 L294.1,375.5 L294.1,230.5 
+		L294.2,239.9 L294.2,230.1 L294.2,228.2 L294.2,230.8 L294.2,231.2 L294.2,230.8 L294.2,230.6 L294.2,229.7 
+		L294.2,230.3 L294.3,231.1 L294.3,230.4 L294.3,230.8 L294.3,230.3 L294.3,230.2 L294.3,230.4 L294.3,230.3 
+		L294.4,230.4 L294.4,230.3 L294.4,230.4 L294.5,230.3 L294.5,230.4 L294.6,230.4 L294.7,230.4 L294.8,230.4 
+		L294.9,230.4 L295.0,230.4 L295.1,230.4 L295.2,230.4 L295.3,230.4 L295.4,230.4 L295.5,230.4 L295.6,230.4 
+		L295.7,230.4 L295.8,230.4 L295.9,230.4 L296.0,230.4 L296.1,230.4 L296.2,230.4 L296.2,230.3 L296.2,230.4 
+		L296.2,230.3 L296.3,230.4 L296.3,230.3 L296.3,230.4 L296.4,230.4 L296.5,230.4 L296.5,230.3 L296.5,230.4 
+		L296.6,230.4 L296.7,230.4 L296.8,230.4 L296.9,230.4 L297.0,230.4 L297.1,230.4 L297.2,230.4 L297.3,230.4 
+		L297.4,230.4 L297.5,230.4 L297.6,230.4 L297.7,230.4 L297.8,230.4 L297.9,230.4 L298.0,230.4 L298.1,230.4 
+		L298.1,230.3 L298.1,230.4 L298.1,230.3 L298.1,230.4 L298.2,230.4 L298.3,230.4 L298.3,230.3 L298.3,230.4 
+		L298.4,230.4 L298.4,230.3 L298.4,230.4 L298.5,230.4 L298.6,230.4 L298.6,230.3 L298.6,230.4 L298.6,230.3 
+		L298.7,230.4 L298.7,230.3 L298.7,230.4 L298.8,230.3 L298.8,230.4 L298.9,230.4 L298.9,230.3 L299.0,230.4 
+		L299.0,230.3 L299.0,230.4 L299.1,230.3 L299.1,230.4 L299.1,230.3 L299.1,230.4 L299.1,230.3 L299.2,230.3 
+		L299.2,230.4 L299.3,230.4 L299.4,230.4 L299.5,230.4 L299.6,230.4 L299.7,230.4 L299.8,230.4 L299.9,230.4 
+		L300.0,230.4 L300.0,230.6 L300.0,230.2 L300.0,230.0 L300.1,230.4 L300.1,231.0 L300.1,230.3 L300.1,228.9 
+		L300.1,230.4 L300.1,234.5 L300.1,230.3 L300.1,181.3 L300.1,227.6 L300.2,277.8 L300.2,230.4 L300.2,226.3 
+		L300.2,230.0 L300.2,231.6 L300.2,230.9 L300.2,230.7 L300.2,231.0 L300.2,230.2 L300.2,229.7 L300.3,230.4 
+		L300.3,231.8 L300.3,230.3 L300.3,230.7 L300.3,230.4 L300.3,230.3 L300.3,230.4 L300.3,230.3 L300.4,230.4 
+		L300.4,230.3 L300.4,230.4 L300.4,230.3 L300.5,230.4 L300.6,230.4 L300.7,230.4 L300.8,230.4 L300.9,230.4 
+		L301.0,230.4 L301.1,230.4 L301.2,230.4 L301.3,230.4 L301.4,230.4 L301.5,230.4 L301.6,230.4 L301.7,230.4 
+		L301.8,230.4 L301.9,230.4 L302.0,230.4 L302.0,230.3 L302.0,230.4 L302.1,230.4 L302.2,230.4 L302.2,230.3 
+		L302.2,230.4 L302.3,230.4 L302.4,230.3 L302.4,230.4 L302.5,230.4 L302.5,230.3 L302.5,230.4 L302.5,230.3 
+		L302.5,230.4 L302.6,230.3 L302.6,230.4 L302.6,230.3 L302.6,230.4 L302.6,230.3 L302.6,230.4 L302.7,230.3 
+		L302.7,230.4 L302.7,230.3 L302.8,230.4 L302.8,230.3 L302.8,230.4 L302.9,230.4 L302.9,230.3 L302.9,230.4 
+		L303.0,230.3 L303.0,230.4 L303.0,230.3 L303.0,230.4 L303.1,230.4 L303.2,230.4 L303.3,230.4 L303.3,230.3 
+		L303.3,230.4 L303.4,230.4 L303.5,230.4 L303.6,230.4 L303.7,230.3 L303.7,230.4 L303.8,230.4 L303.8,230.3 
+		L303.8,230.4 L303.8,230.3 L303.9,230.4 L303.9,230.3 L303.9,230.4 L303.9,230.3 L303.9,230.4 L304.0,230.3 
+		L304.0,230.4 L304.0,230.3 L304.0,230.4 L304.0,230.3 L304.1,230.3 L304.1,230.4 L304.1,230.3 L304.1,230.4 
+		L304.2,230.4 L304.2,230.3 L304.2,230.4 L304.2,230.3 L304.3,230.3 L304.3,230.4 L304.3,230.3 L304.3,230.4 
+		L304.3,230.3 L304.3,230.4 L304.4,230.4 L304.4,230.3 L304.4,230.4 L304.5,230.3 L304.5,230.4 L304.5,230.3 
+		L304.5,230.4 L304.5,230.3 L304.5,230.4 L304.5,230.3 L304.5,230.4 L304.6,230.3 L304.6,230.4 L304.6,230.3 
+		L304.7,230.3 L304.7,230.4 L304.7,230.3 L304.7,230.4 L304.7,230.3 L304.8,230.3 L304.8,230.4 L304.8,230.3 
+		L304.8,230.4 L304.8,230.3 L304.8,230.4 L304.9,230.3 L304.9,230.4 L304.9,230.3 L304.9,230.4 L304.9,230.3 
+		L305.0,230.3 L305.0,230.4 L305.0,230.3 L305.0,230.4 L305.1,230.3 L305.1,230.4 L305.1,230.3 L305.1,230.4 
+		L305.1,230.3 L305.1,230.4 L305.2,230.3 L305.2,230.4 L305.3,230.4 L305.4,230.4 L305.5,230.4 L305.6,230.4 
+		L305.7,230.4 L305.8,230.4 L305.9,230.4 L306.0,230.4 L306.0,230.5 L306.0,230.1 L306.0,230.3 L306.1,230.9 
+		L306.1,230.4 L306.1,229.4 L306.1,230.4 L306.1,232.6 L306.1,230.1 L306.1,220.7 L306.1,232.3 L306.1,85.3 
+		L306.2,228.4 L306.2,220.8 L306.2,230.8 L306.2,232.5 L306.2,229.9 L306.2,229.5 L306.2,229.9 L306.2,230.1 
+		L306.2,231.0 L306.2,230.4 L306.3,229.5 L306.3,230.3 L306.3,229.9 L306.3,230.3 L306.3,230.5 L306.3,230.4 
+		L306.3,230.3 L306.3,230.4 L306.4,230.4 L306.4,230.3 L306.4,230.4 L306.4,230.3 L306.4,230.4 L306.5,230.3 
+		L306.5,230.4 L306.6,230.4 L306.7,230.4 L306.8,230.4 L306.9,230.4 L307.0,230.4 L307.1,230.4 L307.2,230.4 
+		L307.3,230.4 L307.4,230.4 L307.5,230.4 L307.6,230.4 L307.7,230.4 L307.8,230.4 L307.9,230.4 L308.0,230.4 
+		L308.1,230.4 L308.2,230.4 L308.3,230.4 L308.4,230.4 L308.5,230.4 L308.6,230.4 L308.7,230.4 L308.8,230.4 
+		L308.9,230.4 L309.0,230.4 L309.1,230.4 L309.2,230.4 L309.3,230.4 L309.4,230.4 L309.5,230.4 L309.6,230.4 
+		L309.7,230.4 L309.8,230.4 L309.9,230.4 L310.0,230.4 L310.1,230.4 L310.2,230.4 L310.3,230.4 L310.4,230.4 
+		L310.5,230.4 L310.6,230.4 L310.7,230.4 L310.8,230.4 L310.9,230.4 L311.0,230.4 L311.1,230.4 L311.2,230.4 
+		L311.3,230.4 L311.4,230.4 L311.5,230.4 L311.6,230.4 L311.7,230.4 L311.8,230.4 L311.9,230.4 L312.0,230.4 
+		L312.0,230.1 L312.0,230.5 L312.1,230.7 L312.1,230.2 L312.1,229.7 L312.1,230.4 L312.1,231.8 L312.1,230.2 
+		L312.1,226.2 L312.1,230.8 L312.1,279.4 L312.1,238.7 L312.2,182.9 L312.2,230.7 L312.2,234.3 L312.2,230.6 
+		L312.2,229.1 L312.2,229.8 L312.2,230.0 L312.2,229.7 L312.2,230.4 L312.3,231.0 L312.3,230.4 L312.3,228.9 
+		L312.3,230.4 L312.3,230.0 L312.3,230.3 L312.3,230.4 L312.3,230.3 L312.4,230.4 L312.4,230.3 L312.4,230.4 
+		L312.4,230.3 L312.4,230.4 L312.5,230.4 L312.5,230.3 L312.5,230.4 L312.5,230.3 L312.5,230.4 L312.6,230.4 
+		L312.7,230.4 L312.8,230.4 L312.9,230.4 L312.9,230.3 L312.9,230.4 L313.0,230.4 L313.1,230.4 L313.2,230.4 
+		L313.3,230.4 L313.3,230.3 L313.3,230.4 L313.4,230.4 L313.5,230.4 L313.6,230.4 L313.7,230.4 L313.8,230.4 
+		L313.8,230.3 L313.9,230.4 L314.0,230.4 L314.1,230.4 L314.2,230.4 L314.2,230.3 L314.2,230.4 L314.3,230.3 
+		L314.3,230.4 L314.3,230.3 L314.3,230.4 L314.3,230.3 L314.4,230.3 L314.4,230.4 L314.5,230.4 L314.5,230.3 
+		L314.6,230.4 L314.7,230.4 L314.7,230.3 L314.7,230.4 L314.8,230.4 L314.9,230.4 L315.0,230.4 L315.1,230.4 
+		L315.2,230.4 L315.3,230.4 L315.4,230.4 L315.5,230.4 L315.6,230.4 L315.7,230.4 L315.7,230.3 L315.7,230.4 
+		L315.8,230.3 L315.8,230.4 L315.8,230.3 L315.8,230.4 L315.8,230.3 L315.8,230.4 L315.9,230.4 L315.9,230.3 
+		L315.9,230.4 L315.9,230.3 L315.9,230.4 L315.9,230.3 L315.9,230.4 L316.0,230.4 L316.0,230.3 L316.0,230.4 
+		L316.0,230.3 L316.0,230.4 L316.1,230.4 L316.1,230.3 L316.1,230.4 L316.1,230.3 L316.1,230.4 L316.1,230.3 
+		L316.2,230.4 L316.2,230.3 L316.2,230.4 L316.2,230.3 L316.2,230.4 L316.3,230.4 L316.3,230.3 L316.3,230.4 
+		L316.3,230.3 L316.3,230.4 L316.4,230.4 L316.4,230.3 L316.5,230.4 L316.5,230.3 L316.5,230.4 L316.5,230.3 
+		L316.5,230.4 L316.5,230.3 L316.5,230.4 L316.6,230.3 L316.6,230.4 L316.6,230.3 L316.6,230.4 L316.6,230.3 
+		L316.6,230.4 L316.7,230.4 L316.7,230.3 L316.7,230.4 L316.7,230.3 L316.7,230.4 L316.7,230.3 L316.8,230.3 
+		L316.8,230.4 L316.8,230.3 L316.9,230.4 L316.9,230.3 L316.9,230.4 L316.9,230.3 L316.9,230.4 L316.9,230.3 
+		L317.0,230.4 L317.0,230.3 L317.0,230.4 L317.0,230.3 L317.0,230.4 L317.1,230.4 L317.1,230.3 L317.1,230.4 
+		L317.1,230.3 L317.1,230.4 L317.2,230.4 L317.3,230.4 L317.4,230.4 L317.5,230.4 L317.6,230.4 L317.7,230.4 
+		L317.8,230.4 L317.9,230.4 L318.0,230.4 L318.0,230.2 L318.0,230.6 L318.1,230.4 L318.1,229.8 L318.1,230.4 
+		L318.1,231.3 L318.1,230.2 L318.1,228.1 L318.1,230.7 L318.1,240.0 L318.1,226.5 L318.1,375.1 L318.2,234.1 
+		L318.2,239.9 L318.2,229.7 L318.2,228.2 L318.2,230.9 L318.2,231.2 L318.2,230.9 L318.2,230.6 L318.2,229.7 
+		L318.3,230.2 L318.3,231.1 L318.3,230.5 L318.3,230.8 L318.3,230.4 L318.3,230.2 L318.3,230.3 L318.3,230.4 
+		L318.3,230.3 L318.4,230.3 L318.4,230.4 L318.4,230.3 L318.4,230.4 L318.5,230.4 L318.5,230.3 L318.5,230.4 
+		L318.6,230.4 L318.7,230.4 L318.8,230.4 L318.9,230.4 L319.0,230.4 L319.1,230.4 L319.2,230.4 L319.3,230.4 
+		L319.4,230.4 L319.5,230.4 L319.6,230.4 L319.7,230.4 L319.8,230.4 L319.9,230.4 L320.0,230.4 L320.1,230.4 
+		L320.2,230.4 L320.3,230.4 L320.4,230.4 L320.5,230.4 L320.6,230.4 L320.7,230.4 L320.8,230.4 L320.9,230.4 
+		L321.0,230.4 L321.1,230.4 L321.2,230.4 L321.3,230.4 L321.4,230.4 L321.5,230.4 L321.6,230.4 L321.7,230.4 
+		L321.8,230.4 L321.9,230.4 L322.0,230.4 L322.1,230.4 L322.2,230.4 L322.3,230.4 L322.4,230.4 L322.5,230.4 
+		L322.6,230.4 L322.7,230.4 L322.8,230.4 L322.9,230.4 L323.0,230.4 L323.1,230.4 L323.2,230.4 L323.3,230.4 
+		L323.4,230.4 L323.5,230.4 L323.6,230.4 L323.7,230.4 L323.8,230.4 L323.9,230.4 L324.0,230.4 L324.0,230.6 
+		L324.0,230.2 L324.1,229.9 L324.1,230.5 L324.1,231.0 L324.1,230.2 L324.1,228.9 L324.1,230.5 L324.1,234.4 
+		L324.1,229.5 L324.1,181.5 L324.2,216.5 L324.2,277.6 L324.2,229.7 L324.2,226.4 L324.2,230.2 L324.2,231.6 
+		L324.2,230.9 L324.2,230.7 L324.2,231.0 L324.2,230.3 L324.3,229.7 L324.3,230.3 L324.3,231.8 L324.3,230.3 
+		L324.3,230.7 L324.3,230.4 L324.3,230.3 L324.3,230.4 L324.4,230.4 L324.4,230.3 L324.4,230.4 L324.4,230.3 
+		L324.4,230.4 L324.5,230.3 L324.5,230.4 L324.6,230.4 L324.7,230.4 L324.7,230.3 L324.7,230.4 L324.8,230.4 
+		L324.9,230.4 L325.0,230.4 L325.0,230.3 L325.0,230.4 L325.1,230.4 L325.2,230.4 L325.3,230.4 L325.4,230.4 
+		L325.5,230.4 L325.6,230.4 L325.7,230.4 L325.8,230.4 L325.9,230.4 L326.0,230.4 L326.0,230.3 L326.0,230.4 
+		L326.1,230.4 L326.1,230.3 L326.1,230.4 L326.2,230.4 L326.3,230.4 L326.3,230.3 L326.3,230.4 L326.4,230.4 
+		L326.4,230.3 L326.4,230.4 L326.5,230.4 L326.5,230.3 L326.5,230.4 L326.5,230.3 L326.5,230.4 L326.6,230.4 
+		L326.6,230.3 L326.6,230.4 L326.7,230.4 L326.7,230.3 L326.7,230.4 L326.8,230.4 L326.8,230.3 L326.8,230.4 
+		L326.9,230.4 L326.9,230.3 L326.9,230.4 L327.0,230.4 L327.1,230.4 L327.2,230.4 L327.2,230.3 L327.2,230.4 
+		L327.3,230.4 L327.3,230.3 L327.3,230.4 L327.4,230.4 L327.5,230.4 L327.6,230.4 L327.7,230.4 L327.7,230.3 
+		L327.7,230.4 L327.7,230.3 L327.7,230.4 L327.8,230.4 L327.9,230.4 L327.9,230.3 L327.9,230.4 L327.9,230.3 
+		L327.9,230.4 L327.9,230.3 L327.9,230.4 L327.9,230.3 L327.9,230.4 L328.0,230.3 L328.0,230.4 L328.0,230.3 
+		L328.0,230.4 L328.0,230.3 L328.1,230.4 L328.1,230.3 L328.1,230.4 L328.2,230.4 L328.2,230.3 L328.2,230.4 
+		L328.2,230.3 L328.3,230.4 L328.3,230.3 L328.3,230.4 L328.4,230.4 L328.4,230.3 L328.4,230.4 L328.4,230.3 
+		L328.4,230.4 L328.4,230.3 L328.5,230.3 L328.5,230.4 L328.5,230.3 L328.6,230.4 L328.6,230.3 L328.6,230.4 
+		L328.6,230.3 L328.6,230.4 L328.7,230.4 L328.7,230.3 L328.7,230.4 L328.7,230.3 L328.7,230.4 L328.7,230.3 
+		L328.8,230.4 L328.8,230.3 L328.8,230.4 L328.8,230.3 L328.8,230.4 L328.8,230.3 L328.8,230.4 L328.9,230.3 
+		L328.9,230.4 L328.9,230.3 L328.9,230.4 L329.0,230.3 L329.0,230.4 L329.0,230.3 L329.0,230.4 L329.0,230.3 
+		L329.0,230.4 L329.1,230.4 L329.1,230.3 L329.1,230.4 L329.1,230.3 L329.1,230.4 L329.1,230.3 L329.2,230.4 
+		L329.3,230.4 L329.4,230.4 L329.5,230.4 L329.6,230.4 L329.7,230.4 L329.8,230.4 L329.9,230.4 L330.0,230.4 
+		L330.0,230.5 L330.1,230.1 L330.1,230.3 L330.1,230.9 L330.1,230.3 L330.1,229.4 L330.1,230.5 L330.1,232.6 
+		L330.1,229.8 L330.1,220.7 L330.1,236.0 L330.2,86.2 L330.2,224.8 L330.2,220.9 L330.2,231.1 L330.2,232.5 
+		L330.2,229.8 L330.2,229.5 L330.2,229.8 L330.2,230.0 L330.2,231.0 L330.3,230.5 L330.3,229.5 L330.3,230.2 
+		L330.3,229.9 L330.3,230.3 L330.3,230.5 L330.3,230.4 L330.3,230.3 L330.4,230.4 L330.4,230.3 L330.4,230.4 
+		L330.4,230.3 L330.5,230.4 L330.5,230.3 L330.5,230.4 L330.6,230.4 L330.7,230.4 L330.8,230.4 L330.9,230.4 
+		L331.0,230.4 L331.1,230.4 L331.2,230.4 L331.3,230.4 L331.4,230.4 L331.5,230.4 L331.6,230.4 L331.7,230.4 
+		L331.8,230.4 L331.9,230.4 L332.0,230.4 L332.1,230.4 L332.2,230.4 L332.3,230.4 L332.4,230.4 L332.5,230.4 
+		L332.6,230.4 L332.7,230.4 L332.8,230.4 L332.9,230.4 L333.0,230.4 L333.1,230.4 L333.2,230.4 L333.3,230.4 
+		L333.4,230.4 L333.5,230.4 L333.6,230.4 L333.7,230.4 L333.8,230.4 L333.9,230.4 L334.0,230.4 L334.1,230.4 
+		L334.2,230.4 L334.3,230.4 L334.4,230.4 L334.5,230.4 L334.6,230.4 L334.7,230.4 L334.8,230.4 L334.9,230.4 
+		L335.0,230.4 L335.1,230.4 L335.2,230.4 L335.3,230.4 L335.4,230.4 L335.5,230.4 L335.6,230.4 L335.7,230.4 
+		L335.8,230.4 L335.9,230.4 L336.0,230.4 L336.0,230.1 L336.1,230.5 L336.1,230.8 L336.1,230.2 L336.1,229.7 
+		L336.1,230.5 L336.1,231.8 L336.1,230.1 L336.1,226.3 L336.1,231.6 L336.1,279.0 L336.2,249.8 L336.2,183.3 
+		L336.2,231.4 L336.2,234.3 L336.2,230.4 L336.2,229.2 L336.2,229.9 L336.2,230.1 L336.2,229.7 L336.3,230.4 
+		L336.3,231.0 L336.3,230.4 L336.3,228.9 L336.3,230.4 L336.4,230.3 L336.4,230.4 L336.4,230.3 L336.4,230.4 
+		L336.4,230.3 L336.5,230.4 L336.5,230.3 L336.5,230.4 L336.5,230.3 L336.6,230.4 L336.7,230.4 L336.8,230.4 
+		L336.9,230.4 L336.9,230.3 L336.9,230.4 L337.0,230.4 L337.1,230.4 L337.2,230.4 L337.3,230.4 L337.3,230.3 
+		L337.3,230.4 L337.4,230.4 L337.5,230.4 L337.6,230.4 L337.7,230.4 L337.8,230.4 L337.9,230.4 L338.0,230.4 
+		L338.1,230.4 L338.2,230.4 L338.2,230.3 L338.2,230.4 L338.2,230.3 L338.2,230.4 L338.3,230.4 L338.3,230.3 
+		L338.3,230.4 L338.4,230.4 L338.5,230.4 L338.5,230.3 L338.5,230.4 L338.6,230.4 L338.6,230.3 L338.6,230.4 
+		L338.6,230.3 L338.6,230.4 L338.7,230.4 L338.8,230.4 L338.9,230.4 L339.0,230.4 L339.1,230.4 L339.2,230.4 
+		L339.3,230.4 L339.4,230.4 L339.5,230.4 L339.6,230.4 L339.7,230.4 L339.7,230.3 L339.7,230.4 L339.7,230.3 
+		L339.7,230.4 L339.7,230.3 L339.8,230.3 L339.8,230.4 L339.9,230.4 L339.9,230.3 L339.9,230.4 L339.9,230.3 
+		L339.9,230.4 L340.0,230.4 L340.0,230.3 L340.0,230.4 L340.0,230.3 L340.0,230.4 L340.1,230.3 L340.1,230.4 
+		L340.1,230.3 L340.1,230.4 L340.1,230.3 L340.1,230.4 L340.2,230.3 L340.2,230.4 L340.2,230.3 L340.2,230.4 
+		L340.2,230.3 L340.2,230.4 L340.2,230.3 L340.2,230.4 L340.2,230.3 L340.3,230.4 L340.3,230.3 L340.3,230.4 
+		L340.3,230.3 L340.3,230.4 L340.4,230.4 L340.4,230.3 L340.4,230.4 L340.4,230.3 L340.4,230.4 L340.5,230.4 
+		L340.5,230.3 L340.6,230.4 L340.7,230.3 L340.7,230.4 L340.7,230.3 L340.7,230.4 L340.8,230.4 L340.8,230.3 
+		L340.8,230.4 L340.8,230.3 L340.8,230.4 L340.9,230.4 L340.9,230.3 L340.9,230.4 L340.9,230.3 L341.0,230.4 
+		L341.0,230.3 L341.1,230.3 L341.1,230.4 L341.1,230.3 L341.1,230.4 L341.1,230.3 L341.2,230.4 L341.2,230.3 
+		L341.2,230.4 L341.2,230.3 L341.2,230.4 L341.3,230.4 L341.4,230.4 L341.5,230.4 L341.6,230.4 L341.7,230.4 
+		L341.8,230.4 L341.9,230.4 L342.0,230.4 L342.0,230.2 L342.1,230.6 L342.1,230.4 L342.1,229.9 L342.1,230.4 
+		L342.1,231.3 L342.1,230.1 L342.1,228.1 L342.1,231.0 L342.1,239.9 L342.2,222.8 L342.2,373.8 L342.2,237.7 
+		L342.2,239.8 L342.2,229.4 L342.2,228.2 L342.2,231.0 L342.2,231.3 L342.2,230.9 L342.2,230.7 L342.3,229.7 
+		L342.3,230.2 L342.3,231.1 L342.3,230.6 L342.3,230.8 L342.3,230.4 L342.3,230.2 L342.3,230.3 L342.3,230.4 
+		L342.4,230.3 L342.4,230.4 L342.4,230.3 L342.4,230.4 L342.5,230.4 L342.5,230.3 L342.5,230.4 L342.6,230.4 
+		L342.7,230.4 L342.8,230.4 L342.9,230.4 L343.0,230.4 L343.1,230.4 L343.2,230.4 L343.3,230.4 L343.4,230.4 
+		L343.5,230.4 L343.6,230.4 L343.7,230.4 L343.8,230.4 L343.9,230.4 L344.0,230.4 L344.1,230.4 L344.2,230.4 
+		L344.3,230.4 L344.4,230.4 L344.5,230.4 L344.6,230.4 L344.7,230.4 L344.8,230.4 L344.9,230.4 L345.0,230.4 
+		L345.1,230.4 L345.2,230.4 L345.3,230.4 L345.4,230.4 L345.5,230.4 L345.6,230.4 L345.7,230.4 L345.8,230.4 
+		L345.9,230.4 L346.0,230.4 L346.1,230.4 L346.2,230.3 L346.2,230.4 L346.3,230.4 L346.3,230.3 L346.4,230.4 
+		L346.5,230.4 L346.6,230.4 L346.6,230.3 L346.6,230.4 L346.7,230.4 L346.7,230.3 L346.7,230.4 L346.7,230.3 
+		L346.7,230.4 L346.8,230.4 L346.8,230.3 L346.8,230.4 L346.8,230.3 L346.8,230.4 L346.9,230.3 L346.9,230.4 
+		L346.9,230.3 L346.9,230.4 L347.0,230.3 L347.0,230.4 L347.1,230.3 L347.1,230.4 L347.1,230.3 L347.1,230.4 
+		L347.1,230.3 L347.1,230.4 L347.2,230.3 L347.2,230.4 L347.3,230.4 L347.4,230.4 L347.5,230.4 L347.6,230.4 
+		L347.7,230.4 L347.8,230.4 L347.9,230.4 L348.0,230.4 L348.1,230.6 L348.1,230.2 L348.1,229.9 L348.1,230.5 
+		L348.1,231.0 L348.1,230.2 L348.1,229.0 L348.1,230.7 L348.1,234.4 L348.1,228.8 L348.2,182.0 L348.2,205.4 
+		L348.2,277.1 L348.2,229.0 L348.2,226.4 L348.2,230.4 L348.2,231.5 L348.2,230.8 L348.2,230.6 L348.2,231.0 
+		L348.3,230.3 L348.3,229.7 L348.3,230.2 L348.3,231.8 L348.3,230.3 L348.3,230.7 L348.3,230.4 L348.3,230.3 
+		L348.4,230.4 L348.4,230.3 L348.4,230.4 L348.4,230.3 L348.4,230.4 L348.5,230.4 L348.5,230.3 L348.5,230.4 
+		L348.5,230.3 L348.5,230.4 L348.6,230.4 L348.7,230.4 L348.7,230.3 L348.7,230.4 L348.8,230.4 L348.9,230.4 
+		L349.0,230.4 L349.1,230.3 L349.1,230.4 L349.2,230.4 L349.3,230.4 L349.4,230.4 L349.5,230.4 L349.6,230.4 
+		L349.7,230.4 L349.8,230.4 L349.9,230.4 L350.0,230.4 L350.1,230.3 L350.1,230.4 L350.2,230.4 L350.2,230.3 
+		L350.2,230.4 L350.3,230.3 L350.3,230.4 L350.4,230.4 L350.4,230.3 L350.4,230.4 L350.5,230.4 L350.6,230.4 
+		L350.6,230.3 L350.6,230.4 L350.7,230.3 L350.7,230.4 L350.8,230.4 L350.8,230.3 L350.8,230.4 L350.9,230.4 
+		L350.9,230.3 L350.9,230.4 L350.9,230.3 L350.9,230.4 L351.0,230.4 L351.0,230.3 L351.0,230.4 L351.0,230.3 
+		L351.1,230.4 L351.2,230.4 L351.3,230.4 L351.3,230.3 L351.3,230.4 L351.4,230.4 L351.5,230.4 L351.6,230.4 
+		L351.6,230.3 L351.6,230.4 L351.6,230.3 L351.6,230.4 L351.7,230.4 L351.7,230.3 L351.7,230.4 L351.7,230.3 
+		L351.7,230.4 L351.8,230.4 L351.8,230.3 L351.8,230.4 L351.8,230.3 L351.8,230.4 L351.9,230.3 L351.9,230.4 
+		L351.9,230.3 L351.9,230.4 L352.0,230.3 L352.0,230.4 L352.0,230.3 L352.1,230.3 L352.1,230.4 L352.1,230.3 
+		L352.1,230.4 L352.1,230.3 L352.2,230.4 L352.2,230.3 L352.2,230.4 L352.2,230.3 L352.2,230.4 L352.2,230.3 
+		L352.2,230.4 L352.3,230.4 L352.3,230.3 L352.3,230.4 L352.4,230.3 L352.4,230.4 L352.4,230.3 L352.4,230.4 
+		L352.4,230.3 L352.4,230.4 L352.4,230.3 L352.4,230.4 L352.5,230.4 L352.5,230.3 L352.5,230.4 L352.6,230.4 
+		L352.6,230.3 L352.6,230.4 L352.6,230.3 L352.6,230.4 L352.7,230.4 L352.7,230.3 L352.7,230.4 L352.7,230.3 
+		L352.7,230.4 L352.8,230.3 L352.8,230.4 L352.9,230.4 L352.9,230.3 L352.9,230.4 L352.9,230.3 L352.9,230.4 
+		L352.9,230.3 L352.9,230.4 L353.0,230.3 L353.0,230.4 L353.0,230.3 L353.0,230.4 L353.0,230.3 L353.0,230.4 
+		L353.0,230.3 L353.1,230.3 L353.1,230.4 L353.1,230.3 L353.1,230.4 L353.2,230.3 L353.2,230.4 L353.3,230.4 
+		L353.4,230.4 L353.5,230.4 L353.6,230.4 L353.7,230.4 L353.8,230.4 L353.9,230.4 L354.0,230.4 L354.1,230.5 
+		L354.1,230.1 L354.1,230.3 L354.1,230.8 L354.1,230.3 L354.1,229.4 L354.1,230.6 L354.1,232.6 L354.1,229.5 
+		L354.1,220.8 L354.2,239.8 L354.2,87.9 L354.2,221.2 L354.2,220.9 L354.2,231.4 L354.2,232.5 L354.2,229.7 
+		L354.2,229.4 L354.2,229.8 L354.3,230.0 L354.3,231.0 L354.3,230.5 L354.3,229.6 L354.3,230.1 L354.3,229.9 
+		L354.3,230.3 L354.3,230.5 L354.3,230.4 L354.3,230.3 L354.4,230.3 L354.4,230.4 L354.4,230.3 L354.4,230.4 
+		L354.4,230.3 L354.5,230.3 L354.5,230.4 L354.6,230.4 L354.7,230.4 L354.8,230.4 L354.9,230.4 L355.0,230.4 
+		L355.1,230.4 L355.2,230.4 L355.3,230.4 L355.4,230.4 L355.5,230.4 L355.6,230.4 L355.7,230.4 L355.8,230.4 
+		L355.9,230.4 L356.0,230.4 L356.1,230.4 L356.2,230.4 L356.3,230.4 L356.4,230.4 L356.5,230.4 L356.6,230.4 
+		L356.7,230.4 L356.8,230.4 L356.9,230.4 L357.0,230.4 L357.1,230.4 L357.2,230.4 L357.3,230.4 L357.4,230.4 
+		L357.5,230.4 L357.6,230.4 L357.7,230.4 L357.8,230.4 L357.9,230.4 L358.0,230.4 L358.1,230.4 L358.2,230.4 
+		L358.3,230.4 L358.4,230.4 L358.5,230.4 L358.6,230.4 L358.7,230.4 L358.8,230.4 L358.9,230.4 L359.0,230.4 
+		L359.1,230.4 L359.2,230.4 L359.3,230.4 L359.4,230.4 L359.5,230.4 L359.6,230.4 L359.7,230.4 L359.8,230.4 
+		L359.9,230.4 L360.0,230.4 L360.1,230.1 L360.1,230.6 L360.1,230.8 L360.1,230.2 L360.1,229.7 L360.1,230.6 
+		L360.1,231.7 L360.1,229.9 L360.1,226.3 L360.2,232.3 L360.2,278.4 L360.2,260.8 L360.2,183.9 L360.2,232.1 
+		L360.2,234.2 L360.2,230.3 L360.2,229.2 L360.2,229.9 L360.2,230.1 L360.3,229.8 L360.3,230.3 L360.3,231.0 
+		L360.3,230.5 L360.3,229.0 L360.3,230.5 L360.3,230.0 L360.3,230.3 L360.3,230.4 L360.4,230.3 L360.4,230.4 
+		L360.4,230.3 L360.4,230.4 L360.5,230.3 L360.5,230.4 L360.5,230.3 L360.5,230.4 L360.6,230.4 L360.7,230.4 
+		L360.8,230.4 L360.9,230.4 L361.0,230.4 L361.1,230.4 L361.2,230.4 L361.3,230.4 L361.3,230.3 L361.3,230.4 
+		L361.4,230.4 L361.5,230.4 L361.6,230.4 L361.7,230.4 L361.8,230.4 L361.9,230.4 L362.0,230.4 L362.1,230.4 
+		L362.2,230.4 L362.3,230.4 L362.3,230.3 L362.3,230.4 L362.4,230.4 L362.4,230.3 L362.5,230.3 L362.5,230.4 
+		L362.5,230.3 L362.5,230.4 L362.6,230.4 L362.7,230.4 L362.7,230.3 L362.7,230.4 L362.8,230.4 L362.8,230.3 
+		L362.8,230.4 L362.9,230.4 L362.9,230.3 L362.9,230.4 L363.0,230.3 L363.0,230.4 L363.1,230.4 L363.1,230.3 
+		L363.1,230.4 L363.1,230.3 L363.1,230.4 L363.2,230.4 L363.2,230.3 L363.2,230.4 L363.3,230.4 L363.4,230.4 
+		L363.5,230.4 L363.6,230.4 L363.6,230.3 L363.7,230.4 L363.8,230.4 L363.9,230.4 L364.0,230.4 L364.0,230.3 
+		L364.0,230.4 L364.1,230.4 L364.1,230.3 L364.1,230.4 L364.2,230.3 L364.2,230.4 L364.2,230.3 L364.3,230.4 
+		L364.3,230.3 L364.3,230.4 L364.3,230.3 L364.3,230.4 L364.3,230.3 L364.4,230.3 L364.4,230.4 L364.4,230.3 
+		L364.4,230.4 L364.5,230.4 L364.5,230.3 L364.6,230.4 L364.6,230.3 L364.6,230.4 L364.6,230.3 L364.6,230.4 
+		L364.7,230.3 L364.7,230.4 L364.7,230.3 L364.7,230.4 L364.7,230.3 L364.7,230.4 L364.8,230.4 L364.8,230.3 
+		L364.8,230.4 L364.8,230.3 L364.9,230.4 L364.9,230.3 L364.9,230.4 L364.9,230.3 L364.9,230.4 L364.9,230.3 
+		L365.0,230.3 L365.0,230.4 L365.0,230.3 L365.0,230.4 L365.0,230.3 L365.0,230.4 L365.0,230.3 L365.1,230.4 
+		L365.1,230.3 L365.1,230.4 L365.1,230.3 L365.1,230.4 L365.1,230.3 L365.2,230.3 L365.2,230.4 L365.2,230.3 
+		L365.2,230.4 L365.3,230.4 L365.4,230.4 L365.5,230.4 L365.6,230.4 L365.7,230.4 L365.8,230.4 L365.9,230.4 
+		L366.0,230.4 L366.1,230.2 L366.1,230.6 L366.1,230.4 L366.1,229.9 L366.1,230.5 L366.1,231.3 L366.1,230.0 
+		L366.1,228.1 L366.1,231.3 L366.2,239.8 L366.2,219.1 L366.2,371.6 L366.2,241.3 L366.2,239.7 L366.2,229.1 
+		L366.2,228.2 L366.2,231.1 L366.2,231.3 L366.2,230.9 L366.3,230.7 L366.3,229.7 L366.3,230.1 L366.3,231.1 
+		L366.3,230.7 L366.3,230.8 L366.3,230.4 L366.3,230.2 L366.3,230.3 L366.4,230.4 L366.4,230.3 L366.4,230.4 
+		L366.4,230.3 L366.5,230.4 L366.5,230.3 L366.5,230.4 L366.6,230.4 L366.7,230.4 L366.8,230.4 L366.9,230.4 
+		L367.0,230.4 L367.1,230.4 L367.2,230.4 L367.3,230.4 L367.4,230.4 L367.5,230.4 L367.6,230.4 L367.7,230.4 
+		L367.8,230.4 L367.9,230.4 L368.0,230.4 L368.1,230.4 L368.2,230.4 L368.3,230.4 L368.4,230.4 L368.5,230.4 
+		L368.6,230.4 L368.7,230.4 L368.8,230.4 L368.9,230.4 L369.0,230.4 L369.1,230.4 L369.2,230.4 L369.3,230.4 
+		L369.4,230.4 L369.5,230.4 L369.6,230.4 L369.7,230.4 L369.8,230.4 L369.9,230.4 L370.0,230.4 L370.1,230.4 
+		L370.2,230.4 L370.3,230.4 L370.4,230.4 L370.5,230.3 L370.5,230.4 L370.5,230.3 L370.5,230.4 L370.6,230.4 
+		L370.7,230.4 L370.8,230.3 L370.8,230.4 L370.8,230.3 L370.8,230.4 L370.9,230.4 L370.9,230.3 L370.9,230.4 
+		L371.0,230.3 L371.0,230.4 L371.0,230.3 L371.0,230.4 L371.0,230.3 L371.0,230.4 L371.1,230.4 L371.1,230.3 
+		L371.1,230.4 L371.1,230.3 L371.1,230.4 L371.1,230.3 L371.1,230.4 L371.2,230.3 L371.2,230.4 L371.2,230.3 
+		L371.2,230.4 L371.3,230.4 L371.4,230.4 L371.5,230.4 L371.6,230.4 L371.7,230.4 L371.8,230.4 L371.9,230.4 
+		L372.0,230.4 L372.1,230.4 L372.1,230.6 L372.1,230.1 L372.1,229.9 L372.1,230.6 L372.1,231.0 L372.1,230.1 
+		L372.1,229.0 L372.1,230.9 L372.1,234.3 L372.2,228.0 L372.2,182.8 L372.2,194.5 L372.2,276.4 L372.2,228.2 
+		L372.2,226.5 L372.2,230.5 L372.2,231.5 L372.2,230.7 L372.3,230.6 L372.3,230.9 L372.3,230.4 L372.3,229.7 
+		L372.3,230.2 L372.3,231.7 L372.3,230.2 L372.3,230.7 L372.3,230.4 L372.3,230.3 L372.4,230.3 L372.4,230.4 
+		L372.4,230.3 L372.4,230.4 L372.4,230.3 L372.5,230.4 L372.5,230.3 L372.5,230.4 L372.5,230.3 L372.6,230.4 
+		L372.7,230.4 L372.7,230.3 L372.7,230.4 L372.8,230.4 L372.9,230.4 L373.0,230.4 L373.1,230.4 L373.2,230.4 
+		L373.3,230.4 L373.4,230.4 L373.5,230.4 L373.6,230.4 L373.7,230.4 L373.8,230.4 L373.9,230.4 L374.0,230.4 
+		L374.1,230.4 L374.2,230.4 L374.3,230.4 L374.3,230.3 L374.3,230.4 L374.4,230.4 L374.4,230.3 L374.4,230.4 
+		L374.4,230.3 L374.4,230.4 L374.5,230.4 L374.5,230.3 L374.5,230.4 L374.6,230.3 L374.6,230.4 L374.6,230.3 
+		L374.6,230.4 L374.7,230.4 L374.7,230.3 L374.7,230.4 L374.8,230.4 L374.8,230.3 L374.8,230.4 L374.9,230.4 
+		L374.9,230.3 L374.9,230.4 L374.9,230.3 L374.9,230.4 L375.0,230.3 L375.0,230.4 L375.1,230.4 L375.1,230.3 
+		L375.1,230.4 L375.2,230.4 L375.3,230.4 L375.3,230.3 L375.3,230.4 L375.4,230.4 L375.5,230.4 L375.5,230.3 
+		L375.5,230.4 L375.6,230.4 L375.7,230.3 L375.7,230.4 L375.7,230.3 L375.7,230.4 L375.8,230.4 L375.8,230.3 
+		L375.8,230.4 L375.8,230.3 L375.8,230.4 L375.9,230.4 L375.9,230.3 L375.9,230.4 L375.9,230.3 L375.9,230.4 
+		L375.9,230.3 L376.0,230.4 L376.0,230.3 L376.0,230.4 L376.0,230.3 L376.0,230.4 L376.0,230.3 L376.0,230.4 
+		L376.1,230.4 L376.1,230.3 L376.1,230.4 L376.2,230.3 L376.2,230.4 L376.2,230.3 L376.2,230.4 L376.3,230.3 
+		L376.3,230.4 L376.3,230.3 L376.3,230.4 L376.4,230.4 L376.4,230.3 L376.4,230.4 L376.5,230.4 L376.5,230.3 
+		L376.5,230.4 L376.5,230.3 L376.5,230.4 L376.5,230.3 L376.5,230.4 L376.6,230.3 L376.6,230.4 L376.6,230.3 
+		L376.6,230.4 L376.6,230.3 L376.6,230.4 L376.7,230.3 L376.7,230.4 L376.7,230.3 L376.7,230.4 L376.8,230.3 
+		L376.8,230.4 L376.8,230.3 L376.8,230.4 L376.8,230.3 L376.8,230.4 L376.9,230.4 L376.9,230.3 L376.9,230.4 
+		L376.9,230.3 L376.9,230.4 L377.0,230.3 L377.0,230.4 L377.0,230.3 L377.0,230.4 L377.0,230.3 L377.1,230.4 
+		L377.1,230.3 L377.1,230.4 L377.1,230.3 L377.1,230.4 L377.2,230.4 L377.3,230.4 L377.4,230.4 L377.5,230.4 
+		L377.6,230.4 L377.7,230.4 L377.8,230.4 L377.9,230.4 L378.0,230.4 L378.1,230.4 L378.1,230.5 L378.1,230.1 
+		L378.1,230.4 L378.1,230.8 L378.1,230.2 L378.1,229.4 L378.1,230.7 L378.1,232.5 L378.1,229.2 L378.2,221.0 
+		L378.2,243.4 L378.2,90.4 L378.2,217.6 L378.2,221.1 L378.2,231.7 L378.2,232.5 L378.2,229.6 L378.2,229.4 
+		L378.3,229.8 L378.3,229.9 L378.3,231.0 L378.3,230.6 L378.3,229.6 L378.3,230.0 L378.3,229.9 L378.3,230.3 
+		L378.3,230.5 L378.3,230.4 L378.4,230.3 L378.4,230.4 L378.4,230.3 L378.4,230.4 L378.5,230.4 L378.5,230.3 
+		L378.5,230.4 L378.6,230.3 L378.6,230.4 L378.7,230.4 L378.7,230.3 L378.7,230.4 L378.8,230.4 L378.9,230.4 
+		L379.0,230.4 L379.1,230.4 L379.2,230.4 L379.3,230.4 L379.3,230.3 L379.3,230.4 L379.4,230.4 L379.5,230.4 
+		L379.6,230.4 L379.7,230.4 L379.8,230.4 L379.9,230.4 L380.0,230.4 L380.1,230.4 L380.2,230.4 L380.3,230.4 
+		L380.4,230.4 L380.5,230.4 L380.6,230.4 L380.7,230.4 L380.8,230.4 L380.9,230.4 L381.0,230.4 L381.1,230.4 
+		L381.2,230.4 L381.3,230.4 L381.4,230.4 L381.5,230.4 L381.6,230.4 L381.7,230.4 L381.8,230.4 L381.9,230.4 
+		L382.0,230.4 L382.1,230.4 L382.1,230.3 L382.1,230.4 L382.2,230.4 L382.3,230.4 L382.3,230.3 L382.3,230.4 
+		L382.3,230.3 L382.3,230.4 L382.4,230.4 L382.4,230.3 L382.4,230.4 L382.5,230.4 L382.5,230.3 L382.5,230.4 
+		L382.6,230.4 L382.6,230.3 L382.6,230.4 L382.6,230.3 L382.7,230.4 L382.7,230.3 L382.7,230.4 L382.7,230.3 
+		L382.8,230.4 L382.8,230.3 L382.8,230.4 L382.9,230.4 L382.9,230.3 L382.9,230.4 L382.9,230.3 L383.0,230.4 
+		L383.0,230.3 L383.0,230.4 L383.1,230.4 L383.2,230.4 L383.3,230.4 L383.4,230.4 L383.5,230.4 L383.6,230.4 
+		L383.7,230.4 L383.8,230.4 L383.9,230.4 L384.0,230.4 L384.1,230.4 L384.1,230.1 L384.1,230.6 L384.1,230.8 
+		L384.1,230.1 L384.1,229.7 L384.1,230.6 L384.1,231.7 L384.1,229.7 L384.2,226.4 L384.2,233.0 L384.2,277.4 
+		L384.2,271.6 L384.2,184.8 L384.2,232.8 L384.2,234.1 L384.2,230.1 L384.2,229.3 L384.2,230.0 L384.3,230.1 
+		L384.3,229.8 L384.3,230.3 L384.3,231.0 L384.3,230.6 L384.3,229.0 L384.3,230.5 L384.3,230.0 L384.3,230.3 
+		L384.4,230.4 L384.4,230.3 L384.4,230.4 L384.4,230.3 L384.4,230.4 L384.5,230.4 L384.5,230.3 L384.5,230.4 
+		L384.5,230.3 L384.5,230.4 L384.6,230.4 L384.7,230.4 L384.8,230.4 L384.9,230.4 L384.9,230.3 L384.9,230.4 
+		L385.0,230.4 L385.1,230.4 L385.2,230.4 L385.3,230.4 L385.3,230.3 L385.3,230.4 L385.4,230.4 L385.5,230.4 
+		L385.6,230.4 L385.7,230.4 L385.8,230.4 L385.9,230.4 L386.0,230.4 L386.1,230.4 L386.1,230.3 L386.1,230.4 
+		L386.2,230.4 L386.2,230.3 L386.2,230.4 L386.3,230.4 L386.4,230.3 L386.4,230.4 L386.4,230.3 L386.5,230.4 
+		L386.6,230.4 L386.6,230.3 L386.6,230.4 L386.7,230.4 L386.7,230.3 L386.7,230.4 L386.8,230.4 L386.9,230.4 
+		L387.0,230.3 L387.0,230.4 L387.0,230.3 L387.0,230.4 L387.1,230.4 L387.2,230.4 L387.3,230.4 L387.4,230.4 
+		L387.4,230.3 L387.4,230.4 L387.5,230.4 L387.6,230.4 L387.7,230.4 L387.7,230.3 L387.8,230.4 L387.8,230.3 
+		L387.8,230.4 L387.8,230.3 L387.9,230.4 L387.9,230.3 L387.9,230.4 L388.0,230.3 L388.0,230.4 L388.0,230.3 
+		L388.0,230.4 L388.0,230.3 L388.0,230.4 L388.1,230.4 L388.1,230.3 L388.1,230.4 L388.1,230.3 L388.1,230.4 
+		L388.1,230.3 L388.1,230.4 L388.2,230.4 L388.2,230.3 L388.2,230.4 L388.2,230.3 L388.2,230.4 L388.2,230.3 
+		L388.2,230.4 L388.3,230.3 L388.3,230.4 L388.3,230.3 L388.3,230.4 L388.3,230.3 L388.4,230.4 L388.4,230.3 
+		L388.4,230.4 L388.4,230.3 L388.4,230.4 L388.4,230.3 L388.5,230.4 L388.5,230.3 L388.5,230.4 L388.5,230.3 
+		L388.5,230.4 L388.6,230.4 L388.6,230.3 L388.6,230.4 L388.6,230.3 L388.7,230.4 L388.7,230.3 L388.7,230.4 
+		L388.7,230.3 L388.7,230.4 L388.7,230.3 L388.7,230.4 L388.8,230.4 L388.8,230.3 L388.8,230.4 L388.8,230.3 
+		L388.8,230.4 L388.8,230.3 L388.8,230.4 L388.9,230.3 L388.9,230.4 L388.9,230.3 L388.9,230.4 L388.9,230.3 
+		L388.9,230.4 L388.9,230.3 L389.0,230.4 L389.0,230.3 L389.0,230.4 L389.0,230.3 L389.1,230.3 L389.1,230.4 
+		L389.1,230.3 L389.1,230.4 L389.1,230.3 L389.1,230.4 L389.1,230.3 L389.2,230.4 L389.2,230.3 L389.2,230.4 
+		L389.2,230.3 L389.2,230.4 L389.3,230.4 L389.4,230.4 L389.5,230.4 L389.6,230.4 L389.7,230.4 L389.8,230.4 
+		L389.9,230.4 L390.0,230.4 L390.1,230.4 L390.1,230.2 L390.1,230.6 L390.1,230.3 L390.1,229.9 L390.1,230.5 
+		L390.1,231.3 L390.1,229.9 L390.1,228.2 L390.2,231.6 L390.2,239.6 L390.2,215.4 L390.2,368.7 L390.2,244.9 
+		L390.2,239.5 L390.2,228.9 L390.2,228.2 L390.2,231.2 L390.2,231.3 L390.3,230.9 L390.3,230.8 L390.3,229.7 
+		L390.3,230.1 L390.3,231.1 L390.3,230.8 L390.3,230.5 L390.3,230.2 L390.4,230.3 L390.4,230.4 L390.4,230.3 
+		L390.4,230.4 L390.4,230.3 L390.5,230.3 L390.5,230.4 L390.5,230.3 L390.5,230.4 L390.6,230.4 L390.7,230.4 
+		L390.8,230.4 L390.9,230.4 L391.0,230.4 L391.1,230.4 L391.2,230.4 L391.3,230.4 L391.4,230.4 L391.5,230.4 
+		L391.6,230.4 L391.7,230.4 L391.8,230.4 L391.9,230.4 L392.0,230.4 L392.1,230.4 L392.2,230.4 L392.3,230.4 
+		L392.4,230.4 L392.5,230.4 L392.6,230.4 L392.7,230.4 L392.8,230.4 L392.9,230.4 L393.0,230.4 L393.1,230.4 
+		L393.2,230.4 L393.3,230.4 L393.4,230.4 L393.5,230.4 L393.6,230.4 L393.7,230.4 L393.8,230.4 L393.9,230.4 
+		L394.0,230.4 L394.1,230.4 L394.2,230.4 L394.3,230.4 L394.4,230.4 L394.5,230.4 L394.6,230.4 L394.7,230.4 
+		L394.8,230.4 L394.9,230.4 L395.0,230.4 L395.1,230.4 L395.2,230.4 L395.3,230.4 L395.4,230.4 L395.5,230.4 
+		L395.6,230.4 L395.7,230.4 L395.8,230.4 L395.9,230.4 L396.0,230.4 L396.1,230.4 L396.1,230.6 L396.1,230.1 
+		L396.1,229.9 L396.1,230.6 L396.1,231.0 L396.1,230.0 L396.1,229.0 L396.1,231.1 L396.2,234.2 L396.2,227.3 
+		L396.2,183.9 L396.2,183.8 L396.2,275.3 L396.2,227.5 L396.2,226.6 L396.2,230.7 L396.2,231.4 L396.3,230.6 
+		L396.3,230.5 L396.3,230.9 L396.3,230.4 L396.3,229.7 L396.3,230.1 L396.3,231.7 L396.3,230.2 L396.3,230.7 
+		L396.3,230.4 L396.4,230.3 L396.4,230.4 L396.4,230.3 L396.4,230.4 L396.4,230.3 L396.5,230.3 L396.5,230.4 
+		L396.5,230.3 L396.5,230.4 L396.6,230.4 L396.7,230.4 L396.7,230.3 L396.7,230.4 L396.8,230.4 L396.9,230.4 
+		L397.0,230.4 L397.1,230.4 L397.2,230.4 L397.3,230.4 L397.4,230.4 L397.5,230.4 L397.6,230.4 L397.7,230.4 
+		L397.8,230.4 L397.9,230.4 L398.0,230.4 L398.0,230.3 L398.0,230.4 L398.1,230.4 L398.1,230.3 L398.1,230.4 
+		L398.2,230.4 L398.3,230.4 L398.4,230.4 L398.5,230.4 L398.5,230.3 L398.5,230.4 L398.6,230.4 L398.6,230.3 
+		L398.6,230.4 L398.6,230.3 L398.7,230.4 L398.7,230.3 L398.7,230.4 L398.8,230.4 L398.8,230.3 L398.9,230.4 
+		L398.9,230.3 L398.9,230.4 L399.0,230.3 L399.0,230.4 L399.0,230.3 L399.0,230.4 L399.1,230.4 L399.1,230.3 
+		L399.1,230.4 L399.2,230.4 L399.3,230.4 L399.3,230.3 L399.3,230.4 L399.4,230.4 L399.5,230.4 L399.6,230.4 
+		L399.7,230.4 L399.7,230.3 L399.7,230.4 L399.8,230.4 L399.8,230.3 L399.8,230.4 L399.9,230.4 L399.9,230.3 
+		L399.9,230.4 L399.9,230.3 L399.9,230.4 L400.0,230.4 L400.0,230.3 L400.0,230.4 L400.1,230.4 L400.1,230.3 
+		L400.1,230.4 L400.1,230.3 L400.1,230.4 L400.2,230.4 L400.2,230.3 L400.2,230.4 L400.2,230.3 L400.2,230.4 
+		L400.2,230.3 L400.2,230.4 L400.3,230.3 L400.3,230.4 L400.3,230.3 L400.3,230.4 L400.3,230.3 L400.4,230.4 
+		L400.4,230.3 L400.4,230.4 L400.4,230.3 L400.4,230.4 L400.4,230.3 L400.4,230.4 L400.5,230.3 L400.5,230.4 
+		L400.5,230.3 L400.5,230.4 L400.5,230.3 L400.5,230.4 L400.6,230.3 L400.6,230.4 L400.6,230.3 L400.6,230.4 
+		L400.6,230.3 L400.7,230.3 L400.7,230.4 L400.7,230.3 L400.7,230.4 L400.7,230.3 L400.7,230.4 L400.8,230.4 
+		L400.8,230.3 L400.8,230.4 L400.8,230.3 L400.8,230.4 L400.8,230.3 L400.8,230.4 L400.9,230.4 L400.9,230.3 
+		L400.9,230.4 L400.9,230.3 L401.0,230.3 L401.0,230.4 L401.0,230.3 L401.0,230.4 L401.0,230.3 L401.1,230.4 
+		L401.1,230.3 L401.1,230.4 L401.1,230.3 L401.1,230.4 L401.1,230.3 L401.2,230.4 L401.2,230.3 L401.2,230.4 
+		L401.3,230.4 L401.4,230.4 L401.5,230.4 L401.6,230.4 L401.7,230.4 L401.8,230.4 L401.9,230.4 L402.0,230.4 
+		L402.1,230.4 L402.1,230.1 L402.1,230.4 L402.1,230.8 L402.1,230.2 L402.1,229.5 L402.1,230.8 L402.2,232.5 
+		L402.2,228.9 L402.2,221.2 L402.2,247.0 L402.2,93.8 L402.2,214.1 L402.2,221.3 L402.2,232.0 L402.2,232.5 
+		L402.2,229.5 L402.3,229.4 L402.3,229.8 L402.3,229.9 L402.3,231.0 L402.3,230.6 L402.3,229.6 L402.3,229.9 
+		L402.3,230.2 L402.3,230.4 L402.4,230.4 L402.4,230.3 L402.4,230.4 L402.4,230.3 L402.4,230.4 L402.5,230.4 
+		L402.5,230.3 L402.5,230.4 L402.6,230.4 L402.7,230.4 L402.8,230.4 L402.9,230.4 L403.0,230.4 L403.1,230.4 
+		L403.2,230.4 L403.3,230.4 L403.4,230.4 L403.5,230.4 L403.6,230.4 L403.7,230.4 L403.8,230.4 L403.9,230.4 
+		L404.0,230.4 L404.1,230.4 L404.2,230.4 L404.3,230.4 L404.4,230.4 L404.5,230.4 L404.6,230.4 L404.7,230.4 
+		L404.8,230.4 L404.9,230.4 L405.0,230.4 L405.1,230.4 L405.2,230.4 L405.3,230.4 L405.4,230.4 L405.5,230.4 
+		L405.6,230.4 L405.7,230.4 L405.8,230.4 L405.9,230.4 L406.0,230.4 L406.1,230.4 L406.2,230.4 L406.3,230.4 
+		L406.4,230.4 L406.5,230.4 L406.6,230.4 L406.7,230.4 L406.8,230.4 L406.9,230.4 L407.0,230.4 L407.1,230.4 
+		L407.2,230.4 L407.3,230.4 L407.4,230.4 L407.5,230.4 L407.6,230.4 L407.7,230.4 L407.8,230.4 L407.9,230.4 
+		L408.0,230.4 L408.1,230.4 L408.1,230.1 L408.1,230.6 L408.1,230.8 L408.1,230.1 L408.1,229.7 L408.1,230.7 
+		L408.1,231.7 L408.2,229.6 L408.2,226.5 L408.2,233.7 L408.2,276.2 L408.2,282.1 L408.2,186.0 L408.2,233.5 
+		L408.2,234.0 L408.2,229.9 L408.2,229.3 L408.3,230.1 L408.3,230.2 L408.3,229.8 L408.3,230.2 L408.3,231.0 
+		L408.3,230.6 L408.3,229.0 L408.3,230.4 L408.4,230.4 L408.4,230.3 L408.4,230.4 L408.4,230.3 L408.4,230.4 
+		L408.5,230.4 L408.5,230.3 L408.5,230.4 L408.5,230.3 L408.5,230.4 L408.6,230.4 L408.7,230.4 L408.8,230.4 
+		L408.9,230.4 L408.9,230.3 L409.0,230.4 L409.1,230.4 L409.2,230.4 L409.3,230.4 L409.3,230.3 L409.3,230.4 
+		L409.4,230.4 L409.5,230.4 L409.6,230.4 L409.7,230.4 L409.8,230.4 L409.9,230.4 L410.0,230.4 L410.1,230.4 
+		L410.1,230.3 L410.1,230.4 L410.2,230.4 L410.2,230.3 L410.2,230.4 L410.3,230.4 L410.3,230.3 L410.3,230.4 
+		L410.4,230.4 L410.4,230.3 L410.4,230.4 L410.5,230.3 L410.5,230.4 L410.6,230.3 L410.6,230.4 L410.6,230.3 
+		L410.6,230.4 L410.7,230.4 L410.8,230.4 L410.9,230.4 L411.0,230.4 L411.0,230.3 L411.0,230.4 L411.0,230.3 
+		L411.0,230.4 L411.1,230.4 L411.2,230.4 L411.3,230.4 L411.4,230.4 L411.5,230.4 L411.6,230.4 L411.7,230.4 
+		L411.8,230.4 L411.8,230.3 L411.9,230.4 L411.9,230.3 L411.9,230.4 L412.0,230.3 L412.0,230.4 L412.0,230.3 
+		L412.0,230.4 L412.0,230.3 L412.0,230.4 L412.0,230.3 L412.1,230.4 L412.1,230.3 L412.1,230.4 L412.1,230.3 
+		L412.1,230.4 L412.2,230.4 L412.2,230.3 L412.2,230.4 L412.2,230.3 L412.3,230.3 L412.3,230.4 L412.3,230.3 
+		L412.4,230.3 L412.4,230.4 L412.4,230.3 L412.4,230.4 L412.4,230.3 L412.4,230.4 L412.5,230.4 L412.5,230.3 
+		L412.5,230.4 L412.6,230.4 L412.6,230.3 L412.6,230.4 L412.6,230.3 L412.6,230.4 L412.6,230.3 L412.6,230.4 
+		L412.7,230.4 L412.7,230.3 L412.7,230.4 L412.8,230.3 L412.8,230.4 L412.8,230.3 L412.8,230.4 L412.8,230.3 
+		L412.8,230.4 L412.8,230.3 L412.9,230.3 L412.9,230.4 L412.9,230.3 L412.9,230.4 L413.0,230.4 L413.0,230.3 
+		L413.0,230.4 L413.1,230.4 L413.1,230.3 L413.1,230.4 L413.1,230.3 L413.1,230.4 L413.2,230.3 L413.2,230.4 
+		L413.2,230.3 L413.2,230.4 L413.2,230.3 L413.2,230.4 L413.3,230.4 L413.4,230.4 L413.5,230.4 L413.6,230.4 
+		L413.7,230.4 L413.8,230.4 L413.9,230.4 L414.0,230.4 L414.1,230.4 L414.1,230.3 L414.1,230.6 L414.1,230.3 
+		L414.1,229.9 L414.1,230.6 L414.1,231.2 L414.1,229.8 L414.2,228.2 L414.2,231.9 L414.2,239.4 L414.2,211.9 
+		L414.2,364.9 L414.2,248.3 L414.2,239.3 L414.2,228.6 L414.2,228.2 L414.3,231.2 L414.3,231.3 L414.3,230.9 
+		L414.3,230.8 L414.3,229.7 L414.3,230.0 L414.3,231.1 L414.3,230.9 L414.3,230.8 L414.3,230.5 L414.4,230.3 
+		L414.4,230.4 L414.4,230.3 L414.4,230.4 L414.4,230.3 L414.5,230.3 L414.5,230.4 L414.5,230.3 L414.5,230.4 
+		L414.6,230.4 L414.7,230.4 L414.8,230.4 L414.9,230.4 L415.0,230.4 L415.1,230.4 L415.2,230.4 L415.3,230.4 
+		L415.4,230.4 L415.5,230.4 L415.6,230.4 L415.7,230.4 L415.8,230.4 L415.9,230.4 L416.0,230.4 L416.1,230.4 
+		L416.1,230.3 L416.1,230.4 L416.2,230.4 L416.3,230.4 L416.4,230.4 L416.5,230.4 L416.6,230.4 L416.7,230.4 
+		L416.8,230.4 L416.9,230.4 L417.0,230.4 L417.1,230.4 L417.2,230.4 L417.3,230.4 L417.4,230.4 L417.5,230.4 
+		L417.6,230.4 L417.7,230.4 L417.8,230.4 L417.9,230.4 L418.0,230.4 L418.1,230.4 L418.1,230.3 L418.1,230.4 
+		L418.2,230.4 L418.3,230.4 L418.4,230.4 L418.5,230.4 L418.5,230.3 L418.5,230.4 L418.5,230.3 L418.5,230.4 
+		L418.6,230.4 L418.6,230.3 L418.6,230.4 L418.6,230.3 L418.6,230.4 L418.7,230.3 L418.7,230.4 L418.7,230.3 
+		L418.7,230.4 L418.8,230.4 L418.8,230.3 L418.8,230.4 L418.8,230.3 L418.8,230.4 L418.8,230.3 L418.8,230.4 
+		L418.9,230.3 L418.9,230.4 L418.9,230.3 L418.9,230.4 L419.0,230.4 L419.0,230.3 L419.1,230.4 L419.1,230.3 
+		L419.1,230.4 L419.1,230.3 L419.1,230.4 L419.2,230.3 L419.2,230.4 L419.3,230.4 L419.4,230.4 L419.5,230.4 
+		L419.6,230.4 L419.7,230.4 L419.8,230.4 L419.9,230.4 L420.0,230.4 L420.1,230.4 L420.1,230.6 L420.1,230.1 
+		L420.1,229.9 L420.1,230.6 L420.1,231.0 L420.1,229.9 L420.1,229.0 L420.2,231.2 L420.2,234.1 L420.2,226.6 
+		L420.2,185.2 L420.2,173.4 L420.2,274.0 L420.2,226.8 L420.2,230.8 L420.3,231.3 L420.3,230.6 L420.3,230.5 
+		L420.3,230.9 L420.3,230.5 L420.3,229.7 L420.3,230.1 L420.3,231.7 L420.3,230.2 L420.3,230.7 L420.4,230.4 
+		L420.4,230.3 L420.4,230.4 L420.4,230.3 L420.4,230.4 L420.5,230.3 L420.5,230.4 L420.5,230.3 L420.5,230.4 
+		L420.6,230.4 L420.7,230.4 L420.7,230.3 L420.7,230.4 L420.8,230.4 L420.9,230.4 L421.0,230.4 L421.1,230.4 
+		L421.2,230.4 L421.3,230.4 L421.4,230.4 L421.5,230.4 L421.6,230.4 L421.7,230.4 L421.8,230.4 L421.9,230.4 
+		L422.0,230.4 L422.1,230.4 L422.1,230.3 L422.1,230.4 L422.2,230.4 L422.3,230.4 L422.4,230.4 L422.5,230.4 
+		L422.6,230.4 L422.6,230.3 L422.6,230.4 L422.6,230.3 L422.6,230.4 L422.7,230.4 L422.8,230.4 L422.9,230.4 
+		L422.9,230.3 L423.0,230.4 L423.0,230.3 L423.0,230.4 L423.0,230.3 L423.0,230.4 L423.1,230.4 L423.2,230.4 
+		L423.3,230.4 L423.3,230.3 L423.3,230.4 L423.4,230.4 L423.5,230.4 L423.6,230.4 L423.7,230.4 L423.7,230.3 
+		L423.7,230.4 L423.8,230.4 L423.9,230.4 L423.9,230.3 L423.9,230.4 L424.0,230.4 L424.0,230.3 L424.0,230.4 
+		L424.0,230.3 L424.1,230.3 L424.1,230.4 L424.1,230.3 L424.1,230.4 L424.1,230.3 L424.1,230.4 L424.2,230.4 
+		L424.2,230.3 L424.2,230.4 L424.2,230.3 L424.2,230.4 L424.2,230.3 L424.2,230.4 L424.3,230.4 L424.3,230.3 
+		L424.3,230.4 L424.3,230.3 L424.4,230.4 L424.4,230.3 L424.4,230.4 L424.4,230.3 L424.4,230.4 L424.5,230.3 
+		L424.5,230.4 L424.5,230.3 L424.5,230.4 L424.5,230.3 L424.5,230.4 L424.6,230.4 L424.6,230.3 L424.6,230.4 
+		L424.6,230.3 L424.6,230.4 L424.7,230.3 L424.7,230.4 L424.7,230.3 L424.7,230.4 L424.7,230.3 L424.7,230.4 
+		L424.7,230.3 L424.7,230.4 L424.8,230.4 L424.8,230.3 L424.8,230.4 L424.8,230.3 L424.8,230.4 L424.9,230.4 
+		L424.9,230.3 L424.9,230.4 L425.0,230.3 L425.0,230.4 L425.0,230.3 L425.0,230.4 L425.0,230.3 L425.0,230.4 
+		L425.0,230.3 L425.1,230.3 L425.1,230.4 L425.1,230.3 L425.1,230.4 L425.1,230.3 L425.1,230.4 L425.1,230.3 
+		L425.2,230.4 L425.2,230.3 L425.2,230.4 L425.2,230.3 L425.2,230.4 L425.2,230.3 L425.2,230.4 L425.3,230.4 
+		L425.4,230.4 L425.5,230.4 L425.6,230.4 L425.7,230.4 L425.8,230.4 L425.9,230.4 L426.0,230.4 L426.1,230.4 
+		L426.1,230.1 L426.1,230.4 L426.1,230.8 L426.1,230.1 L426.1,229.5 L426.2,230.9 L426.2,232.4 L426.2,228.6 
+		L426.2,221.5 L426.2,250.6 L426.2,98.0 L426.2,210.7 L426.2,221.6 L426.2,232.3 L426.2,232.5 L426.3,229.4 
+		L426.3,229.8 L426.3,229.9 L426.3,231.0 L426.3,230.7 L426.3,229.6 L426.3,229.8 L426.3,229.9 L426.4,230.2 
+		L426.4,230.4 L426.4,230.3 L426.4,230.4 L426.4,230.3 L426.4,230.4 L426.5,230.4 L426.5,230.3 L426.5,230.4 
+		L426.6,230.4 L426.6,230.3 L426.6,230.4 L426.7,230.4 L426.7,230.3 L426.7,230.4 L426.8,230.4 L426.9,230.4 
+		L427.0,230.3 L427.0,230.4 L427.1,230.4 L427.2,230.4 L427.3,230.4 L427.3,230.3 L427.3,230.4 L427.4,230.4 
+		L427.5,230.4 L427.6,230.4 L427.7,230.4 L427.8,230.4 L427.9,230.4 L428.0,230.4 L428.1,230.4 L428.1,230.3 
+		L428.1,230.4 L428.2,230.4 L428.3,230.4 L428.4,230.4 L428.5,230.4 L428.6,230.4 L428.7,230.4 L428.8,230.4 
+		L428.9,230.4 L429.0,230.4 L429.1,230.4 L429.2,230.4 L429.3,230.4 L429.4,230.4 L429.5,230.4 L429.6,230.4 
+		L429.7,230.4 L429.8,230.4 L429.9,230.4 L430.0,230.4 L430.1,230.4 L430.2,230.4 L430.2,230.3 L430.2,230.4 
+		L430.3,230.4 L430.4,230.4 L430.4,230.3 L430.4,230.4 L430.5,230.4 L430.5,230.3 L430.5,230.4 L430.6,230.4 
+		L430.6,230.3 L430.6,230.4 L430.7,230.3 L430.7,230.4 L430.8,230.4 L430.8,230.3 L430.9,230.3 L430.9,230.4 
+		L430.9,230.3 L430.9,230.4 L430.9,230.3 L430.9,230.4 L431.0,230.3 L431.0,230.4 L431.0,230.3 L431.0,230.4 
+		L431.1,230.4 L431.1,230.3 L431.1,230.4 L431.1,230.3 L431.1,230.4 L431.1,230.3 L431.1,230.4 L431.2,230.3 
+		L431.2,230.4 L431.3,230.4 L431.4,230.4 L431.5,230.4 L431.6,230.4 L431.7,230.4 L431.8,230.4 L431.9,230.4 
+		L432.0,230.4 L432.1,230.4 L432.1,230.1 L432.1,230.6 L432.1,230.8 L432.1,230.1 L432.1,229.7 L432.1,230.8 
+		L432.2,231.6 L432.2,229.4 L432.2,226.6 L432.2,234.4 L432.2,274.7 L432.2,292.4 L432.2,187.5 L432.2,234.2 
+		L432.2,233.9 L432.2,229.8 L432.3,229.4 L432.3,230.2 L432.3,229.9 L432.3,230.2 L432.3,231.0 L432.3,230.7 
+		L432.3,229.1 L432.3,230.4 L432.4,230.4 L432.4,230.3 L432.4,230.4 L432.4,230.3 L432.4,230.4 L432.5,230.4 
+		L432.5,230.3 L432.5,230.4 L432.5,230.3 L432.5,230.4 L432.6,230.4 L432.7,230.4 L432.8,230.4 L432.9,230.4 
+		L433.0,230.4 L433.1,230.4 L433.2,230.4 L433.3,230.4 L433.3,230.3 L433.3,230.4 L433.4,230.4 L433.5,230.4 
+		L433.6,230.4 L433.7,230.4 L433.8,230.4 L433.9,230.4 L434.0,230.4 L434.1,230.4 L434.2,230.4 L434.3,230.4 
+		L434.3,230.3 L434.3,230.4 L434.4,230.4 L434.4,230.3 L434.4,230.4 L434.4,230.3 L434.4,230.4 L434.5,230.4 
+		L434.5,230.3 L434.5,230.4 L434.6,230.4 L434.7,230.4 L434.7,230.3 L434.7,230.4 L434.8,230.4 L434.8,230.3 
+		L434.9,230.4 L434.9,230.3 L434.9,230.4 L435.0,230.4 L435.1,230.4 L435.1,230.3 L435.1,230.4 L435.2,230.4 
+		L435.2,230.3 L435.2,230.4 L435.3,230.4 L435.4,230.4 L435.5,230.4 L435.6,230.4 L435.7,230.4 L435.7,230.3 
+		L435.7,230.4 L435.8,230.4 L435.9,230.4 L436.0,230.3 L436.0,230.4 L436.0,230.3 L436.0,230.4 L436.1,230.4 
+		L436.1,230.3 L436.1,230.4 L436.1,230.3 L436.1,230.4 L436.1,230.3 L436.1,230.4 L436.1,230.3 L436.2,230.3 
+		L436.2,230.4 L436.2,230.3 L436.2,230.4 L436.2,230.3 L436.2,230.4 L436.3,230.4 L436.3,230.3 L436.3,230.4 
+		L436.3,230.3 L436.3,230.4 L436.3,230.3 L436.4,230.3 L436.4,230.4 L436.4,230.3 L436.4,230.4 L436.4,230.3 
+		L436.4,230.4 L436.5,230.4 L436.5,230.3 L436.5,230.4 L436.5,230.3 L436.5,230.4 L436.6,230.4 L436.6,230.3 
+		L436.6,230.4 L436.6,230.3 L436.6,230.4 L436.7,230.4 L436.7,230.3 L436.8,230.4 L436.8,230.3 L436.8,230.4 
+		L436.8,230.3 L436.9,230.3 L436.9,230.4 L436.9,230.3 L436.9,230.4 L436.9,230.3 L436.9,230.4 L437.0,230.3 
+		L437.0,230.4 L437.0,230.3 L437.0,230.4 L437.1,230.3 L437.1,230.4 L437.1,230.3 L437.1,230.4 L437.1,230.3 
+		L437.1,230.4 L437.2,230.4 L437.2,230.3 L437.2,230.4 L437.2,230.3 L437.2,230.4 L437.3,230.4 L437.4,230.4 
+		L437.5,230.4 L437.6,230.4 L437.7,230.4 L437.8,230.4 L437.9,230.4 L438.0,230.4 L438.1,230.4 L438.1,230.3 
+		L438.1,230.6 L438.1,230.3 L438.1,229.9 L438.1,230.6 L438.1,231.2 L438.2,229.7 L438.2,228.3 L438.2,232.2 
+		L438.2,239.1 L438.2,208.4 L438.2,360.3 L438.2,251.6 L438.2,239.0 L438.2,228.3 L438.3,228.3 L438.3,231.3 
+		L438.3,231.4 L438.3,230.9 L438.3,229.7 L438.3,230.0 L438.3,231.1 L438.3,231.0 L438.3,230.8 L438.4,230.5 
+		L438.4,230.3 L438.4,230.4 L438.4,230.3 L438.4,230.4 L438.5,230.3 L438.5,230.4 L438.5,230.3 L438.5,230.4 
+		L438.6,230.4 L438.7,230.4 L438.8,230.4 L438.9,230.4 L439.0,230.4 L439.1,230.4 L439.2,230.4 L439.3,230.4 
+		L439.4,230.4 L439.5,230.4 L439.6,230.4 L439.7,230.4 L439.8,230.4 L439.9,230.4 L440.0,230.4 L440.1,230.4 
+		L440.1,230.3 L440.1,230.4 L440.2,230.4 L440.2,230.3 L440.2,230.4 L440.3,230.4 L440.4,230.4 L440.5,230.4 
+		L440.6,230.4 L440.7,230.4 L440.8,230.4 L440.9,230.4 L441.0,230.4 L441.1,230.4 L441.2,230.4 L441.3,230.4 
+		L441.4,230.4 L441.5,230.4 L441.6,230.4 L441.7,230.4 L441.8,230.4 L441.9,230.4 L442.0,230.4 L442.1,230.4 
+		L442.2,230.4 L442.2,230.3 L442.2,230.4 L442.3,230.4 L442.3,230.3 L442.3,230.4 L442.4,230.4 L442.5,230.3 
+		L442.5,230.4 L442.5,230.3 L442.5,230.4 L442.5,230.3 L442.5,230.4 L442.5,230.3 L442.5,230.4 L442.6,230.4 
+		L442.6,230.3 L442.6,230.4 L442.7,230.3 L442.7,230.4 L442.7,230.3 L442.7,230.4 L442.7,230.3 L442.7,230.4 
+		L442.8,230.4 L442.8,230.3 L442.8,230.4 L442.8,230.3 L442.8,230.4 L442.9,230.3 L442.9,230.4 L443.0,230.4 
+		L443.0,230.3 L443.0,230.4 L443.0,230.3 L443.0,230.4 L443.0,230.3 L443.1,230.4 L443.1,230.3 L443.1,230.4 
+		L443.2,230.4 L443.3,230.4 L443.4,230.4 L443.5,230.4 L443.6,230.4 L443.7,230.4 L443.8,230.4 L443.9,230.4 
+		L444.0,230.4 L444.1,230.4 L444.1,230.6 L444.1,230.1 L444.1,230.0 L444.1,230.7 L444.1,231.0 L444.2,229.9 
+		L444.2,229.1 L444.2,231.4 L444.2,234.0 L444.2,225.9 L444.2,186.8 L444.2,163.3 L444.2,272.4 L444.2,226.2 
+		L444.2,226.9 L444.3,231.0 L444.3,231.3 L444.3,230.5 L444.3,230.4 L444.3,230.8 L444.3,230.6 L444.3,229.8 
+		L444.3,230.0 L444.3,231.6 L444.3,230.1 L444.4,230.7 L444.4,230.4 L444.4,230.3 L444.4,230.4 L444.4,230.3 
+		L444.4,230.4 L444.5,230.4 L444.5,230.3 L444.5,230.4 L444.5,230.3 L444.5,230.4 L444.6,230.4 L444.7,230.4 
+		L444.7,230.3 L444.7,230.4 L444.8,230.4 L444.9,230.4 L445.0,230.4 L445.1,230.4 L445.2,230.4 L445.3,230.4 
+		L445.4,230.4 L445.5,230.4 L445.6,230.4 L445.7,230.4 L445.8,230.4 L445.9,230.4 L446.0,230.4 L446.1,230.4 
+		L446.2,230.4 L446.3,230.4 L446.4,230.4 L446.5,230.4 L446.6,230.4 L446.6,230.3 L446.6,230.4 L446.6,230.3 
+		L446.6,230.4 L446.7,230.4 L446.8,230.4 L446.9,230.4 L447.0,230.4 L447.0,230.3 L447.0,230.4 L447.1,230.4 
+		L447.2,230.4 L447.3,230.4 L447.4,230.4 L447.5,230.4 L447.6,230.4 L447.7,230.4 L447.7,230.3 L447.7,230.4 
+		L447.8,230.4 L447.8,230.3 L447.9,230.4 L447.9,230.3 L447.9,230.4 L448.0,230.4 L448.0,230.3 L448.0,230.4 
+		L448.1,230.4 L448.2,230.3 L448.2,230.4 L448.2,230.3 L448.2,230.4 L448.3,230.4 L448.3,230.3 L448.3,230.4 
+		L448.3,230.3 L448.3,230.4 L448.4,230.3 L448.4,230.4 L448.4,230.3 L448.4,230.4 L448.4,230.3 L448.4,230.4 
+		L448.5,230.3 L448.5,230.4 L448.5,230.3 L448.5,230.4 L448.5,230.3 L448.5,230.4 L448.5,230.3 L448.6,230.4 
+		L448.6,230.3 L448.6,230.4 L448.6,230.3 L448.6,230.4 L448.7,230.4 L448.7,230.3 L448.7,230.4 L448.7,230.3 
+		L448.7,230.4 L448.7,230.3 L448.8,230.4 L448.8,230.3 L448.8,230.4 L448.8,230.3 L448.9,230.3 L448.9,230.4 
+		L448.9,230.3 L448.9,230.4 L449.0,230.4 L449.0,230.3 L449.0,230.4 L449.0,230.3 L449.0,230.4 L449.1,230.3 
+		L449.1,230.4 L449.1,230.3 L449.1,230.4 L449.2,230.4 L449.2,230.3 L449.3,230.4 L449.4,230.4 L449.5,230.4 
+		L449.6,230.4 L449.7,230.4 L449.8,230.4 L449.9,230.4 L450.0,230.4 L450.1,230.4 L450.1,230.1 L450.1,230.4 
+		L450.1,230.8 L450.1,230.1 L450.2,229.5 L450.2,231.0 L450.2,232.4 L450.2,228.3 L450.2,221.8 L450.2,253.9 
+		L450.2,103.0 L450.2,207.5 L450.2,221.9 L450.2,232.5 L450.3,232.4 L450.3,229.4 L450.3,229.3 L450.3,229.7 
+		L450.3,229.8 L450.3,231.0 L450.3,230.7 L450.3,229.6 L450.3,229.7 L450.4,229.9 L450.4,230.2 L450.4,230.4 
+		L450.4,230.3 L450.4,230.4 L450.4,230.3 L450.5,230.4 L450.5,230.3 L450.5,230.4 L450.6,230.4 L450.6,230.3 
+		L450.6,230.4 L450.7,230.4 L450.7,230.3 L450.7,230.4 L450.8,230.4 L450.9,230.4 L451.0,230.4 L451.0,230.3 
+		L451.0,230.4 L451.1,230.4 L451.2,230.4 L451.3,230.4 L451.3,230.3 L451.4,230.4 L451.5,230.4 L451.6,230.4 
+		L451.7,230.4 L451.8,230.4 L451.9,230.4 L452.0,230.4 L452.0,230.3 L452.0,230.4 L452.1,230.4 L452.1,230.3 
+		L452.1,230.4 L452.2,230.4 L452.3,230.4 L452.3,230.3 L452.3,230.4 L452.4,230.4 L452.5,230.4 L452.6,230.4 
+		L452.7,230.4 L452.8,230.4 L452.9,230.4 L453.0,230.4 L453.1,230.4 L453.2,230.4 L453.3,230.4 L453.4,230.4 
+		L453.5,230.4 L453.6,230.4 L453.7,230.4 L453.8,230.4 L453.9,230.4 L454.0,230.4 L454.1,230.4 L454.2,230.4 
+		L454.2,230.3 L454.3,230.4 L454.3,230.3 L454.3,230.4 L454.4,230.3 L454.4,230.4 L454.5,230.4 L454.5,230.3 
+		L454.6,230.4 L454.6,230.3 L454.6,230.4 L454.6,230.3 L454.6,230.4 L454.7,230.4 L454.7,230.3 L454.8,230.3 
+		L454.8,230.4 L454.9,230.4 L454.9,230.3 L454.9,230.4 L454.9,230.3 L454.9,230.4 L455.0,230.4 L455.1,230.4 
+		L455.2,230.4 L455.3,230.4 L455.4,230.4 L455.5,230.4 L455.6,230.4 L455.7,230.4 L455.8,230.4 L455.9,230.4 
+		L456.0,230.4 L456.1,230.4 L456.1,230.1 L456.1,230.6 L456.1,230.7 L456.1,230.0 L456.1,229.7 L456.2,230.8 
+		L456.2,231.6 L456.2,229.2 L456.2,226.8 L456.2,235.1 L456.2,273.0 L456.2,302.3 L456.2,189.2 L456.2,234.9 
+		L456.3,233.7 L456.3,229.6 L456.3,229.5 L456.3,230.2 L456.3,230.3 L456.3,229.9 L456.3,230.1 L456.3,230.9 
+		L456.3,230.7 L456.3,229.1 L456.4,230.4 L456.4,230.3 L456.4,230.4 L456.4,230.3 L456.5,230.4 L456.5,230.3 
+		L456.5,230.4 L456.5,230.3 L456.6,230.4 L456.7,230.4 L456.8,230.4 L456.9,230.4 L457.0,230.4 L457.1,230.4 
+		L457.2,230.4 L457.3,230.4 L457.3,230.3 L457.4,230.4 L457.5,230.4 L457.6,230.4 L457.7,230.4 L457.8,230.4 
+		L457.9,230.4 L458.0,230.4 L458.1,230.4 L458.2,230.4 L458.3,230.4 L458.4,230.4 L458.5,230.4 L458.5,230.3 
+		L458.5,230.4 L458.6,230.4 L458.7,230.4 L458.8,230.4 L458.8,230.3 L458.8,230.4 L458.8,230.3 L458.8,230.4 
+		L458.9,230.4 L459.0,230.4 L459.0,230.3 L459.0,230.4 L459.1,230.4 L459.1,230.3 L459.1,230.4 L459.2,230.4 
+		L459.3,230.4 L459.4,230.4 L459.5,230.4 L459.6,230.4 L459.7,230.4 L459.8,230.4 L459.9,230.4 L460.0,230.4 
+		L460.1,230.4 L460.1,230.3 L460.1,230.4 L460.1,230.3 L460.1,230.4 L460.1,230.3 L460.2,230.4 L460.2,230.3 
+		L460.2,230.4 L460.2,230.3 L460.2,230.4 L460.3,230.4 L460.3,230.3 L460.3,230.4 L460.4,230.4 L460.4,230.3 
+		L460.4,230.4 L460.5,230.4 L460.5,230.3 L460.5,230.4 L460.6,230.4 L460.6,230.3 L460.6,230.4 L460.6,230.3 
+		L460.6,230.4 L460.7,230.4 L460.7,230.3 L460.7,230.4 L460.7,230.3 L460.7,230.4 L460.8,230.4 L460.9,230.4 
+		L460.9,230.3 L460.9,230.4 L460.9,230.3 L461.0,230.4 L461.0,230.3 L461.0,230.4 L461.0,230.3 L461.0,230.4 
+		L461.1,230.4 L461.1,230.3 L461.1,230.4 L461.1,230.3 L461.1,230.4 L461.2,230.4 L461.2,230.3 L461.2,230.4 
+		L461.2,230.3 L461.2,230.4 L461.2,230.3 L461.3,230.3 L461.3,230.4 L461.4,230.4 L461.5,230.4 L461.6,230.4 
+		L461.7,230.4 L461.8,230.4 L461.9,230.4 L462.0,230.4 L462.1,230.4 L462.1,230.3 L462.1,230.5 L462.1,230.2 
+		L462.1,229.9 L462.2,230.7 L462.2,231.2 L462.2,229.6 L462.2,228.4 L462.2,232.5 L462.2,238.7 L462.2,205.1 
+		L462.2,355.0 L462.2,254.8 L462.2,238.7 L462.3,228.0 L462.3,228.3 L462.3,231.4 L462.3,231.0 L462.3,230.9 
+		L462.3,229.7 L462.3,229.9 L462.3,231.1 L462.4,230.8 L462.4,230.5 L462.4,230.3 L462.4,230.4 L462.4,230.3 
+		L462.4,230.4 L462.5,230.4 L462.5,230.3 L462.5,230.4 L462.5,230.3 L462.5,230.4 L462.6,230.4 L462.7,230.4 
+		L462.8,230.4 L462.9,230.4 L463.0,230.4 L463.1,230.4 L463.2,230.4 L463.3,230.4 L463.4,230.4 L463.5,230.4 
+		L463.6,230.4 L463.7,230.4 L463.8,230.4 L463.9,230.4 L464.0,230.4 L464.1,230.4 L464.2,230.4 L464.2,230.3 
+		L464.2,230.4 L464.3,230.4 L464.3,230.3 L464.3,230.4 L464.3,230.3 L464.3,230.4 L464.4,230.4 L464.5,230.4 
+		L464.5,230.3 L464.5,230.4 L464.6,230.3 L464.6,230.4 L464.7,230.4 L464.8,230.4 L464.9,230.4 L465.0,230.4 
+		L465.0,230.3 L465.0,230.4 L465.1,230.4 L465.2,230.4 L465.3,230.4 L465.4,230.4 L465.5,230.4 L465.6,230.4 
+		L465.7,230.4 L465.8,230.4 L465.9,230.4 L466.0,230.4 L466.1,230.4 L466.1,230.3 L466.1,230.4 L466.2,230.4 
+		L466.2,230.3 L466.2,230.4 L466.3,230.4 L466.4,230.4 L466.4,230.3 L466.4,230.4 L466.4,230.3 L466.4,230.4 
+		L466.5,230.4 L466.5,230.3 L466.5,230.4 L466.5,230.3 L466.5,230.4 L466.5,230.3 L466.6,230.4 L466.6,230.3 
+		L466.6,230.4 L466.7,230.4 L466.7,230.3 L466.7,230.4 L466.7,230.3 L466.7,230.4 L466.7,230.3 L466.8,230.4 
+		L466.8,230.3 L466.9,230.4 L466.9,230.3 L466.9,230.4 L466.9,230.3 L466.9,230.4 L467.0,230.4 L467.0,230.3 
+		L467.0,230.4 L467.0,230.3 L467.0,230.4 L467.0,230.3 L467.1,230.4 L467.1,230.3 L467.1,230.4 L467.2,230.4 
+		L467.2,230.3 L467.2,230.4 L467.2,230.3 L467.2,230.4 L467.3,230.4 L467.4,230.4 L467.5,230.4 L467.6,230.4 
+		L467.7,230.4 L467.8,230.4 L467.9,230.4 L468.0,230.4 L468.1,230.4 L468.1,230.6 L468.1,230.1 L468.1,230.0 
+		L468.1,230.7 L468.2,231.0 L468.2,229.8 L468.2,229.1 L468.2,231.5 L468.2,233.8 L468.2,225.3 L468.2,188.7 
+		L468.2,153.6 L468.2,270.6 L468.2,225.5 L468.3,227.1 L468.3,231.2 L468.3,230.4 L468.3,230.8 L468.3,230.6 
+		L468.3,229.8 L468.3,229.9 L468.4,231.6 L468.4,230.1 L468.4,230.6 L468.4,230.4 L468.4,230.3 L468.4,230.4 
+		L468.4,230.3 L468.5,230.4 L468.5,230.3 L468.5,230.4 L468.5,230.3 L468.5,230.4 L468.6,230.4 L468.7,230.4 
+		L468.7,230.3 L468.7,230.4 L468.8,230.4 L468.9,230.4 L469.0,230.4 L469.1,230.4 L469.2,230.4 L469.3,230.4 
+		L469.3,230.3 L469.4,230.4 L469.5,230.4 L469.6,230.4 L469.7,230.4 L469.8,230.4 L469.9,230.4 L470.0,230.4 
+		L470.1,230.4 L470.1,230.3 L470.1,230.4 L470.2,230.4 L470.3,230.4 L470.4,230.4 L470.5,230.4 L470.5,230.3 
+		L470.5,230.4 L470.5,230.3 L470.6,230.4 L470.6,230.3 L470.6,230.4 L470.7,230.4 L470.8,230.4 L470.9,230.4 
+		L471.0,230.4 L471.1,230.4 L471.2,230.4 L471.3,230.4 L471.4,230.4 L471.5,230.4 L471.6,230.4 L471.7,230.4 
+		L471.7,230.3 L471.7,230.4 L471.8,230.4 L471.9,230.4 L472.0,230.4 L472.0,230.3 L472.0,230.4 L472.1,230.4 
+		L472.1,230.3 L472.1,230.4 L472.2,230.4 L472.2,230.3 L472.2,230.4 L472.2,230.3 L472.3,230.4 L472.3,230.3 
+		L472.3,230.4 L472.3,230.3 L472.4,230.4 L472.4,230.3 L472.4,230.4 L472.4,230.3 L472.4,230.4 L472.4,230.3 
+		L472.5,230.3 L472.5,230.4 L472.5,230.3 L472.5,230.4 L472.5,230.3 L472.6,230.4 L472.6,230.3 L472.6,230.4 
+		L472.7,230.4 L472.7,230.3 L472.7,230.4 L472.7,230.3 L472.7,230.4 L472.8,230.3 L472.8,230.4 L472.8,230.3 
+		L472.8,230.4 L472.9,230.3 L472.9,230.4 L472.9,230.3 L472.9,230.4 L472.9,230.3 L473.0,230.3 L473.0,230.4 
+		L473.0,230.3 L473.0,230.4 L473.1,230.3 L473.1,230.4 L473.1,230.3 L473.1,230.4 L473.1,230.3 L473.1,230.4 
+		L473.2,230.4 L473.2,230.3 L473.3,230.3 L473.3,230.4 L473.4,230.4 L473.5,230.4 L473.6,230.4 L473.7,230.4 
+		L473.8,230.4 L473.9,230.4 L474.0,230.4 L474.1,230.4 L474.1,230.2 L474.1,230.5 L474.1,230.7 L474.2,230.0 
+		L474.2,229.6 L474.2,231.1 L474.2,232.3 L474.2,228.1 L474.2,222.2 L474.2,257.2 L474.2,108.7 L474.2,204.3 
+		L474.3,222.2 L474.3,232.8 L474.3,232.4 L474.3,229.3 L474.3,229.7 L474.3,229.8 L474.3,231.0 L474.3,230.8 
+		L474.3,229.7 L474.4,229.6 L474.4,229.9 L474.4,230.2 L474.4,230.4 L474.4,230.3 L474.4,230.4 L474.4,230.3 
+		L474.5,230.3 L474.5,230.4 L474.5,230.3 L474.5,230.4 L474.6,230.3 L474.6,230.4 L474.6,230.3 L474.6,230.4 
+		L474.7,230.4 L474.7,230.3 L474.8,230.4 L474.9,230.4 L475.0,230.4 L475.0,230.3 L475.0,230.4 L475.1,230.4 
+		L475.2,230.4 L475.3,230.4 L475.4,230.3 L475.4,230.4 L475.5,230.4 L475.6,230.4 L475.7,230.4 L475.8,230.4 
+		L475.9,230.4 L476.0,230.4 L476.1,230.4 L476.2,230.4 L476.3,230.4 L476.4,230.4 L476.5,230.4 L476.5,230.3 
+		L476.5,230.4 L476.6,230.4 L476.7,230.4 L476.8,230.4 L476.9,230.4 L477.0,230.4 L477.1,230.4 L477.2,230.4 
+		L477.3,230.4 L477.4,230.4 L477.5,230.4 L477.6,230.4 L477.7,230.4 L477.8,230.4 L477.9,230.4 L478.0,230.4 
+		L478.1,230.4 L478.2,230.4 L478.3,230.4 L478.4,230.3 L478.4,230.4 L478.5,230.3 L478.5,230.4 L478.5,230.3 
+		L478.5,230.4 L478.5,230.3 L478.5,230.4 L478.5,230.3 L478.5,230.4 L478.6,230.3 L478.6,230.4 L478.6,230.3 
+		L478.6,230.4 L478.6,230.3 L478.6,230.4 L478.7,230.3 L478.7,230.4 L478.7,230.3 L478.7,230.4 L478.8,230.3 
+		L478.8,230.4 L478.8,230.3 L478.8,230.4 L478.9,230.4 L478.9,230.3 L478.9,230.4 L479.0,230.3 L479.0,230.4 
+		L479.0,230.3 L479.0,230.4 L479.0,230.3 L479.0,230.4 L479.1,230.3 L479.1,230.4 L479.1,230.3 L479.1,230.4 
+		L479.1,230.3 L479.1,230.4 L479.2,230.4 L479.2,230.3 L479.2,230.4 L479.2,230.3 L479.2,230.4 L479.2,230.3 
+		L479.3,230.4 L479.3,230.3 L479.3,230.4 L479.4,230.4 L479.5,230.4 L479.6,230.4 L479.7,230.4 L479.8,230.4 
+		L479.9,230.4 L480.0,230.4 L480.1,230.4 L480.1,230.1 L480.1,230.6 L480.1,230.7 L480.1,230.0 L480.2,229.7 
+		L480.2,230.9 L480.2,231.5 L480.2,229.1 L480.2,227.0 L480.2,235.7 L480.2,271.0 L480.2,311.8 L480.2,191.1 
+		L480.3,235.5 L480.3,233.5 L480.3,229.5 L480.3,229.6 L480.3,230.3 L480.3,229.9 L480.3,230.1 L480.3,230.9 
+		L480.3,230.8 L480.4,229.2 L480.4,230.6 L480.4,230.1 L480.4,230.3 L480.4,230.4 L480.4,230.3 L480.4,230.4 
+		L480.5,230.4 L480.5,230.3 L480.5,230.4 L480.5,230.3 L480.5,230.4 L480.5,230.3 L480.6,230.3 L480.6,230.4 
+		L480.7,230.4 L480.8,230.4 L480.9,230.4 L481.0,230.4 L481.1,230.4 L481.2,230.4 L481.3,230.4 L481.4,230.3 
+		L481.4,230.4 L481.5,230.4 L481.5,230.3 L481.5,230.4 L481.6,230.4 L481.7,230.4 L481.8,230.4 L481.9,230.4 
+		L482.0,230.4 L482.1,230.4 L482.2,230.4 L482.3,230.4 L482.4,230.4 L482.5,230.3 L482.5,230.4 L482.5,230.3 
+		L482.5,230.4 L482.6,230.4 L482.7,230.4 L482.7,230.3 L482.7,230.4 L482.8,230.4 L482.9,230.4 L483.0,230.4 
+		L483.1,230.4 L483.2,230.4 L483.3,230.4 L483.4,230.4 L483.5,230.4 L483.6,230.4 L483.7,230.4 L483.8,230.4 
+		L483.9,230.4 L484.0,230.4 L484.1,230.3 L484.1,230.4 L484.2,230.4 L484.2,230.3 L484.2,230.4 L484.2,230.3 
+		L484.2,230.4 L484.3,230.4 L484.3,230.3 L484.3,230.4 L484.3,230.3 L484.4,230.3 L484.4,230.4 L484.4,230.3 
+		L484.5,230.4 L484.5,230.3 L484.5,230.4 L484.5,230.3 L484.5,230.4 L484.6,230.4 L484.6,230.3 L484.6,230.4 
+		L484.6,230.3 L484.6,230.4 L484.7,230.4 L484.7,230.3 L484.7,230.4 L484.7,230.3 L484.7,230.4 L484.8,230.4 
+		L484.8,230.3 L484.8,230.4 L484.8,230.3 L484.8,230.4 L484.9,230.3 L484.9,230.4 L484.9,230.3 L484.9,230.4 
+		L485.0,230.4 L485.0,230.3 L485.0,230.4 L485.1,230.4 L485.1,230.3 L485.1,230.4 L485.1,230.3 L485.1,230.4 
+		L485.1,230.3 L485.2,230.3 L485.2,230.4 L485.2,230.3 L485.2,230.4 L485.3,230.4 L485.4,230.4 L485.5,230.4 
+		L485.6,230.4 L485.7,230.4 L485.8,230.4 L485.9,230.4 L486.0,230.4 L486.1,230.4 L486.1,230.3 L486.1,230.5 
+		L486.1,230.2 L486.2,230.0 L486.2,230.7 L486.2,231.1 L486.2,229.5 L486.2,228.5 L486.2,232.8 L486.2,238.3 
+		L486.2,202.0 L486.2,348.9 L486.2,257.9 L486.3,238.3 L486.3,227.8 L486.3,228.4 L486.3,231.4 L486.3,231.0 
+		L486.3,230.9 L486.3,229.7 L486.3,229.9 L486.4,231.0 L486.4,231.2 L486.4,230.7 L486.4,230.6 L486.4,230.3 
+		L486.4,230.4 L486.4,230.3 L486.5,230.4 L486.5,230.3 L486.5,230.4 L486.5,230.3 L486.6,230.4 L486.7,230.4 
+		L486.8,230.4 L486.9,230.4 L487.0,230.4 L487.1,230.4 L487.2,230.4 L487.3,230.4 L487.4,230.4 L487.5,230.4 
+		L487.6,230.4 L487.7,230.4 L487.8,230.4 L487.9,230.4 L488.0,230.4 L488.1,230.4 L488.2,230.4 L488.3,230.4 
+		L488.4,230.4 L488.4,230.3 L488.4,230.4 L488.4,230.3 L488.5,230.4 L488.5,230.3 L488.5,230.4 L488.5,230.3 
+		L488.5,230.4 L488.6,230.4 L488.6,230.3 L488.6,230.4 L488.7,230.4 L488.8,230.4 L488.9,230.4 L489.0,230.4 
+		L489.1,230.4 L489.2,230.4 L489.3,230.4 L489.4,230.4 L489.5,230.4 L489.6,230.4 L489.7,230.4 L489.8,230.4 
+		L489.9,230.4 L490.0,230.3 L490.0,230.4 L490.1,230.4 L490.1,230.3 L490.1,230.4 L490.2,230.4 L490.2,230.3 
+		L490.2,230.4 L490.3,230.4 L490.4,230.4 L490.4,230.3 L490.4,230.4 L490.4,230.3 L490.4,230.4 L490.5,230.4 
+		L490.5,230.3 L490.5,230.4 L490.6,230.4 L490.6,230.3 L490.6,230.4 L490.6,230.3 L490.6,230.4 L490.7,230.4 
+		L490.7,230.3 L490.7,230.4 L490.7,230.3 L490.7,230.4 L490.8,230.4 L490.9,230.4 L491.0,230.4 L491.0,230.3 
+		L491.0,230.4 L491.0,230.3 L491.0,230.4 L491.1,230.4 L491.2,230.3 L491.2,230.4 L491.2,230.3 L491.2,230.4 
+		L491.2,230.3 L491.2,230.4 L491.2,230.3 L491.2,230.4 L491.3,230.4 L491.4,230.4 L491.5,230.4 L491.6,230.4 
+		L491.7,230.4 L491.8,230.4 L491.9,230.4 L492.0,230.4 L492.1,230.4 L492.1,230.6 L492.1,230.1 L492.1,230.0 
+		L492.2,230.7 L492.2,230.9 L492.2,229.8 L492.2,229.2 L492.2,231.7 L492.2,233.6 L492.2,224.7 L492.2,190.8 
+		L492.2,144.4 L492.2,268.5 L492.3,224.9 L492.3,227.3 L492.3,231.3 L492.3,231.1 L492.3,230.3 L492.3,230.4 
+		L492.3,230.7 L492.3,230.6 L492.3,229.8 L492.4,229.9 L492.4,231.5 L492.4,230.1 L492.4,230.6 L492.4,230.4 
+		L492.4,230.3 L492.4,230.4 L492.4,230.3 L492.5,230.3 L492.5,230.4 L492.5,230.3 L492.5,230.4 L492.5,230.3 
+		L492.6,230.4 L492.7,230.4 L492.7,230.3 L492.8,230.4 L492.9,230.4 L493.0,230.4 L493.1,230.4 L493.2,230.4 
+		L493.3,230.4 L493.4,230.3 L493.4,230.4 L493.5,230.4 L493.6,230.4 L493.7,230.4 L493.8,230.4 L493.9,230.4 
+		L494.0,230.4 L494.1,230.4 L494.2,230.4 L494.3,230.4 L494.4,230.4 L494.5,230.4 L494.6,230.4 L494.7,230.4 
+		L494.8,230.4 L494.9,230.4 L495.0,230.4 L495.1,230.4 L495.2,230.4 L495.3,230.4 L495.4,230.4 L495.5,230.4 
+		L495.6,230.4 L495.7,230.4 L495.8,230.3 L495.8,230.4 L495.9,230.4 L496.0,230.4 L496.1,230.4 L496.2,230.4 
+		L496.2,230.3 L496.2,230.4 L496.2,230.3 L496.2,230.4 L496.3,230.3 L496.3,230.4 L496.3,230.3 L496.3,230.4 
+		L496.3,230.3 L496.3,230.4 L496.4,230.4 L496.4,230.3 L496.4,230.4 L496.5,230.4 L496.5,230.3 L496.5,230.4 
+		L496.6,230.4 L496.6,230.3 L496.6,230.4 L496.6,230.3 L496.6,230.4 L496.7,230.4 L496.8,230.4 L496.8,230.3 
+		L496.8,230.4 L496.9,230.4 L496.9,230.3 L496.9,230.4 L496.9,230.3 L496.9,230.4 L497.0,230.3 L497.0,230.4 
+		L497.0,230.3 L497.0,230.4 L497.0,230.3 L497.0,230.4 L497.1,230.4 L497.1,230.3 L497.1,230.4 L497.2,230.4 
+		L497.2,230.3 L497.2,230.4 L497.3,230.3 L497.3,230.4 L497.4,230.4 L497.5,230.4 L497.6,230.4 L497.7,230.4 
+		L497.8,230.4 L497.9,230.4 L498.0,230.4 L498.1,230.4 L498.1,230.2 L498.1,230.5 L498.2,230.7 L498.2,230.0 
+		L498.2,229.6 L498.2,231.2 L498.2,232.2 L498.2,227.8 L498.2,222.6 L498.2,260.2 L498.2,115.1 L498.3,201.3 
+		L498.3,222.6 L498.3,233.0 L498.3,232.3 L498.3,229.2 L498.3,229.3 L498.3,229.7 L498.3,229.8 L498.3,231.0 
+		L498.3,230.8 L498.4,229.7 L498.4,229.5 L498.4,230.0 L498.4,230.1 L498.4,230.4 L498.4,230.3 L498.4,230.4 
+		L498.5,230.4 L498.5,230.3 L498.5,230.4 L498.5,230.3 L498.5,230.4 L498.6,230.4 L498.6,230.3 L498.6,230.4 
+		L498.6,230.3 L498.6,230.4 L498.7,230.4 L498.8,230.3 L498.8,230.4 L498.9,230.4 L499.0,230.4 L499.0,230.3 
+		L499.0,230.4 L499.1,230.4 L499.2,230.4 L499.3,230.4 L499.4,230.4 L499.4,230.3 L499.4,230.4 L499.5,230.4 
+		L499.6,230.4 L499.7,230.4 L499.8,230.4 L499.9,230.4 L500.0,230.4 L500.1,230.4 L500.2,230.4 L500.3,230.4 
+		L500.4,230.4 L500.5,230.4 L500.6,230.4 L500.7,230.4 L500.7,230.3 L500.7,230.4 L500.8,230.4 L500.8,230.3 
+		L500.8,230.4 L500.9,230.4 L501.0,230.4 L501.1,230.4 L501.2,230.4 L501.3,230.4 L501.4,230.4 L501.5,230.4 
+		L501.6,230.4 L501.7,230.4 L501.8,230.4 L501.9,230.4 L502.0,230.4 L502.1,230.4 L502.2,230.4 L502.3,230.4 
+		L502.4,230.4 L502.4,230.3 L502.4,230.4 L502.5,230.4 L502.5,230.3 L502.5,230.4 L502.5,230.3 L502.5,230.4 
+		L502.6,230.4 L502.6,230.3 L502.6,230.4 L502.7,230.3 L502.7,230.4 L502.8,230.4 L502.8,230.3 L502.8,230.4 
+		L502.8,230.3 L502.8,230.4 L502.9,230.3 L502.9,230.4 L502.9,230.3 L502.9,230.4 L503.0,230.3 L503.0,230.4 
+		L503.0,230.3 L503.0,230.4 L503.1,230.4 L503.1,230.3 L503.1,230.4 L503.1,230.3 L503.2,230.3 L503.2,230.4 
+		L503.2,230.3 L503.2,230.4 L503.2,230.3 L503.2,230.4 L503.3,230.4 L503.3,230.3 L503.3,230.4 L503.4,230.4 
+		L503.5,230.4 L503.6,230.4 L503.7,230.4 L503.8,230.4 L503.9,230.4 L504.0,230.4 L504.1,230.4 L504.1,230.0 
+		L504.1,230.7 L504.2,230.7 L504.2,230.0 L504.2,229.8 L504.2,231.0 L504.2,231.5 L504.2,229.0 L504.2,227.2 
+		L504.2,236.3 L504.2,268.7 L504.2,320.8 L504.3,193.3 L504.3,236.1 L504.3,233.3 L504.3,229.3 L504.3,229.6 
+		L504.3,230.4 L504.3,230.0 L504.3,230.9 L504.4,230.8 L504.4,229.2 L504.4,230.7 L504.4,230.1 L504.4,230.3 
+		L504.4,230.4 L504.4,230.3 L504.5,230.4 L504.5,230.3 L504.5,230.4 L504.5,230.3 L504.5,230.4 L504.6,230.3 
+		L504.6,230.4 L504.7,230.4 L504.8,230.4 L504.9,230.4 L505.0,230.4 L505.1,230.4 L505.2,230.4 L505.3,230.4 
+		L505.4,230.4 L505.4,230.3 L505.4,230.4 L505.5,230.4 L505.6,230.4 L505.7,230.4 L505.8,230.4 L505.9,230.4 
+		L506.0,230.4 L506.1,230.4 L506.1,230.3 L506.1,230.4 L506.1,230.3 L506.2,230.4 L506.2,230.3 L506.2,230.4 
+		L506.3,230.4 L506.4,230.4 L506.4,230.3 L506.4,230.4 L506.4,230.3 L506.5,230.4 L506.5,230.3 L506.5,230.4 
+		L506.5,230.3 L506.5,230.4 L506.5,230.3 L506.5,230.4 L506.6,230.3 L506.6,230.4 L506.7,230.4 L506.8,230.4 
+		L506.9,230.4 L507.0,230.4 L507.1,230.4 L507.2,230.4 L507.3,230.4 L507.4,230.4 L507.5,230.4 L507.6,230.4 
+		L507.7,230.4 L507.8,230.4 L507.9,230.3 L507.9,230.4 L508.0,230.4 L508.0,230.3 L508.0,230.4 L508.0,230.3 
+		L508.0,230.4 L508.1,230.4 L508.1,230.3 L508.1,230.4 L508.1,230.3 L508.2,230.4 L508.3,230.4 L508.3,230.3 
+		L508.3,230.4 L508.4,230.4 L508.5,230.4 L508.5,230.3 L508.5,230.4 L508.6,230.4 L508.6,230.3 L508.6,230.4 
+		L508.6,230.3 L508.7,230.4 L508.8,230.4 L508.8,230.3 L508.9,230.4 L508.9,230.3 L508.9,230.4 L508.9,230.3 
+		L508.9,230.4 L509.0,230.3 L509.0,230.4 L509.0,230.3 L509.0,230.4 L509.1,230.4 L509.1,230.3 L509.2,230.3 
+		L509.2,230.4 L509.2,230.3 L509.2,230.4 L509.2,230.3 L509.2,230.4 L509.3,230.4 L509.4,230.4 L509.5,230.4 
+		L509.6,230.4 L509.7,230.4 L509.8,230.4 L509.9,230.4 L510.0,230.4 L510.1,230.4 L510.1,230.5 L510.2,230.2 
+		L510.2,230.0 L510.2,230.8 L510.2,231.1 L510.2,229.4 L510.2,228.6 L510.2,233.0 L510.2,237.9 L510.2,199.0 
+		L510.2,342.1 L510.3,260.8 L510.3,237.8 L510.3,227.6 L510.3,228.5 L510.3,231.5 L510.3,231.4 L510.3,231.0 
+		L510.3,229.7 L510.4,229.9 L510.4,231.0 L510.4,231.3 L510.4,230.7 L510.4,230.6 L510.4,230.3 L510.4,230.4 
+		L510.4,230.3 L510.5,230.3 L510.5,230.4 L510.5,230.3 L510.5,230.4 L510.6,230.3 L510.6,230.4 L510.7,230.4 
+		L510.8,230.4 L510.9,230.4 L511.0,230.4 L511.1,230.4 L511.2,230.4 L511.3,230.4 L511.4,230.4 L511.5,230.4 
+		L511.6,230.4 L511.7,230.4 L511.8,230.4 L511.9,230.4 L512.0,230.4 L512.1,230.4 L512.2,230.4 L512.3,230.4 
+		L512.4,230.4 L512.4,230.3 L512.4,230.4 L512.5,230.4 L512.5,230.3 L512.5,230.4 L512.6,230.4 L512.7,230.4 
+		L512.8,230.4 L512.9,230.4 L513.0,230.4 L513.1,230.4 L513.2,230.4 L513.3,230.4 L513.4,230.4 L513.5,230.4 
+		L513.6,230.4 L513.7,230.4 L513.8,230.4 L513.9,230.4 L514.0,230.4 L514.1,230.4 L514.1,230.3 L514.1,230.4 
+		L514.2,230.4 L514.3,230.4 L514.4,230.4 L514.4,230.3 L514.5,230.4 L514.5,230.3 L514.5,230.4 L514.5,230.3 
+		L514.5,230.4 L514.6,230.4 L514.6,230.3 L514.6,230.4 L514.6,230.3 L514.6,230.4 L514.7,230.3 L514.7,230.4 
+		L514.7,230.3 L514.7,230.4 L514.7,230.3 L514.7,230.4 L514.7,230.3 L514.8,230.4 L514.8,230.3 L514.8,230.4 
+		L514.8,230.3 L514.8,230.4 L514.9,230.4 L514.9,230.3 L514.9,230.4 L514.9,230.3 L515.0,230.3 L515.0,230.4 
+		L515.0,230.3 L515.0,230.4 L515.1,230.3 L515.1,230.4 L515.1,230.3 L515.1,230.4 L515.2,230.4 L515.2,230.3 
+		L515.2,230.4 L515.3,230.3 L515.3,230.4 L515.3,230.3 L515.3,230.4 L515.4,230.4 L515.5,230.4 L515.6,230.4 
+		L515.7,230.4 L515.8,230.4 L515.9,230.4 L516.0,230.4 L516.1,230.4 L516.1,230.7 L516.1,230.0 L516.2,230.0 
+		L516.2,230.7 L516.2,230.9 L516.2,229.7 L516.2,229.3 L516.2,231.8 L516.2,233.4 L516.2,224.1 L516.2,193.2 
+		L516.3,135.6 L516.3,266.3 L516.3,224.3 L516.3,227.5 L516.3,231.5 L516.3,231.0 L516.3,230.3 L516.3,230.7 
+		L516.4,229.9 L516.4,229.8 L516.4,231.4 L516.4,230.0 L516.4,230.6 L516.4,230.4 L516.4,230.3 L516.4,230.4 
+		L516.5,230.3 L516.5,230.4 L516.5,230.3 L516.5,230.4 L516.5,230.3 L516.6,230.3 L516.6,230.4 L516.7,230.4 
+		L516.8,230.4 L516.8,230.3 L516.8,230.4 L516.9,230.4 L517.0,230.4 L517.1,230.4 L517.2,230.4 L517.3,230.4 
+		L517.4,230.4 L517.5,230.4 L517.6,230.4 L517.7,230.4 L517.8,230.4 L517.9,230.4 L518.0,230.4 L518.1,230.4 
+		L518.2,230.4 L518.3,230.4 L518.4,230.4 L518.5,230.4 L518.6,230.4 L518.7,230.4 L518.8,230.4 L518.9,230.4 
+		L519.0,230.4 L519.0,230.3 L519.0,230.4 L519.1,230.4 L519.2,230.4 L519.3,230.4 L519.4,230.4 L519.5,230.4 
+		L519.6,230.4 L519.7,230.4 L519.8,230.4 L519.8,230.3 L519.8,230.4 L519.9,230.4 L520.0,230.4 L520.0,230.3 
+		L520.0,230.4 L520.1,230.4 L520.2,230.3 L520.2,230.4 L520.3,230.4 L520.3,230.3 L520.3,230.4 L520.4,230.4 
+		L520.4,230.3 L520.5,230.4 L520.5,230.3 L520.5,230.4 L520.5,230.3 L520.5,230.4 L520.6,230.4 L520.6,230.3 
+		L520.6,230.4 L520.7,230.3 L520.7,230.4 L520.7,230.3 L520.7,230.4 L520.8,230.4 L520.8,230.3 L520.8,230.4 
+		L520.8,230.3 L520.8,230.4 L520.8,230.3 L520.8,230.4 L520.8,230.3 L520.8,230.4 L520.9,230.4 L520.9,230.3 
+		L520.9,230.4 L521.0,230.4 L521.0,230.3 L521.0,230.4 L521.1,230.3 L521.1,230.4 L521.1,230.3 L521.1,230.4 
+		L521.1,230.3 L521.1,230.4 L521.1,230.3 L521.1,230.4 L521.2,230.4 L521.2,230.3 L521.2,230.4 L521.2,230.3 
+		L521.3,230.4 L521.3,230.3 L521.3,230.4 L521.3,230.3 L521.3,230.4 L521.4,230.4 L521.5,230.4 L521.6,230.4 
+		L521.7,230.4 L521.8,230.4 L521.9,230.4 L522.0,230.4 L522.1,230.4 L522.1,230.6 L522.2,230.4 L522.2,230.2 
+		L522.2,230.0 L522.2,229.3 L522.2,229.1 L522.2,230.3 L522.2,231.8 L522.2,231.3 L522.2,232.8 L522.2,275.5 
+		L522.3,129.7 L522.3,196.3 L522.3,213.4 L522.3,222.8 L522.3,225.8 L522.3,227.0 L522.3,229.0 L522.3,229.6 
+		L522.3,228.6 L522.3,228.9 L522.4,229.0 L522.4,228.9 L522.4,229.3 L522.4,230.0 L522.4,230.3 L522.4,230.4 
+		L522.5,230.4 L522.6,230.4 L522.6,230.3 L522.6,230.4 L522.7,230.4 L522.8,230.4 L522.9,230.4 L523.0,230.4 
+		L523.0,230.3 L523.0,230.4 L523.1,230.4 L523.2,230.4 L523.3,230.4 L523.4,230.4 L523.4,230.3 L523.4,230.4 
+		L523.5,230.4 L523.6,230.4 L523.7,230.4 L523.8,230.4 L523.9,230.4 L524.0,230.4 L524.1,230.4 L524.2,230.4 
+		L524.3,230.4 L524.4,230.4 L524.5,230.4 L524.6,230.4 L524.7,230.4 L524.8,230.4 L524.9,230.4 L525.0,230.4 
+		L525.1,230.4 L525.2,230.4 L525.3,230.4 L525.4,230.4 L525.5,230.4 L525.6,230.4 L525.7,230.4 L525.8,230.4 
+		L525.9,230.4 L525.9,230.3 L525.9,230.4 L526.0,230.4 L526.1,230.4 L526.2,230.4 L526.2,230.3 L526.2,230.4 
+		L526.3,230.4 L526.4,230.4 L526.4,230.3 L526.4,230.4 L526.4,230.3 L526.4,230.4 L526.4,230.3 L526.4,230.4 
+		L526.5,230.4 L526.5,230.3 L526.5,230.4 L526.5,230.3 L526.5,230.4 L526.6,230.4 L526.6,230.3 L526.6,230.4 
+		L526.6,230.3 L526.7,230.3 L526.7,230.4 L526.7,230.3 L526.7,230.4 L526.7,230.3 L526.7,230.4 L526.8,230.4 
+		L526.9,230.4 L526.9,230.3 L526.9,230.4 L526.9,230.3 L526.9,230.4 L527.0,230.4 L527.0,230.3 L527.0,230.4 
+		L527.0,230.3 L527.0,230.4 L527.1,230.3 L527.1,230.4 L527.1,230.3 L527.1,230.4 L527.2,230.4 L527.2,230.3 
+		L527.2,230.4 L527.2,230.3 L527.2,230.4 L527.3,230.4 L527.3,230.3 L527.3,230.4 L527.4,230.4 L527.5,230.4 
+		L527.6,230.4 L527.7,230.4 L527.8,230.4 L527.9,230.4 L528.0,230.4 L528.1,230.4 L528.1,228.9 L528.2,231.2 
+		L528.2,241.7 L528.2,259.1 L528.2,213.9 L528.2,217.8 L528.2,226.6 L528.2,311.0 L528.2,233.6 L528.2,224.2 
+		L528.2,233.2 L528.3,232.0 L528.3,139.9 L528.3,229.5 L528.3,230.0 L528.3,231.1 L528.3,158.3 L528.3,232.4 
+		L528.3,226.2 L528.3,228.5 L528.4,228.5 L528.4,229.8 L528.4,230.9 L528.4,229.0 L528.4,230.0 L528.4,230.2 
+		L528.4,230.3 L528.4,230.4 L528.4,228.6 L528.4,232.4 L528.5,233.4 L528.5,231.9 L528.5,229.3 L528.5,230.5 
+		L528.5,231.0 L528.5,230.2 L528.5,230.3 L528.5,230.4 L528.6,230.0 L528.6,231.6 L528.6,231.5 L528.6,230.2 
+		L528.6,230.4 L528.6,230.1 L528.6,230.7 L528.6,230.4 L528.7,230.4 L528.7,230.3 L528.7,229.3 L528.7,229.6 
+		L528.7,230.9 L528.7,229.9 L528.7,229.6 L528.8,230.1 L528.8,230.2 L528.8,230.3 L528.8,230.4 L528.8,230.2 
+		L528.8,230.3 L528.9,230.3 L528.9,230.4 L528.9,230.7 L528.9,229.8 L528.9,230.5 L529.0,230.8 L529.0,230.7 
+		L529.0,230.3 L529.0,230.2 L529.0,230.5 L529.0,230.2 L529.0,230.4 L529.0,230.2 L529.0,230.4 L529.1,230.2 
+		L529.1,230.5 L529.1,230.4 L529.1,230.3 L529.2,230.3 L529.2,230.4 L529.2,230.8 L529.2,230.4 L529.2,230.1 
+		L529.2,230.2 L529.2,230.4 L529.2,230.1 L529.3,230.2 L529.3,230.5 L529.3,230.6 L529.3,230.3 L529.3,230.5 
+		L529.3,230.3 L529.3,230.4 L529.3,230.2 L529.4,230.4 L529.4,230.3 L529.4,230.4 L529.4,230.3 L529.4,230.4 
+		L529.4,230.3 L529.4,230.4 L529.5,230.4 L529.5,230.3 L529.5,230.5 L529.5,230.4 L529.5,230.5 L529.6,230.3 
+		L529.6,230.2 L529.6,230.3 L529.6,230.2 L529.6,230.3 L529.6,230.4 L529.6,230.3 L529.7,230.5 L529.7,230.3 
+		L529.7,230.4 L529.7,230.3 L529.7,230.4 L529.7,230.3 L529.7,230.4 L529.7,230.3 L529.7,230.4 L529.8,230.3 
+		L529.8,230.4 L529.9,230.4 L529.9,230.3 L529.9,230.5 L529.9,230.3 L529.9,230.5 L530.0,230.5 L530.0,230.3 
+		L530.0,230.2 L530.0,230.4 L530.0,230.3 L530.0,230.2 L530.0,230.3 L530.0,230.4 L530.1,230.3 L530.1,230.4 
+		L530.1,230.3 L530.1,230.4 L530.1,230.3 L530.2,230.4 L530.2,230.3 L530.2,230.4 L530.2,230.3 L530.2,230.4 
+		L530.3,230.4 L530.3,230.3 L530.4,230.3 L530.4,230.4 L530.4,230.2 L530.4,230.4 L530.4,230.5 L530.4,230.4 
+		L530.4,230.3 L530.5,230.5 L530.5,230.3 L530.5,230.4 L530.5,230.2 L530.5,230.3 L530.5,230.4 L530.6,230.4 
+		L530.6,230.3 L530.6,230.4 L530.6,230.3 L530.6,230.4 L530.6,230.3 L530.6,230.4 L530.6,230.3 L530.7,230.4 
+		L530.7,230.3 L530.7,230.4 L530.7,230.3 L530.7,230.4 L530.7,230.3 L530.7,230.4 L530.7,230.3 L530.8,230.4 
+		L530.8,230.3 L530.8,230.4 L530.9,230.3 L530.9,230.4 L530.9,230.3 L530.9,230.4 L531.0,230.4 L531.0,230.3 
+		L531.0,230.4 L531.0,230.3 L531.1,230.3 L531.1,230.4 L531.2,230.3 L531.2,230.4 L531.2,230.3 L531.2,230.4 
+		L531.2,230.3 L531.3,230.4 L531.3,230.3 L531.3,230.4 L531.3,230.3 L531.3,230.4 L531.3,230.3 L531.3,230.4 
+		L531.4,230.3 L531.4,230.4 L531.4,230.3 L531.4,230.4 L531.4,230.3 L531.4,230.4 L531.4,230.3 L531.4,230.4 
+		L531.4,230.3 L531.5,230.3 L531.5,230.4 L531.6,230.4 L531.6,230.3 L531.6,230.4 L531.7,230.4 L531.7,230.3 
+		L531.7,230.4 L531.8,230.4 L531.8,230.3 L531.8,230.4 L531.8,230.3 L531.9,230.4 L531.9,230.3 L531.9,230.4 
+		L531.9,230.3 L531.9,230.4 L532.0,230.3 L532.0,230.4 L532.0,230.3 L532.0,230.4 L532.0,230.3 L532.1,230.3 
+		L532.1,230.4 L532.1,230.3 L532.1,230.4 L532.1,230.3 L532.2,230.3 L532.2,230.4 L532.2,230.3 L532.2,230.4 
+		L532.2,230.3 L532.2,230.4 L532.2,230.3 L532.2,230.4 L532.3,230.4 L532.3,230.3 L532.3,230.4 L532.3,230.3 
+		L532.3,230.4 L532.3,230.3 L532.3,230.4 L532.3,230.3 L532.4,230.4 L532.4,230.3 L532.4,230.4 L532.4,230.3 
+		L532.4,230.4 L532.4,230.3 L532.4,230.4 L532.4,230.3 L532.5,230.4 L532.5,230.3 L532.5,230.4 L532.5,230.3 
+		L532.6,230.4 L532.7,230.4 L532.8,230.4 L532.9,230.4 L533.0,230.4 L533.0,230.3 L533.1,230.3 L533.1,230.4 
+		L533.2,230.3 L533.2,230.4 L533.2,230.3 L533.2,230.4 L533.2,230.3 L533.3,230.4 L533.4,230.4 L533.5,230.4 
+		L533.6,230.4 L533.6,230.3 L533.6,230.4 L533.6,230.3 L533.6,230.4 L533.6,230.3 L533.6,230.4 L533.6,230.3 
+		L533.6,230.4 L533.7,230.3 L533.7,230.4 L533.7,230.3 L533.7,230.4 L533.7,230.3 L533.7,230.4 L533.7,230.3 
+		L533.7,230.4 L533.8,230.3 L533.8,230.4 L533.9,230.4 L534.0,230.4 L534.1,230.4 '></path>
+</g>
+	</a>
+	<a xlink:title="Plot #2">
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<g transform="translate(507.9,57.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>libmad</text>
+	</g>
+	<path  d='M516.2,52.7 L558.4,52.7 M53.9,230.4 L54.0,230.4 L54.1,230.4 L54.2,230.4 L54.3,230.4 L54.4,230.4 
+		L54.5,230.4 L54.6,230.4 L54.7,230.4 L54.8,230.4 L54.9,230.4 L55.0,230.4 L55.1,230.4 L55.2,230.4 
+		L55.3,230.4 L55.4,230.4 L55.5,230.4 L55.6,230.4 L55.7,230.4 L55.8,230.4 L55.9,230.4 L56.0,230.4 
+		L56.1,230.4 L56.2,230.4 L56.3,230.4 L56.4,230.4 L56.5,230.4 L56.6,230.4 L56.7,230.4 L56.8,230.4 
+		L56.9,230.4 L57.0,230.4 L57.1,230.4 L57.2,230.4 L57.3,230.4 L57.4,230.4 L57.5,230.4 L57.6,230.4 
+		L57.7,230.4 L57.8,230.4 L57.9,230.4 L58.0,230.4 L58.1,230.4 L58.2,230.4 L58.3,230.4 L58.4,230.4 
+		L58.5,230.4 L58.6,230.4 L58.7,230.4 L58.8,230.4 L58.9,230.4 L59.0,230.4 L59.1,230.4 L59.2,230.4 
+		L59.3,230.4 L59.4,230.4 L59.5,230.4 L59.6,230.4 L59.7,230.4 L59.8,230.4 L59.9,230.4 L60.0,230.4 
+		L60.1,230.4 L60.2,230.4 L60.3,230.4 L60.4,230.4 L60.5,230.4 L60.6,230.4 L60.7,230.4 L60.8,230.4 
+		L60.9,230.4 L61.0,230.4 L61.1,230.4 L61.2,230.4 L61.3,230.4 L61.4,230.4 L61.5,230.4 L61.6,230.4 
+		L61.7,230.4 L61.8,230.4 L61.9,230.4 L62.0,230.4 L62.1,230.4 L62.2,230.4 L62.3,230.4 L62.4,230.4 
+		L62.5,230.4 L62.6,230.4 L62.7,230.4 L62.8,230.4 L62.9,230.4 L63.0,230.4 L63.1,230.4 L63.2,230.4 
+		L63.3,230.4 L63.4,230.4 L63.5,230.4 L63.6,230.4 L63.7,230.4 L63.8,230.4 L63.9,230.4 L64.0,230.4 
+		L64.1,230.4 L64.2,230.4 L64.3,230.4 L64.4,230.4 L64.5,230.4 L64.6,230.4 L64.7,230.4 L64.8,230.4 
+		L64.9,230.4 L65.0,230.4 L65.1,230.4 L65.2,230.4 L65.3,230.4 L65.4,230.4 L65.5,230.4 L65.6,230.4 
+		L65.7,230.4 L65.8,230.4 L65.9,230.4 L65.9,233.9 L65.9,233.7 L65.9,233.5 L65.9,233.1 L66.0,232.5 
+		L66.0,231.7 L66.0,230.6 L66.0,229.4 L66.0,228.0 L66.0,226.8 L66.0,225.7 L66.0,225.0 L66.0,224.8 
+		L66.1,225.0 L66.1,225.8 L66.1,226.9 L66.1,228.3 L66.1,232.0 L66.1,231.1 L66.1,231.0 L66.1,231.2 
+		L66.1,231.3 L66.1,231.4 L66.2,231.4 L66.2,231.3 L66.2,231.2 L66.2,231.1 L66.2,231.0 L66.2,230.9 
+		L66.2,230.8 L66.2,230.7 L66.3,230.6 L66.3,230.5 L66.3,230.2 L66.4,230.2 L66.4,230.3 L66.5,230.3 
+		L66.5,230.4 L66.6,230.4 L66.7,230.3 L66.8,230.3 L66.8,230.4 L66.9,230.4 L67.0,230.4 L67.0,230.3 
+		L67.0,230.4 L67.1,230.4 L67.1,230.3 L67.2,230.3 L67.2,230.4 L67.2,230.3 L67.3,230.3 L67.3,230.4 
+		L67.3,230.3 L67.4,230.3 L67.4,230.4 L67.5,230.4 L67.6,230.4 L67.6,230.3 L67.7,230.3 L67.8,230.3 
+		L67.8,230.4 L67.9,230.4 L68.0,230.4 L68.0,230.3 L68.1,230.3 L68.2,230.4 L68.3,230.4 L68.3,230.3 
+		L68.4,230.3 L68.5,230.3 L68.5,230.4 L68.6,230.4 L68.7,230.4 L68.7,230.3 L68.8,230.3 L68.9,230.3 
+		L68.9,230.4 L69.0,230.4 L69.1,230.4 L69.1,230.3 L69.2,230.3 L69.3,230.3 L69.3,230.4 L69.4,230.4 
+		L69.5,230.4 L69.5,230.3 L69.6,230.3 L69.7,230.4 L69.8,230.4 L69.8,230.3 L69.9,230.3 L70.0,230.3 
+		L70.0,230.4 L70.1,230.4 L70.2,230.4 L70.2,230.3 L70.3,230.3 L70.4,230.3 L70.4,230.4 L70.5,230.4 
+		L70.6,230.4 L70.6,230.3 L70.7,230.3 L70.8,230.3 L70.8,230.4 L70.9,230.4 L71.0,230.4 L71.0,230.3 
+		L71.1,230.3 L71.1,230.4 L71.2,230.4 L71.3,230.4 L71.4,230.4 L71.5,230.4 L71.6,230.4 L71.7,230.4 
+		L71.8,230.4 L71.9,230.4 L71.9,236.2 L71.9,217.7 L71.9,237.0 L71.9,114.6 L72.0,229.6 L72.0,228.5 
+		L72.0,239.3 L72.0,145.0 L72.0,229.1 L72.0,230.0 L72.0,242.0 L72.0,207.0 L72.0,182.5 L72.0,244.8 
+		L72.1,231.8 L72.1,227.8 L72.1,159.5 L72.1,224.0 L72.1,230.4 L72.1,231.1 L72.1,138.9 L72.1,226.7 
+		L72.1,230.3 L72.1,231.3 L72.2,234.4 L72.2,228.1 L72.2,232.4 L72.2,228.1 L72.2,231.3 L72.2,230.2 
+		L72.2,230.4 L72.2,230.6 L72.3,230.2 L72.3,230.4 L72.3,229.9 L72.3,231.3 L72.3,229.4 L72.3,231.1 
+		L72.3,230.4 L72.3,230.3 L72.3,230.4 L72.4,230.4 L72.4,229.6 L72.4,231.3 L72.4,230.6 L72.4,229.9 
+		L72.5,230.8 L72.5,229.9 L72.5,230.3 L72.5,230.4 L72.5,230.3 L72.5,230.4 L72.5,230.3 L72.5,230.4 
+		L72.6,230.4 L72.6,230.8 L72.6,229.8 L72.6,230.2 L72.6,230.6 L72.6,230.1 L72.6,230.6 L72.7,230.1 
+		L72.7,230.7 L72.7,230.4 L72.7,230.3 L72.7,230.4 L72.7,230.3 L72.7,230.4 L72.7,230.3 L72.8,230.4 
+		L72.9,230.2 L72.9,230.5 L72.9,230.2 L72.9,230.5 L72.9,230.1 L72.9,230.3 L72.9,230.5 L72.9,230.2 
+		L72.9,230.5 L73.0,230.3 L73.0,230.4 L73.0,230.3 L73.0,230.4 L73.0,230.3 L73.0,230.4 L73.0,230.3 
+		L73.0,230.4 L73.1,230.4 L73.2,230.2 L73.2,230.5 L73.2,230.4 L73.2,230.3 L73.2,230.5 L73.2,230.2 
+		L73.2,230.5 L73.2,230.2 L73.2,230.3 L73.3,230.4 L73.3,230.3 L73.3,230.4 L73.3,230.3 L73.3,230.4 
+		L73.3,230.3 L73.3,230.4 L73.3,230.3 L73.3,230.4 L73.4,230.3 L73.4,230.4 L73.4,230.3 L73.4,230.4 
+		L73.5,230.4 L73.5,230.3 L73.5,230.4 L73.6,230.4 L73.6,230.3 L73.6,230.4 L73.6,230.3 L73.6,230.4 
+		L73.6,230.3 L73.6,230.4 L73.6,230.3 L73.6,230.4 L73.7,230.3 L73.7,230.4 L73.7,230.3 L73.7,230.4 
+		L73.8,230.3 L73.8,230.4 L73.9,230.4 L74.0,230.4 L74.0,230.3 L74.0,230.4 L74.0,230.3 L74.0,230.4 
+		L74.0,230.3 L74.0,230.4 L74.1,230.3 L74.1,230.4 L74.1,230.3 L74.1,230.4 L74.1,230.3 L74.1,230.4 
+		L74.1,230.3 L74.1,230.4 L74.1,230.3 L74.2,230.4 L74.2,230.3 L74.2,230.4 L74.3,230.3 L74.3,230.4 
+		L74.4,230.4 L74.5,230.4 L74.5,230.3 L74.5,230.4 L74.5,230.3 L74.5,230.4 L74.6,230.3 L74.6,230.4 
+		L74.6,230.3 L74.6,230.4 L74.6,230.3 L74.6,230.4 L74.6,230.3 L74.6,230.4 L74.7,230.3 L74.7,230.4 
+		L74.7,230.3 L74.7,230.4 L74.7,230.3 L74.7,230.4 L74.7,230.3 L74.7,230.4 L74.8,230.3 L74.8,230.4 
+		L74.8,230.3 L74.8,230.4 L74.9,230.4 L75.0,230.4 L75.1,230.4 L75.2,230.4 L75.2,230.3 L75.3,230.4 
+		L75.3,230.3 L75.3,230.4 L75.3,230.3 L75.3,230.4 L75.3,230.3 L75.3,230.4 L75.3,230.3 L75.3,230.4 
+		L75.4,230.3 L75.4,230.4 L75.4,230.3 L75.4,230.4 L75.4,230.3 L75.4,230.4 L75.4,230.3 L75.5,230.4 
+		L75.5,230.3 L75.5,230.4 L75.5,230.3 L75.5,230.4 L75.6,230.4 L75.6,230.3 L75.6,230.4 L75.7,230.4 
+		L75.7,230.3 L75.7,230.4 L75.8,230.4 L75.8,230.3 L75.8,230.4 L75.9,230.4 L76.0,230.4 L76.0,230.3 
+		L76.0,230.4 L76.1,230.4 L76.1,230.3 L76.1,230.4 L76.1,230.3 L76.1,230.4 L76.2,230.4 L76.2,230.3 
+		L76.2,230.4 L76.2,230.3 L76.2,230.4 L76.3,230.3 L76.3,230.4 L76.3,230.3 L76.3,230.4 L76.3,230.3 
+		L76.3,230.4 L76.4,230.4 L76.5,230.4 L76.6,230.4 L76.7,230.4 L76.8,230.4 L76.8,230.3 L76.8,230.4 
+		L76.8,230.3 L76.8,230.4 L76.9,230.3 L76.9,230.4 L76.9,230.3 L76.9,230.4 L76.9,230.3 L76.9,230.4 
+		L77.0,230.4 L77.1,230.4 L77.2,230.4 L77.3,230.4 L77.3,230.3 L77.3,230.4 L77.3,230.3 L77.4,230.4 
+		L77.5,230.4 L77.5,230.3 L77.5,230.4 L77.6,230.4 L77.7,230.4 L77.8,230.4 L77.9,230.4 L77.9,230.1 
+		L77.9,230.8 L77.9,230.1 L77.9,230.8 L78.0,229.3 L78.0,231.7 L78.0,230.2 L78.0,229.2 L78.0,230.8 
+		L78.0,228.7 L78.0,273.8 L78.0,334.0 L78.0,198.7 L78.0,246.1 L78.1,223.7 L78.1,234.1 L78.1,227.7 
+		L78.1,232.1 L78.1,231.4 L78.1,229.0 L78.1,231.5 L78.1,229.2 L78.1,231.7 L78.2,229.4 L78.2,230.7 
+		L78.2,230.0 L78.2,230.4 L78.2,230.3 L78.2,230.4 L78.2,230.3 L78.2,230.4 L78.2,230.3 L78.3,230.4 
+		L78.3,230.3 L78.3,230.4 L78.3,230.3 L78.3,230.4 L78.3,230.3 L78.4,230.4 L78.5,230.4 L78.6,230.4 
+		L78.7,230.4 L78.8,230.4 L78.9,230.4 L79.0,230.4 L79.1,230.4 L79.2,230.4 L79.2,230.3 L79.2,230.4 
+		L79.3,230.4 L79.4,230.4 L79.5,230.4 L79.6,230.4 L79.7,230.4 L79.8,230.4 L79.9,230.4 L80.0,230.4 
+		L80.1,230.4 L80.2,230.4 L80.2,230.3 L80.3,230.4 L80.3,230.3 L80.3,230.4 L80.4,230.4 L80.5,230.4 
+		L80.6,230.4 L80.7,230.4 L80.8,230.4 L80.9,230.4 L81.0,230.4 L81.1,230.4 L81.2,230.4 L81.3,230.4 
+		L81.4,230.4 L81.5,230.4 L81.6,230.4 L81.7,230.4 L81.8,230.4 L81.9,230.4 L81.9,230.3 L81.9,230.4 
+		L82.0,230.4 L82.0,230.3 L82.0,230.4 L82.1,230.4 L82.1,230.3 L82.1,230.4 L82.2,230.4 L82.2,230.3 
+		L82.2,230.4 L82.2,230.3 L82.2,230.4 L82.2,230.3 L82.2,230.4 L82.3,230.4 L82.4,230.4 L82.4,230.3 
+		L82.4,230.4 L82.4,230.3 L82.4,230.4 L82.4,230.3 L82.4,230.4 L82.5,230.3 L82.5,230.4 L82.5,230.3 
+		L82.5,230.4 L82.6,230.4 L82.6,230.3 L82.6,230.4 L82.6,230.3 L82.6,230.4 L82.7,230.4 L82.7,230.3 
+		L82.7,230.4 L82.8,230.4 L82.8,230.3 L82.8,230.4 L82.8,230.3 L82.9,230.4 L82.9,230.3 L82.9,230.4 
+		L82.9,230.3 L82.9,230.4 L82.9,230.3 L82.9,230.4 L83.0,230.4 L83.0,230.3 L83.0,230.4 L83.0,230.3 
+		L83.0,230.4 L83.0,230.3 L83.0,230.4 L83.1,230.3 L83.1,230.4 L83.2,230.4 L83.3,230.4 L83.4,230.4 
+		L83.5,230.4 L83.6,230.4 L83.7,230.4 L83.8,230.4 L83.9,230.4 L83.9,230.1 L84.0,230.9 L84.0,229.2 
+		L84.0,228.9 L84.0,233.6 L84.0,236.5 L84.0,191.9 L84.0,320.9 L84.0,267.6 L84.1,236.5 L84.1,227.0 
+		L84.1,228.7 L84.1,231.6 L84.1,231.3 L84.1,230.9 L84.1,231.0 L84.1,229.8 L84.1,230.9 L84.2,231.5 
+		L84.2,230.7 L84.2,230.6 L84.2,230.3 L84.2,230.4 L84.2,230.3 L84.2,230.4 L84.3,230.4 L84.3,230.3 
+		L84.3,230.4 L84.3,230.3 L84.4,230.4 L84.5,230.4 L84.6,230.4 L84.7,230.4 L84.8,230.4 L84.9,230.4 
+		L85.0,230.4 L85.1,230.4 L85.2,230.4 L85.3,230.4 L85.4,230.4 L85.5,230.4 L85.6,230.4 L85.7,230.4 
+		L85.8,230.4 L85.9,230.4 L86.0,230.4 L86.1,230.4 L86.2,230.4 L86.3,230.4 L86.4,230.4 L86.5,230.4 
+		L86.6,230.4 L86.7,230.4 L86.8,230.4 L86.9,230.4 L87.0,230.4 L87.1,230.4 L87.2,230.4 L87.3,230.4 
+		L87.4,230.4 L87.5,230.4 L87.5,230.3 L87.6,230.4 L87.7,230.4 L87.8,230.4 L87.9,230.4 L87.9,230.3 
+		L87.9,230.4 L87.9,230.3 L87.9,230.4 L88.0,230.4 L88.0,230.3 L88.1,230.4 L88.1,230.3 L88.1,230.4 
+		L88.2,230.4 L88.2,230.3 L88.2,230.4 L88.3,230.3 L88.3,230.4 L88.3,230.3 L88.3,230.4 L88.4,230.3 
+		L88.4,230.4 L88.4,230.3 L88.4,230.4 L88.5,230.4 L88.5,230.3 L88.5,230.4 L88.6,230.3 L88.6,230.4 
+		L88.7,230.3 L88.7,230.4 L88.7,230.3 L88.7,230.4 L88.7,230.3 L88.7,230.4 L88.7,230.3 L88.7,230.4 
+		L88.8,230.3 L88.8,230.4 L88.8,230.3 L88.8,230.4 L88.8,230.3 L88.8,230.4 L88.9,230.3 L88.9,230.4 
+		L88.9,230.3 L88.9,230.4 L88.9,230.3 L88.9,230.4 L89.0,230.4 L89.0,230.3 L89.0,230.4 L89.1,230.4 
+		L89.2,230.4 L89.3,230.4 L89.4,230.4 L89.5,230.4 L89.6,230.4 L89.7,230.4 L89.8,230.4 L89.9,230.4 
+		L89.9,230.6 L89.9,230.0 L89.9,230.8 L90.0,230.8 L90.0,229.6 L90.0,229.5 L90.0,232.1 L90.0,232.8 
+		L90.0,222.7 L90.0,200.5 L90.0,115.2 L90.0,259.2 L90.1,222.9 L90.1,228.1 L90.1,231.8 L90.1,230.8 
+		L90.1,230.1 L90.1,230.2 L90.1,230.6 L90.1,230.8 L90.1,230.0 L90.1,229.7 L90.2,231.2 L90.2,230.0 
+		L90.2,230.6 L90.2,230.4 L90.2,230.3 L90.2,230.4 L90.2,230.3 L90.3,230.3 L90.3,230.4 L90.3,230.3 
+		L90.3,230.4 L90.4,230.4 L90.5,230.4 L90.5,230.3 L90.6,230.4 L90.7,230.4 L90.8,230.4 L90.9,230.4 
+		L91.0,230.4 L91.1,230.4 L91.1,230.3 L91.2,230.4 L91.3,230.4 L91.4,230.4 L91.5,230.4 L91.6,230.4 
+		L91.7,230.4 L91.8,230.4 L91.9,230.4 L92.0,230.4 L92.1,230.4 L92.2,230.3 L92.2,230.4 L92.3,230.4 
+		L92.3,230.3 L92.3,230.4 L92.4,230.4 L92.5,230.4 L92.6,230.4 L92.7,230.4 L92.8,230.4 L92.9,230.4 
+		L93.0,230.4 L93.1,230.4 L93.2,230.4 L93.3,230.4 L93.4,230.4 L93.5,230.4 L93.6,230.4 L93.7,230.4 
+		L93.8,230.4 L93.9,230.4 L94.0,230.4 L94.0,230.3 L94.0,230.4 L94.0,230.3 L94.0,230.4 L94.1,230.4 
+		L94.1,230.3 L94.1,230.4 L94.2,230.3 L94.2,230.4 L94.2,230.3 L94.3,230.4 L94.3,230.3 L94.4,230.4 
+		L94.4,230.3 L94.4,230.4 L94.4,230.3 L94.4,230.4 L94.5,230.3 L94.5,230.4 L94.5,230.3 L94.5,230.4 
+		L94.5,230.3 L94.5,230.4 L94.6,230.4 L94.6,230.3 L94.6,230.4 L94.6,230.3 L94.6,230.4 L94.7,230.4 
+		L94.7,230.3 L94.7,230.4 L94.8,230.4 L94.8,230.3 L94.8,230.4 L94.9,230.4 L94.9,230.3 L94.9,230.4 
+		L94.9,230.3 L94.9,230.4 L95.0,230.3 L95.0,230.4 L95.0,230.3 L95.0,230.4 L95.1,230.3 L95.1,230.4 
+		L95.2,230.4 L95.3,230.4 L95.4,230.4 L95.5,230.4 L95.6,230.4 L95.7,230.4 L95.8,230.4 L95.9,230.4 
+		L95.9,230.3 L95.9,230.6 L96.0,230.6 L96.0,229.8 L96.0,231.5 L96.0,231.7 L96.0,227.0 L96.0,224.5 
+		L96.0,269.9 L96.0,144.2 L96.0,192.0 L96.1,224.5 L96.1,233.8 L96.1,231.9 L96.1,229.1 L96.1,229.4 
+		L96.1,229.8 L96.1,229.7 L96.1,230.9 L96.2,229.9 L96.2,229.2 L96.2,230.1 L96.2,230.4 L96.2,230.3 
+		L96.2,230.4 L96.3,230.3 L96.3,230.4 L96.3,230.3 L96.3,230.4 L96.4,230.4 L96.4,230.3 L96.4,230.4 
+		L96.5,230.4 L96.6,230.4 L96.7,230.4 L96.8,230.4 L96.8,230.3 L96.8,230.4 L96.9,230.4 L97.0,230.4 
+		L97.1,230.4 L97.2,230.4 L97.2,230.3 L97.2,230.4 L97.3,230.4 L97.4,230.4 L97.5,230.4 L97.6,230.4 
+		L97.7,230.4 L97.8,230.4 L97.9,230.4 L97.9,230.3 L97.9,230.4 L98.0,230.4 L98.1,230.4 L98.2,230.4 
+		L98.3,230.4 L98.4,230.4 L98.5,230.4 L98.6,230.4 L98.6,230.3 L98.6,230.4 L98.7,230.4 L98.8,230.4 
+		L98.9,230.4 L99.0,230.4 L99.1,230.4 L99.2,230.4 L99.3,230.4 L99.4,230.4 L99.5,230.4 L99.6,230.4 
+		L99.7,230.4 L99.8,230.3 L99.8,230.4 L99.9,230.4 L100.0,230.4 L100.0,230.3 L100.0,230.4 L100.0,230.3 
+		L100.0,230.4 L100.1,230.4 L100.2,230.4 L100.2,230.3 L100.2,230.4 L100.3,230.4 L100.4,230.3 L100.4,230.4 
+		L100.5,230.4 L100.5,230.3 L100.5,230.4 L100.5,230.3 L100.5,230.4 L100.5,230.3 L100.5,230.4 L100.6,230.4 
+		L100.6,230.3 L100.6,230.4 L100.6,230.3 L100.7,230.4 L100.7,230.3 L100.8,230.3 L100.8,230.4 L100.8,230.3 
+		L100.8,230.4 L100.8,230.3 L100.8,230.4 L100.9,230.4 L100.9,230.3 L100.9,230.4 L101.0,230.3 L101.0,230.4 
+		L101.0,230.3 L101.0,230.4 L101.0,230.3 L101.1,230.3 L101.1,230.4 L101.2,230.4 L101.3,230.4 L101.4,230.4 
+		L101.5,230.4 L101.6,230.4 L101.7,230.4 L101.8,230.4 L101.9,230.4 L101.9,230.1 L101.9,230.7 L102.0,229.9 
+		L102.0,231.2 L102.0,228.5 L102.0,228.0 L102.0,238.2 L102.0,258.7 L102.0,348.8 L102.0,203.0 L102.1,238.0 
+		L102.1,232.4 L102.1,228.8 L102.1,230.0 L102.1,230.7 L102.1,230.5 L102.1,230.2 L102.1,229.9 L102.1,230.7 
+		L102.2,231.0 L102.2,229.5 L102.2,230.8 L102.2,230.1 L102.2,230.3 L102.2,230.4 L102.2,230.3 L102.2,230.4 
+		L102.3,230.4 L102.3,230.3 L102.3,230.4 L102.3,230.3 L102.3,230.4 L102.4,230.3 L102.4,230.4 L102.5,230.4 
+		L102.6,230.4 L102.7,230.4 L102.8,230.4 L102.9,230.4 L103.0,230.4 L103.1,230.4 L103.2,230.4 L103.3,230.4 
+		L103.4,230.4 L103.5,230.4 L103.6,230.4 L103.7,230.4 L103.8,230.4 L103.9,230.4 L104.0,230.4 L104.1,230.4 
+		L104.2,230.4 L104.3,230.4 L104.4,230.4 L104.5,230.4 L104.6,230.4 L104.7,230.4 L104.8,230.4 L104.9,230.4 
+		L105.0,230.4 L105.1,230.4 L105.2,230.4 L105.3,230.4 L105.4,230.4 L105.5,230.4 L105.6,230.4 L105.7,230.4 
+		L105.8,230.4 L105.9,230.4 L106.0,230.4 L106.0,230.3 L106.0,230.4 L106.1,230.3 L106.1,230.4 L106.1,230.3 
+		L106.1,230.4 L106.1,230.3 L106.1,230.4 L106.2,230.4 L106.3,230.4 L106.3,230.3 L106.3,230.4 L106.4,230.4 
+		L106.4,230.3 L106.4,230.4 L106.4,230.3 L106.4,230.4 L106.5,230.4 L106.5,230.3 L106.5,230.4 L106.5,230.3 
+		L106.5,230.4 L106.6,230.4 L106.6,230.3 L106.7,230.4 L106.7,230.3 L106.7,230.4 L106.7,230.3 L106.7,230.4 
+		L106.8,230.3 L106.8,230.4 L106.8,230.3 L106.8,230.4 L106.9,230.4 L106.9,230.3 L106.9,230.4 L106.9,230.3 
+		L106.9,230.4 L106.9,230.3 L106.9,230.4 L107.0,230.3 L107.0,230.4 L107.0,230.3 L107.0,230.4 L107.0,230.3 
+		L107.1,230.4 L107.1,230.3 L107.1,230.4 L107.2,230.4 L107.3,230.4 L107.4,230.4 L107.5,230.4 L107.6,230.4 
+		L107.7,230.4 L107.8,230.4 L107.9,230.4 L107.9,230.1 L108.0,230.1 L108.0,230.9 L108.0,229.2 L108.0,229.1 
+		L108.0,233.8 L108.0,235.9 L108.0,189.7 L108.0,311.9 L108.1,269.7 L108.1,235.9 L108.1,226.9 L108.1,228.8 
+		L108.1,231.6 L108.1,231.3 L108.1,230.9 L108.1,231.0 L108.1,229.9 L108.1,229.7 L108.2,230.8 L108.2,231.5 
+		L108.2,230.6 L108.2,230.3 L108.2,230.4 L108.2,230.3 L108.3,230.3 L108.3,230.4 L108.3,230.3 L108.3,230.4 
+		L108.3,230.3 L108.4,230.3 L108.4,230.4 L108.5,230.4 L108.6,230.4 L108.7,230.4 L108.8,230.4 L108.9,230.4 
+		L109.0,230.4 L109.1,230.4 L109.2,230.4 L109.3,230.4 L109.4,230.4 L109.5,230.4 L109.6,230.4 L109.7,230.4 
+		L109.8,230.4 L109.9,230.4 L110.0,230.4 L110.1,230.4 L110.1,230.3 L110.1,230.4 L110.2,230.4 L110.3,230.4 
+		L110.4,230.4 L110.5,230.4 L110.6,230.4 L110.7,230.4 L110.8,230.4 L110.8,230.3 L110.8,230.4 L110.9,230.4 
+		L111.0,230.4 L111.1,230.4 L111.2,230.4 L111.3,230.4 L111.4,230.4 L111.5,230.4 L111.6,230.3 L111.6,230.4 
+		L111.6,230.3 L111.7,230.4 L111.8,230.4 L111.9,230.4 L111.9,230.3 L111.9,230.4 L112.0,230.4 L112.0,230.3 
+		L112.0,230.4 L112.1,230.4 L112.1,230.3 L112.1,230.4 L112.1,230.3 L112.1,230.4 L112.2,230.3 L112.2,230.4 
+		L112.2,230.3 L112.2,230.4 L112.3,230.4 L112.3,230.3 L112.3,230.4 L112.3,230.3 L112.3,230.4 L112.4,230.4 
+		L112.4,230.3 L112.4,230.4 L112.4,230.3 L112.5,230.4 L112.5,230.3 L112.5,230.4 L112.5,230.3 L112.5,230.4 
+		L112.5,230.3 L112.5,230.4 L112.6,230.3 L112.6,230.4 L112.6,230.3 L112.6,230.4 L112.6,230.3 L112.7,230.4 
+		L112.7,230.3 L112.7,230.4 L112.8,230.4 L112.8,230.3 L112.9,230.4 L112.9,230.3 L112.9,230.4 L112.9,230.3 
+		L113.0,230.3 L113.0,230.4 L113.0,230.3 L113.0,230.4 L113.1,230.4 L113.1,230.3 L113.1,230.4 L113.2,230.4 
+		L113.3,230.4 L113.4,230.4 L113.5,230.4 L113.6,230.4 L113.7,230.4 L113.8,230.4 L113.9,230.4 L113.9,230.6 
+		L113.9,230.0 L114.0,230.0 L114.0,230.8 L114.0,229.5 L114.0,229.6 L114.0,232.2 L114.0,232.6 L114.0,222.3 
+		L114.0,203.6 L114.0,108.8 L114.1,256.2 L114.1,222.5 L114.1,228.4 L114.1,231.9 L114.1,230.7 L114.1,230.0 
+		L114.1,230.1 L114.1,230.5 L114.1,230.9 L114.1,230.0 L114.2,229.7 L114.2,231.1 L114.2,229.9 L114.2,230.5 
+		L114.2,230.4 L114.2,230.3 L114.2,230.4 L114.3,230.3 L114.3,230.4 L114.3,230.3 L114.4,230.4 L114.4,230.3 
+		L114.4,230.4 L114.5,230.4 L114.6,230.3 L114.6,230.4 L114.7,230.4 L114.8,230.4 L114.9,230.4 L115.0,230.4 
+		L115.1,230.4 L115.2,230.4 L115.2,230.3 L115.2,230.4 L115.3,230.4 L115.4,230.4 L115.5,230.4 L115.6,230.4 
+		L115.7,230.4 L115.8,230.4 L115.9,230.4 L116.0,230.4 L116.1,230.4 L116.2,230.4 L116.2,230.3 L116.2,230.4 
+		L116.3,230.4 L116.4,230.3 L116.4,230.4 L116.5,230.4 L116.6,230.4 L116.7,230.4 L116.8,230.4 L116.9,230.4 
+		L117.0,230.4 L117.1,230.4 L117.2,230.4 L117.3,230.4 L117.4,230.4 L117.5,230.4 L117.6,230.4 L117.7,230.4 
+		L117.8,230.4 L117.9,230.4 L118.0,230.4 L118.1,230.4 L118.1,230.3 L118.1,230.4 L118.1,230.3 L118.1,230.4 
+		L118.2,230.4 L118.2,230.3 L118.2,230.4 L118.3,230.4 L118.4,230.4 L118.4,230.3 L118.4,230.4 L118.5,230.4 
+		L118.5,230.3 L118.5,230.4 L118.5,230.3 L118.5,230.4 L118.5,230.3 L118.6,230.4 L118.6,230.3 L118.6,230.4 
+		L118.6,230.3 L118.6,230.4 L118.7,230.3 L118.7,230.4 L118.7,230.3 L118.7,230.4 L118.8,230.4 L118.8,230.3 
+		L118.8,230.4 L118.8,230.3 L118.8,230.4 L118.9,230.4 L118.9,230.3 L118.9,230.4 L118.9,230.3 L118.9,230.4 
+		L119.0,230.3 L119.0,230.4 L119.1,230.4 L119.1,230.3 L119.1,230.4 L119.2,230.4 L119.3,230.4 L119.4,230.4 
+		L119.5,230.4 L119.6,230.4 L119.7,230.4 L119.8,230.4 L119.9,230.4 L119.9,230.2 L119.9,230.3 L120.0,230.6 
+		L120.0,229.8 L120.0,229.9 L120.0,231.6 L120.0,226.8 L120.0,225.1 L120.0,272.0 L120.0,153.5 L120.1,190.0 
+		L120.1,225.1 L120.1,233.9 L120.1,231.8 L120.1,229.1 L120.1,229.4 L120.1,229.8 L120.1,229.7 L120.1,230.8 
+		L120.2,231.0 L120.2,229.9 L120.2,229.1 L120.2,230.1 L120.2,230.4 L120.2,230.3 L120.2,230.4 L120.3,230.4 
+		L120.3,230.3 L120.3,230.4 L120.3,230.3 L120.4,230.4 L120.4,230.3 L120.4,230.4 L120.4,230.3 L120.4,230.4 
+		L120.5,230.4 L120.6,230.4 L120.7,230.4 L120.8,230.4 L120.9,230.4 L121.0,230.4 L121.1,230.4 L121.2,230.4 
+		L121.2,230.3 L121.2,230.4 L121.3,230.4 L121.4,230.4 L121.5,230.4 L121.6,230.4 L121.7,230.4 L121.8,230.4 
+		L121.9,230.4 L122.0,230.4 L122.1,230.3 L122.1,230.4 L122.2,230.4 L122.3,230.4 L122.4,230.4 L122.4,230.3 
+		L122.4,230.4 L122.5,230.4 L122.6,230.4 L122.7,230.4 L122.8,230.4 L122.9,230.4 L123.0,230.4 L123.1,230.4 
+		L123.2,230.4 L123.3,230.4 L123.4,230.4 L123.5,230.4 L123.6,230.4 L123.7,230.4 L123.7,230.3 L123.7,230.4 
+		L123.8,230.4 L123.8,230.3 L123.8,230.4 L123.8,230.3 L123.8,230.4 L123.9,230.4 L123.9,230.3 L123.9,230.4 
+		L124.0,230.4 L124.0,230.3 L124.0,230.4 L124.1,230.4 L124.1,230.3 L124.1,230.4 L124.2,230.3 L124.2,230.4 
+		L124.2,230.3 L124.2,230.4 L124.3,230.4 L124.3,230.3 L124.3,230.4 L124.3,230.3 L124.4,230.4 L124.4,230.3 
+		L124.4,230.4 L124.5,230.3 L124.5,230.4 L124.5,230.3 L124.5,230.4 L124.6,230.4 L124.6,230.3 L124.6,230.4 
+		L124.6,230.3 L124.6,230.4 L124.7,230.4 L124.7,230.3 L124.7,230.4 L124.7,230.3 L124.7,230.4 L124.8,230.4 
+		L124.8,230.3 L124.8,230.4 L124.9,230.4 L124.9,230.3 L124.9,230.4 L124.9,230.3 L124.9,230.4 L124.9,230.3 
+		L124.9,230.4 L124.9,230.3 L124.9,230.4 L125.0,230.4 L125.0,230.3 L125.0,230.4 L125.0,230.3 L125.0,230.4 
+		L125.1,230.4 L125.1,230.3 L125.1,230.4 L125.1,230.3 L125.1,230.4 L125.2,230.4 L125.3,230.4 L125.4,230.4 
+		L125.5,230.4 L125.6,230.4 L125.7,230.4 L125.8,230.4 L125.9,230.4 L125.9,230.1 L125.9,230.7 L126.0,230.6 
+		L126.0,229.9 L126.0,230.0 L126.0,231.2 L126.0,231.1 L126.0,228.4 L126.0,228.3 L126.0,238.6 L126.0,255.5 
+		L126.1,354.9 L126.1,206.1 L126.1,238.4 L126.1,232.2 L126.1,228.7 L126.1,230.1 L126.1,230.8 L126.1,230.6 
+		L126.1,230.2 L126.1,229.8 L126.2,230.7 L126.2,231.0 L126.2,229.6 L126.2,230.8 L126.2,230.2 L126.2,230.3 
+		L126.2,230.4 L126.2,230.3 L126.3,230.4 L126.3,230.3 L126.3,230.4 L126.4,230.4 L126.4,230.3 L126.4,230.4 
+		L126.5,230.4 L126.6,230.4 L126.7,230.4 L126.8,230.4 L126.9,230.4 L127.0,230.4 L127.1,230.4 L127.2,230.4 
+		L127.3,230.4 L127.4,230.4 L127.5,230.4 L127.6,230.4 L127.7,230.4 L127.8,230.4 L127.9,230.4 L127.9,230.3 
+		L127.9,230.4 L128.0,230.4 L128.1,230.4 L128.2,230.4 L128.3,230.4 L128.4,230.4 L128.5,230.4 L128.6,230.4 
+		L128.7,230.4 L128.8,230.4 L128.9,230.4 L129.0,230.4 L129.1,230.4 L129.2,230.4 L129.3,230.4 L129.4,230.4 
+		L129.5,230.4 L129.6,230.4 L129.7,230.4 L129.8,230.4 L129.8,230.3 L129.8,230.4 L129.9,230.4 L129.9,230.3 
+		L129.9,230.4 L130.0,230.4 L130.1,230.4 L130.1,230.3 L130.1,230.4 L130.2,230.3 L130.2,230.4 L130.3,230.4 
+		L130.3,230.3 L130.3,230.4 L130.3,230.3 L130.3,230.4 L130.4,230.4 L130.4,230.3 L130.4,230.4 L130.4,230.3 
+		L130.4,230.4 L130.5,230.4 L130.5,230.3 L130.5,230.4 L130.5,230.3 L130.5,230.4 L130.6,230.4 L130.6,230.3 
+		L130.6,230.4 L130.6,230.3 L130.6,230.4 L130.7,230.4 L130.7,230.3 L130.8,230.4 L130.8,230.3 L130.8,230.4 
+		L130.8,230.3 L130.8,230.4 L130.9,230.4 L130.9,230.3 L130.9,230.4 L130.9,230.3 L130.9,230.4 L131.0,230.3 
+		L131.0,230.4 L131.1,230.4 L131.1,230.3 L131.1,230.4 L131.2,230.4 L131.3,230.4 L131.4,230.4 L131.5,230.4 
+		L131.6,230.4 L131.7,230.4 L131.8,230.4 L131.9,230.4 L131.9,230.5 L132.0,230.4 L132.0,230.1 L132.0,230.2 
+		L132.0,230.9 L132.0,230.8 L132.0,229.1 L132.0,229.2 L132.0,233.9 L132.0,235.2 L132.0,187.7 L132.1,302.4 
+		L132.1,271.7 L132.1,235.3 L132.1,226.7 L132.1,229.0 L132.1,231.7 L132.1,231.3 L132.1,230.9 L132.1,231.0 
+		L132.1,229.9 L132.2,229.7 L132.2,230.8 L132.2,231.6 L132.2,230.6 L132.2,230.7 L132.2,230.3 L132.2,230.4 
+		L132.3,230.3 L132.3,230.4 L132.3,230.3 L132.3,230.4 L132.4,230.3 L132.4,230.4 L132.5,230.4 L132.6,230.4 
+		L132.7,230.4 L132.8,230.4 L132.9,230.4 L133.0,230.4 L133.1,230.4 L133.2,230.4 L133.3,230.4 L133.4,230.4 
+		L133.5,230.4 L133.6,230.4 L133.7,230.4 L133.8,230.4 L133.9,230.4 L133.9,230.3 L133.9,230.4 L134.0,230.4 
+		L134.1,230.4 L134.2,230.4 L134.3,230.4 L134.4,230.4 L134.5,230.4 L134.6,230.4 L134.7,230.4 L134.7,230.3 
+		L134.7,230.4 L134.8,230.4 L134.8,230.3 L134.8,230.4 L134.9,230.4 L135.0,230.4 L135.1,230.4 L135.2,230.4 
+		L135.3,230.4 L135.4,230.4 L135.5,230.4 L135.6,230.4 L135.6,230.3 L135.6,230.4 L135.7,230.4 L135.8,230.4 
+		L135.9,230.4 L135.9,230.3 L135.9,230.4 L136.0,230.4 L136.0,230.3 L136.0,230.4 L136.0,230.3 L136.0,230.4 
+		L136.0,230.3 L136.0,230.4 L136.0,230.3 L136.1,230.3 L136.1,230.4 L136.2,230.4 L136.2,230.3 L136.2,230.4 
+		L136.2,230.3 L136.2,230.4 L136.3,230.3 L136.3,230.4 L136.3,230.3 L136.3,230.4 L136.4,230.4 L136.4,230.3 
+		L136.4,230.4 L136.4,230.3 L136.5,230.4 L136.5,230.3 L136.5,230.4 L136.5,230.3 L136.5,230.4 L136.6,230.3 
+		L136.6,230.4 L136.6,230.3 L136.6,230.4 L136.6,230.3 L136.7,230.4 L136.7,230.3 L136.7,230.4 L136.8,230.3 
+		L136.8,230.4 L136.8,230.3 L136.8,230.4 L136.8,230.3 L136.8,230.4 L136.9,230.4 L136.9,230.3 L136.9,230.4 
+		L136.9,230.3 L136.9,230.4 L136.9,230.3 L136.9,230.4 L137.0,230.4 L137.0,230.3 L137.0,230.4 L137.1,230.3 
+		L137.1,230.4 L137.2,230.4 L137.3,230.4 L137.4,230.4 L137.5,230.4 L137.6,230.4 L137.7,230.4 L137.8,230.4 
+		L137.9,230.4 L137.9,230.6 L138.0,230.0 L138.0,230.1 L138.0,230.8 L138.0,230.7 L138.0,229.5 L138.0,229.7 
+		L138.0,232.3 L138.0,221.9 L138.0,206.8 L138.1,103.0 L138.1,253.0 L138.1,222.1 L138.1,228.7 L138.1,232.1 
+		L138.1,230.6 L138.1,229.9 L138.1,230.1 L138.1,230.4 L138.2,230.9 L138.2,230.1 L138.2,229.7 L138.2,231.0 
+		L138.2,229.9 L138.2,230.5 L138.2,230.4 L138.2,230.3 L138.2,230.4 L138.3,230.4 L138.3,230.3 L138.3,230.4 
+		L138.3,230.3 L138.4,230.3 L138.4,230.4 L138.4,230.3 L138.4,230.4 L138.5,230.4 L138.6,230.4 L138.6,230.3 
+		L138.6,230.4 L138.7,230.4 L138.8,230.4 L138.9,230.4 L139.0,230.4 L139.1,230.4 L139.2,230.4 L139.3,230.4 
+		L139.4,230.4 L139.5,230.4 L139.6,230.4 L139.7,230.4 L139.8,230.4 L139.9,230.4 L140.0,230.4 L140.1,230.4 
+		L140.2,230.4 L140.3,230.4 L140.4,230.4 L140.5,230.4 L140.6,230.4 L140.7,230.4 L140.8,230.4 L140.9,230.4 
+		L141.0,230.4 L141.1,230.4 L141.2,230.4 L141.3,230.4 L141.4,230.4 L141.5,230.4 L141.6,230.4 L141.7,230.4 
+		L141.8,230.4 L141.9,230.4 L142.0,230.4 L142.1,230.4 L142.2,230.3 L142.2,230.4 L142.2,230.3 L142.2,230.4 
+		L142.2,230.3 L142.2,230.4 L142.3,230.4 L142.4,230.4 L142.5,230.4 L142.5,230.3 L142.5,230.4 L142.5,230.3 
+		L142.5,230.4 L142.5,230.3 L142.6,230.4 L142.7,230.3 L142.7,230.4 L142.7,230.3 L142.7,230.4 L142.8,230.4 
+		L142.8,230.3 L142.8,230.4 L142.8,230.3 L142.8,230.4 L142.8,230.3 L142.9,230.4 L142.9,230.3 L142.9,230.4 
+		L142.9,230.3 L142.9,230.4 L142.9,230.3 L142.9,230.4 L143.0,230.4 L143.0,230.3 L143.0,230.4 L143.0,230.3 
+		L143.1,230.4 L143.1,230.3 L143.1,230.4 L143.2,230.4 L143.3,230.4 L143.4,230.4 L143.5,230.4 L143.6,230.4 
+		L143.7,230.4 L143.8,230.4 L143.9,230.4 L143.9,230.2 L144.0,230.3 L144.0,230.6 L144.0,230.5 L144.0,229.8 
+		L144.0,229.9 L144.0,231.6 L144.0,231.4 L144.0,226.7 L144.0,225.8 L144.1,273.9 L144.1,163.2 L144.1,188.2 
+		L144.1,225.7 L144.1,234.0 L144.1,231.7 L144.1,229.0 L144.1,229.4 L144.1,229.8 L144.1,229.7 L144.2,230.8 
+		L144.2,231.0 L144.2,230.0 L144.2,229.1 L144.2,230.1 L144.2,230.0 L144.2,230.4 L144.2,230.3 L144.3,230.4 
+		L144.3,230.3 L144.3,230.4 L144.3,230.3 L144.4,230.3 L144.4,230.4 L144.4,230.3 L144.4,230.4 L144.4,230.3 
+		L144.4,230.4 L144.5,230.4 L144.6,230.4 L144.7,230.4 L144.8,230.4 L144.8,230.3 L144.8,230.4 L144.9,230.4 
+		L145.0,230.4 L145.1,230.4 L145.2,230.4 L145.2,230.3 L145.2,230.4 L145.3,230.4 L145.4,230.4 L145.5,230.4 
+		L145.6,230.4 L145.7,230.4 L145.8,230.4 L145.9,230.4 L146.0,230.4 L146.1,230.4 L146.1,230.3 L146.1,230.4 
+		L146.2,230.4 L146.2,230.3 L146.2,230.4 L146.3,230.4 L146.4,230.4 L146.5,230.4 L146.6,230.4 L146.7,230.4 
+		L146.8,230.4 L146.9,230.4 L147.0,230.4 L147.0,230.3 L147.0,230.4 L147.1,230.4 L147.2,230.4 L147.3,230.4 
+		L147.4,230.4 L147.5,230.4 L147.6,230.4 L147.7,230.4 L147.8,230.4 L147.8,230.3 L147.8,230.4 L147.9,230.4 
+		L148.0,230.4 L148.0,230.3 L148.0,230.4 L148.1,230.4 L148.1,230.3 L148.1,230.4 L148.1,230.3 L148.2,230.3 
+		L148.2,230.4 L148.2,230.3 L148.2,230.4 L148.2,230.3 L148.2,230.4 L148.3,230.3 L148.3,230.4 L148.3,230.3 
+		L148.3,230.4 L148.3,230.3 L148.3,230.4 L148.4,230.4 L148.4,230.3 L148.4,230.4 L148.4,230.3 L148.4,230.4 
+		L148.5,230.4 L148.5,230.3 L148.5,230.4 L148.5,230.3 L148.6,230.4 L148.6,230.3 L148.6,230.4 L148.6,230.3 
+		L148.7,230.4 L148.7,230.3 L148.7,230.4 L148.7,230.3 L148.8,230.4 L148.8,230.3 L148.8,230.4 L148.8,230.3 
+		L148.8,230.4 L148.9,230.4 L148.9,230.3 L148.9,230.4 L148.9,230.3 L148.9,230.4 L148.9,230.3 L148.9,230.4 
+		L148.9,230.3 L149.0,230.3 L149.0,230.4 L149.0,230.3 L149.0,230.4 L149.1,230.4 L149.1,230.3 L149.1,230.4 
+		L149.2,230.4 L149.3,230.4 L149.4,230.4 L149.5,230.4 L149.6,230.4 L149.7,230.4 L149.8,230.4 L149.9,230.4 
+		L149.9,230.1 L150.0,230.7 L150.0,230.6 L150.0,229.9 L150.0,230.0 L150.0,231.2 L150.0,231.0 L150.0,228.3 
+		L150.0,228.6 L150.0,239.0 L150.1,252.2 L150.1,360.3 L150.1,209.3 L150.1,238.8 L150.1,231.9 L150.1,228.6 
+		L150.1,230.2 L150.1,230.8 L150.1,230.6 L150.1,230.3 L150.2,229.8 L150.2,230.6 L150.2,231.1 L150.2,229.7 
+		L150.2,230.8 L150.2,230.2 L150.2,230.3 L150.2,230.4 L150.3,230.3 L150.3,230.4 L150.3,230.3 L150.4,230.4 
+		L150.4,230.3 L150.4,230.4 L150.5,230.4 L150.6,230.4 L150.7,230.4 L150.8,230.4 L150.9,230.4 L151.0,230.4 
+		L151.1,230.4 L151.2,230.4 L151.3,230.4 L151.4,230.4 L151.5,230.4 L151.6,230.4 L151.7,230.4 L151.8,230.4 
+		L151.9,230.4 L151.9,230.3 L152.0,230.4 L152.1,230.4 L152.2,230.4 L152.3,230.4 L152.4,230.4 L152.5,230.4 
+		L152.6,230.4 L152.7,230.4 L152.8,230.4 L152.9,230.4 L153.0,230.4 L153.1,230.4 L153.2,230.4 L153.3,230.4 
+		L153.4,230.4 L153.5,230.4 L153.6,230.4 L153.7,230.4 L153.8,230.4 L153.9,230.4 L153.9,230.3 L153.9,230.4 
+		L154.0,230.4 L154.0,230.3 L154.0,230.4 L154.0,230.3 L154.0,230.4 L154.1,230.4 L154.1,230.3 L154.1,230.4 
+		L154.2,230.3 L154.2,230.4 L154.2,230.3 L154.2,230.4 L154.2,230.3 L154.3,230.4 L154.4,230.4 L154.4,230.3 
+		L154.4,230.4 L154.5,230.4 L154.5,230.3 L154.5,230.4 L154.6,230.4 L154.6,230.3 L154.6,230.4 L154.6,230.3 
+		L154.6,230.4 L154.7,230.4 L154.7,230.3 L154.7,230.4 L154.7,230.3 L154.8,230.3 L154.8,230.4 L154.8,230.3 
+		L154.8,230.4 L154.8,230.3 L154.8,230.4 L154.9,230.4 L154.9,230.3 L154.9,230.4 L155.0,230.3 L155.0,230.4 
+		L155.0,230.3 L155.0,230.4 L155.1,230.4 L155.1,230.3 L155.1,230.4 L155.2,230.4 L155.3,230.4 L155.4,230.4 
+		L155.5,230.4 L155.6,230.4 L155.7,230.4 L155.8,230.4 L155.9,230.4 L156.0,230.5 L156.0,230.4 L156.0,230.0 
+		L156.0,230.2 L156.0,231.0 L156.0,230.7 L156.0,229.1 L156.0,229.4 L156.0,234.1 L156.0,234.6 L156.1,186.0 
+		L156.1,292.5 L156.1,273.3 L156.1,234.7 L156.1,226.6 L156.1,229.1 L156.1,231.7 L156.1,231.2 L156.1,230.9 
+		L156.2,231.0 L156.2,229.9 L156.2,229.7 L156.2,230.7 L156.2,231.6 L156.2,230.6 L156.2,230.7 L156.2,230.3 
+		L156.2,230.4 L156.3,230.4 L156.3,230.3 L156.3,230.4 L156.3,230.3 L156.3,230.4 L156.4,230.4 L156.4,230.3 
+		L156.4,230.4 L156.5,230.4 L156.6,230.4 L156.7,230.4 L156.8,230.4 L156.9,230.4 L157.0,230.4 L157.1,230.4 
+		L157.2,230.4 L157.3,230.4 L157.4,230.4 L157.5,230.4 L157.6,230.4 L157.7,230.4 L157.8,230.4 L157.9,230.4 
+		L157.9,230.3 L157.9,230.4 L157.9,230.3 L158.0,230.3 L158.0,230.4 L158.0,230.3 L158.0,230.4 L158.1,230.4 
+		L158.2,230.4 L158.2,230.3 L158.2,230.4 L158.3,230.4 L158.4,230.4 L158.5,230.4 L158.5,230.3 L158.5,230.4 
+		L158.6,230.4 L158.7,230.4 L158.8,230.4 L158.8,230.3 L158.8,230.4 L158.9,230.4 L159.0,230.4 L159.1,230.4 
+		L159.2,230.4 L159.3,230.4 L159.4,230.4 L159.5,230.4 L159.6,230.4 L159.6,230.3 L159.6,230.4 L159.7,230.4 
+		L159.8,230.4 L159.9,230.4 L159.9,230.3 L159.9,230.4 L159.9,230.3 L159.9,230.4 L160.0,230.4 L160.1,230.4 
+		L160.1,230.3 L160.2,230.4 L160.2,230.3 L160.2,230.4 L160.2,230.3 L160.2,230.4 L160.2,230.3 L160.2,230.4 
+		L160.3,230.4 L160.3,230.3 L160.3,230.4 L160.3,230.3 L160.3,230.4 L160.3,230.3 L160.3,230.4 L160.4,230.3 
+		L160.4,230.4 L160.4,230.3 L160.4,230.4 L160.4,230.3 L160.4,230.4 L160.4,230.3 L160.4,230.4 L160.5,230.4 
+		L160.5,230.3 L160.5,230.4 L160.5,230.3 L160.5,230.4 L160.5,230.3 L160.6,230.3 L160.6,230.4 L160.6,230.3 
+		L160.6,230.4 L160.7,230.3 L160.7,230.4 L160.7,230.3 L160.8,230.3 L160.8,230.4 L160.8,230.3 L160.8,230.4 
+		L160.9,230.4 L160.9,230.3 L160.9,230.4 L160.9,230.3 L160.9,230.4 L160.9,230.3 L160.9,230.4 L160.9,230.3 
+		L161.0,230.4 L161.0,230.3 L161.0,230.4 L161.0,230.3 L161.0,230.4 L161.0,230.3 L161.1,230.3 L161.1,230.4 
+		L161.1,230.3 L161.1,230.4 L161.2,230.4 L161.3,230.4 L161.4,230.4 L161.5,230.4 L161.6,230.4 L161.7,230.4 
+		L161.8,230.4 L161.9,230.4 L162.0,230.6 L162.0,230.0 L162.0,230.1 L162.0,230.9 L162.0,230.7 L162.0,229.5 
+		L162.0,229.8 L162.0,232.4 L162.0,232.0 L162.0,221.6 L162.1,210.2 L162.1,98.0 L162.1,249.8 L162.1,221.8 
+		L162.1,229.0 L162.1,232.2 L162.1,230.5 L162.1,229.8 L162.1,230.1 L162.2,230.4 L162.2,230.9 L162.2,230.1 
+		L162.2,229.6 L162.2,230.9 L162.2,229.9 L162.2,230.5 L162.2,230.4 L162.2,230.3 L162.3,230.4 L162.3,230.3 
+		L162.3,230.4 L162.4,230.4 L162.4,230.3 L162.4,230.4 L162.4,230.3 L162.5,230.4 L162.6,230.4 L162.6,230.3 
+		L162.6,230.4 L162.7,230.4 L162.8,230.4 L162.9,230.4 L163.0,230.4 L163.1,230.4 L163.2,230.4 L163.2,230.3 
+		L163.2,230.4 L163.3,230.4 L163.4,230.4 L163.5,230.4 L163.6,230.4 L163.7,230.4 L163.8,230.4 L163.9,230.4 
+		L164.0,230.4 L164.1,230.4 L164.2,230.4 L164.3,230.4 L164.4,230.4 L164.5,230.4 L164.6,230.4 L164.7,230.4 
+		L164.8,230.4 L164.9,230.4 L165.0,230.4 L165.1,230.4 L165.2,230.4 L165.3,230.4 L165.4,230.4 L165.5,230.4 
+		L165.6,230.4 L165.7,230.4 L165.8,230.4 L165.9,230.4 L166.0,230.4 L166.1,230.4 L166.1,230.3 L166.1,230.4 
+		L166.2,230.4 L166.2,230.3 L166.2,230.4 L166.3,230.4 L166.4,230.4 L166.4,230.3 L166.4,230.4 L166.5,230.4 
+		L166.6,230.3 L166.6,230.4 L166.6,230.3 L166.6,230.4 L166.7,230.4 L166.7,230.3 L166.7,230.4 L166.7,230.3 
+		L166.8,230.4 L166.8,230.3 L166.8,230.4 L166.8,230.3 L166.9,230.4 L166.9,230.3 L166.9,230.4 L166.9,230.3 
+		L166.9,230.4 L167.0,230.3 L167.0,230.4 L167.0,230.3 L167.0,230.4 L167.0,230.3 L167.1,230.4 L167.2,230.4 
+		L167.3,230.4 L167.4,230.4 L167.5,230.4 L167.6,230.4 L167.7,230.4 L167.8,230.4 L167.9,230.4 L168.0,230.2 
+		L168.0,230.4 L168.0,230.7 L168.0,230.5 L168.0,229.7 L168.0,230.0 L168.0,231.7 L168.0,231.3 L168.0,226.5 
+		L168.1,226.5 L168.1,275.5 L168.1,173.2 L168.1,186.6 L168.1,226.4 L168.1,234.2 L168.1,231.5 L168.1,229.0 
+		L168.1,229.5 L168.1,229.8 L168.2,229.7 L168.2,230.7 L168.2,231.0 L168.2,230.0 L168.2,229.0 L168.2,230.2 
+		L168.2,230.0 L168.2,230.4 L168.3,230.3 L168.3,230.4 L168.3,230.3 L168.3,230.4 L168.4,230.3 L168.4,230.4 
+		L168.4,230.3 L168.5,230.4 L168.6,230.4 L168.7,230.4 L168.8,230.4 L168.8,230.3 L168.8,230.4 L168.9,230.4 
+		L169.0,230.4 L169.1,230.4 L169.2,230.4 L169.2,230.3 L169.2,230.4 L169.3,230.4 L169.4,230.4 L169.5,230.4 
+		L169.6,230.4 L169.7,230.4 L169.8,230.4 L169.9,230.4 L170.0,230.4 L170.1,230.4 L170.2,230.4 L170.3,230.4 
+		L170.3,230.3 L170.3,230.4 L170.3,230.3 L170.3,230.4 L170.4,230.4 L170.4,230.3 L170.4,230.4 L170.5,230.4 
+		L170.6,230.4 L170.7,230.4 L170.8,230.4 L170.9,230.4 L171.0,230.4 L171.1,230.4 L171.2,230.4 L171.3,230.4 
+		L171.4,230.4 L171.5,230.4 L171.6,230.4 L171.7,230.4 L171.7,230.3 L171.8,230.4 L171.9,230.3 L171.9,230.4 
+		L172.0,230.3 L172.0,230.4 L172.0,230.3 L172.0,230.4 L172.0,230.3 L172.1,230.4 L172.1,230.3 L172.1,230.4 
+		L172.2,230.4 L172.2,230.3 L172.2,230.4 L172.2,230.3 L172.2,230.4 L172.3,230.4 L172.3,230.3 L172.3,230.4 
+		L172.3,230.3 L172.3,230.4 L172.3,230.3 L172.4,230.4 L172.4,230.3 L172.4,230.4 L172.5,230.4 L172.5,230.3 
+		L172.5,230.4 L172.5,230.3 L172.5,230.4 L172.5,230.3 L172.5,230.4 L172.5,230.3 L172.6,230.4 L172.6,230.3 
+		L172.6,230.4 L172.6,230.3 L172.7,230.4 L172.7,230.3 L172.7,230.4 L172.7,230.3 L172.7,230.4 L172.7,230.3 
+		L172.8,230.4 L172.8,230.3 L172.8,230.4 L172.9,230.4 L172.9,230.3 L172.9,230.4 L172.9,230.3 L172.9,230.4 
+		L173.0,230.3 L173.0,230.4 L173.0,230.3 L173.0,230.4 L173.0,230.3 L173.0,230.4 L173.0,230.3 L173.1,230.4 
+		L173.1,230.3 L173.1,230.4 L173.2,230.4 L173.3,230.4 L173.4,230.4 L173.5,230.4 L173.6,230.4 L173.7,230.4 
+		L173.8,230.4 L173.9,230.4 L174.0,230.4 L174.0,230.1 L174.0,230.7 L174.0,230.6 L174.0,229.8 L174.0,230.0 
+		L174.0,231.3 L174.0,230.9 L174.0,228.3 L174.0,228.8 L174.1,239.3 L174.1,248.7 L174.1,364.9 L174.1,212.6 
+		L174.1,239.1 L174.1,231.6 L174.1,228.5 L174.1,230.3 L174.1,230.9 L174.1,230.7 L174.2,230.3 L174.2,229.8 
+		L174.2,230.6 L174.2,231.1 L174.2,229.8 L174.2,230.8 L174.2,230.2 L174.2,230.3 L174.2,230.4 L174.3,230.4 
+		L174.3,230.3 L174.3,230.4 L174.3,230.3 L174.4,230.4 L174.4,230.3 L174.4,230.4 L174.5,230.4 L174.6,230.4 
+		L174.7,230.4 L174.8,230.4 L174.9,230.4 L175.0,230.4 L175.1,230.4 L175.2,230.4 L175.3,230.4 L175.4,230.4 
+		L175.5,230.4 L175.6,230.4 L175.7,230.4 L175.8,230.4 L175.9,230.4 L176.0,230.3 L176.0,230.4 L176.0,230.3 
+		L176.0,230.4 L176.1,230.3 L176.1,230.4 L176.1,230.3 L176.1,230.4 L176.2,230.4 L176.2,230.3 L176.2,230.4 
+		L176.3,230.4 L176.3,230.3 L176.4,230.4 L176.4,230.3 L176.4,230.4 L176.5,230.4 L176.6,230.4 L176.7,230.4 
+		L176.8,230.4 L176.9,230.4 L177.0,230.4 L177.1,230.4 L177.2,230.4 L177.3,230.4 L177.4,230.4 L177.5,230.4 
+		L177.6,230.4 L177.7,230.4 L177.8,230.4 L177.9,230.4 L178.0,230.4 L178.0,230.3 L178.0,230.4 L178.1,230.4 
+		L178.1,230.3 L178.1,230.4 L178.1,230.3 L178.2,230.4 L178.3,230.4 L178.3,230.3 L178.3,230.4 L178.3,230.3 
+		L178.3,230.4 L178.3,230.3 L178.3,230.4 L178.4,230.4 L178.4,230.3 L178.4,230.4 L178.5,230.3 L178.5,230.4 
+		L178.5,230.3 L178.6,230.4 L178.6,230.3 L178.6,230.4 L178.7,230.3 L178.7,230.4 L178.7,230.3 L178.7,230.4 
+		L178.8,230.4 L178.8,230.3 L178.8,230.4 L178.9,230.4 L178.9,230.3 L178.9,230.4 L178.9,230.3 L178.9,230.4 
+		L179.0,230.3 L179.0,230.4 L179.0,230.3 L179.0,230.4 L179.0,230.3 L179.0,230.4 L179.0,230.3 L179.1,230.4 
+		L179.1,230.3 L179.1,230.4 L179.1,230.3 L179.1,230.4 L179.2,230.4 L179.3,230.4 L179.4,230.4 L179.5,230.4 
+		L179.6,230.4 L179.7,230.4 L179.8,230.4 L179.9,230.4 L180.0,230.4 L180.0,230.5 L180.0,230.3 L180.0,230.0 
+		L180.0,230.2 L180.0,231.0 L180.0,230.7 L180.0,229.0 L180.0,229.5 L180.0,234.2 L180.1,233.9 L180.1,184.5 
+		L180.1,282.3 L180.1,274.8 L180.1,234.0 L180.1,226.5 L180.1,229.2 L180.1,231.7 L180.1,231.2 L180.2,230.9 
+		L180.2,231.0 L180.2,230.0 L180.2,229.7 L180.2,230.7 L180.2,231.7 L180.2,230.5 L180.2,230.7 L180.2,230.3 
+		L180.3,230.4 L180.3,230.3 L180.3,230.4 L180.3,230.3 L180.4,230.3 L180.4,230.4 L180.4,230.3 L180.4,230.4 
+		L180.5,230.4 L180.6,230.4 L180.6,230.3 L180.6,230.4 L180.7,230.4 L180.8,230.4 L180.9,230.4 L181.0,230.4 
+		L181.1,230.4 L181.2,230.4 L181.3,230.4 L181.4,230.4 L181.5,230.4 L181.6,230.4 L181.7,230.4 L181.8,230.4 
+		L181.9,230.4 L182.0,230.4 L182.0,230.3 L182.0,230.4 L182.1,230.4 L182.2,230.4 L182.3,230.4 L182.3,230.3 
+		L182.3,230.4 L182.4,230.3 L182.4,230.4 L182.4,230.3 L182.4,230.4 L182.5,230.4 L182.5,230.3 L182.5,230.4 
+		L182.6,230.4 L182.6,230.3 L182.6,230.4 L182.7,230.4 L182.7,230.3 L182.7,230.4 L182.8,230.3 L182.8,230.4 
+		L182.8,230.3 L182.8,230.4 L182.8,230.3 L182.9,230.4 L182.9,230.3 L182.9,230.4 L182.9,230.3 L183.0,230.4 
+		L183.0,230.3 L183.1,230.4 L183.2,230.4 L183.2,230.3 L183.2,230.4 L183.3,230.4 L183.4,230.4 L183.5,230.4 
+		L183.5,230.3 L183.5,230.4 L183.6,230.4 L183.6,230.3 L183.6,230.4 L183.6,230.3 L183.7,230.4 L183.7,230.3 
+		L183.7,230.4 L183.8,230.3 L183.8,230.4 L183.8,230.3 L183.8,230.4 L183.9,230.3 L183.9,230.4 L183.9,230.3 
+		L184.0,230.3 L184.0,230.4 L184.1,230.3 L184.1,230.4 L184.1,230.3 L184.2,230.4 L184.2,230.3 L184.2,230.4 
+		L184.2,230.3 L184.3,230.4 L184.3,230.3 L184.3,230.4 L184.4,230.3 L184.4,230.4 L184.4,230.3 L184.4,230.4 
+		L184.5,230.4 L184.5,230.3 L184.5,230.4 L184.5,230.3 L184.5,230.4 L184.5,230.3 L184.5,230.4 L184.6,230.4 
+		L184.6,230.3 L184.6,230.4 L184.6,230.3 L184.6,230.4 L184.6,230.3 L184.7,230.4 L184.7,230.3 L184.7,230.4 
+		L184.7,230.3 L184.7,230.4 L184.7,230.3 L184.7,230.4 L184.8,230.3 L184.8,230.4 L184.8,230.3 L184.8,230.4 
+		L184.8,230.3 L184.9,230.4 L184.9,230.3 L184.9,230.4 L185.0,230.4 L185.0,230.3 L185.0,230.4 L185.0,230.3 
+		L185.0,230.4 L185.1,230.4 L185.1,230.3 L185.1,230.4 L185.1,230.3 L185.1,230.4 L185.2,230.4 L185.3,230.4 
+		L185.4,230.4 L185.5,230.4 L185.6,230.4 L185.7,230.4 L185.8,230.4 L185.9,230.4 L186.0,230.4 L186.0,230.6 
+		L186.0,230.0 L186.0,230.1 L186.0,230.9 L186.0,230.6 L186.0,229.4 L186.0,229.9 L186.0,232.5 L186.1,231.7 
+		L186.1,221.3 L186.1,213.7 L186.1,93.9 L186.1,246.4 L186.1,221.5 L186.1,229.3 L186.1,232.2 L186.1,230.4 
+		L186.1,229.8 L186.2,230.0 L186.2,230.3 L186.2,231.0 L186.2,230.2 L186.2,229.6 L186.2,230.8 L186.2,229.9 
+		L186.2,230.5 L186.2,230.4 L186.2,230.3 L186.3,230.3 L186.3,230.4 L186.3,230.3 L186.3,230.4 L186.4,230.4 
+		L186.4,230.3 L186.4,230.4 L186.5,230.3 L186.5,230.4 L186.6,230.4 L186.6,230.3 L186.6,230.4 L186.7,230.4 
+		L186.8,230.4 L186.9,230.4 L187.0,230.4 L187.1,230.4 L187.2,230.4 L187.3,230.4 L187.4,230.4 L187.5,230.4 
+		L187.6,230.4 L187.7,230.4 L187.8,230.4 L187.9,230.4 L188.0,230.4 L188.1,230.4 L188.2,230.4 L188.3,230.4 
+		L188.4,230.4 L188.5,230.4 L188.6,230.4 L188.7,230.4 L188.8,230.4 L188.9,230.4 L189.0,230.4 L189.1,230.4 
+		L189.2,230.4 L189.3,230.4 L189.4,230.4 L189.5,230.4 L189.6,230.4 L189.7,230.4 L189.8,230.4 L189.9,230.4 
+		L190.0,230.4 L190.1,230.4 L190.1,230.3 L190.2,230.4 L190.2,230.3 L190.2,230.4 L190.2,230.3 L190.2,230.4 
+		L190.3,230.4 L190.3,230.3 L190.3,230.4 L190.4,230.4 L190.4,230.3 L190.4,230.4 L190.5,230.4 L190.5,230.3 
+		L190.5,230.4 L190.6,230.4 L190.6,230.3 L190.6,230.4 L190.6,230.3 L190.6,230.4 L190.6,230.3 L190.6,230.4 
+		L190.7,230.4 L190.7,230.3 L190.7,230.4 L190.7,230.3 L190.7,230.4 L190.8,230.4 L190.8,230.3 L190.8,230.4 
+		L190.8,230.3 L190.9,230.4 L190.9,230.3 L190.9,230.4 L190.9,230.3 L190.9,230.4 L191.0,230.4 L191.0,230.3 
+		L191.0,230.4 L191.0,230.3 L191.1,230.4 L191.1,230.3 L191.1,230.4 L191.1,230.3 L191.1,230.4 L191.2,230.4 
+		L191.3,230.4 L191.4,230.4 L191.5,230.4 L191.6,230.4 L191.7,230.4 L191.8,230.4 L191.9,230.4 L192.0,230.4 
+		L192.0,230.2 L192.0,230.4 L192.0,230.7 L192.0,230.4 L192.0,229.7 L192.0,230.1 L192.0,231.7 L192.0,231.1 
+		L192.1,226.4 L192.1,227.2 L192.1,276.9 L192.1,183.7 L192.1,185.3 L192.1,227.1 L192.1,234.3 L192.1,231.4 
+		L192.1,229.0 L192.1,229.5 L192.2,229.9 L192.2,229.7 L192.2,230.7 L192.2,231.0 L192.2,230.1 L192.2,229.0 
+		L192.2,230.2 L192.2,230.0 L192.2,230.4 L192.3,230.4 L192.3,230.3 L192.3,230.4 L192.3,230.3 L192.3,230.4 
+		L192.4,230.4 L192.4,230.3 L192.4,230.4 L192.4,230.3 L192.4,230.4 L192.5,230.4 L192.5,230.3 L192.5,230.4 
+		L192.6,230.4 L192.7,230.4 L192.8,230.4 L192.8,230.3 L192.8,230.4 L192.9,230.4 L193.0,230.4 L193.1,230.4 
+		L193.2,230.4 L193.2,230.3 L193.2,230.4 L193.3,230.4 L193.4,230.4 L193.5,230.4 L193.6,230.4 L193.7,230.4 
+		L193.8,230.4 L193.9,230.4 L194.0,230.3 L194.0,230.4 L194.1,230.4 L194.1,230.3 L194.1,230.4 L194.1,230.3 
+		L194.2,230.4 L194.2,230.3 L194.2,230.4 L194.3,230.4 L194.4,230.4 L194.5,230.3 L194.5,230.4 L194.5,230.3 
+		L194.5,230.4 L194.5,230.3 L194.6,230.4 L194.6,230.3 L194.7,230.4 L194.8,230.4 L194.8,230.3 L194.8,230.4 
+		L194.9,230.3 L194.9,230.4 L195.0,230.4 L195.0,230.3 L195.0,230.4 L195.1,230.4 L195.1,230.3 L195.1,230.4 
+		L195.2,230.4 L195.3,230.4 L195.4,230.4 L195.5,230.4 L195.6,230.4 L195.6,230.3 L195.6,230.4 L195.7,230.3 
+		L195.7,230.4 L195.7,230.3 L195.7,230.4 L195.8,230.4 L195.8,230.3 L195.8,230.4 L195.8,230.3 L195.8,230.4 
+		L195.8,230.3 L195.9,230.4 L195.9,230.3 L195.9,230.4 L195.9,230.3 L195.9,230.4 L195.9,230.3 L195.9,230.4 
+		L196.0,230.3 L196.0,230.4 L196.0,230.3 L196.0,230.4 L196.0,230.3 L196.1,230.4 L196.1,230.3 L196.1,230.4 
+		L196.1,230.3 L196.1,230.4 L196.2,230.3 L196.2,230.4 L196.2,230.3 L196.2,230.4 L196.2,230.3 L196.3,230.3 
+		L196.3,230.4 L196.3,230.3 L196.3,230.4 L196.4,230.4 L196.4,230.3 L196.5,230.4 L196.5,230.3 L196.5,230.4 
+		L196.5,230.3 L196.5,230.4 L196.5,230.3 L196.5,230.4 L196.5,230.3 L196.6,230.4 L196.6,230.3 L196.6,230.4 
+		L196.6,230.3 L196.7,230.4 L196.7,230.3 L196.7,230.4 L196.7,230.3 L196.7,230.4 L196.8,230.4 L196.8,230.3 
+		L196.8,230.4 L196.8,230.3 L196.8,230.4 L196.8,230.3 L196.8,230.4 L196.9,230.3 L196.9,230.4 L196.9,230.3 
+		L196.9,230.4 L196.9,230.3 L197.0,230.4 L197.0,230.3 L197.0,230.4 L197.0,230.3 L197.0,230.4 L197.0,230.3 
+		L197.0,230.4 L197.1,230.4 L197.1,230.3 L197.1,230.4 L197.2,230.4 L197.3,230.4 L197.4,230.4 L197.5,230.4 
+		L197.6,230.4 L197.7,230.4 L197.8,230.4 L197.9,230.4 L198.0,230.4 L198.0,230.1 L198.0,230.7 L198.0,230.6 
+		L198.0,229.8 L198.0,230.1 L198.0,231.3 L198.0,230.8 L198.0,228.2 L198.1,229.1 L198.1,239.6 L198.1,245.2 
+		L198.1,368.6 L198.1,216.1 L198.1,239.3 L198.1,231.3 L198.1,228.4 L198.1,230.4 L198.2,231.0 L198.2,230.7 
+		L198.2,230.4 L198.2,229.7 L198.2,230.5 L198.2,231.1 L198.2,229.9 L198.2,230.8 L198.2,230.2 L198.3,230.4 
+		L198.3,230.3 L198.3,230.4 L198.3,230.3 L198.4,230.3 L198.4,230.4 L198.4,230.3 L198.4,230.4 L198.5,230.4 
+		L198.6,230.4 L198.7,230.4 L198.8,230.4 L198.9,230.4 L199.0,230.4 L199.1,230.4 L199.2,230.4 L199.2,230.3 
+		L199.2,230.4 L199.3,230.4 L199.3,230.3 L199.4,230.4 L199.5,230.4 L199.6,230.4 L199.7,230.4 L199.8,230.4 
+		L199.9,230.4 L200.0,230.4 L200.1,230.4 L200.1,230.3 L200.1,230.4 L200.2,230.4 L200.2,230.3 L200.2,230.4 
+		L200.3,230.4 L200.3,230.3 L200.4,230.4 L200.5,230.4 L200.6,230.4 L200.7,230.4 L200.8,230.4 L200.9,230.4 
+		L201.0,230.4 L201.1,230.4 L201.2,230.4 L201.3,230.4 L201.4,230.4 L201.5,230.4 L201.6,230.4 L201.7,230.4 
+		L201.8,230.4 L201.9,230.4 L202.0,230.4 L202.1,230.4 L202.2,230.4 L202.3,230.3 L202.3,230.4 L202.4,230.4 
+		L202.4,230.3 L202.4,230.4 L202.4,230.3 L202.5,230.4 L202.6,230.4 L202.6,230.3 L202.6,230.4 L202.7,230.4 
+		L202.7,230.3 L202.7,230.4 L202.7,230.3 L202.7,230.4 L202.8,230.4 L202.8,230.3 L202.8,230.4 L202.8,230.3 
+		L202.8,230.4 L202.9,230.4 L202.9,230.3 L202.9,230.4 L202.9,230.3 L202.9,230.4 L202.9,230.3 L203.0,230.4 
+		L203.0,230.3 L203.0,230.4 L203.0,230.3 L203.0,230.4 L203.0,230.3 L203.0,230.4 L203.1,230.4 L203.1,230.3 
+		L203.1,230.4 L203.2,230.4 L203.3,230.4 L203.4,230.4 L203.5,230.4 L203.6,230.4 L203.7,230.4 L203.8,230.4 
+		L203.9,230.4 L204.0,230.4 L204.0,230.5 L204.0,230.3 L204.0,230.0 L204.0,230.3 L204.0,231.0 L204.0,230.6 
+		L204.0,229.0 L204.0,229.7 L204.1,234.3 L204.1,233.2 L204.1,183.3 L204.1,271.7 L204.1,275.9 L204.1,233.3 
+		L204.1,226.4 L204.1,229.4 L204.1,231.7 L204.2,231.1 L204.2,230.8 L204.2,231.0 L204.2,230.0 L204.2,229.7 
+		L204.2,230.6 L204.2,231.7 L204.2,230.5 L204.2,230.7 L204.2,230.3 L204.3,230.3 L204.3,230.4 L204.3,230.3 
+		L204.3,230.4 L204.3,230.3 L204.4,230.3 L204.4,230.4 L204.4,230.3 L204.4,230.4 L204.5,230.3 L204.5,230.4 
+		L204.6,230.4 L204.7,230.4 L204.8,230.4 L204.9,230.4 L205.0,230.4 L205.1,230.4 L205.2,230.4 L205.3,230.4 
+		L205.4,230.4 L205.5,230.4 L205.6,230.4 L205.7,230.4 L205.8,230.4 L205.8,230.3 L205.8,230.4 L205.9,230.4 
+		L206.0,230.4 L206.0,230.3 L206.0,230.4 L206.1,230.4 L206.2,230.4 L206.2,230.3 L206.2,230.4 L206.3,230.4 
+		L206.4,230.4 L206.5,230.4 L206.5,230.3 L206.5,230.4 L206.5,230.3 L206.6,230.4 L206.7,230.4 L206.7,230.3 
+		L206.7,230.4 L206.8,230.4 L206.8,230.3 L206.8,230.4 L206.9,230.3 L206.9,230.4 L207.0,230.4 L207.1,230.4 
+		L207.2,230.4 L207.2,230.3 L207.2,230.4 L207.3,230.4 L207.4,230.4 L207.5,230.4 L207.6,230.4 L207.6,230.3 
+		L207.6,230.4 L207.6,230.3 L207.6,230.4 L207.6,230.3 L207.7,230.4 L207.8,230.4 L207.8,230.3 L207.8,230.4 
+		L207.8,230.3 L207.8,230.4 L207.9,230.4 L207.9,230.3 L207.9,230.4 L208.0,230.4 L208.0,230.3 L208.0,230.4 
+		L208.0,230.3 L208.0,230.4 L208.0,230.3 L208.0,230.4 L208.1,230.4 L208.1,230.3 L208.1,230.4 L208.1,230.3 
+		L208.1,230.4 L208.1,230.3 L208.1,230.4 L208.1,230.3 L208.2,230.4 L208.2,230.3 L208.2,230.4 L208.3,230.4 
+		L208.3,230.3 L208.3,230.4 L208.4,230.3 L208.4,230.4 L208.4,230.3 L208.4,230.4 L208.4,230.3 L208.4,230.4 
+		L208.5,230.4 L208.5,230.3 L208.6,230.4 L208.6,230.3 L208.6,230.4 L208.7,230.4 L208.7,230.3 L208.7,230.4 
+		L208.7,230.3 L208.7,230.4 L208.7,230.3 L208.7,230.4 L208.7,230.3 L208.7,230.4 L208.8,230.4 L208.8,230.3 
+		L208.8,230.4 L208.8,230.3 L208.8,230.4 L208.8,230.3 L208.8,230.4 L208.8,230.3 L208.9,230.4 L208.9,230.3 
+		L208.9,230.4 L209.0,230.4 L209.0,230.3 L209.0,230.4 L209.0,230.3 L209.0,230.4 L209.0,230.3 L209.0,230.4 
+		L209.1,230.4 L209.1,230.3 L209.1,230.4 L209.1,230.3 L209.1,230.4 L209.2,230.4 L209.3,230.4 L209.4,230.4 
+		L209.5,230.4 L209.6,230.4 L209.7,230.4 L209.8,230.4 L209.9,230.4 L210.0,230.4 L210.0,230.6 L210.0,230.0 
+		L210.0,230.1 L210.0,230.9 L210.0,230.6 L210.0,229.4 L210.0,230.0 L210.1,232.5 L210.1,231.4 L210.1,221.0 
+		L210.1,217.3 L210.1,90.5 L210.1,242.9 L210.1,221.2 L210.1,229.6 L210.1,232.3 L210.1,230.3 L210.2,229.7 
+		L210.2,230.0 L210.2,230.3 L210.2,231.0 L210.2,230.2 L210.2,229.6 L210.2,230.7 L210.2,229.9 L210.2,230.4 
+		L210.3,230.5 L210.3,230.3 L210.3,230.4 L210.3,230.3 L210.3,230.4 L210.4,230.4 L210.4,230.3 L210.4,230.4 
+		L210.5,230.4 L210.5,230.3 L210.5,230.4 L210.6,230.4 L210.6,230.3 L210.6,230.4 L210.7,230.4 L210.8,230.4 
+		L210.9,230.4 L211.0,230.4 L211.1,230.4 L211.2,230.4 L211.3,230.4 L211.4,230.4 L211.5,230.4 L211.6,230.4 
+		L211.7,230.4 L211.8,230.4 L211.9,230.4 L212.0,230.4 L212.1,230.4 L212.2,230.4 L212.3,230.4 L212.4,230.4 
+		L212.5,230.4 L212.6,230.4 L212.7,230.4 L212.8,230.4 L212.9,230.4 L213.0,230.4 L213.1,230.4 L213.2,230.4 
+		L213.3,230.4 L213.4,230.4 L213.5,230.4 L213.6,230.4 L213.7,230.4 L213.8,230.4 L213.9,230.4 L213.9,230.3 
+		L213.9,230.4 L214.0,230.4 L214.1,230.4 L214.1,230.3 L214.1,230.4 L214.2,230.4 L214.2,230.3 L214.2,230.4 
+		L214.3,230.4 L214.3,230.3 L214.3,230.4 L214.4,230.4 L214.4,230.3 L214.4,230.4 L214.5,230.4 L214.5,230.3 
+		L214.5,230.4 L214.5,230.3 L214.5,230.4 L214.5,230.3 L214.5,230.4 L214.6,230.4 L214.6,230.3 L214.6,230.4 
+		L214.7,230.4 L214.7,230.3 L214.8,230.4 L214.8,230.3 L214.8,230.4 L214.9,230.4 L214.9,230.3 L214.9,230.4 
+		L215.0,230.4 L215.0,230.3 L215.0,230.4 L215.0,230.3 L215.0,230.4 L215.0,230.3 L215.0,230.4 L215.1,230.3 
+		L215.1,230.4 L215.1,230.3 L215.1,230.4 L215.1,230.3 L215.1,230.4 L215.2,230.4 L215.3,230.4 L215.4,230.4 
+		L215.5,230.4 L215.6,230.4 L215.7,230.4 L215.8,230.4 L215.9,230.4 L216.0,230.4 L216.0,230.2 L216.0,230.4 
+		L216.0,230.7 L216.0,230.4 L216.0,229.7 L216.0,230.1 L216.0,231.7 L216.1,230.9 L216.1,226.4 L216.1,227.9 
+		L216.1,277.9 L216.1,194.4 L216.1,184.3 L216.1,227.8 L216.1,234.3 L216.1,231.2 L216.1,229.0 L216.2,229.6 
+		L216.2,229.9 L216.2,229.7 L216.2,230.6 L216.2,231.0 L216.2,230.1 L216.2,229.0 L216.2,230.2 L216.2,230.0 
+		L216.3,230.4 L216.3,230.3 L216.3,230.4 L216.3,230.3 L216.3,230.4 L216.4,230.4 L216.4,230.3 L216.4,230.4 
+		L216.4,230.3 L216.4,230.4 L216.5,230.4 L216.5,230.3 L216.5,230.4 L216.6,230.4 L216.7,230.4 L216.8,230.4 
+		L216.8,230.3 L216.9,230.4 L217.0,230.4 L217.1,230.4 L217.2,230.4 L217.2,230.3 L217.2,230.4 L217.3,230.4 
+		L217.4,230.4 L217.5,230.4 L217.6,230.4 L217.7,230.4 L217.8,230.4 L217.9,230.4 L218.0,230.4 L218.0,230.3 
+		L218.0,230.4 L218.1,230.4 L218.2,230.4 L218.2,230.3 L218.3,230.4 L218.3,230.3 L218.3,230.4 L218.3,230.3 
+		L218.3,230.4 L218.4,230.4 L218.4,230.3 L218.4,230.4 L218.5,230.4 L218.6,230.4 L218.6,230.3 L218.6,230.4 
+		L218.6,230.3 L218.7,230.4 L218.8,230.4 L218.9,230.4 L218.9,230.3 L218.9,230.4 L219.0,230.4 L219.1,230.4 
+		L219.2,230.4 L219.3,230.4 L219.4,230.4 L219.5,230.4 L219.6,230.4 L219.7,230.4 L219.7,230.3 L219.7,230.4 
+		L219.7,230.3 L219.8,230.4 L219.8,230.3 L219.9,230.4 L220.0,230.4 L220.0,230.3 L220.0,230.4 L220.0,230.3 
+		L220.1,230.4 L220.1,230.3 L220.1,230.4 L220.1,230.3 L220.1,230.4 L220.1,230.3 L220.2,230.4 L220.2,230.3 
+		L220.2,230.4 L220.3,230.3 L220.3,230.4 L220.3,230.3 L220.3,230.4 L220.3,230.3 L220.3,230.4 L220.4,230.3 
+		L220.4,230.4 L220.4,230.3 L220.4,230.4 L220.4,230.3 L220.4,230.4 L220.5,230.4 L220.5,230.3 L220.5,230.4 
+		L220.6,230.4 L220.6,230.3 L220.6,230.4 L220.6,230.3 L220.6,230.4 L220.7,230.4 L220.7,230.3 L220.7,230.4 
+		L220.7,230.3 L220.7,230.4 L220.7,230.3 L220.7,230.4 L220.8,230.4 L220.8,230.3 L220.8,230.4 L220.8,230.3 
+		L220.9,230.4 L220.9,230.3 L220.9,230.4 L220.9,230.3 L220.9,230.4 L221.0,230.4 L221.0,230.3 L221.0,230.4 
+		L221.0,230.3 L221.1,230.3 L221.1,230.4 L221.1,230.3 L221.1,230.4 L221.1,230.3 L221.1,230.4 L221.2,230.4 
+		L221.3,230.4 L221.4,230.4 L221.5,230.4 L221.6,230.4 L221.7,230.4 L221.8,230.4 L221.9,230.4 L222.0,230.4 
+		L222.0,230.1 L222.0,230.7 L222.0,230.5 L222.0,229.8 L222.0,230.1 L222.0,231.3 L222.0,230.7 L222.1,228.2 
+		L222.1,229.5 L222.1,239.8 L222.1,241.6 L222.1,371.6 L222.1,219.6 L222.1,239.6 L222.1,231.0 L222.1,228.3 
+		L222.2,230.5 L222.2,231.0 L222.2,230.7 L222.2,230.4 L222.2,229.7 L222.2,230.5 L222.2,231.1 L222.2,230.0 
+		L222.2,230.8 L222.2,230.3 L222.3,230.2 L222.3,230.4 L222.3,230.3 L222.3,230.4 L222.3,230.3 L222.4,230.3 
+		L222.4,230.4 L222.4,230.3 L222.4,230.4 L222.5,230.4 L222.6,230.4 L222.7,230.4 L222.8,230.4 L222.9,230.4 
+		L223.0,230.4 L223.1,230.4 L223.2,230.4 L223.2,230.3 L223.2,230.4 L223.3,230.4 L223.4,230.4 L223.5,230.4 
+		L223.6,230.4 L223.7,230.4 L223.8,230.4 L223.9,230.4 L224.0,230.4 L224.0,230.3 L224.0,230.4 L224.0,230.3 
+		L224.0,230.4 L224.1,230.4 L224.2,230.4 L224.3,230.4 L224.3,230.3 L224.3,230.4 L224.4,230.4 L224.4,230.3 
+		L224.5,230.4 L224.6,230.4 L224.7,230.4 L224.8,230.4 L224.9,230.4 L225.0,230.4 L225.1,230.4 L225.2,230.4 
+		L225.3,230.4 L225.4,230.4 L225.5,230.4 L225.6,230.4 L225.7,230.4 L225.8,230.4 L225.9,230.4 L226.0,230.4 
+		L226.0,230.3 L226.1,230.4 L226.2,230.4 L226.2,230.3 L226.2,230.4 L226.3,230.4 L226.4,230.4 L226.4,230.3 
+		L226.4,230.4 L226.4,230.3 L226.4,230.4 L226.5,230.4 L226.5,230.3 L226.5,230.4 L226.5,230.3 L226.5,230.4 
+		L226.6,230.4 L226.7,230.3 L226.7,230.4 L226.7,230.3 L226.7,230.4 L226.7,230.3 L226.7,230.4 L226.8,230.4 
+		L226.9,230.3 L226.9,230.4 L226.9,230.3 L226.9,230.4 L226.9,230.3 L227.0,230.4 L227.0,230.3 L227.0,230.4 
+		L227.1,230.3 L227.1,230.4 L227.1,230.3 L227.1,230.4 L227.1,230.3 L227.2,230.4 L227.3,230.4 L227.4,230.4 
+		L227.5,230.4 L227.6,230.4 L227.7,230.4 L227.8,230.4 L227.9,230.4 L228.0,230.4 L228.0,230.5 L228.0,230.3 
+		L228.0,230.0 L228.0,230.3 L228.0,231.0 L228.0,230.5 L228.1,229.0 L228.1,229.8 L228.1,234.4 L228.1,232.5 
+		L228.1,182.3 L228.1,260.9 L228.1,276.8 L228.1,232.6 L228.1,226.4 L228.1,229.5 L228.2,231.7 L228.2,231.1 
+		L228.2,230.8 L228.2,231.0 L228.2,230.1 L228.2,229.7 L228.2,230.5 L228.2,231.8 L228.2,230.5 L228.2,230.7 
+		L228.3,230.3 L228.3,230.4 L228.3,230.3 L228.3,230.4 L228.3,230.3 L228.4,230.3 L228.4,230.4 L228.4,230.3 
+		L228.4,230.4 L228.5,230.4 L228.6,230.4 L228.7,230.4 L228.8,230.4 L228.9,230.4 L229.0,230.4 L229.0,230.3 
+		L229.0,230.4 L229.1,230.4 L229.2,230.4 L229.3,230.4 L229.4,230.4 L229.5,230.4 L229.6,230.4 L229.7,230.4 
+		L229.8,230.4 L229.9,230.4 L230.0,230.4 L230.1,230.4 L230.2,230.4 L230.3,230.4 L230.4,230.4 L230.4,230.3 
+		L230.4,230.4 L230.4,230.3 L230.5,230.4 L230.5,230.3 L230.5,230.4 L230.5,230.3 L230.5,230.4 L230.6,230.4 
+		L230.6,230.3 L230.6,230.4 L230.7,230.4 L230.7,230.3 L230.7,230.4 L230.8,230.4 L230.9,230.3 L230.9,230.4 
+		L231.0,230.4 L231.0,230.3 L231.0,230.4 L231.1,230.4 L231.2,230.4 L231.2,230.3 L231.3,230.4 L231.4,230.4 
+		L231.5,230.4 L231.6,230.4 L231.6,230.3 L231.6,230.4 L231.7,230.4 L231.7,230.3 L231.7,230.4 L231.7,230.3 
+		L231.7,230.4 L231.8,230.4 L231.9,230.4 L231.9,230.3 L231.9,230.4 L232.0,230.4 L232.0,230.3 L232.0,230.4 
+		L232.1,230.4 L232.1,230.3 L232.2,230.3 L232.2,230.4 L232.2,230.3 L232.2,230.4 L232.3,230.4 L232.3,230.3 
+		L232.3,230.4 L232.4,230.3 L232.4,230.4 L232.4,230.3 L232.4,230.4 L232.5,230.4 L232.5,230.3 L232.5,230.4 
+		L232.5,230.3 L232.6,230.4 L232.6,230.3 L232.6,230.4 L232.6,230.3 L232.6,230.4 L232.7,230.3 L232.7,230.4 
+		L232.7,230.3 L232.7,230.4 L232.7,230.3 L232.8,230.4 L232.8,230.3 L232.8,230.4 L232.8,230.3 L232.9,230.3 
+		L232.9,230.4 L232.9,230.3 L232.9,230.4 L232.9,230.3 L232.9,230.4 L233.0,230.4 L233.0,230.3 L233.0,230.4 
+		L233.1,230.4 L233.1,230.3 L233.1,230.4 L233.1,230.3 L233.1,230.4 L233.2,230.4 L233.3,230.4 L233.4,230.4 
+		L233.5,230.4 L233.6,230.4 L233.7,230.4 L233.8,230.4 L233.9,230.4 L234.0,230.4 L234.0,230.6 L234.0,230.0 
+		L234.0,230.2 L234.0,230.9 L234.0,230.5 L234.0,229.4 L234.1,230.1 L234.1,232.6 L234.1,231.1 L234.1,220.9 
+		L234.1,221.0 L234.1,87.9 L234.1,239.3 L234.1,221.0 L234.1,229.9 L234.1,232.4 L234.2,230.1 L234.2,229.7 
+		L234.2,229.9 L234.2,230.2 L234.2,231.0 L234.2,230.3 L234.2,229.6 L234.2,230.6 L234.2,229.9 L234.3,230.4 
+		L234.3,230.5 L234.3,230.3 L234.3,230.4 L234.3,230.3 L234.3,230.4 L234.4,230.4 L234.4,230.3 L234.4,230.4 
+		L234.5,230.4 L234.5,230.3 L234.5,230.4 L234.6,230.4 L234.6,230.3 L234.6,230.4 L234.7,230.4 L234.8,230.4 
+		L234.9,230.4 L235.0,230.4 L235.1,230.4 L235.2,230.4 L235.2,230.3 L235.2,230.4 L235.3,230.4 L235.4,230.4 
+		L235.5,230.4 L235.6,230.4 L235.7,230.4 L235.8,230.4 L235.9,230.4 L236.0,230.4 L236.1,230.4 L236.2,230.4 
+		L236.2,230.3 L236.2,230.4 L236.3,230.4 L236.4,230.3 L236.4,230.4 L236.5,230.4 L236.6,230.4 L236.7,230.4 
+		L236.8,230.4 L236.9,230.4 L237.0,230.4 L237.1,230.4 L237.2,230.4 L237.3,230.4 L237.4,230.4 L237.5,230.4 
+		L237.6,230.4 L237.7,230.4 L237.8,230.4 L237.9,230.4 L238.0,230.4 L238.0,230.3 L238.0,230.4 L238.1,230.4 
+		L238.1,230.3 L238.1,230.4 L238.2,230.4 L238.2,230.3 L238.2,230.4 L238.3,230.4 L238.4,230.3 L238.4,230.4 
+		L238.4,230.3 L238.4,230.4 L238.4,230.3 L238.5,230.4 L238.5,230.3 L238.5,230.4 L238.5,230.3 L238.6,230.4 
+		L238.6,230.3 L238.6,230.4 L238.7,230.4 L238.7,230.3 L238.7,230.4 L238.7,230.3 L238.8,230.4 L238.9,230.3 
+		L238.9,230.4 L238.9,230.3 L238.9,230.4 L238.9,230.3 L238.9,230.4 L238.9,230.3 L238.9,230.4 L239.0,230.3 
+		L239.0,230.4 L239.1,230.4 L239.1,230.3 L239.1,230.4 L239.2,230.4 L239.3,230.4 L239.4,230.4 L239.5,230.4 
+		L239.6,230.4 L239.7,230.4 L239.8,230.4 L239.9,230.4 L240.0,230.4 L240.0,230.1 L240.0,230.4 L240.0,230.7 
+		L240.0,230.4 L240.0,229.7 L240.0,230.2 L240.1,231.7 L240.1,230.8 L240.1,226.3 L240.1,228.6 L240.1,278.7 
+		L240.1,205.3 L240.1,183.5 L240.1,228.5 L240.1,234.4 L240.2,231.1 L240.2,229.0 L240.2,229.6 L240.2,229.9 
+		L240.2,229.7 L240.2,230.6 L240.2,231.0 L240.2,230.2 L240.2,228.9 L240.2,230.3 L240.3,230.0 L240.3,230.4 
+		L240.3,230.3 L240.3,230.4 L240.3,230.3 L240.3,230.4 L240.4,230.4 L240.4,230.3 L240.4,230.4 L240.4,230.3 
+		L240.4,230.4 L240.5,230.4 L240.5,230.3 L240.5,230.4 L240.6,230.4 L240.7,230.4 L240.8,230.4 L240.9,230.3 
+		L240.9,230.4 L241.0,230.4 L241.1,230.4 L241.2,230.4 L241.2,230.3 L241.2,230.4 L241.3,230.4 L241.4,230.4 
+		L241.5,230.4 L241.6,230.4 L241.7,230.4 L241.8,230.4 L241.9,230.4 L241.9,230.3 L241.9,230.4 L242.0,230.4 
+		L242.1,230.4 L242.1,230.3 L242.1,230.4 L242.2,230.4 L242.2,230.3 L242.2,230.4 L242.3,230.4 L242.3,230.3 
+		L242.3,230.4 L242.3,230.3 L242.3,230.4 L242.4,230.4 L242.4,230.3 L242.4,230.4 L242.4,230.3 L242.4,230.4 
+		L242.5,230.4 L242.6,230.4 L242.7,230.4 L242.7,230.3 L242.7,230.4 L242.7,230.3 L242.7,230.4 L242.8,230.4 
+		L242.9,230.4 L243.0,230.4 L243.1,230.4 L243.2,230.4 L243.3,230.4 L243.4,230.4 L243.5,230.4 L243.6,230.3 
+		L243.6,230.4 L243.6,230.3 L243.6,230.4 L243.7,230.3 L243.7,230.4 L243.8,230.4 L243.8,230.3 L243.8,230.4 
+		L243.9,230.4 L243.9,230.3 L243.9,230.4 L244.0,230.4 L244.0,230.3 L244.0,230.4 L244.1,230.3 L244.1,230.4 
+		L244.1,230.3 L244.1,230.4 L244.2,230.4 L244.2,230.3 L244.2,230.4 L244.2,230.3 L244.2,230.4 L244.2,230.3 
+		L244.3,230.4 L244.3,230.3 L244.3,230.4 L244.3,230.3 L244.4,230.4 L244.4,230.3 L244.4,230.4 L244.4,230.3 
+		L244.4,230.4 L244.4,230.3 L244.4,230.4 L244.5,230.4 L244.5,230.3 L244.5,230.4 L244.6,230.4 L244.6,230.3 
+		L244.6,230.4 L244.6,230.3 L244.7,230.4 L244.7,230.3 L244.7,230.4 L244.8,230.4 L244.8,230.3 L244.8,230.4 
+		L244.8,230.3 L244.8,230.4 L244.8,230.3 L244.9,230.3 L244.9,230.4 L244.9,230.3 L244.9,230.4 L244.9,230.3 
+		L244.9,230.4 L244.9,230.3 L244.9,230.4 L245.0,230.4 L245.0,230.3 L245.0,230.4 L245.0,230.3 L245.0,230.4 
+		L245.1,230.4 L245.1,230.3 L245.1,230.4 L245.1,230.3 L245.1,230.4 L245.2,230.4 L245.3,230.4 L245.4,230.4 
+		L245.5,230.4 L245.6,230.4 L245.7,230.4 L245.8,230.4 L245.9,230.4 L246.0,230.4 L246.0,230.1 L246.0,230.7 
+		L246.0,230.5 L246.0,229.8 L246.0,230.2 L246.1,231.3 L246.1,230.6 L246.1,228.1 L246.1,229.8 L246.1,239.9 
+		L246.1,237.8 L246.1,373.8 L246.1,223.2 L246.1,239.7 L246.1,230.7 L246.2,228.3 L246.2,230.6 L246.2,231.1 
+		L246.2,230.8 L246.2,230.5 L246.2,229.7 L246.2,230.4 L246.2,231.1 L246.2,230.1 L246.2,230.8 L246.3,230.3 
+		L246.3,230.2 L246.3,230.4 L246.3,230.3 L246.3,230.4 L246.4,230.3 L246.4,230.4 L246.4,230.3 L246.4,230.4 
+		L246.5,230.4 L246.6,230.4 L246.7,230.4 L246.8,230.4 L246.9,230.4 L247.0,230.4 L247.1,230.4 L247.2,230.4 
+		L247.3,230.4 L247.4,230.4 L247.5,230.4 L247.6,230.4 L247.7,230.4 L247.8,230.4 L247.9,230.4 L248.0,230.4 
+		L248.1,230.4 L248.2,230.4 L248.3,230.4 L248.4,230.3 L248.4,230.4 L248.4,230.3 L248.4,230.4 L248.5,230.4 
+		L248.6,230.4 L248.7,230.4 L248.8,230.4 L248.9,230.4 L249.0,230.4 L249.1,230.4 L249.2,230.4 L249.3,230.4 
+		L249.4,230.4 L249.5,230.4 L249.6,230.4 L249.7,230.4 L249.8,230.4 L249.9,230.4 L250.0,230.4 L250.1,230.4 
+		L250.1,230.3 L250.1,230.4 L250.2,230.4 L250.3,230.4 L250.3,230.3 L250.4,230.4 L250.4,230.3 L250.4,230.4 
+		L250.4,230.3 L250.5,230.4 L250.5,230.3 L250.5,230.4 L250.5,230.3 L250.5,230.4 L250.6,230.4 L250.6,230.3 
+		L250.6,230.4 L250.6,230.3 L250.6,230.4 L250.6,230.3 L250.7,230.3 L250.7,230.4 L250.7,230.3 L250.7,230.4 
+		L250.8,230.3 L250.8,230.4 L250.8,230.3 L250.8,230.4 L250.8,230.3 L250.8,230.4 L250.9,230.4 L250.9,230.3 
+		L250.9,230.4 L250.9,230.3 L251.0,230.4 L251.0,230.3 L251.0,230.4 L251.1,230.4 L251.1,230.3 L251.2,230.4 
+		L251.3,230.4 L251.4,230.4 L251.5,230.4 L251.6,230.4 L251.7,230.4 L251.8,230.4 L251.9,230.4 L252.0,230.4 
+		L252.0,230.6 L252.0,230.2 L252.0,230.0 L252.0,230.4 L252.0,231.0 L252.1,230.5 L252.1,228.9 L252.1,230.0 
+		L252.1,234.4 L252.1,231.7 L252.1,181.7 L252.1,249.9 L252.1,277.4 L252.1,231.9 L252.1,226.3 L252.2,229.7 
+		L252.2,231.7 L252.2,231.0 L252.2,230.8 L252.2,231.0 L252.2,230.1 L252.2,229.6 L252.2,230.5 L252.2,231.8 
+		L252.3,230.4 L252.3,230.7 L252.3,230.3 L252.3,230.4 L252.3,230.3 L252.3,230.4 L252.4,230.3 L252.4,230.4 
+		L252.4,230.3 L252.4,230.4 L252.5,230.4 L252.5,230.3 L252.5,230.4 L252.6,230.4 L252.7,230.4 L252.8,230.4 
+		L252.9,230.4 L253.0,230.4 L253.1,230.4 L253.2,230.4 L253.3,230.4 L253.4,230.4 L253.5,230.4 L253.6,230.4 
+		L253.7,230.4 L253.8,230.4 L253.9,230.4 L254.0,230.4 L254.1,230.4 L254.1,230.3 L254.1,230.4 L254.1,230.3 
+		L254.1,230.4 L254.1,230.3 L254.1,230.4 L254.2,230.4 L254.2,230.3 L254.2,230.4 L254.3,230.4 L254.4,230.4 
+		L254.5,230.4 L254.5,230.3 L254.5,230.4 L254.6,230.3 L254.6,230.4 L254.6,230.3 L254.6,230.4 L254.6,230.3 
+		L254.6,230.4 L254.7,230.4 L254.8,230.4 L254.8,230.3 L254.8,230.4 L254.8,230.3 L254.8,230.4 L254.9,230.4 
+		L254.9,230.3 L254.9,230.4 L255.0,230.4 L255.1,230.4 L255.2,230.4 L255.3,230.3 L255.3,230.4 L255.4,230.4 
+		L255.5,230.4 L255.6,230.4 L255.6,230.3 L255.6,230.4 L255.7,230.4 L255.7,230.3 L255.7,230.4 L255.7,230.3 
+		L255.7,230.4 L255.8,230.4 L255.8,230.3 L255.8,230.4 L255.8,230.3 L255.8,230.4 L255.9,230.4 L255.9,230.3 
+		L256.0,230.4 L256.0,230.3 L256.0,230.4 L256.0,230.3 L256.0,230.4 L256.1,230.4 L256.1,230.3 L256.1,230.4 
+		L256.1,230.3 L256.1,230.4 L256.1,230.3 L256.1,230.4 L256.2,230.3 L256.2,230.4 L256.2,230.3 L256.2,230.4 
+		L256.2,230.3 L256.3,230.3 L256.3,230.4 L256.3,230.3 L256.3,230.4 L256.4,230.4 L256.4,230.3 L256.4,230.4 
+		L256.4,230.3 L256.4,230.4 L256.5,230.3 L256.5,230.4 L256.5,230.3 L256.5,230.4 L256.5,230.3 L256.6,230.4 
+		L256.6,230.3 L256.6,230.4 L256.6,230.3 L256.7,230.3 L256.7,230.4 L256.7,230.3 L256.8,230.3 L256.8,230.4 
+		L256.8,230.3 L256.8,230.4 L256.8,230.3 L256.8,230.4 L256.8,230.3 L256.9,230.3 L256.9,230.4 L256.9,230.3 
+		L257.0,230.4 L257.0,230.3 L257.0,230.4 L257.0,230.3 L257.1,230.4 L257.1,230.3 L257.1,230.4 L257.1,230.3 
+		L257.1,230.4 L257.1,230.3 L257.1,230.4 L257.2,230.4 L257.3,230.4 L257.4,230.4 L257.5,230.4 L257.6,230.4 
+		L257.7,230.4 L257.8,230.4 L257.9,230.4 L258.0,230.4 L258.0,230.6 L258.0,230.0 L258.0,230.2 L258.0,230.9 
+		L258.0,230.5 L258.1,229.4 L258.1,230.2 L258.1,232.6 L258.1,230.8 L258.1,220.7 L258.1,224.7 L258.1,86.2 
+		L258.1,235.7 L258.1,220.9 L258.2,230.2 L258.2,232.4 L258.2,230.1 L258.2,229.6 L258.2,229.9 L258.2,230.2 
+		L258.2,231.0 L258.2,230.3 L258.2,229.6 L258.2,230.5 L258.3,229.9 L258.3,230.4 L258.3,230.5 L258.3,230.3 
+		L258.3,230.4 L258.3,230.3 L258.4,230.4 L258.4,230.3 L258.4,230.4 L258.5,230.4 L258.5,230.3 L258.5,230.4 
+		L258.6,230.4 L258.6,230.3 L258.6,230.4 L258.7,230.4 L258.8,230.4 L258.9,230.4 L259.0,230.4 L259.1,230.4 
+		L259.2,230.4 L259.2,230.3 L259.3,230.4 L259.4,230.4 L259.5,230.4 L259.6,230.4 L259.7,230.4 L259.8,230.4 
+		L259.9,230.4 L260.0,230.4 L260.1,230.4 L260.1,230.3 L260.1,230.4 L260.2,230.4 L260.2,230.3 L260.2,230.4 
+		L260.3,230.3 L260.3,230.4 L260.4,230.4 L260.4,230.3 L260.4,230.4 L260.4,230.3 L260.4,230.4 L260.5,230.4 
+		L260.6,230.4 L260.7,230.4 L260.8,230.4 L260.9,230.4 L261.0,230.4 L261.1,230.4 L261.2,230.4 L261.3,230.4 
+		L261.4,230.4 L261.5,230.4 L261.6,230.4 L261.7,230.4 L261.8,230.4 L261.9,230.4 L262.0,230.4 L262.1,230.4 
+		L262.1,230.3 L262.1,230.4 L262.2,230.4 L262.2,230.3 L262.2,230.4 L262.3,230.4 L262.4,230.4 L262.4,230.3 
+		L262.4,230.4 L262.5,230.3 L262.5,230.4 L262.5,230.3 L262.5,230.4 L262.6,230.4 L262.7,230.4 L262.7,230.3 
+		L262.7,230.4 L262.7,230.3 L262.7,230.4 L262.7,230.3 L262.7,230.4 L262.8,230.4 L262.8,230.3 L262.8,230.4 
+		L262.8,230.3 L262.8,230.4 L262.9,230.4 L263.0,230.4 L263.0,230.3 L263.0,230.4 L263.1,230.4 L263.1,230.3 
+		L263.1,230.4 L263.1,230.3 L263.2,230.3 L263.2,230.4 L263.3,230.4 L263.4,230.4 L263.5,230.4 L263.6,230.4 
+		L263.7,230.4 L263.8,230.4 L263.9,230.4 L264.0,230.4 L264.0,230.1 L264.0,230.5 L264.0,230.7 L264.0,230.3 
+		L264.0,229.7 L264.1,230.3 L264.1,231.8 L264.1,230.6 L264.1,226.2 L264.1,229.3 L264.1,279.2 L264.1,216.4 
+		L264.1,183.1 L264.1,229.2 L264.2,234.4 L264.2,230.9 L264.2,229.1 L264.2,229.7 L264.2,229.9 L264.2,229.7 
+		L264.2,230.5 L264.2,231.1 L264.2,230.2 L264.2,228.9 L264.3,230.3 L264.3,230.0 L264.3,230.4 L264.3,230.3 
+		L264.3,230.4 L264.3,230.3 L264.4,230.3 L264.4,230.4 L264.4,230.3 L264.4,230.4 L264.4,230.3 L264.5,230.4 
+		L264.5,230.3 L264.5,230.4 L264.6,230.4 L264.7,230.4 L264.8,230.4 L264.9,230.4 L264.9,230.3 L264.9,230.4 
+		L265.0,230.4 L265.1,230.4 L265.2,230.4 L265.2,230.3 L265.3,230.4 L265.4,230.4 L265.5,230.4 L265.6,230.4 
+		L265.7,230.4 L265.8,230.4 L265.9,230.4 L266.0,230.4 L266.0,230.3 L266.1,230.4 L266.1,230.3 L266.1,230.4 
+		L266.2,230.4 L266.3,230.4 L266.3,230.3 L266.4,230.4 L266.4,230.3 L266.4,230.4 L266.5,230.4 L266.5,230.3 
+		L266.5,230.4 L266.5,230.3 L266.6,230.4 L266.6,230.3 L266.6,230.4 L266.6,230.3 L266.6,230.4 L266.6,230.3 
+		L266.6,230.4 L266.6,230.3 L266.6,230.4 L266.7,230.4 L266.8,230.4 L266.8,230.3 L266.8,230.4 L266.8,230.3 
+		L266.8,230.4 L266.9,230.4 L267.0,230.4 L267.1,230.4 L267.1,230.3 L267.1,230.4 L267.1,230.3 L267.1,230.4 
+		L267.2,230.4 L267.3,230.4 L267.4,230.4 L267.5,230.4 L267.6,230.4 L267.7,230.4 L267.7,230.3 L267.7,230.4 
+		L267.8,230.4 L267.8,230.3 L267.8,230.4 L267.9,230.4 L267.9,230.3 L267.9,230.4 L268.0,230.4 L268.0,230.3 
+		L268.0,230.4 L268.0,230.3 L268.0,230.4 L268.1,230.4 L268.1,230.3 L268.1,230.4 L268.2,230.3 L268.2,230.4 
+		L268.2,230.3 L268.2,230.4 L268.2,230.3 L268.3,230.4 L268.3,230.3 L268.4,230.3 L268.4,230.4 L268.4,230.3 
+		L268.4,230.4 L268.5,230.4 L268.5,230.3 L268.5,230.4 L268.5,230.3 L268.5,230.4 L268.6,230.4 L268.6,230.3 
+		L268.6,230.4 L268.6,230.3 L268.6,230.4 L268.6,230.3 L268.6,230.4 L268.7,230.4 L268.7,230.3 L268.7,230.4 
+		L268.7,230.3 L268.7,230.4 L268.8,230.4 L268.8,230.3 L268.8,230.4 L268.9,230.4 L268.9,230.3 L268.9,230.4 
+		L268.9,230.3 L268.9,230.4 L269.0,230.4 L269.0,230.3 L269.0,230.4 L269.0,230.3 L269.1,230.3 L269.1,230.4 
+		L269.1,230.3 L269.1,230.4 L269.1,230.3 L269.2,230.4 L269.3,230.4 L269.4,230.4 L269.5,230.4 L269.6,230.4 
+		L269.7,230.4 L269.8,230.4 L269.9,230.4 L270.0,230.4 L270.0,230.1 L270.0,230.7 L270.0,230.5 L270.0,229.8 
+		L270.1,230.2 L270.1,231.3 L270.1,230.5 L270.1,228.1 L270.1,230.1 L270.1,240.0 L270.1,234.1 L270.1,375.0 
+		L270.1,226.8 L270.1,239.8 L270.2,230.4 L270.2,228.2 L270.2,230.7 L270.2,231.1 L270.2,230.8 L270.2,230.5 
+		L270.2,229.7 L270.2,230.3 L270.2,231.1 L270.3,230.2 L270.3,230.8 L270.3,230.3 L270.3,230.2 L270.3,230.4 
+		L270.3,230.3 L270.3,230.4 L270.4,230.4 L270.4,230.3 L270.4,230.4 L270.4,230.3 L270.4,230.4 L270.5,230.4 
+		L270.6,230.4 L270.7,230.4 L270.8,230.4 L270.9,230.4 L271.0,230.4 L271.1,230.4 L271.2,230.4 L271.3,230.4 
+		L271.3,230.3 L271.3,230.4 L271.4,230.4 L271.5,230.4 L271.6,230.4 L271.7,230.4 L271.8,230.4 L271.9,230.4 
+		L272.0,230.4 L272.1,230.4 L272.2,230.4 L272.3,230.4 L272.4,230.4 L272.5,230.4 L272.6,230.4 L272.7,230.4 
+		L272.8,230.4 L272.9,230.4 L273.0,230.4 L273.1,230.4 L273.2,230.4 L273.3,230.4 L273.4,230.4 L273.5,230.4 
+		L273.6,230.4 L273.7,230.4 L273.8,230.4 L273.9,230.4 L274.0,230.4 L274.1,230.4 L274.1,230.3 L274.1,230.4 
+		L274.2,230.4 L274.2,230.3 L274.2,230.4 L274.2,230.3 L274.2,230.4 L274.3,230.4 L274.3,230.3 L274.3,230.4 
+		L274.4,230.4 L274.4,230.3 L274.4,230.4 L274.5,230.4 L274.5,230.3 L274.5,230.4 L274.5,230.3 L274.6,230.4 
+		L274.6,230.3 L274.6,230.4 L274.6,230.3 L274.6,230.4 L274.6,230.3 L274.6,230.4 L274.6,230.3 L274.6,230.4 
+		L274.7,230.4 L274.7,230.3 L274.7,230.4 L274.8,230.3 L274.8,230.4 L274.8,230.3 L274.8,230.4 L274.8,230.3 
+		L274.8,230.4 L274.9,230.4 L274.9,230.3 L274.9,230.4 L275.0,230.3 L275.0,230.4 L275.0,230.3 L275.0,230.4 
+		L275.1,230.3 L275.1,230.4 L275.1,230.3 L275.1,230.4 L275.2,230.4 L275.3,230.4 L275.4,230.4 L275.5,230.4 
+		L275.6,230.4 L275.7,230.4 L275.8,230.4 L275.9,230.4 L276.0,230.4 L276.0,230.6 L276.0,230.2 L276.0,230.0 
+		L276.0,230.4 L276.1,231.0 L276.1,230.4 L276.1,228.9 L276.1,230.2 L276.1,234.5 L276.1,231.0 L276.1,181.3 
+		L276.1,238.8 L276.1,277.8 L276.1,231.1 L276.2,226.3 L276.2,229.9 L276.2,231.6 L276.2,231.0 L276.2,230.7 
+		L276.2,231.0 L276.2,230.2 L276.2,229.6 L276.2,230.4 L276.3,231.8 L276.3,230.4 L276.3,230.7 L276.3,230.3 
+		L276.3,230.4 L276.3,230.3 L276.3,230.4 L276.4,230.4 L276.4,230.3 L276.4,230.4 L276.4,230.3 L276.4,230.4 
+		L276.5,230.4 L276.6,230.4 L276.7,230.4 L276.8,230.4 L276.9,230.4 L277.0,230.4 L277.0,230.3 L277.0,230.4 
+		L277.1,230.4 L277.2,230.4 L277.3,230.4 L277.4,230.4 L277.5,230.4 L277.6,230.4 L277.7,230.4 L277.8,230.4 
+		L277.9,230.4 L277.9,230.3 L277.9,230.4 L278.0,230.4 L278.0,230.3 L278.0,230.4 L278.1,230.4 L278.1,230.3 
+		L278.1,230.4 L278.2,230.4 L278.3,230.4 L278.3,230.3 L278.3,230.4 L278.3,230.3 L278.4,230.4 L278.4,230.3 
+		L278.4,230.4 L278.4,230.3 L278.4,230.4 L278.5,230.4 L278.6,230.4 L278.6,230.3 L278.6,230.4 L278.7,230.4 
+		L278.7,230.3 L278.7,230.4 L278.8,230.4 L278.8,230.3 L278.8,230.4 L278.9,230.4 L278.9,230.3 L278.9,230.4 
+		L278.9,230.3 L278.9,230.4 L279.0,230.4 L279.1,230.3 L279.1,230.4 L279.2,230.4 L279.3,230.4 L279.4,230.4 
+		L279.5,230.4 L279.6,230.4 L279.6,230.3 L279.6,230.4 L279.6,230.3 L279.7,230.4 L279.7,230.3 L279.7,230.4 
+		L279.8,230.4 L279.8,230.3 L279.9,230.4 L279.9,230.3 L279.9,230.4 L280.0,230.4 L280.0,230.3 L280.0,230.4 
+		L280.0,230.3 L280.0,230.4 L280.1,230.3 L280.1,230.4 L280.1,230.3 L280.1,230.4 L280.2,230.4 L280.2,230.3 
+		L280.2,230.4 L280.2,230.3 L280.3,230.3 L280.3,230.4 L280.3,230.3 L280.3,230.4 L280.3,230.3 L280.4,230.4 
+		L280.4,230.3 L280.4,230.4 L280.4,230.3 L280.4,230.4 L280.4,230.3 L280.5,230.4 L280.5,230.3 L280.5,230.4 
+		L280.5,230.3 L280.5,230.4 L280.5,230.3 L280.6,230.3 L280.6,230.4 L280.6,230.3 L280.6,230.4 L280.6,230.3 
+		L280.7,230.3 L280.7,230.4 L280.8,230.4 L280.8,230.3 L280.8,230.4 L280.8,230.3 L280.8,230.4 L280.9,230.3 
+		L280.9,230.4 L280.9,230.3 L280.9,230.4 L281.0,230.3 L281.0,230.4 L281.0,230.3 L281.0,230.4 L281.0,230.3 
+		L281.0,230.4 L281.0,230.3 L281.1,230.3 L281.1,230.4 L281.1,230.3 L281.1,230.4 L281.1,230.3 L281.1,230.4 
+		L281.2,230.3 L281.2,230.4 L281.3,230.4 L281.4,230.4 L281.5,230.4 L281.6,230.4 L281.7,230.4 L281.8,230.4 
+		L281.9,230.4 L282.0,230.4 L282.0,230.5 L282.0,230.0 L282.0,230.2 L282.0,230.9 L282.1,230.4 L282.1,229.4 
+		L282.1,230.3 L282.1,232.6 L282.1,230.5 L282.1,220.7 L282.1,228.5 L282.1,85.3 L282.1,232.1 L282.2,220.8 
+		L282.2,230.5 L282.2,232.5 L282.2,230.0 L282.2,229.5 L282.2,229.9 L282.2,230.1 L282.2,231.0 L282.2,230.4 
+		L282.2,229.6 L282.3,230.4 L282.3,229.9 L282.3,230.4 L282.3,230.5 L282.3,230.3 L282.3,230.4 L282.4,230.3 
+		L282.4,230.4 L282.4,230.3 L282.4,230.4 L282.5,230.4 L282.5,230.3 L282.5,230.4 L282.6,230.4 L282.6,230.3 
+		L282.7,230.4 L282.8,230.4 L282.9,230.4 L283.0,230.4 L283.1,230.4 L283.2,230.4 L283.2,230.3 L283.3,230.3 
+		L283.3,230.4 L283.4,230.4 L283.5,230.4 L283.6,230.4 L283.7,230.4 L283.8,230.4 L283.9,230.4 L284.0,230.4 
+		L284.1,230.4 L284.2,230.4 L284.3,230.4 L284.4,230.4 L284.5,230.4 L284.6,230.4 L284.7,230.4 L284.8,230.4 
+		L284.9,230.4 L285.0,230.4 L285.1,230.4 L285.2,230.4 L285.3,230.4 L285.4,230.4 L285.5,230.4 L285.6,230.4 
+		L285.7,230.4 L285.8,230.4 L285.9,230.4 L286.0,230.4 L286.0,230.3 L286.0,230.4 L286.1,230.4 L286.1,230.3 
+		L286.1,230.4 L286.2,230.4 L286.3,230.3 L286.3,230.4 L286.3,230.3 L286.3,230.4 L286.4,230.3 L286.4,230.4 
+		L286.4,230.3 L286.4,230.4 L286.5,230.4 L286.6,230.4 L286.6,230.3 L286.6,230.4 L286.6,230.3 L286.6,230.4 
+		L286.7,230.4 L286.7,230.3 L286.7,230.4 L286.7,230.3 L286.8,230.4 L286.8,230.3 L286.8,230.4 L286.8,230.3 
+		L286.9,230.4 L286.9,230.3 L286.9,230.4 L286.9,230.3 L286.9,230.4 L286.9,230.3 L286.9,230.4 L287.0,230.4 
+		L287.0,230.3 L287.0,230.4 L287.1,230.4 L287.1,230.3 L287.1,230.4 L287.1,230.3 L287.2,230.4 L287.3,230.4 
+		L287.4,230.4 L287.5,230.4 L287.6,230.4 L287.7,230.4 L287.8,230.4 L287.9,230.4 L288.0,230.4 L288.0,230.1 
+		L288.0,230.5 L288.0,230.7 L288.1,230.3 L288.1,229.7 L288.1,230.4 L288.1,231.8 L288.1,230.4 L288.1,226.2 
+		L288.1,230.1 L288.1,279.4 L288.1,227.5 L288.1,182.9 L288.2,229.9 L288.2,234.4 L288.2,230.8 L288.2,229.1 
+		L288.2,229.7 L288.2,230.0 L288.2,229.7 L288.2,230.5 L288.2,231.0 L288.2,230.3 L288.3,228.9 L288.3,230.3 
+		L288.3,230.0 L288.3,230.4 L288.3,230.3 L288.3,230.4 L288.4,230.3 L288.4,230.4 L288.4,230.3 L288.4,230.4 
+		L288.5,230.3 L288.5,230.4 L288.5,230.3 L288.5,230.4 L288.6,230.4 L288.7,230.4 L288.8,230.4 L288.9,230.4 
+		L288.9,230.3 L288.9,230.4 L289.0,230.4 L289.1,230.4 L289.2,230.4 L289.3,230.3 L289.3,230.4 L289.4,230.4 
+		L289.5,230.4 L289.6,230.4 L289.7,230.4 L289.8,230.4 L289.9,230.4 L289.9,230.3 L289.9,230.4 L290.0,230.4 
+		L290.1,230.4 L290.1,230.3 L290.1,230.4 L290.1,230.3 L290.1,230.4 L290.2,230.4 L290.3,230.4 L290.3,230.3 
+		L290.3,230.4 L290.4,230.4 L290.4,230.3 L290.4,230.4 L290.5,230.4 L290.6,230.4 L290.7,230.4 L290.7,230.3 
+		L290.7,230.4 L290.7,230.3 L290.7,230.4 L290.8,230.4 L290.8,230.3 L290.8,230.4 L290.9,230.4 L291.0,230.4 
+		L291.0,230.3 L291.0,230.4 L291.1,230.4 L291.2,230.4 L291.3,230.4 L291.4,230.4 L291.5,230.4 L291.6,230.4 
+		L291.6,230.3 L291.6,230.4 L291.7,230.4 L291.8,230.4 L291.8,230.3 L291.8,230.4 L291.8,230.3 L291.8,230.4 
+		L291.9,230.4 L291.9,230.3 L291.9,230.4 L291.9,230.3 L291.9,230.4 L291.9,230.3 L291.9,230.4 L292.0,230.4 
+		L292.0,230.3 L292.0,230.4 L292.0,230.3 L292.1,230.4 L292.1,230.3 L292.1,230.4 L292.1,230.3 L292.2,230.4 
+		L292.2,230.3 L292.2,230.4 L292.2,230.3 L292.2,230.4 L292.3,230.3 L292.3,230.4 L292.3,230.3 L292.3,230.4 
+		L292.4,230.3 L292.4,230.4 L292.4,230.3 L292.4,230.4 L292.4,230.3 L292.4,230.4 L292.4,230.3 L292.5,230.4 
+		L292.5,230.3 L292.5,230.4 L292.5,230.3 L292.5,230.4 L292.5,230.3 L292.5,230.4 L292.6,230.3 L292.6,230.4 
+		L292.6,230.3 L292.6,230.4 L292.6,230.3 L292.6,230.4 L292.6,230.3 L292.7,230.4 L292.7,230.3 L292.7,230.4 
+		L292.7,230.3 L292.7,230.4 L292.8,230.3 L292.8,230.4 L292.8,230.3 L292.9,230.3 L292.9,230.4 L292.9,230.3 
+		L292.9,230.4 L292.9,230.3 L292.9,230.4 L292.9,230.3 L293.0,230.4 L293.0,230.3 L293.0,230.4 L293.0,230.3 
+		L293.0,230.4 L293.1,230.3 L293.1,230.4 L293.1,230.3 L293.1,230.4 L293.1,230.3 L293.1,230.4 L293.1,230.3 
+		L293.2,230.3 L293.2,230.4 L293.2,230.3 L293.2,230.4 L293.3,230.4 L293.4,230.4 L293.5,230.4 L293.6,230.4 
+		L293.7,230.4 L293.8,230.4 L293.9,230.4 L294.0,230.4 L294.0,230.2 L294.0,230.7 L294.0,230.5 L294.1,229.8 
+		L294.1,230.3 L294.1,231.3 L294.1,230.4 L294.1,228.1 L294.1,230.4 L294.1,240.0 L294.1,230.3 L294.1,375.5 
+		L294.1,230.5 L294.2,239.9 L294.2,230.1 L294.2,228.2 L294.2,230.8 L294.2,231.2 L294.2,230.8 L294.2,230.6 
+		L294.2,229.7 L294.2,230.3 L294.3,231.1 L294.3,230.4 L294.3,230.8 L294.3,230.3 L294.3,230.2 L294.3,230.4 
+		L294.3,230.3 L294.4,230.4 L294.4,230.3 L294.4,230.4 L294.5,230.3 L294.5,230.4 L294.6,230.4 L294.7,230.4 
+		L294.8,230.4 L294.9,230.4 L295.0,230.4 L295.1,230.4 L295.2,230.4 L295.3,230.4 L295.4,230.4 L295.5,230.4 
+		L295.6,230.4 L295.7,230.4 L295.8,230.4 L295.9,230.4 L296.0,230.4 L296.1,230.4 L296.2,230.4 L296.2,230.3 
+		L296.2,230.4 L296.2,230.3 L296.3,230.4 L296.3,230.3 L296.3,230.4 L296.4,230.4 L296.5,230.4 L296.5,230.3 
+		L296.5,230.4 L296.6,230.4 L296.7,230.4 L296.8,230.4 L296.9,230.4 L297.0,230.4 L297.1,230.4 L297.2,230.4 
+		L297.3,230.4 L297.4,230.4 L297.5,230.4 L297.6,230.4 L297.7,230.4 L297.8,230.4 L297.9,230.4 L298.0,230.4 
+		L298.1,230.4 L298.1,230.3 L298.1,230.4 L298.1,230.3 L298.1,230.4 L298.2,230.4 L298.3,230.4 L298.3,230.3 
+		L298.3,230.4 L298.4,230.4 L298.4,230.3 L298.4,230.4 L298.5,230.4 L298.6,230.4 L298.6,230.3 L298.6,230.4 
+		L298.6,230.3 L298.7,230.4 L298.7,230.3 L298.7,230.4 L298.8,230.3 L298.8,230.4 L298.9,230.4 L298.9,230.3 
+		L299.0,230.4 L299.0,230.3 L299.0,230.4 L299.1,230.3 L299.1,230.4 L299.1,230.3 L299.1,230.4 L299.1,230.3 
+		L299.2,230.4 L299.3,230.4 L299.4,230.4 L299.5,230.4 L299.6,230.4 L299.7,230.4 L299.8,230.4 L299.9,230.4 
+		L300.0,230.4 L300.0,230.6 L300.0,230.2 L300.0,230.0 L300.1,230.4 L300.1,231.0 L300.1,230.3 L300.1,228.9 
+		L300.1,230.4 L300.1,234.5 L300.1,230.3 L300.1,181.3 L300.1,227.6 L300.2,277.8 L300.2,230.4 L300.2,226.3 
+		L300.2,230.0 L300.2,231.6 L300.2,230.9 L300.2,230.7 L300.2,231.0 L300.2,230.2 L300.2,229.7 L300.3,230.4 
+		L300.3,231.8 L300.3,230.3 L300.3,230.7 L300.3,230.4 L300.3,230.3 L300.3,230.4 L300.3,230.3 L300.4,230.4 
+		L300.4,230.3 L300.4,230.4 L300.4,230.3 L300.5,230.4 L300.6,230.4 L300.7,230.4 L300.8,230.4 L300.9,230.4 
+		L301.0,230.4 L301.1,230.4 L301.2,230.4 L301.3,230.4 L301.4,230.4 L301.5,230.4 L301.6,230.4 L301.7,230.4 
+		L301.8,230.4 L301.9,230.4 L302.0,230.4 L302.0,230.3 L302.0,230.4 L302.1,230.4 L302.2,230.4 L302.2,230.3 
+		L302.2,230.4 L302.3,230.4 L302.4,230.3 L302.4,230.4 L302.5,230.4 L302.5,230.3 L302.5,230.4 L302.5,230.3 
+		L302.5,230.4 L302.6,230.3 L302.6,230.4 L302.6,230.3 L302.6,230.4 L302.6,230.3 L302.6,230.4 L302.7,230.3 
+		L302.7,230.4 L302.7,230.3 L302.8,230.4 L302.8,230.3 L302.8,230.4 L302.9,230.4 L302.9,230.3 L302.9,230.4 
+		L303.0,230.3 L303.0,230.4 L303.0,230.3 L303.0,230.4 L303.1,230.4 L303.2,230.4 L303.3,230.4 L303.3,230.3 
+		L303.3,230.4 L303.4,230.4 L303.5,230.4 L303.6,230.4 L303.7,230.3 L303.7,230.4 L303.8,230.4 L303.8,230.3 
+		L303.8,230.4 L303.8,230.3 L303.9,230.4 L303.9,230.3 L303.9,230.4 L303.9,230.3 L303.9,230.4 L304.0,230.3 
+		L304.0,230.4 L304.0,230.3 L304.0,230.4 L304.0,230.3 L304.1,230.3 L304.1,230.4 L304.1,230.3 L304.1,230.4 
+		L304.2,230.4 L304.2,230.3 L304.2,230.4 L304.2,230.3 L304.3,230.3 L304.3,230.4 L304.3,230.3 L304.3,230.4 
+		L304.3,230.3 L304.3,230.4 L304.4,230.4 L304.4,230.3 L304.4,230.4 L304.5,230.3 L304.5,230.4 L304.5,230.3 
+		L304.5,230.4 L304.5,230.3 L304.5,230.4 L304.5,230.3 L304.5,230.4 L304.6,230.3 L304.6,230.4 L304.6,230.3 
+		L304.7,230.3 L304.7,230.4 L304.7,230.3 L304.7,230.4 L304.7,230.3 L304.8,230.3 L304.8,230.4 L304.8,230.3 
+		L304.8,230.4 L304.8,230.3 L304.8,230.4 L304.9,230.3 L304.9,230.4 L304.9,230.3 L304.9,230.4 L304.9,230.3 
+		L305.0,230.3 L305.0,230.4 L305.0,230.3 L305.0,230.4 L305.1,230.3 L305.1,230.4 L305.1,230.3 L305.1,230.4 
+		L305.1,230.3 L305.1,230.4 L305.2,230.3 L305.2,230.4 L305.3,230.4 L305.4,230.4 L305.5,230.4 L305.6,230.4 
+		L305.7,230.4 L305.8,230.4 L305.9,230.4 L306.0,230.4 L306.0,230.5 L306.0,230.1 L306.0,230.3 L306.1,230.9 
+		L306.1,230.4 L306.1,229.4 L306.1,230.4 L306.1,232.6 L306.1,230.1 L306.1,220.7 L306.1,232.3 L306.1,85.3 
+		L306.2,228.4 L306.2,220.8 L306.2,230.8 L306.2,232.5 L306.2,229.9 L306.2,229.5 L306.2,229.9 L306.2,230.1 
+		L306.2,231.0 L306.2,230.4 L306.3,229.5 L306.3,230.3 L306.3,229.9 L306.3,230.3 L306.3,230.5 L306.3,230.4 
+		L306.3,230.3 L306.3,230.4 L306.4,230.4 L306.4,230.3 L306.4,230.4 L306.4,230.3 L306.4,230.4 L306.5,230.4 
+		L306.5,230.3 L306.5,230.4 L306.6,230.4 L306.7,230.3 L306.7,230.4 L306.8,230.4 L306.9,230.4 L307.0,230.4 
+		L307.1,230.4 L307.2,230.4 L307.3,230.4 L307.3,230.3 L307.3,230.4 L307.4,230.4 L307.5,230.4 L307.6,230.4 
+		L307.7,230.4 L307.8,230.3 L307.8,230.4 L307.9,230.4 L308.0,230.4 L308.0,230.3 L308.0,230.4 L308.0,230.3 
+		L308.1,230.4 L308.1,230.3 L308.1,230.4 L308.2,230.4 L308.3,230.4 L308.3,230.3 L308.3,230.4 L308.3,230.3 
+		L308.3,230.4 L308.4,230.3 L308.4,230.4 L308.5,230.4 L308.6,230.4 L308.7,230.4 L308.8,230.4 L308.9,230.4 
+		L309.0,230.4 L309.1,230.4 L309.2,230.4 L309.3,230.4 L309.4,230.4 L309.5,230.4 L309.6,230.4 L309.7,230.4 
+		L309.8,230.4 L309.9,230.4 L310.0,230.4 L310.0,230.3 L310.0,230.4 L310.1,230.3 L310.1,230.4 L310.2,230.4 
+		L310.2,230.3 L310.2,230.4 L310.3,230.4 L310.3,230.3 L310.3,230.4 L310.4,230.4 L310.5,230.4 L310.6,230.4 
+		L310.6,230.3 L310.6,230.4 L310.7,230.4 L310.7,230.3 L310.7,230.4 L310.7,230.3 L310.7,230.4 L310.8,230.4 
+		L310.8,230.3 L310.8,230.4 L310.9,230.3 L310.9,230.4 L311.0,230.4 L311.0,230.3 L311.0,230.4 L311.1,230.4 
+		L311.1,230.3 L311.1,230.4 L311.1,230.3 L311.2,230.4 L311.3,230.4 L311.4,230.4 L311.5,230.4 L311.6,230.4 
+		L311.7,230.4 L311.8,230.4 L311.9,230.4 L312.0,230.4 L312.0,230.1 L312.0,230.5 L312.1,230.7 L312.1,230.2 
+		L312.1,229.7 L312.1,230.4 L312.1,231.8 L312.1,230.2 L312.1,226.2 L312.1,230.8 L312.1,279.4 L312.1,238.7 
+		L312.2,182.9 L312.2,230.7 L312.2,234.3 L312.2,230.6 L312.2,229.1 L312.2,229.8 L312.2,230.0 L312.2,229.7 
+		L312.2,230.4 L312.3,231.0 L312.3,230.4 L312.3,228.9 L312.3,230.4 L312.3,230.0 L312.3,230.3 L312.3,230.4 
+		L312.3,230.3 L312.4,230.4 L312.4,230.3 L312.4,230.4 L312.4,230.3 L312.4,230.4 L312.5,230.4 L312.5,230.3 
+		L312.5,230.4 L312.5,230.3 L312.5,230.4 L312.6,230.4 L312.7,230.4 L312.8,230.4 L312.9,230.4 L312.9,230.3 
+		L312.9,230.4 L313.0,230.4 L313.1,230.4 L313.2,230.4 L313.3,230.4 L313.3,230.3 L313.3,230.4 L313.4,230.4 
+		L313.5,230.4 L313.6,230.4 L313.7,230.4 L313.8,230.4 L313.8,230.3 L313.9,230.4 L314.0,230.4 L314.1,230.4 
+		L314.2,230.4 L314.2,230.3 L314.2,230.4 L314.3,230.3 L314.3,230.4 L314.3,230.3 L314.3,230.4 L314.3,230.3 
+		L314.4,230.3 L314.4,230.4 L314.5,230.4 L314.5,230.3 L314.6,230.4 L314.7,230.4 L314.7,230.3 L314.7,230.4 
+		L314.8,230.4 L314.9,230.4 L315.0,230.4 L315.1,230.4 L315.2,230.4 L315.3,230.4 L315.4,230.4 L315.5,230.4 
+		L315.6,230.4 L315.7,230.4 L315.7,230.3 L315.7,230.4 L315.8,230.3 L315.8,230.4 L315.8,230.3 L315.8,230.4 
+		L315.8,230.3 L315.8,230.4 L315.9,230.4 L315.9,230.3 L315.9,230.4 L315.9,230.3 L315.9,230.4 L315.9,230.3 
+		L315.9,230.4 L316.0,230.4 L316.0,230.3 L316.0,230.4 L316.0,230.3 L316.0,230.4 L316.1,230.4 L316.1,230.3 
+		L316.1,230.4 L316.1,230.3 L316.1,230.4 L316.1,230.3 L316.2,230.4 L316.2,230.3 L316.2,230.4 L316.2,230.3 
+		L316.2,230.4 L316.3,230.4 L316.3,230.3 L316.3,230.4 L316.3,230.3 L316.3,230.4 L316.4,230.4 L316.4,230.3 
+		L316.5,230.4 L316.5,230.3 L316.5,230.4 L316.5,230.3 L316.5,230.4 L316.5,230.3 L316.5,230.4 L316.6,230.3 
+		L316.6,230.4 L316.6,230.3 L316.6,230.4 L316.6,230.3 L316.6,230.4 L316.7,230.4 L316.7,230.3 L316.7,230.4 
+		L316.7,230.3 L316.7,230.4 L316.7,230.3 L316.8,230.3 L316.8,230.4 L316.8,230.3 L316.9,230.4 L316.9,230.3 
+		L316.9,230.4 L316.9,230.3 L316.9,230.4 L316.9,230.3 L317.0,230.4 L317.0,230.3 L317.0,230.4 L317.0,230.3 
+		L317.0,230.4 L317.1,230.4 L317.1,230.3 L317.1,230.4 L317.1,230.3 L317.1,230.4 L317.2,230.4 L317.3,230.4 
+		L317.4,230.4 L317.5,230.4 L317.6,230.4 L317.7,230.4 L317.8,230.4 L317.9,230.4 L318.0,230.4 L318.0,230.2 
+		L318.0,230.6 L318.1,230.4 L318.1,229.8 L318.1,230.4 L318.1,231.3 L318.1,230.2 L318.1,228.1 L318.1,230.7 
+		L318.1,240.0 L318.1,226.5 L318.1,375.1 L318.2,234.1 L318.2,239.9 L318.2,229.7 L318.2,228.2 L318.2,230.9 
+		L318.2,231.2 L318.2,230.9 L318.2,230.6 L318.2,229.7 L318.3,230.2 L318.3,231.1 L318.3,230.5 L318.3,230.8 
+		L318.3,230.4 L318.3,230.2 L318.3,230.3 L318.3,230.4 L318.3,230.3 L318.4,230.3 L318.4,230.4 L318.4,230.3 
+		L318.4,230.4 L318.5,230.4 L318.5,230.3 L318.5,230.4 L318.6,230.4 L318.7,230.4 L318.8,230.4 L318.9,230.4 
+		L319.0,230.4 L319.1,230.4 L319.2,230.4 L319.3,230.4 L319.4,230.4 L319.5,230.4 L319.6,230.4 L319.7,230.4 
+		L319.8,230.4 L319.9,230.4 L320.0,230.4 L320.1,230.4 L320.2,230.4 L320.3,230.4 L320.4,230.4 L320.5,230.4 
+		L320.6,230.4 L320.7,230.4 L320.8,230.4 L320.9,230.4 L321.0,230.4 L321.1,230.4 L321.2,230.4 L321.3,230.4 
+		L321.4,230.4 L321.5,230.4 L321.6,230.4 L321.7,230.4 L321.8,230.4 L321.9,230.4 L322.0,230.4 L322.1,230.4 
+		L322.2,230.4 L322.2,230.3 L322.2,230.4 L322.2,230.3 L322.2,230.4 L322.3,230.4 L322.4,230.4 L322.4,230.3 
+		L322.4,230.4 L322.5,230.4 L322.6,230.4 L322.6,230.3 L322.6,230.4 L322.7,230.4 L322.7,230.3 L322.7,230.4 
+		L322.7,230.3 L322.7,230.4 L322.8,230.4 L322.8,230.3 L322.8,230.4 L322.9,230.4 L322.9,230.3 L322.9,230.4 
+		L322.9,230.3 L323.0,230.3 L323.0,230.4 L323.0,230.3 L323.0,230.4 L323.1,230.3 L323.1,230.4 L323.1,230.3 
+		L323.1,230.4 L323.1,230.3 L323.1,230.4 L323.2,230.4 L323.2,230.3 L323.2,230.4 L323.3,230.4 L323.4,230.4 
+		L323.5,230.4 L323.6,230.4 L323.7,230.4 L323.8,230.4 L323.9,230.4 L324.0,230.4 L324.0,230.6 L324.0,230.2 
+		L324.1,229.9 L324.1,230.5 L324.1,231.0 L324.1,230.2 L324.1,228.9 L324.1,230.5 L324.1,234.4 L324.1,229.5 
+		L324.1,181.5 L324.2,216.5 L324.2,277.6 L324.2,229.7 L324.2,226.4 L324.2,230.2 L324.2,231.6 L324.2,230.9 
+		L324.2,230.7 L324.2,231.0 L324.2,230.3 L324.3,229.7 L324.3,230.3 L324.3,231.8 L324.3,230.3 L324.3,230.7 
+		L324.3,230.4 L324.3,230.3 L324.3,230.4 L324.4,230.4 L324.4,230.3 L324.4,230.4 L324.4,230.3 L324.4,230.4 
+		L324.5,230.3 L324.5,230.4 L324.6,230.4 L324.7,230.4 L324.7,230.3 L324.7,230.4 L324.8,230.4 L324.9,230.4 
+		L325.0,230.4 L325.0,230.3 L325.0,230.4 L325.1,230.4 L325.2,230.4 L325.3,230.4 L325.4,230.4 L325.5,230.4 
+		L325.6,230.4 L325.7,230.4 L325.8,230.4 L325.9,230.4 L326.0,230.4 L326.0,230.3 L326.0,230.4 L326.1,230.4 
+		L326.1,230.3 L326.1,230.4 L326.2,230.4 L326.3,230.4 L326.3,230.3 L326.3,230.4 L326.4,230.4 L326.4,230.3 
+		L326.4,230.4 L326.5,230.4 L326.5,230.3 L326.5,230.4 L326.5,230.3 L326.5,230.4 L326.6,230.4 L326.6,230.3 
+		L326.6,230.4 L326.7,230.4 L326.7,230.3 L326.7,230.4 L326.8,230.4 L326.8,230.3 L326.8,230.4 L326.9,230.4 
+		L326.9,230.3 L326.9,230.4 L327.0,230.4 L327.1,230.4 L327.2,230.4 L327.2,230.3 L327.2,230.4 L327.3,230.4 
+		L327.3,230.3 L327.3,230.4 L327.4,230.4 L327.5,230.4 L327.6,230.4 L327.7,230.4 L327.7,230.3 L327.7,230.4 
+		L327.7,230.3 L327.7,230.4 L327.8,230.4 L327.9,230.4 L327.9,230.3 L327.9,230.4 L327.9,230.3 L327.9,230.4 
+		L327.9,230.3 L327.9,230.4 L327.9,230.3 L327.9,230.4 L328.0,230.3 L328.0,230.4 L328.0,230.3 L328.0,230.4 
+		L328.0,230.3 L328.1,230.4 L328.1,230.3 L328.1,230.4 L328.2,230.4 L328.2,230.3 L328.2,230.4 L328.2,230.3 
+		L328.3,230.4 L328.3,230.3 L328.3,230.4 L328.4,230.4 L328.4,230.3 L328.4,230.4 L328.4,230.3 L328.4,230.4 
+		L328.4,230.3 L328.5,230.3 L328.5,230.4 L328.5,230.3 L328.6,230.4 L328.6,230.3 L328.6,230.4 L328.6,230.3 
+		L328.6,230.4 L328.7,230.4 L328.7,230.3 L328.7,230.4 L328.7,230.3 L328.7,230.4 L328.7,230.3 L328.8,230.4 
+		L328.8,230.3 L328.8,230.4 L328.8,230.3 L328.8,230.4 L328.8,230.3 L328.8,230.4 L328.9,230.3 L328.9,230.4 
+		L328.9,230.3 L328.9,230.4 L329.0,230.3 L329.0,230.4 L329.0,230.3 L329.0,230.4 L329.0,230.3 L329.0,230.4 
+		L329.1,230.4 L329.1,230.3 L329.1,230.4 L329.1,230.3 L329.1,230.4 L329.1,230.3 L329.2,230.4 L329.3,230.4 
+		L329.4,230.4 L329.5,230.4 L329.6,230.4 L329.7,230.4 L329.8,230.4 L329.9,230.4 L330.0,230.4 L330.0,230.5 
+		L330.1,230.1 L330.1,230.3 L330.1,230.9 L330.1,230.3 L330.1,229.4 L330.1,230.5 L330.1,232.6 L330.1,229.8 
+		L330.1,220.7 L330.1,236.0 L330.2,86.2 L330.2,224.8 L330.2,220.9 L330.2,231.1 L330.2,232.5 L330.2,229.8 
+		L330.2,229.5 L330.2,229.8 L330.2,230.0 L330.2,231.0 L330.3,230.5 L330.3,229.5 L330.3,230.2 L330.3,229.9 
+		L330.3,230.3 L330.3,230.5 L330.3,230.4 L330.3,230.3 L330.4,230.4 L330.4,230.3 L330.4,230.4 L330.4,230.3 
+		L330.5,230.4 L330.5,230.3 L330.5,230.4 L330.6,230.4 L330.7,230.4 L330.7,230.3 L330.7,230.4 L330.8,230.4 
+		L330.9,230.4 L331.0,230.4 L331.1,230.4 L331.2,230.4 L331.3,230.4 L331.3,230.3 L331.3,230.4 L331.4,230.4 
+		L331.5,230.4 L331.6,230.4 L331.7,230.4 L331.8,230.4 L331.9,230.4 L332.0,230.4 L332.1,230.4 L332.2,230.4 
+		L332.3,230.4 L332.3,230.3 L332.3,230.4 L332.4,230.4 L332.4,230.3 L332.4,230.4 L332.5,230.4 L332.6,230.4 
+		L332.7,230.4 L332.8,230.4 L332.9,230.4 L333.0,230.4 L333.1,230.4 L333.2,230.4 L333.3,230.4 L333.4,230.4 
+		L333.5,230.4 L333.6,230.4 L333.7,230.4 L333.8,230.4 L333.9,230.4 L334.0,230.4 L334.1,230.4 L334.2,230.4 
+		L334.2,230.3 L334.2,230.4 L334.3,230.4 L334.4,230.4 L334.5,230.4 L334.6,230.3 L334.6,230.4 L334.6,230.3 
+		L334.6,230.4 L334.6,230.3 L334.6,230.4 L334.6,230.3 L334.7,230.3 L334.7,230.4 L334.7,230.3 L334.8,230.4 
+		L334.8,230.3 L334.8,230.4 L334.8,230.3 L334.9,230.4 L334.9,230.3 L334.9,230.4 L335.0,230.4 L335.0,230.3 
+		L335.0,230.4 L335.1,230.3 L335.1,230.4 L335.1,230.3 L335.1,230.4 L335.2,230.4 L335.2,230.3 L335.2,230.4 
+		L335.3,230.4 L335.4,230.4 L335.5,230.4 L335.6,230.4 L335.7,230.4 L335.8,230.4 L335.9,230.4 L336.0,230.4 
+		L336.0,230.1 L336.1,230.5 L336.1,230.8 L336.1,230.2 L336.1,229.7 L336.1,230.5 L336.1,231.8 L336.1,230.1 
+		L336.1,226.3 L336.1,231.6 L336.1,279.0 L336.2,249.8 L336.2,183.3 L336.2,231.4 L336.2,234.3 L336.2,230.4 
+		L336.2,229.2 L336.2,229.9 L336.2,230.1 L336.2,229.7 L336.3,230.4 L336.3,231.0 L336.3,230.4 L336.3,228.9 
+		L336.3,230.4 L336.3,230.0 L336.3,230.3 L336.3,230.4 L336.3,230.3 L336.4,230.3 L336.4,230.4 L336.4,230.3 
+		L336.4,230.4 L336.4,230.3 L336.5,230.4 L336.5,230.3 L336.5,230.4 L336.5,230.3 L336.6,230.4 L336.7,230.4 
+		L336.8,230.4 L336.9,230.4 L336.9,230.3 L336.9,230.4 L337.0,230.4 L337.1,230.4 L337.2,230.4 L337.3,230.4 
+		L337.3,230.3 L337.3,230.4 L337.4,230.4 L337.5,230.4 L337.6,230.4 L337.7,230.4 L337.8,230.4 L337.9,230.4 
+		L338.0,230.4 L338.1,230.4 L338.2,230.4 L338.2,230.3 L338.2,230.4 L338.2,230.3 L338.2,230.4 L338.3,230.4 
+		L338.3,230.3 L338.3,230.4 L338.4,230.4 L338.5,230.4 L338.5,230.3 L338.5,230.4 L338.6,230.4 L338.6,230.3 
+		L338.6,230.4 L338.6,230.3 L338.6,230.4 L338.7,230.4 L338.8,230.4 L338.9,230.4 L339.0,230.4 L339.1,230.4 
+		L339.2,230.4 L339.3,230.4 L339.4,230.4 L339.5,230.4 L339.6,230.4 L339.7,230.4 L339.7,230.3 L339.7,230.4 
+		L339.7,230.3 L339.7,230.4 L339.7,230.3 L339.8,230.3 L339.8,230.4 L339.9,230.4 L339.9,230.3 L339.9,230.4 
+		L339.9,230.3 L339.9,230.4 L340.0,230.4 L340.0,230.3 L340.0,230.4 L340.0,230.3 L340.0,230.4 L340.1,230.3 
+		L340.1,230.4 L340.1,230.3 L340.1,230.4 L340.1,230.3 L340.1,230.4 L340.2,230.3 L340.2,230.4 L340.2,230.3 
+		L340.2,230.4 L340.2,230.3 L340.2,230.4 L340.2,230.3 L340.2,230.4 L340.2,230.3 L340.3,230.4 L340.3,230.3 
+		L340.3,230.4 L340.3,230.3 L340.3,230.4 L340.4,230.4 L340.4,230.3 L340.4,230.4 L340.4,230.3 L340.4,230.4 
+		L340.5,230.4 L340.5,230.3 L340.6,230.4 L340.7,230.3 L340.7,230.4 L340.7,230.3 L340.7,230.4 L340.8,230.4 
+		L340.8,230.3 L340.8,230.4 L340.8,230.3 L340.8,230.4 L340.9,230.4 L340.9,230.3 L340.9,230.4 L340.9,230.3 
+		L341.0,230.4 L341.0,230.3 L341.1,230.3 L341.1,230.4 L341.1,230.3 L341.1,230.4 L341.1,230.3 L341.2,230.4 
+		L341.2,230.3 L341.2,230.4 L341.2,230.3 L341.2,230.4 L341.3,230.4 L341.4,230.4 L341.5,230.4 L341.6,230.4 
+		L341.7,230.4 L341.8,230.4 L341.9,230.4 L342.0,230.4 L342.0,230.2 L342.1,230.6 L342.1,230.4 L342.1,229.9 
+		L342.1,230.4 L342.1,231.3 L342.1,230.1 L342.1,228.1 L342.1,231.0 L342.1,239.9 L342.2,222.8 L342.2,373.8 
+		L342.2,237.7 L342.2,239.8 L342.2,229.4 L342.2,228.2 L342.2,231.0 L342.2,231.3 L342.2,230.9 L342.2,230.7 
+		L342.3,229.7 L342.3,230.2 L342.3,231.1 L342.3,230.6 L342.3,230.8 L342.3,230.4 L342.3,230.2 L342.3,230.3 
+		L342.3,230.4 L342.4,230.3 L342.4,230.4 L342.4,230.3 L342.4,230.4 L342.5,230.4 L342.5,230.3 L342.5,230.4 
+		L342.6,230.4 L342.7,230.4 L342.8,230.4 L342.9,230.4 L343.0,230.4 L343.1,230.4 L343.2,230.4 L343.3,230.4 
+		L343.4,230.4 L343.5,230.4 L343.6,230.4 L343.7,230.4 L343.8,230.4 L343.9,230.4 L344.0,230.4 L344.1,230.4 
+		L344.2,230.4 L344.3,230.4 L344.4,230.4 L344.5,230.4 L344.6,230.4 L344.7,230.4 L344.8,230.4 L344.9,230.4 
+		L345.0,230.4 L345.1,230.4 L345.2,230.4 L345.3,230.4 L345.4,230.4 L345.5,230.4 L345.6,230.4 L345.7,230.4 
+		L345.8,230.4 L345.9,230.4 L346.0,230.4 L346.1,230.4 L346.2,230.3 L346.2,230.4 L346.3,230.4 L346.3,230.3 
+		L346.4,230.4 L346.5,230.4 L346.6,230.4 L346.6,230.3 L346.6,230.4 L346.7,230.4 L346.7,230.3 L346.7,230.4 
+		L346.7,230.3 L346.7,230.4 L346.8,230.4 L346.8,230.3 L346.8,230.4 L346.8,230.3 L346.8,230.4 L346.9,230.3 
+		L346.9,230.4 L346.9,230.3 L346.9,230.4 L347.0,230.3 L347.0,230.4 L347.1,230.3 L347.1,230.4 L347.1,230.3 
+		L347.1,230.4 L347.1,230.3 L347.1,230.4 L347.2,230.3 L347.2,230.4 L347.2,230.3 L347.2,230.4 L347.3,230.4 
+		L347.4,230.4 L347.5,230.4 L347.6,230.4 L347.7,230.4 L347.8,230.4 L347.9,230.4 L348.0,230.4 L348.1,230.6 
+		L348.1,230.2 L348.1,229.9 L348.1,230.5 L348.1,231.0 L348.1,230.2 L348.1,229.0 L348.1,230.7 L348.1,234.4 
+		L348.1,228.8 L348.2,182.0 L348.2,205.4 L348.2,277.1 L348.2,229.0 L348.2,226.4 L348.2,230.4 L348.2,231.5 
+		L348.2,230.8 L348.2,230.6 L348.2,231.0 L348.3,230.3 L348.3,229.7 L348.3,230.2 L348.3,231.8 L348.3,230.3 
+		L348.3,230.7 L348.3,230.4 L348.3,230.3 L348.4,230.4 L348.4,230.3 L348.4,230.4 L348.4,230.3 L348.4,230.4 
+		L348.5,230.4 L348.5,230.3 L348.5,230.4 L348.5,230.3 L348.5,230.4 L348.6,230.4 L348.7,230.4 L348.7,230.3 
+		L348.7,230.4 L348.8,230.4 L348.9,230.4 L349.0,230.4 L349.1,230.3 L349.1,230.4 L349.2,230.4 L349.3,230.4 
+		L349.4,230.4 L349.5,230.4 L349.6,230.4 L349.7,230.4 L349.8,230.4 L349.9,230.4 L350.0,230.4 L350.1,230.3 
+		L350.1,230.4 L350.2,230.4 L350.2,230.3 L350.2,230.4 L350.3,230.3 L350.3,230.4 L350.4,230.4 L350.4,230.3 
+		L350.4,230.4 L350.5,230.4 L350.6,230.4 L350.6,230.3 L350.6,230.4 L350.7,230.3 L350.7,230.4 L350.8,230.4 
+		L350.8,230.3 L350.8,230.4 L350.9,230.4 L350.9,230.3 L350.9,230.4 L350.9,230.3 L350.9,230.4 L351.0,230.4 
+		L351.0,230.3 L351.0,230.4 L351.0,230.3 L351.1,230.4 L351.2,230.4 L351.3,230.4 L351.3,230.3 L351.3,230.4 
+		L351.4,230.4 L351.5,230.4 L351.6,230.4 L351.6,230.3 L351.6,230.4 L351.6,230.3 L351.6,230.4 L351.7,230.4 
+		L351.7,230.3 L351.7,230.4 L351.7,230.3 L351.7,230.4 L351.8,230.4 L351.8,230.3 L351.8,230.4 L351.8,230.3 
+		L351.8,230.4 L351.9,230.3 L351.9,230.4 L351.9,230.3 L351.9,230.4 L352.0,230.3 L352.0,230.4 L352.0,230.3 
+		L352.1,230.3 L352.1,230.4 L352.1,230.3 L352.1,230.4 L352.1,230.3 L352.2,230.4 L352.2,230.3 L352.2,230.4 
+		L352.2,230.3 L352.2,230.4 L352.2,230.3 L352.2,230.4 L352.3,230.4 L352.3,230.3 L352.3,230.4 L352.4,230.3 
+		L352.4,230.4 L352.4,230.3 L352.4,230.4 L352.4,230.3 L352.4,230.4 L352.4,230.3 L352.4,230.4 L352.5,230.4 
+		L352.5,230.3 L352.5,230.4 L352.6,230.4 L352.6,230.3 L352.6,230.4 L352.6,230.3 L352.6,230.4 L352.7,230.4 
+		L352.7,230.3 L352.7,230.4 L352.7,230.3 L352.7,230.4 L352.8,230.3 L352.8,230.4 L352.9,230.4 L352.9,230.3 
+		L352.9,230.4 L352.9,230.3 L352.9,230.4 L352.9,230.3 L352.9,230.4 L353.0,230.3 L353.0,230.4 L353.0,230.3 
+		L353.0,230.4 L353.0,230.3 L353.0,230.4 L353.0,230.3 L353.1,230.3 L353.1,230.4 L353.1,230.3 L353.1,230.4 
+		L353.2,230.3 L353.2,230.4 L353.3,230.4 L353.4,230.4 L353.5,230.4 L353.6,230.4 L353.7,230.4 L353.8,230.4 
+		L353.9,230.4 L354.0,230.4 L354.1,230.5 L354.1,230.1 L354.1,230.3 L354.1,230.8 L354.1,230.3 L354.1,229.4 
+		L354.1,230.6 L354.1,232.6 L354.1,229.5 L354.1,220.8 L354.2,239.8 L354.2,87.9 L354.2,221.2 L354.2,220.9 
+		L354.2,231.4 L354.2,232.5 L354.2,229.7 L354.2,229.4 L354.2,229.8 L354.3,230.0 L354.3,231.0 L354.3,230.5 
+		L354.3,229.6 L354.3,230.1 L354.3,229.9 L354.3,230.3 L354.3,230.5 L354.3,230.4 L354.3,230.3 L354.4,230.3 
+		L354.4,230.4 L354.4,230.3 L354.4,230.4 L354.4,230.3 L354.5,230.3 L354.5,230.4 L354.5,230.3 L354.6,230.4 
+		L354.7,230.4 L354.7,230.3 L354.7,230.4 L354.8,230.4 L354.9,230.4 L355.0,230.4 L355.1,230.4 L355.2,230.4 
+		L355.3,230.4 L355.3,230.3 L355.3,230.4 L355.4,230.4 L355.5,230.4 L355.6,230.4 L355.7,230.4 L355.8,230.4 
+		L355.9,230.4 L356.0,230.4 L356.1,230.4 L356.2,230.4 L356.2,230.3 L356.2,230.4 L356.3,230.4 L356.4,230.4 
+		L356.4,230.3 L356.4,230.4 L356.4,230.3 L356.4,230.4 L356.5,230.4 L356.5,230.3 L356.5,230.4 L356.5,230.3 
+		L356.5,230.4 L356.6,230.4 L356.7,230.4 L356.8,230.4 L356.9,230.4 L357.0,230.4 L357.1,230.4 L357.2,230.4 
+		L357.3,230.4 L357.4,230.4 L357.5,230.4 L357.6,230.4 L357.7,230.4 L357.8,230.4 L357.9,230.4 L358.0,230.4 
+		L358.1,230.4 L358.2,230.4 L358.2,230.3 L358.2,230.4 L358.3,230.4 L358.3,230.3 L358.3,230.4 L358.3,230.3 
+		L358.3,230.4 L358.4,230.3 L358.4,230.4 L358.4,230.3 L358.5,230.4 L358.6,230.4 L358.7,230.4 L358.7,230.3 
+		L358.7,230.4 L358.8,230.3 L358.8,230.4 L358.8,230.3 L358.8,230.4 L358.8,230.3 L358.8,230.4 L358.9,230.4 
+		L358.9,230.3 L358.9,230.4 L358.9,230.3 L358.9,230.4 L359.0,230.4 L359.0,230.3 L359.0,230.4 L359.1,230.4 
+		L359.2,230.3 L359.2,230.4 L359.2,230.3 L359.2,230.4 L359.3,230.4 L359.4,230.4 L359.5,230.4 L359.6,230.4 
+		L359.7,230.4 L359.8,230.4 L359.9,230.4 L360.0,230.4 L360.1,230.1 L360.1,230.6 L360.1,230.8 L360.1,230.2 
+		L360.1,229.7 L360.1,230.6 L360.1,231.7 L360.1,229.9 L360.1,226.3 L360.2,232.3 L360.2,278.4 L360.2,260.8 
+		L360.2,183.9 L360.2,232.1 L360.2,234.2 L360.2,230.3 L360.2,229.2 L360.2,229.9 L360.2,230.1 L360.3,229.8 
+		L360.3,230.3 L360.3,231.0 L360.3,230.5 L360.3,229.0 L360.3,230.5 L360.3,230.0 L360.3,230.3 L360.3,230.4 
+		L360.4,230.3 L360.4,230.4 L360.4,230.3 L360.4,230.4 L360.5,230.3 L360.5,230.4 L360.5,230.3 L360.5,230.4 
+		L360.6,230.4 L360.7,230.4 L360.8,230.4 L360.9,230.4 L361.0,230.4 L361.1,230.4 L361.2,230.4 L361.3,230.4 
+		L361.3,230.3 L361.3,230.4 L361.4,230.4 L361.5,230.4 L361.6,230.4 L361.7,230.4 L361.8,230.4 L361.9,230.4 
+		L362.0,230.4 L362.1,230.4 L362.2,230.4 L362.3,230.4 L362.3,230.3 L362.3,230.4 L362.4,230.4 L362.4,230.3 
+		L362.5,230.3 L362.5,230.4 L362.5,230.3 L362.5,230.4 L362.6,230.4 L362.7,230.4 L362.7,230.3 L362.7,230.4 
+		L362.8,230.4 L362.8,230.3 L362.8,230.4 L362.9,230.4 L362.9,230.3 L362.9,230.4 L363.0,230.3 L363.0,230.4 
+		L363.1,230.4 L363.1,230.3 L363.1,230.4 L363.1,230.3 L363.1,230.4 L363.2,230.4 L363.2,230.3 L363.2,230.4 
+		L363.3,230.4 L363.4,230.4 L363.5,230.4 L363.6,230.4 L363.6,230.3 L363.7,230.4 L363.8,230.4 L363.9,230.4 
+		L364.0,230.4 L364.0,230.3 L364.0,230.4 L364.1,230.4 L364.1,230.3 L364.1,230.4 L364.2,230.3 L364.2,230.4 
+		L364.2,230.3 L364.3,230.4 L364.3,230.3 L364.3,230.4 L364.3,230.3 L364.3,230.4 L364.3,230.3 L364.4,230.3 
+		L364.4,230.4 L364.4,230.3 L364.4,230.4 L364.5,230.4 L364.5,230.3 L364.6,230.4 L364.6,230.3 L364.6,230.4 
+		L364.6,230.3 L364.6,230.4 L364.7,230.3 L364.7,230.4 L364.7,230.3 L364.7,230.4 L364.7,230.3 L364.7,230.4 
+		L364.8,230.4 L364.8,230.3 L364.8,230.4 L364.8,230.3 L364.9,230.4 L364.9,230.3 L364.9,230.4 L364.9,230.3 
+		L364.9,230.4 L364.9,230.3 L365.0,230.3 L365.0,230.4 L365.0,230.3 L365.0,230.4 L365.0,230.3 L365.0,230.4 
+		L365.0,230.3 L365.1,230.4 L365.1,230.3 L365.1,230.4 L365.1,230.3 L365.1,230.4 L365.1,230.3 L365.2,230.3 
+		L365.2,230.4 L365.2,230.3 L365.2,230.4 L365.3,230.4 L365.4,230.4 L365.5,230.4 L365.6,230.4 L365.7,230.4 
+		L365.8,230.4 L365.9,230.4 L366.0,230.4 L366.1,230.2 L366.1,230.6 L366.1,230.4 L366.1,229.9 L366.1,230.5 
+		L366.1,231.3 L366.1,230.0 L366.1,228.1 L366.1,231.3 L366.2,239.8 L366.2,219.1 L366.2,371.6 L366.2,241.3 
+		L366.2,239.7 L366.2,229.1 L366.2,228.2 L366.2,231.1 L366.2,231.3 L366.2,230.9 L366.3,230.7 L366.3,229.7 
+		L366.3,230.1 L366.3,231.1 L366.3,230.7 L366.3,230.8 L366.3,230.4 L366.3,230.2 L366.3,230.3 L366.4,230.4 
+		L366.4,230.3 L366.4,230.4 L366.4,230.3 L366.5,230.4 L366.5,230.3 L366.5,230.4 L366.6,230.4 L366.7,230.4 
+		L366.8,230.4 L366.9,230.4 L367.0,230.4 L367.1,230.4 L367.2,230.4 L367.3,230.4 L367.4,230.4 L367.5,230.4 
+		L367.6,230.4 L367.7,230.4 L367.8,230.4 L367.9,230.4 L368.0,230.4 L368.1,230.4 L368.2,230.4 L368.3,230.4 
+		L368.4,230.4 L368.5,230.4 L368.6,230.4 L368.7,230.4 L368.8,230.4 L368.9,230.4 L369.0,230.4 L369.1,230.4 
+		L369.2,230.4 L369.3,230.4 L369.4,230.4 L369.5,230.4 L369.6,230.4 L369.7,230.4 L369.8,230.4 L369.9,230.4 
+		L370.0,230.4 L370.1,230.4 L370.2,230.4 L370.3,230.4 L370.4,230.4 L370.5,230.3 L370.5,230.4 L370.5,230.3 
+		L370.5,230.4 L370.6,230.4 L370.7,230.4 L370.8,230.3 L370.8,230.4 L370.8,230.3 L370.8,230.4 L370.9,230.4 
+		L370.9,230.3 L370.9,230.4 L371.0,230.3 L371.0,230.4 L371.0,230.3 L371.0,230.4 L371.0,230.3 L371.0,230.4 
+		L371.1,230.4 L371.1,230.3 L371.1,230.4 L371.1,230.3 L371.1,230.4 L371.1,230.3 L371.1,230.4 L371.2,230.3 
+		L371.2,230.4 L371.2,230.3 L371.2,230.4 L371.3,230.4 L371.4,230.4 L371.5,230.4 L371.6,230.4 L371.7,230.4 
+		L371.8,230.4 L371.9,230.4 L372.0,230.4 L372.1,230.4 L372.1,230.6 L372.1,230.1 L372.1,229.9 L372.1,230.6 
+		L372.1,231.0 L372.1,230.1 L372.1,229.0 L372.1,230.9 L372.1,234.3 L372.2,228.0 L372.2,182.8 L372.2,194.5 
+		L372.2,276.4 L372.2,228.2 L372.2,226.5 L372.2,230.5 L372.2,231.5 L372.2,230.7 L372.3,230.6 L372.3,230.9 
+		L372.3,230.4 L372.3,229.7 L372.3,230.2 L372.3,231.7 L372.3,230.2 L372.3,230.7 L372.3,230.4 L372.3,230.3 
+		L372.4,230.3 L372.4,230.4 L372.4,230.3 L372.4,230.4 L372.4,230.3 L372.5,230.4 L372.5,230.3 L372.5,230.4 
+		L372.5,230.3 L372.6,230.4 L372.7,230.4 L372.7,230.3 L372.7,230.4 L372.8,230.4 L372.9,230.4 L373.0,230.4 
+		L373.1,230.4 L373.2,230.4 L373.3,230.4 L373.4,230.4 L373.5,230.4 L373.6,230.4 L373.7,230.4 L373.8,230.4 
+		L373.9,230.4 L374.0,230.4 L374.1,230.4 L374.2,230.4 L374.3,230.4 L374.3,230.3 L374.3,230.4 L374.4,230.4 
+		L374.4,230.3 L374.4,230.4 L374.4,230.3 L374.4,230.4 L374.5,230.4 L374.5,230.3 L374.5,230.4 L374.6,230.3 
+		L374.6,230.4 L374.6,230.3 L374.6,230.4 L374.7,230.4 L374.7,230.3 L374.7,230.4 L374.8,230.4 L374.8,230.3 
+		L374.8,230.4 L374.9,230.4 L374.9,230.3 L374.9,230.4 L374.9,230.3 L374.9,230.4 L375.0,230.3 L375.0,230.4 
+		L375.1,230.4 L375.1,230.3 L375.1,230.4 L375.2,230.4 L375.3,230.4 L375.3,230.3 L375.3,230.4 L375.4,230.4 
+		L375.5,230.4 L375.5,230.3 L375.5,230.4 L375.6,230.4 L375.7,230.3 L375.7,230.4 L375.7,230.3 L375.7,230.4 
+		L375.8,230.4 L375.8,230.3 L375.8,230.4 L375.8,230.3 L375.8,230.4 L375.9,230.4 L375.9,230.3 L375.9,230.4 
+		L375.9,230.3 L375.9,230.4 L375.9,230.3 L376.0,230.4 L376.0,230.3 L376.0,230.4 L376.0,230.3 L376.0,230.4 
+		L376.0,230.3 L376.0,230.4 L376.1,230.4 L376.1,230.3 L376.1,230.4 L376.2,230.3 L376.2,230.4 L376.2,230.3 
+		L376.2,230.4 L376.3,230.3 L376.3,230.4 L376.3,230.3 L376.3,230.4 L376.4,230.4 L376.4,230.3 L376.4,230.4 
+		L376.5,230.4 L376.5,230.3 L376.5,230.4 L376.5,230.3 L376.5,230.4 L376.5,230.3 L376.5,230.4 L376.6,230.3 
+		L376.6,230.4 L376.6,230.3 L376.6,230.4 L376.6,230.3 L376.6,230.4 L376.7,230.3 L376.7,230.4 L376.7,230.3 
+		L376.7,230.4 L376.8,230.3 L376.8,230.4 L376.8,230.3 L376.8,230.4 L376.8,230.3 L376.8,230.4 L376.9,230.4 
+		L376.9,230.3 L376.9,230.4 L376.9,230.3 L376.9,230.4 L377.0,230.3 L377.0,230.4 L377.0,230.3 L377.0,230.4 
+		L377.0,230.3 L377.1,230.4 L377.1,230.3 L377.1,230.4 L377.1,230.3 L377.1,230.4 L377.2,230.4 L377.3,230.4 
+		L377.4,230.4 L377.5,230.4 L377.6,230.4 L377.7,230.4 L377.8,230.4 L377.9,230.4 L378.0,230.4 L378.1,230.4 
+		L378.1,230.5 L378.1,230.1 L378.1,230.4 L378.1,230.8 L378.1,230.2 L378.1,229.4 L378.1,230.7 L378.1,232.5 
+		L378.1,229.2 L378.2,221.0 L378.2,243.4 L378.2,90.4 L378.2,217.6 L378.2,221.1 L378.2,231.7 L378.2,232.5 
+		L378.2,229.6 L378.2,229.4 L378.3,229.8 L378.3,229.9 L378.3,231.0 L378.3,230.6 L378.3,229.6 L378.3,230.0 
+		L378.3,229.9 L378.3,230.3 L378.3,230.5 L378.3,230.4 L378.4,230.3 L378.4,230.4 L378.4,230.3 L378.4,230.4 
+		L378.5,230.4 L378.5,230.3 L378.5,230.4 L378.6,230.3 L378.6,230.4 L378.7,230.4 L378.7,230.3 L378.7,230.4 
+		L378.8,230.4 L378.9,230.4 L379.0,230.4 L379.1,230.4 L379.2,230.4 L379.3,230.4 L379.3,230.3 L379.3,230.4 
+		L379.4,230.4 L379.5,230.4 L379.6,230.4 L379.7,230.4 L379.8,230.4 L379.9,230.4 L380.0,230.4 L380.1,230.4 
+		L380.2,230.4 L380.3,230.4 L380.4,230.4 L380.5,230.4 L380.6,230.4 L380.7,230.4 L380.8,230.4 L380.9,230.4 
+		L381.0,230.4 L381.1,230.4 L381.2,230.4 L381.3,230.4 L381.4,230.4 L381.5,230.4 L381.6,230.4 L381.7,230.4 
+		L381.8,230.4 L381.9,230.4 L382.0,230.4 L382.1,230.4 L382.1,230.3 L382.1,230.4 L382.2,230.4 L382.3,230.4 
+		L382.3,230.3 L382.3,230.4 L382.3,230.3 L382.3,230.4 L382.4,230.4 L382.4,230.3 L382.4,230.4 L382.5,230.4 
+		L382.5,230.3 L382.5,230.4 L382.6,230.4 L382.6,230.3 L382.6,230.4 L382.6,230.3 L382.7,230.4 L382.7,230.3 
+		L382.7,230.4 L382.7,230.3 L382.8,230.4 L382.8,230.3 L382.8,230.4 L382.9,230.4 L382.9,230.3 L382.9,230.4 
+		L382.9,230.3 L383.0,230.4 L383.1,230.4 L383.1,230.3 L383.1,230.4 L383.1,230.3 L383.1,230.4 L383.2,230.4 
+		L383.2,230.3 L383.2,230.4 L383.3,230.4 L383.4,230.4 L383.5,230.4 L383.6,230.4 L383.7,230.4 L383.8,230.4 
+		L383.9,230.4 L384.0,230.4 L384.1,230.4 L384.1,230.1 L384.1,230.6 L384.1,230.8 L384.1,230.1 L384.1,229.7 
+		L384.1,230.6 L384.1,231.7 L384.1,229.7 L384.2,226.4 L384.2,233.0 L384.2,277.4 L384.2,271.6 L384.2,184.8 
+		L384.2,232.8 L384.2,234.1 L384.2,230.1 L384.2,229.3 L384.2,230.0 L384.3,230.1 L384.3,229.8 L384.3,230.3 
+		L384.3,231.0 L384.3,230.6 L384.3,229.0 L384.3,230.5 L384.3,230.0 L384.3,230.3 L384.4,230.4 L384.4,230.3 
+		L384.4,230.4 L384.4,230.3 L384.4,230.4 L384.5,230.4 L384.5,230.3 L384.5,230.4 L384.5,230.3 L384.5,230.4 
+		L384.6,230.4 L384.7,230.4 L384.8,230.4 L384.9,230.4 L384.9,230.3 L384.9,230.4 L385.0,230.4 L385.1,230.4 
+		L385.2,230.4 L385.3,230.4 L385.3,230.3 L385.3,230.4 L385.4,230.4 L385.5,230.4 L385.6,230.4 L385.7,230.4 
+		L385.8,230.4 L385.9,230.4 L386.0,230.4 L386.1,230.4 L386.1,230.3 L386.1,230.4 L386.2,230.4 L386.2,230.3 
+		L386.2,230.4 L386.3,230.4 L386.4,230.3 L386.4,230.4 L386.4,230.3 L386.5,230.4 L386.6,230.4 L386.6,230.3 
+		L386.6,230.4 L386.7,230.4 L386.7,230.3 L386.7,230.4 L386.8,230.4 L386.9,230.4 L387.0,230.3 L387.0,230.4 
+		L387.0,230.3 L387.0,230.4 L387.1,230.4 L387.2,230.4 L387.3,230.4 L387.4,230.4 L387.4,230.3 L387.4,230.4 
+		L387.5,230.4 L387.6,230.4 L387.7,230.4 L387.7,230.3 L387.8,230.4 L387.8,230.3 L387.8,230.4 L387.8,230.3 
+		L387.9,230.4 L387.9,230.3 L387.9,230.4 L388.0,230.3 L388.0,230.4 L388.0,230.3 L388.0,230.4 L388.0,230.3 
+		L388.0,230.4 L388.1,230.4 L388.1,230.3 L388.1,230.4 L388.1,230.3 L388.1,230.4 L388.1,230.3 L388.1,230.4 
+		L388.2,230.4 L388.2,230.3 L388.2,230.4 L388.2,230.3 L388.2,230.4 L388.2,230.3 L388.2,230.4 L388.3,230.3 
+		L388.3,230.4 L388.3,230.3 L388.3,230.4 L388.3,230.3 L388.4,230.4 L388.4,230.3 L388.4,230.4 L388.4,230.3 
+		L388.4,230.4 L388.4,230.3 L388.5,230.4 L388.5,230.3 L388.5,230.4 L388.5,230.3 L388.5,230.4 L388.6,230.4 
+		L388.6,230.3 L388.6,230.4 L388.6,230.3 L388.7,230.4 L388.7,230.3 L388.7,230.4 L388.7,230.3 L388.7,230.4 
+		L388.7,230.3 L388.7,230.4 L388.8,230.4 L388.8,230.3 L388.8,230.4 L388.8,230.3 L388.8,230.4 L388.8,230.3 
+		L388.8,230.4 L388.9,230.3 L388.9,230.4 L388.9,230.3 L388.9,230.4 L388.9,230.3 L388.9,230.4 L388.9,230.3 
+		L389.0,230.4 L389.0,230.3 L389.0,230.4 L389.0,230.3 L389.1,230.3 L389.1,230.4 L389.1,230.3 L389.1,230.4 
+		L389.1,230.3 L389.1,230.4 L389.1,230.3 L389.2,230.4 L389.2,230.3 L389.2,230.4 L389.2,230.3 L389.2,230.4 
+		L389.3,230.4 L389.4,230.4 L389.5,230.4 L389.6,230.4 L389.7,230.4 L389.8,230.4 L389.9,230.4 L390.0,230.4 
+		L390.1,230.4 L390.1,230.2 L390.1,230.6 L390.1,230.3 L390.1,229.9 L390.1,230.5 L390.1,231.3 L390.1,229.9 
+		L390.1,228.2 L390.2,231.6 L390.2,239.6 L390.2,215.4 L390.2,368.7 L390.2,244.9 L390.2,239.5 L390.2,228.9 
+		L390.2,228.2 L390.2,231.2 L390.2,231.3 L390.3,230.9 L390.3,230.8 L390.3,229.7 L390.3,230.1 L390.3,231.1 
+		L390.3,230.8 L390.3,230.5 L390.3,230.2 L390.4,230.3 L390.4,230.4 L390.4,230.3 L390.4,230.4 L390.4,230.3 
+		L390.5,230.3 L390.5,230.4 L390.5,230.3 L390.5,230.4 L390.6,230.4 L390.7,230.4 L390.8,230.4 L390.9,230.4 
+		L391.0,230.4 L391.1,230.4 L391.2,230.4 L391.3,230.4 L391.4,230.4 L391.5,230.4 L391.6,230.4 L391.7,230.4 
+		L391.8,230.4 L391.9,230.4 L392.0,230.4 L392.1,230.4 L392.1,230.3 L392.1,230.4 L392.2,230.4 L392.3,230.4 
+		L392.4,230.4 L392.5,230.4 L392.6,230.4 L392.7,230.4 L392.8,230.4 L392.9,230.4 L393.0,230.4 L393.1,230.4 
+		L393.2,230.4 L393.3,230.4 L393.4,230.4 L393.5,230.4 L393.6,230.4 L393.7,230.4 L393.8,230.4 L393.9,230.4 
+		L394.0,230.4 L394.1,230.4 L394.2,230.4 L394.3,230.4 L394.3,230.3 L394.3,230.4 L394.4,230.4 L394.4,230.3 
+		L394.4,230.4 L394.5,230.4 L394.5,230.3 L394.5,230.4 L394.6,230.4 L394.6,230.3 L394.6,230.4 L394.6,230.3 
+		L394.7,230.3 L394.7,230.4 L394.7,230.3 L394.7,230.4 L394.8,230.3 L394.8,230.4 L394.8,230.3 L394.8,230.4 
+		L394.9,230.4 L394.9,230.3 L394.9,230.4 L394.9,230.3 L394.9,230.4 L394.9,230.3 L394.9,230.4 L395.0,230.4 
+		L395.1,230.3 L395.1,230.4 L395.1,230.3 L395.1,230.4 L395.1,230.3 L395.1,230.4 L395.2,230.3 L395.2,230.4 
+		L395.2,230.3 L395.2,230.4 L395.2,230.3 L395.2,230.4 L395.3,230.4 L395.4,230.4 L395.5,230.4 L395.6,230.4 
+		L395.7,230.4 L395.8,230.4 L395.9,230.4 L396.0,230.4 L396.1,230.4 L396.1,230.6 L396.1,230.1 L396.1,229.9 
+		L396.1,230.6 L396.1,231.0 L396.1,230.0 L396.1,229.0 L396.1,231.1 L396.2,234.2 L396.2,227.3 L396.2,183.9 
+		L396.2,183.8 L396.2,275.3 L396.2,227.5 L396.2,226.6 L396.2,230.7 L396.2,231.4 L396.3,230.6 L396.3,230.5 
+		L396.3,230.9 L396.3,230.4 L396.3,229.7 L396.3,230.1 L396.3,231.7 L396.3,230.2 L396.3,230.7 L396.3,230.4 
+		L396.4,230.3 L396.4,230.4 L396.4,230.3 L396.4,230.4 L396.4,230.3 L396.5,230.3 L396.5,230.4 L396.5,230.3 
+		L396.5,230.4 L396.6,230.4 L396.7,230.4 L396.7,230.3 L396.7,230.4 L396.8,230.4 L396.9,230.4 L397.0,230.4 
+		L397.1,230.4 L397.2,230.4 L397.3,230.4 L397.4,230.4 L397.5,230.4 L397.6,230.4 L397.7,230.4 L397.8,230.4 
+		L397.9,230.4 L398.0,230.4 L398.0,230.3 L398.0,230.4 L398.1,230.4 L398.1,230.3 L398.1,230.4 L398.2,230.4 
+		L398.3,230.4 L398.4,230.4 L398.5,230.4 L398.5,230.3 L398.5,230.4 L398.6,230.4 L398.6,230.3 L398.6,230.4 
+		L398.6,230.3 L398.7,230.4 L398.7,230.3 L398.7,230.4 L398.8,230.4 L398.8,230.3 L398.9,230.4 L398.9,230.3 
+		L398.9,230.4 L399.0,230.3 L399.0,230.4 L399.0,230.3 L399.0,230.4 L399.1,230.4 L399.1,230.3 L399.1,230.4 
+		L399.2,230.4 L399.3,230.4 L399.3,230.3 L399.3,230.4 L399.4,230.4 L399.5,230.4 L399.6,230.4 L399.7,230.4 
+		L399.7,230.3 L399.7,230.4 L399.8,230.4 L399.8,230.3 L399.8,230.4 L399.9,230.4 L399.9,230.3 L399.9,230.4 
+		L399.9,230.3 L399.9,230.4 L400.0,230.4 L400.0,230.3 L400.0,230.4 L400.1,230.4 L400.1,230.3 L400.1,230.4 
+		L400.1,230.3 L400.1,230.4 L400.2,230.4 L400.2,230.3 L400.2,230.4 L400.2,230.3 L400.2,230.4 L400.2,230.3 
+		L400.2,230.4 L400.3,230.3 L400.3,230.4 L400.3,230.3 L400.3,230.4 L400.3,230.3 L400.4,230.4 L400.4,230.3 
+		L400.4,230.4 L400.4,230.3 L400.4,230.4 L400.4,230.3 L400.4,230.4 L400.5,230.3 L400.5,230.4 L400.5,230.3 
+		L400.5,230.4 L400.5,230.3 L400.5,230.4 L400.6,230.3 L400.6,230.4 L400.6,230.3 L400.6,230.4 L400.6,230.3 
+		L400.7,230.3 L400.7,230.4 L400.7,230.3 L400.7,230.4 L400.7,230.3 L400.7,230.4 L400.8,230.4 L400.8,230.3 
+		L400.8,230.4 L400.8,230.3 L400.8,230.4 L400.8,230.3 L400.8,230.4 L400.9,230.4 L400.9,230.3 L400.9,230.4 
+		L400.9,230.3 L401.0,230.3 L401.0,230.4 L401.0,230.3 L401.0,230.4 L401.0,230.3 L401.1,230.4 L401.1,230.3 
+		L401.1,230.4 L401.1,230.3 L401.1,230.4 L401.1,230.3 L401.2,230.4 L401.2,230.3 L401.2,230.4 L401.3,230.4 
+		L401.4,230.4 L401.5,230.4 L401.6,230.4 L401.7,230.4 L401.8,230.4 L401.9,230.4 L402.0,230.4 L402.1,230.4 
+		L402.1,230.1 L402.1,230.4 L402.1,230.8 L402.1,230.2 L402.1,229.5 L402.1,230.8 L402.2,232.5 L402.2,228.9 
+		L402.2,221.2 L402.2,247.0 L402.2,93.8 L402.2,214.1 L402.2,221.3 L402.2,232.0 L402.2,232.5 L402.2,229.5 
+		L402.3,229.4 L402.3,229.8 L402.3,229.9 L402.3,231.0 L402.3,230.6 L402.3,229.6 L402.3,229.9 L402.3,230.2 
+		L402.3,230.4 L402.4,230.4 L402.4,230.3 L402.4,230.4 L402.4,230.3 L402.4,230.4 L402.5,230.4 L402.5,230.3 
+		L402.5,230.4 L402.6,230.4 L402.6,230.3 L402.6,230.4 L402.7,230.4 L402.7,230.3 L402.7,230.4 L402.8,230.4 
+		L402.9,230.4 L403.0,230.4 L403.1,230.4 L403.2,230.4 L403.3,230.4 L403.3,230.3 L403.3,230.4 L403.4,230.4 
+		L403.5,230.4 L403.6,230.4 L403.7,230.4 L403.8,230.4 L403.9,230.4 L404.0,230.4 L404.1,230.4 L404.2,230.4 
+		L404.3,230.4 L404.3,230.3 L404.3,230.4 L404.4,230.4 L404.5,230.4 L404.6,230.4 L404.7,230.4 L404.8,230.4 
+		L404.9,230.4 L405.0,230.4 L405.1,230.4 L405.2,230.4 L405.3,230.4 L405.4,230.4 L405.5,230.4 L405.6,230.4 
+		L405.7,230.4 L405.8,230.4 L405.9,230.4 L406.0,230.4 L406.1,230.4 L406.1,230.3 L406.1,230.4 L406.2,230.4 
+		L406.2,230.3 L406.2,230.4 L406.3,230.4 L406.3,230.3 L406.4,230.3 L406.4,230.4 L406.5,230.4 L406.5,230.3 
+		L406.5,230.4 L406.5,230.3 L406.5,230.4 L406.5,230.3 L406.5,230.4 L406.6,230.4 L406.6,230.3 L406.6,230.4 
+		L406.7,230.4 L406.7,230.3 L406.7,230.4 L406.8,230.4 L406.9,230.4 L406.9,230.3 L406.9,230.4 L406.9,230.3 
+		L407.0,230.3 L407.0,230.4 L407.0,230.3 L407.0,230.4 L407.1,230.3 L407.1,230.4 L407.1,230.3 L407.1,230.4 
+		L407.1,230.3 L407.2,230.4 L407.2,230.3 L407.2,230.4 L407.2,230.3 L407.2,230.4 L407.2,230.3 L407.2,230.4 
+		L407.3,230.4 L407.4,230.4 L407.5,230.4 L407.6,230.4 L407.7,230.4 L407.8,230.4 L407.9,230.4 L408.0,230.4 
+		L408.1,230.4 L408.1,230.1 L408.1,230.6 L408.1,230.8 L408.1,230.1 L408.1,229.7 L408.1,230.7 L408.1,231.7 
+		L408.2,229.6 L408.2,226.5 L408.2,233.7 L408.2,276.2 L408.2,282.1 L408.2,186.0 L408.2,233.5 L408.2,234.0 
+		L408.2,229.9 L408.2,229.3 L408.3,230.1 L408.3,230.2 L408.3,229.8 L408.3,230.2 L408.3,231.0 L408.3,230.6 
+		L408.3,229.0 L408.3,230.5 L408.3,230.0 L408.4,230.3 L408.4,230.4 L408.4,230.3 L408.4,230.4 L408.4,230.3 
+		L408.4,230.4 L408.5,230.4 L408.5,230.3 L408.5,230.4 L408.5,230.3 L408.5,230.4 L408.6,230.4 L408.7,230.4 
+		L408.8,230.4 L408.9,230.4 L408.9,230.3 L409.0,230.4 L409.1,230.4 L409.2,230.4 L409.3,230.4 L409.3,230.3 
+		L409.3,230.4 L409.4,230.4 L409.5,230.4 L409.6,230.4 L409.7,230.4 L409.8,230.4 L409.9,230.4 L410.0,230.4 
+		L410.1,230.4 L410.1,230.3 L410.1,230.4 L410.2,230.4 L410.2,230.3 L410.2,230.4 L410.3,230.4 L410.3,230.3 
+		L410.3,230.4 L410.4,230.4 L410.4,230.3 L410.4,230.4 L410.5,230.3 L410.5,230.4 L410.6,230.3 L410.6,230.4 
+		L410.6,230.3 L410.6,230.4 L410.7,230.4 L410.8,230.4 L410.9,230.4 L411.0,230.4 L411.0,230.3 L411.0,230.4 
+		L411.0,230.3 L411.0,230.4 L411.1,230.4 L411.2,230.4 L411.3,230.4 L411.4,230.4 L411.5,230.4 L411.6,230.4 
+		L411.7,230.4 L411.8,230.4 L411.8,230.3 L411.9,230.4 L411.9,230.3 L411.9,230.4 L412.0,230.3 L412.0,230.4 
+		L412.0,230.3 L412.0,230.4 L412.0,230.3 L412.0,230.4 L412.0,230.3 L412.1,230.4 L412.1,230.3 L412.1,230.4 
+		L412.1,230.3 L412.1,230.4 L412.2,230.4 L412.2,230.3 L412.2,230.4 L412.2,230.3 L412.3,230.3 L412.3,230.4 
+		L412.3,230.3 L412.4,230.3 L412.4,230.4 L412.4,230.3 L412.4,230.4 L412.4,230.3 L412.4,230.4 L412.5,230.4 
+		L412.5,230.3 L412.5,230.4 L412.6,230.4 L412.6,230.3 L412.6,230.4 L412.6,230.3 L412.6,230.4 L412.6,230.3 
+		L412.6,230.4 L412.7,230.4 L412.7,230.3 L412.7,230.4 L412.8,230.3 L412.8,230.4 L412.8,230.3 L412.8,230.4 
+		L412.8,230.3 L412.8,230.4 L412.8,230.3 L412.9,230.3 L412.9,230.4 L412.9,230.3 L412.9,230.4 L413.0,230.4 
+		L413.0,230.3 L413.0,230.4 L413.1,230.4 L413.1,230.3 L413.1,230.4 L413.1,230.3 L413.1,230.4 L413.2,230.3 
+		L413.2,230.4 L413.2,230.3 L413.2,230.4 L413.2,230.3 L413.2,230.4 L413.3,230.4 L413.4,230.4 L413.5,230.4 
+		L413.6,230.4 L413.7,230.4 L413.8,230.4 L413.9,230.4 L414.0,230.4 L414.1,230.4 L414.1,230.3 L414.1,230.6 
+		L414.1,230.3 L414.1,229.9 L414.1,230.6 L414.1,231.2 L414.1,229.8 L414.2,228.2 L414.2,231.9 L414.2,239.4 
+		L414.2,211.9 L414.2,364.9 L414.2,248.3 L414.2,239.3 L414.2,228.6 L414.2,228.2 L414.3,231.2 L414.3,231.3 
+		L414.3,230.9 L414.3,230.8 L414.3,229.7 L414.3,230.0 L414.3,231.1 L414.3,230.9 L414.3,230.8 L414.3,230.5 
+		L414.4,230.3 L414.4,230.4 L414.4,230.3 L414.4,230.4 L414.4,230.3 L414.5,230.3 L414.5,230.4 L414.5,230.3 
+		L414.5,230.4 L414.6,230.4 L414.7,230.4 L414.8,230.4 L414.9,230.4 L415.0,230.4 L415.1,230.4 L415.2,230.4 
+		L415.3,230.4 L415.4,230.4 L415.5,230.4 L415.6,230.4 L415.7,230.4 L415.8,230.4 L415.9,230.4 L416.0,230.4 
+		L416.1,230.4 L416.1,230.3 L416.1,230.4 L416.2,230.4 L416.3,230.4 L416.4,230.4 L416.5,230.4 L416.6,230.4 
+		L416.7,230.4 L416.8,230.4 L416.9,230.4 L417.0,230.4 L417.1,230.4 L417.2,230.4 L417.3,230.4 L417.4,230.4 
+		L417.5,230.4 L417.6,230.4 L417.7,230.4 L417.8,230.4 L417.9,230.4 L418.0,230.4 L418.1,230.4 L418.1,230.3 
+		L418.1,230.4 L418.2,230.4 L418.3,230.4 L418.4,230.4 L418.5,230.4 L418.5,230.3 L418.5,230.4 L418.5,230.3 
+		L418.5,230.4 L418.6,230.4 L418.6,230.3 L418.6,230.4 L418.6,230.3 L418.6,230.4 L418.7,230.3 L418.7,230.4 
+		L418.7,230.3 L418.7,230.4 L418.8,230.4 L418.8,230.3 L418.8,230.4 L418.8,230.3 L418.8,230.4 L418.8,230.3 
+		L418.8,230.4 L418.9,230.3 L418.9,230.4 L418.9,230.3 L418.9,230.4 L419.0,230.4 L419.0,230.3 L419.1,230.4 
+		L419.1,230.3 L419.1,230.4 L419.1,230.3 L419.1,230.4 L419.2,230.3 L419.2,230.4 L419.2,230.3 L419.2,230.4 
+		L419.3,230.4 L419.4,230.4 L419.5,230.4 L419.6,230.4 L419.7,230.4 L419.8,230.4 L419.9,230.4 L420.0,230.4 
+		L420.1,230.4 L420.1,230.6 L420.1,230.1 L420.1,229.9 L420.1,230.6 L420.1,231.0 L420.1,229.9 L420.1,229.0 
+		L420.2,231.2 L420.2,234.1 L420.2,226.6 L420.2,185.2 L420.2,173.4 L420.2,274.0 L420.2,226.8 L420.2,230.8 
+		L420.3,231.3 L420.3,230.6 L420.3,230.5 L420.3,230.9 L420.3,230.5 L420.3,229.7 L420.3,230.1 L420.3,231.7 
+		L420.3,230.2 L420.3,230.7 L420.4,230.4 L420.4,230.3 L420.4,230.4 L420.4,230.3 L420.4,230.4 L420.5,230.3 
+		L420.5,230.4 L420.5,230.3 L420.5,230.4 L420.6,230.4 L420.7,230.4 L420.7,230.3 L420.7,230.4 L420.8,230.4 
+		L420.9,230.4 L421.0,230.4 L421.1,230.4 L421.2,230.4 L421.3,230.4 L421.4,230.4 L421.5,230.4 L421.6,230.4 
+		L421.7,230.4 L421.8,230.4 L421.9,230.4 L422.0,230.4 L422.1,230.4 L422.1,230.3 L422.1,230.4 L422.2,230.4 
+		L422.3,230.4 L422.4,230.4 L422.5,230.4 L422.6,230.4 L422.6,230.3 L422.6,230.4 L422.6,230.3 L422.6,230.4 
+		L422.7,230.4 L422.8,230.4 L422.9,230.4 L422.9,230.3 L423.0,230.4 L423.0,230.3 L423.0,230.4 L423.0,230.3 
+		L423.0,230.4 L423.1,230.4 L423.2,230.4 L423.3,230.4 L423.3,230.3 L423.3,230.4 L423.4,230.4 L423.5,230.4 
+		L423.6,230.4 L423.7,230.4 L423.7,230.3 L423.7,230.4 L423.8,230.4 L423.9,230.4 L423.9,230.3 L423.9,230.4 
+		L424.0,230.4 L424.0,230.3 L424.0,230.4 L424.0,230.3 L424.1,230.3 L424.1,230.4 L424.1,230.3 L424.1,230.4 
+		L424.1,230.3 L424.1,230.4 L424.2,230.4 L424.2,230.3 L424.2,230.4 L424.2,230.3 L424.2,230.4 L424.2,230.3 
+		L424.2,230.4 L424.3,230.4 L424.3,230.3 L424.3,230.4 L424.3,230.3 L424.4,230.4 L424.4,230.3 L424.4,230.4 
+		L424.4,230.3 L424.4,230.4 L424.5,230.3 L424.5,230.4 L424.5,230.3 L424.5,230.4 L424.5,230.3 L424.5,230.4 
+		L424.6,230.4 L424.6,230.3 L424.6,230.4 L424.6,230.3 L424.6,230.4 L424.7,230.3 L424.7,230.4 L424.7,230.3 
+		L424.7,230.4 L424.7,230.3 L424.7,230.4 L424.7,230.3 L424.7,230.4 L424.8,230.4 L424.8,230.3 L424.8,230.4 
+		L424.8,230.3 L424.8,230.4 L424.9,230.4 L424.9,230.3 L424.9,230.4 L425.0,230.3 L425.0,230.4 L425.0,230.3 
+		L425.0,230.4 L425.0,230.3 L425.0,230.4 L425.0,230.3 L425.1,230.3 L425.1,230.4 L425.1,230.3 L425.1,230.4 
+		L425.1,230.3 L425.1,230.4 L425.1,230.3 L425.2,230.4 L425.2,230.3 L425.2,230.4 L425.2,230.3 L425.2,230.4 
+		L425.2,230.3 L425.2,230.4 L425.3,230.4 L425.4,230.4 L425.5,230.4 L425.6,230.4 L425.7,230.4 L425.8,230.4 
+		L425.9,230.4 L426.0,230.4 L426.1,230.4 L426.1,230.1 L426.1,230.4 L426.1,230.8 L426.1,230.1 L426.1,229.5 
+		L426.2,230.9 L426.2,232.4 L426.2,228.6 L426.2,221.5 L426.2,250.6 L426.2,98.0 L426.2,210.7 L426.2,221.6 
+		L426.2,232.3 L426.2,232.5 L426.3,229.4 L426.3,229.8 L426.3,229.9 L426.3,231.0 L426.3,230.7 L426.3,229.6 
+		L426.3,229.8 L426.3,229.9 L426.4,230.2 L426.4,230.4 L426.4,230.3 L426.4,230.4 L426.4,230.3 L426.4,230.4 
+		L426.5,230.4 L426.5,230.3 L426.5,230.4 L426.6,230.4 L426.6,230.3 L426.6,230.4 L426.7,230.4 L426.7,230.3 
+		L426.7,230.4 L426.8,230.4 L426.9,230.4 L427.0,230.3 L427.0,230.4 L427.1,230.4 L427.2,230.4 L427.3,230.4 
+		L427.3,230.3 L427.3,230.4 L427.4,230.4 L427.5,230.4 L427.6,230.4 L427.7,230.4 L427.8,230.4 L427.9,230.4 
+		L428.0,230.4 L428.1,230.4 L428.1,230.3 L428.1,230.4 L428.2,230.4 L428.3,230.4 L428.4,230.4 L428.5,230.4 
+		L428.6,230.4 L428.7,230.4 L428.8,230.4 L428.9,230.4 L429.0,230.4 L429.1,230.4 L429.2,230.4 L429.3,230.4 
+		L429.4,230.4 L429.5,230.4 L429.6,230.4 L429.7,230.4 L429.8,230.4 L429.9,230.4 L430.0,230.4 L430.1,230.4 
+		L430.2,230.4 L430.2,230.3 L430.2,230.4 L430.3,230.4 L430.4,230.4 L430.4,230.3 L430.4,230.4 L430.5,230.4 
+		L430.5,230.3 L430.5,230.4 L430.6,230.4 L430.6,230.3 L430.6,230.4 L430.7,230.3 L430.7,230.4 L430.8,230.4 
+		L430.8,230.3 L430.9,230.3 L430.9,230.4 L430.9,230.3 L430.9,230.4 L430.9,230.3 L430.9,230.4 L431.0,230.3 
+		L431.0,230.4 L431.0,230.3 L431.0,230.4 L431.1,230.4 L431.1,230.3 L431.1,230.4 L431.1,230.3 L431.1,230.4 
+		L431.1,230.3 L431.1,230.4 L431.2,230.4 L431.2,230.3 L431.2,230.4 L431.2,230.3 L431.2,230.4 L431.3,230.4 
+		L431.4,230.4 L431.5,230.4 L431.6,230.4 L431.7,230.4 L431.8,230.4 L431.9,230.4 L432.0,230.4 L432.1,230.4 
+		L432.1,230.1 L432.1,230.6 L432.1,230.8 L432.1,230.1 L432.1,229.7 L432.1,230.8 L432.2,231.6 L432.2,229.4 
+		L432.2,226.6 L432.2,234.4 L432.2,274.7 L432.2,292.4 L432.2,187.5 L432.2,234.2 L432.2,233.9 L432.2,229.8 
+		L432.3,229.4 L432.3,230.2 L432.3,229.9 L432.3,230.2 L432.3,231.0 L432.3,230.7 L432.3,229.1 L432.3,230.6 
+		L432.4,230.0 L432.4,230.3 L432.4,230.4 L432.4,230.3 L432.4,230.4 L432.4,230.3 L432.4,230.4 L432.5,230.4 
+		L432.5,230.3 L432.5,230.4 L432.5,230.3 L432.5,230.4 L432.6,230.4 L432.7,230.4 L432.8,230.4 L432.9,230.4 
+		L433.0,230.4 L433.1,230.4 L433.2,230.4 L433.3,230.4 L433.3,230.3 L433.3,230.4 L433.4,230.4 L433.5,230.4 
+		L433.6,230.4 L433.7,230.4 L433.8,230.4 L433.9,230.4 L434.0,230.4 L434.1,230.4 L434.2,230.4 L434.3,230.4 
+		L434.3,230.3 L434.3,230.4 L434.4,230.4 L434.4,230.3 L434.4,230.4 L434.4,230.3 L434.4,230.4 L434.5,230.4 
+		L434.5,230.3 L434.5,230.4 L434.6,230.4 L434.7,230.4 L434.7,230.3 L434.7,230.4 L434.8,230.4 L434.8,230.3 
+		L434.9,230.4 L434.9,230.3 L434.9,230.4 L435.0,230.4 L435.1,230.4 L435.1,230.3 L435.1,230.4 L435.2,230.4 
+		L435.2,230.3 L435.2,230.4 L435.3,230.4 L435.4,230.4 L435.5,230.4 L435.6,230.4 L435.7,230.4 L435.7,230.3 
+		L435.7,230.4 L435.8,230.4 L435.9,230.4 L436.0,230.3 L436.0,230.4 L436.0,230.3 L436.0,230.4 L436.1,230.4 
+		L436.1,230.3 L436.1,230.4 L436.1,230.3 L436.1,230.4 L436.1,230.3 L436.1,230.4 L436.1,230.3 L436.2,230.3 
+		L436.2,230.4 L436.2,230.3 L436.2,230.4 L436.2,230.3 L436.2,230.4 L436.3,230.4 L436.3,230.3 L436.3,230.4 
+		L436.3,230.3 L436.3,230.4 L436.3,230.3 L436.4,230.3 L436.4,230.4 L436.4,230.3 L436.4,230.4 L436.4,230.3 
+		L436.4,230.4 L436.5,230.4 L436.5,230.3 L436.5,230.4 L436.5,230.3 L436.5,230.4 L436.6,230.4 L436.6,230.3 
+		L436.6,230.4 L436.6,230.3 L436.6,230.4 L436.7,230.4 L436.7,230.3 L436.8,230.4 L436.8,230.3 L436.8,230.4 
+		L436.8,230.3 L436.9,230.3 L436.9,230.4 L436.9,230.3 L436.9,230.4 L436.9,230.3 L436.9,230.4 L437.0,230.3 
+		L437.0,230.4 L437.0,230.3 L437.0,230.4 L437.1,230.3 L437.1,230.4 L437.1,230.3 L437.1,230.4 L437.1,230.3 
+		L437.1,230.4 L437.2,230.4 L437.2,230.3 L437.2,230.4 L437.2,230.3 L437.2,230.4 L437.3,230.4 L437.4,230.4 
+		L437.5,230.4 L437.6,230.4 L437.7,230.4 L437.8,230.4 L437.9,230.4 L438.0,230.4 L438.1,230.4 L438.1,230.3 
+		L438.1,230.6 L438.1,230.3 L438.1,229.9 L438.1,230.6 L438.1,231.2 L438.2,229.7 L438.2,228.3 L438.2,232.2 
+		L438.2,239.1 L438.2,208.4 L438.2,360.3 L438.2,251.6 L438.2,239.0 L438.2,228.3 L438.3,228.3 L438.3,231.3 
+		L438.3,231.4 L438.3,230.9 L438.3,229.7 L438.3,230.0 L438.3,231.1 L438.3,231.0 L438.3,230.8 L438.4,230.5 
+		L438.4,230.3 L438.4,230.4 L438.4,230.3 L438.4,230.4 L438.5,230.3 L438.5,230.4 L438.5,230.3 L438.5,230.4 
+		L438.6,230.4 L438.7,230.4 L438.8,230.4 L438.9,230.4 L439.0,230.4 L439.1,230.4 L439.2,230.4 L439.3,230.4 
+		L439.4,230.4 L439.5,230.4 L439.6,230.4 L439.7,230.4 L439.8,230.4 L439.9,230.4 L440.0,230.4 L440.1,230.4 
+		L440.1,230.3 L440.1,230.4 L440.2,230.4 L440.2,230.3 L440.2,230.4 L440.3,230.4 L440.4,230.4 L440.5,230.4 
+		L440.6,230.4 L440.7,230.4 L440.8,230.4 L440.9,230.4 L441.0,230.4 L441.1,230.4 L441.2,230.4 L441.3,230.4 
+		L441.4,230.4 L441.5,230.4 L441.6,230.4 L441.7,230.4 L441.8,230.4 L441.9,230.4 L442.0,230.4 L442.1,230.4 
+		L442.2,230.4 L442.2,230.3 L442.2,230.4 L442.3,230.4 L442.3,230.3 L442.3,230.4 L442.4,230.4 L442.5,230.3 
+		L442.5,230.4 L442.5,230.3 L442.5,230.4 L442.5,230.3 L442.5,230.4 L442.5,230.3 L442.5,230.4 L442.6,230.4 
+		L442.6,230.3 L442.6,230.4 L442.7,230.3 L442.7,230.4 L442.7,230.3 L442.7,230.4 L442.7,230.3 L442.7,230.4 
+		L442.8,230.4 L442.8,230.3 L442.8,230.4 L442.8,230.3 L442.8,230.4 L442.9,230.3 L442.9,230.4 L443.0,230.4 
+		L443.0,230.3 L443.0,230.4 L443.0,230.3 L443.0,230.4 L443.0,230.3 L443.1,230.4 L443.1,230.3 L443.1,230.4 
+		L443.1,230.3 L443.2,230.4 L443.2,230.3 L443.2,230.4 L443.2,230.3 L443.3,230.3 L443.3,230.4 L443.4,230.4 
+		L443.5,230.4 L443.6,230.4 L443.7,230.4 L443.8,230.4 L443.9,230.4 L444.0,230.4 L444.1,230.4 L444.1,230.6 
+		L444.1,230.1 L444.1,230.0 L444.1,230.7 L444.1,231.0 L444.2,229.9 L444.2,229.1 L444.2,231.4 L444.2,234.0 
+		L444.2,225.9 L444.2,186.8 L444.2,163.3 L444.2,272.4 L444.2,226.2 L444.2,226.9 L444.3,231.0 L444.3,231.3 
+		L444.3,230.5 L444.3,230.4 L444.3,230.8 L444.3,230.6 L444.3,229.8 L444.3,230.0 L444.3,231.6 L444.3,230.1 
+		L444.4,230.7 L444.4,230.4 L444.4,230.3 L444.4,230.4 L444.4,230.3 L444.4,230.4 L444.5,230.4 L444.5,230.3 
+		L444.5,230.4 L444.5,230.3 L444.5,230.4 L444.6,230.4 L444.7,230.4 L444.7,230.3 L444.7,230.4 L444.8,230.4 
+		L444.9,230.4 L445.0,230.4 L445.1,230.4 L445.2,230.4 L445.3,230.4 L445.4,230.4 L445.5,230.4 L445.6,230.4 
+		L445.7,230.4 L445.8,230.4 L445.9,230.4 L446.0,230.4 L446.1,230.4 L446.2,230.4 L446.3,230.4 L446.4,230.4 
+		L446.5,230.4 L446.6,230.4 L446.6,230.3 L446.6,230.4 L446.6,230.3 L446.6,230.4 L446.7,230.4 L446.8,230.4 
+		L446.9,230.4 L447.0,230.4 L447.0,230.3 L447.0,230.4 L447.1,230.4 L447.2,230.4 L447.3,230.4 L447.4,230.4 
+		L447.5,230.4 L447.6,230.4 L447.7,230.4 L447.7,230.3 L447.7,230.4 L447.8,230.4 L447.8,230.3 L447.9,230.4 
+		L447.9,230.3 L447.9,230.4 L448.0,230.4 L448.0,230.3 L448.0,230.4 L448.1,230.4 L448.2,230.3 L448.2,230.4 
+		L448.2,230.3 L448.2,230.4 L448.3,230.4 L448.3,230.3 L448.3,230.4 L448.3,230.3 L448.3,230.4 L448.4,230.3 
+		L448.4,230.4 L448.4,230.3 L448.4,230.4 L448.4,230.3 L448.4,230.4 L448.5,230.3 L448.5,230.4 L448.5,230.3 
+		L448.5,230.4 L448.5,230.3 L448.5,230.4 L448.5,230.3 L448.6,230.4 L448.6,230.3 L448.6,230.4 L448.6,230.3 
+		L448.6,230.4 L448.7,230.4 L448.7,230.3 L448.7,230.4 L448.7,230.3 L448.7,230.4 L448.7,230.3 L448.8,230.4 
+		L448.8,230.3 L448.8,230.4 L448.8,230.3 L448.9,230.3 L448.9,230.4 L448.9,230.3 L448.9,230.4 L449.0,230.4 
+		L449.0,230.3 L449.0,230.4 L449.0,230.3 L449.0,230.4 L449.1,230.3 L449.1,230.4 L449.1,230.3 L449.1,230.4 
+		L449.2,230.4 L449.2,230.3 L449.3,230.4 L449.4,230.4 L449.5,230.4 L449.6,230.4 L449.7,230.4 L449.8,230.4 
+		L449.9,230.4 L450.0,230.4 L450.1,230.4 L450.1,230.1 L450.1,230.4 L450.1,230.8 L450.1,230.1 L450.2,229.5 
+		L450.2,231.0 L450.2,232.4 L450.2,228.3 L450.2,221.8 L450.2,253.9 L450.2,103.0 L450.2,207.5 L450.2,221.9 
+		L450.2,232.5 L450.3,232.4 L450.3,229.4 L450.3,229.3 L450.3,229.7 L450.3,229.8 L450.3,231.0 L450.3,230.7 
+		L450.3,229.6 L450.3,229.7 L450.4,229.9 L450.4,230.2 L450.4,230.4 L450.4,230.3 L450.4,230.4 L450.4,230.3 
+		L450.5,230.4 L450.5,230.3 L450.5,230.4 L450.6,230.4 L450.6,230.3 L450.6,230.4 L450.7,230.4 L450.7,230.3 
+		L450.7,230.4 L450.8,230.4 L450.9,230.4 L451.0,230.4 L451.0,230.3 L451.0,230.4 L451.1,230.4 L451.2,230.4 
+		L451.3,230.4 L451.3,230.3 L451.4,230.4 L451.5,230.4 L451.6,230.4 L451.7,230.4 L451.8,230.4 L451.9,230.4 
+		L452.0,230.4 L452.0,230.3 L452.0,230.4 L452.1,230.4 L452.1,230.3 L452.1,230.4 L452.2,230.4 L452.3,230.4 
+		L452.3,230.3 L452.3,230.4 L452.4,230.4 L452.5,230.4 L452.6,230.4 L452.7,230.4 L452.8,230.4 L452.9,230.4 
+		L453.0,230.4 L453.1,230.4 L453.2,230.4 L453.3,230.4 L453.4,230.4 L453.5,230.4 L453.6,230.4 L453.7,230.4 
+		L453.8,230.4 L453.9,230.4 L454.0,230.4 L454.1,230.4 L454.2,230.4 L454.2,230.3 L454.3,230.4 L454.3,230.3 
+		L454.3,230.4 L454.4,230.3 L454.4,230.4 L454.5,230.4 L454.5,230.3 L454.6,230.4 L454.6,230.3 L454.6,230.4 
+		L454.6,230.3 L454.6,230.4 L454.7,230.4 L454.7,230.3 L454.8,230.3 L454.8,230.4 L454.9,230.4 L454.9,230.3 
+		L454.9,230.4 L454.9,230.3 L454.9,230.4 L455.0,230.4 L455.0,230.3 L455.0,230.4 L455.0,230.3 L455.0,230.4 
+		L455.1,230.4 L455.1,230.3 L455.1,230.4 L455.2,230.4 L455.2,230.3 L455.3,230.3 L455.3,230.4 L455.4,230.4 
+		L455.5,230.4 L455.6,230.4 L455.7,230.4 L455.8,230.4 L455.9,230.4 L456.0,230.4 L456.1,230.4 L456.1,230.1 
+		L456.1,230.6 L456.1,230.7 L456.1,230.0 L456.1,229.7 L456.2,230.8 L456.2,231.6 L456.2,229.2 L456.2,226.8 
+		L456.2,235.1 L456.2,273.0 L456.2,302.3 L456.2,189.2 L456.2,234.9 L456.3,233.7 L456.3,229.6 L456.3,229.5 
+		L456.3,230.2 L456.3,230.3 L456.3,229.9 L456.3,230.1 L456.3,230.9 L456.3,230.7 L456.3,229.1 L456.4,230.6 
+		L456.4,230.0 L456.4,230.3 L456.4,230.4 L456.4,230.3 L456.4,230.4 L456.4,230.3 L456.5,230.4 L456.5,230.3 
+		L456.5,230.4 L456.5,230.3 L456.6,230.4 L456.7,230.4 L456.8,230.4 L456.9,230.4 L457.0,230.4 L457.1,230.4 
+		L457.2,230.4 L457.3,230.4 L457.3,230.3 L457.4,230.4 L457.5,230.4 L457.6,230.4 L457.7,230.4 L457.8,230.4 
+		L457.9,230.4 L458.0,230.4 L458.1,230.4 L458.2,230.4 L458.3,230.4 L458.4,230.4 L458.5,230.4 L458.5,230.3 
+		L458.5,230.4 L458.6,230.4 L458.7,230.4 L458.8,230.4 L458.8,230.3 L458.8,230.4 L458.8,230.3 L458.8,230.4 
+		L458.9,230.4 L459.0,230.4 L459.0,230.3 L459.0,230.4 L459.1,230.4 L459.1,230.3 L459.1,230.4 L459.2,230.4 
+		L459.3,230.4 L459.4,230.4 L459.5,230.4 L459.6,230.4 L459.7,230.4 L459.8,230.4 L459.9,230.4 L460.0,230.4 
+		L460.1,230.4 L460.1,230.3 L460.1,230.4 L460.1,230.3 L460.1,230.4 L460.1,230.3 L460.2,230.4 L460.2,230.3 
+		L460.2,230.4 L460.2,230.3 L460.2,230.4 L460.3,230.4 L460.3,230.3 L460.3,230.4 L460.4,230.4 L460.4,230.3 
+		L460.4,230.4 L460.5,230.4 L460.5,230.3 L460.5,230.4 L460.6,230.4 L460.6,230.3 L460.6,230.4 L460.6,230.3 
+		L460.6,230.4 L460.7,230.4 L460.7,230.3 L460.7,230.4 L460.7,230.3 L460.7,230.4 L460.8,230.4 L460.9,230.4 
+		L460.9,230.3 L460.9,230.4 L460.9,230.3 L461.0,230.4 L461.0,230.3 L461.0,230.4 L461.0,230.3 L461.0,230.4 
+		L461.1,230.4 L461.1,230.3 L461.1,230.4 L461.1,230.3 L461.1,230.4 L461.2,230.4 L461.2,230.3 L461.2,230.4 
+		L461.2,230.3 L461.2,230.4 L461.3,230.4 L461.4,230.4 L461.5,230.4 L461.6,230.4 L461.7,230.4 L461.8,230.4 
+		L461.9,230.4 L462.0,230.4 L462.1,230.4 L462.1,230.3 L462.1,230.5 L462.1,230.2 L462.1,229.9 L462.2,230.7 
+		L462.2,231.2 L462.2,229.6 L462.2,228.4 L462.2,232.5 L462.2,238.7 L462.2,205.1 L462.2,355.0 L462.2,254.8 
+		L462.2,238.7 L462.3,228.0 L462.3,228.3 L462.3,231.4 L462.3,231.0 L462.3,230.9 L462.3,229.7 L462.3,229.9 
+		L462.3,231.1 L462.4,230.8 L462.4,230.5 L462.4,230.3 L462.4,230.4 L462.4,230.3 L462.4,230.4 L462.5,230.4 
+		L462.5,230.3 L462.5,230.4 L462.5,230.3 L462.5,230.4 L462.6,230.4 L462.7,230.4 L462.8,230.4 L462.9,230.4 
+		L463.0,230.4 L463.1,230.4 L463.2,230.4 L463.3,230.4 L463.4,230.4 L463.5,230.4 L463.6,230.4 L463.7,230.4 
+		L463.8,230.4 L463.9,230.4 L464.0,230.4 L464.1,230.4 L464.2,230.4 L464.2,230.3 L464.2,230.4 L464.3,230.4 
+		L464.3,230.3 L464.3,230.4 L464.3,230.3 L464.3,230.4 L464.4,230.4 L464.5,230.4 L464.5,230.3 L464.5,230.4 
+		L464.6,230.3 L464.6,230.4 L464.7,230.4 L464.8,230.4 L464.9,230.4 L465.0,230.4 L465.0,230.3 L465.0,230.4 
+		L465.1,230.4 L465.2,230.4 L465.3,230.4 L465.4,230.4 L465.5,230.4 L465.6,230.4 L465.7,230.4 L465.8,230.4 
+		L465.9,230.4 L466.0,230.4 L466.1,230.4 L466.1,230.3 L466.1,230.4 L466.2,230.4 L466.2,230.3 L466.2,230.4 
+		L466.3,230.4 L466.4,230.4 L466.4,230.3 L466.4,230.4 L466.4,230.3 L466.4,230.4 L466.5,230.4 L466.5,230.3 
+		L466.5,230.4 L466.5,230.3 L466.5,230.4 L466.5,230.3 L466.6,230.4 L466.6,230.3 L466.6,230.4 L466.7,230.4 
+		L466.7,230.3 L466.7,230.4 L466.7,230.3 L466.7,230.4 L466.7,230.3 L466.8,230.4 L466.8,230.3 L466.9,230.4 
+		L466.9,230.3 L466.9,230.4 L466.9,230.3 L466.9,230.4 L467.0,230.4 L467.0,230.3 L467.0,230.4 L467.0,230.3 
+		L467.0,230.4 L467.0,230.3 L467.1,230.4 L467.1,230.3 L467.1,230.4 L467.2,230.4 L467.2,230.3 L467.2,230.4 
+		L467.2,230.3 L467.2,230.4 L467.3,230.4 L467.4,230.4 L467.5,230.4 L467.6,230.4 L467.7,230.4 L467.8,230.4 
+		L467.9,230.4 L468.0,230.4 L468.1,230.4 L468.1,230.6 L468.1,230.1 L468.1,230.0 L468.1,230.7 L468.2,231.0 
+		L468.2,229.8 L468.2,229.1 L468.2,231.5 L468.2,233.8 L468.2,225.3 L468.2,188.7 L468.2,153.6 L468.2,270.6 
+		L468.2,225.5 L468.3,227.1 L468.3,231.2 L468.3,230.4 L468.3,230.8 L468.3,230.6 L468.3,229.8 L468.3,229.9 
+		L468.4,231.6 L468.4,230.1 L468.4,230.6 L468.4,230.4 L468.4,230.3 L468.4,230.4 L468.4,230.3 L468.5,230.4 
+		L468.5,230.3 L468.5,230.4 L468.5,230.3 L468.5,230.4 L468.6,230.4 L468.7,230.4 L468.7,230.3 L468.7,230.4 
+		L468.8,230.4 L468.9,230.4 L469.0,230.4 L469.1,230.4 L469.2,230.4 L469.3,230.4 L469.3,230.3 L469.4,230.4 
+		L469.5,230.4 L469.6,230.4 L469.7,230.4 L469.8,230.4 L469.9,230.4 L470.0,230.4 L470.1,230.4 L470.1,230.3 
+		L470.1,230.4 L470.2,230.4 L470.3,230.4 L470.4,230.4 L470.5,230.4 L470.5,230.3 L470.5,230.4 L470.5,230.3 
+		L470.6,230.4 L470.6,230.3 L470.6,230.4 L470.7,230.4 L470.8,230.4 L470.9,230.4 L471.0,230.4 L471.1,230.4 
+		L471.2,230.4 L471.3,230.4 L471.4,230.4 L471.5,230.4 L471.6,230.4 L471.7,230.4 L471.7,230.3 L471.7,230.4 
+		L471.8,230.4 L471.9,230.4 L472.0,230.4 L472.0,230.3 L472.0,230.4 L472.1,230.4 L472.1,230.3 L472.1,230.4 
+		L472.2,230.4 L472.2,230.3 L472.2,230.4 L472.2,230.3 L472.3,230.4 L472.3,230.3 L472.3,230.4 L472.3,230.3 
+		L472.4,230.4 L472.4,230.3 L472.4,230.4 L472.4,230.3 L472.4,230.4 L472.4,230.3 L472.5,230.3 L472.5,230.4 
+		L472.5,230.3 L472.5,230.4 L472.5,230.3 L472.6,230.4 L472.6,230.3 L472.6,230.4 L472.7,230.4 L472.7,230.3 
+		L472.7,230.4 L472.7,230.3 L472.7,230.4 L472.8,230.3 L472.8,230.4 L472.8,230.3 L472.8,230.4 L472.9,230.3 
+		L472.9,230.4 L472.9,230.3 L472.9,230.4 L472.9,230.3 L473.0,230.3 L473.0,230.4 L473.0,230.3 L473.0,230.4 
+		L473.1,230.3 L473.1,230.4 L473.1,230.3 L473.1,230.4 L473.1,230.3 L473.1,230.4 L473.2,230.4 L473.2,230.3 
+		L473.3,230.3 L473.3,230.4 L473.4,230.4 L473.5,230.4 L473.6,230.4 L473.7,230.4 L473.8,230.4 L473.9,230.4 
+		L474.0,230.4 L474.1,230.4 L474.1,230.2 L474.1,230.5 L474.1,230.7 L474.2,230.0 L474.2,229.6 L474.2,231.1 
+		L474.2,232.3 L474.2,228.1 L474.2,222.2 L474.2,257.2 L474.2,108.7 L474.2,204.3 L474.3,222.2 L474.3,232.8 
+		L474.3,232.4 L474.3,229.3 L474.3,229.7 L474.3,229.8 L474.3,231.0 L474.3,230.8 L474.3,229.7 L474.4,229.6 
+		L474.4,229.9 L474.4,230.2 L474.4,230.4 L474.4,230.3 L474.4,230.4 L474.4,230.3 L474.5,230.3 L474.5,230.4 
+		L474.5,230.3 L474.5,230.4 L474.6,230.3 L474.6,230.4 L474.6,230.3 L474.6,230.4 L474.7,230.4 L474.7,230.3 
+		L474.8,230.4 L474.9,230.4 L475.0,230.4 L475.0,230.3 L475.0,230.4 L475.1,230.4 L475.2,230.4 L475.3,230.4 
+		L475.4,230.3 L475.4,230.4 L475.5,230.4 L475.6,230.4 L475.7,230.4 L475.8,230.4 L475.9,230.4 L476.0,230.4 
+		L476.1,230.4 L476.2,230.4 L476.3,230.4 L476.4,230.4 L476.5,230.4 L476.5,230.3 L476.5,230.4 L476.6,230.4 
+		L476.7,230.4 L476.8,230.4 L476.9,230.4 L477.0,230.4 L477.1,230.4 L477.2,230.4 L477.3,230.4 L477.4,230.4 
+		L477.5,230.4 L477.6,230.4 L477.7,230.4 L477.8,230.4 L477.9,230.4 L478.0,230.4 L478.1,230.4 L478.2,230.4 
+		L478.3,230.4 L478.4,230.3 L478.4,230.4 L478.5,230.3 L478.5,230.4 L478.5,230.3 L478.5,230.4 L478.5,230.3 
+		L478.5,230.4 L478.5,230.3 L478.5,230.4 L478.6,230.3 L478.6,230.4 L478.6,230.3 L478.6,230.4 L478.6,230.3 
+		L478.6,230.4 L478.7,230.3 L478.7,230.4 L478.7,230.3 L478.7,230.4 L478.8,230.3 L478.8,230.4 L478.8,230.3 
+		L478.8,230.4 L478.9,230.4 L478.9,230.3 L478.9,230.4 L479.0,230.3 L479.0,230.4 L479.0,230.3 L479.0,230.4 
+		L479.0,230.3 L479.0,230.4 L479.1,230.3 L479.1,230.4 L479.1,230.3 L479.1,230.4 L479.1,230.3 L479.1,230.4 
+		L479.2,230.4 L479.2,230.3 L479.2,230.4 L479.2,230.3 L479.2,230.4 L479.2,230.3 L479.3,230.4 L479.3,230.3 
+		L479.3,230.4 L479.4,230.4 L479.5,230.4 L479.6,230.4 L479.7,230.4 L479.8,230.4 L479.9,230.4 L480.0,230.4 
+		L480.1,230.4 L480.1,230.1 L480.1,230.6 L480.1,230.7 L480.1,230.0 L480.2,229.7 L480.2,230.9 L480.2,231.5 
+		L480.2,229.1 L480.2,227.0 L480.2,235.7 L480.2,271.0 L480.2,311.8 L480.2,191.1 L480.3,235.5 L480.3,233.5 
+		L480.3,229.5 L480.3,229.6 L480.3,230.3 L480.3,229.9 L480.3,230.1 L480.3,230.9 L480.3,230.8 L480.4,229.2 
+		L480.4,230.6 L480.4,230.1 L480.4,230.3 L480.4,230.4 L480.4,230.3 L480.4,230.4 L480.5,230.4 L480.5,230.3 
+		L480.5,230.4 L480.5,230.3 L480.5,230.4 L480.5,230.3 L480.6,230.3 L480.6,230.4 L480.7,230.4 L480.8,230.4 
+		L480.9,230.4 L481.0,230.4 L481.1,230.4 L481.2,230.4 L481.3,230.4 L481.4,230.3 L481.4,230.4 L481.5,230.4 
+		L481.5,230.3 L481.5,230.4 L481.6,230.4 L481.7,230.4 L481.8,230.4 L481.9,230.4 L482.0,230.4 L482.1,230.4 
+		L482.2,230.4 L482.3,230.4 L482.4,230.4 L482.5,230.3 L482.5,230.4 L482.5,230.3 L482.5,230.4 L482.6,230.4 
+		L482.7,230.4 L482.7,230.3 L482.7,230.4 L482.8,230.4 L482.9,230.4 L483.0,230.4 L483.1,230.4 L483.2,230.4 
+		L483.3,230.4 L483.4,230.4 L483.5,230.4 L483.6,230.4 L483.7,230.4 L483.8,230.4 L483.9,230.4 L484.0,230.4 
+		L484.1,230.3 L484.1,230.4 L484.2,230.4 L484.2,230.3 L484.2,230.4 L484.2,230.3 L484.2,230.4 L484.3,230.4 
+		L484.3,230.3 L484.3,230.4 L484.3,230.3 L484.4,230.3 L484.4,230.4 L484.4,230.3 L484.5,230.4 L484.5,230.3 
+		L484.5,230.4 L484.5,230.3 L484.5,230.4 L484.6,230.4 L484.6,230.3 L484.6,230.4 L484.6,230.3 L484.6,230.4 
+		L484.7,230.4 L484.7,230.3 L484.7,230.4 L484.7,230.3 L484.7,230.4 L484.8,230.4 L484.8,230.3 L484.8,230.4 
+		L484.8,230.3 L484.8,230.4 L484.9,230.3 L484.9,230.4 L484.9,230.3 L484.9,230.4 L485.0,230.4 L485.0,230.3 
+		L485.0,230.4 L485.1,230.4 L485.1,230.3 L485.1,230.4 L485.1,230.3 L485.1,230.4 L485.1,230.3 L485.2,230.3 
+		L485.2,230.4 L485.2,230.3 L485.2,230.4 L485.3,230.4 L485.4,230.4 L485.5,230.4 L485.6,230.4 L485.7,230.4 
+		L485.8,230.4 L485.9,230.4 L486.0,230.4 L486.1,230.4 L486.1,230.3 L486.1,230.5 L486.1,230.2 L486.2,230.0 
+		L486.2,230.7 L486.2,231.1 L486.2,229.5 L486.2,228.5 L486.2,232.8 L486.2,238.3 L486.2,202.0 L486.2,348.9 
+		L486.2,257.9 L486.3,238.3 L486.3,227.8 L486.3,228.4 L486.3,231.4 L486.3,231.0 L486.3,230.9 L486.3,229.7 
+		L486.3,229.9 L486.4,231.0 L486.4,231.2 L486.4,230.7 L486.4,230.6 L486.4,230.3 L486.4,230.4 L486.4,230.3 
+		L486.5,230.4 L486.5,230.3 L486.5,230.4 L486.5,230.3 L486.6,230.4 L486.7,230.4 L486.8,230.4 L486.9,230.4 
+		L487.0,230.4 L487.1,230.4 L487.2,230.4 L487.3,230.4 L487.4,230.4 L487.5,230.4 L487.6,230.4 L487.7,230.4 
+		L487.8,230.4 L487.9,230.4 L488.0,230.4 L488.1,230.4 L488.2,230.4 L488.3,230.4 L488.4,230.4 L488.4,230.3 
+		L488.4,230.4 L488.4,230.3 L488.5,230.4 L488.5,230.3 L488.5,230.4 L488.5,230.3 L488.5,230.4 L488.6,230.4 
+		L488.6,230.3 L488.6,230.4 L488.7,230.4 L488.8,230.4 L488.9,230.4 L489.0,230.4 L489.1,230.4 L489.2,230.4 
+		L489.3,230.4 L489.4,230.4 L489.5,230.4 L489.6,230.4 L489.7,230.4 L489.8,230.4 L489.9,230.4 L490.0,230.3 
+		L490.0,230.4 L490.1,230.4 L490.1,230.3 L490.1,230.4 L490.2,230.4 L490.2,230.3 L490.2,230.4 L490.3,230.4 
+		L490.4,230.4 L490.4,230.3 L490.4,230.4 L490.4,230.3 L490.4,230.4 L490.5,230.4 L490.5,230.3 L490.5,230.4 
+		L490.6,230.4 L490.6,230.3 L490.6,230.4 L490.6,230.3 L490.6,230.4 L490.7,230.4 L490.7,230.3 L490.7,230.4 
+		L490.7,230.3 L490.7,230.4 L490.8,230.4 L490.9,230.4 L491.0,230.4 L491.0,230.3 L491.0,230.4 L491.0,230.3 
+		L491.0,230.4 L491.1,230.4 L491.2,230.3 L491.2,230.4 L491.2,230.3 L491.2,230.4 L491.2,230.3 L491.2,230.4 
+		L491.2,230.3 L491.2,230.4 L491.3,230.4 L491.4,230.4 L491.5,230.4 L491.6,230.4 L491.7,230.4 L491.8,230.4 
+		L491.9,230.4 L492.0,230.4 L492.1,230.4 L492.1,230.6 L492.1,230.1 L492.1,230.0 L492.2,230.7 L492.2,230.9 
+		L492.2,229.8 L492.2,229.2 L492.2,231.7 L492.2,233.6 L492.2,224.7 L492.2,190.8 L492.2,144.4 L492.2,268.5 
+		L492.3,224.9 L492.3,227.3 L492.3,231.3 L492.3,231.1 L492.3,230.3 L492.3,230.4 L492.3,230.7 L492.3,230.6 
+		L492.3,229.8 L492.4,229.9 L492.4,231.5 L492.4,230.1 L492.4,230.6 L492.4,230.4 L492.4,230.3 L492.4,230.4 
+		L492.4,230.3 L492.5,230.3 L492.5,230.4 L492.5,230.3 L492.5,230.4 L492.5,230.3 L492.6,230.4 L492.7,230.4 
+		L492.7,230.3 L492.8,230.4 L492.9,230.4 L493.0,230.4 L493.1,230.4 L493.2,230.4 L493.3,230.4 L493.4,230.3 
+		L493.4,230.4 L493.5,230.4 L493.6,230.4 L493.7,230.4 L493.8,230.4 L493.9,230.4 L494.0,230.4 L494.1,230.4 
+		L494.2,230.4 L494.3,230.4 L494.4,230.4 L494.5,230.4 L494.6,230.4 L494.7,230.4 L494.8,230.4 L494.9,230.4 
+		L495.0,230.4 L495.1,230.4 L495.2,230.4 L495.3,230.4 L495.4,230.4 L495.5,230.4 L495.6,230.4 L495.7,230.4 
+		L495.8,230.3 L495.8,230.4 L495.9,230.4 L496.0,230.4 L496.1,230.4 L496.2,230.4 L496.2,230.3 L496.2,230.4 
+		L496.2,230.3 L496.2,230.4 L496.3,230.3 L496.3,230.4 L496.3,230.3 L496.3,230.4 L496.3,230.3 L496.3,230.4 
+		L496.4,230.4 L496.4,230.3 L496.4,230.4 L496.5,230.4 L496.5,230.3 L496.5,230.4 L496.6,230.4 L496.6,230.3 
+		L496.6,230.4 L496.6,230.3 L496.6,230.4 L496.7,230.4 L496.8,230.4 L496.8,230.3 L496.8,230.4 L496.9,230.4 
+		L496.9,230.3 L496.9,230.4 L496.9,230.3 L496.9,230.4 L497.0,230.3 L497.0,230.4 L497.0,230.3 L497.0,230.4 
+		L497.0,230.3 L497.0,230.4 L497.1,230.4 L497.1,230.3 L497.1,230.4 L497.2,230.4 L497.3,230.3 L497.3,230.4 
+		L497.4,230.4 L497.5,230.4 L497.6,230.4 L497.7,230.4 L497.8,230.4 L497.9,230.4 L498.0,230.4 L498.1,230.4 
+		L498.1,230.2 L498.1,230.5 L498.2,230.7 L498.2,230.0 L498.2,229.6 L498.2,231.2 L498.2,232.2 L498.2,227.8 
+		L498.2,222.6 L498.2,260.2 L498.2,115.1 L498.3,201.3 L498.3,222.6 L498.3,233.0 L498.3,232.3 L498.3,229.2 
+		L498.3,229.3 L498.3,229.7 L498.3,229.8 L498.3,231.0 L498.3,230.8 L498.4,229.7 L498.4,229.5 L498.4,230.0 
+		L498.4,230.1 L498.4,230.4 L498.4,230.3 L498.4,230.4 L498.5,230.4 L498.5,230.3 L498.5,230.4 L498.5,230.3 
+		L498.5,230.4 L498.6,230.4 L498.6,230.3 L498.6,230.4 L498.6,230.3 L498.6,230.4 L498.7,230.4 L498.8,230.3 
+		L498.8,230.4 L498.9,230.4 L499.0,230.4 L499.0,230.3 L499.0,230.4 L499.1,230.4 L499.2,230.4 L499.3,230.4 
+		L499.4,230.4 L499.4,230.3 L499.4,230.4 L499.5,230.4 L499.6,230.4 L499.7,230.4 L499.8,230.4 L499.9,230.4 
+		L500.0,230.4 L500.1,230.4 L500.2,230.4 L500.3,230.4 L500.4,230.4 L500.5,230.4 L500.6,230.4 L500.7,230.4 
+		L500.7,230.3 L500.7,230.4 L500.8,230.4 L500.8,230.3 L500.8,230.4 L500.9,230.4 L501.0,230.4 L501.1,230.4 
+		L501.2,230.4 L501.3,230.4 L501.4,230.4 L501.5,230.4 L501.6,230.4 L501.7,230.4 L501.8,230.4 L501.9,230.4 
+		L502.0,230.4 L502.1,230.4 L502.2,230.4 L502.3,230.4 L502.4,230.4 L502.4,230.3 L502.4,230.4 L502.5,230.4 
+		L502.5,230.3 L502.5,230.4 L502.5,230.3 L502.5,230.4 L502.6,230.4 L502.6,230.3 L502.6,230.4 L502.7,230.3 
+		L502.7,230.4 L502.8,230.4 L502.8,230.3 L502.8,230.4 L502.8,230.3 L502.8,230.4 L502.9,230.3 L502.9,230.4 
+		L502.9,230.3 L502.9,230.4 L503.0,230.3 L503.0,230.4 L503.0,230.3 L503.0,230.4 L503.1,230.4 L503.1,230.3 
+		L503.1,230.4 L503.1,230.3 L503.2,230.3 L503.2,230.4 L503.2,230.3 L503.2,230.4 L503.2,230.3 L503.2,230.4 
+		L503.3,230.4 L503.3,230.3 L503.3,230.4 L503.4,230.4 L503.5,230.4 L503.6,230.4 L503.7,230.4 L503.8,230.4 
+		L503.9,230.4 L504.0,230.4 L504.1,230.4 L504.1,230.0 L504.1,230.7 L504.2,230.7 L504.2,230.0 L504.2,229.8 
+		L504.2,231.0 L504.2,231.5 L504.2,229.0 L504.2,227.2 L504.2,236.3 L504.2,268.7 L504.2,320.8 L504.3,193.3 
+		L504.3,236.1 L504.3,233.3 L504.3,229.3 L504.3,229.6 L504.3,230.4 L504.3,230.0 L504.3,230.9 L504.4,230.8 
+		L504.4,229.2 L504.4,230.7 L504.4,230.1 L504.4,230.3 L504.4,230.4 L504.4,230.3 L504.5,230.4 L504.5,230.3 
+		L504.5,230.4 L504.5,230.3 L504.5,230.4 L504.6,230.3 L504.6,230.4 L504.7,230.4 L504.8,230.4 L504.9,230.4 
+		L505.0,230.4 L505.1,230.4 L505.2,230.4 L505.3,230.4 L505.4,230.4 L505.4,230.3 L505.4,230.4 L505.5,230.4 
+		L505.6,230.4 L505.7,230.4 L505.8,230.4 L505.9,230.4 L506.0,230.4 L506.1,230.4 L506.1,230.3 L506.1,230.4 
+		L506.1,230.3 L506.2,230.4 L506.2,230.3 L506.2,230.4 L506.3,230.4 L506.4,230.4 L506.4,230.3 L506.4,230.4 
+		L506.4,230.3 L506.5,230.4 L506.5,230.3 L506.5,230.4 L506.5,230.3 L506.5,230.4 L506.5,230.3 L506.5,230.4 
+		L506.6,230.3 L506.6,230.4 L506.7,230.4 L506.8,230.4 L506.9,230.4 L507.0,230.4 L507.1,230.4 L507.2,230.4 
+		L507.3,230.4 L507.4,230.4 L507.5,230.4 L507.6,230.4 L507.7,230.4 L507.8,230.4 L507.9,230.3 L507.9,230.4 
+		L508.0,230.4 L508.0,230.3 L508.0,230.4 L508.0,230.3 L508.0,230.4 L508.1,230.4 L508.1,230.3 L508.1,230.4 
+		L508.1,230.3 L508.2,230.4 L508.3,230.4 L508.3,230.3 L508.3,230.4 L508.4,230.4 L508.5,230.4 L508.5,230.3 
+		L508.5,230.4 L508.6,230.4 L508.6,230.3 L508.6,230.4 L508.6,230.3 L508.7,230.4 L508.8,230.4 L508.8,230.3 
+		L508.9,230.4 L508.9,230.3 L508.9,230.4 L508.9,230.3 L508.9,230.4 L509.0,230.3 L509.0,230.4 L509.0,230.3 
+		L509.0,230.4 L509.1,230.4 L509.1,230.3 L509.2,230.3 L509.2,230.4 L509.2,230.3 L509.3,230.3 L509.3,230.4 
+		L509.4,230.4 L509.5,230.4 L509.6,230.4 L509.7,230.4 L509.8,230.4 L509.9,230.4 L510.0,230.4 L510.1,230.4 
+		L510.1,230.5 L510.2,230.2 L510.2,230.0 L510.2,230.8 L510.2,231.1 L510.2,229.4 L510.2,228.6 L510.2,233.0 
+		L510.2,237.9 L510.2,199.0 L510.2,342.1 L510.3,260.8 L510.3,237.8 L510.3,227.6 L510.3,228.5 L510.3,231.5 
+		L510.3,231.4 L510.3,231.0 L510.3,229.7 L510.4,229.9 L510.4,231.0 L510.4,231.3 L510.4,230.7 L510.4,230.6 
+		L510.4,230.3 L510.4,230.4 L510.4,230.3 L510.5,230.3 L510.5,230.4 L510.5,230.3 L510.5,230.4 L510.6,230.3 
+		L510.6,230.4 L510.7,230.4 L510.8,230.4 L510.9,230.4 L511.0,230.4 L511.1,230.4 L511.2,230.4 L511.3,230.4 
+		L511.4,230.4 L511.5,230.4 L511.6,230.4 L511.7,230.4 L511.8,230.4 L511.9,230.4 L512.0,230.4 L512.1,230.4 
+		L512.2,230.4 L512.3,230.4 L512.4,230.4 L512.4,230.3 L512.4,230.4 L512.5,230.4 L512.5,230.3 L512.5,230.4 
+		L512.6,230.4 L512.7,230.4 L512.8,230.4 L512.9,230.4 L513.0,230.4 L513.1,230.4 L513.2,230.4 L513.3,230.4 
+		L513.4,230.4 L513.5,230.4 L513.6,230.4 L513.7,230.4 L513.8,230.4 L513.9,230.4 L514.0,230.4 L514.1,230.4 
+		L514.1,230.3 L514.1,230.4 L514.2,230.4 L514.3,230.4 L514.4,230.4 L514.4,230.3 L514.5,230.4 L514.5,230.3 
+		L514.5,230.4 L514.5,230.3 L514.5,230.4 L514.6,230.4 L514.6,230.3 L514.6,230.4 L514.6,230.3 L514.6,230.4 
+		L514.7,230.3 L514.7,230.4 L514.7,230.3 L514.7,230.4 L514.7,230.3 L514.7,230.4 L514.7,230.3 L514.8,230.4 
+		L514.8,230.3 L514.8,230.4 L514.8,230.3 L514.8,230.4 L514.9,230.4 L514.9,230.3 L514.9,230.4 L514.9,230.3 
+		L515.0,230.3 L515.0,230.4 L515.0,230.3 L515.0,230.4 L515.1,230.3 L515.1,230.4 L515.1,230.3 L515.1,230.4 
+		L515.2,230.4 L515.2,230.3 L515.2,230.4 L515.3,230.3 L515.3,230.4 L515.3,230.3 L515.3,230.4 L515.4,230.4 
+		L515.5,230.4 L515.6,230.4 L515.7,230.4 L515.8,230.4 L515.9,230.4 L516.0,230.4 L516.1,230.4 L516.1,230.7 
+		L516.1,230.0 L516.2,230.0 L516.2,230.7 L516.2,230.9 L516.2,229.7 L516.2,229.3 L516.2,231.8 L516.2,233.4 
+		L516.2,224.1 L516.2,193.2 L516.3,135.6 L516.3,266.3 L516.3,224.3 L516.3,227.5 L516.3,231.5 L516.3,231.0 
+		L516.3,230.3 L516.3,230.7 L516.4,229.9 L516.4,229.8 L516.4,231.4 L516.4,230.0 L516.4,230.6 L516.4,230.4 
+		L516.4,230.3 L516.4,230.4 L516.5,230.3 L516.5,230.4 L516.5,230.3 L516.5,230.4 L516.5,230.3 L516.6,230.3 
+		L516.6,230.4 L516.7,230.4 L516.8,230.4 L516.8,230.3 L516.8,230.4 L516.9,230.4 L517.0,230.4 L517.1,230.4 
+		L517.2,230.4 L517.3,230.4 L517.4,230.4 L517.5,230.4 L517.6,230.4 L517.7,230.4 L517.8,230.4 L517.9,230.4 
+		L518.0,230.4 L518.1,230.4 L518.2,230.4 L518.3,230.4 L518.4,230.4 L518.5,230.4 L518.6,230.4 L518.7,230.4 
+		L518.8,230.4 L518.9,230.4 L519.0,230.4 L519.0,230.3 L519.0,230.4 L519.1,230.4 L519.2,230.4 L519.3,230.4 
+		L519.4,230.4 L519.5,230.4 L519.6,230.4 L519.7,230.4 L519.8,230.4 L519.8,230.3 L519.8,230.4 L519.9,230.4 
+		L520.0,230.4 L520.0,230.3 L520.0,230.4 L520.1,230.4 L520.2,230.3 L520.2,230.4 L520.3,230.4 L520.3,230.3 
+		L520.3,230.4 L520.4,230.4 L520.4,230.3 L520.5,230.4 L520.5,230.3 L520.5,230.4 L520.5,230.3 L520.5,230.4 
+		L520.6,230.4 L520.6,230.3 L520.6,230.4 L520.7,230.3 L520.7,230.4 L520.7,230.3 L520.7,230.4 L520.8,230.4 
+		L520.8,230.3 L520.8,230.4 L520.8,230.3 L520.8,230.4 L520.8,230.3 L520.8,230.4 L520.8,230.3 L520.8,230.4 
+		L520.9,230.4 L520.9,230.3 L520.9,230.4 L521.0,230.4 L521.0,230.3 L521.0,230.4 L521.1,230.3 L521.1,230.4 
+		L521.1,230.3 L521.1,230.4 L521.1,230.3 L521.1,230.4 L521.1,230.3 L521.1,230.4 L521.2,230.4 L521.2,230.3 
+		L521.2,230.4 L521.2,230.3 L521.3,230.4 L521.3,230.3 L521.3,230.4 L521.3,230.3 L521.3,230.4 L521.4,230.4 
+		L521.5,230.4 L521.6,230.4 L521.7,230.4 L521.8,230.4 L521.9,230.4 L522.0,230.4 L522.1,230.4 L522.1,230.6 
+		L522.2,230.4 L522.2,230.2 L522.2,230.0 L522.2,229.3 L522.2,229.1 L522.2,230.3 L522.2,231.8 L522.2,231.3 
+		L522.2,232.8 L522.2,275.5 L522.3,129.7 L522.3,196.3 L522.3,213.4 L522.3,222.8 L522.3,225.8 L522.3,227.0 
+		L522.3,229.0 L522.3,229.6 L522.3,228.6 L522.3,228.9 L522.4,229.0 L522.4,228.9 L522.4,229.3 L522.4,230.0 
+		L522.4,230.3 L522.4,230.4 L522.5,230.4 L522.6,230.4 L522.6,230.3 L522.6,230.4 L522.7,230.4 L522.8,230.4 
+		L522.9,230.4 L523.0,230.4 L523.0,230.3 L523.0,230.4 L523.1,230.4 L523.2,230.4 L523.3,230.4 L523.4,230.4 
+		L523.4,230.3 L523.4,230.4 L523.5,230.4 L523.6,230.4 L523.7,230.4 L523.8,230.4 L523.9,230.4 L524.0,230.4 
+		L524.1,230.4 L524.2,230.4 L524.3,230.4 L524.4,230.4 L524.5,230.4 L524.6,230.4 L524.7,230.4 L524.8,230.4 
+		L524.9,230.4 L525.0,230.4 L525.1,230.4 L525.2,230.4 L525.3,230.4 L525.4,230.4 L525.5,230.4 L525.6,230.4 
+		L525.7,230.4 L525.8,230.4 L525.9,230.4 L525.9,230.3 L525.9,230.4 L526.0,230.4 L526.1,230.4 L526.2,230.4 
+		L526.2,230.3 L526.2,230.4 L526.3,230.4 L526.4,230.4 L526.4,230.3 L526.4,230.4 L526.4,230.3 L526.4,230.4 
+		L526.4,230.3 L526.4,230.4 L526.5,230.4 L526.5,230.3 L526.5,230.4 L526.5,230.3 L526.5,230.4 L526.6,230.4 
+		L526.6,230.3 L526.6,230.4 L526.6,230.3 L526.7,230.3 L526.7,230.4 L526.7,230.3 L526.7,230.4 L526.7,230.3 
+		L526.7,230.4 L526.8,230.4 L526.9,230.4 L526.9,230.3 L526.9,230.4 L526.9,230.3 L526.9,230.4 L527.0,230.4 
+		L527.0,230.3 L527.0,230.4 L527.0,230.3 L527.0,230.4 L527.1,230.3 L527.1,230.4 L527.1,230.3 L527.1,230.4 
+		L527.2,230.4 L527.2,230.3 L527.2,230.4 L527.2,230.3 L527.2,230.4 L527.3,230.4 L527.3,230.3 L527.3,230.4 
+		L527.4,230.4 L527.5,230.4 L527.6,230.4 L527.7,230.4 L527.8,230.4 L527.9,230.4 L528.0,230.4 L528.1,230.4 
+		L528.1,228.9 L528.2,231.2 L528.2,241.7 L528.2,259.1 L528.2,213.9 L528.2,217.8 L528.2,226.6 L528.2,311.0 
+		L528.2,233.6 L528.2,224.2 L528.2,233.2 L528.3,232.0 L528.3,139.9 L528.3,229.5 L528.3,230.0 L528.3,231.1 
+		L528.3,158.3 L528.3,232.4 L528.3,226.2 L528.3,228.5 L528.4,228.5 L528.4,229.8 L528.4,230.9 L528.4,229.0 
+		L528.4,230.0 L528.4,230.2 L528.4,230.3 L528.4,230.4 L528.4,228.6 L528.4,232.4 L528.5,233.4 L528.5,231.9 
+		L528.5,229.3 L528.5,230.5 L528.5,231.0 L528.5,230.2 L528.5,230.3 L528.5,230.4 L528.6,230.0 L528.6,231.6 
+		L528.6,231.5 L528.6,230.2 L528.6,230.4 L528.6,230.1 L528.6,230.7 L528.6,230.4 L528.7,230.4 L528.7,230.3 
+		L528.7,229.3 L528.7,229.6 L528.7,230.9 L528.7,229.9 L528.7,229.6 L528.8,230.1 L528.8,230.2 L528.8,230.3 
+		L528.8,230.4 L528.8,230.2 L528.8,230.3 L528.9,230.3 L528.9,230.4 L528.9,230.7 L528.9,229.8 L528.9,230.5 
+		L529.0,230.8 L529.0,230.7 L529.0,230.3 L529.0,230.2 L529.0,230.5 L529.0,230.2 L529.0,230.4 L529.0,230.2 
+		L529.0,230.4 L529.1,230.2 L529.1,230.5 L529.1,230.4 L529.1,230.3 L529.2,230.3 L529.2,230.4 L529.2,230.8 
+		L529.2,230.4 L529.2,230.1 L529.2,230.2 L529.2,230.4 L529.2,230.1 L529.3,230.2 L529.3,230.5 L529.3,230.6 
+		L529.3,230.3 L529.3,230.5 L529.3,230.3 L529.3,230.4 L529.3,230.2 L529.4,230.4 L529.4,230.3 L529.4,230.4 
+		L529.4,230.3 L529.4,230.4 L529.4,230.3 L529.4,230.4 L529.5,230.4 L529.5,230.3 L529.5,230.5 L529.5,230.4 
+		L529.5,230.5 L529.6,230.3 L529.6,230.2 L529.6,230.3 L529.6,230.2 L529.6,230.3 L529.6,230.4 L529.6,230.3 
+		L529.7,230.5 L529.7,230.3 L529.7,230.4 L529.7,230.3 L529.7,230.4 L529.7,230.3 L529.7,230.4 L529.7,230.3 
+		L529.7,230.4 L529.8,230.3 L529.8,230.4 L529.9,230.4 L529.9,230.3 L529.9,230.5 L529.9,230.3 L529.9,230.5 
+		L530.0,230.5 L530.0,230.3 L530.0,230.2 L530.0,230.4 L530.0,230.3 L530.0,230.2 L530.0,230.3 L530.0,230.4 
+		L530.1,230.3 L530.1,230.4 L530.1,230.3 L530.1,230.4 L530.1,230.3 L530.2,230.4 L530.2,230.3 L530.2,230.4 
+		L530.2,230.3 L530.2,230.4 L530.3,230.4 L530.3,230.3 L530.4,230.3 L530.4,230.4 L530.4,230.2 L530.4,230.4 
+		L530.4,230.5 L530.4,230.4 L530.4,230.3 L530.5,230.5 L530.5,230.3 L530.5,230.4 L530.5,230.2 L530.5,230.3 
+		L530.5,230.4 L530.6,230.4 L530.6,230.3 L530.6,230.4 L530.6,230.3 L530.6,230.4 L530.6,230.3 L530.6,230.4 
+		L530.6,230.3 L530.7,230.4 L530.7,230.3 L530.7,230.4 L530.7,230.3 L530.7,230.4 L530.7,230.3 L530.7,230.4 
+		L530.7,230.3 L530.8,230.4 L530.8,230.3 L530.8,230.4 L530.9,230.3 L530.9,230.4 L530.9,230.3 L530.9,230.4 
+		L531.0,230.4 L531.0,230.3 L531.0,230.4 L531.0,230.3 L531.1,230.3 L531.1,230.4 L531.2,230.3 L531.2,230.4 
+		L531.2,230.3 L531.2,230.4 L531.2,230.3 L531.3,230.4 L531.3,230.3 L531.3,230.4 L531.3,230.3 L531.3,230.4 
+		L531.3,230.3 L531.3,230.4 L531.4,230.3 L531.4,230.4 L531.4,230.3 L531.4,230.4 L531.4,230.3 L531.4,230.4 
+		L531.4,230.3 L531.4,230.4 L531.4,230.3 L531.5,230.3 L531.5,230.4 L531.6,230.4 L531.6,230.3 L531.6,230.4 
+		L531.7,230.4 L531.7,230.3 L531.7,230.4 L531.8,230.4 L531.8,230.3 L531.8,230.4 L531.8,230.3 L531.9,230.4 
+		L531.9,230.3 L531.9,230.4 L531.9,230.3 L531.9,230.4 L532.0,230.3 L532.0,230.4 L532.0,230.3 L532.0,230.4 
+		L532.0,230.3 L532.1,230.3 L532.1,230.4 L532.1,230.3 L532.1,230.4 L532.1,230.3 L532.2,230.3 L532.2,230.4 
+		L532.2,230.3 L532.2,230.4 L532.2,230.3 L532.2,230.4 L532.2,230.3 L532.2,230.4 L532.3,230.4 L532.3,230.3 
+		L532.3,230.4 L532.3,230.3 L532.3,230.4 L532.3,230.3 L532.3,230.4 L532.3,230.3 L532.4,230.4 L532.4,230.3 
+		L532.4,230.4 L532.4,230.3 L532.4,230.4 L532.4,230.3 L532.4,230.4 L532.4,230.3 L532.5,230.4 L532.5,230.3 
+		L532.5,230.4 L532.5,230.3 L532.6,230.4 L532.7,230.4 L532.8,230.4 L532.9,230.4 L533.0,230.4 L533.0,230.3 
+		L533.1,230.3 L533.1,230.4 L533.2,230.3 L533.2,230.4 L533.2,230.3 L533.2,230.4 L533.2,230.3 L533.3,230.4 
+		L533.4,230.4 L533.5,230.4 L533.6,230.4 L533.6,230.3 L533.6,230.4 L533.6,230.3 L533.6,230.4 L533.6,230.3 
+		L533.6,230.4 L533.6,230.3 L533.6,230.4 L533.7,230.3 L533.7,230.4 L533.7,230.3 L533.7,230.4 L533.7,230.3 
+		L533.7,230.4 L533.7,230.3 L533.7,230.4 L533.8,230.3 L533.8,230.4 L533.9,230.4 L534.0,230.4 L534.1,230.4 
+		'></path>
+</g>
+	</a>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M53.9,16.7 L53.9,444.0 L575.0,444.0 L575.0,16.7 L53.9,16.7 Z '></path>
+</g>
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/huffdecode.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/huffdecode.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/huffdecode.js	(revision 28388)
@@ -0,0 +1,36 @@
+var fs = require('fs');
+var sys = require('sys');
+
+require('./typed-array.js');
+require('../../mad.js');
+require('../../id3.js');
+require('../../layer3.js');
+require('../../synth.js');
+require("../../mad.js");
+require("../../rq_table.js");
+require("../../imdct_s.js");
+require("../../huffman.js");
+require("../../bit.js");
+require("../../stream.js");
+require("../../id3.js");
+require("../../layer3.js");
+require("../../frame.js");
+require("../../synth.js");
+
+var data = fs.readFileSync("one_second_of_silence.mp3", "binary");
+// var data = fs.readFileSync("soul-2.mp3", "binary");
+
+console.log("Reading a " + Math.round(data.length / 1024) + "KB file");
+
+var stream = new Mad.Stream(data);
+
+ID3_skipHeader(stream);
+
+var STEPS_COUNT = 0;
+
+var frame = null;
+
+frame = Mad.Frame.decode(stream); // apparently first frame has nothing to decode
+frame = Mad.Frame.decode(stream);
+
+console.log("error code: " + stream.error);
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/imdct.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/imdct.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/imdct.js	(revision 28388)
@@ -0,0 +1,68 @@
+var fs = require('fs');
+var sys = require('sys');
+
+require('./typed-array.js');
+require('../../mad.js');
+require('../../imdct_s.js');
+require('../../layer3.js');
+
+function test_imdct_s() {
+    var X = [
+            -0.04093509,0.08902737,-0.04673872,0.81290334,0.33560085,-0.10171456,0.00504069,0.01295291,-0.06297208,0.59918465,0.49750966,0.04453132,0.00895240,0.00263847,-0.08176661,0.16397671,0.64196996,0.02567524];
+    var z = [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.08577475,-0.25815145,-0.18377631,0.23950195,0.62323273,-0.65152391,-0.07279154,0.76031951,-0.55000097,-0.29281906,0.79850607,-0.38041764,-0.47771208,0.78320405,-0.18270260,-0.62917816,0.71326943,0.02766476,-0.66871921,0.65951302,-0.23426843,-0.17976049,0.27317924,-0.08803856,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000];
+
+    var _z = [];
+
+    Mad.III_imdct_s(X, _z);
+
+    for (var i = 0; i < 36; i++) {
+        console.log(Math.abs(_z[i] - z[i]));
+    }
+}
+
+function test_imdct_l() {
+    var X, z;
+
+    X = [
+            -0.00048066,-0.00054808,0.00167604,0.00182871,-0.00358925,-0.00410959,0.00777910,0.01007085,-0.02279030,-0.04289347,0.26965541,-0.63553121,-0.26141275,-0.04325058,0.02372279,0.01200023,-0.01000499,-0.00799890];
+    z = [
+            -0.01657986,0.10046391,-0.03129764,-0.19516312,0.21620646,0.12183119,-0.38838422,0.12602713,0.39296440,-0.42884540,-0.16424175,0.60964111,-0.23403555,-0.52196859,0.61897832,0.14117452,-0.76309917,0.37974112,0.46963350,-0.76341553,0.29892312,0.41404148,-0.67129315,0.27711135,0.32650343,-0.55648259,0.25239373,0.23127624,-0.42700411,0.20800562,0.14425503,-0.27805873,0.13054677,0.06626966,-0.10050556,0.02050464];
+
+    _z = [];
+
+    Mad.III_imdct_l(X, _z, 0);
+
+    for (var i = 0; i < 36; i++) {
+        console.log(Math.abs(_z[i] - z[i]));
+    }
+
+    X = [
+            -0.02502749,-0.02467428,-0.02383710,-0.02223757,-0.01950704,-0.01533347,-0.00945976,-0.00192413,0.00689093,0.01623087,0.02511228,0.03241420,0.03710076,0.03837438,0.03574897,0.02914715,0.01910392,0.00665824];
+    z = [
+            -0.00000008,-0.00000039,-0.00000881,0.00000329,-0.00000494,0.00000096,0.00000473,0.00000410,0.00001113,-0.00001216,-0.00000535,-0.00000744,-0.00000184,0.00001191,-0.00001045,0.00003971,0.00000298,0.00000172,-0.00000943,0.00001619,-0.00017760,0.00081702,-0.00045995,0.00505592,-0.09994537,0.26467714,0.02750298,0.02110377,0.10963286,-0.01315806,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000];
+
+    _z = [];
+
+    Mad.III_imdct_l(X, _z, 1);
+
+    for (var i = 0; i < 36; i++) {
+        console.log(Math.abs(_z[i] - z[i]));
+    }
+
+    X = [
+            -0.00000888,-0.00000255,0.00000000,0.00000000,0.00000537,0.00000539,0.00000007,0.00000539,0.00000539,0.00000000,0.00000541,0.00000539,0.00000056,0.00000408,-0.00000283,-0.00000513,-0.00000221,-0.00000463];
+    z = [
+        0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000061,-0.00000124,0.00000068,-0.00000089,0.00000298,-0.00000468,0.00000791,-0.00001652,0.00000371,0.00001790,0.00000728,0.00000033,-0.00000029,0.00000181,0.00000694,-0.00000166,0.00002309,-0.00000006,0.00002645,0.00001713,-0.00000899,-0.00000824,0.00001314,0.00001685,-0.00000003,0.00000956,-0.00000053,0.00000154,0.00000024,-0.00000001];
+
+
+    Mad.III_imdct_l(X, _z, 3);
+
+    for (var i = 0; i < 36; i++) {
+        console.log(Math.abs(_z[i] - z[i]));
+    }
+
+}
+
+test_imdct_s();
+test_imdct_l();
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/output.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/output.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/output.js	(revision 28388)
@@ -0,0 +1,62 @@
+var fs = require('fs');
+var sys = require('sys');
+
+require('./typed-array.js');
+require('../../mad.js');
+require('../../id3.js');
+require('../../layer3.js');
+require('../../synth.js');
+require("../../mad.js");
+require("../../rq_table.js");
+require("../../imdct_s.js");
+require("../../huffman.js");
+require("../../bit.js");
+require("../../stream.js");
+require("../../id3.js");
+require("../../layer3.js");
+require("../../frame.js");
+require("../../synth.js");
+
+// var data = fs.readFileSync("one_second_of_silence.mp3", "binary");
+// var data = fs.readFileSync("one_second_beep.mp3", "binary");
+ var data = fs.readFileSync("output.mp3", "binary");
+// var data = fs.readFileSync("soul-2.mp3", "binary");
+
+console.log("Reading a " + Math.round(data.length / 1024) + "KB file");
+
+var stream = new Mad.Stream(data);
+
+ID3_skipHeader(stream);
+
+var STEPS_COUNT = 0;
+
+var frame = null;
+
+var allmin = 0;
+var allmax = 0;
+
+while (frame = Mad.Frame.decode(stream)) {
+    var synth = new Mad.Synth();
+    synth.frame(frame);
+
+    var samples = synth.pcm.samples[0];
+
+    var min = 0.0;
+    var max = 0.0;
+    var mean = 0.0;
+    
+    for (var i = 0; i < samples.length; i++) {
+        var sample = samples[i];
+        mean += (sample / samples.length);
+        if(min > sample) min = sample;
+        if(max < sample) max = sample;
+    }
+
+    console.log("min = " + min + ", max = " + max + ", mean = " + mean);
+    if(allmin > min) allmin = min;
+    if(allmax < max) allmax = max;
+}
+
+console.log("allmin = " + allmin + ", allmax = " + allmax);
+
+console.log("error code: " + stream.error);
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/plot-pcm.gnuplot
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/plot-pcm.gnuplot	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/plot-pcm.gnuplot	(revision 28388)
@@ -0,0 +1,3 @@
+set terminal png
+set output 'pcm.png'
+plot "pcm-js.txt" title 'jsmad' with lines, "pcm.txt" title 'libmad' with lines
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/plot-sample.gnuplot
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/plot-sample.gnuplot	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/plot-sample.gnuplot	(revision 28388)
@@ -0,0 +1,3 @@
+set terminal png
+set output 'sample.png'
+plot "sample-js.txt" title 'jsmad' with lines, "sample.txt" title 'libmad' with lines
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/reorder.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/reorder.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/reorder.js	(revision 28388)
@@ -0,0 +1,42 @@
+var fs = require('fs');
+var sys = require('sys');
+
+require('./typed-array.js');
+require('../../mad.js');
+require('../../bit.js');
+require('../../layer3.js');
+
+var tests = [];
+tests.push({
+flags: 0,
+sfbwidth: [
+4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56],
+xr0: [
+-0.04093509,0.08902737,-0.04673872,0.81290334,0.00504069,0.01295291,-0.06297208,0.59918465,0.00895240,0.00263847,-0.08176661,0.16397671,0.33560085,-0.10171456,-0.00988217,0.01799953,0.49750966,0.04453132,-0.00013198,-0.00544225,0.64196996,0.02567524,0.00008631,-0.00690547,-0.02852095,0.01574088,-0.01453686,0.01547711,-0.00652099,0.00076270,-0.00029287,-0.00004612,-0.00185964,0.00088917,-0.00005881,-0.00011623,0.00330001,-0.00664854,0.00635189,-0.00560501,-0.00005881,0.00011623,-0.00007224,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00552348,-0.00635189,-0.00152677,0.00315770,-0.00315770,0.00294722,0.00004612,-0.00004612,0.00002334,-0.00004612,0.00003425,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00301698,0.00351637,0.00088917,-0.00185964,0.00192188,-0.00185964,0.00192188,-0.00224057,-0.00002334,0.00002334,-0.00001359,0.00002334,-0.00001359,0.00000000,0.00001359,-0.00002334,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00057103,0.00123911,-0.00132382,0.00126719,-0.00132382,0.00155634,0.00039436,-0.00088917,0.00096732,-0.00094108,0.00000539,-0.00001359,0.00001359,0.00000000,-0.00000539,0.00001359,-0.00000539,0.00001359,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00096732,-0.00112839,-0.00029287,0.00066513,-0.00073799,0.00071350,-0.00073799,0.00083800,0.00023581,-0.00050288,0.00057103,-0.00057103,0.00000539,-0.00000539,0.00000539,-0.00000539,0.00000539,0.00000000,-0.00000539,0.00000539,0.00000000,0.00000539,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00057103,-0.00066513,-0.00018203,0.00039436,-0.00045869,0.00045869,-0.00045869,0.00052536,0.00013198,-0.00031256,0.00037347,-0.00037347,0.00037347,-0.00041553,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00010099,0.00025449,-0.00031256,0.00031256,-0.00031256,0.00033256,0.00008631,-0.00021750,0.00025449,-0.00025449,0.00025449,-0.00025449,-0.00007224,0.00016490,-0.00019957,0.00021750,-0.00019957,0.00019957,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00005881,-0.00014821,0.00016490,-0.00018203,0.00016490,-0.00016490,-0.00004612,0.00011623,-0.00014821,0.00014821,-0.00013198,0.00013198,0.00003425,-0.00008631,0.00011623,-0.00011623,0.00010099,-0.00008631,-0.00002334,0.00007224,-0.00008631,0.00010099,0.00000000,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00008631,0.00007224,0.00001359,-0.00005881,0.00007224,-0.00007224,0.00005881,-0.00004612,-0.00001359,0.00003425,-0.00005881,0.00005881,-0.00004612,0.00002334,0.00000539,-0.00002334,0.00004612,-0.00003425,0.00002334,0.00000000,-0.00000539,0.00001359,-0.00003425,0.00003425,-0.00001359,-0.00001359,-0.00000539,0.00000000,0.00001359,-0.00001359,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000539,0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000539,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000539,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000539,0.00000000,0.00000000,0.00000539,-0.00000539,0.00000000,-0.00000539,0.00000000,0.00000000,0.00002334,0.00000539,0.00000000,-0.00001359,0.00000539,0.00000539,-0.00003425,-0.00000539,0.00001359,-0.00000539,0.00000000,-0.00002334,0.00007224,0.00001359,-0.00001359,0.00000539,-0.00002334,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000539,0.00000000,-0.00000539,0.00000539,-0.00001359,0.00000000,0.00000539,-0.00001359,-0.00000539,0.00001359,-0.00001359,-0.00001359,0.00003425,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000539,-0.00001359,0.00002334,-0.00000539,0.00000000,-0.00000539,-0.00000539,0.00000000,-0.00000539,-0.00000539,-0.00000539,-0.00000539,-0.00000539,-0.00000539,0.00001359,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+xr1: [
+-0.04093509,0.08902737,-0.04673872,0.81290334,0.33560085,-0.10171456,0.00504069,0.01295291,-0.06297208,0.59918465,0.49750966,0.04453132,0.00895240,0.00263847,-0.08176661,0.16397671,0.64196996,0.02567524,-0.00988217,0.01799953,-0.02852095,0.01574088,-0.01453686,0.01547711,-0.00013198,-0.00544225,-0.00652099,0.00076270,-0.00029287,-0.00004612,0.00008631,-0.00690547,-0.00185964,0.00088917,-0.00005881,-0.00011623,0.00330001,-0.00664854,0.00635189,-0.00560501,0.00552348,-0.00635189,-0.00005881,0.00011623,-0.00007224,-0.00000539,0.00004612,-0.00004612,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00152677,0.00315770,-0.00315770,0.00294722,-0.00301698,0.00351637,0.00002334,-0.00004612,0.00003425,0.00000000,-0.00002334,0.00002334,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00088917,-0.00185964,0.00192188,-0.00185964,0.00192188,-0.00224057,-0.00001359,0.00002334,-0.00001359,0.00000000,0.00001359,-0.00002334,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00057103,0.00123911,-0.00132382,0.00126719,-0.00132382,0.00155634,0.00000539,-0.00001359,0.00001359,0.00000000,-0.00000539,0.00001359,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00039436,-0.00088917,0.00096732,-0.00094108,0.00096732,-0.00112839,-0.00000539,0.00001359,-0.00000539,0.00000000,0.00000539,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00029287,0.00066513,-0.00073799,0.00071350,-0.00073799,0.00083800,0.00000539,-0.00000539,0.00000539,0.00000000,-0.00000539,0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00023581,-0.00050288,0.00057103,-0.00057103,0.00057103,-0.00066513,0.00000000,0.00000539,-0.00000539,0.00000000,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00018203,0.00039436,-0.00045869,0.00045869,-0.00045869,0.00052536,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00013198,-0.00031256,0.00037347,-0.00037347,0.00037347,-0.00041553,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00010099,0.00025449,-0.00031256,0.00031256,-0.00031256,0.00033256,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00008631,-0.00021750,0.00025449,-0.00025449,0.00025449,-0.00025449,0.00000000,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00007224,0.00016490,-0.00019957,0.00021750,-0.00019957,0.00019957,0.00000000,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00005881,-0.00014821,0.00016490,-0.00018203,0.00016490,-0.00016490,0.00000000,0.00000000,0.00000000,0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000539,-0.00004612,0.00011623,-0.00014821,0.00014821,-0.00013198,0.00013198,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00003425,-0.00008631,0.00011623,-0.00011623,0.00010099,-0.00008631,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00002334,0.00007224,-0.00008631,0.00010099,-0.00008631,0.00007224,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00001359,-0.00005881,0.00007224,-0.00007224,0.00005881,-0.00004612,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00001359,0.00003425,-0.00005881,0.00005881,-0.00004612,0.00002334,0.00000000,0.00000539,0.00000000,0.00000000,0.00000539,0.00000539,0.00000000,0.00000000,-0.00000539,0.00000000,-0.00000539,0.00000000,0.00000539,-0.00002334,0.00004612,-0.00003425,0.00002334,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000539,0.00000000,0.00000000,-0.00000539,0.00001359,-0.00003425,0.00003425,-0.00001359,-0.00001359,0.00000000,0.00000000,-0.00000539,0.00000539,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000539,0.00000000,0.00000000,0.00000539,-0.00000539,0.00000000,0.00001359,-0.00001359,0.00000000,0.00002334,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,-0.00000539,0.00000000,-0.00000539,0.00000000,0.00000539,-0.00001359,0.00000539,0.00000000,-0.00001359,0.00000539,0.00000539,-0.00003425,0.00000000,0.00000000,-0.00000539,0.00000539,0.00000000,-0.00000539,0.00002334,-0.00000539,0.00000000,-0.00000539,-0.00000539,0.00000000,-0.00000539,0.00001359,-0.00000539,0.00000000,-0.00002334,0.00007224,0.00000539,-0.00001359,0.00000000,0.00000539,-0.00001359,-0.00000539,-0.00000539,-0.00000539,-0.00000539,-0.00000539,-0.00000539,-0.00000539,0.00001359,-0.00001359,0.00000539,-0.00002334,0.00000000,0.00000000,0.00001359,-0.00001359,-0.00001359,0.00003425,0.00000000,0.00000000,0.00001359,0.00000000,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000]});
+
+tests.push({
+flags: 0,
+sfbwidth: [
+4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56],
+xr0: [
+0.01049861,-0.00626776,-0.07993612,-0.20162641,0.11550641,0.08796911,0.02645484,-0.56619469,-0.02267439,0.04309736,-0.01993791,-0.01156261,0.63516553,0.00626776,0.00230575,-0.00548283,0.50592571,-0.01458870,0.02919763,0.01265168,0.01305370,0.00403419,-0.00369926,0.00927520,0.00277464,0.00104708,0.00003425,-0.00010099,0.01235224,-0.01412374,-0.02135219,-0.01093078,-0.01078624,0.00760231,-0.00118343,-0.00422335,0.00073799,0.00025449,-0.00025449,-0.00035287,0.00233851,-0.00872359,-0.00777910,0.00071350,-0.00013198,-0.00031256,0.00164591,-0.00237139,-0.00018203,-0.00003425,-0.00045869,-0.00019957,0.00007224,0.00019957,0.00733904,0.00516035,-0.00418535,0.00330001,0.00504069,0.00179791,0.00129543,0.00027351,0.00039436,-0.00064127,-0.00011623,0.00102032,0.00014821,0.00004612,0.00025449,0.00013198,-0.00001359,-0.00010099,-0.00010099,-0.00004612,-0.00256385,-0.00253798,0.00376250,-0.00095627,-0.00314887,-0.00225788,0.00037149,0.00105878,-0.00113655,0.00076338,-0.00039380,0.00079303,-0.00038135,-0.00040635,0.00091435,-0.00103985,-0.00011623,-0.00007224,-0.00001359,0.00004612,0.00005881,0.00002334,0.00003425,0.00003425,0.00002334,-0.00000539,-0.00292405,-0.00021009,0.00175409,0.00208338,0.00072404,-0.00016994,0.00202511,0.00078070,-0.00074657,-0.00164296,0.00032434,-0.00072147,0.00053931,0.00006104,-0.00066545,0.00101746,-0.00023516,0.00057467,-0.00053931,0.00012872,-0.00002334,-0.00001359,0.00001359,-0.00000539,-0.00002334,-0.00002334,-0.00000539,0.00000000,-0.00004612,-0.00001359,0.00002334,0.00003425,-0.00122056,-0.00035973,-0.00119106,-0.00100854,0.00002525,0.00113261,0.00135044,0.00064276,0.00048830,0.00099915,0.00045718,-0.00062601,0.00043809,-0.00085008,0.00014691,-0.00039895,0.00046804,-0.00022672,-0.00023516,0.00062481,-0.00006436,0.00022672,-0.00035134,0.00026966,0.00002334,0.00000539,0.00005881,0.00002334,-0.00001359,-0.00003425,-0.00003425,-0.00000539,-0.00005881,-0.00003425,0.00001359,0.00003425,0.00003425,0.00001359,-0.00123535,-0.00074867,0.00007410,-0.00085315,-0.00073402,0.00017643,0.00099232,0.00070496,-0.00047054,0.00063359,0.00083802,0.00018673,-0.00066191,-0.00059171,0.00005881,-0.00037347,0.00000000,-0.00007224,0.00021750,-0.00025449,0.00007224,0.00014821,0.00004612,-0.00004612,-0.00010099,0.00021750,-0.00016490,0.00004612,0.00005881,0.00003425,-0.00000539,-0.00003425,-0.00003425,-0.00001359,-0.00004612,-0.00003425,0.00000000,0.00002334,0.00002334,0.00001359,0.00002334,0.00002334,0.00000539,-0.00001359,-0.00001359,-0.00000539,0.00071350,-0.00037347,-0.00081270,-0.00045869,0.00031256,0.00041553,-0.00081270,0.00011623,0.00066513,0.00059422,0.00000539,-0.00021750,0.00078760,0.00011623,-0.00048066,-0.00064127,-0.00027351,0.00001359,-0.00007224,0.00013198,-0.00001359,-0.00014821,0.00021750,-0.00018203,0.00008631,-0.00018203,0.00010099,0.00008631,-0.00023581,0.00029287,-0.00008631,0.00019957,-0.00016490,-0.00001359,0.00021750,-0.00033256,-0.00000539,-0.00001359,-0.00000539,0.00000000,0.00000539,0.00000539,-0.00000539,0.00000000,0.00000539,0.00000539,0.00000539,0.00000000,0.00002334,0.00000539,-0.00000539,-0.00001359,-0.00001359,-0.00000539,-0.00003425,-0.00001359,0.00000539,0.00002334,-0.00066513,-0.00029287,0.00023581,0.00059422,0.00048066,0.00014821,0.00045869,0.00041553,-0.00001359,-0.00048066,-0.00057103,-0.00027351,-0.00023581,-0.00045869,-0.00018203,0.00031256,0.00059422,0.00035287,0.00000539,0.00043698,0.00033256,-0.00013198,0.00008631,-0.00019957,0.00018203,-0.00004612,-0.00016490,0.00033256,-0.00005881,0.00016490,-0.00018203,0.00008631,0.00011623,-0.00027351,0.00003425,-0.00011623,0.00016490,-0.00011623,-0.00004612,0.00019957,-0.00000539,0.00005881,-0.00013198,0.00013198,0.00001359,0.00000539,0.00003425,0.00001359,-0.00000539,-0.00002334,-0.00001359,-0.00000539,-0.00003425,-0.00001359,0.00000000,0.00002334,0.00001359,0.00001359,0.00002334,0.00001359,0.00000000,-0.00001359,-0.00002334,-0.00000539,-0.00001359,-0.00002334,0.00000539,0.00001359,0.00001359,0.00001359,0.00000539,0.00000539,0.00000000,-0.00000539,-0.00054808,-0.00037347,0.00019957,-0.00037347,-0.00043698,-0.00004612,0.00041553,0.00035287,-0.00037347,0.00025449,0.00045869,0.00021750,-0.00025449,-0.00029287,0.00045869,-0.00013198,-0.00043698,-0.00033256,0.00007224,0.00018203,-0.00050288,-0.00002334,0.00037347,0.00041553,0.00010099,-0.00007224,0.00048066,0.00014821,-0.00023581,-0.00041553,-0.00001359,-0.00011623,-0.00001359,0.00000539,0.00007224,-0.00011623,0.00007224,0.00001359,0.00003425,-0.00005881,-0.00001359,0.00010099,-0.00011623,0.00007224,-0.00005881,0.00010099,-0.00004612,-0.00007224,0.00013198,-0.00014821,0.00005881,-0.00013198,0.00008631,0.00003425,-0.00014821,0.00019957,-0.00005881,0.00013198,-0.00011623,0.00000539,-0.00000539,-0.00001359,0.00000000,0.00000539,0.00000000,0.00000539,-0.00000539,-0.00001359,-0.00000539,-0.00000539,0.00000000,0.00001359,-0.00000539,0.00001359,0.00002334,-0.00000539,-0.00002334,-0.00000539,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00025449,-0.00004612,-0.00039436,-0.00023581,0.00008631,0.00039436,0.00037347,0.00014821,0.00025449,0.00031256,0.00004612,-0.00029287,-0.00043698,-0.00023581,-0.00010099,-0.00033256,-0.00019957,0.00018203,0.00043698,0.00029287,-0.00004612,0.00031256,0.00031256,-0.00005881,-0.00037347,-0.00027351,0.00021750,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00013198,-0.00021750,0.00004612,-0.00013198,0.00013198,-0.00004612,-0.00010099,0.00021750,-0.00003425,0.00010099,-0.00013198,0.00007224,0.00005881,-0.00018203,0.00001359,-0.00005881,0.00011623,-0.00008631,-0.00001359,0.00013198,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000],
+xr1: [
+0.01049861,-0.00626776,-0.07993612,-0.20162641,0.63516553,0.00626776,0.11550641,0.08796911,0.02645484,-0.56619469,0.50592571,-0.01458870,-0.02267439,0.04309736,-0.01993791,-0.01156261,0.01305370,0.00403419,0.00230575,-0.00548283,0.00277464,0.00104708,0.00003425,-0.00010099,0.02919763,0.01265168,0.01235224,-0.01412374,-0.02135219,-0.01093078,-0.00369926,0.00927520,-0.01078624,0.00760231,-0.00118343,-0.00422335,0.00073799,0.00025449,-0.00025449,-0.00035287,-0.00018203,-0.00003425,0.00233851,-0.00872359,-0.00777910,0.00071350,0.00733904,0.00516035,-0.00013198,-0.00031256,0.00164591,-0.00237139,0.00129543,0.00027351,-0.00045869,-0.00019957,0.00007224,0.00019957,0.00014821,0.00004612,-0.00418535,0.00330001,0.00504069,0.00179791,-0.00256385,-0.00253798,0.00039436,-0.00064127,-0.00011623,0.00102032,-0.00113655,0.00076338,0.00025449,0.00013198,-0.00001359,-0.00010099,-0.00010099,-0.00004612,0.00376250,-0.00095627,-0.00314887,-0.00225788,0.00037149,0.00105878,-0.00039380,0.00079303,-0.00038135,-0.00040635,0.00091435,-0.00103985,-0.00011623,-0.00007224,-0.00001359,0.00004612,0.00005881,0.00002334,-0.00292405,-0.00021009,0.00175409,0.00208338,0.00072404,-0.00016994,0.00032434,-0.00072147,0.00053931,0.00006104,-0.00066545,0.00101746,0.00003425,0.00003425,0.00002334,-0.00000539,-0.00002334,-0.00001359,0.00202511,0.00078070,-0.00074657,-0.00164296,-0.00122056,-0.00035973,-0.00023516,0.00057467,-0.00053931,0.00012872,0.00043809,-0.00085008,0.00001359,-0.00000539,-0.00002334,-0.00002334,-0.00000539,0.00000000,-0.00119106,-0.00100854,0.00002525,0.00113261,0.00135044,0.00064276,0.00014691,-0.00039895,0.00046804,-0.00022672,-0.00023516,0.00062481,-0.00004612,-0.00001359,0.00002334,0.00003425,0.00002334,0.00000539,0.00048830,0.00099915,0.00045718,-0.00062601,-0.00123535,-0.00074867,-0.00006436,0.00022672,-0.00035134,0.00026966,0.00005881,-0.00037347,0.00005881,0.00002334,-0.00001359,-0.00003425,-0.00003425,-0.00000539,0.00007410,-0.00085315,-0.00073402,0.00017643,0.00099232,0.00070496,0.00000000,-0.00007224,0.00021750,-0.00025449,0.00007224,0.00014821,-0.00005881,-0.00003425,0.00001359,0.00003425,0.00003425,0.00001359,-0.00047054,0.00063359,0.00083802,0.00018673,-0.00066191,-0.00059171,0.00004612,-0.00004612,-0.00010099,0.00021750,-0.00016490,0.00004612,0.00005881,0.00003425,-0.00000539,-0.00003425,-0.00003425,-0.00001359,0.00071350,-0.00037347,-0.00081270,-0.00045869,0.00031256,0.00041553,-0.00007224,0.00013198,-0.00001359,-0.00014821,0.00021750,-0.00018203,-0.00004612,-0.00003425,0.00000000,0.00002334,0.00002334,0.00001359,-0.00081270,0.00011623,0.00066513,0.00059422,0.00000539,-0.00021750,0.00008631,-0.00018203,0.00010099,0.00008631,-0.00023581,0.00029287,0.00002334,0.00002334,0.00000539,-0.00001359,-0.00001359,-0.00000539,0.00078760,0.00011623,-0.00048066,-0.00064127,-0.00027351,0.00001359,-0.00008631,0.00019957,-0.00016490,-0.00001359,0.00021750,-0.00033256,-0.00000539,-0.00001359,-0.00000539,0.00000000,0.00000539,0.00000539,-0.00066513,-0.00029287,0.00023581,0.00059422,0.00048066,0.00014821,0.00008631,-0.00019957,0.00018203,-0.00004612,-0.00016490,0.00033256,-0.00000539,0.00000000,0.00000539,0.00000539,0.00000539,0.00000000,0.00045869,0.00041553,-0.00001359,-0.00048066,-0.00057103,-0.00027351,-0.00005881,0.00016490,-0.00018203,0.00008631,0.00011623,-0.00027351,0.00002334,0.00000539,-0.00000539,-0.00001359,-0.00001359,-0.00000539,-0.00023581,-0.00045869,-0.00018203,0.00031256,0.00059422,0.00035287,0.00003425,-0.00011623,0.00016490,-0.00011623,-0.00004612,0.00019957,-0.00003425,-0.00001359,0.00000539,0.00002334,0.00001359,0.00000539,0.00000539,0.00043698,0.00033256,-0.00013198,-0.00054808,-0.00037347,-0.00000539,0.00005881,-0.00013198,0.00013198,-0.00001359,-0.00011623,0.00003425,0.00001359,-0.00000539,-0.00002334,-0.00001359,-0.00000539,0.00019957,-0.00037347,-0.00043698,-0.00004612,0.00041553,0.00035287,-0.00001359,0.00000539,0.00007224,-0.00011623,0.00007224,0.00001359,-0.00003425,-0.00001359,0.00000000,0.00002334,0.00001359,0.00001359,-0.00037347,0.00025449,0.00045869,0.00021750,-0.00025449,-0.00029287,0.00003425,-0.00005881,-0.00001359,0.00010099,-0.00011623,0.00007224,0.00002334,0.00001359,0.00000000,-0.00001359,-0.00002334,-0.00000539,0.00045869,-0.00013198,-0.00043698,-0.00033256,0.00007224,0.00018203,-0.00005881,0.00010099,-0.00004612,-0.00007224,0.00013198,-0.00014821,-0.00001359,-0.00002334,0.00000539,0.00001359,0.00001359,0.00001359,-0.00050288,-0.00002334,0.00037347,0.00041553,0.00010099,-0.00007224,0.00005881,-0.00013198,0.00008631,0.00003425,-0.00014821,0.00019957,0.00000539,0.00000539,0.00000000,-0.00000539,-0.00000539,-0.00001359,0.00048066,0.00014821,-0.00023581,-0.00041553,-0.00025449,-0.00004612,-0.00005881,0.00013198,-0.00011623,0.00000539,0.00013198,-0.00021750,0.00000000,0.00000539,0.00000000,0.00000539,-0.00000539,-0.00001359,-0.00039436,-0.00023581,0.00008631,0.00039436,0.00037347,0.00014821,0.00004612,-0.00013198,0.00013198,-0.00004612,-0.00010099,0.00021750,-0.00000539,-0.00000539,0.00000000,0.00001359,-0.00000539,0.00001359,0.00025449,0.00031256,0.00004612,-0.00029287,-0.00043698,-0.00023581,-0.00003425,0.00010099,-0.00013198,0.00007224,0.00005881,-0.00018203,0.00002334,-0.00000539,-0.00002334,-0.00000539,0.00000000,0.00000000,-0.00010099,-0.00033256,-0.00019957,0.00018203,0.00043698,0.00029287,0.00001359,-0.00005881,0.00011623,-0.00008631,-0.00001359,0.00013198,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,-0.00004612,0.00031256,0.00031256,-0.00005881,-0.00037347,-0.00027351,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00021750,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000]});
+
+
+for (var i = 0; i < tests.length; i++) {
+    var test = tests[i];
+    var xr = [];
+
+    for (var j = 0; j < test.xr0.length; j++) {
+        xr[j] = test.xr0[j];
+    }
+
+    Mad.III_reorder(xr, {flags: test.flags}, test.sfbwidth);
+
+    for (var j = 0; j < xr.length; j++) {
+        console.log(Math.abs(xr[j] - test.xr1[j]));
+    }
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/sample.svg
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/sample.svg	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/sample.svg	(revision 28388)
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<desc>Produced by GNUPLOT 4.4 patchlevel 2 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,444.0 L575.0,444.0 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,444.0 L79.5,444.0 M575.0,444.0 L566.0,444.0 '></path>
+	<g transform="translate(62.2,448.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>-0.01</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,401.3 L575.0,401.3 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,401.3 L79.5,401.3 M575.0,401.3 L566.0,401.3 '></path>
+	<g transform="translate(62.2,405.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>-0.008</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,358.5 L575.0,358.5 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,358.5 L79.5,358.5 M575.0,358.5 L566.0,358.5 '></path>
+	<g transform="translate(62.2,363.0)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>-0.006</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,315.8 L575.0,315.8 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,315.8 L79.5,315.8 M575.0,315.8 L566.0,315.8 '></path>
+	<g transform="translate(62.2,320.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>-0.004</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,273.1 L575.0,273.1 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,273.1 L79.5,273.1 M575.0,273.1 L566.0,273.1 '></path>
+	<g transform="translate(62.2,277.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>-0.002</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,230.3 L575.0,230.3 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,230.3 L79.5,230.3 M575.0,230.3 L566.0,230.3 '></path>
+	<g transform="translate(62.2,234.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,187.6 L575.0,187.6 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,187.6 L79.5,187.6 M575.0,187.6 L566.0,187.6 '></path>
+	<g transform="translate(62.2,192.1)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.002</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,144.9 L575.0,144.9 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,144.9 L79.5,144.9 M575.0,144.9 L566.0,144.9 '></path>
+	<g transform="translate(62.2,149.4)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.004</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,102.2 L575.0,102.2 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,102.2 L79.5,102.2 M575.0,102.2 L566.0,102.2 '></path>
+	<g transform="translate(62.2,106.7)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.006</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,59.4 L458.1,59.4 M566.7,59.4 L575.0,59.4 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,59.4 L79.5,59.4 M575.0,59.4 L566.0,59.4 '></path>
+	<g transform="translate(62.2,63.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.008</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,16.7 L575.0,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,16.7 L79.5,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(62.2,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.01</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,444.0 L70.5,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,444.0 L70.5,435.0 M70.5,16.7 L70.5,25.7 '></path>
+	<g transform="translate(70.5,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>-0.8</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M133.6,444.0 L133.6,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M133.6,444.0 L133.6,435.0 M133.6,16.7 L133.6,25.7 '></path>
+	<g transform="translate(133.6,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>-0.6</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M196.6,444.0 L196.6,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M196.6,444.0 L196.6,435.0 M196.6,16.7 L196.6,25.7 '></path>
+	<g transform="translate(196.6,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>-0.4</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M259.7,444.0 L259.7,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M259.7,444.0 L259.7,435.0 M259.7,16.7 L259.7,25.7 '></path>
+	<g transform="translate(259.7,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>-0.2</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M322.7,444.0 L322.7,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M322.7,444.0 L322.7,435.0 M322.7,16.7 L322.7,25.7 '></path>
+	<g transform="translate(322.7,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M385.8,444.0 L385.8,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M385.8,444.0 L385.8,435.0 M385.8,16.7 L385.8,25.7 '></path>
+	<g transform="translate(385.8,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.2</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M448.9,444.0 L448.9,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M448.9,444.0 L448.9,435.0 M448.9,16.7 L448.9,25.7 '></path>
+	<g transform="translate(448.9,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.4</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M511.9,444.0 L511.9,61.7 M511.9,25.7 L511.9,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M511.9,444.0 L511.9,435.0 M511.9,16.7 L511.9,25.7 '></path>
+	<g transform="translate(511.9,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.6</text>
+	</g>
+</g>
+<g style="fill:none; color:gray; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M575.0,444.0 L575.0,16.7 '></path>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M575.0,444.0 L575.0,435.0 M575.0,16.7 L575.0,25.7 '></path>
+	<g transform="translate(575.0,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.8</text>
+	</g>
+	<path  d='M70.5,16.7 L70.5,444.0 L575.0,444.0 L575.0,16.7 L70.5,16.7 Z '></path>
+</g>
+	<a xlink:title="Plot #1">
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<g transform="translate(507.9,39.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>jsmad</text>
+	</g>
+	<path  d='M516.2,34.7 L558.4,34.7 M322.8,230.3 L322.7,230.3 L322.7,230.6 L322.8,230.3 L123.4,117.4 L333.0,233.5 
+		L516.0,349.0 L312.3,227.5 L135.8,105.9 L333.4,233.0 L503.0,359.9 L312.0,228.1 L149.4,95.3 L333.7,232.4 
+		L488.9,369.8 L311.7,228.6 L164.0,85.9 L333.9,231.8 L473.9,378.6 L311.5,229.2 L179.5,77.0 L334.1,231.2 
+		L457.9,387.9 L311.4,229.8 L195.9,71.0 L334.1,230.6 L441.1,393.9 L311.3,230.4 L213.1,61.8 L334.2,230.0 
+		L423.6,399.3 L311.3,231.0 L230.8,55.6 L334.1,229.4 L405.6,408.1 L311.4,231.6 L249.2,52.3 L334.0,228.8 
+		L387.0,408.4 L311.5,232.1 L267.9,50.5 L333.9,228.3 L368.1,412.3 L311.8,232.7 L287.0,47.5 L333.6,227.7 
+		L348.8,417.4 L312.0,233.3 L306.3,45.6 L333.3,227.2 L329.5,415.5 L312.4,233.8 L325.7,46.1 L333.0,226.6 
+		L310.1,416.3 L312.8,234.4 L345.1,45.4 L332.5,226.1 L290.8,417.0 L313.2,234.9 L364.3,47.2 L332.0,225.6 
+		L271.6,413.8 L313.7,235.3 L383.3,50.9 L331.5,225.2 L252.8,411.1 L314.3,235.8 L402.0,55.3 L330.9,224.7 
+		L234.4,402.9 L314.9,236.2 L420.2,59.4 L330.3,224.3 L216.5,397.9 L315.6,236.6 L437.7,65.6 L329.6,224.0 
+		L199.2,392.5 '></path>
+</g>
+	</a>
+	<a xlink:title="Plot #2">
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<g transform="translate(507.9,57.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text>libmad</text>
+	</g>
+	<path  d='M516.2,52.7 L558.4,52.7 M322.8,230.3 L322.7,230.3 L322.7,230.6 L172.1,379.4 L123.4,117.4 L481.1,85.1 
+		L516.0,349.0 L157.0,370.0 L135.8,105.9 L495.7,95.7 L503.0,359.9 L142.9,360.6 L149.4,95.3 L509.3,105.5 
+		L488.9,369.8 L129.8,350.2 L164.0,85.9 L521.8,116.6 L473.9,378.6 L117.9,338.3 L179.5,77.0 L533.1,128.1 
+		L457.9,387.9 L107.2,326.6 L195.9,71.0 L543.2,140.3 L441.1,393.9 L97.7,314.2 L213.1,64.3 L552.0,153.4 
+		L423.6,399.3 L89.7,301.1 L230.8,58.2 L559.4,166.1 L405.6,405.5 L82.9,287.3 L249.2,52.3 L565.4,179.8 
+		L387.0,408.4 L77.6,274.0 L267.9,50.5 L570.0,193.6 L368.1,412.3 L73.8,259.9 L287.0,47.5 L573.1,207.6 
+		L348.8,414.6 L71.4,246.7 L306.3,45.6 L574.7,221.9 L329.5,415.5 L70.5,231.8 L325.7,46.1 L574.9,235.9 
+		L310.1,416.3 L71.1,217.6 L345.1,45.4 L573.5,250.2 L290.8,414.2 L73.2,203.5 L364.3,47.2 L570.7,264.1 
+		L271.6,411.1 L76.8,189.6 L383.3,50.9 L566.4,278.3 L252.8,408.5 L81.8,175.7 L402.0,55.3 L560.7,292.5 
+		L234.4,402.9 L88.2,162.0 L420.2,59.4 L553.5,304.6 L216.5,397.9 L96.1,149.0 L437.7,65.6 L545.0,317.7 
+		L199.2,392.5 '></path>
+</g>
+	</a>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M70.5,16.7 L70.5,444.0 L575.0,444.0 L575.0,16.7 L70.5,16.7 Z '></path>
+</g>
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/scalefac.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/scalefac.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/scalefac.js	(revision 28388)
@@ -0,0 +1,757 @@
+var fs = require('fs');
+var sys = require('sys');
+
+require('./typed-array.js');
+require('../../mad.js');
+require('../../bit.js');
+require('../../layer3.js');
+
+var tests = [];
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 0,
+byte: [73,110,102,111,0,0,0,15,0,0,0,40,0,0,167,88,0,6,6,12],
+gr0_scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 0,
+byte: [73,110,102,111,0,0,0,15,0,0,0,40,0,0,167,88,0,6,6,12],
+gr0_scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 1,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 0,
+byte: [57,119,149,211,145,248,167,55,213,104,83,72,17,73,51,134,108,227,151,235],
+gr0_scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 2,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 0,
+byte: [49,143,75,66,49,185,251,162,48,77,2,144,50,42,111,106,48,122,128,178],
+gr0_scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,0,96,245,138,0,1,0,0,0,212,87,167,0,20,4,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 3,
+scalefac_compress: 9,
+flags: 0,
+scfsi: 0,
+byte: [0,0,228,12,16,12,7,0,47,76,7,128,47,76,27,32,125,204,5,32],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,2,1,0,0,0,3,0,0,1,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,3,2,1,0,0,0,3,0,0,1,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 0,
+scfsi: 9,
+byte: [44,8,67,0,116,2,51,1,216,8,3,3,164,16,83,6,216,33,163,15],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,2,1,0,0,0,3,0,0,1,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,2,3,0,0,0,2,0,1,0,0,1,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 10,
+flags: 0,
+scfsi: 0,
+byte: [0,1,196,1,0,64,3,1,228,8,99,2,24,11,83,2,228,17,227,4],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,0,1,0,0,0,4,0,0,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,0,1,0,0,0,4,0,0,2,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 1,
+scfsi: 8,
+byte: [24,8,9,0,192,44,0,136,192,147,2,60,193,20,4,120,194,5,9,68],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,0,1,0,0,0,4,0,0,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,2,0,0,0,2,0,0,0,2,1,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 8,
+flags: 1,
+scfsi: 0,
+byte: [0,1,196,0,48,30,0,137,48,32,192,184,48,44,1,37,48,74,194,56],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,0,1,0,0,0,0,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,0,1,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 0,
+scfsi: 8,
+byte: [12,8,1,0,192,53,0,100,192,152,2,16,193,27,4,76,194,14,8,224],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,0,1,0,0,0,0,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,0,1,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 10,
+flags: 0,
+scfsi: 0,
+byte: [0,2,232,1,0,96,3,1,148,7,67,1,168,10,19,2,68,16,35,3],
+gr0_scalefac: [0,0,0,0,0,0,0,2,3,2,2,0,0,0,4,0,0,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,2,3,2,2,0,0,0,4,0,0,3,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 8,
+flags: 0,
+scfsi: 8,
+byte: [8,0,131,0,240,0,227,2,124,7,179,4,136,16,67,8,100,33,243,19],
+gr0_scalefac: [0,0,0,0,0,0,0,2,3,2,2,0,0,0,4,0,0,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 0,
+scfsi: 0,
+byte: [0,1,196,0,192,12,7,64,34,204,7,176,47,140,10,0,76,76,16,240],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,0,1,0,0,0,0,0,3,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,0,1,0,0,0,0,0,3,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 5,
+flags: 2,
+scfsi: 8,
+byte: [34,0,96,40,128,18,96,95,1,8,96,171,130,58,97,57,4,160,98,206],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,0,1,0,0,0,0,0,3,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 8,
+flags: 0,
+scfsi: 0,
+byte: [0,1,232,0,48,24,192,118,48,25,0,167,48,32,193,12,48,55,2,15],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,2,2,0,0,0,0,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,2,2,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 8,
+flags: 0,
+scfsi: 8,
+byte: [8,16,128,80,22,6,6,40,15,38,10,224,33,70,19,248,70,102,45,160],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,2,2,0,0,0,0,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,0,1,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 0,
+scfsi: 0,
+byte: [0,1,232,0,128,12,96,29,204,97,42,12,124,68,76,209,133,140,30,129],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,2,2,0,0,0,0,0,2,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,2,2,0,0,0,0,0,2,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 8,
+flags: 0,
+scfsi: 8,
+byte: [8,17,2,32,56,204,14,160,31,140,25,144,72,76,46,96,151,140,105,177],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,2,2,0,0,0,0,0,2,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 10,
+flags: 1,
+scfsi: 0,
+byte: [0,1,232,1,1,0,3,1,124,7,99,1,112,10,179,1,212,17,67,3],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,2,2,0,0,0,4,0,1,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,2,2,0,0,0,4,0,1,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 5,
+flags: 0,
+scfsi: 8,
+byte: [34,0,14,3,196,192,243,1,188,193,160,4,40,194,241,8,228,198,176,27],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,2,2,0,0,0,4,0,1,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 1,
+scfsi: 0,
+byte: [0,0,232,0,112,12,5,192,29,204,5,144,42,140,6,192,70,76,11,48],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,2,2,0,0,0,0,0,1,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,3,2,2,0,0,0,0,0,1,3,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 10,
+byte: [48,43,192,20,48,82,128,132,48,139,65,71,48,248,130,182,50,51,200,67],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,2,2,0,0,0,0,0,1,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 8,
+flags: 1,
+scfsi: 0,
+byte: [0,0,232,0,48,22,192,116,48,20,128,173,48,25,65,26,48,41,2,45],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,2,2,0,0,0,0,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,3,2,2,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 11,
+byte: [48,46,0,41,48,84,192,111,48,141,1,40,48,251,194,129,50,57,135,162],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,2,2,0,0,0,0,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 10,
+flags: 0,
+scfsi: 0,
+byte: [0,0,232,1,64,96,3,1,96,7,83,1,60,10,195,1,112,17,243,2],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,2,2,0,0,0,5,0,0,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,3,2,2,0,0,0,5,0,0,3,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 8,
+byte: [51,12,58,53,96,88,56,237,11,63,226,72,50,62,198,253,62,138,52,193],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,2,2,0,0,0,5,0,0,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 8,
+flags: 2,
+scfsi: 0,
+byte: [0,0,148,0,49,92,116,49,40,175,49,77,32,50,18,57,48,79,198,216],
+gr0_scalefac: [0,0,0,0,0,0,0,0,2,1,1,0,0,0,0,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,2,1,1,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 11,
+byte: [48,50,128,75,48,87,192,63,48,144,0,234,49,0,66,15,50,67,6,76],
+gr0_scalefac: [0,0,0,0,0,0,0,0,2,1,1,0,0,0,0,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 13,
+flags: 0,
+scfsi: 0,
+byte: [0,0,1,173,128,40,172,0,99,130,153,139,208,6,50,109,153,79,100,96],
+gr0_scalefac: [0,0,0,0,0,0,0,1,5,3,3,0,0,0,5,0,5,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,5,3,3,0,0,0,5,0,5,3,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 8,
+byte: [48,53,64,90,48,89,0,36,48,145,192,201,49,2,1,208,50,71,69,151],
+gr0_scalefac: [0,0,0,0,0,0,0,1,5,3,3,0,0,0,5,0,5,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 13,
+flags: 0,
+scfsi: 0,
+byte: [0,0,1,137,0,40,12,0,100,51,1,141,18,230,53,126,25,67,238,96],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,2,2,0,0,0,5,0,0,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,4,2,2,0,0,0,5,0,0,3,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 8,
+byte: [48,55,0,105,48,90,192,5,48,147,0,164,49,3,193,145,50,74,4,212],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,2,2,0,0,0,5,0,0,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 10,
+flags: 1,
+scfsi: 0,
+byte: [0,1,216,1,0,96,3,1,56,7,19,0,236,10,227,0,216,18,115,1],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,0,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,0,3,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 8,
+byte: [48,57,64,118,12,11,132,194,81,1,252,196,18,5,48,201,51,16,36,251],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,0,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 13,
+flags: 0,
+scfsi: 0,
+byte: [0,0,2,137,128,40,144,0,99,50,129,136,16,38,27,110,24,147,118,96],
+gr0_scalefac: [0,0,0,0,0,0,0,2,4,2,3,0,0,0,5,0,4,4,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,2,4,2,3,0,0,0,5,0,4,4,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 8,
+byte: [48,58,128,133,48,93,64,24,48,148,128,82,49,5,193,3,50,78,131,44],
+gr0_scalefac: [0,0,0,0,0,0,0,2,4,2,3,0,0,0,5,0,4,4,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 10,
+flags: 0,
+scfsi: 0,
+byte: [0,1,216,1,0,0,3,1,24,6,243,0,188,10,227,0,128,18,147,0],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 9,
+byte: [48,60,192,144,48,94,0,53,48,149,192,35,49,6,0,178,50,79,194,59],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 10,
+flags: 0,
+scfsi: 0,
+byte: [0,1,216,1,2,64,3,1,20,6,195,0,160,10,243,0,76,18,131,0],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,2,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,2,2,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 8,
+byte: [48,62,0,157,48,95,64,78,18,18,196,196,27,1,84,201,64,4,120,252],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,2,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 10,
+flags: 1,
+scfsi: 0,
+byte: [0,1,216,1,0,96,3,1,0,6,179,0,132,10,227,0,24,18,146,80],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,0,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,0,3,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 8,
+byte: [48,63,192,168,48,96,0,103,48,150,64,46,49,6,128,9,50,80,64,114],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,4,0,0,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 13,
+flags: 0,
+scfsi: 0,
+byte: [0,0,2,169,128,32,176,2,98,146,81,131,143,226,22,224,7,126,96,24],
+gr0_scalefac: [0,0,0,0,0,0,0,2,5,2,3,0,0,0,4,0,5,4,0,0,1,0],
+scalefac: [0,0,0,0,0,0,0,2,5,2,3,0,0,0,4,0,5,4,0,0,1,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 8,
+byte: [48,65,0,181,48,96,192,124,48,150,128,95,49,6,64,122,50,79,1,185],
+gr0_scalefac: [0,0,0,0,0,0,0,2,5,2,3,0,0,0,4,0,5,4,0,0,1,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 12,
+flags: 0,
+scfsi: 0,
+byte: [0,0,1,133,1,128,1,135,67,57,130,165,97,42,78,97,4,148,96,63],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 9,
+byte: [48,66,192,190,48,97,0,145,48,150,192,134,49,5,128,209,50,77,194,186],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 13,
+flags: 0,
+scfsi: 0,
+byte: [0,0,2,137,128,32,16,0,98,50,49,128,143,161,102,225,137,119,166,4],
+gr0_scalefac: [0,0,0,0,0,0,0,2,4,2,3,0,0,0,4,0,0,4,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,2,4,2,3,0,0,0,4,0,0,4,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 8,
+byte: [48,68,0,201,48,97,192,164,48,150,0,173,49,4,193,30,50,75,3,161],
+gr0_scalefac: [0,0,0,0,0,0,0,2,4,2,3,0,0,0,4,0,0,4,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 1,
+scfsi: 0,
+byte: [0,1,216,12,0,12,3,32,24,204,0,80,42,12,0,144,73,76,4,192],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,3,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,3,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 9,
+byte: [48,69,64,212,48,98,0,185,48,150,64,208,49,3,129,103,50,72,196,116],
+gr0_scalefac: [0,0,0,0,0,0,0,1,3,1,2,0,0,0,3,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 12,
+flags: 0,
+scfsi: 0,
+byte: [0,0,1,133,1,150,1,133,227,0,32,167,48,89,34,49,126,67,48,65],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,2,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,2,3,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 8,
+byte: [48,70,128,221,48,98,64,202,48,149,0,243,49,2,65,168,50,69,5,59],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,2,3,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 12,
+flags: 0,
+scfsi: 0,
+byte: [0,0,1,133,1,128,1,128,80,2,232,140,10,67,0,140,18,19,1,200],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 9,
+byte: [48,71,192,230,48,98,0,221,48,148,193,18,49,0,1,233,50,64,197,244],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 12,
+flags: 1,
+scfsi: 0,
+byte: [0,0,1,133,1,128,1,128,74,2,209,96,10,51,0,176,17,227,2,12],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 0,
+flags: 0,
+scfsi: 9,
+byte: [48,72,128,241,48,98,64,236,48,147,129,49,48,254,66,36,50,60,6,169],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 12,
+flags: 0,
+scfsi: 0,
+byte: [0,0,1,133,1,144,1,132,2,184,128,160,48,229,27,50,74,54,48,93],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,2,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,2,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 5,
+flags: 0,
+scfsi: 8,
+byte: [34,0,96,127,129,172,96,170,1,182,97,0,130,64,97,184,4,34,99,225],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,3,0,2,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 0,
+scfsi: 0,
+byte: [0,0,216,12,32,12,27,21,0,164,233,136,72,177,148,113,137,131,48,53],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,1,2,0,0,0,3,0,0,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,3,1,2,0,0,0,3,0,0,2,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 5,
+flags: 0,
+scfsi: 8,
+byte: [34,0,96,128,1,190,96,170,129,208,96,253,2,118,97,179,132,128,99,214],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,1,2,0,0,0,3,0,0,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 12,
+flags: 1,
+scfsi: 0,
+byte: [0,0,0,133,1,152,1,128,44,2,137,128,8,4,209,128,150,8,169,129],
+gr0_scalefac: [0,0,0,0,0,0,0,0,4,1,2,0,0,0,3,0,3,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,4,1,2,0,0,0,3,0,3,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 5,
+flags: 0,
+scfsi: 8,
+byte: [32,128,96,112,129,136,96,147,1,170,96,218,130,72,97,120,4,66,99,82],
+gr0_scalefac: [0,0,0,0,0,0,0,0,4,1,2,0,0,0,3,0,3,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 13,
+flags: 1,
+scfsi: 0,
+byte: [0,0,0,133,8,16,96,0,96,8,128,152,96,6,129,46,96,42,2,32],
+gr0_scalefac: [0,0,0,0,0,0,0,0,4,1,2,0,4,0,2,0,3,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,4,1,2,0,4,0,2,0,3,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 5,
+flags: 0,
+scfsi: 8,
+byte: [32,160,96,113,1,150,96,146,129,188,96,216,2,114,97,115,132,140,99,71],
+gr0_scalefac: [0,0,0,0,0,0,0,0,4,1,2,0,4,0,2,0,3,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 1,
+scfsi: 0,
+byte: [0,0,216,8,96,12,0,160,18,204,1,64,36,140,5,208,66,204,12,224],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,1,2,0,0,0,2,0,1,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,3,1,2,0,0,0,2,0,1,2,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 8,
+flags: 0,
+scfsi: 10,
+byte: [8,32,96,98,129,100,96,126,1,150,96,185,130,64,97,63,4,62,98,212],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,1,2,0,0,0,2,0,1,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,1,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 13,
+flags: 1,
+scfsi: 0,
+byte: [0,0,2,165,8,16,104,0,96,2,128,140,96,13,129,30,96,51,2,12],
+gr0_scalefac: [0,0,0,0,0,0,0,2,5,1,2,0,4,0,2,0,3,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,2,5,1,2,0,4,0,2,0,3,2,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 5,
+flags: 3,
+scfsi: 8,
+byte: [32,128,96,98,1,114,96,125,129,164,96,183,2,98,97,58,132,124,98,200],
+gr0_scalefac: [0,0,0,0,0,0,0,2,5,1,2,0,4,0,2,0,3,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 1,
+scfsi: 0,
+byte: [0,1,136,4,32,12,0,96,23,204,3,64,47,140,9,112,85,204,19,96],
+gr0_scalefac: [0,0,0,0,0,0,0,1,2,0,2,0,0,0,1,0,0,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,2,0,2,0,0,0,1,0,0,2,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 0,
+scfsi: 8,
+byte: [28,64,197,0,192,171,2,128,192,214,2,244,193,57,4,80,194,26,8,60],
+gr0_scalefac: [0,0,0,0,0,0,0,1,2,0,2,0,0,0,1,0,0,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,3,0,1,0,0,0,3,0,1,1,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 12,
+flags: 0,
+scfsi: 0,
+byte: [0,0,1,133,25,18,0,36,4,163,0,204,9,243,2,40,18,35,4,116],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,3,0,2,0,2,1,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,3,0,2,0,2,1,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 0,
+scfsi: 9,
+byte: [8,64,195,2,168,10,83,3,84,12,67,4,208,18,51,8,68,34,131,18],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,3,0,2,0,2,1,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,2,0,1,0,0,0,3,0,2,1,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 12,
+flags: 0,
+scfsi: 0,
+byte: [0,0,1,133,1,4,0,128,4,115,0,224,9,131,2,76,17,211,4,168],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,2,0,0,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,2,0,0,2,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 1,
+scfsi: 8,
+byte: [8,64,193,0,192,171,2,160,192,208,3,44,193,47,4,184,194,4,9,12],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,0,0,2,0,0,2,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,2,0,1,0,0,0,3,0,0,1,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 13,
+flags: 0,
+scfsi: 0,
+byte: [0,0,2,133,136,16,1,0,74,1,161,128,106,3,249,129,8,7,129,130],
+gr0_scalefac: [0,0,0,0,0,0,0,2,4,1,3,0,4,0,2,0,0,0,2,0,0,0],
+scalefac: [0,0,0,0,0,0,0,2,4,1,3,0,4,0,2,0,0,0,2,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 1,
+scfsi: 8,
+byte: [24,64,202,0,192,146,2,76,192,179,2,208,193,0,4,68,193,185,8,48],
+gr0_scalefac: [0,0,0,0,0,0,0,2,4,1,3,0,4,0,2,0,0,0,2,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,2,0,1,0,0,0,3,0,2,2,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 12,
+flags: 1,
+scfsi: 0,
+byte: [0,0,1,133,25,2,0,200,7,102,2,48,17,198,5,24,33,230,10,16],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,3,0,2,0,0,1,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,3,0,2,0,0,1,0,0,0,0]});
+
+tests.push({
+block_type: 0,
+scalefac_compress: 9,
+flags: 0,
+scfsi: 9,
+byte: [8,64,195,2,76,9,67,2,184,11,179,3,236,17,195,6,176,34,19,15],
+gr0_scalefac: [0,0,0,0,0,0,0,1,4,1,2,0,3,0,2,0,0,1,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,2,0,1,0,0,0,3,0,0,1,0,0,0,0]});
+
+tests.push({
+block_type: 1,
+scalefac_compress: 9,
+flags: 0,
+scfsi: 0,
+byte: [0,0,192,196,0,0,64,129,152,6,128,87,24,52,0,241,8,2,19,48],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,0,0,0,3,0,1,0,0,0,0,0,0,0],
+scalefac: [0,0,0,0,0,0,0,0,3,0,0,0,3,0,1,0,0,0,0,0,0,0]});
+
+tests.push({
+block_type: 2,
+scalefac_compress: 10,
+flags: 0,
+scfsi: 0,
+byte: [0,0,0,0,96,200,140,32,0,0,0,12,34,192,92,76,166,21,56,204],
+gr0_scalefac: [0,0,0,0,0,0,0,0,3,0,0,0,3,0,1,0,0,0,0,0,0,0,166,0,96,245,138,0,1,0,0,0,212,87,167,0,21,4,0],
+scalefac: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,3,1,0,4,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0]});
+
+
+function ary2str(ary) {
+    return String.fromCharCode.apply(this, ary);
+}
+
+
+for (var i = 0; i < tests.length; i++) {
+    var test = tests[i];
+    var ptr = new Mad.Bit(ary2str(test.byte), 0);
+    var channel = {
+        block_type: test.block_type,
+        scalefac: [],
+        scalefac_compress: test.scalefac_compress,
+        flags: test.flags
+    };
+
+    var gr0ch = {
+        scalefac: test.gr0_scalefac
+    };
+
+    Mad.III_scalefactors(ptr, channel, gr0ch, test.scfsi);
+
+    console.log("offset: " + ptr.offset);
+
+    for (var j = 0; j < channel.scalefac.length; j++) {
+        console.log(Math.abs(channel.scalefac[j] - test.scalefac[j]));
+    }
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/typed-array.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/typed-array.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/jsmad-master/tests/node/typed-array.js	(revision 28388)
@@ -0,0 +1,22 @@
+
+ArrayBuffer = function(size) {  
+    var array = new Array(size / 4);
+
+    for (var i = 0; i < array.length; i++) {
+        array[i] = 0;
+    } 
+
+    return array;
+};
+
+Int32Array = function(buffer) {
+    return buffer;
+};
+
+Float32Array = function(buffer) {
+    return buffer;
+};
+
+Float64Array = function(buffer) {
+    return buffer;
+};
Index: /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/ajaxstream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/ajaxstream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/ajaxstream.js	(revision 28388)
@@ -0,0 +1,159 @@
+Mad.ArrayBuffers.AjaxStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function (url) {
+        this.offset = 0;
+
+        var request = new XMLHttpRequest();
+        request.open('GET', url);
+        request.responseType = "arraybuffer";
+        
+        this.request = request;
+        this.amountRead = 0;
+        this.inProgress = true;
+        this.finalAmount = false;
+        this.callbacks = [];
+        this.buffer = new Uint8Array(0);
+        
+        var self = this;
+        
+        var iteration = 0;
+        
+        var ochange = function () {
+            Mad.DEBUG && console.log("ochange! callbacks.length = " + self.callbacks.length + ", iteration = " + iteration);
+            Mad.DEBUG && console.log("readyState = " + request.readyState + ", amountRead = " + self.amountRead + ", contentLength = " + self.contentLength);
+            iteration += 1;
+            if ((self.callbacks.length > 0 && iteration % 32 === 0) || iteration % 256 === 0) {
+                self.updateBuffer();
+                
+                var newCallbacks = [];
+                
+                for (var i = 0; i < self.callbacks.length; i++) {
+                    console.log("JsMad: Handling callback " + i);
+                    var callback = self.callbacks[i];
+                    
+                    if (callback[0] < self.amountRead) {
+                        try {
+                                callback[1]();
+                        } catch (e) {
+                                console.log(e);
+                        }
+                    } else {
+                        newCallbacks.push(callback);
+                    }
+                }
+                
+                self.callbacks = newCallbacks;
+            }
+            
+            if (request.readyState === 4) {
+                self.updateBuffer();
+                self.amountRead = self.contentLength;
+                for (var i = 0; i < self.callbacks.length; i++) {
+                    var callback = self.callbacks[i];
+                    callback[1]();
+                }
+                
+                window.clearInterval(self.timer);
+                
+                self.inProgress = false;
+            }
+        }
+        
+        request.onprogress = ochange;
+        
+        this.timer = window.setInterval(ochange, 250);
+        
+        request.send(null);
+    },
+
+    updateBuffer: function() {
+        Mad.DEBUG && console.log("JsMad: updateBuffer!");
+        if (!this.finalAmount && this.request.response) {
+            this.arrayBuffer = this.request.response;
+            this.buffer = new Uint8Array(this.arrayBuffer);
+            this.amountRead = this.buffer.length;
+            Mad.DEBUG && console.log("typeof buffer = " + typeof(this.arrayBuffer) + ", amountRead = " + this.amountRead);
+            this.contentLength = this.request.getResponseHeader('Content-Length');
+            if(!this.contentLength) {
+                // if the server doesn't send a Content-Length Header, just use amountRead instead
+                // it's less precise at first, but once everything is buffered it becomes accurate.
+                this.contentLength = this.amountRead;
+            }
+        
+            if (!this.inProgress) {
+                this.finalAmount = true;
+            }
+            
+            return true;
+        } else {
+            return false;
+        }
+    },
+
+    absoluteAvailable: function(n, updated) {
+        if (n > this.amountRead) {
+            if (updated) {
+                throw new Error("buffer underflow with absoluteAvailable!");
+            } else if (this.updateBuffer()) {
+                return this.absoluteAvailable(n, true);
+            } else {
+                return false;
+            }
+        } else {
+            return true;
+        }
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+
+    read: function(n) {
+        var result = this.peek(n);
+        this.seek(n);
+        return result;
+    },
+
+    peek: function(n) {
+        if (this.available(n)) {
+            var offset = this.offset;
+            
+            var result = this.get(offset, n);
+            
+            return result;
+        } else {
+            throw new Error("buffer underflow with peek!");
+        }
+    },
+
+    get: function(offset, length) {
+        if (offset + length < this.amountRead) {
+            var subarr = this.buffer.subarray(offset, offset + length);
+            return subarr;
+        } else {
+            throw 'TODO: THROW GET ERROR!';
+        }
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.buffer[offset];
+    },
+
+    substream: function (offset, length) {
+        return new Mad.ArrayBuffers.SubStream(this, offset, length);
+    },
+
+    requestAbsolute: function(n, callback) {
+        console.log("JsMad: requestAbsolute(" + n + ", ...), amountRead = " + this.amountRead);
+        if (n < this.amountRead) {
+            console.log("JsMad: all fine, calling callback :)");
+            callback();
+        } else {
+            console.log("JsMad: pushing callback on queue");
+            this.callbacks.push([n, callback]);
+        }
+    },
+
+    request: function(n, callback) {
+        this.requestAbsolute(this.offset + n, callback);
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/arraystream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/arraystream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/arraystream.js	(revision 28388)
@@ -0,0 +1,55 @@
+
+Mad.ArrayBuffers.ArrayStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function (buffer) {
+        this.offset        = 0;
+        this.buffer        = buffer;
+        this.amountRead    = this.buffer.length;
+        this.contentLength = this.buffer.length;
+        this.length = this.amountRead;
+    },
+
+    substream: function (offset, length) {
+        return new Mad.ArrayBuffers.SubStream(this, offset, length);
+    },
+
+    absoluteAvailable: function(n, updated) {
+        return n < this.amountRead;
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.buffer[offset];
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+
+    read: function(n) {
+        var result = this.peek(n);
+        
+        this.seek(n);
+        
+        return result;
+    },
+
+    peek: function(n) {
+        if (this.available(n)) {
+            var offset = this.offset;
+            
+            var result = this.get(offset, n);
+            
+            return result;
+        } else {
+            throw 'TODO: THROW PEEK ERROR!';
+        }
+    },
+
+    get: function(offset, length) {
+        if (offset + length < this.contentLength) {
+            var subarr = this.buffer.subarray(offset, offset + length);
+            return subarr;
+        } else {
+            throw 'TODO: THROW GET ERROR!';
+        }
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/bytestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/bytestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/bytestream.js	(revision 28388)
@@ -0,0 +1,149 @@
+
+Mad.ArrayBuffers.ByteStream = Class.extend({
+    available: function(n) {
+        return this.absoluteAvailable(this.offset + n);
+    },
+
+    strEquals: function (offset, string) {
+        for (var i = 0; i < string.length; i++) {
+            if(this.getU8(offset + i, false) != string.charCodeAt(i)) return false;
+        }
+        return true;
+    },
+
+    getU8: function(offset, bigEndian) {
+        var bytes = this.get(offset, 1);
+        throw 'Wtf bytestream?'
+        return bytes[0];
+    },
+
+    getU16: function(offset, bigEndian) {
+        var bytes = this.get(offset, 2);
+        if (!bigEndian) {
+            bytes = bytes.reverse();
+        }
+        return (bytes[0] << 8) | bytes[1];
+    },
+
+    getU24: function(offset, bigEndian) {
+        var bytes = this.get(offset, 3);
+        if (!bigEndian) {
+            bytes = bytes.reverse();
+        }
+        return (bytes[0] << 16) | (bytes[1] << 8) | bytes[2];
+    },
+
+    getU32: function(offset, bigEndian) {
+        var bytes = this.get(offset, 4);
+        if (!bigEndian) {
+            bytes = bytes.reverse();
+        }
+        return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
+    },
+
+    getI8: function(offset, bigEndian) {
+        return this.getU8(offset, bigEndian) - 128;            // 2 ** 7
+    },
+
+    getI16: function(offset, bigEndian) {
+        return this.getU16(offset, bigEndian) - 65536;         // 2 ** 15
+    },
+
+    getI32: function(offset, bigEndian) {
+        return this.getU32(offset, bigEndian) - 2147483648;    // 2 ** 31
+    },
+
+    getSyncInteger: function(offset) {
+        var bytes = this.get(offset, 4);
+        return (bytes[0] << 21) | (bytes[1] << 14) | (bytes[2] << 7) | bytes[3];
+    },
+
+    peekU8: function(bigEndian) {
+        return this.getU8(this.offset, bigEndian);
+    },
+
+    peekU16: function(bigEndian) {
+        return this.getU16(this.offset, bigEndian);
+    },
+
+    peekU24: function(bigEndian) {
+        return this.getU24(this.offset, bigEndian);
+    },
+
+    peekU32: function(bigEndian) {
+        return this.getU32(this.offset, bigEndian);
+    },
+
+    peekI8: function(bigEndian) {
+        return this.getI8(this.offset, bigEndian);
+    },
+
+    peekI16: function(bigEndian) {
+        return this.getI16(this.offset, bigEndian);
+    },
+
+    peekI32: function(bigEndian) {
+        return this.getI32(this.offset, bigEndian);
+    },
+
+    peekSyncInteger: function() {
+        return this.getSyncInteger(this.offset);
+    },
+
+    readU8: function(bigEndian) {
+        var result = this.peekU8(bigEndian);
+        this.seek(1);
+        return result;
+    },
+
+    readU16: function(bigEndian) {
+        var result = this.peekU16(bigEndian);
+        this.seek(2);
+        return result;
+    },
+
+    readU24: function(bigEndian) {
+        var result = this.peekU24(bigEndian);
+        this.seek(3);
+        return result;
+    },
+
+    readU32: function(bigEndian) {
+        var result = this.peekU32(bigEndian);
+        this.seek(4);
+        return result;
+    },
+
+    readI8: function(bigEndian) {
+        var result = this.peekI8(bigEndian);
+        this.seek(1);
+        return result;
+    },
+
+    readI16: function(bigEndian) {
+        var result = this.peekI16(bigEndian);
+        this.seek(2);
+        return result;
+    },
+
+    readI32: function(bigEndian) {
+        var result = this.peekI32(bigEndian);
+        this.seek(4);
+        return result;
+    },
+
+    readSyncInteger: function() {
+        var result = this.getSyncInteger(this.offset);
+        this.seek(4);
+        return result;
+    },
+
+    readAsString: function(n) {
+        var arr = this.read(n);
+        var str = "";
+        for (var i = 0; i < n; i++) {
+            str += String.fromCharCode(arr[i]);
+        }
+        return str;
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/filestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/filestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/filestream.js	(revision 28388)
@@ -0,0 +1,75 @@
+
+Mad.ArrayBuffers.FileStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function (file, callback) {
+        this.offset        = 0;
+
+        // Check for the various File API support.
+        if (window.File && window.FileReader && window.FileList && window.Blob) {
+            // Great success! All the File APIs are supported.
+        } else {
+            alert('The File APIs are not fully supported in this browser.');
+            return null;
+        } 
+        
+        var self = this;
+        var reader = new FileReader();
+        reader.onload = function () {
+          self.buffer        = new Uint8Array(reader.result);
+          self.amountRead    = self.buffer.length;
+          self.contentLength = self.buffer.length;
+          self.length = self.amountRead;
+          
+          callback(self);
+        }
+        
+        reader.onerror = function () {
+            console.log("Error loading file " + file);
+        }
+
+        // Only supported from Firefox 7 and Chrome 'Something'
+        reader.readAsArrayBuffer(file);
+    },
+
+    substream: function (offset, length) {
+        return new Mad.ArrayBuffers.SubStream(this, offset, length);
+    },
+
+    absoluteAvailable: function(n, updated) {
+        return n < this.amountRead;
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.buffer[offset];
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+
+    read: function(n) {
+        var result = this.peek(n);
+        this.seek(n);
+        return result;
+    },
+
+    peek: function(n) {
+        if (this.available(n)) {
+            var offset = this.offset;
+            
+            var result = this.get(offset, n);
+            
+            return result;
+        } else {
+            throw 'TODO: THROW PEEK ERROR!';
+        }
+    },
+
+    get: function(offset, length) {
+        if (offset + length < this.contentLength) {
+            var subarr = this.buffer.subarray(offset, offset + length);
+            return subarr;
+        } else {
+            throw 'TODO: THROW GET ERROR!';
+        }
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/substream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/substream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/arraybuffer/substream.js	(revision 28388)
@@ -0,0 +1,59 @@
+
+Mad.ArrayBuffers.SubStream = Mad.ArrayBuffers.ByteStream.extend({
+    init: function(stream, offset, length) {
+        this.offset = 0; 
+        this.start = offset;
+        this.parentStream = stream;
+        this.length = length;
+    },
+
+    substream: function (offset, length) {
+        return new Mad.SubStream(this.parentStream, this.start + offset, length);
+    },
+
+    getU8: function(offset, bigEndian) {
+        return this.parentStream.getU8(this.start + offset, bigEndian);
+    },
+
+    getU16: function(offset, bigEndian) {
+        return this.parentStream.getU16(this.start + offset, bigEndian);
+    },
+
+    getU32: function(offset, bigEndian) {
+        return this.parentStream.getU32(this.start + offset, bigEndian);
+    },
+
+    absoluteAvailable: function(n) {
+        return this.parentStream.absoluteAvailable(this.start + n);
+    },
+
+    seek: function(n) {
+        this.offset += n;
+    },
+ 
+    read: function(n) {
+        var result = this.peek(n);
+        this.seek(n);
+        return result;
+    },
+               
+    peek: function(n) {
+        return this.get(this.offset, n);
+    },
+
+    get: function(offset, length) {
+        return this.parentStream.get(this.start + offset, length);
+    },
+
+    slice: function(start, end) {
+        return this.parentStream.get(this.start + start, end - start);
+    },
+
+    requestAbsolute: function(n, callback) {
+        this.parentStream.requestAbsolute(this.start + n)
+    },
+
+    request: function(n, callback) {
+        this.parentStream.requestAbsolute(this.start + this.offset + n)
+    }
+});
Index: /gs3-extensions/web-audio/trunk/js-mad/script/binaryajax.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/binaryajax.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/binaryajax.js	(revision 28388)
@@ -0,0 +1,278 @@
+
+/*
+ * Binary Ajax 0.1.10
+ * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/
+ * Licensed under the MPL License [http://www.nihilogic.dk/licenses/mpl-license.txt]
+ */
+
+
+var BinaryFile = function(strData, iDataOffset, iDataLength) {
+    var data = strData;
+    var dataOffset = iDataOffset || 0;
+    var dataLength = 0;
+
+    this.getRawData = function() {
+        return data;
+    }
+
+    if (typeof strData === "string") {
+        dataLength = iDataLength || data.length;
+
+        this.getByteAt = function(iOffset) {
+            return data.charCodeAt(iOffset + dataOffset) & 0xFF;
+        }
+
+        this.getBytesAt = function(iOffset, iLength) {
+            var aBytes = [];
+
+            for (var i = 0; i < iLength; i++) {
+                aBytes[i] = data.charCodeAt((iOffset + i) + dataOffset) & 0xFF
+            };
+
+            return aBytes;
+        }
+    } else if (typeof strData === "unknown") {
+        dataLength = iDataLength || IEBinary_getLength(data);
+
+        this.getByteAt = function(iOffset) {
+            return IEBinary_getByteAt(data, iOffset + dataOffset);
+        }
+
+        this.getBytesAt = function(iOffset, iLength) {
+            return new VBArray(IEBinary_getBytesAt(data, iOffset + dataOffset, iLength)).toArray();
+        }
+    }
+
+    this.getLength = function() {
+        return dataLength;
+    }
+
+    this.getSByteAt = function(iOffset) {
+        var iByte = this.getByteAt(iOffset);
+        if (iByte > 127)
+            return iByte - 256;
+        else
+            return iByte;
+    }
+
+    this.getShortAt = function(iOffset, bBigEndian) {
+        var iShort = bBigEndian ? 
+            (this.getByteAt(iOffset) << 8) + this.getByteAt(iOffset + 1)
+            : (this.getByteAt(iOffset + 1) << 8) + this.getByteAt(iOffset)
+            if (iShort < 0) iShort += 65536;
+        return iShort;
+    }
+    this.getSShortAt = function(iOffset, bBigEndian) {
+        var iUShort = this.getShortAt(iOffset, bBigEndian);
+        if (iUShort > 32767)
+            return iUShort - 65536;
+        else
+            return iUShort;
+    }
+    this.getLongAt = function(iOffset, bBigEndian) {
+        var iByte1 = this.getByteAt(iOffset),
+            iByte2 = this.getByteAt(iOffset + 1),
+            iByte3 = this.getByteAt(iOffset + 2),
+            iByte4 = this.getByteAt(iOffset + 3);
+
+        var iLong = bBigEndian ? 
+            (((((iByte1 << 8) + iByte2) << 8) + iByte3) << 8) + iByte4
+            : (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1;
+        if (iLong < 0) iLong += 4294967296;
+        return iLong;
+    }
+    this.getSLongAt = function(iOffset, bBigEndian) {
+        var iULong = this.getLongAt(iOffset, bBigEndian);
+        if (iULong > 2147483647)
+            return iULong - 4294967296;
+        else
+            return iULong;
+    }
+
+    this.getStringAt = function(iOffset, iLength) {
+        var aStr = [];
+
+        var aBytes = this.getBytesAt(iOffset, iLength);
+        for (var j=0; j < iLength; j++) {
+            aStr[j] = String.fromCharCode(aBytes[j]);
+        }
+        return aStr.join("");
+    }
+
+    this.getCharAt = function(iOffset) {
+        return String.fromCharCode(this.getByteAt(iOffset));
+    }
+    this.toBase64 = function() {
+        return window.btoa(data);
+    }
+    this.fromBase64 = function(strBase64) {
+        data = window.atob(strBase64);
+    }
+}
+
+
+var BinaryAjax = (function() {
+
+        function createRequest() {
+        var oHTTP = null;
+        if (window.ActiveXObject) {
+        oHTTP = new ActiveXObject("Microsoft.XMLHTTP");
+        } else if (window.XMLHttpRequest) {
+        oHTTP = new XMLHttpRequest();
+        }
+        return oHTTP;
+        }
+
+        function getHead(strURL, fncCallback, fncError) {
+        var oHTTP = createRequest();
+        if (oHTTP) {
+        if (fncCallback) {
+        if (typeof(oHTTP.onload) != "undefined") {
+        oHTTP.onload = function() {
+        if (oHTTP.status === "200") {
+        fncCallback(this);
+        } else {
+            if (fncError) fncError();
+        }
+        oHTTP = null;
+        };
+        } else {
+            oHTTP.onreadchange = function() {
+                if (oHTTP.readyState === 4) {
+                    if (oHTTP.status === "200") {
+                        fncCallback(this);
+                    } else {
+                        if (fncError) fncError();
+                    }
+                    oHTTP = null;
+                }
+            };
+        }
+        }
+        oHTTP.open("HEAD", strURL, true);
+        oHTTP.send(null);
+        } else {
+            if (fncError) fncError();
+        }
+        }
+
+        function sendRequest(strURL, fncCallback, fncError, aRange, bAcceptRanges, iFileSize) {
+            var oHTTP = createRequest();
+            if (oHTTP) {
+
+                var iDataOffset = 0;
+                if (aRange && !bAcceptRanges) {
+                    iDataOffset = aRange[0];
+                }
+                var iDataLen = 0;
+                if (aRange) {
+                    iDataLen = aRange[1]-aRange[0]+1;
+                }
+
+                if (fncCallback) {
+                    if (typeof(oHTTP.onload) != "undefined") {
+                        oHTTP.onload = function() {
+                            if (oHTTP.status === "200" || oHTTP.status === "206" || oHTTP.status === "0") {
+                                oHTTP.binaryResponse = new BinaryFile(oHTTP.responseText, iDataOffset, iDataLen);
+                                oHTTP.fileSize = iFileSize || oHTTP.getResponseHeader("Content-Length");
+                                fncCallback(oHTTP);
+                            } else {
+                                if (fncError) fncError();
+                            }
+                            oHTTP = null;
+                        };
+                    } else {
+                        oHTTP.onreadchange = function() {
+                            if (oHTTP.readyState === 4) {
+                                if (oHTTP.status === "200" || oHTTP.status === "206" || oHTTP.status === "0") {
+                                    // IE6 craps if we try to extend the XHR object
+                                    var oRes = {
+status : oHTTP.status,
+         // IE needs responseBody, Chrome/Safari needs responseText
+         binaryResponse : new BinaryFile(
+                 typeof oHTTP.responseBody === "unknown" ? oHTTP.responseBody : oHTTP.responseText, iDataOffset, iDataLen
+                 ),
+         fileSize : iFileSize || oHTTP.getResponseHeader("Content-Length")
+                                    };
+                                    fncCallback(oRes);
+                                } else {
+                                    if (fncError) fncError();
+                                }
+                                oHTTP = null;
+                            }
+                        };
+                    }
+                }
+                oHTTP.open("GET", strURL, true);
+
+                if (oHTTP.overrideMimeType) oHTTP.overrideMimeType('text/plain; charset=x-user-defined');
+
+                if (aRange && bAcceptRanges) {
+                    oHTTP.setRequestHeader("Range", "bytes=" + aRange[0] + "-" + aRange[1]);
+                }
+
+                oHTTP.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 1970 00:00:00 GMT");
+
+                oHTTP.send(null);
+            } else {
+                if (fncError) fncError();
+            }
+        }
+
+        return function(strURL, fncCallback, fncError, aRange) {
+
+            if (aRange) {
+                getHead(
+                        strURL, 
+                        function(oHTTP) {
+                        var iLength = parseInt(oHTTP.getResponseHeader("Content-Length"),10);
+                        var strAcceptRanges = oHTTP.getResponseHeader("Accept-Ranges");
+
+                        var iStart, iEnd;
+                        iStart = aRange[0];
+                        if (aRange[0] < 0) 
+                        iStart += iLength;
+                        iEnd = iStart + aRange[1] - 1;
+
+                        sendRequest(strURL, fncCallback, fncError, [iStart, iEnd], (strAcceptRanges === "bytes"), iLength);
+                        }
+                       );
+
+            } else {
+                sendRequest(strURL, fncCallback, fncError);
+            }
+        }
+
+}());
+
+/*
+   document.write(
+   "<script type='text/vbscript'>\r\n"
+   + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n"
+   + "	IEBinary_getByteAt = AscB(MidB(strBinary,iOffset+1,1))\r\n"
+   + "End Function\r\n"
+   + "Function IEBinary_getLength(strBinary)\r\n"
+   + "	IEBinary_getLength = LenB(strBinary)\r\n"
+   + "End Function\r\n"
+   + "</script>\r\n"
+   );
+   */
+
+document.write(
+        "<script type='text/vbscript'>\r\n"
+        + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n"
+        + "	IEBinary_getByteAt = AscB(MidB(strBinary, iOffset + 1, 1))\r\n"
+        + "End Function\r\n"
+        + "Function IEBinary_getBytesAt(strBinary, iOffset, iLength)\r\n"
+        + "  Dim aBytes()\r\n"
+        + "  ReDim aBytes(iLength - 1)\r\n"
+        + "  For i = 0 To iLength - 1\r\n"
+        + "   aBytes(i) = IEBinary_getByteAt(strBinary, iOffset + i)\r\n"  
+        + "  Next\r\n"
+        + "  IEBinary_getBytesAt = aBytes\r\n" 
+        + "End Function\r\n"
+        + "Function IEBinary_getLength(strBinary)\r\n"
+        + "	IEBinary_getLength = LenB(strBinary)\r\n"
+        + "End Function\r\n"
+        + "</script>\r\n"
+        );
Index: /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/ajaxstream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/ajaxstream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/ajaxstream.js	(revision 28388)
@@ -0,0 +1,166 @@
+Mad.BinaryStrings.AjaxStream = function(url) {
+    this.offset = 0; 
+    var request = window.XMLHttpRequest ? new XMLHttpRequest() :  ActiveXObject("Microsoft.XMLHTTP");
+    
+    // pseudo-binary XHR
+    request.overrideMimeType('text/plain; charset=x-user-defined');
+    request.open('GET', url);
+    
+    this.request = request;
+    this.amountRead = 0;
+    this.inProgress = true;
+    this.callbacks = [];
+    
+    var self = this;
+    
+    var iteration = 0;
+    
+    var ochange = function () {
+        iteration += 1;
+        if ((self.callbacks.length > 0 && iteration % 64 === 0) || iteration % 256 === 0) {
+            self.updateBuffer();
+            
+            var newCallbacks = [];
+            
+            for (var i = 0; i < self.callbacks.length; i++) {
+                var callback = self.callbacks[i];
+                
+                if (callback[0] < self.amountRead) {
+					try {
+						callback[1]();
+					} catch (e) {
+						console.log(e);
+					}
+                } else {
+                    newCallbacks.push(callback);
+                }
+            }
+            
+            self.callbacks = newCallbacks;
+        }
+        
+        if (request.readyState === 4) {
+			self.amountRead = self.contentLength;
+            for (var i = 0; i < self.callbacks.length; i++) {
+                var callback = self.callbacks[i];
+                callback[1]();
+            }
+            
+            window.clearInterval(self.timer);
+            
+            self.inProgress = false;
+        }
+    }
+    
+    request.onreadchange = ochange;
+    
+    this.timer = window.setInterval(ochange, 250);
+    
+    request.send(null);
+}
+
+Mad.BinaryStrings.AjaxStream.prototype = new Mad.BinaryStrings.ByteStream();
+
+Mad.BinaryStrings.AjaxStream.prototype.updateBuffer = function() {
+    if (!this.finalAmount) {
+        this.arrayBuffer = this.request.mozResponseArrayBuffer;
+        if(this.arrayBuffer) {
+			this.byteBuffer = new Uint8Array(this.arrayBuffer);
+			this.amountRead = this.arrayBuffer.byteLength;
+		} else {
+			this.buffer = this.request.responseText
+			this.amountRead = this.buffer.length;
+		}
+        
+		this.contentLength = this.request.getResponseHeader('Content-Length');
+		if(!this.contentLength) {
+			// if the server doesn't send a Content-Length Header, just use amountRead instead
+			// it's less precise at first, but once everything is buffered it becomes accurate.
+			this.contentLength = this.amountRead;
+		}
+    
+        if (!this.inProgress) {
+            this.finalAmount = true;
+        }
+        
+        return true;
+    } else {
+        return false;
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.absoluteAvailable = function(n, updated) {
+    if (n > this.amountRead) {
+        if (updated) {
+            throw new Error("buffer underflow with absoluteAvailable!");
+        } else if (this.updateBuffer()) {
+            return this.absoluteAvailable(n, true);
+        } else {
+            return false;
+        }
+    } else {
+        return true;
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.seek = function(n) {
+    this.offset += n;
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.peek = function(n) {
+    if (this.available(n)) {
+        var offset = this.offset;
+        
+        var result = this.get(offset, n);
+        
+        return result;
+    } else {
+        throw new Error("buffer underflow with peek!");
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.get = function(offset, length) {
+    if (this.absoluteAvailable(offset + length)) {
+		var tmpbuffer = "";
+		if(this.byteBuffer) {
+			for(var i = offset; i < offset + length; i += 1) {
+				tmpbuffer = tmpbuffer + String.fromCharCode(this.byteBuffer[i]);
+			}
+		} else {
+			for(var i = offset; i < offset + length; i += 1) {
+				tmpbuffer = tmpbuffer + String.fromCharCode(this.buffer.charCodeAt(i) & 0xff);
+			}
+		}
+		return tmpbuffer;
+    } else {
+		throw new Error("buffer underflow with get!");
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.getU8 = function(offset, bigEndian) {
+	if(this.byteBuffer) {
+		return this.byteBuffer[offset];
+	}
+		
+    return this.get(offset, 1).charCodeAt(0);
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.requestAbsolute = function(n, callback) {
+    if (n < this.amountRead) {
+        callback();
+    } else {
+        this.callbacks.push([n, callback]);
+    }
+}
+
+Mad.BinaryStrings.AjaxStream.prototype.request = function(n, callback) {
+    this.requestAbsolute(this.offset + n, callback);
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/bytestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/bytestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/bytestream.js	(revision 28388)
@@ -0,0 +1,161 @@
+Mad.BinaryStrings.ByteStream = function(url) { }
+
+Mad.BinaryStrings.ByteStream.prototype.available = function(n) {
+    return this.absoluteAvailable(this.offset + n);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.strEquals = function (offset, string) {
+    for (var i = 0; i < string.length; i++) {
+        if(this.getU8(offset + i, false) != string.charCodeAt(i)) return false;
+    }
+    return true;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU8 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 1);
+    return bytes.charCodeAt(0);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU16 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 2);
+    
+    if (!bigEndian) {
+        bytes = bytes.reverse();
+    }
+    
+    return (bytes.charCodeAt(0) << 8) | bytes.charCodeAt(1);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU24 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 3);
+    
+    if (!bigEndian) {
+        bytes = bytes.reverse();
+    }
+    
+    return (bytes.charCodeAt(0) << 16) | (bytes.charCodeAt(1) << 8) | bytes.charCodeAt(2);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getU32 = function(offset, bigEndian) {
+    var bytes = this.get(offset, 4);
+    
+    if (!bigEndian) {
+        bytes = bytes.reverse();
+    }
+    
+    return (bytes.charCodeAt(0) << 24) | (bytes.charCodeAt(1) << 16) | (bytes.charCodeAt(2) << 8) | bytes.charCodeAt(3);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getI8 = function(offset, bigEndian) {
+    return this.getU8(offset, bigEndian) - 128;            // 2 ** 7
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getI16 = function(offset, bigEndian) {
+    return this.getU16(offset, bigEndian) - 65536;         // 2 ** 15
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getI32 = function(offset, bigEndian) {
+    return this.getU32(offset, bigEndian) - 2147483648;    // 2 ** 31
+}
+
+Mad.BinaryStrings.ByteStream.prototype.getSyncInteger = function(offset) {
+    var bytes = this.get(offset, 4);
+    
+    return (bytes.charCodeAt(0) << 21) | (bytes.charCodeAt(1) << 14) | (bytes.charCodeAt(2) << 7) | bytes.charCodeAt(3);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU8 = function(bigEndian) {
+    return this.getU8(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU16 = function(bigEndian) {
+    return this.getU16(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU24 = function(bigEndian) {
+    return this.getU24(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekU32 = function(bigEndian) {
+    return this.getU32(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekI8 = function(bigEndian) {
+    return this.getI8(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekI16 = function(bigEndian) {
+    return this.getI16(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekI32 = function(bigEndian) {
+    return this.getI32(this.offset, bigEndian);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.peekSyncInteger = function() {
+    return this.getSyncInteger(this.offset);
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU8 = function(bigEndian) {
+    var result = this.peekU8(bigEndian);
+    
+    this.seek(1);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU16 = function(bigEndian) {
+    var result = this.peekU16(bigEndian);
+    
+    this.seek(2);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU24 = function(bigEndian) {
+    var result = this.peekU24(bigEndian);
+    
+    this.seek(3);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readU32 = function(bigEndian) {
+    var result = this.peekU32(bigEndian);
+    
+    this.seek(4);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readI8 = function(bigEndian) {
+    var result = this.peekI8(bigEndian);
+    
+    this.seek(1);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readI16 = function(bigEndian) {
+    var result = this.peekI16(bigEndian);
+    
+    this.seek(2);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readI32 = function(bigEndian) {
+    var result = this.peekI32(bigEndian);
+    
+    this.seek(4);
+    
+    return result;
+}
+
+Mad.BinaryStrings.ByteStream.prototype.readSyncInteger = function() {
+    var result = this.getSyncInteger(this.offset);
+    
+    this.seek(4);
+    
+    return result;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/filestream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/filestream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/filestream.js	(revision 28388)
@@ -0,0 +1,62 @@
+Mad.BinaryStrings.FileStream = function(file, callback) {
+    this.offset = 0;
+    var self = this, reader = new FileReader();
+    
+    reader.onload = function () {
+      self['buffer']     = reader.result;
+      self['amountRead'] = self['buffer'].length;
+      self['contentLength'] = self['buffer'].length;
+      
+      self.length = self['amountRead'];
+      
+      callback(self);
+    }
+    
+    reader.onerror = function () {
+        console.log("Error!");
+    }
+    
+    reader.readAsBinaryString(file);
+}
+
+Mad.BinaryStrings.FileStream.prototype = new Mad.BinaryStrings.ByteStream();
+
+Mad.BinaryStrings.FileStream.prototype.absoluteAvailable = function(n, updated) {
+    return n < this['amountRead'];
+}
+
+Mad.BinaryStrings.FileStream.prototype.substream = function (offset, length) {
+    return new Mad.BinaryStrings.SubStream(this, offset, length);
+}
+
+Mad.BinaryStrings.FileStream.prototype.seek = function(n) {
+    this['offset'] += n;
+}
+
+Mad.BinaryStrings.FileStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.FileStream.prototype.peek = function(n) {
+    if (this.available(n)) {
+        var offset = this['offset'];
+        
+        var result = this.get(offset, n);
+        
+        return result;
+    } else {
+        throw 'TODO: THROW PEEK ERROR!';
+    }
+}
+
+Mad.BinaryStrings.FileStream.prototype.get = function(offset, length) {
+    if (this.absoluteAvailable(offset + length)) {
+        return this['buffer'].slice(offset, offset + length);
+    } else {
+        throw 'TODO: THROW GET ERROR!';
+    }
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/stringstream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/stringstream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/stringstream.js	(revision 28388)
@@ -0,0 +1,44 @@
+Mad.BinaryStrings.StringStream = function(string) {
+    this.offset = 0;
+    this.buffer = string;
+    this.amountRead = string.length;
+    this.length = string.length;
+}
+
+Mad.BinaryStrings.StringStream.prototype = new Mad.BinaryStrings.ByteStream();
+
+Mad.BinaryStrings.StringStream.prototype.absoluteAvailable = function(n, updated) {
+    return n < this['amountRead'];
+}
+
+Mad.BinaryStrings.StringStream.prototype.seek = function(n) {
+    this['offset'] += n;
+}
+
+Mad.BinaryStrings.StringStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.StringStream.prototype.peek = function(n) {
+    if (this.available(n)) {
+        var offset = this['offset'];
+        
+        var result = this.get(offset, n);
+        
+        return result;
+    } else {
+        throw 'TODO: THROW PEEK ERROR!';
+    }
+}
+
+Mad.BinaryStrings.StringStream.prototype.get = function(offset, length) {
+    if (this.absoluteAvailable(offset + length)) {
+        return this['buffer'].slice(offset, offset + length);
+    } else {
+        throw 'TODO: THROW GET ERROR!';
+    }
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/substream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/substream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/binarystring/substream.js	(revision 28388)
@@ -0,0 +1,50 @@
+
+Mad.BinaryStrings.SubStream = function(stream, offset, length) {
+    this.offset = 0;
+    this.start = offset;
+    this.parentStream = stream;
+    this.length = length;
+}
+
+Mad.BinaryStrings.SubStream.prototype = new Mad.BinaryStrings.ByteStream;
+
+Mad.BinaryStrings.SubStream.prototype.substream = function (offset, length) {
+    return new Mad.BinaryStrings.SubStream(this.parentStream, this.start + offset, length);
+}
+
+
+Mad.BinaryStrings.SubStream.prototype.absoluteAvailable = function(n) {
+    return this.parentStream.absoluteAvailable(this.start + n);
+}
+
+Mad.BinaryStrings.SubStream.prototype.seek = function(n) {
+    this.offset += n;
+}
+
+Mad.BinaryStrings.SubStream.prototype.read = function(n) {
+    var result = this.peek(n);
+    
+    this.seek(n);
+    
+    return result;
+}
+
+Mad.BinaryStrings.SubStream.prototype.peek = function(n) {
+    return this.get(this.offset, n);
+}
+
+Mad.BinaryStrings.SubStream.prototype.get = function(offset, length) {
+    return this.parentStream.get(this.start + offset, length);
+}
+
+Mad.BinaryStrings.SubStream.prototype.slice = function(start, end) {
+    return this.parentStream.get(this.start + start, end - start);
+}
+
+Mad.BinaryStrings.SubStream.prototype.requestAbsolute = function(n, callback) {
+    this.parentStream.requestAbsolute(this.start + n)
+}
+
+Mad.BinaryStrings.SubStream.prototype.request = function(n, callback) {
+    this.parentStream.requestAbsolute(this.start + this.offset + n)
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/script/bit.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/bit.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/bit.js	(revision 28388)
@@ -0,0 +1,148 @@
+
+// Well duh.
+var CHAR_BIT = 8;
+
+/*
+ * NAME:    bit.init()
+ * DESCRIPTION: initialize bit pointer struct
+ */
+Mad.Bit = function (stream, offset) {
+    if (typeof(stream) === 'string') {
+        this.stream = new Mad.BinaryStrings.StringStream(stream);
+    } else if(stream instanceof Uint8Array) {
+        this.stream = new Mad.ArrayBuffers.ArrayStream(stream);
+    } else {
+        this.stream = stream;
+    }
+
+    this.offset = offset;
+
+    this.cache = 0;
+    this.left = CHAR_BIT;
+}
+
+Mad.Bit.prototype.clone = function() {
+    var c = new Mad.Bit(this.stream, this.offset);
+
+    c.cache = this.cache;
+    c.left = this.left;
+
+    return c;
+}
+
+/*
+ * NAME:    bit.length()
+ * DESCRIPTION: return number of bits between start and end points
+ */
+Mad.Bit.prototype.length = function(end) {
+    return this.left + CHAR_BIT * (end.offset - (this.offset + 1)) + (CHAR_BIT - end.left);
+}
+
+/*
+ * NAME:    bit.nextbyte()
+ * DESCRIPTION: return pointer to next unprocessed byte
+ */
+Mad.Bit.prototype.nextbyte = function() {
+    return this.left === CHAR_BIT ? this.offset : this.offset + 1;
+}
+
+/*
+ * NAME:    bit.skip()
+ * DESCRIPTION: advance bit pointer
+ */
+Mad.Bit.prototype.skip = function(len) {
+    this.offset += (len / CHAR_BIT) >> 0; // javascript trick to get integer divison
+    this.left   -= len % CHAR_BIT;
+
+    if (this.left > CHAR_BIT) {
+        this.offset++;
+        this.left += CHAR_BIT;
+    }
+
+    if (this.left < CHAR_BIT) {
+        this.cache = this.stream.getU8(this.offset);
+    }
+}
+
+/*
+ * NAME:    bit.read()
+ * DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value
+ */
+Mad.Bit.prototype.read = function(len) {
+    if(len > 16) {
+        return this.readBig(len);
+    }
+
+    var value = 0;
+
+    if (this.left === CHAR_BIT) {
+        this.cache = this.stream.getU8(this.offset);
+    }
+
+    if (len < this.left) {
+        value = (this.cache & ((1 << this.left) - 1)) >> (this.left - len);
+        this.left -= len;
+
+        return value;
+    }
+
+    /* remaining bits in current byte */
+    value = this.cache & ((1 << this.left) - 1);
+    len  -= this.left;
+
+    this.offset++;
+    this.left = CHAR_BIT;
+
+    /* more bytes */
+    while (len >= CHAR_BIT) {
+        value = (value << CHAR_BIT) | this.stream.getU8(this.offset++);
+        len  -= CHAR_BIT;
+    }
+
+    if (len > 0) {
+        this.cache = this.stream.getU8(this.offset);
+
+        value = (value << len) | (this.cache >> (CHAR_BIT - len));
+        this.left -= len;
+    }
+
+    return value;
+}
+
+Mad.Bit.prototype.readBig = function(len) {
+    var value = 0;
+
+    if (this.left === CHAR_BIT) {
+        this.cache = this.stream.getU8(this.offset);
+    }
+
+    if (len < this.left) {
+        value = (this.cache & ((1 << this.left) - 1)) >> (this.left - len);
+        this.left -= len;
+
+        return value;
+    }
+
+    /* remaining bits in current byte */
+    value = this.cache & ((1 << this.left) - 1);
+    len  -= this.left;
+
+    this.offset++;
+    this.left = CHAR_BIT;
+
+    /* more bytes */
+    while (len >= CHAR_BIT) {
+        value = Mad.bitwiseOr(Mad.lshift(value, CHAR_BIT), this.stream.getU8(this.offset++));
+        len  -= CHAR_BIT;
+    }
+
+    if (len > 0) {
+        this.cache = this.stream.getU8(this.offset);
+
+        value = Mad.bitwiseOr(Mad.lshift(value, len), (this.cache >> (CHAR_BIT - len)));
+        this.left -= len;
+    }
+
+    return value;
+}
+
Index: /gs3-extensions/web-audio/trunk/js-mad/script/browser-detect.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/browser-detect.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/browser-detect.js	(revision 28388)
@@ -0,0 +1,117 @@
+var BrowserDetect = {
+	init: function () {
+		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
+		this.version = this.searchVersion(navigator.userAgent)
+			|| this.searchVersion(navigator.appVersion)
+			|| "an unknown version";
+		this.OS = this.searchString(this.dataOS) || "an unknown OS";
+	},
+	searchString: function (data) {
+		for (var i=0;i<data.length;i++)	{
+			var dataString = data[i].string;
+			var dataProp = data[i].prop;
+			this.versionSearchString = data[i].versionSearch || data[i].identity;
+			if (dataString) {
+				if (dataString.indexOf(data[i].subString) != -1)
+					return data[i].identity;
+			}
+			else if (dataProp)
+				return data[i].identity;
+		}
+	},
+	searchVersion: function (dataString) {
+		var index = dataString.indexOf(this.versionSearchString);
+		if (index == -1) return;
+		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
+	},
+	dataBrowser: [
+		{
+			string: navigator.userAgent,
+			subString: "Chrome",
+			identity: "Chrome"
+		},
+		{ 	string: navigator.userAgent,
+			subString: "OmniWeb",
+			versionSearch: "OmniWeb/",
+			identity: "OmniWeb"
+		},
+		{
+			string: navigator.vendor,
+			subString: "Apple",
+			identity: "Safari",
+			versionSearch: "Version"
+		},
+		{
+			prop: window.opera,
+			identity: "Opera",
+			versionSearch: "Version"
+		},
+		{
+			string: navigator.vendor,
+			subString: "iCab",
+			identity: "iCab"
+		},
+		{
+			string: navigator.vendor,
+			subString: "KDE",
+			identity: "Konqueror"
+		},
+		{
+			string: navigator.userAgent,
+			subString: "Firefox",
+			identity: "Firefox"
+		},
+		{
+			string: navigator.vendor,
+			subString: "Camino",
+			identity: "Camino"
+		},
+		{		// for newer Netscapes (6+)
+			string: navigator.userAgent,
+			subString: "Netscape",
+			identity: "Netscape"
+		},
+		{
+			string: navigator.userAgent,
+			subString: "MSIE",
+			identity: "Explorer",
+			versionSearch: "MSIE"
+		},
+		{
+			string: navigator.userAgent,
+			subString: "Gecko",
+			identity: "Mozilla",
+			versionSearch: "rv"
+		},
+		{ 		// for older Netscapes (4-)
+			string: navigator.userAgent,
+			subString: "Mozilla",
+			identity: "Netscape",
+			versionSearch: "Mozilla"
+		}
+	],
+	dataOS : [
+		{
+			string: navigator.platform,
+			subString: "Win",
+			identity: "Windows"
+		},
+		{
+			string: navigator.platform,
+			subString: "Mac",
+			identity: "Mac"
+		},
+		{
+			   string: navigator.userAgent,
+			   subString: "iPhone",
+			   identity: "iPhone/iPod"
+	    },
+		{
+			string: navigator.platform,
+			subString: "Linux",
+			identity: "Linux"
+		}
+	]
+
+};
+BrowserDetect.init();
Index: /gs3-extensions/web-audio/trunk/js-mad/script/frame.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/frame.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/frame.js	(revision 28388)
@@ -0,0 +1,411 @@
+
+var bitrate_table /* [5][15] */ = [
+/* MPEG-1 */
+[ 0,  32000,  64000,  96000, 128000, 160000, 192000, 224000,  /* Layer I   */
+    256000, 288000, 320000, 352000, 384000, 416000, 448000 ],
+    [ 0,  32000,  48000,  56000,  64000,  80000,  96000, 112000,  /* Layer II  */
+    128000, 160000, 192000, 224000, 256000, 320000, 384000 ],
+    [ 0,  32000,  40000,  48000,  56000,  64000,  80000,  96000,  /* Layer III */
+    112000, 128000, 160000, 192000, 224000, 256000, 320000 ],
+
+    /* MPEG-2 LSF */
+    [ 0,  32000,  48000,  56000,  64000,  80000,  96000, 112000,  /* Layer I   */
+    128000, 144000, 160000, 176000, 192000, 224000, 256000 ],
+    [ 0,   8000,  16000,  24000,  32000,  40000,  48000,  56000,  /* Layers    */
+    64000,  80000,  96000, 112000, 128000, 144000, 160000 ] /* II & III  */
+    ];
+
+    var samplerate_table /* [3] */ = [ 44100, 48000, 32000 ];
+
+    var decoder_table = [
+    function() { console.log("Layer I decoding is not implemented!"); },
+    function() { console.log("Layer II decoding is not implemented!"); },
+    Mad.layer_III
+    ];
+
+    Mad.Layer = {
+I: 1,
+   II: 2,
+   III: 3
+    };
+
+Mad.Mode = {
+SINGLE_CHANNEL      : 0,
+                      DUAL_CHANNEL        : 1,      /* dual channel */
+                      JOINT_STEREO        : 2,      /* joint (MS/intensity) stereo */
+                      STEREO              : 3       /* normal LR stereo */
+};
+
+Mad.Emphasis = {
+NONE       : 0,     /* no emphasis */
+             _50_15_US  : 1,     /* 50/15 microseconds emphasis */
+             CCITT_J_17 : 3,     /* CCITT J.17 emphasis */
+             RESERVED   : 2      /* unknown emphasis */
+};
+
+Mad.Header = function () {
+    this.layer          = 0;            /* audio layer (1, 2, or 3) */
+    this.mode           = 0;            /* channel mode (see above) */
+    this.mode_extension = 0;            /* additional mode info */
+    this.emphasis       = 0;            /* de-emphasis to use (see above) */    
+
+    this.bitrate        = 0;            /* stream bitrate (bps) */
+    this.samplerate     = 0;            /* sampling frequency (Hz) */
+
+    this.crc_check      = 0;            /* frame CRC accumulator */
+    this.crc_target     = 0;            /* final target CRC checksum */
+
+    this.flags          = 0;            /* flags (see below) */
+    this.private_bits   = 0;            /* private bits (see below) */
+
+    //this.duration       = mad_timer_zero;         /* audio playing time of frame */
+};
+
+Mad.Header.prototype.nchannels = function () {
+    return this.mode === 0 ? 1 : 2;
+}
+
+Mad.Header.prototype.nbsamples = function() {
+    return (this.layer === Mad.Layer.I ? 12 : 
+            ((this.layer === Mad.Layer.III && (this.flags & Mad.Flag.LSF_EXT)) ? 18 : 36));
+}
+
+/* libmad's decode_header */
+Mad.Header.actually_decode = function(stream) {
+    var header = new Mad.Header();
+
+    header.flags        = 0;
+    header.private_bits = 0;
+
+    /* header() */
+
+    /* syncword */
+    stream.ptr.skip(11);
+
+    /* MPEG 2.5 indicator (really part of syncword) */
+    if (stream.ptr.read(1) === 0) {
+        header.flags |= Mad.Flag.MPEG_2_5_EXT;
+    }
+
+    /* ID */
+    if (stream.ptr.read(1) === 0) {
+        header.flags |= Mad.Flag.LSF_EXT;
+    } else if (header.flags & Mad.Flag.MPEG_2_5_EXT) {
+        stream.error = Mad.Error.LOSTSYNC;
+        return null;
+    }
+
+    /* layer */
+    header.layer = 4 - stream.ptr.read(2);
+
+    if (header.layer === 4) {
+        stream.error = Mad.Error.BADLAYER;
+        return header;
+    }
+
+    /* protection_bit */
+    if (stream.ptr.read(1) === 0) {
+        header.flags    |= Mad.Flag.PROTECTION;
+        // TODO: crc
+        //header.crc_check = mad_bit_crc(stream.ptr, 16, 0xffff);
+        stream.ptr.skip(16);
+    }
+
+    /* bitrate_index */
+    var index = stream.ptr.read(4);
+    if (index === 15) {
+        stream.error = Mad.Error.BADBITRATE;
+        return header;
+    }
+
+    if (header.flags & Mad.Flag.LSF_EXT) {
+        header.bitrate = bitrate_table[3 + (header.layer >> 1)][index];
+    } else {
+        header.bitrate = bitrate_table[header.layer - 1][index];
+    }
+
+    /* sampling_frequency */
+    index = stream.ptr.read(2);
+
+    if (index === 3) {
+        stream.error = Mad.Error.BADSAMPLERATE;
+        return header;
+    }
+
+    header.samplerate = samplerate_table[index];
+
+    if (header.flags & Mad.Flag.LSF_EXT) {
+        header.samplerate /= 2;
+
+        if (header.flags & Mad.Flag.MPEG_2_5_EXT)
+            header.samplerate /= 2;
+    }
+
+    /* padding_bit */
+    if (stream.ptr.read(1))
+        header.flags |= Mad.Flag.PADDING;
+
+    /* private_bit */
+    if (stream.ptr.read(1))
+        header.private_bits |= Mad.Private.HEADER;
+
+    /* mode */
+    header.mode = 3 - stream.ptr.read(2);
+
+    /* mode_extension */
+    header.mode_extension = stream.ptr.read(2);
+
+    /* copyright */
+    if (stream.ptr.read(1))
+        header.flags |= Mad.Flag.COPYRIGHT;
+
+    /* original/copy */
+    if (stream.ptr.read(1))
+        header.flags |= Mad.Flag.ORIGINAL;
+
+    /* emphasis */
+    header.emphasis = stream.ptr.read(2);
+
+    /* error_check() */
+
+    /* crc_check */
+    if (header.flags & Mad.Flag.PROTECTION)
+        header.crc_target = stream.ptr.read(16);
+
+    return header;
+}
+
+/* libmad's mad_header_decode */
+Mad.Header.decode = function(stream) {
+    var header = null;
+
+    // those are actually pointers. javascript powa.
+    var ptr = stream.next_frame;
+    var end = stream.bufend;
+    var pad_slot = 0;
+    var N = 0;
+
+    /* stream skip */
+    if (stream.skiplen) {
+        if (!stream.sync)
+            ptr = stream.this_frame;
+
+        if (end - ptr < stream.skiplen) {
+            stream.skiplen   -= end - ptr;
+            stream.next_frame = end;
+
+            stream.error = Mad.Error.BUFLEN;
+            return null;
+        }
+
+        ptr += stream.skiplen;
+        stream.skiplen = 0;
+
+        stream.sync = 1;
+    }
+
+    // emulating goto in JS, yay! this was a 'sync:' label
+    var syncing = true;
+
+    while(syncing) {
+        syncing = false;
+
+        /* synchronize */
+        try {
+            if (stream.sync) {
+                if (end - ptr < Mad.BUFFER_GUARD) {
+                    stream.next_frame = ptr;
+
+                    stream.error = Mad.Error.BUFLEN;
+                    return null;
+                } else if (!(stream.getU8(ptr) === 0xff && (stream.getU8(ptr + 1) & 0xe0) === 0xe0)) {
+                    /* mark point where frame sync word was expected */
+                    stream.this_frame = ptr;
+                    stream.next_frame = ptr + 1;
+
+                    stream.error = Mad.Error.LOSTSYNC;
+                    return null;
+                }
+            } else {
+                stream.ptr = new Mad.Bit(stream.stream, ptr);
+
+                if (stream.doSync() === -1) {
+                    if (end - stream.next_frame >= Mad.BUFFER_GUARD)
+                        stream.next_frame = end - Mad.BUFFER_GUARD;
+                    stream.error = Mad.Error.BUFLEN;
+                    return null;
+                }
+
+                ptr = stream.ptr.nextbyte();
+            }
+        } catch (e) {
+            console.log("Synchronization error: " + e);
+
+            stream.error = Mad.Error.BUFLEN;
+
+            return null;
+        }
+
+        /* begin processing */
+        stream.this_frame = ptr;
+        stream.next_frame = ptr + 1;  /* possibly bogus sync word */
+
+        stream.ptr = new Mad.Bit(stream.stream, stream.this_frame);
+
+        header = Mad.Header.actually_decode(stream);
+        if(header === null) return null; // well Duh^2
+
+        //console.log("=============== Decoding layer " + header.layer + " audio mode " +
+        //     header.mode + " with " + header.bitrate +
+        //     " bps and a samplerate of " + header.samplerate);
+
+        /* calculate frame duration */
+        //mad_timer_set(&header.duration, 0, 32 * MAD_NSBSAMPLES(header), header.samplerate);
+
+        /* calculate free bit rate */
+        if (header.bitrate === 0) {
+            console.log("Uh oh, a free bitrate stream. We're fucked.");
+            stream.error = Mad.Error.BADDATAPTR; // best guess
+            return null;
+
+            //        if ((stream.freerate === 0 || !stream.sync ||
+            //                        (header.layer === Mad.Layer.III && stream.freerate > 640000)) &&
+            //                free_bitrate(stream, header) === -1)
+            //            return null;
+            //
+            //        header.bitrate = stream.freerate;
+            //        header.flags  |= Mad.Flag.FREEFORMAT;
+        }
+
+        /* calculate beginning of next frame */
+        pad_slot = (header.flags & Mad.Flag.PADDING) ? 1 : 0;
+
+        if (header.layer === Mad.Layer.I) {
+            N = (((12 * header.bitrate / header.samplerate) << 0) + pad_slot) * 4;
+        } else {
+            var slots_per_frame = (header.layer === Mad.Layer.III &&
+                    (header.flags & Mad.Flag.LSF_EXT)) ? 72 : 144;
+            //console.log("slots_per_frame = " + slots_per_frame + ", bitrate = " + header.bitrate + ", samplerate = " + header.samplerate);
+
+            N = ((slots_per_frame * header.bitrate / header.samplerate) << 0) + pad_slot;
+        }
+
+
+        /* verify there is enough data left in buffer to decode this frame */
+        if (N + Mad.BUFFER_GUARD > end - stream.this_frame) {
+            stream.next_frame = stream.this_frame;
+
+            stream.error = Mad.Error.BUFLEN;
+            return null;
+        }
+
+        stream.next_frame = stream.this_frame + N;
+
+        // console.log("N = " + N + ", pad_slot = " + pad_slot + ", next_frame = " + stream.next_frame);
+
+        if (!stream.sync) {
+            /* check that a valid frame header follows this frame */
+            ptr = stream.next_frame;
+            if (!(stream.getU8(ptr) === 0xff && (stream.getU8(ptr + 1) & 0xe0) === 0xe0)) {
+                ptr = stream.next_frame = stream.this_frame + 1;
+
+                // emulating 'goto sync'
+                syncing = true;
+                continue;
+            }
+            stream.sync = 1;
+        }
+    } // end of goto emulation (label 'sync')
+
+    header.flags |= Mad.Flag.INCOMPLETE;
+    return header;
+}
+
+Mad.Frame = function () {
+    this.header = new Mad.Header();     /* MPEG audio header */
+
+    this.options = 0;                   /* decoding options (from stream) */
+
+    // sbsample[2][36][32]
+    this.sbsample = [];   /* synthesis subband filter samples */
+    for(var ch = 0; ch < 2; ch++) {
+        this.sbsample[ch] = [];
+        for(var grp = 0; grp < 36; grp++) {
+            // this.sbsample[ch][grp] = new Float64Array(new ArrayBuffer(8 * 32));
+            this.sbsample[ch][grp] = [];
+            for(var i = 0; i < 32; i++) {
+                this.sbsample[ch][grp][i] = 0;
+            }
+        }
+    }
+
+    // overlap[2][32][18]
+    this.overlap = []; /* Layer III block overlap data */
+    for(var ch = 0; ch < 2; ch++) {
+        this.overlap[ch] = [];
+        for(var sb = 0; sb < 32; sb++) {
+            // this.overlap[ch][sb] = new Float64Array(new ArrayBuffer(8 * 18));
+            this.overlap[ch][sb] = [];
+            for(var i = 0; i < 18; i++) {
+                this.overlap[ch][sb][i] = 0;
+            }
+        }
+    }
+};
+
+Mad.Frame.decode = function(frame, stream) {
+    frame.options = stream.options;
+
+    /* header() */
+    /* error_check() */
+
+    if (!(frame.header.flags & Mad.Flag.INCOMPLETE)) {
+        frame.header = Mad.Header.decode(stream);
+        if(frame.header === null) {
+            // something went wrong
+            throw 'Header decoding failed';
+        }
+    }
+
+    frame.header.flags &= ~Mad.Flag.INCOMPLETE;
+
+    if (decoder_table[frame.header.layer - 1](stream, frame) === -1) {
+        if (!Mad.recoverable(stream.error)) {
+            stream.next_frame = stream.this_frame;
+        }
+        throw 'Decoder table error';
+    }
+
+    return frame;
+};
+
+Mad.sbsampleIndex = function (i, j, k) {
+    return i * 36 * 32 + j * 32 + k;
+};
+
+Mad.overlapIndex = function (i, j, k) {
+    return i * 32 * 18 + j * 18 + k;
+};
+
+Mad.Flag = {
+NPRIVATE_III   : 0x0007,   /* number of Layer III private bits */
+                 INCOMPLETE : 0x0008,   /* header but not data is decoded */
+
+                 PROTECTION : 0x0010,   /* frame has CRC protection */
+                 COPYRIGHT  : 0x0020,   /* frame is copyright */
+                 ORIGINAL   : 0x0040,   /* frame is original (else copy) */
+                 PADDING    : 0x0080,   /* frame has additional slot */
+
+                 I_STEREO   : 0x0100,   /* uses intensity joint stereo */
+                 MS_STEREO  : 0x0200,   /* uses middle/side joint stereo */
+                 FREEFORMAT : 0x0400,   /* uses free format bitrate */
+
+                 LSF_EXT    : 0x1000,   /* lower sampling freq. extension */
+                 MC_EXT : 0x2000,   /* multichannel audio extension */
+                 MPEG_2_5_EXT   : 0x4000    /* MPEG 2.5 (unofficial) extension */
+};
+
+Mad.Private = {
+HEADER  : 0x0100,   /* header private bit */
+          III : 0x001f    /* Layer III private bits (up to 5) */
+};
Index: /gs3-extensions/web-audio/trunk/js-mad/script/huffman.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/huffman.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/huffman.js	(revision 28388)
@@ -0,0 +1,3065 @@
+
+/*
+ * These are the Huffman code words for Layer III.
+ * The data for these tables are derived from Table B.7 of ISO/IEC 11172-3.
+ *
+ * These tables support decoding up to 4 Huffman code bits at a time.
+ */
+
+/*
+union huffquad {
+  struct {
+    unsigned short final  :  1;
+    unsigned short bits   :  3;
+    unsigned short offset : 12;
+  } ptr;
+  struct {
+    unsigned short final  :  1;
+    unsigned short hlen   :  3;
+    unsigned short v      :  1;
+    unsigned short w      :  1;
+    unsigned short x      :  1;
+    unsigned short y      :  1;
+  } value;
+  unsigned short final    :  1;
+};
+
+union huffpair {
+  struct {
+    unsigned short final  :  1;
+    unsigned short bits   :  3;
+    unsigned short offset : 12;
+  } ptr;
+  struct {
+    unsigned short final  :  1;
+    unsigned short hlen   :  3;
+    unsigned short x      :  4;
+    unsigned short y      :  4;
+  } value;
+  unsigned short final    :  1;
+};
+
+struct hufftable {
+  union huffpair const *table;
+  unsigned short linbits;
+  unsigned short startbits;
+};
+*/
+
+//extern union huffquad const *const mad_huff_quad_table[2];
+//extern struct hufftable const mad_huff_pair_table[32];
+
+Mad.huff_quad_table = []; /* 2 */
+Mad.huff_pair_table = []; /* 32 */
+
+var PTR = function(offs, bits) {
+    return {
+        'final':  0, // final is a reserved word in JavaScript and GSC will complain about it.
+        ptr: {
+            bits:   bits,
+            offset: offs
+        }
+    };
+};
+
+var huffquad_V = function (v, w, x, y, hlen) {
+    return {
+        'final':  1, // final is a reserved word in JavaScript and GSC will complain about it.
+        value: {
+            v: v,
+            w: w,
+            x: x,
+            y: y
+        }
+    };
+};
+
+/*
+# if defined(__GNUC__) ||  \
+    (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901)
+#  define PTR(offs, bits)	{ .ptr   = { 0, bits, offs       } }
+#  define V(v, w, x, y, hlen)	{ .value = { 1, hlen, v, w, x, y } }
+# else
+#  define PTR(offs, bits)	{ { 0, bits, offs } }
+#  if defined(WORDS_BIGENDIAN)
+#   define V(v, w, x, y, hlen)	{ { 1, hlen, (v << 11) | (w << 10) | (x <<  9) | (y <<  8) } }
+#  else
+#   define V(v, w, x, y, hlen)	{ { 1, hlen, (v <<  0) | (w <<  1) | (x <<  2) | (y <<  3) } }
+#  endif
+# endif
+*/
+
+/* huffquad */ var hufftabA = [
+  /* 0000 */ PTR(16, 2),
+  /* 0001 */ PTR(20, 2),
+  /* 0010 */ PTR(24, 1),
+  /* 0011 */ PTR(26, 1),
+  /* 0100 */ huffquad_V(0, 0, 1, 0, 4),
+  /* 0101 */ huffquad_V(0, 0, 0, 1, 4),
+  /* 0110 */ huffquad_V(0, 1, 0, 0, 4),
+  /* 0111 */ huffquad_V(1, 0, 0, 0, 4),
+  /* 1000 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1001 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1010 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1011 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1100 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1101 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1110 */ huffquad_V(0, 0, 0, 0, 1),
+  /* 1111 */ huffquad_V(0, 0, 0, 0, 1),
+
+  /* 0000 ... */
+  /* 00   */ huffquad_V(1, 0, 1, 1, 2),	/* 16 */
+  /* 01   */ huffquad_V(1, 1, 1, 1, 2),
+  /* 10   */ huffquad_V(1, 1, 0, 1, 2),
+  /* 11   */ huffquad_V(1, 1, 1, 0, 2),
+
+  /* 0001 ... */
+  /* 00   */ huffquad_V(0, 1, 1, 1, 2),	/* 20 */
+  /* 01   */ huffquad_V(0, 1, 0, 1, 2),
+  /* 10   */ huffquad_V(1, 0, 0, 1, 1),
+  /* 11   */ huffquad_V(1, 0, 0, 1, 1),
+
+  /* 0010 ... */
+  /* 0    */ huffquad_V(0, 1, 1, 0, 1),	/* 24 */
+  /* 1    */ huffquad_V(0, 0, 1, 1, 1),
+
+  /* 0011 ... */
+  /* 0    */ huffquad_V(1, 0, 1, 0, 1),	/* 26 */
+  /* 1    */ huffquad_V(1, 1, 0, 0, 1)
+];
+
+/* huffquad */ var hufftabB = [
+  /* 0000 */ huffquad_V(1, 1, 1, 1, 4),
+  /* 0001 */ huffquad_V(1, 1, 1, 0, 4),
+  /* 0010 */ huffquad_V(1, 1, 0, 1, 4),
+  /* 0011 */ huffquad_V(1, 1, 0, 0, 4),
+  /* 0100 */ huffquad_V(1, 0, 1, 1, 4),
+  /* 0101 */ huffquad_V(1, 0, 1, 0, 4),
+  /* 0110 */ huffquad_V(1, 0, 0, 1, 4),
+  /* 0111 */ huffquad_V(1, 0, 0, 0, 4),
+  /* 1000 */ huffquad_V(0, 1, 1, 1, 4),
+  /* 1001 */ huffquad_V(0, 1, 1, 0, 4),
+  /* 1010 */ huffquad_V(0, 1, 0, 1, 4),
+  /* 1011 */ huffquad_V(0, 1, 0, 0, 4),
+  /* 1100 */ huffquad_V(0, 0, 1, 1, 4),
+  /* 1101 */ huffquad_V(0, 0, 1, 0, 4),
+  /* 1110 */ huffquad_V(0, 0, 0, 1, 4),
+  /* 1111 */ huffquad_V(0, 0, 0, 0, 4)
+];
+
+/*
+# undef V
+# undef PTR
+
+# if defined(__GNUC__) ||  \
+    (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901)
+#  define PTR(offs, bits)	{ .ptr   = { 0, bits, offs } }
+#  define V(x, y, hlen)		{ .value = { 1, hlen, x, y } }
+# else
+#  define PTR(offs, bits)	{ { 0, bits, offs } }
+#  if defined(WORDS_BIGENDIAN)
+#   define V(x, y, hlen)	{ { 1, hlen, (x << 8) | (y << 4) } }
+#  else
+#   define V(x, y, hlen)	{ { 1, hlen, (x << 0) | (y << 4) } }
+#  endif
+# endif
+*/
+
+var V = function (x, y, hlen) {
+    return {
+        'final':  1, // final is a reserved word in JavaScript and GSC will complain about it.
+        value: {
+            x: x,
+            y: y,
+            hlen: hlen
+        }
+    };
+};
+
+var hufftab0 = [
+  /*      */ V(0, 0, 0)
+];
+
+var hufftab1 = [
+  /* 000  */ V(1, 1, 3),
+  /* 001  */ V(0, 1, 3),
+  /* 010  */ V(1, 0, 2),
+  /* 011  */ V(1, 0, 2),
+  /* 100  */ V(0, 0, 1),
+  /* 101  */ V(0, 0, 1),
+  /* 110  */ V(0, 0, 1),
+  /* 111  */ V(0, 0, 1)
+];
+
+var hufftab2 = [
+  /* 000  */ PTR(8, 3),
+  /* 001  */ V(1, 1, 3),
+  /* 010  */ V(0, 1, 3),
+  /* 011  */ V(1, 0, 3),
+  /* 100  */ V(0, 0, 1),
+  /* 101  */ V(0, 0, 1),
+  /* 110  */ V(0, 0, 1),
+  /* 111  */ V(0, 0, 1),
+
+  /* 000 ... */
+  /* 000  */ V(2, 2, 3),	/* 8 */
+  /* 001  */ V(0, 2, 3),
+  /* 010  */ V(1, 2, 2),
+  /* 011  */ V(1, 2, 2),
+  /* 100  */ V(2, 1, 2),
+  /* 101  */ V(2, 1, 2),
+  /* 110  */ V(2, 0, 2),
+  /* 111  */ V(2, 0, 2)
+];
+
+var hufftab3 = [
+  /* 000  */ PTR(8, 3),
+  /* 001  */ V(1, 0, 3),
+  /* 010  */ V(1, 1, 2),
+  /* 011  */ V(1, 1, 2),
+  /* 100  */ V(0, 1, 2),
+  /* 101  */ V(0, 1, 2),
+  /* 110  */ V(0, 0, 2),
+  /* 111  */ V(0, 0, 2),
+
+  /* 000 ... */
+  /* 000  */ V(2, 2, 3),	/* 8 */
+  /* 001  */ V(0, 2, 3),
+  /* 010  */ V(1, 2, 2),
+  /* 011  */ V(1, 2, 2),
+  /* 100  */ V(2, 1, 2),
+  /* 101  */ V(2, 1, 2),
+  /* 110  */ V(2, 0, 2),
+  /* 111  */ V(2, 0, 2)
+];
+
+var hufftab5 = [
+  /* 000  */ PTR(8, 4),
+  /* 001  */ V(1, 1, 3),
+  /* 010  */ V(0, 1, 3),
+  /* 011  */ V(1, 0, 3),
+  /* 100  */ V(0, 0, 1),
+  /* 101  */ V(0, 0, 1),
+  /* 110  */ V(0, 0, 1),
+  /* 111  */ V(0, 0, 1),
+
+  /* 000 ... */
+  /* 0000 */ PTR(24, 1),	/* 8 */
+  /* 0001 */ V(3, 2, 4),
+  /* 0010 */ V(3, 1, 3),
+  /* 0011 */ V(3, 1, 3),
+  /* 0100 */ V(1, 3, 4),
+  /* 0101 */ V(0, 3, 4),
+  /* 0110 */ V(3, 0, 4),
+  /* 0111 */ V(2, 2, 4),
+  /* 1000 */ V(1, 2, 3),
+  /* 1001 */ V(1, 2, 3),
+  /* 1010 */ V(2, 1, 3),
+  /* 1011 */ V(2, 1, 3),
+  /* 1100 */ V(0, 2, 3),
+  /* 1101 */ V(0, 2, 3),
+  /* 1110 */ V(2, 0, 3),
+  /* 1111 */ V(2, 0, 3),
+
+  /* 000 0000 ... */
+  /* 0    */ V(3, 3, 1),	/* 24 */
+  /* 1    */ V(2, 3, 1)
+];
+
+var hufftab6 = [
+  /* 0000 */ PTR(16, 3),
+  /* 0001 */ PTR(24, 1),
+  /* 0010 */ PTR(26, 1),
+  /* 0011 */ V(1, 2, 4),
+  /* 0100 */ V(2, 1, 4),
+  /* 0101 */ V(2, 0, 4),
+  /* 0110 */ V(0, 1, 3),
+  /* 0111 */ V(0, 1, 3),
+  /* 1000 */ V(1, 1, 2),
+  /* 1001 */ V(1, 1, 2),
+  /* 1010 */ V(1, 1, 2),
+  /* 1011 */ V(1, 1, 2),
+  /* 1100 */ V(1, 0, 3),
+  /* 1101 */ V(1, 0, 3),
+  /* 1110 */ V(0, 0, 3),
+  /* 1111 */ V(0, 0, 3),
+
+  /* 0000 ... */
+  /* 000  */ V(3, 3, 3),	/* 16 */
+  /* 001  */ V(0, 3, 3),
+  /* 010  */ V(2, 3, 2),
+  /* 011  */ V(2, 3, 2),
+  /* 100  */ V(3, 2, 2),
+  /* 101  */ V(3, 2, 2),
+  /* 110  */ V(3, 0, 2),
+  /* 111  */ V(3, 0, 2),
+
+  /* 0001 ... */
+  /* 0    */ V(1, 3, 1),	/* 24 */
+  /* 1    */ V(3, 1, 1),
+
+  /* 0010 ... */
+  /* 0    */ V(2, 2, 1),	/* 26 */
+  /* 1    */ V(0, 2, 1)
+];
+
+var hufftab7 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 2),
+  /* 0011 */ V(1, 1, 4),
+  /* 0100 */ V(0, 1, 3),
+  /* 0101 */ V(0, 1, 3),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(52, 2),	/* 16 */
+  /* 0001 */ PTR(56, 1),
+  /* 0010 */ PTR(58, 1),
+  /* 0011 */ V(1, 5, 4),
+  /* 0100 */ V(5, 1, 4),
+  /* 0101 */ PTR(60, 1),
+  /* 0110 */ V(5, 0, 4),
+  /* 0111 */ PTR(62, 1),
+  /* 1000 */ V(2, 4, 4),
+  /* 1001 */ V(4, 2, 4),
+  /* 1010 */ V(1, 4, 3),
+  /* 1011 */ V(1, 4, 3),
+  /* 1100 */ V(4, 1, 3),
+  /* 1101 */ V(4, 1, 3),
+  /* 1110 */ V(4, 0, 3),
+  /* 1111 */ V(4, 0, 3),
+
+  /* 0001 ... */
+  /* 0000 */ V(0, 4, 4),	/* 32 */
+  /* 0001 */ V(2, 3, 4),
+  /* 0010 */ V(3, 2, 4),
+  /* 0011 */ V(0, 3, 4),
+  /* 0100 */ V(1, 3, 3),
+  /* 0101 */ V(1, 3, 3),
+  /* 0110 */ V(3, 1, 3),
+  /* 0111 */ V(3, 1, 3),
+  /* 1000 */ V(3, 0, 3),
+  /* 1001 */ V(3, 0, 3),
+  /* 1010 */ V(2, 2, 3),
+  /* 1011 */ V(2, 2, 3),
+  /* 1100 */ V(1, 2, 2),
+  /* 1101 */ V(1, 2, 2),
+  /* 1110 */ V(1, 2, 2),
+  /* 1111 */ V(1, 2, 2),
+
+  /* 0010 ... */
+  /* 00   */ V(2, 1, 1),	/* 48 */
+  /* 01   */ V(2, 1, 1),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 00   */ V(5, 5, 2),	/* 52 */
+  /* 01   */ V(4, 5, 2),
+  /* 10   */ V(5, 4, 2),
+  /* 11   */ V(5, 3, 2),
+
+  /* 0000 0001 ... */
+  /* 0    */ V(3, 5, 1),	/* 56 */
+  /* 1    */ V(4, 4, 1),
+
+  /* 0000 0010 ... */
+  /* 0    */ V(2, 5, 1),	/* 58 */
+  /* 1    */ V(5, 2, 1),
+
+  /* 0000 0101 ... */
+  /* 0    */ V(0, 5, 1),	/* 60 */
+  /* 1    */ V(3, 4, 1),
+
+  /* 0000 0111 ... */
+  /* 0    */ V(4, 3, 1),	/* 62 */
+  /* 1    */ V(3, 3, 1)
+];
+
+var hufftab8 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ V(1, 2, 4),
+  /* 0011 */ V(2, 1, 4),
+  /* 0100 */ V(1, 1, 2),
+  /* 0101 */ V(1, 1, 2),
+  /* 0110 */ V(1, 1, 2),
+  /* 0111 */ V(1, 1, 2),
+  /* 1000 */ V(0, 1, 3),
+  /* 1001 */ V(0, 1, 3),
+  /* 1010 */ V(1, 0, 3),
+  /* 1011 */ V(1, 0, 3),
+  /* 1100 */ V(0, 0, 2),
+  /* 1101 */ V(0, 0, 2),
+  /* 1110 */ V(0, 0, 2),
+  /* 1111 */ V(0, 0, 2),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(48, 3),	/* 16 */
+  /* 0001 */ PTR(56, 2),
+  /* 0010 */ PTR(60, 1),
+  /* 0011 */ V(1, 5, 4),
+  /* 0100 */ V(5, 1, 4),
+  /* 0101 */ PTR(62, 1),
+  /* 0110 */ PTR(64, 1),
+  /* 0111 */ V(2, 4, 4),
+  /* 1000 */ V(4, 2, 4),
+  /* 1001 */ V(1, 4, 4),
+  /* 1010 */ V(4, 1, 3),
+  /* 1011 */ V(4, 1, 3),
+  /* 1100 */ V(0, 4, 4),
+  /* 1101 */ V(4, 0, 4),
+  /* 1110 */ V(2, 3, 4),
+  /* 1111 */ V(3, 2, 4),
+
+  /* 0001 ... */
+  /* 0000 */ V(1, 3, 4),	/* 32 */
+  /* 0001 */ V(3, 1, 4),
+  /* 0010 */ V(0, 3, 4),
+  /* 0011 */ V(3, 0, 4),
+  /* 0100 */ V(2, 2, 2),
+  /* 0101 */ V(2, 2, 2),
+  /* 0110 */ V(2, 2, 2),
+  /* 0111 */ V(2, 2, 2),
+  /* 1000 */ V(0, 2, 2),
+  /* 1001 */ V(0, 2, 2),
+  /* 1010 */ V(0, 2, 2),
+  /* 1011 */ V(0, 2, 2),
+  /* 1100 */ V(2, 0, 2),
+  /* 1101 */ V(2, 0, 2),
+  /* 1110 */ V(2, 0, 2),
+  /* 1111 */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 000  */ V(5, 5, 3),	/* 48 */
+  /* 001  */ V(5, 4, 3),
+  /* 010  */ V(4, 5, 2),
+  /* 011  */ V(4, 5, 2),
+  /* 100  */ V(5, 3, 1),
+  /* 101  */ V(5, 3, 1),
+  /* 110  */ V(5, 3, 1),
+  /* 111  */ V(5, 3, 1),
+
+  /* 0000 0001 ... */
+  /* 00   */ V(3, 5, 2),	/* 56 */
+  /* 01   */ V(4, 4, 2),
+  /* 10   */ V(2, 5, 1),
+  /* 11   */ V(2, 5, 1),
+
+  /* 0000 0010 ... */
+  /* 0    */ V(5, 2, 1),	/* 60 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0000 0101 ... */
+  /* 0    */ V(3, 4, 1),	/* 62 */
+  /* 1    */ V(4, 3, 1),
+
+  /* 0000 0110 ... */
+  /* 0    */ V(5, 0, 1),	/* 64 */
+  /* 1    */ V(3, 3, 1)
+];
+
+var hufftab9 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 3),
+  /* 0010 */ PTR(40, 2),
+  /* 0011 */ PTR(44, 2),
+  /* 0100 */ PTR(48, 1),
+  /* 0101 */ V(1, 2, 4),
+  /* 0110 */ V(2, 1, 4),
+  /* 0111 */ V(2, 0, 4),
+  /* 1000 */ V(1, 1, 3),
+  /* 1001 */ V(1, 1, 3),
+  /* 1010 */ V(0, 1, 3),
+  /* 1011 */ V(0, 1, 3),
+  /* 1100 */ V(1, 0, 3),
+  /* 1101 */ V(1, 0, 3),
+  /* 1110 */ V(0, 0, 3),
+  /* 1111 */ V(0, 0, 3),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(50, 1),	/* 16 */
+  /* 0001 */ V(3, 5, 4),
+  /* 0010 */ V(5, 3, 4),
+  /* 0011 */ PTR(52, 1),
+  /* 0100 */ V(4, 4, 4),
+  /* 0101 */ V(2, 5, 4),
+  /* 0110 */ V(5, 2, 4),
+  /* 0111 */ V(1, 5, 4),
+  /* 1000 */ V(5, 1, 3),
+  /* 1001 */ V(5, 1, 3),
+  /* 1010 */ V(3, 4, 3),
+  /* 1011 */ V(3, 4, 3),
+  /* 1100 */ V(4, 3, 3),
+  /* 1101 */ V(4, 3, 3),
+  /* 1110 */ V(5, 0, 4),
+  /* 1111 */ V(0, 4, 4),
+
+  /* 0001 ... */
+  /* 000  */ V(2, 4, 3),	/* 32 */
+  /* 001  */ V(4, 2, 3),
+  /* 010  */ V(3, 3, 3),
+  /* 011  */ V(4, 0, 3),
+  /* 100  */ V(1, 4, 2),
+  /* 101  */ V(1, 4, 2),
+  /* 110  */ V(4, 1, 2),
+  /* 111  */ V(4, 1, 2),
+
+  /* 0010 ... */
+  /* 00   */ V(2, 3, 2),	/* 40 */
+  /* 01   */ V(3, 2, 2),
+  /* 10   */ V(1, 3, 1),
+  /* 11   */ V(1, 3, 1),
+
+  /* 0011 ... */
+  /* 00   */ V(3, 1, 1),	/* 44 */
+  /* 01   */ V(3, 1, 1),
+  /* 10   */ V(0, 3, 2),
+  /* 11   */ V(3, 0, 2),
+
+  /* 0100 ... */
+  /* 0    */ V(2, 2, 1),	/* 48 */
+  /* 1    */ V(0, 2, 1),
+
+  /* 0000 0000 ... */
+  /* 0    */ V(5, 5, 1),	/* 50 */
+  /* 1    */ V(4, 5, 1),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(5, 4, 1),	/* 52 */
+  /* 1    */ V(0, 5, 1)
+];
+
+var hufftab10 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 2),
+  /* 0011 */ V(1, 1, 4),
+  /* 0100 */ V(0, 1, 3),
+  /* 0101 */ V(0, 1, 3),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(52, 3),	/* 16 */
+  /* 0001 */ PTR(60, 2),
+  /* 0010 */ PTR(64, 3),
+  /* 0011 */ PTR(72, 1),
+  /* 0100 */ PTR(74, 2),
+  /* 0101 */ PTR(78, 2),
+  /* 0110 */ PTR(82, 2),
+  /* 0111 */ V(1, 7, 4),
+  /* 1000 */ V(7, 1, 4),
+  /* 1001 */ PTR(86, 1),
+  /* 1010 */ PTR(88, 2),
+  /* 1011 */ PTR(92, 2),
+  /* 1100 */ V(1, 6, 4),
+  /* 1101 */ V(6, 1, 4),
+  /* 1110 */ V(6, 0, 4),
+  /* 1111 */ PTR(96, 1),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(98, 1),	/* 32 */
+  /* 0001 */ PTR(100, 1),
+  /* 0010 */ V(1, 4, 4),
+  /* 0011 */ V(4, 1, 4),
+  /* 0100 */ V(4, 0, 4),
+  /* 0101 */ V(2, 3, 4),
+  /* 0110 */ V(3, 2, 4),
+  /* 0111 */ V(0, 3, 4),
+  /* 1000 */ V(1, 3, 3),
+  /* 1001 */ V(1, 3, 3),
+  /* 1010 */ V(3, 1, 3),
+  /* 1011 */ V(3, 1, 3),
+  /* 1100 */ V(3, 0, 3),
+  /* 1101 */ V(3, 0, 3),
+  /* 1110 */ V(2, 2, 3),
+  /* 1111 */ V(2, 2, 3),
+
+  /* 0010 ... */
+  /* 00   */ V(1, 2, 2),	/* 48 */
+  /* 01   */ V(2, 1, 2),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 000  */ V(7, 7, 3),	/* 52 */
+  /* 001  */ V(6, 7, 3),
+  /* 010  */ V(7, 6, 3),
+  /* 011  */ V(5, 7, 3),
+  /* 100  */ V(7, 5, 3),
+  /* 101  */ V(6, 6, 3),
+  /* 110  */ V(4, 7, 2),
+  /* 111  */ V(4, 7, 2),
+
+  /* 0000 0001 ... */
+  /* 00   */ V(7, 4, 2),	/* 60 */
+  /* 01   */ V(5, 6, 2),
+  /* 10   */ V(6, 5, 2),
+  /* 11   */ V(3, 7, 2),
+
+  /* 0000 0010 ... */
+  /* 000  */ V(7, 3, 2),	/* 64 */
+  /* 001  */ V(7, 3, 2),
+  /* 010  */ V(4, 6, 2),
+  /* 011  */ V(4, 6, 2),
+  /* 100  */ V(5, 5, 3),
+  /* 101  */ V(5, 4, 3),
+  /* 110  */ V(6, 3, 2),
+  /* 111  */ V(6, 3, 2),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(2, 7, 1),	/* 72 */
+  /* 1    */ V(7, 2, 1),
+
+  /* 0000 0100 ... */
+  /* 00   */ V(6, 4, 2),	/* 74 */
+  /* 01   */ V(0, 7, 2),
+  /* 10   */ V(7, 0, 1),
+  /* 11   */ V(7, 0, 1),
+
+  /* 0000 0101 ... */
+  /* 00   */ V(6, 2, 1),	/* 78 */
+  /* 01   */ V(6, 2, 1),
+  /* 10   */ V(4, 5, 2),
+  /* 11   */ V(3, 5, 2),
+
+  /* 0000 0110 ... */
+  /* 00   */ V(0, 6, 1),	/* 82 */
+  /* 01   */ V(0, 6, 1),
+  /* 10   */ V(5, 3, 2),
+  /* 11   */ V(4, 4, 2),
+
+  /* 0000 1001 ... */
+  /* 0    */ V(3, 6, 1),	/* 86 */
+  /* 1    */ V(2, 6, 1),
+
+  /* 0000 1010 ... */
+  /* 00   */ V(2, 5, 2),	/* 88 */
+  /* 01   */ V(5, 2, 2),
+  /* 10   */ V(1, 5, 1),
+  /* 11   */ V(1, 5, 1),
+
+  /* 0000 1011 ... */
+  /* 00   */ V(5, 1, 1),	/* 92 */
+  /* 01   */ V(5, 1, 1),
+  /* 10   */ V(3, 4, 2),
+  /* 11   */ V(4, 3, 2),
+
+  /* 0000 1111 ... */
+  /* 0    */ V(0, 5, 1),	/* 96 */
+  /* 1    */ V(5, 0, 1),
+
+  /* 0001 0000 ... */
+  /* 0    */ V(2, 4, 1),	/* 98 */
+  /* 1    */ V(4, 2, 1),
+
+  /* 0001 0001 ... */
+  /* 0    */ V(3, 3, 1),	/* 100 */
+  /* 1    */ V(0, 4, 1)
+];
+
+var hufftab11 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 3),
+  /* 0100 */ V(1, 2, 4),
+  /* 0101 */ PTR(72, 1),
+  /* 0110 */ V(1, 1, 3),
+  /* 0111 */ V(1, 1, 3),
+  /* 1000 */ V(0, 1, 3),
+  /* 1001 */ V(0, 1, 3),
+  /* 1010 */ V(1, 0, 3),
+  /* 1011 */ V(1, 0, 3),
+  /* 1100 */ V(0, 0, 2),
+  /* 1101 */ V(0, 0, 2),
+  /* 1110 */ V(0, 0, 2),
+  /* 1111 */ V(0, 0, 2),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(74, 2),	/* 16 */
+  /* 0001 */ PTR(78, 3),
+  /* 0010 */ PTR(86, 2),
+  /* 0011 */ PTR(90, 1),
+  /* 0100 */ PTR(92, 2),
+  /* 0101 */ V(2, 7, 4),
+  /* 0110 */ V(7, 2, 4),
+  /* 0111 */ PTR(96, 1),
+  /* 1000 */ V(7, 1, 3),
+  /* 1001 */ V(7, 1, 3),
+  /* 1010 */ V(1, 7, 4),
+  /* 1011 */ V(7, 0, 4),
+  /* 1100 */ V(3, 6, 4),
+  /* 1101 */ V(6, 3, 4),
+  /* 1110 */ V(6, 0, 4),
+  /* 1111 */ PTR(98, 1),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(100, 1),	/* 32 */
+  /* 0001 */ V(1, 5, 4),
+  /* 0010 */ V(6, 2, 3),
+  /* 0011 */ V(6, 2, 3),
+  /* 0100 */ V(2, 6, 4),
+  /* 0101 */ V(0, 6, 4),
+  /* 0110 */ V(1, 6, 3),
+  /* 0111 */ V(1, 6, 3),
+  /* 1000 */ V(6, 1, 3),
+  /* 1001 */ V(6, 1, 3),
+  /* 1010 */ V(5, 1, 4),
+  /* 1011 */ V(3, 4, 4),
+  /* 1100 */ V(5, 0, 4),
+  /* 1101 */ PTR(102, 1),
+  /* 1110 */ V(2, 4, 4),
+  /* 1111 */ V(4, 2, 4),
+
+  /* 0010 ... */
+  /* 0000 */ V(1, 4, 4),	/* 48 */
+  /* 0001 */ V(4, 1, 4),
+  /* 0010 */ V(0, 4, 4),
+  /* 0011 */ V(4, 0, 4),
+  /* 0100 */ V(2, 3, 3),
+  /* 0101 */ V(2, 3, 3),
+  /* 0110 */ V(3, 2, 3),
+  /* 0111 */ V(3, 2, 3),
+  /* 1000 */ V(1, 3, 2),
+  /* 1001 */ V(1, 3, 2),
+  /* 1010 */ V(1, 3, 2),
+  /* 1011 */ V(1, 3, 2),
+  /* 1100 */ V(3, 1, 2),
+  /* 1101 */ V(3, 1, 2),
+  /* 1110 */ V(3, 1, 2),
+  /* 1111 */ V(3, 1, 2),
+
+  /* 0011 ... */
+  /* 000  */ V(0, 3, 3),	/* 64 */
+  /* 001  */ V(3, 0, 3),
+  /* 010  */ V(2, 2, 2),
+  /* 011  */ V(2, 2, 2),
+  /* 100  */ V(2, 1, 1),
+  /* 101  */ V(2, 1, 1),
+  /* 110  */ V(2, 1, 1),
+  /* 111  */ V(2, 1, 1),
+
+  /* 0101 ... */
+  /* 0    */ V(0, 2, 1),	/* 72 */
+  /* 1    */ V(2, 0, 1),
+
+  /* 0000 0000 ... */
+  /* 00   */ V(7, 7, 2),	/* 74 */
+  /* 01   */ V(6, 7, 2),
+  /* 10   */ V(7, 6, 2),
+  /* 11   */ V(7, 5, 2),
+
+  /* 0000 0001 ... */
+  /* 000  */ V(6, 6, 2),	/* 78 */
+  /* 001  */ V(6, 6, 2),
+  /* 010  */ V(4, 7, 2),
+  /* 011  */ V(4, 7, 2),
+  /* 100  */ V(7, 4, 2),
+  /* 101  */ V(7, 4, 2),
+  /* 110  */ V(5, 7, 3),
+  /* 111  */ V(5, 5, 3),
+
+  /* 0000 0010 ... */
+  /* 00   */ V(5, 6, 2),	/* 86 */
+  /* 01   */ V(6, 5, 2),
+  /* 10   */ V(3, 7, 1),
+  /* 11   */ V(3, 7, 1),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(7, 3, 1),	/* 90 */
+  /* 1    */ V(4, 6, 1),
+
+  /* 0000 0100 ... */
+  /* 00   */ V(4, 5, 2),	/* 92 */
+  /* 01   */ V(5, 4, 2),
+  /* 10   */ V(3, 5, 2),
+  /* 11   */ V(5, 3, 2),
+
+  /* 0000 0111 ... */
+  /* 0    */ V(6, 4, 1),	/* 96 */
+  /* 1    */ V(0, 7, 1),
+
+  /* 0000 1111 ... */
+  /* 0    */ V(4, 4, 1),	/* 98 */
+  /* 1    */ V(2, 5, 1),
+
+  /* 0001 0000 ... */
+  /* 0    */ V(5, 2, 1),	/* 100 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(4, 3, 1),	/* 102 */
+  /* 1    */ V(3, 3, 1)
+];
+
+var hufftab12 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 2),
+  /* 0100 */ PTR(68, 3),
+  /* 0101 */ PTR(76, 1),
+  /* 0110 */ V(1, 2, 4),
+  /* 0111 */ V(2, 1, 4),
+  /* 1000 */ PTR(78, 1),
+  /* 1001 */ V(0, 0, 4),
+  /* 1010 */ V(1, 1, 3),
+  /* 1011 */ V(1, 1, 3),
+  /* 1100 */ V(0, 1, 3),
+  /* 1101 */ V(0, 1, 3),
+  /* 1110 */ V(1, 0, 3),
+  /* 1111 */ V(1, 0, 3),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(80, 2),	/* 16 */
+  /* 0001 */ PTR(84, 1),
+  /* 0010 */ PTR(86, 1),
+  /* 0011 */ PTR(88, 1),
+  /* 0100 */ V(5, 6, 4),
+  /* 0101 */ V(3, 7, 4),
+  /* 0110 */ PTR(90, 1),
+  /* 0111 */ V(2, 7, 4),
+  /* 1000 */ V(7, 2, 4),
+  /* 1001 */ V(4, 6, 4),
+  /* 1010 */ V(6, 4, 4),
+  /* 1011 */ V(1, 7, 4),
+  /* 1100 */ V(7, 1, 4),
+  /* 1101 */ PTR(92, 1),
+  /* 1110 */ V(3, 6, 4),
+  /* 1111 */ V(6, 3, 4),
+
+  /* 0001 ... */
+  /* 0000 */ V(4, 5, 4),	/* 32 */
+  /* 0001 */ V(5, 4, 4),
+  /* 0010 */ V(4, 4, 4),
+  /* 0011 */ PTR(94, 1),
+  /* 0100 */ V(2, 6, 3),
+  /* 0101 */ V(2, 6, 3),
+  /* 0110 */ V(6, 2, 3),
+  /* 0111 */ V(6, 2, 3),
+  /* 1000 */ V(6, 1, 3),
+  /* 1001 */ V(6, 1, 3),
+  /* 1010 */ V(1, 6, 4),
+  /* 1011 */ V(6, 0, 4),
+  /* 1100 */ V(3, 5, 4),
+  /* 1101 */ V(5, 3, 4),
+  /* 1110 */ V(2, 5, 4),
+  /* 1111 */ V(5, 2, 4),
+
+  /* 0010 ... */
+  /* 0000 */ V(1, 5, 3),	/* 48 */
+  /* 0001 */ V(1, 5, 3),
+  /* 0010 */ V(5, 1, 3),
+  /* 0011 */ V(5, 1, 3),
+  /* 0100 */ V(3, 4, 3),
+  /* 0101 */ V(3, 4, 3),
+  /* 0110 */ V(4, 3, 3),
+  /* 0111 */ V(4, 3, 3),
+  /* 1000 */ V(5, 0, 4),
+  /* 1001 */ V(0, 4, 4),
+  /* 1010 */ V(2, 4, 3),
+  /* 1011 */ V(2, 4, 3),
+  /* 1100 */ V(4, 2, 3),
+  /* 1101 */ V(4, 2, 3),
+  /* 1110 */ V(1, 4, 3),
+  /* 1111 */ V(1, 4, 3),
+
+  /* 0011 ... */
+  /* 00   */ V(3, 3, 2),	/* 64 */
+  /* 01   */ V(4, 1, 2),
+  /* 10   */ V(2, 3, 2),
+  /* 11   */ V(3, 2, 2),
+
+  /* 0100 ... */
+  /* 000  */ V(4, 0, 3),	/* 68 */
+  /* 001  */ V(0, 3, 3),
+  /* 010  */ V(3, 0, 2),
+  /* 011  */ V(3, 0, 2),
+  /* 100  */ V(1, 3, 1),
+  /* 101  */ V(1, 3, 1),
+  /* 110  */ V(1, 3, 1),
+  /* 111  */ V(1, 3, 1),
+
+  /* 0101 ... */
+  /* 0    */ V(3, 1, 1),	/* 76 */
+  /* 1    */ V(2, 2, 1),
+
+  /* 1000 ... */
+  /* 0    */ V(0, 2, 1),	/* 78 */
+  /* 1    */ V(2, 0, 1),
+
+  /* 0000 0000 ... */
+  /* 00   */ V(7, 7, 2),	/* 80 */
+  /* 01   */ V(6, 7, 2),
+  /* 10   */ V(7, 6, 1),
+  /* 11   */ V(7, 6, 1),
+
+  /* 0000 0001 ... */
+  /* 0    */ V(5, 7, 1),	/* 84 */
+  /* 1    */ V(7, 5, 1),
+
+  /* 0000 0010 ... */
+  /* 0    */ V(6, 6, 1),	/* 86 */
+  /* 1    */ V(4, 7, 1),
+
+  /* 0000 0011 ... */
+  /* 0    */ V(7, 4, 1),	/* 88 */
+  /* 1    */ V(6, 5, 1),
+
+  /* 0000 0110 ... */
+  /* 0    */ V(7, 3, 1),	/* 90 */
+  /* 1    */ V(5, 5, 1),
+
+  /* 0000 1101 ... */
+  /* 0    */ V(0, 7, 1),	/* 92 */
+  /* 1    */ V(7, 0, 1),
+
+  /* 0001 0011 ... */
+  /* 0    */ V(0, 6, 1),	/* 94 */
+  /* 1    */ V(0, 5, 1)
+];
+
+var hufftab13 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 2),
+  /* 0100 */ V(1, 1, 4),
+  /* 0101 */ V(0, 1, 4),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(68, 4),	/* 16 */
+  /* 0001 */ PTR(84, 4),
+  /* 0010 */ PTR(100, 4),
+  /* 0011 */ PTR(116, 4),
+  /* 0100 */ PTR(132, 4),
+  /* 0101 */ PTR(148, 4),
+  /* 0110 */ PTR(164, 3),
+  /* 0111 */ PTR(172, 3),
+  /* 1000 */ PTR(180, 3),
+  /* 1001 */ PTR(188, 3),
+  /* 1010 */ PTR(196, 3),
+  /* 1011 */ PTR(204, 3),
+  /* 1100 */ PTR(212, 1),
+  /* 1101 */ PTR(214, 2),
+  /* 1110 */ PTR(218, 3),
+  /* 1111 */ PTR(226, 1),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(228, 2),	/* 32 */
+  /* 0001 */ PTR(232, 2),
+  /* 0010 */ PTR(236, 2),
+  /* 0011 */ PTR(240, 2),
+  /* 0100 */ V(8, 1, 4),
+  /* 0101 */ PTR(244, 1),
+  /* 0110 */ PTR(246, 1),
+  /* 0111 */ PTR(248, 1),
+  /* 1000 */ PTR(250, 2),
+  /* 1001 */ PTR(254, 1),
+  /* 1010 */ V(1, 5, 4),
+  /* 1011 */ V(5, 1, 4),
+  /* 1100 */ PTR(256, 1),
+  /* 1101 */ PTR(258, 1),
+  /* 1110 */ PTR(260, 1),
+  /* 1111 */ V(1, 4, 4),
+
+  /* 0010 ... */
+  /* 0000 */ V(4, 1, 3),	/* 48 */
+  /* 0001 */ V(4, 1, 3),
+  /* 0010 */ V(0, 4, 4),
+  /* 0011 */ V(4, 0, 4),
+  /* 0100 */ V(2, 3, 4),
+  /* 0101 */ V(3, 2, 4),
+  /* 0110 */ V(1, 3, 3),
+  /* 0111 */ V(1, 3, 3),
+  /* 1000 */ V(3, 1, 3),
+  /* 1001 */ V(3, 1, 3),
+  /* 1010 */ V(0, 3, 3),
+  /* 1011 */ V(0, 3, 3),
+  /* 1100 */ V(3, 0, 3),
+  /* 1101 */ V(3, 0, 3),
+  /* 1110 */ V(2, 2, 3),
+  /* 1111 */ V(2, 2, 3),
+
+  /* 0011 ... */
+  /* 00   */ V(1, 2, 2),	/* 64 */
+  /* 01   */ V(2, 1, 2),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 0000 */ PTR(262, 4),	/* 68 */
+  /* 0001 */ PTR(278, 4),
+  /* 0010 */ PTR(294, 4),
+  /* 0011 */ PTR(310, 3),
+  /* 0100 */ PTR(318, 2),
+  /* 0101 */ PTR(322, 2),
+  /* 0110 */ PTR(326, 3),
+  /* 0111 */ PTR(334, 2),
+  /* 1000 */ PTR(338, 1),
+  /* 1001 */ PTR(340, 2),
+  /* 1010 */ PTR(344, 2),
+  /* 1011 */ PTR(348, 2),
+  /* 1100 */ PTR(352, 2),
+  /* 1101 */ PTR(356, 2),
+  /* 1110 */ V(1, 15, 4),
+  /* 1111 */ V(15, 1, 4),
+
+  /* 0000 0001 ... */
+  /* 0000 */ V(15, 0, 4),	/* 84 */
+  /* 0001 */ PTR(360, 1),
+  /* 0010 */ PTR(362, 1),
+  /* 0011 */ PTR(364, 1),
+  /* 0100 */ V(14, 2, 4),
+  /* 0101 */ PTR(366, 1),
+  /* 0110 */ V(1, 14, 4),
+  /* 0111 */ V(14, 1, 4),
+  /* 1000 */ PTR(368, 1),
+  /* 1001 */ PTR(370, 1),
+  /* 1010 */ PTR(372, 1),
+  /* 1011 */ PTR(374, 1),
+  /* 1100 */ PTR(376, 1),
+  /* 1101 */ PTR(378, 1),
+  /* 1110 */ V(12, 6, 4),
+  /* 1111 */ V(3, 13, 4),
+
+  /* 0000 0010 ... */
+  /* 0000 */ PTR(380, 1),	/* 100 */
+  /* 0001 */ V(2, 13, 4),
+  /* 0010 */ V(13, 2, 4),
+  /* 0011 */ V(1, 13, 4),
+  /* 0100 */ V(11, 7, 4),
+  /* 0101 */ PTR(382, 1),
+  /* 0110 */ PTR(384, 1),
+  /* 0111 */ V(12, 3, 4),
+  /* 1000 */ PTR(386, 1),
+  /* 1001 */ V(4, 11, 4),
+  /* 1010 */ V(13, 1, 3),
+  /* 1011 */ V(13, 1, 3),
+  /* 1100 */ V(0, 13, 4),
+  /* 1101 */ V(13, 0, 4),
+  /* 1110 */ V(8, 10, 4),
+  /* 1111 */ V(10, 8, 4),
+
+  /* 0000 0011 ... */
+  /* 0000 */ V(4, 12, 4),	/* 116 */
+  /* 0001 */ V(12, 4, 4),
+  /* 0010 */ V(6, 11, 4),
+  /* 0011 */ V(11, 6, 4),
+  /* 0100 */ V(3, 12, 3),
+  /* 0101 */ V(3, 12, 3),
+  /* 0110 */ V(2, 12, 3),
+  /* 0111 */ V(2, 12, 3),
+  /* 1000 */ V(12, 2, 3),
+  /* 1001 */ V(12, 2, 3),
+  /* 1010 */ V(5, 11, 3),
+  /* 1011 */ V(5, 11, 3),
+  /* 1100 */ V(11, 5, 4),
+  /* 1101 */ V(8, 9, 4),
+  /* 1110 */ V(1, 12, 3),
+  /* 1111 */ V(1, 12, 3),
+
+  /* 0000 0100 ... */
+  /* 0000 */ V(12, 1, 3),	/* 132 */
+  /* 0001 */ V(12, 1, 3),
+  /* 0010 */ V(9, 8, 4),
+  /* 0011 */ V(0, 12, 4),
+  /* 0100 */ V(12, 0, 3),
+  /* 0101 */ V(12, 0, 3),
+  /* 0110 */ V(11, 4, 4),
+  /* 0111 */ V(6, 10, 4),
+  /* 1000 */ V(10, 6, 4),
+  /* 1001 */ V(7, 9, 4),
+  /* 1010 */ V(3, 11, 3),
+  /* 1011 */ V(3, 11, 3),
+  /* 1100 */ V(11, 3, 3),
+  /* 1101 */ V(11, 3, 3),
+  /* 1110 */ V(8, 8, 4),
+  /* 1111 */ V(5, 10, 4),
+
+  /* 0000 0101 ... */
+  /* 0000 */ V(2, 11, 3),	/* 148 */
+  /* 0001 */ V(2, 11, 3),
+  /* 0010 */ V(10, 5, 4),
+  /* 0011 */ V(6, 9, 4),
+  /* 0100 */ V(10, 4, 3),
+  /* 0101 */ V(10, 4, 3),
+  /* 0110 */ V(7, 8, 4),
+  /* 0111 */ V(8, 7, 4),
+  /* 1000 */ V(9, 4, 3),
+  /* 1001 */ V(9, 4, 3),
+  /* 1010 */ V(7, 7, 4),
+  /* 1011 */ V(7, 6, 4),
+  /* 1100 */ V(11, 2, 2),
+  /* 1101 */ V(11, 2, 2),
+  /* 1110 */ V(11, 2, 2),
+  /* 1111 */ V(11, 2, 2),
+
+  /* 0000 0110 ... */
+  /* 000  */ V(1, 11, 2),	/* 164 */
+  /* 001  */ V(1, 11, 2),
+  /* 010  */ V(11, 1, 2),
+  /* 011  */ V(11, 1, 2),
+  /* 100  */ V(0, 11, 3),
+  /* 101  */ V(11, 0, 3),
+  /* 110  */ V(9, 6, 3),
+  /* 111  */ V(4, 10, 3),
+
+  /* 0000 0111 ... */
+  /* 000  */ V(3, 10, 3),	/* 172 */
+  /* 001  */ V(10, 3, 3),
+  /* 010  */ V(5, 9, 3),
+  /* 011  */ V(9, 5, 3),
+  /* 100  */ V(2, 10, 2),
+  /* 101  */ V(2, 10, 2),
+  /* 110  */ V(10, 2, 2),
+  /* 111  */ V(10, 2, 2),
+
+  /* 0000 1000 ... */
+  /* 000  */ V(1, 10, 2),	/* 180 */
+  /* 001  */ V(1, 10, 2),
+  /* 010  */ V(10, 1, 2),
+  /* 011  */ V(10, 1, 2),
+  /* 100  */ V(0, 10, 3),
+  /* 101  */ V(6, 8, 3),
+  /* 110  */ V(10, 0, 2),
+  /* 111  */ V(10, 0, 2),
+
+  /* 0000 1001 ... */
+  /* 000  */ V(8, 6, 3),	/* 188 */
+  /* 001  */ V(4, 9, 3),
+  /* 010  */ V(9, 3, 2),
+  /* 011  */ V(9, 3, 2),
+  /* 100  */ V(3, 9, 3),
+  /* 101  */ V(5, 8, 3),
+  /* 110  */ V(8, 5, 3),
+  /* 111  */ V(6, 7, 3),
+
+  /* 0000 1010 ... */
+  /* 000  */ V(2, 9, 2),	/* 196 */
+  /* 001  */ V(2, 9, 2),
+  /* 010  */ V(9, 2, 2),
+  /* 011  */ V(9, 2, 2),
+  /* 100  */ V(5, 7, 3),
+  /* 101  */ V(7, 5, 3),
+  /* 110  */ V(3, 8, 2),
+  /* 111  */ V(3, 8, 2),
+
+  /* 0000 1011 ... */
+  /* 000  */ V(8, 3, 2),	/* 204 */
+  /* 001  */ V(8, 3, 2),
+  /* 010  */ V(6, 6, 3),
+  /* 011  */ V(4, 7, 3),
+  /* 100  */ V(7, 4, 3),
+  /* 101  */ V(5, 6, 3),
+  /* 110  */ V(6, 5, 3),
+  /* 111  */ V(7, 3, 3),
+
+  /* 0000 1100 ... */
+  /* 0    */ V(1, 9, 1),	/* 212 */
+  /* 1    */ V(9, 1, 1),
+
+  /* 0000 1101 ... */
+  /* 00   */ V(0, 9, 2),	/* 214 */
+  /* 01   */ V(9, 0, 2),
+  /* 10   */ V(4, 8, 2),
+  /* 11   */ V(8, 4, 2),
+
+  /* 0000 1110 ... */
+  /* 000  */ V(7, 2, 2),	/* 218 */
+  /* 001  */ V(7, 2, 2),
+  /* 010  */ V(4, 6, 3),
+  /* 011  */ V(6, 4, 3),
+  /* 100  */ V(2, 8, 1),
+  /* 101  */ V(2, 8, 1),
+  /* 110  */ V(2, 8, 1),
+  /* 111  */ V(2, 8, 1),
+
+  /* 0000 1111 ... */
+  /* 0    */ V(8, 2, 1),	/* 226 */
+  /* 1    */ V(1, 8, 1),
+
+  /* 0001 0000 ... */
+  /* 00   */ V(3, 7, 2),	/* 228 */
+  /* 01   */ V(2, 7, 2),
+  /* 10   */ V(1, 7, 1),
+  /* 11   */ V(1, 7, 1),
+
+  /* 0001 0001 ... */
+  /* 00   */ V(7, 1, 1),	/* 232 */
+  /* 01   */ V(7, 1, 1),
+  /* 10   */ V(5, 5, 2),
+  /* 11   */ V(0, 7, 2),
+
+  /* 0001 0010 ... */
+  /* 00   */ V(7, 0, 2),	/* 236 */
+  /* 01   */ V(3, 6, 2),
+  /* 10   */ V(6, 3, 2),
+  /* 11   */ V(4, 5, 2),
+
+  /* 0001 0011 ... */
+  /* 00   */ V(5, 4, 2),	/* 240 */
+  /* 01   */ V(2, 6, 2),
+  /* 10   */ V(6, 2, 2),
+  /* 11   */ V(3, 5, 2),
+
+  /* 0001 0101 ... */
+  /* 0    */ V(0, 8, 1),	/* 244 */
+  /* 1    */ V(8, 0, 1),
+
+  /* 0001 0110 ... */
+  /* 0    */ V(1, 6, 1),	/* 246 */
+  /* 1    */ V(6, 1, 1),
+
+  /* 0001 0111 ... */
+  /* 0    */ V(0, 6, 1),	/* 248 */
+  /* 1    */ V(6, 0, 1),
+
+  /* 0001 1000 ... */
+  /* 00   */ V(5, 3, 2),	/* 250 */
+  /* 01   */ V(4, 4, 2),
+  /* 10   */ V(2, 5, 1),
+  /* 11   */ V(2, 5, 1),
+
+  /* 0001 1001 ... */
+  /* 0    */ V(5, 2, 1),	/* 254 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0001 1100 ... */
+  /* 0    */ V(3, 4, 1),	/* 256 */
+  /* 1    */ V(4, 3, 1),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(5, 0, 1),	/* 258 */
+  /* 1    */ V(2, 4, 1),
+
+  /* 0001 1110 ... */
+  /* 0    */ V(4, 2, 1),	/* 260 */
+  /* 1    */ V(3, 3, 1),
+
+  /* 0000 0000 0000 ... */
+  /* 0000 */ PTR(388, 3),	/* 262 */
+  /* 0001 */ V(15, 15, 4),
+  /* 0010 */ V(14, 15, 4),
+  /* 0011 */ V(13, 15, 4),
+  /* 0100 */ V(14, 14, 4),
+  /* 0101 */ V(12, 15, 4),
+  /* 0110 */ V(13, 14, 4),
+  /* 0111 */ V(11, 15, 4),
+  /* 1000 */ V(15, 11, 4),
+  /* 1001 */ V(12, 14, 4),
+  /* 1010 */ V(13, 12, 4),
+  /* 1011 */ PTR(396, 1),
+  /* 1100 */ V(14, 12, 3),
+  /* 1101 */ V(14, 12, 3),
+  /* 1110 */ V(13, 13, 3),
+  /* 1111 */ V(13, 13, 3),
+
+  /* 0000 0000 0001 ... */
+  /* 0000 */ V(15, 10, 4),	/* 278 */
+  /* 0001 */ V(12, 13, 4),
+  /* 0010 */ V(11, 14, 3),
+  /* 0011 */ V(11, 14, 3),
+  /* 0100 */ V(14, 11, 3),
+  /* 0101 */ V(14, 11, 3),
+  /* 0110 */ V(9, 15, 3),
+  /* 0111 */ V(9, 15, 3),
+  /* 1000 */ V(15, 9, 3),
+  /* 1001 */ V(15, 9, 3),
+  /* 1010 */ V(14, 10, 3),
+  /* 1011 */ V(14, 10, 3),
+  /* 1100 */ V(11, 13, 3),
+  /* 1101 */ V(11, 13, 3),
+  /* 1110 */ V(13, 11, 3),
+  /* 1111 */ V(13, 11, 3),
+
+  /* 0000 0000 0010 ... */
+  /* 0000 */ V(8, 15, 3),	/* 294 */
+  /* 0001 */ V(8, 15, 3),
+  /* 0010 */ V(15, 8, 3),
+  /* 0011 */ V(15, 8, 3),
+  /* 0100 */ V(12, 12, 3),
+  /* 0101 */ V(12, 12, 3),
+  /* 0110 */ V(10, 14, 4),
+  /* 0111 */ V(9, 14, 4),
+  /* 1000 */ V(8, 14, 3),
+  /* 1001 */ V(8, 14, 3),
+  /* 1010 */ V(7, 15, 4),
+  /* 1011 */ V(7, 14, 4),
+  /* 1100 */ V(15, 7, 2),
+  /* 1101 */ V(15, 7, 2),
+  /* 1110 */ V(15, 7, 2),
+  /* 1111 */ V(15, 7, 2),
+
+  /* 0000 0000 0011 ... */
+  /* 000  */ V(13, 10, 2),	/* 310 */
+  /* 001  */ V(13, 10, 2),
+  /* 010  */ V(10, 13, 3),
+  /* 011  */ V(11, 12, 3),
+  /* 100  */ V(12, 11, 3),
+  /* 101  */ V(15, 6, 3),
+  /* 110  */ V(6, 15, 2),
+  /* 111  */ V(6, 15, 2),
+
+  /* 0000 0000 0100 ... */
+  /* 00   */ V(14, 8, 2),	/* 318 */
+  /* 01   */ V(5, 15, 2),
+  /* 10   */ V(9, 13, 2),
+  /* 11   */ V(13, 9, 2),
+
+  /* 0000 0000 0101 ... */
+  /* 00   */ V(15, 5, 2),	/* 322 */
+  /* 01   */ V(14, 7, 2),
+  /* 10   */ V(10, 12, 2),
+  /* 11   */ V(11, 11, 2),
+
+  /* 0000 0000 0110 ... */
+  /* 000  */ V(4, 15, 2),	/* 326 */
+  /* 001  */ V(4, 15, 2),
+  /* 010  */ V(15, 4, 2),
+  /* 011  */ V(15, 4, 2),
+  /* 100  */ V(12, 10, 3),
+  /* 101  */ V(14, 6, 3),
+  /* 110  */ V(15, 3, 2),
+  /* 111  */ V(15, 3, 2),
+
+  /* 0000 0000 0111 ... */
+  /* 00   */ V(3, 15, 1),	/* 334 */
+  /* 01   */ V(3, 15, 1),
+  /* 10   */ V(8, 13, 2),
+  /* 11   */ V(13, 8, 2),
+
+  /* 0000 0000 1000 ... */
+  /* 0    */ V(2, 15, 1),	/* 338 */
+  /* 1    */ V(15, 2, 1),
+
+  /* 0000 0000 1001 ... */
+  /* 00   */ V(6, 14, 2),	/* 340 */
+  /* 01   */ V(9, 12, 2),
+  /* 10   */ V(0, 15, 1),
+  /* 11   */ V(0, 15, 1),
+
+  /* 0000 0000 1010 ... */
+  /* 00   */ V(12, 9, 2),	/* 344 */
+  /* 01   */ V(5, 14, 2),
+  /* 10   */ V(10, 11, 1),
+  /* 11   */ V(10, 11, 1),
+
+  /* 0000 0000 1011 ... */
+  /* 00   */ V(7, 13, 2),	/* 348 */
+  /* 01   */ V(13, 7, 2),
+  /* 10   */ V(4, 14, 1),
+  /* 11   */ V(4, 14, 1),
+
+  /* 0000 0000 1100 ... */
+  /* 00   */ V(12, 8, 2),	/* 352 */
+  /* 01   */ V(13, 6, 2),
+  /* 10   */ V(3, 14, 1),
+  /* 11   */ V(3, 14, 1),
+
+  /* 0000 0000 1101 ... */
+  /* 00   */ V(11, 9, 1),	/* 356 */
+  /* 01   */ V(11, 9, 1),
+  /* 10   */ V(9, 11, 2),
+  /* 11   */ V(10, 10, 2),
+
+  /* 0000 0001 0001 ... */
+  /* 0    */ V(11, 10, 1),	/* 360 */
+  /* 1    */ V(14, 5, 1),
+
+  /* 0000 0001 0010 ... */
+  /* 0    */ V(14, 4, 1),	/* 362 */
+  /* 1    */ V(8, 12, 1),
+
+  /* 0000 0001 0011 ... */
+  /* 0    */ V(6, 13, 1),	/* 364 */
+  /* 1    */ V(14, 3, 1),
+
+  /* 0000 0001 0101 ... */
+  /* 0    */ V(2, 14, 1),	/* 366 */
+  /* 1    */ V(0, 14, 1),
+
+  /* 0000 0001 1000 ... */
+  /* 0    */ V(14, 0, 1),	/* 368 */
+  /* 1    */ V(5, 13, 1),
+
+  /* 0000 0001 1001 ... */
+  /* 0    */ V(13, 5, 1),	/* 370 */
+  /* 1    */ V(7, 12, 1),
+
+  /* 0000 0001 1010 ... */
+  /* 0    */ V(12, 7, 1),	/* 372 */
+  /* 1    */ V(4, 13, 1),
+
+  /* 0000 0001 1011 ... */
+  /* 0    */ V(8, 11, 1),	/* 374 */
+  /* 1    */ V(11, 8, 1),
+
+  /* 0000 0001 1100 ... */
+  /* 0    */ V(13, 4, 1),	/* 376 */
+  /* 1    */ V(9, 10, 1),
+
+  /* 0000 0001 1101 ... */
+  /* 0    */ V(10, 9, 1),	/* 378 */
+  /* 1    */ V(6, 12, 1),
+
+  /* 0000 0010 0000 ... */
+  /* 0    */ V(13, 3, 1),	/* 380 */
+  /* 1    */ V(7, 11, 1),
+
+  /* 0000 0010 0101 ... */
+  /* 0    */ V(5, 12, 1),	/* 382 */
+  /* 1    */ V(12, 5, 1),
+
+  /* 0000 0010 0110 ... */
+  /* 0    */ V(9, 9, 1),	/* 384 */
+  /* 1    */ V(7, 10, 1),
+
+  /* 0000 0010 1000 ... */
+  /* 0    */ V(10, 7, 1),	/* 386 */
+  /* 1    */ V(9, 7, 1),
+
+  /* 0000 0000 0000 0000 ... */
+  /* 000  */ V(15, 14, 3),	/* 388 */
+  /* 001  */ V(15, 12, 3),
+  /* 010  */ V(15, 13, 2),
+  /* 011  */ V(15, 13, 2),
+  /* 100  */ V(14, 13, 1),
+  /* 101  */ V(14, 13, 1),
+  /* 110  */ V(14, 13, 1),
+  /* 111  */ V(14, 13, 1),
+
+  /* 0000 0000 0000 1011 ... */
+  /* 0    */ V(10, 15, 1),	/* 396 */
+  /* 1    */ V(14, 9, 1)
+];
+
+var hufftab15 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 4),
+  /* 0100 */ PTR(80, 4),
+  /* 0101 */ PTR(96, 3),
+  /* 0110 */ PTR(104, 3),
+  /* 0111 */ PTR(112, 2),
+  /* 1000 */ PTR(116, 1),
+  /* 1001 */ PTR(118, 1),
+  /* 1010 */ V(1, 1, 3),
+  /* 1011 */ V(1, 1, 3),
+  /* 1100 */ V(0, 1, 4),
+  /* 1101 */ V(1, 0, 4),
+  /* 1110 */ V(0, 0, 3),
+  /* 1111 */ V(0, 0, 3),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(120, 4),	/* 16 */
+  /* 0001 */ PTR(136, 4),
+  /* 0010 */ PTR(152, 4),
+  /* 0011 */ PTR(168, 4),
+  /* 0100 */ PTR(184, 4),
+  /* 0101 */ PTR(200, 3),
+  /* 0110 */ PTR(208, 3),
+  /* 0111 */ PTR(216, 4),
+  /* 1000 */ PTR(232, 3),
+  /* 1001 */ PTR(240, 3),
+  /* 1010 */ PTR(248, 3),
+  /* 1011 */ PTR(256, 3),
+  /* 1100 */ PTR(264, 2),
+  /* 1101 */ PTR(268, 3),
+  /* 1110 */ PTR(276, 3),
+  /* 1111 */ PTR(284, 2),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(288, 2),	/* 32 */
+  /* 0001 */ PTR(292, 2),
+  /* 0010 */ PTR(296, 2),
+  /* 0011 */ PTR(300, 2),
+  /* 0100 */ PTR(304, 2),
+  /* 0101 */ PTR(308, 2),
+  /* 0110 */ PTR(312, 2),
+  /* 0111 */ PTR(316, 2),
+  /* 1000 */ PTR(320, 1),
+  /* 1001 */ PTR(322, 1),
+  /* 1010 */ PTR(324, 1),
+  /* 1011 */ PTR(326, 2),
+  /* 1100 */ PTR(330, 1),
+  /* 1101 */ PTR(332, 1),
+  /* 1110 */ PTR(334, 2),
+  /* 1111 */ PTR(338, 1),
+
+  /* 0010 ... */
+  /* 0000 */ PTR(340, 1),	/* 48 */
+  /* 0001 */ PTR(342, 1),
+  /* 0010 */ V(9, 1, 4),
+  /* 0011 */ PTR(344, 1),
+  /* 0100 */ PTR(346, 1),
+  /* 0101 */ PTR(348, 1),
+  /* 0110 */ PTR(350, 1),
+  /* 0111 */ PTR(352, 1),
+  /* 1000 */ V(2, 8, 4),
+  /* 1001 */ V(8, 2, 4),
+  /* 1010 */ V(1, 8, 4),
+  /* 1011 */ V(8, 1, 4),
+  /* 1100 */ PTR(354, 1),
+  /* 1101 */ PTR(356, 1),
+  /* 1110 */ PTR(358, 1),
+  /* 1111 */ PTR(360, 1),
+
+  /* 0011 ... */
+  /* 0000 */ V(2, 7, 4),	/* 64 */
+  /* 0001 */ V(7, 2, 4),
+  /* 0010 */ V(6, 4, 4),
+  /* 0011 */ V(1, 7, 4),
+  /* 0100 */ V(5, 5, 4),
+  /* 0101 */ V(7, 1, 4),
+  /* 0110 */ PTR(362, 1),
+  /* 0111 */ V(3, 6, 4),
+  /* 1000 */ V(6, 3, 4),
+  /* 1001 */ V(4, 5, 4),
+  /* 1010 */ V(5, 4, 4),
+  /* 1011 */ V(2, 6, 4),
+  /* 1100 */ V(6, 2, 4),
+  /* 1101 */ V(1, 6, 4),
+  /* 1110 */ PTR(364, 1),
+  /* 1111 */ V(3, 5, 4),
+
+  /* 0100 ... */
+  /* 0000 */ V(6, 1, 3),	/* 80 */
+  /* 0001 */ V(6, 1, 3),
+  /* 0010 */ V(5, 3, 4),
+  /* 0011 */ V(4, 4, 4),
+  /* 0100 */ V(2, 5, 3),
+  /* 0101 */ V(2, 5, 3),
+  /* 0110 */ V(5, 2, 3),
+  /* 0111 */ V(5, 2, 3),
+  /* 1000 */ V(1, 5, 3),
+  /* 1001 */ V(1, 5, 3),
+  /* 1010 */ V(5, 1, 3),
+  /* 1011 */ V(5, 1, 3),
+  /* 1100 */ V(0, 5, 4),
+  /* 1101 */ V(5, 0, 4),
+  /* 1110 */ V(3, 4, 3),
+  /* 1111 */ V(3, 4, 3),
+
+  /* 0101 ... */
+  /* 000  */ V(4, 3, 3),	/* 96 */
+  /* 001  */ V(2, 4, 3),
+  /* 010  */ V(4, 2, 3),
+  /* 011  */ V(3, 3, 3),
+  /* 100  */ V(4, 1, 2),
+  /* 101  */ V(4, 1, 2),
+  /* 110  */ V(1, 4, 3),
+  /* 111  */ V(0, 4, 3),
+
+  /* 0110 ... */
+  /* 000  */ V(2, 3, 2),	/* 104 */
+  /* 001  */ V(2, 3, 2),
+  /* 010  */ V(3, 2, 2),
+  /* 011  */ V(3, 2, 2),
+  /* 100  */ V(4, 0, 3),
+  /* 101  */ V(0, 3, 3),
+  /* 110  */ V(1, 3, 2),
+  /* 111  */ V(1, 3, 2),
+
+  /* 0111 ... */
+  /* 00   */ V(3, 1, 2),	/* 112 */
+  /* 01   */ V(3, 0, 2),
+  /* 10   */ V(2, 2, 1),
+  /* 11   */ V(2, 2, 1),
+
+  /* 1000 ... */
+  /* 0    */ V(1, 2, 1),	/* 116 */
+  /* 1    */ V(2, 1, 1),
+
+  /* 1001 ... */
+  /* 0    */ V(0, 2, 1),	/* 118 */
+  /* 1    */ V(2, 0, 1),
+
+  /* 0000 0000 ... */
+  /* 0000 */ PTR(366, 1),	/* 120 */
+  /* 0001 */ PTR(368, 1),
+  /* 0010 */ V(14, 14, 4),
+  /* 0011 */ PTR(370, 1),
+  /* 0100 */ PTR(372, 1),
+  /* 0101 */ PTR(374, 1),
+  /* 0110 */ V(15, 11, 4),
+  /* 0111 */ PTR(376, 1),
+  /* 1000 */ V(13, 13, 4),
+  /* 1001 */ V(10, 15, 4),
+  /* 1010 */ V(15, 10, 4),
+  /* 1011 */ V(11, 14, 4),
+  /* 1100 */ V(14, 11, 4),
+  /* 1101 */ V(12, 13, 4),
+  /* 1110 */ V(13, 12, 4),
+  /* 1111 */ V(9, 15, 4),
+
+  /* 0000 0001 ... */
+  /* 0000 */ V(15, 9, 4),	/* 136 */
+  /* 0001 */ V(14, 10, 4),
+  /* 0010 */ V(11, 13, 4),
+  /* 0011 */ V(13, 11, 4),
+  /* 0100 */ V(8, 15, 4),
+  /* 0101 */ V(15, 8, 4),
+  /* 0110 */ V(12, 12, 4),
+  /* 0111 */ V(9, 14, 4),
+  /* 1000 */ V(14, 9, 4),
+  /* 1001 */ V(7, 15, 4),
+  /* 1010 */ V(15, 7, 4),
+  /* 1011 */ V(10, 13, 4),
+  /* 1100 */ V(13, 10, 4),
+  /* 1101 */ V(11, 12, 4),
+  /* 1110 */ V(6, 15, 4),
+  /* 1111 */ PTR(378, 1),
+
+  /* 0000 0010 ... */
+  /* 0000 */ V(12, 11, 3),	/* 152 */
+  /* 0001 */ V(12, 11, 3),
+  /* 0010 */ V(15, 6, 3),
+  /* 0011 */ V(15, 6, 3),
+  /* 0100 */ V(8, 14, 4),
+  /* 0101 */ V(14, 8, 4),
+  /* 0110 */ V(5, 15, 4),
+  /* 0111 */ V(9, 13, 4),
+  /* 1000 */ V(15, 5, 3),
+  /* 1001 */ V(15, 5, 3),
+  /* 1010 */ V(7, 14, 3),
+  /* 1011 */ V(7, 14, 3),
+  /* 1100 */ V(14, 7, 3),
+  /* 1101 */ V(14, 7, 3),
+  /* 1110 */ V(10, 12, 3),
+  /* 1111 */ V(10, 12, 3),
+
+  /* 0000 0011 ... */
+  /* 0000 */ V(12, 10, 3),	/* 168 */
+  /* 0001 */ V(12, 10, 3),
+  /* 0010 */ V(11, 11, 3),
+  /* 0011 */ V(11, 11, 3),
+  /* 0100 */ V(13, 9, 4),
+  /* 0101 */ V(8, 13, 4),
+  /* 0110 */ V(4, 15, 3),
+  /* 0111 */ V(4, 15, 3),
+  /* 1000 */ V(15, 4, 3),
+  /* 1001 */ V(15, 4, 3),
+  /* 1010 */ V(3, 15, 3),
+  /* 1011 */ V(3, 15, 3),
+  /* 1100 */ V(15, 3, 3),
+  /* 1101 */ V(15, 3, 3),
+  /* 1110 */ V(13, 8, 3),
+  /* 1111 */ V(13, 8, 3),
+
+  /* 0000 0100 ... */
+  /* 0000 */ V(14, 6, 3),	/* 184 */
+  /* 0001 */ V(14, 6, 3),
+  /* 0010 */ V(2, 15, 3),
+  /* 0011 */ V(2, 15, 3),
+  /* 0100 */ V(15, 2, 3),
+  /* 0101 */ V(15, 2, 3),
+  /* 0110 */ V(6, 14, 4),
+  /* 0111 */ V(15, 0, 4),
+  /* 1000 */ V(1, 15, 3),
+  /* 1001 */ V(1, 15, 3),
+  /* 1010 */ V(15, 1, 3),
+  /* 1011 */ V(15, 1, 3),
+  /* 1100 */ V(9, 12, 3),
+  /* 1101 */ V(9, 12, 3),
+  /* 1110 */ V(12, 9, 3),
+  /* 1111 */ V(12, 9, 3),
+
+  /* 0000 0101 ... */
+  /* 000  */ V(5, 14, 3),	/* 200 */
+  /* 001  */ V(10, 11, 3),
+  /* 010  */ V(11, 10, 3),
+  /* 011  */ V(14, 5, 3),
+  /* 100  */ V(7, 13, 3),
+  /* 101  */ V(13, 7, 3),
+  /* 110  */ V(4, 14, 3),
+  /* 111  */ V(14, 4, 3),
+
+  /* 0000 0110 ... */
+  /* 000  */ V(8, 12, 3),	/* 208 */
+  /* 001  */ V(12, 8, 3),
+  /* 010  */ V(3, 14, 3),
+  /* 011  */ V(6, 13, 3),
+  /* 100  */ V(13, 6, 3),
+  /* 101  */ V(14, 3, 3),
+  /* 110  */ V(9, 11, 3),
+  /* 111  */ V(11, 9, 3),
+
+  /* 0000 0111 ... */
+  /* 0000 */ V(2, 14, 3),	/* 216 */
+  /* 0001 */ V(2, 14, 3),
+  /* 0010 */ V(10, 10, 3),
+  /* 0011 */ V(10, 10, 3),
+  /* 0100 */ V(14, 2, 3),
+  /* 0101 */ V(14, 2, 3),
+  /* 0110 */ V(1, 14, 3),
+  /* 0111 */ V(1, 14, 3),
+  /* 1000 */ V(14, 1, 3),
+  /* 1001 */ V(14, 1, 3),
+  /* 1010 */ V(0, 14, 4),
+  /* 1011 */ V(14, 0, 4),
+  /* 1100 */ V(5, 13, 3),
+  /* 1101 */ V(5, 13, 3),
+  /* 1110 */ V(13, 5, 3),
+  /* 1111 */ V(13, 5, 3),
+
+  /* 0000 1000 ... */
+  /* 000  */ V(7, 12, 3),	/* 232 */
+  /* 001  */ V(12, 7, 3),
+  /* 010  */ V(4, 13, 3),
+  /* 011  */ V(8, 11, 3),
+  /* 100  */ V(13, 4, 2),
+  /* 101  */ V(13, 4, 2),
+  /* 110  */ V(11, 8, 3),
+  /* 111  */ V(9, 10, 3),
+
+  /* 0000 1001 ... */
+  /* 000  */ V(10, 9, 3),	/* 240 */
+  /* 001  */ V(6, 12, 3),
+  /* 010  */ V(12, 6, 3),
+  /* 011  */ V(3, 13, 3),
+  /* 100  */ V(13, 3, 2),
+  /* 101  */ V(13, 3, 2),
+  /* 110  */ V(13, 2, 2),
+  /* 111  */ V(13, 2, 2),
+
+  /* 0000 1010 ... */
+  /* 000  */ V(2, 13, 3),	/* 248 */
+  /* 001  */ V(0, 13, 3),
+  /* 010  */ V(1, 13, 2),
+  /* 011  */ V(1, 13, 2),
+  /* 100  */ V(7, 11, 2),
+  /* 101  */ V(7, 11, 2),
+  /* 110  */ V(11, 7, 2),
+  /* 111  */ V(11, 7, 2),
+
+  /* 0000 1011 ... */
+  /* 000  */ V(13, 1, 2),	/* 256 */
+  /* 001  */ V(13, 1, 2),
+  /* 010  */ V(5, 12, 3),
+  /* 011  */ V(13, 0, 3),
+  /* 100  */ V(12, 5, 2),
+  /* 101  */ V(12, 5, 2),
+  /* 110  */ V(8, 10, 2),
+  /* 111  */ V(8, 10, 2),
+
+  /* 0000 1100 ... */
+  /* 00   */ V(10, 8, 2),	/* 264 */
+  /* 01   */ V(4, 12, 2),
+  /* 10   */ V(12, 4, 2),
+  /* 11   */ V(6, 11, 2),
+
+  /* 0000 1101 ... */
+  /* 000  */ V(11, 6, 2),	/* 268 */
+  /* 001  */ V(11, 6, 2),
+  /* 010  */ V(9, 9, 3),
+  /* 011  */ V(0, 12, 3),
+  /* 100  */ V(3, 12, 2),
+  /* 101  */ V(3, 12, 2),
+  /* 110  */ V(12, 3, 2),
+  /* 111  */ V(12, 3, 2),
+
+  /* 0000 1110 ... */
+  /* 000  */ V(7, 10, 2),	/* 276 */
+  /* 001  */ V(7, 10, 2),
+  /* 010  */ V(10, 7, 2),
+  /* 011  */ V(10, 7, 2),
+  /* 100  */ V(10, 6, 2),
+  /* 101  */ V(10, 6, 2),
+  /* 110  */ V(12, 0, 3),
+  /* 111  */ V(0, 11, 3),
+
+  /* 0000 1111 ... */
+  /* 00   */ V(12, 2, 1),	/* 284 */
+  /* 01   */ V(12, 2, 1),
+  /* 10   */ V(2, 12, 2),
+  /* 11   */ V(5, 11, 2),
+
+  /* 0001 0000 ... */
+  /* 00   */ V(11, 5, 2),	/* 288 */
+  /* 01   */ V(1, 12, 2),
+  /* 10   */ V(8, 9, 2),
+  /* 11   */ V(9, 8, 2),
+
+  /* 0001 0001 ... */
+  /* 00   */ V(12, 1, 2),	/* 292 */
+  /* 01   */ V(4, 11, 2),
+  /* 10   */ V(11, 4, 2),
+  /* 11   */ V(6, 10, 2),
+
+  /* 0001 0010 ... */
+  /* 00   */ V(3, 11, 2),	/* 296 */
+  /* 01   */ V(7, 9, 2),
+  /* 10   */ V(11, 3, 1),
+  /* 11   */ V(11, 3, 1),
+
+  /* 0001 0011 ... */
+  /* 00   */ V(9, 7, 2),	/* 300 */
+  /* 01   */ V(8, 8, 2),
+  /* 10   */ V(2, 11, 2),
+  /* 11   */ V(5, 10, 2),
+
+  /* 0001 0100 ... */
+  /* 00   */ V(11, 2, 1),	/* 304 */
+  /* 01   */ V(11, 2, 1),
+  /* 10   */ V(10, 5, 2),
+  /* 11   */ V(1, 11, 2),
+
+  /* 0001 0101 ... */
+  /* 00   */ V(11, 1, 1),	/* 308 */
+  /* 01   */ V(11, 1, 1),
+  /* 10   */ V(11, 0, 2),
+  /* 11   */ V(6, 9, 2),
+
+  /* 0001 0110 ... */
+  /* 00   */ V(9, 6, 2),	/* 312 */
+  /* 01   */ V(4, 10, 2),
+  /* 10   */ V(10, 4, 2),
+  /* 11   */ V(7, 8, 2),
+
+  /* 0001 0111 ... */
+  /* 00   */ V(8, 7, 2),	/* 316 */
+  /* 01   */ V(3, 10, 2),
+  /* 10   */ V(10, 3, 1),
+  /* 11   */ V(10, 3, 1),
+
+  /* 0001 1000 ... */
+  /* 0    */ V(5, 9, 1),	/* 320 */
+  /* 1    */ V(9, 5, 1),
+
+  /* 0001 1001 ... */
+  /* 0    */ V(2, 10, 1),	/* 322 */
+  /* 1    */ V(10, 2, 1),
+
+  /* 0001 1010 ... */
+  /* 0    */ V(1, 10, 1),	/* 324 */
+  /* 1    */ V(10, 1, 1),
+
+  /* 0001 1011 ... */
+  /* 00   */ V(0, 10, 2),	/* 326 */
+  /* 01   */ V(10, 0, 2),
+  /* 10   */ V(6, 8, 1),
+  /* 11   */ V(6, 8, 1),
+
+  /* 0001 1100 ... */
+  /* 0    */ V(8, 6, 1),	/* 330 */
+  /* 1    */ V(4, 9, 1),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(9, 4, 1),	/* 332 */
+  /* 1    */ V(3, 9, 1),
+
+  /* 0001 1110 ... */
+  /* 00   */ V(9, 3, 1),	/* 334 */
+  /* 01   */ V(9, 3, 1),
+  /* 10   */ V(7, 7, 2),
+  /* 11   */ V(0, 9, 2),
+
+  /* 0001 1111 ... */
+  /* 0    */ V(5, 8, 1),	/* 338 */
+  /* 1    */ V(8, 5, 1),
+
+  /* 0010 0000 ... */
+  /* 0    */ V(2, 9, 1),	/* 340 */
+  /* 1    */ V(6, 7, 1),
+
+  /* 0010 0001 ... */
+  /* 0    */ V(7, 6, 1),	/* 342 */
+  /* 1    */ V(9, 2, 1),
+
+  /* 0010 0011 ... */
+  /* 0    */ V(1, 9, 1),	/* 344 */
+  /* 1    */ V(9, 0, 1),
+
+  /* 0010 0100 ... */
+  /* 0    */ V(4, 8, 1),	/* 346 */
+  /* 1    */ V(8, 4, 1),
+
+  /* 0010 0101 ... */
+  /* 0    */ V(5, 7, 1),	/* 348 */
+  /* 1    */ V(7, 5, 1),
+
+  /* 0010 0110 ... */
+  /* 0    */ V(3, 8, 1),	/* 350 */
+  /* 1    */ V(8, 3, 1),
+
+  /* 0010 0111 ... */
+  /* 0    */ V(6, 6, 1),	/* 352 */
+  /* 1    */ V(4, 7, 1),
+
+  /* 0010 1100 ... */
+  /* 0    */ V(7, 4, 1),	/* 354 */
+  /* 1    */ V(0, 8, 1),
+
+  /* 0010 1101 ... */
+  /* 0    */ V(8, 0, 1),	/* 356 */
+  /* 1    */ V(5, 6, 1),
+
+  /* 0010 1110 ... */
+  /* 0    */ V(6, 5, 1),	/* 358 */
+  /* 1    */ V(3, 7, 1),
+
+  /* 0010 1111 ... */
+  /* 0    */ V(7, 3, 1),	/* 360 */
+  /* 1    */ V(4, 6, 1),
+
+  /* 0011 0110 ... */
+  /* 0    */ V(0, 7, 1),	/* 362 */
+  /* 1    */ V(7, 0, 1),
+
+  /* 0011 1110 ... */
+  /* 0    */ V(0, 6, 1),	/* 364 */
+  /* 1    */ V(6, 0, 1),
+
+  /* 0000 0000 0000 ... */
+  /* 0    */ V(15, 15, 1),	/* 366 */
+  /* 1    */ V(14, 15, 1),
+
+  /* 0000 0000 0001 ... */
+  /* 0    */ V(15, 14, 1),	/* 368 */
+  /* 1    */ V(13, 15, 1),
+
+  /* 0000 0000 0011 ... */
+  /* 0    */ V(15, 13, 1),	/* 370 */
+  /* 1    */ V(12, 15, 1),
+
+  /* 0000 0000 0100 ... */
+  /* 0    */ V(15, 12, 1),	/* 372 */
+  /* 1    */ V(13, 14, 1),
+
+  /* 0000 0000 0101 ... */
+  /* 0    */ V(14, 13, 1),	/* 374 */
+  /* 1    */ V(11, 15, 1),
+
+  /* 0000 0000 0111 ... */
+  /* 0    */ V(12, 14, 1),	/* 376 */
+  /* 1    */ V(14, 12, 1),
+
+  /* 0000 0001 1111 ... */
+  /* 0    */ V(10, 14, 1),	/* 378 */
+  /* 1    */ V(0, 15, 1)
+];
+
+var hufftab16 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ PTR(64, 2),
+  /* 0100 */ V(1, 1, 4),
+  /* 0101 */ V(0, 1, 4),
+  /* 0110 */ V(1, 0, 3),
+  /* 0111 */ V(1, 0, 3),
+  /* 1000 */ V(0, 0, 1),
+  /* 1001 */ V(0, 0, 1),
+  /* 1010 */ V(0, 0, 1),
+  /* 1011 */ V(0, 0, 1),
+  /* 1100 */ V(0, 0, 1),
+  /* 1101 */ V(0, 0, 1),
+  /* 1110 */ V(0, 0, 1),
+  /* 1111 */ V(0, 0, 1),
+
+  /* 0000 ... */
+  /* 0000 */ PTR(68, 3),	/* 16 */
+  /* 0001 */ PTR(76, 3),
+  /* 0010 */ PTR(84, 2),
+  /* 0011 */ V(15, 15, 4),
+  /* 0100 */ PTR(88, 2),
+  /* 0101 */ PTR(92, 1),
+  /* 0110 */ PTR(94, 4),
+  /* 0111 */ V(15, 2, 4),
+  /* 1000 */ PTR(110, 1),
+  /* 1001 */ V(1, 15, 4),
+  /* 1010 */ V(15, 1, 4),
+  /* 1011 */ PTR(112, 4),
+  /* 1100 */ PTR(128, 4),
+  /* 1101 */ PTR(144, 4),
+  /* 1110 */ PTR(160, 4),
+  /* 1111 */ PTR(176, 4),
+
+  /* 0001 ... */
+  /* 0000 */ PTR(192, 4),	/* 32 */
+  /* 0001 */ PTR(208, 3),
+  /* 0010 */ PTR(216, 3),
+  /* 0011 */ PTR(224, 3),
+  /* 0100 */ PTR(232, 3),
+  /* 0101 */ PTR(240, 3),
+  /* 0110 */ PTR(248, 3),
+  /* 0111 */ PTR(256, 3),
+  /* 1000 */ PTR(264, 2),
+  /* 1001 */ PTR(268, 2),
+  /* 1010 */ PTR(272, 1),
+  /* 1011 */ PTR(274, 2),
+  /* 1100 */ PTR(278, 2),
+  /* 1101 */ PTR(282, 1),
+  /* 1110 */ V(5, 1, 4),
+  /* 1111 */ PTR(284, 1),
+
+  /* 0010 ... */
+  /* 0000 */ PTR(286, 1),	/* 48 */
+  /* 0001 */ PTR(288, 1),
+  /* 0010 */ PTR(290, 1),
+  /* 0011 */ V(1, 4, 4),
+  /* 0100 */ V(4, 1, 4),
+  /* 0101 */ PTR(292, 1),
+  /* 0110 */ V(2, 3, 4),
+  /* 0111 */ V(3, 2, 4),
+  /* 1000 */ V(1, 3, 3),
+  /* 1001 */ V(1, 3, 3),
+  /* 1010 */ V(3, 1, 3),
+  /* 1011 */ V(3, 1, 3),
+  /* 1100 */ V(0, 3, 4),
+  /* 1101 */ V(3, 0, 4),
+  /* 1110 */ V(2, 2, 3),
+  /* 1111 */ V(2, 2, 3),
+
+  /* 0011 ... */
+  /* 00   */ V(1, 2, 2),	/* 64 */
+  /* 01   */ V(2, 1, 2),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0000 0000 ... */
+  /* 000  */ V(14, 15, 3),	/* 68 */
+  /* 001  */ V(15, 14, 3),
+  /* 010  */ V(13, 15, 3),
+  /* 011  */ V(15, 13, 3),
+  /* 100  */ V(12, 15, 3),
+  /* 101  */ V(15, 12, 3),
+  /* 110  */ V(11, 15, 3),
+  /* 111  */ V(15, 11, 3),
+
+  /* 0000 0001 ... */
+  /* 000  */ V(10, 15, 2),	/* 76 */
+  /* 001  */ V(10, 15, 2),
+  /* 010  */ V(15, 10, 3),
+  /* 011  */ V(9, 15, 3),
+  /* 100  */ V(15, 9, 3),
+  /* 101  */ V(15, 8, 3),
+  /* 110  */ V(8, 15, 2),
+  /* 111  */ V(8, 15, 2),
+
+  /* 0000 0010 ... */
+  /* 00   */ V(7, 15, 2),	/* 84 */
+  /* 01   */ V(15, 7, 2),
+  /* 10   */ V(6, 15, 2),
+  /* 11   */ V(15, 6, 2),
+
+  /* 0000 0100 ... */
+  /* 00   */ V(5, 15, 2),	/* 88 */
+  /* 01   */ V(15, 5, 2),
+  /* 10   */ V(4, 15, 1),
+  /* 11   */ V(4, 15, 1),
+
+  /* 0000 0101 ... */
+  /* 0    */ V(15, 4, 1),	/* 92 */
+  /* 1    */ V(15, 3, 1),
+
+  /* 0000 0110 ... */
+  /* 0000 */ V(15, 0, 1),	/* 94 */
+  /* 0001 */ V(15, 0, 1),
+  /* 0010 */ V(15, 0, 1),
+  /* 0011 */ V(15, 0, 1),
+  /* 0100 */ V(15, 0, 1),
+  /* 0101 */ V(15, 0, 1),
+  /* 0110 */ V(15, 0, 1),
+  /* 0111 */ V(15, 0, 1),
+  /* 1000 */ V(3, 15, 2),
+  /* 1001 */ V(3, 15, 2),
+  /* 1010 */ V(3, 15, 2),
+  /* 1011 */ V(3, 15, 2),
+  /* 1100 */ PTR(294, 4),
+  /* 1101 */ PTR(310, 3),
+  /* 1110 */ PTR(318, 3),
+  /* 1111 */ PTR(326, 3),
+
+  /* 0000 1000 ... */
+  /* 0    */ V(2, 15, 1),	/* 110 */
+  /* 1    */ V(0, 15, 1),
+
+  /* 0000 1011 ... */
+  /* 0000 */ PTR(334, 2),	/* 112 */
+  /* 0001 */ PTR(338, 2),
+  /* 0010 */ PTR(342, 2),
+  /* 0011 */ PTR(346, 1),
+  /* 0100 */ PTR(348, 2),
+  /* 0101 */ PTR(352, 2),
+  /* 0110 */ PTR(356, 1),
+  /* 0111 */ PTR(358, 2),
+  /* 1000 */ PTR(362, 2),
+  /* 1001 */ PTR(366, 2),
+  /* 1010 */ PTR(370, 2),
+  /* 1011 */ V(14, 3, 4),
+  /* 1100 */ PTR(374, 1),
+  /* 1101 */ PTR(376, 1),
+  /* 1110 */ PTR(378, 1),
+  /* 1111 */ PTR(380, 1),
+
+  /* 0000 1100 ... */
+  /* 0000 */ PTR(382, 1),	/* 128 */
+  /* 0001 */ PTR(384, 1),
+  /* 0010 */ PTR(386, 1),
+  /* 0011 */ V(0, 13, 4),
+  /* 0100 */ PTR(388, 1),
+  /* 0101 */ PTR(390, 1),
+  /* 0110 */ PTR(392, 1),
+  /* 0111 */ V(3, 12, 4),
+  /* 1000 */ PTR(394, 1),
+  /* 1001 */ V(1, 12, 4),
+  /* 1010 */ V(12, 0, 4),
+  /* 1011 */ PTR(396, 1),
+  /* 1100 */ V(14, 2, 3),
+  /* 1101 */ V(14, 2, 3),
+  /* 1110 */ V(2, 14, 4),
+  /* 1111 */ V(1, 14, 4),
+
+  /* 0000 1101 ... */
+  /* 0000 */ V(13, 3, 4),	/* 144 */
+  /* 0001 */ V(2, 13, 4),
+  /* 0010 */ V(13, 2, 4),
+  /* 0011 */ V(13, 1, 4),
+  /* 0100 */ V(3, 11, 4),
+  /* 0101 */ PTR(398, 1),
+  /* 0110 */ V(1, 13, 3),
+  /* 0111 */ V(1, 13, 3),
+  /* 1000 */ V(12, 4, 4),
+  /* 1001 */ V(6, 11, 4),
+  /* 1010 */ V(12, 3, 4),
+  /* 1011 */ V(10, 7, 4),
+  /* 1100 */ V(2, 12, 3),
+  /* 1101 */ V(2, 12, 3),
+  /* 1110 */ V(12, 2, 4),
+  /* 1111 */ V(11, 5, 4),
+
+  /* 0000 1110 ... */
+  /* 0000 */ V(12, 1, 4),	/* 160 */
+  /* 0001 */ V(0, 12, 4),
+  /* 0010 */ V(4, 11, 4),
+  /* 0011 */ V(11, 4, 4),
+  /* 0100 */ V(6, 10, 4),
+  /* 0101 */ V(10, 6, 4),
+  /* 0110 */ V(11, 3, 3),
+  /* 0111 */ V(11, 3, 3),
+  /* 1000 */ V(5, 10, 4),
+  /* 1001 */ V(10, 5, 4),
+  /* 1010 */ V(2, 11, 3),
+  /* 1011 */ V(2, 11, 3),
+  /* 1100 */ V(11, 2, 3),
+  /* 1101 */ V(11, 2, 3),
+  /* 1110 */ V(1, 11, 3),
+  /* 1111 */ V(1, 11, 3),
+
+  /* 0000 1111 ... */
+  /* 0000 */ V(11, 1, 3),	/* 176 */
+  /* 0001 */ V(11, 1, 3),
+  /* 0010 */ V(0, 11, 4),
+  /* 0011 */ V(11, 0, 4),
+  /* 0100 */ V(6, 9, 4),
+  /* 0101 */ V(9, 6, 4),
+  /* 0110 */ V(4, 10, 4),
+  /* 0111 */ V(10, 4, 4),
+  /* 1000 */ V(7, 8, 4),
+  /* 1001 */ V(8, 7, 4),
+  /* 1010 */ V(10, 3, 3),
+  /* 1011 */ V(10, 3, 3),
+  /* 1100 */ V(3, 10, 4),
+  /* 1101 */ V(5, 9, 4),
+  /* 1110 */ V(2, 10, 3),
+  /* 1111 */ V(2, 10, 3),
+
+  /* 0001 0000 ... */
+  /* 0000 */ V(9, 5, 4),	/* 192 */
+  /* 0001 */ V(6, 8, 4),
+  /* 0010 */ V(10, 1, 3),
+  /* 0011 */ V(10, 1, 3),
+  /* 0100 */ V(8, 6, 4),
+  /* 0101 */ V(7, 7, 4),
+  /* 0110 */ V(9, 4, 3),
+  /* 0111 */ V(9, 4, 3),
+  /* 1000 */ V(4, 9, 4),
+  /* 1001 */ V(5, 7, 4),
+  /* 1010 */ V(6, 7, 3),
+  /* 1011 */ V(6, 7, 3),
+  /* 1100 */ V(10, 2, 2),
+  /* 1101 */ V(10, 2, 2),
+  /* 1110 */ V(10, 2, 2),
+  /* 1111 */ V(10, 2, 2),
+
+  /* 0001 0001 ... */
+  /* 000  */ V(1, 10, 2),	/* 208 */
+  /* 001  */ V(1, 10, 2),
+  /* 010  */ V(0, 10, 3),
+  /* 011  */ V(10, 0, 3),
+  /* 100  */ V(3, 9, 3),
+  /* 101  */ V(9, 3, 3),
+  /* 110  */ V(5, 8, 3),
+  /* 111  */ V(8, 5, 3),
+
+  /* 0001 0010 ... */
+  /* 000  */ V(2, 9, 2),	/* 216 */
+  /* 001  */ V(2, 9, 2),
+  /* 010  */ V(9, 2, 2),
+  /* 011  */ V(9, 2, 2),
+  /* 100  */ V(7, 6, 3),
+  /* 101  */ V(0, 9, 3),
+  /* 110  */ V(1, 9, 2),
+  /* 111  */ V(1, 9, 2),
+
+  /* 0001 0011 ... */
+  /* 000  */ V(9, 1, 2),	/* 224 */
+  /* 001  */ V(9, 1, 2),
+  /* 010  */ V(9, 0, 3),
+  /* 011  */ V(4, 8, 3),
+  /* 100  */ V(8, 4, 3),
+  /* 101  */ V(7, 5, 3),
+  /* 110  */ V(3, 8, 3),
+  /* 111  */ V(8, 3, 3),
+
+  /* 0001 0100 ... */
+  /* 000  */ V(6, 6, 3),	/* 232 */
+  /* 001  */ V(2, 8, 3),
+  /* 010  */ V(8, 2, 2),
+  /* 011  */ V(8, 2, 2),
+  /* 100  */ V(4, 7, 3),
+  /* 101  */ V(7, 4, 3),
+  /* 110  */ V(1, 8, 2),
+  /* 111  */ V(1, 8, 2),
+
+  /* 0001 0101 ... */
+  /* 000  */ V(8, 1, 2),	/* 240 */
+  /* 001  */ V(8, 1, 2),
+  /* 010  */ V(8, 0, 2),
+  /* 011  */ V(8, 0, 2),
+  /* 100  */ V(0, 8, 3),
+  /* 101  */ V(5, 6, 3),
+  /* 110  */ V(3, 7, 2),
+  /* 111  */ V(3, 7, 2),
+
+  /* 0001 0110 ... */
+  /* 000  */ V(7, 3, 2),	/* 248 */
+  /* 001  */ V(7, 3, 2),
+  /* 010  */ V(6, 5, 3),
+  /* 011  */ V(4, 6, 3),
+  /* 100  */ V(2, 7, 2),
+  /* 101  */ V(2, 7, 2),
+  /* 110  */ V(7, 2, 2),
+  /* 111  */ V(7, 2, 2),
+
+  /* 0001 0111 ... */
+  /* 000  */ V(6, 4, 3),	/* 256 */
+  /* 001  */ V(5, 5, 3),
+  /* 010  */ V(0, 7, 2),
+  /* 011  */ V(0, 7, 2),
+  /* 100  */ V(1, 7, 1),
+  /* 101  */ V(1, 7, 1),
+  /* 110  */ V(1, 7, 1),
+  /* 111  */ V(1, 7, 1),
+
+  /* 0001 1000 ... */
+  /* 00   */ V(7, 1, 1),	/* 264  */
+  /* 01   */ V(7, 1, 1),
+  /* 10   */ V(7, 0, 2),
+  /* 11   */ V(3, 6, 2),
+
+  /* 0001 1001 ... */
+  /* 00   */ V(6, 3, 2),	/* 268 */
+  /* 01   */ V(4, 5, 2),
+  /* 10   */ V(5, 4, 2),
+  /* 11   */ V(2, 6, 2),
+
+  /* 0001 1010 ... */
+  /* 0    */ V(6, 2, 1),	/* 272 */
+  /* 1    */ V(1, 6, 1),
+
+  /* 0001 1011 ... */
+  /* 00   */ V(6, 1, 1),	/* 274 */
+  /* 01   */ V(6, 1, 1),
+  /* 10   */ V(0, 6, 2),
+  /* 11   */ V(6, 0, 2),
+
+  /* 0001 1100 ... */
+  /* 00   */ V(5, 3, 1),	/* 278 */
+  /* 01   */ V(5, 3, 1),
+  /* 10   */ V(3, 5, 2),
+  /* 11   */ V(4, 4, 2),
+
+  /* 0001 1101 ... */
+  /* 0    */ V(2, 5, 1),	/* 282 */
+  /* 1    */ V(5, 2, 1),
+
+  /* 0001 1111 ... */
+  /* 0    */ V(1, 5, 1),	/* 284 */
+  /* 1    */ V(0, 5, 1),
+
+  /* 0010 0000 ... */
+  /* 0    */ V(3, 4, 1),	/* 286 */
+  /* 1    */ V(4, 3, 1),
+
+  /* 0010 0001 ... */
+  /* 0    */ V(5, 0, 1),	/* 288 */
+  /* 1    */ V(2, 4, 1),
+
+  /* 0010 0010 ... */
+  /* 0    */ V(4, 2, 1),	/* 290 */
+  /* 1    */ V(3, 3, 1),
+
+  /* 0010 0101 ... */
+  /* 0    */ V(0, 4, 1),	/* 292 */
+  /* 1    */ V(4, 0, 1),
+
+  /* 0000 0110 1100 ... */
+  /* 0000 */ V(12, 14, 4),	/* 294 */
+  /* 0001 */ PTR(400, 1),
+  /* 0010 */ V(13, 14, 3),
+  /* 0011 */ V(13, 14, 3),
+  /* 0100 */ V(14, 9, 3),
+  /* 0101 */ V(14, 9, 3),
+  /* 0110 */ V(14, 10, 4),
+  /* 0111 */ V(13, 9, 4),
+  /* 1000 */ V(14, 14, 2),
+  /* 1001 */ V(14, 14, 2),
+  /* 1010 */ V(14, 14, 2),
+  /* 1011 */ V(14, 14, 2),
+  /* 1100 */ V(14, 13, 3),
+  /* 1101 */ V(14, 13, 3),
+  /* 1110 */ V(14, 11, 3),
+  /* 1111 */ V(14, 11, 3),
+
+  /* 0000 0110 1101 ... */
+  /* 000  */ V(11, 14, 2),	/* 310 */
+  /* 001  */ V(11, 14, 2),
+  /* 010  */ V(12, 13, 2),
+  /* 011  */ V(12, 13, 2),
+  /* 100  */ V(13, 12, 3),
+  /* 101  */ V(13, 11, 3),
+  /* 110  */ V(10, 14, 2),
+  /* 111  */ V(10, 14, 2),
+
+  /* 0000 0110 1110 ... */
+  /* 000  */ V(12, 12, 2),	/* 318 */
+  /* 001  */ V(12, 12, 2),
+  /* 010  */ V(10, 13, 3),
+  /* 011  */ V(13, 10, 3),
+  /* 100  */ V(7, 14, 3),
+  /* 101  */ V(10, 12, 3),
+  /* 110  */ V(12, 10, 2),
+  /* 111  */ V(12, 10, 2),
+
+  /* 0000 0110 1111 ... */
+  /* 000  */ V(12, 9, 3),	/* 326 */
+  /* 001  */ V(7, 13, 3),
+  /* 010  */ V(5, 14, 2),
+  /* 011  */ V(5, 14, 2),
+  /* 100  */ V(11, 13, 1),
+  /* 101  */ V(11, 13, 1),
+  /* 110  */ V(11, 13, 1),
+  /* 111  */ V(11, 13, 1),
+
+  /* 0000 1011 0000 ... */
+  /* 00   */ V(9, 14, 1),	/* 334 */
+  /* 01   */ V(9, 14, 1),
+  /* 10   */ V(11, 12, 2),
+  /* 11   */ V(12, 11, 2),
+
+  /* 0000 1011 0001 ... */
+  /* 00   */ V(8, 14, 2),	/* 338 */
+  /* 01   */ V(14, 8, 2),
+  /* 10   */ V(9, 13, 2),
+  /* 11   */ V(14, 7, 2),
+
+  /* 0000 1011 0010 ... */
+  /* 00   */ V(11, 11, 2),	/* 342 */
+  /* 01   */ V(8, 13, 2),
+  /* 10   */ V(13, 8, 2),
+  /* 11   */ V(6, 14, 2),
+
+  /* 0000 1011 0011 ... */
+  /* 0    */ V(14, 6, 1),	/* 346 */
+  /* 1    */ V(9, 12, 1),
+
+  /* 0000 1011 0100 ... */
+  /* 00   */ V(10, 11, 2),	/* 348 */
+  /* 01   */ V(11, 10, 2),
+  /* 10   */ V(14, 5, 2),
+  /* 11   */ V(13, 7, 2),
+
+  /* 0000 1011 0101 ... */
+  /* 00   */ V(4, 14, 1),	/* 352 */
+  /* 01   */ V(4, 14, 1),
+  /* 10   */ V(14, 4, 2),
+  /* 11   */ V(8, 12, 2),
+
+  /* 0000 1011 0110 ... */
+  /* 0    */ V(12, 8, 1),	/* 356 */
+  /* 1    */ V(3, 14, 1),
+
+  /* 0000 1011 0111 ... */
+  /* 00   */ V(6, 13, 1),	/* 358 */
+  /* 01   */ V(6, 13, 1),
+  /* 10   */ V(13, 6, 2),
+  /* 11   */ V(9, 11, 2),
+
+  /* 0000 1011 1000 ... */
+  /* 00   */ V(11, 9, 2),	/* 362 */
+  /* 01   */ V(10, 10, 2),
+  /* 10   */ V(14, 1, 1),
+  /* 11   */ V(14, 1, 1),
+
+  /* 0000 1011 1001 ... */
+  /* 00   */ V(13, 4, 1),	/* 366 */
+  /* 01   */ V(13, 4, 1),
+  /* 10   */ V(11, 8, 2),
+  /* 11   */ V(10, 9, 2),
+
+  /* 0000 1011 1010 ... */
+  /* 00   */ V(7, 11, 1),	/* 370 */
+  /* 01   */ V(7, 11, 1),
+  /* 10   */ V(11, 7, 2),
+  /* 11   */ V(13, 0, 2),
+
+  /* 0000 1011 1100 ... */
+  /* 0    */ V(0, 14, 1),	/* 374 */
+  /* 1    */ V(14, 0, 1),
+
+  /* 0000 1011 1101 ... */
+  /* 0    */ V(5, 13, 1),	/* 376 */
+  /* 1    */ V(13, 5, 1),
+
+  /* 0000 1011 1110 ... */
+  /* 0    */ V(7, 12, 1),	/* 378 */
+  /* 1    */ V(12, 7, 1),
+
+  /* 0000 1011 1111 ... */
+  /* 0    */ V(4, 13, 1),	/* 380 */
+  /* 1    */ V(8, 11, 1),
+
+  /* 0000 1100 0000 ... */
+  /* 0    */ V(9, 10, 1),	/* 382 */
+  /* 1    */ V(6, 12, 1),
+
+  /* 0000 1100 0001 ... */
+  /* 0    */ V(12, 6, 1),	/* 384 */
+  /* 1    */ V(3, 13, 1),
+
+  /* 0000 1100 0010 ... */
+  /* 0    */ V(5, 12, 1),	/* 386 */
+  /* 1    */ V(12, 5, 1),
+
+  /* 0000 1100 0100 ... */
+  /* 0    */ V(8, 10, 1),	/* 388 */
+  /* 1    */ V(10, 8, 1),
+
+  /* 0000 1100 0101 ... */
+  /* 0    */ V(9, 9, 1),	/* 390 */
+  /* 1    */ V(4, 12, 1),
+
+  /* 0000 1100 0110 ... */
+  /* 0    */ V(11, 6, 1),	/* 392 */
+  /* 1    */ V(7, 10, 1),
+
+  /* 0000 1100 1000 ... */
+  /* 0    */ V(5, 11, 1),	/* 394 */
+  /* 1    */ V(8, 9, 1),
+
+  /* 0000 1100 1011 ... */
+  /* 0    */ V(9, 8, 1),	/* 396 */
+  /* 1    */ V(7, 9, 1),
+
+  /* 0000 1101 0101 ... */
+  /* 0    */ V(9, 7, 1),	/* 398 */
+  /* 1    */ V(8, 8, 1),
+
+  /* 0000 0110 1100 0001 ... */
+  /* 0    */ V(14, 12, 1),	/* 400 */
+  /* 1    */ V(13, 13, 1)
+];
+
+var hufftab24 = [
+  /* 0000 */ PTR(16, 4),
+  /* 0001 */ PTR(32, 4),
+  /* 0010 */ PTR(48, 4),
+  /* 0011 */ V(15, 15, 4),
+  /* 0100 */ PTR(64, 4),
+  /* 0101 */ PTR(80, 4),
+  /* 0110 */ PTR(96, 4),
+  /* 0111 */ PTR(112, 4),
+  /* 1000 */ PTR(128, 4),
+  /* 1001 */ PTR(144, 4),
+  /* 1010 */ PTR(160, 3),
+  /* 1011 */ PTR(168, 2),
+  /* 1100 */ V(1, 1, 4),
+  /* 1101 */ V(0, 1, 4),
+  /* 1110 */ V(1, 0, 4),
+  /* 1111 */ V(0, 0, 4),
+
+  /* 0000 ... */
+  /* 0000 */ V(14, 15, 4),	/* 16 */
+  /* 0001 */ V(15, 14, 4),
+  /* 0010 */ V(13, 15, 4),
+  /* 0011 */ V(15, 13, 4),
+  /* 0100 */ V(12, 15, 4),
+  /* 0101 */ V(15, 12, 4),
+  /* 0110 */ V(11, 15, 4),
+  /* 0111 */ V(15, 11, 4),
+  /* 1000 */ V(15, 10, 3),
+  /* 1001 */ V(15, 10, 3),
+  /* 1010 */ V(10, 15, 4),
+  /* 1011 */ V(9, 15, 4),
+  /* 1100 */ V(15, 9, 3),
+  /* 1101 */ V(15, 9, 3),
+  /* 1110 */ V(15, 8, 3),
+  /* 1111 */ V(15, 8, 3),
+
+  /* 0001 ... */
+  /* 0000 */ V(8, 15, 4),	/* 32 */
+  /* 0001 */ V(7, 15, 4),
+  /* 0010 */ V(15, 7, 3),
+  /* 0011 */ V(15, 7, 3),
+  /* 0100 */ V(6, 15, 3),
+  /* 0101 */ V(6, 15, 3),
+  /* 0110 */ V(15, 6, 3),
+  /* 0111 */ V(15, 6, 3),
+  /* 1000 */ V(5, 15, 3),
+  /* 1001 */ V(5, 15, 3),
+  /* 1010 */ V(15, 5, 3),
+  /* 1011 */ V(15, 5, 3),
+  /* 1100 */ V(4, 15, 3),
+  /* 1101 */ V(4, 15, 3),
+  /* 1110 */ V(15, 4, 3),
+  /* 1111 */ V(15, 4, 3),
+
+  /* 0010 ... */
+  /* 0000 */ V(3, 15, 3),	/* 48 */
+  /* 0001 */ V(3, 15, 3),
+  /* 0010 */ V(15, 3, 3),
+  /* 0011 */ V(15, 3, 3),
+  /* 0100 */ V(2, 15, 3),
+  /* 0101 */ V(2, 15, 3),
+  /* 0110 */ V(15, 2, 3),
+  /* 0111 */ V(15, 2, 3),
+  /* 1000 */ V(15, 1, 3),
+  /* 1001 */ V(15, 1, 3),
+  /* 1010 */ V(1, 15, 4),
+  /* 1011 */ V(15, 0, 4),
+  /* 1100 */ PTR(172, 3),
+  /* 1101 */ PTR(180, 3),
+  /* 1110 */ PTR(188, 3),
+  /* 1111 */ PTR(196, 3),
+
+  /* 0100 ... */
+  /* 0000 */ PTR(204, 4),	/* 64 */
+  /* 0001 */ PTR(220, 3),
+  /* 0010 */ PTR(228, 3),
+  /* 0011 */ PTR(236, 3),
+  /* 0100 */ PTR(244, 2),
+  /* 0101 */ PTR(248, 2),
+  /* 0110 */ PTR(252, 2),
+  /* 0111 */ PTR(256, 2),
+  /* 1000 */ PTR(260, 2),
+  /* 1001 */ PTR(264, 2),
+  /* 1010 */ PTR(268, 2),
+  /* 1011 */ PTR(272, 2),
+  /* 1100 */ PTR(276, 2),
+  /* 1101 */ PTR(280, 3),
+  /* 1110 */ PTR(288, 2),
+  /* 1111 */ PTR(292, 2),
+
+  /* 0101 ... */
+  /* 0000 */ PTR(296, 2),	/* 80 */
+  /* 0001 */ PTR(300, 3),
+  /* 0010 */ PTR(308, 2),
+  /* 0011 */ PTR(312, 3),
+  /* 0100 */ PTR(320, 1),
+  /* 0101 */ PTR(322, 2),
+  /* 0110 */ PTR(326, 2),
+  /* 0111 */ PTR(330, 1),
+  /* 1000 */ PTR(332, 2),
+  /* 1001 */ PTR(336, 1),
+  /* 1010 */ PTR(338, 1),
+  /* 1011 */ PTR(340, 1),
+  /* 1100 */ PTR(342, 1),
+  /* 1101 */ PTR(344, 1),
+  /* 1110 */ PTR(346, 1),
+  /* 1111 */ PTR(348, 1),
+
+  /* 0110 ... */
+  /* 0000 */ PTR(350, 1),	/* 96 */
+  /* 0001 */ PTR(352, 1),
+  /* 0010 */ PTR(354, 1),
+  /* 0011 */ PTR(356, 1),
+  /* 0100 */ PTR(358, 1),
+  /* 0101 */ PTR(360, 1),
+  /* 0110 */ PTR(362, 1),
+  /* 0111 */ PTR(364, 1),
+  /* 1000 */ PTR(366, 1),
+  /* 1001 */ PTR(368, 1),
+  /* 1010 */ PTR(370, 2),
+  /* 1011 */ PTR(374, 1),
+  /* 1100 */ PTR(376, 2),
+  /* 1101 */ V(7, 3, 4),
+  /* 1110 */ PTR(380, 1),
+  /* 1111 */ V(7, 2, 4),
+
+  /* 0111 ... */
+  /* 0000 */ V(4, 6, 4),	/* 112 */
+  /* 0001 */ V(6, 4, 4),
+  /* 0010 */ V(5, 5, 4),
+  /* 0011 */ V(7, 1, 4),
+  /* 0100 */ V(3, 6, 4),
+  /* 0101 */ V(6, 3, 4),
+  /* 0110 */ V(4, 5, 4),
+  /* 0111 */ V(5, 4, 4),
+  /* 1000 */ V(2, 6, 4),
+  /* 1001 */ V(6, 2, 4),
+  /* 1010 */ V(1, 6, 4),
+  /* 1011 */ V(6, 1, 4),
+  /* 1100 */ PTR(382, 1),
+  /* 1101 */ V(3, 5, 4),
+  /* 1110 */ V(5, 3, 4),
+  /* 1111 */ V(4, 4, 4),
+
+  /* 1000 ... */
+  /* 0000 */ V(2, 5, 4),	/* 128 */
+  /* 0001 */ V(5, 2, 4),
+  /* 0010 */ V(1, 5, 4),
+  /* 0011 */ PTR(384, 1),
+  /* 0100 */ V(5, 1, 3),
+  /* 0101 */ V(5, 1, 3),
+  /* 0110 */ V(3, 4, 4),
+  /* 0111 */ V(4, 3, 4),
+  /* 1000 */ V(2, 4, 3),
+  /* 1001 */ V(2, 4, 3),
+  /* 1010 */ V(4, 2, 3),
+  /* 1011 */ V(4, 2, 3),
+  /* 1100 */ V(3, 3, 3),
+  /* 1101 */ V(3, 3, 3),
+  /* 1110 */ V(1, 4, 3),
+  /* 1111 */ V(1, 4, 3),
+
+  /* 1001 ... */
+  /* 0000 */ V(4, 1, 3),	/* 144 */
+  /* 0001 */ V(4, 1, 3),
+  /* 0010 */ V(0, 4, 4),
+  /* 0011 */ V(4, 0, 4),
+  /* 0100 */ V(2, 3, 3),
+  /* 0101 */ V(2, 3, 3),
+  /* 0110 */ V(3, 2, 3),
+  /* 0111 */ V(3, 2, 3),
+  /* 1000 */ V(1, 3, 2),
+  /* 1001 */ V(1, 3, 2),
+  /* 1010 */ V(1, 3, 2),
+  /* 1011 */ V(1, 3, 2),
+  /* 1100 */ V(3, 1, 2),
+  /* 1101 */ V(3, 1, 2),
+  /* 1110 */ V(3, 1, 2),
+  /* 1111 */ V(3, 1, 2),
+
+  /* 1010 ... */
+  /* 000  */ V(0, 3, 3),	/* 160 */
+  /* 001  */ V(3, 0, 3),
+  /* 010  */ V(2, 2, 2),
+  /* 011  */ V(2, 2, 2),
+  /* 100  */ V(1, 2, 1),
+  /* 101  */ V(1, 2, 1),
+  /* 110  */ V(1, 2, 1),
+  /* 111  */ V(1, 2, 1),
+
+  /* 1011 ... */
+  /* 00   */ V(2, 1, 1),	/* 168 */
+  /* 01   */ V(2, 1, 1),
+  /* 10   */ V(0, 2, 2),
+  /* 11   */ V(2, 0, 2),
+
+  /* 0010 1100 ... */
+  /* 000  */ V(0, 15, 1),	/* 172 */
+  /* 001  */ V(0, 15, 1),
+  /* 010  */ V(0, 15, 1),
+  /* 011  */ V(0, 15, 1),
+  /* 100  */ V(14, 14, 3),
+  /* 101  */ V(13, 14, 3),
+  /* 110  */ V(14, 13, 3),
+  /* 111  */ V(12, 14, 3),
+
+  /* 0010 1101 ... */
+  /* 000  */ V(14, 12, 3),	/* 180 */
+  /* 001  */ V(13, 13, 3),
+  /* 010  */ V(11, 14, 3),
+  /* 011  */ V(14, 11, 3),
+  /* 100  */ V(12, 13, 3),
+  /* 101  */ V(13, 12, 3),
+  /* 110  */ V(10, 14, 3),
+  /* 111  */ V(14, 10, 3),
+
+  /* 0010 1110 ... */
+  /* 000  */ V(11, 13, 3),	/* 188 */
+  /* 001  */ V(13, 11, 3),
+  /* 010  */ V(12, 12, 3),
+  /* 011  */ V(9, 14, 3),
+  /* 100  */ V(14, 9, 3),
+  /* 101  */ V(10, 13, 3),
+  /* 110  */ V(13, 10, 3),
+  /* 111  */ V(11, 12, 3),
+
+  /* 0010 1111 ... */
+  /* 000  */ V(12, 11, 3),	/* 196 */
+  /* 001  */ V(8, 14, 3),
+  /* 010  */ V(14, 8, 3),
+  /* 011  */ V(9, 13, 3),
+  /* 100  */ V(13, 9, 3),
+  /* 101  */ V(7, 14, 3),
+  /* 110  */ V(14, 7, 3),
+  /* 111  */ V(10, 12, 3),
+
+  /* 0100 0000 ... */
+  /* 0000 */ V(12, 10, 3),	/* 204 */
+  /* 0001 */ V(12, 10, 3),
+  /* 0010 */ V(11, 11, 3),
+  /* 0011 */ V(11, 11, 3),
+  /* 0100 */ V(8, 13, 3),
+  /* 0101 */ V(8, 13, 3),
+  /* 0110 */ V(13, 8, 3),
+  /* 0111 */ V(13, 8, 3),
+  /* 1000 */ V(0, 14, 4),
+  /* 1001 */ V(14, 0, 4),
+  /* 1010 */ V(0, 13, 3),
+  /* 1011 */ V(0, 13, 3),
+  /* 1100 */ V(14, 6, 2),
+  /* 1101 */ V(14, 6, 2),
+  /* 1110 */ V(14, 6, 2),
+  /* 1111 */ V(14, 6, 2),
+
+  /* 0100 0001 ... */
+  /* 000  */ V(6, 14, 3),	/* 220 */
+  /* 001  */ V(9, 12, 3),
+  /* 010  */ V(12, 9, 2),
+  /* 011  */ V(12, 9, 2),
+  /* 100  */ V(5, 14, 2),
+  /* 101  */ V(5, 14, 2),
+  /* 110  */ V(11, 10, 2),
+  /* 111  */ V(11, 10, 2),
+
+  /* 0100 0010 ... */
+  /* 000  */ V(14, 5, 2),	/* 228 */
+  /* 001  */ V(14, 5, 2),
+  /* 010  */ V(10, 11, 3),
+  /* 011  */ V(7, 13, 3),
+  /* 100  */ V(13, 7, 2),
+  /* 101  */ V(13, 7, 2),
+  /* 110  */ V(14, 4, 2),
+  /* 111  */ V(14, 4, 2),
+
+  /* 0100 0011 ... */
+  /* 000  */ V(8, 12, 2),	/* 236 */
+  /* 001  */ V(8, 12, 2),
+  /* 010  */ V(12, 8, 2),
+  /* 011  */ V(12, 8, 2),
+  /* 100  */ V(4, 14, 3),
+  /* 101  */ V(2, 14, 3),
+  /* 110  */ V(3, 14, 2),
+  /* 111  */ V(3, 14, 2),
+
+  /* 0100 0100 ... */
+  /* 00   */ V(6, 13, 2),	/* 244 */
+  /* 01   */ V(13, 6, 2),
+  /* 10   */ V(14, 3, 2),
+  /* 11   */ V(9, 11, 2),
+
+  /* 0100 0101 ... */
+  /* 00   */ V(11, 9, 2),	/* 248 */
+  /* 01   */ V(10, 10, 2),
+  /* 10   */ V(14, 2, 2),
+  /* 11   */ V(1, 14, 2),
+
+  /* 0100 0110 ... */
+  /* 00   */ V(14, 1, 2),	/* 252 */
+  /* 01   */ V(5, 13, 2),
+  /* 10   */ V(13, 5, 2),
+  /* 11   */ V(7, 12, 2),
+
+  /* 0100 0111 ... */
+  /* 00   */ V(12, 7, 2),	/* 256 */
+  /* 01   */ V(4, 13, 2),
+  /* 10   */ V(8, 11, 2),
+  /* 11   */ V(11, 8, 2),
+
+  /* 0100 1000 ... */
+  /* 00   */ V(13, 4, 2),	/* 260 */
+  /* 01   */ V(9, 10, 2),
+  /* 10   */ V(10, 9, 2),
+  /* 11   */ V(6, 12, 2),
+
+  /* 0100 1001 ... */
+  /* 00   */ V(12, 6, 2),	/* 264 */
+  /* 01   */ V(3, 13, 2),
+  /* 10   */ V(13, 3, 2),
+  /* 11   */ V(2, 13, 2),
+
+  /* 0100 1010 ... */
+  /* 00   */ V(13, 2, 2),	/* 268 */
+  /* 01   */ V(1, 13, 2),
+  /* 10   */ V(7, 11, 2),
+  /* 11   */ V(11, 7, 2),
+
+  /* 0100 1011 ... */
+  /* 00   */ V(13, 1, 2),	/* 272 */
+  /* 01   */ V(5, 12, 2),
+  /* 10   */ V(12, 5, 2),
+  /* 11   */ V(8, 10, 2),
+
+  /* 0100 1100 ... */
+  /* 00   */ V(10, 8, 2),	/* 276 */
+  /* 01   */ V(9, 9, 2),
+  /* 10   */ V(4, 12, 2),
+  /* 11   */ V(12, 4, 2),
+
+  /* 0100 1101 ... */
+  /* 000  */ V(6, 11, 2),	/* 280 */
+  /* 001  */ V(6, 11, 2),
+  /* 010  */ V(11, 6, 2),
+  /* 011  */ V(11, 6, 2),
+  /* 100  */ V(13, 0, 3),
+  /* 101  */ V(0, 12, 3),
+  /* 110  */ V(3, 12, 2),
+  /* 111  */ V(3, 12, 2),
+
+  /* 0100 1110 ... */
+  /* 00   */ V(12, 3, 2),	/* 288 */
+  /* 01   */ V(7, 10, 2),
+  /* 10   */ V(10, 7, 2),
+  /* 11   */ V(2, 12, 2),
+
+  /* 0100 1111 ... */
+  /* 00   */ V(12, 2, 2),	/* 292 */
+  /* 01   */ V(5, 11, 2),
+  /* 10   */ V(11, 5, 2),
+  /* 11   */ V(1, 12, 2),
+
+  /* 0101 0000 ... */
+  /* 00   */ V(8, 9, 2),	/* 296 */
+  /* 01   */ V(9, 8, 2),
+  /* 10   */ V(12, 1, 2),
+  /* 11   */ V(4, 11, 2),
+
+  /* 0101 0001 ... */
+  /* 000  */ V(12, 0, 3),	/* 300 */
+  /* 001  */ V(0, 11, 3),
+  /* 010  */ V(3, 11, 2),
+  /* 011  */ V(3, 11, 2),
+  /* 100  */ V(11, 0, 3),
+  /* 101  */ V(0, 10, 3),
+  /* 110  */ V(1, 10, 2),
+  /* 111  */ V(1, 10, 2),
+
+  /* 0101 0010 ... */
+  /* 00   */ V(11, 4, 1),	/* 308 */
+  /* 01   */ V(11, 4, 1),
+  /* 10   */ V(6, 10, 2),
+  /* 11   */ V(10, 6, 2),
+
+  /* 0101 0011 ... */
+  /* 000  */ V(7, 9, 2),	/* 312 */
+  /* 001  */ V(7, 9, 2),
+  /* 010  */ V(9, 7, 2),
+  /* 011  */ V(9, 7, 2),
+  /* 100  */ V(10, 0, 3),
+  /* 101  */ V(0, 9, 3),
+  /* 110  */ V(9, 0, 2),
+  /* 111  */ V(9, 0, 2),
+
+  /* 0101 0100 ... */
+  /* 0    */ V(11, 3, 1),	/* 320 */
+  /* 1    */ V(8, 8, 1),
+
+  /* 0101 0101 ... */
+  /* 00   */ V(2, 11, 2),	/* 322 */
+  /* 01   */ V(5, 10, 2),
+  /* 10   */ V(11, 2, 1),
+  /* 11   */ V(11, 2, 1),
+
+  /* 0101 0110 ... */
+  /* 00   */ V(10, 5, 2),	/* 326 */
+  /* 01   */ V(1, 11, 2),
+  /* 10   */ V(11, 1, 2),
+  /* 11   */ V(6, 9, 2),
+
+  /* 0101 0111 ... */
+  /* 0    */ V(9, 6, 1),	/* 330 */
+  /* 1    */ V(10, 4, 1),
+
+  /* 0101 1000 ... */
+  /* 00   */ V(4, 10, 2),	/* 332 */
+  /* 01   */ V(7, 8, 2),
+  /* 10   */ V(8, 7, 1),
+  /* 11   */ V(8, 7, 1),
+
+  /* 0101 1001 ... */
+  /* 0    */ V(3, 10, 1),	/* 336 */
+  /* 1    */ V(10, 3, 1),
+
+  /* 0101 1010 ... */
+  /* 0    */ V(5, 9, 1),	/* 338 */
+  /* 1    */ V(9, 5, 1),
+
+  /* 0101 1011 ... */
+  /* 0    */ V(2, 10, 1),	/* 340 */
+  /* 1    */ V(10, 2, 1),
+
+  /* 0101 1100 ... */
+  /* 0    */ V(10, 1, 1),	/* 342 */
+  /* 1    */ V(6, 8, 1),
+
+  /* 0101 1101 ... */
+  /* 0    */ V(8, 6, 1),	/* 344 */
+  /* 1    */ V(7, 7, 1),
+
+  /* 0101 1110 ... */
+  /* 0    */ V(4, 9, 1),	/* 346 */
+  /* 1    */ V(9, 4, 1),
+
+  /* 0101 1111 ... */
+  /* 0    */ V(3, 9, 1),	/* 348 */
+  /* 1    */ V(9, 3, 1),
+
+  /* 0110 0000 ... */
+  /* 0    */ V(5, 8, 1),	/* 350 */
+  /* 1    */ V(8, 5, 1),
+
+  /* 0110 0001 ... */
+  /* 0    */ V(2, 9, 1),	/* 352 */
+  /* 1    */ V(6, 7, 1),
+
+  /* 0110 0010 ... */
+  /* 0    */ V(7, 6, 1),	/* 354 */
+  /* 1    */ V(9, 2, 1),
+
+  /* 0110 0011 ... */
+  /* 0    */ V(1, 9, 1),	/* 356 */
+  /* 1    */ V(9, 1, 1),
+
+  /* 0110 0100 ... */
+  /* 0    */ V(4, 8, 1),	/* 358 */
+  /* 1    */ V(8, 4, 1),
+
+  /* 0110 0101 ... */
+  /* 0    */ V(5, 7, 1),	/* 360 */
+  /* 1    */ V(7, 5, 1),
+
+  /* 0110 0110 ... */
+  /* 0    */ V(3, 8, 1),	/* 362 */
+  /* 1    */ V(8, 3, 1),
+
+  /* 0110 0111 ... */
+  /* 0    */ V(6, 6, 1),	/* 364 */
+  /* 1    */ V(2, 8, 1),
+
+  /* 0110 1000 ... */
+  /* 0    */ V(8, 2, 1),	/* 366 */
+  /* 1    */ V(1, 8, 1),
+
+  /* 0110 1001 ... */
+  /* 0    */ V(4, 7, 1),	/* 368 */
+  /* 1    */ V(7, 4, 1),
+
+  /* 0110 1010 ... */
+  /* 00   */ V(8, 1, 1),	/* 370 */
+  /* 01   */ V(8, 1, 1),
+  /* 10   */ V(0, 8, 2),
+  /* 11   */ V(8, 0, 2),
+
+  /* 0110 1011 ... */
+  /* 0    */ V(5, 6, 1),	/* 374 */
+  /* 1    */ V(6, 5, 1),
+
+  /* 0110 1100 ... */
+  /* 00   */ V(1, 7, 1),	/* 376 */
+  /* 01   */ V(1, 7, 1),
+  /* 10   */ V(0, 7, 2),
+  /* 11   */ V(7, 0, 2),
+
+  /* 0110 1110 ... */
+  /* 0    */ V(3, 7, 1),	/* 380  */
+  /* 1    */ V(2, 7, 1),
+
+  /* 0111 1100 ... */
+  /* 0    */ V(0, 6, 1),	/* 382 */
+  /* 1    */ V(6, 0, 1),
+
+  /* 1000 0011 ... */
+  /* 0    */ V(0, 5, 1),	/* 384 */
+  /* 1    */ V(5, 0, 1)
+];
+
+/* hufftable constructor */
+Mad.Hufftable = function(table, linbits, startbits) {
+    this.table = table;
+    this.linbits = linbits;
+    this.startbits = startbits;
+};
+
+/* external tables */
+Mad.huff_quad_table = [ hufftabA, hufftabB ];
+
+Mad.huff_pair_table = [
+  /*  0 */ new Mad.Hufftable(hufftab0,   0, 0),
+  /*  1 */ new Mad.Hufftable(hufftab1,   0, 3),
+  /*  2 */ new Mad.Hufftable(hufftab2,   0, 3),
+  /*  3 */ new Mad.Hufftable(hufftab3,   0, 3),
+  /*  4 */ null, //new Mad.Hufftable(0 /* not used */),
+  /*  5 */ new Mad.Hufftable(hufftab5,   0, 3),
+  /*  6 */ new Mad.Hufftable(hufftab6,   0, 4),
+  /*  7 */ new Mad.Hufftable(hufftab7,   0, 4),
+  /*  8 */ new Mad.Hufftable(hufftab8,   0, 4),
+  /*  9 */ new Mad.Hufftable(hufftab9,   0, 4),
+  /* 10 */ new Mad.Hufftable(hufftab10,  0, 4),
+  /* 11 */ new Mad.Hufftable(hufftab11,  0, 4),
+  /* 12 */ new Mad.Hufftable(hufftab12,  0, 4),
+  /* 13 */ new Mad.Hufftable(hufftab13,  0, 4),
+  /* 14 */ null, //new Mad.Hufftable(0 /* not used */),
+  /* 15 */ new Mad.Hufftable(hufftab15,  0, 4),
+  /* 16 */ new Mad.Hufftable(hufftab16,  1, 4),
+  /* 17 */ new Mad.Hufftable(hufftab16,  2, 4),
+  /* 18 */ new Mad.Hufftable(hufftab16,  3, 4),
+  /* 19 */ new Mad.Hufftable(hufftab16,  4, 4),
+  /* 20 */ new Mad.Hufftable(hufftab16,  6, 4),
+  /* 21 */ new Mad.Hufftable(hufftab16,  8, 4),
+  /* 22 */ new Mad.Hufftable(hufftab16, 10, 4),
+  /* 23 */ new Mad.Hufftable(hufftab16, 13, 4),
+  /* 24 */ new Mad.Hufftable(hufftab24,  4, 4),
+  /* 25 */ new Mad.Hufftable(hufftab24,  5, 4),
+  /* 26 */ new Mad.Hufftable(hufftab24,  6, 4),
+  /* 27 */ new Mad.Hufftable(hufftab24,  7, 4),
+  /* 28 */ new Mad.Hufftable(hufftab24,  8, 4),
+  /* 29 */ new Mad.Hufftable(hufftab24,  9, 4),
+  /* 30 */ new Mad.Hufftable(hufftab24, 11, 4),
+  /* 31 */ new Mad.Hufftable(hufftab24, 13, 4)
+];
Index: /gs3-extensions/web-audio/trunk/js-mad/script/id3v22stream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/id3v22stream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/id3v22stream.js	(revision 28388)
@@ -0,0 +1,341 @@
+var trimString = function (string) {
+    return string.replace(/\0$/, "");
+};
+
+var stringToEncoding = function(string, encoding) {
+    switch (encoding) {
+        case 0:
+            return trimString(string);
+        case 1:
+            var ix = 2, offset1 = 1, offset2 = 0;
+
+            if (string.slice(0, 2) === "\xFE\xFF") {
+                offset1 = 0, offset2 = 1;
+            } else {
+                offset1 = 1, offset2 = 0;
+            }
+
+            var result = "";
+
+            for (var ix = 2; ix < string.length; ix += 2) {
+                var byte1 = string[ix + offset1].charCodeAt(0);
+                var byte2 = string[ix + offset2].charCodeAt(0);
+
+                var word1 = (byte1 << 8) | byte2;
+
+                if (byte1 < 0xD8 || byte1 >= 0xE0) {
+                    result += String.fromCharCode(word1);
+                } else {
+                    ix += 2;
+
+                    var byte3 = string[ix + offset1].charCodeAt(0);
+                    var byte4 = string[ix + offset2].charCodeAt(0);
+
+                    var word2 = (byte3 << 8) | byte4;
+
+                    result += String.fromCharCode(word1, word2);
+                }
+            }
+
+            return trimString(result);
+        default:
+            return string;
+    }
+}
+
+var decodeIdentifierFrame = function(header, stream) {
+    var data = stream.read(header['length']);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'owner': array[0],
+            'identifier': array[1]
+    };
+}
+
+var decodeTextFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var data = stream.read(header['length'] - 1);
+
+    return {
+        'header': header,
+            'value': stringToEncoding(data, encoding)
+    };
+}
+
+var decodeCommentFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var language = stream.read(3);
+
+    var data = stream.read(header['length'] - 4);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'language': stringToEncoding(language, 0),
+            'description': stringToEncoding(array[0], 0),
+            'value': stringToEncoding(array[1], encoding)
+    };
+}
+
+var extendWithValueFrame = function(tags, frame) {
+    tags[frame['name']] = frame['value'];
+
+    return tags;
+}
+
+
+var extendWithIdentifierFrame = function(tags, frame) {
+    tags[frame['name']] = {
+        'owner': frame['value'],
+        'identifier': frame['identifier']
+    };
+
+    return tags;
+}
+
+var extendWithCommentFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']][frame['description']] = {
+        'language': frame['language'],
+        'value': frame['value']
+    };
+
+    return tags;
+}
+
+Mad.ID3v22Stream = function(header, stream) {
+    this.offset = 0;
+
+    this.header = header;
+    this.stream = stream;
+
+    this.decoders = {
+        'UFI': decodeIdentifierFrame,
+        'TT1': decodeTextFrame,
+        'TT2': decodeTextFrame,
+        'TT3': decodeTextFrame,
+        'TP1': decodeTextFrame,
+        'TP2': decodeTextFrame,
+        'TP3': decodeTextFrame,
+        'TP4': decodeTextFrame,
+        'TCM': decodeTextFrame,
+        'TXT': decodeTextFrame,
+        'TLA': decodeTextFrame,
+        'TCO': decodeTextFrame,
+        'TAL': decodeTextFrame,
+        'TPA': decodeTextFrame,
+        'TRK': decodeTextFrame,
+        'TRC': decodeTextFrame,
+        'TYE': decodeTextFrame,
+        'TDA': decodeTextFrame,
+        'TIM': decodeTextFrame,
+        'TRD': decodeTextFrame,
+        'TMT': decodeTextFrame,
+        'TFT': decodeTextFrame,
+        'TBP': decodeTextFrame,
+        'TCR': decodeTextFrame,
+        'TPB': decodeTextFrame,
+        'TEN': decodeTextFrame,
+        'TSS': decodeTextFrame,
+        'TOF': decodeTextFrame,
+        'TLE': decodeTextFrame,
+        'TSI': decodeTextFrame,
+        'TDY': decodeTextFrame,
+        'TKE': decodeTextFrame,
+        'TOT': decodeTextFrame,
+        'TOA': decodeTextFrame,
+        'TOL': decodeTextFrame,
+        'TOR': decodeTextFrame,
+
+        'COM': decodeCommentFrame
+    };
+
+    this.names = {
+        /* Identification Frames */
+        'TT1': 'Content group description',
+        'TT2': 'Title/Songname/Content description',
+        'TT3': 'Subtitle/Description refinement',
+        'TAL': 'Album/Movie/Show title',
+        'TOT': 'Original album/movie/show title',
+        'TRK': 'Track number/Position in set',
+        'TPA': 'Part of a set',
+        'TRC': 'ISRC',
+
+        /* Involved Persons Frames */
+        'TP1': 'Lead artist/Lead performer/Soloist/Performing group',
+        'TP2': 'Band/Orchestra/Accompaniment',
+        'TP3': 'Conductor',
+        'TP4': 'Interpreted, remixed, or otherwise modified by',
+        'TOA': 'Original artist/performer',
+        'TXT': 'Lyricist/Text writer',
+        'TOL': 'Original lyricist/text writer',
+        'TCO': 'Composer',
+        'TEN': 'Encoded by',
+
+        /* Derived and Subjective Properties Frames */
+        'TBP': 'BPM',
+        'TLE': 'Length',
+        'TKE': 'Initial key',
+        'TLA': 'Language',
+        'TMT': 'Media type',
+
+        /* Rights and Licence Frames */
+        'TCR': 'Copyright message',
+        'TPB': 'Publisher',
+
+        /* Other Text Frames */
+        'TOF': 'Original filename',
+        'TDY': 'Playlist delay',
+        'TSS': 'Software/Hardware and settings used for encoding',
+        'TFT': 'File type',
+
+        /* Buffering */
+        'BUF': 'Recommended buffer size',
+
+        /* Attached Picture Frame */
+        'PIC': 'Attached picture',
+
+        /* Unique Identifier Frame */
+        'UFI': 'Unique identifier',
+
+        /* Music CD Identifier Frame */
+        'MCI': 'Music CD identifier',
+
+        /* Comment Frame */
+        'COM': 'Comment',
+
+        /* User Defined URL Link Frame */
+        'WXX': 'User defined URL link',
+
+        /* Deprecated ID3v2 frames */
+        'TDA': 'Date',
+        'TIM': 'Time',
+        'TOR': 'Original release year',
+        'TRD': 'Recording dates',
+        'TSI': 'Size',
+        'TYE': 'Year'
+    };
+
+    this.extenders = {
+        'UFI': extendWithIdentifierFrame,
+        'TT1': extendWithValueFrame,
+        'TT2': extendWithValueFrame,
+        'TT3': extendWithValueFrame,
+        'TP1': extendWithValueFrame,
+        'TP2': extendWithValueFrame,
+        'TP3': extendWithValueFrame,
+        'TP4': extendWithValueFrame,
+        'TCM': extendWithValueFrame,
+        'TXT': extendWithValueFrame,
+        'TLA': extendWithValueFrame,
+        'TCO': extendWithValueFrame,
+        'TAL': extendWithValueFrame,
+        'TPA': extendWithValueFrame,
+        'TRK': extendWithValueFrame,
+        'TRC': extendWithValueFrame,
+        'TYE': extendWithValueFrame,
+        'TDA': extendWithValueFrame,
+        'TIM': extendWithValueFrame,
+        'TRD': extendWithValueFrame,
+        'TMT': extendWithValueFrame,
+        'TFT': extendWithValueFrame,
+        'TBP': extendWithValueFrame,
+        'TCR': extendWithValueFrame,
+        'TPB': extendWithValueFrame,
+        'TEN': extendWithValueFrame,
+        'TSS': extendWithValueFrame,
+        'TOF': extendWithValueFrame,
+        'TLE': extendWithValueFrame,
+        'TSI': extendWithValueFrame,
+        'TDY': extendWithValueFrame,
+        'TKE': extendWithValueFrame,
+        'TOT': extendWithValueFrame,
+        'TOA': extendWithValueFrame,
+        'TOL': extendWithValueFrame,
+        'TOR': extendWithValueFrame,
+
+        'COM': extendWithCommentFrame
+    };
+}
+
+Mad.ID3v22Stream.prototype.readFrame = function() {
+    if (this.offset >= this.header.length) {
+        return null;
+    }
+
+    var identifier = this.stream.read(3);
+
+    if (identifier.charCodeAt(0) === 0) {
+        this.offset = this.header.length + 1;
+
+        return null;
+    }
+
+    var length = this.stream.readU24(true);
+
+    var header = {
+identifier: identifier,
+            length: length
+    };
+
+    if (this.decoders[identifier]) {
+        var result = this.decoders[identifier](header, this.stream);
+    } else {
+        var result = {
+identifier: identifier,
+            header: header
+        };
+
+        this.stream.read(length);
+    }
+
+    result.name = this.names[identifier] ? this.names[identifier] : 'UNKNOWN';
+
+    this.offset += 10 + length;
+
+    return result;
+}
+
+Mad.ID3v22Stream.prototype.read = function() {
+    if (!this.array) {
+        this.array = [];
+
+        var frame = null;
+
+        try {
+            while (frame = this.readFrame()) {
+                this.array.push(frame);
+            }
+        } catch (e) {
+            throw(e);
+            //console.log("ID3 Error: " + e);
+        }
+    }
+
+    return this.array;
+}
+
+Mad.ID3v22Stream.prototype.toHash = function() {
+    var frames = this.read();
+
+    var hash = {};
+
+    for (var i = 0; i < frames.length; i++) {
+        var frame = frames[i];
+
+        var extender = this.extenders[frame['header']['identifier']];
+
+        if (extender) {
+            hash = extender(hash, frames[i]);
+        }
+    }
+
+    return hash;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/script/id3v23stream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/id3v23stream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/id3v23stream.js	(revision 28388)
@@ -0,0 +1,579 @@
+var trimString = function (string) {
+    return string.replace(/\0$/, "");
+};
+
+var stringToEncoding = function(string, encoding) {
+    switch (encoding) {
+        case 0:
+            return trimString(string);
+        case 1:
+            var ix = 2, offset1 = 1, offset2 = 0;
+
+            if (string.slice(0, 2) === "\xFE\xFF") {
+                offset1 = 0, offset2 = 1;
+            } else {
+                offset1 = 1, offset2 = 0;
+            }
+
+            var result = "";
+
+            for (var ix = 2; ix < string.length; ix += 2) {
+                var byte1 = string[ix + offset1].charCodeAt(0);
+                var byte2 = string[ix + offset2].charCodeAt(0);
+
+                var word1 = (byte1 << 8) | byte2;
+
+                if (byte1 < 0xD8 || byte1 >= 0xE0) {
+                    result += String.fromCharCode(word1);
+                } else {
+                    ix += 2;
+
+                    var byte3 = string[ix + offset1].charCodeAt(0);
+                    var byte4 = string[ix + offset2].charCodeAt(0);
+
+                    var word2 = (byte3 << 8) | byte4;
+
+                    result += String.fromCharCode(word1, word2);
+                }
+            }
+
+            return trimString(result);
+        default:
+            return string;
+    }
+}
+
+var decodeTerminatedString = function(header, stream) {
+
+    // skip text encoding (nobody cares, always ISO-8559-15)
+    stream.readAsString(1);
+
+    var c;
+
+    var mimetype = "";
+    while(true) {
+        c = stream.readAsString(1);
+        if(c === "\0") {
+            break;
+        }
+        mimetype += c;
+    }
+    console.log("mimetype = " + mimetype);
+
+    var filename = "";
+    while(true) {
+        c = stream.readAsString(1);
+        if(c === "\0") {
+            break;
+        }
+        filename += c;
+    }
+    console.log("filename = " + filename);
+
+    var contentDescription = "";
+    while(true) {
+        c = stream.readAsString(1);
+        if(c === "\0") {
+            break;
+        }
+        contentDescription += c;
+    }
+    console.log("contentDescription = " + contentDescription);
+
+    var objectName = stream.readAsString(4);
+
+    // skip 4 bytes, then read binary length
+    stream.readAsString(4);
+    var length = stream.readU32(true) - 4;
+
+    if(length > header.length) return null;
+    var value = stream.readAsString(length);
+
+    return {
+        'header': header,
+            'mimetype': mimetype,
+            'filename': filename,
+            'contentDescription': contentDescription,
+            'objectName': objectName,
+            'value': value
+    };
+}
+
+var decodeTextFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var data = stream.readAsString(header['length'] - 1);
+
+    return {
+        'header': header,
+            'value': stringToEncoding(data, encoding)
+    };
+}
+
+var decodeAttachedPictureFrame = function(header, stream) {
+    var encoding = stream.readU8();
+
+    var data = stream.readAsString(header['length'] - 1);
+
+    var array = data.split("\0");
+
+    return {
+        'header': header,
+            'mime': stringToEncoding(array[0], 0),
+            'type': array[1].charCodeAt(0),
+            'description': array[1].slice(1, array[1].length - 1),
+            'value': array.slice(2, array.length - 2).join("\0")
+    };
+}
+
+var decodeIdentifierFrame = function(header, stream) {
+    var data = stream.readAsString(header['length']);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'owner': array[0],
+            'identifier': array[1]
+    };
+}
+
+
+var decodeCommentFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var language = stream.readAsString(3);
+
+    var data = stream.readAsString(header['length'] - 4);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'language': stringToEncoding(language, 0),
+            'description': stringToEncoding(array[0], 0),
+            'value': stringToEncoding(array[1], encoding)
+    };
+}
+
+var decodeBinaryFrame = function(header, stream) {
+    var data = stream.readAsString(header['length']);
+
+    return {
+        'header': header,
+            'value': data
+    };
+}
+
+var decodeUserDefinedLinkFrame = function(header, stream) {
+    var encoding = stream.readU8();
+    var data = stream.readAsString(header['length'] - 1);
+
+    var array = data.split("\0", 2);
+
+    return {
+        'header': header,
+            'description': stringToEncoding(array[0], 0),
+            'value': stringToEncoding(array[1], encoding)
+    };
+}
+
+var extendWithValueFrame = function(tags, frame) {
+    tags[frame['name']] = frame['value'];
+
+    return tags;
+}
+
+var extendWithPictureFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']].push({
+            'mime': frame['mime'],
+            'type': frame['type'],
+            'description': frame['description'],
+            'value': frame['value']
+            });
+
+    return tags;
+}
+
+var extendWithIdentifierFrame = function(tags, frame) {
+    tags[frame['name']] = {
+        'owner': frame['value'],
+        'identifier': frame['identifier']
+    };
+
+    return tags;
+}
+
+var extendWithCommentFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']][frame['description']] = {
+        'language': frame['language'],
+        'value': frame['value']
+    };
+
+    return tags;
+}
+
+var extendWithUserDefinedLinkFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = {}
+    }
+
+    tags[frame['name']][frame['description']] = frame['value'];
+
+    return tags;
+}
+
+var extendWithPrivateFrame = function(tags, frame) {
+    if (!tags[frame['name']]) {
+        tags[frame['name']] = []
+    }
+
+    tags[frame['name']].push(frame['value']);
+
+    return tags;
+}
+
+Mad.ID3v23Stream = function(header, stream) {
+    this.offset = 0;
+
+    this.header = header;
+    this.stream = stream;
+
+    this.decoders = {
+        /* Identification Frames */
+        'TIT1': decodeTextFrame,
+        'TIT2': decodeTextFrame,
+        'TIT3': decodeTextFrame,
+        'TALB': decodeTextFrame,
+        'TOAL': decodeTextFrame,
+        'TRCK': decodeTextFrame,
+        'TPOS': decodeTextFrame,
+        'TSST': decodeTextFrame,
+        'TSRC': decodeTextFrame,
+
+        /* Involved Persons Frames */
+        'TPE1': decodeTextFrame,
+        'TPE2': decodeTextFrame,
+        'TPE3': decodeTextFrame,
+        'TPE4': decodeTextFrame,
+        'TOPE': decodeTextFrame,
+        'TEXT': decodeTextFrame,
+        'TOLY': decodeTextFrame,
+        'TCOM': decodeTextFrame,
+        'TMCL': decodeTextFrame,
+        'TIPL': decodeTextFrame,
+        'TENC': decodeTextFrame,
+
+        /* Derived and Subjective Properties Frames */
+        'TBPM': decodeTextFrame,
+        'TLEN': decodeTextFrame,
+        'TKEY': decodeTextFrame,
+        'TLAN': decodeTextFrame,
+        'TCON': decodeTextFrame,
+        'TFLT': decodeTextFrame,
+        'TMED': decodeTextFrame,
+        'TMOO': decodeTextFrame,
+
+        /* Rights and Licence Frames */
+        'TCOP': decodeTextFrame,
+        'TPRO': decodeTextFrame,
+        'TPUB': decodeTextFrame,
+        'TOWN': decodeTextFrame,
+        'TRSN': decodeTextFrame,
+        'TRSO': decodeTextFrame,
+
+        /* Other Text Frames */
+        'TOFN': decodeTextFrame,
+        'TDLY': decodeTextFrame,
+        'TDEN': decodeTextFrame,
+        'TDOR': decodeTextFrame,
+        'TDRC': decodeTextFrame,
+        'TDRL': decodeTextFrame,
+        'TDTG': decodeTextFrame,
+        'TSSE': decodeTextFrame,
+        'TSOA': decodeTextFrame,
+        'TSOP': decodeTextFrame,
+        'TSOT': decodeTextFrame,
+
+        /* Attached Picture Frame */
+        'APIC': decodeAttachedPictureFrame,
+
+        /* Unique Identifier Frame */
+        'UFID': decodeIdentifierFrame,
+
+        /* Music CD Identifier Frame */
+        'MCDI': decodeBinaryFrame,
+
+        /* Comment Frame */
+        'COMM': decodeCommentFrame,
+
+        /* User Defined URL Link Frame */
+        'WXXX': decodeUserDefinedLinkFrame,
+
+        /* Private Frame */
+        'PRIV': decodeBinaryFrame,
+
+        /* Deprecated ID3v2 Frames */
+        'TDAT': decodeTextFrame,
+        'TIME': decodeTextFrame,
+        'TORY': decodeTextFrame,
+        'TRDA': decodeTextFrame,
+        'TSIZ': decodeTextFrame,
+        'TYER': decodeTextFrame,
+
+        /* General encapsulated object */
+        'GEOB': decodeTerminatedString
+    };
+
+    this.names = {
+        /* Identification Frames */
+        'TIT1': 'Content group description',
+        'TIT2': 'Title/Songname/Content description',
+        'TIT3': 'Subtitle/Description refinement',
+        'TALB': 'Album/Movie/Show title',
+        'TOAL': 'Original album/movie/show title',
+        'TRCK': 'Track number/Position in set',
+        'TPOS': 'Part of a set',
+        'TSST': 'Set subtitle',
+        'TSRC': 'ISRC',
+
+        /* Involved Persons Frames */
+        'TPE1': 'Lead artist/Lead performer/Soloist/Performing group',
+        'TPE2': 'Band/Orchestra/Accompaniment',
+        'TPE3': 'Conductor',
+        'TPE4': 'Interpreted, remixed, or otherwise modified by',
+        'TOPE': 'Original artist/performer',
+        'TEXT': 'Lyricist/Text writer',
+        'TOLY': 'Original lyricist/text writer',
+        'TCOM': 'Composer',
+        'TMCL': 'Musician credits list',
+        'TIPL': 'Involved people list',
+        'TENC': 'Encoded by',
+
+        /* Derived and Subjective Properties Frames */
+        'TBPM': 'BPM',
+        'TLEN': 'Length',
+        'TKEY': 'Initial key',
+        'TLAN': 'Language',
+        'TCON': 'Content type',
+        'TFLT': 'File type',
+        'TMED': 'Media type',
+        'TMOO': 'Mood',
+
+        /* Rights and Licence Frames */
+        'TCOP': 'Copyright message',
+        'TPRO': 'Produced notice',
+        'TPUB': 'Publisher',
+        'TOWN': 'File owner/licensee',
+        'TRSN': 'Internet radio station name',
+        'TRSO': 'Internet radio station owner',
+
+        /* Other Text Frames */
+        'TOFN': 'Original filename',
+        'TDLY': 'Playlist delay',
+        'TDEN': 'Encoding time',
+        'TDOR': 'Original release time',
+        'TDRC': 'Recording time',
+        'TDRL': 'Release time',
+        'TDTG': 'Tagging time',
+        'TSSE': 'Software/Hardware and settings used for encoding',
+        'TSOA': 'Album sort order',
+        'TSOP': 'Performer sort order',
+        'TSOT': 'Title sort order',
+
+        /* Attached Picture Frame */
+        'APIC': 'Attached picture',
+
+        /* Unique Identifier Frame */
+        'UFID': 'Unique identifier',
+
+        /* Music CD Identifier Frame */
+        'MCDI': 'Music CD identifier',
+
+        /* Comment Frame */
+        'COMM': 'Comment',
+
+        /* User Defined URL Link Frame */
+        'WXXX': 'User defined URL link',
+
+        /* Private Frame */
+        'PRIV': 'Private',
+
+        /* Deprecated ID3v2 frames */
+        'TDAT': 'Date',
+        'TIME': 'Time',
+        'TORY': 'Original release year',
+        'TRDA': 'Recording dates',
+        'TSIZ': 'Size',
+        'TYER': 'Year'
+    };
+
+    this.extenders = {
+        /* Identification Frames */
+        'TIT1': extendWithValueFrame,
+        'TIT2': extendWithValueFrame,
+        'TIT3': extendWithValueFrame,
+        'TALB': extendWithValueFrame,
+        'TOAL': extendWithValueFrame,
+        'TRCK': extendWithValueFrame,
+        'TPOS': extendWithValueFrame,
+        'TSST': extendWithValueFrame,
+        'TSRC': extendWithValueFrame,
+
+        /* Involved Persons Frames */
+        'TPE1': extendWithValueFrame,
+        'TPE2': extendWithValueFrame,
+        'TPE3': extendWithValueFrame,
+        'TPE4': extendWithValueFrame,
+        'TOPE': extendWithValueFrame,
+        'TEXT': extendWithValueFrame,
+        'TOLY': extendWithValueFrame,
+        'TCOM': extendWithValueFrame,
+        'TMCL': extendWithValueFrame,
+        'TIPL': extendWithValueFrame,
+        'TENC': extendWithValueFrame,
+
+        /* Derived and Subjective Properties Frames */
+        'TBPM': extendWithValueFrame,
+        'TLEN': extendWithValueFrame,
+        'TKEY': extendWithValueFrame,
+        'TLAN': extendWithValueFrame,
+        'TCON': extendWithValueFrame,
+        'TFLT': extendWithValueFrame,
+        'TMED': extendWithValueFrame,
+        'TMOO': extendWithValueFrame,
+
+        /* Rights and Licence Frames */
+        'TCOP': extendWithValueFrame,
+        'TPRO': extendWithValueFrame,
+        'TPUB': extendWithValueFrame,
+        'TOWN': extendWithValueFrame,
+        'TRSN': extendWithValueFrame,
+        'TRSO': extendWithValueFrame,
+
+        /* Other Text Frames */
+        'TOFN': extendWithValueFrame,
+        'TDLY': extendWithValueFrame,
+        'TDEN': extendWithValueFrame,
+        'TDOR': extendWithValueFrame,
+        'TDRC': extendWithValueFrame,
+        'TDRL': extendWithValueFrame,
+        'TDTG': extendWithValueFrame,
+        'TSSE': extendWithValueFrame,
+        'TSOA': extendWithValueFrame,
+        'TSOP': extendWithValueFrame,
+        'TSOT': extendWithValueFrame,
+
+        /* Attached Picture Frame */
+        'APIC': extendWithPictureFrame,
+
+        /* Unique Identifier Frame */
+        'UFID': extendWithIdentifierFrame,
+
+        /* Music CD Identifier */
+        'MCDI': extendWithValueFrame,
+
+        /* Comment Frame */
+        'COMM': extendWithCommentFrame,
+
+        /* User Defined URL Link Frame */
+        'WXXX': extendWithUserDefinedLinkFrame,
+
+        /* Private Frame */
+        'PRIV': extendWithPrivateFrame,
+
+        /* Deprecated ID3v2 Frames */
+        'TDAT': extendWithValueFrame,
+        'TIME': extendWithValueFrame,
+        'TORY': extendWithValueFrame,
+        'TRDA': extendWithValueFrame,
+        'TSIZ': extendWithValueFrame,
+        'TYER': extendWithValueFrame
+    };
+}
+
+Mad.ID3v23Stream.prototype.readFrame = function() {
+    if (this.offset >= this.header.length) {
+        return null;
+    }
+
+    var identifier = this.stream.readAsString(4);
+
+    if (identifier.charCodeAt(0) === 0) {
+        this.offset = this.header.length + 1;
+        return null;
+    }
+
+    var length = this.stream.readU32(true);
+    var flags = this.stream.readU16(true);
+
+    var header = {
+        'identifier': identifier,
+        'length': length,
+        'flags': flags
+    };
+
+    var result = null;
+
+    if (this.decoders[identifier]) {
+        result = this.decoders[identifier](header, this.stream);
+    } else {
+        result = {
+            'identifier': identifier,
+            'header': header
+        };
+
+        this.stream.readAsString(Math.min(length, this.header.length - this.offset));
+    }
+
+    if(result) {
+        result['name'] = this.names[identifier] ? this.names[identifier] : 'UNKNOWN';
+    }
+
+    this.offset += 10 + length;
+
+    return result;
+}
+
+Mad.ID3v23Stream.prototype.read = function() {
+    if (!this.array) {
+        this.array = [];
+
+        var frame = null;
+
+        //try {
+        while (frame = this.readFrame()) {
+            this.array.push(frame);
+        }
+        //} catch (e) {
+        //throw(e);
+        //console.log("ID3 Error: " + e);
+        //}
+    }
+
+    return this.array;
+}
+
+Mad.ID3v23Stream.prototype.toHash = function() {
+    var frames = this.read();
+
+    var hash = {};
+
+    for (var i = 0; i < frames.length; i++) {
+        var frame = frames[i];
+
+        var extender = this.extenders[frame['header']['identifier']];
+
+        if (extender) {
+            hash = extender(hash, frames[i]);
+        }
+    }
+
+    return hash;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/script/imdct_s.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/imdct_s.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/imdct_s.js	(revision 28388)
@@ -0,0 +1,43 @@
+Mad.imdct_s = [
+  /*  0 */  [ 0.608761429,
+              -0.923879533,
+              -0.130526192,
+               0.991444861,
+              -0.382683432,
+              -0.793353340 ],
+
+  /*  6 */  [ -0.793353340,
+               0.382683432,
+               0.991444861,
+               0.130526192,
+              -0.923879533,
+              -0.608761429 ],
+
+  /*  1 */  [  0.382683432,
+              -0.923879533,
+               0.923879533,
+              -0.382683432,
+              -0.382683432,
+               0.923879533 ],
+
+  /*  7 */  [ -0.923879533,
+              -0.382683432,
+               0.382683432,
+               0.923879533,
+               0.923879533,
+               0.382683432 ],
+
+  /*  2 */  [  0.130526192,
+              -0.382683432,
+               0.608761429,
+              -0.793353340,
+               0.923879533,
+              -0.991444861 ],
+
+  /*  8 */  [ -0.991444861,
+              -0.923879533,
+              -0.793353340,
+              -0.608761429,
+              -0.382683432,
+              -0.130526192 ]
+]
Index: /gs3-extensions/web-audio/trunk/js-mad/script/layer3.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/layer3.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/layer3.js	(revision 28388)
@@ -0,0 +1,1791 @@
+
+/*
+ * MPEG-1 scalefactor band widths
+ * derived from Table B.8 of ISO/IEC 11172-3
+ */
+var sfb_48000_long = [
+    4,  4,  4,  4,  4,  4,  6,  6,  6,   8,  10,
+    12, 16, 18, 22, 28, 34, 40, 46, 54,  54, 192
+];
+
+var sfb_44100_long = [
+    4,  4,  4,  4,  4,  4,  6,  6,  8,   8,  10,
+    12, 16, 20, 24, 28, 34, 42, 50, 54,  76, 158
+];
+
+var sfb_32000_long = [
+    4,  4,  4,  4,  4,  4,  6,  6,  8,  10,  12,
+    16, 20, 24, 30, 38, 46, 56, 68, 84, 102,  26
+];
+
+var sfb_48000_short = [
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+    6,  6,  6,  6,  6, 10, 10, 10, 12, 12, 12, 14, 14,
+    14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
+];
+
+var sfb_44100_short = [
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+    6,  6,  8,  8,  8, 10, 10, 10, 12, 12, 12, 14, 14,
+    14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
+];
+
+var sfb_32000_short = [
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+    6,  6,  8,  8,  8, 12, 12, 12, 16, 16, 16, 20, 20,
+    20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
+];
+
+var sfb_48000_mixed = [
+    /* long */   4,  4,  4,  4,  4,  4,  6,  6,
+    /* short */  4,  4,  4,  6,  6,  6,  6,  6,  6, 10,
+    10, 10, 12, 12, 12, 14, 14, 14, 16, 16,
+    16, 20, 20, 20, 26, 26, 26, 66, 66, 66
+];
+
+var sfb_44100_mixed = [
+    /* long */   4,  4,  4,  4,  4,  4,  6,  6,
+    /* short */  4,  4,  4,  6,  6,  6,  8,  8,  8, 10,
+    10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
+    18, 22, 22, 22, 30, 30, 30, 56, 56, 56
+];
+
+var sfb_32000_mixed = [
+    /* long */   4,  4,  4,  4,  4,  4,  6,  6,
+    /* short */  4,  4,  4,  6,  6,  6,  8,  8,  8, 12,
+    12, 12, 16, 16, 16, 20, 20, 20, 26, 26,
+    26, 34, 34, 34, 42, 42, 42, 12, 12, 12
+];
+
+var sfbwidth_table = [
+    { l: sfb_48000_long, s: sfb_48000_short, m: sfb_48000_mixed },
+    { l: sfb_44100_long, s: sfb_44100_short, m: sfb_44100_mixed },
+    { l: sfb_32000_long, s: sfb_32000_short, m: sfb_32000_mixed } /*, // fuck MPEG 2.5
+    { l: sfb_24000_long, s: sfb_24000_short, m: sfb_24000_mixed },
+    { l: sfb_22050_long, s: sfb_22050_short, m: sfb_22050_mixed },
+    { l: sfb_16000_long, s: sfb_16000_short, m: sfb_16000_mixed },
+    { l: sfb_12000_long, s: sfb_12000_short, m: sfb_12000_mixed },
+    { l: sfb_11025_long, s: sfb_11025_short, m: sfb_11025_mixed },
+    { l:  sfb_8000_long, s:  sfb_8000_short, m:  sfb_8000_mixed }*/
+];
+
+var pretab /* [22] */ = [
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
+];
+
+/*
+ * fractional powers of two
+ * used for requantization and joint stereo decoding
+ *
+ * root_table[3 + x] = 2^(x/4)
+ */
+var root_table /* 7 */ = [
+    /* 2^(-3/4) */ 0.59460355750136,
+    /* 2^(-2/4) */ 0.70710678118655,
+    /* 2^(-1/4) */ 0.84089641525371,
+    /* 2^( 0/4) */ 1.00000000000000,
+    /* 2^(+1/4) */ 1.18920711500272,
+    /* 2^(+2/4) */ 1.41421356237310,
+    /* 2^(+3/4) */ 1.68179283050743
+];
+
+var cs = [
+        +0.857492926 , +0.881741997,
+        +0.949628649 , +0.983314592,
+        +0.995517816 , +0.999160558,
+        +0.999899195 , +0.999993155
+];
+
+var ca = [
+        -0.514495755, -0.471731969,
+        -0.313377454, -0.181913200,
+        -0.094574193, -0.040965583,
+        -0.014198569, -0.003699975
+];
+
+
+Mad.count1table_select = 0x01;
+Mad.scalefac_scale     = 0x02;
+Mad.preflag            = 0x04;
+Mad.mixed_block_flag   = 0x08;
+
+Mad.I_STEREO  = 0x1;
+Mad.MS_STEREO = 0x2;
+
+/*
+ * windowing coefficients for long blocks
+ * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
+ *
+ * window_l[i] = sin((PI / 36) * (i + 1/2))
+ */
+var window_l /* [36] */ = [
+    0.043619387, 0.130526192,
+    0.216439614, 0.300705800,
+    0.382683432, 0.461748613,
+    0.537299608, 0.608761429,
+    0.675590208, 0.737277337,
+    0.793353340, 0.843391446,
+
+    0.887010833, 0.923879533,
+    0.953716951, 0.976296007,
+    0.991444861, 0.999048222,
+    0.999048222, 0.991444861,
+    0.976296007, 0.953716951,
+    0.923879533, 0.887010833,
+
+    0.843391446, 0.793353340,
+    0.737277337, 0.675590208,
+    0.608761429, 0.537299608,
+    0.461748613, 0.382683432,
+    0.300705800, 0.216439614,
+    0.130526192, 0.043619387
+];
+
+/*
+ * windowing coefficients for short blocks
+ * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
+ *
+ * window_s[i] = sin((PI / 12) * (i + 1/2))
+ */
+var window_s /* [12] */ = [
+    0.130526192, 0.382683432,
+    0.608761429, 0.793353340,
+    0.923879533, 0.991444861,
+    0.991444861, 0.923879533,
+    0.793353340, 0.608761429,
+    0.382683432, 0.130526192
+];
+
+/*
+ * coefficients for intensity stereo processing
+ * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3
+ *
+ * is_ratio[i] = tan(i * (PI / 12))
+ * is_table[i] = is_ratio[i] / (1 + is_ratio[i])
+ */
+var is_table /* [7] */ = [
+    0.000000000,
+    0.211324865,
+    0.366025404,
+    0.500000000,
+    0.633974596,
+    0.788675135,
+    1.000000000
+];
+
+/*
+ * coefficients for LSF intensity stereo processing
+ * derived from section 2.4.3.2 of ISO/IEC 13818-3
+ *
+ * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1)
+ * is_lsf_table[1][i] = (1 /      sqrt(2)) ^(i + 1)
+ */
+var is_lsf_table /* [2][15] */ = [
+    [
+        0.840896415,
+        0.707106781,
+        0.594603558,
+        0.500000000,
+        0.420448208,
+        0.353553391,
+        0.297301779,
+        0.250000000,
+        0.210224104,
+        0.176776695,
+        0.148650889,
+        0.125000000,
+        0.105112052,
+        0.088388348,
+        0.074325445
+    ], [
+        0.707106781,
+        0.500000000,
+        0.353553391,
+        0.250000000,
+        0.176776695,
+        0.125000000,
+        0.088388348,
+        0.062500000,
+        0.044194174,
+        0.031250000,
+        0.022097087,
+        0.015625000,
+        0.011048543,
+        0.007812500,
+        0.005524272
+    ]
+];
+
+Mad.SideInfo = function() {
+    this.gr = []; // array of Mad.Granule
+    this.scfsi = []; // array of ints
+};
+
+/*
+ * scalefactor bit lengths
+ * derived from section 2.4.2.7 of ISO/IEC 11172-3
+ */
+var sflen_table = [
+    { slen1: 0, slen2: 0 }, { slen1: 0, slen2: 1 }, { slen1: 0, slen2: 2 }, { slen1: 0, slen2: 3 },
+    { slen1: 3, slen2: 0 }, { slen1: 1, slen2: 1 }, { slen1: 1, slen2: 2 }, { slen1: 1, slen2: 3 },
+    { slen1: 2, slen2: 1 }, { slen1: 2, slen2: 2 }, { slen1: 2, slen2: 3 }, { slen1: 3, slen2: 1 },
+    { slen1: 3, slen2: 2 }, { slen1: 3, slen2: 3 }, { slen1: 4, slen2: 2 }, { slen1: 4, slen2: 3 }    
+];
+
+Mad.Granule = function() {
+    this.ch = []; // list of Mad.Channel 
+}
+
+Mad.Channel = function() {
+    this.table_select = []; // list of Numbers (I guess)
+    this.scalefac = []; // list of integers
+    this.subblock_gain = [];
+}
+
+
+/* we must take care that sz >= bits and sz < sizeof(long) lest bits === 0 */
+Mad.MASK = function (cache, sz, bits) {
+    // return Mad.bitwiseAnd(Mad.rshift(cache, sz - bits), Mad.lshift(1, bits) - 1);
+    return (((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1));
+}
+
+Mad.MASK1BIT = function (cache, sz) {
+    // return Mad.bitwiseAnd(cache, Mad.lshift(1, sz - 1));
+    return ((cache) & (1 << ((sz) - 1)));
+}
+
+var mad_III_huffdecode_exponents = new Int32Array(4 * 39);
+
+/*
+ * NAME:    III_huffdecode()
+ * DESCRIPTION: decode Huffman code words of one channel of one granule
+ */
+Mad.III_huffdecode = function(ptr, xr /* Float64Array(576) */, channel, sfbwidth, part2_length) {
+    var exponents = mad_III_huffdecode_exponents;
+    var expptr = 0;
+    var bits_left, cachesz;
+    var xrptr;
+    var sfbound;
+    var bitcache;
+    var sfbwidthptr = 0;
+    
+    bits_left = channel.part2_3_length - part2_length;
+    
+    if (bits_left < 0)
+        return Mad.Error.BADPART3LEN;
+
+    Mad.III_exponents(channel, sfbwidth, exponents);
+
+    var peek = ptr.clone();
+    ptr.skip(bits_left);
+    
+    /* align bit reads to byte boundaries */
+    cachesz  = peek.left;
+    cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;
+    
+    bitcache   = peek.read(cachesz);
+    //console.log("bitcache peek.read = " + bitcache);
+    bits_left -= cachesz;
+
+    xrptr = 0;
+
+    /* big_values */
+    {
+        var region = 0, rcount;
+        
+        // var reqcache = new Float64Array(new ArrayBuffer(8 * 16));
+        var reqcache = [];
+
+        sfbound = xrptr + sfbwidth[sfbwidthptr++];
+        rcount  = channel.region0_count + 1;
+
+        var entry = Mad.huff_pair_table[channel.table_select[region]];
+        var table     = entry.table;
+        var linbits   = entry.linbits;
+        var startbits = entry.startbits;
+
+        if (typeof(table) === 'undefined')
+            return Mad.Error.BADHUFFTABLE;
+
+        expptr = 0;
+        exp     = exponents[expptr++];
+        var reqhits = 0;
+        var big_values = channel.big_values;
+
+        while (big_values-- && cachesz + bits_left > 0) {
+            var pair;
+            var clumpsz, value;
+            var requantized;
+
+            //console.log("big_values = " + big_values + ", cachesz = " + cachesz + ", bits_left = " + bits_left);
+
+            if (xrptr === sfbound) {
+                sfbound += sfbwidth[sfbwidthptr++];
+
+                /* change table if region boundary */
+                if (--rcount === 0) {
+                    if (region === 0)
+                        rcount = channel.region1_count + 1;
+                    else
+                        rcount = 0;  /* all remaining */
+
+                    entry     = Mad.huff_pair_table[channel.table_select[++region]];
+                    table     = entry.table;
+                    linbits   = entry.linbits;
+                    startbits = entry.startbits;
+
+                    if (typeof(table) === 'undefined')
+                        return Mad.Error.BADHUFFTABLE;
+                }
+
+                if (exp != exponents[expptr]) {
+                    exp = exponents[expptr];
+                    reqhits = 0;
+                }
+
+                ++expptr;
+            }
+            
+
+            if (cachesz < 21) {
+                var bits       = ((32 - 1 - 21) + (21 - cachesz)) & ~7;
+                bitcache   = (bitcache << bits) | peek.read(bits);
+                cachesz   += bits;
+                bits_left -= bits;
+            }
+
+            /* hcod (0..19) */
+            clumpsz = startbits;
+            //console.log('getting pair, bitcache = ' + bitcache + ", cachesz = " + cachesz + ", clumpsz = " + clumpsz);
+            pair    = table[ (((bitcache) >> ((cachesz) - (clumpsz))) & ((1 << (clumpsz)) - 1))];
+            
+            while (!pair.final) {
+                //console.log('pair ' + JSON.stringify(pair) + ' is not final, cachesz = ' + cachesz + ' being subtracted clumpsz ' + clumpsz);
+                cachesz -= clumpsz;
+
+                clumpsz = pair.ptr.bits;
+                pair    = table[pair.ptr.offset +  (((bitcache) >> ((cachesz) - (clumpsz))) & ((1 << (clumpsz)) - 1))];
+            }
+
+            cachesz -= pair.value.hlen;
+
+            if (linbits) {
+                /* x (0..14) */
+                value = pair.value.x;
+                var x_final = false;
+
+                switch (value) {
+                case 0:
+                    xr[xrptr] = 0;
+                    break;
+
+                case 15:
+                    if (cachesz < linbits + 2) {
+                        bitcache   = (bitcache << 16) | peek.read(16);
+                        cachesz   += 16;
+                        bits_left -= 16;
+                    }
+
+                    value +=  (((bitcache) >> ((cachesz) - (linbits))) & ((1 << (linbits)) - 1));
+                    cachesz -= linbits;
+
+                    requantized = Mad.III_requantize(value, exp);
+                    x_final = true; // simulating goto, yay
+                    break;
+
+                default:
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        requantized = reqcache[value] = Mad.III_requantize(value, exp);
+                    }
+                    x_final = true;
+                }
+                
+                if(x_final) {
+                    xr[xrptr] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+
+                /* y (0..14) */
+                value = pair.value.y;
+                var y_final = false;
+
+                switch (value) {
+                case 0:
+                    xr[xrptr + 1] = 0;
+                    break;
+
+                case 15:
+                    if (cachesz < linbits + 1) {
+                        bitcache   = (bitcache << 16) | peek.read(16);
+                        cachesz   += 16;
+                        bits_left -= 16;
+                    }
+
+                    value +=  (((bitcache) >> ((cachesz) - (linbits))) & ((1 << (linbits)) - 1));
+                    cachesz -= linbits;
+
+                    requantized = Mad.III_requantize(value, exp);
+                    y_final = true;
+                    break; // simulating goto, yayzor
+
+                default:
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        reqcache[value] = Mad.III_requantize(value, exp);
+                        requantized = reqcache[value];
+                    }
+                    y_final = true;
+                }
+                
+                if(y_final) {
+                    xr[xrptr + 1] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+            } else {
+                /* x (0..1) */
+                value = pair.value.x;
+
+                if (value === 0) {
+                    xr[xrptr] = 0;
+                } else {
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        requantized = reqcache[value] = Mad.III_requantize(value, exp);
+                    }
+
+                    xr[xrptr] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+
+                /* y (0..1) */
+                value = pair.value.y;
+
+                if (value === 0)
+                    xr[xrptr + 1] = 0;
+                else {
+                    if (reqhits & (1 << value))
+                        requantized = reqcache[value];
+                    else {
+                        reqhits |= (1 << value);
+                        requantized = reqcache[value] = Mad.III_requantize(value, exp);
+                    }
+
+                    xr[xrptr + 1] = ((bitcache) & (1 << ((cachesz--) - 1))) ?
+                        -requantized : requantized;
+                }
+            }
+
+            xrptr += 2;
+            //console.log("big_values = " + big_values + ", cachesz = " + cachesz + ", bits_left = " + bits_left + ", xrptr = " + xrptr);
+        }
+    }
+
+    //console.log("bits_left (before big_values overrun) = " + bits_left + ", cachesz = " + cachesz);
+
+    if (cachesz + bits_left < 0)
+        return Mad.Error.BADHUFFDATA;  /* big_values overrun */
+
+    /* count1 */
+    {
+        var table = Mad.huff_quad_table[channel.flags & Mad.count1table_select];
+        var requantized = Mad.III_requantize(1, exp);
+
+        while (cachesz + bits_left > 0 && xrptr <= 572) {
+            /* hcod (1..6) */
+            if (cachesz < 10) {
+                bitcache   = (bitcache << 16) | peek.read(16);
+                cachesz   += 16;
+                bits_left -= 16;
+            }
+            
+            var quad = table[ (((bitcache) >> ((cachesz) - (4))) & ((1 << (4)) - 1))];
+
+            /* quad tables guaranteed to have at most one extra lookup */
+            if (!quad['final']) {
+                cachesz -= 4;
+
+                quad = table[quad.ptr.offset +
+                              (((bitcache) >> ((cachesz) - (quad.ptr.bits))) & ((1 << (quad.ptr.bits)) - 1))];
+            }
+
+            cachesz -= quad.value.hlen;
+
+            if (xrptr === sfbound) {
+                sfbound += sfbwidth[sfbwidthptr++];
+
+                if (exp != exponents[expptr]) {
+                    exp = exponents[expptr];
+                    requantized = Mad.III_requantize(1, exp);
+                }
+
+                ++expptr;
+            }
+
+            /* v (0..1) */
+            xr[xrptr] = quad.value.v ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            /* w (0..1) */
+            xr[xrptr + 1] = quad.value.w ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            xrptr += 2;
+
+            if (xrptr === sfbound) {
+                sfbound += sfbwidth[sfbwidthptr++];
+
+                if (exp != exponents[expptr]) {
+                    exp = exponents[expptr];
+                    requantized = Mad.III_requantize(1, exp);
+                }
+
+                ++expptr;
+            }
+
+            /* x (0..1) */
+            xr[xrptr] = quad.value.x ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            /* y (0..1) */
+            xr[xrptr + 1] = quad.value.y ?
+                (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;
+
+            xrptr += 2;
+        }
+
+        if (cachesz + bits_left < 0) {
+            //# if 0 && defined(DEBUG)
+            //console.log("huffman count1 overrun (" + (-(cachesz + bits_left)) + " bits)");
+            //# endif
+
+            /* technically the bitstream is misformatted, but apparently
+               some encoders are just a bit sloppy with stuffing bits */
+            xrptr -= 4;
+        }
+    }
+
+    if (!(-bits_left <= Mad.BUFFER_GUARD * CHAR_BIT)) {
+        throw new Error("assertion failed: (-bits_left <= Mad.BUFFER_GUARD * CHAR_BIT)");
+    }
+
+    /*
+      # if 0 && defined(DEBUG)
+      if (bits_left < 0)
+      console.log("read " + (-bits_left) + " bits too many");
+      else if (cachesz + bits_left > 0)
+      console.log((cachesz + bits_left) + " stuffing bits");
+      else
+      console.log("bits_left " + bits_left);
+      # endif
+    */
+
+    /* rzero */
+    while (xrptr < 576) {
+        xr[xrptr]     = 0;
+        xr[xrptr + 1] = 0;
+
+        xrptr += 2;
+    }
+
+    return Mad.Error.NONE;
+}
+
+/*
+ * NAME:    III_sideinfo()
+ * DESCRIPTION: decode frame side information from a bitstream
+ * 
+ * Since several values are passed by reference to this function, instead
+ * we're just returning a hash containing:
+ * {
+ *   ptr (Mad.Bit)
+ *   sideinfo (Mad.Sideinfo) 
+ *   data_bitlen (Number)
+ *   priv_bitlen (Number)
+ * }
+ */
+Mad.III_sideinfo = function (ptr, nch, lsf) {
+    
+    var si = new Mad.SideInfo();
+    var result = Mad.Error.NONE;
+
+    var data_bitlen = 0;
+    var priv_bitlen = lsf ? ((nch === 1) ? 1 : 2) : ((nch === 1) ? 5 : 3);
+    
+    si.main_data_begin = ptr.read(lsf ? 8 : 9);
+    si.private_bits    = ptr.read(priv_bitlen);
+
+    var ngr = 1;
+    if (!lsf) {
+        ngr = 2;
+
+        for (var ch = 0; ch < nch; ++ch)
+            si.scfsi[ch] = ptr.read(4);
+    }
+
+    for (var gr = 0; gr < ngr; ++gr) {
+        var granule = new Mad.Granule();
+        si.gr[gr] = granule;
+        
+        for (var ch = 0; ch < nch; ++ch) {
+            var channel = new Mad.Channel();
+            granule.ch[ch] = channel;
+            
+            channel.part2_3_length    = ptr.read(12);
+            channel.big_values        = ptr.read(9);
+            channel.global_gain       = ptr.read(8);
+            channel.scalefac_compress = ptr.read(lsf ? 9 : 4);
+
+            data_bitlen += channel.part2_3_length;
+
+            if (channel.big_values > 288 && result === 0)
+                result = Mad.Error.BADBIGVALUES;
+
+            channel.flags = 0;
+
+            /* window_switching_flag */
+            if (ptr.read(1)) {
+                channel.block_type = ptr.read(2);
+
+                if (channel.block_type === 0 && result === 0)
+                    result = Mad.Error.BADBLOCKTYPE;
+
+                if (!lsf && channel.block_type === 2 && si.scfsi[ch] && result === 0)
+                    result = Mad.Error.BADSCFSI;
+
+                channel.region0_count = 7;
+                channel.region1_count = 36;
+
+                if (ptr.read(1))
+                    channel.flags |= Mad.mixed_block_flag;
+                else if (channel.block_type === 2)
+                    channel.region0_count = 8;
+
+                for (var i = 0; i < 2; ++i)
+                    channel.table_select[i] = ptr.read(5);
+
+                for (var i = 0; i < 3; ++i)
+                    channel.subblock_gain[i] = ptr.read(3);
+            } else {
+                channel.block_type = 0;
+
+                for (var i = 0; i < 3; ++i)
+                    channel.table_select[i] = ptr.read(5);
+
+                channel.region0_count = ptr.read(4);
+                channel.region1_count = ptr.read(3);
+            }
+
+            /* [preflag,] scalefac_scale, count1table_select */
+            channel.flags |= ptr.read(lsf ? 2 : 3);
+        }
+    }
+
+    return {
+        ptr: ptr,
+        si: si,
+        data_bitlen: data_bitlen,
+        priv_bitlen: priv_bitlen
+    };
+}
+
+/*
+ * NAME:    III_scalefactors()
+ * DESCRIPTION: decode channel scalefactors of one granule from a bitstream
+ */
+Mad.III_scalefactors = function (ptr, channel, gr0ch, scfsi) {
+    var start; /* Mad.Bit */
+    var slen1, slen2, sfbi;
+
+    var start = ptr.clone();
+
+    var slen1 = sflen_table[channel.scalefac_compress].slen1;
+    var slen2 = sflen_table[channel.scalefac_compress].slen2;
+
+    if (channel.block_type === 2) {
+        sfbi = 0;
+
+        var nsfb = (channel.flags & Mad.mixed_block_flag) ? 8 + 3 * 3 : 6 * 3;
+        while (nsfb--)
+            channel.scalefac[sfbi++] = ptr.read(slen1);
+
+        nsfb = 6 * 3;
+        while (nsfb--)
+            channel.scalefac[sfbi++] = ptr.read(slen2);
+
+        nsfb = 1 * 3;
+        while (nsfb--)
+            channel.scalefac[sfbi++] = 0;
+    }
+    else {  /* channel.block_type != 2 */
+        if (scfsi & 0x8) {
+            for (var sfbi = 0; sfbi < 6; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 0; sfbi < 6; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen1);
+        }
+
+        if (scfsi & 0x4) {
+            for (var sfbi = 6; sfbi < 11; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 6; sfbi < 11; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen1);
+        }
+
+        if (scfsi & 0x2) {
+            for (var sfbi = 11; sfbi < 16; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 11; sfbi < 16; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen2);
+        }
+
+        if (scfsi & 0x1) {
+            for (var sfbi = 16; sfbi < 21; ++sfbi)
+                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];
+        }
+        else {
+            for (var sfbi = 16; sfbi < 21; ++sfbi)
+                channel.scalefac[sfbi] = ptr.read(slen2);
+        }
+
+        channel.scalefac[21] = 0;
+    }
+
+    return start.length(ptr);
+}
+
+var c0 = 2 * Math.cos( 1 * Math.PI / 18);
+var c1 = 2 * Math.cos( 3 * Math.PI / 18);
+var c2 = 2 * Math.cos( 4 * Math.PI / 18);
+var c3 = 2 * Math.cos( 5 * Math.PI / 18);
+var c4 = 2 * Math.cos( 7 * Math.PI / 18);
+var c5 = 2 * Math.cos( 8 * Math.PI / 18);
+var c6 = 2 * Math.cos(16 * Math.PI / 18);
+
+var fastsdct = function (x /* [9] */, y /* [18] */, offset) {
+    var a0,  a1,  a2,  a3,  a4,  a5,  a6,  a7,  a8,  a9,  a10, a11, a12;
+    var a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25;
+    var m0,  m1,  m2,  m3,  m4,  m5,  m6,  m7;
+
+    a0 = x[3] + x[5];
+    a1 = x[3] - x[5];
+    a2 = x[6] + x[2];
+    a3 = x[6] - x[2];
+    a4 = x[1] + x[7];
+    a5 = x[1] - x[7];
+    a6 = x[8] + x[0];
+    a7 = x[8] - x[0];
+
+    a8  = a0  + a2;
+    a9  = a0  - a2;
+    a10 = a0  - a6;
+    a11 = a2  - a6;
+    a12 = a8  + a6;
+    a13 = a1  - a3;
+    a14 = a13 + a7;
+    a15 = a3  + a7;
+    a16 = a1  - a7;
+    a17 = a1  + a3;
+
+    m0 = a17 * -c3;
+    m1 = a16 * -c0;
+    m2 = a15 * -c4;
+    m3 = a14 * -c1;
+    m4 = a5  * -c1;
+    m5 = a11 * -c6;
+    m6 = a10 * -c5;
+    m7 = a9  * -c2;
+
+    a18 =     x[4] + a4;
+    a19 = 2 * x[4] - a4;
+    a20 = a19 + m5;
+    a21 = a19 - m5;
+    a22 = a19 + m6;
+    a23 = m4  + m2;
+    a24 = m4  - m2;
+    a25 = m4  + m1;
+
+    /* output to every other slot for convenience */
+    y[offset +  0] = a18 + a12;
+    y[offset +  2] = m0  - a25;
+    y[offset +  4] = m7  - a20;
+    y[offset +  6] = m3;
+    y[offset +  8] = a21 - m6;
+    y[offset + 10] = a24 - m1;
+    y[offset + 12] = a12 - 2 * a18;
+    y[offset + 14] = a23 + m0;
+    y[offset + 16] = a22 + m7;
+}
+
+/* sdctII_scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */
+var sdctII_scale = [];
+for(var i = 0; i < 9; ++i) {
+    sdctII_scale[i] = 2 * Math.cos(Math.PI * (2 * i + 1) / (2 * 18));
+}
+
+
+sdctII = function (x /* [18] */, X /* [18] */) {
+    /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */
+
+    // var tmp = new Float64Array(new ArrayBuffer(8 * 9));
+
+    var tmp = [];
+
+    /* even input butterfly */
+
+    for (var i = 0; i < 9; ++i) {
+        tmp[i] = x[i] + x[18 - i - 1];
+    }
+
+    fastsdct(tmp, X, 0);
+
+    /* odd input butterfly and scaling */
+
+    for (var i = 0; i < 9; ++i) {
+        tmp[i] = (x[i] - x[18 - i - 1]) * sdctII_scale[i];
+    }
+
+    fastsdct(tmp, X, 1);
+
+    /* output accumulation */
+    
+    for (var i = 3; i < 18; i += 2) {
+        X[i] -= X[i - 2];
+    }
+}
+
+/* dctIV_scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */  
+var dctIV_scale = [];
+for(i = 0; i < 18; i++) {
+    dctIV_scale[i] = 2 * Math.cos(Math.PI * (2 * i + 1) / (4 * 18));
+}
+
+var dctIV = function (y /* [18] */, X /* [18] */) {
+    // var tmp = new Float64Array(new ArrayBuffer(8 * 18));
+    var tmp = [];
+
+    /* scaling */
+
+    for (var i = 0; i < 18; ++i) {
+        tmp[i] = y[i] * dctIV_scale[i];
+    }
+
+    /* SDCT-II */
+
+    sdctII(tmp, X);
+
+    /* scale reduction and output accumulation */
+
+    X[0] /= 2;
+    for (var i = 1; i < 18; ++i) {
+        X[i] = X[i] / 2 - X[i - 1];
+    }
+}
+
+/*
+ * NAME:    imdct36
+ * DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm
+ */
+var imdct36 = function (x /* [18] */, y /* [36] */) {
+    // var tmp = new Float64Array(new ArrayBuffer(8 * 18));
+    var tmp = [];
+
+    /* DCT-IV */
+    dctIV(x, tmp);
+
+    /* convert 18-point DCT-IV to 36-point IMDCT */
+
+    for (var i =  0; i <  9; ++i) {
+        y[i] =  tmp[9 + i];
+    }
+    for (var i =  9; i < 27; ++i) {
+        y[i] = -tmp[36 - (9 + i) - 1];
+    }
+    for (var i = 27; i < 36; ++i) {
+        y[i] = -tmp[i - 27];
+    }
+}
+
+/*
+ * NAME:    III_imdct_s()
+ * DESCRIPTION: perform IMDCT and windowing for short blocks
+ */
+Mad.III_imdct_s = function (X /* [18] */, z /* [36] */)
+{
+    var yptr = 0;
+    var wptr;
+    var Xptr = 0;
+    
+    // var imdct_s_y = new Float64Array(new ArrayBuffer(8 * 36));
+    var y = [];
+    var hi, lo;
+
+    /* IMDCT */
+    for (var w = 0; w < 3; ++w) {
+        var s = Mad.imdct_s;
+        var sptr = 0;
+
+        for (var i = 0; i < 3; ++i) {
+            lo =  X[Xptr + 0] * s[sptr][0] +
+                X[Xptr + 1] * s[sptr][1] +
+                X[Xptr + 2] * s[sptr][2] +
+                X[Xptr + 3] * s[sptr][3] +
+                X[Xptr + 4] * s[sptr][4] +
+                X[Xptr + 5] * s[sptr][5];
+
+
+            y[yptr + i + 0] = lo;
+            y[yptr + 5 - i] = -y[yptr + i + 0];
+
+            ++sptr;
+
+            lo =  X[Xptr + 0] * s[sptr][0] +
+                X[Xptr + 1] * s[sptr][1] +
+                X[Xptr + 2] * s[sptr][2] +
+                X[Xptr + 3] * s[sptr][3] +
+                X[Xptr + 4] * s[sptr][4] +
+                X[Xptr + 5] * s[sptr][5];
+
+            y[yptr +  i + 6] = lo;
+            y[yptr + 11 - i] = y[yptr + i + 6];
+
+            ++sptr;
+        }
+
+        yptr += 12;
+        Xptr += 6;
+    }
+
+    /* windowing, overlapping and concatenation */
+
+    yptr = 0;
+    var wptr = 0;
+
+    for (var i = 0; i < 6; ++i) {
+        z[i +  0] = 0;
+        z[i +  6] = y[yptr +  0 + 0] * window_s[wptr + 0];
+
+        lo = y[yptr +  0 + 6] * window_s[wptr + 6] +
+            y[yptr + 12 + 0] * window_s[wptr + 0];
+
+        z[i + 12] = lo;
+
+        lo = y[yptr + 12 + 6] * window_s[wptr + 6] +
+            y[yptr + 24 + 0] * window_s[wptr + 0];
+
+        z[i + 18] = lo;
+
+        z[i + 24] = y[yptr + 24 + 6] * window_s[wptr + 6];
+        z[i + 30] = 0;
+
+        ++yptr;
+        ++wptr;
+    }
+}
+
+/*
+ * NAME:    III_imdct_l()
+ * DESCRIPTION: perform IMDCT and windowing for long blocks
+ */
+Mad.III_imdct_l = function (X /* 18 */, z /* 36 */, block_type) {
+    /* IMDCT */
+    imdct36(X, z);
+
+    /* windowing */
+
+    switch (block_type) {
+    case 0:  /* normal window */
+        for (var i = 0; i < 36; ++i) z[i] = z[i] * window_l[i];
+        break;
+
+    case 1:  /* start block */
+        for (var i =  0; i < 18; ++i) z[i] = z[i] * window_l[i];
+        /*  (var i = 18; i < 24; ++i) z[i] unchanged */
+        for (var i = 24; i < 30; ++i) z[i] = z[i] * window_s[i - 18];
+        for (var i = 30; i < 36; ++i) z[i] = 0;
+        break;
+
+    case 3:  /* stop block */
+        for (var i =  0; i <  6; ++i) z[i] = 0;
+        for (var i =  6; i < 12; ++i) z[i] = z[i] * window_s[i - 6];
+        /*  (var i = 12; i < 18; ++i) z[i] unchanged */
+        for (var i = 18; i < 36; ++i) z[i] = z[i] * window_l[i];
+        break;
+    }
+}
+
+
+/*
+ * NAME:    III_freqinver()
+ * DESCRIPTION: perform subband frequency inversion for odd sample lines
+ */
+Mad.III_freqinver = function (sample /* [18][32] */, sb)
+{
+    for (var i = 1; i < 18; i += 2)
+        sample[i][sb] = -sample[i][sb];
+}
+
+/*
+ * NAME:    III_decode()
+ * DESCRIPTION: decode frame main_data
+ * 
+ * result struct:
+ */
+Mad.III_decode = function (ptr, frame, si, nch) {
+    var header = frame.header;
+    var sfreqi;
+    
+    {
+        var sfreq = header.samplerate;
+
+        if (header.flags & Mad.Flag.MPEG_2_5_EXT)
+            sfreq *= 2;
+
+        /* 48000 => 0, 44100 => 1, 32000 => 2,
+           24000 => 3, 22050 => 4, 16000 => 5 */
+        sfreqi = ((sfreq >>  7) & 0x000f) +
+            ((sfreq >> 15) & 0x0001) - 8;
+
+        if (header.flags & Mad.Flag.MPEG_2_5_EXT)
+            sfreqi += 3;
+    }
+    
+    /* scalefactors, Huffman decoding, requantization */
+    var ngr = (header.flags & Mad.Flag.LSF_EXT) ? 1 : 2;
+    
+    for (var gr = 0; gr < ngr; ++gr) {
+        var granule = si.gr[gr];
+        var sfbwidth = [];
+        /* unsigned char const *sfbwidth[2]; */
+        var l = 0;
+        // var xr = [ new Float64Array(new ArrayBuffer(8 * 576)), new Float64Array(new ArrayBuffer(8 * 576)) ];
+        var xr = [[], []];
+        var error;
+
+        for (var ch = 0; ch < nch; ++ch) {
+            var channel = granule.ch[ch];
+            var part2_length;
+
+            sfbwidth[ch] = sfbwidth_table[sfreqi].l;
+
+            if (channel.block_type === 2) {
+                sfbwidth[ch] = (channel.flags & Mad.mixed_block_flag) ?
+                    sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s;
+            }
+
+            if (header.flags & Mad.Flag.LSF_EXT) {
+                part2_length = Mad.III_scalefactors_lsf(ptr, channel,
+                                                        ch === 0 ? 0 : si.gr[1].ch[1], header.mode_extension);
+            } else {
+                part2_length = Mad.III_scalefactors(ptr, channel, si.gr[0].ch[ch],
+                                                    gr === 0 ? 0 : si.scfsi[ch]);
+            }
+
+            error = Mad.III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length);
+            
+            if (error)
+                return error;
+        }
+
+        if (Mad.debug) {
+            Mad.debug.huffdecode.write(Mad.debug.iteration + "\t");
+
+            for (var i = 0; i < 576; i++) {
+                Mad.debug.huffdecode.write(xr[0][i].toFixed(8) + "\t");
+            }
+            Mad.debug.huffdecode.write("\n");
+        }
+
+        /* joint stereo processing */
+        if ((header.mode === Mad.Mode.JOINT_STEREO) && (header.mode_extension != 0)) {
+            error = Mad.III_stereo(xr, granule, header, sfbwidth[0]);
+            
+            if (error)
+                return error;
+        }
+
+        /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */
+        for (var ch = 0; ch < nch; ++ch) {
+            var channel = granule.ch[ch];
+            var sample = frame.sbsample[ch].slice(18 * gr);
+            
+            var sb, l = 0, i, sblimit;
+            // var output = new Float64Array(new ArrayBuffer(8 * 36));
+            var output = [];
+
+            if (channel.block_type === 2) {
+                Mad.III_reorder(xr[ch], channel, sfbwidth[ch]);
+
+                /*
+                 * According to ISO/IEC 11172-3, "Alias reduction is not applied for
+                 * granules with block_type === 2 (short block)." However, other
+                 * sources suggest alias reduction should indeed be performed on the
+                 * lower two subbands of mixed blocks. Most other implementations do
+                 * this, so by default we will too.
+                 */
+                if (channel.flags & Mad.mixed_block_flag)
+                    Mad.III_aliasreduce(xr[ch], 36);
+            } else {
+                Mad.III_aliasreduce(xr[ch], 576);
+            }
+
+            /* subbands 0-1 */
+            if (channel.block_type != 2 || (channel.flags & Mad.mixed_block_flag)) {
+                var block_type = channel.block_type;
+                if (channel.flags & Mad.mixed_block_flag)
+                    block_type = 0;
+
+                /* long blocks */
+                for (var sb = 0; sb < 2; ++sb, l += 18) {
+                    Mad.III_imdct_l(xr[ch].slice(l, l + 18), output, block_type);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+
+                    // var sys = require('sys');
+                    // sys.print("\nblocktype: " + block_type + " sb: " + sb + "\n");
+                    // for (var i = 0; i < 18; i++) {
+                    //     sys.print(output[i].toFixed(8) + "\t");
+                    //     if (i % 8 === 7) sys.print("\n");
+                    // }
+
+                }
+            } else {
+                /* short blocks */
+                for (var sb = 0; sb < 2; ++sb, l += 18) {
+                    Mad.III_imdct_s(xr[ch].slice(l, l + 18), output);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+                }
+            }
+
+            Mad.III_freqinver(sample, 1);
+
+            /* (nonzero) subbands 2-31 */
+            i = 576;
+            while (i > 36 && xr[ch][i - 1] === 0)
+                --i;
+
+            sblimit = 32 - (((576 - i) / 18) << 0);
+
+            if (channel.block_type != 2) {
+                /* long blocks */
+                for (var sb = 2; sb < sblimit; ++sb, l += 18) {
+                    Mad.III_imdct_l(xr[ch].slice(l, l + 18), output, channel.block_type);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+
+                    if (sb & 1)
+                        Mad.III_freqinver(sample, sb);
+                }
+            } else {
+                /* short blocks */
+                for (var sb = 2; sb < sblimit; ++sb, l += 18) {
+                    Mad.III_imdct_s(xr[ch].slice(l, l + 18), output);
+                    Mad.III_overlap(output, frame.overlap[ch][sb], sample, sb);
+
+                    if (sb & 1)
+                        Mad.III_freqinver(sample, sb);
+                }
+            }
+
+            // remaining (zero) subbands
+            for (var sb = sblimit; sb < 32; ++sb) {
+                Mad.III_overlap_z(frame.overlap[ch][sb], sample, sb);
+
+                if (sb & 1)
+                    Mad.III_freqinver(sample, sb);
+            }
+
+            if (Mad.debug) {
+                for (var i = 0; i < 18; i++) {
+                    Mad.debug.sample.write(Mad.debug.iteration * 18 + i + "\t");
+                    for (var j = 0; j < 32; j++) {
+                        Mad.debug.sample.write(sample[i][j].toFixed(8) + "\t");
+                    }
+                    Mad.debug.sample.write("\n");
+                }
+                Mad.debug.iteration += 1;
+            }       
+        }
+    }
+
+    return Mad.Error.NONE;
+}
+
+
+/*
+ * NAME:    layer.III()
+ * DESCRIPTION: decode a single Layer III frame
+ */
+Mad.layer_III = function (stream, frame) {
+    var header = frame.header;
+    var nch, next_md_begin = 0;
+    var si_len, data_bitlen, md_len = 0;
+    var frame_space, frame_used, frame_free;
+    var /* Mad.Error */ error;
+    var ptr;
+    var result = 0;
+
+    /* allocate Layer III dynamic structures */
+    nch = header.nchannels();
+    si_len = (header.flags & Mad.Flag.LSF_EXT) ?
+        (nch === 1 ? 9 : 17) : (nch === 1 ? 17 : 32);
+
+    /* check frame sanity */
+    if (stream.next_frame - stream.ptr.nextbyte() < si_len) {
+        stream.error = Mad.Error.BADFRAMELEN;
+        stream.md_len = 0;
+        return -1;
+    }
+
+    /* check CRC word */
+    if (header.flags & Mad.Flag.PROTECTION) {
+        header.crc_check = mad_bit_crc(stream.ptr, si_len * CHAR_BIT, header.crc_check);
+
+        if (header.crc_check != header.crc_target &&
+            !(frame.options & Mad.Option.IGNORECRC)) {
+            stream.error = Mad.Error.BADCRC;
+            result = -1;
+        }
+    }
+
+    /* decode frame side information */
+    var sideinfoResult = Mad.III_sideinfo(stream.ptr, nch, header.flags & Mad.Flag.LSF_EXT);
+    
+    stream.ptr = sideinfoResult.ptr;
+    var si = sideinfoResult.si;
+    var data_bitlen = sideinfoResult.data_bitlen;
+    var priv_bitlen = sideinfoResult.priv_bitlen;
+    
+    //console.log("We're at " + stream.ptr.offset + ", data_bitlen = " + data_bitlen + ", priv_bitlen = " + priv_bitlen);
+    
+    if (error && result === 0) {
+        stream.error = error;
+        result = -1;
+    }
+
+    header.flags        |= priv_bitlen;
+    header.private_bits |= si.private_bits;
+
+    /* find main_data of next frame */
+    {
+        var peek = new Mad.Bit(stream.stream, stream.next_frame);
+
+        header = peek.read(32);
+        
+        if (Mad.bitwiseAnd(header, 0xffe60000) /* syncword | layer */ === 0xffe20000) { 
+            if (!(Mad.bitwiseAnd(header, 0x00010000)))  /* protection_bit */
+                peek.skip(16);  /* crc_check */
+
+            next_md_begin = peek.read(Mad.bitwiseAnd(header, 0x00080000) /* ID */ ? 9 : 8);
+        }
+    }
+
+    /* find main_data of this frame */
+    frame_space = stream.next_frame - stream.ptr.nextbyte();
+
+    //console.log("next_frame = " + stream.next_frame + ", nextbyte = " + stream.ptr.nextbyte() + ", frame_space = " + frame_space);
+
+    //console.log("before, next_md_begin = " + next_md_begin);
+
+    if (next_md_begin > si.main_data_begin + frame_space)
+        next_md_begin = 0;
+
+    //console.log("so far, md_len = " + md_len + ", si.main_data_begin = " + si.main_data_begin + ", frame_space = " + frame_space + ", next_md_begin = " + next_md_begin);
+    
+    md_len = si.main_data_begin + frame_space - next_md_begin;
+
+    frame_used = 0;
+    
+    if (si.main_data_begin === 0) {
+        ptr = stream.ptr;
+        stream.md_len = 0;
+
+        frame_used = md_len;
+    } else {
+        //console.log("si.main_data_begin = " + si.main_data_begin + ", stream.md_len = " + stream.md_len);
+        if (si.main_data_begin > stream.md_len) {
+            if (result === 0) {
+                stream.error = Mad.Error.BADDATAPTR;
+                result = -1;
+            }
+        } else {
+            var old_md_len = stream.md_len;
+            
+            if (md_len > si.main_data_begin) {
+                if(!(stream.md_len + md_len - si.main_data_begin <= Mad.BUFFER_MDLEN)) {
+                    throw new Error("Assertion failed: (stream.md_len + md_len - si.main_data_begin <= MAD_BUFFER_MDLEN)");
+                }
+                
+                frame_used = md_len - si.main_data_begin;
+                
+                /* memcpy(dst, dstOffset, src, srcOffset, length) - returns a copy of dst with modified bytes */
+                //console.log("mem copy 1");
+                stream.main_data = Mad.Storage.memcpy(stream.main_data, stream.md_len, stream.ptr.stream, stream.ptr.nextbyte(), frame_used);
+
+                /*
+                // Keeping this here as a handy little reference
+                memcpy(*stream.main_data + stream.md_len,
+                mad_bit_nextbyte(&stream.ptr),
+                frame_used = md_len - si.main_data_begin
+                );
+                */
+                stream.md_len += frame_used;
+            }
+           
+            ptr = new Mad.Bit(stream.main_data, old_md_len - si.main_data_begin);
+
+            //console.log("main_data length = " + stream.main_data.length + ", old_md_len = " + old_md_len + ", main_data_begin = " + si.main_data_begin + " new ptr = ");
+            //console.log(ptr);
+        }
+    }
+
+    frame_free = frame_space - frame_used;
+
+    /* decode main_data */
+    if (result === 0) {
+        error = Mad.III_decode(ptr, frame, si, nch);
+        
+        if (error) {
+            stream.error = error;
+            result = -1;
+        }
+        
+        /* designate ancillary bits */
+        stream.anc_ptr    = ptr;
+        stream.anc_bitlen = md_len * CHAR_BIT - data_bitlen;
+    }
+    
+    // DEBUG
+    /*
+      console.log(
+      "main_data_begin:" + si.main_data_begin +
+      ", md_len:" + md_len +
+      ", frame_free:" + frame_free +
+      ", data_bitlen:" + data_bitlen +
+      ", anc_bitlen: " + stream.anc_bitlen);
+    */
+
+    /* preload main_data buffer with up to 511 bytes for next frame(s) */
+    if (frame_free >= next_md_begin) {
+        //console.log("mem copy 2");
+        stream.main_data = Mad.Storage.memcpy(stream.main_data, 0, stream.stream, stream.next_frame - next_md_begin, next_md_begin);
+        /*
+        // Keeping here for reference
+        memcpy(*stream.main_data, stream.next_frame - next_md_begin, next_md_begin);
+        */
+        stream.md_len = next_md_begin;
+    } else {
+        if (md_len < si.main_data_begin) {
+            var extra = si.main_data_begin - md_len;
+            if (extra + frame_free > next_md_begin)
+                extra = next_md_begin - frame_free;
+
+            if (extra < stream.md_len) {
+                //console.log("mem copy 3");
+                stream.main_data = Mad.Storage.memcpy(stream.main_data, 0, stream.main_data, stream.md_len - extra, extra);
+                /*
+                // Keeping here for reference
+                memmove(*stream.main_data, *stream.main_data + stream.md_len - extra, extra);
+                */
+                stream.md_len = extra;
+            }
+        } else {
+            stream.md_len = 0;
+        }
+
+        //console.log("mem copy 4");
+        stream.main_data = Mad.Storage.memcpy(stream.main_data, stream.md_len, stream.stream, stream.next_frame - frame_free, frame_free);
+        /*
+        // Keeping here for reference
+        memcpy(*stream.main_data + stream.md_len, stream.next_frame - frame_free, frame_free);
+        */
+        stream.md_len += frame_free;
+    }
+
+    return result;
+}
+
+Mad.III_exponents = function(channel, sfbwidth, exponents) {
+    var gain = channel.global_gain - 210;
+    var scalefac_multiplier = (channel.flags & Mad.scalefac_scale) ? 2 : 1;
+    
+    if (channel.block_type === 2) {
+        var sfbi = 0, l = 0;
+        
+        if (channel.flags & Mad.mixed_block_flag) {
+            var premask = (channel.flags & Mad.preflag) ? ~0 : 0;
+            
+            /* long block subbands 0-1 */
+            
+            while (l < 36) {
+                exponents[sfbi] = gain - ((channel.scalefac[sfbi] + (pretab[sfbi] & premask)) << scalefac_multiplier);
+                
+                l += sfbwidth[sfbi++]
+            }
+        }
+        
+        /* this is probably wrong for 8000 Hz short/mixed blocks */
+        
+        var gain0 = gain - 8 * channel.subblock_gain[0];
+        var gain1 = gain - 8 * channel.subblock_gain[1];
+        var gain2 = gain - 8 * channel.subblock_gain[2];
+        
+        while (l < 576) {
+            exponents[sfbi + 0] = gain0 - (channel.scalefac[sfbi + 0] << scalefac_multiplier);
+            exponents[sfbi + 1] = gain1 - (channel.scalefac[sfbi + 1] << scalefac_multiplier);
+            exponents[sfbi + 2] = gain2 - (channel.scalefac[sfbi + 2] << scalefac_multiplier);
+            
+            l    += 3 * sfbwidth[sfbi];
+            sfbi += 3;
+        }
+    } else { /* channel.block_type != 2 */
+        if (channel.flags & Mad.preflag) {
+            for (var sfbi = 0; sfbi < 22; ++sfbi) {
+                exponents[sfbi] = gain - ((channel.scalefac[sfbi] + pretab[sfbi]) << scalefac_multiplier);
+            }
+        } else {
+            for (var sfbi = 0; sfbi < 22; ++sfbi) {
+                exponents[sfbi] = gain - (channel.scalefac[sfbi] << scalefac_multiplier);
+            }
+        }
+    }
+}
+
+Mad.III_requantize = function(value, exp) {
+    // usual (x >> 0) tricks to make sure frac and exp stay integers
+    var frac = (exp % 4) >> 0;  /* assumes sign(frac) === sign(exp) */
+    exp = (exp / 4) >> 0;
+
+    var requantized = Math.pow(value, 4.0 / 3.0);
+    requantized *= Math.pow(2.0, (exp / 4.0));
+    
+    if(frac) {
+        requantized *= Math.pow(2.0, (frac / 4.0));
+    }
+    
+    if(exp < 0) {
+        requantized /= Math.pow(2.0, -exp * (3.0 / 4.0));
+    }
+
+    return requantized;
+}
+
+Mad.III_aliasreduce = function(xr, lines) {
+    var xrPointer = 0;
+    
+    for (xrPointer += 18; xrPointer < lines; xrPointer += 18) {
+        for (var i = 0; i < 8; ++i) {
+            var a = xr[xrPointer - i - 1];
+            var b = xr[xrPointer + i];
+
+            var lo =  a * cs[i] - b * ca[i];
+
+            xr[xrPointer - i - 1] = lo;
+
+            lo =  b * cs[i] + a * ca[i];
+
+            xr[xrPointer + i] = lo
+        }
+    }
+}
+
+Mad.III_overlap = function (output /* [36] */, overlap /* [18] */, sample /* [18][32] */, sb) {
+    for (var i = 0; i < 18; ++i) {
+        sample[i][sb] = output[i +  0] + overlap[i];
+        overlap[i]    = output[i + 18];
+    }
+}
+
+Mad.III_overlap_z = function (overlap /* [18] */, sample /* [18][32] */, sb) {
+    for (var i = 0; i < 18; ++i) {
+        sample[i][sb] = overlap[i];
+        overlap[i]    = 0;
+    }
+}
+
+// allocating typed arrays once and for all, outside the function
+// var reorder_tmp = new Float64Array(new ArrayBuffer(8 * 32 * 3 * 6));
+// var reorder_sbw = new Float64Array(new ArrayBuffer(8 * 3));
+// var reorder_sw  = new Float64Array(new ArrayBuffer(8 * 3));
+
+Mad.III_reorder = function (xr /* [576] */, channel, sfbwidth /* [39] */) {
+    var sfbwidthPointer = 0;
+    var tmp = [];
+
+    for (var i = 0; i < 32; i++) {
+        tmp[i] = [];
+        for (var j = 0; j < 3; j++) {
+            tmp[i][j] = [];
+            for (var k = 0; k < 6; k++) {
+                tmp[i][j][k] = 0;
+            }
+        }
+    }
+
+    var sbw = [];
+    var sw  = [];
+    
+    /* this is probably wrong for 8000 Hz mixed blocks */
+
+    var sb = 0;
+    if (channel.flags & Mad.mixed_block_flag) {
+        var sb = 2;
+
+        var l = 0;
+        while (l < 36)
+            l += sfbwidth[sfbwidthPointer++];
+    }
+
+    for (var w = 0; w < 3; ++w) {
+        sbw[w] = sb;
+        sw[w]  = 0;
+    }
+
+    f = sfbwidth[sfbwidthPointer++];
+    w = 0;
+
+    for (var l = 18 * sb; l < 576; ++l) {
+        if (f-- === 0) {
+            f = sfbwidth[sfbwidthPointer++] - 1;
+            w = (w + 1) % 3;
+        }
+        
+        tmp[sbw[w]][w][sw[w]++] = xr[l];
+
+        if (sw[w] === 6) {
+            sw[w] = 0;
+            ++sbw[w];
+        }
+    }
+
+    var tmp2 = [];
+    var ptr = 0;
+
+    for (var i = 0; i < 32; i++) {
+        for (var j = 0; j < 3; j++) {
+            for (var k = 0; k < 6; k++) {
+                tmp2[ptr++] = tmp[i][j][k];
+            }
+        }
+    }
+    
+    var len = (576 - 18 * sb);
+
+    for (var i = 0; i < len; i++) {
+        xr[18 * sb + i] = tmp2[sb + i];
+    }
+}
+
+Mad.III_stereo = function(xr /* [2][576] */, granule, header, sfbwidth) {
+    var modes = [];
+    var sfbi, l, n, i;
+
+    if (granule.ch[0].block_type !=
+        granule.ch[1].block_type ||
+        (granule.ch[0].flags & Mad.mixed_block_flag) !=
+        (granule.ch[1].flags & Mad.mixed_block_flag))
+        return Mad.Error.BADSTEREO;
+
+    for (i = 0; i < 39; ++i)
+        modes[i] = header.mode_extension;
+
+    /* intensity stereo */
+
+    if (header.mode_extension & Mad.I_STEREO) {
+        var right_ch = granule.ch[1];
+        var right_xr = xr[1];
+        var is_pos;
+
+        header.flags |= Mad.Flag.I_STEREO;
+
+        /* first determine which scalefactor bands are to be processed */
+
+        if (right_ch.block_type === 2) {
+            var lower, start, max, bound = [], w;
+
+            lower = start = max = bound[0] = bound[1] = bound[2] = 0;
+
+            sfbi = l = 0;
+
+            if (right_ch.flags & Mad.mixed_block_flag) {
+                while (l < 36) {
+                    n = sfbwidth[sfbi++];
+
+                    for (i = 0; i < n; ++i) {
+                        if (right_xr[i]) {
+                            lower = sfbi;
+                            break;
+                        }
+                    }
+
+                    right_xr += n;
+                    l += n;
+                }
+
+                start = sfbi;
+            }
+
+            w = 0;
+            while (l < 576) {
+                n = sfbwidth[sfbi++];
+
+                for (i = 0; i < n; ++i) {
+                    if (right_xr[i]) {
+                        max = bound[w] = sfbi;
+                        break;
+                    }
+                }
+
+                right_xr += n;
+                l += n;
+                w = (w + 1) % 3;
+            }
+
+            if (max)
+                lower = start;
+
+            /* long blocks */
+
+            for (i = 0; i < lower; ++i)
+                modes[i] = header.mode_extension & ~Mad.I_STEREO;
+
+            /* short blocks */
+
+            w = 0;
+            for (i = start; i < max; ++i) {
+                if (i < bound[w])
+                    modes[i] = header.mode_extension & ~Mad.I_STEREO;
+
+                w = (w + 1) % 3;
+            }
+        }
+        else {  /* right_ch.block_type != 2 */
+            var bound;
+
+            bound = 0;
+            for (sfbi = l = 0; l < 576; l += n) {
+                n = sfbwidth[sfbi++];
+
+                for (i = 0; i < n; ++i) {
+                    if (right_xr[i]) {
+                        bound = sfbi;
+                        break;
+                    }
+                }
+
+                right_xr += n;
+            }
+
+            for (i = 0; i < bound; ++i)
+                modes[i] = header.mode_extension & ~Mad.I_STEREO;
+        }
+
+        /* now do the actual processing */
+
+        if (header.flags & Mad.Flag.LSF_EXT) {
+            illegal_pos = granule[1].ch[1].scalefac;
+            var lsf_scale;
+
+            /* intensity_scale */
+            lsf_scale = is_lsf_table[right_ch.scalefac_compress & 0x1];
+
+            for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
+                n = sfbwidth[sfbi];
+
+                if (!(modes[sfbi] & Mad.I_STEREO))
+                    continue;
+
+                if (illegal_pos[sfbi]) {
+                    modes[sfbi] &= ~Mad.I_STEREO;
+                    continue;
+                }
+
+                is_pos = right_ch.scalefac[sfbi];
+
+                for (i = 0; i < n; ++i) {
+                    var left;
+
+                    left = xr[0][l + i];
+
+                    if (is_pos === 0)
+                        xr[1][l + i] = left;
+                    else {
+                        var opposite;
+
+                        opposite = left * lsf_scale[(is_pos - 1) / 2];
+
+                        if (is_pos & 1) {
+                            xr[0][l + i] = opposite;
+                            xr[1][l + i] = left;
+                        }
+                        else
+                            xr[1][l + i] = opposite;
+                    }
+                }
+            }
+        }
+        else {  /* !(header.flags & MAD_FLAG_LSF_EXT) */
+            for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
+                n = sfbwidth[sfbi];
+
+                if (!(modes[sfbi] & Mad.I_STEREO))
+                    continue;
+
+                is_pos = right_ch.scalefac[sfbi];
+
+                if (is_pos >= 7) {  /* illegal intensity position */
+                    modes[sfbi] &= ~Mad.I_STEREO;
+                    continue;
+                }
+
+                for (i = 0; i < n; ++i) {
+                    var left;
+
+                    left = xr[0][l + i];
+
+                    xr[0][l + i] = left * is_table[    is_pos];
+                    xr[1][l + i] = left * is_table[6 - is_pos];
+                }
+            }
+        }
+    }
+
+    /* middle/side stereo */
+
+    if (header.mode_extension & Mad.MS_STEREO) {
+        var invsqrt2;
+
+        header.flags |= Mad.Flag.MS_STEREO;
+
+        invsqrt2 = root_table[3 + -2];
+
+        for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
+            n = sfbwidth[sfbi];
+
+            if (modes[sfbi] != Mad.MS_STEREO)
+                continue;
+
+            for (i = 0; i < n; ++i) {
+                var m, s;
+
+                m = xr[0][l + i];
+                s = xr[1][l + i];
+
+                xr[0][l + i] = (m + s) * invsqrt2;  /* l = (m + s) / sqrt(2) */
+                xr[1][l + i] = (m - s) * invsqrt2;  /* r = (m - s) / sqrt(2) */
+            }
+        }
+    }
+
+    return Mad.Error.NONE;    
+};
Index: /gs3-extensions/web-audio/trunk/js-mad/script/mad.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/mad.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/mad.js	(revision 28388)
@@ -0,0 +1,175 @@
+
+
+
+/* Namespaces */
+Mad = {};
+Mad.ArrayBuffers = {};
+Mad.BinaryStrings = {};
+
+Mad.DEBUG = window.JSMAD_DEBUG || false;
+
+Mad.recoverable = function (error) {
+    return (error & 0xff00) != 0;
+};
+
+// change this value for testing
+Mad.enforceBinaryString = false;
+
+if (!Mad.enforceBinaryString && typeof(ArrayBuffer) === 'function' && typeof(Uint8Array) === 'function') {
+    Mad.DEBUG && console.log("JsMad: Using ArrayBuffer");
+    Mad.Storage = {
+        backing: 'arraybuffer',
+
+        newBuffer: function (length) {
+            return new Uint8Array(length);
+        },
+
+        memcpy: function (dst, dstOffset, pSrc, srcOffset, length) {
+            while (pSrc.parentStream) {
+                srcOffset += pSrc.start;
+                pSrc = pSrc.parentStream;
+            }
+            var src = pSrc.subarray ? pSrc : pSrc.buffer;
+            var subarr = src.subarray(srcOffset, srcOffset + length);
+
+            // oh my, memcpy actually exists in JavaScript?
+            dst.set(subarr, dstOffset);
+            return dst;
+        }
+    };
+    Mad.FileStream = function (file, callback) {
+        return new Mad.ArrayBuffers.FileStream(file, callback);
+    }
+    Mad.AjaxStream = function (file, callback) {
+        return new Mad.ArrayBuffers.AjaxStream(file, callback);
+    }
+} else {
+    console.log("JsMad: Using BinaryString");
+    Mad.Storage = {
+        backing: 'binarystring',
+
+        newBuffer: function (length) {
+            return Mad.mul("\0", length);
+        },
+
+        memcpy: function (dst, dstOffset, src, srcOffset, length) {
+            // this is a pretty weird memcpy actually - it constructs a new version of dst, because we have no other way to do it
+            return dst.slice(0, dstOffset) + src.slice(srcOffset, srcOffset + length) + dst.slice(dstOffset + length);
+        }
+    };
+    Mad.FileStream = function (file, callback) {
+        return new Mad.BinaryStrings.FileStream(file, callback);
+    }
+    Mad.AjaxStream = function (file, callback) {
+        return new Mad.BinaryStrings.AjaxStream(file, callback);
+    }
+}
+
+// credit: http://blog.stevenlevithan.com/archives/fast-string-multiply
+Mad.mul = function (str, num) {
+        var i = Math.ceil(Math.log(num) / Math.LN2), res = str;
+        do {
+            res += res;
+        } while (0 < --i);
+        return res.slice(0, str.length * num);
+};
+
+Mad.rshift = function (num, bits) {
+    return Math.floor(num / Math.pow(2, bits));
+};
+
+Mad.lshiftU32 = function (num, bits) {
+    return Mad.bitwiseAnd(Mad.lshift(num, bits), 4294967295 /* 2^32 - 1 */);
+};
+
+Mad.lshift = function (num, bits) {
+    return num * Math.pow(2, bits);
+};
+
+Mad.bitwiseOr = function (a, b) {
+    var w = 2147483648; // 2^31
+
+    var aHI = (a / w) << 0;
+    var aLO = a % w;
+    var bHI = (b / w) << 0;
+    var bLO = b % w;
+
+    return ((aHI | bHI) * w + (aLO | bLO));
+};
+
+Mad.bitwiseAnd = function (a, b) {
+    var w = 2147483648; // 2^31
+
+    var aHI = (a / w) << 0;
+    var aLO = a % w;
+    var bHI = (b / w) << 0;
+    var bLO = b % w;
+
+    return ((aHI & bHI) * w + (aLO & bLO));
+};
+
+/* Simple JavaScript Inheritance
+ * By John Resig http://ejohn.org/
+ * MIT Licensed.
+ */
+// Inspired by base2 and Prototype
+(function(){
+  var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
+  // The base Class implementation (does nothing)
+  this.Class = function(){};
+  
+  // Create a new Class that inherits from this class
+  Class.extend = function(prop) {
+    var _super = this.prototype;
+    
+    // Instantiate a base class (but only create the instance,
+    // don't run the init constructor)
+    initializing = true;
+    var prototype = new this();
+    initializing = false;
+    
+    // Copy the properties over onto the new prototype
+    for (var name in prop) {
+      // Check if we're overwriting an existing function
+      prototype[name] = typeof prop[name] === "function" && 
+        typeof _super[name] === "function" && fnTest.test(prop[name]) ?
+        (function(name, fn){
+          return function() {
+            var tmp = this._super;
+            
+            // Add a new ._super() method that is the same method
+            // but on the super-class
+            this._super = _super[name];
+            
+            // The method only need to be bound temporarily, so we
+            // remove it when we're done executing
+            var ret = fn.apply(this, arguments);        
+            this._super = tmp;
+            
+            return ret;
+          };
+        })(name, prop[name]) :
+        prop[name];
+    }
+    
+    // The dummy class constructor
+    function Class() {
+      // All construction is actually done in the init method
+      if ( !initializing && this.init )
+        this.init.apply(this, arguments);
+    }
+    
+    // Populate our constructed prototype object
+    Class.prototype = prototype;
+    
+    // Enforce the constructor to be what we expect
+    Class.prototype.constructor = Class;
+
+    // And make this class extendable
+    Class.extend = arguments.callee;
+    
+    return Class;
+  };
+})();
+
+
Index: /gs3-extensions/web-audio/trunk/js-mad/script/main-jsmad.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/main-jsmad.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/main-jsmad.js	(revision 28388)
@@ -0,0 +1,219 @@
+
+var JsMadProcessing = function(audio_id,active_workflow) {
+
+    this.audio_id = audio_id;
+    this.active_workflow = active_workflow || null;
+  
+    var url = $('#'+audio_id).attr("href");
+    console.info("JsMadProcessing::JsMadProcessing() retrieving over AJAX: " + url);
+
+    var stream = new Mad.AjaxStream(url);
+
+    var that = this;
+
+    var channels = 2; // stereo
+    var rate = 44100; // 44.1 Khz
+    //var rate = 48000; // 44.1 Khz
+    //var bufsize = 65536 * 4096; 
+    //var bufsize = 65536 * 1024; 
+    //var bufsize = 2048;
+    var bufsize = 1024 * 8;
+
+    //this.dev = Sink(function(buffer) {that.refill(buffer)}, channels, bufsize, rate);
+    //console.log("*** got sample rate of: " + this.dev.sampleRate);
+
+
+    this.playBufferStore = new Array();
+
+    stream.requestAbsolute(1 * 1024, function() { that.streamCallback(stream) });
+
+}
+
+
+
+
+JsMadProcessing.prototype.streamCallback = function(stream) {
+
+
+    var mp3 = new Mad.MP3File(stream);
+    var mpeg = mp3.getMpegStream();
+        
+    //var howmuch = 10000; 
+    var ss1 = Date.now();
+
+    var synth = new Mad.Synth();
+    var frame = new Mad.Frame();
+	
+    frame = Mad.Frame.decode(frame, mpeg); // decode first frame to establish num channels and samplerate
+    var num_channels = frame.header.nchannels();
+    var sampleRate = frame.header.samplerate;
+
+    console.info("JsMadProcessing::streamCallback() decoding URL retrieved MP3 with " + num_channels + " channels, samplerate = " + sampleRate);
+
+
+    var that = this;
+
+    var numSamples = 0;
+
+    synth.frame(frame);    
+    var prev_synth_frame_len = synth.pcm.samples[0].length; 
+    console.info("JsMadProcesing.streamCallback(): synth frame length (initial frame) = " + prev_synth_frame_len);
+
+    var i=1; // already processed one frame
+
+    var overflowBuffer = null;
+
+    console.log("*** main-jsmad.js::stream_callback(): hardwiring workflow buffer size to 2048");
+
+    var speedup_batch_limit;
+    var speedup_pause;
+    
+    if (BrowserDetect.browser == "Firefox") {
+	speedup_batch_limit = 100;
+	speedup_pause = 0;
+    }
+    else {
+	// e.g. Chrome 
+	// => the following values played more nicely with letting DSP playback operate straightaway 
+	//    i.e. when jsmad is still working its way through the frames
+	
+	speedup_batch_limit = 10;
+	speedup_pause = 2;
+
+	//speedup_batch_limit = 100;
+	//speedup_pause = 0;
+
+	console.log("*** Running JsMadProcessing with: batch limit = " + speedup_batch_limit 
+		    + ", pause = " + speedup_pause + " msecs");
+    }
+
+
+    (function() {
+
+	var more_frames = 1;
+	try {
+
+	    var speedup_i = 0;
+
+	    while (speedup_i < speedup_batch_limit) { // Decode 100 frames at a time, before setTimeout break
+
+		frame = Mad.Frame.decode(frame, mpeg);
+		synth.frame(frame);
+	    
+		var synth_frame_len = synth.pcm.samples[0].length; 
+
+		var playBuffer = null;
+		var pbp = 0; // pbp = play buffer pos
+
+		if (overflowBuffer != null) {
+		    playBuffer = new Float32Array(overflowBuffer.length+(synth_frame_len*num_channels));
+		    playBuffer.set(overflowBuffer);
+		    pbp = overflowBuffer.length;
+		    overflowBuffer = null;
+		}
+		else {
+		    playBuffer = new Float32Array(synth_frame_len*num_channels);
+		    pbp = 0;
+		}
+
+				
+		for (var sfp=0; sfp<synth_frame_len; sfp++) {
+		    for (var c=0; c<num_channels; c++) {
+			playBuffer[pbp] = synth.pcm.samples[c][sfp];
+			pbp++;
+		    }
+		}
+		
+		numSamples += synth_frame_len;
+
+		// uncomment the following line if you want to hear speeded-up playback as it works through the audio file
+		//var written = pannedPlayback.mozWriteAudio(playBuffer);
+
+
+		if (synth_frame_len != prev_synth_frame_len) {
+		    console.log("*** new synth frame len (frame num = " + i + "): len = " + synth_frame_len);
+		    prev_synth_frame_len = synth_frame_len;
+		}
+
+		if (that.active_workflow != null) {
+		    // Send the data into the Javascript DSP workflow
+
+		    // Note: workflow geared to 2048 samples at a time
+
+		    var wi = 0;
+
+		    var playBufferLen = playBuffer.length;
+		    while (wi<playBuffer.length) {
+
+			if (wi+2048<=playBufferLen) {			    
+			    var workflowBuffer = playBuffer.subarray(wi,wi+2048);
+			    that.active_workflow.pumpDataHead("rawInput",workflowBuffer);
+			    that.playBufferStore.push(workflowBuffer);
+			}
+			else {
+			    // tail end => set up in overflow buffer
+			    var workflowBufferTail = playBuffer.subarray(wi);
+
+			    overflowBuffer = new Float32Array(playBufferLen-wi);
+			    overflowBuffer.set(workflowBufferTail);
+
+			}
+			wi += 2048;
+		    }
+
+
+		    // Old approach: pump data in, in frames that are set by webAudioContext
+		    //that.active_workflow.pumpDataHead("rawInput",playBuffer);
+		}
+
+		speedup_i++;
+		i++;
+	    }
+	    
+	}
+	catch(err) {
+	    if (err == "Header decoding failed") {
+		console.info("JsMadProcessing::streamCallack() decoded " + i + " frames");
+	    }
+	    else {
+		console.error(err);
+	    }
+	    more_frames = 0;
+	}
+
+	if (more_frames) {
+	    setTimeout(arguments.callee,speedup_pause); // even a delay of '0' gives the browser thread a break
+	}
+	else {
+	    var ss2 = Date.now();
+
+	    var song_duration = numSamples / sampleRate;
+	    var speedup_duration = (ss2 - ss1)/1000;
+
+	    var speedup_factor = song_duration / speedup_duration;
+	    //console.log("Computed song duration: " + song_duration + " secs");
+	    console.info("JsMad processing done in " + speedup_duration + " secs (a speed factor of " + speedup_factor + ")");
+	}
+    	
+    })();
+	
+}
+
+
+JsMadProcessing.prototype.refill = function(buffer) 
+{
+    console.log("refill called, asking for size = " + buffer.length);
+
+    var buffer_len = buffer.length;
+    var buffer_pos = 0;
+
+    while ((this.playBufferStore.length>0) && (buffer_pos<buffer_len)) {
+
+	var playBuffer = this.playBufferStore.shift();
+	buffer.set(playBuffer,buffer_pos);
+
+	buffer_pos += playBuffer.length;
+    }
+
+
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/script/mp3file.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/mp3file.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/mp3file.js	(revision 28388)
@@ -0,0 +1,50 @@
+Mad.MP3File = function(stream) {
+    this.stream = stream;
+}
+
+Mad.MP3File.prototype.getID3v2Header = function() {
+    if (this.stream.strEquals(0, "ID3")) {
+        var headerStream = this.stream.substream(0, 10);
+        
+        headerStream.seek(3); // 'ID3'
+        
+        var major = headerStream.readU8();
+        var minor = headerStream.readU8();
+        
+        var flags = headerStream.readU8();
+        
+        var length = headerStream.readSyncInteger();
+        
+        return { version: '2.' + major + '.' + minor, major: major, minor: minor, flags: flags, length: length };
+    } else {
+        return null;
+    }
+}
+
+Mad.MP3File.prototype.getID3v2Stream = function() {
+    var header = this.getID3v2Header();
+    
+    if (header) {
+        if (header.major > 2) {
+            return new Mad.ID3v23Stream(header, this.stream.substream(10, header.length));
+        } else {
+            return new Mad.ID3v22Stream(header, this.stream.substream(10, header.length));
+        }
+    } else {
+        return null;
+    }
+}
+
+Mad.MP3File.prototype.getMpegStream = function() {
+    var id3header = this.getID3v2Header();
+    
+    if (id3header) {
+        var offset = 10 + id3header.length;
+    } else {
+        var offset = 0;
+    }
+    
+    var length = this.stream.length - offset;
+
+    return new Mad.Stream(this.stream.substream(offset), length);   
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/script/player.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/player.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/player.js	(revision 28388)
@@ -0,0 +1,151 @@
+
+Mad.Player = function (stream) {
+    this.stream = stream;
+    this.mp3 = new Mad.MP3File(stream);
+    this.id3  = this.mp3.getID3v2Stream();
+    this.mpeg = this.mp3.getMpegStream();
+
+    this.totalLength = this.id3 && ~~this.id3.toHash()['Length'];
+
+    // default onProgress handler
+    this.onProgress = function (playtime, total, preloaded) {
+        console.log("playtime = " + playtime + " / " + total + ", preloaded = " + preloaded);
+    }
+};
+
+// Create a device.
+Mad.Player.prototype.createDevice = function() {
+    var synth = new Mad.Synth();
+    this.frame = new Mad.Frame();
+    this.frame = Mad.Frame.decode(this.frame, this.mpeg);
+    if (this.frame === null) {
+        if (this.mpeg.error === Mad.Error.BUFLEN) {
+            console.log("End of file!");
+        }
+
+        console.log("First error! code = " + this.mpeg.error + ", recoverable ? = " + Mad.recoverable(this.mpeg.error));
+        return;
+    }
+
+    this.channelCount = this.frame.header.nchannels();
+    this.sampleRate = this.frame.header.samplerate;
+
+    console.log("this.playing " + this.channelCount + " channels, samplerate = " + this.sampleRate + " audio, mode " + this.frame.header.mode);
+
+    this.offset = 0;
+    this.absoluteFrameIndex = 0;
+    synth.frame(this.frame);
+
+    this.lastRebuffer = Date.now();
+    this.playing = false;
+    this.progress();
+
+    var self = this;	
+    var MAX_FRAMES_IN_BUFFER = 40;
+
+    this.refill = function (sampleBuffer) {
+        //console.log("*** refill(): delta = " + (Date.now() - self.lastRebuffer) + ", asked for " + sampleBuffer.length);
+        self.lastRebuffer = Date.now();
+
+        if(!self.playing) return; // empty sampleBuffer, no prob
+	
+        var index = 0;
+
+        while (index < sampleBuffer.length) {
+            for (var i = 0; i < self.channelCount; ++i) {
+                sampleBuffer[index++] = synth.pcm.samples[i][self.offset];
+            }
+
+            self.offset++;
+
+            if (self.offset >= synth.pcm.samples[0].length) {
+                self.offset = 0;
+
+                self.frame = Mad.Frame.decode(self.frame, self.mpeg);
+                if (self.frame === null) {
+                    if (self.stream.error === Mad.Error.BUFLEN) {
+                        console.log("End of file!");
+                    }
+                    console.log("Error! code = " + self.mpeg.error);
+                    self.playing = false;
+                    self.onProgress(1.0, 1.0, 1.0);
+                    self.dev.kill();
+                } else {
+                    synth.frame(self.frame);
+                    self.absoluteFrameIndex++;
+                }
+            }
+        }
+
+        if (self.onPostProcessing) {
+            self.onPostProcessing.apply(this, arguments);
+        }
+
+    };
+
+    this.reinitDevice();
+};
+
+Mad.Player.prototype.reinitDevice = function() {
+    if(this.dev) this.dev.kill();
+    // The default value is the safest
+    var bufferSize = null;
+    var self = this;
+
+    var temp = Sink.sinks.moz.prototype.interval;
+    Sink.sinks.moz.prototype.interval = 100;
+
+    this.dev = Sink(function(){
+            return self.refill.apply(this, arguments);
+    }, this.channelCount, bufferSize, this.sampleRate);
+
+    this.dev.on && this.dev.on('error', function (e) {
+        console.log(e);
+    });
+
+    Sink.sinks.moz.prototype.interval = temp;
+}
+
+Mad.Player.prototype.setPlaying = function(playing) {
+    this.playing = playing;
+    if(playing) {
+        this.onPlay();
+    } else {
+        this.onPause();
+    }
+}
+
+Mad.Player.prototype.destroy = function() {
+    clearTimeout(this.progressTimeout);
+    if(this.dev) {
+        this.dev.kill();
+    }
+}
+
+Mad.Player.prototype.progress = function () {
+    var delta = Date.now() - this.lastRebuffer;
+
+    var playtime = ((this.absoluteFrameIndex * 1152 + this.offset) / this.sampleRate) + delta / 1000.0;
+    console.log("*** progress(): delta = " + delta + ", contentLength = " + this.stream.contentLength + ", this.offset = " + this.mpeg.this_frame);
+    var total = this.totalLength ? this.totalLength : playtime * this.stream.contentLength / this.mpeg.this_frame;
+    var preloaded = this.stream.amountRead / this.stream.contentLength;
+    //console.log("*** amountRead = " + this.stream.amountRead + ", preloaded = " + preloaded);
+    this.onProgress(playtime, total, preloaded);
+
+    var that = this;
+    var nextCall = function() { that.progress(); };
+    this.progressTimeout = setTimeout(nextCall, 250);
+}
+
+Mad.Player.fromFile = function (file, callback) {
+    new Mad.FileStream(file, function (stream) {
+            callback(new Mad.Player(stream));
+            });
+};
+
+Mad.Player.fromURL = function (url, callback) {
+    var stream = new Mad.AjaxStream(url);
+    stream.requestAbsolute(1 * 1024, function () {
+            callback(new Mad.Player(stream));
+            });
+};
Index: /gs3-extensions/web-audio/trunk/js-mad/script/require.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/require.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/require.js	(revision 28388)
@@ -0,0 +1,35 @@
+/*
+ RequireJS 2.1.2 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ Available via the MIT or new BSD license.
+ see: http://github.com/jrburke/requirejs for details
+*/
+var requirejs,require,define;
+(function(Y){function H(b){return"[object Function]"===L.call(b)}function I(b){return"[object Array]"===L.call(b)}function x(b,c){if(b){var d;for(d=0;d<b.length&&(!b[d]||!c(b[d],d,b));d+=1);}}function M(b,c){if(b){var d;for(d=b.length-1;-1<d&&(!b[d]||!c(b[d],d,b));d-=1);}}function r(b,c){return da.call(b,c)}function i(b,c){return r(b,c)&&b[c]}function E(b,c){for(var d in b)if(r(b,d)&&c(b[d],d))break}function Q(b,c,d,i){c&&E(c,function(c,h){if(d||!r(b,h))i&&"string"!==typeof c?(b[h]||(b[h]={}),Q(b[h],
+c,d,i)):b[h]=c});return b}function t(b,c){return function(){return c.apply(b,arguments)}}function Z(b){if(!b)return b;var c=Y;x(b.split("."),function(b){c=c[b]});return c}function J(b,c,d,i){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=i;d&&(c.originalError=d);return c}function ea(b){function c(a,g,v){var e,n,b,c,d,j,f,h=g&&g.split("/");e=h;var l=m.map,k=l&&l["*"];if(a&&"."===a.charAt(0))if(g){e=i(m.pkgs,g)?h=[g]:h.slice(0,h.length-1);g=a=e.concat(a.split("/"));
+for(e=0;g[e];e+=1)if(n=g[e],"."===n)g.splice(e,1),e-=1;else if(".."===n)if(1===e&&(".."===g[2]||".."===g[0]))break;else 0<e&&(g.splice(e-1,2),e-=2);e=i(m.pkgs,g=a[0]);a=a.join("/");e&&a===g+"/"+e.main&&(a=g)}else 0===a.indexOf("./")&&(a=a.substring(2));if(v&&(h||k)&&l){g=a.split("/");for(e=g.length;0<e;e-=1){b=g.slice(0,e).join("/");if(h)for(n=h.length;0<n;n-=1)if(v=i(l,h.slice(0,n).join("/")))if(v=i(v,b)){c=v;d=e;break}if(c)break;!j&&(k&&i(k,b))&&(j=i(k,b),f=e)}!c&&j&&(c=j,d=f);c&&(g.splice(0,d,
+c),a=g.join("/"))}return a}function d(a){z&&x(document.getElementsByTagName("script"),function(g){if(g.getAttribute("data-requiremodule")===a&&g.getAttribute("data-requirecontext")===j.contextName)return g.parentNode.removeChild(g),!0})}function y(a){var g=i(m.paths,a);if(g&&I(g)&&1<g.length)return d(a),g.shift(),j.require.undef(a),j.require([a]),!0}function f(a){var g,b=a?a.indexOf("!"):-1;-1<b&&(g=a.substring(0,b),a=a.substring(b+1,a.length));return[g,a]}function h(a,g,b,e){var n,u,d=null,h=g?g.name:
+null,l=a,m=!0,k="";a||(m=!1,a="_@r"+(L+=1));a=f(a);d=a[0];a=a[1];d&&(d=c(d,h,e),u=i(p,d));a&&(d?k=u&&u.normalize?u.normalize(a,function(a){return c(a,h,e)}):c(a,h,e):(k=c(a,h,e),a=f(k),d=a[0],k=a[1],b=!0,n=j.nameToUrl(k)));b=d&&!u&&!b?"_unnormalized"+(M+=1):"";return{prefix:d,name:k,parentMap:g,unnormalized:!!b,url:n,originalName:l,isDefine:m,id:(d?d+"!"+k:k)+b}}function q(a){var g=a.id,b=i(k,g);b||(b=k[g]=new j.Module(a));return b}function s(a,g,b){var e=a.id,n=i(k,e);if(r(p,e)&&(!n||n.defineEmitComplete))"defined"===
+g&&b(p[e]);else q(a).on(g,b)}function C(a,g){var b=a.requireModules,e=!1;if(g)g(a);else if(x(b,function(g){if(g=i(k,g))g.error=a,g.events.error&&(e=!0,g.emit("error",a))}),!e)l.onError(a)}function w(){R.length&&(fa.apply(F,[F.length-1,0].concat(R)),R=[])}function A(a,g,b){var e=a.map.id;a.error?a.emit("error",a.error):(g[e]=!0,x(a.depMaps,function(e,c){var d=e.id,h=i(k,d);h&&(!a.depMatched[c]&&!b[d])&&(i(g,d)?(a.defineDep(c,p[d]),a.check()):A(h,g,b))}),b[e]=!0)}function B(){var a,g,b,e,n=(b=1E3*m.waitSeconds)&&
+j.startTime+b<(new Date).getTime(),c=[],h=[],f=!1,l=!0;if(!T){T=!0;E(k,function(b){a=b.map;g=a.id;if(b.enabled&&(a.isDefine||h.push(b),!b.error))if(!b.inited&&n)y(g)?f=e=!0:(c.push(g),d(g));else if(!b.inited&&(b.fetched&&a.isDefine)&&(f=!0,!a.prefix))return l=!1});if(n&&c.length)return b=J("timeout","Load timeout for modules: "+c,null,c),b.contextName=j.contextName,C(b);l&&x(h,function(a){A(a,{},{})});if((!n||e)&&f)if((z||$)&&!U)U=setTimeout(function(){U=0;B()},50);T=!1}}function D(a){r(p,a[0])||
+q(h(a[0],null,!0)).init(a[1],a[2])}function G(a){var a=a.currentTarget||a.srcElement,b=j.onScriptLoad;a.detachEvent&&!V?a.detachEvent("onreadystatechange",b):a.removeEventListener("load",b,!1);b=j.onScriptError;(!a.detachEvent||V)&&a.removeEventListener("error",b,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function K(){var a;for(w();F.length;){a=F.shift();if(null===a[0])return C(J("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));D(a)}}var T,W,j,N,U,m={waitSeconds:7,
+baseUrl:"./",paths:{},pkgs:{},shim:{},map:{},config:{}},k={},X={},F=[],p={},S={},L=1,M=1;N={require:function(a){return a.require?a.require:a.require=j.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?a.exports:a.exports=p[a.map.id]={}},module:function(a){return a.module?a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){return m.config&&i(m.config,a.map.id)||{}},exports:p[a.map.id]}}};W=function(a){this.events=i(X,a.id)||{};this.map=a;this.shim=
+i(m.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};W.prototype={init:function(a,b,c,e){e=e||{};if(!this.inited){this.factory=b;if(c)this.on("error",c);else this.events.error&&(c=t(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=c;this.inited=!0;this.ignore=e.ignore;e.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=
+b)},fetch:function(){if(!this.fetched){this.fetched=!0;j.startTime=(new Date).getTime();var a=this.map;if(this.shim)j.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],t(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=this.map.url;S[a]||(S[a]=!0,j.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,b,c=this.map.id;b=this.depExports;var e=this.exports,n=this.factory;
+if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(1>this.depCount&&!this.defined){if(H(n)){if(this.events.error)try{e=j.execCb(c,n,b,e)}catch(d){a=d}else e=j.execCb(c,n,b,e);this.map.isDefine&&((b=this.module)&&void 0!==b.exports&&b.exports!==this.exports?e=b.exports:void 0===e&&this.usingExports&&(e=this.exports));if(a)return a.requireMap=this.map,a.requireModules=[this.map.id],a.requireType="define",C(this.error=a)}else e=n;this.exports=e;if(this.map.isDefine&&
+!this.ignore&&(p[c]=e,l.onResourceLoad))l.onResourceLoad(j,this.map,this.depMaps);delete k[c];this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,d=h(a.prefix);this.depMaps.push(d);s(d,"defined",t(this,function(e){var n,d;d=this.map.name;var v=this.map.parentMap?this.map.parentMap.name:null,f=j.makeRequire(a.parentMap,{enableBuildCallback:!0,
+skipMap:!0});if(this.map.unnormalized){if(e.normalize&&(d=e.normalize(d,function(a){return c(a,v,!0)})||""),e=h(a.prefix+"!"+d,this.map.parentMap),s(e,"defined",t(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=i(k,e.id)){this.depMaps.push(e);if(this.events.error)d.on("error",t(this,function(a){this.emit("error",a)}));d.enable()}}else n=t(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),n.error=t(this,function(a){this.inited=!0;this.error=
+a;a.requireModules=[b];E(k,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&delete k[a.map.id]});C(a)}),n.fromText=t(this,function(e,c){var d=a.name,u=h(d),v=O;c&&(e=c);v&&(O=!1);q(u);r(m.config,b)&&(m.config[d]=m.config[b]);try{l.exec(e)}catch(k){throw Error("fromText eval for "+d+" failed: "+k);}v&&(O=!0);this.depMaps.push(u);j.completeLoad(d);f([d],n)}),e.load(a.name,f,n,m)}));j.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){this.enabling=this.enabled=!0;x(this.depMaps,t(this,function(a,
+b){var c,e;if("string"===typeof a){a=h(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=i(N,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;s(a,"defined",t(this,function(a){this.defineDep(b,a);this.check()}));this.errback&&s(a,"error",this.errback)}c=a.id;e=k[c];!r(N,c)&&(e&&!e.enabled)&&j.enable(a,this)}));E(this.pluginMaps,t(this,function(a){var b=i(k,a.id);b&&!b.enabled&&j.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=
+this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){x(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};j={config:m,contextName:b,registry:k,defined:p,urlFetched:S,defQueue:F,Module:W,makeModuleMap:h,nextTick:l.nextTick,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=m.pkgs,c=m.shim,e={paths:!0,config:!0,map:!0};E(a,function(a,b){e[b]?"map"===b?Q(m[b],a,!0,!0):Q(m[b],a,!0):m[b]=a});a.shim&&(E(a.shim,function(a,
+b){I(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=j.makeShimExports(a);c[b]=a}),m.shim=c);a.packages&&(x(a.packages,function(a){a="string"===typeof a?{name:a}:a;b[a.name]={name:a.name,location:a.location||a.name,main:(a.main||"main").replace(ga,"").replace(aa,"")}}),m.pkgs=b);E(k,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=h(b))});if(a.deps||a.callback)j.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(Y,arguments));
+return b||a.exports&&Z(a.exports)}},makeRequire:function(a,d){function f(e,c,u){var i,m;d.enableBuildCallback&&(c&&H(c))&&(c.__requireJsBuild=!0);if("string"===typeof e){if(H(c))return C(J("requireargs","Invalid require call"),u);if(a&&r(N,e))return N[e](k[a.id]);if(l.get)return l.get(j,e,a);i=h(e,a,!1,!0);i=i.id;return!r(p,i)?C(J("notloaded",'Module name "'+i+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):p[i]}K();j.nextTick(function(){K();m=q(h(null,a));m.skipMap=d.skipMap;
+m.init(e,c,u,{enabled:!0});B()});return f}d=d||{};Q(f,{isBrowser:z,toUrl:function(b){var d=b.lastIndexOf("."),g=null;-1!==d&&(g=b.substring(d,b.length),b=b.substring(0,d));return j.nameToUrl(c(b,a&&a.id,!0),g)},defined:function(b){return r(p,h(b,a,!1,!0).id)},specified:function(b){b=h(b,a,!1,!0).id;return r(p,b)||r(k,b)}});a||(f.undef=function(b){w();var c=h(b,a,!0),d=i(k,b);delete p[b];delete S[c.url];delete X[b];d&&(d.events.defined&&(X[b]=d.events),delete k[b])});return f},enable:function(a){i(k,
+a.id)&&q(a).enable()},completeLoad:function(a){var b,c,d=i(m.shim,a)||{},h=d.exports;for(w();F.length;){c=F.shift();if(null===c[0]){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);D(c)}c=i(k,a);if(!b&&!r(p,a)&&c&&!c.inited){if(m.enforceDefine&&(!h||!Z(h)))return y(a)?void 0:C(J("nodefine","No define call for "+a,null,[a]));D([a,d.deps||[],d.exportsFn])}B()},nameToUrl:function(a,b){var c,d,h,f,j,k;if(l.jsExtRegExp.test(a))f=a+(b||"");else{c=m.paths;d=m.pkgs;f=a.split("/");for(j=f.length;0<j;j-=1)if(k=
+f.slice(0,j).join("/"),h=i(d,k),k=i(c,k)){I(k)&&(k=k[0]);f.splice(0,j,k);break}else if(h){c=a===h.name?h.location+"/"+h.main:h.location;f.splice(0,j,c);break}f=f.join("/");f+=b||(/\?/.test(f)?"":".js");f=("/"===f.charAt(0)||f.match(/^[\w\+\.\-]+:/)?"":m.baseUrl)+f}return m.urlArgs?f+((-1===f.indexOf("?")?"?":"&")+m.urlArgs):f},load:function(a,b){l.load(j,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if("load"===a.type||ha.test((a.currentTarget||a.srcElement).readyState))P=
+null,a=G(a),j.completeLoad(a.id)},onScriptError:function(a){var b=G(a);if(!y(b.id))return C(J("scripterror","Script error",a,[b.id]))}};j.require=j.makeRequire();return j}var l,w,A,D,s,G,P,K,ba,ca,ia=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,ja=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,aa=/\.js$/,ga=/^\.\//;w=Object.prototype;var L=w.toString,da=w.hasOwnProperty,fa=Array.prototype.splice,z=!!("undefined"!==typeof window&&navigator&&document),$=!z&&"undefined"!==typeof importScripts,ha=z&&
+"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,V="undefined"!==typeof opera&&"[object Opera]"===opera.toString(),B={},q={},R=[],O=!1;if("undefined"===typeof define){if("undefined"!==typeof requirejs){if(H(requirejs))return;q=requirejs;requirejs=void 0}"undefined"!==typeof require&&!H(require)&&(q=require,require=void 0);l=requirejs=function(b,c,d,y){var f,h="_";!I(b)&&"string"!==typeof b&&(f=b,I(c)?(b=c,c=d,d=y):b=[]);f&&f.context&&(h=f.context);(y=i(B,h))||(y=B[h]=l.s.newContext(h));
+f&&y.configure(f);return y.require(b,c,d)};l.config=function(b){return l(b)};l.nextTick="undefined"!==typeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=l);l.version="2.1.2";l.jsExtRegExp=/^\/|:|\?|\.js$/;l.isBrowser=z;w=l.s={contexts:B,newContext:ea};l({});x(["toUrl","undef","defined","specified"],function(b){l[b]=function(){var c=B._;return c.require[b].apply(c,arguments)}});if(z&&(A=w.head=document.getElementsByTagName("head")[0],D=document.getElementsByTagName("base")[0]))A=
+w.head=D.parentNode;l.onError=function(b){throw b;};l.load=function(b,c,d){var i=b&&b.config||{},f;if(z)return f=i.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script"),f.type=i.scriptType||"text/javascript",f.charset="utf-8",f.async=!0,f.setAttribute("data-requirecontext",b.contextName),f.setAttribute("data-requiremodule",c),f.attachEvent&&!(f.attachEvent.toString&&0>f.attachEvent.toString().indexOf("[native code"))&&!V?(O=!0,f.attachEvent("onreadystatechange",
+b.onScriptLoad)):(f.addEventListener("load",b.onScriptLoad,!1),f.addEventListener("error",b.onScriptError,!1)),f.src=d,K=f,D?A.insertBefore(f,D):A.appendChild(f),K=null,f;$&&(importScripts(d),b.completeLoad(c))};z&&M(document.getElementsByTagName("script"),function(b){A||(A=b.parentNode);if(s=b.getAttribute("data-main"))return q.baseUrl||(G=s.split("/"),ba=G.pop(),ca=G.length?G.join("/")+"/":"./",q.baseUrl=ca,s=ba),s=s.replace(aa,""),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var i,
+f;"string"!==typeof b&&(d=c,c=b,b=null);I(c)||(d=c,c=[]);!c.length&&H(d)&&d.length&&(d.toString().replace(ia,"").replace(ja,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c));if(O){if(!(i=K))P&&"interactive"===P.readyState||M(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return P=b}),i=P;i&&(b||(b=i.getAttribute("data-requiremodule")),f=B[i.getAttribute("data-requirecontext")])}(f?f.defQueue:R).push([b,c,d])};define.amd=
+{jQuery:!0};l.exec=function(b){return eval(b)};l(q)}})(this);
Index: /gs3-extensions/web-audio/trunk/js-mad/script/rq_table.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/rq_table.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/rq_table.js	(revision 28388)
@@ -0,0 +1,8734 @@
+/*
+ * This is the lookup table used to compute x^(4/3) for Layer III
+ * requantization. To maintain the best possible accuracy, the value is
+ * stored as a normalized mantissa with exponent. The requantization
+ * algorithm recombines these parts with appropriate scaling.
+ */
+
+/*
+ * table for requantization
+ *
+ * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3)
+ */
+ 
+Mad.rq_table /* 8207 */ = [
+  /*    0 */  [ 0.000000000,  0 ],
+  /*    1 */  [ 0.250000000,  2 ],
+  /*    2 */  [ 0.314980262,  3 ],
+  /*    3 */  [ 0.270421794,  4 ],
+  /*    4 */  [ 0.396850263,  4 ],
+  /*    5 */  [ 0.267183742,  5 ],
+  /*    6 */  [ 0.340710111,  5 ],
+  /*    7 */  [ 0.418453696,  5 ],
+  /*    8 */  [ 0.250000000,  6 ],
+  /*    9 */  [ 0.292511788,  6 ],
+  /*   10 */  [ 0.336630420,  6 ],
+  /*   11 */  [ 0.382246578,  6 ],
+  /*   12 */  [ 0.429267841,  6 ],
+  /*   13 */  [ 0.477614858,  6 ],
+  /*   14 */  [ 0.263609310,  7 ],
+  /*   15 */  [ 0.289009227,  7 ],
+
+  /*   16 */  [ 0.314980262,  7 ],
+  /*   17 */  [ 0.341498336,  7 ],
+  /*   18 */  [ 0.368541759,  7 ],
+  /*   19 */  [ 0.396090870,  7 ],
+  /*   20 */  [ 0.424127753,  7 ],
+  /*   21 */  [ 0.452635998,  7 ],
+  /*   22 */  [ 0.481600510,  7 ],
+  /*   23 */  [ 0.255503674,  8 ],
+  /*   24 */  [ 0.270421794,  8 ],
+  /*   25 */  [ 0.285548607,  8 ],
+  /*   26 */  [ 0.300878507,  8 ],
+  /*   27 */  [ 0.316406250,  8 ],
+  /*   28 */  [ 0.332126919,  8 ],
+  /*   29 */  [ 0.348035890,  8 ],
+  /*   30 */  [ 0.364128809,  8 ],
+  /*   31 */  [ 0.380401563,  8 ],
+
+  /*   32 */  [ 0.396850263,  8 ],
+  /*   33 */  [ 0.413471222,  8 ],
+  /*   34 */  [ 0.430260942,  8 ],
+  /*   35 */  [ 0.447216097,  8 ],
+  /*   36 */  [ 0.464333519,  8 ],
+  /*   37 */  [ 0.481610189,  8 ],
+  /*   38 */  [ 0.499043224,  8 ],
+  /*   39 */  [ 0.258314934,  9 ],
+  /*   40 */  [ 0.267183742,  9 ],
+  /*   41 */  [ 0.276126771,  9 ],
+  /*   42 */  [ 0.285142811,  9 ],
+  /*   43 */  [ 0.294230696,  9 ],
+  /*   44 */  [ 0.303389310,  9 ],
+  /*   45 */  [ 0.312617576,  9 ],
+  /*   46 */  [ 0.321914457,  9 ],
+  /*   47 */  [ 0.331278957,  9 ],
+
+  /*   48 */  [ 0.340710111,  9 ],
+  /*   49 */  [ 0.350206992,  9 ],
+  /*   50 */  [ 0.359768701,  9 ],
+  /*   51 */  [ 0.369394372,  9 ],
+  /*   52 */  [ 0.379083164,  9 ],
+  /*   53 */  [ 0.388834268,  9 ],
+  /*   54 */  [ 0.398646895,  9 ],
+  /*   55 */  [ 0.408520284,  9 ],
+  /*   56 */  [ 0.418453696,  9 ],
+  /*   57 */  [ 0.428446415,  9 ],
+  /*   58 */  [ 0.438497744,  9 ],
+  /*   59 */  [ 0.448607009,  9 ],
+  /*   60 */  [ 0.458773552,  9 ],
+  /*   61 */  [ 0.468996735,  9 ],
+  /*   62 */  [ 0.479275937,  9 ],
+  /*   63 */  [ 0.489610555,  9 ],
+
+  /*   64 */  [ 0.250000000, 10 ],
+  /*   65 */  [ 0.255221850, 10 ],
+  /*   66 */  [ 0.260470548, 10 ],
+  /*   67 */  [ 0.265745823, 10 ],
+  /*   68 */  [ 0.271047409, 10 ],
+  /*   69 */  [ 0.276375048, 10 ],
+  /*   70 */  [ 0.281728487, 10 ],
+  /*   71 */  [ 0.287107481, 10 ],
+  /*   72 */  [ 0.292511788, 10 ],
+  /*   73 */  [ 0.297941173, 10 ],
+  /*   74 */  [ 0.303395408, 10 ],
+  /*   75 */  [ 0.308874267, 10 ],
+  /*   76 */  [ 0.314377532, 10 ],
+  /*   77 */  [ 0.319904987, 10 ],
+  /*   78 */  [ 0.325456423, 10 ],
+  /*   79 */  [ 0.331031635, 10 ],
+
+  /*   80 */  [ 0.336630420, 10 ],
+  /*   81 */  [ 0.342252584, 10 ],
+  /*   82 */  [ 0.347897931, 10 ],
+  /*   83 */  [ 0.353566275, 10 ],
+  /*   84 */  [ 0.359257429, 10 ],
+  /*   85 */  [ 0.364971213, 10 ],
+  /*   86 */  [ 0.370707448, 10 ],
+  /*   87 */  [ 0.376465960, 10 ],
+  /*   88 */  [ 0.382246578, 10 ],
+  /*   89 */  [ 0.388049134, 10 ],
+  /*   90 */  [ 0.393873464, 10 ],
+  /*   91 */  [ 0.399719406, 10 ],
+  /*   92 */  [ 0.405586801, 10 ],
+  /*   93 */  [ 0.411475493, 10 ],
+  /*   94 */  [ 0.417385331, 10 ],
+  /*   95 */  [ 0.423316162, 10 ],
+
+  /*   96 */  [ 0.429267841, 10 ],
+  /*   97 */  [ 0.435240221, 10 ],
+  /*   98 */  [ 0.441233161, 10 ],
+  /*   99 */  [ 0.447246519, 10 ],
+  /*  100 */  [ 0.453280160, 10 ],
+  /*  101 */  [ 0.459333946, 10 ],
+  /*  102 */  [ 0.465407744, 10 ],
+  /*  103 */  [ 0.471501425, 10 ],
+  /*  104 */  [ 0.477614858, 10 ],
+  /*  105 */  [ 0.483747918, 10 ],
+  /*  106 */  [ 0.489900479, 10 ],
+  /*  107 */  [ 0.496072418, 10 ],
+  /*  108 */  [ 0.251131807, 11 ],
+  /*  109 */  [ 0.254236974, 11 ],
+  /*  110 */  [ 0.257351652, 11 ],
+  /*  111 */  [ 0.260475783, 11 ],
+
+  /*  112 */  [ 0.263609310, 11 ],
+  /*  113 */  [ 0.266752177, 11 ],
+  /*  114 */  [ 0.269904329, 11 ],
+  /*  115 */  [ 0.273065710, 11 ],
+  /*  116 */  [ 0.276236269, 11 ],
+  /*  117 */  [ 0.279415952, 11 ],
+  /*  118 */  [ 0.282604707, 11 ],
+  /*  119 */  [ 0.285802482, 11 ],
+  /*  120 */  [ 0.289009227, 11 ],
+  /*  121 */  [ 0.292224893, 11 ],
+  /*  122 */  [ 0.295449429, 11 ],
+  /*  123 */  [ 0.298682788, 11 ],
+  /*  124 */  [ 0.301924921, 11 ],
+  /*  125 */  [ 0.305175781, 11 ],
+  /*  126 */  [ 0.308435322, 11 ],
+  /*  127 */  [ 0.311703498, 11 ],
+
+  /*  128 */  [ 0.314980262, 11 ],
+  /*  129 */  [ 0.318265572, 11 ],
+  /*  130 */  [ 0.321559381, 11 ],
+  /*  131 */  [ 0.324861647, 11 ],
+  /*  132 */  [ 0.328172327, 11 ],
+  /*  133 */  [ 0.331491377, 11 ],
+  /*  134 */  [ 0.334818756, 11 ],
+  /*  135 */  [ 0.338154423, 11 ],
+  /*  136 */  [ 0.341498336, 11 ],
+  /*  137 */  [ 0.344850455, 11 ],
+  /*  138 */  [ 0.348210741, 11 ],
+  /*  139 */  [ 0.351579152, 11 ],
+  /*  140 */  [ 0.354955651, 11 ],
+  /*  141 */  [ 0.358340200, 11 ],
+  /*  142 */  [ 0.361732758, 11 ],
+  /*  143 */  [ 0.365133291, 11 ],
+
+  /*  144 */  [ 0.368541759, 11 ],
+  /*  145 */  [ 0.371958126, 11 ],
+  /*  146 */  [ 0.375382356, 11 ],
+  /*  147 */  [ 0.378814413, 11 ],
+  /*  148 */  [ 0.382254261, 11 ],
+  /*  149 */  [ 0.385701865, 11 ],
+  /*  150 */  [ 0.389157191, 11 ],
+  /*  151 */  [ 0.392620204, 11 ],
+  /*  152 */  [ 0.396090870, 11 ],
+  /*  153 */  [ 0.399569155, 11 ],
+  /*  154 */  [ 0.403055027, 11 ],
+  /*  155 */  [ 0.406548452, 11 ],
+  /*  156 */  [ 0.410049398, 11 ],
+  /*  157 */  [ 0.413557833, 11 ],
+  /*  158 */  [ 0.417073724, 11 ],
+  /*  159 */  [ 0.420597041, 11 ],
+
+  /*  160 */  [ 0.424127753, 11 ],
+  /*  161 */  [ 0.427665827, 11 ],
+  /*  162 */  [ 0.431211234, 11 ],
+  /*  163 */  [ 0.434763944, 11 ],
+  /*  164 */  [ 0.438323927, 11 ],
+  /*  165 */  [ 0.441891153, 11 ],
+  /*  166 */  [ 0.445465593, 11 ],
+  /*  167 */  [ 0.449047217, 11 ],
+  /*  168 */  [ 0.452635998, 11 ],
+  /*  169 */  [ 0.456231906, 11 ],
+  /*  170 */  [ 0.459834914, 11 ],
+  /*  171 */  [ 0.463444993, 11 ],
+  /*  172 */  [ 0.467062117, 11 ],
+  /*  173 */  [ 0.470686258, 11 ],
+  /*  174 */  [ 0.474317388, 11 ],
+  /*  175 */  [ 0.477955481, 11 ],
+
+  /*  176 */  [ 0.481600510, 11 ],
+  /*  177 */  [ 0.485252449, 11 ],
+  /*  178 */  [ 0.488911273, 11 ],
+  /*  179 */  [ 0.492576954, 11 ],
+  /*  180 */  [ 0.496249468, 11 ],
+  /*  181 */  [ 0.499928790, 11 ],
+  /*  182 */  [ 0.251807447, 12 ],
+  /*  183 */  [ 0.253653877, 12 ],
+  /*  184 */  [ 0.255503674, 12 ],
+  /*  185 */  [ 0.257356825, 12 ],
+  /*  186 */  [ 0.259213318, 12 ],
+  /*  187 */  [ 0.261073141, 12 ],
+  /*  188 */  [ 0.262936282, 12 ],
+  /*  189 */  [ 0.264802730, 12 ],
+  /*  190 */  [ 0.266672472, 12 ],
+  /*  191 */  [ 0.268545497, 12 ],
+
+  /*  192 */  [ 0.270421794, 12 ],
+  /*  193 */  [ 0.272301352, 12 ],
+  /*  194 */  [ 0.274184158, 12 ],
+  /*  195 */  [ 0.276070203, 12 ],
+  /*  196 */  [ 0.277959474, 12 ],
+  /*  197 */  [ 0.279851960, 12 ],
+  /*  198 */  [ 0.281747652, 12 ],
+  /*  199 */  [ 0.283646538, 12 ],
+  /*  200 */  [ 0.285548607, 12 ],
+  /*  201 */  [ 0.287453849, 12 ],
+  /*  202 */  [ 0.289362253, 12 ],
+  /*  203 */  [ 0.291273810, 12 ],
+  /*  204 */  [ 0.293188507, 12 ],
+  /*  205 */  [ 0.295106336, 12 ],
+  /*  206 */  [ 0.297027285, 12 ],
+  /*  207 */  [ 0.298951346, 12 ],
+
+  /*  208 */  [ 0.300878507, 12 ],
+  /*  209 */  [ 0.302808759, 12 ],
+  /*  210 */  [ 0.304742092, 12 ],
+  /*  211 */  [ 0.306678497, 12 ],
+  /*  212 */  [ 0.308617963, 12 ],
+  /*  213 */  [ 0.310560480, 12 ],
+  /*  214 */  [ 0.312506041, 12 ],
+  /*  215 */  [ 0.314454634, 12 ],
+  /*  216 */  [ 0.316406250, 12 ],
+  /*  217 */  [ 0.318360880, 12 ],
+  /*  218 */  [ 0.320318516, 12 ],
+  /*  219 */  [ 0.322279147, 12 ],
+  /*  220 */  [ 0.324242764, 12 ],
+  /*  221 */  [ 0.326209359, 12 ],
+  /*  222 */  [ 0.328178922, 12 ],
+  /*  223 */  [ 0.330151445, 12 ],
+
+  /*  224 */  [ 0.332126919, 12 ],
+  /*  225 */  [ 0.334105334, 12 ],
+  /*  226 */  [ 0.336086683, 12 ],
+  /*  227 */  [ 0.338070956, 12 ],
+  /*  228 */  [ 0.340058145, 12 ],
+  /*  229 */  [ 0.342048241, 12 ],
+  /*  230 */  [ 0.344041237, 12 ],
+  /*  231 */  [ 0.346037122, 12 ],
+  /*  232 */  [ 0.348035890, 12 ],
+  /*  233 */  [ 0.350037532, 12 ],
+  /*  234 */  [ 0.352042040, 12 ],
+  /*  235 */  [ 0.354049405, 12 ],
+  /*  236 */  [ 0.356059619, 12 ],
+  /*  237 */  [ 0.358072674, 12 ],
+  /*  238 */  [ 0.360088563, 12 ],
+  /*  239 */  [ 0.362107278, 12 ],
+
+  /*  240 */  [ 0.364128809, 12 ],
+  /*  241 */  [ 0.366153151, 12 ],
+  /*  242 */  [ 0.368180294, 12 ],
+  /*  243 */  [ 0.370210231, 12 ],
+  /*  244 */  [ 0.372242955, 12 ],
+  /*  245 */  [ 0.374278458, 12 ],
+  /*  246 */  [ 0.376316732, 12 ],
+  /*  247 */  [ 0.378357769, 12 ],
+  /*  248 */  [ 0.380401563, 12 ],
+  /*  249 */  [ 0.382448106, 12 ],
+  /*  250 */  [ 0.384497391, 12 ],
+  /*  251 */  [ 0.386549409, 12 ],
+  /*  252 */  [ 0.388604155, 12 ],
+  /*  253 */  [ 0.390661620, 12 ],
+  /*  254 */  [ 0.392721798, 12 ],
+  /*  255 */  [ 0.394784681, 12 ],
+
+  /*  256 */  [ 0.396850263, 12 ],
+  /*  257 */  [ 0.398918536, 12 ],
+  /*  258 */  [ 0.400989493, 12 ],
+  /*  259 */  [ 0.403063128, 12 ],
+  /*  260 */  [ 0.405139433, 12 ],
+  /*  261 */  [ 0.407218402, 12 ],
+  /*  262 */  [ 0.409300027, 12 ],
+  /*  263 */  [ 0.411384303, 12 ],
+  /*  264 */  [ 0.413471222, 12 ],
+  /*  265 */  [ 0.415560778, 12 ],
+  /*  266 */  [ 0.417652964, 12 ],
+  /*  267 */  [ 0.419747773, 12 ],
+  /*  268 */  [ 0.421845199, 12 ],
+  /*  269 */  [ 0.423945235, 12 ],
+  /*  270 */  [ 0.426047876, 12 ],
+  /*  271 */  [ 0.428153114, 12 ],
+
+  /*  272 */  [ 0.430260942, 12 ],
+  /*  273 */  [ 0.432371356, 12 ],
+  /*  274 */  [ 0.434484348, 12 ],
+  /*  275 */  [ 0.436599912, 12 ],
+  /*  276 */  [ 0.438718042, 12 ],
+  /*  277 */  [ 0.440838732, 12 ],
+  /*  278 */  [ 0.442961975, 12 ],
+  /*  279 */  [ 0.445087765, 12 ],
+  /*  280 */  [ 0.447216097, 12 ],
+  /*  281 */  [ 0.449346964, 12 ],
+  /*  282 */  [ 0.451480360, 12 ],
+  /*  283 */  [ 0.453616280, 12 ],
+  /*  284 */  [ 0.455754717, 12 ],
+  /*  285 */  [ 0.457895665, 12 ],
+  /*  286 */  [ 0.460039119, 12 ],
+  /*  287 */  [ 0.462185072, 12 ],
+
+  /*  288 */  [ 0.464333519, 12 ],
+  /*  289 */  [ 0.466484455, 12 ],
+  /*  290 */  [ 0.468637872, 12 ],
+  /*  291 */  [ 0.470793767, 12 ],
+  /*  292 */  [ 0.472952132, 12 ],
+  /*  293 */  [ 0.475112962, 12 ],
+  /*  294 */  [ 0.477276252, 12 ],
+  /*  295 */  [ 0.479441997, 12 ],
+  /*  296 */  [ 0.481610189, 12 ],
+  /*  297 */  [ 0.483780825, 12 ],
+  /*  298 */  [ 0.485953899, 12 ],
+  /*  299 */  [ 0.488129404, 12 ],
+  /*  300 */  [ 0.490307336, 12 ],
+  /*  301 */  [ 0.492487690, 12 ],
+  /*  302 */  [ 0.494670459, 12 ],
+  /*  303 */  [ 0.496855639, 12 ],
+
+  /*  304 */  [ 0.499043224, 12 ],
+  /*  305 */  [ 0.250616605, 13 ],
+  /*  306 */  [ 0.251712795, 13 ],
+  /*  307 */  [ 0.252810180, 13 ],
+  /*  308 */  [ 0.253908756, 13 ],
+  /*  309 */  [ 0.255008523, 13 ],
+  /*  310 */  [ 0.256109476, 13 ],
+  /*  311 */  [ 0.257211614, 13 ],
+  /*  312 */  [ 0.258314934, 13 ],
+  /*  313 */  [ 0.259419433, 13 ],
+  /*  314 */  [ 0.260525110, 13 ],
+  /*  315 */  [ 0.261631960, 13 ],
+  /*  316 */  [ 0.262739982, 13 ],
+  /*  317 */  [ 0.263849174, 13 ],
+  /*  318 */  [ 0.264959533, 13 ],
+  /*  319 */  [ 0.266071056, 13 ],
+
+  /*  320 */  [ 0.267183742, 13 ],
+  /*  321 */  [ 0.268297587, 13 ],
+  /*  322 */  [ 0.269412589, 13 ],
+  /*  323 */  [ 0.270528746, 13 ],
+  /*  324 */  [ 0.271646056, 13 ],
+  /*  325 */  [ 0.272764515, 13 ],
+  /*  326 */  [ 0.273884123, 13 ],
+  /*  327 */  [ 0.275004875, 13 ],
+  /*  328 */  [ 0.276126771, 13 ],
+  /*  329 */  [ 0.277249808, 13 ],
+  /*  330 */  [ 0.278373983, 13 ],
+  /*  331 */  [ 0.279499294, 13 ],
+  /*  332 */  [ 0.280625739, 13 ],
+  /*  333 */  [ 0.281753315, 13 ],
+  /*  334 */  [ 0.282882021, 13 ],
+  /*  335 */  [ 0.284011853, 13 ],
+
+  /*  336 */  [ 0.285142811, 13 ],
+  /*  337 */  [ 0.286274891, 13 ],
+  /*  338 */  [ 0.287408091, 13 ],
+  /*  339 */  [ 0.288542409, 13 ],
+  /*  340 */  [ 0.289677844, 13 ],
+  /*  341 */  [ 0.290814392, 13 ],
+  /*  342 */  [ 0.291952051, 13 ],
+  /*  343 */  [ 0.293090820, 13 ],
+  /*  344 */  [ 0.294230696, 13 ],
+  /*  345 */  [ 0.295371678, 13 ],
+  /*  346 */  [ 0.296513762, 13 ],
+  /*  347 */  [ 0.297656947, 13 ],
+  /*  348 */  [ 0.298801231, 13 ],
+  /*  349 */  [ 0.299946611, 13 ],
+  /*  350 */  [ 0.301093085, 13 ],
+  /*  351 */  [ 0.302240653, 13 ],
+
+  /*  352 */  [ 0.303389310, 13 ],
+  /*  353 */  [ 0.304539056, 13 ],
+  /*  354 */  [ 0.305689888, 13 ],
+  /*  355 */  [ 0.306841804, 13 ],
+  /*  356 */  [ 0.307994802, 13 ],
+  /*  357 */  [ 0.309148880, 13 ],
+  /*  358 */  [ 0.310304037, 13 ],
+  /*  359 */  [ 0.311460269, 13 ],
+  /*  360 */  [ 0.312617576, 13 ],
+  /*  361 */  [ 0.313775954, 13 ],
+  /*  362 */  [ 0.314935403, 13 ],
+  /*  363 */  [ 0.316095920, 13 ],
+  /*  364 */  [ 0.317257503, 13 ],
+  /*  365 */  [ 0.318420150, 13 ],
+  /*  366 */  [ 0.319583859, 13 ],
+  /*  367 */  [ 0.320748629, 13 ],
+
+  /*  368 */  [ 0.321914457, 13 ],
+  /*  369 */  [ 0.323081342, 13 ],
+  /*  370 */  [ 0.324249281, 13 ],
+  /*  371 */  [ 0.325418273, 13 ],
+  /*  372 */  [ 0.326588316, 13 ],
+  /*  373 */  [ 0.327759407, 13 ],
+  /*  374 */  [ 0.328931546, 13 ],
+  /*  375 */  [ 0.330104730, 13 ],
+  /*  376 */  [ 0.331278957, 13 ],
+  /*  377 */  [ 0.332454225, 13 ],
+  /*  378 */  [ 0.333630533, 13 ],
+  /*  379 */  [ 0.334807879, 13 ],
+  /*  380 */  [ 0.335986261, 13 ],
+  /*  381 */  [ 0.337165677, 13 ],
+  /*  382 */  [ 0.338346125, 13 ],
+  /*  383 */  [ 0.339527604, 13 ],
+
+  /*  384 */  [ 0.340710111, 13 ],
+  /*  385 */  [ 0.341893646, 13 ],
+  /*  386 */  [ 0.343078205, 13 ],
+  /*  387 */  [ 0.344263788, 13 ],
+  /*  388 */  [ 0.345450393, 13 ],
+  /*  389 */  [ 0.346638017, 13 ],
+  /*  390 */  [ 0.347826659, 13 ],
+  /*  391 */  [ 0.349016318, 13 ],
+  /*  392 */  [ 0.350206992, 13 ],
+  /*  393 */  [ 0.351398678, 13 ],
+  /*  394 */  [ 0.352591376, 13 ],
+  /*  395 */  [ 0.353785083, 13 ],
+  /*  396 */  [ 0.354979798, 13 ],
+  /*  397 */  [ 0.356175519, 13 ],
+  /*  398 */  [ 0.357372244, 13 ],
+  /*  399 */  [ 0.358569972, 13 ],
+
+  /*  400 */  [ 0.359768701, 13 ],
+  /*  401 */  [ 0.360968429, 13 ],
+  /*  402 */  [ 0.362169156, 13 ],
+  /*  403 */  [ 0.363370878, 13 ],
+  /*  404 */  [ 0.364573594, 13 ],
+  /*  405 */  [ 0.365777304, 13 ],
+  /*  406 */  [ 0.366982004, 13 ],
+  /*  407 */  [ 0.368187694, 13 ],
+  /*  408 */  [ 0.369394372, 13 ],
+  /*  409 */  [ 0.370602036, 13 ],
+  /*  410 */  [ 0.371810684, 13 ],
+  /*  411 */  [ 0.373020316, 13 ],
+  /*  412 */  [ 0.374230929, 13 ],
+  /*  413 */  [ 0.375442522, 13 ],
+  /*  414 */  [ 0.376655093, 13 ],
+  /*  415 */  [ 0.377868641, 13 ],
+
+  /*  416 */  [ 0.379083164, 13 ],
+  /*  417 */  [ 0.380298661, 13 ],
+  /*  418 */  [ 0.381515130, 13 ],
+  /*  419 */  [ 0.382732569, 13 ],
+  /*  420 */  [ 0.383950977, 13 ],
+  /*  421 */  [ 0.385170352, 13 ],
+  /*  422 */  [ 0.386390694, 13 ],
+  /*  423 */  [ 0.387611999, 13 ],
+  /*  424 */  [ 0.388834268, 13 ],
+  /*  425 */  [ 0.390057497, 13 ],
+  /*  426 */  [ 0.391281687, 13 ],
+  /*  427 */  [ 0.392506834, 13 ],
+  /*  428 */  [ 0.393732939, 13 ],
+  /*  429 */  [ 0.394959999, 13 ],
+  /*  430 */  [ 0.396188012, 13 ],
+  /*  431 */  [ 0.397416978, 13 ],
+
+  /*  432 */  [ 0.398646895, 13 ],
+  /*  433 */  [ 0.399877761, 13 ],
+  /*  434 */  [ 0.401109575, 13 ],
+  /*  435 */  [ 0.402342335, 13 ],
+  /*  436 */  [ 0.403576041, 13 ],
+  /*  437 */  [ 0.404810690, 13 ],
+  /*  438 */  [ 0.406046281, 13 ],
+  /*  439 */  [ 0.407282813, 13 ],
+  /*  440 */  [ 0.408520284, 13 ],
+  /*  441 */  [ 0.409758693, 13 ],
+  /*  442 */  [ 0.410998038, 13 ],
+  /*  443 */  [ 0.412238319, 13 ],
+  /*  444 */  [ 0.413479532, 13 ],
+  /*  445 */  [ 0.414721679, 13 ],
+  /*  446 */  [ 0.415964756, 13 ],
+  /*  447 */  [ 0.417208762, 13 ],
+
+  /*  448 */  [ 0.418453696, 13 ],
+  /*  449 */  [ 0.419699557, 13 ],
+  /*  450 */  [ 0.420946343, 13 ],
+  /*  451 */  [ 0.422194054, 13 ],
+  /*  452 */  [ 0.423442686, 13 ],
+  /*  453 */  [ 0.424692240, 13 ],
+  /*  454 */  [ 0.425942714, 13 ],
+  /*  455 */  [ 0.427194106, 13 ],
+  /*  456 */  [ 0.428446415, 13 ],
+  /*  457 */  [ 0.429699640, 13 ],
+  /*  458 */  [ 0.430953779, 13 ],
+  /*  459 */  [ 0.432208832, 13 ],
+  /*  460 */  [ 0.433464796, 13 ],
+  /*  461 */  [ 0.434721671, 13 ],
+  /*  462 */  [ 0.435979455, 13 ],
+  /*  463 */  [ 0.437238146, 13 ],
+
+  /*  464 */  [ 0.438497744, 13 ],
+  /*  465 */  [ 0.439758248, 13 ],
+  /*  466 */  [ 0.441019655, 13 ],
+  /*  467 */  [ 0.442281965, 13 ],
+  /*  468 */  [ 0.443545176, 13 ],
+  /*  469 */  [ 0.444809288, 13 ],
+  /*  470 */  [ 0.446074298, 13 ],
+  /*  471 */  [ 0.447340205, 13 ],
+  /*  472 */  [ 0.448607009, 13 ],
+  /*  473 */  [ 0.449874708, 13 ],
+  /*  474 */  [ 0.451143300, 13 ],
+  /*  475 */  [ 0.452412785, 13 ],
+  /*  476 */  [ 0.453683161, 13 ],
+  /*  477 */  [ 0.454954427, 13 ],
+  /*  478 */  [ 0.456226581, 13 ],
+  /*  479 */  [ 0.457499623, 13 ],
+
+  /*  480 */  [ 0.458773552, 13 ],
+  /*  481 */  [ 0.460048365, 13 ],
+  /*  482 */  [ 0.461324062, 13 ],
+  /*  483 */  [ 0.462600642, 13 ],
+  /*  484 */  [ 0.463878102, 13 ],
+  /*  485 */  [ 0.465156443, 13 ],
+  /*  486 */  [ 0.466435663, 13 ],
+  /*  487 */  [ 0.467715761, 13 ],
+  /*  488 */  [ 0.468996735, 13 ],
+  /*  489 */  [ 0.470278584, 13 ],
+  /*  490 */  [ 0.471561307, 13 ],
+  /*  491 */  [ 0.472844904, 13 ],
+  /*  492 */  [ 0.474129372, 13 ],
+  /*  493 */  [ 0.475414710, 13 ],
+  /*  494 */  [ 0.476700918, 13 ],
+  /*  495 */  [ 0.477987994, 13 ],
+
+  /*  496 */  [ 0.479275937, 13 ],
+  /*  497 */  [ 0.480564746, 13 ],
+  /*  498 */  [ 0.481854420, 13 ],
+  /*  499 */  [ 0.483144957, 13 ],
+  /*  500 */  [ 0.484436356, 13 ],
+  /*  501 */  [ 0.485728617, 13 ],
+  /*  502 */  [ 0.487021738, 13 ],
+  /*  503 */  [ 0.488315717, 13 ],
+  /*  504 */  [ 0.489610555, 13 ],
+  /*  505 */  [ 0.490906249, 13 ],
+  /*  506 */  [ 0.492202799, 13 ],
+  /*  507 */  [ 0.493500203, 13 ],
+  /*  508 */  [ 0.494798460, 13 ],
+  /*  509 */  [ 0.496097570, 13 ],
+  /*  510 */  [ 0.497397530, 13 ],
+  /*  511 */  [ 0.498698341, 13 ],
+
+  /*  512 */  [ 0.250000000, 14 ],
+  /*  513 */  [ 0.250651254, 14 ],
+  /*  514 */  [ 0.251302930, 14 ],
+  /*  515 */  [ 0.251955030, 14 ],
+  /*  516 */  [ 0.252607552, 14 ],
+  /*  517 */  [ 0.253260495, 14 ],
+  /*  518 */  [ 0.253913860, 14 ],
+  /*  519 */  [ 0.254567645, 14 ],
+  /*  520 */  [ 0.255221850, 14 ],
+  /*  521 */  [ 0.255876475, 14 ],
+  /*  522 */  [ 0.256531518, 14 ],
+  /*  523 */  [ 0.257186980, 14 ],
+  /*  524 */  [ 0.257842860, 14 ],
+  /*  525 */  [ 0.258499157, 14 ],
+  /*  526 */  [ 0.259155872, 14 ],
+  /*  527 */  [ 0.259813002, 14 ],
+
+  /*  528 */  [ 0.260470548, 14 ],
+  /*  529 */  [ 0.261128510, 14 ],
+  /*  530 */  [ 0.261786886, 14 ],
+  /*  531 */  [ 0.262445676, 14 ],
+  /*  532 */  [ 0.263104880, 14 ],
+  /*  533 */  [ 0.263764497, 14 ],
+  /*  534 */  [ 0.264424527, 14 ],
+  /*  535 */  [ 0.265084969, 14 ],
+  /*  536 */  [ 0.265745823, 14 ],
+  /*  537 */  [ 0.266407088, 14 ],
+  /*  538 */  [ 0.267068763, 14 ],
+  /*  539 */  [ 0.267730848, 14 ],
+  /*  540 */  [ 0.268393343, 14 ],
+  /*  541 */  [ 0.269056248, 14 ],
+  /*  542 */  [ 0.269719560, 14 ],
+  /*  543 */  [ 0.270383281, 14 ],
+
+  /*  544 */  [ 0.271047409, 14 ],
+  /*  545 */  [ 0.271711944, 14 ],
+  /*  546 */  [ 0.272376886, 14 ],
+  /*  547 */  [ 0.273042234, 14 ],
+  /*  548 */  [ 0.273707988, 14 ],
+  /*  549 */  [ 0.274374147, 14 ],
+  /*  550 */  [ 0.275040710, 14 ],
+  /*  551 */  [ 0.275707677, 14 ],
+  /*  552 */  [ 0.276375048, 14 ],
+  /*  553 */  [ 0.277042822, 14 ],
+  /*  554 */  [ 0.277710999, 14 ],
+  /*  555 */  [ 0.278379578, 14 ],
+  /*  556 */  [ 0.279048558, 14 ],
+  /*  557 */  [ 0.279717940, 14 ],
+  /*  558 */  [ 0.280387722, 14 ],
+  /*  559 */  [ 0.281057905, 14 ],
+
+  /*  560 */  [ 0.281728487, 14 ],
+  /*  561 */  [ 0.282399469, 14 ],
+  /*  562 */  [ 0.283070849, 14 ],
+  /*  563 */  [ 0.283742628, 14 ],
+  /*  564 */  [ 0.284414805, 14 ],
+  /*  565 */  [ 0.285087379, 14 ],
+  /*  566 */  [ 0.285760350, 14 ],
+  /*  567 */  [ 0.286433717, 14 ],
+  /*  568 */  [ 0.287107481, 14 ],
+  /*  569 */  [ 0.287781640, 14 ],
+  /*  570 */  [ 0.288456194, 14 ],
+  /*  571 */  [ 0.289131142, 14 ],
+  /*  572 */  [ 0.289806485, 14 ],
+  /*  573 */  [ 0.290482221, 14 ],
+  /*  574 */  [ 0.291158351, 14 ],
+  /*  575 */  [ 0.291834873, 14 ],
+
+  /*  576 */  [ 0.292511788, 14 ],
+  /*  577 */  [ 0.293189094, 14 ],
+  /*  578 */  [ 0.293866792, 14 ],
+  /*  579 */  [ 0.294544881, 14 ],
+  /*  580 */  [ 0.295223360, 14 ],
+  /*  581 */  [ 0.295902229, 14 ],
+  /*  582 */  [ 0.296581488, 14 ],
+  /*  583 */  [ 0.297261136, 14 ],
+  /*  584 */  [ 0.297941173, 14 ],
+  /*  585 */  [ 0.298621598, 14 ],
+  /*  586 */  [ 0.299302411, 14 ],
+  /*  587 */  [ 0.299983611, 14 ],
+  /*  588 */  [ 0.300665198, 14 ],
+  /*  589 */  [ 0.301347172, 14 ],
+  /*  590 */  [ 0.302029532, 14 ],
+  /*  591 */  [ 0.302712277, 14 ],
+
+  /*  592 */  [ 0.303395408, 14 ],
+  /*  593 */  [ 0.304078923, 14 ],
+  /*  594 */  [ 0.304762823, 14 ],
+  /*  595 */  [ 0.305447106, 14 ],
+  /*  596 */  [ 0.306131773, 14 ],
+  /*  597 */  [ 0.306816823, 14 ],
+  /*  598 */  [ 0.307502256, 14 ],
+  /*  599 */  [ 0.308188071, 14 ],
+  /*  600 */  [ 0.308874267, 14 ],
+  /*  601 */  [ 0.309560845, 14 ],
+  /*  602 */  [ 0.310247804, 14 ],
+  /*  603 */  [ 0.310935143, 14 ],
+  /*  604 */  [ 0.311622862, 14 ],
+  /*  605 */  [ 0.312310961, 14 ],
+  /*  606 */  [ 0.312999439, 14 ],
+  /*  607 */  [ 0.313688296, 14 ],
+
+  /*  608 */  [ 0.314377532, 14 ],
+  /*  609 */  [ 0.315067145, 14 ],
+  /*  610 */  [ 0.315757136, 14 ],
+  /*  611 */  [ 0.316447504, 14 ],
+  /*  612 */  [ 0.317138249, 14 ],
+  /*  613 */  [ 0.317829370, 14 ],
+  /*  614 */  [ 0.318520867, 14 ],
+  /*  615 */  [ 0.319212739, 14 ],
+  /*  616 */  [ 0.319904987, 14 ],
+  /*  617 */  [ 0.320597609, 14 ],
+  /*  618 */  [ 0.321290606, 14 ],
+  /*  619 */  [ 0.321983976, 14 ],
+  /*  620 */  [ 0.322677720, 14 ],
+  /*  621 */  [ 0.323371837, 14 ],
+  /*  622 */  [ 0.324066327, 14 ],
+  /*  623 */  [ 0.324761189, 14 ],
+
+  /*  624 */  [ 0.325456423, 14 ],
+  /*  625 */  [ 0.326152028, 14 ],
+  /*  626 */  [ 0.326848005, 14 ],
+  /*  627 */  [ 0.327544352, 14 ],
+  /*  628 */  [ 0.328241070, 14 ],
+  /*  629 */  [ 0.328938157, 14 ],
+  /*  630 */  [ 0.329635614, 14 ],
+  /*  631 */  [ 0.330333440, 14 ],
+  /*  632 */  [ 0.331031635, 14 ],
+  /*  633 */  [ 0.331730198, 14 ],
+  /*  634 */  [ 0.332429129, 14 ],
+  /*  635 */  [ 0.333128427, 14 ],
+  /*  636 */  [ 0.333828093, 14 ],
+  /*  637 */  [ 0.334528126, 14 ],
+  /*  638 */  [ 0.335228525, 14 ],
+  /*  639 */  [ 0.335929290, 14 ],
+
+  /*  640 */  [ 0.336630420, 14 ],
+  /*  641 */  [ 0.337331916, 14 ],
+  /*  642 */  [ 0.338033777, 14 ],
+  /*  643 */  [ 0.338736002, 14 ],
+  /*  644 */  [ 0.339438592, 14 ],
+  /*  645 */  [ 0.340141545, 14 ],
+  /*  646 */  [ 0.340844862, 14 ],
+  /*  647 */  [ 0.341548541, 14 ],
+  /*  648 */  [ 0.342252584, 14 ],
+  /*  649 */  [ 0.342956988, 14 ],
+  /*  650 */  [ 0.343661754, 14 ],
+  /*  651 */  [ 0.344366882, 14 ],
+  /*  652 */  [ 0.345072371, 14 ],
+  /*  653 */  [ 0.345778221, 14 ],
+  /*  654 */  [ 0.346484431, 14 ],
+  /*  655 */  [ 0.347191002, 14 ],
+
+  /*  656 */  [ 0.347897931, 14 ],
+  /*  657 */  [ 0.348605221, 14 ],
+  /*  658 */  [ 0.349312869, 14 ],
+  /*  659 */  [ 0.350020876, 14 ],
+  /*  660 */  [ 0.350729240, 14 ],
+  /*  661 */  [ 0.351437963, 14 ],
+  /*  662 */  [ 0.352147044, 14 ],
+  /*  663 */  [ 0.352856481, 14 ],
+  /*  664 */  [ 0.353566275, 14 ],
+  /*  665 */  [ 0.354276426, 14 ],
+  /*  666 */  [ 0.354986932, 14 ],
+  /*  667 */  [ 0.355697795, 14 ],
+  /*  668 */  [ 0.356409012, 14 ],
+  /*  669 */  [ 0.357120585, 14 ],
+  /*  670 */  [ 0.357832512, 14 ],
+  /*  671 */  [ 0.358544794, 14 ],
+
+  /*  672 */  [ 0.359257429, 14 ],
+  /*  673 */  [ 0.359970419, 14 ],
+  /*  674 */  [ 0.360683761, 14 ],
+  /*  675 */  [ 0.361397456, 14 ],
+  /*  676 */  [ 0.362111504, 14 ],
+  /*  677 */  [ 0.362825904, 14 ],
+  /*  678 */  [ 0.363540655, 14 ],
+  /*  679 */  [ 0.364255759, 14 ],
+  /*  680 */  [ 0.364971213, 14 ],
+  /*  681 */  [ 0.365687018, 14 ],
+  /*  682 */  [ 0.366403174, 14 ],
+  /*  683 */  [ 0.367119680, 14 ],
+  /*  684 */  [ 0.367836535, 14 ],
+  /*  685 */  [ 0.368553740, 14 ],
+  /*  686 */  [ 0.369271294, 14 ],
+  /*  687 */  [ 0.369989197, 14 ],
+
+  /*  688 */  [ 0.370707448, 14 ],
+  /*  689 */  [ 0.371426047, 14 ],
+  /*  690 */  [ 0.372144994, 14 ],
+  /*  691 */  [ 0.372864289, 14 ],
+  /*  692 */  [ 0.373583930, 14 ],
+  /*  693 */  [ 0.374303918, 14 ],
+  /*  694 */  [ 0.375024253, 14 ],
+  /*  695 */  [ 0.375744934, 14 ],
+  /*  696 */  [ 0.376465960, 14 ],
+  /*  697 */  [ 0.377187332, 14 ],
+  /*  698 */  [ 0.377909049, 14 ],
+  /*  699 */  [ 0.378631110, 14 ],
+  /*  700 */  [ 0.379353516, 14 ],
+  /*  701 */  [ 0.380076266, 14 ],
+  /*  702 */  [ 0.380799360, 14 ],
+  /*  703 */  [ 0.381522798, 14 ],
+
+  /*  704 */  [ 0.382246578, 14 ],
+  /*  705 */  [ 0.382970701, 14 ],
+  /*  706 */  [ 0.383695167, 14 ],
+  /*  707 */  [ 0.384419975, 14 ],
+  /*  708 */  [ 0.385145124, 14 ],
+  /*  709 */  [ 0.385870615, 14 ],
+  /*  710 */  [ 0.386596448, 14 ],
+  /*  711 */  [ 0.387322621, 14 ],
+  /*  712 */  [ 0.388049134, 14 ],
+  /*  713 */  [ 0.388775988, 14 ],
+  /*  714 */  [ 0.389503182, 14 ],
+  /*  715 */  [ 0.390230715, 14 ],
+  /*  716 */  [ 0.390958588, 14 ],
+  /*  717 */  [ 0.391686799, 14 ],
+  /*  718 */  [ 0.392415349, 14 ],
+  /*  719 */  [ 0.393144238, 14 ],
+
+  /*  720 */  [ 0.393873464, 14 ],
+  /*  721 */  [ 0.394603028, 14 ],
+  /*  722 */  [ 0.395332930, 14 ],
+  /*  723 */  [ 0.396063168, 14 ],
+  /*  724 */  [ 0.396793743, 14 ],
+  /*  725 */  [ 0.397524655, 14 ],
+  /*  726 */  [ 0.398255903, 14 ],
+  /*  727 */  [ 0.398987487, 14 ],
+  /*  728 */  [ 0.399719406, 14 ],
+  /*  729 */  [ 0.400451660, 14 ],
+  /*  730 */  [ 0.401184249, 14 ],
+  /*  731 */  [ 0.401917173, 14 ],
+  /*  732 */  [ 0.402650431, 14 ],
+  /*  733 */  [ 0.403384024, 14 ],
+  /*  734 */  [ 0.404117949, 14 ],
+  /*  735 */  [ 0.404852209, 14 ],
+
+  /*  736 */  [ 0.405586801, 14 ],
+  /*  737 */  [ 0.406321726, 14 ],
+  /*  738 */  [ 0.407056983, 14 ],
+  /*  739 */  [ 0.407792573, 14 ],
+  /*  740 */  [ 0.408528495, 14 ],
+  /*  741 */  [ 0.409264748, 14 ],
+  /*  742 */  [ 0.410001332, 14 ],
+  /*  743 */  [ 0.410738247, 14 ],
+  /*  744 */  [ 0.411475493, 14 ],
+  /*  745 */  [ 0.412213070, 14 ],
+  /*  746 */  [ 0.412950976, 14 ],
+  /*  747 */  [ 0.413689213, 14 ],
+  /*  748 */  [ 0.414427779, 14 ],
+  /*  749 */  [ 0.415166674, 14 ],
+  /*  750 */  [ 0.415905897, 14 ],
+  /*  751 */  [ 0.416645450, 14 ],
+
+  /*  752 */  [ 0.417385331, 14 ],
+  /*  753 */  [ 0.418125540, 14 ],
+  /*  754 */  [ 0.418866076, 14 ],
+  /*  755 */  [ 0.419606940, 14 ],
+  /*  756 */  [ 0.420348132, 14 ],
+  /*  757 */  [ 0.421089650, 14 ],
+  /*  758 */  [ 0.421831494, 14 ],
+  /*  759 */  [ 0.422573665, 14 ],
+  /*  760 */  [ 0.423316162, 14 ],
+  /*  761 */  [ 0.424058985, 14 ],
+  /*  762 */  [ 0.424802133, 14 ],
+  /*  763 */  [ 0.425545607, 14 ],
+  /*  764 */  [ 0.426289405, 14 ],
+  /*  765 */  [ 0.427033528, 14 ],
+  /*  766 */  [ 0.427777975, 14 ],
+  /*  767 */  [ 0.428522746, 14 ],
+
+  /*  768 */  [ 0.429267841, 14 ],
+  /*  769 */  [ 0.430013259, 14 ],
+  /*  770 */  [ 0.430759001, 14 ],
+  /*  771 */  [ 0.431505065, 14 ],
+  /*  772 */  [ 0.432251452, 14 ],
+  /*  773 */  [ 0.432998162, 14 ],
+  /*  774 */  [ 0.433745193, 14 ],
+  /*  775 */  [ 0.434492546, 14 ],
+  /*  776 */  [ 0.435240221, 14 ],
+  /*  777 */  [ 0.435988217, 14 ],
+  /*  778 */  [ 0.436736534, 14 ],
+  /*  779 */  [ 0.437485172, 14 ],
+  /*  780 */  [ 0.438234130, 14 ],
+  /*  781 */  [ 0.438983408, 14 ],
+  /*  782 */  [ 0.439733006, 14 ],
+  /*  783 */  [ 0.440482924, 14 ],
+
+  /*  784 */  [ 0.441233161, 14 ],
+  /*  785 */  [ 0.441983717, 14 ],
+  /*  786 */  [ 0.442734592, 14 ],
+  /*  787 */  [ 0.443485785, 14 ],
+  /*  788 */  [ 0.444237296, 14 ],
+  /*  789 */  [ 0.444989126, 14 ],
+  /*  790 */  [ 0.445741273, 14 ],
+  /*  791 */  [ 0.446493738, 14 ],
+  /*  792 */  [ 0.447246519, 14 ],
+  /*  793 */  [ 0.447999618, 14 ],
+  /*  794 */  [ 0.448753033, 14 ],
+  /*  795 */  [ 0.449506765, 14 ],
+  /*  796 */  [ 0.450260813, 14 ],
+  /*  797 */  [ 0.451015176, 14 ],
+  /*  798 */  [ 0.451769856, 14 ],
+  /*  799 */  [ 0.452524850, 14 ],
+
+  /*  800 */  [ 0.453280160, 14 ],
+  /*  801 */  [ 0.454035784, 14 ],
+  /*  802 */  [ 0.454791723, 14 ],
+  /*  803 */  [ 0.455547976, 14 ],
+  /*  804 */  [ 0.456304543, 14 ],
+  /*  805 */  [ 0.457061423, 14 ],
+  /*  806 */  [ 0.457818618, 14 ],
+  /*  807 */  [ 0.458576125, 14 ],
+  /*  808 */  [ 0.459333946, 14 ],
+  /*  809 */  [ 0.460092079, 14 ],
+  /*  810 */  [ 0.460850524, 14 ],
+  /*  811 */  [ 0.461609282, 14 ],
+  /*  812 */  [ 0.462368352, 14 ],
+  /*  813 */  [ 0.463127733, 14 ],
+  /*  814 */  [ 0.463887426, 14 ],
+  /*  815 */  [ 0.464647430, 14 ],
+
+  /*  816 */  [ 0.465407744, 14 ],
+  /*  817 */  [ 0.466168370, 14 ],
+  /*  818 */  [ 0.466929306, 14 ],
+  /*  819 */  [ 0.467690552, 14 ],
+  /*  820 */  [ 0.468452108, 14 ],
+  /*  821 */  [ 0.469213973, 14 ],
+  /*  822 */  [ 0.469976148, 14 ],
+  /*  823 */  [ 0.470738632, 14 ],
+  /*  824 */  [ 0.471501425, 14 ],
+  /*  825 */  [ 0.472264527, 14 ],
+  /*  826 */  [ 0.473027937, 14 ],
+  /*  827 */  [ 0.473791655, 14 ],
+  /*  828 */  [ 0.474555681, 14 ],
+  /*  829 */  [ 0.475320014, 14 ],
+  /*  830 */  [ 0.476084655, 14 ],
+  /*  831 */  [ 0.476849603, 14 ],
+
+  /*  832 */  [ 0.477614858, 14 ],
+  /*  833 */  [ 0.478380420, 14 ],
+  /*  834 */  [ 0.479146288, 14 ],
+  /*  835 */  [ 0.479912463, 14 ],
+  /*  836 */  [ 0.480678943, 14 ],
+  /*  837 */  [ 0.481445729, 14 ],
+  /*  838 */  [ 0.482212820, 14 ],
+  /*  839 */  [ 0.482980216, 14 ],
+  /*  840 */  [ 0.483747918, 14 ],
+  /*  841 */  [ 0.484515924, 14 ],
+  /*  842 */  [ 0.485284235, 14 ],
+  /*  843 */  [ 0.486052849, 14 ],
+  /*  844 */  [ 0.486821768, 14 ],
+  /*  845 */  [ 0.487590991, 14 ],
+  /*  846 */  [ 0.488360517, 14 ],
+  /*  847 */  [ 0.489130346, 14 ],
+
+  /*  848 */  [ 0.489900479, 14 ],
+  /*  849 */  [ 0.490670914, 14 ],
+  /*  850 */  [ 0.491441651, 14 ],
+  /*  851 */  [ 0.492212691, 14 ],
+  /*  852 */  [ 0.492984033, 14 ],
+  /*  853 */  [ 0.493755677, 14 ],
+  /*  854 */  [ 0.494527623, 14 ],
+  /*  855 */  [ 0.495299870, 14 ],
+  /*  856 */  [ 0.496072418, 14 ],
+  /*  857 */  [ 0.496845266, 14 ],
+  /*  858 */  [ 0.497618416, 14 ],
+  /*  859 */  [ 0.498391866, 14 ],
+  /*  860 */  [ 0.499165616, 14 ],
+  /*  861 */  [ 0.499939666, 14 ],
+  /*  862 */  [ 0.250357008, 15 ],
+  /*  863 */  [ 0.250744333, 15 ],
+
+  /*  864 */  [ 0.251131807, 15 ],
+  /*  865 */  [ 0.251519431, 15 ],
+  /*  866 */  [ 0.251907204, 15 ],
+  /*  867 */  [ 0.252295127, 15 ],
+  /*  868 */  [ 0.252683198, 15 ],
+  /*  869 */  [ 0.253071419, 15 ],
+  /*  870 */  [ 0.253459789, 15 ],
+  /*  871 */  [ 0.253848307, 15 ],
+  /*  872 */  [ 0.254236974, 15 ],
+  /*  873 */  [ 0.254625790, 15 ],
+  /*  874 */  [ 0.255014755, 15 ],
+  /*  875 */  [ 0.255403867, 15 ],
+  /*  876 */  [ 0.255793128, 15 ],
+  /*  877 */  [ 0.256182537, 15 ],
+  /*  878 */  [ 0.256572095, 15 ],
+  /*  879 */  [ 0.256961800, 15 ],
+
+  /*  880 */  [ 0.257351652, 15 ],
+  /*  881 */  [ 0.257741653, 15 ],
+  /*  882 */  [ 0.258131801, 15 ],
+  /*  883 */  [ 0.258522097, 15 ],
+  /*  884 */  [ 0.258912540, 15 ],
+  /*  885 */  [ 0.259303130, 15 ],
+  /*  886 */  [ 0.259693868, 15 ],
+  /*  887 */  [ 0.260084752, 15 ],
+  /*  888 */  [ 0.260475783, 15 ],
+  /*  889 */  [ 0.260866961, 15 ],
+  /*  890 */  [ 0.261258286, 15 ],
+  /*  891 */  [ 0.261649758, 15 ],
+  /*  892 */  [ 0.262041376, 15 ],
+  /*  893 */  [ 0.262433140, 15 ],
+  /*  894 */  [ 0.262825051, 15 ],
+  /*  895 */  [ 0.263217107, 15 ],
+
+  /*  896 */  [ 0.263609310, 15 ],
+  /*  897 */  [ 0.264001659, 15 ],
+  /*  898 */  [ 0.264394153, 15 ],
+  /*  899 */  [ 0.264786794, 15 ],
+  /*  900 */  [ 0.265179580, 15 ],
+  /*  901 */  [ 0.265572511, 15 ],
+  /*  902 */  [ 0.265965588, 15 ],
+  /*  903 */  [ 0.266358810, 15 ],
+  /*  904 */  [ 0.266752177, 15 ],
+  /*  905 */  [ 0.267145689, 15 ],
+  /*  906 */  [ 0.267539347, 15 ],
+  /*  907 */  [ 0.267933149, 15 ],
+  /*  908 */  [ 0.268327096, 15 ],
+  /*  909 */  [ 0.268721187, 15 ],
+  /*  910 */  [ 0.269115423, 15 ],
+  /*  911 */  [ 0.269509804, 15 ],
+
+  /*  912 */  [ 0.269904329, 15 ],
+  /*  913 */  [ 0.270298998, 15 ],
+  /*  914 */  [ 0.270693811, 15 ],
+  /*  915 */  [ 0.271088768, 15 ],
+  /*  916 */  [ 0.271483869, 15 ],
+  /*  917 */  [ 0.271879114, 15 ],
+  /*  918 */  [ 0.272274503, 15 ],
+  /*  919 */  [ 0.272670035, 15 ],
+  /*  920 */  [ 0.273065710, 15 ],
+  /*  921 */  [ 0.273461530, 15 ],
+  /*  922 */  [ 0.273857492, 15 ],
+  /*  923 */  [ 0.274253597, 15 ],
+  /*  924 */  [ 0.274649846, 15 ],
+  /*  925 */  [ 0.275046238, 15 ],
+  /*  926 */  [ 0.275442772, 15 ],
+  /*  927 */  [ 0.275839449, 15 ],
+
+  /*  928 */  [ 0.276236269, 15 ],
+  /*  929 */  [ 0.276633232, 15 ],
+  /*  930 */  [ 0.277030337, 15 ],
+  /*  931 */  [ 0.277427584, 15 ],
+  /*  932 */  [ 0.277824973, 15 ],
+  /*  933 */  [ 0.278222505, 15 ],
+  /*  934 */  [ 0.278620179, 15 ],
+  /*  935 */  [ 0.279017995, 15 ],
+  /*  936 */  [ 0.279415952, 15 ],
+  /*  937 */  [ 0.279814051, 15 ],
+  /*  938 */  [ 0.280212292, 15 ],
+  /*  939 */  [ 0.280610675, 15 ],
+  /*  940 */  [ 0.281009199, 15 ],
+  /*  941 */  [ 0.281407864, 15 ],
+  /*  942 */  [ 0.281806670, 15 ],
+  /*  943 */  [ 0.282205618, 15 ],
+
+  /*  944 */  [ 0.282604707, 15 ],
+  /*  945 */  [ 0.283003936, 15 ],
+  /*  946 */  [ 0.283403307, 15 ],
+  /*  947 */  [ 0.283802818, 15 ],
+  /*  948 */  [ 0.284202470, 15 ],
+  /*  949 */  [ 0.284602263, 15 ],
+  /*  950 */  [ 0.285002195, 15 ],
+  /*  951 */  [ 0.285402269, 15 ],
+  /*  952 */  [ 0.285802482, 15 ],
+  /*  953 */  [ 0.286202836, 15 ],
+  /*  954 */  [ 0.286603329, 15 ],
+  /*  955 */  [ 0.287003963, 15 ],
+  /*  956 */  [ 0.287404737, 15 ],
+  /*  957 */  [ 0.287805650, 15 ],
+  /*  958 */  [ 0.288206703, 15 ],
+  /*  959 */  [ 0.288607895, 15 ],
+
+  /*  960 */  [ 0.289009227, 15 ],
+  /*  961 */  [ 0.289410699, 15 ],
+  /*  962 */  [ 0.289812309, 15 ],
+  /*  963 */  [ 0.290214059, 15 ],
+  /*  964 */  [ 0.290615948, 15 ],
+  /*  965 */  [ 0.291017976, 15 ],
+  /*  966 */  [ 0.291420143, 15 ],
+  /*  967 */  [ 0.291822449, 15 ],
+  /*  968 */  [ 0.292224893, 15 ],
+  /*  969 */  [ 0.292627476, 15 ],
+  /*  970 */  [ 0.293030197, 15 ],
+  /*  971 */  [ 0.293433057, 15 ],
+  /*  972 */  [ 0.293836055, 15 ],
+  /*  973 */  [ 0.294239192, 15 ],
+  /*  974 */  [ 0.294642466, 15 ],
+  /*  975 */  [ 0.295045879, 15 ],
+
+  /*  976 */  [ 0.295449429, 15 ],
+  /*  977 */  [ 0.295853118, 15 ],
+  /*  978 */  [ 0.296256944, 15 ],
+  /*  979 */  [ 0.296660907, 15 ],
+  /*  980 */  [ 0.297065009, 15 ],
+  /*  981 */  [ 0.297469248, 15 ],
+  /*  982 */  [ 0.297873624, 15 ],
+  /*  983 */  [ 0.298278137, 15 ],
+  /*  984 */  [ 0.298682788, 15 ],
+  /*  985 */  [ 0.299087576, 15 ],
+  /*  986 */  [ 0.299492500, 15 ],
+  /*  987 */  [ 0.299897562, 15 ],
+  /*  988 */  [ 0.300302761, 15 ],
+  /*  989 */  [ 0.300708096, 15 ],
+  /*  990 */  [ 0.301113568, 15 ],
+  /*  991 */  [ 0.301519176, 15 ],
+
+  /*  992 */  [ 0.301924921, 15 ],
+  /*  993 */  [ 0.302330802, 15 ],
+  /*  994 */  [ 0.302736820, 15 ],
+  /*  995 */  [ 0.303142973, 15 ],
+  /*  996 */  [ 0.303549263, 15 ],
+  /*  997 */  [ 0.303955689, 15 ],
+  /*  998 */  [ 0.304362251, 15 ],
+  /*  999 */  [ 0.304768948, 15 ],
+  /* 1000 */  [ 0.305175781, 15 ],
+  /* 1001 */  [ 0.305582750, 15 ],
+  /* 1002 */  [ 0.305989854, 15 ],
+  /* 1003 */  [ 0.306397094, 15 ],
+  /* 1004 */  [ 0.306804470, 15 ],
+  /* 1005 */  [ 0.307211980, 15 ],
+  /* 1006 */  [ 0.307619626, 15 ],
+  /* 1007 */  [ 0.308027406, 15 ],
+
+  /* 1008 */  [ 0.308435322, 15 ],
+  /* 1009 */  [ 0.308843373, 15 ],
+  /* 1010 */  [ 0.309251558, 15 ],
+  /* 1011 */  [ 0.309659879, 15 ],
+  /* 1012 */  [ 0.310068333, 15 ],
+  /* 1013 */  [ 0.310476923, 15 ],
+  /* 1014 */  [ 0.310885647, 15 ],
+  /* 1015 */  [ 0.311294505, 15 ],
+  /* 1016 */  [ 0.311703498, 15 ],
+  /* 1017 */  [ 0.312112625, 15 ],
+  /* 1018 */  [ 0.312521885, 15 ],
+  /* 1019 */  [ 0.312931280, 15 ],
+  /* 1020 */  [ 0.313340809, 15 ],
+  /* 1021 */  [ 0.313750472, 15 ],
+  /* 1022 */  [ 0.314160269, 15 ],
+  /* 1023 */  [ 0.314570199, 15 ],
+
+  /* 1024 */  [ 0.314980262, 15 ],
+  /* 1025 */  [ 0.315390460, 15 ],
+  /* 1026 */  [ 0.315800790, 15 ],
+  /* 1027 */  [ 0.316211255, 15 ],
+  /* 1028 */  [ 0.316621852, 15 ],
+  /* 1029 */  [ 0.317032582, 15 ],
+  /* 1030 */  [ 0.317443446, 15 ],
+  /* 1031 */  [ 0.317854442, 15 ],
+  /* 1032 */  [ 0.318265572, 15 ],
+  /* 1033 */  [ 0.318676834, 15 ],
+  /* 1034 */  [ 0.319088229, 15 ],
+  /* 1035 */  [ 0.319499756, 15 ],
+  /* 1036 */  [ 0.319911417, 15 ],
+  /* 1037 */  [ 0.320323209, 15 ],
+  /* 1038 */  [ 0.320735134, 15 ],
+  /* 1039 */  [ 0.321147192, 15 ],
+
+  /* 1040 */  [ 0.321559381, 15 ],
+  /* 1041 */  [ 0.321971703, 15 ],
+  /* 1042 */  [ 0.322384156, 15 ],
+  /* 1043 */  [ 0.322796742, 15 ],
+  /* 1044 */  [ 0.323209460, 15 ],
+  /* 1045 */  [ 0.323622309, 15 ],
+  /* 1046 */  [ 0.324035290, 15 ],
+  /* 1047 */  [ 0.324448403, 15 ],
+  /* 1048 */  [ 0.324861647, 15 ],
+  /* 1049 */  [ 0.325275023, 15 ],
+  /* 1050 */  [ 0.325688530, 15 ],
+  /* 1051 */  [ 0.326102168, 15 ],
+  /* 1052 */  [ 0.326515938, 15 ],
+  /* 1053 */  [ 0.326929839, 15 ],
+  /* 1054 */  [ 0.327343870, 15 ],
+  /* 1055 */  [ 0.327758033, 15 ],
+
+  /* 1056 */  [ 0.328172327, 15 ],
+  /* 1057 */  [ 0.328586751, 15 ],
+  /* 1058 */  [ 0.329001306, 15 ],
+  /* 1059 */  [ 0.329415992, 15 ],
+  /* 1060 */  [ 0.329830808, 15 ],
+  /* 1061 */  [ 0.330245755, 15 ],
+  /* 1062 */  [ 0.330660832, 15 ],
+  /* 1063 */  [ 0.331076039, 15 ],
+  /* 1064 */  [ 0.331491377, 15 ],
+  /* 1065 */  [ 0.331906845, 15 ],
+  /* 1066 */  [ 0.332322443, 15 ],
+  /* 1067 */  [ 0.332738170, 15 ],
+  /* 1068 */  [ 0.333154028, 15 ],
+  /* 1069 */  [ 0.333570016, 15 ],
+  /* 1070 */  [ 0.333986133, 15 ],
+  /* 1071 */  [ 0.334402380, 15 ],
+
+  /* 1072 */  [ 0.334818756, 15 ],
+  /* 1073 */  [ 0.335235262, 15 ],
+  /* 1074 */  [ 0.335651898, 15 ],
+  /* 1075 */  [ 0.336068662, 15 ],
+  /* 1076 */  [ 0.336485556, 15 ],
+  /* 1077 */  [ 0.336902579, 15 ],
+  /* 1078 */  [ 0.337319732, 15 ],
+  /* 1079 */  [ 0.337737013, 15 ],
+  /* 1080 */  [ 0.338154423, 15 ],
+  /* 1081 */  [ 0.338571962, 15 ],
+  /* 1082 */  [ 0.338989630, 15 ],
+  /* 1083 */  [ 0.339407426, 15 ],
+  /* 1084 */  [ 0.339825351, 15 ],
+  /* 1085 */  [ 0.340243405, 15 ],
+  /* 1086 */  [ 0.340661587, 15 ],
+  /* 1087 */  [ 0.341079898, 15 ],
+
+  /* 1088 */  [ 0.341498336, 15 ],
+  /* 1089 */  [ 0.341916903, 15 ],
+  /* 1090 */  [ 0.342335598, 15 ],
+  /* 1091 */  [ 0.342754421, 15 ],
+  /* 1092 */  [ 0.343173373, 15 ],
+  /* 1093 */  [ 0.343592452, 15 ],
+  /* 1094 */  [ 0.344011659, 15 ],
+  /* 1095 */  [ 0.344430993, 15 ],
+  /* 1096 */  [ 0.344850455, 15 ],
+  /* 1097 */  [ 0.345270045, 15 ],
+  /* 1098 */  [ 0.345689763, 15 ],
+  /* 1099 */  [ 0.346109608, 15 ],
+  /* 1100 */  [ 0.346529580, 15 ],
+  /* 1101 */  [ 0.346949679, 15 ],
+  /* 1102 */  [ 0.347369906, 15 ],
+  /* 1103 */  [ 0.347790260, 15 ],
+
+  /* 1104 */  [ 0.348210741, 15 ],
+  /* 1105 */  [ 0.348631348, 15 ],
+  /* 1106 */  [ 0.349052083, 15 ],
+  /* 1107 */  [ 0.349472945, 15 ],
+  /* 1108 */  [ 0.349893933, 15 ],
+  /* 1109 */  [ 0.350315048, 15 ],
+  /* 1110 */  [ 0.350736290, 15 ],
+  /* 1111 */  [ 0.351157658, 15 ],
+  /* 1112 */  [ 0.351579152, 15 ],
+  /* 1113 */  [ 0.352000773, 15 ],
+  /* 1114 */  [ 0.352422520, 15 ],
+  /* 1115 */  [ 0.352844394, 15 ],
+  /* 1116 */  [ 0.353266393, 15 ],
+  /* 1117 */  [ 0.353688519, 15 ],
+  /* 1118 */  [ 0.354110771, 15 ],
+  /* 1119 */  [ 0.354533148, 15 ],
+
+  /* 1120 */  [ 0.354955651, 15 ],
+  /* 1121 */  [ 0.355378281, 15 ],
+  /* 1122 */  [ 0.355801035, 15 ],
+  /* 1123 */  [ 0.356223916, 15 ],
+  /* 1124 */  [ 0.356646922, 15 ],
+  /* 1125 */  [ 0.357070053, 15 ],
+  /* 1126 */  [ 0.357493310, 15 ],
+  /* 1127 */  [ 0.357916692, 15 ],
+  /* 1128 */  [ 0.358340200, 15 ],
+  /* 1129 */  [ 0.358763832, 15 ],
+  /* 1130 */  [ 0.359187590, 15 ],
+  /* 1131 */  [ 0.359611472, 15 ],
+  /* 1132 */  [ 0.360035480, 15 ],
+  /* 1133 */  [ 0.360459613, 15 ],
+  /* 1134 */  [ 0.360883870, 15 ],
+  /* 1135 */  [ 0.361308252, 15 ],
+
+  /* 1136 */  [ 0.361732758, 15 ],
+  /* 1137 */  [ 0.362157390, 15 ],
+  /* 1138 */  [ 0.362582145, 15 ],
+  /* 1139 */  [ 0.363007026, 15 ],
+  /* 1140 */  [ 0.363432030, 15 ],
+  /* 1141 */  [ 0.363857159, 15 ],
+  /* 1142 */  [ 0.364282412, 15 ],
+  /* 1143 */  [ 0.364707789, 15 ],
+  /* 1144 */  [ 0.365133291, 15 ],
+  /* 1145 */  [ 0.365558916, 15 ],
+  /* 1146 */  [ 0.365984665, 15 ],
+  /* 1147 */  [ 0.366410538, 15 ],
+  /* 1148 */  [ 0.366836535, 15 ],
+  /* 1149 */  [ 0.367262655, 15 ],
+  /* 1150 */  [ 0.367688900, 15 ],
+  /* 1151 */  [ 0.368115267, 15 ],
+
+  /* 1152 */  [ 0.368541759, 15 ],
+  /* 1153 */  [ 0.368968373, 15 ],
+  /* 1154 */  [ 0.369395111, 15 ],
+  /* 1155 */  [ 0.369821973, 15 ],
+  /* 1156 */  [ 0.370248957, 15 ],
+  /* 1157 */  [ 0.370676065, 15 ],
+  /* 1158 */  [ 0.371103295, 15 ],
+  /* 1159 */  [ 0.371530649, 15 ],
+  /* 1160 */  [ 0.371958126, 15 ],
+  /* 1161 */  [ 0.372385725, 15 ],
+  /* 1162 */  [ 0.372813448, 15 ],
+  /* 1163 */  [ 0.373241292, 15 ],
+  /* 1164 */  [ 0.373669260, 15 ],
+  /* 1165 */  [ 0.374097350, 15 ],
+  /* 1166 */  [ 0.374525563, 15 ],
+  /* 1167 */  [ 0.374953898, 15 ],
+
+  /* 1168 */  [ 0.375382356, 15 ],
+  /* 1169 */  [ 0.375810936, 15 ],
+  /* 1170 */  [ 0.376239638, 15 ],
+  /* 1171 */  [ 0.376668462, 15 ],
+  /* 1172 */  [ 0.377097408, 15 ],
+  /* 1173 */  [ 0.377526476, 15 ],
+  /* 1174 */  [ 0.377955667, 15 ],
+  /* 1175 */  [ 0.378384979, 15 ],
+  /* 1176 */  [ 0.378814413, 15 ],
+  /* 1177 */  [ 0.379243968, 15 ],
+  /* 1178 */  [ 0.379673646, 15 ],
+  /* 1179 */  [ 0.380103444, 15 ],
+  /* 1180 */  [ 0.380533365, 15 ],
+  /* 1181 */  [ 0.380963407, 15 ],
+  /* 1182 */  [ 0.381393570, 15 ],
+  /* 1183 */  [ 0.381823855, 15 ],
+
+  /* 1184 */  [ 0.382254261, 15 ],
+  /* 1185 */  [ 0.382684788, 15 ],
+  /* 1186 */  [ 0.383115436, 15 ],
+  /* 1187 */  [ 0.383546205, 15 ],
+  /* 1188 */  [ 0.383977096, 15 ],
+  /* 1189 */  [ 0.384408107, 15 ],
+  /* 1190 */  [ 0.384839239, 15 ],
+  /* 1191 */  [ 0.385270492, 15 ],
+  /* 1192 */  [ 0.385701865, 15 ],
+  /* 1193 */  [ 0.386133359, 15 ],
+  /* 1194 */  [ 0.386564974, 15 ],
+  /* 1195 */  [ 0.386996709, 15 ],
+  /* 1196 */  [ 0.387428565, 15 ],
+  /* 1197 */  [ 0.387860541, 15 ],
+  /* 1198 */  [ 0.388292637, 15 ],
+  /* 1199 */  [ 0.388724854, 15 ],
+
+  /* 1200 */  [ 0.389157191, 15 ],
+  /* 1201 */  [ 0.389589648, 15 ],
+  /* 1202 */  [ 0.390022225, 15 ],
+  /* 1203 */  [ 0.390454922, 15 ],
+  /* 1204 */  [ 0.390887739, 15 ],
+  /* 1205 */  [ 0.391320675, 15 ],
+  /* 1206 */  [ 0.391753732, 15 ],
+  /* 1207 */  [ 0.392186908, 15 ],
+  /* 1208 */  [ 0.392620204, 15 ],
+  /* 1209 */  [ 0.393053619, 15 ],
+  /* 1210 */  [ 0.393487154, 15 ],
+  /* 1211 */  [ 0.393920808, 15 ],
+  /* 1212 */  [ 0.394354582, 15 ],
+  /* 1213 */  [ 0.394788475, 15 ],
+  /* 1214 */  [ 0.395222488, 15 ],
+  /* 1215 */  [ 0.395656619, 15 ],
+
+  /* 1216 */  [ 0.396090870, 15 ],
+  /* 1217 */  [ 0.396525239, 15 ],
+  /* 1218 */  [ 0.396959728, 15 ],
+  /* 1219 */  [ 0.397394336, 15 ],
+  /* 1220 */  [ 0.397829062, 15 ],
+  /* 1221 */  [ 0.398263907, 15 ],
+  /* 1222 */  [ 0.398698871, 15 ],
+  /* 1223 */  [ 0.399133954, 15 ],
+  /* 1224 */  [ 0.399569155, 15 ],
+  /* 1225 */  [ 0.400004475, 15 ],
+  /* 1226 */  [ 0.400439913, 15 ],
+  /* 1227 */  [ 0.400875470, 15 ],
+  /* 1228 */  [ 0.401311145, 15 ],
+  /* 1229 */  [ 0.401746938, 15 ],
+  /* 1230 */  [ 0.402182850, 15 ],
+  /* 1231 */  [ 0.402618879, 15 ],
+
+  /* 1232 */  [ 0.403055027, 15 ],
+  /* 1233 */  [ 0.403491293, 15 ],
+  /* 1234 */  [ 0.403927676, 15 ],
+  /* 1235 */  [ 0.404364178, 15 ],
+  /* 1236 */  [ 0.404800797, 15 ],
+  /* 1237 */  [ 0.405237535, 15 ],
+  /* 1238 */  [ 0.405674390, 15 ],
+  /* 1239 */  [ 0.406111362, 15 ],
+  /* 1240 */  [ 0.406548452, 15 ],
+  /* 1241 */  [ 0.406985660, 15 ],
+  /* 1242 */  [ 0.407422985, 15 ],
+  /* 1243 */  [ 0.407860427, 15 ],
+  /* 1244 */  [ 0.408297987, 15 ],
+  /* 1245 */  [ 0.408735664, 15 ],
+  /* 1246 */  [ 0.409173458, 15 ],
+  /* 1247 */  [ 0.409611370, 15 ],
+
+  /* 1248 */  [ 0.410049398, 15 ],
+  /* 1249 */  [ 0.410487544, 15 ],
+  /* 1250 */  [ 0.410925806, 15 ],
+  /* 1251 */  [ 0.411364185, 15 ],
+  /* 1252 */  [ 0.411802681, 15 ],
+  /* 1253 */  [ 0.412241294, 15 ],
+  /* 1254 */  [ 0.412680024, 15 ],
+  /* 1255 */  [ 0.413118870, 15 ],
+  /* 1256 */  [ 0.413557833, 15 ],
+  /* 1257 */  [ 0.413996912, 15 ],
+  /* 1258 */  [ 0.414436108, 15 ],
+  /* 1259 */  [ 0.414875420, 15 ],
+  /* 1260 */  [ 0.415314849, 15 ],
+  /* 1261 */  [ 0.415754393, 15 ],
+  /* 1262 */  [ 0.416194054, 15 ],
+  /* 1263 */  [ 0.416633831, 15 ],
+
+  /* 1264 */  [ 0.417073724, 15 ],
+  /* 1265 */  [ 0.417513734, 15 ],
+  /* 1266 */  [ 0.417953859, 15 ],
+  /* 1267 */  [ 0.418394100, 15 ],
+  /* 1268 */  [ 0.418834457, 15 ],
+  /* 1269 */  [ 0.419274929, 15 ],
+  /* 1270 */  [ 0.419715518, 15 ],
+  /* 1271 */  [ 0.420156222, 15 ],
+  /* 1272 */  [ 0.420597041, 15 ],
+  /* 1273 */  [ 0.421037977, 15 ],
+  /* 1274 */  [ 0.421479027, 15 ],
+  /* 1275 */  [ 0.421920193, 15 ],
+  /* 1276 */  [ 0.422361475, 15 ],
+  /* 1277 */  [ 0.422802871, 15 ],
+  /* 1278 */  [ 0.423244383, 15 ],
+  /* 1279 */  [ 0.423686010, 15 ],
+
+  /* 1280 */  [ 0.424127753, 15 ],
+  /* 1281 */  [ 0.424569610, 15 ],
+  /* 1282 */  [ 0.425011582, 15 ],
+  /* 1283 */  [ 0.425453669, 15 ],
+  /* 1284 */  [ 0.425895871, 15 ],
+  /* 1285 */  [ 0.426338188, 15 ],
+  /* 1286 */  [ 0.426780620, 15 ],
+  /* 1287 */  [ 0.427223166, 15 ],
+  /* 1288 */  [ 0.427665827, 15 ],
+  /* 1289 */  [ 0.428108603, 15 ],
+  /* 1290 */  [ 0.428551493, 15 ],
+  /* 1291 */  [ 0.428994497, 15 ],
+  /* 1292 */  [ 0.429437616, 15 ],
+  /* 1293 */  [ 0.429880849, 15 ],
+  /* 1294 */  [ 0.430324197, 15 ],
+  /* 1295 */  [ 0.430767659, 15 ],
+
+  /* 1296 */  [ 0.431211234, 15 ],
+  /* 1297 */  [ 0.431654924, 15 ],
+  /* 1298 */  [ 0.432098728, 15 ],
+  /* 1299 */  [ 0.432542647, 15 ],
+  /* 1300 */  [ 0.432986678, 15 ],
+  /* 1301 */  [ 0.433430824, 15 ],
+  /* 1302 */  [ 0.433875084, 15 ],
+  /* 1303 */  [ 0.434319457, 15 ],
+  /* 1304 */  [ 0.434763944, 15 ],
+  /* 1305 */  [ 0.435208545, 15 ],
+  /* 1306 */  [ 0.435653259, 15 ],
+  /* 1307 */  [ 0.436098087, 15 ],
+  /* 1308 */  [ 0.436543029, 15 ],
+  /* 1309 */  [ 0.436988083, 15 ],
+  /* 1310 */  [ 0.437433251, 15 ],
+  /* 1311 */  [ 0.437878533, 15 ],
+
+  /* 1312 */  [ 0.438323927, 15 ],
+  /* 1313 */  [ 0.438769435, 15 ],
+  /* 1314 */  [ 0.439215056, 15 ],
+  /* 1315 */  [ 0.439660790, 15 ],
+  /* 1316 */  [ 0.440106636, 15 ],
+  /* 1317 */  [ 0.440552596, 15 ],
+  /* 1318 */  [ 0.440998669, 15 ],
+  /* 1319 */  [ 0.441444855, 15 ],
+  /* 1320 */  [ 0.441891153, 15 ],
+  /* 1321 */  [ 0.442337564, 15 ],
+  /* 1322 */  [ 0.442784088, 15 ],
+  /* 1323 */  [ 0.443230724, 15 ],
+  /* 1324 */  [ 0.443677473, 15 ],
+  /* 1325 */  [ 0.444124334, 15 ],
+  /* 1326 */  [ 0.444571308, 15 ],
+  /* 1327 */  [ 0.445018394, 15 ],
+
+  /* 1328 */  [ 0.445465593, 15 ],
+  /* 1329 */  [ 0.445912903, 15 ],
+  /* 1330 */  [ 0.446360326, 15 ],
+  /* 1331 */  [ 0.446807861, 15 ],
+  /* 1332 */  [ 0.447255509, 15 ],
+  /* 1333 */  [ 0.447703268, 15 ],
+  /* 1334 */  [ 0.448151139, 15 ],
+  /* 1335 */  [ 0.448599122, 15 ],
+  /* 1336 */  [ 0.449047217, 15 ],
+  /* 1337 */  [ 0.449495424, 15 ],
+  /* 1338 */  [ 0.449943742, 15 ],
+  /* 1339 */  [ 0.450392173, 15 ],
+  /* 1340 */  [ 0.450840715, 15 ],
+  /* 1341 */  [ 0.451289368, 15 ],
+  /* 1342 */  [ 0.451738133, 15 ],
+  /* 1343 */  [ 0.452187010, 15 ],
+
+  /* 1344 */  [ 0.452635998, 15 ],
+  /* 1345 */  [ 0.453085097, 15 ],
+  /* 1346 */  [ 0.453534308, 15 ],
+  /* 1347 */  [ 0.453983630, 15 ],
+  /* 1348 */  [ 0.454433063, 15 ],
+  /* 1349 */  [ 0.454882607, 15 ],
+  /* 1350 */  [ 0.455332262, 15 ],
+  /* 1351 */  [ 0.455782029, 15 ],
+  /* 1352 */  [ 0.456231906, 15 ],
+  /* 1353 */  [ 0.456681894, 15 ],
+  /* 1354 */  [ 0.457131993, 15 ],
+  /* 1355 */  [ 0.457582203, 15 ],
+  /* 1356 */  [ 0.458032524, 15 ],
+  /* 1357 */  [ 0.458482956, 15 ],
+  /* 1358 */  [ 0.458933498, 15 ],
+  /* 1359 */  [ 0.459384151, 15 ],
+
+  /* 1360 */  [ 0.459834914, 15 ],
+  /* 1361 */  [ 0.460285788, 15 ],
+  /* 1362 */  [ 0.460736772, 15 ],
+  /* 1363 */  [ 0.461187867, 15 ],
+  /* 1364 */  [ 0.461639071, 15 ],
+  /* 1365 */  [ 0.462090387, 15 ],
+  /* 1366 */  [ 0.462541812, 15 ],
+  /* 1367 */  [ 0.462993348, 15 ],
+  /* 1368 */  [ 0.463444993, 15 ],
+  /* 1369 */  [ 0.463896749, 15 ],
+  /* 1370 */  [ 0.464348615, 15 ],
+  /* 1371 */  [ 0.464800591, 15 ],
+  /* 1372 */  [ 0.465252676, 15 ],
+  /* 1373 */  [ 0.465704872, 15 ],
+  /* 1374 */  [ 0.466157177, 15 ],
+  /* 1375 */  [ 0.466609592, 15 ],
+
+  /* 1376 */  [ 0.467062117, 15 ],
+  /* 1377 */  [ 0.467514751, 15 ],
+  /* 1378 */  [ 0.467967495, 15 ],
+  /* 1379 */  [ 0.468420349, 15 ],
+  /* 1380 */  [ 0.468873312, 15 ],
+  /* 1381 */  [ 0.469326384, 15 ],
+  /* 1382 */  [ 0.469779566, 15 ],
+  /* 1383 */  [ 0.470232857, 15 ],
+  /* 1384 */  [ 0.470686258, 15 ],
+  /* 1385 */  [ 0.471139767, 15 ],
+  /* 1386 */  [ 0.471593386, 15 ],
+  /* 1387 */  [ 0.472047114, 15 ],
+  /* 1388 */  [ 0.472500951, 15 ],
+  /* 1389 */  [ 0.472954896, 15 ],
+  /* 1390 */  [ 0.473408951, 15 ],
+  /* 1391 */  [ 0.473863115, 15 ],
+
+  /* 1392 */  [ 0.474317388, 15 ],
+  /* 1393 */  [ 0.474771769, 15 ],
+  /* 1394 */  [ 0.475226259, 15 ],
+  /* 1395 */  [ 0.475680858, 15 ],
+  /* 1396 */  [ 0.476135565, 15 ],
+  /* 1397 */  [ 0.476590381, 15 ],
+  /* 1398 */  [ 0.477045306, 15 ],
+  /* 1399 */  [ 0.477500339, 15 ],
+  /* 1400 */  [ 0.477955481, 15 ],
+  /* 1401 */  [ 0.478410731, 15 ],
+  /* 1402 */  [ 0.478866089, 15 ],
+  /* 1403 */  [ 0.479321555, 15 ],
+  /* 1404 */  [ 0.479777130, 15 ],
+  /* 1405 */  [ 0.480232813, 15 ],
+  /* 1406 */  [ 0.480688604, 15 ],
+  /* 1407 */  [ 0.481144503, 15 ],
+
+  /* 1408 */  [ 0.481600510, 15 ],
+  /* 1409 */  [ 0.482056625, 15 ],
+  /* 1410 */  [ 0.482512848, 15 ],
+  /* 1411 */  [ 0.482969179, 15 ],
+  /* 1412 */  [ 0.483425618, 15 ],
+  /* 1413 */  [ 0.483882164, 15 ],
+  /* 1414 */  [ 0.484338818, 15 ],
+  /* 1415 */  [ 0.484795580, 15 ],
+  /* 1416 */  [ 0.485252449, 15 ],
+  /* 1417 */  [ 0.485709426, 15 ],
+  /* 1418 */  [ 0.486166511, 15 ],
+  /* 1419 */  [ 0.486623703, 15 ],
+  /* 1420 */  [ 0.487081002, 15 ],
+  /* 1421 */  [ 0.487538409, 15 ],
+  /* 1422 */  [ 0.487995923, 15 ],
+  /* 1423 */  [ 0.488453544, 15 ],
+
+  /* 1424 */  [ 0.488911273, 15 ],
+  /* 1425 */  [ 0.489369108, 15 ],
+  /* 1426 */  [ 0.489827051, 15 ],
+  /* 1427 */  [ 0.490285101, 15 ],
+  /* 1428 */  [ 0.490743258, 15 ],
+  /* 1429 */  [ 0.491201522, 15 ],
+  /* 1430 */  [ 0.491659892, 15 ],
+  /* 1431 */  [ 0.492118370, 15 ],
+  /* 1432 */  [ 0.492576954, 15 ],
+  /* 1433 */  [ 0.493035645, 15 ],
+  /* 1434 */  [ 0.493494443, 15 ],
+  /* 1435 */  [ 0.493953348, 15 ],
+  /* 1436 */  [ 0.494412359, 15 ],
+  /* 1437 */  [ 0.494871476, 15 ],
+  /* 1438 */  [ 0.495330701, 15 ],
+  /* 1439 */  [ 0.495790031, 15 ],
+
+  /* 1440 */  [ 0.496249468, 15 ],
+  /* 1441 */  [ 0.496709012, 15 ],
+  /* 1442 */  [ 0.497168662, 15 ],
+  /* 1443 */  [ 0.497628418, 15 ],
+  /* 1444 */  [ 0.498088280, 15 ],
+  /* 1445 */  [ 0.498548248, 15 ],
+  /* 1446 */  [ 0.499008323, 15 ],
+  /* 1447 */  [ 0.499468503, 15 ],
+  /* 1448 */  [ 0.499928790, 15 ],
+  /* 1449 */  [ 0.250194591, 16 ],
+  /* 1450 */  [ 0.250424840, 16 ],
+  /* 1451 */  [ 0.250655143, 16 ],
+  /* 1452 */  [ 0.250885498, 16 ],
+  /* 1453 */  [ 0.251115906, 16 ],
+  /* 1454 */  [ 0.251346367, 16 ],
+  /* 1455 */  [ 0.251576880, 16 ],
+
+  /* 1456 */  [ 0.251807447, 16 ],
+  /* 1457 */  [ 0.252038066, 16 ],
+  /* 1458 */  [ 0.252268738, 16 ],
+  /* 1459 */  [ 0.252499463, 16 ],
+  /* 1460 */  [ 0.252730240, 16 ],
+  /* 1461 */  [ 0.252961071, 16 ],
+  /* 1462 */  [ 0.253191953, 16 ],
+  /* 1463 */  [ 0.253422889, 16 ],
+  /* 1464 */  [ 0.253653877, 16 ],
+  /* 1465 */  [ 0.253884918, 16 ],
+  /* 1466 */  [ 0.254116011, 16 ],
+  /* 1467 */  [ 0.254347157, 16 ],
+  /* 1468 */  [ 0.254578356, 16 ],
+  /* 1469 */  [ 0.254809606, 16 ],
+  /* 1470 */  [ 0.255040910, 16 ],
+  /* 1471 */  [ 0.255272266, 16 ],
+
+  /* 1472 */  [ 0.255503674, 16 ],
+  /* 1473 */  [ 0.255735135, 16 ],
+  /* 1474 */  [ 0.255966648, 16 ],
+  /* 1475 */  [ 0.256198213, 16 ],
+  /* 1476 */  [ 0.256429831, 16 ],
+  /* 1477 */  [ 0.256661501, 16 ],
+  /* 1478 */  [ 0.256893223, 16 ],
+  /* 1479 */  [ 0.257124998, 16 ],
+  /* 1480 */  [ 0.257356825, 16 ],
+  /* 1481 */  [ 0.257588704, 16 ],
+  /* 1482 */  [ 0.257820635, 16 ],
+  /* 1483 */  [ 0.258052619, 16 ],
+  /* 1484 */  [ 0.258284654, 16 ],
+  /* 1485 */  [ 0.258516742, 16 ],
+  /* 1486 */  [ 0.258748882, 16 ],
+  /* 1487 */  [ 0.258981074, 16 ],
+
+  /* 1488 */  [ 0.259213318, 16 ],
+  /* 1489 */  [ 0.259445614, 16 ],
+  /* 1490 */  [ 0.259677962, 16 ],
+  /* 1491 */  [ 0.259910362, 16 ],
+  /* 1492 */  [ 0.260142814, 16 ],
+  /* 1493 */  [ 0.260375318, 16 ],
+  /* 1494 */  [ 0.260607874, 16 ],
+  /* 1495 */  [ 0.260840481, 16 ],
+  /* 1496 */  [ 0.261073141, 16 ],
+  /* 1497 */  [ 0.261305852, 16 ],
+  /* 1498 */  [ 0.261538616, 16 ],
+  /* 1499 */  [ 0.261771431, 16 ],
+  /* 1500 */  [ 0.262004297, 16 ],
+  /* 1501 */  [ 0.262237216, 16 ],
+  /* 1502 */  [ 0.262470186, 16 ],
+  /* 1503 */  [ 0.262703208, 16 ],
+
+  /* 1504 */  [ 0.262936282, 16 ],
+  /* 1505 */  [ 0.263169407, 16 ],
+  /* 1506 */  [ 0.263402584, 16 ],
+  /* 1507 */  [ 0.263635813, 16 ],
+  /* 1508 */  [ 0.263869093, 16 ],
+  /* 1509 */  [ 0.264102425, 16 ],
+  /* 1510 */  [ 0.264335808, 16 ],
+  /* 1511 */  [ 0.264569243, 16 ],
+  /* 1512 */  [ 0.264802730, 16 ],
+  /* 1513 */  [ 0.265036267, 16 ],
+  /* 1514 */  [ 0.265269857, 16 ],
+  /* 1515 */  [ 0.265503498, 16 ],
+  /* 1516 */  [ 0.265737190, 16 ],
+  /* 1517 */  [ 0.265970933, 16 ],
+  /* 1518 */  [ 0.266204728, 16 ],
+  /* 1519 */  [ 0.266438574, 16 ],
+
+  /* 1520 */  [ 0.266672472, 16 ],
+  /* 1521 */  [ 0.266906421, 16 ],
+  /* 1522 */  [ 0.267140421, 16 ],
+  /* 1523 */  [ 0.267374472, 16 ],
+  /* 1524 */  [ 0.267608575, 16 ],
+  /* 1525 */  [ 0.267842729, 16 ],
+  /* 1526 */  [ 0.268076934, 16 ],
+  /* 1527 */  [ 0.268311190, 16 ],
+  /* 1528 */  [ 0.268545497, 16 ],
+  /* 1529 */  [ 0.268779856, 16 ],
+  /* 1530 */  [ 0.269014265, 16 ],
+  /* 1531 */  [ 0.269248726, 16 ],
+  /* 1532 */  [ 0.269483238, 16 ],
+  /* 1533 */  [ 0.269717800, 16 ],
+  /* 1534 */  [ 0.269952414, 16 ],
+  /* 1535 */  [ 0.270187079, 16 ],
+
+  /* 1536 */  [ 0.270421794, 16 ],
+  /* 1537 */  [ 0.270656561, 16 ],
+  /* 1538 */  [ 0.270891379, 16 ],
+  /* 1539 */  [ 0.271126247, 16 ],
+  /* 1540 */  [ 0.271361166, 16 ],
+  /* 1541 */  [ 0.271596136, 16 ],
+  /* 1542 */  [ 0.271831157, 16 ],
+  /* 1543 */  [ 0.272066229, 16 ],
+  /* 1544 */  [ 0.272301352, 16 ],
+  /* 1545 */  [ 0.272536525, 16 ],
+  /* 1546 */  [ 0.272771749, 16 ],
+  /* 1547 */  [ 0.273007024, 16 ],
+  /* 1548 */  [ 0.273242350, 16 ],
+  /* 1549 */  [ 0.273477726, 16 ],
+  /* 1550 */  [ 0.273713153, 16 ],
+  /* 1551 */  [ 0.273948630, 16 ],
+
+  /* 1552 */  [ 0.274184158, 16 ],
+  /* 1553 */  [ 0.274419737, 16 ],
+  /* 1554 */  [ 0.274655366, 16 ],
+  /* 1555 */  [ 0.274891046, 16 ],
+  /* 1556 */  [ 0.275126776, 16 ],
+  /* 1557 */  [ 0.275362557, 16 ],
+  /* 1558 */  [ 0.275598389, 16 ],
+  /* 1559 */  [ 0.275834270, 16 ],
+  /* 1560 */  [ 0.276070203, 16 ],
+  /* 1561 */  [ 0.276306185, 16 ],
+  /* 1562 */  [ 0.276542218, 16 ],
+  /* 1563 */  [ 0.276778302, 16 ],
+  /* 1564 */  [ 0.277014435, 16 ],
+  /* 1565 */  [ 0.277250619, 16 ],
+  /* 1566 */  [ 0.277486854, 16 ],
+  /* 1567 */  [ 0.277723139, 16 ],
+
+  /* 1568 */  [ 0.277959474, 16 ],
+  /* 1569 */  [ 0.278195859, 16 ],
+  /* 1570 */  [ 0.278432294, 16 ],
+  /* 1571 */  [ 0.278668780, 16 ],
+  /* 1572 */  [ 0.278905316, 16 ],
+  /* 1573 */  [ 0.279141902, 16 ],
+  /* 1574 */  [ 0.279378538, 16 ],
+  /* 1575 */  [ 0.279615224, 16 ],
+  /* 1576 */  [ 0.279851960, 16 ],
+  /* 1577 */  [ 0.280088747, 16 ],
+  /* 1578 */  [ 0.280325583, 16 ],
+  /* 1579 */  [ 0.280562470, 16 ],
+  /* 1580 */  [ 0.280799406, 16 ],
+  /* 1581 */  [ 0.281036393, 16 ],
+  /* 1582 */  [ 0.281273429, 16 ],
+  /* 1583 */  [ 0.281510516, 16 ],
+
+  /* 1584 */  [ 0.281747652, 16 ],
+  /* 1585 */  [ 0.281984838, 16 ],
+  /* 1586 */  [ 0.282222075, 16 ],
+  /* 1587 */  [ 0.282459361, 16 ],
+  /* 1588 */  [ 0.282696697, 16 ],
+  /* 1589 */  [ 0.282934082, 16 ],
+  /* 1590 */  [ 0.283171518, 16 ],
+  /* 1591 */  [ 0.283409003, 16 ],
+  /* 1592 */  [ 0.283646538, 16 ],
+  /* 1593 */  [ 0.283884123, 16 ],
+  /* 1594 */  [ 0.284121757, 16 ],
+  /* 1595 */  [ 0.284359441, 16 ],
+  /* 1596 */  [ 0.284597175, 16 ],
+  /* 1597 */  [ 0.284834959, 16 ],
+  /* 1598 */  [ 0.285072792, 16 ],
+  /* 1599 */  [ 0.285310675, 16 ],
+
+  /* 1600 */  [ 0.285548607, 16 ],
+  /* 1601 */  [ 0.285786589, 16 ],
+  /* 1602 */  [ 0.286024621, 16 ],
+  /* 1603 */  [ 0.286262702, 16 ],
+  /* 1604 */  [ 0.286500832, 16 ],
+  /* 1605 */  [ 0.286739012, 16 ],
+  /* 1606 */  [ 0.286977242, 16 ],
+  /* 1607 */  [ 0.287215521, 16 ],
+  /* 1608 */  [ 0.287453849, 16 ],
+  /* 1609 */  [ 0.287692227, 16 ],
+  /* 1610 */  [ 0.287930654, 16 ],
+  /* 1611 */  [ 0.288169131, 16 ],
+  /* 1612 */  [ 0.288407657, 16 ],
+  /* 1613 */  [ 0.288646232, 16 ],
+  /* 1614 */  [ 0.288884857, 16 ],
+  /* 1615 */  [ 0.289123530, 16 ],
+
+  /* 1616 */  [ 0.289362253, 16 ],
+  /* 1617 */  [ 0.289601026, 16 ],
+  /* 1618 */  [ 0.289839847, 16 ],
+  /* 1619 */  [ 0.290078718, 16 ],
+  /* 1620 */  [ 0.290317638, 16 ],
+  /* 1621 */  [ 0.290556607, 16 ],
+  /* 1622 */  [ 0.290795626, 16 ],
+  /* 1623 */  [ 0.291034693, 16 ],
+  /* 1624 */  [ 0.291273810, 16 ],
+  /* 1625 */  [ 0.291512975, 16 ],
+  /* 1626 */  [ 0.291752190, 16 ],
+  /* 1627 */  [ 0.291991453, 16 ],
+  /* 1628 */  [ 0.292230766, 16 ],
+  /* 1629 */  [ 0.292470128, 16 ],
+  /* 1630 */  [ 0.292709539, 16 ],
+  /* 1631 */  [ 0.292948998, 16 ],
+
+  /* 1632 */  [ 0.293188507, 16 ],
+  /* 1633 */  [ 0.293428065, 16 ],
+  /* 1634 */  [ 0.293667671, 16 ],
+  /* 1635 */  [ 0.293907326, 16 ],
+  /* 1636 */  [ 0.294147031, 16 ],
+  /* 1637 */  [ 0.294386784, 16 ],
+  /* 1638 */  [ 0.294626585, 16 ],
+  /* 1639 */  [ 0.294866436, 16 ],
+  /* 1640 */  [ 0.295106336, 16 ],
+  /* 1641 */  [ 0.295346284, 16 ],
+  /* 1642 */  [ 0.295586281, 16 ],
+  /* 1643 */  [ 0.295826327, 16 ],
+  /* 1644 */  [ 0.296066421, 16 ],
+  /* 1645 */  [ 0.296306564, 16 ],
+  /* 1646 */  [ 0.296546756, 16 ],
+  /* 1647 */  [ 0.296786996, 16 ],
+
+  /* 1648 */  [ 0.297027285, 16 ],
+  /* 1649 */  [ 0.297267623, 16 ],
+  /* 1650 */  [ 0.297508009, 16 ],
+  /* 1651 */  [ 0.297748444, 16 ],
+  /* 1652 */  [ 0.297988927, 16 ],
+  /* 1653 */  [ 0.298229459, 16 ],
+  /* 1654 */  [ 0.298470039, 16 ],
+  /* 1655 */  [ 0.298710668, 16 ],
+  /* 1656 */  [ 0.298951346, 16 ],
+  /* 1657 */  [ 0.299192071, 16 ],
+  /* 1658 */  [ 0.299432846, 16 ],
+  /* 1659 */  [ 0.299673668, 16 ],
+  /* 1660 */  [ 0.299914539, 16 ],
+  /* 1661 */  [ 0.300155459, 16 ],
+  /* 1662 */  [ 0.300396426, 16 ],
+  /* 1663 */  [ 0.300637443, 16 ],
+
+  /* 1664 */  [ 0.300878507, 16 ],
+  /* 1665 */  [ 0.301119620, 16 ],
+  /* 1666 */  [ 0.301360781, 16 ],
+  /* 1667 */  [ 0.301601990, 16 ],
+  /* 1668 */  [ 0.301843247, 16 ],
+  /* 1669 */  [ 0.302084553, 16 ],
+  /* 1670 */  [ 0.302325907, 16 ],
+  /* 1671 */  [ 0.302567309, 16 ],
+  /* 1672 */  [ 0.302808759, 16 ],
+  /* 1673 */  [ 0.303050257, 16 ],
+  /* 1674 */  [ 0.303291804, 16 ],
+  /* 1675 */  [ 0.303533399, 16 ],
+  /* 1676 */  [ 0.303775041, 16 ],
+  /* 1677 */  [ 0.304016732, 16 ],
+  /* 1678 */  [ 0.304258471, 16 ],
+  /* 1679 */  [ 0.304500257, 16 ],
+
+  /* 1680 */  [ 0.304742092, 16 ],
+  /* 1681 */  [ 0.304983975, 16 ],
+  /* 1682 */  [ 0.305225906, 16 ],
+  /* 1683 */  [ 0.305467885, 16 ],
+  /* 1684 */  [ 0.305709911, 16 ],
+  /* 1685 */  [ 0.305951986, 16 ],
+  /* 1686 */  [ 0.306194108, 16 ],
+  /* 1687 */  [ 0.306436279, 16 ],
+  /* 1688 */  [ 0.306678497, 16 ],
+  /* 1689 */  [ 0.306920763, 16 ],
+  /* 1690 */  [ 0.307163077, 16 ],
+  /* 1691 */  [ 0.307405438, 16 ],
+  /* 1692 */  [ 0.307647848, 16 ],
+  /* 1693 */  [ 0.307890305, 16 ],
+  /* 1694 */  [ 0.308132810, 16 ],
+  /* 1695 */  [ 0.308375362, 16 ],
+
+  /* 1696 */  [ 0.308617963, 16 ],
+  /* 1697 */  [ 0.308860611, 16 ],
+  /* 1698 */  [ 0.309103306, 16 ],
+  /* 1699 */  [ 0.309346050, 16 ],
+  /* 1700 */  [ 0.309588841, 16 ],
+  /* 1701 */  [ 0.309831679, 16 ],
+  /* 1702 */  [ 0.310074565, 16 ],
+  /* 1703 */  [ 0.310317499, 16 ],
+  /* 1704 */  [ 0.310560480, 16 ],
+  /* 1705 */  [ 0.310803509, 16 ],
+  /* 1706 */  [ 0.311046586, 16 ],
+  /* 1707 */  [ 0.311289710, 16 ],
+  /* 1708 */  [ 0.311532881, 16 ],
+  /* 1709 */  [ 0.311776100, 16 ],
+  /* 1710 */  [ 0.312019366, 16 ],
+  /* 1711 */  [ 0.312262680, 16 ],
+
+  /* 1712 */  [ 0.312506041, 16 ],
+  /* 1713 */  [ 0.312749449, 16 ],
+  /* 1714 */  [ 0.312992905, 16 ],
+  /* 1715 */  [ 0.313236408, 16 ],
+  /* 1716 */  [ 0.313479959, 16 ],
+  /* 1717 */  [ 0.313723556, 16 ],
+  /* 1718 */  [ 0.313967202, 16 ],
+  /* 1719 */  [ 0.314210894, 16 ],
+  /* 1720 */  [ 0.314454634, 16 ],
+  /* 1721 */  [ 0.314698420, 16 ],
+  /* 1722 */  [ 0.314942255, 16 ],
+  /* 1723 */  [ 0.315186136, 16 ],
+  /* 1724 */  [ 0.315430064, 16 ],
+  /* 1725 */  [ 0.315674040, 16 ],
+  /* 1726 */  [ 0.315918063, 16 ],
+  /* 1727 */  [ 0.316162133, 16 ],
+
+  /* 1728 */  [ 0.316406250, 16 ],
+  /* 1729 */  [ 0.316650414, 16 ],
+  /* 1730 */  [ 0.316894625, 16 ],
+  /* 1731 */  [ 0.317138884, 16 ],
+  /* 1732 */  [ 0.317383189, 16 ],
+  /* 1733 */  [ 0.317627541, 16 ],
+  /* 1734 */  [ 0.317871941, 16 ],
+  /* 1735 */  [ 0.318116387, 16 ],
+  /* 1736 */  [ 0.318360880, 16 ],
+  /* 1737 */  [ 0.318605421, 16 ],
+  /* 1738 */  [ 0.318850008, 16 ],
+  /* 1739 */  [ 0.319094642, 16 ],
+  /* 1740 */  [ 0.319339323, 16 ],
+  /* 1741 */  [ 0.319584051, 16 ],
+  /* 1742 */  [ 0.319828826, 16 ],
+  /* 1743 */  [ 0.320073647, 16 ],
+
+  /* 1744 */  [ 0.320318516, 16 ],
+  /* 1745 */  [ 0.320563431, 16 ],
+  /* 1746 */  [ 0.320808393, 16 ],
+  /* 1747 */  [ 0.321053402, 16 ],
+  /* 1748 */  [ 0.321298457, 16 ],
+  /* 1749 */  [ 0.321543560, 16 ],
+  /* 1750 */  [ 0.321788709, 16 ],
+  /* 1751 */  [ 0.322033904, 16 ],
+  /* 1752 */  [ 0.322279147, 16 ],
+  /* 1753 */  [ 0.322524436, 16 ],
+  /* 1754 */  [ 0.322769771, 16 ],
+  /* 1755 */  [ 0.323015154, 16 ],
+  /* 1756 */  [ 0.323260583, 16 ],
+  /* 1757 */  [ 0.323506058, 16 ],
+  /* 1758 */  [ 0.323751580, 16 ],
+  /* 1759 */  [ 0.323997149, 16 ],
+
+  /* 1760 */  [ 0.324242764, 16 ],
+  /* 1761 */  [ 0.324488426, 16 ],
+  /* 1762 */  [ 0.324734134, 16 ],
+  /* 1763 */  [ 0.324979889, 16 ],
+  /* 1764 */  [ 0.325225690, 16 ],
+  /* 1765 */  [ 0.325471538, 16 ],
+  /* 1766 */  [ 0.325717432, 16 ],
+  /* 1767 */  [ 0.325963372, 16 ],
+  /* 1768 */  [ 0.326209359, 16 ],
+  /* 1769 */  [ 0.326455392, 16 ],
+  /* 1770 */  [ 0.326701472, 16 ],
+  /* 1771 */  [ 0.326947598, 16 ],
+  /* 1772 */  [ 0.327193770, 16 ],
+  /* 1773 */  [ 0.327439989, 16 ],
+  /* 1774 */  [ 0.327686254, 16 ],
+  /* 1775 */  [ 0.327932565, 16 ],
+
+  /* 1776 */  [ 0.328178922, 16 ],
+  /* 1777 */  [ 0.328425326, 16 ],
+  /* 1778 */  [ 0.328671776, 16 ],
+  /* 1779 */  [ 0.328918272, 16 ],
+  /* 1780 */  [ 0.329164814, 16 ],
+  /* 1781 */  [ 0.329411403, 16 ],
+  /* 1782 */  [ 0.329658038, 16 ],
+  /* 1783 */  [ 0.329904718, 16 ],
+  /* 1784 */  [ 0.330151445, 16 ],
+  /* 1785 */  [ 0.330398218, 16 ],
+  /* 1786 */  [ 0.330645037, 16 ],
+  /* 1787 */  [ 0.330891903, 16 ],
+  /* 1788 */  [ 0.331138814, 16 ],
+  /* 1789 */  [ 0.331385771, 16 ],
+  /* 1790 */  [ 0.331632774, 16 ],
+  /* 1791 */  [ 0.331879824, 16 ],
+
+  /* 1792 */  [ 0.332126919, 16 ],
+  /* 1793 */  [ 0.332374060, 16 ],
+  /* 1794 */  [ 0.332621247, 16 ],
+  /* 1795 */  [ 0.332868480, 16 ],
+  /* 1796 */  [ 0.333115759, 16 ],
+  /* 1797 */  [ 0.333363084, 16 ],
+  /* 1798 */  [ 0.333610455, 16 ],
+  /* 1799 */  [ 0.333857872, 16 ],
+  /* 1800 */  [ 0.334105334, 16 ],
+  /* 1801 */  [ 0.334352843, 16 ],
+  /* 1802 */  [ 0.334600397, 16 ],
+  /* 1803 */  [ 0.334847997, 16 ],
+  /* 1804 */  [ 0.335095642, 16 ],
+  /* 1805 */  [ 0.335343334, 16 ],
+  /* 1806 */  [ 0.335591071, 16 ],
+  /* 1807 */  [ 0.335838854, 16 ],
+
+  /* 1808 */  [ 0.336086683, 16 ],
+  /* 1809 */  [ 0.336334557, 16 ],
+  /* 1810 */  [ 0.336582477, 16 ],
+  /* 1811 */  [ 0.336830443, 16 ],
+  /* 1812 */  [ 0.337078454, 16 ],
+  /* 1813 */  [ 0.337326511, 16 ],
+  /* 1814 */  [ 0.337574614, 16 ],
+  /* 1815 */  [ 0.337822762, 16 ],
+  /* 1816 */  [ 0.338070956, 16 ],
+  /* 1817 */  [ 0.338319195, 16 ],
+  /* 1818 */  [ 0.338567480, 16 ],
+  /* 1819 */  [ 0.338815811, 16 ],
+  /* 1820 */  [ 0.339064186, 16 ],
+  /* 1821 */  [ 0.339312608, 16 ],
+  /* 1822 */  [ 0.339561075, 16 ],
+  /* 1823 */  [ 0.339809587, 16 ],
+
+  /* 1824 */  [ 0.340058145, 16 ],
+  /* 1825 */  [ 0.340306748, 16 ],
+  /* 1826 */  [ 0.340555397, 16 ],
+  /* 1827 */  [ 0.340804091, 16 ],
+  /* 1828 */  [ 0.341052830, 16 ],
+  /* 1829 */  [ 0.341301615, 16 ],
+  /* 1830 */  [ 0.341550445, 16 ],
+  /* 1831 */  [ 0.341799321, 16 ],
+  /* 1832 */  [ 0.342048241, 16 ],
+  /* 1833 */  [ 0.342297207, 16 ],
+  /* 1834 */  [ 0.342546219, 16 ],
+  /* 1835 */  [ 0.342795275, 16 ],
+  /* 1836 */  [ 0.343044377, 16 ],
+  /* 1837 */  [ 0.343293524, 16 ],
+  /* 1838 */  [ 0.343542717, 16 ],
+  /* 1839 */  [ 0.343791954, 16 ],
+
+  /* 1840 */  [ 0.344041237, 16 ],
+  /* 1841 */  [ 0.344290564, 16 ],
+  /* 1842 */  [ 0.344539937, 16 ],
+  /* 1843 */  [ 0.344789356, 16 ],
+  /* 1844 */  [ 0.345038819, 16 ],
+  /* 1845 */  [ 0.345288327, 16 ],
+  /* 1846 */  [ 0.345537880, 16 ],
+  /* 1847 */  [ 0.345787479, 16 ],
+  /* 1848 */  [ 0.346037122, 16 ],
+  /* 1849 */  [ 0.346286811, 16 ],
+  /* 1850 */  [ 0.346536545, 16 ],
+  /* 1851 */  [ 0.346786323, 16 ],
+  /* 1852 */  [ 0.347036147, 16 ],
+  /* 1853 */  [ 0.347286015, 16 ],
+  /* 1854 */  [ 0.347535929, 16 ],
+  /* 1855 */  [ 0.347785887, 16 ],
+
+  /* 1856 */  [ 0.348035890, 16 ],
+  /* 1857 */  [ 0.348285939, 16 ],
+  /* 1858 */  [ 0.348536032, 16 ],
+  /* 1859 */  [ 0.348786170, 16 ],
+  /* 1860 */  [ 0.349036353, 16 ],
+  /* 1861 */  [ 0.349286580, 16 ],
+  /* 1862 */  [ 0.349536853, 16 ],
+  /* 1863 */  [ 0.349787170, 16 ],
+  /* 1864 */  [ 0.350037532, 16 ],
+  /* 1865 */  [ 0.350287939, 16 ],
+  /* 1866 */  [ 0.350538391, 16 ],
+  /* 1867 */  [ 0.350788887, 16 ],
+  /* 1868 */  [ 0.351039428, 16 ],
+  /* 1869 */  [ 0.351290014, 16 ],
+  /* 1870 */  [ 0.351540645, 16 ],
+  /* 1871 */  [ 0.351791320, 16 ],
+
+  /* 1872 */  [ 0.352042040, 16 ],
+  /* 1873 */  [ 0.352292804, 16 ],
+  /* 1874 */  [ 0.352543613, 16 ],
+  /* 1875 */  [ 0.352794467, 16 ],
+  /* 1876 */  [ 0.353045365, 16 ],
+  /* 1877 */  [ 0.353296308, 16 ],
+  /* 1878 */  [ 0.353547296, 16 ],
+  /* 1879 */  [ 0.353798328, 16 ],
+  /* 1880 */  [ 0.354049405, 16 ],
+  /* 1881 */  [ 0.354300526, 16 ],
+  /* 1882 */  [ 0.354551691, 16 ],
+  /* 1883 */  [ 0.354802901, 16 ],
+  /* 1884 */  [ 0.355054156, 16 ],
+  /* 1885 */  [ 0.355305455, 16 ],
+  /* 1886 */  [ 0.355556799, 16 ],
+  /* 1887 */  [ 0.355808187, 16 ],
+
+  /* 1888 */  [ 0.356059619, 16 ],
+  /* 1889 */  [ 0.356311096, 16 ],
+  /* 1890 */  [ 0.356562617, 16 ],
+  /* 1891 */  [ 0.356814182, 16 ],
+  /* 1892 */  [ 0.357065792, 16 ],
+  /* 1893 */  [ 0.357317446, 16 ],
+  /* 1894 */  [ 0.357569145, 16 ],
+  /* 1895 */  [ 0.357820887, 16 ],
+  /* 1896 */  [ 0.358072674, 16 ],
+  /* 1897 */  [ 0.358324506, 16 ],
+  /* 1898 */  [ 0.358576381, 16 ],
+  /* 1899 */  [ 0.358828301, 16 ],
+  /* 1900 */  [ 0.359080265, 16 ],
+  /* 1901 */  [ 0.359332273, 16 ],
+  /* 1902 */  [ 0.359584326, 16 ],
+  /* 1903 */  [ 0.359836423, 16 ],
+
+  /* 1904 */  [ 0.360088563, 16 ],
+  /* 1905 */  [ 0.360340748, 16 ],
+  /* 1906 */  [ 0.360592977, 16 ],
+  /* 1907 */  [ 0.360845251, 16 ],
+  /* 1908 */  [ 0.361097568, 16 ],
+  /* 1909 */  [ 0.361349929, 16 ],
+  /* 1910 */  [ 0.361602335, 16 ],
+  /* 1911 */  [ 0.361854784, 16 ],
+  /* 1912 */  [ 0.362107278, 16 ],
+  /* 1913 */  [ 0.362359815, 16 ],
+  /* 1914 */  [ 0.362612397, 16 ],
+  /* 1915 */  [ 0.362865022, 16 ],
+  /* 1916 */  [ 0.363117692, 16 ],
+  /* 1917 */  [ 0.363370405, 16 ],
+  /* 1918 */  [ 0.363623163, 16 ],
+  /* 1919 */  [ 0.363875964, 16 ],
+
+  /* 1920 */  [ 0.364128809, 16 ],
+  /* 1921 */  [ 0.364381698, 16 ],
+  /* 1922 */  [ 0.364634632, 16 ],
+  /* 1923 */  [ 0.364887608, 16 ],
+  /* 1924 */  [ 0.365140629, 16 ],
+  /* 1925 */  [ 0.365393694, 16 ],
+  /* 1926 */  [ 0.365646802, 16 ],
+  /* 1927 */  [ 0.365899955, 16 ],
+  /* 1928 */  [ 0.366153151, 16 ],
+  /* 1929 */  [ 0.366406390, 16 ],
+  /* 1930 */  [ 0.366659674, 16 ],
+  /* 1931 */  [ 0.366913001, 16 ],
+  /* 1932 */  [ 0.367166372, 16 ],
+  /* 1933 */  [ 0.367419787, 16 ],
+  /* 1934 */  [ 0.367673246, 16 ],
+  /* 1935 */  [ 0.367926748, 16 ],
+
+  /* 1936 */  [ 0.368180294, 16 ],
+  /* 1937 */  [ 0.368433883, 16 ],
+  /* 1938 */  [ 0.368687517, 16 ],
+  /* 1939 */  [ 0.368941193, 16 ],
+  /* 1940 */  [ 0.369194914, 16 ],
+  /* 1941 */  [ 0.369448678, 16 ],
+  /* 1942 */  [ 0.369702485, 16 ],
+  /* 1943 */  [ 0.369956336, 16 ],
+  /* 1944 */  [ 0.370210231, 16 ],
+  /* 1945 */  [ 0.370464169, 16 ],
+  /* 1946 */  [ 0.370718151, 16 ],
+  /* 1947 */  [ 0.370972177, 16 ],
+  /* 1948 */  [ 0.371226245, 16 ],
+  /* 1949 */  [ 0.371480358, 16 ],
+  /* 1950 */  [ 0.371734513, 16 ],
+  /* 1951 */  [ 0.371988712, 16 ],
+
+  /* 1952 */  [ 0.372242955, 16 ],
+  /* 1953 */  [ 0.372497241, 16 ],
+  /* 1954 */  [ 0.372751570, 16 ],
+  /* 1955 */  [ 0.373005943, 16 ],
+  /* 1956 */  [ 0.373260359, 16 ],
+  /* 1957 */  [ 0.373514819, 16 ],
+  /* 1958 */  [ 0.373769322, 16 ],
+  /* 1959 */  [ 0.374023868, 16 ],
+  /* 1960 */  [ 0.374278458, 16 ],
+  /* 1961 */  [ 0.374533091, 16 ],
+  /* 1962 */  [ 0.374787767, 16 ],
+  /* 1963 */  [ 0.375042486, 16 ],
+  /* 1964 */  [ 0.375297249, 16 ],
+  /* 1965 */  [ 0.375552055, 16 ],
+  /* 1966 */  [ 0.375806904, 16 ],
+  /* 1967 */  [ 0.376061796, 16 ],
+
+  /* 1968 */  [ 0.376316732, 16 ],
+  /* 1969 */  [ 0.376571710, 16 ],
+  /* 1970 */  [ 0.376826732, 16 ],
+  /* 1971 */  [ 0.377081797, 16 ],
+  /* 1972 */  [ 0.377336905, 16 ],
+  /* 1973 */  [ 0.377592057, 16 ],
+  /* 1974 */  [ 0.377847251, 16 ],
+  /* 1975 */  [ 0.378102489, 16 ],
+  /* 1976 */  [ 0.378357769, 16 ],
+  /* 1977 */  [ 0.378613093, 16 ],
+  /* 1978 */  [ 0.378868460, 16 ],
+  /* 1979 */  [ 0.379123870, 16 ],
+  /* 1980 */  [ 0.379379322, 16 ],
+  /* 1981 */  [ 0.379634818, 16 ],
+  /* 1982 */  [ 0.379890357, 16 ],
+  /* 1983 */  [ 0.380145939, 16 ],
+
+  /* 1984 */  [ 0.380401563, 16 ],
+  /* 1985 */  [ 0.380657231, 16 ],
+  /* 1986 */  [ 0.380912942, 16 ],
+  /* 1987 */  [ 0.381168695, 16 ],
+  /* 1988 */  [ 0.381424492, 16 ],
+  /* 1989 */  [ 0.381680331, 16 ],
+  /* 1990 */  [ 0.381936213, 16 ],
+  /* 1991 */  [ 0.382192138, 16 ],
+  /* 1992 */  [ 0.382448106, 16 ],
+  /* 1993 */  [ 0.382704117, 16 ],
+  /* 1994 */  [ 0.382960171, 16 ],
+  /* 1995 */  [ 0.383216267, 16 ],
+  /* 1996 */  [ 0.383472406, 16 ],
+  /* 1997 */  [ 0.383728588, 16 ],
+  /* 1998 */  [ 0.383984813, 16 ],
+  /* 1999 */  [ 0.384241080, 16 ],
+
+  /* 2000 */  [ 0.384497391, 16 ],
+  /* 2001 */  [ 0.384753744, 16 ],
+  /* 2002 */  [ 0.385010139, 16 ],
+  /* 2003 */  [ 0.385266578, 16 ],
+  /* 2004 */  [ 0.385523059, 16 ],
+  /* 2005 */  [ 0.385779582, 16 ],
+  /* 2006 */  [ 0.386036149, 16 ],
+  /* 2007 */  [ 0.386292758, 16 ],
+  /* 2008 */  [ 0.386549409, 16 ],
+  /* 2009 */  [ 0.386806104, 16 ],
+  /* 2010 */  [ 0.387062840, 16 ],
+  /* 2011 */  [ 0.387319620, 16 ],
+  /* 2012 */  [ 0.387576442, 16 ],
+  /* 2013 */  [ 0.387833306, 16 ],
+  /* 2014 */  [ 0.388090213, 16 ],
+  /* 2015 */  [ 0.388347163, 16 ],
+
+  /* 2016 */  [ 0.388604155, 16 ],
+  /* 2017 */  [ 0.388861190, 16 ],
+  /* 2018 */  [ 0.389118267, 16 ],
+  /* 2019 */  [ 0.389375386, 16 ],
+  /* 2020 */  [ 0.389632548, 16 ],
+  /* 2021 */  [ 0.389889752, 16 ],
+  /* 2022 */  [ 0.390146999, 16 ],
+  /* 2023 */  [ 0.390404289, 16 ],
+  /* 2024 */  [ 0.390661620, 16 ],
+  /* 2025 */  [ 0.390918994, 16 ],
+  /* 2026 */  [ 0.391176411, 16 ],
+  /* 2027 */  [ 0.391433869, 16 ],
+  /* 2028 */  [ 0.391691371, 16 ],
+  /* 2029 */  [ 0.391948914, 16 ],
+  /* 2030 */  [ 0.392206500, 16 ],
+  /* 2031 */  [ 0.392464128, 16 ],
+
+  /* 2032 */  [ 0.392721798, 16 ],
+  /* 2033 */  [ 0.392979511, 16 ],
+  /* 2034 */  [ 0.393237266, 16 ],
+  /* 2035 */  [ 0.393495063, 16 ],
+  /* 2036 */  [ 0.393752902, 16 ],
+  /* 2037 */  [ 0.394010784, 16 ],
+  /* 2038 */  [ 0.394268707, 16 ],
+  /* 2039 */  [ 0.394526673, 16 ],
+  /* 2040 */  [ 0.394784681, 16 ],
+  /* 2041 */  [ 0.395042732, 16 ],
+  /* 2042 */  [ 0.395300824, 16 ],
+  /* 2043 */  [ 0.395558959, 16 ],
+  /* 2044 */  [ 0.395817135, 16 ],
+  /* 2045 */  [ 0.396075354, 16 ],
+  /* 2046 */  [ 0.396333615, 16 ],
+  /* 2047 */  [ 0.396591918, 16 ],
+
+  /* 2048 */  [ 0.396850263, 16 ],
+  /* 2049 */  [ 0.397108650, 16 ],
+  /* 2050 */  [ 0.397367079, 16 ],
+  /* 2051 */  [ 0.397625550, 16 ],
+  /* 2052 */  [ 0.397884063, 16 ],
+  /* 2053 */  [ 0.398142619, 16 ],
+  /* 2054 */  [ 0.398401216, 16 ],
+  /* 2055 */  [ 0.398659855, 16 ],
+  /* 2056 */  [ 0.398918536, 16 ],
+  /* 2057 */  [ 0.399177259, 16 ],
+  /* 2058 */  [ 0.399436024, 16 ],
+  /* 2059 */  [ 0.399694831, 16 ],
+  /* 2060 */  [ 0.399953679, 16 ],
+  /* 2061 */  [ 0.400212570, 16 ],
+  /* 2062 */  [ 0.400471503, 16 ],
+  /* 2063 */  [ 0.400730477, 16 ],
+
+  /* 2064 */  [ 0.400989493, 16 ],
+  /* 2065 */  [ 0.401248551, 16 ],
+  /* 2066 */  [ 0.401507651, 16 ],
+  /* 2067 */  [ 0.401766793, 16 ],
+  /* 2068 */  [ 0.402025976, 16 ],
+  /* 2069 */  [ 0.402285202, 16 ],
+  /* 2070 */  [ 0.402544469, 16 ],
+  /* 2071 */  [ 0.402803777, 16 ],
+  /* 2072 */  [ 0.403063128, 16 ],
+  /* 2073 */  [ 0.403322520, 16 ],
+  /* 2074 */  [ 0.403581954, 16 ],
+  /* 2075 */  [ 0.403841430, 16 ],
+  /* 2076 */  [ 0.404100947, 16 ],
+  /* 2077 */  [ 0.404360506, 16 ],
+  /* 2078 */  [ 0.404620107, 16 ],
+  /* 2079 */  [ 0.404879749, 16 ],
+
+  /* 2080 */  [ 0.405139433, 16 ],
+  /* 2081 */  [ 0.405399159, 16 ],
+  /* 2082 */  [ 0.405658926, 16 ],
+  /* 2083 */  [ 0.405918735, 16 ],
+  /* 2084 */  [ 0.406178585, 16 ],
+  /* 2085 */  [ 0.406438477, 16 ],
+  /* 2086 */  [ 0.406698410, 16 ],
+  /* 2087 */  [ 0.406958385, 16 ],
+  /* 2088 */  [ 0.407218402, 16 ],
+  /* 2089 */  [ 0.407478460, 16 ],
+  /* 2090 */  [ 0.407738559, 16 ],
+  /* 2091 */  [ 0.407998700, 16 ],
+  /* 2092 */  [ 0.408258883, 16 ],
+  /* 2093 */  [ 0.408519107, 16 ],
+  /* 2094 */  [ 0.408779372, 16 ],
+  /* 2095 */  [ 0.409039679, 16 ],
+
+  /* 2096 */  [ 0.409300027, 16 ],
+  /* 2097 */  [ 0.409560417, 16 ],
+  /* 2098 */  [ 0.409820848, 16 ],
+  /* 2099 */  [ 0.410081321, 16 ],
+  /* 2100 */  [ 0.410341834, 16 ],
+  /* 2101 */  [ 0.410602390, 16 ],
+  /* 2102 */  [ 0.410862986, 16 ],
+  /* 2103 */  [ 0.411123624, 16 ],
+  /* 2104 */  [ 0.411384303, 16 ],
+  /* 2105 */  [ 0.411645024, 16 ],
+  /* 2106 */  [ 0.411905785, 16 ],
+  /* 2107 */  [ 0.412166588, 16 ],
+  /* 2108 */  [ 0.412427433, 16 ],
+  /* 2109 */  [ 0.412688318, 16 ],
+  /* 2110 */  [ 0.412949245, 16 ],
+  /* 2111 */  [ 0.413210213, 16 ],
+
+  /* 2112 */  [ 0.413471222, 16 ],
+  /* 2113 */  [ 0.413732273, 16 ],
+  /* 2114 */  [ 0.413993364, 16 ],
+  /* 2115 */  [ 0.414254497, 16 ],
+  /* 2116 */  [ 0.414515671, 16 ],
+  /* 2117 */  [ 0.414776886, 16 ],
+  /* 2118 */  [ 0.415038142, 16 ],
+  /* 2119 */  [ 0.415299440, 16 ],
+  /* 2120 */  [ 0.415560778, 16 ],
+  /* 2121 */  [ 0.415822157, 16 ],
+  /* 2122 */  [ 0.416083578, 16 ],
+  /* 2123 */  [ 0.416345040, 16 ],
+  /* 2124 */  [ 0.416606542, 16 ],
+  /* 2125 */  [ 0.416868086, 16 ],
+  /* 2126 */  [ 0.417129671, 16 ],
+  /* 2127 */  [ 0.417391297, 16 ],
+
+  /* 2128 */  [ 0.417652964, 16 ],
+  /* 2129 */  [ 0.417914672, 16 ],
+  /* 2130 */  [ 0.418176420, 16 ],
+  /* 2131 */  [ 0.418438210, 16 ],
+  /* 2132 */  [ 0.418700041, 16 ],
+  /* 2133 */  [ 0.418961912, 16 ],
+  /* 2134 */  [ 0.419223825, 16 ],
+  /* 2135 */  [ 0.419485778, 16 ],
+  /* 2136 */  [ 0.419747773, 16 ],
+  /* 2137 */  [ 0.420009808, 16 ],
+  /* 2138 */  [ 0.420271884, 16 ],
+  /* 2139 */  [ 0.420534001, 16 ],
+  /* 2140 */  [ 0.420796159, 16 ],
+  /* 2141 */  [ 0.421058358, 16 ],
+  /* 2142 */  [ 0.421320597, 16 ],
+  /* 2143 */  [ 0.421582878, 16 ],
+
+  /* 2144 */  [ 0.421845199, 16 ],
+  /* 2145 */  [ 0.422107561, 16 ],
+  /* 2146 */  [ 0.422369964, 16 ],
+  /* 2147 */  [ 0.422632407, 16 ],
+  /* 2148 */  [ 0.422894891, 16 ],
+  /* 2149 */  [ 0.423157416, 16 ],
+  /* 2150 */  [ 0.423419982, 16 ],
+  /* 2151 */  [ 0.423682588, 16 ],
+  /* 2152 */  [ 0.423945235, 16 ],
+  /* 2153 */  [ 0.424207923, 16 ],
+  /* 2154 */  [ 0.424470652, 16 ],
+  /* 2155 */  [ 0.424733421, 16 ],
+  /* 2156 */  [ 0.424996230, 16 ],
+  /* 2157 */  [ 0.425259081, 16 ],
+  /* 2158 */  [ 0.425521972, 16 ],
+  /* 2159 */  [ 0.425784903, 16 ],
+
+  /* 2160 */  [ 0.426047876, 16 ],
+  /* 2161 */  [ 0.426310889, 16 ],
+  /* 2162 */  [ 0.426573942, 16 ],
+  /* 2163 */  [ 0.426837036, 16 ],
+  /* 2164 */  [ 0.427100170, 16 ],
+  /* 2165 */  [ 0.427363345, 16 ],
+  /* 2166 */  [ 0.427626561, 16 ],
+  /* 2167 */  [ 0.427889817, 16 ],
+  /* 2168 */  [ 0.428153114, 16 ],
+  /* 2169 */  [ 0.428416451, 16 ],
+  /* 2170 */  [ 0.428679828, 16 ],
+  /* 2171 */  [ 0.428943246, 16 ],
+  /* 2172 */  [ 0.429206704, 16 ],
+  /* 2173 */  [ 0.429470203, 16 ],
+  /* 2174 */  [ 0.429733743, 16 ],
+  /* 2175 */  [ 0.429997322, 16 ],
+
+  /* 2176 */  [ 0.430260942, 16 ],
+  /* 2177 */  [ 0.430524603, 16 ],
+  /* 2178 */  [ 0.430788304, 16 ],
+  /* 2179 */  [ 0.431052045, 16 ],
+  /* 2180 */  [ 0.431315826, 16 ],
+  /* 2181 */  [ 0.431579648, 16 ],
+  /* 2182 */  [ 0.431843511, 16 ],
+  /* 2183 */  [ 0.432107413, 16 ],
+  /* 2184 */  [ 0.432371356, 16 ],
+  /* 2185 */  [ 0.432635339, 16 ],
+  /* 2186 */  [ 0.432899362, 16 ],
+  /* 2187 */  [ 0.433163426, 16 ],
+  /* 2188 */  [ 0.433427530, 16 ],
+  /* 2189 */  [ 0.433691674, 16 ],
+  /* 2190 */  [ 0.433955859, 16 ],
+  /* 2191 */  [ 0.434220083, 16 ],
+
+  /* 2192 */  [ 0.434484348, 16 ],
+  /* 2193 */  [ 0.434748653, 16 ],
+  /* 2194 */  [ 0.435012998, 16 ],
+  /* 2195 */  [ 0.435277383, 16 ],
+  /* 2196 */  [ 0.435541809, 16 ],
+  /* 2197 */  [ 0.435806274, 16 ],
+  /* 2198 */  [ 0.436070780, 16 ],
+  /* 2199 */  [ 0.436335326, 16 ],
+  /* 2200 */  [ 0.436599912, 16 ],
+  /* 2201 */  [ 0.436864538, 16 ],
+  /* 2202 */  [ 0.437129204, 16 ],
+  /* 2203 */  [ 0.437393910, 16 ],
+  /* 2204 */  [ 0.437658657, 16 ],
+  /* 2205 */  [ 0.437923443, 16 ],
+  /* 2206 */  [ 0.438188269, 16 ],
+  /* 2207 */  [ 0.438453136, 16 ],
+
+  /* 2208 */  [ 0.438718042, 16 ],
+  /* 2209 */  [ 0.438982988, 16 ],
+  /* 2210 */  [ 0.439247975, 16 ],
+  /* 2211 */  [ 0.439513001, 16 ],
+  /* 2212 */  [ 0.439778067, 16 ],
+  /* 2213 */  [ 0.440043173, 16 ],
+  /* 2214 */  [ 0.440308320, 16 ],
+  /* 2215 */  [ 0.440573506, 16 ],
+  /* 2216 */  [ 0.440838732, 16 ],
+  /* 2217 */  [ 0.441103997, 16 ],
+  /* 2218 */  [ 0.441369303, 16 ],
+  /* 2219 */  [ 0.441634649, 16 ],
+  /* 2220 */  [ 0.441900034, 16 ],
+  /* 2221 */  [ 0.442165460, 16 ],
+  /* 2222 */  [ 0.442430925, 16 ],
+  /* 2223 */  [ 0.442696430, 16 ],
+
+  /* 2224 */  [ 0.442961975, 16 ],
+  /* 2225 */  [ 0.443227559, 16 ],
+  /* 2226 */  [ 0.443493184, 16 ],
+  /* 2227 */  [ 0.443758848, 16 ],
+  /* 2228 */  [ 0.444024552, 16 ],
+  /* 2229 */  [ 0.444290296, 16 ],
+  /* 2230 */  [ 0.444556079, 16 ],
+  /* 2231 */  [ 0.444821902, 16 ],
+  /* 2232 */  [ 0.445087765, 16 ],
+  /* 2233 */  [ 0.445353668, 16 ],
+  /* 2234 */  [ 0.445619610, 16 ],
+  /* 2235 */  [ 0.445885592, 16 ],
+  /* 2236 */  [ 0.446151614, 16 ],
+  /* 2237 */  [ 0.446417675, 16 ],
+  /* 2238 */  [ 0.446683776, 16 ],
+  /* 2239 */  [ 0.446949917, 16 ],
+
+  /* 2240 */  [ 0.447216097, 16 ],
+  /* 2241 */  [ 0.447482317, 16 ],
+  /* 2242 */  [ 0.447748576, 16 ],
+  /* 2243 */  [ 0.448014875, 16 ],
+  /* 2244 */  [ 0.448281214, 16 ],
+  /* 2245 */  [ 0.448547592, 16 ],
+  /* 2246 */  [ 0.448814010, 16 ],
+  /* 2247 */  [ 0.449080467, 16 ],
+  /* 2248 */  [ 0.449346964, 16 ],
+  /* 2249 */  [ 0.449613501, 16 ],
+  /* 2250 */  [ 0.449880076, 16 ],
+  /* 2251 */  [ 0.450146692, 16 ],
+  /* 2252 */  [ 0.450413347, 16 ],
+  /* 2253 */  [ 0.450680041, 16 ],
+  /* 2254 */  [ 0.450946775, 16 ],
+  /* 2255 */  [ 0.451213548, 16 ],
+
+  /* 2256 */  [ 0.451480360, 16 ],
+  /* 2257 */  [ 0.451747213, 16 ],
+  /* 2258 */  [ 0.452014104, 16 ],
+  /* 2259 */  [ 0.452281035, 16 ],
+  /* 2260 */  [ 0.452548005, 16 ],
+  /* 2261 */  [ 0.452815015, 16 ],
+  /* 2262 */  [ 0.453082064, 16 ],
+  /* 2263 */  [ 0.453349152, 16 ],
+  /* 2264 */  [ 0.453616280, 16 ],
+  /* 2265 */  [ 0.453883447, 16 ],
+  /* 2266 */  [ 0.454150653, 16 ],
+  /* 2267 */  [ 0.454417899, 16 ],
+  /* 2268 */  [ 0.454685184, 16 ],
+  /* 2269 */  [ 0.454952508, 16 ],
+  /* 2270 */  [ 0.455219872, 16 ],
+  /* 2271 */  [ 0.455487275, 16 ],
+
+  /* 2272 */  [ 0.455754717, 16 ],
+  /* 2273 */  [ 0.456022198, 16 ],
+  /* 2274 */  [ 0.456289719, 16 ],
+  /* 2275 */  [ 0.456557278, 16 ],
+  /* 2276 */  [ 0.456824877, 16 ],
+  /* 2277 */  [ 0.457092516, 16 ],
+  /* 2278 */  [ 0.457360193, 16 ],
+  /* 2279 */  [ 0.457627909, 16 ],
+  /* 2280 */  [ 0.457895665, 16 ],
+  /* 2281 */  [ 0.458163460, 16 ],
+  /* 2282 */  [ 0.458431294, 16 ],
+  /* 2283 */  [ 0.458699167, 16 ],
+  /* 2284 */  [ 0.458967079, 16 ],
+  /* 2285 */  [ 0.459235030, 16 ],
+  /* 2286 */  [ 0.459503021, 16 ],
+  /* 2287 */  [ 0.459771050, 16 ],
+
+  /* 2288 */  [ 0.460039119, 16 ],
+  /* 2289 */  [ 0.460307226, 16 ],
+  /* 2290 */  [ 0.460575373, 16 ],
+  /* 2291 */  [ 0.460843559, 16 ],
+  /* 2292 */  [ 0.461111783, 16 ],
+  /* 2293 */  [ 0.461380047, 16 ],
+  /* 2294 */  [ 0.461648350, 16 ],
+  /* 2295 */  [ 0.461916691, 16 ],
+  /* 2296 */  [ 0.462185072, 16 ],
+  /* 2297 */  [ 0.462453492, 16 ],
+  /* 2298 */  [ 0.462721950, 16 ],
+  /* 2299 */  [ 0.462990448, 16 ],
+  /* 2300 */  [ 0.463258984, 16 ],
+  /* 2301 */  [ 0.463527560, 16 ],
+  /* 2302 */  [ 0.463796174, 16 ],
+  /* 2303 */  [ 0.464064827, 16 ],
+
+  /* 2304 */  [ 0.464333519, 16 ],
+  /* 2305 */  [ 0.464602250, 16 ],
+  /* 2306 */  [ 0.464871020, 16 ],
+  /* 2307 */  [ 0.465139829, 16 ],
+  /* 2308 */  [ 0.465408676, 16 ],
+  /* 2309 */  [ 0.465677563, 16 ],
+  /* 2310 */  [ 0.465946488, 16 ],
+  /* 2311 */  [ 0.466215452, 16 ],
+  /* 2312 */  [ 0.466484455, 16 ],
+  /* 2313 */  [ 0.466753496, 16 ],
+  /* 2314 */  [ 0.467022577, 16 ],
+  /* 2315 */  [ 0.467291696, 16 ],
+  /* 2316 */  [ 0.467560854, 16 ],
+  /* 2317 */  [ 0.467830050, 16 ],
+  /* 2318 */  [ 0.468099285, 16 ],
+  /* 2319 */  [ 0.468368560, 16 ],
+
+  /* 2320 */  [ 0.468637872, 16 ],
+  /* 2321 */  [ 0.468907224, 16 ],
+  /* 2322 */  [ 0.469176614, 16 ],
+  /* 2323 */  [ 0.469446043, 16 ],
+  /* 2324 */  [ 0.469715510, 16 ],
+  /* 2325 */  [ 0.469985016, 16 ],
+  /* 2326 */  [ 0.470254561, 16 ],
+  /* 2327 */  [ 0.470524145, 16 ],
+  /* 2328 */  [ 0.470793767, 16 ],
+  /* 2329 */  [ 0.471063427, 16 ],
+  /* 2330 */  [ 0.471333126, 16 ],
+  /* 2331 */  [ 0.471602864, 16 ],
+  /* 2332 */  [ 0.471872641, 16 ],
+  /* 2333 */  [ 0.472142456, 16 ],
+  /* 2334 */  [ 0.472412309, 16 ],
+  /* 2335 */  [ 0.472682201, 16 ],
+
+  /* 2336 */  [ 0.472952132, 16 ],
+  /* 2337 */  [ 0.473222101, 16 ],
+  /* 2338 */  [ 0.473492108, 16 ],
+  /* 2339 */  [ 0.473762155, 16 ],
+  /* 2340 */  [ 0.474032239, 16 ],
+  /* 2341 */  [ 0.474302362, 16 ],
+  /* 2342 */  [ 0.474572524, 16 ],
+  /* 2343 */  [ 0.474842724, 16 ],
+  /* 2344 */  [ 0.475112962, 16 ],
+  /* 2345 */  [ 0.475383239, 16 ],
+  /* 2346 */  [ 0.475653554, 16 ],
+  /* 2347 */  [ 0.475923908, 16 ],
+  /* 2348 */  [ 0.476194300, 16 ],
+  /* 2349 */  [ 0.476464731, 16 ],
+  /* 2350 */  [ 0.476735200, 16 ],
+  /* 2351 */  [ 0.477005707, 16 ],
+
+  /* 2352 */  [ 0.477276252, 16 ],
+  /* 2353 */  [ 0.477546836, 16 ],
+  /* 2354 */  [ 0.477817459, 16 ],
+  /* 2355 */  [ 0.478088119, 16 ],
+  /* 2356 */  [ 0.478358818, 16 ],
+  /* 2357 */  [ 0.478629555, 16 ],
+  /* 2358 */  [ 0.478900331, 16 ],
+  /* 2359 */  [ 0.479171145, 16 ],
+  /* 2360 */  [ 0.479441997, 16 ],
+  /* 2361 */  [ 0.479712887, 16 ],
+  /* 2362 */  [ 0.479983816, 16 ],
+  /* 2363 */  [ 0.480254782, 16 ],
+  /* 2364 */  [ 0.480525787, 16 ],
+  /* 2365 */  [ 0.480796831, 16 ],
+  /* 2366 */  [ 0.481067912, 16 ],
+  /* 2367 */  [ 0.481339032, 16 ],
+
+  /* 2368 */  [ 0.481610189, 16 ],
+  /* 2369 */  [ 0.481881385, 16 ],
+  /* 2370 */  [ 0.482152620, 16 ],
+  /* 2371 */  [ 0.482423892, 16 ],
+  /* 2372 */  [ 0.482695202, 16 ],
+  /* 2373 */  [ 0.482966551, 16 ],
+  /* 2374 */  [ 0.483237938, 16 ],
+  /* 2375 */  [ 0.483509362, 16 ],
+  /* 2376 */  [ 0.483780825, 16 ],
+  /* 2377 */  [ 0.484052326, 16 ],
+  /* 2378 */  [ 0.484323865, 16 ],
+  /* 2379 */  [ 0.484595443, 16 ],
+  /* 2380 */  [ 0.484867058, 16 ],
+  /* 2381 */  [ 0.485138711, 16 ],
+  /* 2382 */  [ 0.485410402, 16 ],
+  /* 2383 */  [ 0.485682131, 16 ],
+
+  /* 2384 */  [ 0.485953899, 16 ],
+  /* 2385 */  [ 0.486225704, 16 ],
+  /* 2386 */  [ 0.486497547, 16 ],
+  /* 2387 */  [ 0.486769429, 16 ],
+  /* 2388 */  [ 0.487041348, 16 ],
+  /* 2389 */  [ 0.487313305, 16 ],
+  /* 2390 */  [ 0.487585300, 16 ],
+  /* 2391 */  [ 0.487857333, 16 ],
+  /* 2392 */  [ 0.488129404, 16 ],
+  /* 2393 */  [ 0.488401513, 16 ],
+  /* 2394 */  [ 0.488673660, 16 ],
+  /* 2395 */  [ 0.488945845, 16 ],
+  /* 2396 */  [ 0.489218067, 16 ],
+  /* 2397 */  [ 0.489490328, 16 ],
+  /* 2398 */  [ 0.489762626, 16 ],
+  /* 2399 */  [ 0.490034962, 16 ],
+
+  /* 2400 */  [ 0.490307336, 16 ],
+  /* 2401 */  [ 0.490579748, 16 ],
+  /* 2402 */  [ 0.490852198, 16 ],
+  /* 2403 */  [ 0.491124686, 16 ],
+  /* 2404 */  [ 0.491397211, 16 ],
+  /* 2405 */  [ 0.491669774, 16 ],
+  /* 2406 */  [ 0.491942375, 16 ],
+  /* 2407 */  [ 0.492215014, 16 ],
+  /* 2408 */  [ 0.492487690, 16 ],
+  /* 2409 */  [ 0.492760404, 16 ],
+  /* 2410 */  [ 0.493033156, 16 ],
+  /* 2411 */  [ 0.493305946, 16 ],
+  /* 2412 */  [ 0.493578773, 16 ],
+  /* 2413 */  [ 0.493851638, 16 ],
+  /* 2414 */  [ 0.494124541, 16 ],
+  /* 2415 */  [ 0.494397481, 16 ],
+
+  /* 2416 */  [ 0.494670459, 16 ],
+  /* 2417 */  [ 0.494943475, 16 ],
+  /* 2418 */  [ 0.495216529, 16 ],
+  /* 2419 */  [ 0.495489620, 16 ],
+  /* 2420 */  [ 0.495762748, 16 ],
+  /* 2421 */  [ 0.496035915, 16 ],
+  /* 2422 */  [ 0.496309119, 16 ],
+  /* 2423 */  [ 0.496582360, 16 ],
+  /* 2424 */  [ 0.496855639, 16 ],
+  /* 2425 */  [ 0.497128956, 16 ],
+  /* 2426 */  [ 0.497402310, 16 ],
+  /* 2427 */  [ 0.497675702, 16 ],
+  /* 2428 */  [ 0.497949132, 16 ],
+  /* 2429 */  [ 0.498222598, 16 ],
+  /* 2430 */  [ 0.498496103, 16 ],
+  /* 2431 */  [ 0.498769645, 16 ],
+
+  /* 2432 */  [ 0.499043224, 16 ],
+  /* 2433 */  [ 0.499316841, 16 ],
+  /* 2434 */  [ 0.499590496, 16 ],
+  /* 2435 */  [ 0.499864188, 16 ],
+  /* 2436 */  [ 0.250068959, 17 ],
+  /* 2437 */  [ 0.250205842, 17 ],
+  /* 2438 */  [ 0.250342744, 17 ],
+  /* 2439 */  [ 0.250479665, 17 ],
+  /* 2440 */  [ 0.250616605, 17 ],
+  /* 2441 */  [ 0.250753563, 17 ],
+  /* 2442 */  [ 0.250890540, 17 ],
+  /* 2443 */  [ 0.251027536, 17 ],
+  /* 2444 */  [ 0.251164550, 17 ],
+  /* 2445 */  [ 0.251301583, 17 ],
+  /* 2446 */  [ 0.251438635, 17 ],
+  /* 2447 */  [ 0.251575706, 17 ],
+
+  /* 2448 */  [ 0.251712795, 17 ],
+  /* 2449 */  [ 0.251849903, 17 ],
+  /* 2450 */  [ 0.251987029, 17 ],
+  /* 2451 */  [ 0.252124174, 17 ],
+  /* 2452 */  [ 0.252261338, 17 ],
+  /* 2453 */  [ 0.252398520, 17 ],
+  /* 2454 */  [ 0.252535721, 17 ],
+  /* 2455 */  [ 0.252672941, 17 ],
+  /* 2456 */  [ 0.252810180, 17 ],
+  /* 2457 */  [ 0.252947436, 17 ],
+  /* 2458 */  [ 0.253084712, 17 ],
+  /* 2459 */  [ 0.253222006, 17 ],
+  /* 2460 */  [ 0.253359319, 17 ],
+  /* 2461 */  [ 0.253496651, 17 ],
+  /* 2462 */  [ 0.253634001, 17 ],
+  /* 2463 */  [ 0.253771369, 17 ],
+
+  /* 2464 */  [ 0.253908756, 17 ],
+  /* 2465 */  [ 0.254046162, 17 ],
+  /* 2466 */  [ 0.254183587, 17 ],
+  /* 2467 */  [ 0.254321030, 17 ],
+  /* 2468 */  [ 0.254458491, 17 ],
+  /* 2469 */  [ 0.254595971, 17 ],
+  /* 2470 */  [ 0.254733470, 17 ],
+  /* 2471 */  [ 0.254870987, 17 ],
+  /* 2472 */  [ 0.255008523, 17 ],
+  /* 2473 */  [ 0.255146077, 17 ],
+  /* 2474 */  [ 0.255283650, 17 ],
+  /* 2475 */  [ 0.255421241, 17 ],
+  /* 2476 */  [ 0.255558851, 17 ],
+  /* 2477 */  [ 0.255696480, 17 ],
+  /* 2478 */  [ 0.255834127, 17 ],
+  /* 2479 */  [ 0.255971792, 17 ],
+
+  /* 2480 */  [ 0.256109476, 17 ],
+  /* 2481 */  [ 0.256247179, 17 ],
+  /* 2482 */  [ 0.256384900, 17 ],
+  /* 2483 */  [ 0.256522639, 17 ],
+  /* 2484 */  [ 0.256660397, 17 ],
+  /* 2485 */  [ 0.256798174, 17 ],
+  /* 2486 */  [ 0.256935969, 17 ],
+  /* 2487 */  [ 0.257073782, 17 ],
+  /* 2488 */  [ 0.257211614, 17 ],
+  /* 2489 */  [ 0.257349465, 17 ],
+  /* 2490 */  [ 0.257487334, 17 ],
+  /* 2491 */  [ 0.257625221, 17 ],
+  /* 2492 */  [ 0.257763127, 17 ],
+  /* 2493 */  [ 0.257901051, 17 ],
+  /* 2494 */  [ 0.258038994, 17 ],
+  /* 2495 */  [ 0.258176955, 17 ],
+
+  /* 2496 */  [ 0.258314934, 17 ],
+  /* 2497 */  [ 0.258452932, 17 ],
+  /* 2498 */  [ 0.258590948, 17 ],
+  /* 2499 */  [ 0.258728983, 17 ],
+  /* 2500 */  [ 0.258867036, 17 ],
+  /* 2501 */  [ 0.259005108, 17 ],
+  /* 2502 */  [ 0.259143198, 17 ],
+  /* 2503 */  [ 0.259281307, 17 ],
+  /* 2504 */  [ 0.259419433, 17 ],
+  /* 2505 */  [ 0.259557579, 17 ],
+  /* 2506 */  [ 0.259695742, 17 ],
+  /* 2507 */  [ 0.259833924, 17 ],
+  /* 2508 */  [ 0.259972124, 17 ],
+  /* 2509 */  [ 0.260110343, 17 ],
+  /* 2510 */  [ 0.260248580, 17 ],
+  /* 2511 */  [ 0.260386836, 17 ],
+
+  /* 2512 */  [ 0.260525110, 17 ],
+  /* 2513 */  [ 0.260663402, 17 ],
+  /* 2514 */  [ 0.260801712, 17 ],
+  /* 2515 */  [ 0.260940041, 17 ],
+  /* 2516 */  [ 0.261078388, 17 ],
+  /* 2517 */  [ 0.261216754, 17 ],
+  /* 2518 */  [ 0.261355137, 17 ],
+  /* 2519 */  [ 0.261493540, 17 ],
+  /* 2520 */  [ 0.261631960, 17 ],
+  /* 2521 */  [ 0.261770399, 17 ],
+  /* 2522 */  [ 0.261908856, 17 ],
+  /* 2523 */  [ 0.262047331, 17 ],
+  /* 2524 */  [ 0.262185825, 17 ],
+  /* 2525 */  [ 0.262324337, 17 ],
+  /* 2526 */  [ 0.262462867, 17 ],
+  /* 2527 */  [ 0.262601416, 17 ],
+
+  /* 2528 */  [ 0.262739982, 17 ],
+  /* 2529 */  [ 0.262878568, 17 ],
+  /* 2530 */  [ 0.263017171, 17 ],
+  /* 2531 */  [ 0.263155792, 17 ],
+  /* 2532 */  [ 0.263294432, 17 ],
+  /* 2533 */  [ 0.263433090, 17 ],
+  /* 2534 */  [ 0.263571767, 17 ],
+  /* 2535 */  [ 0.263710461, 17 ],
+  /* 2536 */  [ 0.263849174, 17 ],
+  /* 2537 */  [ 0.263987905, 17 ],
+  /* 2538 */  [ 0.264126655, 17 ],
+  /* 2539 */  [ 0.264265422, 17 ],
+  /* 2540 */  [ 0.264404208, 17 ],
+  /* 2541 */  [ 0.264543012, 17 ],
+  /* 2542 */  [ 0.264681834, 17 ],
+  /* 2543 */  [ 0.264820674, 17 ],
+
+  /* 2544 */  [ 0.264959533, 17 ],
+  /* 2545 */  [ 0.265098410, 17 ],
+  /* 2546 */  [ 0.265237305, 17 ],
+  /* 2547 */  [ 0.265376218, 17 ],
+  /* 2548 */  [ 0.265515149, 17 ],
+  /* 2549 */  [ 0.265654099, 17 ],
+  /* 2550 */  [ 0.265793066, 17 ],
+  /* 2551 */  [ 0.265932052, 17 ],
+  /* 2552 */  [ 0.266071056, 17 ],
+  /* 2553 */  [ 0.266210078, 17 ],
+  /* 2554 */  [ 0.266349119, 17 ],
+  /* 2555 */  [ 0.266488177, 17 ],
+  /* 2556 */  [ 0.266627254, 17 ],
+  /* 2557 */  [ 0.266766349, 17 ],
+  /* 2558 */  [ 0.266905462, 17 ],
+  /* 2559 */  [ 0.267044593, 17 ],
+
+  /* 2560 */  [ 0.267183742, 17 ],
+  /* 2561 */  [ 0.267322909, 17 ],
+  /* 2562 */  [ 0.267462094, 17 ],
+  /* 2563 */  [ 0.267601298, 17 ],
+  /* 2564 */  [ 0.267740519, 17 ],
+  /* 2565 */  [ 0.267879759, 17 ],
+  /* 2566 */  [ 0.268019017, 17 ],
+  /* 2567 */  [ 0.268158293, 17 ],
+  /* 2568 */  [ 0.268297587, 17 ],
+  /* 2569 */  [ 0.268436899, 17 ],
+  /* 2570 */  [ 0.268576229, 17 ],
+  /* 2571 */  [ 0.268715577, 17 ],
+  /* 2572 */  [ 0.268854943, 17 ],
+  /* 2573 */  [ 0.268994328, 17 ],
+  /* 2574 */  [ 0.269133730, 17 ],
+  /* 2575 */  [ 0.269273150, 17 ],
+
+  /* 2576 */  [ 0.269412589, 17 ],
+  /* 2577 */  [ 0.269552045, 17 ],
+  /* 2578 */  [ 0.269691520, 17 ],
+  /* 2579 */  [ 0.269831013, 17 ],
+  /* 2580 */  [ 0.269970523, 17 ],
+  /* 2581 */  [ 0.270110052, 17 ],
+  /* 2582 */  [ 0.270249599, 17 ],
+  /* 2583 */  [ 0.270389163, 17 ],
+  /* 2584 */  [ 0.270528746, 17 ],
+  /* 2585 */  [ 0.270668347, 17 ],
+  /* 2586 */  [ 0.270807965, 17 ],
+  /* 2587 */  [ 0.270947602, 17 ],
+  /* 2588 */  [ 0.271087257, 17 ],
+  /* 2589 */  [ 0.271226930, 17 ],
+  /* 2590 */  [ 0.271366620, 17 ],
+  /* 2591 */  [ 0.271506329, 17 ],
+
+  /* 2592 */  [ 0.271646056, 17 ],
+  /* 2593 */  [ 0.271785800, 17 ],
+  /* 2594 */  [ 0.271925563, 17 ],
+  /* 2595 */  [ 0.272065343, 17 ],
+  /* 2596 */  [ 0.272205142, 17 ],
+  /* 2597 */  [ 0.272344958, 17 ],
+  /* 2598 */  [ 0.272484793, 17 ],
+  /* 2599 */  [ 0.272624645, 17 ],
+  /* 2600 */  [ 0.272764515, 17 ],
+  /* 2601 */  [ 0.272904403, 17 ],
+  /* 2602 */  [ 0.273044310, 17 ],
+  /* 2603 */  [ 0.273184234, 17 ],
+  /* 2604 */  [ 0.273324176, 17 ],
+  /* 2605 */  [ 0.273464136, 17 ],
+  /* 2606 */  [ 0.273604113, 17 ],
+  /* 2607 */  [ 0.273744109, 17 ],
+
+  /* 2608 */  [ 0.273884123, 17 ],
+  /* 2609 */  [ 0.274024154, 17 ],
+  /* 2610 */  [ 0.274164204, 17 ],
+  /* 2611 */  [ 0.274304271, 17 ],
+  /* 2612 */  [ 0.274444356, 17 ],
+  /* 2613 */  [ 0.274584459, 17 ],
+  /* 2614 */  [ 0.274724580, 17 ],
+  /* 2615 */  [ 0.274864719, 17 ],
+  /* 2616 */  [ 0.275004875, 17 ],
+  /* 2617 */  [ 0.275145050, 17 ],
+  /* 2618 */  [ 0.275285242, 17 ],
+  /* 2619 */  [ 0.275425452, 17 ],
+  /* 2620 */  [ 0.275565681, 17 ],
+  /* 2621 */  [ 0.275705926, 17 ],
+  /* 2622 */  [ 0.275846190, 17 ],
+  /* 2623 */  [ 0.275986472, 17 ],
+
+  /* 2624 */  [ 0.276126771, 17 ],
+  /* 2625 */  [ 0.276267088, 17 ],
+  /* 2626 */  [ 0.276407423, 17 ],
+  /* 2627 */  [ 0.276547776, 17 ],
+  /* 2628 */  [ 0.276688147, 17 ],
+  /* 2629 */  [ 0.276828535, 17 ],
+  /* 2630 */  [ 0.276968942, 17 ],
+  /* 2631 */  [ 0.277109366, 17 ],
+  /* 2632 */  [ 0.277249808, 17 ],
+  /* 2633 */  [ 0.277390267, 17 ],
+  /* 2634 */  [ 0.277530745, 17 ],
+  /* 2635 */  [ 0.277671240, 17 ],
+  /* 2636 */  [ 0.277811753, 17 ],
+  /* 2637 */  [ 0.277952284, 17 ],
+  /* 2638 */  [ 0.278092832, 17 ],
+  /* 2639 */  [ 0.278233399, 17 ],
+
+  /* 2640 */  [ 0.278373983, 17 ],
+  /* 2641 */  [ 0.278514584, 17 ],
+  /* 2642 */  [ 0.278655204, 17 ],
+  /* 2643 */  [ 0.278795841, 17 ],
+  /* 2644 */  [ 0.278936496, 17 ],
+  /* 2645 */  [ 0.279077169, 17 ],
+  /* 2646 */  [ 0.279217860, 17 ],
+  /* 2647 */  [ 0.279358568, 17 ],
+  /* 2648 */  [ 0.279499294, 17 ],
+  /* 2649 */  [ 0.279640037, 17 ],
+  /* 2650 */  [ 0.279780799, 17 ],
+  /* 2651 */  [ 0.279921578, 17 ],
+  /* 2652 */  [ 0.280062375, 17 ],
+  /* 2653 */  [ 0.280203189, 17 ],
+  /* 2654 */  [ 0.280344021, 17 ],
+  /* 2655 */  [ 0.280484871, 17 ],
+
+  /* 2656 */  [ 0.280625739, 17 ],
+  /* 2657 */  [ 0.280766624, 17 ],
+  /* 2658 */  [ 0.280907527, 17 ],
+  /* 2659 */  [ 0.281048447, 17 ],
+  /* 2660 */  [ 0.281189385, 17 ],
+  /* 2661 */  [ 0.281330341, 17 ],
+  /* 2662 */  [ 0.281471315, 17 ],
+  /* 2663 */  [ 0.281612306, 17 ],
+  /* 2664 */  [ 0.281753315, 17 ],
+  /* 2665 */  [ 0.281894341, 17 ],
+  /* 2666 */  [ 0.282035386, 17 ],
+  /* 2667 */  [ 0.282176447, 17 ],
+  /* 2668 */  [ 0.282317527, 17 ],
+  /* 2669 */  [ 0.282458624, 17 ],
+  /* 2670 */  [ 0.282599738, 17 ],
+  /* 2671 */  [ 0.282740871, 17 ],
+
+  /* 2672 */  [ 0.282882021, 17 ],
+  /* 2673 */  [ 0.283023188, 17 ],
+  /* 2674 */  [ 0.283164373, 17 ],
+  /* 2675 */  [ 0.283305576, 17 ],
+  /* 2676 */  [ 0.283446796, 17 ],
+  /* 2677 */  [ 0.283588034, 17 ],
+  /* 2678 */  [ 0.283729290, 17 ],
+  /* 2679 */  [ 0.283870563, 17 ],
+  /* 2680 */  [ 0.284011853, 17 ],
+  /* 2681 */  [ 0.284153161, 17 ],
+  /* 2682 */  [ 0.284294487, 17 ],
+  /* 2683 */  [ 0.284435831, 17 ],
+  /* 2684 */  [ 0.284577192, 17 ],
+  /* 2685 */  [ 0.284718570, 17 ],
+  /* 2686 */  [ 0.284859966, 17 ],
+  /* 2687 */  [ 0.285001380, 17 ],
+
+  /* 2688 */  [ 0.285142811, 17 ],
+  /* 2689 */  [ 0.285284259, 17 ],
+  /* 2690 */  [ 0.285425726, 17 ],
+  /* 2691 */  [ 0.285567209, 17 ],
+  /* 2692 */  [ 0.285708711, 17 ],
+  /* 2693 */  [ 0.285850229, 17 ],
+  /* 2694 */  [ 0.285991766, 17 ],
+  /* 2695 */  [ 0.286133319, 17 ],
+  /* 2696 */  [ 0.286274891, 17 ],
+  /* 2697 */  [ 0.286416480, 17 ],
+  /* 2698 */  [ 0.286558086, 17 ],
+  /* 2699 */  [ 0.286699710, 17 ],
+  /* 2700 */  [ 0.286841351, 17 ],
+  /* 2701 */  [ 0.286983010, 17 ],
+  /* 2702 */  [ 0.287124686, 17 ],
+  /* 2703 */  [ 0.287266380, 17 ],
+
+  /* 2704 */  [ 0.287408091, 17 ],
+  /* 2705 */  [ 0.287549820, 17 ],
+  /* 2706 */  [ 0.287691566, 17 ],
+  /* 2707 */  [ 0.287833330, 17 ],
+  /* 2708 */  [ 0.287975111, 17 ],
+  /* 2709 */  [ 0.288116909, 17 ],
+  /* 2710 */  [ 0.288258725, 17 ],
+  /* 2711 */  [ 0.288400559, 17 ],
+  /* 2712 */  [ 0.288542409, 17 ],
+  /* 2713 */  [ 0.288684278, 17 ],
+  /* 2714 */  [ 0.288826163, 17 ],
+  /* 2715 */  [ 0.288968067, 17 ],
+  /* 2716 */  [ 0.289109987, 17 ],
+  /* 2717 */  [ 0.289251925, 17 ],
+  /* 2718 */  [ 0.289393881, 17 ],
+  /* 2719 */  [ 0.289535854, 17 ],
+
+  /* 2720 */  [ 0.289677844, 17 ],
+  /* 2721 */  [ 0.289819851, 17 ],
+  /* 2722 */  [ 0.289961876, 17 ],
+  /* 2723 */  [ 0.290103919, 17 ],
+  /* 2724 */  [ 0.290245979, 17 ],
+  /* 2725 */  [ 0.290388056, 17 ],
+  /* 2726 */  [ 0.290530150, 17 ],
+  /* 2727 */  [ 0.290672262, 17 ],
+  /* 2728 */  [ 0.290814392, 17 ],
+  /* 2729 */  [ 0.290956538, 17 ],
+  /* 2730 */  [ 0.291098703, 17 ],
+  /* 2731 */  [ 0.291240884, 17 ],
+  /* 2732 */  [ 0.291383083, 17 ],
+  /* 2733 */  [ 0.291525299, 17 ],
+  /* 2734 */  [ 0.291667532, 17 ],
+  /* 2735 */  [ 0.291809783, 17 ],
+
+  /* 2736 */  [ 0.291952051, 17 ],
+  /* 2737 */  [ 0.292094337, 17 ],
+  /* 2738 */  [ 0.292236640, 17 ],
+  /* 2739 */  [ 0.292378960, 17 ],
+  /* 2740 */  [ 0.292521297, 17 ],
+  /* 2741 */  [ 0.292663652, 17 ],
+  /* 2742 */  [ 0.292806024, 17 ],
+  /* 2743 */  [ 0.292948414, 17 ],
+  /* 2744 */  [ 0.293090820, 17 ],
+  /* 2745 */  [ 0.293233244, 17 ],
+  /* 2746 */  [ 0.293375686, 17 ],
+  /* 2747 */  [ 0.293518144, 17 ],
+  /* 2748 */  [ 0.293660620, 17 ],
+  /* 2749 */  [ 0.293803113, 17 ],
+  /* 2750 */  [ 0.293945624, 17 ],
+  /* 2751 */  [ 0.294088151, 17 ],
+
+  /* 2752 */  [ 0.294230696, 17 ],
+  /* 2753 */  [ 0.294373259, 17 ],
+  /* 2754 */  [ 0.294515838, 17 ],
+  /* 2755 */  [ 0.294658435, 17 ],
+  /* 2756 */  [ 0.294801049, 17 ],
+  /* 2757 */  [ 0.294943680, 17 ],
+  /* 2758 */  [ 0.295086329, 17 ],
+  /* 2759 */  [ 0.295228995, 17 ],
+  /* 2760 */  [ 0.295371678, 17 ],
+  /* 2761 */  [ 0.295514378, 17 ],
+  /* 2762 */  [ 0.295657095, 17 ],
+  /* 2763 */  [ 0.295799830, 17 ],
+  /* 2764 */  [ 0.295942582, 17 ],
+  /* 2765 */  [ 0.296085351, 17 ],
+  /* 2766 */  [ 0.296228138, 17 ],
+  /* 2767 */  [ 0.296370941, 17 ],
+
+  /* 2768 */  [ 0.296513762, 17 ],
+  /* 2769 */  [ 0.296656600, 17 ],
+  /* 2770 */  [ 0.296799455, 17 ],
+  /* 2771 */  [ 0.296942327, 17 ],
+  /* 2772 */  [ 0.297085217, 17 ],
+  /* 2773 */  [ 0.297228124, 17 ],
+  /* 2774 */  [ 0.297371048, 17 ],
+  /* 2775 */  [ 0.297513989, 17 ],
+  /* 2776 */  [ 0.297656947, 17 ],
+  /* 2777 */  [ 0.297799922, 17 ],
+  /* 2778 */  [ 0.297942915, 17 ],
+  /* 2779 */  [ 0.298085925, 17 ],
+  /* 2780 */  [ 0.298228951, 17 ],
+  /* 2781 */  [ 0.298371996, 17 ],
+  /* 2782 */  [ 0.298515057, 17 ],
+  /* 2783 */  [ 0.298658135, 17 ],
+
+  /* 2784 */  [ 0.298801231, 17 ],
+  /* 2785 */  [ 0.298944343, 17 ],
+  /* 2786 */  [ 0.299087473, 17 ],
+  /* 2787 */  [ 0.299230620, 17 ],
+  /* 2788 */  [ 0.299373784, 17 ],
+  /* 2789 */  [ 0.299516965, 17 ],
+  /* 2790 */  [ 0.299660163, 17 ],
+  /* 2791 */  [ 0.299803378, 17 ],
+  /* 2792 */  [ 0.299946611, 17 ],
+  /* 2793 */  [ 0.300089860, 17 ],
+  /* 2794 */  [ 0.300233127, 17 ],
+  /* 2795 */  [ 0.300376411, 17 ],
+  /* 2796 */  [ 0.300519711, 17 ],
+  /* 2797 */  [ 0.300663029, 17 ],
+  /* 2798 */  [ 0.300806364, 17 ],
+  /* 2799 */  [ 0.300949716, 17 ],
+
+  /* 2800 */  [ 0.301093085, 17 ],
+  /* 2801 */  [ 0.301236472, 17 ],
+  /* 2802 */  [ 0.301379875, 17 ],
+  /* 2803 */  [ 0.301523295, 17 ],
+  /* 2804 */  [ 0.301666733, 17 ],
+  /* 2805 */  [ 0.301810187, 17 ],
+  /* 2806 */  [ 0.301953659, 17 ],
+  /* 2807 */  [ 0.302097147, 17 ],
+  /* 2808 */  [ 0.302240653, 17 ],
+  /* 2809 */  [ 0.302384175, 17 ],
+  /* 2810 */  [ 0.302527715, 17 ],
+  /* 2811 */  [ 0.302671271, 17 ],
+  /* 2812 */  [ 0.302814845, 17 ],
+  /* 2813 */  [ 0.302958436, 17 ],
+  /* 2814 */  [ 0.303102044, 17 ],
+  /* 2815 */  [ 0.303245668, 17 ],
+
+  /* 2816 */  [ 0.303389310, 17 ],
+  /* 2817 */  [ 0.303532969, 17 ],
+  /* 2818 */  [ 0.303676645, 17 ],
+  /* 2819 */  [ 0.303820337, 17 ],
+  /* 2820 */  [ 0.303964047, 17 ],
+  /* 2821 */  [ 0.304107774, 17 ],
+  /* 2822 */  [ 0.304251517, 17 ],
+  /* 2823 */  [ 0.304395278, 17 ],
+  /* 2824 */  [ 0.304539056, 17 ],
+  /* 2825 */  [ 0.304682850, 17 ],
+  /* 2826 */  [ 0.304826662, 17 ],
+  /* 2827 */  [ 0.304970491, 17 ],
+  /* 2828 */  [ 0.305114336, 17 ],
+  /* 2829 */  [ 0.305258199, 17 ],
+  /* 2830 */  [ 0.305402078, 17 ],
+  /* 2831 */  [ 0.305545974, 17 ],
+
+  /* 2832 */  [ 0.305689888, 17 ],
+  /* 2833 */  [ 0.305833818, 17 ],
+  /* 2834 */  [ 0.305977765, 17 ],
+  /* 2835 */  [ 0.306121729, 17 ],
+  /* 2836 */  [ 0.306265710, 17 ],
+  /* 2837 */  [ 0.306409708, 17 ],
+  /* 2838 */  [ 0.306553723, 17 ],
+  /* 2839 */  [ 0.306697755, 17 ],
+  /* 2840 */  [ 0.306841804, 17 ],
+  /* 2841 */  [ 0.306985869, 17 ],
+  /* 2842 */  [ 0.307129952, 17 ],
+  /* 2843 */  [ 0.307274051, 17 ],
+  /* 2844 */  [ 0.307418168, 17 ],
+  /* 2845 */  [ 0.307562301, 17 ],
+  /* 2846 */  [ 0.307706451, 17 ],
+  /* 2847 */  [ 0.307850618, 17 ],
+
+  /* 2848 */  [ 0.307994802, 17 ],
+  /* 2849 */  [ 0.308139003, 17 ],
+  /* 2850 */  [ 0.308283220, 17 ],
+  /* 2851 */  [ 0.308427455, 17 ],
+  /* 2852 */  [ 0.308571706, 17 ],
+  /* 2853 */  [ 0.308715974, 17 ],
+  /* 2854 */  [ 0.308860260, 17 ],
+  /* 2855 */  [ 0.309004561, 17 ],
+  /* 2856 */  [ 0.309148880, 17 ],
+  /* 2857 */  [ 0.309293216, 17 ],
+  /* 2858 */  [ 0.309437568, 17 ],
+  /* 2859 */  [ 0.309581938, 17 ],
+  /* 2860 */  [ 0.309726324, 17 ],
+  /* 2861 */  [ 0.309870727, 17 ],
+  /* 2862 */  [ 0.310015147, 17 ],
+  /* 2863 */  [ 0.310159583, 17 ],
+
+  /* 2864 */  [ 0.310304037, 17 ],
+  /* 2865 */  [ 0.310448507, 17 ],
+  /* 2866 */  [ 0.310592994, 17 ],
+  /* 2867 */  [ 0.310737498, 17 ],
+  /* 2868 */  [ 0.310882018, 17 ],
+  /* 2869 */  [ 0.311026556, 17 ],
+  /* 2870 */  [ 0.311171110, 17 ],
+  /* 2871 */  [ 0.311315681, 17 ],
+  /* 2872 */  [ 0.311460269, 17 ],
+  /* 2873 */  [ 0.311604874, 17 ],
+  /* 2874 */  [ 0.311749495, 17 ],
+  /* 2875 */  [ 0.311894133, 17 ],
+  /* 2876 */  [ 0.312038788, 17 ],
+  /* 2877 */  [ 0.312183460, 17 ],
+  /* 2878 */  [ 0.312328148, 17 ],
+  /* 2879 */  [ 0.312472854, 17 ],
+
+  /* 2880 */  [ 0.312617576, 17 ],
+  /* 2881 */  [ 0.312762314, 17 ],
+  /* 2882 */  [ 0.312907070, 17 ],
+  /* 2883 */  [ 0.313051842, 17 ],
+  /* 2884 */  [ 0.313196631, 17 ],
+  /* 2885 */  [ 0.313341437, 17 ],
+  /* 2886 */  [ 0.313486259, 17 ],
+  /* 2887 */  [ 0.313631098, 17 ],
+  /* 2888 */  [ 0.313775954, 17 ],
+  /* 2889 */  [ 0.313920827, 17 ],
+  /* 2890 */  [ 0.314065716, 17 ],
+  /* 2891 */  [ 0.314210622, 17 ],
+  /* 2892 */  [ 0.314355545, 17 ],
+  /* 2893 */  [ 0.314500484, 17 ],
+  /* 2894 */  [ 0.314645440, 17 ],
+  /* 2895 */  [ 0.314790413, 17 ],
+
+  /* 2896 */  [ 0.314935403, 17 ],
+  /* 2897 */  [ 0.315080409, 17 ],
+  /* 2898 */  [ 0.315225432, 17 ],
+  /* 2899 */  [ 0.315370472, 17 ],
+  /* 2900 */  [ 0.315515528, 17 ],
+  /* 2901 */  [ 0.315660601, 17 ],
+  /* 2902 */  [ 0.315805690, 17 ],
+  /* 2903 */  [ 0.315950797, 17 ],
+  /* 2904 */  [ 0.316095920, 17 ],
+  /* 2905 */  [ 0.316241059, 17 ],
+  /* 2906 */  [ 0.316386216, 17 ],
+  /* 2907 */  [ 0.316531388, 17 ],
+  /* 2908 */  [ 0.316676578, 17 ],
+  /* 2909 */  [ 0.316821784, 17 ],
+  /* 2910 */  [ 0.316967007, 17 ],
+  /* 2911 */  [ 0.317112247, 17 ],
+
+  /* 2912 */  [ 0.317257503, 17 ],
+  /* 2913 */  [ 0.317402775, 17 ],
+  /* 2914 */  [ 0.317548065, 17 ],
+  /* 2915 */  [ 0.317693371, 17 ],
+  /* 2916 */  [ 0.317838693, 17 ],
+  /* 2917 */  [ 0.317984033, 17 ],
+  /* 2918 */  [ 0.318129388, 17 ],
+  /* 2919 */  [ 0.318274761, 17 ],
+  /* 2920 */  [ 0.318420150, 17 ],
+  /* 2921 */  [ 0.318565555, 17 ],
+  /* 2922 */  [ 0.318710978, 17 ],
+  /* 2923 */  [ 0.318856416, 17 ],
+  /* 2924 */  [ 0.319001872, 17 ],
+  /* 2925 */  [ 0.319147344, 17 ],
+  /* 2926 */  [ 0.319292832, 17 ],
+  /* 2927 */  [ 0.319438338, 17 ],
+
+  /* 2928 */  [ 0.319583859, 17 ],
+  /* 2929 */  [ 0.319729398, 17 ],
+  /* 2930 */  [ 0.319874952, 17 ],
+  /* 2931 */  [ 0.320020524, 17 ],
+  /* 2932 */  [ 0.320166112, 17 ],
+  /* 2933 */  [ 0.320311716, 17 ],
+  /* 2934 */  [ 0.320457337, 17 ],
+  /* 2935 */  [ 0.320602975, 17 ],
+  /* 2936 */  [ 0.320748629, 17 ],
+  /* 2937 */  [ 0.320894300, 17 ],
+  /* 2938 */  [ 0.321039987, 17 ],
+  /* 2939 */  [ 0.321185691, 17 ],
+  /* 2940 */  [ 0.321331411, 17 ],
+  /* 2941 */  [ 0.321477148, 17 ],
+  /* 2942 */  [ 0.321622901, 17 ],
+  /* 2943 */  [ 0.321768671, 17 ],
+
+  /* 2944 */  [ 0.321914457, 17 ],
+  /* 2945 */  [ 0.322060260, 17 ],
+  /* 2946 */  [ 0.322206079, 17 ],
+  /* 2947 */  [ 0.322351915, 17 ],
+  /* 2948 */  [ 0.322497768, 17 ],
+  /* 2949 */  [ 0.322643636, 17 ],
+  /* 2950 */  [ 0.322789522, 17 ],
+  /* 2951 */  [ 0.322935424, 17 ],
+  /* 2952 */  [ 0.323081342, 17 ],
+  /* 2953 */  [ 0.323227277, 17 ],
+  /* 2954 */  [ 0.323373228, 17 ],
+  /* 2955 */  [ 0.323519196, 17 ],
+  /* 2956 */  [ 0.323665180, 17 ],
+  /* 2957 */  [ 0.323811180, 17 ],
+  /* 2958 */  [ 0.323957197, 17 ],
+  /* 2959 */  [ 0.324103231, 17 ],
+
+  /* 2960 */  [ 0.324249281, 17 ],
+  /* 2961 */  [ 0.324395347, 17 ],
+  /* 2962 */  [ 0.324541430, 17 ],
+  /* 2963 */  [ 0.324687530, 17 ],
+  /* 2964 */  [ 0.324833646, 17 ],
+  /* 2965 */  [ 0.324979778, 17 ],
+  /* 2966 */  [ 0.325125926, 17 ],
+  /* 2967 */  [ 0.325272091, 17 ],
+  /* 2968 */  [ 0.325418273, 17 ],
+  /* 2969 */  [ 0.325564471, 17 ],
+  /* 2970 */  [ 0.325710685, 17 ],
+  /* 2971 */  [ 0.325856916, 17 ],
+  /* 2972 */  [ 0.326003163, 17 ],
+  /* 2973 */  [ 0.326149427, 17 ],
+  /* 2974 */  [ 0.326295707, 17 ],
+  /* 2975 */  [ 0.326442003, 17 ],
+
+  /* 2976 */  [ 0.326588316, 17 ],
+  /* 2977 */  [ 0.326734645, 17 ],
+  /* 2978 */  [ 0.326880990, 17 ],
+  /* 2979 */  [ 0.327027352, 17 ],
+  /* 2980 */  [ 0.327173730, 17 ],
+  /* 2981 */  [ 0.327320125, 17 ],
+  /* 2982 */  [ 0.327466536, 17 ],
+  /* 2983 */  [ 0.327612963, 17 ],
+  /* 2984 */  [ 0.327759407, 17 ],
+  /* 2985 */  [ 0.327905867, 17 ],
+  /* 2986 */  [ 0.328052344, 17 ],
+  /* 2987 */  [ 0.328198837, 17 ],
+  /* 2988 */  [ 0.328345346, 17 ],
+  /* 2989 */  [ 0.328491871, 17 ],
+  /* 2990 */  [ 0.328638413, 17 ],
+  /* 2991 */  [ 0.328784971, 17 ],
+
+  /* 2992 */  [ 0.328931546, 17 ],
+  /* 2993 */  [ 0.329078137, 17 ],
+  /* 2994 */  [ 0.329224744, 17 ],
+  /* 2995 */  [ 0.329371367, 17 ],
+  /* 2996 */  [ 0.329518007, 17 ],
+  /* 2997 */  [ 0.329664663, 17 ],
+  /* 2998 */  [ 0.329811336, 17 ],
+  /* 2999 */  [ 0.329958024, 17 ],
+  /* 3000 */  [ 0.330104730, 17 ],
+  /* 3001 */  [ 0.330251451, 17 ],
+  /* 3002 */  [ 0.330398189, 17 ],
+  /* 3003 */  [ 0.330544943, 17 ],
+  /* 3004 */  [ 0.330691713, 17 ],
+  /* 3005 */  [ 0.330838499, 17 ],
+  /* 3006 */  [ 0.330985302, 17 ],
+  /* 3007 */  [ 0.331132121, 17 ],
+
+  /* 3008 */  [ 0.331278957, 17 ],
+  /* 3009 */  [ 0.331425808, 17 ],
+  /* 3010 */  [ 0.331572676, 17 ],
+  /* 3011 */  [ 0.331719560, 17 ],
+  /* 3012 */  [ 0.331866461, 17 ],
+  /* 3013 */  [ 0.332013377, 17 ],
+  /* 3014 */  [ 0.332160310, 17 ],
+  /* 3015 */  [ 0.332307260, 17 ],
+  /* 3016 */  [ 0.332454225, 17 ],
+  /* 3017 */  [ 0.332601207, 17 ],
+  /* 3018 */  [ 0.332748205, 17 ],
+  /* 3019 */  [ 0.332895219, 17 ],
+  /* 3020 */  [ 0.333042249, 17 ],
+  /* 3021 */  [ 0.333189296, 17 ],
+  /* 3022 */  [ 0.333336359, 17 ],
+  /* 3023 */  [ 0.333483438, 17 ],
+
+  /* 3024 */  [ 0.333630533, 17 ],
+  /* 3025 */  [ 0.333777645, 17 ],
+  /* 3026 */  [ 0.333924772, 17 ],
+  /* 3027 */  [ 0.334071916, 17 ],
+  /* 3028 */  [ 0.334219076, 17 ],
+  /* 3029 */  [ 0.334366253, 17 ],
+  /* 3030 */  [ 0.334513445, 17 ],
+  /* 3031 */  [ 0.334660654, 17 ],
+  /* 3032 */  [ 0.334807879, 17 ],
+  /* 3033 */  [ 0.334955120, 17 ],
+  /* 3034 */  [ 0.335102377, 17 ],
+  /* 3035 */  [ 0.335249651, 17 ],
+  /* 3036 */  [ 0.335396941, 17 ],
+  /* 3037 */  [ 0.335544246, 17 ],
+  /* 3038 */  [ 0.335691568, 17 ],
+  /* 3039 */  [ 0.335838906, 17 ],
+
+  /* 3040 */  [ 0.335986261, 17 ],
+  /* 3041 */  [ 0.336133631, 17 ],
+  /* 3042 */  [ 0.336281018, 17 ],
+  /* 3043 */  [ 0.336428421, 17 ],
+  /* 3044 */  [ 0.336575840, 17 ],
+  /* 3045 */  [ 0.336723275, 17 ],
+  /* 3046 */  [ 0.336870726, 17 ],
+  /* 3047 */  [ 0.337018193, 17 ],
+  /* 3048 */  [ 0.337165677, 17 ],
+  /* 3049 */  [ 0.337313176, 17 ],
+  /* 3050 */  [ 0.337460692, 17 ],
+  /* 3051 */  [ 0.337608224, 17 ],
+  /* 3052 */  [ 0.337755772, 17 ],
+  /* 3053 */  [ 0.337903336, 17 ],
+  /* 3054 */  [ 0.338050916, 17 ],
+  /* 3055 */  [ 0.338198513, 17 ],
+
+  /* 3056 */  [ 0.338346125, 17 ],
+  /* 3057 */  [ 0.338493753, 17 ],
+  /* 3058 */  [ 0.338641398, 17 ],
+  /* 3059 */  [ 0.338789059, 17 ],
+  /* 3060 */  [ 0.338936736, 17 ],
+  /* 3061 */  [ 0.339084429, 17 ],
+  /* 3062 */  [ 0.339232138, 17 ],
+  /* 3063 */  [ 0.339379863, 17 ],
+  /* 3064 */  [ 0.339527604, 17 ],
+  /* 3065 */  [ 0.339675361, 17 ],
+  /* 3066 */  [ 0.339823134, 17 ],
+  /* 3067 */  [ 0.339970924, 17 ],
+  /* 3068 */  [ 0.340118729, 17 ],
+  /* 3069 */  [ 0.340266550, 17 ],
+  /* 3070 */  [ 0.340414388, 17 ],
+  /* 3071 */  [ 0.340562242, 17 ],
+
+  /* 3072 */  [ 0.340710111, 17 ],
+  /* 3073 */  [ 0.340857997, 17 ],
+  /* 3074 */  [ 0.341005899, 17 ],
+  /* 3075 */  [ 0.341153816, 17 ],
+  /* 3076 */  [ 0.341301750, 17 ],
+  /* 3077 */  [ 0.341449700, 17 ],
+  /* 3078 */  [ 0.341597666, 17 ],
+  /* 3079 */  [ 0.341745648, 17 ],
+  /* 3080 */  [ 0.341893646, 17 ],
+  /* 3081 */  [ 0.342041659, 17 ],
+  /* 3082 */  [ 0.342189689, 17 ],
+  /* 3083 */  [ 0.342337735, 17 ],
+  /* 3084 */  [ 0.342485797, 17 ],
+  /* 3085 */  [ 0.342633875, 17 ],
+  /* 3086 */  [ 0.342781969, 17 ],
+  /* 3087 */  [ 0.342930079, 17 ],
+
+  /* 3088 */  [ 0.343078205, 17 ],
+  /* 3089 */  [ 0.343226347, 17 ],
+  /* 3090 */  [ 0.343374505, 17 ],
+  /* 3091 */  [ 0.343522679, 17 ],
+  /* 3092 */  [ 0.343670869, 17 ],
+  /* 3093 */  [ 0.343819075, 17 ],
+  /* 3094 */  [ 0.343967296, 17 ],
+  /* 3095 */  [ 0.344115534, 17 ],
+  /* 3096 */  [ 0.344263788, 17 ],
+  /* 3097 */  [ 0.344412058, 17 ],
+  /* 3098 */  [ 0.344560343, 17 ],
+  /* 3099 */  [ 0.344708645, 17 ],
+  /* 3100 */  [ 0.344856963, 17 ],
+  /* 3101 */  [ 0.345005296, 17 ],
+  /* 3102 */  [ 0.345153646, 17 ],
+  /* 3103 */  [ 0.345302011, 17 ],
+
+  /* 3104 */  [ 0.345450393, 17 ],
+  /* 3105 */  [ 0.345598790, 17 ],
+  /* 3106 */  [ 0.345747203, 17 ],
+  /* 3107 */  [ 0.345895632, 17 ],
+  /* 3108 */  [ 0.346044077, 17 ],
+  /* 3109 */  [ 0.346192538, 17 ],
+  /* 3110 */  [ 0.346341015, 17 ],
+  /* 3111 */  [ 0.346489508, 17 ],
+  /* 3112 */  [ 0.346638017, 17 ],
+  /* 3113 */  [ 0.346786542, 17 ],
+  /* 3114 */  [ 0.346935082, 17 ],
+  /* 3115 */  [ 0.347083639, 17 ],
+  /* 3116 */  [ 0.347232211, 17 ],
+  /* 3117 */  [ 0.347380799, 17 ],
+  /* 3118 */  [ 0.347529403, 17 ],
+  /* 3119 */  [ 0.347678023, 17 ],
+
+  /* 3120 */  [ 0.347826659, 17 ],
+  /* 3121 */  [ 0.347975311, 17 ],
+  /* 3122 */  [ 0.348123979, 17 ],
+  /* 3123 */  [ 0.348272662, 17 ],
+  /* 3124 */  [ 0.348421362, 17 ],
+  /* 3125 */  [ 0.348570077, 17 ],
+  /* 3126 */  [ 0.348718808, 17 ],
+  /* 3127 */  [ 0.348867555, 17 ],
+  /* 3128 */  [ 0.349016318, 17 ],
+  /* 3129 */  [ 0.349165097, 17 ],
+  /* 3130 */  [ 0.349313892, 17 ],
+  /* 3131 */  [ 0.349462702, 17 ],
+  /* 3132 */  [ 0.349611528, 17 ],
+  /* 3133 */  [ 0.349760370, 17 ],
+  /* 3134 */  [ 0.349909228, 17 ],
+  /* 3135 */  [ 0.350058102, 17 ],
+
+  /* 3136 */  [ 0.350206992, 17 ],
+  /* 3137 */  [ 0.350355897, 17 ],
+  /* 3138 */  [ 0.350504818, 17 ],
+  /* 3139 */  [ 0.350653756, 17 ],
+  /* 3140 */  [ 0.350802708, 17 ],
+  /* 3141 */  [ 0.350951677, 17 ],
+  /* 3142 */  [ 0.351100662, 17 ],
+  /* 3143 */  [ 0.351249662, 17 ],
+  /* 3144 */  [ 0.351398678, 17 ],
+  /* 3145 */  [ 0.351547710, 17 ],
+  /* 3146 */  [ 0.351696758, 17 ],
+  /* 3147 */  [ 0.351845821, 17 ],
+  /* 3148 */  [ 0.351994901, 17 ],
+  /* 3149 */  [ 0.352143996, 17 ],
+  /* 3150 */  [ 0.352293107, 17 ],
+  /* 3151 */  [ 0.352442233, 17 ],
+
+  /* 3152 */  [ 0.352591376, 17 ],
+  /* 3153 */  [ 0.352740534, 17 ],
+  /* 3154 */  [ 0.352889708, 17 ],
+  /* 3155 */  [ 0.353038898, 17 ],
+  /* 3156 */  [ 0.353188103, 17 ],
+  /* 3157 */  [ 0.353337325, 17 ],
+  /* 3158 */  [ 0.353486562, 17 ],
+  /* 3159 */  [ 0.353635814, 17 ],
+  /* 3160 */  [ 0.353785083, 17 ],
+  /* 3161 */  [ 0.353934367, 17 ],
+  /* 3162 */  [ 0.354083667, 17 ],
+  /* 3163 */  [ 0.354232983, 17 ],
+  /* 3164 */  [ 0.354382314, 17 ],
+  /* 3165 */  [ 0.354531662, 17 ],
+  /* 3166 */  [ 0.354681025, 17 ],
+  /* 3167 */  [ 0.354830403, 17 ],
+
+  /* 3168 */  [ 0.354979798, 17 ],
+  /* 3169 */  [ 0.355129208, 17 ],
+  /* 3170 */  [ 0.355278634, 17 ],
+  /* 3171 */  [ 0.355428075, 17 ],
+  /* 3172 */  [ 0.355577533, 17 ],
+  /* 3173 */  [ 0.355727006, 17 ],
+  /* 3174 */  [ 0.355876494, 17 ],
+  /* 3175 */  [ 0.356025999, 17 ],
+  /* 3176 */  [ 0.356175519, 17 ],
+  /* 3177 */  [ 0.356325054, 17 ],
+  /* 3178 */  [ 0.356474606, 17 ],
+  /* 3179 */  [ 0.356624173, 17 ],
+  /* 3180 */  [ 0.356773756, 17 ],
+  /* 3181 */  [ 0.356923354, 17 ],
+  /* 3182 */  [ 0.357072969, 17 ],
+  /* 3183 */  [ 0.357222598, 17 ],
+
+  /* 3184 */  [ 0.357372244, 17 ],
+  /* 3185 */  [ 0.357521905, 17 ],
+  /* 3186 */  [ 0.357671582, 17 ],
+  /* 3187 */  [ 0.357821275, 17 ],
+  /* 3188 */  [ 0.357970983, 17 ],
+  /* 3189 */  [ 0.358120707, 17 ],
+  /* 3190 */  [ 0.358270446, 17 ],
+  /* 3191 */  [ 0.358420201, 17 ],
+  /* 3192 */  [ 0.358569972, 17 ],
+  /* 3193 */  [ 0.358719758, 17 ],
+  /* 3194 */  [ 0.358869560, 17 ],
+  /* 3195 */  [ 0.359019378, 17 ],
+  /* 3196 */  [ 0.359169211, 17 ],
+  /* 3197 */  [ 0.359319060, 17 ],
+  /* 3198 */  [ 0.359468925, 17 ],
+  /* 3199 */  [ 0.359618805, 17 ],
+
+  /* 3200 */  [ 0.359768701, 17 ],
+  /* 3201 */  [ 0.359918612, 17 ],
+  /* 3202 */  [ 0.360068540, 17 ],
+  /* 3203 */  [ 0.360218482, 17 ],
+  /* 3204 */  [ 0.360368440, 17 ],
+  /* 3205 */  [ 0.360518414, 17 ],
+  /* 3206 */  [ 0.360668404, 17 ],
+  /* 3207 */  [ 0.360818409, 17 ],
+  /* 3208 */  [ 0.360968429, 17 ],
+  /* 3209 */  [ 0.361118466, 17 ],
+  /* 3210 */  [ 0.361268517, 17 ],
+  /* 3211 */  [ 0.361418585, 17 ],
+  /* 3212 */  [ 0.361568668, 17 ],
+  /* 3213 */  [ 0.361718766, 17 ],
+  /* 3214 */  [ 0.361868881, 17 ],
+  /* 3215 */  [ 0.362019010, 17 ],
+
+  /* 3216 */  [ 0.362169156, 17 ],
+  /* 3217 */  [ 0.362319316, 17 ],
+  /* 3218 */  [ 0.362469493, 17 ],
+  /* 3219 */  [ 0.362619685, 17 ],
+  /* 3220 */  [ 0.362769892, 17 ],
+  /* 3221 */  [ 0.362920115, 17 ],
+  /* 3222 */  [ 0.363070354, 17 ],
+  /* 3223 */  [ 0.363220608, 17 ],
+  /* 3224 */  [ 0.363370878, 17 ],
+  /* 3225 */  [ 0.363521163, 17 ],
+  /* 3226 */  [ 0.363671464, 17 ],
+  /* 3227 */  [ 0.363821780, 17 ],
+  /* 3228 */  [ 0.363972112, 17 ],
+  /* 3229 */  [ 0.364122459, 17 ],
+  /* 3230 */  [ 0.364272822, 17 ],
+  /* 3231 */  [ 0.364423200, 17 ],
+
+  /* 3232 */  [ 0.364573594, 17 ],
+  /* 3233 */  [ 0.364724004, 17 ],
+  /* 3234 */  [ 0.364874429, 17 ],
+  /* 3235 */  [ 0.365024869, 17 ],
+  /* 3236 */  [ 0.365175325, 17 ],
+  /* 3237 */  [ 0.365325796, 17 ],
+  /* 3238 */  [ 0.365476283, 17 ],
+  /* 3239 */  [ 0.365626786, 17 ],
+  /* 3240 */  [ 0.365777304, 17 ],
+  /* 3241 */  [ 0.365927837, 17 ],
+  /* 3242 */  [ 0.366078386, 17 ],
+  /* 3243 */  [ 0.366228950, 17 ],
+  /* 3244 */  [ 0.366379530, 17 ],
+  /* 3245 */  [ 0.366530125, 17 ],
+  /* 3246 */  [ 0.366680736, 17 ],
+  /* 3247 */  [ 0.366831362, 17 ],
+
+  /* 3248 */  [ 0.366982004, 17 ],
+  /* 3249 */  [ 0.367132661, 17 ],
+  /* 3250 */  [ 0.367283334, 17 ],
+  /* 3251 */  [ 0.367434022, 17 ],
+  /* 3252 */  [ 0.367584725, 17 ],
+  /* 3253 */  [ 0.367735444, 17 ],
+  /* 3254 */  [ 0.367886179, 17 ],
+  /* 3255 */  [ 0.368036929, 17 ],
+  /* 3256 */  [ 0.368187694, 17 ],
+  /* 3257 */  [ 0.368338475, 17 ],
+  /* 3258 */  [ 0.368489271, 17 ],
+  /* 3259 */  [ 0.368640082, 17 ],
+  /* 3260 */  [ 0.368790909, 17 ],
+  /* 3261 */  [ 0.368941752, 17 ],
+  /* 3262 */  [ 0.369092610, 17 ],
+  /* 3263 */  [ 0.369243483, 17 ],
+
+  /* 3264 */  [ 0.369394372, 17 ],
+  /* 3265 */  [ 0.369545276, 17 ],
+  /* 3266 */  [ 0.369696195, 17 ],
+  /* 3267 */  [ 0.369847130, 17 ],
+  /* 3268 */  [ 0.369998080, 17 ],
+  /* 3269 */  [ 0.370149046, 17 ],
+  /* 3270 */  [ 0.370300027, 17 ],
+  /* 3271 */  [ 0.370451024, 17 ],
+  /* 3272 */  [ 0.370602036, 17 ],
+  /* 3273 */  [ 0.370753063, 17 ],
+  /* 3274 */  [ 0.370904105, 17 ],
+  /* 3275 */  [ 0.371055163, 17 ],
+  /* 3276 */  [ 0.371206237, 17 ],
+  /* 3277 */  [ 0.371357326, 17 ],
+  /* 3278 */  [ 0.371508430, 17 ],
+  /* 3279 */  [ 0.371659549, 17 ],
+
+  /* 3280 */  [ 0.371810684, 17 ],
+  /* 3281 */  [ 0.371961834, 17 ],
+  /* 3282 */  [ 0.372113000, 17 ],
+  /* 3283 */  [ 0.372264181, 17 ],
+  /* 3284 */  [ 0.372415377, 17 ],
+  /* 3285 */  [ 0.372566589, 17 ],
+  /* 3286 */  [ 0.372717816, 17 ],
+  /* 3287 */  [ 0.372869058, 17 ],
+  /* 3288 */  [ 0.373020316, 17 ],
+  /* 3289 */  [ 0.373171589, 17 ],
+  /* 3290 */  [ 0.373322877, 17 ],
+  /* 3291 */  [ 0.373474181, 17 ],
+  /* 3292 */  [ 0.373625500, 17 ],
+  /* 3293 */  [ 0.373776834, 17 ],
+  /* 3294 */  [ 0.373928184, 17 ],
+  /* 3295 */  [ 0.374079549, 17 ],
+
+  /* 3296 */  [ 0.374230929, 17 ],
+  /* 3297 */  [ 0.374382325, 17 ],
+  /* 3298 */  [ 0.374533735, 17 ],
+  /* 3299 */  [ 0.374685162, 17 ],
+  /* 3300 */  [ 0.374836603, 17 ],
+  /* 3301 */  [ 0.374988060, 17 ],
+  /* 3302 */  [ 0.375139532, 17 ],
+  /* 3303 */  [ 0.375291019, 17 ],
+  /* 3304 */  [ 0.375442522, 17 ],
+  /* 3305 */  [ 0.375594040, 17 ],
+  /* 3306 */  [ 0.375745573, 17 ],
+  /* 3307 */  [ 0.375897122, 17 ],
+  /* 3308 */  [ 0.376048685, 17 ],
+  /* 3309 */  [ 0.376200265, 17 ],
+  /* 3310 */  [ 0.376351859, 17 ],
+  /* 3311 */  [ 0.376503468, 17 ],
+
+  /* 3312 */  [ 0.376655093, 17 ],
+  /* 3313 */  [ 0.376806733, 17 ],
+  /* 3314 */  [ 0.376958389, 17 ],
+  /* 3315 */  [ 0.377110059, 17 ],
+  /* 3316 */  [ 0.377261745, 17 ],
+  /* 3317 */  [ 0.377413446, 17 ],
+  /* 3318 */  [ 0.377565163, 17 ],
+  /* 3319 */  [ 0.377716894, 17 ],
+  /* 3320 */  [ 0.377868641, 17 ],
+  /* 3321 */  [ 0.378020403, 17 ],
+  /* 3322 */  [ 0.378172181, 17 ],
+  /* 3323 */  [ 0.378323973, 17 ],
+  /* 3324 */  [ 0.378475781, 17 ],
+  /* 3325 */  [ 0.378627604, 17 ],
+  /* 3326 */  [ 0.378779442, 17 ],
+  /* 3327 */  [ 0.378931296, 17 ],
+
+  /* 3328 */  [ 0.379083164, 17 ],
+  /* 3329 */  [ 0.379235048, 17 ],
+  /* 3330 */  [ 0.379386947, 17 ],
+  /* 3331 */  [ 0.379538862, 17 ],
+  /* 3332 */  [ 0.379690791, 17 ],
+  /* 3333 */  [ 0.379842736, 17 ],
+  /* 3334 */  [ 0.379994696, 17 ],
+  /* 3335 */  [ 0.380146671, 17 ],
+  /* 3336 */  [ 0.380298661, 17 ],
+  /* 3337 */  [ 0.380450666, 17 ],
+  /* 3338 */  [ 0.380602687, 17 ],
+  /* 3339 */  [ 0.380754723, 17 ],
+  /* 3340 */  [ 0.380906774, 17 ],
+  /* 3341 */  [ 0.381058840, 17 ],
+  /* 3342 */  [ 0.381210921, 17 ],
+  /* 3343 */  [ 0.381363018, 17 ],
+
+  /* 3344 */  [ 0.381515130, 17 ],
+  /* 3345 */  [ 0.381667257, 17 ],
+  /* 3346 */  [ 0.381819399, 17 ],
+  /* 3347 */  [ 0.381971556, 17 ],
+  /* 3348 */  [ 0.382123728, 17 ],
+  /* 3349 */  [ 0.382275916, 17 ],
+  /* 3350 */  [ 0.382428118, 17 ],
+  /* 3351 */  [ 0.382580336, 17 ],
+  /* 3352 */  [ 0.382732569, 17 ],
+  /* 3353 */  [ 0.382884817, 17 ],
+  /* 3354 */  [ 0.383037080, 17 ],
+  /* 3355 */  [ 0.383189358, 17 ],
+  /* 3356 */  [ 0.383341652, 17 ],
+  /* 3357 */  [ 0.383493960, 17 ],
+  /* 3358 */  [ 0.383646284, 17 ],
+  /* 3359 */  [ 0.383798623, 17 ],
+
+  /* 3360 */  [ 0.383950977, 17 ],
+  /* 3361 */  [ 0.384103346, 17 ],
+  /* 3362 */  [ 0.384255730, 17 ],
+  /* 3363 */  [ 0.384408129, 17 ],
+  /* 3364 */  [ 0.384560544, 17 ],
+  /* 3365 */  [ 0.384712973, 17 ],
+  /* 3366 */  [ 0.384865418, 17 ],
+  /* 3367 */  [ 0.385017878, 17 ],
+  /* 3368 */  [ 0.385170352, 17 ],
+  /* 3369 */  [ 0.385322842, 17 ],
+  /* 3370 */  [ 0.385475347, 17 ],
+  /* 3371 */  [ 0.385627867, 17 ],
+  /* 3372 */  [ 0.385780402, 17 ],
+  /* 3373 */  [ 0.385932953, 17 ],
+  /* 3374 */  [ 0.386085518, 17 ],
+  /* 3375 */  [ 0.386238098, 17 ],
+
+  /* 3376 */  [ 0.386390694, 17 ],
+  /* 3377 */  [ 0.386543304, 17 ],
+  /* 3378 */  [ 0.386695930, 17 ],
+  /* 3379 */  [ 0.386848570, 17 ],
+  /* 3380 */  [ 0.387001226, 17 ],
+  /* 3381 */  [ 0.387153897, 17 ],
+  /* 3382 */  [ 0.387306582, 17 ],
+  /* 3383 */  [ 0.387459283, 17 ],
+  /* 3384 */  [ 0.387611999, 17 ],
+  /* 3385 */  [ 0.387764730, 17 ],
+  /* 3386 */  [ 0.387917476, 17 ],
+  /* 3387 */  [ 0.388070237, 17 ],
+  /* 3388 */  [ 0.388223013, 17 ],
+  /* 3389 */  [ 0.388375804, 17 ],
+  /* 3390 */  [ 0.388528610, 17 ],
+  /* 3391 */  [ 0.388681431, 17 ],
+
+  /* 3392 */  [ 0.388834268, 17 ],
+  /* 3393 */  [ 0.388987119, 17 ],
+  /* 3394 */  [ 0.389139985, 17 ],
+  /* 3395 */  [ 0.389292866, 17 ],
+  /* 3396 */  [ 0.389445762, 17 ],
+  /* 3397 */  [ 0.389598674, 17 ],
+  /* 3398 */  [ 0.389751600, 17 ],
+  /* 3399 */  [ 0.389904541, 17 ],
+  /* 3400 */  [ 0.390057497, 17 ],
+  /* 3401 */  [ 0.390210468, 17 ],
+  /* 3402 */  [ 0.390363455, 17 ],
+  /* 3403 */  [ 0.390516456, 17 ],
+  /* 3404 */  [ 0.390669472, 17 ],
+  /* 3405 */  [ 0.390822503, 17 ],
+  /* 3406 */  [ 0.390975549, 17 ],
+  /* 3407 */  [ 0.391128611, 17 ],
+
+  /* 3408 */  [ 0.391281687, 17 ],
+  /* 3409 */  [ 0.391434778, 17 ],
+  /* 3410 */  [ 0.391587884, 17 ],
+  /* 3411 */  [ 0.391741005, 17 ],
+  /* 3412 */  [ 0.391894141, 17 ],
+  /* 3413 */  [ 0.392047292, 17 ],
+  /* 3414 */  [ 0.392200458, 17 ],
+  /* 3415 */  [ 0.392353638, 17 ],
+  /* 3416 */  [ 0.392506834, 17 ],
+  /* 3417 */  [ 0.392660045, 17 ],
+  /* 3418 */  [ 0.392813271, 17 ],
+  /* 3419 */  [ 0.392966511, 17 ],
+  /* 3420 */  [ 0.393119767, 17 ],
+  /* 3421 */  [ 0.393273038, 17 ],
+  /* 3422 */  [ 0.393426323, 17 ],
+  /* 3423 */  [ 0.393579623, 17 ],
+
+  /* 3424 */  [ 0.393732939, 17 ],
+  /* 3425 */  [ 0.393886269, 17 ],
+  /* 3426 */  [ 0.394039614, 17 ],
+  /* 3427 */  [ 0.394192974, 17 ],
+  /* 3428 */  [ 0.394346349, 17 ],
+  /* 3429 */  [ 0.394499739, 17 ],
+  /* 3430 */  [ 0.394653144, 17 ],
+  /* 3431 */  [ 0.394806564, 17 ],
+  /* 3432 */  [ 0.394959999, 17 ],
+  /* 3433 */  [ 0.395113448, 17 ],
+  /* 3434 */  [ 0.395266913, 17 ],
+  /* 3435 */  [ 0.395420392, 17 ],
+  /* 3436 */  [ 0.395573886, 17 ],
+  /* 3437 */  [ 0.395727395, 17 ],
+  /* 3438 */  [ 0.395880919, 17 ],
+  /* 3439 */  [ 0.396034458, 17 ],
+
+  /* 3440 */  [ 0.396188012, 17 ],
+  /* 3441 */  [ 0.396341581, 17 ],
+  /* 3442 */  [ 0.396495164, 17 ],
+  /* 3443 */  [ 0.396648763, 17 ],
+  /* 3444 */  [ 0.396802376, 17 ],
+  /* 3445 */  [ 0.396956004, 17 ],
+  /* 3446 */  [ 0.397109647, 17 ],
+  /* 3447 */  [ 0.397263305, 17 ],
+  /* 3448 */  [ 0.397416978, 17 ],
+  /* 3449 */  [ 0.397570666, 17 ],
+  /* 3450 */  [ 0.397724368, 17 ],
+  /* 3451 */  [ 0.397878085, 17 ],
+  /* 3452 */  [ 0.398031818, 17 ],
+  /* 3453 */  [ 0.398185565, 17 ],
+  /* 3454 */  [ 0.398339326, 17 ],
+  /* 3455 */  [ 0.398493103, 17 ],
+
+  /* 3456 */  [ 0.398646895, 17 ],
+  /* 3457 */  [ 0.398800701, 17 ],
+  /* 3458 */  [ 0.398954522, 17 ],
+  /* 3459 */  [ 0.399108358, 17 ],
+  /* 3460 */  [ 0.399262209, 17 ],
+  /* 3461 */  [ 0.399416075, 17 ],
+  /* 3462 */  [ 0.399569955, 17 ],
+  /* 3463 */  [ 0.399723851, 17 ],
+  /* 3464 */  [ 0.399877761, 17 ],
+  /* 3465 */  [ 0.400031686, 17 ],
+  /* 3466 */  [ 0.400185625, 17 ],
+  /* 3467 */  [ 0.400339580, 17 ],
+  /* 3468 */  [ 0.400493549, 17 ],
+  /* 3469 */  [ 0.400647534, 17 ],
+  /* 3470 */  [ 0.400801533, 17 ],
+  /* 3471 */  [ 0.400955546, 17 ],
+
+  /* 3472 */  [ 0.401109575, 17 ],
+  /* 3473 */  [ 0.401263618, 17 ],
+  /* 3474 */  [ 0.401417676, 17 ],
+  /* 3475 */  [ 0.401571749, 17 ],
+  /* 3476 */  [ 0.401725837, 17 ],
+  /* 3477 */  [ 0.401879939, 17 ],
+  /* 3478 */  [ 0.402034056, 17 ],
+  /* 3479 */  [ 0.402188188, 17 ],
+  /* 3480 */  [ 0.402342335, 17 ],
+  /* 3481 */  [ 0.402496497, 17 ],
+  /* 3482 */  [ 0.402650673, 17 ],
+  /* 3483 */  [ 0.402804864, 17 ],
+  /* 3484 */  [ 0.402959070, 17 ],
+  /* 3485 */  [ 0.403113291, 17 ],
+  /* 3486 */  [ 0.403267526, 17 ],
+  /* 3487 */  [ 0.403421776, 17 ],
+
+  /* 3488 */  [ 0.403576041, 17 ],
+  /* 3489 */  [ 0.403730320, 17 ],
+  /* 3490 */  [ 0.403884615, 17 ],
+  /* 3491 */  [ 0.404038924, 17 ],
+  /* 3492 */  [ 0.404193247, 17 ],
+  /* 3493 */  [ 0.404347586, 17 ],
+  /* 3494 */  [ 0.404501939, 17 ],
+  /* 3495 */  [ 0.404656307, 17 ],
+  /* 3496 */  [ 0.404810690, 17 ],
+  /* 3497 */  [ 0.404965087, 17 ],
+  /* 3498 */  [ 0.405119499, 17 ],
+  /* 3499 */  [ 0.405273926, 17 ],
+  /* 3500 */  [ 0.405428368, 17 ],
+  /* 3501 */  [ 0.405582824, 17 ],
+  /* 3502 */  [ 0.405737295, 17 ],
+  /* 3503 */  [ 0.405891781, 17 ],
+
+  /* 3504 */  [ 0.406046281, 17 ],
+  /* 3505 */  [ 0.406200796, 17 ],
+  /* 3506 */  [ 0.406355326, 17 ],
+  /* 3507 */  [ 0.406509870, 17 ],
+  /* 3508 */  [ 0.406664429, 17 ],
+  /* 3509 */  [ 0.406819003, 17 ],
+  /* 3510 */  [ 0.406973592, 17 ],
+  /* 3511 */  [ 0.407128195, 17 ],
+  /* 3512 */  [ 0.407282813, 17 ],
+  /* 3513 */  [ 0.407437445, 17 ],
+  /* 3514 */  [ 0.407592093, 17 ],
+  /* 3515 */  [ 0.407746754, 17 ],
+  /* 3516 */  [ 0.407901431, 17 ],
+  /* 3517 */  [ 0.408056122, 17 ],
+  /* 3518 */  [ 0.408210828, 17 ],
+  /* 3519 */  [ 0.408365549, 17 ],
+
+  /* 3520 */  [ 0.408520284, 17 ],
+  /* 3521 */  [ 0.408675034, 17 ],
+  /* 3522 */  [ 0.408829798, 17 ],
+  /* 3523 */  [ 0.408984577, 17 ],
+  /* 3524 */  [ 0.409139371, 17 ],
+  /* 3525 */  [ 0.409294180, 17 ],
+  /* 3526 */  [ 0.409449003, 17 ],
+  /* 3527 */  [ 0.409603840, 17 ],
+  /* 3528 */  [ 0.409758693, 17 ],
+  /* 3529 */  [ 0.409913560, 17 ],
+  /* 3530 */  [ 0.410068441, 17 ],
+  /* 3531 */  [ 0.410223338, 17 ],
+  /* 3532 */  [ 0.410378249, 17 ],
+  /* 3533 */  [ 0.410533174, 17 ],
+  /* 3534 */  [ 0.410688114, 17 ],
+  /* 3535 */  [ 0.410843069, 17 ],
+
+  /* 3536 */  [ 0.410998038, 17 ],
+  /* 3537 */  [ 0.411153022, 17 ],
+  /* 3538 */  [ 0.411308021, 17 ],
+  /* 3539 */  [ 0.411463034, 17 ],
+  /* 3540 */  [ 0.411618062, 17 ],
+  /* 3541 */  [ 0.411773104, 17 ],
+  /* 3542 */  [ 0.411928161, 17 ],
+  /* 3543 */  [ 0.412083232, 17 ],
+  /* 3544 */  [ 0.412238319, 17 ],
+  /* 3545 */  [ 0.412393419, 17 ],
+  /* 3546 */  [ 0.412548535, 17 ],
+  /* 3547 */  [ 0.412703664, 17 ],
+  /* 3548 */  [ 0.412858809, 17 ],
+  /* 3549 */  [ 0.413013968, 17 ],
+  /* 3550 */  [ 0.413169142, 17 ],
+  /* 3551 */  [ 0.413324330, 17 ],
+
+  /* 3552 */  [ 0.413479532, 17 ],
+  /* 3553 */  [ 0.413634750, 17 ],
+  /* 3554 */  [ 0.413789982, 17 ],
+  /* 3555 */  [ 0.413945228, 17 ],
+  /* 3556 */  [ 0.414100489, 17 ],
+  /* 3557 */  [ 0.414255765, 17 ],
+  /* 3558 */  [ 0.414411055, 17 ],
+  /* 3559 */  [ 0.414566359, 17 ],
+  /* 3560 */  [ 0.414721679, 17 ],
+  /* 3561 */  [ 0.414877012, 17 ],
+  /* 3562 */  [ 0.415032361, 17 ],
+  /* 3563 */  [ 0.415187723, 17 ],
+  /* 3564 */  [ 0.415343101, 17 ],
+  /* 3565 */  [ 0.415498493, 17 ],
+  /* 3566 */  [ 0.415653899, 17 ],
+  /* 3567 */  [ 0.415809320, 17 ],
+
+  /* 3568 */  [ 0.415964756, 17 ],
+  /* 3569 */  [ 0.416120206, 17 ],
+  /* 3570 */  [ 0.416275670, 17 ],
+  /* 3571 */  [ 0.416431149, 17 ],
+  /* 3572 */  [ 0.416586643, 17 ],
+  /* 3573 */  [ 0.416742151, 17 ],
+  /* 3574 */  [ 0.416897673, 17 ],
+  /* 3575 */  [ 0.417053210, 17 ],
+  /* 3576 */  [ 0.417208762, 17 ],
+  /* 3577 */  [ 0.417364328, 17 ],
+  /* 3578 */  [ 0.417519909, 17 ],
+  /* 3579 */  [ 0.417675504, 17 ],
+  /* 3580 */  [ 0.417831113, 17 ],
+  /* 3581 */  [ 0.417986737, 17 ],
+  /* 3582 */  [ 0.418142376, 17 ],
+  /* 3583 */  [ 0.418298029, 17 ],
+
+  /* 3584 */  [ 0.418453696, 17 ],
+  /* 3585 */  [ 0.418609378, 17 ],
+  /* 3586 */  [ 0.418765075, 17 ],
+  /* 3587 */  [ 0.418920786, 17 ],
+  /* 3588 */  [ 0.419076511, 17 ],
+  /* 3589 */  [ 0.419232251, 17 ],
+  /* 3590 */  [ 0.419388005, 17 ],
+  /* 3591 */  [ 0.419543774, 17 ],
+  /* 3592 */  [ 0.419699557, 17 ],
+  /* 3593 */  [ 0.419855355, 17 ],
+  /* 3594 */  [ 0.420011167, 17 ],
+  /* 3595 */  [ 0.420166994, 17 ],
+  /* 3596 */  [ 0.420322835, 17 ],
+  /* 3597 */  [ 0.420478690, 17 ],
+  /* 3598 */  [ 0.420634560, 17 ],
+  /* 3599 */  [ 0.420790445, 17 ],
+
+  /* 3600 */  [ 0.420946343, 17 ],
+  /* 3601 */  [ 0.421102257, 17 ],
+  /* 3602 */  [ 0.421258184, 17 ],
+  /* 3603 */  [ 0.421414127, 17 ],
+  /* 3604 */  [ 0.421570083, 17 ],
+  /* 3605 */  [ 0.421726054, 17 ],
+  /* 3606 */  [ 0.421882040, 17 ],
+  /* 3607 */  [ 0.422038039, 17 ],
+  /* 3608 */  [ 0.422194054, 17 ],
+  /* 3609 */  [ 0.422350082, 17 ],
+  /* 3610 */  [ 0.422506125, 17 ],
+  /* 3611 */  [ 0.422662183, 17 ],
+  /* 3612 */  [ 0.422818255, 17 ],
+  /* 3613 */  [ 0.422974341, 17 ],
+  /* 3614 */  [ 0.423130442, 17 ],
+  /* 3615 */  [ 0.423286557, 17 ],
+
+  /* 3616 */  [ 0.423442686, 17 ],
+  /* 3617 */  [ 0.423598830, 17 ],
+  /* 3618 */  [ 0.423754988, 17 ],
+  /* 3619 */  [ 0.423911161, 17 ],
+  /* 3620 */  [ 0.424067348, 17 ],
+  /* 3621 */  [ 0.424223550, 17 ],
+  /* 3622 */  [ 0.424379765, 17 ],
+  /* 3623 */  [ 0.424535996, 17 ],
+  /* 3624 */  [ 0.424692240, 17 ],
+  /* 3625 */  [ 0.424848499, 17 ],
+  /* 3626 */  [ 0.425004772, 17 ],
+  /* 3627 */  [ 0.425161060, 17 ],
+  /* 3628 */  [ 0.425317362, 17 ],
+  /* 3629 */  [ 0.425473678, 17 ],
+  /* 3630 */  [ 0.425630009, 17 ],
+  /* 3631 */  [ 0.425786354, 17 ],
+
+  /* 3632 */  [ 0.425942714, 17 ],
+  /* 3633 */  [ 0.426099088, 17 ],
+  /* 3634 */  [ 0.426255476, 17 ],
+  /* 3635 */  [ 0.426411878, 17 ],
+  /* 3636 */  [ 0.426568295, 17 ],
+  /* 3637 */  [ 0.426724726, 17 ],
+  /* 3638 */  [ 0.426881172, 17 ],
+  /* 3639 */  [ 0.427037632, 17 ],
+  /* 3640 */  [ 0.427194106, 17 ],
+  /* 3641 */  [ 0.427350594, 17 ],
+  /* 3642 */  [ 0.427507097, 17 ],
+  /* 3643 */  [ 0.427663614, 17 ],
+  /* 3644 */  [ 0.427820146, 17 ],
+  /* 3645 */  [ 0.427976692, 17 ],
+  /* 3646 */  [ 0.428133252, 17 ],
+  /* 3647 */  [ 0.428289826, 17 ],
+
+  /* 3648 */  [ 0.428446415, 17 ],
+  /* 3649 */  [ 0.428603018, 17 ],
+  /* 3650 */  [ 0.428759635, 17 ],
+  /* 3651 */  [ 0.428916267, 17 ],
+  /* 3652 */  [ 0.429072913, 17 ],
+  /* 3653 */  [ 0.429229573, 17 ],
+  /* 3654 */  [ 0.429386248, 17 ],
+  /* 3655 */  [ 0.429542937, 17 ],
+  /* 3656 */  [ 0.429699640, 17 ],
+  /* 3657 */  [ 0.429856357, 17 ],
+  /* 3658 */  [ 0.430013089, 17 ],
+  /* 3659 */  [ 0.430169835, 17 ],
+  /* 3660 */  [ 0.430326595, 17 ],
+  /* 3661 */  [ 0.430483370, 17 ],
+  /* 3662 */  [ 0.430640159, 17 ],
+  /* 3663 */  [ 0.430796962, 17 ],
+
+  /* 3664 */  [ 0.430953779, 17 ],
+  /* 3665 */  [ 0.431110611, 17 ],
+  /* 3666 */  [ 0.431267457, 17 ],
+  /* 3667 */  [ 0.431424317, 17 ],
+  /* 3668 */  [ 0.431581192, 17 ],
+  /* 3669 */  [ 0.431738080, 17 ],
+  /* 3670 */  [ 0.431894983, 17 ],
+  /* 3671 */  [ 0.432051900, 17 ],
+  /* 3672 */  [ 0.432208832, 17 ],
+  /* 3673 */  [ 0.432365778, 17 ],
+  /* 3674 */  [ 0.432522737, 17 ],
+  /* 3675 */  [ 0.432679712, 17 ],
+  /* 3676 */  [ 0.432836700, 17 ],
+  /* 3677 */  [ 0.432993703, 17 ],
+  /* 3678 */  [ 0.433150720, 17 ],
+  /* 3679 */  [ 0.433307751, 17 ],
+
+  /* 3680 */  [ 0.433464796, 17 ],
+  /* 3681 */  [ 0.433621856, 17 ],
+  /* 3682 */  [ 0.433778929, 17 ],
+  /* 3683 */  [ 0.433936017, 17 ],
+  /* 3684 */  [ 0.434093120, 17 ],
+  /* 3685 */  [ 0.434250236, 17 ],
+  /* 3686 */  [ 0.434407367, 17 ],
+  /* 3687 */  [ 0.434564512, 17 ],
+  /* 3688 */  [ 0.434721671, 17 ],
+  /* 3689 */  [ 0.434878844, 17 ],
+  /* 3690 */  [ 0.435036032, 17 ],
+  /* 3691 */  [ 0.435193233, 17 ],
+  /* 3692 */  [ 0.435350449, 17 ],
+  /* 3693 */  [ 0.435507679, 17 ],
+  /* 3694 */  [ 0.435664924, 17 ],
+  /* 3695 */  [ 0.435822182, 17 ],
+
+  /* 3696 */  [ 0.435979455, 17 ],
+  /* 3697 */  [ 0.436136741, 17 ],
+  /* 3698 */  [ 0.436294042, 17 ],
+  /* 3699 */  [ 0.436451358, 17 ],
+  /* 3700 */  [ 0.436608687, 17 ],
+  /* 3701 */  [ 0.436766031, 17 ],
+  /* 3702 */  [ 0.436923388, 17 ],
+  /* 3703 */  [ 0.437080760, 17 ],
+  /* 3704 */  [ 0.437238146, 17 ],
+  /* 3705 */  [ 0.437395547, 17 ],
+  /* 3706 */  [ 0.437552961, 17 ],
+  /* 3707 */  [ 0.437710389, 17 ],
+  /* 3708 */  [ 0.437867832, 17 ],
+  /* 3709 */  [ 0.438025289, 17 ],
+  /* 3710 */  [ 0.438182760, 17 ],
+  /* 3711 */  [ 0.438340245, 17 ],
+
+  /* 3712 */  [ 0.438497744, 17 ],
+  /* 3713 */  [ 0.438655258, 17 ],
+  /* 3714 */  [ 0.438812785, 17 ],
+  /* 3715 */  [ 0.438970327, 17 ],
+  /* 3716 */  [ 0.439127883, 17 ],
+  /* 3717 */  [ 0.439285453, 17 ],
+  /* 3718 */  [ 0.439443037, 17 ],
+  /* 3719 */  [ 0.439600635, 17 ],
+  /* 3720 */  [ 0.439758248, 17 ],
+  /* 3721 */  [ 0.439915874, 17 ],
+  /* 3722 */  [ 0.440073515, 17 ],
+  /* 3723 */  [ 0.440231170, 17 ],
+  /* 3724 */  [ 0.440388839, 17 ],
+  /* 3725 */  [ 0.440546522, 17 ],
+  /* 3726 */  [ 0.440704219, 17 ],
+  /* 3727 */  [ 0.440861930, 17 ],
+
+  /* 3728 */  [ 0.441019655, 17 ],
+  /* 3729 */  [ 0.441177395, 17 ],
+  /* 3730 */  [ 0.441335148, 17 ],
+  /* 3731 */  [ 0.441492916, 17 ],
+  /* 3732 */  [ 0.441650697, 17 ],
+  /* 3733 */  [ 0.441808493, 17 ],
+  /* 3734 */  [ 0.441966303, 17 ],
+  /* 3735 */  [ 0.442124127, 17 ],
+  /* 3736 */  [ 0.442281965, 17 ],
+  /* 3737 */  [ 0.442439817, 17 ],
+  /* 3738 */  [ 0.442597683, 17 ],
+  /* 3739 */  [ 0.442755564, 17 ],
+  /* 3740 */  [ 0.442913458, 17 ],
+  /* 3741 */  [ 0.443071366, 17 ],
+  /* 3742 */  [ 0.443229289, 17 ],
+  /* 3743 */  [ 0.443387226, 17 ],
+
+  /* 3744 */  [ 0.443545176, 17 ],
+  /* 3745 */  [ 0.443703141, 17 ],
+  /* 3746 */  [ 0.443861120, 17 ],
+  /* 3747 */  [ 0.444019113, 17 ],
+  /* 3748 */  [ 0.444177119, 17 ],
+  /* 3749 */  [ 0.444335140, 17 ],
+  /* 3750 */  [ 0.444493175, 17 ],
+  /* 3751 */  [ 0.444651224, 17 ],
+  /* 3752 */  [ 0.444809288, 17 ],
+  /* 3753 */  [ 0.444967365, 17 ],
+  /* 3754 */  [ 0.445125456, 17 ],
+  /* 3755 */  [ 0.445283561, 17 ],
+  /* 3756 */  [ 0.445441680, 17 ],
+  /* 3757 */  [ 0.445599814, 17 ],
+  /* 3758 */  [ 0.445757961, 17 ],
+  /* 3759 */  [ 0.445916122, 17 ],
+
+  /* 3760 */  [ 0.446074298, 17 ],
+  /* 3761 */  [ 0.446232487, 17 ],
+  /* 3762 */  [ 0.446390690, 17 ],
+  /* 3763 */  [ 0.446548908, 17 ],
+  /* 3764 */  [ 0.446707139, 17 ],
+  /* 3765 */  [ 0.446865385, 17 ],
+  /* 3766 */  [ 0.447023644, 17 ],
+  /* 3767 */  [ 0.447181918, 17 ],
+  /* 3768 */  [ 0.447340205, 17 ],
+  /* 3769 */  [ 0.447498507, 17 ],
+  /* 3770 */  [ 0.447656822, 17 ],
+  /* 3771 */  [ 0.447815152, 17 ],
+  /* 3772 */  [ 0.447973495, 17 ],
+  /* 3773 */  [ 0.448131853, 17 ],
+  /* 3774 */  [ 0.448290224, 17 ],
+  /* 3775 */  [ 0.448448609, 17 ],
+
+  /* 3776 */  [ 0.448607009, 17 ],
+  /* 3777 */  [ 0.448765422, 17 ],
+  /* 3778 */  [ 0.448923850, 17 ],
+  /* 3779 */  [ 0.449082291, 17 ],
+  /* 3780 */  [ 0.449240746, 17 ],
+  /* 3781 */  [ 0.449399216, 17 ],
+  /* 3782 */  [ 0.449557699, 17 ],
+  /* 3783 */  [ 0.449716196, 17 ],
+  /* 3784 */  [ 0.449874708, 17 ],
+  /* 3785 */  [ 0.450033233, 17 ],
+  /* 3786 */  [ 0.450191772, 17 ],
+  /* 3787 */  [ 0.450350325, 17 ],
+  /* 3788 */  [ 0.450508892, 17 ],
+  /* 3789 */  [ 0.450667473, 17 ],
+  /* 3790 */  [ 0.450826068, 17 ],
+  /* 3791 */  [ 0.450984677, 17 ],
+
+  /* 3792 */  [ 0.451143300, 17 ],
+  /* 3793 */  [ 0.451301937, 17 ],
+  /* 3794 */  [ 0.451460588, 17 ],
+  /* 3795 */  [ 0.451619252, 17 ],
+  /* 3796 */  [ 0.451777931, 17 ],
+  /* 3797 */  [ 0.451936623, 17 ],
+  /* 3798 */  [ 0.452095330, 17 ],
+  /* 3799 */  [ 0.452254050, 17 ],
+  /* 3800 */  [ 0.452412785, 17 ],
+  /* 3801 */  [ 0.452571533, 17 ],
+  /* 3802 */  [ 0.452730295, 17 ],
+  /* 3803 */  [ 0.452889071, 17 ],
+  /* 3804 */  [ 0.453047861, 17 ],
+  /* 3805 */  [ 0.453206665, 17 ],
+  /* 3806 */  [ 0.453365483, 17 ],
+  /* 3807 */  [ 0.453524315, 17 ],
+
+  /* 3808 */  [ 0.453683161, 17 ],
+  /* 3809 */  [ 0.453842020, 17 ],
+  /* 3810 */  [ 0.454000894, 17 ],
+  /* 3811 */  [ 0.454159781, 17 ],
+  /* 3812 */  [ 0.454318683, 17 ],
+  /* 3813 */  [ 0.454477598, 17 ],
+  /* 3814 */  [ 0.454636527, 17 ],
+  /* 3815 */  [ 0.454795470, 17 ],
+  /* 3816 */  [ 0.454954427, 17 ],
+  /* 3817 */  [ 0.455113397, 17 ],
+  /* 3818 */  [ 0.455272382, 17 ],
+  /* 3819 */  [ 0.455431381, 17 ],
+  /* 3820 */  [ 0.455590393, 17 ],
+  /* 3821 */  [ 0.455749419, 17 ],
+  /* 3822 */  [ 0.455908459, 17 ],
+  /* 3823 */  [ 0.456067513, 17 ],
+
+  /* 3824 */  [ 0.456226581, 17 ],
+  /* 3825 */  [ 0.456385663, 17 ],
+  /* 3826 */  [ 0.456544759, 17 ],
+  /* 3827 */  [ 0.456703868, 17 ],
+  /* 3828 */  [ 0.456862992, 17 ],
+  /* 3829 */  [ 0.457022129, 17 ],
+  /* 3830 */  [ 0.457181280, 17 ],
+  /* 3831 */  [ 0.457340445, 17 ],
+  /* 3832 */  [ 0.457499623, 17 ],
+  /* 3833 */  [ 0.457658816, 17 ],
+  /* 3834 */  [ 0.457818022, 17 ],
+  /* 3835 */  [ 0.457977243, 17 ],
+  /* 3836 */  [ 0.458136477, 17 ],
+  /* 3837 */  [ 0.458295725, 17 ],
+  /* 3838 */  [ 0.458454987, 17 ],
+  /* 3839 */  [ 0.458614262, 17 ],
+
+  /* 3840 */  [ 0.458773552, 17 ],
+  /* 3841 */  [ 0.458932855, 17 ],
+  /* 3842 */  [ 0.459092172, 17 ],
+  /* 3843 */  [ 0.459251503, 17 ],
+  /* 3844 */  [ 0.459410848, 17 ],
+  /* 3845 */  [ 0.459570206, 17 ],
+  /* 3846 */  [ 0.459729579, 17 ],
+  /* 3847 */  [ 0.459888965, 17 ],
+  /* 3848 */  [ 0.460048365, 17 ],
+  /* 3849 */  [ 0.460207779, 17 ],
+  /* 3850 */  [ 0.460367206, 17 ],
+  /* 3851 */  [ 0.460526648, 17 ],
+  /* 3852 */  [ 0.460686103, 17 ],
+  /* 3853 */  [ 0.460845572, 17 ],
+  /* 3854 */  [ 0.461005055, 17 ],
+  /* 3855 */  [ 0.461164552, 17 ],
+
+  /* 3856 */  [ 0.461324062, 17 ],
+  /* 3857 */  [ 0.461483586, 17 ],
+  /* 3858 */  [ 0.461643124, 17 ],
+  /* 3859 */  [ 0.461802676, 17 ],
+  /* 3860 */  [ 0.461962242, 17 ],
+  /* 3861 */  [ 0.462121821, 17 ],
+  /* 3862 */  [ 0.462281414, 17 ],
+  /* 3863 */  [ 0.462441021, 17 ],
+  /* 3864 */  [ 0.462600642, 17 ],
+  /* 3865 */  [ 0.462760276, 17 ],
+  /* 3866 */  [ 0.462919924, 17 ],
+  /* 3867 */  [ 0.463079586, 17 ],
+  /* 3868 */  [ 0.463239262, 17 ],
+  /* 3869 */  [ 0.463398951, 17 ],
+  /* 3870 */  [ 0.463558655, 17 ],
+  /* 3871 */  [ 0.463718372, 17 ],
+
+  /* 3872 */  [ 0.463878102, 17 ],
+  /* 3873 */  [ 0.464037847, 17 ],
+  /* 3874 */  [ 0.464197605, 17 ],
+  /* 3875 */  [ 0.464357377, 17 ],
+  /* 3876 */  [ 0.464517163, 17 ],
+  /* 3877 */  [ 0.464676962, 17 ],
+  /* 3878 */  [ 0.464836776, 17 ],
+  /* 3879 */  [ 0.464996603, 17 ],
+  /* 3880 */  [ 0.465156443, 17 ],
+  /* 3881 */  [ 0.465316298, 17 ],
+  /* 3882 */  [ 0.465476166, 17 ],
+  /* 3883 */  [ 0.465636048, 17 ],
+  /* 3884 */  [ 0.465795943, 17 ],
+  /* 3885 */  [ 0.465955853, 17 ],
+  /* 3886 */  [ 0.466115776, 17 ],
+  /* 3887 */  [ 0.466275713, 17 ],
+
+  /* 3888 */  [ 0.466435663, 17 ],
+  /* 3889 */  [ 0.466595627, 17 ],
+  /* 3890 */  [ 0.466755605, 17 ],
+  /* 3891 */  [ 0.466915597, 17 ],
+  /* 3892 */  [ 0.467075602, 17 ],
+  /* 3893 */  [ 0.467235621, 17 ],
+  /* 3894 */  [ 0.467395654, 17 ],
+  /* 3895 */  [ 0.467555701, 17 ],
+  /* 3896 */  [ 0.467715761, 17 ],
+  /* 3897 */  [ 0.467875835, 17 ],
+  /* 3898 */  [ 0.468035922, 17 ],
+  /* 3899 */  [ 0.468196023, 17 ],
+  /* 3900 */  [ 0.468356138, 17 ],
+  /* 3901 */  [ 0.468516267, 17 ],
+  /* 3902 */  [ 0.468676409, 17 ],
+  /* 3903 */  [ 0.468836565, 17 ],
+
+  /* 3904 */  [ 0.468996735, 17 ],
+  /* 3905 */  [ 0.469156918, 17 ],
+  /* 3906 */  [ 0.469317115, 17 ],
+  /* 3907 */  [ 0.469477326, 17 ],
+  /* 3908 */  [ 0.469637550, 17 ],
+  /* 3909 */  [ 0.469797788, 17 ],
+  /* 3910 */  [ 0.469958040, 17 ],
+  /* 3911 */  [ 0.470118305, 17 ],
+  /* 3912 */  [ 0.470278584, 17 ],
+  /* 3913 */  [ 0.470438877, 17 ],
+  /* 3914 */  [ 0.470599183, 17 ],
+  /* 3915 */  [ 0.470759503, 17 ],
+  /* 3916 */  [ 0.470919836, 17 ],
+  /* 3917 */  [ 0.471080184, 17 ],
+  /* 3918 */  [ 0.471240545, 17 ],
+  /* 3919 */  [ 0.471400919, 17 ],
+
+  /* 3920 */  [ 0.471561307, 17 ],
+  /* 3921 */  [ 0.471721709, 17 ],
+  /* 3922 */  [ 0.471882125, 17 ],
+  /* 3923 */  [ 0.472042554, 17 ],
+  /* 3924 */  [ 0.472202996, 17 ],
+  /* 3925 */  [ 0.472363453, 17 ],
+  /* 3926 */  [ 0.472523923, 17 ],
+  /* 3927 */  [ 0.472684406, 17 ],
+  /* 3928 */  [ 0.472844904, 17 ],
+  /* 3929 */  [ 0.473005414, 17 ],
+  /* 3930 */  [ 0.473165939, 17 ],
+  /* 3931 */  [ 0.473326477, 17 ],
+  /* 3932 */  [ 0.473487029, 17 ],
+  /* 3933 */  [ 0.473647594, 17 ],
+  /* 3934 */  [ 0.473808173, 17 ],
+  /* 3935 */  [ 0.473968765, 17 ],
+
+  /* 3936 */  [ 0.474129372, 17 ],
+  /* 3937 */  [ 0.474289991, 17 ],
+  /* 3938 */  [ 0.474450625, 17 ],
+  /* 3939 */  [ 0.474611272, 17 ],
+  /* 3940 */  [ 0.474771932, 17 ],
+  /* 3941 */  [ 0.474932606, 17 ],
+  /* 3942 */  [ 0.475093294, 17 ],
+  /* 3943 */  [ 0.475253995, 17 ],
+  /* 3944 */  [ 0.475414710, 17 ],
+  /* 3945 */  [ 0.475575439, 17 ],
+  /* 3946 */  [ 0.475736181, 17 ],
+  /* 3947 */  [ 0.475896936, 17 ],
+  /* 3948 */  [ 0.476057705, 17 ],
+  /* 3949 */  [ 0.476218488, 17 ],
+  /* 3950 */  [ 0.476379285, 17 ],
+  /* 3951 */  [ 0.476540095, 17 ],
+
+  /* 3952 */  [ 0.476700918, 17 ],
+  /* 3953 */  [ 0.476861755, 17 ],
+  /* 3954 */  [ 0.477022606, 17 ],
+  /* 3955 */  [ 0.477183470, 17 ],
+  /* 3956 */  [ 0.477344348, 17 ],
+  /* 3957 */  [ 0.477505239, 17 ],
+  /* 3958 */  [ 0.477666144, 17 ],
+  /* 3959 */  [ 0.477827062, 17 ],
+  /* 3960 */  [ 0.477987994, 17 ],
+  /* 3961 */  [ 0.478148940, 17 ],
+  /* 3962 */  [ 0.478309899, 17 ],
+  /* 3963 */  [ 0.478470871, 17 ],
+  /* 3964 */  [ 0.478631857, 17 ],
+  /* 3965 */  [ 0.478792857, 17 ],
+  /* 3966 */  [ 0.478953870, 17 ],
+  /* 3967 */  [ 0.479114897, 17 ],
+
+  /* 3968 */  [ 0.479275937, 17 ],
+  /* 3969 */  [ 0.479436991, 17 ],
+  /* 3970 */  [ 0.479598058, 17 ],
+  /* 3971 */  [ 0.479759139, 17 ],
+  /* 3972 */  [ 0.479920233, 17 ],
+  /* 3973 */  [ 0.480081341, 17 ],
+  /* 3974 */  [ 0.480242463, 17 ],
+  /* 3975 */  [ 0.480403598, 17 ],
+  /* 3976 */  [ 0.480564746, 17 ],
+  /* 3977 */  [ 0.480725908, 17 ],
+  /* 3978 */  [ 0.480887083, 17 ],
+  /* 3979 */  [ 0.481048272, 17 ],
+  /* 3980 */  [ 0.481209475, 17 ],
+  /* 3981 */  [ 0.481370691, 17 ],
+  /* 3982 */  [ 0.481531920, 17 ],
+  /* 3983 */  [ 0.481693163, 17 ],
+
+  /* 3984 */  [ 0.481854420, 17 ],
+  /* 3985 */  [ 0.482015690, 17 ],
+  /* 3986 */  [ 0.482176973, 17 ],
+  /* 3987 */  [ 0.482338270, 17 ],
+  /* 3988 */  [ 0.482499580, 17 ],
+  /* 3989 */  [ 0.482660904, 17 ],
+  /* 3990 */  [ 0.482822242, 17 ],
+  /* 3991 */  [ 0.482983592, 17 ],
+  /* 3992 */  [ 0.483144957, 17 ],
+  /* 3993 */  [ 0.483306335, 17 ],
+  /* 3994 */  [ 0.483467726, 17 ],
+  /* 3995 */  [ 0.483629131, 17 ],
+  /* 3996 */  [ 0.483790549, 17 ],
+  /* 3997 */  [ 0.483951980, 17 ],
+  /* 3998 */  [ 0.484113426, 17 ],
+  /* 3999 */  [ 0.484274884, 17 ],
+
+  /* 4000 */  [ 0.484436356, 17 ],
+  /* 4001 */  [ 0.484597842, 17 ],
+  /* 4002 */  [ 0.484759341, 17 ],
+  /* 4003 */  [ 0.484920853, 17 ],
+  /* 4004 */  [ 0.485082379, 17 ],
+  /* 4005 */  [ 0.485243918, 17 ],
+  /* 4006 */  [ 0.485405471, 17 ],
+  /* 4007 */  [ 0.485567037, 17 ],
+  /* 4008 */  [ 0.485728617, 17 ],
+  /* 4009 */  [ 0.485890210, 17 ],
+  /* 4010 */  [ 0.486051817, 17 ],
+  /* 4011 */  [ 0.486213436, 17 ],
+  /* 4012 */  [ 0.486375070, 17 ],
+  /* 4013 */  [ 0.486536717, 17 ],
+  /* 4014 */  [ 0.486698377, 17 ],
+  /* 4015 */  [ 0.486860051, 17 ],
+
+  /* 4016 */  [ 0.487021738, 17 ],
+  /* 4017 */  [ 0.487183438, 17 ],
+  /* 4018 */  [ 0.487345152, 17 ],
+  /* 4019 */  [ 0.487506879, 17 ],
+  /* 4020 */  [ 0.487668620, 17 ],
+  /* 4021 */  [ 0.487830374, 17 ],
+  /* 4022 */  [ 0.487992142, 17 ],
+  /* 4023 */  [ 0.488153923, 17 ],
+  /* 4024 */  [ 0.488315717, 17 ],
+  /* 4025 */  [ 0.488477525, 17 ],
+  /* 4026 */  [ 0.488639346, 17 ],
+  /* 4027 */  [ 0.488801181, 17 ],
+  /* 4028 */  [ 0.488963029, 17 ],
+  /* 4029 */  [ 0.489124890, 17 ],
+  /* 4030 */  [ 0.489286765, 17 ],
+  /* 4031 */  [ 0.489448653, 17 ],
+
+  /* 4032 */  [ 0.489610555, 17 ],
+  /* 4033 */  [ 0.489772470, 17 ],
+  /* 4034 */  [ 0.489934398, 17 ],
+  /* 4035 */  [ 0.490096340, 17 ],
+  /* 4036 */  [ 0.490258295, 17 ],
+  /* 4037 */  [ 0.490420263, 17 ],
+  /* 4038 */  [ 0.490582245, 17 ],
+  /* 4039 */  [ 0.490744240, 17 ],
+  /* 4040 */  [ 0.490906249, 17 ],
+  /* 4041 */  [ 0.491068271, 17 ],
+  /* 4042 */  [ 0.491230306, 17 ],
+  /* 4043 */  [ 0.491392355, 17 ],
+  /* 4044 */  [ 0.491554417, 17 ],
+  /* 4045 */  [ 0.491716492, 17 ],
+  /* 4046 */  [ 0.491878581, 17 ],
+  /* 4047 */  [ 0.492040683, 17 ],
+
+  /* 4048 */  [ 0.492202799, 17 ],
+  /* 4049 */  [ 0.492364928, 17 ],
+  /* 4050 */  [ 0.492527070, 17 ],
+  /* 4051 */  [ 0.492689225, 17 ],
+  /* 4052 */  [ 0.492851394, 17 ],
+  /* 4053 */  [ 0.493013576, 17 ],
+  /* 4054 */  [ 0.493175772, 17 ],
+  /* 4055 */  [ 0.493337981, 17 ],
+  /* 4056 */  [ 0.493500203, 17 ],
+  /* 4057 */  [ 0.493662438, 17 ],
+  /* 4058 */  [ 0.493824687, 17 ],
+  /* 4059 */  [ 0.493986949, 17 ],
+  /* 4060 */  [ 0.494149225, 17 ],
+  /* 4061 */  [ 0.494311514, 17 ],
+  /* 4062 */  [ 0.494473816, 17 ],
+  /* 4063 */  [ 0.494636131, 17 ],
+
+  /* 4064 */  [ 0.494798460, 17 ],
+  /* 4065 */  [ 0.494960802, 17 ],
+  /* 4066 */  [ 0.495123158, 17 ],
+  /* 4067 */  [ 0.495285526, 17 ],
+  /* 4068 */  [ 0.495447908, 17 ],
+  /* 4069 */  [ 0.495610304, 17 ],
+  /* 4070 */  [ 0.495772712, 17 ],
+  /* 4071 */  [ 0.495935134, 17 ],
+  /* 4072 */  [ 0.496097570, 17 ],
+  /* 4073 */  [ 0.496260018, 17 ],
+  /* 4074 */  [ 0.496422480, 17 ],
+  /* 4075 */  [ 0.496584955, 17 ],
+  /* 4076 */  [ 0.496747444, 17 ],
+  /* 4077 */  [ 0.496909945, 17 ],
+  /* 4078 */  [ 0.497072460, 17 ],
+  /* 4079 */  [ 0.497234989, 17 ],
+
+  /* 4080 */  [ 0.497397530, 17 ],
+  /* 4081 */  [ 0.497560085, 17 ],
+  /* 4082 */  [ 0.497722653, 17 ],
+  /* 4083 */  [ 0.497885235, 17 ],
+  /* 4084 */  [ 0.498047829, 17 ],
+  /* 4085 */  [ 0.498210437, 17 ],
+  /* 4086 */  [ 0.498373058, 17 ],
+  /* 4087 */  [ 0.498535693, 17 ],
+  /* 4088 */  [ 0.498698341, 17 ],
+  /* 4089 */  [ 0.498861002, 17 ],
+  /* 4090 */  [ 0.499023676, 17 ],
+  /* 4091 */  [ 0.499186364, 17 ],
+  /* 4092 */  [ 0.499349064, 17 ],
+  /* 4093 */  [ 0.499511778, 17 ],
+  /* 4094 */  [ 0.499674506, 17 ],
+  /* 4095 */  [ 0.499837246, 17 ],
+
+  /* 4096 */  [ 0.250000000, 18 ],
+  /* 4097 */  [ 0.250081384, 18 ],
+  /* 4098 */  [ 0.250162774, 18 ],
+  /* 4099 */  [ 0.250244170, 18 ],
+  /* 4100 */  [ 0.250325574, 18 ],
+  /* 4101 */  [ 0.250406984, 18 ],
+  /* 4102 */  [ 0.250488400, 18 ],
+  /* 4103 */  [ 0.250569824, 18 ],
+  /* 4104 */  [ 0.250651254, 18 ],
+  /* 4105 */  [ 0.250732690, 18 ],
+  /* 4106 */  [ 0.250814133, 18 ],
+  /* 4107 */  [ 0.250895583, 18 ],
+  /* 4108 */  [ 0.250977039, 18 ],
+  /* 4109 */  [ 0.251058502, 18 ],
+  /* 4110 */  [ 0.251139971, 18 ],
+  /* 4111 */  [ 0.251221448, 18 ],
+
+  /* 4112 */  [ 0.251302930, 18 ],
+  /* 4113 */  [ 0.251384420, 18 ],
+  /* 4114 */  [ 0.251465916, 18 ],
+  /* 4115 */  [ 0.251547418, 18 ],
+  /* 4116 */  [ 0.251628927, 18 ],
+  /* 4117 */  [ 0.251710443, 18 ],
+  /* 4118 */  [ 0.251791965, 18 ],
+  /* 4119 */  [ 0.251873494, 18 ],
+  /* 4120 */  [ 0.251955030, 18 ],
+  /* 4121 */  [ 0.252036572, 18 ],
+  /* 4122 */  [ 0.252118121, 18 ],
+  /* 4123 */  [ 0.252199676, 18 ],
+  /* 4124 */  [ 0.252281238, 18 ],
+  /* 4125 */  [ 0.252362807, 18 ],
+  /* 4126 */  [ 0.252444382, 18 ],
+  /* 4127 */  [ 0.252525963, 18 ],
+
+  /* 4128 */  [ 0.252607552, 18 ],
+  /* 4129 */  [ 0.252689147, 18 ],
+  /* 4130 */  [ 0.252770748, 18 ],
+  /* 4131 */  [ 0.252852356, 18 ],
+  /* 4132 */  [ 0.252933971, 18 ],
+  /* 4133 */  [ 0.253015592, 18 ],
+  /* 4134 */  [ 0.253097220, 18 ],
+  /* 4135 */  [ 0.253178854, 18 ],
+  /* 4136 */  [ 0.253260495, 18 ],
+  /* 4137 */  [ 0.253342143, 18 ],
+  /* 4138 */  [ 0.253423797, 18 ],
+  /* 4139 */  [ 0.253505457, 18 ],
+  /* 4140 */  [ 0.253587125, 18 ],
+  /* 4141 */  [ 0.253668799, 18 ],
+  /* 4142 */  [ 0.253750479, 18 ],
+  /* 4143 */  [ 0.253832166, 18 ],
+
+  /* 4144 */  [ 0.253913860, 18 ],
+  /* 4145 */  [ 0.253995560, 18 ],
+  /* 4146 */  [ 0.254077266, 18 ],
+  /* 4147 */  [ 0.254158980, 18 ],
+  /* 4148 */  [ 0.254240700, 18 ],
+  /* 4149 */  [ 0.254322426, 18 ],
+  /* 4150 */  [ 0.254404159, 18 ],
+  /* 4151 */  [ 0.254485899, 18 ],
+  /* 4152 */  [ 0.254567645, 18 ],
+  /* 4153 */  [ 0.254649397, 18 ],
+  /* 4154 */  [ 0.254731157, 18 ],
+  /* 4155 */  [ 0.254812922, 18 ],
+  /* 4156 */  [ 0.254894695, 18 ],
+  /* 4157 */  [ 0.254976474, 18 ],
+  /* 4158 */  [ 0.255058259, 18 ],
+  /* 4159 */  [ 0.255140051, 18 ],
+
+  /* 4160 */  [ 0.255221850, 18 ],
+  /* 4161 */  [ 0.255303655, 18 ],
+  /* 4162 */  [ 0.255385467, 18 ],
+  /* 4163 */  [ 0.255467285, 18 ],
+  /* 4164 */  [ 0.255549110, 18 ],
+  /* 4165 */  [ 0.255630941, 18 ],
+  /* 4166 */  [ 0.255712779, 18 ],
+  /* 4167 */  [ 0.255794624, 18 ],
+  /* 4168 */  [ 0.255876475, 18 ],
+  /* 4169 */  [ 0.255958332, 18 ],
+  /* 4170 */  [ 0.256040196, 18 ],
+  /* 4171 */  [ 0.256122067, 18 ],
+  /* 4172 */  [ 0.256203944, 18 ],
+  /* 4173 */  [ 0.256285828, 18 ],
+  /* 4174 */  [ 0.256367718, 18 ],
+  /* 4175 */  [ 0.256449615, 18 ],
+
+  /* 4176 */  [ 0.256531518, 18 ],
+  /* 4177 */  [ 0.256613428, 18 ],
+  /* 4178 */  [ 0.256695344, 18 ],
+  /* 4179 */  [ 0.256777267, 18 ],
+  /* 4180 */  [ 0.256859197, 18 ],
+  /* 4181 */  [ 0.256941133, 18 ],
+  /* 4182 */  [ 0.257023076, 18 ],
+  /* 4183 */  [ 0.257105025, 18 ],
+  /* 4184 */  [ 0.257186980, 18 ],
+  /* 4185 */  [ 0.257268942, 18 ],
+  /* 4186 */  [ 0.257350911, 18 ],
+  /* 4187 */  [ 0.257432886, 18 ],
+  /* 4188 */  [ 0.257514868, 18 ],
+  /* 4189 */  [ 0.257596856, 18 ],
+  /* 4190 */  [ 0.257678851, 18 ],
+  /* 4191 */  [ 0.257760852, 18 ],
+
+  /* 4192 */  [ 0.257842860, 18 ],
+  /* 4193 */  [ 0.257924875, 18 ],
+  /* 4194 */  [ 0.258006895, 18 ],
+  /* 4195 */  [ 0.258088923, 18 ],
+  /* 4196 */  [ 0.258170957, 18 ],
+  /* 4197 */  [ 0.258252997, 18 ],
+  /* 4198 */  [ 0.258335044, 18 ],
+  /* 4199 */  [ 0.258417097, 18 ],
+  /* 4200 */  [ 0.258499157, 18 ],
+  /* 4201 */  [ 0.258581224, 18 ],
+  /* 4202 */  [ 0.258663297, 18 ],
+  /* 4203 */  [ 0.258745376, 18 ],
+  /* 4204 */  [ 0.258827462, 18 ],
+  /* 4205 */  [ 0.258909555, 18 ],
+  /* 4206 */  [ 0.258991654, 18 ],
+  /* 4207 */  [ 0.259073760, 18 ],
+
+  /* 4208 */  [ 0.259155872, 18 ],
+  /* 4209 */  [ 0.259237990, 18 ],
+  /* 4210 */  [ 0.259320115, 18 ],
+  /* 4211 */  [ 0.259402247, 18 ],
+  /* 4212 */  [ 0.259484385, 18 ],
+  /* 4213 */  [ 0.259566529, 18 ],
+  /* 4214 */  [ 0.259648680, 18 ],
+  /* 4215 */  [ 0.259730838, 18 ],
+  /* 4216 */  [ 0.259813002, 18 ],
+  /* 4217 */  [ 0.259895173, 18 ],
+  /* 4218 */  [ 0.259977350, 18 ],
+  /* 4219 */  [ 0.260059533, 18 ],
+  /* 4220 */  [ 0.260141723, 18 ],
+  /* 4221 */  [ 0.260223920, 18 ],
+  /* 4222 */  [ 0.260306123, 18 ],
+  /* 4223 */  [ 0.260388332, 18 ],
+
+  /* 4224 */  [ 0.260470548, 18 ],
+  /* 4225 */  [ 0.260552771, 18 ],
+  /* 4226 */  [ 0.260635000, 18 ],
+  /* 4227 */  [ 0.260717235, 18 ],
+  /* 4228 */  [ 0.260799477, 18 ],
+  /* 4229 */  [ 0.260881725, 18 ],
+  /* 4230 */  [ 0.260963980, 18 ],
+  /* 4231 */  [ 0.261046242, 18 ],
+  /* 4232 */  [ 0.261128510, 18 ],
+  /* 4233 */  [ 0.261210784, 18 ],
+  /* 4234 */  [ 0.261293065, 18 ],
+  /* 4235 */  [ 0.261375352, 18 ],
+  /* 4236 */  [ 0.261457646, 18 ],
+  /* 4237 */  [ 0.261539946, 18 ],
+  /* 4238 */  [ 0.261622253, 18 ],
+  /* 4239 */  [ 0.261704566, 18 ],
+
+  /* 4240 */  [ 0.261786886, 18 ],
+  /* 4241 */  [ 0.261869212, 18 ],
+  /* 4242 */  [ 0.261951545, 18 ],
+  /* 4243 */  [ 0.262033884, 18 ],
+  /* 4244 */  [ 0.262116229, 18 ],
+  /* 4245 */  [ 0.262198581, 18 ],
+  /* 4246 */  [ 0.262280940, 18 ],
+  /* 4247 */  [ 0.262363305, 18 ],
+  /* 4248 */  [ 0.262445676, 18 ],
+  /* 4249 */  [ 0.262528054, 18 ],
+  /* 4250 */  [ 0.262610438, 18 ],
+  /* 4251 */  [ 0.262692829, 18 ],
+  /* 4252 */  [ 0.262775227, 18 ],
+  /* 4253 */  [ 0.262857630, 18 ],
+  /* 4254 */  [ 0.262940040, 18 ],
+  /* 4255 */  [ 0.263022457, 18 ],
+
+  /* 4256 */  [ 0.263104880, 18 ],
+  /* 4257 */  [ 0.263187310, 18 ],
+  /* 4258 */  [ 0.263269746, 18 ],
+  /* 4259 */  [ 0.263352188, 18 ],
+  /* 4260 */  [ 0.263434637, 18 ],
+  /* 4261 */  [ 0.263517093, 18 ],
+  /* 4262 */  [ 0.263599554, 18 ],
+  /* 4263 */  [ 0.263682023, 18 ],
+  /* 4264 */  [ 0.263764497, 18 ],
+  /* 4265 */  [ 0.263846979, 18 ],
+  /* 4266 */  [ 0.263929466, 18 ],
+  /* 4267 */  [ 0.264011960, 18 ],
+  /* 4268 */  [ 0.264094461, 18 ],
+  /* 4269 */  [ 0.264176968, 18 ],
+  /* 4270 */  [ 0.264259481, 18 ],
+  /* 4271 */  [ 0.264342001, 18 ],
+
+  /* 4272 */  [ 0.264424527, 18 ],
+  /* 4273 */  [ 0.264507060, 18 ],
+  /* 4274 */  [ 0.264589599, 18 ],
+  /* 4275 */  [ 0.264672145, 18 ],
+  /* 4276 */  [ 0.264754697, 18 ],
+  /* 4277 */  [ 0.264837255, 18 ],
+  /* 4278 */  [ 0.264919820, 18 ],
+  /* 4279 */  [ 0.265002392, 18 ],
+  /* 4280 */  [ 0.265084969, 18 ],
+  /* 4281 */  [ 0.265167554, 18 ],
+  /* 4282 */  [ 0.265250144, 18 ],
+  /* 4283 */  [ 0.265332741, 18 ],
+  /* 4284 */  [ 0.265415345, 18 ],
+  /* 4285 */  [ 0.265497955, 18 ],
+  /* 4286 */  [ 0.265580571, 18 ],
+  /* 4287 */  [ 0.265663194, 18 ],
+
+  /* 4288 */  [ 0.265745823, 18 ],
+  /* 4289 */  [ 0.265828459, 18 ],
+  /* 4290 */  [ 0.265911101, 18 ],
+  /* 4291 */  [ 0.265993749, 18 ],
+  /* 4292 */  [ 0.266076404, 18 ],
+  /* 4293 */  [ 0.266159065, 18 ],
+  /* 4294 */  [ 0.266241733, 18 ],
+  /* 4295 */  [ 0.266324407, 18 ],
+  /* 4296 */  [ 0.266407088, 18 ],
+  /* 4297 */  [ 0.266489775, 18 ],
+  /* 4298 */  [ 0.266572468, 18 ],
+  /* 4299 */  [ 0.266655168, 18 ],
+  /* 4300 */  [ 0.266737874, 18 ],
+  /* 4301 */  [ 0.266820587, 18 ],
+  /* 4302 */  [ 0.266903306, 18 ],
+  /* 4303 */  [ 0.266986031, 18 ],
+
+  /* 4304 */  [ 0.267068763, 18 ],
+  /* 4305 */  [ 0.267151501, 18 ],
+  /* 4306 */  [ 0.267234246, 18 ],
+  /* 4307 */  [ 0.267316997, 18 ],
+  /* 4308 */  [ 0.267399755, 18 ],
+  /* 4309 */  [ 0.267482518, 18 ],
+  /* 4310 */  [ 0.267565289, 18 ],
+  /* 4311 */  [ 0.267648065, 18 ],
+  /* 4312 */  [ 0.267730848, 18 ],
+  /* 4313 */  [ 0.267813638, 18 ],
+  /* 4314 */  [ 0.267896434, 18 ],
+  /* 4315 */  [ 0.267979236, 18 ],
+  /* 4316 */  [ 0.268062045, 18 ],
+  /* 4317 */  [ 0.268144860, 18 ],
+  /* 4318 */  [ 0.268227681, 18 ],
+  /* 4319 */  [ 0.268310509, 18 ],
+
+  /* 4320 */  [ 0.268393343, 18 ],
+  /* 4321 */  [ 0.268476184, 18 ],
+  /* 4322 */  [ 0.268559031, 18 ],
+  /* 4323 */  [ 0.268641885, 18 ],
+  /* 4324 */  [ 0.268724744, 18 ],
+  /* 4325 */  [ 0.268807611, 18 ],
+  /* 4326 */  [ 0.268890483, 18 ],
+  /* 4327 */  [ 0.268973362, 18 ],
+  /* 4328 */  [ 0.269056248, 18 ],
+  /* 4329 */  [ 0.269139139, 18 ],
+  /* 4330 */  [ 0.269222037, 18 ],
+  /* 4331 */  [ 0.269304942, 18 ],
+  /* 4332 */  [ 0.269387853, 18 ],
+  /* 4333 */  [ 0.269470770, 18 ],
+  /* 4334 */  [ 0.269553694, 18 ],
+  /* 4335 */  [ 0.269636624, 18 ],
+
+  /* 4336 */  [ 0.269719560, 18 ],
+  /* 4337 */  [ 0.269802503, 18 ],
+  /* 4338 */  [ 0.269885452, 18 ],
+  /* 4339 */  [ 0.269968408, 18 ],
+  /* 4340 */  [ 0.270051370, 18 ],
+  /* 4341 */  [ 0.270134338, 18 ],
+  /* 4342 */  [ 0.270217312, 18 ],
+  /* 4343 */  [ 0.270300293, 18 ],
+  /* 4344 */  [ 0.270383281, 18 ],
+  /* 4345 */  [ 0.270466275, 18 ],
+  /* 4346 */  [ 0.270549275, 18 ],
+  /* 4347 */  [ 0.270632281, 18 ],
+  /* 4348 */  [ 0.270715294, 18 ],
+  /* 4349 */  [ 0.270798313, 18 ],
+  /* 4350 */  [ 0.270881339, 18 ],
+  /* 4351 */  [ 0.270964371, 18 ],
+
+  /* 4352 */  [ 0.271047409, 18 ],
+  /* 4353 */  [ 0.271130454, 18 ],
+  /* 4354 */  [ 0.271213505, 18 ],
+  /* 4355 */  [ 0.271296562, 18 ],
+  /* 4356 */  [ 0.271379626, 18 ],
+  /* 4357 */  [ 0.271462696, 18 ],
+  /* 4358 */  [ 0.271545772, 18 ],
+  /* 4359 */  [ 0.271628855, 18 ],
+  /* 4360 */  [ 0.271711944, 18 ],
+  /* 4361 */  [ 0.271795040, 18 ],
+  /* 4362 */  [ 0.271878142, 18 ],
+  /* 4363 */  [ 0.271961250, 18 ],
+  /* 4364 */  [ 0.272044365, 18 ],
+  /* 4365 */  [ 0.272127486, 18 ],
+  /* 4366 */  [ 0.272210613, 18 ],
+  /* 4367 */  [ 0.272293746, 18 ],
+
+  /* 4368 */  [ 0.272376886, 18 ],
+  /* 4369 */  [ 0.272460033, 18 ],
+  /* 4370 */  [ 0.272543185, 18 ],
+  /* 4371 */  [ 0.272626344, 18 ],
+  /* 4372 */  [ 0.272709510, 18 ],
+  /* 4373 */  [ 0.272792681, 18 ],
+  /* 4374 */  [ 0.272875859, 18 ],
+  /* 4375 */  [ 0.272959044, 18 ],
+  /* 4376 */  [ 0.273042234, 18 ],
+  /* 4377 */  [ 0.273125431, 18 ],
+  /* 4378 */  [ 0.273208635, 18 ],
+  /* 4379 */  [ 0.273291844, 18 ],
+  /* 4380 */  [ 0.273375060, 18 ],
+  /* 4381 */  [ 0.273458283, 18 ],
+  /* 4382 */  [ 0.273541511, 18 ],
+  /* 4383 */  [ 0.273624747, 18 ],
+
+  /* 4384 */  [ 0.273707988, 18 ],
+  /* 4385 */  [ 0.273791236, 18 ],
+  /* 4386 */  [ 0.273874490, 18 ],
+  /* 4387 */  [ 0.273957750, 18 ],
+  /* 4388 */  [ 0.274041017, 18 ],
+  /* 4389 */  [ 0.274124290, 18 ],
+  /* 4390 */  [ 0.274207569, 18 ],
+  /* 4391 */  [ 0.274290855, 18 ],
+  /* 4392 */  [ 0.274374147, 18 ],
+  /* 4393 */  [ 0.274457445, 18 ],
+  /* 4394 */  [ 0.274540749, 18 ],
+  /* 4395 */  [ 0.274624060, 18 ],
+  /* 4396 */  [ 0.274707378, 18 ],
+  /* 4397 */  [ 0.274790701, 18 ],
+  /* 4398 */  [ 0.274874031, 18 ],
+  /* 4399 */  [ 0.274957367, 18 ],
+
+  /* 4400 */  [ 0.275040710, 18 ],
+  /* 4401 */  [ 0.275124059, 18 ],
+  /* 4402 */  [ 0.275207414, 18 ],
+  /* 4403 */  [ 0.275290775, 18 ],
+  /* 4404 */  [ 0.275374143, 18 ],
+  /* 4405 */  [ 0.275457517, 18 ],
+  /* 4406 */  [ 0.275540897, 18 ],
+  /* 4407 */  [ 0.275624284, 18 ],
+  /* 4408 */  [ 0.275707677, 18 ],
+  /* 4409 */  [ 0.275791076, 18 ],
+  /* 4410 */  [ 0.275874482, 18 ],
+  /* 4411 */  [ 0.275957894, 18 ],
+  /* 4412 */  [ 0.276041312, 18 ],
+  /* 4413 */  [ 0.276124737, 18 ],
+  /* 4414 */  [ 0.276208167, 18 ],
+  /* 4415 */  [ 0.276291605, 18 ],
+
+  /* 4416 */  [ 0.276375048, 18 ],
+  /* 4417 */  [ 0.276458498, 18 ],
+  /* 4418 */  [ 0.276541954, 18 ],
+  /* 4419 */  [ 0.276625416, 18 ],
+  /* 4420 */  [ 0.276708885, 18 ],
+  /* 4421 */  [ 0.276792360, 18 ],
+  /* 4422 */  [ 0.276875841, 18 ],
+  /* 4423 */  [ 0.276959328, 18 ],
+  /* 4424 */  [ 0.277042822, 18 ],
+  /* 4425 */  [ 0.277126322, 18 ],
+  /* 4426 */  [ 0.277209829, 18 ],
+  /* 4427 */  [ 0.277293341, 18 ],
+  /* 4428 */  [ 0.277376860, 18 ],
+  /* 4429 */  [ 0.277460385, 18 ],
+  /* 4430 */  [ 0.277543917, 18 ],
+  /* 4431 */  [ 0.277627455, 18 ],
+
+  /* 4432 */  [ 0.277710999, 18 ],
+  /* 4433 */  [ 0.277794549, 18 ],
+  /* 4434 */  [ 0.277878106, 18 ],
+  /* 4435 */  [ 0.277961669, 18 ],
+  /* 4436 */  [ 0.278045238, 18 ],
+  /* 4437 */  [ 0.278128813, 18 ],
+  /* 4438 */  [ 0.278212395, 18 ],
+  /* 4439 */  [ 0.278295983, 18 ],
+  /* 4440 */  [ 0.278379578, 18 ],
+  /* 4441 */  [ 0.278463178, 18 ],
+  /* 4442 */  [ 0.278546785, 18 ],
+  /* 4443 */  [ 0.278630398, 18 ],
+  /* 4444 */  [ 0.278714018, 18 ],
+  /* 4445 */  [ 0.278797643, 18 ],
+  /* 4446 */  [ 0.278881275, 18 ],
+  /* 4447 */  [ 0.278964914, 18 ],
+
+  /* 4448 */  [ 0.279048558, 18 ],
+  /* 4449 */  [ 0.279132209, 18 ],
+  /* 4450 */  [ 0.279215866, 18 ],
+  /* 4451 */  [ 0.279299529, 18 ],
+  /* 4452 */  [ 0.279383199, 18 ],
+  /* 4453 */  [ 0.279466875, 18 ],
+  /* 4454 */  [ 0.279550557, 18 ],
+  /* 4455 */  [ 0.279634245, 18 ],
+  /* 4456 */  [ 0.279717940, 18 ],
+  /* 4457 */  [ 0.279801641, 18 ],
+  /* 4458 */  [ 0.279885348, 18 ],
+  /* 4459 */  [ 0.279969061, 18 ],
+  /* 4460 */  [ 0.280052781, 18 ],
+  /* 4461 */  [ 0.280136507, 18 ],
+  /* 4462 */  [ 0.280220239, 18 ],
+  /* 4463 */  [ 0.280303978, 18 ],
+
+  /* 4464 */  [ 0.280387722, 18 ],
+  /* 4465 */  [ 0.280471473, 18 ],
+  /* 4466 */  [ 0.280555230, 18 ],
+  /* 4467 */  [ 0.280638994, 18 ],
+  /* 4468 */  [ 0.280722764, 18 ],
+  /* 4469 */  [ 0.280806540, 18 ],
+  /* 4470 */  [ 0.280890322, 18 ],
+  /* 4471 */  [ 0.280974110, 18 ],
+  /* 4472 */  [ 0.281057905, 18 ],
+  /* 4473 */  [ 0.281141706, 18 ],
+  /* 4474 */  [ 0.281225513, 18 ],
+  /* 4475 */  [ 0.281309326, 18 ],
+  /* 4476 */  [ 0.281393146, 18 ],
+  /* 4477 */  [ 0.281476972, 18 ],
+  /* 4478 */  [ 0.281560804, 18 ],
+  /* 4479 */  [ 0.281644643, 18 ],
+
+  /* 4480 */  [ 0.281728487, 18 ],
+  /* 4481 */  [ 0.281812338, 18 ],
+  /* 4482 */  [ 0.281896195, 18 ],
+  /* 4483 */  [ 0.281980059, 18 ],
+  /* 4484 */  [ 0.282063928, 18 ],
+  /* 4485 */  [ 0.282147804, 18 ],
+  /* 4486 */  [ 0.282231686, 18 ],
+  /* 4487 */  [ 0.282315574, 18 ],
+  /* 4488 */  [ 0.282399469, 18 ],
+  /* 4489 */  [ 0.282483370, 18 ],
+  /* 4490 */  [ 0.282567277, 18 ],
+  /* 4491 */  [ 0.282651190, 18 ],
+  /* 4492 */  [ 0.282735109, 18 ],
+  /* 4493 */  [ 0.282819035, 18 ],
+  /* 4494 */  [ 0.282902967, 18 ],
+  /* 4495 */  [ 0.282986905, 18 ],
+
+  /* 4496 */  [ 0.283070849, 18 ],
+  /* 4497 */  [ 0.283154800, 18 ],
+  /* 4498 */  [ 0.283238757, 18 ],
+  /* 4499 */  [ 0.283322720, 18 ],
+  /* 4500 */  [ 0.283406689, 18 ],
+  /* 4501 */  [ 0.283490665, 18 ],
+  /* 4502 */  [ 0.283574646, 18 ],
+  /* 4503 */  [ 0.283658634, 18 ],
+  /* 4504 */  [ 0.283742628, 18 ],
+  /* 4505 */  [ 0.283826629, 18 ],
+  /* 4506 */  [ 0.283910635, 18 ],
+  /* 4507 */  [ 0.283994648, 18 ],
+  /* 4508 */  [ 0.284078667, 18 ],
+  /* 4509 */  [ 0.284162692, 18 ],
+  /* 4510 */  [ 0.284246723, 18 ],
+  /* 4511 */  [ 0.284330761, 18 ],
+
+  /* 4512 */  [ 0.284414805, 18 ],
+  /* 4513 */  [ 0.284498855, 18 ],
+  /* 4514 */  [ 0.284582911, 18 ],
+  /* 4515 */  [ 0.284666974, 18 ],
+  /* 4516 */  [ 0.284751042, 18 ],
+  /* 4517 */  [ 0.284835117, 18 ],
+  /* 4518 */  [ 0.284919198, 18 ],
+  /* 4519 */  [ 0.285003285, 18 ],
+  /* 4520 */  [ 0.285087379, 18 ],
+  /* 4521 */  [ 0.285171479, 18 ],
+  /* 4522 */  [ 0.285255584, 18 ],
+  /* 4523 */  [ 0.285339697, 18 ],
+  /* 4524 */  [ 0.285423815, 18 ],
+  /* 4525 */  [ 0.285507939, 18 ],
+  /* 4526 */  [ 0.285592070, 18 ],
+  /* 4527 */  [ 0.285676207, 18 ],
+
+  /* 4528 */  [ 0.285760350, 18 ],
+  /* 4529 */  [ 0.285844499, 18 ],
+  /* 4530 */  [ 0.285928655, 18 ],
+  /* 4531 */  [ 0.286012816, 18 ],
+  /* 4532 */  [ 0.286096984, 18 ],
+  /* 4533 */  [ 0.286181158, 18 ],
+  /* 4534 */  [ 0.286265338, 18 ],
+  /* 4535 */  [ 0.286349525, 18 ],
+  /* 4536 */  [ 0.286433717, 18 ],
+  /* 4537 */  [ 0.286517916, 18 ],
+  /* 4538 */  [ 0.286602121, 18 ],
+  /* 4539 */  [ 0.286686332, 18 ],
+  /* 4540 */  [ 0.286770550, 18 ],
+  /* 4541 */  [ 0.286854773, 18 ],
+  /* 4542 */  [ 0.286939003, 18 ],
+  /* 4543 */  [ 0.287023239, 18 ],
+
+  /* 4544 */  [ 0.287107481, 18 ],
+  /* 4545 */  [ 0.287191729, 18 ],
+  /* 4546 */  [ 0.287275983, 18 ],
+  /* 4547 */  [ 0.287360244, 18 ],
+  /* 4548 */  [ 0.287444511, 18 ],
+  /* 4549 */  [ 0.287528784, 18 ],
+  /* 4550 */  [ 0.287613063, 18 ],
+  /* 4551 */  [ 0.287697348, 18 ],
+  /* 4552 */  [ 0.287781640, 18 ],
+  /* 4553 */  [ 0.287865937, 18 ],
+  /* 4554 */  [ 0.287950241, 18 ],
+  /* 4555 */  [ 0.288034551, 18 ],
+  /* 4556 */  [ 0.288118867, 18 ],
+  /* 4557 */  [ 0.288203190, 18 ],
+  /* 4558 */  [ 0.288287518, 18 ],
+  /* 4559 */  [ 0.288371853, 18 ],
+
+  /* 4560 */  [ 0.288456194, 18 ],
+  /* 4561 */  [ 0.288540541, 18 ],
+  /* 4562 */  [ 0.288624894, 18 ],
+  /* 4563 */  [ 0.288709253, 18 ],
+  /* 4564 */  [ 0.288793619, 18 ],
+  /* 4565 */  [ 0.288877990, 18 ],
+  /* 4566 */  [ 0.288962368, 18 ],
+  /* 4567 */  [ 0.289046752, 18 ],
+  /* 4568 */  [ 0.289131142, 18 ],
+  /* 4569 */  [ 0.289215538, 18 ],
+  /* 4570 */  [ 0.289299941, 18 ],
+  /* 4571 */  [ 0.289384349, 18 ],
+  /* 4572 */  [ 0.289468764, 18 ],
+  /* 4573 */  [ 0.289553185, 18 ],
+  /* 4574 */  [ 0.289637612, 18 ],
+  /* 4575 */  [ 0.289722045, 18 ],
+
+  /* 4576 */  [ 0.289806485, 18 ],
+  /* 4577 */  [ 0.289890930, 18 ],
+  /* 4578 */  [ 0.289975382, 18 ],
+  /* 4579 */  [ 0.290059840, 18 ],
+  /* 4580 */  [ 0.290144304, 18 ],
+  /* 4581 */  [ 0.290228774, 18 ],
+  /* 4582 */  [ 0.290313250, 18 ],
+  /* 4583 */  [ 0.290397733, 18 ],
+  /* 4584 */  [ 0.290482221, 18 ],
+  /* 4585 */  [ 0.290566716, 18 ],
+  /* 4586 */  [ 0.290651217, 18 ],
+  /* 4587 */  [ 0.290735724, 18 ],
+  /* 4588 */  [ 0.290820237, 18 ],
+  /* 4589 */  [ 0.290904756, 18 ],
+  /* 4590 */  [ 0.290989281, 18 ],
+  /* 4591 */  [ 0.291073813, 18 ],
+
+  /* 4592 */  [ 0.291158351, 18 ],
+  /* 4593 */  [ 0.291242894, 18 ],
+  /* 4594 */  [ 0.291327444, 18 ],
+  /* 4595 */  [ 0.291412001, 18 ],
+  /* 4596 */  [ 0.291496563, 18 ],
+  /* 4597 */  [ 0.291581131, 18 ],
+  /* 4598 */  [ 0.291665706, 18 ],
+  /* 4599 */  [ 0.291750286, 18 ],
+  /* 4600 */  [ 0.291834873, 18 ],
+  /* 4601 */  [ 0.291919466, 18 ],
+  /* 4602 */  [ 0.292004065, 18 ],
+  /* 4603 */  [ 0.292088670, 18 ],
+  /* 4604 */  [ 0.292173281, 18 ],
+  /* 4605 */  [ 0.292257899, 18 ],
+  /* 4606 */  [ 0.292342522, 18 ],
+  /* 4607 */  [ 0.292427152, 18 ],
+
+  /* 4608 */  [ 0.292511788, 18 ],
+  /* 4609 */  [ 0.292596430, 18 ],
+  /* 4610 */  [ 0.292681078, 18 ],
+  /* 4611 */  [ 0.292765732, 18 ],
+  /* 4612 */  [ 0.292850392, 18 ],
+  /* 4613 */  [ 0.292935058, 18 ],
+  /* 4614 */  [ 0.293019731, 18 ],
+  /* 4615 */  [ 0.293104409, 18 ],
+  /* 4616 */  [ 0.293189094, 18 ],
+  /* 4617 */  [ 0.293273785, 18 ],
+  /* 4618 */  [ 0.293358482, 18 ],
+  /* 4619 */  [ 0.293443185, 18 ],
+  /* 4620 */  [ 0.293527894, 18 ],
+  /* 4621 */  [ 0.293612609, 18 ],
+  /* 4622 */  [ 0.293697331, 18 ],
+  /* 4623 */  [ 0.293782058, 18 ],
+
+  /* 4624 */  [ 0.293866792, 18 ],
+  /* 4625 */  [ 0.293951532, 18 ],
+  /* 4626 */  [ 0.294036278, 18 ],
+  /* 4627 */  [ 0.294121029, 18 ],
+  /* 4628 */  [ 0.294205788, 18 ],
+  /* 4629 */  [ 0.294290552, 18 ],
+  /* 4630 */  [ 0.294375322, 18 ],
+  /* 4631 */  [ 0.294460098, 18 ],
+  /* 4632 */  [ 0.294544881, 18 ],
+  /* 4633 */  [ 0.294629669, 18 ],
+  /* 4634 */  [ 0.294714464, 18 ],
+  /* 4635 */  [ 0.294799265, 18 ],
+  /* 4636 */  [ 0.294884072, 18 ],
+  /* 4637 */  [ 0.294968885, 18 ],
+  /* 4638 */  [ 0.295053704, 18 ],
+  /* 4639 */  [ 0.295138529, 18 ],
+
+  /* 4640 */  [ 0.295223360, 18 ],
+  /* 4641 */  [ 0.295308197, 18 ],
+  /* 4642 */  [ 0.295393041, 18 ],
+  /* 4643 */  [ 0.295477890, 18 ],
+  /* 4644 */  [ 0.295562746, 18 ],
+  /* 4645 */  [ 0.295647608, 18 ],
+  /* 4646 */  [ 0.295732476, 18 ],
+  /* 4647 */  [ 0.295817349, 18 ],
+  /* 4648 */  [ 0.295902229, 18 ],
+  /* 4649 */  [ 0.295987115, 18 ],
+  /* 4650 */  [ 0.296072008, 18 ],
+  /* 4651 */  [ 0.296156906, 18 ],
+  /* 4652 */  [ 0.296241810, 18 ],
+  /* 4653 */  [ 0.296326721, 18 ],
+  /* 4654 */  [ 0.296411637, 18 ],
+  /* 4655 */  [ 0.296496560, 18 ],
+
+  /* 4656 */  [ 0.296581488, 18 ],
+  /* 4657 */  [ 0.296666423, 18 ],
+  /* 4658 */  [ 0.296751364, 18 ],
+  /* 4659 */  [ 0.296836311, 18 ],
+  /* 4660 */  [ 0.296921264, 18 ],
+  /* 4661 */  [ 0.297006223, 18 ],
+  /* 4662 */  [ 0.297091188, 18 ],
+  /* 4663 */  [ 0.297176159, 18 ],
+  /* 4664 */  [ 0.297261136, 18 ],
+  /* 4665 */  [ 0.297346120, 18 ],
+  /* 4666 */  [ 0.297431109, 18 ],
+  /* 4667 */  [ 0.297516105, 18 ],
+  /* 4668 */  [ 0.297601106, 18 ],
+  /* 4669 */  [ 0.297686114, 18 ],
+  /* 4670 */  [ 0.297771128, 18 ],
+  /* 4671 */  [ 0.297856147, 18 ],
+
+  /* 4672 */  [ 0.297941173, 18 ],
+  /* 4673 */  [ 0.298026205, 18 ],
+  /* 4674 */  [ 0.298111243, 18 ],
+  /* 4675 */  [ 0.298196287, 18 ],
+  /* 4676 */  [ 0.298281337, 18 ],
+  /* 4677 */  [ 0.298366393, 18 ],
+  /* 4678 */  [ 0.298451456, 18 ],
+  /* 4679 */  [ 0.298536524, 18 ],
+  /* 4680 */  [ 0.298621598, 18 ],
+  /* 4681 */  [ 0.298706679, 18 ],
+  /* 4682 */  [ 0.298791765, 18 ],
+  /* 4683 */  [ 0.298876858, 18 ],
+  /* 4684 */  [ 0.298961956, 18 ],
+  /* 4685 */  [ 0.299047061, 18 ],
+  /* 4686 */  [ 0.299132172, 18 ],
+  /* 4687 */  [ 0.299217288, 18 ],
+
+  /* 4688 */  [ 0.299302411, 18 ],
+  /* 4689 */  [ 0.299387540, 18 ],
+  /* 4690 */  [ 0.299472675, 18 ],
+  /* 4691 */  [ 0.299557816, 18 ],
+  /* 4692 */  [ 0.299642963, 18 ],
+  /* 4693 */  [ 0.299728116, 18 ],
+  /* 4694 */  [ 0.299813275, 18 ],
+  /* 4695 */  [ 0.299898440, 18 ],
+  /* 4696 */  [ 0.299983611, 18 ],
+  /* 4697 */  [ 0.300068789, 18 ],
+  /* 4698 */  [ 0.300153972, 18 ],
+  /* 4699 */  [ 0.300239161, 18 ],
+  /* 4700 */  [ 0.300324357, 18 ],
+  /* 4701 */  [ 0.300409558, 18 ],
+  /* 4702 */  [ 0.300494765, 18 ],
+  /* 4703 */  [ 0.300579979, 18 ],
+
+  /* 4704 */  [ 0.300665198, 18 ],
+  /* 4705 */  [ 0.300750424, 18 ],
+  /* 4706 */  [ 0.300835656, 18 ],
+  /* 4707 */  [ 0.300920893, 18 ],
+  /* 4708 */  [ 0.301006137, 18 ],
+  /* 4709 */  [ 0.301091387, 18 ],
+  /* 4710 */  [ 0.301176643, 18 ],
+  /* 4711 */  [ 0.301261904, 18 ],
+  /* 4712 */  [ 0.301347172, 18 ],
+  /* 4713 */  [ 0.301432446, 18 ],
+  /* 4714 */  [ 0.301517726, 18 ],
+  /* 4715 */  [ 0.301603012, 18 ],
+  /* 4716 */  [ 0.301688304, 18 ],
+  /* 4717 */  [ 0.301773602, 18 ],
+  /* 4718 */  [ 0.301858906, 18 ],
+  /* 4719 */  [ 0.301944216, 18 ],
+
+  /* 4720 */  [ 0.302029532, 18 ],
+  /* 4721 */  [ 0.302114854, 18 ],
+  /* 4722 */  [ 0.302200182, 18 ],
+  /* 4723 */  [ 0.302285516, 18 ],
+  /* 4724 */  [ 0.302370856, 18 ],
+  /* 4725 */  [ 0.302456203, 18 ],
+  /* 4726 */  [ 0.302541555, 18 ],
+  /* 4727 */  [ 0.302626913, 18 ],
+  /* 4728 */  [ 0.302712277, 18 ],
+  /* 4729 */  [ 0.302797648, 18 ],
+  /* 4730 */  [ 0.302883024, 18 ],
+  /* 4731 */  [ 0.302968406, 18 ],
+  /* 4732 */  [ 0.303053794, 18 ],
+  /* 4733 */  [ 0.303139189, 18 ],
+  /* 4734 */  [ 0.303224589, 18 ],
+  /* 4735 */  [ 0.303309995, 18 ],
+
+  /* 4736 */  [ 0.303395408, 18 ],
+  /* 4737 */  [ 0.303480826, 18 ],
+  /* 4738 */  [ 0.303566251, 18 ],
+  /* 4739 */  [ 0.303651681, 18 ],
+  /* 4740 */  [ 0.303737117, 18 ],
+  /* 4741 */  [ 0.303822560, 18 ],
+  /* 4742 */  [ 0.303908008, 18 ],
+  /* 4743 */  [ 0.303993463, 18 ],
+  /* 4744 */  [ 0.304078923, 18 ],
+  /* 4745 */  [ 0.304164390, 18 ],
+  /* 4746 */  [ 0.304249862, 18 ],
+  /* 4747 */  [ 0.304335340, 18 ],
+  /* 4748 */  [ 0.304420825, 18 ],
+  /* 4749 */  [ 0.304506315, 18 ],
+  /* 4750 */  [ 0.304591812, 18 ],
+  /* 4751 */  [ 0.304677314, 18 ],
+
+  /* 4752 */  [ 0.304762823, 18 ],
+  /* 4753 */  [ 0.304848337, 18 ],
+  /* 4754 */  [ 0.304933858, 18 ],
+  /* 4755 */  [ 0.305019384, 18 ],
+  /* 4756 */  [ 0.305104917, 18 ],
+  /* 4757 */  [ 0.305190455, 18 ],
+  /* 4758 */  [ 0.305275999, 18 ],
+  /* 4759 */  [ 0.305361550, 18 ],
+  /* 4760 */  [ 0.305447106, 18 ],
+  /* 4761 */  [ 0.305532669, 18 ],
+  /* 4762 */  [ 0.305618237, 18 ],
+  /* 4763 */  [ 0.305703811, 18 ],
+  /* 4764 */  [ 0.305789392, 18 ],
+  /* 4765 */  [ 0.305874978, 18 ],
+  /* 4766 */  [ 0.305960571, 18 ],
+  /* 4767 */  [ 0.306046169, 18 ],
+
+  /* 4768 */  [ 0.306131773, 18 ],
+  /* 4769 */  [ 0.306217383, 18 ],
+  /* 4770 */  [ 0.306303000, 18 ],
+  /* 4771 */  [ 0.306388622, 18 ],
+  /* 4772 */  [ 0.306474250, 18 ],
+  /* 4773 */  [ 0.306559885, 18 ],
+  /* 4774 */  [ 0.306645525, 18 ],
+  /* 4775 */  [ 0.306731171, 18 ],
+  /* 4776 */  [ 0.306816823, 18 ],
+  /* 4777 */  [ 0.306902481, 18 ],
+  /* 4778 */  [ 0.306988145, 18 ],
+  /* 4779 */  [ 0.307073816, 18 ],
+  /* 4780 */  [ 0.307159492, 18 ],
+  /* 4781 */  [ 0.307245174, 18 ],
+  /* 4782 */  [ 0.307330862, 18 ],
+  /* 4783 */  [ 0.307416556, 18 ],
+
+  /* 4784 */  [ 0.307502256, 18 ],
+  /* 4785 */  [ 0.307587962, 18 ],
+  /* 4786 */  [ 0.307673674, 18 ],
+  /* 4787 */  [ 0.307759392, 18 ],
+  /* 4788 */  [ 0.307845115, 18 ],
+  /* 4789 */  [ 0.307930845, 18 ],
+  /* 4790 */  [ 0.308016581, 18 ],
+  /* 4791 */  [ 0.308102323, 18 ],
+  /* 4792 */  [ 0.308188071, 18 ],
+  /* 4793 */  [ 0.308273824, 18 ],
+  /* 4794 */  [ 0.308359584, 18 ],
+  /* 4795 */  [ 0.308445350, 18 ],
+  /* 4796 */  [ 0.308531121, 18 ],
+  /* 4797 */  [ 0.308616899, 18 ],
+  /* 4798 */  [ 0.308702682, 18 ],
+  /* 4799 */  [ 0.308788472, 18 ],
+
+  /* 4800 */  [ 0.308874267, 18 ],
+  /* 4801 */  [ 0.308960068, 18 ],
+  /* 4802 */  [ 0.309045876, 18 ],
+  /* 4803 */  [ 0.309131689, 18 ],
+  /* 4804 */  [ 0.309217508, 18 ],
+  /* 4805 */  [ 0.309303334, 18 ],
+  /* 4806 */  [ 0.309389165, 18 ],
+  /* 4807 */  [ 0.309475002, 18 ],
+  /* 4808 */  [ 0.309560845, 18 ],
+  /* 4809 */  [ 0.309646694, 18 ],
+  /* 4810 */  [ 0.309732549, 18 ],
+  /* 4811 */  [ 0.309818410, 18 ],
+  /* 4812 */  [ 0.309904277, 18 ],
+  /* 4813 */  [ 0.309990150, 18 ],
+  /* 4814 */  [ 0.310076028, 18 ],
+  /* 4815 */  [ 0.310161913, 18 ],
+
+  /* 4816 */  [ 0.310247804, 18 ],
+  /* 4817 */  [ 0.310333700, 18 ],
+  /* 4818 */  [ 0.310419603, 18 ],
+  /* 4819 */  [ 0.310505511, 18 ],
+  /* 4820 */  [ 0.310591426, 18 ],
+  /* 4821 */  [ 0.310677346, 18 ],
+  /* 4822 */  [ 0.310763272, 18 ],
+  /* 4823 */  [ 0.310849205, 18 ],
+  /* 4824 */  [ 0.310935143, 18 ],
+  /* 4825 */  [ 0.311021087, 18 ],
+  /* 4826 */  [ 0.311107037, 18 ],
+  /* 4827 */  [ 0.311192993, 18 ],
+  /* 4828 */  [ 0.311278955, 18 ],
+  /* 4829 */  [ 0.311364923, 18 ],
+  /* 4830 */  [ 0.311450897, 18 ],
+  /* 4831 */  [ 0.311536877, 18 ],
+
+  /* 4832 */  [ 0.311622862, 18 ],
+  /* 4833 */  [ 0.311708854, 18 ],
+  /* 4834 */  [ 0.311794851, 18 ],
+  /* 4835 */  [ 0.311880855, 18 ],
+  /* 4836 */  [ 0.311966864, 18 ],
+  /* 4837 */  [ 0.312052880, 18 ],
+  /* 4838 */  [ 0.312138901, 18 ],
+  /* 4839 */  [ 0.312224928, 18 ],
+  /* 4840 */  [ 0.312310961, 18 ],
+  /* 4841 */  [ 0.312397000, 18 ],
+  /* 4842 */  [ 0.312483045, 18 ],
+  /* 4843 */  [ 0.312569096, 18 ],
+  /* 4844 */  [ 0.312655153, 18 ],
+  /* 4845 */  [ 0.312741216, 18 ],
+  /* 4846 */  [ 0.312827284, 18 ],
+  /* 4847 */  [ 0.312913359, 18 ],
+
+  /* 4848 */  [ 0.312999439, 18 ],
+  /* 4849 */  [ 0.313085526, 18 ],
+  /* 4850 */  [ 0.313171618, 18 ],
+  /* 4851 */  [ 0.313257716, 18 ],
+  /* 4852 */  [ 0.313343820, 18 ],
+  /* 4853 */  [ 0.313429931, 18 ],
+  /* 4854 */  [ 0.313516047, 18 ],
+  /* 4855 */  [ 0.313602168, 18 ],
+  /* 4856 */  [ 0.313688296, 18 ],
+  /* 4857 */  [ 0.313774430, 18 ],
+  /* 4858 */  [ 0.313860570, 18 ],
+  /* 4859 */  [ 0.313946715, 18 ],
+  /* 4860 */  [ 0.314032867, 18 ],
+  /* 4861 */  [ 0.314119024, 18 ],
+  /* 4862 */  [ 0.314205187, 18 ],
+  /* 4863 */  [ 0.314291357, 18 ],
+
+  /* 4864 */  [ 0.314377532, 18 ],
+  /* 4865 */  [ 0.314463713, 18 ],
+  /* 4866 */  [ 0.314549900, 18 ],
+  /* 4867 */  [ 0.314636092, 18 ],
+  /* 4868 */  [ 0.314722291, 18 ],
+  /* 4869 */  [ 0.314808496, 18 ],
+  /* 4870 */  [ 0.314894706, 18 ],
+  /* 4871 */  [ 0.314980923, 18 ],
+  /* 4872 */  [ 0.315067145, 18 ],
+  /* 4873 */  [ 0.315153373, 18 ],
+  /* 4874 */  [ 0.315239607, 18 ],
+  /* 4875 */  [ 0.315325847, 18 ],
+  /* 4876 */  [ 0.315412093, 18 ],
+  /* 4877 */  [ 0.315498345, 18 ],
+  /* 4878 */  [ 0.315584603, 18 ],
+  /* 4879 */  [ 0.315670866, 18 ],
+
+  /* 4880 */  [ 0.315757136, 18 ],
+  /* 4881 */  [ 0.315843411, 18 ],
+  /* 4882 */  [ 0.315929693, 18 ],
+  /* 4883 */  [ 0.316015980, 18 ],
+  /* 4884 */  [ 0.316102273, 18 ],
+  /* 4885 */  [ 0.316188572, 18 ],
+  /* 4886 */  [ 0.316274877, 18 ],
+  /* 4887 */  [ 0.316361187, 18 ],
+  /* 4888 */  [ 0.316447504, 18 ],
+  /* 4889 */  [ 0.316533826, 18 ],
+  /* 4890 */  [ 0.316620155, 18 ],
+  /* 4891 */  [ 0.316706489, 18 ],
+  /* 4892 */  [ 0.316792829, 18 ],
+  /* 4893 */  [ 0.316879175, 18 ],
+  /* 4894 */  [ 0.316965527, 18 ],
+  /* 4895 */  [ 0.317051885, 18 ],
+
+  /* 4896 */  [ 0.317138249, 18 ],
+  /* 4897 */  [ 0.317224618, 18 ],
+  /* 4898 */  [ 0.317310994, 18 ],
+  /* 4899 */  [ 0.317397375, 18 ],
+  /* 4900 */  [ 0.317483762, 18 ],
+  /* 4901 */  [ 0.317570155, 18 ],
+  /* 4902 */  [ 0.317656554, 18 ],
+  /* 4903 */  [ 0.317742959, 18 ],
+  /* 4904 */  [ 0.317829370, 18 ],
+  /* 4905 */  [ 0.317915786, 18 ],
+  /* 4906 */  [ 0.318002209, 18 ],
+  /* 4907 */  [ 0.318088637, 18 ],
+  /* 4908 */  [ 0.318175071, 18 ],
+  /* 4909 */  [ 0.318261511, 18 ],
+  /* 4910 */  [ 0.318347957, 18 ],
+  /* 4911 */  [ 0.318434409, 18 ],
+
+  /* 4912 */  [ 0.318520867, 18 ],
+  /* 4913 */  [ 0.318607330, 18 ],
+  /* 4914 */  [ 0.318693800, 18 ],
+  /* 4915 */  [ 0.318780275, 18 ],
+  /* 4916 */  [ 0.318866756, 18 ],
+  /* 4917 */  [ 0.318953243, 18 ],
+  /* 4918 */  [ 0.319039736, 18 ],
+  /* 4919 */  [ 0.319126235, 18 ],
+  /* 4920 */  [ 0.319212739, 18 ],
+  /* 4921 */  [ 0.319299250, 18 ],
+  /* 4922 */  [ 0.319385766, 18 ],
+  /* 4923 */  [ 0.319472288, 18 ],
+  /* 4924 */  [ 0.319558816, 18 ],
+  /* 4925 */  [ 0.319645350, 18 ],
+  /* 4926 */  [ 0.319731890, 18 ],
+  /* 4927 */  [ 0.319818435, 18 ],
+
+  /* 4928 */  [ 0.319904987, 18 ],
+  /* 4929 */  [ 0.319991544, 18 ],
+  /* 4930 */  [ 0.320078107, 18 ],
+  /* 4931 */  [ 0.320164676, 18 ],
+  /* 4932 */  [ 0.320251251, 18 ],
+  /* 4933 */  [ 0.320337832, 18 ],
+  /* 4934 */  [ 0.320424419, 18 ],
+  /* 4935 */  [ 0.320511011, 18 ],
+  /* 4936 */  [ 0.320597609, 18 ],
+  /* 4937 */  [ 0.320684213, 18 ],
+  /* 4938 */  [ 0.320770823, 18 ],
+  /* 4939 */  [ 0.320857439, 18 ],
+  /* 4940 */  [ 0.320944061, 18 ],
+  /* 4941 */  [ 0.321030688, 18 ],
+  /* 4942 */  [ 0.321117322, 18 ],
+  /* 4943 */  [ 0.321203961, 18 ],
+
+  /* 4944 */  [ 0.321290606, 18 ],
+  /* 4945 */  [ 0.321377257, 18 ],
+  /* 4946 */  [ 0.321463913, 18 ],
+  /* 4947 */  [ 0.321550576, 18 ],
+  /* 4948 */  [ 0.321637244, 18 ],
+  /* 4949 */  [ 0.321723919, 18 ],
+  /* 4950 */  [ 0.321810599, 18 ],
+  /* 4951 */  [ 0.321897285, 18 ],
+  /* 4952 */  [ 0.321983976, 18 ],
+  /* 4953 */  [ 0.322070674, 18 ],
+  /* 4954 */  [ 0.322157377, 18 ],
+  /* 4955 */  [ 0.322244087, 18 ],
+  /* 4956 */  [ 0.322330802, 18 ],
+  /* 4957 */  [ 0.322417523, 18 ],
+  /* 4958 */  [ 0.322504249, 18 ],
+  /* 4959 */  [ 0.322590982, 18 ],
+
+  /* 4960 */  [ 0.322677720, 18 ],
+  /* 4961 */  [ 0.322764465, 18 ],
+  /* 4962 */  [ 0.322851215, 18 ],
+  /* 4963 */  [ 0.322937971, 18 ],
+  /* 4964 */  [ 0.323024732, 18 ],
+  /* 4965 */  [ 0.323111500, 18 ],
+  /* 4966 */  [ 0.323198273, 18 ],
+  /* 4967 */  [ 0.323285052, 18 ],
+  /* 4968 */  [ 0.323371837, 18 ],
+  /* 4969 */  [ 0.323458628, 18 ],
+  /* 4970 */  [ 0.323545425, 18 ],
+  /* 4971 */  [ 0.323632227, 18 ],
+  /* 4972 */  [ 0.323719036, 18 ],
+  /* 4973 */  [ 0.323805850, 18 ],
+  /* 4974 */  [ 0.323892670, 18 ],
+  /* 4975 */  [ 0.323979496, 18 ],
+
+  /* 4976 */  [ 0.324066327, 18 ],
+  /* 4977 */  [ 0.324153165, 18 ],
+  /* 4978 */  [ 0.324240008, 18 ],
+  /* 4979 */  [ 0.324326857, 18 ],
+  /* 4980 */  [ 0.324413712, 18 ],
+  /* 4981 */  [ 0.324500572, 18 ],
+  /* 4982 */  [ 0.324587439, 18 ],
+  /* 4983 */  [ 0.324674311, 18 ],
+  /* 4984 */  [ 0.324761189, 18 ],
+  /* 4985 */  [ 0.324848073, 18 ],
+  /* 4986 */  [ 0.324934963, 18 ],
+  /* 4987 */  [ 0.325021858, 18 ],
+  /* 4988 */  [ 0.325108760, 18 ],
+  /* 4989 */  [ 0.325195667, 18 ],
+  /* 4990 */  [ 0.325282580, 18 ],
+  /* 4991 */  [ 0.325369498, 18 ],
+
+  /* 4992 */  [ 0.325456423, 18 ],
+  /* 4993 */  [ 0.325543353, 18 ],
+  /* 4994 */  [ 0.325630290, 18 ],
+  /* 4995 */  [ 0.325717232, 18 ],
+  /* 4996 */  [ 0.325804179, 18 ],
+  /* 4997 */  [ 0.325891133, 18 ],
+  /* 4998 */  [ 0.325978092, 18 ],
+  /* 4999 */  [ 0.326065057, 18 ],
+  /* 5000 */  [ 0.326152028, 18 ],
+  /* 5001 */  [ 0.326239005, 18 ],
+  /* 5002 */  [ 0.326325988, 18 ],
+  /* 5003 */  [ 0.326412976, 18 ],
+  /* 5004 */  [ 0.326499970, 18 ],
+  /* 5005 */  [ 0.326586970, 18 ],
+  /* 5006 */  [ 0.326673976, 18 ],
+  /* 5007 */  [ 0.326760988, 18 ],
+
+  /* 5008 */  [ 0.326848005, 18 ],
+  /* 5009 */  [ 0.326935028, 18 ],
+  /* 5010 */  [ 0.327022057, 18 ],
+  /* 5011 */  [ 0.327109092, 18 ],
+  /* 5012 */  [ 0.327196132, 18 ],
+  /* 5013 */  [ 0.327283178, 18 ],
+  /* 5014 */  [ 0.327370231, 18 ],
+  /* 5015 */  [ 0.327457288, 18 ],
+  /* 5016 */  [ 0.327544352, 18 ],
+  /* 5017 */  [ 0.327631421, 18 ],
+  /* 5018 */  [ 0.327718497, 18 ],
+  /* 5019 */  [ 0.327805578, 18 ],
+  /* 5020 */  [ 0.327892665, 18 ],
+  /* 5021 */  [ 0.327979757, 18 ],
+  /* 5022 */  [ 0.328066855, 18 ],
+  /* 5023 */  [ 0.328153960, 18 ],
+
+  /* 5024 */  [ 0.328241070, 18 ],
+  /* 5025 */  [ 0.328328185, 18 ],
+  /* 5026 */  [ 0.328415307, 18 ],
+  /* 5027 */  [ 0.328502434, 18 ],
+  /* 5028 */  [ 0.328589567, 18 ],
+  /* 5029 */  [ 0.328676706, 18 ],
+  /* 5030 */  [ 0.328763850, 18 ],
+  /* 5031 */  [ 0.328851001, 18 ],
+  /* 5032 */  [ 0.328938157, 18 ],
+  /* 5033 */  [ 0.329025319, 18 ],
+  /* 5034 */  [ 0.329112486, 18 ],
+  /* 5035 */  [ 0.329199660, 18 ],
+  /* 5036 */  [ 0.329286839, 18 ],
+  /* 5037 */  [ 0.329374024, 18 ],
+  /* 5038 */  [ 0.329461215, 18 ],
+  /* 5039 */  [ 0.329548411, 18 ],
+
+  /* 5040 */  [ 0.329635614, 18 ],
+  /* 5041 */  [ 0.329722822, 18 ],
+  /* 5042 */  [ 0.329810036, 18 ],
+  /* 5043 */  [ 0.329897255, 18 ],
+  /* 5044 */  [ 0.329984481, 18 ],
+  /* 5045 */  [ 0.330071712, 18 ],
+  /* 5046 */  [ 0.330158949, 18 ],
+  /* 5047 */  [ 0.330246191, 18 ],
+  /* 5048 */  [ 0.330333440, 18 ],
+  /* 5049 */  [ 0.330420694, 18 ],
+  /* 5050 */  [ 0.330507954, 18 ],
+  /* 5051 */  [ 0.330595220, 18 ],
+  /* 5052 */  [ 0.330682491, 18 ],
+  /* 5053 */  [ 0.330769768, 18 ],
+  /* 5054 */  [ 0.330857051, 18 ],
+  /* 5055 */  [ 0.330944340, 18 ],
+
+  /* 5056 */  [ 0.331031635, 18 ],
+  /* 5057 */  [ 0.331118935, 18 ],
+  /* 5058 */  [ 0.331206241, 18 ],
+  /* 5059 */  [ 0.331293553, 18 ],
+  /* 5060 */  [ 0.331380870, 18 ],
+  /* 5061 */  [ 0.331468193, 18 ],
+  /* 5062 */  [ 0.331555522, 18 ],
+  /* 5063 */  [ 0.331642857, 18 ],
+  /* 5064 */  [ 0.331730198, 18 ],
+  /* 5065 */  [ 0.331817544, 18 ],
+  /* 5066 */  [ 0.331904896, 18 ],
+  /* 5067 */  [ 0.331992254, 18 ],
+  /* 5068 */  [ 0.332079617, 18 ],
+  /* 5069 */  [ 0.332166986, 18 ],
+  /* 5070 */  [ 0.332254361, 18 ],
+  /* 5071 */  [ 0.332341742, 18 ],
+
+  /* 5072 */  [ 0.332429129, 18 ],
+  /* 5073 */  [ 0.332516521, 18 ],
+  /* 5074 */  [ 0.332603919, 18 ],
+  /* 5075 */  [ 0.332691323, 18 ],
+  /* 5076 */  [ 0.332778732, 18 ],
+  /* 5077 */  [ 0.332866147, 18 ],
+  /* 5078 */  [ 0.332953568, 18 ],
+  /* 5079 */  [ 0.333040995, 18 ],
+  /* 5080 */  [ 0.333128427, 18 ],
+  /* 5081 */  [ 0.333215865, 18 ],
+  /* 5082 */  [ 0.333303309, 18 ],
+  /* 5083 */  [ 0.333390759, 18 ],
+  /* 5084 */  [ 0.333478214, 18 ],
+  /* 5085 */  [ 0.333565675, 18 ],
+  /* 5086 */  [ 0.333653142, 18 ],
+  /* 5087 */  [ 0.333740615, 18 ],
+
+  /* 5088 */  [ 0.333828093, 18 ],
+  /* 5089 */  [ 0.333915577, 18 ],
+  /* 5090 */  [ 0.334003067, 18 ],
+  /* 5091 */  [ 0.334090562, 18 ],
+  /* 5092 */  [ 0.334178063, 18 ],
+  /* 5093 */  [ 0.334265570, 18 ],
+  /* 5094 */  [ 0.334353083, 18 ],
+  /* 5095 */  [ 0.334440601, 18 ],
+  /* 5096 */  [ 0.334528126, 18 ],
+  /* 5097 */  [ 0.334615655, 18 ],
+  /* 5098 */  [ 0.334703191, 18 ],
+  /* 5099 */  [ 0.334790732, 18 ],
+  /* 5100 */  [ 0.334878279, 18 ],
+  /* 5101 */  [ 0.334965832, 18 ],
+  /* 5102 */  [ 0.335053391, 18 ],
+  /* 5103 */  [ 0.335140955, 18 ],
+
+  /* 5104 */  [ 0.335228525, 18 ],
+  /* 5105 */  [ 0.335316100, 18 ],
+  /* 5106 */  [ 0.335403682, 18 ],
+  /* 5107 */  [ 0.335491269, 18 ],
+  /* 5108 */  [ 0.335578861, 18 ],
+  /* 5109 */  [ 0.335666460, 18 ],
+  /* 5110 */  [ 0.335754064, 18 ],
+  /* 5111 */  [ 0.335841674, 18 ],
+  /* 5112 */  [ 0.335929290, 18 ],
+  /* 5113 */  [ 0.336016911, 18 ],
+  /* 5114 */  [ 0.336104538, 18 ],
+  /* 5115 */  [ 0.336192171, 18 ],
+  /* 5116 */  [ 0.336279809, 18 ],
+  /* 5117 */  [ 0.336367453, 18 ],
+  /* 5118 */  [ 0.336455103, 18 ],
+  /* 5119 */  [ 0.336542759, 18 ],
+
+  /* 5120 */  [ 0.336630420, 18 ],
+  /* 5121 */  [ 0.336718087, 18 ],
+  /* 5122 */  [ 0.336805760, 18 ],
+  /* 5123 */  [ 0.336893439, 18 ],
+  /* 5124 */  [ 0.336981123, 18 ],
+  /* 5125 */  [ 0.337068813, 18 ],
+  /* 5126 */  [ 0.337156508, 18 ],
+  /* 5127 */  [ 0.337244209, 18 ],
+  /* 5128 */  [ 0.337331916, 18 ],
+  /* 5129 */  [ 0.337419629, 18 ],
+  /* 5130 */  [ 0.337507347, 18 ],
+  /* 5131 */  [ 0.337595071, 18 ],
+  /* 5132 */  [ 0.337682801, 18 ],
+  /* 5133 */  [ 0.337770537, 18 ],
+  /* 5134 */  [ 0.337858278, 18 ],
+  /* 5135 */  [ 0.337946025, 18 ],
+
+  /* 5136 */  [ 0.338033777, 18 ],
+  /* 5137 */  [ 0.338121535, 18 ],
+  /* 5138 */  [ 0.338209299, 18 ],
+  /* 5139 */  [ 0.338297069, 18 ],
+  /* 5140 */  [ 0.338384844, 18 ],
+  /* 5141 */  [ 0.338472625, 18 ],
+  /* 5142 */  [ 0.338560412, 18 ],
+  /* 5143 */  [ 0.338648204, 18 ],
+  /* 5144 */  [ 0.338736002, 18 ],
+  /* 5145 */  [ 0.338823806, 18 ],
+  /* 5146 */  [ 0.338911616, 18 ],
+  /* 5147 */  [ 0.338999431, 18 ],
+  /* 5148 */  [ 0.339087252, 18 ],
+  /* 5149 */  [ 0.339175078, 18 ],
+  /* 5150 */  [ 0.339262910, 18 ],
+  /* 5151 */  [ 0.339350748, 18 ],
+
+  /* 5152 */  [ 0.339438592, 18 ],
+  /* 5153 */  [ 0.339526441, 18 ],
+  /* 5154 */  [ 0.339614296, 18 ],
+  /* 5155 */  [ 0.339702157, 18 ],
+  /* 5156 */  [ 0.339790023, 18 ],
+  /* 5157 */  [ 0.339877895, 18 ],
+  /* 5158 */  [ 0.339965773, 18 ],
+  /* 5159 */  [ 0.340053656, 18 ],
+  /* 5160 */  [ 0.340141545, 18 ],
+  /* 5161 */  [ 0.340229440, 18 ],
+  /* 5162 */  [ 0.340317340, 18 ],
+  /* 5163 */  [ 0.340405246, 18 ],
+  /* 5164 */  [ 0.340493158, 18 ],
+  /* 5165 */  [ 0.340581075, 18 ],
+  /* 5166 */  [ 0.340668999, 18 ],
+  /* 5167 */  [ 0.340756927, 18 ],
+
+  /* 5168 */  [ 0.340844862, 18 ],
+  /* 5169 */  [ 0.340932802, 18 ],
+  /* 5170 */  [ 0.341020748, 18 ],
+  /* 5171 */  [ 0.341108699, 18 ],
+  /* 5172 */  [ 0.341196656, 18 ],
+  /* 5173 */  [ 0.341284619, 18 ],
+  /* 5174 */  [ 0.341372587, 18 ],
+  /* 5175 */  [ 0.341460562, 18 ],
+  /* 5176 */  [ 0.341548541, 18 ],
+  /* 5177 */  [ 0.341636527, 18 ],
+  /* 5178 */  [ 0.341724518, 18 ],
+  /* 5179 */  [ 0.341812515, 18 ],
+  /* 5180 */  [ 0.341900517, 18 ],
+  /* 5181 */  [ 0.341988525, 18 ],
+  /* 5182 */  [ 0.342076539, 18 ],
+  /* 5183 */  [ 0.342164558, 18 ],
+
+  /* 5184 */  [ 0.342252584, 18 ],
+  /* 5185 */  [ 0.342340614, 18 ],
+  /* 5186 */  [ 0.342428651, 18 ],
+  /* 5187 */  [ 0.342516693, 18 ],
+  /* 5188 */  [ 0.342604741, 18 ],
+  /* 5189 */  [ 0.342692794, 18 ],
+  /* 5190 */  [ 0.342780853, 18 ],
+  /* 5191 */  [ 0.342868918, 18 ],
+  /* 5192 */  [ 0.342956988, 18 ],
+  /* 5193 */  [ 0.343045064, 18 ],
+  /* 5194 */  [ 0.343133146, 18 ],
+  /* 5195 */  [ 0.343221233, 18 ],
+  /* 5196 */  [ 0.343309326, 18 ],
+  /* 5197 */  [ 0.343397425, 18 ],
+  /* 5198 */  [ 0.343485529, 18 ],
+  /* 5199 */  [ 0.343573639, 18 ],
+
+  /* 5200 */  [ 0.343661754, 18 ],
+  /* 5201 */  [ 0.343749876, 18 ],
+  /* 5202 */  [ 0.343838003, 18 ],
+  /* 5203 */  [ 0.343926135, 18 ],
+  /* 5204 */  [ 0.344014273, 18 ],
+  /* 5205 */  [ 0.344102417, 18 ],
+  /* 5206 */  [ 0.344190566, 18 ],
+  /* 5207 */  [ 0.344278722, 18 ],
+  /* 5208 */  [ 0.344366882, 18 ],
+  /* 5209 */  [ 0.344455049, 18 ],
+  /* 5210 */  [ 0.344543221, 18 ],
+  /* 5211 */  [ 0.344631398, 18 ],
+  /* 5212 */  [ 0.344719582, 18 ],
+  /* 5213 */  [ 0.344807771, 18 ],
+  /* 5214 */  [ 0.344895965, 18 ],
+  /* 5215 */  [ 0.344984165, 18 ],
+
+  /* 5216 */  [ 0.345072371, 18 ],
+  /* 5217 */  [ 0.345160583, 18 ],
+  /* 5218 */  [ 0.345248800, 18 ],
+  /* 5219 */  [ 0.345337023, 18 ],
+  /* 5220 */  [ 0.345425251, 18 ],
+  /* 5221 */  [ 0.345513485, 18 ],
+  /* 5222 */  [ 0.345601725, 18 ],
+  /* 5223 */  [ 0.345689970, 18 ],
+  /* 5224 */  [ 0.345778221, 18 ],
+  /* 5225 */  [ 0.345866478, 18 ],
+  /* 5226 */  [ 0.345954740, 18 ],
+  /* 5227 */  [ 0.346043008, 18 ],
+  /* 5228 */  [ 0.346131281, 18 ],
+  /* 5229 */  [ 0.346219560, 18 ],
+  /* 5230 */  [ 0.346307845, 18 ],
+  /* 5231 */  [ 0.346396135, 18 ],
+
+  /* 5232 */  [ 0.346484431, 18 ],
+  /* 5233 */  [ 0.346572733, 18 ],
+  /* 5234 */  [ 0.346661040, 18 ],
+  /* 5235 */  [ 0.346749353, 18 ],
+  /* 5236 */  [ 0.346837671, 18 ],
+  /* 5237 */  [ 0.346925996, 18 ],
+  /* 5238 */  [ 0.347014325, 18 ],
+  /* 5239 */  [ 0.347102661, 18 ],
+  /* 5240 */  [ 0.347191002, 18 ],
+  /* 5241 */  [ 0.347279348, 18 ],
+  /* 5242 */  [ 0.347367700, 18 ],
+  /* 5243 */  [ 0.347456058, 18 ],
+  /* 5244 */  [ 0.347544422, 18 ],
+  /* 5245 */  [ 0.347632791, 18 ],
+  /* 5246 */  [ 0.347721165, 18 ],
+  /* 5247 */  [ 0.347809546, 18 ],
+
+  /* 5248 */  [ 0.347897931, 18 ],
+  /* 5249 */  [ 0.347986323, 18 ],
+  /* 5250 */  [ 0.348074720, 18 ],
+  /* 5251 */  [ 0.348163123, 18 ],
+  /* 5252 */  [ 0.348251531, 18 ],
+  /* 5253 */  [ 0.348339945, 18 ],
+  /* 5254 */  [ 0.348428365, 18 ],
+  /* 5255 */  [ 0.348516790, 18 ],
+  /* 5256 */  [ 0.348605221, 18 ],
+  /* 5257 */  [ 0.348693657, 18 ],
+  /* 5258 */  [ 0.348782099, 18 ],
+  /* 5259 */  [ 0.348870547, 18 ],
+  /* 5260 */  [ 0.348959000, 18 ],
+  /* 5261 */  [ 0.349047459, 18 ],
+  /* 5262 */  [ 0.349135923, 18 ],
+  /* 5263 */  [ 0.349224393, 18 ],
+
+  /* 5264 */  [ 0.349312869, 18 ],
+  /* 5265 */  [ 0.349401350, 18 ],
+  /* 5266 */  [ 0.349489837, 18 ],
+  /* 5267 */  [ 0.349578329, 18 ],
+  /* 5268 */  [ 0.349666827, 18 ],
+  /* 5269 */  [ 0.349755331, 18 ],
+  /* 5270 */  [ 0.349843840, 18 ],
+  /* 5271 */  [ 0.349932355, 18 ],
+  /* 5272 */  [ 0.350020876, 18 ],
+  /* 5273 */  [ 0.350109402, 18 ],
+  /* 5274 */  [ 0.350197933, 18 ],
+  /* 5275 */  [ 0.350286470, 18 ],
+  /* 5276 */  [ 0.350375013, 18 ],
+  /* 5277 */  [ 0.350463562, 18 ],
+  /* 5278 */  [ 0.350552116, 18 ],
+  /* 5279 */  [ 0.350640675, 18 ],
+
+  /* 5280 */  [ 0.350729240, 18 ],
+  /* 5281 */  [ 0.350817811, 18 ],
+  /* 5282 */  [ 0.350906388, 18 ],
+  /* 5283 */  [ 0.350994970, 18 ],
+  /* 5284 */  [ 0.351083557, 18 ],
+  /* 5285 */  [ 0.351172150, 18 ],
+  /* 5286 */  [ 0.351260749, 18 ],
+  /* 5287 */  [ 0.351349353, 18 ],
+  /* 5288 */  [ 0.351437963, 18 ],
+  /* 5289 */  [ 0.351526579, 18 ],
+  /* 5290 */  [ 0.351615200, 18 ],
+  /* 5291 */  [ 0.351703827, 18 ],
+  /* 5292 */  [ 0.351792459, 18 ],
+  /* 5293 */  [ 0.351881097, 18 ],
+  /* 5294 */  [ 0.351969740, 18 ],
+  /* 5295 */  [ 0.352058389, 18 ],
+
+  /* 5296 */  [ 0.352147044, 18 ],
+  /* 5297 */  [ 0.352235704, 18 ],
+  /* 5298 */  [ 0.352324369, 18 ],
+  /* 5299 */  [ 0.352413041, 18 ],
+  /* 5300 */  [ 0.352501718, 18 ],
+  /* 5301 */  [ 0.352590400, 18 ],
+  /* 5302 */  [ 0.352679088, 18 ],
+  /* 5303 */  [ 0.352767782, 18 ],
+  /* 5304 */  [ 0.352856481, 18 ],
+  /* 5305 */  [ 0.352945186, 18 ],
+  /* 5306 */  [ 0.353033896, 18 ],
+  /* 5307 */  [ 0.353122612, 18 ],
+  /* 5308 */  [ 0.353211333, 18 ],
+  /* 5309 */  [ 0.353300061, 18 ],
+  /* 5310 */  [ 0.353388793, 18 ],
+  /* 5311 */  [ 0.353477531, 18 ],
+
+  /* 5312 */  [ 0.353566275, 18 ],
+  /* 5313 */  [ 0.353655024, 18 ],
+  /* 5314 */  [ 0.353743779, 18 ],
+  /* 5315 */  [ 0.353832540, 18 ],
+  /* 5316 */  [ 0.353921306, 18 ],
+  /* 5317 */  [ 0.354010077, 18 ],
+  /* 5318 */  [ 0.354098855, 18 ],
+  /* 5319 */  [ 0.354187637, 18 ],
+  /* 5320 */  [ 0.354276426, 18 ],
+  /* 5321 */  [ 0.354365220, 18 ],
+  /* 5322 */  [ 0.354454019, 18 ],
+  /* 5323 */  [ 0.354542824, 18 ],
+  /* 5324 */  [ 0.354631635, 18 ],
+  /* 5325 */  [ 0.354720451, 18 ],
+  /* 5326 */  [ 0.354809272, 18 ],
+  /* 5327 */  [ 0.354898100, 18 ],
+
+  /* 5328 */  [ 0.354986932, 18 ],
+  /* 5329 */  [ 0.355075771, 18 ],
+  /* 5330 */  [ 0.355164615, 18 ],
+  /* 5331 */  [ 0.355253464, 18 ],
+  /* 5332 */  [ 0.355342319, 18 ],
+  /* 5333 */  [ 0.355431180, 18 ],
+  /* 5334 */  [ 0.355520046, 18 ],
+  /* 5335 */  [ 0.355608917, 18 ],
+  /* 5336 */  [ 0.355697795, 18 ],
+  /* 5337 */  [ 0.355786677, 18 ],
+  /* 5338 */  [ 0.355875566, 18 ],
+  /* 5339 */  [ 0.355964460, 18 ],
+  /* 5340 */  [ 0.356053359, 18 ],
+  /* 5341 */  [ 0.356142264, 18 ],
+  /* 5342 */  [ 0.356231175, 18 ],
+  /* 5343 */  [ 0.356320091, 18 ],
+
+  /* 5344 */  [ 0.356409012, 18 ],
+  /* 5345 */  [ 0.356497940, 18 ],
+  /* 5346 */  [ 0.356586872, 18 ],
+  /* 5347 */  [ 0.356675811, 18 ],
+  /* 5348 */  [ 0.356764754, 18 ],
+  /* 5349 */  [ 0.356853704, 18 ],
+  /* 5350 */  [ 0.356942659, 18 ],
+  /* 5351 */  [ 0.357031619, 18 ],
+  /* 5352 */  [ 0.357120585, 18 ],
+  /* 5353 */  [ 0.357209557, 18 ],
+  /* 5354 */  [ 0.357298534, 18 ],
+  /* 5355 */  [ 0.357387516, 18 ],
+  /* 5356 */  [ 0.357476504, 18 ],
+  /* 5357 */  [ 0.357565498, 18 ],
+  /* 5358 */  [ 0.357654497, 18 ],
+  /* 5359 */  [ 0.357743502, 18 ],
+
+  /* 5360 */  [ 0.357832512, 18 ],
+  /* 5361 */  [ 0.357921528, 18 ],
+  /* 5362 */  [ 0.358010550, 18 ],
+  /* 5363 */  [ 0.358099576, 18 ],
+  /* 5364 */  [ 0.358188609, 18 ],
+  /* 5365 */  [ 0.358277647, 18 ],
+  /* 5366 */  [ 0.358366690, 18 ],
+  /* 5367 */  [ 0.358455739, 18 ],
+  /* 5368 */  [ 0.358544794, 18 ],
+  /* 5369 */  [ 0.358633854, 18 ],
+  /* 5370 */  [ 0.358722920, 18 ],
+  /* 5371 */  [ 0.358811991, 18 ],
+  /* 5372 */  [ 0.358901067, 18 ],
+  /* 5373 */  [ 0.358990150, 18 ],
+  /* 5374 */  [ 0.359079237, 18 ],
+  /* 5375 */  [ 0.359168331, 18 ],
+
+  /* 5376 */  [ 0.359257429, 18 ],
+  /* 5377 */  [ 0.359346534, 18 ],
+  /* 5378 */  [ 0.359435644, 18 ],
+  /* 5379 */  [ 0.359524759, 18 ],
+  /* 5380 */  [ 0.359613880, 18 ],
+  /* 5381 */  [ 0.359703006, 18 ],
+  /* 5382 */  [ 0.359792138, 18 ],
+  /* 5383 */  [ 0.359881276, 18 ],
+  /* 5384 */  [ 0.359970419, 18 ],
+  /* 5385 */  [ 0.360059567, 18 ],
+  /* 5386 */  [ 0.360148721, 18 ],
+  /* 5387 */  [ 0.360237881, 18 ],
+  /* 5388 */  [ 0.360327046, 18 ],
+  /* 5389 */  [ 0.360416216, 18 ],
+  /* 5390 */  [ 0.360505392, 18 ],
+  /* 5391 */  [ 0.360594574, 18 ],
+
+  /* 5392 */  [ 0.360683761, 18 ],
+  /* 5393 */  [ 0.360772953, 18 ],
+  /* 5394 */  [ 0.360862152, 18 ],
+  /* 5395 */  [ 0.360951355, 18 ],
+  /* 5396 */  [ 0.361040564, 18 ],
+  /* 5397 */  [ 0.361129779, 18 ],
+  /* 5398 */  [ 0.361218999, 18 ],
+  /* 5399 */  [ 0.361308225, 18 ],
+  /* 5400 */  [ 0.361397456, 18 ],
+  /* 5401 */  [ 0.361486693, 18 ],
+  /* 5402 */  [ 0.361575935, 18 ],
+  /* 5403 */  [ 0.361665183, 18 ],
+  /* 5404 */  [ 0.361754436, 18 ],
+  /* 5405 */  [ 0.361843695, 18 ],
+  /* 5406 */  [ 0.361932959, 18 ],
+  /* 5407 */  [ 0.362022229, 18 ],
+
+  /* 5408 */  [ 0.362111504, 18 ],
+  /* 5409 */  [ 0.362200785, 18 ],
+  /* 5410 */  [ 0.362290071, 18 ],
+  /* 5411 */  [ 0.362379362, 18 ],
+  /* 5412 */  [ 0.362468660, 18 ],
+  /* 5413 */  [ 0.362557962, 18 ],
+  /* 5414 */  [ 0.362647271, 18 ],
+  /* 5415 */  [ 0.362736584, 18 ],
+  /* 5416 */  [ 0.362825904, 18 ],
+  /* 5417 */  [ 0.362915228, 18 ],
+  /* 5418 */  [ 0.363004559, 18 ],
+  /* 5419 */  [ 0.363093894, 18 ],
+  /* 5420 */  [ 0.363183236, 18 ],
+  /* 5421 */  [ 0.363272582, 18 ],
+  /* 5422 */  [ 0.363361935, 18 ],
+  /* 5423 */  [ 0.363451292, 18 ],
+
+  /* 5424 */  [ 0.363540655, 18 ],
+  /* 5425 */  [ 0.363630024, 18 ],
+  /* 5426 */  [ 0.363719398, 18 ],
+  /* 5427 */  [ 0.363808778, 18 ],
+  /* 5428 */  [ 0.363898163, 18 ],
+  /* 5429 */  [ 0.363987554, 18 ],
+  /* 5430 */  [ 0.364076950, 18 ],
+  /* 5431 */  [ 0.364166352, 18 ],
+  /* 5432 */  [ 0.364255759, 18 ],
+  /* 5433 */  [ 0.364345171, 18 ],
+  /* 5434 */  [ 0.364434589, 18 ],
+  /* 5435 */  [ 0.364524013, 18 ],
+  /* 5436 */  [ 0.364613442, 18 ],
+  /* 5437 */  [ 0.364702877, 18 ],
+  /* 5438 */  [ 0.364792317, 18 ],
+  /* 5439 */  [ 0.364881762, 18 ],
+
+  /* 5440 */  [ 0.364971213, 18 ],
+  /* 5441 */  [ 0.365060669, 18 ],
+  /* 5442 */  [ 0.365150131, 18 ],
+  /* 5443 */  [ 0.365239599, 18 ],
+  /* 5444 */  [ 0.365329072, 18 ],
+  /* 5445 */  [ 0.365418550, 18 ],
+  /* 5446 */  [ 0.365508034, 18 ],
+  /* 5447 */  [ 0.365597523, 18 ],
+  /* 5448 */  [ 0.365687018, 18 ],
+  /* 5449 */  [ 0.365776518, 18 ],
+  /* 5450 */  [ 0.365866024, 18 ],
+  /* 5451 */  [ 0.365955536, 18 ],
+  /* 5452 */  [ 0.366045052, 18 ],
+  /* 5453 */  [ 0.366134574, 18 ],
+  /* 5454 */  [ 0.366224102, 18 ],
+  /* 5455 */  [ 0.366313635, 18 ],
+
+  /* 5456 */  [ 0.366403174, 18 ],
+  /* 5457 */  [ 0.366492718, 18 ],
+  /* 5458 */  [ 0.366582267, 18 ],
+  /* 5459 */  [ 0.366671822, 18 ],
+  /* 5460 */  [ 0.366761383, 18 ],
+  /* 5461 */  [ 0.366850949, 18 ],
+  /* 5462 */  [ 0.366940520, 18 ],
+  /* 5463 */  [ 0.367030097, 18 ],
+  /* 5464 */  [ 0.367119680, 18 ],
+  /* 5465 */  [ 0.367209267, 18 ],
+  /* 5466 */  [ 0.367298861, 18 ],
+  /* 5467 */  [ 0.367388459, 18 ],
+  /* 5468 */  [ 0.367478064, 18 ],
+  /* 5469 */  [ 0.367567673, 18 ],
+  /* 5470 */  [ 0.367657288, 18 ],
+  /* 5471 */  [ 0.367746909, 18 ],
+
+  /* 5472 */  [ 0.367836535, 18 ],
+  /* 5473 */  [ 0.367926167, 18 ],
+  /* 5474 */  [ 0.368015804, 18 ],
+  /* 5475 */  [ 0.368105446, 18 ],
+  /* 5476 */  [ 0.368195094, 18 ],
+  /* 5477 */  [ 0.368284747, 18 ],
+  /* 5478 */  [ 0.368374406, 18 ],
+  /* 5479 */  [ 0.368464070, 18 ],
+  /* 5480 */  [ 0.368553740, 18 ],
+  /* 5481 */  [ 0.368643415, 18 ],
+  /* 5482 */  [ 0.368733096, 18 ],
+  /* 5483 */  [ 0.368822782, 18 ],
+  /* 5484 */  [ 0.368912473, 18 ],
+  /* 5485 */  [ 0.369002170, 18 ],
+  /* 5486 */  [ 0.369091873, 18 ],
+  /* 5487 */  [ 0.369181581, 18 ],
+
+  /* 5488 */  [ 0.369271294, 18 ],
+  /* 5489 */  [ 0.369361013, 18 ],
+  /* 5490 */  [ 0.369450737, 18 ],
+  /* 5491 */  [ 0.369540467, 18 ],
+  /* 5492 */  [ 0.369630202, 18 ],
+  /* 5493 */  [ 0.369719942, 18 ],
+  /* 5494 */  [ 0.369809688, 18 ],
+  /* 5495 */  [ 0.369899440, 18 ],
+  /* 5496 */  [ 0.369989197, 18 ],
+  /* 5497 */  [ 0.370078959, 18 ],
+  /* 5498 */  [ 0.370168727, 18 ],
+  /* 5499 */  [ 0.370258500, 18 ],
+  /* 5500 */  [ 0.370348279, 18 ],
+  /* 5501 */  [ 0.370438063, 18 ],
+  /* 5502 */  [ 0.370527853, 18 ],
+  /* 5503 */  [ 0.370617648, 18 ],
+
+  /* 5504 */  [ 0.370707448, 18 ],
+  /* 5505 */  [ 0.370797254, 18 ],
+  /* 5506 */  [ 0.370887065, 18 ],
+  /* 5507 */  [ 0.370976882, 18 ],
+  /* 5508 */  [ 0.371066704, 18 ],
+  /* 5509 */  [ 0.371156532, 18 ],
+  /* 5510 */  [ 0.371246365, 18 ],
+  /* 5511 */  [ 0.371336203, 18 ],
+  /* 5512 */  [ 0.371426047, 18 ],
+  /* 5513 */  [ 0.371515897, 18 ],
+  /* 5514 */  [ 0.371605751, 18 ],
+  /* 5515 */  [ 0.371695612, 18 ],
+  /* 5516 */  [ 0.371785477, 18 ],
+  /* 5517 */  [ 0.371875348, 18 ],
+  /* 5518 */  [ 0.371965225, 18 ],
+  /* 5519 */  [ 0.372055107, 18 ],
+
+  /* 5520 */  [ 0.372144994, 18 ],
+  /* 5521 */  [ 0.372234887, 18 ],
+  /* 5522 */  [ 0.372324785, 18 ],
+  /* 5523 */  [ 0.372414689, 18 ],
+  /* 5524 */  [ 0.372504598, 18 ],
+  /* 5525 */  [ 0.372594513, 18 ],
+  /* 5526 */  [ 0.372684433, 18 ],
+  /* 5527 */  [ 0.372774358, 18 ],
+  /* 5528 */  [ 0.372864289, 18 ],
+  /* 5529 */  [ 0.372954225, 18 ],
+  /* 5530 */  [ 0.373044167, 18 ],
+  /* 5531 */  [ 0.373134114, 18 ],
+  /* 5532 */  [ 0.373224066, 18 ],
+  /* 5533 */  [ 0.373314024, 18 ],
+  /* 5534 */  [ 0.373403987, 18 ],
+  /* 5535 */  [ 0.373493956, 18 ],
+
+  /* 5536 */  [ 0.373583930, 18 ],
+  /* 5537 */  [ 0.373673910, 18 ],
+  /* 5538 */  [ 0.373763895, 18 ],
+  /* 5539 */  [ 0.373853885, 18 ],
+  /* 5540 */  [ 0.373943881, 18 ],
+  /* 5541 */  [ 0.374033882, 18 ],
+  /* 5542 */  [ 0.374123889, 18 ],
+  /* 5543 */  [ 0.374213901, 18 ],
+  /* 5544 */  [ 0.374303918, 18 ],
+  /* 5545 */  [ 0.374393941, 18 ],
+  /* 5546 */  [ 0.374483970, 18 ],
+  /* 5547 */  [ 0.374574003, 18 ],
+  /* 5548 */  [ 0.374664042, 18 ],
+  /* 5549 */  [ 0.374754087, 18 ],
+  /* 5550 */  [ 0.374844137, 18 ],
+  /* 5551 */  [ 0.374934192, 18 ],
+
+  /* 5552 */  [ 0.375024253, 18 ],
+  /* 5553 */  [ 0.375114319, 18 ],
+  /* 5554 */  [ 0.375204391, 18 ],
+  /* 5555 */  [ 0.375294468, 18 ],
+  /* 5556 */  [ 0.375384550, 18 ],
+  /* 5557 */  [ 0.375474638, 18 ],
+  /* 5558 */  [ 0.375564731, 18 ],
+  /* 5559 */  [ 0.375654830, 18 ],
+  /* 5560 */  [ 0.375744934, 18 ],
+  /* 5561 */  [ 0.375835043, 18 ],
+  /* 5562 */  [ 0.375925158, 18 ],
+  /* 5563 */  [ 0.376015278, 18 ],
+  /* 5564 */  [ 0.376105404, 18 ],
+  /* 5565 */  [ 0.376195535, 18 ],
+  /* 5566 */  [ 0.376285671, 18 ],
+  /* 5567 */  [ 0.376375813, 18 ],
+
+  /* 5568 */  [ 0.376465960, 18 ],
+  /* 5569 */  [ 0.376556113, 18 ],
+  /* 5570 */  [ 0.376646271, 18 ],
+  /* 5571 */  [ 0.376736434, 18 ],
+  /* 5572 */  [ 0.376826603, 18 ],
+  /* 5573 */  [ 0.376916777, 18 ],
+  /* 5574 */  [ 0.377006957, 18 ],
+  /* 5575 */  [ 0.377097141, 18 ],
+  /* 5576 */  [ 0.377187332, 18 ],
+  /* 5577 */  [ 0.377277528, 18 ],
+  /* 5578 */  [ 0.377367729, 18 ],
+  /* 5579 */  [ 0.377457935, 18 ],
+  /* 5580 */  [ 0.377548147, 18 ],
+  /* 5581 */  [ 0.377638364, 18 ],
+  /* 5582 */  [ 0.377728587, 18 ],
+  /* 5583 */  [ 0.377818815, 18 ],
+
+  /* 5584 */  [ 0.377909049, 18 ],
+  /* 5585 */  [ 0.377999288, 18 ],
+  /* 5586 */  [ 0.378089532, 18 ],
+  /* 5587 */  [ 0.378179781, 18 ],
+  /* 5588 */  [ 0.378270036, 18 ],
+  /* 5589 */  [ 0.378360297, 18 ],
+  /* 5590 */  [ 0.378450563, 18 ],
+  /* 5591 */  [ 0.378540834, 18 ],
+  /* 5592 */  [ 0.378631110, 18 ],
+  /* 5593 */  [ 0.378721392, 18 ],
+  /* 5594 */  [ 0.378811680, 18 ],
+  /* 5595 */  [ 0.378901972, 18 ],
+  /* 5596 */  [ 0.378992270, 18 ],
+  /* 5597 */  [ 0.379082574, 18 ],
+  /* 5598 */  [ 0.379172883, 18 ],
+  /* 5599 */  [ 0.379263197, 18 ],
+
+  /* 5600 */  [ 0.379353516, 18 ],
+  /* 5601 */  [ 0.379443841, 18 ],
+  /* 5602 */  [ 0.379534172, 18 ],
+  /* 5603 */  [ 0.379624507, 18 ],
+  /* 5604 */  [ 0.379714848, 18 ],
+  /* 5605 */  [ 0.379805195, 18 ],
+  /* 5606 */  [ 0.379895547, 18 ],
+  /* 5607 */  [ 0.379985904, 18 ],
+  /* 5608 */  [ 0.380076266, 18 ],
+  /* 5609 */  [ 0.380166634, 18 ],
+  /* 5610 */  [ 0.380257008, 18 ],
+  /* 5611 */  [ 0.380347386, 18 ],
+  /* 5612 */  [ 0.380437770, 18 ],
+  /* 5613 */  [ 0.380528160, 18 ],
+  /* 5614 */  [ 0.380618555, 18 ],
+  /* 5615 */  [ 0.380708955, 18 ],
+
+  /* 5616 */  [ 0.380799360, 18 ],
+  /* 5617 */  [ 0.380889771, 18 ],
+  /* 5618 */  [ 0.380980187, 18 ],
+  /* 5619 */  [ 0.381070609, 18 ],
+  /* 5620 */  [ 0.381161036, 18 ],
+  /* 5621 */  [ 0.381251468, 18 ],
+  /* 5622 */  [ 0.381341906, 18 ],
+  /* 5623 */  [ 0.381432349, 18 ],
+  /* 5624 */  [ 0.381522798, 18 ],
+  /* 5625 */  [ 0.381613251, 18 ],
+  /* 5626 */  [ 0.381703711, 18 ],
+  /* 5627 */  [ 0.381794175, 18 ],
+  /* 5628 */  [ 0.381884645, 18 ],
+  /* 5629 */  [ 0.381975120, 18 ],
+  /* 5630 */  [ 0.382065601, 18 ],
+  /* 5631 */  [ 0.382156087, 18 ],
+
+  /* 5632 */  [ 0.382246578, 18 ],
+  /* 5633 */  [ 0.382337075, 18 ],
+  /* 5634 */  [ 0.382427577, 18 ],
+  /* 5635 */  [ 0.382518084, 18 ],
+  /* 5636 */  [ 0.382608597, 18 ],
+  /* 5637 */  [ 0.382699115, 18 ],
+  /* 5638 */  [ 0.382789638, 18 ],
+  /* 5639 */  [ 0.382880167, 18 ],
+  /* 5640 */  [ 0.382970701, 18 ],
+  /* 5641 */  [ 0.383061241, 18 ],
+  /* 5642 */  [ 0.383151786, 18 ],
+  /* 5643 */  [ 0.383242336, 18 ],
+  /* 5644 */  [ 0.383332891, 18 ],
+  /* 5645 */  [ 0.383423452, 18 ],
+  /* 5646 */  [ 0.383514018, 18 ],
+  /* 5647 */  [ 0.383604590, 18 ],
+
+  /* 5648 */  [ 0.383695167, 18 ],
+  /* 5649 */  [ 0.383785749, 18 ],
+  /* 5650 */  [ 0.383876337, 18 ],
+  /* 5651 */  [ 0.383966930, 18 ],
+  /* 5652 */  [ 0.384057528, 18 ],
+  /* 5653 */  [ 0.384148132, 18 ],
+  /* 5654 */  [ 0.384238741, 18 ],
+  /* 5655 */  [ 0.384329355, 18 ],
+  /* 5656 */  [ 0.384419975, 18 ],
+  /* 5657 */  [ 0.384510600, 18 ],
+  /* 5658 */  [ 0.384601230, 18 ],
+  /* 5659 */  [ 0.384691866, 18 ],
+  /* 5660 */  [ 0.384782507, 18 ],
+  /* 5661 */  [ 0.384873153, 18 ],
+  /* 5662 */  [ 0.384963805, 18 ],
+  /* 5663 */  [ 0.385054462, 18 ],
+
+  /* 5664 */  [ 0.385145124, 18 ],
+  /* 5665 */  [ 0.385235792, 18 ],
+  /* 5666 */  [ 0.385326465, 18 ],
+  /* 5667 */  [ 0.385417143, 18 ],
+  /* 5668 */  [ 0.385507827, 18 ],
+  /* 5669 */  [ 0.385598516, 18 ],
+  /* 5670 */  [ 0.385689211, 18 ],
+  /* 5671 */  [ 0.385779910, 18 ],
+  /* 5672 */  [ 0.385870615, 18 ],
+  /* 5673 */  [ 0.385961326, 18 ],
+  /* 5674 */  [ 0.386052041, 18 ],
+  /* 5675 */  [ 0.386142762, 18 ],
+  /* 5676 */  [ 0.386233489, 18 ],
+  /* 5677 */  [ 0.386324221, 18 ],
+  /* 5678 */  [ 0.386414958, 18 ],
+  /* 5679 */  [ 0.386505700, 18 ],
+
+  /* 5680 */  [ 0.386596448, 18 ],
+  /* 5681 */  [ 0.386687201, 18 ],
+  /* 5682 */  [ 0.386777959, 18 ],
+  /* 5683 */  [ 0.386868723, 18 ],
+  /* 5684 */  [ 0.386959492, 18 ],
+  /* 5685 */  [ 0.387050266, 18 ],
+  /* 5686 */  [ 0.387141045, 18 ],
+  /* 5687 */  [ 0.387231830, 18 ],
+  /* 5688 */  [ 0.387322621, 18 ],
+  /* 5689 */  [ 0.387413416, 18 ],
+  /* 5690 */  [ 0.387504217, 18 ],
+  /* 5691 */  [ 0.387595023, 18 ],
+  /* 5692 */  [ 0.387685835, 18 ],
+  /* 5693 */  [ 0.387776652, 18 ],
+  /* 5694 */  [ 0.387867474, 18 ],
+  /* 5695 */  [ 0.387958301, 18 ],
+
+  /* 5696 */  [ 0.388049134, 18 ],
+  /* 5697 */  [ 0.388139972, 18 ],
+  /* 5698 */  [ 0.388230816, 18 ],
+  /* 5699 */  [ 0.388321665, 18 ],
+  /* 5700 */  [ 0.388412519, 18 ],
+  /* 5701 */  [ 0.388503378, 18 ],
+  /* 5702 */  [ 0.388594243, 18 ],
+  /* 5703 */  [ 0.388685113, 18 ],
+  /* 5704 */  [ 0.388775988, 18 ],
+  /* 5705 */  [ 0.388866869, 18 ],
+  /* 5706 */  [ 0.388957755, 18 ],
+  /* 5707 */  [ 0.389048646, 18 ],
+  /* 5708 */  [ 0.389139542, 18 ],
+  /* 5709 */  [ 0.389230444, 18 ],
+  /* 5710 */  [ 0.389321352, 18 ],
+  /* 5711 */  [ 0.389412264, 18 ],
+
+  /* 5712 */  [ 0.389503182, 18 ],
+  /* 5713 */  [ 0.389594105, 18 ],
+  /* 5714 */  [ 0.389685033, 18 ],
+  /* 5715 */  [ 0.389775967, 18 ],
+  /* 5716 */  [ 0.389866906, 18 ],
+  /* 5717 */  [ 0.389957850, 18 ],
+  /* 5718 */  [ 0.390048800, 18 ],
+  /* 5719 */  [ 0.390139755, 18 ],
+  /* 5720 */  [ 0.390230715, 18 ],
+  /* 5721 */  [ 0.390321681, 18 ],
+  /* 5722 */  [ 0.390412651, 18 ],
+  /* 5723 */  [ 0.390503628, 18 ],
+  /* 5724 */  [ 0.390594609, 18 ],
+  /* 5725 */  [ 0.390685596, 18 ],
+  /* 5726 */  [ 0.390776588, 18 ],
+  /* 5727 */  [ 0.390867585, 18 ],
+
+  /* 5728 */  [ 0.390958588, 18 ],
+  /* 5729 */  [ 0.391049596, 18 ],
+  /* 5730 */  [ 0.391140609, 18 ],
+  /* 5731 */  [ 0.391231627, 18 ],
+  /* 5732 */  [ 0.391322651, 18 ],
+  /* 5733 */  [ 0.391413680, 18 ],
+  /* 5734 */  [ 0.391504714, 18 ],
+  /* 5735 */  [ 0.391595754, 18 ],
+  /* 5736 */  [ 0.391686799, 18 ],
+  /* 5737 */  [ 0.391777849, 18 ],
+  /* 5738 */  [ 0.391868905, 18 ],
+  /* 5739 */  [ 0.391959966, 18 ],
+  /* 5740 */  [ 0.392051032, 18 ],
+  /* 5741 */  [ 0.392142103, 18 ],
+  /* 5742 */  [ 0.392233180, 18 ],
+  /* 5743 */  [ 0.392324262, 18 ],
+
+  /* 5744 */  [ 0.392415349, 18 ],
+  /* 5745 */  [ 0.392506442, 18 ],
+  /* 5746 */  [ 0.392597540, 18 ],
+  /* 5747 */  [ 0.392688643, 18 ],
+  /* 5748 */  [ 0.392779751, 18 ],
+  /* 5749 */  [ 0.392870865, 18 ],
+  /* 5750 */  [ 0.392961984, 18 ],
+  /* 5751 */  [ 0.393053108, 18 ],
+  /* 5752 */  [ 0.393144238, 18 ],
+  /* 5753 */  [ 0.393235372, 18 ],
+  /* 5754 */  [ 0.393326513, 18 ],
+  /* 5755 */  [ 0.393417658, 18 ],
+  /* 5756 */  [ 0.393508809, 18 ],
+  /* 5757 */  [ 0.393599965, 18 ],
+  /* 5758 */  [ 0.393691126, 18 ],
+  /* 5759 */  [ 0.393782292, 18 ],
+
+  /* 5760 */  [ 0.393873464, 18 ],
+  /* 5761 */  [ 0.393964641, 18 ],
+  /* 5762 */  [ 0.394055823, 18 ],
+  /* 5763 */  [ 0.394147011, 18 ],
+  /* 5764 */  [ 0.394238204, 18 ],
+  /* 5765 */  [ 0.394329402, 18 ],
+  /* 5766 */  [ 0.394420605, 18 ],
+  /* 5767 */  [ 0.394511814, 18 ],
+  /* 5768 */  [ 0.394603028, 18 ],
+  /* 5769 */  [ 0.394694247, 18 ],
+  /* 5770 */  [ 0.394785472, 18 ],
+  /* 5771 */  [ 0.394876702, 18 ],
+  /* 5772 */  [ 0.394967937, 18 ],
+  /* 5773 */  [ 0.395059177, 18 ],
+  /* 5774 */  [ 0.395150423, 18 ],
+  /* 5775 */  [ 0.395241673, 18 ],
+
+  /* 5776 */  [ 0.395332930, 18 ],
+  /* 5777 */  [ 0.395424191, 18 ],
+  /* 5778 */  [ 0.395515458, 18 ],
+  /* 5779 */  [ 0.395606730, 18 ],
+  /* 5780 */  [ 0.395698007, 18 ],
+  /* 5781 */  [ 0.395789289, 18 ],
+  /* 5782 */  [ 0.395880577, 18 ],
+  /* 5783 */  [ 0.395971870, 18 ],
+  /* 5784 */  [ 0.396063168, 18 ],
+  /* 5785 */  [ 0.396154472, 18 ],
+  /* 5786 */  [ 0.396245780, 18 ],
+  /* 5787 */  [ 0.396337094, 18 ],
+  /* 5788 */  [ 0.396428414, 18 ],
+  /* 5789 */  [ 0.396519738, 18 ],
+  /* 5790 */  [ 0.396611068, 18 ],
+  /* 5791 */  [ 0.396702403, 18 ],
+
+  /* 5792 */  [ 0.396793743, 18 ],
+  /* 5793 */  [ 0.396885089, 18 ],
+  /* 5794 */  [ 0.396976440, 18 ],
+  /* 5795 */  [ 0.397067796, 18 ],
+  /* 5796 */  [ 0.397159157, 18 ],
+  /* 5797 */  [ 0.397250524, 18 ],
+  /* 5798 */  [ 0.397341896, 18 ],
+  /* 5799 */  [ 0.397433273, 18 ],
+  /* 5800 */  [ 0.397524655, 18 ],
+  /* 5801 */  [ 0.397616043, 18 ],
+  /* 5802 */  [ 0.397707436, 18 ],
+  /* 5803 */  [ 0.397798834, 18 ],
+  /* 5804 */  [ 0.397890237, 18 ],
+  /* 5805 */  [ 0.397981646, 18 ],
+  /* 5806 */  [ 0.398073059, 18 ],
+  /* 5807 */  [ 0.398164479, 18 ],
+
+  /* 5808 */  [ 0.398255903, 18 ],
+  /* 5809 */  [ 0.398347333, 18 ],
+  /* 5810 */  [ 0.398438767, 18 ],
+  /* 5811 */  [ 0.398530207, 18 ],
+  /* 5812 */  [ 0.398621653, 18 ],
+  /* 5813 */  [ 0.398713103, 18 ],
+  /* 5814 */  [ 0.398804559, 18 ],
+  /* 5815 */  [ 0.398896020, 18 ],
+  /* 5816 */  [ 0.398987487, 18 ],
+  /* 5817 */  [ 0.399078958, 18 ],
+  /* 5818 */  [ 0.399170435, 18 ],
+  /* 5819 */  [ 0.399261917, 18 ],
+  /* 5820 */  [ 0.399353404, 18 ],
+  /* 5821 */  [ 0.399444897, 18 ],
+  /* 5822 */  [ 0.399536395, 18 ],
+  /* 5823 */  [ 0.399627898, 18 ],
+
+  /* 5824 */  [ 0.399719406, 18 ],
+  /* 5825 */  [ 0.399810919, 18 ],
+  /* 5826 */  [ 0.399902438, 18 ],
+  /* 5827 */  [ 0.399993962, 18 ],
+  /* 5828 */  [ 0.400085491, 18 ],
+  /* 5829 */  [ 0.400177026, 18 ],
+  /* 5830 */  [ 0.400268565, 18 ],
+  /* 5831 */  [ 0.400360110, 18 ],
+  /* 5832 */  [ 0.400451660, 18 ],
+  /* 5833 */  [ 0.400543216, 18 ],
+  /* 5834 */  [ 0.400634776, 18 ],
+  /* 5835 */  [ 0.400726342, 18 ],
+  /* 5836 */  [ 0.400817913, 18 ],
+  /* 5837 */  [ 0.400909489, 18 ],
+  /* 5838 */  [ 0.401001071, 18 ],
+  /* 5839 */  [ 0.401092657, 18 ],
+
+  /* 5840 */  [ 0.401184249, 18 ],
+  /* 5841 */  [ 0.401275847, 18 ],
+  /* 5842 */  [ 0.401367449, 18 ],
+  /* 5843 */  [ 0.401459057, 18 ],
+  /* 5844 */  [ 0.401550670, 18 ],
+  /* 5845 */  [ 0.401642288, 18 ],
+  /* 5846 */  [ 0.401733911, 18 ],
+  /* 5847 */  [ 0.401825540, 18 ],
+  /* 5848 */  [ 0.401917173, 18 ],
+  /* 5849 */  [ 0.402008812, 18 ],
+  /* 5850 */  [ 0.402100457, 18 ],
+  /* 5851 */  [ 0.402192106, 18 ],
+  /* 5852 */  [ 0.402283761, 18 ],
+  /* 5853 */  [ 0.402375420, 18 ],
+  /* 5854 */  [ 0.402467086, 18 ],
+  /* 5855 */  [ 0.402558756, 18 ],
+
+  /* 5856 */  [ 0.402650431, 18 ],
+  /* 5857 */  [ 0.402742112, 18 ],
+  /* 5858 */  [ 0.402833798, 18 ],
+  /* 5859 */  [ 0.402925489, 18 ],
+  /* 5860 */  [ 0.403017186, 18 ],
+  /* 5861 */  [ 0.403108887, 18 ],
+  /* 5862 */  [ 0.403200594, 18 ],
+  /* 5863 */  [ 0.403292306, 18 ],
+  /* 5864 */  [ 0.403384024, 18 ],
+  /* 5865 */  [ 0.403475746, 18 ],
+  /* 5866 */  [ 0.403567474, 18 ],
+  /* 5867 */  [ 0.403659207, 18 ],
+  /* 5868 */  [ 0.403750945, 18 ],
+  /* 5869 */  [ 0.403842688, 18 ],
+  /* 5870 */  [ 0.403934437, 18 ],
+  /* 5871 */  [ 0.404026190, 18 ],
+
+  /* 5872 */  [ 0.404117949, 18 ],
+  /* 5873 */  [ 0.404209714, 18 ],
+  /* 5874 */  [ 0.404301483, 18 ],
+  /* 5875 */  [ 0.404393258, 18 ],
+  /* 5876 */  [ 0.404485037, 18 ],
+  /* 5877 */  [ 0.404576822, 18 ],
+  /* 5878 */  [ 0.404668613, 18 ],
+  /* 5879 */  [ 0.404760408, 18 ],
+  /* 5880 */  [ 0.404852209, 18 ],
+  /* 5881 */  [ 0.404944014, 18 ],
+  /* 5882 */  [ 0.405035825, 18 ],
+  /* 5883 */  [ 0.405127642, 18 ],
+  /* 5884 */  [ 0.405219463, 18 ],
+  /* 5885 */  [ 0.405311290, 18 ],
+  /* 5886 */  [ 0.405403122, 18 ],
+  /* 5887 */  [ 0.405494959, 18 ],
+
+  /* 5888 */  [ 0.405586801, 18 ],
+  /* 5889 */  [ 0.405678648, 18 ],
+  /* 5890 */  [ 0.405770501, 18 ],
+  /* 5891 */  [ 0.405862359, 18 ],
+  /* 5892 */  [ 0.405954222, 18 ],
+  /* 5893 */  [ 0.406046090, 18 ],
+  /* 5894 */  [ 0.406137963, 18 ],
+  /* 5895 */  [ 0.406229842, 18 ],
+  /* 5896 */  [ 0.406321726, 18 ],
+  /* 5897 */  [ 0.406413615, 18 ],
+  /* 5898 */  [ 0.406505509, 18 ],
+  /* 5899 */  [ 0.406597408, 18 ],
+  /* 5900 */  [ 0.406689313, 18 ],
+  /* 5901 */  [ 0.406781223, 18 ],
+  /* 5902 */  [ 0.406873138, 18 ],
+  /* 5903 */  [ 0.406965058, 18 ],
+
+  /* 5904 */  [ 0.407056983, 18 ],
+  /* 5905 */  [ 0.407148914, 18 ],
+  /* 5906 */  [ 0.407240850, 18 ],
+  /* 5907 */  [ 0.407332791, 18 ],
+  /* 5908 */  [ 0.407424737, 18 ],
+  /* 5909 */  [ 0.407516688, 18 ],
+  /* 5910 */  [ 0.407608645, 18 ],
+  /* 5911 */  [ 0.407700606, 18 ],
+  /* 5912 */  [ 0.407792573, 18 ],
+  /* 5913 */  [ 0.407884545, 18 ],
+  /* 5914 */  [ 0.407976522, 18 ],
+  /* 5915 */  [ 0.408068505, 18 ],
+  /* 5916 */  [ 0.408160492, 18 ],
+  /* 5917 */  [ 0.408252485, 18 ],
+  /* 5918 */  [ 0.408344483, 18 ],
+  /* 5919 */  [ 0.408436486, 18 ],
+
+  /* 5920 */  [ 0.408528495, 18 ],
+  /* 5921 */  [ 0.408620508, 18 ],
+  /* 5922 */  [ 0.408712527, 18 ],
+  /* 5923 */  [ 0.408804551, 18 ],
+  /* 5924 */  [ 0.408896580, 18 ],
+  /* 5925 */  [ 0.408988614, 18 ],
+  /* 5926 */  [ 0.409080653, 18 ],
+  /* 5927 */  [ 0.409172698, 18 ],
+  /* 5928 */  [ 0.409264748, 18 ],
+  /* 5929 */  [ 0.409356803, 18 ],
+  /* 5930 */  [ 0.409448863, 18 ],
+  /* 5931 */  [ 0.409540928, 18 ],
+  /* 5932 */  [ 0.409632999, 18 ],
+  /* 5933 */  [ 0.409725074, 18 ],
+  /* 5934 */  [ 0.409817155, 18 ],
+  /* 5935 */  [ 0.409909241, 18 ],
+
+  /* 5936 */  [ 0.410001332, 18 ],
+  /* 5937 */  [ 0.410093428, 18 ],
+  /* 5938 */  [ 0.410185530, 18 ],
+  /* 5939 */  [ 0.410277637, 18 ],
+  /* 5940 */  [ 0.410369748, 18 ],
+  /* 5941 */  [ 0.410461865, 18 ],
+  /* 5942 */  [ 0.410553988, 18 ],
+  /* 5943 */  [ 0.410646115, 18 ],
+  /* 5944 */  [ 0.410738247, 18 ],
+  /* 5945 */  [ 0.410830385, 18 ],
+  /* 5946 */  [ 0.410922528, 18 ],
+  /* 5947 */  [ 0.411014676, 18 ],
+  /* 5948 */  [ 0.411106829, 18 ],
+  /* 5949 */  [ 0.411198987, 18 ],
+  /* 5950 */  [ 0.411291151, 18 ],
+  /* 5951 */  [ 0.411383320, 18 ],
+
+  /* 5952 */  [ 0.411475493, 18 ],
+  /* 5953 */  [ 0.411567672, 18 ],
+  /* 5954 */  [ 0.411659857, 18 ],
+  /* 5955 */  [ 0.411752046, 18 ],
+  /* 5956 */  [ 0.411844240, 18 ],
+  /* 5957 */  [ 0.411936440, 18 ],
+  /* 5958 */  [ 0.412028645, 18 ],
+  /* 5959 */  [ 0.412120855, 18 ],
+  /* 5960 */  [ 0.412213070, 18 ],
+  /* 5961 */  [ 0.412305290, 18 ],
+  /* 5962 */  [ 0.412397516, 18 ],
+  /* 5963 */  [ 0.412489746, 18 ],
+  /* 5964 */  [ 0.412581982, 18 ],
+  /* 5965 */  [ 0.412674223, 18 ],
+  /* 5966 */  [ 0.412766469, 18 ],
+  /* 5967 */  [ 0.412858720, 18 ],
+
+  /* 5968 */  [ 0.412950976, 18 ],
+  /* 5969 */  [ 0.413043238, 18 ],
+  /* 5970 */  [ 0.413135505, 18 ],
+  /* 5971 */  [ 0.413227776, 18 ],
+  /* 5972 */  [ 0.413320053, 18 ],
+  /* 5973 */  [ 0.413412335, 18 ],
+  /* 5974 */  [ 0.413504623, 18 ],
+  /* 5975 */  [ 0.413596915, 18 ],
+  /* 5976 */  [ 0.413689213, 18 ],
+  /* 5977 */  [ 0.413781515, 18 ],
+  /* 5978 */  [ 0.413873823, 18 ],
+  /* 5979 */  [ 0.413966136, 18 ],
+  /* 5980 */  [ 0.414058454, 18 ],
+  /* 5981 */  [ 0.414150778, 18 ],
+  /* 5982 */  [ 0.414243106, 18 ],
+  /* 5983 */  [ 0.414335440, 18 ],
+
+  /* 5984 */  [ 0.414427779, 18 ],
+  /* 5985 */  [ 0.414520122, 18 ],
+  /* 5986 */  [ 0.414612471, 18 ],
+  /* 5987 */  [ 0.414704826, 18 ],
+  /* 5988 */  [ 0.414797185, 18 ],
+  /* 5989 */  [ 0.414889549, 18 ],
+  /* 5990 */  [ 0.414981919, 18 ],
+  /* 5991 */  [ 0.415074294, 18 ],
+  /* 5992 */  [ 0.415166674, 18 ],
+  /* 5993 */  [ 0.415259059, 18 ],
+  /* 5994 */  [ 0.415351449, 18 ],
+  /* 5995 */  [ 0.415443844, 18 ],
+  /* 5996 */  [ 0.415536244, 18 ],
+  /* 5997 */  [ 0.415628650, 18 ],
+  /* 5998 */  [ 0.415721061, 18 ],
+  /* 5999 */  [ 0.415813476, 18 ],
+
+  /* 6000 */  [ 0.415905897, 18 ],
+  /* 6001 */  [ 0.415998324, 18 ],
+  /* 6002 */  [ 0.416090755, 18 ],
+  /* 6003 */  [ 0.416183191, 18 ],
+  /* 6004 */  [ 0.416275633, 18 ],
+  /* 6005 */  [ 0.416368079, 18 ],
+  /* 6006 */  [ 0.416460531, 18 ],
+  /* 6007 */  [ 0.416552988, 18 ],
+  /* 6008 */  [ 0.416645450, 18 ],
+  /* 6009 */  [ 0.416737917, 18 ],
+  /* 6010 */  [ 0.416830389, 18 ],
+  /* 6011 */  [ 0.416922867, 18 ],
+  /* 6012 */  [ 0.417015349, 18 ],
+  /* 6013 */  [ 0.417107837, 18 ],
+  /* 6014 */  [ 0.417200330, 18 ],
+  /* 6015 */  [ 0.417292828, 18 ],
+
+  /* 6016 */  [ 0.417385331, 18 ],
+  /* 6017 */  [ 0.417477839, 18 ],
+  /* 6018 */  [ 0.417570352, 18 ],
+  /* 6019 */  [ 0.417662871, 18 ],
+  /* 6020 */  [ 0.417755394, 18 ],
+  /* 6021 */  [ 0.417847923, 18 ],
+  /* 6022 */  [ 0.417940457, 18 ],
+  /* 6023 */  [ 0.418032996, 18 ],
+  /* 6024 */  [ 0.418125540, 18 ],
+  /* 6025 */  [ 0.418218089, 18 ],
+  /* 6026 */  [ 0.418310643, 18 ],
+  /* 6027 */  [ 0.418403203, 18 ],
+  /* 6028 */  [ 0.418495767, 18 ],
+  /* 6029 */  [ 0.418588337, 18 ],
+  /* 6030 */  [ 0.418680911, 18 ],
+  /* 6031 */  [ 0.418773491, 18 ],
+
+  /* 6032 */  [ 0.418866076, 18 ],
+  /* 6033 */  [ 0.418958666, 18 ],
+  /* 6034 */  [ 0.419051262, 18 ],
+  /* 6035 */  [ 0.419143862, 18 ],
+  /* 6036 */  [ 0.419236467, 18 ],
+  /* 6037 */  [ 0.419329078, 18 ],
+  /* 6038 */  [ 0.419421694, 18 ],
+  /* 6039 */  [ 0.419514314, 18 ],
+  /* 6040 */  [ 0.419606940, 18 ],
+  /* 6041 */  [ 0.419699571, 18 ],
+  /* 6042 */  [ 0.419792208, 18 ],
+  /* 6043 */  [ 0.419884849, 18 ],
+  /* 6044 */  [ 0.419977495, 18 ],
+  /* 6045 */  [ 0.420070147, 18 ],
+  /* 6046 */  [ 0.420162803, 18 ],
+  /* 6047 */  [ 0.420255465, 18 ],
+
+  /* 6048 */  [ 0.420348132, 18 ],
+  /* 6049 */  [ 0.420440803, 18 ],
+  /* 6050 */  [ 0.420533481, 18 ],
+  /* 6051 */  [ 0.420626163, 18 ],
+  /* 6052 */  [ 0.420718850, 18 ],
+  /* 6053 */  [ 0.420811542, 18 ],
+  /* 6054 */  [ 0.420904240, 18 ],
+  /* 6055 */  [ 0.420996942, 18 ],
+  /* 6056 */  [ 0.421089650, 18 ],
+  /* 6057 */  [ 0.421182362, 18 ],
+  /* 6058 */  [ 0.421275080, 18 ],
+  /* 6059 */  [ 0.421367803, 18 ],
+  /* 6060 */  [ 0.421460531, 18 ],
+  /* 6061 */  [ 0.421553264, 18 ],
+  /* 6062 */  [ 0.421646003, 18 ],
+  /* 6063 */  [ 0.421738746, 18 ],
+
+  /* 6064 */  [ 0.421831494, 18 ],
+  /* 6065 */  [ 0.421924248, 18 ],
+  /* 6066 */  [ 0.422017007, 18 ],
+  /* 6067 */  [ 0.422109770, 18 ],
+  /* 6068 */  [ 0.422202539, 18 ],
+  /* 6069 */  [ 0.422295313, 18 ],
+  /* 6070 */  [ 0.422388092, 18 ],
+  /* 6071 */  [ 0.422480876, 18 ],
+  /* 6072 */  [ 0.422573665, 18 ],
+  /* 6073 */  [ 0.422666460, 18 ],
+  /* 6074 */  [ 0.422759259, 18 ],
+  /* 6075 */  [ 0.422852064, 18 ],
+  /* 6076 */  [ 0.422944873, 18 ],
+  /* 6077 */  [ 0.423037688, 18 ],
+  /* 6078 */  [ 0.423130508, 18 ],
+  /* 6079 */  [ 0.423223333, 18 ],
+
+  /* 6080 */  [ 0.423316162, 18 ],
+  /* 6081 */  [ 0.423408997, 18 ],
+  /* 6082 */  [ 0.423501838, 18 ],
+  /* 6083 */  [ 0.423594683, 18 ],
+  /* 6084 */  [ 0.423687533, 18 ],
+  /* 6085 */  [ 0.423780389, 18 ],
+  /* 6086 */  [ 0.423873249, 18 ],
+  /* 6087 */  [ 0.423966115, 18 ],
+  /* 6088 */  [ 0.424058985, 18 ],
+  /* 6089 */  [ 0.424151861, 18 ],
+  /* 6090 */  [ 0.424244742, 18 ],
+  /* 6091 */  [ 0.424337628, 18 ],
+  /* 6092 */  [ 0.424430519, 18 ],
+  /* 6093 */  [ 0.424523415, 18 ],
+  /* 6094 */  [ 0.424616316, 18 ],
+  /* 6095 */  [ 0.424709222, 18 ],
+
+  /* 6096 */  [ 0.424802133, 18 ],
+  /* 6097 */  [ 0.424895050, 18 ],
+  /* 6098 */  [ 0.424987971, 18 ],
+  /* 6099 */  [ 0.425080898, 18 ],
+  /* 6100 */  [ 0.425173829, 18 ],
+  /* 6101 */  [ 0.425266766, 18 ],
+  /* 6102 */  [ 0.425359708, 18 ],
+  /* 6103 */  [ 0.425452655, 18 ],
+  /* 6104 */  [ 0.425545607, 18 ],
+  /* 6105 */  [ 0.425638564, 18 ],
+  /* 6106 */  [ 0.425731526, 18 ],
+  /* 6107 */  [ 0.425824493, 18 ],
+  /* 6108 */  [ 0.425917465, 18 ],
+  /* 6109 */  [ 0.426010443, 18 ],
+  /* 6110 */  [ 0.426103425, 18 ],
+  /* 6111 */  [ 0.426196412, 18 ],
+
+  /* 6112 */  [ 0.426289405, 18 ],
+  /* 6113 */  [ 0.426382403, 18 ],
+  /* 6114 */  [ 0.426475405, 18 ],
+  /* 6115 */  [ 0.426568413, 18 ],
+  /* 6116 */  [ 0.426661426, 18 ],
+  /* 6117 */  [ 0.426754444, 18 ],
+  /* 6118 */  [ 0.426847467, 18 ],
+  /* 6119 */  [ 0.426940495, 18 ],
+  /* 6120 */  [ 0.427033528, 18 ],
+  /* 6121 */  [ 0.427126566, 18 ],
+  /* 6122 */  [ 0.427219609, 18 ],
+  /* 6123 */  [ 0.427312657, 18 ],
+  /* 6124 */  [ 0.427405711, 18 ],
+  /* 6125 */  [ 0.427498769, 18 ],
+  /* 6126 */  [ 0.427591833, 18 ],
+  /* 6127 */  [ 0.427684901, 18 ],
+
+  /* 6128 */  [ 0.427777975, 18 ],
+  /* 6129 */  [ 0.427871054, 18 ],
+  /* 6130 */  [ 0.427964137, 18 ],
+  /* 6131 */  [ 0.428057226, 18 ],
+  /* 6132 */  [ 0.428150320, 18 ],
+  /* 6133 */  [ 0.428243419, 18 ],
+  /* 6134 */  [ 0.428336523, 18 ],
+  /* 6135 */  [ 0.428429632, 18 ],
+  /* 6136 */  [ 0.428522746, 18 ],
+  /* 6137 */  [ 0.428615865, 18 ],
+  /* 6138 */  [ 0.428708989, 18 ],
+  /* 6139 */  [ 0.428802119, 18 ],
+  /* 6140 */  [ 0.428895253, 18 ],
+  /* 6141 */  [ 0.428988392, 18 ],
+  /* 6142 */  [ 0.429081537, 18 ],
+  /* 6143 */  [ 0.429174686, 18 ],
+
+  /* 6144 */  [ 0.429267841, 18 ],
+  /* 6145 */  [ 0.429361001, 18 ],
+  /* 6146 */  [ 0.429454165, 18 ],
+  /* 6147 */  [ 0.429547335, 18 ],
+  /* 6148 */  [ 0.429640510, 18 ],
+  /* 6149 */  [ 0.429733690, 18 ],
+  /* 6150 */  [ 0.429826874, 18 ],
+  /* 6151 */  [ 0.429920064, 18 ],
+  /* 6152 */  [ 0.430013259, 18 ],
+  /* 6153 */  [ 0.430106459, 18 ],
+  /* 6154 */  [ 0.430199664, 18 ],
+  /* 6155 */  [ 0.430292875, 18 ],
+  /* 6156 */  [ 0.430386090, 18 ],
+  /* 6157 */  [ 0.430479310, 18 ],
+  /* 6158 */  [ 0.430572535, 18 ],
+  /* 6159 */  [ 0.430665765, 18 ],
+
+  /* 6160 */  [ 0.430759001, 18 ],
+  /* 6161 */  [ 0.430852241, 18 ],
+  /* 6162 */  [ 0.430945487, 18 ],
+  /* 6163 */  [ 0.431038737, 18 ],
+  /* 6164 */  [ 0.431131993, 18 ],
+  /* 6165 */  [ 0.431225253, 18 ],
+  /* 6166 */  [ 0.431318519, 18 ],
+  /* 6167 */  [ 0.431411790, 18 ],
+  /* 6168 */  [ 0.431505065, 18 ],
+  /* 6169 */  [ 0.431598346, 18 ],
+  /* 6170 */  [ 0.431691632, 18 ],
+  /* 6171 */  [ 0.431784923, 18 ],
+  /* 6172 */  [ 0.431878218, 18 ],
+  /* 6173 */  [ 0.431971519, 18 ],
+  /* 6174 */  [ 0.432064825, 18 ],
+  /* 6175 */  [ 0.432158136, 18 ],
+
+  /* 6176 */  [ 0.432251452, 18 ],
+  /* 6177 */  [ 0.432344773, 18 ],
+  /* 6178 */  [ 0.432438099, 18 ],
+  /* 6179 */  [ 0.432531431, 18 ],
+  /* 6180 */  [ 0.432624767, 18 ],
+  /* 6181 */  [ 0.432718108, 18 ],
+  /* 6182 */  [ 0.432811454, 18 ],
+  /* 6183 */  [ 0.432904805, 18 ],
+  /* 6184 */  [ 0.432998162, 18 ],
+  /* 6185 */  [ 0.433091523, 18 ],
+  /* 6186 */  [ 0.433184889, 18 ],
+  /* 6187 */  [ 0.433278261, 18 ],
+  /* 6188 */  [ 0.433371637, 18 ],
+  /* 6189 */  [ 0.433465019, 18 ],
+  /* 6190 */  [ 0.433558405, 18 ],
+  /* 6191 */  [ 0.433651797, 18 ],
+
+  /* 6192 */  [ 0.433745193, 18 ],
+  /* 6193 */  [ 0.433838595, 18 ],
+  /* 6194 */  [ 0.433932001, 18 ],
+  /* 6195 */  [ 0.434025413, 18 ],
+  /* 6196 */  [ 0.434118830, 18 ],
+  /* 6197 */  [ 0.434212251, 18 ],
+  /* 6198 */  [ 0.434305678, 18 ],
+  /* 6199 */  [ 0.434399110, 18 ],
+  /* 6200 */  [ 0.434492546, 18 ],
+  /* 6201 */  [ 0.434585988, 18 ],
+  /* 6202 */  [ 0.434679435, 18 ],
+  /* 6203 */  [ 0.434772887, 18 ],
+  /* 6204 */  [ 0.434866344, 18 ],
+  /* 6205 */  [ 0.434959806, 18 ],
+  /* 6206 */  [ 0.435053272, 18 ],
+  /* 6207 */  [ 0.435146744, 18 ],
+
+  /* 6208 */  [ 0.435240221, 18 ],
+  /* 6209 */  [ 0.435333703, 18 ],
+  /* 6210 */  [ 0.435427190, 18 ],
+  /* 6211 */  [ 0.435520682, 18 ],
+  /* 6212 */  [ 0.435614179, 18 ],
+  /* 6213 */  [ 0.435707681, 18 ],
+  /* 6214 */  [ 0.435801188, 18 ],
+  /* 6215 */  [ 0.435894700, 18 ],
+  /* 6216 */  [ 0.435988217, 18 ],
+  /* 6217 */  [ 0.436081739, 18 ],
+  /* 6218 */  [ 0.436175266, 18 ],
+  /* 6219 */  [ 0.436268799, 18 ],
+  /* 6220 */  [ 0.436362336, 18 ],
+  /* 6221 */  [ 0.436455878, 18 ],
+  /* 6222 */  [ 0.436549425, 18 ],
+  /* 6223 */  [ 0.436642977, 18 ],
+
+  /* 6224 */  [ 0.436736534, 18 ],
+  /* 6225 */  [ 0.436830096, 18 ],
+  /* 6226 */  [ 0.436923664, 18 ],
+  /* 6227 */  [ 0.437017236, 18 ],
+  /* 6228 */  [ 0.437110813, 18 ],
+  /* 6229 */  [ 0.437204395, 18 ],
+  /* 6230 */  [ 0.437297982, 18 ],
+  /* 6231 */  [ 0.437391575, 18 ],
+  /* 6232 */  [ 0.437485172, 18 ],
+  /* 6233 */  [ 0.437578774, 18 ],
+  /* 6234 */  [ 0.437672381, 18 ],
+  /* 6235 */  [ 0.437765994, 18 ],
+  /* 6236 */  [ 0.437859611, 18 ],
+  /* 6237 */  [ 0.437953233, 18 ],
+  /* 6238 */  [ 0.438046860, 18 ],
+  /* 6239 */  [ 0.438140493, 18 ],
+
+  /* 6240 */  [ 0.438234130, 18 ],
+  /* 6241 */  [ 0.438327772, 18 ],
+  /* 6242 */  [ 0.438421419, 18 ],
+  /* 6243 */  [ 0.438515072, 18 ],
+  /* 6244 */  [ 0.438608729, 18 ],
+  /* 6245 */  [ 0.438702391, 18 ],
+  /* 6246 */  [ 0.438796059, 18 ],
+  /* 6247 */  [ 0.438889731, 18 ],
+  /* 6248 */  [ 0.438983408, 18 ],
+  /* 6249 */  [ 0.439077090, 18 ],
+  /* 6250 */  [ 0.439170778, 18 ],
+  /* 6251 */  [ 0.439264470, 18 ],
+  /* 6252 */  [ 0.439358167, 18 ],
+  /* 6253 */  [ 0.439451869, 18 ],
+  /* 6254 */  [ 0.439545577, 18 ],
+  /* 6255 */  [ 0.439639289, 18 ],
+
+  /* 6256 */  [ 0.439733006, 18 ],
+  /* 6257 */  [ 0.439826728, 18 ],
+  /* 6258 */  [ 0.439920456, 18 ],
+  /* 6259 */  [ 0.440014188, 18 ],
+  /* 6260 */  [ 0.440107925, 18 ],
+  /* 6261 */  [ 0.440201667, 18 ],
+  /* 6262 */  [ 0.440295414, 18 ],
+  /* 6263 */  [ 0.440389167, 18 ],
+  /* 6264 */  [ 0.440482924, 18 ],
+  /* 6265 */  [ 0.440576686, 18 ],
+  /* 6266 */  [ 0.440670453, 18 ],
+  /* 6267 */  [ 0.440764225, 18 ],
+  /* 6268 */  [ 0.440858002, 18 ],
+  /* 6269 */  [ 0.440951784, 18 ],
+  /* 6270 */  [ 0.441045572, 18 ],
+  /* 6271 */  [ 0.441139364, 18 ],
+
+  /* 6272 */  [ 0.441233161, 18 ],
+  /* 6273 */  [ 0.441326963, 18 ],
+  /* 6274 */  [ 0.441420770, 18 ],
+  /* 6275 */  [ 0.441514582, 18 ],
+  /* 6276 */  [ 0.441608399, 18 ],
+  /* 6277 */  [ 0.441702221, 18 ],
+  /* 6278 */  [ 0.441796048, 18 ],
+  /* 6279 */  [ 0.441889880, 18 ],
+  /* 6280 */  [ 0.441983717, 18 ],
+  /* 6281 */  [ 0.442077559, 18 ],
+  /* 6282 */  [ 0.442171406, 18 ],
+  /* 6283 */  [ 0.442265257, 18 ],
+  /* 6284 */  [ 0.442359114, 18 ],
+  /* 6285 */  [ 0.442452976, 18 ],
+  /* 6286 */  [ 0.442546843, 18 ],
+  /* 6287 */  [ 0.442640715, 18 ],
+
+  /* 6288 */  [ 0.442734592, 18 ],
+  /* 6289 */  [ 0.442828473, 18 ],
+  /* 6290 */  [ 0.442922360, 18 ],
+  /* 6291 */  [ 0.443016252, 18 ],
+  /* 6292 */  [ 0.443110148, 18 ],
+  /* 6293 */  [ 0.443204050, 18 ],
+  /* 6294 */  [ 0.443297957, 18 ],
+  /* 6295 */  [ 0.443391868, 18 ],
+  /* 6296 */  [ 0.443485785, 18 ],
+  /* 6297 */  [ 0.443579706, 18 ],
+  /* 6298 */  [ 0.443673633, 18 ],
+  /* 6299 */  [ 0.443767564, 18 ],
+  /* 6300 */  [ 0.443861501, 18 ],
+  /* 6301 */  [ 0.443955442, 18 ],
+  /* 6302 */  [ 0.444049389, 18 ],
+  /* 6303 */  [ 0.444143340, 18 ],
+
+  /* 6304 */  [ 0.444237296, 18 ],
+  /* 6305 */  [ 0.444331258, 18 ],
+  /* 6306 */  [ 0.444425224, 18 ],
+  /* 6307 */  [ 0.444519195, 18 ],
+  /* 6308 */  [ 0.444613171, 18 ],
+  /* 6309 */  [ 0.444707153, 18 ],
+  /* 6310 */  [ 0.444801139, 18 ],
+  /* 6311 */  [ 0.444895130, 18 ],
+  /* 6312 */  [ 0.444989126, 18 ],
+  /* 6313 */  [ 0.445083127, 18 ],
+  /* 6314 */  [ 0.445177133, 18 ],
+  /* 6315 */  [ 0.445271144, 18 ],
+  /* 6316 */  [ 0.445365160, 18 ],
+  /* 6317 */  [ 0.445459181, 18 ],
+  /* 6318 */  [ 0.445553206, 18 ],
+  /* 6319 */  [ 0.445647237, 18 ],
+
+  /* 6320 */  [ 0.445741273, 18 ],
+  /* 6321 */  [ 0.445835314, 18 ],
+  /* 6322 */  [ 0.445929359, 18 ],
+  /* 6323 */  [ 0.446023410, 18 ],
+  /* 6324 */  [ 0.446117466, 18 ],
+  /* 6325 */  [ 0.446211526, 18 ],
+  /* 6326 */  [ 0.446305592, 18 ],
+  /* 6327 */  [ 0.446399662, 18 ],
+  /* 6328 */  [ 0.446493738, 18 ],
+  /* 6329 */  [ 0.446587818, 18 ],
+  /* 6330 */  [ 0.446681903, 18 ],
+  /* 6331 */  [ 0.446775994, 18 ],
+  /* 6332 */  [ 0.446870089, 18 ],
+  /* 6333 */  [ 0.446964189, 18 ],
+  /* 6334 */  [ 0.447058294, 18 ],
+  /* 6335 */  [ 0.447152404, 18 ],
+
+  /* 6336 */  [ 0.447246519, 18 ],
+  /* 6337 */  [ 0.447340639, 18 ],
+  /* 6338 */  [ 0.447434764, 18 ],
+  /* 6339 */  [ 0.447528894, 18 ],
+  /* 6340 */  [ 0.447623029, 18 ],
+  /* 6341 */  [ 0.447717169, 18 ],
+  /* 6342 */  [ 0.447811314, 18 ],
+  /* 6343 */  [ 0.447905463, 18 ],
+  /* 6344 */  [ 0.447999618, 18 ],
+  /* 6345 */  [ 0.448093778, 18 ],
+  /* 6346 */  [ 0.448187942, 18 ],
+  /* 6347 */  [ 0.448282112, 18 ],
+  /* 6348 */  [ 0.448376286, 18 ],
+  /* 6349 */  [ 0.448470466, 18 ],
+  /* 6350 */  [ 0.448564650, 18 ],
+  /* 6351 */  [ 0.448658839, 18 ],
+
+  /* 6352 */  [ 0.448753033, 18 ],
+  /* 6353 */  [ 0.448847233, 18 ],
+  /* 6354 */  [ 0.448941437, 18 ],
+  /* 6355 */  [ 0.449035646, 18 ],
+  /* 6356 */  [ 0.449129860, 18 ],
+  /* 6357 */  [ 0.449224079, 18 ],
+  /* 6358 */  [ 0.449318303, 18 ],
+  /* 6359 */  [ 0.449412531, 18 ],
+  /* 6360 */  [ 0.449506765, 18 ],
+  /* 6361 */  [ 0.449601004, 18 ],
+  /* 6362 */  [ 0.449695247, 18 ],
+  /* 6363 */  [ 0.449789496, 18 ],
+  /* 6364 */  [ 0.449883749, 18 ],
+  /* 6365 */  [ 0.449978008, 18 ],
+  /* 6366 */  [ 0.450072271, 18 ],
+  /* 6367 */  [ 0.450166540, 18 ],
+
+  /* 6368 */  [ 0.450260813, 18 ],
+  /* 6369 */  [ 0.450355091, 18 ],
+  /* 6370 */  [ 0.450449374, 18 ],
+  /* 6371 */  [ 0.450543662, 18 ],
+  /* 6372 */  [ 0.450637955, 18 ],
+  /* 6373 */  [ 0.450732253, 18 ],
+  /* 6374 */  [ 0.450826556, 18 ],
+  /* 6375 */  [ 0.450920864, 18 ],
+  /* 6376 */  [ 0.451015176, 18 ],
+  /* 6377 */  [ 0.451109494, 18 ],
+  /* 6378 */  [ 0.451203817, 18 ],
+  /* 6379 */  [ 0.451298144, 18 ],
+  /* 6380 */  [ 0.451392477, 18 ],
+  /* 6381 */  [ 0.451486814, 18 ],
+  /* 6382 */  [ 0.451581156, 18 ],
+  /* 6383 */  [ 0.451675503, 18 ],
+
+  /* 6384 */  [ 0.451769856, 18 ],
+  /* 6385 */  [ 0.451864213, 18 ],
+  /* 6386 */  [ 0.451958575, 18 ],
+  /* 6387 */  [ 0.452052942, 18 ],
+  /* 6388 */  [ 0.452147313, 18 ],
+  /* 6389 */  [ 0.452241690, 18 ],
+  /* 6390 */  [ 0.452336072, 18 ],
+  /* 6391 */  [ 0.452430458, 18 ],
+  /* 6392 */  [ 0.452524850, 18 ],
+  /* 6393 */  [ 0.452619246, 18 ],
+  /* 6394 */  [ 0.452713648, 18 ],
+  /* 6395 */  [ 0.452808054, 18 ],
+  /* 6396 */  [ 0.452902465, 18 ],
+  /* 6397 */  [ 0.452996882, 18 ],
+  /* 6398 */  [ 0.453091303, 18 ],
+  /* 6399 */  [ 0.453185729, 18 ],
+
+  /* 6400 */  [ 0.453280160, 18 ],
+  /* 6401 */  [ 0.453374595, 18 ],
+  /* 6402 */  [ 0.453469036, 18 ],
+  /* 6403 */  [ 0.453563482, 18 ],
+  /* 6404 */  [ 0.453657932, 18 ],
+  /* 6405 */  [ 0.453752388, 18 ],
+  /* 6406 */  [ 0.453846848, 18 ],
+  /* 6407 */  [ 0.453941314, 18 ],
+  /* 6408 */  [ 0.454035784, 18 ],
+  /* 6409 */  [ 0.454130259, 18 ],
+  /* 6410 */  [ 0.454224739, 18 ],
+  /* 6411 */  [ 0.454319224, 18 ],
+  /* 6412 */  [ 0.454413714, 18 ],
+  /* 6413 */  [ 0.454508209, 18 ],
+  /* 6414 */  [ 0.454602708, 18 ],
+  /* 6415 */  [ 0.454697213, 18 ],
+
+  /* 6416 */  [ 0.454791723, 18 ],
+  /* 6417 */  [ 0.454886237, 18 ],
+  /* 6418 */  [ 0.454980756, 18 ],
+  /* 6419 */  [ 0.455075281, 18 ],
+  /* 6420 */  [ 0.455169810, 18 ],
+  /* 6421 */  [ 0.455264344, 18 ],
+  /* 6422 */  [ 0.455358883, 18 ],
+  /* 6423 */  [ 0.455453427, 18 ],
+  /* 6424 */  [ 0.455547976, 18 ],
+  /* 6425 */  [ 0.455642529, 18 ],
+  /* 6426 */  [ 0.455737088, 18 ],
+  /* 6427 */  [ 0.455831652, 18 ],
+  /* 6428 */  [ 0.455926220, 18 ],
+  /* 6429 */  [ 0.456020793, 18 ],
+  /* 6430 */  [ 0.456115372, 18 ],
+  /* 6431 */  [ 0.456209955, 18 ],
+
+  /* 6432 */  [ 0.456304543, 18 ],
+  /* 6433 */  [ 0.456399136, 18 ],
+  /* 6434 */  [ 0.456493733, 18 ],
+  /* 6435 */  [ 0.456588336, 18 ],
+  /* 6436 */  [ 0.456682944, 18 ],
+  /* 6437 */  [ 0.456777556, 18 ],
+  /* 6438 */  [ 0.456872174, 18 ],
+  /* 6439 */  [ 0.456966796, 18 ],
+  /* 6440 */  [ 0.457061423, 18 ],
+  /* 6441 */  [ 0.457156056, 18 ],
+  /* 6442 */  [ 0.457250693, 18 ],
+  /* 6443 */  [ 0.457345335, 18 ],
+  /* 6444 */  [ 0.457439981, 18 ],
+  /* 6445 */  [ 0.457534633, 18 ],
+  /* 6446 */  [ 0.457629290, 18 ],
+  /* 6447 */  [ 0.457723951, 18 ],
+
+  /* 6448 */  [ 0.457818618, 18 ],
+  /* 6449 */  [ 0.457913289, 18 ],
+  /* 6450 */  [ 0.458007965, 18 ],
+  /* 6451 */  [ 0.458102646, 18 ],
+  /* 6452 */  [ 0.458197332, 18 ],
+  /* 6453 */  [ 0.458292023, 18 ],
+  /* 6454 */  [ 0.458386719, 18 ],
+  /* 6455 */  [ 0.458481420, 18 ],
+  /* 6456 */  [ 0.458576125, 18 ],
+  /* 6457 */  [ 0.458670836, 18 ],
+  /* 6458 */  [ 0.458765551, 18 ],
+  /* 6459 */  [ 0.458860271, 18 ],
+  /* 6460 */  [ 0.458954996, 18 ],
+  /* 6461 */  [ 0.459049726, 18 ],
+  /* 6462 */  [ 0.459144461, 18 ],
+  /* 6463 */  [ 0.459239201, 18 ],
+
+  /* 6464 */  [ 0.459333946, 18 ],
+  /* 6465 */  [ 0.459428695, 18 ],
+  /* 6466 */  [ 0.459523450, 18 ],
+  /* 6467 */  [ 0.459618209, 18 ],
+  /* 6468 */  [ 0.459712973, 18 ],
+  /* 6469 */  [ 0.459807742, 18 ],
+  /* 6470 */  [ 0.459902516, 18 ],
+  /* 6471 */  [ 0.459997295, 18 ],
+  /* 6472 */  [ 0.460092079, 18 ],
+  /* 6473 */  [ 0.460186867, 18 ],
+  /* 6474 */  [ 0.460281661, 18 ],
+  /* 6475 */  [ 0.460376459, 18 ],
+  /* 6476 */  [ 0.460471262, 18 ],
+  /* 6477 */  [ 0.460566071, 18 ],
+  /* 6478 */  [ 0.460660884, 18 ],
+  /* 6479 */  [ 0.460755701, 18 ],
+
+  /* 6480 */  [ 0.460850524, 18 ],
+  /* 6481 */  [ 0.460945352, 18 ],
+  /* 6482 */  [ 0.461040184, 18 ],
+  /* 6483 */  [ 0.461135022, 18 ],
+  /* 6484 */  [ 0.461229864, 18 ],
+  /* 6485 */  [ 0.461324711, 18 ],
+  /* 6486 */  [ 0.461419563, 18 ],
+  /* 6487 */  [ 0.461514420, 18 ],
+  /* 6488 */  [ 0.461609282, 18 ],
+  /* 6489 */  [ 0.461704149, 18 ],
+  /* 6490 */  [ 0.461799020, 18 ],
+  /* 6491 */  [ 0.461893897, 18 ],
+  /* 6492 */  [ 0.461988778, 18 ],
+  /* 6493 */  [ 0.462083664, 18 ],
+  /* 6494 */  [ 0.462178555, 18 ],
+  /* 6495 */  [ 0.462273451, 18 ],
+
+  /* 6496 */  [ 0.462368352, 18 ],
+  /* 6497 */  [ 0.462463257, 18 ],
+  /* 6498 */  [ 0.462558168, 18 ],
+  /* 6499 */  [ 0.462653083, 18 ],
+  /* 6500 */  [ 0.462748003, 18 ],
+  /* 6501 */  [ 0.462842928, 18 ],
+  /* 6502 */  [ 0.462937858, 18 ],
+  /* 6503 */  [ 0.463032793, 18 ],
+  /* 6504 */  [ 0.463127733, 18 ],
+  /* 6505 */  [ 0.463222678, 18 ],
+  /* 6506 */  [ 0.463317627, 18 ],
+  /* 6507 */  [ 0.463412581, 18 ],
+  /* 6508 */  [ 0.463507540, 18 ],
+  /* 6509 */  [ 0.463602504, 18 ],
+  /* 6510 */  [ 0.463697473, 18 ],
+  /* 6511 */  [ 0.463792447, 18 ],
+
+  /* 6512 */  [ 0.463887426, 18 ],
+  /* 6513 */  [ 0.463982409, 18 ],
+  /* 6514 */  [ 0.464077398, 18 ],
+  /* 6515 */  [ 0.464172391, 18 ],
+  /* 6516 */  [ 0.464267389, 18 ],
+  /* 6517 */  [ 0.464362392, 18 ],
+  /* 6518 */  [ 0.464457399, 18 ],
+  /* 6519 */  [ 0.464552412, 18 ],
+  /* 6520 */  [ 0.464647430, 18 ],
+  /* 6521 */  [ 0.464742452, 18 ],
+  /* 6522 */  [ 0.464837479, 18 ],
+  /* 6523 */  [ 0.464932511, 18 ],
+  /* 6524 */  [ 0.465027548, 18 ],
+  /* 6525 */  [ 0.465122590, 18 ],
+  /* 6526 */  [ 0.465217637, 18 ],
+  /* 6527 */  [ 0.465312688, 18 ],
+
+  /* 6528 */  [ 0.465407744, 18 ],
+  /* 6529 */  [ 0.465502806, 18 ],
+  /* 6530 */  [ 0.465597872, 18 ],
+  /* 6531 */  [ 0.465692943, 18 ],
+  /* 6532 */  [ 0.465788018, 18 ],
+  /* 6533 */  [ 0.465883099, 18 ],
+  /* 6534 */  [ 0.465978184, 18 ],
+  /* 6535 */  [ 0.466073275, 18 ],
+  /* 6536 */  [ 0.466168370, 18 ],
+  /* 6537 */  [ 0.466263470, 18 ],
+  /* 6538 */  [ 0.466358575, 18 ],
+  /* 6539 */  [ 0.466453684, 18 ],
+  /* 6540 */  [ 0.466548799, 18 ],
+  /* 6541 */  [ 0.466643918, 18 ],
+  /* 6542 */  [ 0.466739043, 18 ],
+  /* 6543 */  [ 0.466834172, 18 ],
+
+  /* 6544 */  [ 0.466929306, 18 ],
+  /* 6545 */  [ 0.467024445, 18 ],
+  /* 6546 */  [ 0.467119588, 18 ],
+  /* 6547 */  [ 0.467214737, 18 ],
+  /* 6548 */  [ 0.467309890, 18 ],
+  /* 6549 */  [ 0.467405048, 18 ],
+  /* 6550 */  [ 0.467500211, 18 ],
+  /* 6551 */  [ 0.467595379, 18 ],
+  /* 6552 */  [ 0.467690552, 18 ],
+  /* 6553 */  [ 0.467785729, 18 ],
+  /* 6554 */  [ 0.467880912, 18 ],
+  /* 6555 */  [ 0.467976099, 18 ],
+  /* 6556 */  [ 0.468071291, 18 ],
+  /* 6557 */  [ 0.468166488, 18 ],
+  /* 6558 */  [ 0.468261690, 18 ],
+  /* 6559 */  [ 0.468356896, 18 ],
+
+  /* 6560 */  [ 0.468452108, 18 ],
+  /* 6561 */  [ 0.468547324, 18 ],
+  /* 6562 */  [ 0.468642545, 18 ],
+  /* 6563 */  [ 0.468737771, 18 ],
+  /* 6564 */  [ 0.468833002, 18 ],
+  /* 6565 */  [ 0.468928237, 18 ],
+  /* 6566 */  [ 0.469023478, 18 ],
+  /* 6567 */  [ 0.469118723, 18 ],
+  /* 6568 */  [ 0.469213973, 18 ],
+  /* 6569 */  [ 0.469309228, 18 ],
+  /* 6570 */  [ 0.469404488, 18 ],
+  /* 6571 */  [ 0.469499752, 18 ],
+  /* 6572 */  [ 0.469595022, 18 ],
+  /* 6573 */  [ 0.469690296, 18 ],
+  /* 6574 */  [ 0.469785575, 18 ],
+  /* 6575 */  [ 0.469880859, 18 ],
+
+  /* 6576 */  [ 0.469976148, 18 ],
+  /* 6577 */  [ 0.470071442, 18 ],
+  /* 6578 */  [ 0.470166740, 18 ],
+  /* 6579 */  [ 0.470262043, 18 ],
+  /* 6580 */  [ 0.470357351, 18 ],
+  /* 6581 */  [ 0.470452664, 18 ],
+  /* 6582 */  [ 0.470547982, 18 ],
+  /* 6583 */  [ 0.470643305, 18 ],
+  /* 6584 */  [ 0.470738632, 18 ],
+  /* 6585 */  [ 0.470833964, 18 ],
+  /* 6586 */  [ 0.470929301, 18 ],
+  /* 6587 */  [ 0.471024643, 18 ],
+  /* 6588 */  [ 0.471119990, 18 ],
+  /* 6589 */  [ 0.471215341, 18 ],
+  /* 6590 */  [ 0.471310698, 18 ],
+  /* 6591 */  [ 0.471406059, 18 ],
+
+  /* 6592 */  [ 0.471501425, 18 ],
+  /* 6593 */  [ 0.471596796, 18 ],
+  /* 6594 */  [ 0.471692171, 18 ],
+  /* 6595 */  [ 0.471787552, 18 ],
+  /* 6596 */  [ 0.471882937, 18 ],
+  /* 6597 */  [ 0.471978327, 18 ],
+  /* 6598 */  [ 0.472073722, 18 ],
+  /* 6599 */  [ 0.472169122, 18 ],
+  /* 6600 */  [ 0.472264527, 18 ],
+  /* 6601 */  [ 0.472359936, 18 ],
+  /* 6602 */  [ 0.472455350, 18 ],
+  /* 6603 */  [ 0.472550769, 18 ],
+  /* 6604 */  [ 0.472646193, 18 ],
+  /* 6605 */  [ 0.472741622, 18 ],
+  /* 6606 */  [ 0.472837055, 18 ],
+  /* 6607 */  [ 0.472932493, 18 ],
+
+  /* 6608 */  [ 0.473027937, 18 ],
+  /* 6609 */  [ 0.473123384, 18 ],
+  /* 6610 */  [ 0.473218837, 18 ],
+  /* 6611 */  [ 0.473314295, 18 ],
+  /* 6612 */  [ 0.473409757, 18 ],
+  /* 6613 */  [ 0.473505224, 18 ],
+  /* 6614 */  [ 0.473600696, 18 ],
+  /* 6615 */  [ 0.473696173, 18 ],
+  /* 6616 */  [ 0.473791655, 18 ],
+  /* 6617 */  [ 0.473887141, 18 ],
+  /* 6618 */  [ 0.473982632, 18 ],
+  /* 6619 */  [ 0.474078128, 18 ],
+  /* 6620 */  [ 0.474173629, 18 ],
+  /* 6621 */  [ 0.474269135, 18 ],
+  /* 6622 */  [ 0.474364645, 18 ],
+  /* 6623 */  [ 0.474460161, 18 ],
+
+  /* 6624 */  [ 0.474555681, 18 ],
+  /* 6625 */  [ 0.474651205, 18 ],
+  /* 6626 */  [ 0.474746735, 18 ],
+  /* 6627 */  [ 0.474842270, 18 ],
+  /* 6628 */  [ 0.474937809, 18 ],
+  /* 6629 */  [ 0.475033353, 18 ],
+  /* 6630 */  [ 0.475128902, 18 ],
+  /* 6631 */  [ 0.475224456, 18 ],
+  /* 6632 */  [ 0.475320014, 18 ],
+  /* 6633 */  [ 0.475415578, 18 ],
+  /* 6634 */  [ 0.475511146, 18 ],
+  /* 6635 */  [ 0.475606719, 18 ],
+  /* 6636 */  [ 0.475702296, 18 ],
+  /* 6637 */  [ 0.475797879, 18 ],
+  /* 6638 */  [ 0.475893466, 18 ],
+  /* 6639 */  [ 0.475989058, 18 ],
+
+  /* 6640 */  [ 0.476084655, 18 ],
+  /* 6641 */  [ 0.476180257, 18 ],
+  /* 6642 */  [ 0.476275863, 18 ],
+  /* 6643 */  [ 0.476371475, 18 ],
+  /* 6644 */  [ 0.476467091, 18 ],
+  /* 6645 */  [ 0.476562712, 18 ],
+  /* 6646 */  [ 0.476658338, 18 ],
+  /* 6647 */  [ 0.476753968, 18 ],
+  /* 6648 */  [ 0.476849603, 18 ],
+  /* 6649 */  [ 0.476945243, 18 ],
+  /* 6650 */  [ 0.477040888, 18 ],
+  /* 6651 */  [ 0.477136538, 18 ],
+  /* 6652 */  [ 0.477232193, 18 ],
+  /* 6653 */  [ 0.477327852, 18 ],
+  /* 6654 */  [ 0.477423516, 18 ],
+  /* 6655 */  [ 0.477519185, 18 ],
+
+  /* 6656 */  [ 0.477614858, 18 ],
+  /* 6657 */  [ 0.477710537, 18 ],
+  /* 6658 */  [ 0.477806220, 18 ],
+  /* 6659 */  [ 0.477901908, 18 ],
+  /* 6660 */  [ 0.477997601, 18 ],
+  /* 6661 */  [ 0.478093299, 18 ],
+  /* 6662 */  [ 0.478189001, 18 ],
+  /* 6663 */  [ 0.478284708, 18 ],
+  /* 6664 */  [ 0.478380420, 18 ],
+  /* 6665 */  [ 0.478476137, 18 ],
+  /* 6666 */  [ 0.478571858, 18 ],
+  /* 6667 */  [ 0.478667585, 18 ],
+  /* 6668 */  [ 0.478763316, 18 ],
+  /* 6669 */  [ 0.478859052, 18 ],
+  /* 6670 */  [ 0.478954793, 18 ],
+  /* 6671 */  [ 0.479050538, 18 ],
+
+  /* 6672 */  [ 0.479146288, 18 ],
+  /* 6673 */  [ 0.479242043, 18 ],
+  /* 6674 */  [ 0.479337803, 18 ],
+  /* 6675 */  [ 0.479433568, 18 ],
+  /* 6676 */  [ 0.479529337, 18 ],
+  /* 6677 */  [ 0.479625111, 18 ],
+  /* 6678 */  [ 0.479720890, 18 ],
+  /* 6679 */  [ 0.479816674, 18 ],
+  /* 6680 */  [ 0.479912463, 18 ],
+  /* 6681 */  [ 0.480008256, 18 ],
+  /* 6682 */  [ 0.480104054, 18 ],
+  /* 6683 */  [ 0.480199857, 18 ],
+  /* 6684 */  [ 0.480295664, 18 ],
+  /* 6685 */  [ 0.480391477, 18 ],
+  /* 6686 */  [ 0.480487294, 18 ],
+  /* 6687 */  [ 0.480583116, 18 ],
+
+  /* 6688 */  [ 0.480678943, 18 ],
+  /* 6689 */  [ 0.480774774, 18 ],
+  /* 6690 */  [ 0.480870611, 18 ],
+  /* 6691 */  [ 0.480966452, 18 ],
+  /* 6692 */  [ 0.481062298, 18 ],
+  /* 6693 */  [ 0.481158148, 18 ],
+  /* 6694 */  [ 0.481254004, 18 ],
+  /* 6695 */  [ 0.481349864, 18 ],
+  /* 6696 */  [ 0.481445729, 18 ],
+  /* 6697 */  [ 0.481541598, 18 ],
+  /* 6698 */  [ 0.481637473, 18 ],
+  /* 6699 */  [ 0.481733352, 18 ],
+  /* 6700 */  [ 0.481829236, 18 ],
+  /* 6701 */  [ 0.481925125, 18 ],
+  /* 6702 */  [ 0.482021019, 18 ],
+  /* 6703 */  [ 0.482116917, 18 ],
+
+  /* 6704 */  [ 0.482212820, 18 ],
+  /* 6705 */  [ 0.482308728, 18 ],
+  /* 6706 */  [ 0.482404640, 18 ],
+  /* 6707 */  [ 0.482500558, 18 ],
+  /* 6708 */  [ 0.482596480, 18 ],
+  /* 6709 */  [ 0.482692407, 18 ],
+  /* 6710 */  [ 0.482788339, 18 ],
+  /* 6711 */  [ 0.482884275, 18 ],
+  /* 6712 */  [ 0.482980216, 18 ],
+  /* 6713 */  [ 0.483076162, 18 ],
+  /* 6714 */  [ 0.483172113, 18 ],
+  /* 6715 */  [ 0.483268069, 18 ],
+  /* 6716 */  [ 0.483364029, 18 ],
+  /* 6717 */  [ 0.483459994, 18 ],
+  /* 6718 */  [ 0.483555964, 18 ],
+  /* 6719 */  [ 0.483651939, 18 ],
+
+  /* 6720 */  [ 0.483747918, 18 ],
+  /* 6721 */  [ 0.483843902, 18 ],
+  /* 6722 */  [ 0.483939891, 18 ],
+  /* 6723 */  [ 0.484035885, 18 ],
+  /* 6724 */  [ 0.484131883, 18 ],
+  /* 6725 */  [ 0.484227886, 18 ],
+  /* 6726 */  [ 0.484323894, 18 ],
+  /* 6727 */  [ 0.484419907, 18 ],
+  /* 6728 */  [ 0.484515924, 18 ],
+  /* 6729 */  [ 0.484611946, 18 ],
+  /* 6730 */  [ 0.484707973, 18 ],
+  /* 6731 */  [ 0.484804005, 18 ],
+  /* 6732 */  [ 0.484900041, 18 ],
+  /* 6733 */  [ 0.484996083, 18 ],
+  /* 6734 */  [ 0.485092128, 18 ],
+  /* 6735 */  [ 0.485188179, 18 ],
+
+  /* 6736 */  [ 0.485284235, 18 ],
+  /* 6737 */  [ 0.485380295, 18 ],
+  /* 6738 */  [ 0.485476360, 18 ],
+  /* 6739 */  [ 0.485572430, 18 ],
+  /* 6740 */  [ 0.485668504, 18 ],
+  /* 6741 */  [ 0.485764583, 18 ],
+  /* 6742 */  [ 0.485860667, 18 ],
+  /* 6743 */  [ 0.485956756, 18 ],
+  /* 6744 */  [ 0.486052849, 18 ],
+  /* 6745 */  [ 0.486148948, 18 ],
+  /* 6746 */  [ 0.486245051, 18 ],
+  /* 6747 */  [ 0.486341158, 18 ],
+  /* 6748 */  [ 0.486437271, 18 ],
+  /* 6749 */  [ 0.486533388, 18 ],
+  /* 6750 */  [ 0.486629510, 18 ],
+  /* 6751 */  [ 0.486725637, 18 ],
+
+  /* 6752 */  [ 0.486821768, 18 ],
+  /* 6753 */  [ 0.486917905, 18 ],
+  /* 6754 */  [ 0.487014045, 18 ],
+  /* 6755 */  [ 0.487110191, 18 ],
+  /* 6756 */  [ 0.487206342, 18 ],
+  /* 6757 */  [ 0.487302497, 18 ],
+  /* 6758 */  [ 0.487398657, 18 ],
+  /* 6759 */  [ 0.487494821, 18 ],
+  /* 6760 */  [ 0.487590991, 18 ],
+  /* 6761 */  [ 0.487687165, 18 ],
+  /* 6762 */  [ 0.487783344, 18 ],
+  /* 6763 */  [ 0.487879528, 18 ],
+  /* 6764 */  [ 0.487975716, 18 ],
+  /* 6765 */  [ 0.488071909, 18 ],
+  /* 6766 */  [ 0.488168107, 18 ],
+  /* 6767 */  [ 0.488264310, 18 ],
+
+  /* 6768 */  [ 0.488360517, 18 ],
+  /* 6769 */  [ 0.488456729, 18 ],
+  /* 6770 */  [ 0.488552946, 18 ],
+  /* 6771 */  [ 0.488649167, 18 ],
+  /* 6772 */  [ 0.488745394, 18 ],
+  /* 6773 */  [ 0.488841625, 18 ],
+  /* 6774 */  [ 0.488937860, 18 ],
+  /* 6775 */  [ 0.489034101, 18 ],
+  /* 6776 */  [ 0.489130346, 18 ],
+  /* 6777 */  [ 0.489226596, 18 ],
+  /* 6778 */  [ 0.489322851, 18 ],
+  /* 6779 */  [ 0.489419110, 18 ],
+  /* 6780 */  [ 0.489515375, 18 ],
+  /* 6781 */  [ 0.489611643, 18 ],
+  /* 6782 */  [ 0.489707917, 18 ],
+  /* 6783 */  [ 0.489804195, 18 ],
+
+  /* 6784 */  [ 0.489900479, 18 ],
+  /* 6785 */  [ 0.489996766, 18 ],
+  /* 6786 */  [ 0.490093059, 18 ],
+  /* 6787 */  [ 0.490189356, 18 ],
+  /* 6788 */  [ 0.490285658, 18 ],
+  /* 6789 */  [ 0.490381965, 18 ],
+  /* 6790 */  [ 0.490478277, 18 ],
+  /* 6791 */  [ 0.490574593, 18 ],
+  /* 6792 */  [ 0.490670914, 18 ],
+  /* 6793 */  [ 0.490767239, 18 ],
+  /* 6794 */  [ 0.490863570, 18 ],
+  /* 6795 */  [ 0.490959905, 18 ],
+  /* 6796 */  [ 0.491056245, 18 ],
+  /* 6797 */  [ 0.491152589, 18 ],
+  /* 6798 */  [ 0.491248939, 18 ],
+  /* 6799 */  [ 0.491345293, 18 ],
+
+  /* 6800 */  [ 0.491441651, 18 ],
+  /* 6801 */  [ 0.491538015, 18 ],
+  /* 6802 */  [ 0.491634383, 18 ],
+  /* 6803 */  [ 0.491730756, 18 ],
+  /* 6804 */  [ 0.491827134, 18 ],
+  /* 6805 */  [ 0.491923516, 18 ],
+  /* 6806 */  [ 0.492019903, 18 ],
+  /* 6807 */  [ 0.492116295, 18 ],
+  /* 6808 */  [ 0.492212691, 18 ],
+  /* 6809 */  [ 0.492309093, 18 ],
+  /* 6810 */  [ 0.492405499, 18 ],
+  /* 6811 */  [ 0.492501909, 18 ],
+  /* 6812 */  [ 0.492598325, 18 ],
+  /* 6813 */  [ 0.492694745, 18 ],
+  /* 6814 */  [ 0.492791170, 18 ],
+  /* 6815 */  [ 0.492887599, 18 ],
+
+  /* 6816 */  [ 0.492984033, 18 ],
+  /* 6817 */  [ 0.493080472, 18 ],
+  /* 6818 */  [ 0.493176916, 18 ],
+  /* 6819 */  [ 0.493273365, 18 ],
+  /* 6820 */  [ 0.493369818, 18 ],
+  /* 6821 */  [ 0.493466275, 18 ],
+  /* 6822 */  [ 0.493562738, 18 ],
+  /* 6823 */  [ 0.493659205, 18 ],
+  /* 6824 */  [ 0.493755677, 18 ],
+  /* 6825 */  [ 0.493852154, 18 ],
+  /* 6826 */  [ 0.493948635, 18 ],
+  /* 6827 */  [ 0.494045122, 18 ],
+  /* 6828 */  [ 0.494141612, 18 ],
+  /* 6829 */  [ 0.494238108, 18 ],
+  /* 6830 */  [ 0.494334608, 18 ],
+  /* 6831 */  [ 0.494431113, 18 ],
+
+  /* 6832 */  [ 0.494527623, 18 ],
+  /* 6833 */  [ 0.494624137, 18 ],
+  /* 6834 */  [ 0.494720656, 18 ],
+  /* 6835 */  [ 0.494817180, 18 ],
+  /* 6836 */  [ 0.494913709, 18 ],
+  /* 6837 */  [ 0.495010242, 18 ],
+  /* 6838 */  [ 0.495106780, 18 ],
+  /* 6839 */  [ 0.495203322, 18 ],
+  /* 6840 */  [ 0.495299870, 18 ],
+  /* 6841 */  [ 0.495396422, 18 ],
+  /* 6842 */  [ 0.495492978, 18 ],
+  /* 6843 */  [ 0.495589540, 18 ],
+  /* 6844 */  [ 0.495686106, 18 ],
+  /* 6845 */  [ 0.495782677, 18 ],
+  /* 6846 */  [ 0.495879252, 18 ],
+  /* 6847 */  [ 0.495975833, 18 ],
+
+  /* 6848 */  [ 0.496072418, 18 ],
+  /* 6849 */  [ 0.496169007, 18 ],
+  /* 6850 */  [ 0.496265602, 18 ],
+  /* 6851 */  [ 0.496362201, 18 ],
+  /* 6852 */  [ 0.496458804, 18 ],
+  /* 6853 */  [ 0.496555413, 18 ],
+  /* 6854 */  [ 0.496652026, 18 ],
+  /* 6855 */  [ 0.496748644, 18 ],
+  /* 6856 */  [ 0.496845266, 18 ],
+  /* 6857 */  [ 0.496941894, 18 ],
+  /* 6858 */  [ 0.497038526, 18 ],
+  /* 6859 */  [ 0.497135162, 18 ],
+  /* 6860 */  [ 0.497231804, 18 ],
+  /* 6861 */  [ 0.497328450, 18 ],
+  /* 6862 */  [ 0.497425100, 18 ],
+  /* 6863 */  [ 0.497521756, 18 ],
+
+  /* 6864 */  [ 0.497618416, 18 ],
+  /* 6865 */  [ 0.497715081, 18 ],
+  /* 6866 */  [ 0.497811750, 18 ],
+  /* 6867 */  [ 0.497908425, 18 ],
+  /* 6868 */  [ 0.498005103, 18 ],
+  /* 6869 */  [ 0.498101787, 18 ],
+  /* 6870 */  [ 0.498198475, 18 ],
+  /* 6871 */  [ 0.498295168, 18 ],
+  /* 6872 */  [ 0.498391866, 18 ],
+  /* 6873 */  [ 0.498488568, 18 ],
+  /* 6874 */  [ 0.498585275, 18 ],
+  /* 6875 */  [ 0.498681987, 18 ],
+  /* 6876 */  [ 0.498778704, 18 ],
+  /* 6877 */  [ 0.498875425, 18 ],
+  /* 6878 */  [ 0.498972150, 18 ],
+  /* 6879 */  [ 0.499068881, 18 ],
+
+  /* 6880 */  [ 0.499165616, 18 ],
+  /* 6881 */  [ 0.499262356, 18 ],
+  /* 6882 */  [ 0.499359101, 18 ],
+  /* 6883 */  [ 0.499455850, 18 ],
+  /* 6884 */  [ 0.499552604, 18 ],
+  /* 6885 */  [ 0.499649362, 18 ],
+  /* 6886 */  [ 0.499746126, 18 ],
+  /* 6887 */  [ 0.499842894, 18 ],
+  /* 6888 */  [ 0.499939666, 18 ],
+  /* 6889 */  [ 0.250018222, 19 ],
+  /* 6890 */  [ 0.250066613, 19 ],
+  /* 6891 */  [ 0.250115006, 19 ],
+  /* 6892 */  [ 0.250163402, 19 ],
+  /* 6893 */  [ 0.250211800, 19 ],
+  /* 6894 */  [ 0.250260200, 19 ],
+  /* 6895 */  [ 0.250308603, 19 ],
+
+  /* 6896 */  [ 0.250357008, 19 ],
+  /* 6897 */  [ 0.250405415, 19 ],
+  /* 6898 */  [ 0.250453825, 19 ],
+  /* 6899 */  [ 0.250502237, 19 ],
+  /* 6900 */  [ 0.250550652, 19 ],
+  /* 6901 */  [ 0.250599068, 19 ],
+  /* 6902 */  [ 0.250647488, 19 ],
+  /* 6903 */  [ 0.250695909, 19 ],
+  /* 6904 */  [ 0.250744333, 19 ],
+  /* 6905 */  [ 0.250792759, 19 ],
+  /* 6906 */  [ 0.250841187, 19 ],
+  /* 6907 */  [ 0.250889618, 19 ],
+  /* 6908 */  [ 0.250938051, 19 ],
+  /* 6909 */  [ 0.250986487, 19 ],
+  /* 6910 */  [ 0.251034924, 19 ],
+  /* 6911 */  [ 0.251083365, 19 ],
+
+  /* 6912 */  [ 0.251131807, 19 ],
+  /* 6913 */  [ 0.251180252, 19 ],
+  /* 6914 */  [ 0.251228699, 19 ],
+  /* 6915 */  [ 0.251277148, 19 ],
+  /* 6916 */  [ 0.251325600, 19 ],
+  /* 6917 */  [ 0.251374054, 19 ],
+  /* 6918 */  [ 0.251422511, 19 ],
+  /* 6919 */  [ 0.251470970, 19 ],
+  /* 6920 */  [ 0.251519431, 19 ],
+  /* 6921 */  [ 0.251567894, 19 ],
+  /* 6922 */  [ 0.251616360, 19 ],
+  /* 6923 */  [ 0.251664828, 19 ],
+  /* 6924 */  [ 0.251713299, 19 ],
+  /* 6925 */  [ 0.251761772, 19 ],
+  /* 6926 */  [ 0.251810247, 19 ],
+  /* 6927 */  [ 0.251858724, 19 ],
+
+  /* 6928 */  [ 0.251907204, 19 ],
+  /* 6929 */  [ 0.251955686, 19 ],
+  /* 6930 */  [ 0.252004171, 19 ],
+  /* 6931 */  [ 0.252052658, 19 ],
+  /* 6932 */  [ 0.252101147, 19 ],
+  /* 6933 */  [ 0.252149638, 19 ],
+  /* 6934 */  [ 0.252198132, 19 ],
+  /* 6935 */  [ 0.252246628, 19 ],
+  /* 6936 */  [ 0.252295127, 19 ],
+  /* 6937 */  [ 0.252343627, 19 ],
+  /* 6938 */  [ 0.252392131, 19 ],
+  /* 6939 */  [ 0.252440636, 19 ],
+  /* 6940 */  [ 0.252489144, 19 ],
+  /* 6941 */  [ 0.252537654, 19 ],
+  /* 6942 */  [ 0.252586166, 19 ],
+  /* 6943 */  [ 0.252634681, 19 ],
+
+  /* 6944 */  [ 0.252683198, 19 ],
+  /* 6945 */  [ 0.252731718, 19 ],
+  /* 6946 */  [ 0.252780240, 19 ],
+  /* 6947 */  [ 0.252828764, 19 ],
+  /* 6948 */  [ 0.252877290, 19 ],
+  /* 6949 */  [ 0.252925819, 19 ],
+  /* 6950 */  [ 0.252974350, 19 ],
+  /* 6951 */  [ 0.253022883, 19 ],
+  /* 6952 */  [ 0.253071419, 19 ],
+  /* 6953 */  [ 0.253119957, 19 ],
+  /* 6954 */  [ 0.253168498, 19 ],
+  /* 6955 */  [ 0.253217040, 19 ],
+  /* 6956 */  [ 0.253265585, 19 ],
+  /* 6957 */  [ 0.253314133, 19 ],
+  /* 6958 */  [ 0.253362682, 19 ],
+  /* 6959 */  [ 0.253411234, 19 ],
+
+  /* 6960 */  [ 0.253459789, 19 ],
+  /* 6961 */  [ 0.253508345, 19 ],
+  /* 6962 */  [ 0.253556904, 19 ],
+  /* 6963 */  [ 0.253605466, 19 ],
+  /* 6964 */  [ 0.253654029, 19 ],
+  /* 6965 */  [ 0.253702595, 19 ],
+  /* 6966 */  [ 0.253751164, 19 ],
+  /* 6967 */  [ 0.253799734, 19 ],
+  /* 6968 */  [ 0.253848307, 19 ],
+  /* 6969 */  [ 0.253896883, 19 ],
+  /* 6970 */  [ 0.253945460, 19 ],
+  /* 6971 */  [ 0.253994040, 19 ],
+  /* 6972 */  [ 0.254042622, 19 ],
+  /* 6973 */  [ 0.254091207, 19 ],
+  /* 6974 */  [ 0.254139794, 19 ],
+  /* 6975 */  [ 0.254188383, 19 ],
+
+  /* 6976 */  [ 0.254236974, 19 ],
+  /* 6977 */  [ 0.254285568, 19 ],
+  /* 6978 */  [ 0.254334165, 19 ],
+  /* 6979 */  [ 0.254382763, 19 ],
+  /* 6980 */  [ 0.254431364, 19 ],
+  /* 6981 */  [ 0.254479967, 19 ],
+  /* 6982 */  [ 0.254528572, 19 ],
+  /* 6983 */  [ 0.254577180, 19 ],
+  /* 6984 */  [ 0.254625790, 19 ],
+  /* 6985 */  [ 0.254674403, 19 ],
+  /* 6986 */  [ 0.254723017, 19 ],
+  /* 6987 */  [ 0.254771635, 19 ],
+  /* 6988 */  [ 0.254820254, 19 ],
+  /* 6989 */  [ 0.254868876, 19 ],
+  /* 6990 */  [ 0.254917500, 19 ],
+  /* 6991 */  [ 0.254966126, 19 ],
+
+  /* 6992 */  [ 0.255014755, 19 ],
+  /* 6993 */  [ 0.255063386, 19 ],
+  /* 6994 */  [ 0.255112019, 19 ],
+  /* 6995 */  [ 0.255160655, 19 ],
+  /* 6996 */  [ 0.255209292, 19 ],
+  /* 6997 */  [ 0.255257933, 19 ],
+  /* 6998 */  [ 0.255306575, 19 ],
+  /* 6999 */  [ 0.255355220, 19 ],
+  /* 7000 */  [ 0.255403867, 19 ],
+  /* 7001 */  [ 0.255452517, 19 ],
+  /* 7002 */  [ 0.255501169, 19 ],
+  /* 7003 */  [ 0.255549823, 19 ],
+  /* 7004 */  [ 0.255598479, 19 ],
+  /* 7005 */  [ 0.255647138, 19 ],
+  /* 7006 */  [ 0.255695799, 19 ],
+  /* 7007 */  [ 0.255744463, 19 ],
+
+  /* 7008 */  [ 0.255793128, 19 ],
+  /* 7009 */  [ 0.255841796, 19 ],
+  /* 7010 */  [ 0.255890467, 19 ],
+  /* 7011 */  [ 0.255939139, 19 ],
+  /* 7012 */  [ 0.255987814, 19 ],
+  /* 7013 */  [ 0.256036492, 19 ],
+  /* 7014 */  [ 0.256085171, 19 ],
+  /* 7015 */  [ 0.256133853, 19 ],
+  /* 7016 */  [ 0.256182537, 19 ],
+  /* 7017 */  [ 0.256231224, 19 ],
+  /* 7018 */  [ 0.256279913, 19 ],
+  /* 7019 */  [ 0.256328604, 19 ],
+  /* 7020 */  [ 0.256377297, 19 ],
+  /* 7021 */  [ 0.256425993, 19 ],
+  /* 7022 */  [ 0.256474691, 19 ],
+  /* 7023 */  [ 0.256523392, 19 ],
+
+  /* 7024 */  [ 0.256572095, 19 ],
+  /* 7025 */  [ 0.256620800, 19 ],
+  /* 7026 */  [ 0.256669507, 19 ],
+  /* 7027 */  [ 0.256718217, 19 ],
+  /* 7028 */  [ 0.256766929, 19 ],
+  /* 7029 */  [ 0.256815643, 19 ],
+  /* 7030 */  [ 0.256864359, 19 ],
+  /* 7031 */  [ 0.256913078, 19 ],
+  /* 7032 */  [ 0.256961800, 19 ],
+  /* 7033 */  [ 0.257010523, 19 ],
+  /* 7034 */  [ 0.257059249, 19 ],
+  /* 7035 */  [ 0.257107977, 19 ],
+  /* 7036 */  [ 0.257156708, 19 ],
+  /* 7037 */  [ 0.257205440, 19 ],
+  /* 7038 */  [ 0.257254175, 19 ],
+  /* 7039 */  [ 0.257302913, 19 ],
+
+  /* 7040 */  [ 0.257351652, 19 ],
+  /* 7041 */  [ 0.257400394, 19 ],
+  /* 7042 */  [ 0.257449139, 19 ],
+  /* 7043 */  [ 0.257497885, 19 ],
+  /* 7044 */  [ 0.257546634, 19 ],
+  /* 7045 */  [ 0.257595386, 19 ],
+  /* 7046 */  [ 0.257644139, 19 ],
+  /* 7047 */  [ 0.257692895, 19 ],
+  /* 7048 */  [ 0.257741653, 19 ],
+  /* 7049 */  [ 0.257790414, 19 ],
+  /* 7050 */  [ 0.257839176, 19 ],
+  /* 7051 */  [ 0.257887941, 19 ],
+  /* 7052 */  [ 0.257936709, 19 ],
+  /* 7053 */  [ 0.257985478, 19 ],
+  /* 7054 */  [ 0.258034250, 19 ],
+  /* 7055 */  [ 0.258083025, 19 ],
+
+  /* 7056 */  [ 0.258131801, 19 ],
+  /* 7057 */  [ 0.258180580, 19 ],
+  /* 7058 */  [ 0.258229361, 19 ],
+  /* 7059 */  [ 0.258278145, 19 ],
+  /* 7060 */  [ 0.258326931, 19 ],
+  /* 7061 */  [ 0.258375719, 19 ],
+  /* 7062 */  [ 0.258424509, 19 ],
+  /* 7063 */  [ 0.258473302, 19 ],
+  /* 7064 */  [ 0.258522097, 19 ],
+  /* 7065 */  [ 0.258570894, 19 ],
+  /* 7066 */  [ 0.258619694, 19 ],
+  /* 7067 */  [ 0.258668496, 19 ],
+  /* 7068 */  [ 0.258717300, 19 ],
+  /* 7069 */  [ 0.258766106, 19 ],
+  /* 7070 */  [ 0.258814915, 19 ],
+  /* 7071 */  [ 0.258863726, 19 ],
+
+  /* 7072 */  [ 0.258912540, 19 ],
+  /* 7073 */  [ 0.258961356, 19 ],
+  /* 7074 */  [ 0.259010174, 19 ],
+  /* 7075 */  [ 0.259058994, 19 ],
+  /* 7076 */  [ 0.259107817, 19 ],
+  /* 7077 */  [ 0.259156642, 19 ],
+  /* 7078 */  [ 0.259205469, 19 ],
+  /* 7079 */  [ 0.259254298, 19 ],
+  /* 7080 */  [ 0.259303130, 19 ],
+  /* 7081 */  [ 0.259351964, 19 ],
+  /* 7082 */  [ 0.259400801, 19 ],
+  /* 7083 */  [ 0.259449639, 19 ],
+  /* 7084 */  [ 0.259498480, 19 ],
+  /* 7085 */  [ 0.259547324, 19 ],
+  /* 7086 */  [ 0.259596169, 19 ],
+  /* 7087 */  [ 0.259645017, 19 ],
+
+  /* 7088 */  [ 0.259693868, 19 ],
+  /* 7089 */  [ 0.259742720, 19 ],
+  /* 7090 */  [ 0.259791575, 19 ],
+  /* 7091 */  [ 0.259840432, 19 ],
+  /* 7092 */  [ 0.259889291, 19 ],
+  /* 7093 */  [ 0.259938153, 19 ],
+  /* 7094 */  [ 0.259987017, 19 ],
+  /* 7095 */  [ 0.260035883, 19 ],
+  /* 7096 */  [ 0.260084752, 19 ],
+  /* 7097 */  [ 0.260133623, 19 ],
+  /* 7098 */  [ 0.260182496, 19 ],
+  /* 7099 */  [ 0.260231372, 19 ],
+  /* 7100 */  [ 0.260280249, 19 ],
+  /* 7101 */  [ 0.260329129, 19 ],
+  /* 7102 */  [ 0.260378012, 19 ],
+  /* 7103 */  [ 0.260426896, 19 ],
+
+  /* 7104 */  [ 0.260475783, 19 ],
+  /* 7105 */  [ 0.260524673, 19 ],
+  /* 7106 */  [ 0.260573564, 19 ],
+  /* 7107 */  [ 0.260622458, 19 ],
+  /* 7108 */  [ 0.260671354, 19 ],
+  /* 7109 */  [ 0.260720252, 19 ],
+  /* 7110 */  [ 0.260769153, 19 ],
+  /* 7111 */  [ 0.260818056, 19 ],
+  /* 7112 */  [ 0.260866961, 19 ],
+  /* 7113 */  [ 0.260915869, 19 ],
+  /* 7114 */  [ 0.260964779, 19 ],
+  /* 7115 */  [ 0.261013691, 19 ],
+  /* 7116 */  [ 0.261062606, 19 ],
+  /* 7117 */  [ 0.261111522, 19 ],
+  /* 7118 */  [ 0.261160441, 19 ],
+  /* 7119 */  [ 0.261209363, 19 ],
+
+  /* 7120 */  [ 0.261258286, 19 ],
+  /* 7121 */  [ 0.261307212, 19 ],
+  /* 7122 */  [ 0.261356140, 19 ],
+  /* 7123 */  [ 0.261405071, 19 ],
+  /* 7124 */  [ 0.261454004, 19 ],
+  /* 7125 */  [ 0.261502939, 19 ],
+  /* 7126 */  [ 0.261551876, 19 ],
+  /* 7127 */  [ 0.261600816, 19 ],
+  /* 7128 */  [ 0.261649758, 19 ],
+  /* 7129 */  [ 0.261698702, 19 ],
+  /* 7130 */  [ 0.261747649, 19 ],
+  /* 7131 */  [ 0.261796597, 19 ],
+  /* 7132 */  [ 0.261845548, 19 ],
+  /* 7133 */  [ 0.261894502, 19 ],
+  /* 7134 */  [ 0.261943458, 19 ],
+  /* 7135 */  [ 0.261992416, 19 ],
+
+  /* 7136 */  [ 0.262041376, 19 ],
+  /* 7137 */  [ 0.262090338, 19 ],
+  /* 7138 */  [ 0.262139303, 19 ],
+  /* 7139 */  [ 0.262188270, 19 ],
+  /* 7140 */  [ 0.262237240, 19 ],
+  /* 7141 */  [ 0.262286211, 19 ],
+  /* 7142 */  [ 0.262335185, 19 ],
+  /* 7143 */  [ 0.262384162, 19 ],
+  /* 7144 */  [ 0.262433140, 19 ],
+  /* 7145 */  [ 0.262482121, 19 ],
+  /* 7146 */  [ 0.262531104, 19 ],
+  /* 7147 */  [ 0.262580089, 19 ],
+  /* 7148 */  [ 0.262629077, 19 ],
+  /* 7149 */  [ 0.262678067, 19 ],
+  /* 7150 */  [ 0.262727059, 19 ],
+  /* 7151 */  [ 0.262776054, 19 ],
+
+  /* 7152 */  [ 0.262825051, 19 ],
+  /* 7153 */  [ 0.262874050, 19 ],
+  /* 7154 */  [ 0.262923051, 19 ],
+  /* 7155 */  [ 0.262972055, 19 ],
+  /* 7156 */  [ 0.263021061, 19 ],
+  /* 7157 */  [ 0.263070069, 19 ],
+  /* 7158 */  [ 0.263119079, 19 ],
+  /* 7159 */  [ 0.263168092, 19 ],
+  /* 7160 */  [ 0.263217107, 19 ],
+  /* 7161 */  [ 0.263266125, 19 ],
+  /* 7162 */  [ 0.263315144, 19 ],
+  /* 7163 */  [ 0.263364166, 19 ],
+  /* 7164 */  [ 0.263413191, 19 ],
+  /* 7165 */  [ 0.263462217, 19 ],
+  /* 7166 */  [ 0.263511246, 19 ],
+  /* 7167 */  [ 0.263560277, 19 ],
+
+  /* 7168 */  [ 0.263609310, 19 ],
+  /* 7169 */  [ 0.263658346, 19 ],
+  /* 7170 */  [ 0.263707384, 19 ],
+  /* 7171 */  [ 0.263756424, 19 ],
+  /* 7172 */  [ 0.263805466, 19 ],
+  /* 7173 */  [ 0.263854511, 19 ],
+  /* 7174 */  [ 0.263903558, 19 ],
+  /* 7175 */  [ 0.263952607, 19 ],
+  /* 7176 */  [ 0.264001659, 19 ],
+  /* 7177 */  [ 0.264050713, 19 ],
+  /* 7178 */  [ 0.264099769, 19 ],
+  /* 7179 */  [ 0.264148827, 19 ],
+  /* 7180 */  [ 0.264197888, 19 ],
+  /* 7181 */  [ 0.264246951, 19 ],
+  /* 7182 */  [ 0.264296016, 19 ],
+  /* 7183 */  [ 0.264345084, 19 ],
+
+  /* 7184 */  [ 0.264394153, 19 ],
+  /* 7185 */  [ 0.264443225, 19 ],
+  /* 7186 */  [ 0.264492300, 19 ],
+  /* 7187 */  [ 0.264541376, 19 ],
+  /* 7188 */  [ 0.264590455, 19 ],
+  /* 7189 */  [ 0.264639536, 19 ],
+  /* 7190 */  [ 0.264688620, 19 ],
+  /* 7191 */  [ 0.264737706, 19 ],
+  /* 7192 */  [ 0.264786794, 19 ],
+  /* 7193 */  [ 0.264835884, 19 ],
+  /* 7194 */  [ 0.264884976, 19 ],
+  /* 7195 */  [ 0.264934071, 19 ],
+  /* 7196 */  [ 0.264983168, 19 ],
+  /* 7197 */  [ 0.265032268, 19 ],
+  /* 7198 */  [ 0.265081369, 19 ],
+  /* 7199 */  [ 0.265130473, 19 ],
+
+  /* 7200 */  [ 0.265179580, 19 ],
+  /* 7201 */  [ 0.265228688, 19 ],
+  /* 7202 */  [ 0.265277799, 19 ],
+  /* 7203 */  [ 0.265326912, 19 ],
+  /* 7204 */  [ 0.265376027, 19 ],
+  /* 7205 */  [ 0.265425145, 19 ],
+  /* 7206 */  [ 0.265474264, 19 ],
+  /* 7207 */  [ 0.265523387, 19 ],
+  /* 7208 */  [ 0.265572511, 19 ],
+  /* 7209 */  [ 0.265621638, 19 ],
+  /* 7210 */  [ 0.265670766, 19 ],
+  /* 7211 */  [ 0.265719898, 19 ],
+  /* 7212 */  [ 0.265769031, 19 ],
+  /* 7213 */  [ 0.265818167, 19 ],
+  /* 7214 */  [ 0.265867305, 19 ],
+  /* 7215 */  [ 0.265916445, 19 ],
+
+  /* 7216 */  [ 0.265965588, 19 ],
+  /* 7217 */  [ 0.266014732, 19 ],
+  /* 7218 */  [ 0.266063880, 19 ],
+  /* 7219 */  [ 0.266113029, 19 ],
+  /* 7220 */  [ 0.266162181, 19 ],
+  /* 7221 */  [ 0.266211334, 19 ],
+  /* 7222 */  [ 0.266260491, 19 ],
+  /* 7223 */  [ 0.266309649, 19 ],
+  /* 7224 */  [ 0.266358810, 19 ],
+  /* 7225 */  [ 0.266407973, 19 ],
+  /* 7226 */  [ 0.266457138, 19 ],
+  /* 7227 */  [ 0.266506305, 19 ],
+  /* 7228 */  [ 0.266555475, 19 ],
+  /* 7229 */  [ 0.266604647, 19 ],
+  /* 7230 */  [ 0.266653822, 19 ],
+  /* 7231 */  [ 0.266702998, 19 ],
+
+  /* 7232 */  [ 0.266752177, 19 ],
+  /* 7233 */  [ 0.266801358, 19 ],
+  /* 7234 */  [ 0.266850541, 19 ],
+  /* 7235 */  [ 0.266899727, 19 ],
+  /* 7236 */  [ 0.266948915, 19 ],
+  /* 7237 */  [ 0.266998105, 19 ],
+  /* 7238 */  [ 0.267047298, 19 ],
+  /* 7239 */  [ 0.267096492, 19 ],
+  /* 7240 */  [ 0.267145689, 19 ],
+  /* 7241 */  [ 0.267194888, 19 ],
+  /* 7242 */  [ 0.267244090, 19 ],
+  /* 7243 */  [ 0.267293294, 19 ],
+  /* 7244 */  [ 0.267342500, 19 ],
+  /* 7245 */  [ 0.267391708, 19 ],
+  /* 7246 */  [ 0.267440919, 19 ],
+  /* 7247 */  [ 0.267490131, 19 ],
+
+  /* 7248 */  [ 0.267539347, 19 ],
+  /* 7249 */  [ 0.267588564, 19 ],
+  /* 7250 */  [ 0.267637783, 19 ],
+  /* 7251 */  [ 0.267687005, 19 ],
+  /* 7252 */  [ 0.267736229, 19 ],
+  /* 7253 */  [ 0.267785456, 19 ],
+  /* 7254 */  [ 0.267834685, 19 ],
+  /* 7255 */  [ 0.267883915, 19 ],
+  /* 7256 */  [ 0.267933149, 19 ],
+  /* 7257 */  [ 0.267982384, 19 ],
+  /* 7258 */  [ 0.268031622, 19 ],
+  /* 7259 */  [ 0.268080862, 19 ],
+  /* 7260 */  [ 0.268130104, 19 ],
+  /* 7261 */  [ 0.268179349, 19 ],
+  /* 7262 */  [ 0.268228595, 19 ],
+  /* 7263 */  [ 0.268277844, 19 ],
+
+  /* 7264 */  [ 0.268327096, 19 ],
+  /* 7265 */  [ 0.268376349, 19 ],
+  /* 7266 */  [ 0.268425605, 19 ],
+  /* 7267 */  [ 0.268474863, 19 ],
+  /* 7268 */  [ 0.268524123, 19 ],
+  /* 7269 */  [ 0.268573386, 19 ],
+  /* 7270 */  [ 0.268622651, 19 ],
+  /* 7271 */  [ 0.268671918, 19 ],
+  /* 7272 */  [ 0.268721187, 19 ],
+  /* 7273 */  [ 0.268770459, 19 ],
+  /* 7274 */  [ 0.268819733, 19 ],
+  /* 7275 */  [ 0.268869009, 19 ],
+  /* 7276 */  [ 0.268918287, 19 ],
+  /* 7277 */  [ 0.268967568, 19 ],
+  /* 7278 */  [ 0.269016851, 19 ],
+  /* 7279 */  [ 0.269066136, 19 ],
+
+  /* 7280 */  [ 0.269115423, 19 ],
+  /* 7281 */  [ 0.269164713, 19 ],
+  /* 7282 */  [ 0.269214005, 19 ],
+  /* 7283 */  [ 0.269263299, 19 ],
+  /* 7284 */  [ 0.269312595, 19 ],
+  /* 7285 */  [ 0.269361894, 19 ],
+  /* 7286 */  [ 0.269411195, 19 ],
+  /* 7287 */  [ 0.269460498, 19 ],
+  /* 7288 */  [ 0.269509804, 19 ],
+  /* 7289 */  [ 0.269559111, 19 ],
+  /* 7290 */  [ 0.269608421, 19 ],
+  /* 7291 */  [ 0.269657734, 19 ],
+  /* 7292 */  [ 0.269707048, 19 ],
+  /* 7293 */  [ 0.269756365, 19 ],
+  /* 7294 */  [ 0.269805684, 19 ],
+  /* 7295 */  [ 0.269855005, 19 ],
+
+  /* 7296 */  [ 0.269904329, 19 ],
+  /* 7297 */  [ 0.269953654, 19 ],
+  /* 7298 */  [ 0.270002982, 19 ],
+  /* 7299 */  [ 0.270052313, 19 ],
+  /* 7300 */  [ 0.270101645, 19 ],
+  /* 7301 */  [ 0.270150980, 19 ],
+  /* 7302 */  [ 0.270200317, 19 ],
+  /* 7303 */  [ 0.270249656, 19 ],
+  /* 7304 */  [ 0.270298998, 19 ],
+  /* 7305 */  [ 0.270348341, 19 ],
+  /* 7306 */  [ 0.270397687, 19 ],
+  /* 7307 */  [ 0.270447036, 19 ],
+  /* 7308 */  [ 0.270496386, 19 ],
+  /* 7309 */  [ 0.270545739, 19 ],
+  /* 7310 */  [ 0.270595094, 19 ],
+  /* 7311 */  [ 0.270644451, 19 ],
+
+  /* 7312 */  [ 0.270693811, 19 ],
+  /* 7313 */  [ 0.270743173, 19 ],
+  /* 7314 */  [ 0.270792537, 19 ],
+  /* 7315 */  [ 0.270841903, 19 ],
+  /* 7316 */  [ 0.270891271, 19 ],
+  /* 7317 */  [ 0.270940642, 19 ],
+  /* 7318 */  [ 0.270990015, 19 ],
+  /* 7319 */  [ 0.271039390, 19 ],
+  /* 7320 */  [ 0.271088768, 19 ],
+  /* 7321 */  [ 0.271138148, 19 ],
+  /* 7322 */  [ 0.271187530, 19 ],
+  /* 7323 */  [ 0.271236914, 19 ],
+  /* 7324 */  [ 0.271286301, 19 ],
+  /* 7325 */  [ 0.271335689, 19 ],
+  /* 7326 */  [ 0.271385080, 19 ],
+  /* 7327 */  [ 0.271434474, 19 ],
+
+  /* 7328 */  [ 0.271483869, 19 ],
+  /* 7329 */  [ 0.271533267, 19 ],
+  /* 7330 */  [ 0.271582667, 19 ],
+  /* 7331 */  [ 0.271632069, 19 ],
+  /* 7332 */  [ 0.271681474, 19 ],
+  /* 7333 */  [ 0.271730880, 19 ],
+  /* 7334 */  [ 0.271780289, 19 ],
+  /* 7335 */  [ 0.271829701, 19 ],
+  /* 7336 */  [ 0.271879114, 19 ],
+  /* 7337 */  [ 0.271928530, 19 ],
+  /* 7338 */  [ 0.271977948, 19 ],
+  /* 7339 */  [ 0.272027368, 19 ],
+  /* 7340 */  [ 0.272076790, 19 ],
+  /* 7341 */  [ 0.272126215, 19 ],
+  /* 7342 */  [ 0.272175642, 19 ],
+  /* 7343 */  [ 0.272225071, 19 ],
+
+  /* 7344 */  [ 0.272274503, 19 ],
+  /* 7345 */  [ 0.272323936, 19 ],
+  /* 7346 */  [ 0.272373372, 19 ],
+  /* 7347 */  [ 0.272422810, 19 ],
+  /* 7348 */  [ 0.272472251, 19 ],
+  /* 7349 */  [ 0.272521693, 19 ],
+  /* 7350 */  [ 0.272571138, 19 ],
+  /* 7351 */  [ 0.272620585, 19 ],
+  /* 7352 */  [ 0.272670035, 19 ],
+  /* 7353 */  [ 0.272719486, 19 ],
+  /* 7354 */  [ 0.272768940, 19 ],
+  /* 7355 */  [ 0.272818396, 19 ],
+  /* 7356 */  [ 0.272867855, 19 ],
+  /* 7357 */  [ 0.272917315, 19 ],
+  /* 7358 */  [ 0.272966778, 19 ],
+  /* 7359 */  [ 0.273016243, 19 ],
+
+  /* 7360 */  [ 0.273065710, 19 ],
+  /* 7361 */  [ 0.273115180, 19 ],
+  /* 7362 */  [ 0.273164652, 19 ],
+  /* 7363 */  [ 0.273214126, 19 ],
+  /* 7364 */  [ 0.273263602, 19 ],
+  /* 7365 */  [ 0.273313081, 19 ],
+  /* 7366 */  [ 0.273362561, 19 ],
+  /* 7367 */  [ 0.273412044, 19 ],
+  /* 7368 */  [ 0.273461530, 19 ],
+  /* 7369 */  [ 0.273511017, 19 ],
+  /* 7370 */  [ 0.273560507, 19 ],
+  /* 7371 */  [ 0.273609999, 19 ],
+  /* 7372 */  [ 0.273659493, 19 ],
+  /* 7373 */  [ 0.273708989, 19 ],
+  /* 7374 */  [ 0.273758488, 19 ],
+  /* 7375 */  [ 0.273807989, 19 ],
+
+  /* 7376 */  [ 0.273857492, 19 ],
+  /* 7377 */  [ 0.273906997, 19 ],
+  /* 7378 */  [ 0.273956505, 19 ],
+  /* 7379 */  [ 0.274006015, 19 ],
+  /* 7380 */  [ 0.274055527, 19 ],
+  /* 7381 */  [ 0.274105041, 19 ],
+  /* 7382 */  [ 0.274154558, 19 ],
+  /* 7383 */  [ 0.274204076, 19 ],
+  /* 7384 */  [ 0.274253597, 19 ],
+  /* 7385 */  [ 0.274303121, 19 ],
+  /* 7386 */  [ 0.274352646, 19 ],
+  /* 7387 */  [ 0.274402174, 19 ],
+  /* 7388 */  [ 0.274451704, 19 ],
+  /* 7389 */  [ 0.274501236, 19 ],
+  /* 7390 */  [ 0.274550771, 19 ],
+  /* 7391 */  [ 0.274600307, 19 ],
+
+  /* 7392 */  [ 0.274649846, 19 ],
+  /* 7393 */  [ 0.274699387, 19 ],
+  /* 7394 */  [ 0.274748931, 19 ],
+  /* 7395 */  [ 0.274798476, 19 ],
+  /* 7396 */  [ 0.274848024, 19 ],
+  /* 7397 */  [ 0.274897574, 19 ],
+  /* 7398 */  [ 0.274947126, 19 ],
+  /* 7399 */  [ 0.274996681, 19 ],
+  /* 7400 */  [ 0.275046238, 19 ],
+  /* 7401 */  [ 0.275095797, 19 ],
+  /* 7402 */  [ 0.275145358, 19 ],
+  /* 7403 */  [ 0.275194921, 19 ],
+  /* 7404 */  [ 0.275244487, 19 ],
+  /* 7405 */  [ 0.275294055, 19 ],
+  /* 7406 */  [ 0.275343625, 19 ],
+  /* 7407 */  [ 0.275393198, 19 ],
+
+  /* 7408 */  [ 0.275442772, 19 ],
+  /* 7409 */  [ 0.275492349, 19 ],
+  /* 7410 */  [ 0.275541928, 19 ],
+  /* 7411 */  [ 0.275591509, 19 ],
+  /* 7412 */  [ 0.275641093, 19 ],
+  /* 7413 */  [ 0.275690679, 19 ],
+  /* 7414 */  [ 0.275740267, 19 ],
+  /* 7415 */  [ 0.275789857, 19 ],
+  /* 7416 */  [ 0.275839449, 19 ],
+  /* 7417 */  [ 0.275889044, 19 ],
+  /* 7418 */  [ 0.275938641, 19 ],
+  /* 7419 */  [ 0.275988240, 19 ],
+  /* 7420 */  [ 0.276037842, 19 ],
+  /* 7421 */  [ 0.276087445, 19 ],
+  /* 7422 */  [ 0.276137051, 19 ],
+  /* 7423 */  [ 0.276186659, 19 ],
+
+  /* 7424 */  [ 0.276236269, 19 ],
+  /* 7425 */  [ 0.276285882, 19 ],
+  /* 7426 */  [ 0.276335497, 19 ],
+  /* 7427 */  [ 0.276385113, 19 ],
+  /* 7428 */  [ 0.276434733, 19 ],
+  /* 7429 */  [ 0.276484354, 19 ],
+  /* 7430 */  [ 0.276533978, 19 ],
+  /* 7431 */  [ 0.276583604, 19 ],
+  /* 7432 */  [ 0.276633232, 19 ],
+  /* 7433 */  [ 0.276682862, 19 ],
+  /* 7434 */  [ 0.276732495, 19 ],
+  /* 7435 */  [ 0.276782129, 19 ],
+  /* 7436 */  [ 0.276831766, 19 ],
+  /* 7437 */  [ 0.276881406, 19 ],
+  /* 7438 */  [ 0.276931047, 19 ],
+  /* 7439 */  [ 0.276980691, 19 ],
+
+  /* 7440 */  [ 0.277030337, 19 ],
+  /* 7441 */  [ 0.277079985, 19 ],
+  /* 7442 */  [ 0.277129635, 19 ],
+  /* 7443 */  [ 0.277179288, 19 ],
+  /* 7444 */  [ 0.277228942, 19 ],
+  /* 7445 */  [ 0.277278600, 19 ],
+  /* 7446 */  [ 0.277328259, 19 ],
+  /* 7447 */  [ 0.277377920, 19 ],
+  /* 7448 */  [ 0.277427584, 19 ],
+  /* 7449 */  [ 0.277477250, 19 ],
+  /* 7450 */  [ 0.277526918, 19 ],
+  /* 7451 */  [ 0.277576588, 19 ],
+  /* 7452 */  [ 0.277626261, 19 ],
+  /* 7453 */  [ 0.277675936, 19 ],
+  /* 7454 */  [ 0.277725613, 19 ],
+  /* 7455 */  [ 0.277775292, 19 ],
+
+  /* 7456 */  [ 0.277824973, 19 ],
+  /* 7457 */  [ 0.277874657, 19 ],
+  /* 7458 */  [ 0.277924343, 19 ],
+  /* 7459 */  [ 0.277974031, 19 ],
+  /* 7460 */  [ 0.278023722, 19 ],
+  /* 7461 */  [ 0.278073414, 19 ],
+  /* 7462 */  [ 0.278123109, 19 ],
+  /* 7463 */  [ 0.278172806, 19 ],
+  /* 7464 */  [ 0.278222505, 19 ],
+  /* 7465 */  [ 0.278272207, 19 ],
+  /* 7466 */  [ 0.278321910, 19 ],
+  /* 7467 */  [ 0.278371616, 19 ],
+  /* 7468 */  [ 0.278421324, 19 ],
+  /* 7469 */  [ 0.278471035, 19 ],
+  /* 7470 */  [ 0.278520747, 19 ],
+  /* 7471 */  [ 0.278570462, 19 ],
+
+  /* 7472 */  [ 0.278620179, 19 ],
+  /* 7473 */  [ 0.278669898, 19 ],
+  /* 7474 */  [ 0.278719619, 19 ],
+  /* 7475 */  [ 0.278769343, 19 ],
+  /* 7476 */  [ 0.278819069, 19 ],
+  /* 7477 */  [ 0.278868797, 19 ],
+  /* 7478 */  [ 0.278918527, 19 ],
+  /* 7479 */  [ 0.278968260, 19 ],
+  /* 7480 */  [ 0.279017995, 19 ],
+  /* 7481 */  [ 0.279067731, 19 ],
+  /* 7482 */  [ 0.279117471, 19 ],
+  /* 7483 */  [ 0.279167212, 19 ],
+  /* 7484 */  [ 0.279216956, 19 ],
+  /* 7485 */  [ 0.279266701, 19 ],
+  /* 7486 */  [ 0.279316449, 19 ],
+  /* 7487 */  [ 0.279366200, 19 ],
+
+  /* 7488 */  [ 0.279415952, 19 ],
+  /* 7489 */  [ 0.279465707, 19 ],
+  /* 7490 */  [ 0.279515464, 19 ],
+  /* 7491 */  [ 0.279565223, 19 ],
+  /* 7492 */  [ 0.279614984, 19 ],
+  /* 7493 */  [ 0.279664748, 19 ],
+  /* 7494 */  [ 0.279714513, 19 ],
+  /* 7495 */  [ 0.279764281, 19 ],
+  /* 7496 */  [ 0.279814051, 19 ],
+  /* 7497 */  [ 0.279863824, 19 ],
+  /* 7498 */  [ 0.279913598, 19 ],
+  /* 7499 */  [ 0.279963375, 19 ],
+  /* 7500 */  [ 0.280013154, 19 ],
+  /* 7501 */  [ 0.280062935, 19 ],
+  /* 7502 */  [ 0.280112719, 19 ],
+  /* 7503 */  [ 0.280162504, 19 ],
+
+  /* 7504 */  [ 0.280212292, 19 ],
+  /* 7505 */  [ 0.280262082, 19 ],
+  /* 7506 */  [ 0.280311875, 19 ],
+  /* 7507 */  [ 0.280361669, 19 ],
+  /* 7508 */  [ 0.280411466, 19 ],
+  /* 7509 */  [ 0.280461265, 19 ],
+  /* 7510 */  [ 0.280511066, 19 ],
+  /* 7511 */  [ 0.280560869, 19 ],
+  /* 7512 */  [ 0.280610675, 19 ],
+  /* 7513 */  [ 0.280660483, 19 ],
+  /* 7514 */  [ 0.280710292, 19 ],
+  /* 7515 */  [ 0.280760105, 19 ],
+  /* 7516 */  [ 0.280809919, 19 ],
+  /* 7517 */  [ 0.280859736, 19 ],
+  /* 7518 */  [ 0.280909554, 19 ],
+  /* 7519 */  [ 0.280959375, 19 ],
+
+  /* 7520 */  [ 0.281009199, 19 ],
+  /* 7521 */  [ 0.281059024, 19 ],
+  /* 7522 */  [ 0.281108852, 19 ],
+  /* 7523 */  [ 0.281158682, 19 ],
+  /* 7524 */  [ 0.281208514, 19 ],
+  /* 7525 */  [ 0.281258348, 19 ],
+  /* 7526 */  [ 0.281308184, 19 ],
+  /* 7527 */  [ 0.281358023, 19 ],
+  /* 7528 */  [ 0.281407864, 19 ],
+  /* 7529 */  [ 0.281457707, 19 ],
+  /* 7530 */  [ 0.281507552, 19 ],
+  /* 7531 */  [ 0.281557400, 19 ],
+  /* 7532 */  [ 0.281607250, 19 ],
+  /* 7533 */  [ 0.281657101, 19 ],
+  /* 7534 */  [ 0.281706956, 19 ],
+  /* 7535 */  [ 0.281756812, 19 ],
+
+  /* 7536 */  [ 0.281806670, 19 ],
+  /* 7537 */  [ 0.281856531, 19 ],
+  /* 7538 */  [ 0.281906394, 19 ],
+  /* 7539 */  [ 0.281956259, 19 ],
+  /* 7540 */  [ 0.282006127, 19 ],
+  /* 7541 */  [ 0.282055996, 19 ],
+  /* 7542 */  [ 0.282105868, 19 ],
+  /* 7543 */  [ 0.282155742, 19 ],
+  /* 7544 */  [ 0.282205618, 19 ],
+  /* 7545 */  [ 0.282255496, 19 ],
+  /* 7546 */  [ 0.282305377, 19 ],
+  /* 7547 */  [ 0.282355260, 19 ],
+  /* 7548 */  [ 0.282405145, 19 ],
+  /* 7549 */  [ 0.282455032, 19 ],
+  /* 7550 */  [ 0.282504921, 19 ],
+  /* 7551 */  [ 0.282554813, 19 ],
+
+  /* 7552 */  [ 0.282604707, 19 ],
+  /* 7553 */  [ 0.282654603, 19 ],
+  /* 7554 */  [ 0.282704501, 19 ],
+  /* 7555 */  [ 0.282754401, 19 ],
+  /* 7556 */  [ 0.282804304, 19 ],
+  /* 7557 */  [ 0.282854209, 19 ],
+  /* 7558 */  [ 0.282904116, 19 ],
+  /* 7559 */  [ 0.282954025, 19 ],
+  /* 7560 */  [ 0.283003936, 19 ],
+  /* 7561 */  [ 0.283053850, 19 ],
+  /* 7562 */  [ 0.283103766, 19 ],
+  /* 7563 */  [ 0.283153684, 19 ],
+  /* 7564 */  [ 0.283203604, 19 ],
+  /* 7565 */  [ 0.283253527, 19 ],
+  /* 7566 */  [ 0.283303451, 19 ],
+  /* 7567 */  [ 0.283353378, 19 ],
+
+  /* 7568 */  [ 0.283403307, 19 ],
+  /* 7569 */  [ 0.283453238, 19 ],
+  /* 7570 */  [ 0.283503172, 19 ],
+  /* 7571 */  [ 0.283553107, 19 ],
+  /* 7572 */  [ 0.283603045, 19 ],
+  /* 7573 */  [ 0.283652985, 19 ],
+  /* 7574 */  [ 0.283702927, 19 ],
+  /* 7575 */  [ 0.283752872, 19 ],
+  /* 7576 */  [ 0.283802818, 19 ],
+  /* 7577 */  [ 0.283852767, 19 ],
+  /* 7578 */  [ 0.283902718, 19 ],
+  /* 7579 */  [ 0.283952671, 19 ],
+  /* 7580 */  [ 0.284002627, 19 ],
+  /* 7581 */  [ 0.284052584, 19 ],
+  /* 7582 */  [ 0.284102544, 19 ],
+  /* 7583 */  [ 0.284152506, 19 ],
+
+  /* 7584 */  [ 0.284202470, 19 ],
+  /* 7585 */  [ 0.284252436, 19 ],
+  /* 7586 */  [ 0.284302405, 19 ],
+  /* 7587 */  [ 0.284352376, 19 ],
+  /* 7588 */  [ 0.284402349, 19 ],
+  /* 7589 */  [ 0.284452324, 19 ],
+  /* 7590 */  [ 0.284502301, 19 ],
+  /* 7591 */  [ 0.284552281, 19 ],
+  /* 7592 */  [ 0.284602263, 19 ],
+  /* 7593 */  [ 0.284652246, 19 ],
+  /* 7594 */  [ 0.284702233, 19 ],
+  /* 7595 */  [ 0.284752221, 19 ],
+  /* 7596 */  [ 0.284802211, 19 ],
+  /* 7597 */  [ 0.284852204, 19 ],
+  /* 7598 */  [ 0.284902199, 19 ],
+  /* 7599 */  [ 0.284952196, 19 ],
+
+  /* 7600 */  [ 0.285002195, 19 ],
+  /* 7601 */  [ 0.285052197, 19 ],
+  /* 7602 */  [ 0.285102201, 19 ],
+  /* 7603 */  [ 0.285152206, 19 ],
+  /* 7604 */  [ 0.285202214, 19 ],
+  /* 7605 */  [ 0.285252225, 19 ],
+  /* 7606 */  [ 0.285302237, 19 ],
+  /* 7607 */  [ 0.285352252, 19 ],
+  /* 7608 */  [ 0.285402269, 19 ],
+  /* 7609 */  [ 0.285452288, 19 ],
+  /* 7610 */  [ 0.285502309, 19 ],
+  /* 7611 */  [ 0.285552332, 19 ],
+  /* 7612 */  [ 0.285602358, 19 ],
+  /* 7613 */  [ 0.285652386, 19 ],
+  /* 7614 */  [ 0.285702416, 19 ],
+  /* 7615 */  [ 0.285752448, 19 ],
+
+  /* 7616 */  [ 0.285802482, 19 ],
+  /* 7617 */  [ 0.285852519, 19 ],
+  /* 7618 */  [ 0.285902557, 19 ],
+  /* 7619 */  [ 0.285952598, 19 ],
+  /* 7620 */  [ 0.286002641, 19 ],
+  /* 7621 */  [ 0.286052687, 19 ],
+  /* 7622 */  [ 0.286102734, 19 ],
+  /* 7623 */  [ 0.286152784, 19 ],
+  /* 7624 */  [ 0.286202836, 19 ],
+  /* 7625 */  [ 0.286252890, 19 ],
+  /* 7626 */  [ 0.286302946, 19 ],
+  /* 7627 */  [ 0.286353005, 19 ],
+  /* 7628 */  [ 0.286403065, 19 ],
+  /* 7629 */  [ 0.286453128, 19 ],
+  /* 7630 */  [ 0.286503193, 19 ],
+  /* 7631 */  [ 0.286553260, 19 ],
+
+  /* 7632 */  [ 0.286603329, 19 ],
+  /* 7633 */  [ 0.286653401, 19 ],
+  /* 7634 */  [ 0.286703475, 19 ],
+  /* 7635 */  [ 0.286753551, 19 ],
+  /* 7636 */  [ 0.286803629, 19 ],
+  /* 7637 */  [ 0.286853709, 19 ],
+  /* 7638 */  [ 0.286903792, 19 ],
+  /* 7639 */  [ 0.286953876, 19 ],
+  /* 7640 */  [ 0.287003963, 19 ],
+  /* 7641 */  [ 0.287054052, 19 ],
+  /* 7642 */  [ 0.287104143, 19 ],
+  /* 7643 */  [ 0.287154237, 19 ],
+  /* 7644 */  [ 0.287204332, 19 ],
+  /* 7645 */  [ 0.287254430, 19 ],
+  /* 7646 */  [ 0.287304530, 19 ],
+  /* 7647 */  [ 0.287354632, 19 ],
+
+  /* 7648 */  [ 0.287404737, 19 ],
+  /* 7649 */  [ 0.287454843, 19 ],
+  /* 7650 */  [ 0.287504952, 19 ],
+  /* 7651 */  [ 0.287555063, 19 ],
+  /* 7652 */  [ 0.287605176, 19 ],
+  /* 7653 */  [ 0.287655291, 19 ],
+  /* 7654 */  [ 0.287705409, 19 ],
+  /* 7655 */  [ 0.287755528, 19 ],
+  /* 7656 */  [ 0.287805650, 19 ],
+  /* 7657 */  [ 0.287855774, 19 ],
+  /* 7658 */  [ 0.287905900, 19 ],
+  /* 7659 */  [ 0.287956028, 19 ],
+  /* 7660 */  [ 0.288006159, 19 ],
+  /* 7661 */  [ 0.288056292, 19 ],
+  /* 7662 */  [ 0.288106427, 19 ],
+  /* 7663 */  [ 0.288156564, 19 ],
+
+  /* 7664 */  [ 0.288206703, 19 ],
+  /* 7665 */  [ 0.288256844, 19 ],
+  /* 7666 */  [ 0.288306988, 19 ],
+  /* 7667 */  [ 0.288357134, 19 ],
+  /* 7668 */  [ 0.288407282, 19 ],
+  /* 7669 */  [ 0.288457432, 19 ],
+  /* 7670 */  [ 0.288507584, 19 ],
+  /* 7671 */  [ 0.288557739, 19 ],
+  /* 7672 */  [ 0.288607895, 19 ],
+  /* 7673 */  [ 0.288658054, 19 ],
+  /* 7674 */  [ 0.288708215, 19 ],
+  /* 7675 */  [ 0.288758379, 19 ],
+  /* 7676 */  [ 0.288808544, 19 ],
+  /* 7677 */  [ 0.288858712, 19 ],
+  /* 7678 */  [ 0.288908881, 19 ],
+  /* 7679 */  [ 0.288959053, 19 ],
+
+  /* 7680 */  [ 0.289009227, 19 ],
+  /* 7681 */  [ 0.289059404, 19 ],
+  /* 7682 */  [ 0.289109582, 19 ],
+  /* 7683 */  [ 0.289159763, 19 ],
+  /* 7684 */  [ 0.289209946, 19 ],
+  /* 7685 */  [ 0.289260131, 19 ],
+  /* 7686 */  [ 0.289310318, 19 ],
+  /* 7687 */  [ 0.289360507, 19 ],
+  /* 7688 */  [ 0.289410699, 19 ],
+  /* 7689 */  [ 0.289460893, 19 ],
+  /* 7690 */  [ 0.289511088, 19 ],
+  /* 7691 */  [ 0.289561287, 19 ],
+  /* 7692 */  [ 0.289611487, 19 ],
+  /* 7693 */  [ 0.289661689, 19 ],
+  /* 7694 */  [ 0.289711894, 19 ],
+  /* 7695 */  [ 0.289762101, 19 ],
+
+  /* 7696 */  [ 0.289812309, 19 ],
+  /* 7697 */  [ 0.289862521, 19 ],
+  /* 7698 */  [ 0.289912734, 19 ],
+  /* 7699 */  [ 0.289962949, 19 ],
+  /* 7700 */  [ 0.290013167, 19 ],
+  /* 7701 */  [ 0.290063387, 19 ],
+  /* 7702 */  [ 0.290113609, 19 ],
+  /* 7703 */  [ 0.290163833, 19 ],
+  /* 7704 */  [ 0.290214059, 19 ],
+  /* 7705 */  [ 0.290264288, 19 ],
+  /* 7706 */  [ 0.290314519, 19 ],
+  /* 7707 */  [ 0.290364751, 19 ],
+  /* 7708 */  [ 0.290414986, 19 ],
+  /* 7709 */  [ 0.290465224, 19 ],
+  /* 7710 */  [ 0.290515463, 19 ],
+  /* 7711 */  [ 0.290565705, 19 ],
+
+  /* 7712 */  [ 0.290615948, 19 ],
+  /* 7713 */  [ 0.290666194, 19 ],
+  /* 7714 */  [ 0.290716442, 19 ],
+  /* 7715 */  [ 0.290766692, 19 ],
+  /* 7716 */  [ 0.290816945, 19 ],
+  /* 7717 */  [ 0.290867199, 19 ],
+  /* 7718 */  [ 0.290917456, 19 ],
+  /* 7719 */  [ 0.290967715, 19 ],
+  /* 7720 */  [ 0.291017976, 19 ],
+  /* 7721 */  [ 0.291068239, 19 ],
+  /* 7722 */  [ 0.291118505, 19 ],
+  /* 7723 */  [ 0.291168772, 19 ],
+  /* 7724 */  [ 0.291219042, 19 ],
+  /* 7725 */  [ 0.291269314, 19 ],
+  /* 7726 */  [ 0.291319588, 19 ],
+  /* 7727 */  [ 0.291369865, 19 ],
+
+  /* 7728 */  [ 0.291420143, 19 ],
+  /* 7729 */  [ 0.291470424, 19 ],
+  /* 7730 */  [ 0.291520706, 19 ],
+  /* 7731 */  [ 0.291570991, 19 ],
+  /* 7732 */  [ 0.291621278, 19 ],
+  /* 7733 */  [ 0.291671568, 19 ],
+  /* 7734 */  [ 0.291721859, 19 ],
+  /* 7735 */  [ 0.291772153, 19 ],
+  /* 7736 */  [ 0.291822449, 19 ],
+  /* 7737 */  [ 0.291872747, 19 ],
+  /* 7738 */  [ 0.291923047, 19 ],
+  /* 7739 */  [ 0.291973349, 19 ],
+  /* 7740 */  [ 0.292023653, 19 ],
+  /* 7741 */  [ 0.292073960, 19 ],
+  /* 7742 */  [ 0.292124269, 19 ],
+  /* 7743 */  [ 0.292174580, 19 ],
+
+  /* 7744 */  [ 0.292224893, 19 ],
+  /* 7745 */  [ 0.292275208, 19 ],
+  /* 7746 */  [ 0.292325526, 19 ],
+  /* 7747 */  [ 0.292375845, 19 ],
+  /* 7748 */  [ 0.292426167, 19 ],
+  /* 7749 */  [ 0.292476491, 19 ],
+  /* 7750 */  [ 0.292526817, 19 ],
+  /* 7751 */  [ 0.292577145, 19 ],
+  /* 7752 */  [ 0.292627476, 19 ],
+  /* 7753 */  [ 0.292677808, 19 ],
+  /* 7754 */  [ 0.292728143, 19 ],
+  /* 7755 */  [ 0.292778480, 19 ],
+  /* 7756 */  [ 0.292828819, 19 ],
+  /* 7757 */  [ 0.292879160, 19 ],
+  /* 7758 */  [ 0.292929504, 19 ],
+  /* 7759 */  [ 0.292979849, 19 ],
+
+  /* 7760 */  [ 0.293030197, 19 ],
+  /* 7761 */  [ 0.293080547, 19 ],
+  /* 7762 */  [ 0.293130899, 19 ],
+  /* 7763 */  [ 0.293181253, 19 ],
+  /* 7764 */  [ 0.293231610, 19 ],
+  /* 7765 */  [ 0.293281968, 19 ],
+  /* 7766 */  [ 0.293332329, 19 ],
+  /* 7767 */  [ 0.293382692, 19 ],
+  /* 7768 */  [ 0.293433057, 19 ],
+  /* 7769 */  [ 0.293483424, 19 ],
+  /* 7770 */  [ 0.293533794, 19 ],
+  /* 7771 */  [ 0.293584165, 19 ],
+  /* 7772 */  [ 0.293634539, 19 ],
+  /* 7773 */  [ 0.293684915, 19 ],
+  /* 7774 */  [ 0.293735293, 19 ],
+  /* 7775 */  [ 0.293785673, 19 ],
+
+  /* 7776 */  [ 0.293836055, 19 ],
+  /* 7777 */  [ 0.293886440, 19 ],
+  /* 7778 */  [ 0.293936826, 19 ],
+  /* 7779 */  [ 0.293987215, 19 ],
+  /* 7780 */  [ 0.294037606, 19 ],
+  /* 7781 */  [ 0.294087999, 19 ],
+  /* 7782 */  [ 0.294138395, 19 ],
+  /* 7783 */  [ 0.294188792, 19 ],
+  /* 7784 */  [ 0.294239192, 19 ],
+  /* 7785 */  [ 0.294289593, 19 ],
+  /* 7786 */  [ 0.294339997, 19 ],
+  /* 7787 */  [ 0.294390403, 19 ],
+  /* 7788 */  [ 0.294440812, 19 ],
+  /* 7789 */  [ 0.294491222, 19 ],
+  /* 7790 */  [ 0.294541635, 19 ],
+  /* 7791 */  [ 0.294592049, 19 ],
+
+  /* 7792 */  [ 0.294642466, 19 ],
+  /* 7793 */  [ 0.294692885, 19 ],
+  /* 7794 */  [ 0.294743306, 19 ],
+  /* 7795 */  [ 0.294793730, 19 ],
+  /* 7796 */  [ 0.294844155, 19 ],
+  /* 7797 */  [ 0.294894583, 19 ],
+  /* 7798 */  [ 0.294945013, 19 ],
+  /* 7799 */  [ 0.294995445, 19 ],
+  /* 7800 */  [ 0.295045879, 19 ],
+  /* 7801 */  [ 0.295096315, 19 ],
+  /* 7802 */  [ 0.295146753, 19 ],
+  /* 7803 */  [ 0.295197194, 19 ],
+  /* 7804 */  [ 0.295247637, 19 ],
+  /* 7805 */  [ 0.295298082, 19 ],
+  /* 7806 */  [ 0.295348529, 19 ],
+  /* 7807 */  [ 0.295398978, 19 ],
+
+  /* 7808 */  [ 0.295449429, 19 ],
+  /* 7809 */  [ 0.295499883, 19 ],
+  /* 7810 */  [ 0.295550338, 19 ],
+  /* 7811 */  [ 0.295600796, 19 ],
+  /* 7812 */  [ 0.295651256, 19 ],
+  /* 7813 */  [ 0.295701718, 19 ],
+  /* 7814 */  [ 0.295752183, 19 ],
+  /* 7815 */  [ 0.295802649, 19 ],
+  /* 7816 */  [ 0.295853118, 19 ],
+  /* 7817 */  [ 0.295903588, 19 ],
+  /* 7818 */  [ 0.295954061, 19 ],
+  /* 7819 */  [ 0.296004536, 19 ],
+  /* 7820 */  [ 0.296055013, 19 ],
+  /* 7821 */  [ 0.296105493, 19 ],
+  /* 7822 */  [ 0.296155974, 19 ],
+  /* 7823 */  [ 0.296206458, 19 ],
+
+  /* 7824 */  [ 0.296256944, 19 ],
+  /* 7825 */  [ 0.296307432, 19 ],
+  /* 7826 */  [ 0.296357922, 19 ],
+  /* 7827 */  [ 0.296408414, 19 ],
+  /* 7828 */  [ 0.296458908, 19 ],
+  /* 7829 */  [ 0.296509405, 19 ],
+  /* 7830 */  [ 0.296559904, 19 ],
+  /* 7831 */  [ 0.296610404, 19 ],
+  /* 7832 */  [ 0.296660907, 19 ],
+  /* 7833 */  [ 0.296711413, 19 ],
+  /* 7834 */  [ 0.296761920, 19 ],
+  /* 7835 */  [ 0.296812429, 19 ],
+  /* 7836 */  [ 0.296862941, 19 ],
+  /* 7837 */  [ 0.296913455, 19 ],
+  /* 7838 */  [ 0.296963971, 19 ],
+  /* 7839 */  [ 0.297014489, 19 ],
+
+  /* 7840 */  [ 0.297065009, 19 ],
+  /* 7841 */  [ 0.297115531, 19 ],
+  /* 7842 */  [ 0.297166056, 19 ],
+  /* 7843 */  [ 0.297216582, 19 ],
+  /* 7844 */  [ 0.297267111, 19 ],
+  /* 7845 */  [ 0.297317642, 19 ],
+  /* 7846 */  [ 0.297368175, 19 ],
+  /* 7847 */  [ 0.297418710, 19 ],
+  /* 7848 */  [ 0.297469248, 19 ],
+  /* 7849 */  [ 0.297519787, 19 ],
+  /* 7850 */  [ 0.297570329, 19 ],
+  /* 7851 */  [ 0.297620873, 19 ],
+  /* 7852 */  [ 0.297671418, 19 ],
+  /* 7853 */  [ 0.297721967, 19 ],
+  /* 7854 */  [ 0.297772517, 19 ],
+  /* 7855 */  [ 0.297823069, 19 ],
+
+  /* 7856 */  [ 0.297873624, 19 ],
+  /* 7857 */  [ 0.297924180, 19 ],
+  /* 7858 */  [ 0.297974739, 19 ],
+  /* 7859 */  [ 0.298025300, 19 ],
+  /* 7860 */  [ 0.298075863, 19 ],
+  /* 7861 */  [ 0.298126429, 19 ],
+  /* 7862 */  [ 0.298176996, 19 ],
+  /* 7863 */  [ 0.298227565, 19 ],
+  /* 7864 */  [ 0.298278137, 19 ],
+  /* 7865 */  [ 0.298328711, 19 ],
+  /* 7866 */  [ 0.298379287, 19 ],
+  /* 7867 */  [ 0.298429865, 19 ],
+  /* 7868 */  [ 0.298480445, 19 ],
+  /* 7869 */  [ 0.298531028, 19 ],
+  /* 7870 */  [ 0.298581612, 19 ],
+  /* 7871 */  [ 0.298632199, 19 ],
+
+  /* 7872 */  [ 0.298682788, 19 ],
+  /* 7873 */  [ 0.298733379, 19 ],
+  /* 7874 */  [ 0.298783972, 19 ],
+  /* 7875 */  [ 0.298834567, 19 ],
+  /* 7876 */  [ 0.298885165, 19 ],
+  /* 7877 */  [ 0.298935764, 19 ],
+  /* 7878 */  [ 0.298986366, 19 ],
+  /* 7879 */  [ 0.299036970, 19 ],
+  /* 7880 */  [ 0.299087576, 19 ],
+  /* 7881 */  [ 0.299138184, 19 ],
+  /* 7882 */  [ 0.299188794, 19 ],
+  /* 7883 */  [ 0.299239406, 19 ],
+  /* 7884 */  [ 0.299290021, 19 ],
+  /* 7885 */  [ 0.299340638, 19 ],
+  /* 7886 */  [ 0.299391256, 19 ],
+  /* 7887 */  [ 0.299441877, 19 ],
+
+  /* 7888 */  [ 0.299492500, 19 ],
+  /* 7889 */  [ 0.299543126, 19 ],
+  /* 7890 */  [ 0.299593753, 19 ],
+  /* 7891 */  [ 0.299644382, 19 ],
+  /* 7892 */  [ 0.299695014, 19 ],
+  /* 7893 */  [ 0.299745648, 19 ],
+  /* 7894 */  [ 0.299796284, 19 ],
+  /* 7895 */  [ 0.299846922, 19 ],
+  /* 7896 */  [ 0.299897562, 19 ],
+  /* 7897 */  [ 0.299948204, 19 ],
+  /* 7898 */  [ 0.299998849, 19 ],
+  /* 7899 */  [ 0.300049495, 19 ],
+  /* 7900 */  [ 0.300100144, 19 ],
+  /* 7901 */  [ 0.300150795, 19 ],
+  /* 7902 */  [ 0.300201448, 19 ],
+  /* 7903 */  [ 0.300252103, 19 ],
+
+  /* 7904 */  [ 0.300302761, 19 ],
+  /* 7905 */  [ 0.300353420, 19 ],
+  /* 7906 */  [ 0.300404082, 19 ],
+  /* 7907 */  [ 0.300454745, 19 ],
+  /* 7908 */  [ 0.300505411, 19 ],
+  /* 7909 */  [ 0.300556079, 19 ],
+  /* 7910 */  [ 0.300606749, 19 ],
+  /* 7911 */  [ 0.300657421, 19 ],
+  /* 7912 */  [ 0.300708096, 19 ],
+  /* 7913 */  [ 0.300758772, 19 ],
+  /* 7914 */  [ 0.300809451, 19 ],
+  /* 7915 */  [ 0.300860132, 19 ],
+  /* 7916 */  [ 0.300910815, 19 ],
+  /* 7917 */  [ 0.300961500, 19 ],
+  /* 7918 */  [ 0.301012187, 19 ],
+  /* 7919 */  [ 0.301062876, 19 ],
+
+  /* 7920 */  [ 0.301113568, 19 ],
+  /* 7921 */  [ 0.301164261, 19 ],
+  /* 7922 */  [ 0.301214957, 19 ],
+  /* 7923 */  [ 0.301265655, 19 ],
+  /* 7924 */  [ 0.301316355, 19 ],
+  /* 7925 */  [ 0.301367057, 19 ],
+  /* 7926 */  [ 0.301417761, 19 ],
+  /* 7927 */  [ 0.301468468, 19 ],
+  /* 7928 */  [ 0.301519176, 19 ],
+  /* 7929 */  [ 0.301569887, 19 ],
+  /* 7930 */  [ 0.301620599, 19 ],
+  /* 7931 */  [ 0.301671314, 19 ],
+  /* 7932 */  [ 0.301722031, 19 ],
+  /* 7933 */  [ 0.301772751, 19 ],
+  /* 7934 */  [ 0.301823472, 19 ],
+  /* 7935 */  [ 0.301874195, 19 ],
+
+  /* 7936 */  [ 0.301924921, 19 ],
+  /* 7937 */  [ 0.301975649, 19 ],
+  /* 7938 */  [ 0.302026378, 19 ],
+  /* 7939 */  [ 0.302077110, 19 ],
+  /* 7940 */  [ 0.302127845, 19 ],
+  /* 7941 */  [ 0.302178581, 19 ],
+  /* 7942 */  [ 0.302229319, 19 ],
+  /* 7943 */  [ 0.302280060, 19 ],
+  /* 7944 */  [ 0.302330802, 19 ],
+  /* 7945 */  [ 0.302381547, 19 ],
+  /* 7946 */  [ 0.302432294, 19 ],
+  /* 7947 */  [ 0.302483043, 19 ],
+  /* 7948 */  [ 0.302533794, 19 ],
+  /* 7949 */  [ 0.302584547, 19 ],
+  /* 7950 */  [ 0.302635303, 19 ],
+  /* 7951 */  [ 0.302686060, 19 ],
+
+  /* 7952 */  [ 0.302736820, 19 ],
+  /* 7953 */  [ 0.302787581, 19 ],
+  /* 7954 */  [ 0.302838345, 19 ],
+  /* 7955 */  [ 0.302889111, 19 ],
+  /* 7956 */  [ 0.302939879, 19 ],
+  /* 7957 */  [ 0.302990650, 19 ],
+  /* 7958 */  [ 0.303041422, 19 ],
+  /* 7959 */  [ 0.303092197, 19 ],
+  /* 7960 */  [ 0.303142973, 19 ],
+  /* 7961 */  [ 0.303193752, 19 ],
+  /* 7962 */  [ 0.303244533, 19 ],
+  /* 7963 */  [ 0.303295316, 19 ],
+  /* 7964 */  [ 0.303346101, 19 ],
+  /* 7965 */  [ 0.303396889, 19 ],
+  /* 7966 */  [ 0.303447678, 19 ],
+  /* 7967 */  [ 0.303498469, 19 ],
+
+  /* 7968 */  [ 0.303549263, 19 ],
+  /* 7969 */  [ 0.303600059, 19 ],
+  /* 7970 */  [ 0.303650857, 19 ],
+  /* 7971 */  [ 0.303701657, 19 ],
+  /* 7972 */  [ 0.303752459, 19 ],
+  /* 7973 */  [ 0.303803263, 19 ],
+  /* 7974 */  [ 0.303854070, 19 ],
+  /* 7975 */  [ 0.303904878, 19 ],
+  /* 7976 */  [ 0.303955689, 19 ],
+  /* 7977 */  [ 0.304006502, 19 ],
+  /* 7978 */  [ 0.304057317, 19 ],
+  /* 7979 */  [ 0.304108134, 19 ],
+  /* 7980 */  [ 0.304158953, 19 ],
+  /* 7981 */  [ 0.304209774, 19 ],
+  /* 7982 */  [ 0.304260597, 19 ],
+  /* 7983 */  [ 0.304311423, 19 ],
+
+  /* 7984 */  [ 0.304362251, 19 ],
+  /* 7985 */  [ 0.304413080, 19 ],
+  /* 7986 */  [ 0.304463912, 19 ],
+  /* 7987 */  [ 0.304514746, 19 ],
+  /* 7988 */  [ 0.304565582, 19 ],
+  /* 7989 */  [ 0.304616421, 19 ],
+  /* 7990 */  [ 0.304667261, 19 ],
+  /* 7991 */  [ 0.304718103, 19 ],
+  /* 7992 */  [ 0.304768948, 19 ],
+  /* 7993 */  [ 0.304819795, 19 ],
+  /* 7994 */  [ 0.304870644, 19 ],
+  /* 7995 */  [ 0.304921495, 19 ],
+  /* 7996 */  [ 0.304972348, 19 ],
+  /* 7997 */  [ 0.305023203, 19 ],
+  /* 7998 */  [ 0.305074060, 19 ],
+  /* 7999 */  [ 0.305124920, 19 ],
+
+  /* 8000 */  [ 0.305175781, 19 ],
+  /* 8001 */  [ 0.305226645, 19 ],
+  /* 8002 */  [ 0.305277511, 19 ],
+  /* 8003 */  [ 0.305328379, 19 ],
+  /* 8004 */  [ 0.305379249, 19 ],
+  /* 8005 */  [ 0.305430121, 19 ],
+  /* 8006 */  [ 0.305480995, 19 ],
+  /* 8007 */  [ 0.305531872, 19 ],
+  /* 8008 */  [ 0.305582750, 19 ],
+  /* 8009 */  [ 0.305633631, 19 ],
+  /* 8010 */  [ 0.305684513, 19 ],
+  /* 8011 */  [ 0.305735398, 19 ],
+  /* 8012 */  [ 0.305786285, 19 ],
+  /* 8013 */  [ 0.305837174, 19 ],
+  /* 8014 */  [ 0.305888066, 19 ],
+  /* 8015 */  [ 0.305938959, 19 ],
+
+  /* 8016 */  [ 0.305989854, 19 ],
+  /* 8017 */  [ 0.306040752, 19 ],
+  /* 8018 */  [ 0.306091652, 19 ],
+  /* 8019 */  [ 0.306142554, 19 ],
+  /* 8020 */  [ 0.306193457, 19 ],
+  /* 8021 */  [ 0.306244364, 19 ],
+  /* 8022 */  [ 0.306295272, 19 ],
+  /* 8023 */  [ 0.306346182, 19 ],
+  /* 8024 */  [ 0.306397094, 19 ],
+  /* 8025 */  [ 0.306448009, 19 ],
+  /* 8026 */  [ 0.306498925, 19 ],
+  /* 8027 */  [ 0.306549844, 19 ],
+  /* 8028 */  [ 0.306600765, 19 ],
+  /* 8029 */  [ 0.306651688, 19 ],
+  /* 8030 */  [ 0.306702613, 19 ],
+  /* 8031 */  [ 0.306753540, 19 ],
+
+  /* 8032 */  [ 0.306804470, 19 ],
+  /* 8033 */  [ 0.306855401, 19 ],
+  /* 8034 */  [ 0.306906334, 19 ],
+  /* 8035 */  [ 0.306957270, 19 ],
+  /* 8036 */  [ 0.307008208, 19 ],
+  /* 8037 */  [ 0.307059148, 19 ],
+  /* 8038 */  [ 0.307110090, 19 ],
+  /* 8039 */  [ 0.307161034, 19 ],
+  /* 8040 */  [ 0.307211980, 19 ],
+  /* 8041 */  [ 0.307262928, 19 ],
+  /* 8042 */  [ 0.307313879, 19 ],
+  /* 8043 */  [ 0.307364831, 19 ],
+  /* 8044 */  [ 0.307415786, 19 ],
+  /* 8045 */  [ 0.307466743, 19 ],
+  /* 8046 */  [ 0.307517702, 19 ],
+  /* 8047 */  [ 0.307568663, 19 ],
+
+  /* 8048 */  [ 0.307619626, 19 ],
+  /* 8049 */  [ 0.307670591, 19 ],
+  /* 8050 */  [ 0.307721558, 19 ],
+  /* 8051 */  [ 0.307772528, 19 ],
+  /* 8052 */  [ 0.307823499, 19 ],
+  /* 8053 */  [ 0.307874473, 19 ],
+  /* 8054 */  [ 0.307925449, 19 ],
+  /* 8055 */  [ 0.307976426, 19 ],
+  /* 8056 */  [ 0.308027406, 19 ],
+  /* 8057 */  [ 0.308078389, 19 ],
+  /* 8058 */  [ 0.308129373, 19 ],
+  /* 8059 */  [ 0.308180359, 19 ],
+  /* 8060 */  [ 0.308231347, 19 ],
+  /* 8061 */  [ 0.308282338, 19 ],
+  /* 8062 */  [ 0.308333331, 19 ],
+  /* 8063 */  [ 0.308384325, 19 ],
+
+  /* 8064 */  [ 0.308435322, 19 ],
+  /* 8065 */  [ 0.308486321, 19 ],
+  /* 8066 */  [ 0.308537322, 19 ],
+  /* 8067 */  [ 0.308588325, 19 ],
+  /* 8068 */  [ 0.308639331, 19 ],
+  /* 8069 */  [ 0.308690338, 19 ],
+  /* 8070 */  [ 0.308741348, 19 ],
+  /* 8071 */  [ 0.308792359, 19 ],
+  /* 8072 */  [ 0.308843373, 19 ],
+  /* 8073 */  [ 0.308894389, 19 ],
+  /* 8074 */  [ 0.308945407, 19 ],
+  /* 8075 */  [ 0.308996427, 19 ],
+  /* 8076 */  [ 0.309047449, 19 ],
+  /* 8077 */  [ 0.309098473, 19 ],
+  /* 8078 */  [ 0.309149499, 19 ],
+  /* 8079 */  [ 0.309200528, 19 ],
+
+  /* 8080 */  [ 0.309251558, 19 ],
+  /* 8081 */  [ 0.309302591, 19 ],
+  /* 8082 */  [ 0.309353626, 19 ],
+  /* 8083 */  [ 0.309404663, 19 ],
+  /* 8084 */  [ 0.309455702, 19 ],
+  /* 8085 */  [ 0.309506743, 19 ],
+  /* 8086 */  [ 0.309557786, 19 ],
+  /* 8087 */  [ 0.309608831, 19 ],
+  /* 8088 */  [ 0.309659879, 19 ],
+  /* 8089 */  [ 0.309710928, 19 ],
+  /* 8090 */  [ 0.309761980, 19 ],
+  /* 8091 */  [ 0.309813033, 19 ],
+  /* 8092 */  [ 0.309864089, 19 ],
+  /* 8093 */  [ 0.309915147, 19 ],
+  /* 8094 */  [ 0.309966207, 19 ],
+  /* 8095 */  [ 0.310017269, 19 ],
+
+  /* 8096 */  [ 0.310068333, 19 ],
+  /* 8097 */  [ 0.310119400, 19 ],
+  /* 8098 */  [ 0.310170468, 19 ],
+  /* 8099 */  [ 0.310221539, 19 ],
+  /* 8100 */  [ 0.310272611, 19 ],
+  /* 8101 */  [ 0.310323686, 19 ],
+  /* 8102 */  [ 0.310374763, 19 ],
+  /* 8103 */  [ 0.310425842, 19 ],
+  /* 8104 */  [ 0.310476923, 19 ],
+  /* 8105 */  [ 0.310528006, 19 ],
+  /* 8106 */  [ 0.310579091, 19 ],
+  /* 8107 */  [ 0.310630179, 19 ],
+  /* 8108 */  [ 0.310681268, 19 ],
+  /* 8109 */  [ 0.310732360, 19 ],
+  /* 8110 */  [ 0.310783453, 19 ],
+  /* 8111 */  [ 0.310834549, 19 ],
+
+  /* 8112 */  [ 0.310885647, 19 ],
+  /* 8113 */  [ 0.310936747, 19 ],
+  /* 8114 */  [ 0.310987849, 19 ],
+  /* 8115 */  [ 0.311038953, 19 ],
+  /* 8116 */  [ 0.311090059, 19 ],
+  /* 8117 */  [ 0.311141168, 19 ],
+  /* 8118 */  [ 0.311192278, 19 ],
+  /* 8119 */  [ 0.311243390, 19 ],
+  /* 8120 */  [ 0.311294505, 19 ],
+  /* 8121 */  [ 0.311345622, 19 ],
+  /* 8122 */  [ 0.311396741, 19 ],
+  /* 8123 */  [ 0.311447862, 19 ],
+  /* 8124 */  [ 0.311498985, 19 ],
+  /* 8125 */  [ 0.311550110, 19 ],
+  /* 8126 */  [ 0.311601237, 19 ],
+  /* 8127 */  [ 0.311652366, 19 ],
+
+  /* 8128 */  [ 0.311703498, 19 ],
+  /* 8129 */  [ 0.311754631, 19 ],
+  /* 8130 */  [ 0.311805767, 19 ],
+  /* 8131 */  [ 0.311856905, 19 ],
+  /* 8132 */  [ 0.311908044, 19 ],
+  /* 8133 */  [ 0.311959186, 19 ],
+  /* 8134 */  [ 0.312010330, 19 ],
+  /* 8135 */  [ 0.312061476, 19 ],
+  /* 8136 */  [ 0.312112625, 19 ],
+  /* 8137 */  [ 0.312163775, 19 ],
+  /* 8138 */  [ 0.312214927, 19 ],
+  /* 8139 */  [ 0.312266082, 19 ],
+  /* 8140 */  [ 0.312317238, 19 ],
+  /* 8141 */  [ 0.312368397, 19 ],
+  /* 8142 */  [ 0.312419558, 19 ],
+  /* 8143 */  [ 0.312470720, 19 ],
+
+  /* 8144 */  [ 0.312521885, 19 ],
+  /* 8145 */  [ 0.312573052, 19 ],
+  /* 8146 */  [ 0.312624222, 19 ],
+  /* 8147 */  [ 0.312675393, 19 ],
+  /* 8148 */  [ 0.312726566, 19 ],
+  /* 8149 */  [ 0.312777742, 19 ],
+  /* 8150 */  [ 0.312828919, 19 ],
+  /* 8151 */  [ 0.312880099, 19 ],
+  /* 8152 */  [ 0.312931280, 19 ],
+  /* 8153 */  [ 0.312982464, 19 ],
+  /* 8154 */  [ 0.313033650, 19 ],
+  /* 8155 */  [ 0.313084838, 19 ],
+  /* 8156 */  [ 0.313136028, 19 ],
+  /* 8157 */  [ 0.313187220, 19 ],
+  /* 8158 */  [ 0.313238414, 19 ],
+  /* 8159 */  [ 0.313289611, 19 ],
+
+  /* 8160 */  [ 0.313340809, 19 ],
+  /* 8161 */  [ 0.313392010, 19 ],
+  /* 8162 */  [ 0.313443212, 19 ],
+  /* 8163 */  [ 0.313494417, 19 ],
+  /* 8164 */  [ 0.313545624, 19 ],
+  /* 8165 */  [ 0.313596833, 19 ],
+  /* 8166 */  [ 0.313648044, 19 ],
+  /* 8167 */  [ 0.313699257, 19 ],
+  /* 8168 */  [ 0.313750472, 19 ],
+  /* 8169 */  [ 0.313801689, 19 ],
+  /* 8170 */  [ 0.313852909, 19 ],
+  /* 8171 */  [ 0.313904130, 19 ],
+  /* 8172 */  [ 0.313955354, 19 ],
+  /* 8173 */  [ 0.314006579, 19 ],
+  /* 8174 */  [ 0.314057807, 19 ],
+  /* 8175 */  [ 0.314109037, 19 ],
+
+  /* 8176 */  [ 0.314160269, 19 ],
+  /* 8177 */  [ 0.314211502, 19 ],
+  /* 8178 */  [ 0.314262739, 19 ],
+  /* 8179 */  [ 0.314313977, 19 ],
+  /* 8180 */  [ 0.314365217, 19 ],
+  /* 8181 */  [ 0.314416459, 19 ],
+  /* 8182 */  [ 0.314467704, 19 ],
+  /* 8183 */  [ 0.314518950, 19 ],
+  /* 8184 */  [ 0.314570199, 19 ],
+  /* 8185 */  [ 0.314621449, 19 ],
+  /* 8186 */  [ 0.314672702, 19 ],
+  /* 8187 */  [ 0.314723957, 19 ],
+  /* 8188 */  [ 0.314775214, 19 ],
+  /* 8189 */  [ 0.314826473, 19 ],
+  /* 8190 */  [ 0.314877734, 19 ],
+  /* 8191 */  [ 0.314928997, 19 ],
+
+  /* 8192 */  [ 0.314980262, 19 ],
+  /* 8193 */  [ 0.315031530, 19 ],
+  /* 8194 */  [ 0.315082799, 19 ],
+  /* 8195 */  [ 0.315134071, 19 ],
+  /* 8196 */  [ 0.315185344, 19 ],
+  /* 8197 */  [ 0.315236620, 19 ],
+  /* 8198 */  [ 0.315287898, 19 ],
+  /* 8199 */  [ 0.315339178, 19 ],
+  /* 8200 */  [ 0.315390460, 19 ],
+  /* 8201 */  [ 0.315441744, 19 ],
+  /* 8202 */  [ 0.315493030, 19 ],
+  /* 8203 */  [ 0.315544318, 19 ],
+  /* 8204 */  [ 0.315595608, 19 ],
+  /* 8205 */  [ 0.315646901, 19 ],
+  /* 8206 */  [ 0.315698195, 19 ]
+];
Index: /gs3-extensions/web-audio/trunk/js-mad/script/sink-light.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/sink-light.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/sink-light.js	(revision 28388)
@@ -0,0 +1,749 @@
+var Sink = this.Sink = function (global) {
+
+/**
+ * Creates a Sink according to specified parameters, if possible.
+ *
+ * @class
+ *
+ * @arg =!readFn
+ * @arg =!channelCount
+ * @arg =!bufferSize
+ * @arg =!sampleRate
+ *
+ * @param {Function} readFn A callback to handle the buffer fills.
+ * @param {Number} channelCount Channel count.
+ * @param {Number} bufferSize (Optional) Specifies a pre-buffer size to control the amount of latency.
+ * @param {Number} sampleRate Sample rate (ms).
+ * @param {Number} default=0 writePosition Write position of the sink, as in how many samples have been written per channel.
+ * @param {String} default=async writeMode The default mode of writing to the sink.
+ * @param {String} default=interleaved channelMode The mode in which the sink asks the sample buffers to be channeled in.
+ * @param {Number} default=0 previousHit The previous time of a callback.
+ * @param {Buffer} default=null ringBuffer The ring buffer array of the sink. If null, ring buffering will not be applied.
+ * @param {Number} default=0 ringOffset The current position of the ring buffer.
+*/
+function Sink (readFn, channelCount, bufferSize, sampleRate) {
+	var	sinks	= Sink.sinks.list,
+		i;
+	for (i=0; i<sinks.length; i++) {
+		if (sinks[i].enabled) {
+			try {
+				return new sinks[i](readFn, channelCount, bufferSize, sampleRate);
+			} catch(e1){}
+		}
+	}
+
+	throw Sink.Error(0x02);
+}
+
+function SinkClass () {
+}
+
+Sink.SinkClass = SinkClass;
+
+SinkClass.prototype = Sink.prototype = {
+	sampleRate: 44100,
+	channelCount: 2,
+	bufferSize: 4096,
+
+	writePosition: 0,
+	previousHit: 0,
+	ringOffset: 0,
+
+	channelMode: 'interleaved',
+	isReady: false,
+
+/**
+ * Does the initialization of the sink.
+ * @method Sink
+*/
+	start: function (readFn, channelCount, bufferSize, sampleRate) {
+		this.channelCount	= isNaN(channelCount) || channelCount === null ? this.channelCount: channelCount;
+		this.bufferSize		= isNaN(bufferSize) || bufferSize === null ? this.bufferSize : bufferSize;
+		this.sampleRate		= isNaN(sampleRate) || sampleRate === null ? this.sampleRate : sampleRate;
+		this.readFn		= readFn;
+		this.activeRecordings	= [];
+		this.previousHit	= +new Date();
+		Sink.EventEmitter.call(this);
+		Sink.emit('init', [this].concat([].slice.call(arguments)));
+	},
+/**
+ * The method which will handle all the different types of processing applied on a callback.
+ * @method Sink
+*/
+	process: function (soundData, channelCount) {
+		this.emit('preprocess', arguments);
+
+		if (this.ringBuffer) {
+			(this.channelMode === 'interleaved' ? this.ringSpin : this.ringSpinInterleaved).apply(this, arguments);
+		}
+
+		if (this.channelMode === 'interleaved') {
+			this.emit('audioprocess', arguments);
+
+			if (this.readFn) {
+				this.readFn.apply(this, arguments);
+			}
+		} else {
+			var	soundDataSplit	= Sink.deinterleave(soundData, this.channelCount),
+				args		= [soundDataSplit].concat([].slice.call(arguments, 1));
+			this.emit('audioprocess', args);
+
+			if (this.readFn) {
+				this.readFn.apply(this, args);
+			}
+
+			Sink.interleave(soundDataSplit, this.channelCount, soundData);
+		}
+		this.emit('postprocess', arguments);
+		this.previousHit = +new Date();
+		this.writePosition += soundData.length / channelCount;
+	},
+/**
+ * Get the current output position, defaults to writePosition - bufferSize.
+ *
+ * @method Sink
+ *
+ * @return {Number} The position of the write head, in samples, per channel.
+*/
+	getPlaybackTime: function () {
+		return this.writePosition - this.bufferSize;
+	},
+/**
+ * Internal method to send the ready signal if not ready yet.
+ * @method Sink
+*/
+	ready: function () {
+		if (this.isReady) return;
+
+		this.isReady = true;
+		this.emit('ready', []);
+	}
+};
+
+/**
+ * The container for all the available sinks. Also a decorator function for creating a new Sink class and binding it.
+ *
+ * @method Sink
+ * @static
+ *
+ * @arg {String} type The name / type of the Sink.
+ * @arg {Function} constructor The constructor function for the Sink.
+ * @arg {Object} prototype The prototype of the Sink. (optional)
+ * @arg {Boolean} disabled Whether the Sink should be disabled at first.
+*/
+
+function sinks (type, constructor, prototype, disabled, priority) {
+	prototype = prototype || constructor.prototype;
+	constructor.prototype = new Sink.SinkClass();
+	constructor.prototype.type = type;
+	constructor.enabled = !disabled;
+
+	var k;
+	for (k in prototype) {
+		if (prototype.hasOwnProperty(k)) {
+			constructor.prototype[k] = prototype[k];
+		}
+	}
+
+	sinks[type] = constructor;
+	sinks.list[priority ? 'unshift' : 'push'](constructor);
+}
+
+Sink.sinks = Sink.devices = sinks;
+Sink.sinks.list = [];
+
+Sink.singleton = function () {
+	var sink = Sink.apply(null, arguments);
+
+	Sink.singleton = function () {
+		return sink;
+	};
+
+	return sink;
+};
+
+global.Sink = Sink;
+
+return Sink;
+
+}(function (){ return this; }());
+void function (Sink) {
+
+/**
+ * A light event emitter.
+ *
+ * @class
+ * @static Sink
+*/
+function EventEmitter () {
+	var k;
+	for (k in EventEmitter.prototype) {
+		if (EventEmitter.prototype.hasOwnProperty(k)) {
+			this[k] = EventEmitter.prototype[k];
+		}
+	}
+	this._listeners = {};
+}
+
+EventEmitter.prototype = {
+	_listeners: null,
+/**
+ * Emits an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event to emit.
+ * @arg {Array} args The arguments to pass to the event handlers.
+*/
+	emit: function (name, args) {
+		if (this._listeners[name]) {
+			for (var i=0; i<this._listeners[name].length; i++) {
+				this._listeners[name][i].apply(this, args);
+			}
+		}
+		return this;
+	},
+/**
+ * Adds an event listener to an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event.
+ * @arg {Function} listener The event listener to attach to the event.
+*/
+	on: function (name, listener) {
+		this._listeners[name] = this._listeners[name] || [];
+		this._listeners[name].push(listener);
+		return this;
+	},
+/**
+ * Adds an event listener to an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event.
+ * @arg {Function} !listener The event listener to remove from the event. If not specified, will delete all.
+*/
+	off: function (name, listener) {
+		if (this._listeners[name]) {
+			if (!listener) {
+				delete this._listeners[name];
+				return this;
+			}
+
+			for (var i=0; i<this._listeners[name].length; i++) {
+				if (this._listeners[name][i] === listener) {
+					this._listeners[name].splice(i--, 1);
+				}
+			}
+
+			if (!this._listeners[name].length) {
+				delete this._listeners[name];
+			}
+		}
+		return this;
+	}
+};
+
+Sink.EventEmitter = EventEmitter;
+
+EventEmitter.call(Sink);
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * Creates a timer with consistent (ie. not clamped) intervals even in background tabs.
+ * Uses inline workers to achieve this. If not available, will revert to regular timers.
+ *
+ * @static Sink
+ * @name doInterval
+ *
+ * @arg {Function} callback The callback to trigger on timer hit.
+ * @arg {Number} timeout The interval between timer hits.
+ *
+ * @return {Function} A function to cancel the timer.
+*/
+
+Sink.doInterval = function (callback, timeout) {
+	var timer, kill;
+
+	function create (noWorker) {
+		if (Sink.inlineWorker.working && !noWorker) {
+			timer = Sink.inlineWorker('setInterval(function (){ postMessage("tic"); }, ' + timeout + ');');
+			timer.onmessage = function (){
+				callback();
+			};
+			kill = function () {
+				timer.terminate();
+			};
+		} else {
+			timer = setInterval(callback, timeout);
+			kill = function (){
+				clearInterval(timer);
+			};
+		}
+	}
+
+	if (Sink.inlineWorker.ready) {
+		create();
+	} else {
+		Sink.inlineWorker.on('ready', function () {
+			create();
+		});
+	}
+
+	return function () {
+		if (!kill) {
+			if (!Sink.inlineWorker.ready) {
+				Sink.inlineWorker.on('ready', function () {
+					if (kill) kill();
+				});
+			}
+		} else {
+			kill();
+		}
+	};
+};
+
+}(this.Sink);
+void function (Sink) {
+
+var _Blob, _BlobBuilder, _URL, _btoa;
+
+void function (prefixes, urlPrefixes) {
+	function find (name, prefixes) {
+		var b, a = prefixes.slice();
+
+		for (b=a.shift(); typeof b !== 'undefined'; b=a.shift()) {
+			b = Function('return typeof ' + b + name + 
+				'=== "undefined" ? undefined : ' +
+				b + name)();
+
+			if (b) return b;
+		}
+	}
+
+	_Blob = find('Blob', prefixes);
+	_BlobBuilder = find('BlobBuilder', prefixes);
+	_URL = find('URL', urlPrefixes);
+	_btoa = find('btoa', ['']);
+}([
+	'',
+	'Moz',
+	'WebKit',
+	'MS'
+], [
+	'',
+	'webkit'
+]);
+
+var createBlob = _Blob && _URL && function (content, type) {
+	return _URL.createObjectURL(new _Blob([content], { type: type }));
+};
+
+var createBlobBuilder = _BlobBuilder && _URL && function (content, type) {
+	var bb = new _BlobBuilder();
+	bb.append(content);
+
+	return _URL.createObjectURL(bb.getBlob(type));
+};
+
+var createData = _btoa && function (content, type) {
+	return 'data:' + type + ';base64,' + _btoa(content);
+};
+
+var createDynURL =
+	createBlob ||
+	createBlobBuilder ||
+	createData;
+
+if (!createDynURL) return;
+
+if (createBlob) createDynURL.createBlob = createBlob;
+if (createBlobBuilder) createDynURL.createBlobBuilder = createBlobBuilder;
+if (createData) createDynURL.createData = createData;
+
+if (_Blob) createDynURL.Blob = _Blob;
+if (_BlobBuilder) createDynURL.BlobBuilder = _BlobBuilder;
+if (_URL) createDynURL.URL = _URL;
+
+Sink.createDynURL = createDynURL;
+
+Sink.revokeDynURL = function (url) {
+	if (typeof url === 'string' && url.indexOf('data:') === 0) {
+		return false;
+	} else {
+		return _URL.revokeObjectURL(url);
+	}
+};
+
+}(this.Sink);
+void function (Sink) {
+
+/*
+ * A Sink-specific error class.
+ *
+ * @class
+ * @static Sink
+ * @name Error
+ *
+ * @arg =code
+ *
+ * @param {Number} code The error code.
+ * @param {String} message A brief description of the error.
+ * @param {String} explanation A more verbose explanation of why the error occured and how to fix.
+*/
+
+function SinkError(code) {
+	if (!SinkError.hasOwnProperty(code)) throw SinkError(1);
+	if (!(this instanceof SinkError)) return new SinkError(code);
+
+	var k;
+	for (k in SinkError[code]) {
+		if (SinkError[code].hasOwnProperty(k)) {
+			this[k] = SinkError[code][k];
+		}
+	}
+
+	this.code = code;
+}
+
+SinkError.prototype = new Error();
+
+SinkError.prototype.toString = function () {
+	return 'SinkError 0x' + this.code.toString(16) + ': ' + this.message;
+};
+
+SinkError[0x01] = {
+	message: 'No such error code.',
+	explanation: 'The error code does not exist.'
+};
+SinkError[0x02] = {
+	message: 'No audio sink available.',
+	explanation: 'The audio device may be busy, or no supported output API is available for this browser.'
+};
+
+SinkError[0x10] = {
+	message: 'Buffer underflow.',
+	explanation: 'Trying to recover...'
+};
+SinkError[0x11] = {
+	message: 'Critical recovery fail.',
+	explanation: 'The buffer underflow has reached a critical point, trying to recover, but will probably fail anyway.'
+};
+SinkError[0x12] = {
+	message: 'Buffer size too large.',
+	explanation: 'Unable to allocate the buffer due to excessive length, please try a smaller buffer. Buffer size should probably be smaller than the sample rate.'
+};
+
+Sink.Error = SinkError;
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * Creates an inline worker using a data/blob URL, if possible.
+ *
+ * @static Sink
+ *
+ * @arg {String} script
+ *
+ * @return {Worker} A web worker, or null if impossible to create.
+*/
+
+var define = Object.defineProperty ? function (obj, name, value) {
+	Object.defineProperty(obj, name, {
+		value: value,
+		configurable: true,
+		writable: true
+	});
+} : function (obj, name, value) {
+	obj[name] = value;
+};
+
+function terminate () {
+	define(this, 'terminate', this._terminate);
+
+	Sink.revokeDynURL(this._url);
+
+	delete this._url;
+	delete this._terminate;
+	return this.terminate();
+}
+
+function inlineWorker (script) {
+	function wrap (type, content, typeName) {
+		try {
+			var url = type(content, 'text/javascript');
+			var worker = new Worker(url);
+
+			define(worker, '_url', url);
+			define(worker, '_terminate', worker.terminate);
+			define(worker, 'terminate', terminate);
+
+			if (inlineWorker.type) return worker;
+
+			inlineWorker.type = typeName;
+			inlineWorker.createURL = type;
+
+			return worker;
+		} catch (e) {
+			return null;
+		}
+	}
+
+	var createDynURL = Sink.createDynURL;
+
+	if (!createDynURL) return null;
+
+	var worker;
+
+	if (inlineWorker.createURL) {
+		return wrap(inlineWorker.createURL, script, inlineWorker.type);
+	}
+
+	worker = wrap(createDynURL.createBlob, script, 'blob');
+	if (worker) return worker;
+
+	worker = wrap(createDynURL.createBlobBuilder, script, 'blobbuilder');
+	if (worker) return worker;
+
+	worker = wrap(createDynURL.createData, script, 'data');
+
+	return worker;
+}
+
+Sink.EventEmitter.call(inlineWorker);
+
+inlineWorker.test = function () {
+	inlineWorker.ready = inlineWorker.working = false;
+	inlineWorker.type = '';
+	inlineWorker.createURL = null;
+
+	var worker = inlineWorker('this.onmessage=function(e){postMessage(e.data)}');
+	var data = 'inlineWorker';
+
+	function ready (success) {
+		if (inlineWorker.ready) return;
+
+		inlineWorker.ready = true;
+		inlineWorker.working = success;
+		inlineWorker.emit('ready', [success]);
+		inlineWorker.off('ready');
+
+		if (success && worker) {
+			worker.terminate();
+		}
+
+		worker = null;
+	}
+
+	if (!worker) {
+		setTimeout(function () {
+			ready(false);
+		}, 0);
+	} else {
+		worker.onmessage = function (e) {
+			ready(e.data === data);
+		};
+
+		worker.postMessage(data);
+
+		setTimeout(function () {
+			ready(false);
+		}, 1000);
+	}
+};
+
+Sink.inlineWorker = inlineWorker;
+
+inlineWorker.test();
+
+}(this.Sink);
+ (function (sinks, fixChrome82795) {
+
+var AudioContext = typeof window === 'undefined' ? null : window.webkitAudioContext || window.AudioContext;
+
+/**
+ * A sink class for the Web Audio API
+*/
+
+sinks('webaudio', function (readFn, channelCount, bufferSize, sampleRate) {
+	var	self		= this,
+		context		= sinks.webaudio.getContext(),
+		node		= null,
+		soundData	= null,
+		zeroBuffer	= null;
+	self.start.apply(self, arguments);
+	node = context.createJavaScriptNode(self.bufferSize, self.channelCount, self.channelCount);
+
+	function bufferFill(e) {
+		var	outputBuffer	= e.outputBuffer,
+			channelCount	= outputBuffer.numberOfChannels,
+			i, n, l		= outputBuffer.length,
+			size		= outputBuffer.size,
+			channels	= new Array(channelCount),
+			tail;
+
+		self.ready();
+		
+		soundData	= soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
+		zeroBuffer	= zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
+		soundData.set(zeroBuffer);
+
+		for (i=0; i<channelCount; i++) {
+			channels[i] = outputBuffer.getChannelData(i);
+		}
+
+		self.process(soundData, self.channelCount);
+
+		for (i=0; i<l; i++) {
+			for (n=0; n < channelCount; n++) {
+				channels[n][i] = soundData[i * self.channelCount + n];
+			}
+		}
+	}
+
+	self.sampleRate = context.sampleRate;
+
+	node.onaudioprocess = bufferFill;
+	node.connect(context.destination);
+
+	self._context		= context;
+	self._node		= node;
+	self._callback		= bufferFill;
+	/* Keep references in order to avoid garbage collection removing the listeners, working around http://code.google.com/p/chromium/issues/detail?id=82795 */
+	// Thanks to @baffo32
+	fixChrome82795.push(node);
+}, {
+	kill: function () {
+		this._node.disconnect(0);
+
+		for (var i=0; i<fixChrome82795.length; i++) {
+			if (fixChrome82795[i] === this._node) {
+				fixChrome82795.splice(i--, 1);
+			}
+		}
+
+		this._node = this._context = null;
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._context.currentTime * this.sampleRate;
+	}
+}, false, true);
+
+sinks.webkit = sinks.webaudio;
+
+sinks.webaudio.fix82795 = fixChrome82795;
+
+sinks.webaudio.getContext = function () {
+	// For now, we have to accept that the AudioContext is at 48000Hz, or whatever it decides.
+	var context = new AudioContext(/*sampleRate*/);
+
+	sinks.webaudio.getContext = function () {
+		return context;
+	};
+
+	return context;
+};
+
+}(this.Sink.sinks, []));
+void function (Sink) {
+
+/**
+ * A Sink class for the Mozilla Audio Data API.
+*/
+
+Sink.sinks('audiodata', function () {
+	var	self			= this,
+		currentWritePosition	= 0,
+		tail			= null,
+		audioDevice		= new Audio(),
+		written, currentPosition, available, soundData, prevPos,
+		timer; // Fix for https://bugzilla.mozilla.org/show_bug.cgi?id=630117
+	self.start.apply(self, arguments);
+	self.preBufferSize = isNaN(arguments[4]) || arguments[4] === null ? this.preBufferSize : arguments[4];
+
+	function bufferFill() {
+		if (tail) {
+			written = audioDevice.mozWriteAudio(tail);
+			currentWritePosition += written;
+			if (written < tail.length){
+				tail = tail.subarray(written);
+				return tail;
+			}
+			tail = null;
+		}
+
+		currentPosition = audioDevice.mozCurrentSampleOffset();
+		available = Number(currentPosition + (prevPos !== currentPosition ? self.bufferSize : self.preBufferSize) * self.channelCount - currentWritePosition);
+
+		if (currentPosition === prevPos) {
+			self.emit('error', [Sink.Error(0x10)]);
+		}
+
+		if (available > 0 || prevPos === currentPosition){
+			self.ready();
+
+			try {
+				soundData = new Float32Array(prevPos === currentPosition ? self.preBufferSize * self.channelCount :
+					self.forceBufferSize ? available < self.bufferSize * 2 ? self.bufferSize * 2 : available : available);
+			} catch(e) {
+				self.emit('error', [Sink.Error(0x12)]);
+				self.kill();
+				return;
+			}
+			self.process(soundData, self.channelCount);
+			written = self._audio.mozWriteAudio(soundData);
+			if (written < soundData.length){
+				tail = soundData.subarray(written);
+			}
+			currentWritePosition += written;
+		}
+		prevPos = currentPosition;
+	}
+
+	audioDevice.mozSetup(self.channelCount, self.sampleRate);
+
+	this._timers = [];
+
+	this._timers.push(Sink.doInterval(function () {
+		// Check for complete death of the output
+		if (+new Date() - self.previousHit > 2000) {
+			self._audio = audioDevice = new Audio();
+			audioDevice.mozSetup(self.channelCount, self.sampleRate);
+			currentWritePosition = 0;
+			self.emit('error', [Sink.Error(0x11)]);
+		}
+	}, 1000));
+
+	this._timers.push(Sink.doInterval(bufferFill, self.interval));
+
+	self._bufferFill	= bufferFill;
+	self._audio		= audioDevice;
+}, {
+	// These are somewhat safe values...
+	bufferSize: 24576,
+	preBufferSize: 24576,
+	forceBufferSize: false,
+	interval: 100,
+
+	kill: function () {
+		while (this._timers.length) {
+			this._timers.shift()();
+		}
+
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._audio.mozCurrentSampleOffset() / this.channelCount;
+	}
+}, false, true);
+
+Sink.sinks.moz = Sink.sinks.audiodata;
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/script/sink.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/sink.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/sink.js	(revision 28388)
@@ -0,0 +1,1718 @@
+var Sink = this.Sink = function (global) {
+
+/**
+ * Creates a Sink according to specified parameters, if possible.
+ *
+ * @class
+ *
+ * @arg =!readFn
+ * @arg =!channelCount
+ * @arg =!bufferSize
+ * @arg =!sampleRate
+ *
+ * @param {Function} readFn A callback to handle the buffer fills.
+ * @param {Number} channelCount Channel count.
+ * @param {Number} bufferSize (Optional) Specifies a pre-buffer size to control the amount of latency.
+ * @param {Number} sampleRate Sample rate (ms).
+ * @param {Number} default=0 writePosition Write position of the sink, as in how many samples have been written per channel.
+ * @param {String} default=async writeMode The default mode of writing to the sink.
+ * @param {String} default=interleaved channelMode The mode in which the sink asks the sample buffers to be channeled in.
+ * @param {Number} default=0 previousHit The previous time of a callback.
+ * @param {Buffer} default=null ringBuffer The ring buffer array of the sink. If null, ring buffering will not be applied.
+ * @param {Number} default=0 ringOffset The current position of the ring buffer.
+*/
+function Sink (readFn, channelCount, bufferSize, sampleRate) {
+	var	sinks	= Sink.sinks.list,
+		i;
+	for (i=0; i<sinks.length; i++) {
+		if (sinks[i].enabled) {
+			try {
+				return new sinks[i](readFn, channelCount, bufferSize, sampleRate);
+			} catch(e1){}
+		}
+	}
+
+	throw Sink.Error(0x02);
+}
+
+function SinkClass () {
+}
+
+Sink.SinkClass = SinkClass;
+
+SinkClass.prototype = Sink.prototype = {
+	sampleRate: 44100,
+	channelCount: 2,
+	bufferSize: 4096,
+
+	writePosition: 0,
+	previousHit: 0,
+	ringOffset: 0,
+
+	channelMode: 'interleaved',
+	isReady: false,
+
+/**
+ * Does the initialization of the sink.
+ * @method Sink
+*/
+	start: function (readFn, channelCount, bufferSize, sampleRate) {
+		this.channelCount	= isNaN(channelCount) || channelCount === null ? this.channelCount: channelCount;
+		this.bufferSize		= isNaN(bufferSize) || bufferSize === null ? this.bufferSize : bufferSize;
+		this.sampleRate		= isNaN(sampleRate) || sampleRate === null ? this.sampleRate : sampleRate;
+		this.readFn		= readFn;
+		this.activeRecordings	= [];
+		this.previousHit	= +new Date();
+		Sink.EventEmitter.call(this);
+		Sink.emit('init', [this].concat([].slice.call(arguments)));
+	},
+/**
+ * The method which will handle all the different types of processing applied on a callback.
+ * @method Sink
+*/
+	process: function (soundData, channelCount) {
+		this.emit('preprocess', arguments);
+
+		if (this.ringBuffer) {
+			(this.channelMode === 'interleaved' ? this.ringSpin : this.ringSpinInterleaved).apply(this, arguments);
+		}
+
+		if (this.channelMode === 'interleaved') {
+			this.emit('audioprocess', arguments);
+
+			if (this.readFn) {
+				this.readFn.apply(this, arguments);
+			}
+		} else {
+			var	soundDataSplit	= Sink.deinterleave(soundData, this.channelCount),
+				args		= [soundDataSplit].concat([].slice.call(arguments, 1));
+			this.emit('audioprocess', args);
+
+			if (this.readFn) {
+				this.readFn.apply(this, args);
+			}
+
+			Sink.interleave(soundDataSplit, this.channelCount, soundData);
+		}
+		this.emit('postprocess', arguments);
+		this.previousHit = +new Date();
+		this.writePosition += soundData.length / channelCount;
+	},
+/**
+ * Get the current output position, defaults to writePosition - bufferSize.
+ *
+ * @method Sink
+ *
+ * @return {Number} The position of the write head, in samples, per channel.
+*/
+	getPlaybackTime: function () {
+		return this.writePosition - this.bufferSize;
+	},
+/**
+ * Internal method to send the ready signal if not ready yet.
+ * @method Sink
+*/
+	ready: function () {
+		if (this.isReady) return;
+
+		this.isReady = true;
+		this.emit('ready', []);
+	}
+};
+
+/**
+ * The container for all the available sinks. Also a decorator function for creating a new Sink class and binding it.
+ *
+ * @method Sink
+ * @static
+ *
+ * @arg {String} type The name / type of the Sink.
+ * @arg {Function} constructor The constructor function for the Sink.
+ * @arg {Object} prototype The prototype of the Sink. (optional)
+ * @arg {Boolean} disabled Whether the Sink should be disabled at first.
+*/
+
+function sinks (type, constructor, prototype, disabled, priority) {
+	prototype = prototype || constructor.prototype;
+	constructor.prototype = new Sink.SinkClass();
+	constructor.prototype.type = type;
+	constructor.enabled = !disabled;
+
+	var k;
+	for (k in prototype) {
+		if (prototype.hasOwnProperty(k)) {
+			constructor.prototype[k] = prototype[k];
+		}
+	}
+
+	sinks[type] = constructor;
+	sinks.list[priority ? 'unshift' : 'push'](constructor);
+}
+
+Sink.sinks = Sink.devices = sinks;
+Sink.sinks.list = [];
+
+Sink.singleton = function () {
+	var sink = Sink.apply(null, arguments);
+
+	Sink.singleton = function () {
+		return sink;
+	};
+
+	return sink;
+};
+
+global.Sink = Sink;
+
+return Sink;
+
+}(function (){ return this; }());
+void function (Sink) {
+
+/**
+ * A light event emitter.
+ *
+ * @class
+ * @static Sink
+*/
+function EventEmitter () {
+	var k;
+	for (k in EventEmitter.prototype) {
+		if (EventEmitter.prototype.hasOwnProperty(k)) {
+			this[k] = EventEmitter.prototype[k];
+		}
+	}
+	this._listeners = {};
+}
+
+EventEmitter.prototype = {
+	_listeners: null,
+/**
+ * Emits an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event to emit.
+ * @arg {Array} args The arguments to pass to the event handlers.
+*/
+	emit: function (name, args) {
+		if (this._listeners[name]) {
+			for (var i=0; i<this._listeners[name].length; i++) {
+				this._listeners[name][i].apply(this, args);
+			}
+		}
+		return this;
+	},
+/**
+ * Adds an event listener to an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event.
+ * @arg {Function} listener The event listener to attach to the event.
+*/
+	on: function (name, listener) {
+		this._listeners[name] = this._listeners[name] || [];
+		this._listeners[name].push(listener);
+		return this;
+	},
+/**
+ * Adds an event listener to an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event.
+ * @arg {Function} !listener The event listener to remove from the event. If not specified, will delete all.
+*/
+	off: function (name, listener) {
+		if (this._listeners[name]) {
+			if (!listener) {
+				delete this._listeners[name];
+				return this;
+			}
+
+			for (var i=0; i<this._listeners[name].length; i++) {
+				if (this._listeners[name][i] === listener) {
+					this._listeners[name].splice(i--, 1);
+				}
+			}
+
+			if (!this._listeners[name].length) {
+				delete this._listeners[name];
+			}
+		}
+		return this;
+	}
+};
+
+Sink.EventEmitter = EventEmitter;
+
+EventEmitter.call(Sink);
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * Creates a timer with consistent (ie. not clamped) intervals even in background tabs.
+ * Uses inline workers to achieve this. If not available, will revert to regular timers.
+ *
+ * @static Sink
+ * @name doInterval
+ *
+ * @arg {Function} callback The callback to trigger on timer hit.
+ * @arg {Number} timeout The interval between timer hits.
+ *
+ * @return {Function} A function to cancel the timer.
+*/
+
+Sink.doInterval = function (callback, timeout) {
+	var timer, kill;
+
+	function create (noWorker) {
+		if (Sink.inlineWorker.working && !noWorker) {
+			timer = Sink.inlineWorker('setInterval(function (){ postMessage("tic"); }, ' + timeout + ');');
+			timer.onmessage = function (){
+				callback();
+			};
+			kill = function () {
+				timer.terminate();
+			};
+		} else {
+			timer = setInterval(callback, timeout);
+			kill = function (){
+				clearInterval(timer);
+			};
+		}
+	}
+
+	if (Sink.inlineWorker.ready) {
+		create();
+	} else {
+		Sink.inlineWorker.on('ready', function () {
+			create();
+		});
+	}
+
+	return function () {
+		if (!kill) {
+			if (!Sink.inlineWorker.ready) {
+				Sink.inlineWorker.on('ready', function () {
+					if (kill) kill();
+				});
+			}
+		} else {
+			kill();
+		}
+	};
+};
+
+}(this.Sink);
+void function (Sink) {
+
+var _Blob, _BlobBuilder, _URL, _btoa;
+
+void function (prefixes, urlPrefixes) {
+	function find (name, prefixes) {
+		var b, a = prefixes.slice();
+
+		for (b=a.shift(); typeof b !== 'undefined'; b=a.shift()) {
+			b = Function('return typeof ' + b + name + 
+				'=== "undefined" ? undefined : ' +
+				b + name)();
+
+			if (b) return b;
+		}
+	}
+
+	_Blob = find('Blob', prefixes);
+	_BlobBuilder = find('BlobBuilder', prefixes);
+	_URL = find('URL', urlPrefixes);
+	_btoa = find('btoa', ['']);
+}([
+	'',
+	'Moz',
+	'WebKit',
+	'MS'
+], [
+	'',
+	'webkit'
+]);
+
+var createBlob = _Blob && _URL && function (content, type) {
+	return _URL.createObjectURL(new _Blob([content], { type: type }));
+};
+
+var createBlobBuilder = _BlobBuilder && _URL && function (content, type) {
+	var bb = new _BlobBuilder();
+	bb.append(content);
+
+	return _URL.createObjectURL(bb.getBlob(type));
+};
+
+var createData = _btoa && function (content, type) {
+	return 'data:' + type + ';base64,' + _btoa(content);
+};
+
+var createDynURL =
+	createBlob ||
+	createBlobBuilder ||
+	createData;
+
+if (!createDynURL) return;
+
+if (createBlob) createDynURL.createBlob = createBlob;
+if (createBlobBuilder) createDynURL.createBlobBuilder = createBlobBuilder;
+if (createData) createDynURL.createData = createData;
+
+if (_Blob) createDynURL.Blob = _Blob;
+if (_BlobBuilder) createDynURL.BlobBuilder = _BlobBuilder;
+if (_URL) createDynURL.URL = _URL;
+
+Sink.createDynURL = createDynURL;
+
+Sink.revokeDynURL = function (url) {
+	if (typeof url === 'string' && url.indexOf('data:') === 0) {
+		return false;
+	} else {
+		return _URL.revokeObjectURL(url);
+	}
+};
+
+}(this.Sink);
+void function (Sink) {
+
+/*
+ * A Sink-specific error class.
+ *
+ * @class
+ * @static Sink
+ * @name Error
+ *
+ * @arg =code
+ *
+ * @param {Number} code The error code.
+ * @param {String} message A brief description of the error.
+ * @param {String} explanation A more verbose explanation of why the error occured and how to fix.
+*/
+
+function SinkError(code) {
+	if (!SinkError.hasOwnProperty(code)) throw SinkError(1);
+	if (!(this instanceof SinkError)) return new SinkError(code);
+
+	var k;
+	for (k in SinkError[code]) {
+		if (SinkError[code].hasOwnProperty(k)) {
+			this[k] = SinkError[code][k];
+		}
+	}
+
+	this.code = code;
+}
+
+SinkError.prototype = new Error();
+
+SinkError.prototype.toString = function () {
+	return 'SinkError 0x' + this.code.toString(16) + ': ' + this.message;
+};
+
+SinkError[0x01] = {
+	message: 'No such error code.',
+	explanation: 'The error code does not exist.'
+};
+SinkError[0x02] = {
+	message: 'No audio sink available.',
+	explanation: 'The audio device may be busy, or no supported output API is available for this browser.'
+};
+
+SinkError[0x10] = {
+	message: 'Buffer underflow.',
+	explanation: 'Trying to recover...'
+};
+SinkError[0x11] = {
+	message: 'Critical recovery fail.',
+	explanation: 'The buffer underflow has reached a critical point, trying to recover, but will probably fail anyway.'
+};
+SinkError[0x12] = {
+	message: 'Buffer size too large.',
+	explanation: 'Unable to allocate the buffer due to excessive length, please try a smaller buffer. Buffer size should probably be smaller than the sample rate.'
+};
+
+Sink.Error = SinkError;
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * Creates an inline worker using a data/blob URL, if possible.
+ *
+ * @static Sink
+ *
+ * @arg {String} script
+ *
+ * @return {Worker} A web worker, or null if impossible to create.
+*/
+
+var define = Object.defineProperty ? function (obj, name, value) {
+	Object.defineProperty(obj, name, {
+		value: value,
+		configurable: true,
+		writable: true
+	});
+} : function (obj, name, value) {
+	obj[name] = value;
+};
+
+function terminate () {
+	define(this, 'terminate', this._terminate);
+
+	Sink.revokeDynURL(this._url);
+
+	delete this._url;
+	delete this._terminate;
+	return this.terminate();
+}
+
+function inlineWorker (script) {
+	function wrap (type, content, typeName) {
+		try {
+			var url = type(content, 'text/javascript');
+			var worker = new Worker(url);
+
+			define(worker, '_url', url);
+			define(worker, '_terminate', worker.terminate);
+			define(worker, 'terminate', terminate);
+
+			if (inlineWorker.type) return worker;
+
+			inlineWorker.type = typeName;
+			inlineWorker.createURL = type;
+
+			return worker;
+		} catch (e) {
+			return null;
+		}
+	}
+
+	var createDynURL = Sink.createDynURL;
+
+	if (!createDynURL) return null;
+
+	var worker;
+
+	if (inlineWorker.createURL) {
+		return wrap(inlineWorker.createURL, script, inlineWorker.type);
+	}
+
+	worker = wrap(createDynURL.createBlob, script, 'blob');
+	if (worker) return worker;
+
+	worker = wrap(createDynURL.createBlobBuilder, script, 'blobbuilder');
+	if (worker) return worker;
+
+	worker = wrap(createDynURL.createData, script, 'data');
+
+	return worker;
+}
+
+Sink.EventEmitter.call(inlineWorker);
+
+inlineWorker.test = function () {
+	inlineWorker.ready = inlineWorker.working = false;
+	inlineWorker.type = '';
+	inlineWorker.createURL = null;
+
+	var worker = inlineWorker('this.onmessage=function(e){postMessage(e.data)}');
+	var data = 'inlineWorker';
+
+	function ready (success) {
+		if (inlineWorker.ready) return;
+
+		inlineWorker.ready = true;
+		inlineWorker.working = success;
+		inlineWorker.emit('ready', [success]);
+		inlineWorker.off('ready');
+
+		if (success && worker) {
+			worker.terminate();
+		}
+
+		worker = null;
+	}
+
+	if (!worker) {
+		setTimeout(function () {
+			ready(false);
+		}, 0);
+	} else {
+		worker.onmessage = function (e) {
+			ready(e.data === data);
+		};
+
+		worker.postMessage(data);
+
+		setTimeout(function () {
+			ready(false);
+		}, 1000);
+	}
+};
+
+Sink.inlineWorker = inlineWorker;
+
+inlineWorker.test();
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * A Sink class for the Mozilla Audio Data API.
+*/
+
+Sink.sinks('audiodata', function () {
+	var	self			= this,
+		currentWritePosition	= 0,
+		tail			= null,
+		audioDevice		= new Audio(),
+		written, currentPosition, available, soundData, prevPos,
+		timer; // Fix for https://bugzilla.mozilla.org/show_bug.cgi?id=630117
+	self.start.apply(self, arguments);
+	self.preBufferSize = isNaN(arguments[4]) || arguments[4] === null ? this.preBufferSize : arguments[4];
+
+	function bufferFill() {
+		if (tail) {
+			written = audioDevice.mozWriteAudio(tail);
+			currentWritePosition += written;
+			if (written < tail.length){
+				tail = tail.subarray(written);
+				return tail;
+			}
+			tail = null;
+		}
+
+		currentPosition = audioDevice.mozCurrentSampleOffset();
+		available = Number(currentPosition + (prevPos !== currentPosition ? self.bufferSize : self.preBufferSize) * self.channelCount - currentWritePosition);
+
+		if (currentPosition === prevPos) {
+			self.emit('error', [Sink.Error(0x10)]);
+		}
+
+		if (available > 0 || prevPos === currentPosition){
+			self.ready();
+
+			try {
+				soundData = new Float32Array(prevPos === currentPosition ? self.preBufferSize * self.channelCount :
+					self.forceBufferSize ? available < self.bufferSize * 2 ? self.bufferSize * 2 : available : available);
+			} catch(e) {
+				self.emit('error', [Sink.Error(0x12)]);
+				self.kill();
+				return;
+			}
+			self.process(soundData, self.channelCount);
+			written = self._audio.mozWriteAudio(soundData);
+			if (written < soundData.length){
+				tail = soundData.subarray(written);
+			}
+			currentWritePosition += written;
+		}
+		prevPos = currentPosition;
+	}
+
+	audioDevice.mozSetup(self.channelCount, self.sampleRate);
+
+	this._timers = [];
+
+	this._timers.push(Sink.doInterval(function () {
+		// Check for complete death of the output
+		if (+new Date() - self.previousHit > 2000) {
+			self._audio = audioDevice = new Audio();
+			audioDevice.mozSetup(self.channelCount, self.sampleRate);
+			currentWritePosition = 0;
+			self.emit('error', [Sink.Error(0x11)]);
+		}
+	}, 1000));
+
+	this._timers.push(Sink.doInterval(bufferFill, self.interval));
+
+	self._bufferFill	= bufferFill;
+	self._audio		= audioDevice;
+}, {
+	// These are somewhat safe values...
+	bufferSize: 24576,
+	preBufferSize: 24576,
+	forceBufferSize: false,
+	interval: 100,
+
+	kill: function () {
+		while (this._timers.length) {
+			this._timers.shift()();
+		}
+
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._audio.mozCurrentSampleOffset() / this.channelCount;
+	}
+}, false, true);
+
+Sink.sinks.moz = Sink.sinks.audiodata;
+
+}(this.Sink);
+void function (Sink) {
+
+var cubeb;
+
+try {
+	cubeb = require('cubeb');
+} catch (e) {
+	return;
+}
+
+var getContext = function () {
+	var ctx;
+
+	return function () {
+		ctx = new cubeb.Context(
+			"sink.js " + process.pid + ' ' + new Date()
+		);
+
+		getContext = function () { return ctx; };
+
+		return ctx;
+	};
+}();
+
+var streamCount = 0;
+
+Sink.sinks('cubeb', function () {
+	var self = this;
+
+	self.start.apply(self, arguments);
+
+	self._ctx = getContext();
+	self._stream = new cubeb.Stream(
+		self._ctx,
+		self._ctx.name + ' ' + streamCount++,
+		cubeb.SAMPLE_FLOAT32LE,
+		self.channelCount,
+		self.sampleRate,
+		self.bufferSize,
+		self._latency,
+		function (frameCount) {
+			var buffer = new Buffer(
+				4 * frameCount * self.channelCount);
+			var soundData = new Float32Array(buffer);
+
+			self.process(soundData, self.channelCount);
+
+			self._stream.write(buffer);
+			self._stream.release();
+		},
+		function (state) {}
+	);
+
+	self._stream.start();
+}, {
+	_ctx: null,
+	_stream: null,
+	_latency: 250,
+	bufferSize: 4096,
+
+	kill: function () {
+		this._stream.stop();
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._stream.position;
+	}
+});
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * A dummy Sink. (No output)
+*/
+
+Sink.sinks('dummy', function () {
+	var	self = this;
+	self.start.apply(self, arguments);
+	
+	function bufferFill () {
+		var	soundData = new Float32Array(self.bufferSize * self.channelCount);
+		self.process(soundData, self.channelCount);
+	}
+
+	self._kill = Sink.doInterval(bufferFill, self.bufferSize / self.sampleRate * 1000);
+
+	self._callback		= bufferFill;
+}, {
+	kill: function () {
+		this._kill();
+		this.emit('kill');
+	}
+}, true);
+
+}(this.Sink);
+(function (Sink, sinks) {
+
+sinks = Sink.sinks;
+
+function newAudio (src) {
+	var audio = document.createElement('audio');
+	if (src) {
+		audio.src = src;
+	}
+	return audio;
+}
+
+/* TODO: Implement a <BGSOUND> hack for IE8. */
+
+/**
+ * A sink class for WAV data URLs
+ * Relies on pcmdata.js and utils to be present.
+ * Thanks to grantgalitz and others for the idea.
+*/
+sinks('wav', function () {
+	var	self			= this,
+		audio			= new sinks.wav.wavAudio(),
+		PCMData			= typeof PCMData === 'undefined' ? audioLib.PCMData : PCMData;
+	self.start.apply(self, arguments);
+	var	soundData		= new Float32Array(self.bufferSize * self.channelCount),
+		zeroData		= new Float32Array(self.bufferSize * self.channelCount);
+
+	if (!newAudio().canPlayType('audio/wav; codecs=1') || !btoa) throw 0;
+	
+	function bufferFill () {
+		if (self._audio.hasNextFrame) return;
+
+		self.ready();
+
+		Sink.memcpy(zeroData, 0, soundData, 0);
+		self.process(soundData, self.channelCount);
+
+		self._audio.setSource('data:audio/wav;base64,' + btoa(
+			audioLib.PCMData.encode({
+				data:		soundData,
+				sampleRate:	self.sampleRate,
+				channelCount:	self.channelCount,
+				bytesPerSample:	self.quality
+			})
+		));
+
+		if (!self._audio.currentFrame.src) self._audio.nextClip();
+	}
+	
+	self.kill		= Sink.doInterval(bufferFill, 40);
+	self._bufferFill	= bufferFill;
+	self._audio		= audio;
+}, {
+	quality: 1,
+	bufferSize: 22050,
+
+	getPlaybackTime: function () {
+		var audio = this._audio;
+		return (audio.currentFrame ? audio.currentFrame.currentTime * this.sampleRate : 0) + audio.samples;
+	}
+});
+
+function wavAudio () {
+	var self = this;
+
+	self.currentFrame	= newAudio();
+	self.nextFrame		= newAudio();
+
+	self._onended		= function () {
+		self.samples += self.bufferSize;
+		self.nextClip();
+	};
+}
+
+wavAudio.prototype = {
+	samples:	0,
+	nextFrame:	null,
+	currentFrame:	null,
+	_onended:	null,
+	hasNextFrame:	false,
+
+	nextClip: function () {
+		var	curFrame	= this.currentFrame;
+		this.currentFrame	= this.nextFrame;
+		this.nextFrame		= curFrame;
+		this.hasNextFrame	= false;
+		this.currentFrame.play();
+	},
+
+	setSource: function (src) {
+		this.nextFrame.src = src;
+		this.nextFrame.addEventListener('ended', this._onended, true);
+
+		this.hasNextFrame = true;
+	}
+};
+
+sinks.wav.wavAudio = wavAudio;
+
+}(this.Sink));
+ (function (sinks, fixChrome82795) {
+
+var AudioContext = typeof window === 'undefined' ? null : window.webkitAudioContext || window.AudioContext;
+
+/**
+ * A sink class for the Web Audio API
+*/
+
+sinks('webaudio', function (readFn, channelCount, bufferSize, sampleRate) {
+	var	self		= this,
+		context		= sinks.webaudio.getContext(),
+		node		= null,
+		soundData	= null,
+		zeroBuffer	= null;
+	self.start.apply(self, arguments);
+	node = context.createJavaScriptNode(self.bufferSize, self.channelCount, self.channelCount);
+
+	function bufferFill(e) {
+		var	outputBuffer	= e.outputBuffer,
+			channelCount	= outputBuffer.numberOfChannels,
+			i, n, l		= outputBuffer.length,
+			size		= outputBuffer.size,
+			channels	= new Array(channelCount),
+			tail;
+
+		self.ready();
+		
+		soundData	= soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
+		zeroBuffer	= zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
+		soundData.set(zeroBuffer);
+
+		for (i=0; i<channelCount; i++) {
+			channels[i] = outputBuffer.getChannelData(i);
+		}
+
+		self.process(soundData, self.channelCount);
+
+		for (i=0; i<l; i++) {
+			for (n=0; n < channelCount; n++) {
+				channels[n][i] = soundData[i * self.channelCount + n];
+			}
+		}
+	}
+
+	self.sampleRate = context.sampleRate;
+
+	node.onaudioprocess = bufferFill;
+	node.connect(context.destination);
+
+	self._context		= context;
+	self._node		= node;
+	self._callback		= bufferFill;
+	/* Keep references in order to avoid garbage collection removing the listeners, working around http://code.google.com/p/chromium/issues/detail?id=82795 */
+	// Thanks to @baffo32
+	fixChrome82795.push(node);
+}, {
+	kill: function () {
+		this._node.disconnect(0);
+
+		for (var i=0; i<fixChrome82795.length; i++) {
+			if (fixChrome82795[i] === this._node) {
+				fixChrome82795.splice(i--, 1);
+			}
+		}
+
+		this._node = this._context = null;
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._context.currentTime * this.sampleRate;
+	}
+}, false, true);
+
+sinks.webkit = sinks.webaudio;
+
+sinks.webaudio.fix82795 = fixChrome82795;
+
+sinks.webaudio.getContext = function () {
+	// For now, we have to accept that the AudioContext is at 48000Hz, or whatever it decides.
+	var context = new AudioContext(/*sampleRate*/);
+
+	sinks.webaudio.getContext = function () {
+		return context;
+	};
+
+	return context;
+};
+
+}(this.Sink.sinks, []));
+(function (Sink) {
+
+/**
+ * A Sink class for the Media Streams Processing API and/or Web Audio API in a Web Worker.
+*/
+
+Sink.sinks('worker', function () {
+	var	self		= this,
+		global		= (function(){ return this; }()),
+		soundData	= null,
+		outBuffer	= null,
+		zeroBuffer	= null;
+	self.start.apply(self, arguments);
+
+	// Let's see if we're in a worker.
+
+	importScripts();
+
+	function mspBufferFill (e) {
+		if (!self.isReady) {
+			self.initMSP(e);
+		}
+
+		self.ready();
+
+		var	channelCount	= self.channelCount,
+			l		= e.audioLength,
+			n, i;
+
+		soundData	= soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
+		outBuffer	= outBuffer && outBuffer.length === soundData.length ? outBuffer : new Float32Array(l * channelCount);
+		zeroBuffer	= zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
+
+		soundData.set(zeroBuffer);
+		outBuffer.set(zeroBuffer);
+
+		self.process(soundData, self.channelCount);
+
+		for (n=0; n<channelCount; n++) {
+			for (i=0; i<l; i++) {
+				outBuffer[n * e.audioLength + i] = soundData[n + i * channelCount];
+			}
+		}
+
+		e.writeAudio(outBuffer);
+	}
+
+	function waBufferFill(e) {
+		if (!self.isReady) {
+			self.initWA(e);
+		}
+
+		self.ready();
+
+		var	outputBuffer	= e.outputBuffer,
+			channelCount	= outputBuffer.numberOfChannels,
+			i, n, l		= outputBuffer.length,
+			size		= outputBuffer.size,
+			channels	= new Array(channelCount),
+			tail;
+		
+		soundData	= soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
+		zeroBuffer	= zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
+		soundData.set(zeroBuffer);
+
+		for (i=0; i<channelCount; i++) {
+			channels[i] = outputBuffer.getChannelData(i);
+		}
+
+		self.process(soundData, self.channelCount);
+
+		for (i=0; i<l; i++) {
+			for (n=0; n < channelCount; n++) {
+				channels[n][i] = soundData[i * self.channelCount + n];
+			}
+		}
+	}
+
+	global.onprocessmedia	= mspBufferFill;
+	global.onaudioprocess	= waBufferFill;
+
+	self._mspBufferFill	= mspBufferFill;
+	self._waBufferFill	= waBufferFill;
+
+}, {
+	ready: false,
+
+	initMSP: function (e) {
+		this.channelCount	= e.audioChannels;
+		this.sampleRate		= e.audioSampleRate;
+		this.bufferSize		= e.audioLength * this.channelCount;
+		this.ready		= true;
+		this.emit('ready', []);
+	},
+
+	initWA: function (e) {
+		var b = e.outputBuffer;
+		this.channelCount	= b.numberOfChannels;
+		this.sampleRate		= b.sampleRate;
+		this.bufferSize		= b.length * this.channelCount;
+		this.ready		= true;
+		this.emit('ready', []);
+	}
+});
+
+}(this.Sink));
+(function (Sink) {
+
+/**
+ * Splits a sample buffer into those of different channels.
+ *
+ * @static Sink
+ * @name deinterleave
+ *
+ * @arg {Buffer} buffer The sample buffer to split.
+ * @arg {Number} channelCount The number of channels to split to.
+ *
+ * @return {Array} An array containing the resulting sample buffers.
+*/
+
+Sink.deinterleave = function (buffer, channelCount) {
+	var	l	= buffer.length,
+		size	= l / channelCount,
+		ret	= [],
+		i, n;
+	for (i=0; i<channelCount; i++){
+		ret[i] = new Float32Array(size);
+		for (n=0; n<size; n++){
+			ret[i][n] = buffer[n * channelCount + i];
+		}
+	}
+	return ret;
+};
+
+/**
+ * Joins an array of sample buffers into a single buffer.
+ *
+ * @static Sink
+ * @name resample
+ *
+ * @arg {Array} buffers The buffers to join.
+ * @arg {Number} !channelCount The number of channels. Defaults to buffers.length
+ * @arg {Buffer} !buffer The output buffer.
+ *
+ * @return {Buffer} The interleaved buffer created.
+*/
+
+Sink.interleave = function (buffers, channelCount, buffer) {
+	channelCount		= channelCount || buffers.length;
+	var	l		= buffers[0].length,
+		bufferCount	= buffers.length,
+		i, n;
+	buffer			= buffer || new Float32Array(l * channelCount);
+	for (i=0; i<bufferCount; i++) {
+		for (n=0; n<l; n++) {
+			buffer[i + n * channelCount] = buffers[i][n];
+		}
+	}
+	return buffer;
+};
+
+/**
+ * Mixes two or more buffers down to one.
+ *
+ * @static Sink
+ * @name mix
+ *
+ * @arg {Buffer} buffer The buffer to append the others to.
+ * @arg {Buffer} bufferX The buffers to append from.
+ *
+ * @return {Buffer} The mixed buffer.
+*/
+
+Sink.mix = function (buffer) {
+	var	buffers	= [].slice.call(arguments, 1),
+		l, i, c;
+	for (c=0; c<buffers.length; c++){
+		l = Math.max(buffer.length, buffers[c].length);
+		for (i=0; i<l; i++){
+			buffer[i] += buffers[c][i];
+		}
+	}
+	return buffer;
+};
+
+/**
+ * Resets a buffer to all zeroes.
+ *
+ * @static Sink
+ * @name resetBuffer
+ *
+ * @arg {Buffer} buffer The buffer to reset.
+ *
+ * @return {Buffer} The 0-reset buffer.
+*/
+
+Sink.resetBuffer = function (buffer) {
+	var	l	= buffer.length,
+		i;
+	for (i=0; i<l; i++){
+		buffer[i] = 0;
+	}
+	return buffer;
+};
+
+/**
+ * Copies the content of a buffer to another buffer.
+ *
+ * @static Sink
+ * @name clone
+ *
+ * @arg {Buffer} buffer The buffer to copy from.
+ * @arg {Buffer} !result The buffer to copy to.
+ *
+ * @return {Buffer} A clone of the buffer.
+*/
+
+Sink.clone = function (buffer, result) {
+	var	l	= buffer.length,
+		i;
+	result = result || new Float32Array(l);
+	for (i=0; i<l; i++){
+		result[i] = buffer[i];
+	}
+	return result;
+};
+
+/**
+ * Creates an array of buffers of the specified length and the specified count.
+ *
+ * @static Sink
+ * @name createDeinterleaved
+ *
+ * @arg {Number} length The length of a single channel.
+ * @arg {Number} channelCount The number of channels.
+ * @return {Array} The array of buffers.
+*/
+
+Sink.createDeinterleaved = function (length, channelCount) {
+	var	result	= new Array(channelCount),
+		i;
+	for (i=0; i<channelCount; i++){
+		result[i] = new Float32Array(length);
+	}
+	return result;
+};
+
+Sink.memcpy = function (src, srcOffset, dst, dstOffset, length) {
+	src	= src.subarray || src.slice ? src : src.buffer;
+	dst	= dst.subarray || dst.slice ? dst : dst.buffer;
+
+	src	= srcOffset ? src.subarray ?
+		src.subarray(srcOffset, length && srcOffset + length) :
+		src.slice(srcOffset, length && srcOffset + length) : src;
+
+	if (dst.set) {
+		dst.set(src, dstOffset);
+	} else {
+		for (var i=0; i<src.length; i++) {
+			dst[i + dstOffset] = src[i];
+		}
+	}
+
+	return dst;
+};
+
+Sink.memslice = function (buffer, offset, length) {
+	return buffer.subarray ? buffer.subarray(offset, length) : buffer.slice(offset, length);
+};
+
+Sink.mempad = function (buffer, out, offset) {
+	out = out.length ? out : new (buffer.constructor)(out);
+	Sink.memcpy(buffer, 0, out, offset);
+	return out;
+};
+
+Sink.linspace = function (start, end, out) {
+	var l, i, n, step;
+	out	= out.length ? (l=out.length) && out : Array(l=out);
+	step	= (end - start) / --l;
+	for (n=start+step, i=1; i<l; i++, n+=step) {
+		out[i] = n;
+	}
+	out[0]	= start;
+	out[l]	= end;
+	return out;
+};
+
+Sink.ftoi = function (input, bitCount, output) {
+	var i, mask = Math.pow(2, bitCount - 1);
+
+	output = output || new (input.constructor)(input.length);
+
+	for (i=0; i<input.length; i++) {
+		output[i] = ~~(mask * input[i]);
+	}
+
+	return output;
+};
+
+}(this.Sink));
+(function (Sink) {
+
+function Proxy (bufferSize, channelCount) {
+	Sink.EventEmitter.call(this);
+
+	this.bufferSize		= isNaN(bufferSize) || bufferSize === null ? this.bufferSize : bufferSize;
+	this.channelCount	= isNaN(channelCount) || channelCount === null ? this.channelCount : channelCount;
+
+	var self = this;
+	this.callback = function () {
+		return self.process.apply(self, arguments);
+	};
+
+	this.resetBuffer();
+}
+
+Proxy.prototype = {
+	buffer: null,
+	zeroBuffer: null,
+	parentSink: null,
+	bufferSize: 4096,
+	channelCount: 2,
+	offset: null,
+
+	resetBuffer: function () {
+		this.buffer	= new Float32Array(this.bufferSize);
+		this.zeroBuffer	= new Float32Array(this.bufferSize);
+	},
+
+	process: function (buffer, channelCount) {
+		if (this.offset === null) {
+			this.loadBuffer();
+		}
+
+		for (var i=0; i<buffer.length; i++) {
+			if (this.offset >= this.buffer.length) {
+				this.loadBuffer();
+			}
+
+			buffer[i] = this.buffer[this.offset++];
+		}
+	},
+
+	loadBuffer: function () {
+		this.offset = 0;
+		Sink.memcpy(this.zeroBuffer, 0, this.buffer, 0);
+		this.emit('audioprocess', [this.buffer, this.channelCount]);
+	}
+};
+
+Sink.Proxy = Proxy;
+
+/**
+ * Creates a proxy callback system for the sink instance.
+ * Requires Sink utils.
+ *
+ * @method Sink
+ * @method createProxy
+ *
+ * @arg {Number} !bufferSize The buffer size for the proxy.
+*/
+Sink.prototype.createProxy = function (bufferSize) {
+	var	proxy		= new Sink.Proxy(bufferSize, this.channelCount);
+	proxy.parentSink	= this;
+
+	this.on('audioprocess', proxy.callback);
+
+	return proxy;
+};
+
+}(this.Sink));
+(function (Sink) {
+
+(function(){
+
+/**
+ * If method is supplied, adds a new interpolation method to Sink.interpolation, otherwise sets the default interpolation method (Sink.interpolate) to the specified property of Sink.interpolate.
+ *
+ * @arg {String} name The name of the interpolation method to get / set.
+ * @arg {Function} !method The interpolation method.
+*/
+
+function interpolation(name, method) {
+	if (name && method) {
+		interpolation[name] = method;
+	} else if (name && interpolation[name] instanceof Function) {
+		Sink.interpolate = interpolation[name];
+	}
+	return interpolation[name];
+}
+
+Sink.interpolation = interpolation;
+
+
+/**
+ * Interpolates a fractal part position in an array to a sample. (Linear interpolation)
+ *
+ * @param {Array} arr The sample buffer.
+ * @param {number} pos The position to interpolate from.
+ * @return {Float32} The interpolated sample.
+*/
+interpolation('linear', function (arr, pos) {
+	var	first	= Math.floor(pos),
+		second	= first + 1,
+		frac	= pos - first;
+	second		= second < arr.length ? second : 0;
+	return arr[first] * (1 - frac) + arr[second] * frac;
+});
+
+/**
+ * Interpolates a fractal part position in an array to a sample. (Nearest neighbour interpolation)
+ *
+ * @param {Array} arr The sample buffer.
+ * @param {number} pos The position to interpolate from.
+ * @return {Float32} The interpolated sample.
+*/
+interpolation('nearest', function (arr, pos) {
+	return pos >= arr.length - 0.5 ? arr[0] : arr[Math.round(pos)];
+});
+
+interpolation('linear');
+
+}());
+
+
+/**
+ * Resamples a sample buffer from a frequency to a frequency and / or from a sample rate to a sample rate.
+ *
+ * @static Sink
+ * @name resample
+ *
+ * @arg {Buffer} buffer The sample buffer to resample.
+ * @arg {Number} fromRate The original sample rate of the buffer, or if the last argument, the speed ratio to convert with.
+ * @arg {Number} fromFrequency The original frequency of the buffer, or if the last argument, used as toRate and the secondary comparison will not be made.
+ * @arg {Number} toRate The sample rate of the created buffer.
+ * @arg {Number} toFrequency The frequency of the created buffer.
+ *
+ * @return The new resampled buffer.
+*/
+Sink.resample	= function (buffer, fromRate /* or speed */, fromFrequency /* or toRate */, toRate, toFrequency) {
+	var
+		argc		= arguments.length,
+		speed		= argc === 2 ? fromRate : argc === 3 ? fromRate / fromFrequency : toRate / fromRate * toFrequency / fromFrequency,
+		l		= buffer.length,
+		length		= Math.ceil(l / speed),
+		newBuffer	= new Float32Array(length),
+		i, n;
+	for (i=0, n=0; i<l; i += speed) {
+		newBuffer[n++] = Sink.interpolate(buffer, i);
+	}
+	return newBuffer;
+};
+
+}(this.Sink));
+void function (Sink) {
+
+Sink.on('init', function (sink) {
+	sink.activeRecordings = [];
+	sink.on('postprocess', sink.recordData);
+});
+
+Sink.prototype.activeRecordings = null;
+
+/**
+ * Starts recording the sink output.
+ *
+ * @method Sink
+ * @name record
+ *
+ * @return {Recording} The recording object for the recording started.
+*/
+Sink.prototype.record = function () {
+	var recording = new Sink.Recording(this);
+	this.emit('record', [recording]);
+	return recording;
+};
+/**
+ * Private method that handles the adding the buffers to all the current recordings.
+ *
+ * @method Sink
+ * @method recordData
+ *
+ * @arg {Array} buffer The buffer to record.
+*/
+Sink.prototype.recordData = function (buffer) {
+	var	activeRecs	= this.activeRecordings,
+		i, l		= activeRecs.length;
+	for (i=0; i<l; i++) {
+		activeRecs[i].add(buffer);
+	}
+};
+
+/**
+ * A Recording class for recording sink output.
+ *
+ * @class
+ * @static Sink
+ * @arg {Object} bindTo The sink to bind the recording to.
+*/
+
+function Recording (bindTo) {
+	this.boundTo = bindTo;
+	this.buffers = [];
+	bindTo.activeRecordings.push(this);
+}
+
+Recording.prototype = {
+/**
+ * Adds a new buffer to the recording.
+ *
+ * @arg {Array} buffer The buffer to add.
+ *
+ * @method Recording
+*/
+	add: function (buffer) {
+		this.buffers.push(buffer);
+	},
+/**
+ * Empties the recording.
+ *
+ * @method Recording
+*/
+	clear: function () {
+		this.buffers = [];
+	},
+/**
+ * Stops the recording and unbinds it from it's host sink.
+ *
+ * @method Recording
+*/
+	stop: function () {
+		var	recordings = this.boundTo.activeRecordings,
+			i;
+		for (i=0; i<recordings.length; i++) {
+			if (recordings[i] === this) {
+				recordings.splice(i--, 1);
+			}
+		}
+	},
+/**
+ * Joins the recorded buffers into a single buffer.
+ *
+ * @method Recording
+*/
+	join: function () {
+		var	bufferLength	= 0,
+			bufPos		= 0,
+			buffers		= this.buffers,
+			newArray,
+			n, i, l		= buffers.length;
+
+		for (i=0; i<l; i++) {
+			bufferLength += buffers[i].length;
+		}
+		newArray = new Float32Array(bufferLength);
+		for (i=0; i<l; i++) {
+			for (n=0; n<buffers[i].length; n++) {
+				newArray[bufPos + n] = buffers[i][n];
+			}
+			bufPos += buffers[i].length;
+		}
+		return newArray;
+	}
+};
+
+Sink.Recording = Recording;
+
+}(this.Sink);
+void function (Sink) {
+
+function processRingBuffer () {
+	if (this.ringBuffer) {
+		(this.channelMode === 'interleaved' ? this.ringSpin : this.ringSpinInterleaved).apply(this, arguments);
+	}
+}
+
+Sink.on('init', function (sink) {
+	sink.on('preprocess', processRingBuffer);
+});
+
+Sink.prototype.ringBuffer = null;
+
+/**
+ * A private method that applies the ring buffer contents to the specified buffer, while in interleaved mode.
+ *
+ * @method Sink
+ * @name ringSpin
+ *
+ * @arg {Array} buffer The buffer to write to.
+*/
+Sink.prototype.ringSpin = function (buffer) {
+	var	ring	= this.ringBuffer,
+		l	= buffer.length,
+		m	= ring.length,
+		off	= this.ringOffset,
+		i;
+	for (i=0; i<l; i++){
+		buffer[i] += ring[off];
+		off = (off + 1) % m;
+	}
+	this.ringOffset = off;
+};
+
+/**
+ * A private method that applies the ring buffer contents to the specified buffer, while in deinterleaved mode.
+ *
+ * @method Sink
+ * @name ringSpinDeinterleaved
+ *
+ * @param {Array} buffer The buffers to write to.
+*/
+Sink.prototype.ringSpinDeinterleaved = function (buffer) {
+	var	ring	= this.ringBuffer,
+		l	= buffer.length,
+		ch	= ring.length,
+		m	= ring[0].length,
+		len	= ch * m,
+		off	= this.ringOffset,
+		i, n;
+	for (i=0; i<l; i+=ch){
+		for (n=0; n<ch; n++){
+			buffer[i + n] += ring[n][off];
+		}
+		off = (off + 1) % m;
+	}
+	this.ringOffset = n;
+};
+
+}(this.Sink);
+void function (Sink, proto) {
+
+proto = Sink.prototype;
+
+Sink.on('init', function (sink) {
+	sink.asyncBuffers	= [];
+	sink.syncBuffers	= [];
+	sink.on('preprocess', sink.writeBuffersSync);
+	sink.on('postprocess', sink.writeBuffersAsync);
+});
+
+proto.writeMode		= 'async';
+proto.asyncBuffers	= proto.syncBuffers = null;
+
+/**
+ * Private method that handles the mixing of asynchronously written buffers.
+ *
+ * @method Sink
+ * @name writeBuffersAsync
+ *
+ * @arg {Array} buffer The buffer to write to.
+*/
+proto.writeBuffersAsync = function (buffer) {
+	var	buffers		= this.asyncBuffers,
+		l		= buffer.length,
+		buf,
+		bufLength,
+		i, n, offset;
+	if (buffers) {
+		for (i=0; i<buffers.length; i++) {
+			buf		= buffers[i];
+			bufLength	= buf.b.length;
+			offset		= buf.d;
+			buf.d		-= Math.min(offset, l);
+			
+			for (n=0; n + offset < l && n < bufLength; n++) {
+				buffer[n + offset] += buf.b[n];
+			}
+			buf.b = buf.b.subarray(n + offset);
+			if (i >= bufLength) {
+				buffers.splice(i--, 1);
+			}
+		}
+	}
+};
+
+/**
+ * A private method that handles mixing synchronously written buffers.
+ *
+ * @method Sink
+ * @name writeBuffersSync
+ *
+ * @arg {Array} buffer The buffer to write to.
+*/
+proto.writeBuffersSync = function (buffer) {
+	var	buffers		= this.syncBuffers,
+		l		= buffer.length,
+		i		= 0,
+		soff		= 0;
+	for (;i<l && buffers.length; i++) {
+		buffer[i] += buffers[0][soff];
+		if (buffers[0].length <= soff){
+			buffers.splice(0, 1);
+			soff = 0;
+			continue;
+		}
+		soff++;
+	}
+	if (buffers.length) {
+		buffers[0] = buffers[0].subarray(soff);
+	}
+};
+
+/**
+ * Writes a buffer asynchronously on top of the existing signal, after a specified delay.
+ *
+ * @method Sink
+ * @name writeBufferAsync
+ *
+ * @arg {Array} buffer The buffer to write.
+ * @arg {Number} delay The delay to write after. If not specified, the Sink will calculate a delay to compensate the latency.
+ * @return {Number} The number of currently stored asynchronous buffers.
+*/
+proto.writeBufferAsync = function (buffer, delay) {
+	buffer			= this.mode === 'deinterleaved' ? Sink.interleave(buffer, this.channelCount) : buffer;
+	var	buffers		= this.asyncBuffers;
+	buffers.push({
+		b: buffer,
+		d: isNaN(delay) ? ~~((+new Date() - this.previousHit) / 1000 * this.sampleRate) : delay
+	});
+	return buffers.length;
+};
+
+/**
+ * Writes a buffer synchronously to the output.
+ *
+ * @method Sink
+ * @name writeBufferSync
+ *
+ * @param {Array} buffer The buffer to write.
+ * @return {Number} The number of currently stored synchronous buffers.
+*/
+proto.writeBufferSync = function (buffer) {
+	buffer			= this.mode === 'deinterleaved' ? Sink.interleave(buffer, this.channelCount) : buffer;
+	var	buffers		= this.syncBuffers;
+	buffers.push(buffer);
+	return buffers.length;
+};
+
+/**
+ * Writes a buffer, according to the write mode specified.
+ *
+ * @method Sink
+ * @name writeBuffer
+ *
+ * @arg {Array} buffer The buffer to write.
+ * @arg {Number} delay The delay to write after. If not specified, the Sink will calculate a delay to compensate the latency. (only applicable in asynchronous write mode)
+ * @return {Number} The number of currently stored (a)synchronous buffers.
+*/
+proto.writeBuffer = function () {
+	return this[this.writeMode === 'async' ? 'writeBufferAsync' : 'writeBufferSync'].apply(this, arguments);
+};
+
+/**
+ * Gets the total amount of yet unwritten samples in the synchronous buffers.
+ *
+ * @method Sink
+ * @name getSyncWriteOffset
+ *
+ * @return {Number} The total amount of yet unwritten samples in the synchronous buffers.
+*/
+proto.getSyncWriteOffset = function () {
+	var	buffers		= this.syncBuffers,
+		offset		= 0,
+		i;
+	for (i=0; i<buffers.length; i++) {
+		offset += buffers[i].length;
+	}
+	return offset;
+};
+
+} (this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/script/sink.min.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/sink.min.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/sink.min.js	(revision 28388)
@@ -0,0 +1,1 @@
+(function(a){function b(a,c,d,e){var f=b.sinks,g;for(g in f)if(f.hasOwnProperty(g)&&f[g].enabled)try{return new f[g](a,c,d,e)}catch(h){}throw b.Error(2)}function c(){var a;for(a in c.prototype)c.prototype.hasOwnProperty(a)&&(this[a]=c.prototype[a]);this._listeners={}}function d(a){if(!d.hasOwnProperty(a))throw d(1);if(!(this instanceof d))return new d(a);var b;for(b in d[a])d[a].hasOwnProperty(b)&&(this[b]=d[a][b]);this.code=a}function e(a){this.boundTo=a,this.buffers=[],a.activeRecordings.push(this)}function f(){}function g(a,c,d,e){d=d||c.prototype,c.prototype=new b.SinkClass,c.prototype.type=a,c.enabled=!e;for(e in d)d.hasOwnProperty(e)&&(c.prototype[e]=d[e]);g[a]=c}c.prototype={_listeners:null,emit:function(a,b){if(this._listeners[a])for(var c=0;c<this._listeners[a].length;c++)this._listeners[a][c].apply(this,b);return this},on:function(a,b){return this._listeners[a]=this._listeners[a]||[],this._listeners[a].push(b),this},off:function(a,b){if(this._listeners[a]){if(!b)return delete this._listeners[a],this;for(var c=0;c<this._listeners[a].length;c++)this._listeners[a][c]===b&&this._listeners[a].splice(c--,1);this._listeners[a].length||delete this._listeners[a]}return this}},b.EventEmitter=c,d.prototype=new Error,d.prototype.toString=function(){return"SinkError 0x"+this.code.toString(16)+": "+this.message},d[1]={message:"No such error code.",explanation:"The error code does not exist."},d[2]={message:"No audio sink available.",explanation:"The audio device may be busy, or no supported output API is available for this browser."},d[16]={message:"Buffer underflow.",explanation:"Trying to recover..."},d[17]={message:"Critical recovery fail.",explanation:"The buffer underflow has reached a critical point, trying to recover, but will probably fail anyway."},d[18]={message:"Buffer size too large.",explanation:"Unable to allocate the buffer due to excessive length, please try a smaller buffer. Buffer size should probably be smaller than the sample rate."},b.Error=d,e.prototype={add:function(a){this.buffers.push(a)},clear:function(){this.buffers=[]},stop:function(){var a=this.boundTo.activeRecordings,b;for(b=0;b<a.length;b++)a[b]===this&&a.splice(b--,1)},join:function(){var a=0,b=0,c=this.buffers,d,e,f,g=c.length;for(f=0;f<g;f++)a+=c[f].length;d=new Float32Array(a);for(f=0;f<g;f++){for(e=0;e<c[f].length;e++)d[b+e]=c[f][e];b+=c[f].length}return d}},b.SinkClass=f,f.prototype={sampleRate:44100,channelCount:2,bufferSize:4096,writePosition:0,writeMode:"async",channelMode:"interleaved",previousHit:0,ringBuffer:null,ringOffset:0,start:function(a,c,d,e){this.channelCount=isNaN(c)||c===null?this.channelCount:c,this.bufferSize=isNaN(d)||d===null?this.bufferSize:d,this.sampleRate=isNaN(e)||e===null?this.sampleRate:e,this.readFn=a,this.activeRecordings=[],this.previousHit=+(new Date),this.asyncBuffers=[],this.syncBuffers=[],b.EventEmitter.call(this)},process:function(a,c){this.ringBuffer&&(this.channelMode==="interleaved"?this.ringSpin:this.ringSpinInterleaved).apply(this,arguments),this.writeBuffersSync.apply(this,arguments);if(this.channelMode==="interleaved")this.readFn&&this.readFn.apply(this,arguments),this.emit("audioprocess",arguments);else{var d=b.deinterleave(a,this.channelCount),e=[d].concat([].slice.call(arguments,1));this.readFn&&this.readFn.apply(this,e),this.emit("audioprocess",e),b.interleave(d,this.channelCount,a)}this.writeBuffersAsync.apply(this,arguments),this.recordData.apply(this,arguments),this.previousHit=+(new Date),this.writePosition+=a.length/c},record:function(){return new e(this)},recordData:function(a){var b=this.activeRecordings,c,d=b.length;for(c=0;c<d;c++)b[c].add(a)},writeBuffersAsync:function(a){var b=this.asyncBuffers,c=a.length,d,e,f,g,h;if(b)for(f=0;f<b.length;f++){d=b[f],e=d.b.length,h=d.d,d.d-=Math.min(h,c);for(g=0;g+h<c&&g<e;g++)a[g+h]+=d.b[g];d.b=d.b.subarray(g+h),f>=e&&b.splice(f--,1)}},writeBuffersSync:function(a){var b=this.syncBuffers,c=a.length,d=0,e=0;for(;d<c&&b.length;d++){a[d]+=b[0][e];if(b[0].length<=e){b.splice(0,1),e=0;continue}e++}b.length&&(b[0]=b[0].subarray(e))},writeBufferAsync:function(a,c){a=this.mode==="deinterleaved"?b.interleave(a,this.channelCount):a;var d=this.asyncBuffers;return d.push({b:a,d:isNaN(c)?~~((+(new Date)-this.previousHit)/1e3*this.sampleRate):c}),d.length},writeBufferSync:function(a){a=this.mode==="deinterleaved"?b.interleave(a,this.channelCount):a;var c=this.syncBuffers;return c.push(a),c.length},writeBuffer:function(){return this[this.writeMode==="async"?"writeBufferAsync":"writeBufferSync"].apply(this,arguments)},getSyncWriteOffset:function(){var a=this.syncBuffers,b=0,c;for(c=0;c<a.length;c++)b+=a[c].length;return b},getPlaybackTime:function(){return this.writePosition-this.bufferSize},ringSpin:function(a){var b=this.ringBuffer,c=a.length,d=b.length,e=this.ringOffset,f;for(f=0;f<c;f++)a[f]+=b[e],e=(e+1)%d;this.ringOffset=e},ringSpinDeinterleaved:function(a){var b=this.ringBuffer,c=a.length,d=b.length,e=b[0].length,f=d*e,g=this.ringOffset,h,i;for(h=0;h<c;h+=d){for(i=0;i<d;i++)a[h+i]+=b[i][g];g=(g+1)%e}this.ringOffset=i}},g("moz",function(){function l(){if(d){f=e.mozWriteAudio(d),c+=f;if(f<d.length)return d=d.subarray(f),d;d=null}g=e.mozCurrentSampleOffset(),h=Number(g+(j!==g?a.bufferSize:a.preBufferSize)*a.channelCount-c),g===j&&a.emit("error",[b.Error(16)]);if(h>0||j===g){try{i=new Float32Array(j===g?a.preBufferSize*a.channelCount:a.forceBufferSize?h<a.bufferSize*2?a.bufferSize*2:h:h)}catch(k){a.emit("error",[b.Error(18)]),a.kill();return}a.process(i,a.channelCount),f=a._audio.mozWriteAudio(i),f<i.length&&(d=i.subarray(f)),c+=f}j=g}var a=this,c=0,d=null,e=new Audio,f,g,h,i,j,k;a.start.apply(a,arguments),a.preBufferSize=isNaN(arguments[4])||arguments[4]===null?this.preBufferSize:arguments[4],e.mozSetup(a.channelCount,a.sampleRate),this._timers=[],this._timers.push(b.doInterval(function(){+(new Date)-a.previousHit>2e3&&(a._audio=e=new Audio,e.mozSetup(a.channelCount,a.sampleRate),c=0,a.emit("error",[b.Error(17)]))},1e3)),this._timers.push(b.doInterval(l,a.interval)),a._bufferFill=l,a._audio=e},{bufferSize:24576,preBufferSize:24576,forceBufferSize:!1,interval:20,kill:function(){while(this._timers.length)this._timers[0](),this._timers.splice(0,1);this.emit("kill")},getPlaybackTime:function(){return this._audio.mozCurrentSampleOffset()/this.channelCount}});var h=[];g("webkit",function(a,c,d,e){function k(a){var b=a.outputBuffer,c=b.numberOfChannels,d,e,g=b.length,h=b.size,i=new Array(c),j=new Float32Array(g*c),k;for(d=0;d<c;d++)i[d]=b.getChannelData(d);f.process(j,f.channelCount);for(d=0;d<g;d++)for(e=0;e<c;e++)i[e][d]=j[d*f.channelCount+e]}var f=this,i=new(window.AudioContext||webkitAudioContext),j=i.createJavaScriptNode(d,0,c);f.start.apply(f,arguments),g.webkit.forceSampleRate&&f.sampleRate!==i.sampleRate?k=function(c){var d=c.outputBuffer,e=d.numberOfChannels,g,h,j=d.length,k=d.size,l=new Array(e),m=new Float32Array(Math.floor(j*f.sampleRate/i.sampleRate)*e),n;for(g=0;g<e;g++)l[g]=d.getChannelData(g);f.process(m,f.channelCount),m=b.deinterleave(m,f.channelCount);for(h=0;h<e;h++){n=b.resample(m[h],f.sampleRate,i.sampleRate);for(g=0;g<j;g++)l[h][g]=n[g]}}:f.sampleRate=i.sampleRate,j.onaudioprocess=k,j.connect(i.destination),f._context=i,f._node=j,f._callback=k,h.push(j)},{kill:function(){this._node.disconnect(0);for(var a=0;a<h.length;a++)h[a]===this._node&&h.splice(a--,1);this._node=this._context=null,this.kill(),this.emit("kill")},getPlaybackTime:function(){return this._context.currentTime*this.sampleRate}}),g.webkit.fix82795=h,g("dummy",function(){function c(){var b=new Float32Array(a.bufferSize*a.channelCount);a.process(b,a.channelCount)}var a=this;a.start.apply(a,arguments),a._kill=b.doInterval(c,a.bufferSize/a.sampleRate*1e3),a._callback=c},{kill:function(){this._kill(),this.emit("kill")}},!0),b.sinks=b.devices=g,b.Recording=e,function(){function d(b){var e=null,f,g;try{return g=new a,g.append(b),f=c.createObjectURL(g.getBlob()),e=new Worker(f),e._terminate=e.terminate,e._url=f,g=null,e.terminate=function(){this._terminate,c.revokeObjectURL(this._url)},d.type="blob",e}catch(h){}try{return e=new Worker("data:text/javascript;base64,"+btoa(b)),d.type="data",e}catch(h){}return e}var a=typeof window=="undefined"?undefined:window.MozBlobBuilder||window.WebKitBlobBuilder||window.MSBlobBuilder||window.OBlobBuilder||window.BlobBuilder,c=typeof window=="undefined"?undefined:window.MozURL||window.webkitURL||window.MSURL||window.OURL||window.URL;d.ready=d.working=!1,b.EventEmitter.call(d),d.test=function(){function c(b){if(d.ready)return;d.ready=!0,d.working=b,d.emit("ready",[b]),d.off("ready"),b&&a&&a.terminate(),a=null}var a=d("this.onmessage=function(e){postMessage(e.data)}"),b="inlineWorker";d.ready=d.working=!1,a?(a.onmessage=function(a){c(a.data===b)},a.postMessage(b),setTimeout(function(){c(!1)},1e3)):c(!1)},b.inlineWorker=d,d.test()}(),b.doInterval=function(a,c){function f(f){b.inlineWorker.working&&!f?(d=b.inlineWorker('setInterval(function(){ postMessage("tic"); }, '+c+");"),d.onmessage=function(){a()},e=function(){d.terminate()}):(d=setInterval(a,c),e=function(){clearInterval(d)})}var d,e;return b.doInterval.backgroundWork||b.devices.moz.backgroundWork?b.inlineWorker.ready?f():b.inlineWorker.on("ready",function(){f()}):f(!0),function(){e?e():b.inlineWorker.ready||b.inlineWorker.on("ready",function(){e&&e()})}},b.doInterval.backgroundWork=!0,function(){function a(c,d){return c&&d?a[c]=d:c&&a[c]instanceof Function&&(b.interpolate=a[c]),a[c]}b.interpolation=a,a("linear",function(a,b){var c=Math.floor(b),d=c+1,e=b-c;return d=d<a.length?d:0,a[c]*(1-e)+a[d]*e}),a("nearest",function(a,b){return b>=a.length-.5?a[0]:a[Math.round(b)]}),a("linear")}(),b.resample=function(a,c,d,e,f){var g=arguments.length,h=g===2?c:g===3?c/d:e/c*f/d,i=a.length,j=Math.ceil(i/h),k=new Float32Array(j),l,m;for(l=0,m=0;l<i;l+=h)k[m++]=b.interpolate(a,l);return k},b.deinterleave=function(a,b){var c=a.length,d=c/b,e=[],f,g;for(f=0;f<b;f++){e[f]=new Float32Array(d);for(g=0;g<d;g++)e[f][g]=a[g*b+f]}return e},b.interleave=function(a,b,c){b=b||a.length;var d=a[0].length,e=a.length,f,g;c=c||new Float32Array(d*b);for(f=0;f<e;f++)for(g=0;g<d;g++)c[f+g*b]=a[f][g];return c},b.mix=function(a){var b=[].slice.call(arguments,1),c,d,e;for(e=0;e<b.length;e++){c=Math.max(a.length,b[e].length);for(d=0;d<c;d++)a[d]+=b[e][d]}return a},b.resetBuffer=function(a){var b=a.length,c;for(c=0;c<b;c++)a[c]=0;return a},b.clone=function(a,b){var c=a.length,d;b=b||new Float32Array(c);for(d=0;d<c;d++)b[d]=a[d];return b},b.createDeinterleaved=function(a,b){var c=new Array(b),d;for(d=0;d<b;d++)c[d]=new Float32Array(a);return c},a.Sink=b})(function(){return this}());
Index: /gs3-extensions/web-audio/trunk/js-mad/script/stream.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/stream.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/stream.js	(revision 28388)
@@ -0,0 +1,112 @@
+
+Mad.Error = {
+  NONE           : 0x0000,      /* no error */
+
+  BUFLEN         : 0x0001,      /* input buffer too small (or EOF) */
+  BUFPTR         : 0x0002,      /* invalid (null) buffer pointer */
+
+  NOMEM          : 0x0031,      /* not enough memory */
+
+  LOSTSYNC       : 0x0101,      /* lost synchronization */
+  BADLAYER       : 0x0102,      /* reserved header layer value */
+  BADBITRATE     : 0x0103,      /* forbidden bitrate value */
+  BADSAMPLERATE  : 0x0104,      /* reserved sample frequency value */
+  BADEMPHASIS    : 0x0105,      /* reserved emphasis value */
+
+  BADCRC         : 0x0201,      /* CRC check failed */
+  BADBITALLOC    : 0x0211,      /* forbidden bit allocation value */
+  BADSCALEFACTOR : 0x0221,      /* bad scalefactor index */
+  BADMODE        : 0x0222,      /* bad bitrate/mode combination */
+  BADFRAMELEN    : 0x0231,      /* bad frame length */
+  BADBIGVALUES   : 0x0232,      /* bad big_values count */
+  BADBLOCKTYPE   : 0x0233,      /* reserved block_type */
+  BADSCFSI       : 0x0234,      /* bad scalefactor selection info */
+  BADDATAPTR     : 0x0235,      /* bad main_data_begin pointer */
+  BADPART3LEN    : 0x0236,      /* bad audio data length */
+  BADHUFFTABLE   : 0x0237,      /* bad Huffman table select */
+  BADHUFFDATA    : 0x0238,      /* Huffman data overrun */
+  BADSTEREO      : 0x0239       /* incompatible block_type for JS */
+};
+
+Mad.BUFFER_GUARD = 8;
+Mad.BUFFER_MDLEN = (511 + 2048 + Mad.BUFFER_GUARD);
+
+Mad.Stream = function (stream) {
+    this.stream = stream;                           /* actual buffer (js doesn't have pointers!) */
+    this.buffer = 0;                                /* input bitstream buffer */
+    this.bufend = stream.length;                    /* input bitstream buffer */
+    this.skiplen = 0;                               /* bytes to skip before next frame */
+
+    this.sync = 0;                                  /* stream sync found */
+    this.freerate = 0;                              /* free bitrate (fixed) */
+
+    this.this_frame = 0;                            /* start of current frame */
+    this.next_frame = 0;                            /* start of next frame */
+    
+    this.ptr = new Mad.Bit(this.stream, this.buffer); /* current processing bit pointer */
+    
+    this.anc_ptr = /* MadBit */ null;               /* ancillary bits pointer */
+    this.anc_bitlen = 0;                            /* number of ancillary bits */
+
+    this.main_data = /* string */ Mad.Storage.newBuffer(Mad.BUFFER_MDLEN); /* Layer III main_data() */
+    this.md_len = 0; /* bytes in main_data */
+
+    var options = 0;                                /* decoding options (see below) */
+    var error = Mad.Error.NONE;                     /* error code (see above) */
+};
+
+Mad.Stream.fromFile = function(file, callback) {
+    var reader = new FileReader();
+    reader.onloadend = function (evt) {
+        callback(new Mad.Stream(evt.target.result));
+    };
+    reader.readAsBinaryString(file);
+};
+
+Mad.Stream.prototype.readShort = function(bBigEndian) {
+    return this.stream.readU16(bBigEndian);
+};
+    
+Mad.Stream.prototype.readSShort = function(bBigEndian) {
+    return this.stream.readI16(bBigEndian);
+};
+
+Mad.Stream.prototype.getU8 = function(index) {
+    return this.stream.getU8(index);
+};
+
+
+Mad.Stream.prototype.readU8 = function() {
+    return this.stream.readU8(index);
+};
+
+Mad.Stream.prototype.readChars = function(length) {
+    return this.stream.read(length);
+};
+
+Mad.Stream.prototype.peekChars = function(length) {
+    return this.stream.peek(length);
+}
+
+/*
+ * NAME:        stream->sync()
+ * DESCRIPTION: locate the next stream sync word
+ */
+Mad.Stream.prototype.doSync = function() {
+    var ptr = this.ptr.nextbyte();
+    var end = this.bufend;
+
+    while (ptr < end - 1 && !(this.getU8(ptr) === 0xff && (this.getU8(ptr + 1) & 0xe0) === 0xe0)) {
+        ++ptr;
+    }
+
+    if (end - ptr < Mad.BUFFER_GUARD) {
+        return -1;
+    }
+
+    this.ptr = new Mad.Bit(this.stream, ptr);
+    
+    return 0;
+}
+
+
Index: /gs3-extensions/web-audio/trunk/js-mad/script/synth.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/script/synth.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/script/synth.js	(revision 28388)
@@ -0,0 +1,1311 @@
+/*
+ * NAME:    synth.init()
+ * DESCRIPTION: initialize synth struct
+ */
+Mad.Synth = function () {
+    this.filter = [];
+    this.mute();
+    this.phase = 0;
+    
+    this.pcm = {
+        samplerate: 0,
+        channels: 0,
+        length: 0,
+        samples: [
+            // new Float64Array(new ArrayBuffer(8 * 1152)),
+            // new Float64Array(new ArrayBuffer(8 * 1152))
+            [],
+            []
+        ]
+    };
+    
+    // this.pcm.clone = function() {
+    //     var copy = {};
+    //     copy.samplerate = this.samplerate;
+    //     copy.channels = this.channels;
+    //     copy.length = this.length;
+    //     copy.samples = [
+    //         // new Float64Array(new ArrayBuffer(8 * 1152)),
+    //         // new Float64Array(new ArrayBuffer(8 * 1152))
+    //         [],
+    //         []
+    //     ];
+    //     copy.samples[0].set(this.samples[0]);
+    //     copy.samples[1].set(this.samples[1]);
+    //     return copy;
+    // }; 
+}
+
+/*
+ * NAME:    synth.mute()
+ * DESCRIPTION: zero all polyphase filterbank values, resetting synthesis
+ */
+Mad.Synth.prototype.mute = function () {
+    for (var ch = 0; ch < 2; ++ch) {
+        this.filter[ch] = [ [ [], [] ], [ [], [] ] ];
+        
+        for (var s = 0; s < 16; ++s) {
+            this.filter[ch][0][0][s] = [];
+            this.filter[ch][0][1][s] = [];
+            this.filter[ch][1][0][s] = [];
+            this.filter[ch][1][1][s] = [];
+            
+            for (var v = 0; v < 8; ++v) {
+                this.filter[ch][0][0][s][v] = 0;
+                this.filter[ch][0][1][s][v] = 0;
+                this.filter[ch][1][0][s][v] = 0;
+                this.filter[ch][1][1][s][v] = 0;
+            }
+        }
+    }
+};
+
+/* costab[i] = cos(PI / (2 * 32) * i) */
+var costab1  =  0.998795456;
+var costab2  =  0.995184727;
+var costab3  =  0.989176510;
+var costab4  =  0.980785280;
+var costab5  =  0.970031253;
+var costab6  =  0.956940336;
+var costab7  =  0.941544065;
+var costab8  =  0.923879533;
+var costab9  =  0.903989293;
+var costab10 =  0.881921264;
+var costab11 =  0.857728610;
+var costab12 =  0.831469612;
+var costab13 =  0.803207531;
+var costab14 =  0.773010453;
+var costab15 =  0.740951125;
+var costab16 =  0.707106781;
+var costab17 =  0.671558955;
+var costab18 =  0.634393284;
+var costab19 =  0.595699304;
+var costab20 =  0.555570233;
+var costab21 =  0.514102744;
+var costab22 =  0.471396737;
+var costab23 =  0.427555093;
+var costab24 =  0.382683432;
+var costab25 =  0.336889853;
+var costab26 =  0.290284677;
+var costab27 =  0.242980180;
+var costab28 =  0.195090322;
+var costab29 =  0.146730474;
+var costab30 =  0.098017140;
+var costab31 =  0.049067674;
+
+/*
+ * NAME:    dct32()
+ * DESCRIPTION: perform fast in[32].out[32] DCT
+ */
+Mad.Synth.dct32 = function (_in /* [32] */, slot, lo /* [16][8] */, hi /* [16][8] */) {
+    var t0,   t1,   t2,   t3,   t4,   t5,   t6,   t7;
+    var t8,   t9,   t10,  t11,  t12,  t13,  t14,  t15;
+    var t16,  t17,  t18,  t19,  t20,  t21,  t22,  t23;
+    var t24,  t25,  t26,  t27,  t28,  t29,  t30,  t31;
+    var t32,  t33,  t34,  t35,  t36,  t37,  t38,  t39;
+    var t40,  t41,  t42,  t43,  t44,  t45,  t46,  t47;
+    var t48,  t49,  t50,  t51,  t52,  t53,  t54,  t55;
+    var t56,  t57,  t58,  t59,  t60,  t61,  t62,  t63;
+    var t64,  t65,  t66,  t67,  t68,  t69,  t70,  t71;
+    var t72,  t73,  t74,  t75,  t76,  t77,  t78,  t79;
+    var t80,  t81,  t82,  t83,  t84,  t85,  t86,  t87;
+    var t88,  t89,  t90,  t91,  t92,  t93,  t94,  t95;
+    var t96,  t97,  t98,  t99,  t100, t101, t102, t103;
+    var t104, t105, t106, t107, t108, t109, t110, t111;
+    var t112, t113, t114, t115, t116, t117, t118, t119;
+    var t120, t121, t122, t123, t124, t125, t126, t127;
+    var t128, t129, t130, t131, t132, t133, t134, t135;
+    var t136, t137, t138, t139, t140, t141, t142, t143;
+    var t144, t145, t146, t147, t148, t149, t150, t151;
+    var t152, t153, t154, t155, t156, t157, t158, t159;
+    var t160, t161, t162, t163, t164, t165, t166, t167;
+    var t168, t169, t170, t171, t172, t173, t174, t175;
+    var t176;
+
+
+    // var sys = require('sys');
+    // for (i = 0; i < 32; i++) {
+    //     sys.print(_in[i].toFixed(8) + "\t");
+    //     if (i % 8 === 7) sys.print("\n");
+    // }
+
+    t0   = _in[0]  + _in[31];  t16  = ((_in[0]  - _in[31]) * (costab1));
+    t1   = _in[15] + _in[16];  t17  = ((_in[15] - _in[16]) * (costab31));
+
+    t41  = t16 + t17;
+    t59  = ((t16 - t17) * (costab2));
+    t33  = t0  + t1;
+    t50  = ((t0  - t1) * ( costab2));
+
+    t2   = _in[7]  + _in[24];  t18  = ((_in[7]  - _in[24]) * (costab15));
+    t3   = _in[8]  + _in[23];  t19  = ((_in[8]  - _in[23]) * (costab17));
+
+    t42  = t18 + t19;
+    t60  = ((t18 - t19) * (costab30));
+    t34  = t2  + t3;
+    t51  = ((t2  - t3) * ( costab30));
+
+    t4   = _in[3]  + _in[28];  t20  = ((_in[3]  - _in[28]) * (costab7));
+    t5   = _in[12] + _in[19];  t21  = ((_in[12] - _in[19]) * (costab25));
+
+    t43  = t20 + t21;
+    t61  = ((t20 - t21) * (costab14));
+    t35  = t4  + t5;
+    t52  = ((t4  - t5) * ( costab14));
+
+    t6   = _in[4]  + _in[27];  t22  = ((_in[4]  - _in[27]) * (costab9));
+    t7   = _in[11] + _in[20];  t23  = ((_in[11] - _in[20]) * (costab23));
+
+    t44  = t22 + t23;
+    t62  = ((t22 - t23) * (costab18));
+    t36  = t6  + t7;
+    t53  = ((t6  - t7) * ( costab18));
+
+    t8   = _in[1]  + _in[30];  t24  = ((_in[1]  - _in[30]) * (costab3));
+    t9   = _in[14] + _in[17];  t25  = ((_in[14] - _in[17]) * (costab29));
+
+    t45  = t24 + t25;
+    t63  = ((t24 - t25) * (costab6));
+    t37  = t8  + t9;
+    t54  = ((t8  - t9) * ( costab6));
+
+    t10  = _in[6]  + _in[25];  t26  = ((_in[6]  - _in[25]) * (costab13));
+    t11  = _in[9]  + _in[22];  t27  = ((_in[9]  - _in[22]) * (costab19));
+
+    t46  = t26 + t27;
+    t64  = ((t26 - t27) * (costab26));
+    t38  = t10 + t11;
+    t55  = ((t10 - t11) * (costab26));
+
+    t12  = _in[2]  + _in[29];  t28  = ((_in[2]  - _in[29]) * (costab5));
+    t13  = _in[13] + _in[18];  t29  = ((_in[13] - _in[18]) * (costab27));
+
+    t47  = t28 + t29;
+    t65  = ((t28 - t29) * (costab10));
+    t39  = t12 + t13;
+    t56  = ((t12 - t13) * (costab10));
+
+    t14  = _in[5]  + _in[26];  t30  = ((_in[5]  - _in[26]) * (costab11));
+    t15  = _in[10] + _in[21];  t31  = ((_in[10] - _in[21]) * (costab21));
+
+    t48  = t30 + t31;
+    t66  = ((t30 - t31) * (costab22));
+    t40  = t14 + t15;
+    t57  = ((t14 - t15) * (costab22));
+
+    t69  = t33 + t34;  t89  = ((t33 - t34) * (costab4));
+    t70  = t35 + t36;  t90  = ((t35 - t36) * (costab28));
+    t71  = t37 + t38;  t91  = ((t37 - t38) * (costab12));
+    t72  = t39 + t40;  t92  = ((t39 - t40) * (costab20));
+    t73  = t41 + t42;  t94  = ((t41 - t42) * (costab4));
+    t74  = t43 + t44;  t95  = ((t43 - t44) * (costab28));
+    t75  = t45 + t46;  t96  = ((t45 - t46) * (costab12));
+    t76  = t47 + t48;  t97  = ((t47 - t48) * (costab20));
+
+    t78  = t50 + t51;  t100 = ((t50 - t51) * (costab4));
+    t79  = t52 + t53;  t101 = ((t52 - t53) * (costab28));
+    t80  = t54 + t55;  t102 = ((t54 - t55) * (costab12));
+    t81  = t56 + t57;  t103 = ((t56 - t57) * (costab20));
+
+    t83  = t59 + t60;  t106 = ((t59 - t60) * (costab4));
+    t84  = t61 + t62;  t107 = ((t61 - t62) * (costab28));
+    t85  = t63 + t64;  t108 = ((t63 - t64) * (costab12));
+    t86  = t65 + t66;  t109 = ((t65 - t66) * (costab20));
+
+    t113 = t69  + t70;
+    t114 = t71  + t72;
+
+    /*  0 */ hi[15][slot] = t113 + t114;
+    /* 16 */ lo[ 0][slot] = ((t113 - t114) * (costab16));
+
+    t115 = t73  + t74;
+    t116 = t75  + t76;
+
+    t32  = t115 + t116;
+
+    /*  1 */ hi[14][slot] = t32;
+
+    t118 = t78  + t79;
+    t119 = t80  + t81;
+
+    t58  = t118 + t119;
+
+    /*  2 */ hi[13][slot] = t58;
+
+    t121 = t83  + t84;
+    t122 = t85  + t86;
+
+    t67  = t121 + t122;
+
+    t49  = (t67 * 2) - t32;
+
+    /*  3 */ hi[12][slot] = t49;
+
+    t125 = t89  + t90;
+    t126 = t91  + t92;
+
+    t93  = t125 + t126;
+
+    /*  4 */ hi[11][slot] = t93;
+
+    t128 = t94  + t95;
+    t129 = t96  + t97;
+
+    t98  = t128 + t129;
+
+    t68  = (t98 * 2) - t49;
+
+    /*  5 */ hi[10][slot] = t68;
+
+    t132 = t100 + t101;
+    t133 = t102 + t103;
+
+    t104 = t132 + t133;
+
+    t82  = (t104 * 2) - t58;
+
+    /*  6 */ hi[ 9][slot] = t82;
+
+    t136 = t106 + t107;
+    t137 = t108 + t109;
+
+    t110 = t136 + t137;
+
+    t87  = (t110 * 2) - t67;
+
+    t77  = (t87 * 2) - t68;
+
+    /*  7 */ hi[ 8][slot] = t77;
+
+    t141 = ((t69 - t70) * (costab8));
+    t142 = ((t71 - t72) * (costab24));
+    t143 = t141 + t142;
+
+    /*  8 */ hi[ 7][slot] = t143;
+    /* 24 */ lo[ 8][slot] =
+        (((t141 - t142) * (costab16) * 2)) - t143;
+
+    t144 = ((t73 - t74) * (costab8));
+    t145 = ((t75 - t76) * (costab24));
+    t146 = t144 + t145;
+
+    t88  = (t146 * 2) - t77;
+
+    /*  9 */ hi[ 6][slot] = t88;
+
+    t148 = ((t78 - t79) * (costab8));
+    t149 = ((t80 - t81) * (costab24));
+    t150 = t148 + t149;
+
+    t105 = (t150 * 2) - t82;
+
+    /* 10 */ hi[ 5][slot] = t105;
+
+    t152 = ((t83 - t84) * (costab8));
+    t153 = ((t85 - t86) * (costab24));
+    t154 = t152 + t153;
+
+    t111 = (t154 * 2) - t87;
+
+    t99  = (t111 * 2) - t88;
+
+    /* 11 */ hi[ 4][slot] = t99;
+
+    t157 = ((t89 - t90) * (costab8));
+    t158 = ((t91 - t92) * (costab24));
+    t159 = t157 + t158;
+
+    t127 = (t159 * 2) - t93;
+
+    /* 12 */ hi[ 3][slot] = t127;
+
+    t160 = (((t125 - t126) * (costab16) * 2)) - t127;
+
+    /* 20 */ lo[ 4][slot] = t160;
+    /* 28 */ lo[12][slot] =
+        (((((t157 - t158) * (costab16) * 2) - t159) * 2)) - t160;
+
+    t161 = ((t94 - t95) * (costab8));
+    t162 = ((t96 - t97) * (costab24));
+    t163 = t161 + t162;
+
+    t130 = (t163 * 2) - t98;
+
+    t112 = (t130 * 2) - t99;
+
+    /* 13 */ hi[ 2][slot] = t112;
+
+    t164 = (((t128 - t129) * (costab16) * 2)) - t130;
+
+    t166 = ((t100 - t101) * (costab8));
+    t167 = ((t102 - t103) * (costab24));
+    t168 = t166 + t167;
+
+    t134 = (t168 * 2) - t104;
+
+    t120 = (t134 * 2) - t105;
+
+    /* 14 */ hi[ 1][slot] = t120;
+
+    t135 = (((t118 - t119) * (costab16) * 2)) - t120;
+
+    /* 18 */ lo[ 2][slot] = t135;
+
+    t169 = (((t132 - t133) * (costab16) * 2)) - t134;
+
+    t151 = (t169 * 2) - t135;
+
+    /* 22 */ lo[ 6][slot] = t151;
+
+    t170 = (((((t148 - t149) * (costab16) * 2) - t150) * 2)) - t151;
+
+    /* 26 */ lo[10][slot] = t170;
+    /* 30 */ lo[14][slot] =
+        (((((((t166 - t167) * (costab16)) * 2 -
+             t168) * 2) - t169) * 2) - t170);
+
+    t171 = ((t106 - t107) * (costab8));
+    t172 = ((t108 - t109) * (costab24));
+    t173 = t171 + t172;
+
+    t138 = (t173 * 2) - t110;
+
+    t123 = (t138 * 2) - t111;
+
+    t139 = (((t121 - t122) * (costab16) * 2)) - t123;
+
+    t117 = (t123 * 2) - t112;
+
+    /* 15 */ hi[ 0][slot] = t117;
+
+    t124 = (((t115 - t116) * (costab16) * 2)) - t117;
+
+    /* 17 */ lo[ 1][slot] = t124;
+
+    t131 = (t139 * 2) - t124;
+
+    /* 19 */ lo[ 3][slot] = t131;
+
+    t140 = (t164 * 2) - t131;
+
+    /* 21 */ lo[ 5][slot] = t140;
+
+    t174 = (((t136 - t137) * (costab16) * 2)) - t138;
+
+    t155 = (t174 * 2) - t139;
+
+    t147 = (t155 * 2) - t140;
+
+    /* 23 */ lo[ 7][slot] = t147;
+
+    t156 = (((((t144 - t145) * (costab16) * 2) - t146) * 2)) - t147;
+
+    /* 25 */ lo[ 9][slot] = t156;
+
+    t175 = (((((t152 - t153) * (costab16) * 2) - t154) * 2)) - t155;
+
+    t165 = (t175 * 2) - t156;
+
+    /* 27 */ lo[11][slot] = t165;
+
+    t176 = (((((((t161 - t162) * (costab16) * 2)) -
+               t163) * 2) - t164) * 2) - t165;
+
+    /* 29 */ lo[13][slot] = t176;
+    /* 31 */ lo[15][slot] =
+        (((((((((t171 - t172) * (costab16)) * 2 -
+               t173) * 2) - t174) * 2) - t175) * 2) - t176);
+
+    /*
+     * Totals:
+     *  80 multiplies
+     *  80 additions
+     * 119 subtractions
+     *  49 shifts (not counting SSO)
+     */
+}
+
+var D /* [17][32] */ = [
+    /*
+     * These are the coefficients for the subband synthesis window. This is a
+     * reordered version of Table B.3 from ISO/IEC 11172-3.
+     */
+    [  0.000000000,   /*  0 */
+       -0.000442505,
+       0.003250122,
+       -0.007003784,
+       0.031082153,
+       -0.078628540,
+       0.100311279,
+       -0.572036743,
+       1.144989014,
+       0.572036743,
+       0.100311279,
+       0.078628540,
+       0.031082153,
+       0.007003784,
+       0.003250122,
+       0.000442505,
+
+       0.000000000,
+       -0.000442505,
+       0.003250122,
+       -0.007003784,
+       0.031082153,
+       -0.078628540,
+       0.100311279,
+       -0.572036743,
+       1.144989014,
+       0.572036743,
+       0.100311279,
+       0.078628540,
+       0.031082153,
+       0.007003784,
+       0.003250122,
+       0.000442505 ],
+
+    [ -0.000015259,   /*  1 */
+      -0.000473022,
+      0.003326416,
+      -0.007919312,
+      0.030517578,
+      -0.084182739,
+      0.090927124,
+      -0.600219727,
+      1.144287109,
+      0.543823242,
+      0.108856201,
+      0.073059082,
+      0.031478882,
+      0.006118774,
+      0.003173828,
+      0.000396729,
+
+      -0.000015259,
+      -0.000473022,
+      0.003326416,
+      -0.007919312,
+      0.030517578,
+      -0.084182739,
+      0.090927124,
+      -0.600219727,
+      1.144287109,
+      0.543823242,
+      0.108856201,
+      0.073059082,
+      0.031478882,
+      0.006118774,
+      0.003173828,
+      0.000396729 ],
+
+    [ -0.000015259,   /*  2 */
+      -0.000534058,
+      0.003387451,
+      -0.008865356,
+      0.029785156,
+      -0.089706421,
+      0.080688477,
+      -0.628295898,
+      1.142211914,
+      0.515609741,
+      0.116577148,
+      0.067520142,
+      0.031738281,
+      0.005294800,
+      0.003082275,
+      0.000366211,
+
+      -0.000015259,
+      -0.000534058,
+      0.003387451,
+      -0.008865356,
+      0.029785156,
+      -0.089706421,
+      0.080688477,
+      -0.628295898,
+      1.142211914,
+      0.515609741,
+      0.116577148,
+      0.067520142,
+      0.031738281,
+      0.005294800,
+      0.003082275,
+      0.000366211 ],
+
+    [ -0.000015259,   /*  3 */
+      -0.000579834,
+      0.003433228,
+      -0.009841919,
+      0.028884888,
+      -0.095169067,
+      0.069595337,
+      -0.656219482,
+      1.138763428,
+      0.487472534,
+      0.123474121,
+      0.061996460,
+      0.031845093,
+      0.004486084,
+      0.002990723,
+      0.000320435,
+
+      -0.000015259,
+      -0.000579834,
+      0.003433228,
+      -0.009841919,
+      0.028884888,
+      -0.095169067,
+      0.069595337,
+      -0.656219482,
+      1.138763428,
+      0.487472534,
+      0.123474121,
+      0.061996460,
+      0.031845093,
+      0.004486084,
+      0.002990723,
+      0.000320435 ],
+
+    [ -0.000015259,   /*  4 */
+      -0.000625610,
+      0.003463745,
+      -0.010848999,
+      0.027801514,
+      -0.100540161,
+      0.057617187,
+      -0.683914185,
+      1.133926392,
+      0.459472656,
+      0.129577637,
+      0.056533813,
+      0.031814575,
+      0.003723145,
+      0.002899170,
+      0.000289917,
+
+      -0.000015259,
+      -0.000625610,
+      0.003463745,
+      -0.010848999,
+      0.027801514,
+      -0.100540161,
+      0.057617187,
+      -0.683914185,
+      1.133926392,
+      0.459472656,
+      0.129577637,
+      0.056533813,
+      0.031814575,
+      0.003723145,
+      0.002899170,
+      0.000289917 ],
+
+    [ -0.000015259,   /*  5 */
+      -0.000686646,
+      0.003479004,
+      -0.011886597,
+      0.026535034,
+      -0.105819702,
+      0.044784546,
+      -0.711318970,
+      1.127746582,
+      0.431655884,
+      0.134887695,
+      0.051132202,
+      0.031661987,
+      0.003005981,
+      0.002792358,
+      0.000259399,
+
+      -0.000015259,
+      -0.000686646,
+      0.003479004,
+      -0.011886597,
+      0.026535034,
+      -0.105819702,
+      0.044784546,
+      -0.711318970,
+      1.127746582,
+      0.431655884,
+      0.134887695,
+      0.051132202,
+      0.031661987,
+      0.003005981,
+      0.002792358,
+      0.000259399 ],
+
+    [ -0.000015259,   /*  6 */
+      -0.000747681,
+      0.003479004,
+      -0.012939453,
+      0.025085449,
+      -0.110946655,
+      0.031082153,
+      -0.738372803,
+      1.120223999,
+      0.404083252,
+      0.139450073,
+      0.045837402,
+      0.031387329,
+      0.002334595,
+      0.002685547,
+      0.000244141,
+
+      -0.000015259,
+      -0.000747681,
+      0.003479004,
+      -0.012939453,
+      0.025085449,
+      -0.110946655,
+      0.031082153,
+      -0.738372803,
+      1.120223999,
+      0.404083252,
+      0.139450073,
+      0.045837402,
+      0.031387329,
+      0.002334595,
+      0.002685547,
+      0.000244141 ],
+
+    [ -0.000030518,   /*  7 */
+      -0.000808716,
+      0.003463745,
+      -0.014022827,
+      0.023422241,
+      -0.115921021,
+      0.016510010,
+      -0.765029907,
+      1.111373901,
+      0.376800537,
+      0.143264771,
+      0.040634155,
+      0.031005859,
+      0.001693726,
+      0.002578735,
+      0.000213623,
+
+      -0.000030518,
+      -0.000808716,
+      0.003463745,
+      -0.014022827,
+      0.023422241,
+      -0.115921021,
+      0.016510010,
+      -0.765029907,
+      1.111373901,
+      0.376800537,
+      0.143264771,
+      0.040634155,
+      0.031005859,
+      0.001693726,
+      0.002578735,
+      0.000213623 ],
+
+    [ -0.000030518,   /*  8 */
+      -0.000885010,
+      0.003417969,
+      -0.015121460,
+      0.021575928,
+      -0.120697021,
+      0.001068115,
+      -0.791213989,
+      1.101211548,
+      0.349868774,
+      0.146362305,
+      0.035552979,
+      0.030532837,
+      0.001098633,
+      0.002456665,
+      0.000198364,
+
+      -0.000030518,
+      -0.000885010,
+      0.003417969,
+      -0.015121460,
+      0.021575928,
+      -0.120697021,
+      0.001068115,
+      -0.791213989,
+      1.101211548,
+      0.349868774,
+      0.146362305,
+      0.035552979,
+      0.030532837,
+      0.001098633,
+      0.002456665,
+      0.000198364 ],
+
+    [ -0.000030518,   /*  9 */
+      -0.000961304,
+      0.003372192,
+      -0.016235352,
+      0.019531250,
+      -0.125259399,
+      -0.015228271,
+      -0.816864014,
+      1.089782715,
+      0.323318481,
+      0.148773193,
+      0.030609131,
+      0.029937744,
+      0.000549316,
+      0.002349854,
+      0.000167847,
+
+      -0.000030518,
+      -0.000961304,
+      0.003372192,
+      -0.016235352,
+      0.019531250,
+      -0.125259399,
+      -0.015228271,
+      -0.816864014,
+      1.089782715,
+      0.323318481,
+      0.148773193,
+      0.030609131,
+      0.029937744,
+      0.000549316,
+      0.002349854,
+      0.000167847 ],
+
+    [ -0.000030518,   /* 10 */
+      -0.001037598,
+      0.003280640,
+      -0.017349243,
+      0.017257690,
+      -0.129562378,
+      -0.032379150,
+      -0.841949463,
+      1.077117920,
+      0.297210693,
+      0.150497437,
+      0.025817871,
+      0.029281616,
+      0.000030518,
+      0.002243042,
+      0.000152588,
+
+      -0.000030518,
+      -0.001037598,
+      0.003280640,
+      -0.017349243,
+      0.017257690,
+      -0.129562378,
+      -0.032379150,
+      -0.841949463,
+      1.077117920,
+      0.297210693,
+      0.150497437,
+      0.025817871,
+      0.029281616,
+      0.000030518,
+      0.002243042,
+      0.000152588 ],
+
+    [ -0.000045776,   /* 11 */
+      -0.001113892,
+      0.003173828,
+      -0.018463135,
+      0.014801025,
+      -0.133590698,
+      -0.050354004,
+      -0.866363525,
+      1.063217163,
+      0.271591187,
+      0.151596069,
+      0.021179199,
+      0.028533936,
+      -0.000442505,
+      0.002120972,
+      0.000137329,
+
+      -0.000045776,
+      -0.001113892,
+      0.003173828,
+      -0.018463135,
+      0.014801025,
+      -0.133590698,
+      -0.050354004,
+      -0.866363525,
+      1.063217163,
+      0.271591187,
+      0.151596069,
+      0.021179199,
+      0.028533936,
+      -0.000442505,
+      0.002120972,
+      0.000137329 ],
+
+    [ -0.000045776,   /* 12 */
+      -0.001205444,
+      0.003051758,
+      -0.019577026,
+      0.012115479,
+      -0.137298584,
+      -0.069168091,
+      -0.890090942,
+      1.048156738,
+      0.246505737,
+      0.152069092,
+      0.016708374,
+      0.027725220,
+      -0.000869751,
+      0.002014160,
+      0.000122070,
+
+      -0.000045776,
+      -0.001205444,
+      0.003051758,
+      -0.019577026,
+      0.012115479,
+      -0.137298584,
+      -0.069168091,
+      -0.890090942,
+      1.048156738,
+      0.246505737,
+      0.152069092,
+      0.016708374,
+      0.027725220,
+      -0.000869751,
+      0.002014160,
+      0.000122070 ],
+
+    [ -0.000061035,   /* 13 */
+      -0.001296997,
+      0.002883911,
+      -0.020690918,
+      0.009231567,
+      -0.140670776,
+      -0.088775635,
+      -0.913055420,
+      1.031936646,
+      0.221984863,
+      0.151962280,
+      0.012420654,
+      0.026840210,
+      -0.001266479,
+      0.001907349,
+      0.000106812,
+
+      -0.000061035,
+      -0.001296997,
+      0.002883911,
+      -0.020690918,
+      0.009231567,
+      -0.140670776,
+      -0.088775635,
+      -0.913055420,
+      1.031936646,
+      0.221984863,
+      0.151962280,
+      0.012420654,
+      0.026840210,
+      -0.001266479,
+      0.001907349,
+      0.000106812 ],
+
+    [ -0.000061035,   /* 14 */
+      -0.001388550,
+      0.002700806,
+      -0.021789551,
+      0.006134033,
+      -0.143676758,
+      -0.109161377,
+      -0.935195923,
+      1.014617920,
+      0.198059082,
+      0.151306152,
+      0.008316040,
+      0.025909424,
+      -0.001617432,
+      0.001785278,
+      0.000106812,
+
+      -0.000061035,
+      -0.001388550,
+      0.002700806,
+      -0.021789551,
+      0.006134033,
+      -0.143676758,
+      -0.109161377,
+      -0.935195923,
+      1.014617920,
+      0.198059082,
+      0.151306152,
+      0.008316040,
+      0.025909424,
+      -0.001617432,
+      0.001785278,
+      0.000106812 ],
+
+    [ -0.000076294,   /* 15 */
+      -0.001480103,
+      0.002487183,
+      -0.022857666,
+      0.002822876,
+      -0.146255493,
+      -0.130310059,
+      -0.956481934,
+      0.996246338,
+      0.174789429,
+      0.150115967,
+      0.004394531,
+      0.024932861,
+      -0.001937866,
+      0.001693726,
+      0.000091553,
+
+      -0.000076294,
+      -0.001480103,
+      0.002487183,
+      -0.022857666,
+      0.002822876,
+      -0.146255493,
+      -0.130310059,
+      -0.956481934,
+      0.996246338,
+      0.174789429,
+      0.150115967,
+      0.004394531,
+      0.024932861,
+      -0.001937866,
+      0.001693726,
+      0.000091553 ],
+
+    [ -0.000076294,   /* 16 */
+      -0.001586914,
+      0.002227783,
+      -0.023910522,
+      -0.000686646,
+      -0.148422241,
+      -0.152206421,
+      -0.976852417,
+      0.976852417,
+      0.152206421,
+      0.148422241,
+      0.000686646,
+      0.023910522,
+      -0.002227783,
+      0.001586914,
+      0.000076294,
+
+      -0.000076294,
+      -0.001586914,
+      0.002227783,
+      -0.023910522,
+      -0.000686646,
+      -0.148422241,
+      -0.152206421,
+      -0.976852417,
+      0.976852417,
+      0.152206421,
+      0.148422241,
+      0.000686646,
+      0.023910522,
+      -0.002227783,
+      0.001586914,
+      0.000076294 ]
+];
+
+/*
+ * NAME:    synth.full()
+ * DESCRIPTION: perform full frequency PCM synthesis
+ */
+Mad.Synth.prototype.full = function(frame, nch, ns) {
+    var Dptr, hi, lo, ptr;
+    
+    for (var ch = 0; ch < nch; ++ch) {
+        var sbsample /* [36][32] */ = frame.sbsample[ch];
+        var filter = this.filter[ch]  /* [2][2][16][8] */;
+        var phase    = this.phase;
+        var pcm      = this.pcm.samples[ch];
+        var pcm1Ptr  = 0;
+        var pcm2Ptr  = 0;
+
+        for (var s = 0; s < ns; ++s) {
+            Mad.Synth.dct32(sbsample[s], phase >> 1, filter[0][phase & 1], filter[1][phase & 1]);
+
+            var pe = phase & ~1;
+            var po = ((phase - 1) & 0xf) | 1;
+
+            /* calculate 32 samples */
+            var fe = filter[0][ phase & 1];
+            var fx = filter[0][~phase & 1];
+            var fo = filter[1][~phase & 1];
+
+            var fePtr = 0;
+            var fxPtr = 0;
+            var foPtr = 0;
+            
+            Dptr = 0;
+
+            ptr = D[Dptr];
+            _fx = fx[fxPtr];
+            _fe = fe[fePtr];
+
+            lo =  _fx[0] * ptr[po +  0];
+            lo += _fx[1] * ptr[po + 14];
+            lo += _fx[2] * ptr[po + 12];
+            lo += _fx[3] * ptr[po + 10];
+            lo += _fx[4] * ptr[po +  8];
+            lo += _fx[5] * ptr[po +  6];
+            lo += _fx[6] * ptr[po +  4];
+            lo += _fx[7] * ptr[po +  2];
+            lo = -lo;                      
+            
+            lo += _fe[0] * ptr[pe +  0];
+            lo += _fe[1] * ptr[pe + 14];
+            lo += _fe[2] * ptr[pe + 12];
+            lo += _fe[3] * ptr[pe + 10];
+            lo += _fe[4] * ptr[pe +  8];
+            lo += _fe[5] * ptr[pe +  6];
+            lo += _fe[6] * ptr[pe +  4];
+            lo += _fe[7] * ptr[pe +  2];
+
+            pcm[pcm1Ptr++] = lo;
+            pcm2Ptr = pcm1Ptr + 30;
+
+            for (var sb = 1; sb < 16; ++sb) {
+                ++fePtr;
+                ++Dptr;
+
+                /* D[32 - sb][i] === -D[sb][31 - i] */
+
+                ptr = D[Dptr];
+                _fo = fo[foPtr];
+                _fe = fe[fePtr];
+
+                lo  = _fo[0] * ptr[po +  0];
+                lo += _fo[1] * ptr[po + 14];
+                lo += _fo[2] * ptr[po + 12];
+                lo += _fo[3] * ptr[po + 10];
+                lo += _fo[4] * ptr[po +  8];
+                lo += _fo[5] * ptr[po +  6];
+                lo += _fo[6] * ptr[po +  4];
+                lo += _fo[7] * ptr[po +  2];
+                lo = -lo;
+
+                lo += _fe[7] * ptr[pe + 2];
+                lo += _fe[6] * ptr[pe + 4];
+                lo += _fe[5] * ptr[pe + 6];
+                lo += _fe[4] * ptr[pe + 8];
+                lo += _fe[3] * ptr[pe + 10];
+                lo += _fe[2] * ptr[pe + 12];
+                lo += _fe[1] * ptr[pe + 14];
+                lo += _fe[0] * ptr[pe + 0];
+
+                pcm[pcm1Ptr++] = lo;
+
+                lo =  _fe[0] * ptr[-pe + 31 - 16];
+                lo += _fe[1] * ptr[-pe + 31 - 14];
+                lo += _fe[2] * ptr[-pe + 31 - 12];
+                lo += _fe[3] * ptr[-pe + 31 - 10];
+                lo += _fe[4] * ptr[-pe + 31 -  8];
+                lo += _fe[5] * ptr[-pe + 31 -  6];
+                lo += _fe[6] * ptr[-pe + 31 -  4];
+                lo += _fe[7] * ptr[-pe + 31 -  2];
+
+                lo += _fo[7] * ptr[-po + 31 -  2];
+                lo += _fo[6] * ptr[-po + 31 -  4];
+                lo += _fo[5] * ptr[-po + 31 -  6];
+                lo += _fo[4] * ptr[-po + 31 -  8];
+                lo += _fo[3] * ptr[-po + 31 - 10];
+                lo += _fo[2] * ptr[-po + 31 - 12];
+                lo += _fo[1] * ptr[-po + 31 - 14];
+                lo += _fo[0] * ptr[-po + 31 - 16];
+
+                pcm[pcm2Ptr--] = lo;
+                ++foPtr;
+            }
+
+            ++Dptr;
+
+            ptr = D[Dptr];
+            _fo = fo[foPtr];
+
+            lo  = _fo[0] * ptr[po +  0];
+            lo += _fo[1] * ptr[po + 14];
+            lo += _fo[2] * ptr[po + 12];
+            lo += _fo[3] * ptr[po + 10];
+            lo += _fo[4] * ptr[po +  8];
+            lo += _fo[5] * ptr[po +  6];
+            lo += _fo[6] * ptr[po +  4];
+            lo += _fo[7] * ptr[po +  2];
+
+            pcm[pcm1Ptr] = -lo;
+            pcm1Ptr += 16;
+            phase = (phase + 1) % 16;
+        }
+    }
+}
+
+
+/*
+ * NAME:    synth.half()
+ * DESCRIPTION: perform half frequency PCM synthesis
+ */
+
+// Yeah, I don't think so
+
+//static
+//void synth_half(struct mad_synth *synth, struct mad_frame const *frame,
+//      unsigned int nch, unsigned int ns)
+//{
+//  unsigned int phase, ch, s, sb, pe, po;
+//  mad_fixed_t *pcm1, *pcm2, filter[2][2][16][8];
+//  mad_fixed_t const (*sbsample)[36][32];
+//  register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8];
+//  register mad_fixed_t const (*Dptr)[32], *ptr;
+//  register mad_fixed64hi_t hi;
+//  register mad_fixed64lo_t lo;
+//
+//  for (ch = 0; ch < nch; ++ch) {
+//    sbsample = &frame.sbsample[ch];
+//    filter   = &synth.filter[ch];
+//    phase    = synth.phase;
+//    pcm1     = synth.pcm.samples[ch];
+//
+//    for (s = 0; s < ns; ++s) {
+//      dct32((*sbsample)[s], phase >> 1,
+//      filter[0][phase & 1], filter[1][phase & 1]);
+//
+//      pe = phase & ~1;
+//      po = ((phase - 1) & 0xf) | 1;
+//
+//      /* calculate 16 samples */
+//
+//      fe = &filter[0][ phase & 1][0];
+//      fx = &filter[0][~phase & 1][0];
+//      fo = &filter[1][~phase & 1][0];
+//
+//      Dptr = &D[0];
+//
+//      ptr = *Dptr + po;
+//      ML0(hi, lo, (*fx)[0], ptr[ 0]);
+//      MLA(hi, lo, (*fx)[1], ptr[14]);
+//      MLA(hi, lo, (*fx)[2], ptr[12]);
+//      MLA(hi, lo, (*fx)[3], ptr[10]);
+//      MLA(hi, lo, (*fx)[4], ptr[ 8]);
+//      MLA(hi, lo, (*fx)[5], ptr[ 6]);
+//      MLA(hi, lo, (*fx)[6], ptr[ 4]);
+//      MLA(hi, lo, (*fx)[7], ptr[ 2]);
+//      MLN(hi, lo);
+//
+//      ptr = *Dptr + pe;
+//      MLA(hi, lo, (*fe)[0], ptr[ 0]);
+//      MLA(hi, lo, (*fe)[1], ptr[14]);
+//      MLA(hi, lo, (*fe)[2], ptr[12]);
+//      MLA(hi, lo, (*fe)[3], ptr[10]);
+//      MLA(hi, lo, (*fe)[4], ptr[ 8]);
+//      MLA(hi, lo, (*fe)[5], ptr[ 6]);
+//      MLA(hi, lo, (*fe)[6], ptr[ 4]);
+//      MLA(hi, lo, (*fe)[7], ptr[ 2]);
+//
+//      *pcm1++ = MLZ(hi, lo);
+//
+//      pcm2 = pcm1 + 14;
+//
+//      for (sb = 1; sb < 16; ++sb) {
+//  ++fe;
+//  ++Dptr;
+//
+//  /* D[32 - sb][i] === -D[sb][31 - i] */
+//
+//  if (!(sb & 1)) {
+//    ptr = *Dptr + po;
+//    ML0(hi, lo, (*fo)[0], ptr[ 0]);
+//    MLA(hi, lo, (*fo)[1], ptr[14]);
+//    MLA(hi, lo, (*fo)[2], ptr[12]);
+//    MLA(hi, lo, (*fo)[3], ptr[10]);
+//    MLA(hi, lo, (*fo)[4], ptr[ 8]);
+//    MLA(hi, lo, (*fo)[5], ptr[ 6]);
+//    MLA(hi, lo, (*fo)[6], ptr[ 4]);
+//    MLA(hi, lo, (*fo)[7], ptr[ 2]);
+//    MLN(hi, lo);
+//
+//    ptr = *Dptr + pe;
+//    MLA(hi, lo, (*fe)[7], ptr[ 2]);
+//    MLA(hi, lo, (*fe)[6], ptr[ 4]);
+//    MLA(hi, lo, (*fe)[5], ptr[ 6]);
+//    MLA(hi, lo, (*fe)[4], ptr[ 8]);
+//    MLA(hi, lo, (*fe)[3], ptr[10]);
+//    MLA(hi, lo, (*fe)[2], ptr[12]);
+//    MLA(hi, lo, (*fe)[1], ptr[14]);
+//    MLA(hi, lo, (*fe)[0], ptr[ 0]);
+//
+//    *pcm1++ = MLZ(hi, lo);
+//
+//    ptr = *Dptr - po;
+//    ML0(hi, lo, (*fo)[7], ptr[31 -  2]);
+//    MLA(hi, lo, (*fo)[6], ptr[31 -  4]);
+//    MLA(hi, lo, (*fo)[5], ptr[31 -  6]);
+//    MLA(hi, lo, (*fo)[4], ptr[31 -  8]);
+//    MLA(hi, lo, (*fo)[3], ptr[31 - 10]);
+//    MLA(hi, lo, (*fo)[2], ptr[31 - 12]);
+//    MLA(hi, lo, (*fo)[1], ptr[31 - 14]);
+//    MLA(hi, lo, (*fo)[0], ptr[31 - 16]);
+//
+//    ptr = *Dptr - pe;
+//    MLA(hi, lo, (*fe)[0], ptr[31 - 16]);
+//    MLA(hi, lo, (*fe)[1], ptr[31 - 14]);
+//    MLA(hi, lo, (*fe)[2], ptr[31 - 12]);
+//    MLA(hi, lo, (*fe)[3], ptr[31 - 10]);
+//    MLA(hi, lo, (*fe)[4], ptr[31 -  8]);
+//    MLA(hi, lo, (*fe)[5], ptr[31 -  6]);
+//    MLA(hi, lo, (*fe)[6], ptr[31 -  4]);
+//    MLA(hi, lo, (*fe)[7], ptr[31 -  2]);
+//
+//    *pcm2-- = MLZ(hi, lo);
+//  }
+//
+//  ++fo;
+//      }
+//
+//      ++Dptr;
+//
+//      ptr = *Dptr + po;
+//      ML0(hi, lo, (*fo)[0], ptr[ 0]);
+//      MLA(hi, lo, (*fo)[1], ptr[14]);
+//      MLA(hi, lo, (*fo)[2], ptr[12]);
+//      MLA(hi, lo, (*fo)[3], ptr[10]);
+//      MLA(hi, lo, (*fo)[4], ptr[ 8]);
+//      MLA(hi, lo, (*fo)[5], ptr[ 6]);
+//      MLA(hi, lo, (*fo)[6], ptr[ 4]);
+//      MLA(hi, lo, (*fo)[7], ptr[ 2]);
+//
+//      *pcm1 = -MLZ(hi, lo);
+//      pcm1 += 8;
+//
+//      phase = (phase + 1) % 16;
+//    }
+//  }
+//}
+
+/*
+ * NAME:    synth.frame()
+ * DESCRIPTION: perform PCM synthesis of frame subband samples
+ */
+Mad.Synth.prototype.frame = function (frame) {
+    var nch = frame.header.nchannels();
+    var ns  = frame.header.nbsamples();
+
+    this.pcm.samplerate = frame.header.samplerate;
+    this.pcm.channels   = nch;
+    this.pcm.length     = 32 * ns;
+
+    // console.log("ns: " + ns);
+
+    /*
+     if (frame.options & Mad.Option.HALFSAMPLERATE) {
+     this.pcm.samplerate /= 2;
+     this.pcm.length     /= 2;
+
+     throw new Error("HALFSAMPLERATE is not supported. What do you think? As if I have the time for this");
+     }
+     */
+
+    this.full(frame, nch, ns);
+    this.phase = (this.phase + ns) % 16;
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/.gitignore
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/.gitignore	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/.gitignore	(revision 28388)
@@ -0,0 +1,6 @@
+sink.js
+sink-light.js
+DOCS.md
+*.tar.gz
+*.zip
+node_modules
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/Makefile
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/Makefile	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/Makefile	(revision 28388)
@@ -0,0 +1,40 @@
+IN := src/main.js src/event-emitter.js src/core/*.js src/sinks/*.js src/utils/*.js src/extra/*.js
+OUT := sink.js
+DOCS := DOCS.md
+BUILD := ./build
+LIGHT_IN := src/main.js src/event-emitter.js src/core/*.js src/sinks/web-audio-api.js src/sinks/audio-data-api.js
+LIGHT_OUT := sink-light.js
+RELEASE_TAR_GZ := sink.js.tar.gz
+RELEASE_ZIP := sink.js.zip
+
+UPDATE := $(BUILD) update
+CAT := cat
+
+all: $(OUT)
+light: $(LIGHT_OUT)
+docs: $(DOCS)
+release: $(RELEASE_TAR_GZ) $(RELEASE_ZIP)
+
+
+$(OUT): $(IN)
+	$(CAT) $^ > $@
+
+$(DOCS): $(BUILD) $(OUT)
+	$(UPDATE) docs
+
+$(LIGHT_OUT): $(LIGHT_IN)
+	$(CAT) $^ > $@
+
+$(RELEASE_TAR_GZ): $(OUT) $(LIGHT_OUT)
+	rm -rf $@
+	tar pczf $@ $^
+
+$(RELEASE_ZIP): $(OUT) $(LIGHT_OUT)
+	rm -rf $@
+	zip $@ $^
+
+
+clean:
+	rm $(OUT) $(LIGHT_OUT) $(DOCS) $(RELEASE_TAR_GZ) $(RELEASE_ZIP) -rf
+
+.PHONY: all light docs clean
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/README.md
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/README.md	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/README.md	(revision 28388)
@@ -0,0 +1,147 @@
+sink.js
+=======
+
+sink.js is a javascript library dedicated for audio output. Features include buffer fill callbacks, synchronous write, asynchronous write, ring buffers and recording. Currently supported platforms are Firefox 4+ and Chrome with Web Audio API enabled in ``` about:flags ```. Additional platforms, such as a flash fallback can be added as plugins, but are currently not featured, nor will ever be enabled by default. For a platform to be added as enabled by default, it needs to be reliable in terms of latency and stability. Flash fallbacks â for example â cannot offer this kind of reliability and the sound will always be flaky at best.
+
+Basic usage
+-------------
+
+To create a sink, the following function is available:
+
+```
+
+var sink = Sink([callback=null], [channelCount=2], [preBufferSize=4096], [sampleRate=44100])
+
+```
+
+Currently, it is recommended to check that you are actually running at the sample rate that you specified, so when you create a sink, get the samplerate reference always from its ``` .sampleRate ``` property.
+
+The callback is fed with two arguments, the buffer to fill and the channel count of the buffer. For example, to play back stereo noise, you can do the following:
+
+```javascript
+
+var sink = Sink(function(buffer, channelCount){
+	var i;
+	for (i=0; i<buffer.length; i++){
+		buffer[i] = Math.random() - 0.5;
+	}
+});
+
+```
+
+Note that `buffer` is interleaved and therefore the samples should be written as :
+
+```javascript 
+[
+    channel1, channel2, ... channelN,	// frame 1
+    channel1, channel2, ... channelN,	// frame 2
+    ...	                                // ...
+]
+``` 
+
+For example, to play back a 440Hz sine wave in stereo, you can do :
+
+```javascript
+var k, v, n = 0;
+var sink = Sink(function(buffer, channelCount){
+	for (var j=0; j<buffer.length; j+=2, n++) {
+        	v = Math.sin(k*n);
+        	buffer[j] = v;
+        	buffer[j+1] = v;
+    	}
+}, 2); // 2 channels ... which is already the default
+
+k = 2*Math.PI*440/sink.sampleRate;
+```
+
+Note also that the length of the `buffer` can vary, it will however always be less than `preBufferSize`. If you need control over `buffer`'s length, check-out [proxies][proxy]. 
+
+To bring the sink to a force stop, you can use the ``` .kill() ``` method. But so far, this doesn't work in Chrome, and the Chrome's AudioContext can't be taken down. This will be fixed as soon as possible. Also, beware of creating multiple sinks to avoid unexpected results.
+
+Buffer writing API
+-------------------
+
+As an alternative to the callback API, you can directly write sound to the buffers with ``` .write(buffer, [delay=undefined]) ``` method. The default writing mode is "async" where the specified buffer will be mixed with existing data. If a delay is not specified, the system will automatically create a delay to try to compensate the latency. The delay is specified as number of samples.
+
+Another mode of writing is "sync". You can set this by changing your sink's ``` .writeMode ``` property to "sync". In the "sync" write mode, the delay is disregarded and instead all written buffers will be appended right after the previous one has been exhausted. To get the current sample offset in the "sync" write mode, you can use the ``` .getSyncWriteOffset() ``` method.
+
+Beware of writing zero-length buffers, as they will induce NaNs to your buffers. This can be a bad thing especially if written in the "sync" mode and combined with some effects processing in a callback.
+
+Proxy
+------
+
+[proxy]:
+
+`Proxy` is a thin-wrapper around the basic sink, allowing you to control the size of the buffer received by the callback.
+
+To create a proxy, use the following function:
+
+```
+
+var proxy = Sink.createProxy([bufferSize=4096])
+
+```
+
+For example, to play back a 440Hz sine wave in stereo, you can do :
+
+```javascript
+var bufferSize = 4096, sink = Sink();
+var proxy = sink.createProxy(bufferSize);
+proxy.on('audioprocess', function(buffer, channelCount){
+	for (var j=0; j<bufferSize; j+=2, n++) {
+        	v = Math.sin(k*n);
+        	buffer[j] = v;
+        	buffer[j+1] = v;
+    	}
+});
+```
+
+Recording
+-----------
+
+Recording can be done by creating an instance of the recording, like this:
+
+```javascript
+
+var recording = sink.record();
+
+// And when you want to stop recording:
+
+recording.stop();
+
+// To join the recording into a single buffer:
+
+var buffer = recording.join();
+
+```
+
+Ring buffer
+-------------
+
+Here's an example how to use the ring buffer:
+
+```javascript
+
+// Enable & create the ring buffer
+
+sink.ringBuffer = new Float32Array(sink.sampleRate * sink.channelCount);
+
+// Get or modify the current offset of the ring buffer.
+
+console.log(sink.ringOffset);
+
+```
+
+That would create a ring buffer of the length of a single second, and you can manipulate that anyway you want, and use it together with callbacks and / or writing.
+
+Projects using sink.js
+----------------------
+
+* [aurora.js](https://github.com/jensnockert/aurora.js) A JS-powered video and audio playback framework.
+* [Audiolet](https://github.com/oampo/Audiolet) A comphrehensive, graph based audio synthesis / composition library for JS.
+* [audiolib.js](https://github.com/jussi-kalliokoski/audiolib.js) A full-fletched audio synthesis / processing framework.
+
+License
+-------
+
+sink.js is released under MIT license.
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/build
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/build	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/build	(revision 28388)
@@ -0,0 +1,490 @@
+#!/usr/bin/env node
+
+/* vim: set filetype=javascript */
+
+var	sys		= require('util');
+
+function print(){
+	[].slice.call(arguments).forEach(function(a){
+		sys.puts(a);
+	});
+}
+
+function _path(){
+	return [].slice.call(arguments).map(function(a){return/^(.+)\/?$/.exec(a)[1]}).join('/');
+}
+
+function fh(str){
+	return str.replace(/[<>]/g, function(a){return a==='<'?'&lt;':'&gt;'});
+}
+
+function findByParam(arr, name, value) {
+	return arr.filter(function(obj){
+		return obj[name] === value;
+	});
+}
+
+function __extend(obj){
+	var	args	= arguments,
+		l	= args.length,
+		i, n;
+	for (i=1; i<l; i++){
+		for (n in args[i]){
+			if (args[i].hasOwnProperty(n)){
+				obj[n] = args[i][n];
+			}
+		}
+	}
+	return obj;
+}
+
+var	paramon		= require('paramon');
+var	fs		= require('fs');
+var	Builder		= require('script-builder');
+
+function ls(path, r){
+	path	= path instanceof Array ? _path.apply(null, path) : path;
+	path	= fs.readdirSync(path);
+	if (r){
+		for (var i=0; i<path.length; i++){
+			if (!r.exec(path[i])){
+				path.splice(i--, 1);
+			}
+		}
+	}
+	return path;
+}
+
+function read(path, encoding){
+	path		= path instanceof Array ? _path.apply(null, path) : path;
+	encoding	= encoding || 'UTF-8';
+	return fs.readFileSync(path, encoding);
+}
+
+function save(path, data, encoding){
+	path		= path instanceof Array ? _path.apply(null, path) : path;
+	encoding	= encoding || 'UTF-8';
+	return fs.writeFileSync(path, data, encoding);
+}
+
+var __define = (function(){
+
+	if (Object.defineProperty){
+		return Object.defineProperty;
+	} else if (Object.prototype.__defineGetter__){
+		return function(obj, prop, desc){
+			desc.get && obj.__defineGetter__(prop, desc.get);
+			desc.set && obj.__defineSetter__(prop, desc.set);
+		}
+	}
+
+}());
+
+function __defineConst(obj, prop, value, enumerable){
+	if (__define){
+		__define(obj, prop, {
+			get: function(){
+				return value;
+			},
+			enumerable: !!enumerable
+		});
+	} else {
+		// Cheap...
+		obj[prop] = value;
+	}
+}
+
+function logicalMods(obj, name, value){
+	if (arguments.length < 3){
+		value	= obj[name];
+	}
+	var	pos	= ['major', 'minor', 'patch'];
+	__define(obj, name, {
+		set: function(val){
+			var	op	= typeof val === 'string' ? val.split(' ') : val;
+			var	r	= typeof value === 'string' ? value.split('.') : value;
+			var	n	= [];
+			if (op && op instanceof Array){
+				op.slice(1).forEach(function(o){
+					o = pos.indexOf(o);
+					o !== -1 && n.push(o);
+				});
+				!n.length && n.push(0);
+				n.forEach(function(n){
+					switch(op[0]){
+					case 'increment':
+						typeof r === 'number' ? r++ : r[n]++;
+						val = r instanceof Array ? r.join('.') : r;
+						break;
+					case 'decrement':
+						typeof r === 'number' ? r-- : r[n]--;
+						val = r instanceof Array ? r.join('.') : r;
+						break;
+					}
+				});
+			}
+			value = val;
+		},
+		get: function(){
+			return value;
+		},
+	});
+}
+
+var ArrayStuff = (function f(){
+var a	= Array.prototype;
+a.copy	= function(){return this.slice();};
+a.smap	= function(s, r){
+	return this.map(function(t){
+		var x = r ? r.exec(t) : [t];
+		return s.replace(/\$([0-9]+)/g, function(q,n){
+			return x[n];
+		});
+	});
+};
+a.table	= function(tabwidth){
+	tabwidth	= isNaN(+tabwidth) ? 8 : +tabwidth;
+	var	w	= [];
+	this.forEach(function(r){
+		r.forEach(function(c, i){
+			w[i] = Math.max(Math.ceil(c.length / tabwidth), w[i] || 0);
+		});
+	});
+	return this.map(function(r){
+		var	l	= r.length - 1,
+			s	= '',
+			i;
+		for (i=0; i<l; i++){
+			s += r[i] + Array(1 + w[i] - Math.floor(r[i].length / tabwidth)).join('\t');
+		}
+		return s + r[i];
+	}).join('\n');
+};
+return f;
+}());
+
+Builder.context(ArrayStuff);
+
+function builderContext(s){
+	s		= s || {};
+
+	Builder.Comment.prototype.toString = function(){
+		return this.assignName || this.name || Object.prototype.toString.call(this);
+	};
+
+	var	builder	= Builder.Builder(s);
+	var cp	= Builder.CommentParser();
+
+	function group(name){
+		arguments.length > 1 && group.apply(this, [].slice.call(arguments, 1));
+		var g	= builder.variables[name + 's'] = [];
+		var sg	= builder.variables['sub' + name + 's'] = [];
+		builder.instructions.push({
+			name:	name,
+			exec:	function(args){
+				args = args.split(/\s+/g);
+				args[1] = args[1] || args[0];
+				builder.variables[name + 's'].push({name: args[0], assignName: args[1]});
+			}
+		}, {
+			name:	'sub' + name,
+			exec:	function(args){
+				args = args.split(/\s+/g);
+				args[2] = args[2] || args[0] + args[1];
+				builder.variables['sub' + name + 's'].push({subOf: args[0], name: args[1], assignName: args[2], toString: Builder.Comment.prototype.toString});
+			}
+		});
+		cp.commands.push({
+			name:	name,
+			exec:	function(args){
+				args = args ? args.split(/\s+/g) : [];
+				this.assignName = args[0];
+				!this.assignName && this.onfinish(function(){
+					this.assignName = this.name;
+				});
+				this[name] = true;
+				builder.variables[name + 's'].push(this);
+			}
+		}, {
+			name:	'sub' + name,
+			exec:	function(args){
+				args = args ? args.split(/\s+/g) : [];
+				this.subOf = args[0];
+				this.assignName = args[1];
+				!this.name && !this.assignName && this.onfinish(function(){
+					this.assignName = args[0] + this.name;
+				});
+				this[name] = true;
+				this['sub' + name] = true;
+				builder.variables['sub' + name + 's'].push(this);
+			}
+		});
+	}
+
+	group('generator', 'effect', 'control', 'processor');
+
+	cp.commands.push({
+		name: 'param',
+		exec: function(args){
+			if (!args) return;
+			var	params	= this.params = this.params || [],
+				p	= {},
+				s, x;
+			while (s = /^([^\s]+)\s*/.exec(args)){
+				args	= args.substr(s[0].length);
+				s	= s[1];
+
+				x	= /^\{(.+)\}$/.exec(s);
+				if (x) {
+					p.type = x[1];
+					continue;
+				}
+
+				x	= /^(.+):(.*)$/.exec(s);
+				if (x) {
+					p[x[1]] = x[2] || true;
+					continue;
+				}
+
+				p.name		= s;
+				p.description	= args;
+				args		= '';
+				break;
+			}
+			params.push(p);
+		}
+	}, {
+		name: 'arg',
+		exec: function(args){
+			if (!args) return;
+			var	arglist	= this.arglist = this.arglist || [],
+				p	= {},
+				s, x;
+			while (s = /^([^\s]+)\s*/.exec(args)){
+				args	= args.substr(s[0].length);
+				s	= s[1];
+
+				x	= /^\{(.+)\}$/.exec(s);
+				if (x) {
+					p.type = x[1];
+					continue;
+				}
+
+				x	= /^(.+):(.*)$/.exec(s);
+				if (x) {
+					p[x[1]] = x[2] || true;
+					continue;
+				}
+
+				while (/^[^\w]/.exec(s)) {
+					switch(s[0]) {
+					case '!':
+						p.optional = true; break;
+					case '=':
+						p.assignsToClass = true; break;
+					}
+					s = s.substr(1);
+				}
+				p.name		= s;
+				p.description	= args;
+				args		= '';
+				break;
+			}
+			arglist.push(p);
+		}
+	}, {
+		name: 'return',
+		exec: function(args){
+			if (!args) return;
+			var	p	= {},
+				s, x, desc;
+			while (s = /^([^\s]+)\s*/.exec(args)){
+				desc	= args;
+				args	= args.substr(s[0].length);
+				s	= s[1];
+
+				x	= /^\{(.+)\}$/.exec(s);
+				if (x) {
+					p.type = x[1];
+					continue;
+				}
+
+				p.description	= desc;
+				args		= '';
+				break;
+			}
+			this.returns = p;
+		}
+	}, {
+		name: 'method',
+		exec: function(args){
+			args = args ? args.split(/\s+/g) : [];
+			this.method = true;
+			if (args[0]) {
+				this.methodOf = args[0];
+			}
+		}
+	}, {
+		name: 'static',
+		exec: function(args){
+			args = args ? args.split(/\s+/g) : [];
+			this.static = true;
+			this.method = true;
+			if (args[0]) {
+				this.methodOf = args[0];
+			}
+		}
+	}, {
+		name: 'class',
+		exec: function(args){
+			this.class = true;
+		}
+	});
+
+	builder.group = group;
+
+	builder.addPostProcessor(cp);
+	builder.commentParser = cp;
+
+	return builder;
+}
+
+
+if (process.argv.length < 3){
+	throw "Try build -h for help.";
+}
+
+var	args	= paramon.readFormat(process.argv, {
+	name:	'build',
+	usage:	'command [options]',
+	params:	[
+		{
+			name:	'debug',
+			args:	['--debug', '-d'],
+			desc:	'Run in debug mode (more verbose error messages).',
+			maxParams: 0,
+		},
+		{
+			name:	'update',
+			args:	['update', '-u'],
+			desc:	'Update target (wrappers).',
+			minParams: 1,
+			maxParams: -1,
+		}
+	],
+});
+
+!args.debug && process.on('uncaughtException', function(e){
+	print(e.toString());
+	process.exit(1);
+});
+
+args['$!stray'].forEach(function(e){
+	print('Unknown build command "' + e + '".');
+	process.exit();
+});
+
+var updatables = {
+	'docs': function(){
+		var builder = builderContext();
+		builder.run(read('sink.js'), 'sink.js');
+
+		builder.commentParser.comments.forEach(function(comment){
+			// This is probably unnecessary payload.
+			delete comment.body;
+		});
+
+		var comments = builder.commentParser.comments.filter(function (func) {
+			return func.assignName || func.class;
+		});
+
+		builder.commentParser.comments.forEach(function(func){
+			if (!func.method) return;
+			var parent = func.methodOf && findByParam(comments, 'name', func.methodOf)[0];
+			if (parent) {
+				parent.methods = parent.methods || [];
+				parent.methods.push(func);
+//			} else {
+//				methods.push(func);
+			}
+		});
+
+		var docs = '# sink.js\n\n';
+
+		comments.forEach(function (func) {
+			docs += '## ' + (func.static ? func.methodOf + '.' : '') + (func.assignName || func.name) + '\n\n';
+			docs += func.text + '\n\n';
+
+			if (func.arglist) {
+				docs += '### Arguments\n\n';
+				func.arglist.forEach(function(arg){
+					var info = arg.assignsToClass ? findByParam(func.params, 'name', arg.name)[0] || arg : arg;
+					docs += ' * ';
+					if (arg.optional) docs += '(Optional) ';
+					if (info.type) docs += '(' + fh(info.type) + ') ';
+					docs += info.name;
+					docs += ': ' + info.description;
+					docs += '\n';
+				});
+				docs += '\n';
+			}
+
+			if (func.methods) {
+				docs += '### Methods\n\n';
+				func.methods.forEach(function(method){
+					docs += '#### ';
+					if (method.static) {
+						docs += '(Static) ';
+					}
+					docs += method.name + '(';
+					if (method.arglist) {
+						docs += method.arglist.map(function(a){ return a.name }).join(', ');
+					}
+					docs += ')\n\n' + method.text + '\n\n';
+					if (method.arglist) {
+						docs += '##### Arguments\n\n';
+						method.arglist.forEach(function(arg){
+							var info = arg.assignsToClass ? findByParam(func.params, 'name', arg.name)[0] || arg : arg;
+							docs += ' * ';
+							if (arg.optional) docs += '(Optional) ';
+							if (info.type) docs += '(' + fh(info.type) + ') ';
+							docs += info.name;
+							docs += ': ' + info.description;
+							docs += '\n';
+						});
+						docs += '\n';
+					}
+
+					if (method.returns) {
+						docs += '##### Returns\n\n';
+						if (method.returns.type) docs += '(' + fh(method.returns.type) + ') ';
+						docs += method.returns.description;
+						docs += '\n\n';
+					}
+				});
+			}
+		});
+
+		save('DOCS.md', docs);
+		print('Documentation updated.');
+	},
+};
+
+if (args.update) {
+	args.update.forEach(function(e){
+		e = e.toLowerCase();
+		var k;
+		if (e === 'all') {
+			for (k in updatables){
+				if (updatables.hasOwnProperty(k)){
+					updatables[k]();
+				}
+			}
+		} else if (e in updatables) {
+			updatables[e]();
+		} else {
+			throw 'Unknown update target "' + e + '".';
+		}
+	});
+	process.exit();
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/package.json
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/package.json	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/package.json	(revision 28388)
@@ -0,0 +1,27 @@
+{
+  "name": "sink.js",
+  "version": "0.0.1",
+  "description": "A callback based raw audio API.",
+  "main": "sink.js",
+  "directories": {
+    "test": "tests"
+  },
+  "scripts": {
+    "preinstall": "make sink.js",
+    "test": "node tests/node-test.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git@github.com:jussi-kalliokoski/sink.js"
+  },
+  "keywords": [
+    "audio",
+    "sink",
+    "raw"
+  ],
+  "dependencies": {
+    "cubeb": "0.1.x"
+  },
+  "author": "Jussi Kalliokoski",
+  "license": "MIT"
+}
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/sink-light.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/sink-light.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/sink-light.js	(revision 28388)
@@ -0,0 +1,749 @@
+var Sink = this.Sink = function (global) {
+
+/**
+ * Creates a Sink according to specified parameters, if possible.
+ *
+ * @class
+ *
+ * @arg =!readFn
+ * @arg =!channelCount
+ * @arg =!bufferSize
+ * @arg =!sampleRate
+ *
+ * @param {Function} readFn A callback to handle the buffer fills.
+ * @param {Number} channelCount Channel count.
+ * @param {Number} bufferSize (Optional) Specifies a pre-buffer size to control the amount of latency.
+ * @param {Number} sampleRate Sample rate (ms).
+ * @param {Number} default=0 writePosition Write position of the sink, as in how many samples have been written per channel.
+ * @param {String} default=async writeMode The default mode of writing to the sink.
+ * @param {String} default=interleaved channelMode The mode in which the sink asks the sample buffers to be channeled in.
+ * @param {Number} default=0 previousHit The previous time of a callback.
+ * @param {Buffer} default=null ringBuffer The ring buffer array of the sink. If null, ring buffering will not be applied.
+ * @param {Number} default=0 ringOffset The current position of the ring buffer.
+*/
+function Sink (readFn, channelCount, bufferSize, sampleRate) {
+	var	sinks	= Sink.sinks.list,
+		i;
+	for (i=0; i<sinks.length; i++) {
+		if (sinks[i].enabled) {
+			try {
+				return new sinks[i](readFn, channelCount, bufferSize, sampleRate);
+			} catch(e1){}
+		}
+	}
+
+	throw Sink.Error(0x02);
+}
+
+function SinkClass () {
+}
+
+Sink.SinkClass = SinkClass;
+
+SinkClass.prototype = Sink.prototype = {
+	sampleRate: 44100,
+	channelCount: 2,
+	bufferSize: 4096,
+
+	writePosition: 0,
+	previousHit: 0,
+	ringOffset: 0,
+
+	channelMode: 'interleaved',
+	isReady: false,
+
+/**
+ * Does the initialization of the sink.
+ * @method Sink
+*/
+	start: function (readFn, channelCount, bufferSize, sampleRate) {
+		this.channelCount	= isNaN(channelCount) || channelCount === null ? this.channelCount: channelCount;
+		this.bufferSize		= isNaN(bufferSize) || bufferSize === null ? this.bufferSize : bufferSize;
+		this.sampleRate		= isNaN(sampleRate) || sampleRate === null ? this.sampleRate : sampleRate;
+		this.readFn		= readFn;
+		this.activeRecordings	= [];
+		this.previousHit	= +new Date();
+		Sink.EventEmitter.call(this);
+		Sink.emit('init', [this].concat([].slice.call(arguments)));
+	},
+/**
+ * The method which will handle all the different types of processing applied on a callback.
+ * @method Sink
+*/
+	process: function (soundData, channelCount) {
+		this.emit('preprocess', arguments);
+
+		if (this.ringBuffer) {
+			(this.channelMode === 'interleaved' ? this.ringSpin : this.ringSpinInterleaved).apply(this, arguments);
+		}
+
+		if (this.channelMode === 'interleaved') {
+			this.emit('audioprocess', arguments);
+
+			if (this.readFn) {
+				this.readFn.apply(this, arguments);
+			}
+		} else {
+			var	soundDataSplit	= Sink.deinterleave(soundData, this.channelCount),
+				args		= [soundDataSplit].concat([].slice.call(arguments, 1));
+			this.emit('audioprocess', args);
+
+			if (this.readFn) {
+				this.readFn.apply(this, args);
+			}
+
+			Sink.interleave(soundDataSplit, this.channelCount, soundData);
+		}
+		this.emit('postprocess', arguments);
+		this.previousHit = +new Date();
+		this.writePosition += soundData.length / channelCount;
+	},
+/**
+ * Get the current output position, defaults to writePosition - bufferSize.
+ *
+ * @method Sink
+ *
+ * @return {Number} The position of the write head, in samples, per channel.
+*/
+	getPlaybackTime: function () {
+		return this.writePosition - this.bufferSize;
+	},
+/**
+ * Internal method to send the ready signal if not ready yet.
+ * @method Sink
+*/
+	ready: function () {
+		if (this.isReady) return;
+
+		this.isReady = true;
+		this.emit('ready', []);
+	}
+};
+
+/**
+ * The container for all the available sinks. Also a decorator function for creating a new Sink class and binding it.
+ *
+ * @method Sink
+ * @static
+ *
+ * @arg {String} type The name / type of the Sink.
+ * @arg {Function} constructor The constructor function for the Sink.
+ * @arg {Object} prototype The prototype of the Sink. (optional)
+ * @arg {Boolean} disabled Whether the Sink should be disabled at first.
+*/
+
+function sinks (type, constructor, prototype, disabled, priority) {
+	prototype = prototype || constructor.prototype;
+	constructor.prototype = new Sink.SinkClass();
+	constructor.prototype.type = type;
+	constructor.enabled = !disabled;
+
+	var k;
+	for (k in prototype) {
+		if (prototype.hasOwnProperty(k)) {
+			constructor.prototype[k] = prototype[k];
+		}
+	}
+
+	sinks[type] = constructor;
+	sinks.list[priority ? 'unshift' : 'push'](constructor);
+}
+
+Sink.sinks = Sink.devices = sinks;
+Sink.sinks.list = [];
+
+Sink.singleton = function () {
+	var sink = Sink.apply(null, arguments);
+
+	Sink.singleton = function () {
+		return sink;
+	};
+
+	return sink;
+};
+
+global.Sink = Sink;
+
+return Sink;
+
+}(function (){ return this; }());
+void function (Sink) {
+
+/**
+ * A light event emitter.
+ *
+ * @class
+ * @static Sink
+*/
+function EventEmitter () {
+	var k;
+	for (k in EventEmitter.prototype) {
+		if (EventEmitter.prototype.hasOwnProperty(k)) {
+			this[k] = EventEmitter.prototype[k];
+		}
+	}
+	this._listeners = {};
+}
+
+EventEmitter.prototype = {
+	_listeners: null,
+/**
+ * Emits an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event to emit.
+ * @arg {Array} args The arguments to pass to the event handlers.
+*/
+	emit: function (name, args) {
+		if (this._listeners[name]) {
+			for (var i=0; i<this._listeners[name].length; i++) {
+				this._listeners[name][i].apply(this, args);
+			}
+		}
+		return this;
+	},
+/**
+ * Adds an event listener to an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event.
+ * @arg {Function} listener The event listener to attach to the event.
+*/
+	on: function (name, listener) {
+		this._listeners[name] = this._listeners[name] || [];
+		this._listeners[name].push(listener);
+		return this;
+	},
+/**
+ * Adds an event listener to an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event.
+ * @arg {Function} !listener The event listener to remove from the event. If not specified, will delete all.
+*/
+	off: function (name, listener) {
+		if (this._listeners[name]) {
+			if (!listener) {
+				delete this._listeners[name];
+				return this;
+			}
+
+			for (var i=0; i<this._listeners[name].length; i++) {
+				if (this._listeners[name][i] === listener) {
+					this._listeners[name].splice(i--, 1);
+				}
+			}
+
+			if (!this._listeners[name].length) {
+				delete this._listeners[name];
+			}
+		}
+		return this;
+	}
+};
+
+Sink.EventEmitter = EventEmitter;
+
+EventEmitter.call(Sink);
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * Creates a timer with consistent (ie. not clamped) intervals even in background tabs.
+ * Uses inline workers to achieve this. If not available, will revert to regular timers.
+ *
+ * @static Sink
+ * @name doInterval
+ *
+ * @arg {Function} callback The callback to trigger on timer hit.
+ * @arg {Number} timeout The interval between timer hits.
+ *
+ * @return {Function} A function to cancel the timer.
+*/
+
+Sink.doInterval = function (callback, timeout) {
+	var timer, kill;
+
+	function create (noWorker) {
+		if (Sink.inlineWorker.working && !noWorker) {
+			timer = Sink.inlineWorker('setInterval(function (){ postMessage("tic"); }, ' + timeout + ');');
+			timer.onmessage = function (){
+				callback();
+			};
+			kill = function () {
+				timer.terminate();
+			};
+		} else {
+			timer = setInterval(callback, timeout);
+			kill = function (){
+				clearInterval(timer);
+			};
+		}
+	}
+
+	if (Sink.inlineWorker.ready) {
+		create();
+	} else {
+		Sink.inlineWorker.on('ready', function () {
+			create();
+		});
+	}
+
+	return function () {
+		if (!kill) {
+			if (!Sink.inlineWorker.ready) {
+				Sink.inlineWorker.on('ready', function () {
+					if (kill) kill();
+				});
+			}
+		} else {
+			kill();
+		}
+	};
+};
+
+}(this.Sink);
+void function (Sink) {
+
+var _Blob, _BlobBuilder, _URL, _btoa;
+
+void function (prefixes, urlPrefixes) {
+	function find (name, prefixes) {
+		var b, a = prefixes.slice();
+
+		for (b=a.shift(); typeof b !== 'undefined'; b=a.shift()) {
+			b = Function('return typeof ' + b + name + 
+				'=== "undefined" ? undefined : ' +
+				b + name)();
+
+			if (b) return b;
+		}
+	}
+
+	_Blob = find('Blob', prefixes);
+	_BlobBuilder = find('BlobBuilder', prefixes);
+	_URL = find('URL', urlPrefixes);
+	_btoa = find('btoa', ['']);
+}([
+	'',
+	'Moz',
+	'WebKit',
+	'MS'
+], [
+	'',
+	'webkit'
+]);
+
+var createBlob = _Blob && _URL && function (content, type) {
+	return _URL.createObjectURL(new _Blob([content], { type: type }));
+};
+
+var createBlobBuilder = _BlobBuilder && _URL && function (content, type) {
+	var bb = new _BlobBuilder();
+	bb.append(content);
+
+	return _URL.createObjectURL(bb.getBlob(type));
+};
+
+var createData = _btoa && function (content, type) {
+	return 'data:' + type + ';base64,' + _btoa(content);
+};
+
+var createDynURL =
+	createBlob ||
+	createBlobBuilder ||
+	createData;
+
+if (!createDynURL) return;
+
+if (createBlob) createDynURL.createBlob = createBlob;
+if (createBlobBuilder) createDynURL.createBlobBuilder = createBlobBuilder;
+if (createData) createDynURL.createData = createData;
+
+if (_Blob) createDynURL.Blob = _Blob;
+if (_BlobBuilder) createDynURL.BlobBuilder = _BlobBuilder;
+if (_URL) createDynURL.URL = _URL;
+
+Sink.createDynURL = createDynURL;
+
+Sink.revokeDynURL = function (url) {
+	if (typeof url === 'string' && url.indexOf('data:') === 0) {
+		return false;
+	} else {
+		return _URL.revokeObjectURL(url);
+	}
+};
+
+}(this.Sink);
+void function (Sink) {
+
+/*
+ * A Sink-specific error class.
+ *
+ * @class
+ * @static Sink
+ * @name Error
+ *
+ * @arg =code
+ *
+ * @param {Number} code The error code.
+ * @param {String} message A brief description of the error.
+ * @param {String} explanation A more verbose explanation of why the error occured and how to fix.
+*/
+
+function SinkError(code) {
+	if (!SinkError.hasOwnProperty(code)) throw SinkError(1);
+	if (!(this instanceof SinkError)) return new SinkError(code);
+
+	var k;
+	for (k in SinkError[code]) {
+		if (SinkError[code].hasOwnProperty(k)) {
+			this[k] = SinkError[code][k];
+		}
+	}
+
+	this.code = code;
+}
+
+SinkError.prototype = new Error();
+
+SinkError.prototype.toString = function () {
+	return 'SinkError 0x' + this.code.toString(16) + ': ' + this.message;
+};
+
+SinkError[0x01] = {
+	message: 'No such error code.',
+	explanation: 'The error code does not exist.'
+};
+SinkError[0x02] = {
+	message: 'No audio sink available.',
+	explanation: 'The audio device may be busy, or no supported output API is available for this browser.'
+};
+
+SinkError[0x10] = {
+	message: 'Buffer underflow.',
+	explanation: 'Trying to recover...'
+};
+SinkError[0x11] = {
+	message: 'Critical recovery fail.',
+	explanation: 'The buffer underflow has reached a critical point, trying to recover, but will probably fail anyway.'
+};
+SinkError[0x12] = {
+	message: 'Buffer size too large.',
+	explanation: 'Unable to allocate the buffer due to excessive length, please try a smaller buffer. Buffer size should probably be smaller than the sample rate.'
+};
+
+Sink.Error = SinkError;
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * Creates an inline worker using a data/blob URL, if possible.
+ *
+ * @static Sink
+ *
+ * @arg {String} script
+ *
+ * @return {Worker} A web worker, or null if impossible to create.
+*/
+
+var define = Object.defineProperty ? function (obj, name, value) {
+	Object.defineProperty(obj, name, {
+		value: value,
+		configurable: true,
+		writable: true
+	});
+} : function (obj, name, value) {
+	obj[name] = value;
+};
+
+function terminate () {
+	define(this, 'terminate', this._terminate);
+
+	Sink.revokeDynURL(this._url);
+
+	delete this._url;
+	delete this._terminate;
+	return this.terminate();
+}
+
+function inlineWorker (script) {
+	function wrap (type, content, typeName) {
+		try {
+			var url = type(content, 'text/javascript');
+			var worker = new Worker(url);
+
+			define(worker, '_url', url);
+			define(worker, '_terminate', worker.terminate);
+			define(worker, 'terminate', terminate);
+
+			if (inlineWorker.type) return worker;
+
+			inlineWorker.type = typeName;
+			inlineWorker.createURL = type;
+
+			return worker;
+		} catch (e) {
+			return null;
+		}
+	}
+
+	var createDynURL = Sink.createDynURL;
+
+	if (!createDynURL) return null;
+
+	var worker;
+
+	if (inlineWorker.createURL) {
+		return wrap(inlineWorker.createURL, script, inlineWorker.type);
+	}
+
+	worker = wrap(createDynURL.createBlob, script, 'blob');
+	if (worker) return worker;
+
+	worker = wrap(createDynURL.createBlobBuilder, script, 'blobbuilder');
+	if (worker) return worker;
+
+	worker = wrap(createDynURL.createData, script, 'data');
+
+	return worker;
+}
+
+Sink.EventEmitter.call(inlineWorker);
+
+inlineWorker.test = function () {
+	inlineWorker.ready = inlineWorker.working = false;
+	inlineWorker.type = '';
+	inlineWorker.createURL = null;
+
+	var worker = inlineWorker('this.onmessage=function(e){postMessage(e.data)}');
+	var data = 'inlineWorker';
+
+	function ready (success) {
+		if (inlineWorker.ready) return;
+
+		inlineWorker.ready = true;
+		inlineWorker.working = success;
+		inlineWorker.emit('ready', [success]);
+		inlineWorker.off('ready');
+
+		if (success && worker) {
+			worker.terminate();
+		}
+
+		worker = null;
+	}
+
+	if (!worker) {
+		setTimeout(function () {
+			ready(false);
+		}, 0);
+	} else {
+		worker.onmessage = function (e) {
+			ready(e.data === data);
+		};
+
+		worker.postMessage(data);
+
+		setTimeout(function () {
+			ready(false);
+		}, 1000);
+	}
+};
+
+Sink.inlineWorker = inlineWorker;
+
+inlineWorker.test();
+
+}(this.Sink);
+ (function (sinks, fixChrome82795) {
+
+var AudioContext = typeof window === 'undefined' ? null : window.webkitAudioContext || window.AudioContext;
+
+/**
+ * A sink class for the Web Audio API
+*/
+
+sinks('webaudio', function (readFn, channelCount, bufferSize, sampleRate) {
+	var	self		= this,
+		context		= sinks.webaudio.getContext(),
+		node		= null,
+		soundData	= null,
+		zeroBuffer	= null;
+	self.start.apply(self, arguments);
+	node = context.createJavaScriptNode(self.bufferSize, self.channelCount, self.channelCount);
+
+	function bufferFill(e) {
+		var	outputBuffer	= e.outputBuffer,
+			channelCount	= outputBuffer.numberOfChannels,
+			i, n, l		= outputBuffer.length,
+			size		= outputBuffer.size,
+			channels	= new Array(channelCount),
+			tail;
+
+		self.ready();
+		
+		soundData	= soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
+		zeroBuffer	= zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
+		soundData.set(zeroBuffer);
+
+		for (i=0; i<channelCount; i++) {
+			channels[i] = outputBuffer.getChannelData(i);
+		}
+
+		self.process(soundData, self.channelCount);
+
+		for (i=0; i<l; i++) {
+			for (n=0; n < channelCount; n++) {
+				channels[n][i] = soundData[i * self.channelCount + n];
+			}
+		}
+	}
+
+	self.sampleRate = context.sampleRate;
+
+	node.onaudioprocess = bufferFill;
+	node.connect(context.destination);
+
+	self._context		= context;
+	self._node		= node;
+	self._callback		= bufferFill;
+	/* Keep references in order to avoid garbage collection removing the listeners, working around http://code.google.com/p/chromium/issues/detail?id=82795 */
+	// Thanks to @baffo32
+	fixChrome82795.push(node);
+}, {
+	kill: function () {
+		this._node.disconnect(0);
+
+		for (var i=0; i<fixChrome82795.length; i++) {
+			if (fixChrome82795[i] === this._node) {
+				fixChrome82795.splice(i--, 1);
+			}
+		}
+
+		this._node = this._context = null;
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._context.currentTime * this.sampleRate;
+	}
+}, false, true);
+
+sinks.webkit = sinks.webaudio;
+
+sinks.webaudio.fix82795 = fixChrome82795;
+
+sinks.webaudio.getContext = function () {
+	// For now, we have to accept that the AudioContext is at 48000Hz, or whatever it decides.
+	var context = new AudioContext(/*sampleRate*/);
+
+	sinks.webaudio.getContext = function () {
+		return context;
+	};
+
+	return context;
+};
+
+}(this.Sink.sinks, []));
+void function (Sink) {
+
+/**
+ * A Sink class for the Mozilla Audio Data API.
+*/
+
+Sink.sinks('audiodata', function () {
+	var	self			= this,
+		currentWritePosition	= 0,
+		tail			= null,
+		audioDevice		= new Audio(),
+		written, currentPosition, available, soundData, prevPos,
+		timer; // Fix for https://bugzilla.mozilla.org/show_bug.cgi?id=630117
+	self.start.apply(self, arguments);
+	self.preBufferSize = isNaN(arguments[4]) || arguments[4] === null ? this.preBufferSize : arguments[4];
+
+	function bufferFill() {
+		if (tail) {
+			written = audioDevice.mozWriteAudio(tail);
+			currentWritePosition += written;
+			if (written < tail.length){
+				tail = tail.subarray(written);
+				return tail;
+			}
+			tail = null;
+		}
+
+		currentPosition = audioDevice.mozCurrentSampleOffset();
+		available = Number(currentPosition + (prevPos !== currentPosition ? self.bufferSize : self.preBufferSize) * self.channelCount - currentWritePosition);
+
+		if (currentPosition === prevPos) {
+			self.emit('error', [Sink.Error(0x10)]);
+		}
+
+		if (available > 0 || prevPos === currentPosition){
+			self.ready();
+
+			try {
+				soundData = new Float32Array(prevPos === currentPosition ? self.preBufferSize * self.channelCount :
+					self.forceBufferSize ? available < self.bufferSize * 2 ? self.bufferSize * 2 : available : available);
+			} catch(e) {
+				self.emit('error', [Sink.Error(0x12)]);
+				self.kill();
+				return;
+			}
+			self.process(soundData, self.channelCount);
+			written = self._audio.mozWriteAudio(soundData);
+			if (written < soundData.length){
+				tail = soundData.subarray(written);
+			}
+			currentWritePosition += written;
+		}
+		prevPos = currentPosition;
+	}
+
+	audioDevice.mozSetup(self.channelCount, self.sampleRate);
+
+	this._timers = [];
+
+	this._timers.push(Sink.doInterval(function () {
+		// Check for complete death of the output
+		if (+new Date() - self.previousHit > 2000) {
+			self._audio = audioDevice = new Audio();
+			audioDevice.mozSetup(self.channelCount, self.sampleRate);
+			currentWritePosition = 0;
+			self.emit('error', [Sink.Error(0x11)]);
+		}
+	}, 1000));
+
+	this._timers.push(Sink.doInterval(bufferFill, self.interval));
+
+	self._bufferFill	= bufferFill;
+	self._audio		= audioDevice;
+}, {
+	// These are somewhat safe values...
+	bufferSize: 24576,
+	preBufferSize: 24576,
+	forceBufferSize: false,
+	interval: 100,
+
+	kill: function () {
+		while (this._timers.length) {
+			this._timers.shift()();
+		}
+
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._audio.mozCurrentSampleOffset() / this.channelCount;
+	}
+}, false, true);
+
+Sink.sinks.moz = Sink.sinks.audiodata;
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/sink.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/sink.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/sink.js	(revision 28388)
@@ -0,0 +1,1719 @@
+var Sink = this.Sink = function (global) {
+
+/**
+ * Creates a Sink according to specified parameters, if possible.
+ *
+ * @class
+ *
+ * @arg =!readFn
+ * @arg =!channelCount
+ * @arg =!bufferSize
+ * @arg =!sampleRate
+ *
+ * @param {Function} readFn A callback to handle the buffer fills.
+ * @param {Number} channelCount Channel count.
+ * @param {Number} bufferSize (Optional) Specifies a pre-buffer size to control the amount of latency.
+ * @param {Number} sampleRate Sample rate (ms).
+ * @param {Number} default=0 writePosition Write position of the sink, as in how many samples have been written per channel.
+ * @param {String} default=async writeMode The default mode of writing to the sink.
+ * @param {String} default=interleaved channelMode The mode in which the sink asks the sample buffers to be channeled in.
+ * @param {Number} default=0 previousHit The previous time of a callback.
+ * @param {Buffer} default=null ringBuffer The ring buffer array of the sink. If null, ring buffering will not be applied.
+ * @param {Number} default=0 ringOffset The current position of the ring buffer.
+*/
+function Sink (readFn, channelCount, bufferSize, sampleRate) {
+	var	sinks	= Sink.sinks.list,
+		i;
+	for (i=0; i<sinks.length; i++) {
+		if (sinks[i].enabled) {
+			try {
+				return new sinks[i](readFn, channelCount, bufferSize, sampleRate);
+			} catch(e1){}
+		}
+	}
+
+	throw Sink.Error(0x02);
+}
+
+function SinkClass () {
+}
+
+Sink.SinkClass = SinkClass;
+
+SinkClass.prototype = Sink.prototype = {
+	sampleRate: 44100,
+	channelCount: 2,
+	bufferSize: 4096,
+
+	writePosition: 0,
+	previousHit: 0,
+	ringOffset: 0,
+
+	channelMode: 'interleaved',
+	isReady: false,
+
+/**
+ * Does the initialization of the sink.
+ * @method Sink
+*/
+	start: function (readFn, channelCount, bufferSize, sampleRate) {
+		this.channelCount	= isNaN(channelCount) || channelCount === null ? this.channelCount: channelCount;
+		this.bufferSize		= isNaN(bufferSize) || bufferSize === null ? this.bufferSize : bufferSize;
+		this.sampleRate		= isNaN(sampleRate) || sampleRate === null ? this.sampleRate : sampleRate;
+		this.readFn		= readFn;
+		this.activeRecordings	= [];
+		this.previousHit	= +new Date();
+		Sink.EventEmitter.call(this);
+		Sink.emit('init', [this].concat([].slice.call(arguments)));
+	},
+/**
+ * The method which will handle all the different types of processing applied on a callback.
+ * @method Sink
+*/
+	process: function (soundData, channelCount) {
+		this.emit('preprocess', arguments);
+
+		if (this.ringBuffer) {
+			(this.channelMode === 'interleaved' ? this.ringSpin : this.ringSpinInterleaved).apply(this, arguments);
+		}
+
+		if (this.channelMode === 'interleaved') {
+			this.emit('audioprocess', arguments);
+
+			if (this.readFn) {
+				this.readFn.apply(this, arguments);
+			}
+		} else {
+			var	soundDataSplit	= Sink.deinterleave(soundData, this.channelCount),
+				args		= [soundDataSplit].concat([].slice.call(arguments, 1));
+			this.emit('audioprocess', args);
+
+			if (this.readFn) {
+				this.readFn.apply(this, args);
+			}
+
+			Sink.interleave(soundDataSplit, this.channelCount, soundData);
+		}
+		this.emit('postprocess', arguments);
+		this.previousHit = +new Date();
+		this.writePosition += soundData.length / channelCount;
+	},
+/**
+ * Get the current output position, defaults to writePosition - bufferSize.
+ *
+ * @method Sink
+ *
+ * @return {Number} The position of the write head, in samples, per channel.
+*/
+	getPlaybackTime: function () {
+		return this.writePosition - this.bufferSize;
+	},
+/**
+ * Internal method to send the ready signal if not ready yet.
+ * @method Sink
+*/
+	ready: function () {
+		if (this.isReady) return;
+
+		this.isReady = true;
+		this.emit('ready', []);
+	}
+};
+
+/**
+ * The container for all the available sinks. Also a decorator function for creating a new Sink class and binding it.
+ *
+ * @method Sink
+ * @static
+ *
+ * @arg {String} type The name / type of the Sink.
+ * @arg {Function} constructor The constructor function for the Sink.
+ * @arg {Object} prototype The prototype of the Sink. (optional)
+ * @arg {Boolean} disabled Whether the Sink should be disabled at first.
+*/
+
+function sinks (type, constructor, prototype, disabled, priority) {
+	prototype = prototype || constructor.prototype;
+	constructor.prototype = new Sink.SinkClass();
+	constructor.prototype.type = type;
+	constructor.enabled = !disabled;
+
+	var k;
+	for (k in prototype) {
+		if (prototype.hasOwnProperty(k)) {
+			constructor.prototype[k] = prototype[k];
+		}
+	}
+
+	sinks[type] = constructor;
+	sinks.list[priority ? 'unshift' : 'push'](constructor);
+}
+
+Sink.sinks = Sink.devices = sinks;
+Sink.sinks.list = [];
+
+Sink.singleton = function () {
+	var sink = Sink.apply(null, arguments);
+
+	Sink.singleton = function () {
+		return sink;
+	};
+
+	return sink;
+};
+
+global.Sink = Sink;
+
+return Sink;
+
+}(function (){ return this; }());
+void function (Sink) {
+
+/**
+ * A light event emitter.
+ *
+ * @class
+ * @static Sink
+*/
+function EventEmitter () {
+	var k;
+	for (k in EventEmitter.prototype) {
+		if (EventEmitter.prototype.hasOwnProperty(k)) {
+			this[k] = EventEmitter.prototype[k];
+		}
+	}
+	this._listeners = {};
+}
+
+EventEmitter.prototype = {
+	_listeners: null,
+/**
+ * Emits an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event to emit.
+ * @arg {Array} args The arguments to pass to the event handlers.
+*/
+	emit: function (name, args) {
+		if (this._listeners[name]) {
+			for (var i=0; i<this._listeners[name].length; i++) {
+				this._listeners[name][i].apply(this, args);
+			}
+		}
+		return this;
+	},
+/**
+ * Adds an event listener to an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event.
+ * @arg {Function} listener The event listener to attach to the event.
+*/
+	on: function (name, listener) {
+		this._listeners[name] = this._listeners[name] || [];
+		this._listeners[name].push(listener);
+		return this;
+	},
+/**
+ * Adds an event listener to an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event.
+ * @arg {Function} !listener The event listener to remove from the event. If not specified, will delete all.
+*/
+	off: function (name, listener) {
+		if (this._listeners[name]) {
+			if (!listener) {
+				delete this._listeners[name];
+				return this;
+			}
+
+			for (var i=0; i<this._listeners[name].length; i++) {
+				if (this._listeners[name][i] === listener) {
+					this._listeners[name].splice(i--, 1);
+				}
+			}
+
+			if (!this._listeners[name].length) {
+				delete this._listeners[name];
+			}
+		}
+		return this;
+	}
+};
+
+Sink.EventEmitter = EventEmitter;
+
+EventEmitter.call(Sink);
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * Creates a timer with consistent (ie. not clamped) intervals even in background tabs.
+ * Uses inline workers to achieve this. If not available, will revert to regular timers.
+ *
+ * @static Sink
+ * @name doInterval
+ *
+ * @arg {Function} callback The callback to trigger on timer hit.
+ * @arg {Number} timeout The interval between timer hits.
+ *
+ * @return {Function} A function to cancel the timer.
+*/
+
+Sink.doInterval = function (callback, timeout) {
+	var timer, kill;
+
+	function create (noWorker) {
+		if (Sink.inlineWorker.working && !noWorker) {
+			timer = Sink.inlineWorker('setInterval(function (){ postMessage("tic"); }, ' + timeout + ');');
+			timer.onmessage = function (){
+				callback();
+			};
+			kill = function () {
+				timer.terminate();
+			};
+		} else {
+			timer = setInterval(callback, timeout);
+			kill = function (){
+				clearInterval(timer);
+			};
+		}
+	}
+
+	if (Sink.inlineWorker.ready) {
+		create();
+	} else {
+		Sink.inlineWorker.on('ready', function () {
+			create();
+		});
+	}
+
+	return function () {
+		if (!kill) {
+			if (!Sink.inlineWorker.ready) {
+				Sink.inlineWorker.on('ready', function () {
+					if (kill) kill();
+				});
+			}
+		} else {
+			kill();
+		}
+	};
+};
+
+}(this.Sink);
+void function (Sink) {
+
+var _Blob, _BlobBuilder, _URL, _btoa;
+
+void function (prefixes, urlPrefixes) {
+	function find (name, prefixes) {
+		var b, a = prefixes.slice();
+
+		for (b=a.shift(); typeof b !== 'undefined'; b=a.shift()) {
+			b = Function('return typeof ' + b + name + 
+				'=== "undefined" ? undefined : ' +
+				b + name)();
+
+			if (b) return b;
+		}
+	}
+
+	_Blob = find('Blob', prefixes);
+	_BlobBuilder = find('BlobBuilder', prefixes);
+	_URL = find('URL', urlPrefixes);
+	_btoa = find('btoa', ['']);
+}([
+	'',
+	'Moz',
+	'WebKit',
+	'MS'
+], [
+	'',
+	'webkit'
+]);
+
+var createBlob = _Blob && _URL && function (content, type) {
+	return _URL.createObjectURL(new _Blob([content], { type: type }));
+};
+
+var createBlobBuilder = _BlobBuilder && _URL && function (content, type) {
+	var bb = new _BlobBuilder();
+	bb.append(content);
+
+	return _URL.createObjectURL(bb.getBlob(type));
+};
+
+var createData = _btoa && function (content, type) {
+	return 'data:' + type + ';base64,' + _btoa(content);
+};
+
+var createDynURL =
+	createBlob ||
+	createBlobBuilder ||
+	createData;
+
+if (!createDynURL) return;
+
+if (createBlob) createDynURL.createBlob = createBlob;
+if (createBlobBuilder) createDynURL.createBlobBuilder = createBlobBuilder;
+if (createData) createDynURL.createData = createData;
+
+if (_Blob) createDynURL.Blob = _Blob;
+if (_BlobBuilder) createDynURL.BlobBuilder = _BlobBuilder;
+if (_URL) createDynURL.URL = _URL;
+
+Sink.createDynURL = createDynURL;
+
+Sink.revokeDynURL = function (url) {
+	if (typeof url === 'string' && url.indexOf('data:') === 0) {
+		return false;
+	} else {
+		return _URL.revokeObjectURL(url);
+	}
+};
+
+}(this.Sink);
+void function (Sink) {
+
+/*
+ * A Sink-specific error class.
+ *
+ * @class
+ * @static Sink
+ * @name Error
+ *
+ * @arg =code
+ *
+ * @param {Number} code The error code.
+ * @param {String} message A brief description of the error.
+ * @param {String} explanation A more verbose explanation of why the error occured and how to fix.
+*/
+
+function SinkError(code) {
+	if (!SinkError.hasOwnProperty(code)) throw SinkError(1);
+	if (!(this instanceof SinkError)) return new SinkError(code);
+
+	var k;
+	for (k in SinkError[code]) {
+		if (SinkError[code].hasOwnProperty(k)) {
+			this[k] = SinkError[code][k];
+		}
+	}
+
+	this.code = code;
+}
+
+SinkError.prototype = new Error();
+
+SinkError.prototype.toString = function () {
+	return 'SinkError 0x' + this.code.toString(16) + ': ' + this.message;
+};
+
+SinkError[0x01] = {
+	message: 'No such error code.',
+	explanation: 'The error code does not exist.'
+};
+SinkError[0x02] = {
+	message: 'No audio sink available.',
+	explanation: 'The audio device may be busy, or no supported output API is available for this browser.'
+};
+
+SinkError[0x10] = {
+	message: 'Buffer underflow.',
+	explanation: 'Trying to recover...'
+};
+SinkError[0x11] = {
+	message: 'Critical recovery fail.',
+	explanation: 'The buffer underflow has reached a critical point, trying to recover, but will probably fail anyway.'
+};
+SinkError[0x12] = {
+	message: 'Buffer size too large.',
+	explanation: 'Unable to allocate the buffer due to excessive length, please try a smaller buffer. Buffer size should probably be smaller than the sample rate.'
+};
+
+Sink.Error = SinkError;
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * Creates an inline worker using a data/blob URL, if possible.
+ *
+ * @static Sink
+ *
+ * @arg {String} script
+ *
+ * @return {Worker} A web worker, or null if impossible to create.
+*/
+
+var define = Object.defineProperty ? function (obj, name, value) {
+	Object.defineProperty(obj, name, {
+		value: value,
+		configurable: true,
+		writable: true
+	});
+} : function (obj, name, value) {
+	obj[name] = value;
+};
+
+function terminate () {
+	define(this, 'terminate', this._terminate);
+
+	Sink.revokeDynURL(this._url);
+
+	delete this._url;
+	delete this._terminate;
+	return this.terminate();
+}
+
+function inlineWorker (script) {
+	function wrap (type, content, typeName) {
+		try {
+			var url = type(content, 'text/javascript');
+			var worker = new Worker(url);
+
+			define(worker, '_url', url);
+			define(worker, '_terminate', worker.terminate);
+			define(worker, 'terminate', terminate);
+
+			if (inlineWorker.type) return worker;
+
+			inlineWorker.type = typeName;
+			inlineWorker.createURL = type;
+
+			return worker;
+		} catch (e) {
+			return null;
+		}
+	}
+
+	var createDynURL = Sink.createDynURL;
+
+	if (!createDynURL) return null;
+
+	var worker;
+
+	if (inlineWorker.createURL) {
+		return wrap(inlineWorker.createURL, script, inlineWorker.type);
+	}
+
+	worker = wrap(createDynURL.createBlob, script, 'blob');
+	if (worker) return worker;
+
+	worker = wrap(createDynURL.createBlobBuilder, script, 'blobbuilder');
+	if (worker) return worker;
+
+	worker = wrap(createDynURL.createData, script, 'data');
+
+	return worker;
+}
+
+Sink.EventEmitter.call(inlineWorker);
+
+inlineWorker.test = function () {
+	inlineWorker.ready = inlineWorker.working = false;
+	inlineWorker.type = '';
+	inlineWorker.createURL = null;
+
+	var worker = inlineWorker('this.onmessage=function(e){postMessage(e.data)}');
+	var data = 'inlineWorker';
+
+	function ready (success) {
+		if (inlineWorker.ready) return;
+
+		inlineWorker.ready = true;
+		inlineWorker.working = success;
+		inlineWorker.emit('ready', [success]);
+		inlineWorker.off('ready');
+
+		if (success && worker) {
+			worker.terminate();
+		}
+
+		worker = null;
+	}
+
+	if (!worker) {
+		setTimeout(function () {
+			ready(false);
+		}, 0);
+	} else {
+		worker.onmessage = function (e) {
+			ready(e.data === data);
+		};
+
+		worker.postMessage(data);
+
+		setTimeout(function () {
+			ready(false);
+		}, 1000);
+	}
+};
+
+Sink.inlineWorker = inlineWorker;
+
+inlineWorker.test();
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * A Sink class for the Mozilla Audio Data API.
+*/
+
+Sink.sinks('audiodata', function () {
+	var	self			= this,
+		currentWritePosition	= 0,
+		tail			= null,
+		audioDevice		= new Audio(),
+		written, currentPosition, available, soundData, prevPos,
+		timer; // Fix for https://bugzilla.mozilla.org/show_bug.cgi?id=630117
+	self.start.apply(self, arguments);
+	self.preBufferSize = isNaN(arguments[4]) || arguments[4] === null ? this.preBufferSize : arguments[4];
+
+	function bufferFill() {
+		if (tail) {
+			written = audioDevice.mozWriteAudio(tail);
+			currentWritePosition += written;
+			if (written < tail.length){
+				tail = tail.subarray(written);
+				return tail;
+			}
+			tail = null;
+		}
+
+		currentPosition = audioDevice.mozCurrentSampleOffset();
+		available = Number(currentPosition + (prevPos !== currentPosition ? self.bufferSize : self.preBufferSize) * self.channelCount - currentWritePosition);
+
+		if (currentPosition === prevPos) {
+			self.emit('error', [Sink.Error(0x10)]);
+		}
+
+		if (available > 0 || prevPos === currentPosition){
+			self.ready();
+
+			try {
+				soundData = new Float32Array(prevPos === currentPosition ? self.preBufferSize * self.channelCount :
+					self.forceBufferSize ? available < self.bufferSize * 2 ? self.bufferSize * 2 : available : available);
+			} catch(e) {
+				self.emit('error', [Sink.Error(0x12)]);
+				self.kill();
+				return;
+			}
+			self.process(soundData, self.channelCount);
+			written = self._audio.mozWriteAudio(soundData);
+			if (written < soundData.length){
+				tail = soundData.subarray(written);
+			}
+			currentWritePosition += written;
+		}
+		prevPos = currentPosition;
+	}
+
+	audioDevice.mozSetup(self.channelCount, self.sampleRate);
+
+	this._timers = [];
+
+	this._timers.push(Sink.doInterval(function () {
+		// Check for complete death of the output
+		if (+new Date() - self.previousHit > 2000) {
+			self._audio = audioDevice = new Audio();
+			audioDevice.mozSetup(self.channelCount, self.sampleRate);
+			currentWritePosition = 0;
+			self.emit('error', [Sink.Error(0x11)]);
+		}
+	}, 1000));
+
+	this._timers.push(Sink.doInterval(bufferFill, self.interval));
+
+	self._bufferFill	= bufferFill;
+	self._audio		= audioDevice;
+}, {
+	// These are somewhat safe values...
+	bufferSize: 24576,
+	preBufferSize: 24576,
+	forceBufferSize: false,
+	interval: 100,
+
+	kill: function () {
+		while (this._timers.length) {
+			this._timers.shift()();
+		}
+
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._audio.mozCurrentSampleOffset() / this.channelCount;
+	}
+}, false, true);
+
+Sink.sinks.moz = Sink.sinks.audiodata;
+
+}(this.Sink);
+void function (Sink) {
+
+var cubeb;
+
+try {
+	cubeb = require('cubeb');
+} catch (e) {
+	return;
+}
+
+var getContext = function () {
+	var ctx;
+
+	return function () {
+		ctx = new cubeb.Context(
+			"sink.js " + process.pid + ' ' + new Date()
+		);
+
+		getContext = function () { return ctx; };
+
+		return ctx;
+	};
+}();
+
+var streamCount = 0;
+
+Sink.sinks('cubeb', function () {
+	var self = this;
+
+	self.start.apply(self, arguments);
+
+	self._ctx = getContext();
+	self._stream = new cubeb.Stream(
+		self._ctx,
+		self._ctx.name + ' ' + streamCount++,
+		cubeb.SAMPLE_FLOAT32LE,
+		self.channelCount,
+		self.sampleRate,
+		self.bufferSize,
+		self._latency,
+		function (frameCount) {
+			var buffer = new Buffer(
+				4 * frameCount * self.channelCount);
+			var soundData = new Float32Array(buffer);
+
+			self.process(soundData, self.channelCount);
+
+			self._stream.write(buffer);
+			self._stream.release();
+		},
+		function (state) {}
+	);
+
+	self._stream.start();
+}, {
+	_ctx: null,
+	_stream: null,
+	_latency: 250,
+	bufferSize: 4096,
+
+	kill: function () {
+		this._stream.stop();
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._stream.position;
+	}
+});
+
+}(this.Sink);
+void function (Sink) {
+
+/**
+ * A dummy Sink. (No output)
+*/
+
+Sink.sinks('dummy', function () {
+	var	self = this;
+	self.start.apply(self, arguments);
+	
+	function bufferFill () {
+		var	soundData = new Float32Array(self.bufferSize * self.channelCount);
+		self.process(soundData, self.channelCount);
+	}
+
+	self._kill = Sink.doInterval(bufferFill, self.bufferSize / self.sampleRate * 1000);
+
+	self._callback		= bufferFill;
+}, {
+	kill: function () {
+		this._kill();
+		this.emit('kill');
+	}
+}, true);
+
+}(this.Sink);
+(function (Sink, sinks) {
+
+sinks = Sink.sinks;
+
+function newAudio (src) {
+	var audio = document.createElement('audio');
+	if (src) {
+		audio.src = src;
+	}
+	return audio;
+}
+
+/* TODO: Implement a <BGSOUND> hack for IE8. */
+
+/**
+ * A sink class for WAV data URLs
+ * Relies on pcmdata.js and utils to be present.
+ * Thanks to grantgalitz and others for the idea.
+*/
+sinks('wav', function () {
+	var	self			= this,
+		audio			= new sinks.wav.wavAudio(),
+		PCMData			= typeof PCMData === 'undefined' ? audioLib.PCMData : PCMData;
+	self.start.apply(self, arguments);
+	var	soundData		= new Float32Array(self.bufferSize * self.channelCount),
+		zeroData		= new Float32Array(self.bufferSize * self.channelCount);
+
+	if (!newAudio().canPlayType('audio/wav; codecs=1') || !btoa) throw 0;
+	
+	function bufferFill () {
+		if (self._audio.hasNextFrame) return;
+
+		self.ready();
+
+		Sink.memcpy(zeroData, 0, soundData, 0);
+		self.process(soundData, self.channelCount);
+
+		self._audio.setSource('data:audio/wav;base64,' + btoa(
+			audioLib.PCMData.encode({
+				data:		soundData,
+				sampleRate:	self.sampleRate,
+				channelCount:	self.channelCount,
+				bytesPerSample:	self.quality
+			})
+		));
+
+		if (!self._audio.currentFrame.src) self._audio.nextClip();
+	}
+	
+	self.kill		= Sink.doInterval(bufferFill, 40);
+	self._bufferFill	= bufferFill;
+	self._audio		= audio;
+}, {
+	quality: 1,
+	bufferSize: 22050,
+
+	getPlaybackTime: function () {
+		var audio = this._audio;
+		return (audio.currentFrame ? audio.currentFrame.currentTime * this.sampleRate : 0) + audio.samples;
+	}
+});
+
+function wavAudio () {
+	var self = this;
+
+	self.currentFrame	= newAudio();
+	self.nextFrame		= newAudio();
+
+	self._onended		= function () {
+		self.samples += self.bufferSize;
+		self.nextClip();
+	};
+}
+
+wavAudio.prototype = {
+	samples:	0,
+	nextFrame:	null,
+	currentFrame:	null,
+	_onended:	null,
+	hasNextFrame:	false,
+
+	nextClip: function () {
+		var	curFrame	= this.currentFrame;
+		this.currentFrame	= this.nextFrame;
+		this.nextFrame		= curFrame;
+		this.hasNextFrame	= false;
+		this.currentFrame.play();
+	},
+
+	setSource: function (src) {
+		this.nextFrame.src = src;
+		this.nextFrame.addEventListener('ended', this._onended, true);
+
+		this.hasNextFrame = true;
+	}
+};
+
+sinks.wav.wavAudio = wavAudio;
+
+}(this.Sink));
+ (function (sinks, fixChrome82795) {
+
+//     alert("type of window = " + typeof window);
+var AudioContext = typeof window === 'undefined' ? null : window.webkitAudioContext || window.AudioContext;
+
+/**
+ * A sink class for the Web Audio API
+*/
+
+sinks('webaudio', function (readFn, channelCount, bufferSize, sampleRate) {
+	var	self		= this,
+		context		= sinks.webaudio.getContext(),
+		node		= null,
+		soundData	= null,
+		zeroBuffer	= null;
+	self.start.apply(self, arguments);
+	node = context.createJavaScriptNode(self.bufferSize, self.channelCount, self.channelCount);
+
+	function bufferFill(e) {
+		var	outputBuffer	= e.outputBuffer,
+			channelCount	= outputBuffer.numberOfChannels,
+			i, n, l		= outputBuffer.length,
+			size		= outputBuffer.size,
+			channels	= new Array(channelCount),
+			tail;
+
+		self.ready();
+		
+		soundData	= soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
+		zeroBuffer	= zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
+		soundData.set(zeroBuffer);
+
+		for (i=0; i<channelCount; i++) {
+			channels[i] = outputBuffer.getChannelData(i);
+		}
+
+		self.process(soundData, self.channelCount);
+
+		for (i=0; i<l; i++) {
+			for (n=0; n < channelCount; n++) {
+				channels[n][i] = soundData[i * self.channelCount + n];
+			}
+		}
+	}
+
+	self.sampleRate = context.sampleRate;
+
+	node.onaudioprocess = bufferFill;
+	node.connect(context.destination);
+
+	self._context		= context;
+	self._node		= node;
+	self._callback		= bufferFill;
+	/* Keep references in order to avoid garbage collection removing the listeners, working around http://code.google.com/p/chromium/issues/detail?id=82795 */
+	// Thanks to @baffo32
+	fixChrome82795.push(node);
+}, {
+	kill: function () {
+		this._node.disconnect(0);
+
+		for (var i=0; i<fixChrome82795.length; i++) {
+			if (fixChrome82795[i] === this._node) {
+				fixChrome82795.splice(i--, 1);
+			}
+		}
+
+		this._node = this._context = null;
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._context.currentTime * this.sampleRate;
+	}
+}, false, true);
+
+sinks.webkit = sinks.webaudio;
+
+sinks.webaudio.fix82795 = fixChrome82795;
+
+sinks.webaudio.getContext = function () {
+	// For now, we have to accept that the AudioContext is at 48000Hz, or whatever it decides.
+	var context = new AudioContext(/*sampleRate*/);
+
+	sinks.webaudio.getContext = function () {
+		return context;
+	};
+
+	return context;
+};
+
+}(this.Sink.sinks, []));
+(function (Sink) {
+
+/**
+ * A Sink class for the Media Streams Processing API and/or Web Audio API in a Web Worker.
+*/
+
+Sink.sinks('worker', function () {
+	var	self		= this,
+		global		= (function(){ return this; }()),
+		soundData	= null,
+		outBuffer	= null,
+		zeroBuffer	= null;
+	self.start.apply(self, arguments);
+
+	// Let's see if we're in a worker.
+
+	importScripts();
+
+	function mspBufferFill (e) {
+		if (!self.isReady) {
+			self.initMSP(e);
+		}
+
+		self.ready();
+
+		var	channelCount	= self.channelCount,
+			l		= e.audioLength,
+			n, i;
+
+		soundData	= soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
+		outBuffer	= outBuffer && outBuffer.length === soundData.length ? outBuffer : new Float32Array(l * channelCount);
+		zeroBuffer	= zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
+
+		soundData.set(zeroBuffer);
+		outBuffer.set(zeroBuffer);
+
+		self.process(soundData, self.channelCount);
+
+		for (n=0; n<channelCount; n++) {
+			for (i=0; i<l; i++) {
+				outBuffer[n * e.audioLength + i] = soundData[n + i * channelCount];
+			}
+		}
+
+		e.writeAudio(outBuffer);
+	}
+
+	function waBufferFill(e) {
+		if (!self.isReady) {
+			self.initWA(e);
+		}
+
+		self.ready();
+
+		var	outputBuffer	= e.outputBuffer,
+			channelCount	= outputBuffer.numberOfChannels,
+			i, n, l		= outputBuffer.length,
+			size		= outputBuffer.size,
+			channels	= new Array(channelCount),
+			tail;
+		
+		soundData	= soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
+		zeroBuffer	= zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
+		soundData.set(zeroBuffer);
+
+		for (i=0; i<channelCount; i++) {
+			channels[i] = outputBuffer.getChannelData(i);
+		}
+
+		self.process(soundData, self.channelCount);
+
+		for (i=0; i<l; i++) {
+			for (n=0; n < channelCount; n++) {
+				channels[n][i] = soundData[i * self.channelCount + n];
+			}
+		}
+	}
+
+	global.onprocessmedia	= mspBufferFill;
+	global.onaudioprocess	= waBufferFill;
+
+	self._mspBufferFill	= mspBufferFill;
+	self._waBufferFill	= waBufferFill;
+
+}, {
+	ready: false,
+
+	initMSP: function (e) {
+		this.channelCount	= e.audioChannels;
+		this.sampleRate		= e.audioSampleRate;
+		this.bufferSize		= e.audioLength * this.channelCount;
+		this.ready		= true;
+		this.emit('ready', []);
+	},
+
+	initWA: function (e) {
+		var b = e.outputBuffer;
+		this.channelCount	= b.numberOfChannels;
+		this.sampleRate		= b.sampleRate;
+		this.bufferSize		= b.length * this.channelCount;
+		this.ready		= true;
+		this.emit('ready', []);
+	}
+});
+
+}(this.Sink));
+(function (Sink) {
+
+/**
+ * Splits a sample buffer into those of different channels.
+ *
+ * @static Sink
+ * @name deinterleave
+ *
+ * @arg {Buffer} buffer The sample buffer to split.
+ * @arg {Number} channelCount The number of channels to split to.
+ *
+ * @return {Array} An array containing the resulting sample buffers.
+*/
+
+Sink.deinterleave = function (buffer, channelCount) {
+	var	l	= buffer.length,
+		size	= l / channelCount,
+		ret	= [],
+		i, n;
+	for (i=0; i<channelCount; i++){
+		ret[i] = new Float32Array(size);
+		for (n=0; n<size; n++){
+			ret[i][n] = buffer[n * channelCount + i];
+		}
+	}
+	return ret;
+};
+
+/**
+ * Joins an array of sample buffers into a single buffer.
+ *
+ * @static Sink
+ * @name resample
+ *
+ * @arg {Array} buffers The buffers to join.
+ * @arg {Number} !channelCount The number of channels. Defaults to buffers.length
+ * @arg {Buffer} !buffer The output buffer.
+ *
+ * @return {Buffer} The interleaved buffer created.
+*/
+
+Sink.interleave = function (buffers, channelCount, buffer) {
+	channelCount		= channelCount || buffers.length;
+	var	l		= buffers[0].length,
+		bufferCount	= buffers.length,
+		i, n;
+	buffer			= buffer || new Float32Array(l * channelCount);
+	for (i=0; i<bufferCount; i++) {
+		for (n=0; n<l; n++) {
+			buffer[i + n * channelCount] = buffers[i][n];
+		}
+	}
+	return buffer;
+};
+
+/**
+ * Mixes two or more buffers down to one.
+ *
+ * @static Sink
+ * @name mix
+ *
+ * @arg {Buffer} buffer The buffer to append the others to.
+ * @arg {Buffer} bufferX The buffers to append from.
+ *
+ * @return {Buffer} The mixed buffer.
+*/
+
+Sink.mix = function (buffer) {
+	var	buffers	= [].slice.call(arguments, 1),
+		l, i, c;
+	for (c=0; c<buffers.length; c++){
+		l = Math.max(buffer.length, buffers[c].length);
+		for (i=0; i<l; i++){
+			buffer[i] += buffers[c][i];
+		}
+	}
+	return buffer;
+};
+
+/**
+ * Resets a buffer to all zeroes.
+ *
+ * @static Sink
+ * @name resetBuffer
+ *
+ * @arg {Buffer} buffer The buffer to reset.
+ *
+ * @return {Buffer} The 0-reset buffer.
+*/
+
+Sink.resetBuffer = function (buffer) {
+	var	l	= buffer.length,
+		i;
+	for (i=0; i<l; i++){
+		buffer[i] = 0;
+	}
+	return buffer;
+};
+
+/**
+ * Copies the content of a buffer to another buffer.
+ *
+ * @static Sink
+ * @name clone
+ *
+ * @arg {Buffer} buffer The buffer to copy from.
+ * @arg {Buffer} !result The buffer to copy to.
+ *
+ * @return {Buffer} A clone of the buffer.
+*/
+
+Sink.clone = function (buffer, result) {
+	var	l	= buffer.length,
+		i;
+	result = result || new Float32Array(l);
+	for (i=0; i<l; i++){
+		result[i] = buffer[i];
+	}
+	return result;
+};
+
+/**
+ * Creates an array of buffers of the specified length and the specified count.
+ *
+ * @static Sink
+ * @name createDeinterleaved
+ *
+ * @arg {Number} length The length of a single channel.
+ * @arg {Number} channelCount The number of channels.
+ * @return {Array} The array of buffers.
+*/
+
+Sink.createDeinterleaved = function (length, channelCount) {
+	var	result	= new Array(channelCount),
+		i;
+	for (i=0; i<channelCount; i++){
+		result[i] = new Float32Array(length);
+	}
+	return result;
+};
+
+Sink.memcpy = function (src, srcOffset, dst, dstOffset, length) {
+	src	= src.subarray || src.slice ? src : src.buffer;
+	dst	= dst.subarray || dst.slice ? dst : dst.buffer;
+
+	src	= srcOffset ? src.subarray ?
+		src.subarray(srcOffset, length && srcOffset + length) :
+		src.slice(srcOffset, length && srcOffset + length) : src;
+
+	if (dst.set) {
+		dst.set(src, dstOffset);
+	} else {
+		for (var i=0; i<src.length; i++) {
+			dst[i + dstOffset] = src[i];
+		}
+	}
+
+	return dst;
+};
+
+Sink.memslice = function (buffer, offset, length) {
+	return buffer.subarray ? buffer.subarray(offset, length) : buffer.slice(offset, length);
+};
+
+Sink.mempad = function (buffer, out, offset) {
+	out = out.length ? out : new (buffer.constructor)(out);
+	Sink.memcpy(buffer, 0, out, offset);
+	return out;
+};
+
+Sink.linspace = function (start, end, out) {
+	var l, i, n, step;
+	out	= out.length ? (l=out.length) && out : Array(l=out);
+	step	= (end - start) / --l;
+	for (n=start+step, i=1; i<l; i++, n+=step) {
+		out[i] = n;
+	}
+	out[0]	= start;
+	out[l]	= end;
+	return out;
+};
+
+Sink.ftoi = function (input, bitCount, output) {
+	var i, mask = Math.pow(2, bitCount - 1);
+
+	output = output || new (input.constructor)(input.length);
+
+	for (i=0; i<input.length; i++) {
+		output[i] = ~~(mask * input[i]);
+	}
+
+	return output;
+};
+
+}(this.Sink));
+(function (Sink) {
+
+function Proxy (bufferSize, channelCount) {
+	Sink.EventEmitter.call(this);
+
+	this.bufferSize		= isNaN(bufferSize) || bufferSize === null ? this.bufferSize : bufferSize;
+	this.channelCount	= isNaN(channelCount) || channelCount === null ? this.channelCount : channelCount;
+
+	var self = this;
+	this.callback = function () {
+		return self.process.apply(self, arguments);
+	};
+
+	this.resetBuffer();
+}
+
+Proxy.prototype = {
+	buffer: null,
+	zeroBuffer: null,
+	parentSink: null,
+	bufferSize: 4096,
+	channelCount: 2,
+	offset: null,
+
+	resetBuffer: function () {
+		this.buffer	= new Float32Array(this.bufferSize);
+		this.zeroBuffer	= new Float32Array(this.bufferSize);
+	},
+
+	process: function (buffer, channelCount) {
+		if (this.offset === null) {
+			this.loadBuffer();
+		}
+
+		for (var i=0; i<buffer.length; i++) {
+			if (this.offset >= this.buffer.length) {
+				this.loadBuffer();
+			}
+
+			buffer[i] = this.buffer[this.offset++];
+		}
+	},
+
+	loadBuffer: function () {
+		this.offset = 0;
+		Sink.memcpy(this.zeroBuffer, 0, this.buffer, 0);
+		this.emit('audioprocess', [this.buffer, this.channelCount]);
+	}
+};
+
+Sink.Proxy = Proxy;
+
+/**
+ * Creates a proxy callback system for the sink instance.
+ * Requires Sink utils.
+ *
+ * @method Sink
+ * @method createProxy
+ *
+ * @arg {Number} !bufferSize The buffer size for the proxy.
+*/
+Sink.prototype.createProxy = function (bufferSize) {
+	var	proxy		= new Sink.Proxy(bufferSize, this.channelCount);
+	proxy.parentSink	= this;
+
+	this.on('audioprocess', proxy.callback);
+
+	return proxy;
+};
+
+}(this.Sink));
+(function (Sink) {
+
+(function(){
+
+/**
+ * If method is supplied, adds a new interpolation method to Sink.interpolation, otherwise sets the default interpolation method (Sink.interpolate) to the specified property of Sink.interpolate.
+ *
+ * @arg {String} name The name of the interpolation method to get / set.
+ * @arg {Function} !method The interpolation method.
+*/
+
+function interpolation(name, method) {
+	if (name && method) {
+		interpolation[name] = method;
+	} else if (name && interpolation[name] instanceof Function) {
+		Sink.interpolate = interpolation[name];
+	}
+	return interpolation[name];
+}
+
+Sink.interpolation = interpolation;
+
+
+/**
+ * Interpolates a fractal part position in an array to a sample. (Linear interpolation)
+ *
+ * @param {Array} arr The sample buffer.
+ * @param {number} pos The position to interpolate from.
+ * @return {Float32} The interpolated sample.
+*/
+interpolation('linear', function (arr, pos) {
+	var	first	= Math.floor(pos),
+		second	= first + 1,
+		frac	= pos - first;
+	second		= second < arr.length ? second : 0;
+	return arr[first] * (1 - frac) + arr[second] * frac;
+});
+
+/**
+ * Interpolates a fractal part position in an array to a sample. (Nearest neighbour interpolation)
+ *
+ * @param {Array} arr The sample buffer.
+ * @param {number} pos The position to interpolate from.
+ * @return {Float32} The interpolated sample.
+*/
+interpolation('nearest', function (arr, pos) {
+	return pos >= arr.length - 0.5 ? arr[0] : arr[Math.round(pos)];
+});
+
+interpolation('linear');
+
+}());
+
+
+/**
+ * Resamples a sample buffer from a frequency to a frequency and / or from a sample rate to a sample rate.
+ *
+ * @static Sink
+ * @name resample
+ *
+ * @arg {Buffer} buffer The sample buffer to resample.
+ * @arg {Number} fromRate The original sample rate of the buffer, or if the last argument, the speed ratio to convert with.
+ * @arg {Number} fromFrequency The original frequency of the buffer, or if the last argument, used as toRate and the secondary comparison will not be made.
+ * @arg {Number} toRate The sample rate of the created buffer.
+ * @arg {Number} toFrequency The frequency of the created buffer.
+ *
+ * @return The new resampled buffer.
+*/
+Sink.resample	= function (buffer, fromRate /* or speed */, fromFrequency /* or toRate */, toRate, toFrequency) {
+	var
+		argc		= arguments.length,
+		speed		= argc === 2 ? fromRate : argc === 3 ? fromRate / fromFrequency : toRate / fromRate * toFrequency / fromFrequency,
+		l		= buffer.length,
+		length		= Math.ceil(l / speed),
+		newBuffer	= new Float32Array(length),
+		i, n;
+	for (i=0, n=0; i<l; i += speed) {
+		newBuffer[n++] = Sink.interpolate(buffer, i);
+	}
+	return newBuffer;
+};
+
+}(this.Sink));
+void function (Sink) {
+
+Sink.on('init', function (sink) {
+	sink.activeRecordings = [];
+	sink.on('postprocess', sink.recordData);
+});
+
+Sink.prototype.activeRecordings = null;
+
+/**
+ * Starts recording the sink output.
+ *
+ * @method Sink
+ * @name record
+ *
+ * @return {Recording} The recording object for the recording started.
+*/
+Sink.prototype.record = function () {
+	var recording = new Sink.Recording(this);
+	this.emit('record', [recording]);
+	return recording;
+};
+/**
+ * Private method that handles the adding the buffers to all the current recordings.
+ *
+ * @method Sink
+ * @method recordData
+ *
+ * @arg {Array} buffer The buffer to record.
+*/
+Sink.prototype.recordData = function (buffer) {
+	var	activeRecs	= this.activeRecordings,
+		i, l		= activeRecs.length;
+	for (i=0; i<l; i++) {
+		activeRecs[i].add(buffer);
+	}
+};
+
+/**
+ * A Recording class for recording sink output.
+ *
+ * @class
+ * @static Sink
+ * @arg {Object} bindTo The sink to bind the recording to.
+*/
+
+function Recording (bindTo) {
+	this.boundTo = bindTo;
+	this.buffers = [];
+	bindTo.activeRecordings.push(this);
+}
+
+Recording.prototype = {
+/**
+ * Adds a new buffer to the recording.
+ *
+ * @arg {Array} buffer The buffer to add.
+ *
+ * @method Recording
+*/
+	add: function (buffer) {
+		this.buffers.push(buffer);
+	},
+/**
+ * Empties the recording.
+ *
+ * @method Recording
+*/
+	clear: function () {
+		this.buffers = [];
+	},
+/**
+ * Stops the recording and unbinds it from it's host sink.
+ *
+ * @method Recording
+*/
+	stop: function () {
+		var	recordings = this.boundTo.activeRecordings,
+			i;
+		for (i=0; i<recordings.length; i++) {
+			if (recordings[i] === this) {
+				recordings.splice(i--, 1);
+			}
+		}
+	},
+/**
+ * Joins the recorded buffers into a single buffer.
+ *
+ * @method Recording
+*/
+	join: function () {
+		var	bufferLength	= 0,
+			bufPos		= 0,
+			buffers		= this.buffers,
+			newArray,
+			n, i, l		= buffers.length;
+
+		for (i=0; i<l; i++) {
+			bufferLength += buffers[i].length;
+		}
+		newArray = new Float32Array(bufferLength);
+		for (i=0; i<l; i++) {
+			for (n=0; n<buffers[i].length; n++) {
+				newArray[bufPos + n] = buffers[i][n];
+			}
+			bufPos += buffers[i].length;
+		}
+		return newArray;
+	}
+};
+
+Sink.Recording = Recording;
+
+}(this.Sink);
+void function (Sink) {
+
+function processRingBuffer () {
+	if (this.ringBuffer) {
+		(this.channelMode === 'interleaved' ? this.ringSpin : this.ringSpinInterleaved).apply(this, arguments);
+	}
+}
+
+Sink.on('init', function (sink) {
+	sink.on('preprocess', processRingBuffer);
+});
+
+Sink.prototype.ringBuffer = null;
+
+/**
+ * A private method that applies the ring buffer contents to the specified buffer, while in interleaved mode.
+ *
+ * @method Sink
+ * @name ringSpin
+ *
+ * @arg {Array} buffer The buffer to write to.
+*/
+Sink.prototype.ringSpin = function (buffer) {
+	var	ring	= this.ringBuffer,
+		l	= buffer.length,
+		m	= ring.length,
+		off	= this.ringOffset,
+		i;
+	for (i=0; i<l; i++){
+		buffer[i] += ring[off];
+		off = (off + 1) % m;
+	}
+	this.ringOffset = off;
+};
+
+/**
+ * A private method that applies the ring buffer contents to the specified buffer, while in deinterleaved mode.
+ *
+ * @method Sink
+ * @name ringSpinDeinterleaved
+ *
+ * @param {Array} buffer The buffers to write to.
+*/
+Sink.prototype.ringSpinDeinterleaved = function (buffer) {
+	var	ring	= this.ringBuffer,
+		l	= buffer.length,
+		ch	= ring.length,
+		m	= ring[0].length,
+		len	= ch * m,
+		off	= this.ringOffset,
+		i, n;
+	for (i=0; i<l; i+=ch){
+		for (n=0; n<ch; n++){
+			buffer[i + n] += ring[n][off];
+		}
+		off = (off + 1) % m;
+	}
+	this.ringOffset = n;
+};
+
+}(this.Sink);
+void function (Sink, proto) {
+
+proto = Sink.prototype;
+
+Sink.on('init', function (sink) {
+	sink.asyncBuffers	= [];
+	sink.syncBuffers	= [];
+	sink.on('preprocess', sink.writeBuffersSync);
+	sink.on('postprocess', sink.writeBuffersAsync);
+});
+
+proto.writeMode		= 'async';
+proto.asyncBuffers	= proto.syncBuffers = null;
+
+/**
+ * Private method that handles the mixing of asynchronously written buffers.
+ *
+ * @method Sink
+ * @name writeBuffersAsync
+ *
+ * @arg {Array} buffer The buffer to write to.
+*/
+proto.writeBuffersAsync = function (buffer) {
+	var	buffers		= this.asyncBuffers,
+		l		= buffer.length,
+		buf,
+		bufLength,
+		i, n, offset;
+	if (buffers) {
+		for (i=0; i<buffers.length; i++) {
+			buf		= buffers[i];
+			bufLength	= buf.b.length;
+			offset		= buf.d;
+			buf.d		-= Math.min(offset, l);
+			
+			for (n=0; n + offset < l && n < bufLength; n++) {
+				buffer[n + offset] += buf.b[n];
+			}
+			buf.b = buf.b.subarray(n + offset);
+			if (i >= bufLength) {
+				buffers.splice(i--, 1);
+			}
+		}
+	}
+};
+
+/**
+ * A private method that handles mixing synchronously written buffers.
+ *
+ * @method Sink
+ * @name writeBuffersSync
+ *
+ * @arg {Array} buffer The buffer to write to.
+*/
+proto.writeBuffersSync = function (buffer) {
+	var	buffers		= this.syncBuffers,
+		l		= buffer.length,
+		i		= 0,
+		soff		= 0;
+	for (;i<l && buffers.length; i++) {
+		buffer[i] += buffers[0][soff];
+		if (buffers[0].length <= soff){
+			buffers.splice(0, 1);
+			soff = 0;
+			continue;
+		}
+		soff++;
+	}
+	if (buffers.length) {
+		buffers[0] = buffers[0].subarray(soff);
+	}
+};
+
+/**
+ * Writes a buffer asynchronously on top of the existing signal, after a specified delay.
+ *
+ * @method Sink
+ * @name writeBufferAsync
+ *
+ * @arg {Array} buffer The buffer to write.
+ * @arg {Number} delay The delay to write after. If not specified, the Sink will calculate a delay to compensate the latency.
+ * @return {Number} The number of currently stored asynchronous buffers.
+*/
+proto.writeBufferAsync = function (buffer, delay) {
+	buffer			= this.mode === 'deinterleaved' ? Sink.interleave(buffer, this.channelCount) : buffer;
+	var	buffers		= this.asyncBuffers;
+	buffers.push({
+		b: buffer,
+		d: isNaN(delay) ? ~~((+new Date() - this.previousHit) / 1000 * this.sampleRate) : delay
+	});
+	return buffers.length;
+};
+
+/**
+ * Writes a buffer synchronously to the output.
+ *
+ * @method Sink
+ * @name writeBufferSync
+ *
+ * @param {Array} buffer The buffer to write.
+ * @return {Number} The number of currently stored synchronous buffers.
+*/
+proto.writeBufferSync = function (buffer) {
+	buffer			= this.mode === 'deinterleaved' ? Sink.interleave(buffer, this.channelCount) : buffer;
+	var	buffers		= this.syncBuffers;
+	buffers.push(buffer);
+	return buffers.length;
+};
+
+/**
+ * Writes a buffer, according to the write mode specified.
+ *
+ * @method Sink
+ * @name writeBuffer
+ *
+ * @arg {Array} buffer The buffer to write.
+ * @arg {Number} delay The delay to write after. If not specified, the Sink will calculate a delay to compensate the latency. (only applicable in asynchronous write mode)
+ * @return {Number} The number of currently stored (a)synchronous buffers.
+*/
+proto.writeBuffer = function () {
+	return this[this.writeMode === 'async' ? 'writeBufferAsync' : 'writeBufferSync'].apply(this, arguments);
+};
+
+/**
+ * Gets the total amount of yet unwritten samples in the synchronous buffers.
+ *
+ * @method Sink
+ * @name getSyncWriteOffset
+ *
+ * @return {Number} The total amount of yet unwritten samples in the synchronous buffers.
+*/
+proto.getSyncWriteOffset = function () {
+	var	buffers		= this.syncBuffers,
+		offset		= 0,
+		i;
+	for (i=0; i<buffers.length; i++) {
+		offset += buffers[i].length;
+	}
+	return offset;
+};
+
+} (this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/do-interval.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/do-interval.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/do-interval.js	(revision 28388)
@@ -0,0 +1,57 @@
+void function (Sink) {
+
+/**
+ * Creates a timer with consistent (ie. not clamped) intervals even in background tabs.
+ * Uses inline workers to achieve this. If not available, will revert to regular timers.
+ *
+ * @static Sink
+ * @name doInterval
+ *
+ * @arg {Function} callback The callback to trigger on timer hit.
+ * @arg {Number} timeout The interval between timer hits.
+ *
+ * @return {Function} A function to cancel the timer.
+*/
+
+Sink.doInterval = function (callback, timeout) {
+	var timer, kill;
+
+	function create (noWorker) {
+		if (Sink.inlineWorker.working && !noWorker) {
+			timer = Sink.inlineWorker('setInterval(function (){ postMessage("tic"); }, ' + timeout + ');');
+			timer.onmessage = function (){
+				callback();
+			};
+			kill = function () {
+				timer.terminate();
+			};
+		} else {
+			timer = setInterval(callback, timeout);
+			kill = function (){
+				clearInterval(timer);
+			};
+		}
+	}
+
+	if (Sink.inlineWorker.ready) {
+		create();
+	} else {
+		Sink.inlineWorker.on('ready', function () {
+			create();
+		});
+	}
+
+	return function () {
+		if (!kill) {
+			if (!Sink.inlineWorker.ready) {
+				Sink.inlineWorker.on('ready', function () {
+					if (kill) kill();
+				});
+			}
+		} else {
+			kill();
+		}
+	};
+};
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/dyn-url.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/dyn-url.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/dyn-url.js	(revision 28388)
@@ -0,0 +1,72 @@
+void function (Sink) {
+
+var _Blob, _BlobBuilder, _URL, _btoa;
+
+void function (prefixes, urlPrefixes) {
+	function find (name, prefixes) {
+		var b, a = prefixes.slice();
+
+		for (b=a.shift(); typeof b !== 'undefined'; b=a.shift()) {
+			b = Function('return typeof ' + b + name + 
+				'=== "undefined" ? undefined : ' +
+				b + name)();
+
+			if (b) return b;
+		}
+	}
+
+	_Blob = find('Blob', prefixes);
+	_BlobBuilder = find('BlobBuilder', prefixes);
+	_URL = find('URL', urlPrefixes);
+	_btoa = find('btoa', ['']);
+}([
+	'',
+	'Moz',
+	'WebKit',
+	'MS'
+], [
+	'',
+	'webkit'
+]);
+
+var createBlob = _Blob && _URL && function (content, type) {
+	return _URL.createObjectURL(new _Blob([content], { type: type }));
+};
+
+var createBlobBuilder = _BlobBuilder && _URL && function (content, type) {
+	var bb = new _BlobBuilder();
+	bb.append(content);
+
+	return _URL.createObjectURL(bb.getBlob(type));
+};
+
+var createData = _btoa && function (content, type) {
+	return 'data:' + type + ';base64,' + _btoa(content);
+};
+
+var createDynURL =
+	createBlob ||
+	createBlobBuilder ||
+	createData;
+
+if (!createDynURL) return;
+
+if (createBlob) createDynURL.createBlob = createBlob;
+if (createBlobBuilder) createDynURL.createBlobBuilder = createBlobBuilder;
+if (createData) createDynURL.createData = createData;
+
+if (_Blob) createDynURL.Blob = _Blob;
+if (_BlobBuilder) createDynURL.BlobBuilder = _BlobBuilder;
+if (_URL) createDynURL.URL = _URL;
+
+Sink.createDynURL = createDynURL;
+
+Sink.revokeDynURL = function (url) {
+	if (typeof url === 'string' && url.indexOf('data:') === 0) {
+		return false;
+	} else {
+		return _URL.revokeObjectURL(url);
+	}
+};
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/error.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/error.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/error.js	(revision 28388)
@@ -0,0 +1,61 @@
+void function (Sink) {
+
+/*
+ * A Sink-specific error class.
+ *
+ * @class
+ * @static Sink
+ * @name Error
+ *
+ * @arg =code
+ *
+ * @param {Number} code The error code.
+ * @param {String} message A brief description of the error.
+ * @param {String} explanation A more verbose explanation of why the error occured and how to fix.
+*/
+
+function SinkError(code) {
+	if (!SinkError.hasOwnProperty(code)) throw SinkError(1);
+	if (!(this instanceof SinkError)) return new SinkError(code);
+
+	var k;
+	for (k in SinkError[code]) {
+		if (SinkError[code].hasOwnProperty(k)) {
+			this[k] = SinkError[code][k];
+		}
+	}
+
+	this.code = code;
+}
+
+SinkError.prototype = new Error();
+
+SinkError.prototype.toString = function () {
+	return 'SinkError 0x' + this.code.toString(16) + ': ' + this.message;
+};
+
+SinkError[0x01] = {
+	message: 'No such error code.',
+	explanation: 'The error code does not exist.'
+};
+SinkError[0x02] = {
+	message: 'No audio sink available.',
+	explanation: 'The audio device may be busy, or no supported output API is available for this browser.'
+};
+
+SinkError[0x10] = {
+	message: 'Buffer underflow.',
+	explanation: 'Trying to recover...'
+};
+SinkError[0x11] = {
+	message: 'Critical recovery fail.',
+	explanation: 'The buffer underflow has reached a critical point, trying to recover, but will probably fail anyway.'
+};
+SinkError[0x12] = {
+	message: 'Buffer size too large.',
+	explanation: 'Unable to allocate the buffer due to excessive length, please try a smaller buffer. Buffer size should probably be smaller than the sample rate.'
+};
+
+Sink.Error = SinkError;
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/inline-worker.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/inline-worker.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/inline-worker.js	(revision 28388)
@@ -0,0 +1,121 @@
+void function (Sink) {
+
+/**
+ * Creates an inline worker using a data/blob URL, if possible.
+ *
+ * @static Sink
+ *
+ * @arg {String} script
+ *
+ * @return {Worker} A web worker, or null if impossible to create.
+*/
+
+var define = Object.defineProperty ? function (obj, name, value) {
+	Object.defineProperty(obj, name, {
+		value: value,
+		configurable: true,
+		writable: true
+	});
+} : function (obj, name, value) {
+	obj[name] = value;
+};
+
+function terminate () {
+	define(this, 'terminate', this._terminate);
+
+	Sink.revokeDynURL(this._url);
+
+	delete this._url;
+	delete this._terminate;
+	return this.terminate();
+}
+
+function inlineWorker (script) {
+	function wrap (type, content, typeName) {
+		try {
+			var url = type(content, 'text/javascript');
+			var worker = new Worker(url);
+
+			define(worker, '_url', url);
+			define(worker, '_terminate', worker.terminate);
+			define(worker, 'terminate', terminate);
+
+			if (inlineWorker.type) return worker;
+
+			inlineWorker.type = typeName;
+			inlineWorker.createURL = type;
+
+			return worker;
+		} catch (e) {
+			return null;
+		}
+	}
+
+	var createDynURL = Sink.createDynURL;
+
+	if (!createDynURL) return null;
+
+	var worker;
+
+	if (inlineWorker.createURL) {
+		return wrap(inlineWorker.createURL, script, inlineWorker.type);
+	}
+
+	worker = wrap(createDynURL.createBlob, script, 'blob');
+	if (worker) return worker;
+
+	worker = wrap(createDynURL.createBlobBuilder, script, 'blobbuilder');
+	if (worker) return worker;
+
+	worker = wrap(createDynURL.createData, script, 'data');
+
+	return worker;
+}
+
+Sink.EventEmitter.call(inlineWorker);
+
+inlineWorker.test = function () {
+	inlineWorker.ready = inlineWorker.working = false;
+	inlineWorker.type = '';
+	inlineWorker.createURL = null;
+
+	var worker = inlineWorker('this.onmessage=function(e){postMessage(e.data)}');
+	var data = 'inlineWorker';
+
+	function ready (success) {
+		if (inlineWorker.ready) return;
+
+		inlineWorker.ready = true;
+		inlineWorker.working = success;
+		inlineWorker.emit('ready', [success]);
+		inlineWorker.off('ready');
+
+		if (success && worker) {
+			worker.terminate();
+		}
+
+		worker = null;
+	}
+
+	if (!worker) {
+		setTimeout(function () {
+			ready(false);
+		}, 0);
+	} else {
+		worker.onmessage = function (e) {
+			ready(e.data === data);
+		};
+
+		worker.postMessage(data);
+
+		setTimeout(function () {
+			ready(false);
+		}, 1000);
+	}
+};
+
+Sink.inlineWorker = inlineWorker;
+
+inlineWorker.test();
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/event-emitter.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/event-emitter.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/event-emitter.js	(revision 28388)
@@ -0,0 +1,83 @@
+void function (Sink) {
+
+/**
+ * A light event emitter.
+ *
+ * @class
+ * @static Sink
+*/
+function EventEmitter () {
+	var k;
+	for (k in EventEmitter.prototype) {
+		if (EventEmitter.prototype.hasOwnProperty(k)) {
+			this[k] = EventEmitter.prototype[k];
+		}
+	}
+	this._listeners = {};
+}
+
+EventEmitter.prototype = {
+	_listeners: null,
+/**
+ * Emits an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event to emit.
+ * @arg {Array} args The arguments to pass to the event handlers.
+*/
+	emit: function (name, args) {
+		if (this._listeners[name]) {
+			for (var i=0; i<this._listeners[name].length; i++) {
+				this._listeners[name][i].apply(this, args);
+			}
+		}
+		return this;
+	},
+/**
+ * Adds an event listener to an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event.
+ * @arg {Function} listener The event listener to attach to the event.
+*/
+	on: function (name, listener) {
+		this._listeners[name] = this._listeners[name] || [];
+		this._listeners[name].push(listener);
+		return this;
+	},
+/**
+ * Adds an event listener to an event.
+ *
+ * @method EventEmitter
+ *
+ * @arg {String} name The name of the event.
+ * @arg {Function} !listener The event listener to remove from the event. If not specified, will delete all.
+*/
+	off: function (name, listener) {
+		if (this._listeners[name]) {
+			if (!listener) {
+				delete this._listeners[name];
+				return this;
+			}
+
+			for (var i=0; i<this._listeners[name].length; i++) {
+				if (this._listeners[name][i] === listener) {
+					this._listeners[name].splice(i--, 1);
+				}
+			}
+
+			if (!this._listeners[name].length) {
+				delete this._listeners[name];
+			}
+		}
+		return this;
+	}
+};
+
+Sink.EventEmitter = EventEmitter;
+
+EventEmitter.call(Sink);
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/extra/recording.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/extra/recording.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/extra/recording.js	(revision 28388)
@@ -0,0 +1,114 @@
+void function (Sink) {
+
+Sink.on('init', function (sink) {
+	sink.activeRecordings = [];
+	sink.on('postprocess', sink.recordData);
+});
+
+Sink.prototype.activeRecordings = null;
+
+/**
+ * Starts recording the sink output.
+ *
+ * @method Sink
+ * @name record
+ *
+ * @return {Recording} The recording object for the recording started.
+*/
+Sink.prototype.record = function () {
+	var recording = new Sink.Recording(this);
+	this.emit('record', [recording]);
+	return recording;
+};
+/**
+ * Private method that handles the adding the buffers to all the current recordings.
+ *
+ * @method Sink
+ * @method recordData
+ *
+ * @arg {Array} buffer The buffer to record.
+*/
+Sink.prototype.recordData = function (buffer) {
+	var	activeRecs	= this.activeRecordings,
+		i, l		= activeRecs.length;
+	for (i=0; i<l; i++) {
+		activeRecs[i].add(buffer);
+	}
+};
+
+/**
+ * A Recording class for recording sink output.
+ *
+ * @class
+ * @static Sink
+ * @arg {Object} bindTo The sink to bind the recording to.
+*/
+
+function Recording (bindTo) {
+	this.boundTo = bindTo;
+	this.buffers = [];
+	bindTo.activeRecordings.push(this);
+}
+
+Recording.prototype = {
+/**
+ * Adds a new buffer to the recording.
+ *
+ * @arg {Array} buffer The buffer to add.
+ *
+ * @method Recording
+*/
+	add: function (buffer) {
+		this.buffers.push(buffer);
+	},
+/**
+ * Empties the recording.
+ *
+ * @method Recording
+*/
+	clear: function () {
+		this.buffers = [];
+	},
+/**
+ * Stops the recording and unbinds it from it's host sink.
+ *
+ * @method Recording
+*/
+	stop: function () {
+		var	recordings = this.boundTo.activeRecordings,
+			i;
+		for (i=0; i<recordings.length; i++) {
+			if (recordings[i] === this) {
+				recordings.splice(i--, 1);
+			}
+		}
+	},
+/**
+ * Joins the recorded buffers into a single buffer.
+ *
+ * @method Recording
+*/
+	join: function () {
+		var	bufferLength	= 0,
+			bufPos		= 0,
+			buffers		= this.buffers,
+			newArray,
+			n, i, l		= buffers.length;
+
+		for (i=0; i<l; i++) {
+			bufferLength += buffers[i].length;
+		}
+		newArray = new Float32Array(bufferLength);
+		for (i=0; i<l; i++) {
+			for (n=0; n<buffers[i].length; n++) {
+				newArray[bufPos + n] = buffers[i][n];
+			}
+			bufPos += buffers[i].length;
+		}
+		return newArray;
+	}
+};
+
+Sink.Recording = Recording;
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/extra/ring-buffer.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/extra/ring-buffer.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/extra/ring-buffer.js	(revision 28388)
@@ -0,0 +1,61 @@
+void function (Sink) {
+
+function processRingBuffer () {
+	if (this.ringBuffer) {
+		(this.channelMode === 'interleaved' ? this.ringSpin : this.ringSpinInterleaved).apply(this, arguments);
+	}
+}
+
+Sink.on('init', function (sink) {
+	sink.on('preprocess', processRingBuffer);
+});
+
+Sink.prototype.ringBuffer = null;
+
+/**
+ * A private method that applies the ring buffer contents to the specified buffer, while in interleaved mode.
+ *
+ * @method Sink
+ * @name ringSpin
+ *
+ * @arg {Array} buffer The buffer to write to.
+*/
+Sink.prototype.ringSpin = function (buffer) {
+	var	ring	= this.ringBuffer,
+		l	= buffer.length,
+		m	= ring.length,
+		off	= this.ringOffset,
+		i;
+	for (i=0; i<l; i++){
+		buffer[i] += ring[off];
+		off = (off + 1) % m;
+	}
+	this.ringOffset = off;
+};
+
+/**
+ * A private method that applies the ring buffer contents to the specified buffer, while in deinterleaved mode.
+ *
+ * @method Sink
+ * @name ringSpinDeinterleaved
+ *
+ * @param {Array} buffer The buffers to write to.
+*/
+Sink.prototype.ringSpinDeinterleaved = function (buffer) {
+	var	ring	= this.ringBuffer,
+		l	= buffer.length,
+		ch	= ring.length,
+		m	= ring[0].length,
+		len	= ch * m,
+		off	= this.ringOffset,
+		i, n;
+	for (i=0; i<l; i+=ch){
+		for (n=0; n<ch; n++){
+			buffer[i + n] += ring[n][off];
+		}
+		off = (off + 1) % m;
+	}
+	this.ringOffset = n;
+};
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/extra/write-buffers.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/extra/write-buffers.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/extra/write-buffers.js	(revision 28388)
@@ -0,0 +1,142 @@
+void function (Sink, proto) {
+
+proto = Sink.prototype;
+
+Sink.on('init', function (sink) {
+	sink.asyncBuffers	= [];
+	sink.syncBuffers	= [];
+	sink.on('preprocess', sink.writeBuffersSync);
+	sink.on('postprocess', sink.writeBuffersAsync);
+});
+
+proto.writeMode		= 'async';
+proto.asyncBuffers	= proto.syncBuffers = null;
+
+/**
+ * Private method that handles the mixing of asynchronously written buffers.
+ *
+ * @method Sink
+ * @name writeBuffersAsync
+ *
+ * @arg {Array} buffer The buffer to write to.
+*/
+proto.writeBuffersAsync = function (buffer) {
+	var	buffers		= this.asyncBuffers,
+		l		= buffer.length,
+		buf,
+		bufLength,
+		i, n, offset;
+	if (buffers) {
+		for (i=0; i<buffers.length; i++) {
+			buf		= buffers[i];
+			bufLength	= buf.b.length;
+			offset		= buf.d;
+			buf.d		-= Math.min(offset, l);
+			
+			for (n=0; n + offset < l && n < bufLength; n++) {
+				buffer[n + offset] += buf.b[n];
+			}
+			buf.b = buf.b.subarray(n + offset);
+			if (i >= bufLength) {
+				buffers.splice(i--, 1);
+			}
+		}
+	}
+};
+
+/**
+ * A private method that handles mixing synchronously written buffers.
+ *
+ * @method Sink
+ * @name writeBuffersSync
+ *
+ * @arg {Array} buffer The buffer to write to.
+*/
+proto.writeBuffersSync = function (buffer) {
+	var	buffers		= this.syncBuffers,
+		l		= buffer.length,
+		i		= 0,
+		soff		= 0;
+	for (;i<l && buffers.length; i++) {
+		buffer[i] += buffers[0][soff];
+		if (buffers[0].length <= soff){
+			buffers.splice(0, 1);
+			soff = 0;
+			continue;
+		}
+		soff++;
+	}
+	if (buffers.length) {
+		buffers[0] = buffers[0].subarray(soff);
+	}
+};
+
+/**
+ * Writes a buffer asynchronously on top of the existing signal, after a specified delay.
+ *
+ * @method Sink
+ * @name writeBufferAsync
+ *
+ * @arg {Array} buffer The buffer to write.
+ * @arg {Number} delay The delay to write after. If not specified, the Sink will calculate a delay to compensate the latency.
+ * @return {Number} The number of currently stored asynchronous buffers.
+*/
+proto.writeBufferAsync = function (buffer, delay) {
+	buffer			= this.mode === 'deinterleaved' ? Sink.interleave(buffer, this.channelCount) : buffer;
+	var	buffers		= this.asyncBuffers;
+	buffers.push({
+		b: buffer,
+		d: isNaN(delay) ? ~~((+new Date() - this.previousHit) / 1000 * this.sampleRate) : delay
+	});
+	return buffers.length;
+};
+
+/**
+ * Writes a buffer synchronously to the output.
+ *
+ * @method Sink
+ * @name writeBufferSync
+ *
+ * @param {Array} buffer The buffer to write.
+ * @return {Number} The number of currently stored synchronous buffers.
+*/
+proto.writeBufferSync = function (buffer) {
+	buffer			= this.mode === 'deinterleaved' ? Sink.interleave(buffer, this.channelCount) : buffer;
+	var	buffers		= this.syncBuffers;
+	buffers.push(buffer);
+	return buffers.length;
+};
+
+/**
+ * Writes a buffer, according to the write mode specified.
+ *
+ * @method Sink
+ * @name writeBuffer
+ *
+ * @arg {Array} buffer The buffer to write.
+ * @arg {Number} delay The delay to write after. If not specified, the Sink will calculate a delay to compensate the latency. (only applicable in asynchronous write mode)
+ * @return {Number} The number of currently stored (a)synchronous buffers.
+*/
+proto.writeBuffer = function () {
+	return this[this.writeMode === 'async' ? 'writeBufferAsync' : 'writeBufferSync'].apply(this, arguments);
+};
+
+/**
+ * Gets the total amount of yet unwritten samples in the synchronous buffers.
+ *
+ * @method Sink
+ * @name getSyncWriteOffset
+ *
+ * @return {Number} The total amount of yet unwritten samples in the synchronous buffers.
+*/
+proto.getSyncWriteOffset = function () {
+	var	buffers		= this.syncBuffers,
+		offset		= 0,
+		i;
+	for (i=0; i<buffers.length; i++) {
+		offset += buffers[i].length;
+	}
+	return offset;
+};
+
+} (this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/main.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/main.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/main.js	(revision 28388)
@@ -0,0 +1,169 @@
+var Sink = this.Sink = function (global) {
+
+/**
+ * Creates a Sink according to specified parameters, if possible.
+ *
+ * @class
+ *
+ * @arg =!readFn
+ * @arg =!channelCount
+ * @arg =!bufferSize
+ * @arg =!sampleRate
+ *
+ * @param {Function} readFn A callback to handle the buffer fills.
+ * @param {Number} channelCount Channel count.
+ * @param {Number} bufferSize (Optional) Specifies a pre-buffer size to control the amount of latency.
+ * @param {Number} sampleRate Sample rate (ms).
+ * @param {Number} default=0 writePosition Write position of the sink, as in how many samples have been written per channel.
+ * @param {String} default=async writeMode The default mode of writing to the sink.
+ * @param {String} default=interleaved channelMode The mode in which the sink asks the sample buffers to be channeled in.
+ * @param {Number} default=0 previousHit The previous time of a callback.
+ * @param {Buffer} default=null ringBuffer The ring buffer array of the sink. If null, ring buffering will not be applied.
+ * @param {Number} default=0 ringOffset The current position of the ring buffer.
+*/
+function Sink (readFn, channelCount, bufferSize, sampleRate) {
+	var	sinks	= Sink.sinks.list,
+		i;
+	for (i=0; i<sinks.length; i++) {
+		if (sinks[i].enabled) {
+			try {
+				return new sinks[i](readFn, channelCount, bufferSize, sampleRate);
+			} catch(e1){}
+		}
+	}
+
+	throw Sink.Error(0x02);
+}
+
+function SinkClass () {
+}
+
+Sink.SinkClass = SinkClass;
+
+SinkClass.prototype = Sink.prototype = {
+	sampleRate: 44100,
+	channelCount: 2,
+	bufferSize: 4096,
+
+	writePosition: 0,
+	previousHit: 0,
+	ringOffset: 0,
+
+	channelMode: 'interleaved',
+	isReady: false,
+
+/**
+ * Does the initialization of the sink.
+ * @method Sink
+*/
+	start: function (readFn, channelCount, bufferSize, sampleRate) {
+		this.channelCount	= isNaN(channelCount) || channelCount === null ? this.channelCount: channelCount;
+		this.bufferSize		= isNaN(bufferSize) || bufferSize === null ? this.bufferSize : bufferSize;
+		this.sampleRate		= isNaN(sampleRate) || sampleRate === null ? this.sampleRate : sampleRate;
+		this.readFn		= readFn;
+		this.activeRecordings	= [];
+		this.previousHit	= +new Date();
+		Sink.EventEmitter.call(this);
+		Sink.emit('init', [this].concat([].slice.call(arguments)));
+	},
+/**
+ * The method which will handle all the different types of processing applied on a callback.
+ * @method Sink
+*/
+	process: function (soundData, channelCount) {
+		this.emit('preprocess', arguments);
+
+		if (this.ringBuffer) {
+			(this.channelMode === 'interleaved' ? this.ringSpin : this.ringSpinInterleaved).apply(this, arguments);
+		}
+
+		if (this.channelMode === 'interleaved') {
+			this.emit('audioprocess', arguments);
+
+			if (this.readFn) {
+				this.readFn.apply(this, arguments);
+			}
+		} else {
+			var	soundDataSplit	= Sink.deinterleave(soundData, this.channelCount),
+				args		= [soundDataSplit].concat([].slice.call(arguments, 1));
+			this.emit('audioprocess', args);
+
+			if (this.readFn) {
+				this.readFn.apply(this, args);
+			}
+
+			Sink.interleave(soundDataSplit, this.channelCount, soundData);
+		}
+		this.emit('postprocess', arguments);
+		this.previousHit = +new Date();
+		this.writePosition += soundData.length / channelCount;
+	},
+/**
+ * Get the current output position, defaults to writePosition - bufferSize.
+ *
+ * @method Sink
+ *
+ * @return {Number} The position of the write head, in samples, per channel.
+*/
+	getPlaybackTime: function () {
+		return this.writePosition - this.bufferSize;
+	},
+/**
+ * Internal method to send the ready signal if not ready yet.
+ * @method Sink
+*/
+	ready: function () {
+		if (this.isReady) return;
+
+		this.isReady = true;
+		this.emit('ready', []);
+	}
+};
+
+/**
+ * The container for all the available sinks. Also a decorator function for creating a new Sink class and binding it.
+ *
+ * @method Sink
+ * @static
+ *
+ * @arg {String} type The name / type of the Sink.
+ * @arg {Function} constructor The constructor function for the Sink.
+ * @arg {Object} prototype The prototype of the Sink. (optional)
+ * @arg {Boolean} disabled Whether the Sink should be disabled at first.
+*/
+
+function sinks (type, constructor, prototype, disabled, priority) {
+	prototype = prototype || constructor.prototype;
+	constructor.prototype = new Sink.SinkClass();
+	constructor.prototype.type = type;
+	constructor.enabled = !disabled;
+
+	var k;
+	for (k in prototype) {
+		if (prototype.hasOwnProperty(k)) {
+			constructor.prototype[k] = prototype[k];
+		}
+	}
+
+	sinks[type] = constructor;
+	sinks.list[priority ? 'unshift' : 'push'](constructor);
+}
+
+Sink.sinks = Sink.devices = sinks;
+Sink.sinks.list = [];
+
+Sink.singleton = function () {
+	var sink = Sink.apply(null, arguments);
+
+	Sink.singleton = function () {
+		return sink;
+	};
+
+	return sink;
+};
+
+global.Sink = Sink;
+
+return Sink;
+
+}(function (){ return this; }());
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/audio-data-api.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/audio-data-api.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/audio-data-api.js	(revision 28388)
@@ -0,0 +1,96 @@
+void function (Sink) {
+
+/**
+ * A Sink class for the Mozilla Audio Data API.
+*/
+
+Sink.sinks('audiodata', function () {
+	var	self			= this,
+		currentWritePosition	= 0,
+		tail			= null,
+		audioDevice		= new Audio(),
+		written, currentPosition, available, soundData, prevPos,
+		timer; // Fix for https://bugzilla.mozilla.org/show_bug.cgi?id=630117
+	self.start.apply(self, arguments);
+	self.preBufferSize = isNaN(arguments[4]) || arguments[4] === null ? this.preBufferSize : arguments[4];
+
+	function bufferFill() {
+		if (tail) {
+			written = audioDevice.mozWriteAudio(tail);
+			currentWritePosition += written;
+			if (written < tail.length){
+				tail = tail.subarray(written);
+				return tail;
+			}
+			tail = null;
+		}
+
+		currentPosition = audioDevice.mozCurrentSampleOffset();
+		available = Number(currentPosition + (prevPos !== currentPosition ? self.bufferSize : self.preBufferSize) * self.channelCount - currentWritePosition);
+
+		if (currentPosition === prevPos) {
+			self.emit('error', [Sink.Error(0x10)]);
+		}
+
+		if (available > 0 || prevPos === currentPosition){
+			self.ready();
+
+			try {
+				soundData = new Float32Array(prevPos === currentPosition ? self.preBufferSize * self.channelCount :
+					self.forceBufferSize ? available < self.bufferSize * 2 ? self.bufferSize * 2 : available : available);
+			} catch(e) {
+				self.emit('error', [Sink.Error(0x12)]);
+				self.kill();
+				return;
+			}
+			self.process(soundData, self.channelCount);
+			written = self._audio.mozWriteAudio(soundData);
+			if (written < soundData.length){
+				tail = soundData.subarray(written);
+			}
+			currentWritePosition += written;
+		}
+		prevPos = currentPosition;
+	}
+
+	audioDevice.mozSetup(self.channelCount, self.sampleRate);
+
+	this._timers = [];
+
+	this._timers.push(Sink.doInterval(function () {
+		// Check for complete death of the output
+		if (+new Date() - self.previousHit > 2000) {
+			self._audio = audioDevice = new Audio();
+			audioDevice.mozSetup(self.channelCount, self.sampleRate);
+			currentWritePosition = 0;
+			self.emit('error', [Sink.Error(0x11)]);
+		}
+	}, 1000));
+
+	this._timers.push(Sink.doInterval(bufferFill, self.interval));
+
+	self._bufferFill	= bufferFill;
+	self._audio		= audioDevice;
+}, {
+	// These are somewhat safe values...
+	bufferSize: 24576,
+	preBufferSize: 24576,
+	forceBufferSize: false,
+	interval: 100,
+
+	kill: function () {
+		while (this._timers.length) {
+			this._timers.shift()();
+		}
+
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._audio.mozCurrentSampleOffset() / this.channelCount;
+	}
+}, false, true);
+
+Sink.sinks.moz = Sink.sinks.audiodata;
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/cubeb.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/cubeb.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/cubeb.js	(revision 28388)
@@ -0,0 +1,71 @@
+void function (Sink) {
+
+var cubeb;
+
+try {
+	cubeb = require('cubeb');
+} catch (e) {
+	return;
+}
+
+var getContext = function () {
+	var ctx;
+
+	return function () {
+		ctx = new cubeb.Context(
+			"sink.js " + process.pid + ' ' + new Date()
+		);
+
+		getContext = function () { return ctx; };
+
+		return ctx;
+	};
+}();
+
+var streamCount = 0;
+
+Sink.sinks('cubeb', function () {
+	var self = this;
+
+	self.start.apply(self, arguments);
+
+	self._ctx = getContext();
+	self._stream = new cubeb.Stream(
+		self._ctx,
+		self._ctx.name + ' ' + streamCount++,
+		cubeb.SAMPLE_FLOAT32LE,
+		self.channelCount,
+		self.sampleRate,
+		self.bufferSize,
+		self._latency,
+		function (frameCount) {
+			var buffer = new Buffer(
+				4 * frameCount * self.channelCount);
+			var soundData = new Float32Array(buffer);
+
+			self.process(soundData, self.channelCount);
+
+			self._stream.write(buffer);
+			self._stream.release();
+		},
+		function (state) {}
+	);
+
+	self._stream.start();
+}, {
+	_ctx: null,
+	_stream: null,
+	_latency: 250,
+	bufferSize: 4096,
+
+	kill: function () {
+		this._stream.stop();
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._stream.position;
+	}
+});
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/dummy.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/dummy.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/dummy.js	(revision 28388)
@@ -0,0 +1,26 @@
+void function (Sink) {
+
+/**
+ * A dummy Sink. (No output)
+*/
+
+Sink.sinks('dummy', function () {
+	var	self = this;
+	self.start.apply(self, arguments);
+	
+	function bufferFill () {
+		var	soundData = new Float32Array(self.bufferSize * self.channelCount);
+		self.process(soundData, self.channelCount);
+	}
+
+	self._kill = Sink.doInterval(bufferFill, self.bufferSize / self.sampleRate * 1000);
+
+	self._callback		= bufferFill;
+}, {
+	kill: function () {
+		this._kill();
+		this.emit('kill');
+	}
+}, true);
+
+}(this.Sink);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/wav-data-uri.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/wav-data-uri.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/wav-data-uri.js	(revision 28388)
@@ -0,0 +1,100 @@
+(function (Sink, sinks) {
+
+sinks = Sink.sinks;
+
+function newAudio (src) {
+	var audio = document.createElement('audio');
+	if (src) {
+		audio.src = src;
+	}
+	return audio;
+}
+
+/* TODO: Implement a <BGSOUND> hack for IE8. */
+
+/**
+ * A sink class for WAV data URLs
+ * Relies on pcmdata.js and utils to be present.
+ * Thanks to grantgalitz and others for the idea.
+*/
+sinks('wav', function () {
+	var	self			= this,
+		audio			= new sinks.wav.wavAudio(),
+		PCMData			= typeof PCMData === 'undefined' ? audioLib.PCMData : PCMData;
+	self.start.apply(self, arguments);
+	var	soundData		= new Float32Array(self.bufferSize * self.channelCount),
+		zeroData		= new Float32Array(self.bufferSize * self.channelCount);
+
+	if (!newAudio().canPlayType('audio/wav; codecs=1') || !btoa) throw 0;
+	
+	function bufferFill () {
+		if (self._audio.hasNextFrame) return;
+
+		self.ready();
+
+		Sink.memcpy(zeroData, 0, soundData, 0);
+		self.process(soundData, self.channelCount);
+
+		self._audio.setSource('data:audio/wav;base64,' + btoa(
+			audioLib.PCMData.encode({
+				data:		soundData,
+				sampleRate:	self.sampleRate,
+				channelCount:	self.channelCount,
+				bytesPerSample:	self.quality
+			})
+		));
+
+		if (!self._audio.currentFrame.src) self._audio.nextClip();
+	}
+	
+	self.kill		= Sink.doInterval(bufferFill, 40);
+	self._bufferFill	= bufferFill;
+	self._audio		= audio;
+}, {
+	quality: 1,
+	bufferSize: 22050,
+
+	getPlaybackTime: function () {
+		var audio = this._audio;
+		return (audio.currentFrame ? audio.currentFrame.currentTime * this.sampleRate : 0) + audio.samples;
+	}
+});
+
+function wavAudio () {
+	var self = this;
+
+	self.currentFrame	= newAudio();
+	self.nextFrame		= newAudio();
+
+	self._onended		= function () {
+		self.samples += self.bufferSize;
+		self.nextClip();
+	};
+}
+
+wavAudio.prototype = {
+	samples:	0,
+	nextFrame:	null,
+	currentFrame:	null,
+	_onended:	null,
+	hasNextFrame:	false,
+
+	nextClip: function () {
+		var	curFrame	= this.currentFrame;
+		this.currentFrame	= this.nextFrame;
+		this.nextFrame		= curFrame;
+		this.hasNextFrame	= false;
+		this.currentFrame.play();
+	},
+
+	setSource: function (src) {
+		this.nextFrame.src = src;
+		this.nextFrame.addEventListener('ended', this._onended, true);
+
+		this.hasNextFrame = true;
+	}
+};
+
+sinks.wav.wavAudio = wavAudio;
+
+}(this.Sink));
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/web-audio-api.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/web-audio-api.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/web-audio-api.js	(revision 28388)
@@ -0,0 +1,90 @@
+ (function (sinks, fixChrome82795) {
+
+var AudioContext = typeof window === 'undefined' ? null : window.webkitAudioContext || window.AudioContext;
+
+/**
+ * A sink class for the Web Audio API
+*/
+
+sinks('webaudio', function (readFn, channelCount, bufferSize, sampleRate) {
+	var	self		= this,
+		context		= sinks.webaudio.getContext(),
+		node		= null,
+		soundData	= null,
+		zeroBuffer	= null;
+	self.start.apply(self, arguments);
+	node = context.createJavaScriptNode(self.bufferSize, self.channelCount, self.channelCount);
+
+	function bufferFill(e) {
+		var	outputBuffer	= e.outputBuffer,
+			channelCount	= outputBuffer.numberOfChannels,
+			i, n, l		= outputBuffer.length,
+			size		= outputBuffer.size,
+			channels	= new Array(channelCount),
+			tail;
+
+		self.ready();
+		
+		soundData	= soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
+		zeroBuffer	= zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
+		soundData.set(zeroBuffer);
+
+		for (i=0; i<channelCount; i++) {
+			channels[i] = outputBuffer.getChannelData(i);
+		}
+
+		self.process(soundData, self.channelCount);
+
+		for (i=0; i<l; i++) {
+			for (n=0; n < channelCount; n++) {
+				channels[n][i] = soundData[i * self.channelCount + n];
+			}
+		}
+	}
+
+	self.sampleRate = context.sampleRate;
+
+	node.onaudioprocess = bufferFill;
+	node.connect(context.destination);
+
+	self._context		= context;
+	self._node		= node;
+	self._callback		= bufferFill;
+	/* Keep references in order to avoid garbage collection removing the listeners, working around http://code.google.com/p/chromium/issues/detail?id=82795 */
+	// Thanks to @baffo32
+	fixChrome82795.push(node);
+}, {
+	kill: function () {
+		this._node.disconnect(0);
+
+		for (var i=0; i<fixChrome82795.length; i++) {
+			if (fixChrome82795[i] === this._node) {
+				fixChrome82795.splice(i--, 1);
+			}
+		}
+
+		this._node = this._context = null;
+		this.emit('kill');
+	},
+
+	getPlaybackTime: function () {
+		return this._context.currentTime * this.sampleRate;
+	}
+}, false, true);
+
+sinks.webkit = sinks.webaudio;
+
+sinks.webaudio.fix82795 = fixChrome82795;
+
+sinks.webaudio.getContext = function () {
+	// For now, we have to accept that the AudioContext is at 48000Hz, or whatever it decides.
+	var context = new AudioContext(/*sampleRate*/);
+
+	sinks.webaudio.getContext = function () {
+		return context;
+	};
+
+	return context;
+};
+
+}(this.Sink.sinks, []));
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/workers.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/workers.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/workers.js	(revision 28388)
@@ -0,0 +1,106 @@
+(function (Sink) {
+
+/**
+ * A Sink class for the Media Streams Processing API and/or Web Audio API in a Web Worker.
+*/
+
+Sink.sinks('worker', function () {
+	var	self		= this,
+		global		= (function(){ return this; }()),
+		soundData	= null,
+		outBuffer	= null,
+		zeroBuffer	= null;
+	self.start.apply(self, arguments);
+
+	// Let's see if we're in a worker.
+
+	importScripts();
+
+	function mspBufferFill (e) {
+		if (!self.isReady) {
+			self.initMSP(e);
+		}
+
+		self.ready();
+
+		var	channelCount	= self.channelCount,
+			l		= e.audioLength,
+			n, i;
+
+		soundData	= soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
+		outBuffer	= outBuffer && outBuffer.length === soundData.length ? outBuffer : new Float32Array(l * channelCount);
+		zeroBuffer	= zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
+
+		soundData.set(zeroBuffer);
+		outBuffer.set(zeroBuffer);
+
+		self.process(soundData, self.channelCount);
+
+		for (n=0; n<channelCount; n++) {
+			for (i=0; i<l; i++) {
+				outBuffer[n * e.audioLength + i] = soundData[n + i * channelCount];
+			}
+		}
+
+		e.writeAudio(outBuffer);
+	}
+
+	function waBufferFill(e) {
+		if (!self.isReady) {
+			self.initWA(e);
+		}
+
+		self.ready();
+
+		var	outputBuffer	= e.outputBuffer,
+			channelCount	= outputBuffer.numberOfChannels,
+			i, n, l		= outputBuffer.length,
+			size		= outputBuffer.size,
+			channels	= new Array(channelCount),
+			tail;
+		
+		soundData	= soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
+		zeroBuffer	= zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
+		soundData.set(zeroBuffer);
+
+		for (i=0; i<channelCount; i++) {
+			channels[i] = outputBuffer.getChannelData(i);
+		}
+
+		self.process(soundData, self.channelCount);
+
+		for (i=0; i<l; i++) {
+			for (n=0; n < channelCount; n++) {
+				channels[n][i] = soundData[i * self.channelCount + n];
+			}
+		}
+	}
+
+	global.onprocessmedia	= mspBufferFill;
+	global.onaudioprocess	= waBufferFill;
+
+	self._mspBufferFill	= mspBufferFill;
+	self._waBufferFill	= waBufferFill;
+
+}, {
+	ready: false,
+
+	initMSP: function (e) {
+		this.channelCount	= e.audioChannels;
+		this.sampleRate		= e.audioSampleRate;
+		this.bufferSize		= e.audioLength * this.channelCount;
+		this.ready		= true;
+		this.emit('ready', []);
+	},
+
+	initWA: function (e) {
+		var b = e.outputBuffer;
+		this.channelCount	= b.numberOfChannels;
+		this.sampleRate		= b.sampleRate;
+		this.bufferSize		= b.length * this.channelCount;
+		this.ready		= true;
+		this.emit('ready', []);
+	}
+});
+
+}(this.Sink));
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/utils/buffer-management.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/utils/buffer-management.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/utils/buffer-management.js	(revision 28388)
@@ -0,0 +1,195 @@
+(function (Sink) {
+
+/**
+ * Splits a sample buffer into those of different channels.
+ *
+ * @static Sink
+ * @name deinterleave
+ *
+ * @arg {Buffer} buffer The sample buffer to split.
+ * @arg {Number} channelCount The number of channels to split to.
+ *
+ * @return {Array} An array containing the resulting sample buffers.
+*/
+
+Sink.deinterleave = function (buffer, channelCount) {
+	var	l	= buffer.length,
+		size	= l / channelCount,
+		ret	= [],
+		i, n;
+	for (i=0; i<channelCount; i++){
+		ret[i] = new Float32Array(size);
+		for (n=0; n<size; n++){
+			ret[i][n] = buffer[n * channelCount + i];
+		}
+	}
+	return ret;
+};
+
+/**
+ * Joins an array of sample buffers into a single buffer.
+ *
+ * @static Sink
+ * @name resample
+ *
+ * @arg {Array} buffers The buffers to join.
+ * @arg {Number} !channelCount The number of channels. Defaults to buffers.length
+ * @arg {Buffer} !buffer The output buffer.
+ *
+ * @return {Buffer} The interleaved buffer created.
+*/
+
+Sink.interleave = function (buffers, channelCount, buffer) {
+	channelCount		= channelCount || buffers.length;
+	var	l		= buffers[0].length,
+		bufferCount	= buffers.length,
+		i, n;
+	buffer			= buffer || new Float32Array(l * channelCount);
+	for (i=0; i<bufferCount; i++) {
+		for (n=0; n<l; n++) {
+			buffer[i + n * channelCount] = buffers[i][n];
+		}
+	}
+	return buffer;
+};
+
+/**
+ * Mixes two or more buffers down to one.
+ *
+ * @static Sink
+ * @name mix
+ *
+ * @arg {Buffer} buffer The buffer to append the others to.
+ * @arg {Buffer} bufferX The buffers to append from.
+ *
+ * @return {Buffer} The mixed buffer.
+*/
+
+Sink.mix = function (buffer) {
+	var	buffers	= [].slice.call(arguments, 1),
+		l, i, c;
+	for (c=0; c<buffers.length; c++){
+		l = Math.max(buffer.length, buffers[c].length);
+		for (i=0; i<l; i++){
+			buffer[i] += buffers[c][i];
+		}
+	}
+	return buffer;
+};
+
+/**
+ * Resets a buffer to all zeroes.
+ *
+ * @static Sink
+ * @name resetBuffer
+ *
+ * @arg {Buffer} buffer The buffer to reset.
+ *
+ * @return {Buffer} The 0-reset buffer.
+*/
+
+Sink.resetBuffer = function (buffer) {
+	var	l	= buffer.length,
+		i;
+	for (i=0; i<l; i++){
+		buffer[i] = 0;
+	}
+	return buffer;
+};
+
+/**
+ * Copies the content of a buffer to another buffer.
+ *
+ * @static Sink
+ * @name clone
+ *
+ * @arg {Buffer} buffer The buffer to copy from.
+ * @arg {Buffer} !result The buffer to copy to.
+ *
+ * @return {Buffer} A clone of the buffer.
+*/
+
+Sink.clone = function (buffer, result) {
+	var	l	= buffer.length,
+		i;
+	result = result || new Float32Array(l);
+	for (i=0; i<l; i++){
+		result[i] = buffer[i];
+	}
+	return result;
+};
+
+/**
+ * Creates an array of buffers of the specified length and the specified count.
+ *
+ * @static Sink
+ * @name createDeinterleaved
+ *
+ * @arg {Number} length The length of a single channel.
+ * @arg {Number} channelCount The number of channels.
+ * @return {Array} The array of buffers.
+*/
+
+Sink.createDeinterleaved = function (length, channelCount) {
+	var	result	= new Array(channelCount),
+		i;
+	for (i=0; i<channelCount; i++){
+		result[i] = new Float32Array(length);
+	}
+	return result;
+};
+
+Sink.memcpy = function (src, srcOffset, dst, dstOffset, length) {
+	src	= src.subarray || src.slice ? src : src.buffer;
+	dst	= dst.subarray || dst.slice ? dst : dst.buffer;
+
+	src	= srcOffset ? src.subarray ?
+		src.subarray(srcOffset, length && srcOffset + length) :
+		src.slice(srcOffset, length && srcOffset + length) : src;
+
+	if (dst.set) {
+		dst.set(src, dstOffset);
+	} else {
+		for (var i=0; i<src.length; i++) {
+			dst[i + dstOffset] = src[i];
+		}
+	}
+
+	return dst;
+};
+
+Sink.memslice = function (buffer, offset, length) {
+	return buffer.subarray ? buffer.subarray(offset, length) : buffer.slice(offset, length);
+};
+
+Sink.mempad = function (buffer, out, offset) {
+	out = out.length ? out : new (buffer.constructor)(out);
+	Sink.memcpy(buffer, 0, out, offset);
+	return out;
+};
+
+Sink.linspace = function (start, end, out) {
+	var l, i, n, step;
+	out	= out.length ? (l=out.length) && out : Array(l=out);
+	step	= (end - start) / --l;
+	for (n=start+step, i=1; i<l; i++, n+=step) {
+		out[i] = n;
+	}
+	out[0]	= start;
+	out[l]	= end;
+	return out;
+};
+
+Sink.ftoi = function (input, bitCount, output) {
+	var i, mask = Math.pow(2, bitCount - 1);
+
+	output = output || new (input.constructor)(input.length);
+
+	for (i=0; i<input.length; i++) {
+		output[i] = ~~(mask * input[i]);
+	}
+
+	return output;
+};
+
+}(this.Sink));
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/utils/proxy.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/utils/proxy.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/utils/proxy.js	(revision 28388)
@@ -0,0 +1,71 @@
+(function (Sink) {
+
+function Proxy (bufferSize, channelCount) {
+	Sink.EventEmitter.call(this);
+
+	this.bufferSize		= isNaN(bufferSize) || bufferSize === null ? this.bufferSize : bufferSize;
+	this.channelCount	= isNaN(channelCount) || channelCount === null ? this.channelCount : channelCount;
+
+	var self = this;
+	this.callback = function () {
+		return self.process.apply(self, arguments);
+	};
+
+	this.resetBuffer();
+}
+
+Proxy.prototype = {
+	buffer: null,
+	zeroBuffer: null,
+	parentSink: null,
+	bufferSize: 4096,
+	channelCount: 2,
+	offset: null,
+
+	resetBuffer: function () {
+		this.buffer	= new Float32Array(this.bufferSize);
+		this.zeroBuffer	= new Float32Array(this.bufferSize);
+	},
+
+	process: function (buffer, channelCount) {
+		if (this.offset === null) {
+			this.loadBuffer();
+		}
+
+		for (var i=0; i<buffer.length; i++) {
+			if (this.offset >= this.buffer.length) {
+				this.loadBuffer();
+			}
+
+			buffer[i] = this.buffer[this.offset++];
+		}
+	},
+
+	loadBuffer: function () {
+		this.offset = 0;
+		Sink.memcpy(this.zeroBuffer, 0, this.buffer, 0);
+		this.emit('audioprocess', [this.buffer, this.channelCount]);
+	}
+};
+
+Sink.Proxy = Proxy;
+
+/**
+ * Creates a proxy callback system for the sink instance.
+ * Requires Sink utils.
+ *
+ * @method Sink
+ * @method createProxy
+ *
+ * @arg {Number} !bufferSize The buffer size for the proxy.
+*/
+Sink.prototype.createProxy = function (bufferSize) {
+	var	proxy		= new Sink.Proxy(bufferSize, this.channelCount);
+	proxy.parentSink	= this;
+
+	this.on('audioprocess', proxy.callback);
+
+	return proxy;
+};
+
+}(this.Sink));
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/utils/resample.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/utils/resample.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/utils/resample.js	(revision 28388)
@@ -0,0 +1,83 @@
+(function (Sink) {
+
+(function(){
+
+/**
+ * If method is supplied, adds a new interpolation method to Sink.interpolation, otherwise sets the default interpolation method (Sink.interpolate) to the specified property of Sink.interpolate.
+ *
+ * @arg {String} name The name of the interpolation method to get / set.
+ * @arg {Function} !method The interpolation method.
+*/
+
+function interpolation(name, method) {
+	if (name && method) {
+		interpolation[name] = method;
+	} else if (name && interpolation[name] instanceof Function) {
+		Sink.interpolate = interpolation[name];
+	}
+	return interpolation[name];
+}
+
+Sink.interpolation = interpolation;
+
+
+/**
+ * Interpolates a fractal part position in an array to a sample. (Linear interpolation)
+ *
+ * @param {Array} arr The sample buffer.
+ * @param {number} pos The position to interpolate from.
+ * @return {Float32} The interpolated sample.
+*/
+interpolation('linear', function (arr, pos) {
+	var	first	= Math.floor(pos),
+		second	= first + 1,
+		frac	= pos - first;
+	second		= second < arr.length ? second : 0;
+	return arr[first] * (1 - frac) + arr[second] * frac;
+});
+
+/**
+ * Interpolates a fractal part position in an array to a sample. (Nearest neighbour interpolation)
+ *
+ * @param {Array} arr The sample buffer.
+ * @param {number} pos The position to interpolate from.
+ * @return {Float32} The interpolated sample.
+*/
+interpolation('nearest', function (arr, pos) {
+	return pos >= arr.length - 0.5 ? arr[0] : arr[Math.round(pos)];
+});
+
+interpolation('linear');
+
+}());
+
+
+/**
+ * Resamples a sample buffer from a frequency to a frequency and / or from a sample rate to a sample rate.
+ *
+ * @static Sink
+ * @name resample
+ *
+ * @arg {Buffer} buffer The sample buffer to resample.
+ * @arg {Number} fromRate The original sample rate of the buffer, or if the last argument, the speed ratio to convert with.
+ * @arg {Number} fromFrequency The original frequency of the buffer, or if the last argument, used as toRate and the secondary comparison will not be made.
+ * @arg {Number} toRate The sample rate of the created buffer.
+ * @arg {Number} toFrequency The frequency of the created buffer.
+ *
+ * @return The new resampled buffer.
+*/
+Sink.resample	= function (buffer, fromRate /* or speed */, fromFrequency /* or toRate */, toRate, toFrequency) {
+	var
+		argc		= arguments.length,
+		speed		= argc === 2 ? fromRate : argc === 3 ? fromRate / fromFrequency : toRate / fromRate * toFrequency / fromFrequency,
+		l		= buffer.length,
+		length		= Math.ceil(l / speed),
+		newBuffer	= new Float32Array(length),
+		i, n;
+	for (i=0, n=0; i<l; i += speed) {
+		newBuffer[n++] = Sink.interpolate(buffer, i);
+	}
+	return newBuffer;
+};
+
+}(this.Sink));
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/callback.html
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/callback.html	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/callback.html	(revision 28388)
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<script src="../sink.js"></script>
+		<script>
+(function(){
+
+var	dev;
+
+window.onload	= function(){
+	dev	= Sink(function(buffer){
+		var i;
+		for (i=0; i<buffer.length; i++){
+			buffer[i] = (Math.random() - 0.5) * 0.5;
+		}
+	});
+
+	dev.on('error', function(e){
+		console.error(e);
+	});
+};
+
+}());
+
+		</script>
+	</head>
+	<body>
+	</body>
+</html>
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/deinterleaved.html
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/deinterleaved.html	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/deinterleaved.html	(revision 28388)
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<script src="../sink.js"></script>
+		<script>
+function SineWave(sampleRate, frequency){
+	var	phase	= 0,
+		pi2	= Math.PI * 2,
+		coEff	= frequency / sampleRate * .5;
+	return function(){
+		phase = (phase + coEff) % 1;
+		return Math.sin(phase * pi2);
+	};
+}
+
+(function(){
+
+var	dev, oscs;
+x = 0;
+
+function fillCall(buffers, channelCount){
+	var i, n;
+	for (i=0; i<channelCount; i++){
+		for (n=0; n<buffers[i].length; n++){
+			buffers[i][n] = oscs[i]() * 0.3;
+		}
+	}
+}
+
+window.onload	= function(){
+	dev	= Sink(fillCall);
+	dev.channelMode = 'deinterleaved';
+	oscs	= [SineWave(dev.sampleRate, 440), SineWave(dev.sampleRate, 660)];
+
+	dev.on('error', function(e){
+		console.error(e);
+	});
+};
+
+window.sync	= function(){
+	dev.writeBufferSync(noise);
+};
+
+window.async	= function(){
+	dev.writeBufferAsync(noise, +document.getElementById('d').value);
+};
+
+}());
+
+		</script>
+	</head>
+	<body>
+	</body>
+</html>
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/events.html
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/events.html	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/events.html	(revision 28388)
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<script src="../sink.js"></script>
+		<script>
+(function(){
+
+var	dev, callbacks, occured, died, firedBeforeReady;
+
+window.onload	= function(){
+	dev	= Sink();
+
+	callbacks = [440, 660, 880].map(function (frequency) {
+		var p = 0;
+
+		function callback (buffer, channelCount) {
+			if (died) {
+				died = false;
+				console.error('kill() not working');
+			}
+
+			if (!firedBeforeReady && !this.isReady) {
+				firedBeforeReady = true;
+				console.error('fired before ready');
+			}
+
+			var i, n;
+
+			for (i=0; i<buffer.length; i+=channelCount) {
+				p = (p + frequency / dev.sampleRate / 2) % 1;
+				for (n=0; n<channelCount; n++) {
+					buffer[i+n] += Math.sin(p * Math.PI * 2) * 0.2;
+				}
+			}
+		}
+
+		dev.on('audioprocess', callback);
+		return callback;
+	});
+
+	setTimeout(function () {
+		dev.off('audioprocess', callbacks[1]);
+		dev.off('audioprocess', callbacks[2]);
+	}, 2000);
+
+	setTimeout(function () {
+		dev.kill();
+	}, 5000);
+
+	dev.on('kill', function () {
+		died = true;
+		console.log('It died');
+	});
+
+	dev.on('ready', function () {
+		if (occured) {
+			console.error('ready event broken');
+		} else {
+			occured = true;
+			console.log('It is ready');
+		}
+	});
+
+	dev.on('error', function (e) {
+		console.error(e);
+	});
+};
+
+}());
+
+		</script>
+	</head>
+	<body>
+	</body>
+</html>
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/inlineworker.html
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/inlineworker.html	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/inlineworker.html	(revision 28388)
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<script src="../sink.js"></script>
+		</script>
+	</head>
+	<body>
+		<script>
+(function(){
+
+function result () {
+	if (Sink.inlineWorker.working) {
+		console.log('It works');
+		console.log('Worker type: ' + Sink.inlineWorker.type);
+	} else {
+		console.log('It doesn\'t work.');
+	}
+}
+
+Sink.inlineWorker.ready ? result() : Sink.inlineWorker.on('ready', result);
+
+}());
+
+</script>
+
+	</body>
+</html>
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/node-test.js
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/node-test.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/node-test.js	(revision 28388)
@@ -0,0 +1,27 @@
+var Sink = require('../sink').Sink;
+
+function SineWave (sampleRate, frequency) {
+	var phase = 0;
+	var pi2 = Math.PI * 2;
+	var coEff = frequency / sampleRate * 0.5;
+	return function () {
+		phase = (phase + coEff) % 1;
+		return Math.sin(phase * pi2);
+	};
+}
+
+var oscs;
+var dev = Sink(function (buffer, channelCount) {
+	console.log('Filling data...');
+	for (var i=0; i<buffer.length; i+=channelCount) {
+		for (var n=0; n<channelCount; n++) {
+			buffer[i+n] = oscs[n]()
+		}
+	}
+});
+
+oscs = [SineWave(dev.sampleRate, 440), SineWave(dev.sampleRate, 660)];
+
+setInterval(function () {
+	console.log(dev.sampleRate)
+}, 10000);
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/proxy.html
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/proxy.html	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/proxy.html	(revision 28388)
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+	<head>
+		<script src="../../script/require.js"></script>
+		<script src="../sink.js"></script>
+		<script>
+(function(){
+
+var	bufferSize	= 4096,
+	iterations	= 0,
+	maxIterations	= 10,
+	test		= null,
+	dev, proxy;
+
+window.onload	= function(){
+	dev	= Sink();
+	proxy	= dev.createProxy()
+	proxy.on('audioprocess', function callback(buffer){
+		if (test !== null) {
+			dev.kill();
+			return;
+		}
+
+		if (buffer.length === bufferSize) {
+			if (iterations++ > 10) {
+				test = true;
+			}
+		} else {
+			test = false;
+		}
+
+		test !== null && console.error(test ? 'Test succesful' : 'Test failed');
+
+		for (var i=0; i<buffer.length; i++){
+			buffer[i] = (Math.random() - 0.5) * 0.5;
+		}
+	});
+
+	dev.on('error', function(e){
+		console.error(e);
+	});
+};
+
+}());
+
+		</script>
+	</head>
+	<body>
+	</body>
+</html>
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/ringbuffer.html
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/ringbuffer.html	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/ringbuffer.html	(revision 28388)
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<script src="../sink.js"></script>
+		<script>
+(function(){
+
+var	noise	= new Float32Array(100000),
+	dev;
+
+for (dev=0; dev<noise.length; dev+=2){
+	noise[dev] = noise[dev+1] = Math.random() * 0.3;
+}
+
+window.onload	= function(){
+	dev	= Sink();
+	dev.ringBuffer = noise;
+
+	dev.on('error', function(e){
+		console.error(e);
+	});
+};
+
+}());
+
+		</script>
+	</head>
+	<body>
+	</body>
+</html>
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/singleton.html
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/singleton.html	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/singleton.html	(revision 28388)
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<script src="../sink.js"></script>
+		<script>
+(function(){
+
+var sampleRate, phase = 0, lfo = 0, lfo2 = 0;
+
+window.onload	= function(){
+	Sink.singleton().on('audioprocess', function(buffer, channelCount){
+		var i, n;
+		for (i=0; i<buffer.length; i+=channelCount){
+			phase = (phase + 440 / sampleRate / 2) % 1;
+			for (n=0; n<channelCount; n++){
+				buffer[i+n] += Math.sin(phase * Math.PI * 2) * 0.5;
+			}
+		}
+	});
+
+	Sink.singleton().on('audioprocess', function(buffer, channelCount){
+		var i, n;
+		for (i=0; i<buffer.length; i+=channelCount){
+			lfo2 = (lfo2 + 0.1 / sampleRate / 2) % 1;
+			lfo = (lfo + (Math.sin(lfo2 * Math.PI * 2) + 2) * 111 / sampleRate / 2) % 1;
+			for (n=0; n<channelCount; n++){
+				buffer[i+n] *= Math.sin(lfo * Math.PI * 2);
+			}
+		}
+	});
+
+	sampleRate = Sink.singleton().sampleRate;
+
+	Sink.singleton().on('error', function(e){
+		console.error(e);
+	});
+};
+
+}());
+
+		</script>
+	</head>
+	<body>
+	</body>
+</html>
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/wav.html
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/wav.html	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/wav.html	(revision 28388)
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<script src="pcmdata.js"></script>
+		<script src="../sink.js"></script>
+		<script>
+(function(){
+
+var sampleRate, phase = 0, lfo = 0, lfo2 = 0, sink;
+
+window.onload	= function () {
+	sink = new Sink.sinks.wav();
+
+	if (!sink.type === 'wav') return console.error('Not an instance of the WAV sink.');
+
+	sink.on('audioprocess', function (buffer, channelCount) {
+		var i, n;
+		for (i=0; i<buffer.length; i+=channelCount) {
+			phase = (phase + 440 / sampleRate / 2) % 1;
+			for (n=0; n<channelCount; n++) {
+				buffer[i+n] += Math.sin(phase * Math.PI * 2) * 0.5;
+			}
+		}
+	});
+
+	sink.on('audioprocess', function (buffer, channelCount) {
+		var i, n;
+		for (i=0; i<buffer.length; i+=channelCount) {
+			lfo2 = (lfo2 + 0.1 / sampleRate / 2) % 1;
+			lfo = (lfo + (Math.sin(lfo2 * Math.PI * 2) + 2) * 111 / sampleRate / 2) % 1;
+			for (n=0; n<channelCount; n++) {
+				buffer[i+n] *= Math.sin(lfo * Math.PI * 2);
+			}
+		}
+	});
+
+	sampleRate = Sink.singleton().sampleRate;
+
+	sink.on('error', function(e){
+		console.error(e);
+	});
+};
+
+}());
+
+		</script>
+	</head>
+	<body>
+	</body>
+</html>
Index: /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/write.html
===================================================================
--- /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/write.html	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/js-mad/sink.js-master/tests/write.html	(revision 28388)
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<script src="../sink-light.js"></script>
+		<script>
+(function(){
+
+var	noise	= new Float32Array(100000),
+	dev;
+
+for (dev=0; dev<noise.length; dev+=2){
+	noise[dev] = noise[dev+1] = Math.random() * 0.3;
+}
+
+window.onload	= function(){
+	dev	= Sink();
+
+	dev.on('error', function(e){
+		console.error(e);
+	});
+};
+
+window.sync	= function(){
+	dev.writeBufferSync(noise);
+};
+
+window.async	= function(){
+	dev.writeBufferAsync(noise, +document.getElementById('d').value);
+};
+
+}());
+
+		</script>
+	</head>
+	<body>
+		<button onclick="async()">Async</button> <input id="d" placeholder="Async delay"> <br/>
+		<button onclick="sync()">Sync</button>
+	</body>
+</html>
Index: /gs3-extensions/web-audio/trunk/sound-manager2/css/demo.css
===================================================================
--- /gs3-extensions/web-audio/trunk/sound-manager2/css/demo.css	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/sound-manager2/css/demo.css	(revision 28388)
@@ -0,0 +1,124 @@
+/* 
+ -----------------------------------------------------------------
+ In-page demo CSS for code, documentation etc.
+ See page-player.css for actual playlist-relevant stuff.
+ -----------------------------------------------------------------
+ */
+
+#soundmanager-debug {
+ /* SM2 debug container (optional, makes debug more useable) */
+ position:absolute;position:fixed;*position:absolute;bottom:10px;right:10px;width:50em;height:18em;overflow:auto;background:#fff;margin:1em;padding:1em;border:1px solid #999;font-family:"lucida console",verdana,tahoma,"sans serif";font-size:x-small;line-height:1.5em;opacity:0.9;filter:alpha(opacity=90);z-index:99;
+}
+
+body {
+ font:75% normal verdana,arial,tahoma,"sans serif";
+}
+
+h1, h2, h3 {
+ font:300 3em "Helvetica Neue",georgia,"times new roman","Arial Rounded MT Bold",helvetica,verdana,tahoma,arial,"sans serif";
+ margin-bottom:0px;
+}
+
+h1, h2 {
+ letter-spacing:-1px; /* zomg web x.0! ;) */ 
+}
+
+h1, h2, h3 {
+ float:left;
+ clear:both;
+ border-bottom:1px solid #999;
+ padding-bottom:1px;
+ margin-bottom:0.25em;
+}
+
+h1 {
+ margin-top:0px;
+ margin-bottom:0px;
+ background-color:#666;
+ color:#ccc;
+ margin-left:-5px;
+ padding-left:5px;
+ padding-right:5px;
+}
+
+h1,
+h1 a {
+ color:#fff;
+ text-decoration:none;
+}
+
+h1 a:hover {
+ text-decoration:underline;
+}
+
+h2 {
+ font-size:2em;
+ margin-top:1em;
+ background-color:#aaa;
+ color:#fff;
+ padding:5px;
+ margin-left:-5px;
+ min-width:23em;
+}
+
+h3 {
+ font-size:1.65em;
+ margin-top:0.5em;
+ margin-bottom:0.25em;
+ color:#333;
+ min-width:28em;
+}
+
+h3 a {
+ font-size:small;
+}
+
+h4 {
+ color:#444;
+}
+
+ul.notes {
+ margin-left:0px;
+ padding-left:1.5em;
+}
+
+.note {
+ margin-top:0px;
+ font-style:italic;
+ color:#999;
+}
+
+pre {
+ font-size:1.2em;
+ _font-size:1em;
+}
+
+code {
+ font-family:"lucida console",monaco,courier,system;
+ font-size:1em;
+ color:#003366;
+}
+
+code span {
+ color:#666;
+}
+
+ul,
+p,
+pre {
+ clear:left;
+ max-width:46em;
+}
+
+ul.tight li {
+ max-width:44.5em;
+}
+
+ul.playlist {
+ /* undo the above nonsense */
+ max-width:none;
+}
+
+ul.tight {
+ padding-left:1.5em;
+}
Index: /gs3-extensions/web-audio/trunk/sound-manager2/css/flashblock.css
===================================================================
--- /gs3-extensions/web-audio/trunk/sound-manager2/css/flashblock.css	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/sound-manager2/css/flashblock.css	(revision 28388)
@@ -0,0 +1,129 @@
+/*
+ * SoundManager 2 + useFlashBlock
+ * Flash positioning and flashblock / clicktoflash handling
+*/
+
+#sm2-container {
+ /*
+  * where the SM2 flash movie goes. by default, relative container.
+  * set relative or absolute here, and don't touch it later or bad things will happen (see below comments.)
+ */
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ overflow: hidden;
+ /* screw IE 6, just make it display nice */
+ _overflow: hidden;
+}
+
+#sm2-container object,
+#sm2-container embed {
+ /*
+  * the actual SWF movie bit.
+  * important: The SWF needs to be able to be moved off-screen without display: or position: changes.
+  * changing display: or position: or overflow: here or on parent can cause SWF reload or other weird issues after unblock
+  * e.g., SM2 starts but strange errors, no whileplaying() etc.
+ */
+ width: 48px;
+ height: 48px;
+ /* some flash blockers may also respect this rule */
+ max-width: 48px;
+ max-height: 48px;
+}
+
+#sm2-container.swf_timedout {
+ /* expand to show the timed-out SWF content */
+ position: relative;
+ width: 48px;
+ height: 48px;
+}
+
+#sm2-container.swf_timedout,
+#sm2-container.swf_timedout object,
+#sm2-container.swf_timedout embed {
+ /* 
+  * when SM2 didn't start normally, time-out case. flash blocked, missing SWF, no flash?
+  * 48px square flash placeholder is typically used by blockers.
+ */
+ min-width: 48px;
+ min-height: 48px;
+}
+
+#sm2-container.swf_unblocked {
+ /* SWF unblocked, or was never blocked to begin with; try to collapse container as much as possible. */
+ width: 1px;
+ height: 1px;
+}
+
+#sm2-container.swf_loaded object,
+#sm2-container.swf_loaded embed,
+#sm2-container.swf_unblocked object,
+#sm2-container.swf_unblocked embed {
+ /* hide flash off-screen (relative to container) when it has loaded OK */
+ left: -9999em;
+ top: -9999em;
+}
+
+#sm2-container.swf_error {
+ /* when there is a fatal error (flash loaded, but SM2 failed) */
+ display: none;
+}
+
+#sm2-container.high_performance,
+#sm2-container.high_performance.swf_timeout {
+ /* "high performance" case: keep on-screen at all times */
+ position: absolute;
+ position: fixed;
+}
+
+#sm2-container.high_performance {
+ overflow: hidden;
+ _top: -9999px; /* IE 6 hax, no position:fixed */
+ _left: -9999px;
+ bottom: 0px;
+ left: 0px;
+ /*
+  * special case: show at first with w/h, hide when unblocked.
+  * might be bad/annoying.
+  * try to stay within ClickToFlash "invisible" limits (so it won't be blocked.)
+ */
+ z-index: 99; /* try to stay on top */
+}
+
+#sm2-container.high_performance.swf_loaded,
+#sm2-container.high_performance.swf_unblocked {
+ z-index: auto;
+}
+
+#sm2-container.high_performance.swf_loaded,
+#sm2-container.high_performance.swf_unblocked,
+#sm2-container.high_performance.swf_unblocked object,
+#sm2-container.high_performance.swf_unblocked embed {
+ /*
+  * 8x8px is required minimum to load in fx/win32 in some cases(?)
+  * 6x6+ good for fast performance, even better when on-screen via position:fixed
+  * also, clickToFlash (Safari <5.1) may auto-load "invisible" SWFs at this size
+ */
+ height: 8px;
+ width: 8px;
+}
+
+#sm2-container.high_performance.swf_loaded {
+ /* stay bottom/left */
+ top: auto;
+ bottom: 0px;
+ left: 0px;
+}
+
+#sm2-container.high_performance.swf_loaded object,
+#sm2-container.high_performance.swf_loaded embed,
+#sm2-container.high_performance.swf_unblocked object,
+#sm2-container.high_performance.swf_unblocked embed {
+ /* high-performance case must stay on-screen */
+ left: auto;
+ top: auto;
+}
+
+#sm2-container.high_performance.swf_timedout {
+ z-index: 99; /* try to stay on top */
+}
Index: /gs3-extensions/web-audio/trunk/sound-manager2/css/optional-annotations.css
===================================================================
--- /gs3-extensions/web-audio/trunk/sound-manager2/css/optional-annotations.css	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/sound-manager2/css/optional-annotations.css	(revision 28388)
@@ -0,0 +1,168 @@
+/*
+ ------------------------------------------
+ -- annotations (sub-tracks, notes etc.) --
+ ------------------------------------------
+*/
+
+ul.playlist li a.sm2_link .metadata {
+ display:none; /* hide by default */
+}
+
+ul.playlist li.sm2_paused a.sm2_link .metadata,
+ul.playlist li.sm2_playing a.sm2_link .metadata {
+ display:inline;
+}
+
+ul.playlist li ul {
+ list-style-type:none;
+ margin:0px;
+ padding:0px;
+ position:relative;
+ font-size:small;
+ display:none;
+}
+
+ul.playlist li ul li {
+ position:relative;
+ margin:0px;
+ padding:2px 3px;
+ border:1px solid transparent;
+ -moz-border-radius:6px;
+ -khtml-border-radius:6px;
+ border-radius:6px;
+ margin-right:1em;
+ font-family:helvetica,verdana,tahoma,arial,"sans serif";
+ font-size:x-small;
+ font-weight:300;
+ letter-spacing:0px;
+ background-color:transparent;
+ opacity:0.66;
+}
+
+ul.playlist li ul li:hover {
+ opacity:1;
+ background-color:#fff;
+ border-color:#ccc;
+ color:#666;
+}
+
+ul.playlist li.sm2_playing ul li,
+ul.playlist li.sm2_paused ul li {
+ color:#fff;
+}
+
+ul.playlist li.sm2_playing ul li:hover {
+ background-color:#fff;
+ color:#5588bb;
+ border-color:#336699;
+ opacity:0.9;
+}
+
+ul.playlist li.sm2_paused ul li:hover {
+ background-color:#888;
+}
+
+/* metadata */
+
+ul.playlist li .metadata .duration {
+ /* optional timing data */
+ display:none;
+}
+
+ul.playlist li .metadata ul li p {
+ margin:0px;
+ padding:0px;
+}
+
+ul.playlist li .metadata ul li span {
+ display:none;
+}
+
+ul.playlist li .controls .statusbar .annotation {
+ position:absolute;
+ background-color:transparent;
+ top:0px;
+ color:#666;
+ text-align:right;
+ margin-left:10px;
+ height:0.5em;
+}
+
+ul.playlist li .controls .statusbar .annotation:hover {
+ z-index:12; /* sit on top of note */
+}
+
+ul.playlist li .controls .statusbar .annotation span.bubble {
+ /* using &middot; */
+ display:inline-block;
+ background-color:#fff;
+ border:1px solid #666;
+ border-radius:6px;
+ -moz-border-radius:6px;
+ -webkit-border-radius:6px;
+}
+
+ul.playlist li .controls .statusbar .annotation span {
+ display:block;
+ background:transparent url(../image/divot.png) no-repeat 50% 0px;
+ width:15px;
+ margin-left:-15px;
+ height:12px;
+ text-align:center;
+}
+
+ul.playlist li .controls .statusbar .annotation.alt {
+ top:auto;
+ bottom:0px;
+}
+
+ul.playlist li .controls .statusbar .annotation span:hover {
+ cursor:none; /* Fx3 rules. */
+ margin-top:0.1em;
+}
+
+ul.playlist li .controls .statusbar .annotation.alt span:hover {
+ margin-top:-0.1em;
+}
+
+ul.playlist li .controls .statusbar .annotation.alt span {
+ background:transparent url(../image/divot-bottom.png) no-repeat 50% bottom;
+}
+
+ul.playlist li .note {
+ position:absolute;
+ display:none;
+ left:0px;
+ top:0px;
+ z-index:10;
+ font-size:x-small;
+ padding:2px 4px 2px 4px;
+ width:auto;
+ color:#666;
+ background-color:#fff;
+ border:1px solid #ccc;
+ border-radius:6px;
+ -moz-border-radius:6px;
+ -webkit-border-radius:6px;
+ font-style:normal;
+ font-weight:bold;
+ font-family:arial,tahoma,verdana,"sans serif";
+ letter-spacing:0px;
+ margin-top:1.1em;
+}
+
+ul.playlist li .note.alt {
+ margin-top:-1.32em;
+}
+
+ul.playlist li .note:hover {
+ display:block !important;
+}
+
+ul.playlist li .sm2_divider {
+ font-size:0.75em;
+}
+
+ul.playlist li .sm2_metadata {
+ font-size:0.65em;
+}
Index: /gs3-extensions/web-audio/trunk/sound-manager2/css/optional-themes.css
===================================================================
--- /gs3-extensions/web-audio/trunk/sound-manager2/css/optional-themes.css	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/sound-manager2/css/optional-themes.css	(revision 28388)
@@ -0,0 +1,206 @@
+/* 
+ ---------------------------------
+ -- alternate (optional) themes --
+ ---------------------------------
+*/
+
+ul.playlist.dark li.sm2_playing a {
+ color:#fff;
+}
+
+ul.playlist.dark li.sm2_playing .timing,
+ul.playlist.use-peak.dark li.sm2_playing .peak {
+ color:#999;
+}
+
+ul.playlist.use-spectrum.dark li.sm2_playing .spectrum-container {
+ background-color:#222;
+ border-color:#444;
+}
+
+ul.playlist.use-spectrum.dark li.sm2_playing .spectrum-container .spectrum {
+ background-color:#999;
+}
+
+ul.playlist.dark li.sm2_paused {
+ background-color:#333;
+}
+
+ul.playlist.dark li.sm2_paused a {
+ color:#999;
+}
+
+ul.playlist.dark li.sm2_playing,
+ul.playlist.dark li.sm2_playing:hover {
+ background-color:#333;
+}
+
+ul.playlist.dark li:hover .controls .statusbar {
+ background-color:#666;
+}
+
+ul.playlist.dark li .controls {
+ background-color:#333;
+}
+
+ul.playlist.dark li .controls .statusbar {
+ background-color:#666;
+ border-color:#444;
+}
+
+ul.playlist.dark li .controls .statusbar .position {
+ background-color:#111;
+ border-right:3px solid #111;
+ border-radius:3px;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+}
+
+ul.playlist.dark li .controls .statusbar .loading {
+ background-color:#444;
+}
+
+ul.playlist.dark li .timing,
+ul.playlist.use-peak.dark li .peak {
+ background-color:#222;
+ border-color:#444;
+}
+
+ul.playlist.dark.use-peak li .peak .l,
+ul.playlist.dark.use-peak li .peak .r {
+ border-color:#444;
+ background-color:#999;
+}
+
+
+/* gold theme */
+
+ul.playlist.gold li.sm2_paused {
+ background-color:#996600;
+}
+
+ul.playlist.gold li.sm2_playing,
+ul.playlist.gold li.sm2_playing:hover {
+ background-color:#cc9900;
+}
+
+ul.playlist.gold li .controls {
+ background-color:transparent;
+}
+
+ul.playlist.gold li .controls .statusbar {
+ background-color:#fff;
+ border-color:#fff;
+}
+
+ul.playlist.gold li .controls .statusbar .position {
+ background-color:#996600;
+ border-right:3px solid #996600;
+ border-radius:3px;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+}
+
+ul.playlist.gold li .controls .statusbar .loading {
+ background-color:#ffeedd;
+}
+
+ul.playlist.gold li .timing,
+ul.playlist.use-peak.gold li .peak {
+ background-color:#CC9900;
+ border-color:#ffcc33;
+}
+
+ul.playlist.use-spectrum.gold li.sm2_playing .spectrum-container {
+ background-color:#cc9900;
+ border-color:#ffcc33;
+}
+
+ul.playlist.use-spectrum.gold li.sm2_playing .spectrum-container .spectrum {
+ background-color:#fff;
+}
+
+ul.playlist.gold.use-peak li .peak .l,
+ul.playlist.gold.use-peak li .peak .r {
+ border-color:#fff;
+ background-color:#fff;
+}
+
+
+/* ZOMG PONIES!!!ONEONEONE */
+
+ul.playlist.bubblegum li a {
+ font-family:"comic sans ms",verdana,arial,tahoma,"sans serif"; /* heh */
+}
+
+ul.playlist.bubblegum li.sm2_paused,
+ul.playlist.bubblegum li.sm2_paused:hover {
+ background-color:#ffccee;
+}
+
+ul.playlist.bubblegum li.sm2_paused a,
+ul.playlist.bubblegum li.sm2_paused:hover a,
+ul.playlist.bubblegum li.sm2_paused .timing,
+ul.playlist.use-peak.bubblegum li.sm2_paused .peak {
+ color:#ff6699;
+}
+
+ul.playlist.bubblegum li:hover {
+ background-color:#ffddee;
+}
+
+ul.playlist.bubblegum li.sm2_playing,
+ul.playlist.bubblegum li.sm2_playing:hover {
+ background-color:#ff7799;
+}
+
+ul.playlist.bubblegum li .controls {
+ background-color:transparent;
+}
+
+ul.playlist.bubblegum li .controls .statusbar {
+ background-color:#fff;
+ border-color:#fff;
+}
+
+ul.playlist.bubblegum li .controls .statusbar .position {
+ background-color:#ffaacc;
+ border-right:3px solid #ffaacc;
+ border-radius:3px;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+}
+
+ul.playlist.bubblegum li .controls .statusbar .loading {
+ background-color:#ffeedd;
+}
+
+ul.playlist.bubblegum li .timing,
+ul.playlist.use-peak.bubblegum li .peak {
+ background-color:#ffaacc;
+ border-color:#ffccee;
+}
+
+ul.playlist.use-spectrum.bubblegum li.sm2_playing .spectrum-container {
+ background-color:#ffaacc;
+ border-color:#ffccee;
+}
+
+ul.playlist.use-spectrum.bubblegum li.sm2_playing .spectrum-container .spectrum {
+ background-color:#fff;
+}
+
+ul.playlist.bubblegum.use-peak li .peak .l,
+ul.playlist.bubblegum.use-peak li .peak .r {
+ border-color:#fff;
+ background-color:#fff;
+}
+
+
+ul.playlist.shiny li.sm2_paused,
+ul.playlist.shiny li.sm2_playing {
+ background-image:url(../image/top-highlight.png);
+ background-repeat:repeat-x;
+ background-position:0px -1px;
+ _background-image:none; /* can't be bothered with IE 6. */
+}
Index: /gs3-extensions/web-audio/trunk/sound-manager2/css/page-player.css
===================================================================
--- /gs3-extensions/web-audio/trunk/sound-manager2/css/page-player.css	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/sound-manager2/css/page-player.css	(revision 28388)
@@ -0,0 +1,346 @@
+/*
+
+ SoundManager 2: "page as playlist" example
+ ------------------------------------------
+ http://schillmania.com/projects/soundmanager2/
+
+*/
+
+li.rounded {
+  border-radius: 15px;
+}
+
+
+div.divbuttonon {
+  background-color: #008000;
+  color: white;
+}
+
+div.divbuttonoff {
+  background-color: white;
+  color: black;
+}
+
+span.spanbuttonon {
+  background-color: #008000;
+  color: white;
+}
+
+span.spanbuttonoff {
+  background-color: white;
+  color: black;
+}
+
+
+.spectrum-container {
+ display:none;
+}
+
+ul.use-spectrum li.sm2_playing .spectrum-container {
+ position:absolute;
+ left:0px;
+ top:0px;
+ margin-left:-266px;
+ margin-top:-1px;
+ display:block;
+ background-color:#88bb55;
+ border:1px solid #ccff99;
+ -moz-border-radius:4px;
+ -webkit-border-radius:4px;
+ border-radius:4px;
+}
+
+ul.use-spectrum .spectrum-box {
+ position:relative;
+ width:255px;
+ font-size:1em;
+ padding:2px 0px;
+ height:1.2em;
+ overflow:hidden;
+}
+
+ul.use-spectrum .spectrum-box .spectrum {
+ position:absolute;
+ left:0px;
+ top:-2px;
+ margin-top:20px;
+ display:block;
+ font-size:1px;
+ width:1px;
+ height:1px; /* set to 50px for a thick line, 1px for a thin line, etc. */
+ overflow:hidden;
+ background-color:#fff;
+}
+
+ul.playlist {
+ list-style-type:none;
+ margin:0px;
+ padding:0px;
+
+}
+
+ul.playlist li {
+ /* assume all items will be sounds rather than wait for onload etc. in this example.. may differ for your uses. */
+ position:relative;
+ display:block;
+ width:auto;
+ font-size:1.2em;
+ color:#666;
+ padding:0.25em 0.5em 0.25em 0.5em;
+ border:none;
+ letter-spacing:-1px; /* ZOMG WEB X.0. ;) */
+ background-color:#007900;
+ -webkit-transition-property: hover;
+ -webkit-transition: background-color 0.15s ease-in-out;
+ -moz-transition: background-color 0.15s linear 0s; /* firefox 4 */
+  -o-transition-property: background-color; /* opera 10.5 */
+  -o-transition-duration: 0.15s;
+
+}
+
+ul.playlist li a {
+ display:block;
+ text-decoration:none;
+ font-weight:normal;
+ color:#fff;
+ font-size:100%;
+ outline:none;
+ position:relative;
+ z-index:2;
+}
+
+ul.playlist li.sm2_playing,
+ul.playlist li.sm2_paused,
+ul.playlist li.sm2_playing a {
+ color:#fff;
+ border-radius:3px;
+ -webkit-border-radius:3px;
+ -moz-border-radius:3px;
+}
+
+ul.playlist li:hover {
+ background-color:#00aa00;
+}
+
+ul.playlist li:hover a {
+ color:#fff;
+}
+
+ul.playlist li.sm2_playing,
+ul.playlist li.sm2_playing:hover {
+ background-color:#99cc66;
+}
+
+ul.playlist li.sm2_paused {
+ background-color:#a55;
+}
+
+ul.playlist li.sm2_playing:hover a,
+ul.playlist li.sm2_paused a {
+ color:#fff;
+}
+
+ul.playlist li .controls {
+ display:none;
+}
+
+ul.playlist li .peak,
+ul.playlist.use-peak li .peak {
+ display:none;
+ position:absolute;
+ top:0.55em;
+ right:0.5em;
+}
+
+ul.playlist li.sm2_playing .controls,
+ul.playlist li.sm2_paused .controls {
+ position:relative;
+ display:block;
+}
+
+ul.playlist.use-peak li.sm2_playing .peak,
+ul.playlist.use-peak li.sm2_paused .peak {
+ display:inline;
+ display:inline-block;
+}
+
+ul.playlist.use-peak li .peak {
+ display:none; /* IE 7 */
+}
+
+ul.playlist li.sm2_paused .controls {
+ background-color:#a88;
+}
+
+ul.playlist li:hover .controls .statusbar {
+ position:relative;
+ cursor:ew-resize;
+ cursor:-moz-grab;
+ cursor:grab;
+}
+
+ul.playlist li.sm2_paused .controls .statusbar {
+ background-color:#fcc;
+}
+
+ul.playlist li .controls {
+ position:relative;
+ margin-top:0.25em;
+ margin-bottom:0.25em;
+ background-color:#ccff99;
+}
+
+ul.playlist li .controls .statusbar {
+ position:relative;
+ height:0.5em;
+ background-color:#ddffcc;
+ border:2px solid #fff;
+ border-radius:2px;
+ -moz-border-radius:2px;
+ -webkit-border-radius:2px;
+ overflow:hidden;
+ cursor:-moz-grab;
+ cursor:grab;
+}
+
+ul.playlist li .controls.dragging .statusbar {
+ cursor:-moz-grabbing;
+ cursor:grabbing;
+}
+
+ul.playlist li .controls .statusbar .position,
+ul.playlist li .controls .statusbar .loading,
+ul.playlist li .controls .statusbar .annotation {
+ position:absolute;
+ left:0px;
+ top:0px;
+ height:0.5em;
+}
+
+ul.playlist li .controls .statusbar .position {
+ background-color:#669933;
+ border-right:3px solid #669933;
+ border-radius:3px;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+}
+
+ul.playlist li.sm2_paused .controls .statusbar .position {
+ background-color:#a88;
+ border-color:#a88;
+}
+
+ul.playlist li .controls .statusbar .loading {
+ background-color:#eee;
+}
+
+ul.playlist li .controls .statusbar .position,
+ul.playlist li .controls .statusbar .loading {
+ width:0px;
+}
+
+ul.playlist li.sm2_playing a.sm2_link,
+ul.playlist li.sm2_paused a.sm2_link {
+ margin-right:4.5em; /* room for timing stuff */
+}
+
+ul.playlist li .timing {
+ position:absolute;
+ display:none;
+ text-align:right;
+ right:1em;
+ top:1em;
+ width:auto;
+ height:1em;
+ padding:3px 5px;
+ background-color:#88bb55;
+ border:1px solid #ccff99;
+ -moz-border-radius:4px;
+ -khtml-border-radius:4px;
+ border-radius:4px;
+ letter-spacing:0px;
+ font:44% monaco,"VT-100","lucida console",courier,system;
+ line-height:1em;
+ vertical-align:middle;
+}
+
+ul.playlist.use-peak li .timing {
+ right:4.25em;
+}
+
+ul.playlist li:hover .timing {
+ z-index:2;
+}
+
+ul.playlist li .timing div.sm2_timing {
+ margin:0px;
+ padding:0px;
+ margin-top:-1em;
+}
+
+ul.playlist li.sm2_playing .timing,
+ul.playlist li.sm2_paused .timing {
+ display:block;
+}
+
+ul.playlist li.sm2_paused .timing .sm2_position {
+ text-decoration:blink; /* hee hee. first actual appropriate use? :D */
+}
+
+ul.playlist li.sm2_paused .timing,
+ul.playlist.use-peak li.sm2_paused .peak {
+ background-color:#caa;
+ border-color:#fcc;
+}
+
+/* peak data */
+
+/* ul.playlist ... */
+
+ul.playlist.use-peak li .peak {
+ display:none;
+ zoom:1;
+ border:1px solid #ccff99;
+ padding:2px;
+ height:0.55em;
+ -moz-border-radius:4px;
+ -khtml-border-radius:4px;
+ border-radius:4px;
+ background-color:#88bb55;
+ width:0.8em;
+ height:0.55em;
+ margin-top:-3px;
+}
+
+ul.playlist.use-peak li .peak-box {
+ position:relative;
+ width:100%;
+ height:0.55em;
+ overflow:hidden;
+}
+
+ul.playlist li .peak .l,
+ul.playlist li .peak .r {
+ position:absolute;
+ left:0px;
+ top:0px;
+ width:7px;
+ height:50px;
+ background:#fff;
+ border:1px solid #fff;
+ -moz-border-radius:1px;
+ -khtml-border-radius:1px;
+ margin-top:1em;
+}
+
+ul.playlist li .peak .l {
+ margin-right:1px;
+}
+
+ul.playlist li .peak .r {
+ left:10px;
+}
+
+#control-template {
+ display:none;
+}
Index: /gs3-extensions/web-audio/trunk/sound-manager2/script/optional-page-player-metadata.js
===================================================================
--- /gs3-extensions/web-audio/trunk/sound-manager2/script/optional-page-player-metadata.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/sound-manager2/script/optional-page-player-metadata.js	(revision 28388)
@@ -0,0 +1,142 @@
+// SoundManager 2: Page Player demo, MetaData UI prototype
+
+/*jslint white: false, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: false, bitwise: true, newcap: true, immed: true */
+/*global pagePlayer, document, window */
+
+var Metadata = function(oSound) {
+
+  var self = this,
+      pl = pagePlayer,
+      oLI = oSound._data.oLI,
+      o = oLI.getElementsByTagName('ul')[0],
+      oItems = o.getElementsByTagName('li'),
+      oTemplate = document.createElement('div'),
+      oTemplate2 = document.createElement('div'),
+      oTemplate3 = document.createElement('div'),
+      oDuration, i;
+
+  oTemplate.innerHTML = '<span>&nbsp;</span>';
+  oTemplate.className = 'annotation';
+  oTemplate2.innerHTML = '<span>&nbsp;</span>';
+  oTemplate2.className = 'annotation alt';
+  oTemplate3.className = 'note';
+
+  this.totalTime = 0;
+  this.data = [];
+  this.data.givenDuration = null;
+  this.data.currentItem = null;
+  this.data.mainTitle = oSound._data.oLink.innerHTML;
+
+  this.strToTime = function(sTime) {
+    var segments = sTime.split(':'),
+        seconds = 0, i;
+    for (i=segments.length; i--;) {
+      seconds += parseInt(segments[i],10)*Math.pow(60,segments.length-1-i); // hours, minutes
+    }
+    return seconds;
+  };
+
+  // make stuff
+  this.createElements = function() {
+    var oFrag = document.createDocumentFragment(),
+        oNode = null,
+        oNodeSpan = null,
+        oNode2 = null, i;
+    for (i=0; i<self.data.length; i++) {
+      oNode = (i%2===0?oTemplate:oTemplate2).cloneNode(true);
+      oNodeSpan = oNode.getElementsByTagName('span')[0];
+      oNode.rel = i;
+      self.data[i].o = oNode;
+      oNode2 = oTemplate3.cloneNode(true);
+      if (i%2===0) {
+        oNode2.className = 'note alt';
+      }
+      oNode2.innerHTML = this.data[i].title;
+      // evil old-skool event handlers, css:hover-only ideally would be nice excluding IE 6
+      oNode.onmouseover = self.mouseover;
+      oNode.onmouseout = self.mouseout;
+      this.data[i].oNote = oNode2;
+      oSound._data.oControls.appendChild(oNode2);
+      oFrag.appendChild(oNode);
+    }
+    self.refresh();
+    oSound._data.oStatus.appendChild(oFrag);
+  };
+
+  this.refreshMetadata = function(oSound) {
+    // Display info as appropriate
+    var i, j, index = null,
+        now = oSound.position,
+        metadata = oSound._data.metadata.data;
+    for (i=0, j=metadata.length; i<j; i++) {
+      if (now >= metadata[i].startTimeMS && now <= metadata[i].endTimeMS) {
+        index = i;
+        break;
+      }
+    }
+    if (index !== metadata.currentItem) {
+      // update
+      oSound._data.oLink.innerHTML = metadata.mainTitle+' <span class="metadata"><span class="sm2_divider"> | </span><span class="sm2_metadata">'+metadata[index].title+'</span></span>';
+      pl.setPageTitle(metadata[index].title+' | '+metadata.mainTitle);
+      metadata.currentItem = index;
+    }
+  };
+
+  this.refresh = function() {
+    var offset = 0,
+        relWidth = null,
+        duration = (self.data.givenDuration?self.data.givenDuration:oSound.durationEstimate), i;
+    for (i=0; i<self.data.length; i++) {
+      if (duration) {
+        relWidth = (((self.data[i].duration*1000)/duration)*100);
+        self.data[i].o.style.left = (offset?offset+'%':'-2px');
+        self.data[i].oNote.style.left = (offset?offset+'%':'0px');
+        offset += relWidth;
+      }
+    }
+  };
+
+  this.mouseover = function(e) {
+    self.data[this.rel].oNote.style.visibility = 'hidden';
+    self.data[this.rel].oNote.style.display = 'inline-block';
+    self.data[this.rel].oNote.style.marginLeft = -parseInt(self.data[this.rel].oNote.offsetWidth/2,10)+'px';
+    self.data[this.rel].oNote.style.visibility = 'visible';
+  };
+
+  this.mouseout = function() { 
+    self.data[this.rel].oNote.style.display = 'none';
+  };
+
+  // ----
+
+  for (i=0; i<oItems.length; i++) {
+    this.data[i] = {
+      o: null,
+      title: oItems[i].getElementsByTagName('p')[0].innerHTML,
+      startTime: oItems[i].getElementsByTagName('span')[0].innerHTML,
+      startSeconds: self.strToTime(oItems[i].getElementsByTagName('span')[0].innerHTML.replace(/[()]/g,'')),
+      duration: 0,
+      durationMS: null,
+      startTimeMS: null,
+      endTimeMS: null,
+      oNote: null
+    };
+  }
+
+  oDuration = pl.getByClassName('duration','div',oLI);
+  this.data.givenDuration = (oDuration.length?self.strToTime(oDuration[0].innerHTML)*1000:0);
+
+  for (i=0; i<this.data.length; i++) {
+    this.data[i].duration = parseInt(this.data[i+1]?this.data[i+1].startSeconds:(self.data.givenDuration?self.data.givenDuration:oSound.durationEstimate)/1000,10)-this.data[i].startSeconds;
+    this.data[i].startTimeMS = this.data[i].startSeconds*1000;
+    this.data[i].durationMS = this.data[i].duration*1000;
+    this.data[i].endTimeMS = this.data[i].startTimeMS+this.data[i].durationMS;
+    this.totalTime += this.data[i].duration;
+  }
+
+  // ----
+
+  this.createElements();
+  this.refresh();
+  
+}; // MetaData();
Index: /gs3-extensions/web-audio/trunk/sound-manager2/script/page-player.js
===================================================================
--- /gs3-extensions/web-audio/trunk/sound-manager2/script/page-player.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/sound-manager2/script/page-player.js	(revision 28388)
@@ -0,0 +1,1099 @@
+/*
+
+  SoundManager 2 Demo: "Page as playlist" UI
+  ----------------------------------------------
+  http://schillmania.com/projects/soundmanager2/
+
+  An example of a Muxtape.com-style UI, where an
+  unordered list of MP3 links becomes a playlist
+
+  Flash 9 "MovieStar" edition supports MPEG4
+  audio as well.
+
+  Requires SoundManager 2 Javascript API.
+
+*/
+
+/*jslint white: false, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: false, bitwise: true, newcap: true, immed: true */
+/*global soundManager, window, document, navigator, setTimeout, attachEvent, Metadata, PP_CONFIG */
+
+var pagePlayer = null;
+
+function PagePlayer() {
+
+  var self = this,
+      pl = this,
+      sm = soundManager, // soundManager instance
+      _event,
+      vuDataCanvas = null,
+      controlTemplate = null,
+      _head = document.getElementsByTagName('head')[0],
+      spectrumContainer = null,
+      // sniffing for favicon stuff, IE workarounds and touchy-feely devices
+      ua = navigator.userAgent,
+      supportsFavicon = (ua.match(/(opera|firefox)/i)),
+      isTouchDevice = (ua.match(/ipad|ipod|iphone/i)),
+      cleanup;
+
+  // configuration options
+  // note that if Flash 9 is required, you must set soundManager.flashVersion = 9 in your script before this point.
+
+  this.config = {
+    usePeakData: false,     // [Flash 9 only]: show peak data
+    useWaveformData: false, // [Flash 9 only]: enable sound spectrum (raw waveform data) - WARNING: CPU-INTENSIVE: may set CPUs on fire.
+    useEQData: false,       // [Flash 9 only]: enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive.
+    fillGraph: false,       // [Flash 9 only]: draw full lines instead of only top (peak) spectrum points
+    useMovieStar: true,     // [Flash 9 only]: Support for MPEG4 audio formats
+    allowRightClick: true,  // let users right-click MP3 links ("save as...", etc.) or discourage (can't prevent.)
+    useThrottling: true,    // try to rate-limit potentially-expensive calls (eg. dragging position around)
+    autoStart: false,       // begin playing first sound when page loads
+    playNext: true,         // stop after one sound, or play through list until end
+    updatePageTitle: true,  // change the page title while playing sounds
+    emptyTime: '-:--',      // null/undefined timer values (before data is available)
+    useFavIcon: false       // try to show peakData in address bar (Firefox + Opera) - may be too CPU heavy
+  };
+
+  this.css = {              // CSS class names appended to link during various states
+    sDefault: 'sm2_link',   // default state
+    sLoading: 'sm2_loading',
+    sPlaying: 'sm2_playing',
+    sPaused: 'sm2_paused'
+  };
+
+  this.sounds = [];
+  this.soundsByObject = [];
+  this.lastSound = null;
+  this.soundCount = 0;
+  this.strings = [];
+  this.dragActive = false;
+  this.dragExec = new Date();
+  this.dragTimer = null;
+  this.pageTitle = document.title;
+  this.lastWPExec = new Date();
+  this.lastWLExec = new Date();
+  this.vuMeterData = [];
+  this.oControls = null;
+
+  this._mergeObjects = function(oMain,oAdd) {
+    // non-destructive merge
+    var o1 = {}, o2, i, o; // clone o1
+    for (i in oMain) {
+      if (oMain.hasOwnProperty(i)) {
+        o1[i] = oMain[i];
+      }
+    }
+    o2 = (typeof oAdd === 'undefined'?{}:oAdd);
+    for (o in o2) {
+      if (typeof o1[o] === 'undefined') {
+        o1[o] = o2[o];
+      }
+    }
+    return o1;
+  };
+
+  _event = (function() {
+
+    var old = (window.attachEvent && !window.addEventListener),
+    _slice = Array.prototype.slice,
+    evt = {
+      add: (old?'attachEvent':'addEventListener'),
+      remove: (old?'detachEvent':'removeEventListener')
+    };
+
+    function getArgs(oArgs) {
+      var args = _slice.call(oArgs), len = args.length;
+      if (old) {
+        args[1] = 'on' + args[1]; // prefix
+        if (len > 3) {
+          args.pop(); // no capture
+        }
+      } else if (len === 3) {
+        args.push(false);
+      }
+      return args;
+    }
+
+    function apply(args, sType) {
+      var element = args.shift(),
+          method = [evt[sType]];
+      if (old) {
+        element[method](args[0], args[1]);
+      } else {
+        element[method].apply(element, args);
+      }
+    }
+
+    function add() {
+      apply(getArgs(arguments), 'add');
+    }
+
+    function remove() {
+      apply(getArgs(arguments), 'remove');
+    }
+
+    return {
+      'add': add,
+      'remove': remove
+    };
+
+  }());
+
+  this.hasClass = function(o, cStr) {
+    return (typeof(o.className)!=='undefined'?new RegExp('(^|\\s)'+cStr+'(\\s|$)').test(o.className):false);
+  };
+
+  this.addClass = function(o, cStr) {
+    if (!o || !cStr || self.hasClass(o,cStr)) {
+      return false; // safety net
+    }
+    o.className = (o.className?o.className+' ':'')+cStr;
+  };
+
+  this.removeClass = function(o, cStr) {
+    if (!o || !cStr || !self.hasClass(o,cStr)) {
+      return false;
+    }
+    o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),'');
+  };
+
+  this.select = function(className, oParent) {
+    var result = self.getByClassName(className, 'div', oParent||null);
+    return (result ? result[0] : null);
+  };
+
+  this.getByClassName = (document.querySelectorAll ? function(className, tagNames, oParent) { // tagNames: string or ['div', 'p'] etc.
+
+    var pattern = ('.'+className), qs;
+    if (tagNames) {
+      tagNames = tagNames.split(' ');
+    }
+    qs = (tagNames.length > 1 ? tagNames.join(pattern+', ') : tagNames[0]+pattern);
+    return (oParent?oParent:document).querySelectorAll(qs);
+
+  } : function(className, tagNames, oParent) {
+
+    var node = (oParent?oParent:document), matches = [], i, j, nodes = [];
+    if (tagNames) {
+      tagNames = tagNames.split(' ');
+    }
+    if (tagNames instanceof Array) {
+      for (i=tagNames.length; i--;) {
+        if (!nodes || !nodes[tagNames[i]]) {
+          nodes[tagNames[i]] = node.getElementsByTagName(tagNames[i]);
+        }
+      }
+      for (i=tagNames.length; i--;) {
+        for (j=nodes[tagNames[i]].length; j--;) {
+          if (self.hasClass(nodes[tagNames[i]][j], className)) {
+            matches.push(nodes[tagNames[i]][j]);
+          }
+        }
+      }
+    } else {
+      nodes = node.all||node.getElementsByTagName('*');
+      for (i=0, j=nodes.length; i<j; i++) {
+        if (self.hasClass(nodes[i],className)) {
+          matches.push(nodes[i]);
+        }
+      }
+    }
+    return matches;
+
+  });
+  
+  this.isChildOfClass = function(oChild, oClass) {
+    if (!oChild || !oClass) {
+      return false;
+    }
+    while (oChild.parentNode && !self.hasClass(oChild,oClass)) {
+      oChild = oChild.parentNode;
+    }
+    return (self.hasClass(oChild,oClass));
+  };
+
+  this.getParentByNodeName = function(oChild, sParentNodeName) {
+    if (!oChild || !sParentNodeName) {
+      return false;
+    }
+    sParentNodeName = sParentNodeName.toLowerCase();
+    while (oChild.parentNode && sParentNodeName !== oChild.parentNode.nodeName.toLowerCase()) {
+      oChild = oChild.parentNode;
+    }
+    return (oChild.parentNode && sParentNodeName === oChild.parentNode.nodeName.toLowerCase()?oChild.parentNode:null);
+  };
+
+  this.getOffX = function(o) {
+    // http://www.xs4all.nl/~ppk/js/findpos.html
+    var curleft = 0;
+    if (o.offsetParent) {
+      while (o.offsetParent) {
+        curleft += o.offsetLeft;
+        o = o.offsetParent;
+      }
+    }
+    else if (o.x) {
+      curleft += o.x;
+    }
+    return curleft;
+  };
+
+  this.getTime = function(nMSec, bAsString) {
+    // convert milliseconds to mm:ss, return as object literal or string
+    var nSec = Math.floor(nMSec/1000),
+        min = Math.floor(nSec/60),
+        sec = nSec-(min*60);
+    // if (min === 0 && sec === 0) return null; // return 0:00 as null
+    return (bAsString?(min+':'+(sec<10?'0'+sec:sec)):{'min':min,'sec':sec});
+  };
+
+  this.getSoundByObject = function(o) {
+    return (typeof self.soundsByObject[o.id] !== 'undefined'?self.soundsByObject[o.id]:null);
+  };
+
+  this.getPreviousItem = function(o) {
+    // given <li> playlist item, find previous <li> and then <a>
+    if (o.previousElementSibling) {
+      o = o.previousElementSibling;
+    } else {
+      o = o.previousSibling; // move from original node..
+      while (o && o.previousSibling && o.previousSibling.nodeType !== 1) {
+        o = o.previousSibling;
+      }
+    }
+    if (o.nodeName.toLowerCase() !== 'li') {
+      return null;
+    } else {
+      return o.getElementsByTagName('a')[0];
+    }
+  };
+
+  this.playPrevious = function(oSound) {
+    if (!oSound) {
+      oSound = self.lastSound;
+    }
+    if (!oSound) {
+      return false;
+    }
+    var previousItem = self.getPreviousItem(oSound._data.oLI);
+    if (previousItem) {
+      pl.handleClick({target:previousItem}); // fake a click event - aren't we sneaky. ;)
+    }
+    return previousItem;
+  };
+
+  this.getNextItem = function(o) {
+    // given <li> playlist item, find next <li> and then <a>
+    if (o.nextElementSibling) {
+      o = o.nextElementSibling;
+    } else {
+      o = o.nextSibling; // move from original node..
+      while (o && o.nextSibling && o.nextSibling.nodeType !== 1) {
+        o = o.nextSibling;
+      }
+    }
+    if (o.nodeName.toLowerCase() !== 'li') {
+      return null;
+    } else {
+      return o.getElementsByTagName('a')[0];
+    }
+  };
+
+  this.playNext = function(oSound) {
+    if (!oSound) {
+      oSound = self.lastSound;
+    }
+    if (!oSound) {
+      return false;
+    }
+    var nextItem = self.getNextItem(oSound._data.oLI);
+    if (nextItem) {
+      pl.handleClick({target:nextItem}); // fake a click event - aren't we sneaky. ;)
+    }
+    return nextItem;
+  };
+
+  this.setPageTitle = function(sTitle) {
+    if (!self.config.updatePageTitle) {
+      return false;
+    }
+    try {
+      document.title = (sTitle?sTitle+' - ':'')+self.pageTitle;
+    } catch(e) {
+      // oh well
+      self.setPageTitle = function() {
+        return false;
+      };
+    }
+  };
+
+  this.events = {
+
+    // handlers for sound events as they're started/stopped/played
+
+    play: function() {
+      pl.removeClass(this._data.oLI,this._data.className);
+      this._data.className = pl.css.sPlaying;
+      pl.addClass(this._data.oLI,this._data.className);
+      self.setPageTitle(this._data.originalTitle);
+    },
+
+    stop: function() {
+      pl.removeClass(this._data.oLI,this._data.className);
+      this._data.className = '';
+      this._data.oPosition.style.width = '0px';
+      self.setPageTitle();
+      self.resetPageIcon();
+    },
+
+    pause: function() {
+      if (pl.dragActive) {
+        return false;
+      }
+      pl.removeClass(this._data.oLI,this._data.className);
+      this._data.className = pl.css.sPaused;
+      pl.addClass(this._data.oLI,this._data.className);
+      self.setPageTitle();
+      self.resetPageIcon();
+    },
+
+    resume: function() {
+      if (pl.dragActive) {
+        return false;
+      }
+      pl.removeClass(this._data.oLI,this._data.className);
+      this._data.className = pl.css.sPlaying;
+      pl.addClass(this._data.oLI,this._data.className);
+    },
+
+    finish: function() {
+      pl.removeClass(this._data.oLI,this._data.className);
+      this._data.className = '';
+      this._data.oPosition.style.width = '0px';
+      // play next if applicable
+      if (self.config.playNext) {
+        pl.playNext(this);
+      } else {
+        self.setPageTitle();
+        self.resetPageIcon();
+
+	// Greenstone tweak // ****
+	var mainPlayButton = document.getElementById("mainPlayButton");
+	togglePlayVisual(mainPlayButton); 
+	var currentPosElem = document.getElementById("mysongCurrentPos");
+	var offsetInMSecs = currentPosElem.setAttribute("offsetInMSecs",0);
+      }
+    },
+
+    whileloading: function() {
+      function doWork() {
+        this._data.oLoading.style.width = (((this.bytesLoaded/this.bytesTotal)*100)+'%'); // theoretically, this should work.
+        if (!this._data.didRefresh && this._data.metadata) {
+          this._data.didRefresh = true;
+          this._data.metadata.refresh();
+        }
+      }
+      if (!pl.config.useThrottling) {
+        doWork.apply(this);
+      } else {
+        var d = new Date();
+        if (d && d-self.lastWLExec>30 || this.bytesLoaded === this.bytesTotal) {
+          doWork.apply(this);
+          self.lastWLExec = d;
+        }
+      }
+
+    },
+
+    onload: function() {
+      if (!this.loaded) {
+        var oTemp = this._data.oLI.getElementsByTagName('a')[0],
+            oString = oTemp.innerHTML,
+            oThis = this;
+        oTemp.innerHTML = oString+' <span style="font-size:0.5em"> | Load failed, d\'oh! '+(sm.sandbox.noRemote?' Possible cause: Flash sandbox is denying remote URL access.':(sm.sandbox.noLocal?'Flash denying local filesystem access':'404?'))+'</span>';
+        setTimeout(function(){
+          oTemp.innerHTML = oString;
+          // pl.events.finish.apply(oThis); // load next
+        },5000);
+      } else {
+        if (this._data.metadata) {
+          this._data.metadata.refresh();
+        }
+      }
+    },
+
+    whileplaying: function() {
+      var d = null;
+      if (pl.dragActive || !pl.config.useThrottling) {
+        self.updateTime.apply(this);
+        if (sm.flashVersion >= 9) {
+          if (pl.config.usePeakData && this.instanceOptions.usePeakData) {
+            self.updatePeaks.apply(this);
+          }
+          if (pl.config.useWaveformData && this.instanceOptions.useWaveformData || pl.config.useEQData && this.instanceOptions.useEQData) {
+            self.updateGraph.apply(this);
+          }
+        }
+        if (this._data.metadata) {
+          d = new Date();
+          if (d && d-self.lastWPExec>500) {
+            this._data.metadata.refreshMetadata(this);
+            self.lastWPExec = d;
+          }
+        }
+        this._data.oPosition.style.width = (((this.position/self.getDurationEstimate(this))*100)+'%');
+      } else {
+        d = new Date();
+        if (d-self.lastWPExec>30) {
+          self.updateTime.apply(this);
+          if (sm.flashVersion >= 9) {
+            if (pl.config.usePeakData && this.instanceOptions.usePeakData) {
+              self.updatePeaks.apply(this);
+            }
+            if (pl.config.useWaveformData && this.instanceOptions.useWaveformData || pl.config.useEQData && this.instanceOptions.useEQData) {
+              self.updateGraph.apply(this);
+            }
+          }
+          if (this._data.metadata) {
+            this._data.metadata.refreshMetadata(this);
+          }
+          this._data.oPosition.style.width = (((this.position/self.getDurationEstimate(this))*100)+'%');
+          self.lastWPExec = d;
+        }
+      }
+    }
+
+  }; // events{}
+
+  this.setPageIcon = function(sDataURL) {
+    if (!self.config.useFavIcon || !self.config.usePeakData || !sDataURL) {
+      return false;
+    }
+    var link = document.getElementById('sm2-favicon');
+    if (link) {
+      _head.removeChild(link);
+      link = null;
+    }
+    if (!link) {
+      link = document.createElement('link');
+      link.id = 'sm2-favicon';
+      link.rel = 'shortcut icon';
+      link.type = 'image/png';
+      link.href = sDataURL;
+      document.getElementsByTagName('head')[0].appendChild(link);
+    }
+  };
+
+  this.resetPageIcon = function() {
+    if (!self.config.useFavIcon) {
+      return false;
+    }
+    var link = document.getElementById('favicon');
+    if (link) {
+      link.href = '/favicon.ico';
+    }
+  };
+
+  this.updatePeaks = function() {
+    var o = this._data.oPeak,
+        oSpan = o.getElementsByTagName('span');
+    oSpan[0].style.marginTop = (13-(Math.floor(15*this.peakData.left))+'px');
+    oSpan[1].style.marginTop = (13-(Math.floor(15*this.peakData.right))+'px');
+    if (sm.flashVersion > 8 && self.config.useFavIcon && self.config.usePeakData) {
+      self.setPageIcon(self.vuMeterData[parseInt(16*this.peakData.left,10)][parseInt(16*this.peakData.right,10)]);
+    }
+  };
+  
+  this.updateGraph = function() {
+    if (pl.config.flashVersion < 9 || (!pl.config.useWaveformData && !pl.config.useEQData)) {
+      return false;
+    }
+    var sbC = this._data.oGraph.getElementsByTagName('div'),
+        scale, i, offset;
+    if (pl.config.useWaveformData) {
+      // raw waveform
+      scale = 8; // Y axis (+/- this distance from 0)
+      for (i=255; i--;) {
+        sbC[255-i].style.marginTop = (1+scale+Math.ceil(this.waveformData.left[i]*-scale))+'px';
+      }
+    } else {
+      // eq spectrum
+      offset = 9;
+      for (i=255; i--;) {
+        sbC[255-i].style.marginTop = ((offset*2)-1+Math.ceil(this.eqData[i]*-offset))+'px';
+      }
+    }
+  };
+  
+  this.resetGraph = function() {
+    if (!pl.config.useEQData || pl.config.flashVersion<9) {
+      return false;
+    }
+    var sbC = this._data.oGraph.getElementsByTagName('div'),
+        scale = (!pl.config.useEQData?'9px':'17px'),
+        nHeight = (!pl.config.fillGraph?'1px':'32px'),
+        i;
+    for (i=255; i--;) {
+      sbC[255-i].style.marginTop = scale; // EQ scale
+      sbC[255-i].style.height = nHeight;
+    }
+  };
+  
+  this.updateTime = function() {
+    var str = self.strings.timing.replace('%s1',self.getTime(this.position,true));
+    str = str.replace('%s2',self.getTime(self.getDurationEstimate(this),true));
+    this._data.oTiming.innerHTML = str;
+
+    var startMatchOffset = document.getElementById("mysongCurrentPos");
+    startMatchOffset.innerHTML = self.getTime(this.position,true) + " secs";
+    startMatchOffset.setAttribute("offsetInMSecs",this.position);
+  };
+
+  this.getTheDamnTarget = function(e) {
+    return (e.target||(window.event?window.event.srcElement:null));
+  };
+  
+  this.withinStatusBar = function(o) {
+    return (self.isChildOfClass(o,'controls'));
+  };
+
+  this.handleClick = function(e) {
+
+    // a sound (or something) was clicked - determine what and handle appropriately
+
+    if (e.button === 2) {
+      if (!pl.config.allowRightClick) {
+        pl.stopEvent(e);
+      }
+      return pl.config.allowRightClick; // ignore right-clicks
+    }
+    var o = self.getTheDamnTarget(e),
+        sURL, soundURL, thisSound, oControls, oLI, str;
+    if (!o) {
+      return true;
+    }
+    if (self.dragActive) {
+      self.stopDrag(); // to be safe
+    }
+    if (self.withinStatusBar(o)) {
+      // self.handleStatusClick(e);
+      return false;
+    }
+    if (o.nodeName.toLowerCase() !== 'a') {
+      o = self.getParentByNodeName(o,'a');
+    }
+    if (!o) {
+      // not a link
+      return true;
+    }
+
+    // OK, we're dealing with a link
+
+    sURL = o.getAttribute('href');
+
+    if (!o.href || (!sm.canPlayLink(o) && !self.hasClass(o,'playable')) || self.hasClass(o,'exclude')) {
+
+      // do nothing, don't return anything.
+      return true;
+
+    } else {
+
+      // we have something we're interested in.
+
+      // find and init parent UL, if need be
+      self.initUL(self.getParentByNodeName(o, 'ul'));
+
+      // and decorate the link too, if needed
+      self.initItem(o);
+
+      soundURL = o.href;
+      thisSound = self.getSoundByObject(o);
+
+      if (thisSound) {
+
+        // sound already exists
+        self.setPageTitle(thisSound._data.originalTitle);
+        if (thisSound === self.lastSound) {
+          // ..and was playing (or paused) and isn't in an error state
+          if (thisSound.readyState !== 2) {
+            if (thisSound.playState !== 1) {
+              // not yet playing
+              thisSound.play();
+            } else {
+              thisSound.togglePause();
+            }
+          } else {
+            sm._writeDebug('Warning: sound failed to load (security restrictions, 404 or bad format)',2);
+          }
+        } else {
+          // ..different sound
+          if (self.lastSound) {
+            self.stopSound(self.lastSound);
+          }
+          if (spectrumContainer) {
+            thisSound._data.oTimingBox.appendChild(spectrumContainer);
+          }
+          thisSound.togglePause(); // start playing current
+        }
+
+      } else {
+
+        // create sound
+        thisSound = sm.createSound({
+          id:o.id,
+          url:decodeURI(soundURL),
+          onplay:self.events.play,
+          onstop:self.events.stop,
+          onpause:self.events.pause,
+          onresume:self.events.resume,
+          onfinish:self.events.finish,
+          whileloading:self.events.whileloading,
+          whileplaying:self.events.whileplaying,
+          onmetadata:self.events.metadata,
+          onload:self.events.onload
+        });
+
+        // append control template
+        oControls = self.oControls.cloneNode(true);
+        oLI = o.parentNode;
+
+	// Greenstone tweak **** 
+	var controlMarker=document.getElementById("controlMarker");
+	if (controlMarker != null) {
+	    controlMarker.appendChild(oControls);
+            //oLI.insertBefore(oControls,controlMarker);
+	}
+	else {
+            oLI.appendChild(oControls);
+	}
+
+        if (spectrumContainer) {
+          oLI.appendChild(spectrumContainer);
+        }
+        self.soundsByObject[o.id] = thisSound;
+
+        // tack on some custom data
+        thisSound._data = {
+          oLink: o, // DOM reference within SM2 object event handlers
+          oLI: oLI,
+          oControls: self.select('controls',oLI),
+          oStatus: self.select('statusbar',oLI),
+          oLoading: self.select('loading',oLI),
+          oPosition: self.select('position',oLI),
+          oTimingBox: self.select('timing',oLI),
+          oTiming: self.select('timing',oLI).getElementsByTagName('div')[0],
+          oPeak: self.select('peak',oLI),
+          oGraph: self.select('spectrum-box',oLI),
+          className: self.css.sPlaying,
+          originalTitle: o.innerHTML,
+          metadata: null
+        };
+
+        if (spectrumContainer) {
+          thisSound._data.oTimingBox.appendChild(spectrumContainer);
+        }
+
+        // "Metadata"
+        if (thisSound._data.oLI.getElementsByTagName('ul').length) {
+          thisSound._data.metadata = new Metadata(thisSound);
+        }
+
+        // set initial timer stuff (before loading)
+        str = self.strings.timing.replace('%s1',self.config.emptyTime);
+        str = str.replace('%s2',self.config.emptyTime);
+        thisSound._data.oTiming.innerHTML = str;
+        self.sounds.push(thisSound);
+        if (self.lastSound) {
+          self.stopSound(self.lastSound);
+        }
+        self.resetGraph.apply(thisSound);
+        thisSound.play();
+
+      }
+
+      self.lastSound = thisSound; // reference for next call
+      return self.stopEvent(e);
+
+    }
+
+  };
+  
+  this.handleMouseDown = function(e) {
+    // a sound link was clicked
+    if (isTouchDevice && e.touches) {
+      e = e.touches[0];
+    }
+    if (e.button === 2) {
+      if (!pl.config.allowRightClick) {
+        pl.stopEvent(e);
+      }
+      return pl.config.allowRightClick; // ignore right-clicks
+    }
+    var o = self.getTheDamnTarget(e);
+    if (!o) {
+      return true;
+    }
+    if (!self.withinStatusBar(o)) {
+      return true;
+    }
+    self.dragActive = true;
+    self.lastSound.pause();
+    self.setPosition(e);
+    if (!isTouchDevice) {
+      _event.add(document,'mousemove',self.handleMouseMove);
+    } else {
+      _event.add(document,'touchmove',self.handleMouseMove);
+    }
+    self.addClass(self.lastSound._data.oControls,'dragging');
+    return self.stopEvent(e);
+  };
+  
+  this.handleMouseMove = function(e) {
+    if (isTouchDevice && e.touches) {
+      e = e.touches[0];
+    }
+    // set position accordingly
+    if (self.dragActive) {
+      if (self.config.useThrottling) {
+        // be nice to CPU/externalInterface
+        var d = new Date();
+        if (d-self.dragExec>20) {
+          self.setPosition(e);
+        } else {
+          window.clearTimeout(self.dragTimer);
+          self.dragTimer = window.setTimeout(function(){self.setPosition(e);},20);
+        }
+        self.dragExec = d;
+      } else {
+        // oh the hell with it
+        self.setPosition(e);
+      }
+    } else {
+      self.stopDrag();
+    }
+    e.stopPropagation = true;
+    return false;
+  };
+  
+  this.stopDrag = function(e) {
+    if (self.dragActive) {
+      self.removeClass(self.lastSound._data.oControls,'dragging');
+      if (!isTouchDevice) {
+        _event.remove(document,'mousemove',self.handleMouseMove);
+      } else {
+        _event.remove(document,'touchmove',self.handleMouseMove);
+      }
+      if (!pl.hasClass(self.lastSound._data.oLI,self.css.sPaused)) {
+        self.lastSound.resume();
+      }
+      self.dragActive = false;
+      return self.stopEvent(e);
+    }
+  };
+  
+  this.handleStatusClick = function(e) {
+    self.setPosition(e);
+    if (!pl.hasClass(self.lastSound._data.oLI,self.css.sPaused)) {
+      self.resume();
+    }
+    return self.stopEvent(e);
+  };
+  
+  this.stopEvent = function(e) {
+    if (typeof e !== 'undefined') {
+      if (typeof e.preventDefault !== 'undefined') {
+        e.preventDefault();
+      } else {
+        e.stopPropagation = true;
+        e.returnValue = false;
+      }
+    }
+    return false;
+  };
+ 
+  this.setPosition = function(e) {
+    // called from slider control
+    var oThis = self.getTheDamnTarget(e),
+        x, oControl, oSound, nMsecOffset;
+    if (!oThis) {
+      return true;
+    }
+    oControl = oThis;
+    while (!self.hasClass(oControl,'controls') && oControl.parentNode) {
+      oControl = oControl.parentNode;
+    }
+    oSound = self.lastSound;
+    x = parseInt(e.clientX,10);
+    // play sound at this position
+    nMsecOffset = Math.floor((x-self.getOffX(oControl)-4)/(oControl.offsetWidth)*self.getDurationEstimate(oSound));
+    if (!isNaN(nMsecOffset)) {
+      nMsecOffset = Math.min(nMsecOffset,oSound.duration);
+    }
+    if (!isNaN(nMsecOffset)) {
+      oSound.setPosition(nMsecOffset);
+    }
+  };
+
+  this.stopSound = function(oSound) {
+    sm._writeDebug('stopping sound: '+oSound.sID);
+    sm.stop(oSound.sID);
+    if (!isTouchDevice) { // iOS 4.2+ security blocks onfinish() -> playNext() if we set a .src in-between(?)
+      sm.unload(oSound.sID);
+    }
+  };
+
+  this.getDurationEstimate = function(oSound) {
+    if (oSound.instanceOptions.isMovieStar) {
+      return (oSound.duration);
+    } else {
+      return (!oSound._data.metadata || !oSound._data.metadata.data.givenDuration ? (oSound.durationEstimate||0) : oSound._data.metadata.data.givenDuration);
+    }
+  };
+
+  this.createVUData = function() {
+
+    var i=0, j=0,
+      canvas = vuDataCanvas.getContext('2d'),
+      vuGrad = canvas.createLinearGradient(0, 16, 0, 0),
+      bgGrad, outline;
+
+    vuGrad.addColorStop(0,'rgb(0,192,0)');
+    vuGrad.addColorStop(0.30,'rgb(0,255,0)');
+    vuGrad.addColorStop(0.625,'rgb(255,255,0)');
+    vuGrad.addColorStop(0.85,'rgb(255,0,0)');
+    bgGrad = canvas.createLinearGradient(0, 16, 0, 0);
+    outline = 'rgba(0,0,0,0.2)';
+    bgGrad.addColorStop(0,outline);
+    bgGrad.addColorStop(1,'rgba(0,0,0,0.5)');
+    for (i=0; i<16; i++) {
+      self.vuMeterData[i] = [];
+    }
+    for (i=0; i<16; i++) {
+      for (j=0; j<16; j++) {
+        // reset/erase canvas
+        vuDataCanvas.setAttribute('width',16);
+        vuDataCanvas.setAttribute('height',16);
+        // draw new stuffs
+        canvas.fillStyle = bgGrad;
+        canvas.fillRect(0,0,7,15);
+        canvas.fillRect(8,0,7,15);
+        /*
+        // shadow
+        canvas.fillStyle = 'rgba(0,0,0,0.1)';
+        canvas.fillRect(1,15-i,7,17-(17-i));
+        canvas.fillRect(9,15-j,7,17-(17-j));
+        */
+        canvas.fillStyle = vuGrad;
+        canvas.fillRect(0,15-i,7,16-(16-i));
+        canvas.fillRect(8,15-j,7,16-(16-j));
+        // and now, clear out some bits.
+        canvas.clearRect(0,3,16,1);
+        canvas.clearRect(0,7,16,1);
+        canvas.clearRect(0,11,16,1);
+        self.vuMeterData[i][j] = vuDataCanvas.toDataURL('image/png');
+        // for debugging VU images
+        /*
+        var o = document.createElement('img');
+        o.style.marginRight = '5px'; 
+        o.src = self.vuMeterData[i][j];
+        document.documentElement.appendChild(o);
+        */
+      }
+    }
+
+  };
+
+  this.testCanvas = function() {
+    // canvas + toDataURL();
+    var c = document.createElement('canvas'),
+        ctx = null, ok;
+    if (!c || typeof c.getContext === 'undefined') {
+      return null;
+    }
+    ctx = c.getContext('2d');
+    if (!ctx || typeof c.toDataURL !== 'function') {
+        return null;
+    }
+    // just in case..
+    try {
+        ok = c.toDataURL('image/png');
+    } catch(e) {
+      // no canvas or no toDataURL()
+      return null;
+    }
+    // assume we're all good.
+    return c;
+  };
+
+  this.initItem = function(oNode) {
+    if (!oNode.id) {
+      oNode.id = 'pagePlayerMP3Sound'+(self.soundCount++);
+    }
+    self.addClass(oNode,self.css.sDefault); // add default CSS decoration
+  };
+
+  this.initUL = function(oULNode) {
+    // set up graph box stuffs
+    if (sm.flashVersion >= 9) {
+        self.addClass(oULNode,self.cssBase);
+    }
+  };
+
+  this.init = function(oConfig) {
+
+    if (oConfig) {
+      // allow overriding via arguments object
+      sm._writeDebug('pagePlayer.init(): Using custom configuration');
+      this.config = this._mergeObjects(oConfig,this.config);
+    } else {
+      sm._writeDebug('pagePlayer.init(): Using default configuration');
+    }
+
+    var i, spectrumBox, sbC, oF, oClone, oTiming;
+
+    // apply externally-defined override, if applicable
+    this.cssBase = []; // optional features added to ul.playlist
+
+    // apply some items to SM2
+    sm.useFlashBlock = true;
+
+    if (sm.flashVersion >= 9) {
+
+      sm.useMovieStar = this.config.useMovieStar; // enable playing FLV, MP4 etc.
+      sm.defaultOptions.usePeakData = this.config.usePeakData;
+      sm.defaultOptions.useWaveformData = this.config.useWaveformData;
+      sm.defaultOptions.useEQData = this.config.useEQData;
+
+      if (this.config.usePeakData) {
+        this.cssBase.push('use-peak');
+      }
+
+      if (this.config.useWaveformData || this.config.useEQData) {
+        this.cssBase.push('use-spectrum');
+      }
+
+      this.cssBase = this.cssBase.join(' ');
+
+      if (this.config.useFavIcon) {
+        vuDataCanvas = self.testCanvas();
+        if (vuDataCanvas && supportsFavicon) {
+          // these browsers support dynamically-updating the favicon
+          self.createVUData();
+        } else {
+          // browser doesn't support doing this
+          this.config.useFavIcon = false;
+        }
+      }
+
+    } else if (this.config.usePeakData || this.config.useWaveformData || this.config.useEQData) {
+
+      sm._writeDebug('Page player: Note: soundManager.flashVersion = 9 is required for peak/waveform/EQ features.');
+
+    }
+
+    controlTemplate = document.createElement('div');
+
+     controlTemplate.innerHTML = [
+
+      // control markup inserted dynamically after each page player link
+      // if you want to change the UI layout, this is the place to do it.
+
+      '  <div class="controls">',
+      '   <div class="statusbar">',
+      '    <div class="loading"></div>',
+      '    <div class="position"></div>',
+      '   </div>',
+      '  </div>',
+
+      '  <div class="timing">',
+      '   <div id="sm2_timing" class="timing-data">',
+      '    <span class="sm2_position">%s1</span> / <span class="sm2_total">%s2</span>',
+      '   </div>',
+      '  </div>',
+
+      '  <div class="peak">',
+      '   <div class="peak-box"><span class="l"></span><span class="r"></span></div>',
+      '  </div>',
+
+      ' <div class="spectrum-container">',
+      '  <div class="spectrum-box">',
+      '   <div class="spectrum"></div>',
+      '  </div>',
+      ' </div>'
+
+    ].join('\n');
+
+    if (sm.flashVersion >= 9) {
+
+      // create the spectrum box ish
+      spectrumContainer = self.select('spectrum-container',controlTemplate);
+
+      // take out of template, too
+      spectrumContainer = controlTemplate.removeChild(spectrumContainer);
+
+      spectrumBox = self.select('spectrum-box',spectrumContainer);
+
+      sbC = spectrumBox.getElementsByTagName('div')[0];
+      oF = document.createDocumentFragment();
+      oClone = null;
+      for (i=256; i--;) {
+        oClone = sbC.cloneNode(false);
+        oClone.style.left = (i)+'px';
+        oF.appendChild(oClone);
+      }
+      spectrumBox.removeChild(sbC);
+      spectrumBox.appendChild(oF);
+
+    } else {
+
+      // flash 8-only, take out the spectrum container and peak elements
+      controlTemplate.removeChild(self.select('spectrum-container',controlTemplate));
+      controlTemplate.removeChild(self.select('peak',controlTemplate));
+
+    }
+
+    self.oControls = controlTemplate.cloneNode(true);
+
+    oTiming = self.select('timing-data',controlTemplate);
+    self.strings.timing = oTiming.innerHTML;
+    oTiming.innerHTML = '';
+    oTiming.id = '';
+
+    function doEvents(action) { // action: add / remove
+
+      _event[action](document,'click',self.handleClick);
+
+      if (!isTouchDevice) {
+        _event[action](document,'mousedown',self.handleMouseDown);
+        _event[action](document,'mouseup',self.stopDrag);
+      } else {
+        _event[action](document,'touchstart',self.handleMouseDown);
+        _event[action](document,'touchend',self.stopDrag);
+      }
+
+      _event[action](window, 'unload', cleanup);
+
+    }
+
+    cleanup = function() {
+      doEvents('remove');
+    };
+
+    doEvents('add');
+
+    sm._writeDebug('pagePlayer.init(): Ready',1);
+
+    if (self.config.autoStart) {
+      // grab the first ul.playlist link
+      pl.handleClick({target:pl.getByClassName('playlist', 'ul')[0].getElementsByTagName('a')[0]});
+    }
+
+  };
+
+}
+
+soundManager.useFlashBlock = true;
+
+soundManager.onready(function() {
+  pagePlayer = new PagePlayer();
+  pagePlayer.init(typeof PP_CONFIG !== 'undefined' ? PP_CONFIG : null);
+});
Index: /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2-jsmin.js
===================================================================
--- /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2-jsmin.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2-jsmin.js	(revision 28388)
@@ -0,0 +1,103 @@
+/** @license
+
+ SoundManager 2: JavaScript Sound for the Web
+ ----------------------------------------------
+ http://schillmania.com/projects/soundmanager2/
+
+ Copyright (c) 2007, Scott Schiller. All rights reserved.
+ Code provided under the BSD License:
+ http://schillmania.com/projects/soundmanager2/license.txt
+
+ V2.97a.20110801
+*/
+(function(S){function T(T,fa){function o(c){return function(a){return!this._t||!this._t._a?(this._t&&this._t.sID?b._wD(l+"ignoring "+a.type+": "+this._t.sID):b._wD(l+"ignoring "+a.type),null):c.call(this,a)}}this.flashVersion=8;this.debugMode=!0;this.debugFlash=!1;this.useConsole=!0;this.waitForWindowLoad=this.consoleOnly=!1;this.nullURL="about:blank";this.allowPolling=!0;this.useFastPolling=!1;this.useMovieStar=!0;this.bgColor="#ffffff";this.useHighPerformance=!1;this.flashPollingInterval=null;this.flashLoadTimeout=
+1E3;this.wmode=null;this.allowScriptAccess="always";this.useFlashBlock=!1;this.useHTML5Audio=!0;this.html5Test=/^(probably|maybe)$/i;this.preferFlash=!0;this.audioFormats={mp3:{type:['audio/mpeg; codecs="mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a"],type:['audio/mp4; codecs="mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs=vorbis"],required:!1},wav:{type:['audio/wav; codecs="1"',
+"audio/wav","audio/wave","audio/x-wav"],required:!1}};this.defaultOptions={autoLoad:!1,stream:!0,autoPlay:!1,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onstop:null,onfailure:null,onfinish:null,onbeforefinish:null,onbeforefinishtime:5E3,onbeforefinishcomplete:null,onjustbeforefinish:null,onjustbeforefinishtime:200,multiShot:!0,multiShotEvents:!1,position:null,pan:0,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null,
+usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.version=null;this.versionNumber="V2.97a.20110801";this.movieURL=null;this.url=T||null;this.altURL=null;this.enabled=this.swfLoaded=!1;this.o=null;this.movieID="sm2-container";this.id=fa||"sm2movie";this.swfCSS={swfBox:"sm2-object-box",swfDefault:"movieContainer",swfError:"swf_error",swfTimedout:"swf_timedout",swfLoaded:"swf_loaded",
+swfUnblocked:"swf_unblocked",sm2Debug:"sm2_debug",highPerf:"high_performance",flashDebug:"flash_debug"};this.oMC=null;this.sounds={};this.soundIDs=[];this.muted=!1;this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.didFlashBlock=this.specialWmodeCase=!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.baseMimeTypes=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.netStreamMimeTypes=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;
+this.netStreamTypes=["aac","flv","mov","mp4","m4v","f4v","m4a","mp4v","3gp","3g2"];this.netStreamPattern=RegExp("\\.("+this.netStreamTypes.join("|")+")(\\?.*)?$","i");this.mimePattern=this.baseMimeTypes;this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local+internet access)"},
+description:null,noRemote:null,noLocal:null};this.hasHTML5=typeof Audio!=="undefined"&&typeof(new Audio).canPlayType!=="undefined";this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=!1;var wa,b=this,l="HTML5::",r,s=navigator.userAgent,h=S,L=h.location.href.toString(),i=this.flashVersion,g=document,ga,U,z=[],ha=!0,q,M=!1,N=!1,j=!1,v=!1,ia=!1,k,Na=0,O,t,ja,D,E,V,xa,ka,C,W,X,F,la,Y,Z,G,ya,ma,Oa=["log","info","warn","error"],za,$,Aa,P=null,na=null,n,oa,H,Ba,aa,ba,pa,m,ca=!1,qa=
+!1,Ca,Da,w=null,Ea,da,Q,A,ra,Fa,p,Ga=Array.prototype.slice,R=!1,u,ea,Ha,x,Ia,Ja=s.match(/(ipad|iphone|ipod)/i),Pa=s.match(/(mobile|pre\/|xoom)/i)||Ja,y=s.match(/msie/i),Qa=s.match(/webkit/i),I=s.match(/safari/i)&&!s.match(/chrome/i),Ra=s.match(/opera/i),sa=!L.match(/usehtml5audio/i)&&!L.match(/sm2\-ignorebadua/i)&&I&&s.match(/OS X 10_6_([3-7])/i),ta=typeof console!=="undefined"&&typeof console.log!=="undefined",ua=typeof g.hasFocus!=="undefined"?g.hasFocus():null,J=I&&typeof g.hasFocus==="undefined",
+Ka=!J,La=/(mp3|mp4|mpa)/i,K=g.location?g.location.protocol.match(/http/i):null,Ma=!K?"http:":"";this.useAltURL=!K;this._global_a=null;if(Pa&&(b.useHTML5Audio=!0,b.preferFlash=!1,Ja))R=b.ignoreFlash=!0;this.supported=this.ok=function(){return w?j&&!v:b.useHTML5Audio&&b.hasHTML5};this.getMovie=function(b){return y?h[b]:I?r(b)||g[b]:r(b)};this.createSound=function(c){function a(){e=aa(e);b.sounds[d.id]=new wa(d);b.soundIDs.push(d.id);return b.sounds[d.id]}var e=null,f=null,d=null;if(!j||!b.ok())return pa("soundManager.createSound(): "+
+n(!j?"notReady":"notOK")),!1;arguments.length===2&&(c={id:arguments[0],url:arguments[1]});d=e=t(c);d.id.toString().charAt(0).match(/^[0-9]$/)&&b._wD("soundManager.createSound(): "+n("badID",d.id),2);b._wD("soundManager.createSound(): "+d.id+" ("+d.url+")",1);if(m(d.id,!0))return b._wD("soundManager.createSound(): "+d.id+" exists",1),b.sounds[d.id];if(da(d))f=a(),b._wD("Loading sound "+d.id+" via HTML5"),f._setup_html5(d);else{if(i>8&&b.useMovieStar){if(d.isMovieStar===null)d.isMovieStar=d.serverURL||
+d.type&&d.type.match(b.netStreamPattern)||d.url.match(b.netStreamPattern)?!0:!1;d.isMovieStar&&b._wD("soundManager.createSound(): using MovieStar handling");if(d.isMovieStar){if(d.usePeakData)k("noPeak"),d.usePeakData=!1;d.loops>1&&k("noNSLoop")}}d=ba(d,"soundManager.createSound(): ");f=a();if(i===8)b.o._createSound(d.id,d.onjustbeforefinishtime,d.loops||1,d.usePolicyFile);else if(b.o._createSound(d.id,d.url,d.onjustbeforefinishtime,d.usePeakData,d.useWaveformData,d.useEQData,d.isMovieStar,d.isMovieStar?
+d.bufferTime:!1,d.loops||1,d.serverURL,d.duration||null,d.autoPlay,!0,d.autoLoad,d.usePolicyFile),!d.serverURL)f.connected=!0,d.onconnect&&d.onconnect.apply(f);!d.serverURL&&(d.autoLoad||d.autoPlay)&&f.load(d)}!d.serverURL&&d.autoPlay&&f.play();return f};this.destroySound=function(c,a){if(!m(c))return!1;var e=b.sounds[c],f;e._iO={};e.stop();e.unload();for(f=0;f<b.soundIDs.length;f++)if(b.soundIDs[f]===c){b.soundIDs.splice(f,1);break}a||e.destruct(!0);delete b.sounds[c];return!0};this.load=function(c,
+a){return!m(c)?!1:b.sounds[c].load(a)};this.unload=function(c){return!m(c)?!1:b.sounds[c].unload()};this.start=this.play=function(c,a){return!j||!b.ok()?(pa("soundManager.play(): "+n(!j?"notReady":"notOK")),!1):!m(c)?(a instanceof Object||(a={url:a}),a&&a.url?(b._wD('soundManager.play(): attempting to create "'+c+'"',1),a.id=c,b.createSound(a).play()):!1):b.sounds[c].play(a)};this.setPosition=function(c,a){return!m(c)?!1:b.sounds[c].setPosition(a)};this.stop=function(c){if(!m(c))return!1;b._wD("soundManager.stop("+
+c+")",1);return b.sounds[c].stop()};this.stopAll=function(){var c;b._wD("soundManager.stopAll()",1);for(c in b.sounds)b.sounds.hasOwnProperty(c)&&b.sounds[c].stop()};this.pause=function(c){return!m(c)?!1:b.sounds[c].pause()};this.pauseAll=function(){var c;for(c=b.soundIDs.length;c--;)b.sounds[b.soundIDs[c]].pause()};this.resume=function(c){return!m(c)?!1:b.sounds[c].resume()};this.resumeAll=function(){var c;for(c=b.soundIDs.length;c--;)b.sounds[b.soundIDs[c]].resume()};this.togglePause=function(c){return!m(c)?
+!1:b.sounds[c].togglePause()};this.setPan=function(c,a){return!m(c)?!1:b.sounds[c].setPan(a)};this.setVolume=function(c,a){return!m(c)?!1:b.sounds[c].setVolume(a)};this.mute=function(c){var a=0;typeof c!=="string"&&(c=null);if(c){if(!m(c))return!1;b._wD('soundManager.mute(): Muting "'+c+'"');return b.sounds[c].mute()}else{b._wD("soundManager.mute(): Muting all sounds");for(a=b.soundIDs.length;a--;)b.sounds[b.soundIDs[a]].mute();b.muted=!0}return!0};this.muteAll=function(){b.mute()};this.unmute=function(c){typeof c!==
+"string"&&(c=null);if(c){if(!m(c))return!1;b._wD('soundManager.unmute(): Unmuting "'+c+'"');return b.sounds[c].unmute()}else{b._wD("soundManager.unmute(): Unmuting all sounds");for(c=b.soundIDs.length;c--;)b.sounds[b.soundIDs[c]].unmute();b.muted=!1}return!0};this.unmuteAll=function(){b.unmute()};this.toggleMute=function(c){return!m(c)?!1:b.sounds[c].toggleMute()};this.getMemoryUse=function(){var c=0;b.o&&i!==8&&(c=parseInt(b.o._getMemoryUse(),10));return c};this.disable=function(c){var a;typeof c===
+"undefined"&&(c=!1);if(v)return!1;v=!0;k("shutdown",1);for(a=b.soundIDs.length;a--;)za(b.sounds[b.soundIDs[a]]);O(c);p.remove(h,"load",E);return!0};this.canPlayMIME=function(c){var a;b.hasHTML5&&(a=Q({type:c}));return!w||a?a:c?c.match(b.mimePattern)?!0:!1:null};this.canPlayURL=function(c){var a;b.hasHTML5&&(a=Q({url:c}));return!w||a?a:c?c.match(b.filePattern)?!0:!1:null};this.canPlayLink=function(c){return typeof c.type!=="undefined"&&c.type&&b.canPlayMIME(c.type)?!0:b.canPlayURL(c.href)};this.getSoundById=
+function(c,a){if(!c)throw Error("soundManager.getSoundById(): sID is null/undefined");var e=b.sounds[c];!e&&!a&&b._wD('"'+c+'" is an invalid sound ID.',2);return e};this.onready=function(c,a){if(c&&c instanceof Function)return j&&b._wD(n("queue","onready")),a||(a=h),ja("onready",c,a),D(),!0;else throw n("needFunction","onready");};this.ontimeout=function(c,a){if(c&&c instanceof Function)return j&&b._wD(n("queue","ontimeout")),a||(a=h),ja("ontimeout",c,a),D({type:"ontimeout"}),!0;else throw n("needFunction",
+"ontimeout");};this._wD=this._writeDebug=function(c,a,e){var f,d;if(!b.debugMode)return!1;typeof e!=="undefined"&&e&&(c=c+" | "+(new Date).getTime());if(ta&&b.useConsole){e=Oa[a];if(typeof console[e]!=="undefined")console[e](c);else console.log(c);if(b.useConsoleOnly)return!0}try{f=r("soundmanager-debug");if(!f)return!1;d=g.createElement("div");if(++Na%2===0)d.className="sm2-alt";a=typeof a==="undefined"?0:parseInt(a,10);d.appendChild(g.createTextNode(c));if(a){if(a>=2)d.style.fontWeight="bold";if(a===
+3)d.style.color="#ff3333"}f.insertBefore(d,f.firstChild)}catch(B){}return!0};this._debug=function(){var c,a;k("currentObj",1);c=0;for(a=b.soundIDs.length;c<a;c++)b.sounds[b.soundIDs[c]]._debug()};this.reboot=function(){b._wD("soundManager.reboot()");b.soundIDs.length&&b._wD("Destroying "+b.soundIDs.length+" SMSound objects...");var c,a;for(c=b.soundIDs.length;c--;)b.sounds[b.soundIDs[c]].destruct();try{if(y)na=b.o.innerHTML;P=b.o.parentNode.removeChild(b.o);b._wD("Flash movie removed.")}catch(e){k("badRemove",
+2)}na=P=w=null;b.enabled=la=j=ca=qa=M=N=v=b.swfLoaded=!1;b.soundIDs=b.sounds=[];b.o=null;for(c in z)if(z.hasOwnProperty(c))for(a=z[c].length;a--;)z[c][a].fired=!1;b._wD("soundManager: Rebooting...");h.setTimeout(b.beginDelayedInit,20)};this.getMoviePercent=function(){return b.o&&typeof b.o.PercentLoaded!=="undefined"?b.o.PercentLoaded():null};this.beginDelayedInit=function(){ia=!0;F();setTimeout(function(){if(qa)return!1;Z();X();return qa=!0},20);V()};this.destruct=function(){b._wD("soundManager.destruct()");
+b.disable(!0)};x={abort:o(function(){b._wD(l+"abort: "+this._t.sID)}),canplay:o(function(){if(this._t._html5_canplay)return!0;this._t._html5_canplay=!0;b._wD(l+"canplay: "+this._t.sID+", "+this._t.url);this._t._onbufferchange(0);var c=!isNaN(this._t.position)?this._t.position/1E3:null;if(this._t.position&&this.currentTime!==c){b._wD(l+"canplay: setting position to "+c);try{this.currentTime=c}catch(a){b._wD(l+"setting position failed: "+a.message,2)}}}),load:o(function(){this._t.loaded||(this._t._onbufferchange(0),
+this._t._whileloading(this._t.bytesTotal,this._t.bytesTotal,this._t._get_html5_duration()),this._t._onload(!0))}),emptied:o(function(){b._wD(l+"emptied: "+this._t.sID)}),ended:o(function(){b._wD(l+"ended: "+this._t.sID);this._t._onfinish()}),error:o(function(){b._wD(l+"error: "+this.error.code);this._t._onload(!1)}),loadeddata:o(function(){var c=this._t,a=c.bytesTotal||1;b._wD(l+"loadeddata: "+this._t.sID);if(!c._loaded&&!I)c.duration=c._get_html5_duration(),c._whileloading(a,a,c._get_html5_duration()),
+c._onload(!0)}),loadedmetadata:o(function(){b._wD(l+"loadedmetadata: "+this._t.sID)}),loadstart:o(function(){b._wD(l+"loadstart: "+this._t.sID);this._t._onbufferchange(1)}),play:o(function(){b._wD(l+"play: "+this._t.sID+", "+this._t.url);this._t._onbufferchange(0)}),playing:o(function(){b._wD(l+"playing: "+this._t.sID+", "+this._t.url);this._t._onbufferchange(0)}),progress:o(function(c){if(this._t.loaded)return!1;var a,e,f;f=0;var d=c.type==="progress";e=c.target.buffered;var B=c.loaded||0,va=c.total||
+1;if(e&&e.length){for(a=e.length;a--;)f=e.end(a)-e.start(a);B=f/c.target.duration;if(d&&e.length>1){f=[];e=e.length;for(a=0;a<e;a++)f.push(c.target.buffered.start(a)+"-"+c.target.buffered.end(a));b._wD(l+"progress: timeRanges: "+f.join(", "))}d&&!isNaN(B)&&b._wD(l+"progress: "+this._t.sID+": "+Math.floor(B*100)+"% loaded")}isNaN(B)||(this._t._onbufferchange(0),this._t._whileloading(B,va,this._t._get_html5_duration()),B&&va&&B===va&&x.load.call(this,c))}),ratechange:o(function(){b._wD(l+"ratechange: "+
+this._t.sID)}),suspend:o(function(c){b._wD(l+"suspend: "+this._t.sID);x.progress.call(this,c)}),stalled:o(function(){b._wD(l+"stalled: "+this._t.sID)}),timeupdate:o(function(){this._t._onTimer()}),waiting:o(function(){b._wD(l+"waiting: "+this._t.sID);this._t._onbufferchange(1)})};wa=function(c){var a=this,e,f,d;this.sID=c.id;this.url=c.url;this._iO=this.instanceOptions=this.options=t(c);this.pan=this.options.pan;this.volume=this.options.volume;this._lastURL=null;this.isHTML5=!1;this._a=null;this.id3=
+{};this._debug=function(){if(b.debugMode){var c=null,d=[],e,f;for(c in a.options)a.options[c]!==null&&(a.options[c]instanceof Function?(e=a.options[c].toString(),e=e.replace(/\s\s+/g," "),f=e.indexOf("{"),d.push(" "+c+": {"+e.substr(f+1,Math.min(Math.max(e.indexOf("\n")-1,64),64)).replace(/\n/g,"")+"... }")):d.push(" "+c+": "+a.options[c]));b._wD("SMSound() merged options: {\n"+d.join(", \n")+"\n}")}};this._debug();this.load=function(c){var d=null;if(typeof c!=="undefined")a._iO=t(c,a.options),a.instanceOptions=
+a._iO;else if(c=a.options,a._iO=c,a.instanceOptions=a._iO,a._lastURL&&a._lastURL!==a.url)k("manURL"),a._iO.url=a.url,a.url=null;if(!a._iO.url)a._iO.url=a.url;b._wD("SMSound.load(): "+a._iO.url,1);if(a._iO.url===a.url&&a.readyState!==0&&a.readyState!==2)return k("onURL",1),a;a._lastURL=a.url;a.loaded=!1;a.readyState=1;a.playState=0;if(da(a._iO))d=a._setup_html5(a._iO),d._called_load?b._wD(l+"ignoring request to load again: "+a.sID):(b._wD(l+"load: "+a.sID),a._html5_canplay=!1,d.load(),d._called_load=
+!0,a._iO.autoPlay&&a.play());else try{a.isHTML5=!1,a._iO=ba(aa(a._iO)),i===8?b.o._load(a.sID,a._iO.url,a._iO.stream,a._iO.autoPlay,a._iO.whileloading?1:0,a._iO.loops||1,a._iO.usePolicyFile):b.o._load(a.sID,a._iO.url,a._iO.stream?!0:!1,a._iO.autoPlay?!0:!1,a._iO.loops||1,a._iO.autoLoad?!0:!1,a._iO.usePolicyFile)}catch(e){k("smError",2),q("onload",!1),G({type:"SMSOUND_LOAD_JS_EXCEPTION",fatal:!0})}return a};this.unload=function(){if(a.readyState!==0){b._wD('SMSound.unload(): "'+a.sID+'"');if(a.isHTML5){if(f(),
+a._a)a._a.pause(),a._a.src=""}else i===8?b.o._unload(a.sID,b.nullURL):b.o._unload(a.sID);e()}return a};this.destruct=function(c){b._wD('SMSound.destruct(): "'+a.sID+'"');if(a.isHTML5){if(f(),a._a)a._a.pause(),a._a.src="",R||a._remove_html5_events(),a._a._t=null,a._a=null}else a._iO.onfailure=null,b.o._destroySound(a.sID);c||b.destroySound(a.sID,!0)};this.start=this.play=function(c,e){var f,e=e===void 0?!0:e;c||(c={});a._iO=t(c,a._iO);a._iO=t(a._iO,a.options);a.instanceOptions=a._iO;if(a._iO.serverURL&&
+!a.connected)return a.getAutoPlay()||(b._wD("SMSound.play():  Netstream not connected yet - setting autoPlay"),a.setAutoPlay(!0)),a;da(a._iO)&&(a._setup_html5(a._iO),d());if(a.playState===1&&!a.paused)if(f=a._iO.multiShot)b._wD('SMSound.play(): "'+a.sID+'" already playing (multi-shot)',1);else return b._wD('SMSound.play(): "'+a.sID+'" already playing (one-shot)',1),a;if(a.loaded)b._wD('SMSound.play(): "'+a.sID+'"');else if(a.readyState===0){b._wD('SMSound.play(): Attempting to load "'+a.sID+'"',1);
+if(!a.isHTML5)a._iO.autoPlay=!0;a.load(a._iO)}else if(a.readyState===2)return b._wD('SMSound.play(): Could not load "'+a.sID+'" - exiting',2),a;else b._wD('SMSound.play(): "'+a.sID+'" is loading - attempting to play..',1);if(!a.isHTML5&&i===9&&a.position>0&&a.position===a.duration)b._wD('SMSound.play(): "'+a.sID+'": Sound at end, resetting to position:0'),a._iO.position=0;if(a.paused&&a.position&&a.position>0)b._wD('SMSound.play(): "'+a.sID+'" is resuming from paused state',1),a.resume();else{b._wD('SMSound.play(): "'+
+a.sID+'" is starting to play');a.playState=1;a.paused=!1;(!a.instanceCount||a._iO.multiShotEvents||!a.isHTML5&&i>8&&!a.getAutoPlay())&&a.instanceCount++;a.position=typeof a._iO.position!=="undefined"&&!isNaN(a._iO.position)?a._iO.position:0;if(!a.isHTML5)a._iO=ba(aa(a._iO));if(a._iO.onplay&&e)a._iO.onplay.apply(a),a._onplay_called=!0;a.setVolume(a._iO.volume,!0);a.setPan(a._iO.pan,!0);a.isHTML5?(d(),f=a._setup_html5(),a.setPosition(a._iO.position),f.play()):b.o._start(a.sID,a._iO.loops||1,i===9?a._iO.position:
+a._iO.position/1E3)}return a};this.stop=function(c){if(a.playState===1){a._onbufferchange(0);a.resetOnPosition(0);if(!a.isHTML5)a.playState=0;a.paused=!1;a._iO.onstop&&a._iO.onstop.apply(a);if(a.isHTML5){if(a._a)a.setPosition(0),a._a.pause(),a.playState=0,a._onTimer(),f(),a.unload()}else b.o._stop(a.sID,c),a._iO.serverURL&&a.unload();a.instanceCount=0;a._iO={}}return a};this.setAutoPlay=function(c){b._wD("sound "+a.sID+" turned autoplay "+(c?"on":"off"));a._iO.autoPlay=c;a.isHTML5||(b.o._setAutoPlay(a.sID,
+c),c&&!a.instanceCount&&a.readyState===1&&(a.instanceCount++,b._wD("sound "+a.sID+" incremented instance count to "+a.instanceCount)))};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition=function(c){c===void 0&&(c=0);var d=a.isHTML5?Math.max(c,0):Math.min(a.duration||a._iO.duration,Math.max(c,0));a.position=d;c=a.position/1E3;a.resetOnPosition(a.position);a._iO.position=d;if(a.isHTML5){if(a._a)if(a._html5_canplay){if(a._a.currentTime!==c){b._wD("setPosition("+c+"): setting position");
+try{a._a.currentTime=c,(a.playState===0||a.paused)&&a._a.pause()}catch(e){b._wD("setPosition("+c+"): setting position failed: "+e.message,2)}}}else b._wD("setPosition("+c+"): delaying, sound not ready")}else c=i===9?a.position:c,a.readyState&&a.readyState!==2&&b.o._setPosition(a.sID,c,a.paused||!a.playState);a.isHTML5&&a.paused&&a._onTimer(!0);return a};this.pause=function(c){if(a.paused||a.playState===0&&a.readyState!==1)return a;b._wD("SMSound.pause()");a.paused=!0;a.isHTML5?(a._setup_html5().pause(),
+f()):(c||c===void 0)&&b.o._pause(a.sID);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){if(!a.paused)return a;b._wD("SMSound.resume()");a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(),d()):(a._iO.isMovieStar&&a.setPosition(a.position),b.o._pause(a.sID));!a._onplay_called&&a._iO.onplay?(a._iO.onplay.apply(a),a._onplay_called=!0):a._iO.onresume&&a._iO.onresume.apply(a);return a};this.togglePause=function(){b._wD("SMSound.togglePause()");if(a.playState===0)return a.play({position:i===
+9&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(c,d){typeof c==="undefined"&&(c=0);typeof d==="undefined"&&(d=!1);a.isHTML5||b.o._setPan(a.sID,c);a._iO.pan=c;if(!d)a.pan=c,a.options.pan=c;return a};this.setVolume=function(c,d){typeof c==="undefined"&&(c=100);typeof d==="undefined"&&(d=!1);if(a.isHTML5){if(a._a)a._a.volume=Math.max(0,Math.min(1,c/100))}else b.o._setVolume(a.sID,b.muted&&!a.muted||a.muted?0:c);a._iO.volume=c;if(!d)a.volume=c,
+a.options.volume=c;return a};this.mute=function(){a.muted=!0;if(a.isHTML5){if(a._a)a._a.muted=!0}else b.o._setVolume(a.sID,0);return a};this.unmute=function(){a.muted=!1;var c=typeof a._iO.volume!=="undefined";if(a.isHTML5){if(a._a)a._a.muted=!1}else b.o._setVolume(a.sID,c?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=function(b,c,d){a._onPositionItems.push({position:b,method:c,scope:typeof d!=="undefined"?d:a,fired:!1});return a};
+this.processOnPosition=function(){var c,d;c=a._onPositionItems.length;if(!c||!a.playState||a._onPositionFired>=c)return!1;for(;c--;)if(d=a._onPositionItems[c],!d.fired&&a.position>=d.position)d.method.apply(d.scope,[d.position]),d.fired=!0,b._onPositionFired++;return!0};this.resetOnPosition=function(c){var d,e;d=a._onPositionItems.length;if(!d)return!1;for(;d--;)if(e=a._onPositionItems[d],e.fired&&c<=e.position)e.fired=!1,b._onPositionFired--;return!0};d=function(){a.isHTML5&&Ca(a)};f=function(){a.isHTML5&&
+Da(a)};e=function(){a._onPositionItems=[];a._onPositionFired=0;a._hasTimer=null;a._onplay_called=!1;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.position=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.failures=0;a.loaded=!1;a.playState=0;a.paused=!1;a.readyState=0;a.muted=!1;a.didBeforeFinish=!1;a.didJustBeforeFinish=!1;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};
+a.eqData=[];a.eqData.left=[];a.eqData.right=[]};e();this._onTimer=function(c){var d={};if(a._hasTimer||c)return a._a&&(c||(a.playState>0||a.readyState===1)&&!a.paused)?(a.duration=a._get_html5_duration(),a.durationEstimate=a.duration,c=a._a.currentTime?a._a.currentTime*1E3:0,a._whileplaying(c,d,d,d,d),!0):(b._wD('_onTimer: Warn for "'+a.sID+'": '+(!a._a?"Could not find element. ":"")+(a.playState===0?"playState bad, 0?":"playState = "+a.playState+", OK")),!1)};this._get_html5_duration=function(){var b=
+a._a?a._a.duration*1E3:a._iO?a._iO.duration:void 0;return b&&!isNaN(b)&&b!==Infinity?b:a._iO?a._iO.duration:null};this._setup_html5=function(c){var c=t(a._iO,c),d=R?b._global_a:a._a,f=decodeURI(c.url),g=d&&d._t?d._t.instanceOptions:null;if(d){if(d._t&&g.url===c.url&&(!a._lastURL||a._lastURL===g.url))return d;b._wD("setting new URL on existing object: "+f+(a._lastURL?", old URL: "+a._lastURL:""));R&&d._t&&d._t.playState&&c.url!==g.url&&d._t.stop();e();d.src=c.url;a.url=c.url;a._lastURL=c.url;d._called_load=
+!1}else if(b._wD("creating HTML5 Audio() element with URL: "+f),d=new Audio(c.url),d._called_load=!1,R)b._global_a=d;a.isHTML5=!0;a._a=d;d._t=a;a._add_html5_events();d.loop=c.loops>1?"loop":"";c.autoLoad||c.autoPlay?(d.autobuffer="auto",d.preload="auto",a.load(),d._called_load=!0):(d.autobuffer=!1,d.preload="none");d.loop=c.loops>1?"loop":"";return d};this._add_html5_events=function(){if(a._a._added_events)return!1;var c;b._wD(l+"adding event listeners: "+a.sID);a._a._added_events=!0;for(c in x)x.hasOwnProperty(c)&&
+a._a&&a._a.addEventListener(c,x[c],!1);return!0};this._remove_html5_events=function(){var c;b._wD(l+"removing event listeners: "+a.sID);a._a._added_events=!1;for(c in x)x.hasOwnProperty(c)&&a._a&&a._a.removeEventListener(c,x[c],!1)};this._onload=function(c){c=c?!0:!1;b._wD('SMSound._onload(): "'+a.sID+'"'+(c?" loaded.":" failed to load? - "+a.url),c?1:2);!c&&!a.isHTML5&&(b.sandbox.noRemote===!0&&b._wD("SMSound._onload(): "+n("noNet"),1),b.sandbox.noLocal===!0&&b._wD("SMSound._onload(): "+n("noLocal"),
+1));a.loaded=c;a.readyState=c?3:2;a._onbufferchange(0);a._iO.onload&&a._iO.onload.apply(a,[c]);return!0};this._onbufferchange=function(c){if(a.playState===0)return!1;if(c&&a.isBuffering||!c&&!a.isBuffering)return!1;a.isBuffering=c===1;a._iO.onbufferchange&&(b._wD("SMSound._onbufferchange(): "+c),a._iO.onbufferchange.apply(a));return!0};this._onfailure=function(c,d,e){a.failures++;b._wD('SMSound._onfailure(): "'+a.sID+'" count '+a.failures);if(a._iO.onfailure&&a.failures===1)a._iO.onfailure(a,c,d,
+e);else b._wD("SMSound._onfailure(): ignoring")};this._onbeforefinish=function(){if(!a.didBeforeFinish)a.didBeforeFinish=!0,a._iO.onbeforefinish&&(b._wD('SMSound._onbeforefinish(): "'+a.sID+'"'),a._iO.onbeforefinish.apply(a))};this._onjustbeforefinish=function(){if(!a.didJustBeforeFinish)a.didJustBeforeFinish=!0,a._iO.onjustbeforefinish&&(b._wD('SMSound._onjustbeforefinish(): "'+a.sID+'"'),a._iO.onjustbeforefinish.apply(a))};this._onfinish=function(){var c=a._iO.onfinish;a._onbufferchange(0);a.resetOnPosition(0);
+a._iO.onbeforefinishcomplete&&a._iO.onbeforefinishcomplete.apply(a);a.didBeforeFinish=!1;a.didJustBeforeFinish=!1;if(a.instanceCount){a.instanceCount--;if(!a.instanceCount)a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},f();if((!a.instanceCount||a._iO.multiShotEvents)&&c)b._wD('SMSound._onfinish(): "'+a.sID+'"'),c.apply(a)}};this._whileloading=function(b,c,d,e){a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(d);a.bufferLength=e;if(a._iO.isMovieStar)a.durationEstimate=
+a.duration;else if(a.durationEstimate=a._iO.duration?a.duration>a._iO.duration?a.duration:a._iO.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10),a.durationEstimate===void 0)a.durationEstimate=a.duration;a.readyState!==3&&a._iO.whileloading&&a._iO.whileloading.apply(a)};this._whileplaying=function(c,d,e,f,g){if(isNaN(c)||c===null)return!1;a.position=c;a.processOnPosition();if(!a.isHTML5&&i>8){if(a._iO.usePeakData&&typeof d!=="undefined"&&d)a.peakData={left:d.leftPeak,right:d.rightPeak};
+if(a._iO.useWaveformData&&typeof e!=="undefined"&&e)a.waveformData={left:e.split(","),right:f.split(",")};if(a._iO.useEQData&&typeof g!=="undefined"&&g&&g.leftEQ&&(c=g.leftEQ.split(","),a.eqData=c,a.eqData.left=c,typeof g.rightEQ!=="undefined"&&g.rightEQ))a.eqData.right=g.rightEQ.split(",")}a.playState===1&&(!a.isHTML5&&b.flashVersion===8&&!a.position&&a.isBuffering&&a._onbufferchange(0),a._iO.whileplaying&&a._iO.whileplaying.apply(a),(a.loaded||!a.loaded&&a._iO.isMovieStar)&&a._iO.onbeforefinish&&
+a._iO.onbeforefinishtime&&!a.didBeforeFinish&&a.duration-a.position<=a._iO.onbeforefinishtime&&a._onbeforefinish());return!0};this._onid3=function(c,d){b._wD('SMSound._onid3(): "'+this.sID+'" ID3 data received.');var e=[],f,g;f=0;for(g=c.length;f<g;f++)e[c[f]]=d[f];a.id3=t(a.id3,e);a._iO.onid3&&a._iO.onid3.apply(a)};this._onconnect=function(c){c=c===1;b._wD('SMSound._onconnect(): "'+a.sID+'"'+(c?" connected.":" failed to connect? - "+a.url),c?1:2);if(a.connected=c)a.failures=0,m(a.sID)&&(a.getAutoPlay()?
+a.play(void 0,a.getAutoPlay()):a._iO.autoLoad&&a.load()),a._iO.onconnect&&a._iO.onconnect.apply(a,[c])};this._ondataerror=function(c){a.playState>0&&(b._wD("SMSound._ondataerror(): "+c),a._iO.ondataerror&&a._iO.ondataerror.apply(a))}};Y=function(){return g.body||g._docElement||g.getElementsByTagName("div")[0]};r=function(b){return g.getElementById(b)};t=function(c,a){var e={},f,d;for(f in c)c.hasOwnProperty(f)&&(e[f]=c[f]);f=typeof a==="undefined"?b.defaultOptions:a;for(d in f)f.hasOwnProperty(d)&&
+typeof e[d]==="undefined"&&(e[d]=f[d]);return e};p=function(){function b(a){var a=Ga.call(a),c=a.length;e?(a[1]="on"+a[1],c>3&&a.pop()):c===3&&a.push(!1);return a}function a(a,b){var c=a.shift(),g=[f[b]];if(e)c[g](a[0],a[1]);else c[g].apply(c,a)}var e=h.attachEvent,f={add:e?"attachEvent":"addEventListener",remove:e?"detachEvent":"removeEventListener"};return{add:function(){a(b(arguments),"add")},remove:function(){a(b(arguments),"remove")}}}();da=function(c){return!c.serverURL&&(c.type?Q({type:c.type}):
+Q({url:c.url})||b.html5Only)};Q=function(c){function a(a){return b.preferFlash&&u&&!b.ignoreFlash&&typeof b.flash[a]!=="undefined"&&b.flash[a]}if(!b.useHTML5Audio||!b.hasHTML5)return!1;var e=c.url||null,c=c.type||null,f=b.audioFormats,d;if(c&&b.html5[c]!=="undefined")return b.html5[c]&&!a(c);if(!A){A=[];for(d in f)f.hasOwnProperty(d)&&(A.push(d),f[d].related&&(A=A.concat(f[d].related)));A=RegExp("\\.("+A.join("|")+")(\\?.*)?$","i")}d=e?e.toLowerCase().match(A):null;if(!d||!d.length)if(c)e=c.indexOf(";"),
+d=(e!==-1?c.substr(0,e):c).substr(6);else return!1;else d=d[1];return d&&typeof b.html5[d]!=="undefined"?b.html5[d]&&!a(d):(c="audio/"+d,e=b.html5.canPlayType({type:c}),(b.html5[d]=e)&&b.html5[c]&&!a(c))};Fa=function(){function c(c){var d,e,f=!1;if(!a||typeof a.canPlayType!=="function")return!1;if(c instanceof Array){d=0;for(e=c.length;d<e&&!f;d++)if(b.html5[c[d]]||a.canPlayType(c[d]).match(b.html5Test))f=!0,b.html5[c[d]]=!0,b.flash[c[d]]=!(!b.preferFlash||!u||!c[d].match(La));return f}else return c=
+a&&typeof a.canPlayType==="function"?a.canPlayType(c):!1,!(!c||!c.match(b.html5Test))}if(!b.useHTML5Audio||typeof Audio==="undefined")return!1;var a=typeof Audio!=="undefined"?Ra?new Audio(null):new Audio:null,e,f={},d,g;d=b.audioFormats;for(e in d)if(d.hasOwnProperty(e)&&(f[e]=c(d[e].type),f["audio/"+e]=f[e],b.flash[e]=b.preferFlash&&!b.ignoreFlash&&e.match(La)?!0:!1,d[e]&&d[e].related))for(g=d[e].related.length;g--;)f["audio/"+d[e].related[g]]=f[e],b.html5[d[e].related[g]]=f[e],b.flash[d[e].related[g]]=
+f[e];f.canPlayType=a?c:null;b.html5=t(b.html5,f);return!0};W={notReady:"Not loaded yet - wait for soundManager.onload()/onready()",notOK:"Audio support is not available.",domError:"soundManager::createMovie(): appendChild/innerHTML call failed. DOM not ready or other error.",spcWmode:"soundManager::createMovie(): Removing wmode, preventing known SWF loading issue(s)",swf404:"soundManager: Verify that %s is a valid path.",tryDebug:"Try soundManager.debugFlash = true for more security details (output goes to SWF.)",
+checkSWF:"See SWF output for more debug info.",localFail:"soundManager: Non-HTTP page ("+g.location.protocol+" URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/",waitFocus:"soundManager: Special case: Waiting for focus-related event..",waitImpatient:"soundManager: Getting impatient, still waiting for Flash%s...",waitForever:"soundManager: Waiting indefinitely for Flash (will recover if unblocked)...",
+needFunction:"soundManager: Function object expected for %s",badID:'Warning: Sound ID "%s" should be a string, starting with a non-numeric character',noMS:"MovieStar mode not enabled. Exiting.",currentObj:"--- soundManager._debug(): Current sound objects ---",waitEI:"soundManager::initMovie(): Waiting for ExternalInterface call from Flash..",waitOnload:"soundManager: Waiting for window.onload()",docLoaded:"soundManager: Document already loaded",onload:"soundManager::initComplete(): calling soundManager.onload()",
+onloadOK:"soundManager.onload() complete",init:"soundManager::init()",didInit:"soundManager::init(): Already called?",flashJS:"soundManager: Attempting to call Flash from JS..",noPolling:"soundManager: Polling (whileloading()/whileplaying() support) is disabled.",secNote:"Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html",
+badRemove:"Warning: Failed to remove flash movie.",noPeak:"Warning: peakData features unsupported for movieStar formats",shutdown:"soundManager.disable(): Shutting down",queue:"soundManager: Queueing %s handler",smFail:"soundManager: Failed to initialise.",smError:"SMSound.load(): Exception: JS-Flash communication failed, or JS error.",fbTimeout:"No flash response, applying ."+b.swfCSS.swfTimedout+" CSS..",fbLoaded:"Flash loaded",fbHandler:"soundManager::flashBlockHandler()",manURL:"SMSound.load(): Using manually-assigned URL",
+onURL:"soundManager.load(): current URL already assigned.",badFV:'soundManager.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',as2loop:"Note: Setting stream:false so looping can work (flash 8 limitation)",noNSLoop:"Note: Looping not implemented for MovieStar formats",needfl9:"Note: Switching to flash 9, required for MP4 formats.",mfTimeout:"Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case",mfOn:"mobileFlash::enabling on-screen flash repositioning",policy:"Enabling usePolicyFile for data access"};
+n=function(){var b=Ga.call(arguments),a=b.shift(),a=W&&W[a]?W[a]:"",e,f;if(a&&b&&b.length){e=0;for(f=b.length;e<f;e++)a=a.replace("%s",b[e])}return a};aa=function(b){if(i===8&&b.loops>1&&b.stream)k("as2loop"),b.stream=!1;return b};ba=function(c,a){if(c&&!c.usePolicyFile&&(c.onid3||c.usePeakData||c.useWaveformData||c.useEQData))b._wD((a||"")+n("policy")),c.usePolicyFile=!0;return c};pa=function(c){typeof console!=="undefined"&&typeof console.warn!=="undefined"?console.warn(c):b._wD(c)};ga=function(){return!1};
+za=function(b){for(var a in b)b.hasOwnProperty(a)&&typeof b[a]==="function"&&(b[a]=ga)};$=function(c){typeof c==="undefined"&&(c=!1);if(v||c)k("smFail",2),b.disable(c)};Aa=function(c){var a=null;if(c)if(c.match(/\.swf(\?.*)?$/i)){if(a=c.substr(c.toLowerCase().lastIndexOf(".swf?")+4))return c}else c.lastIndexOf("/")!==c.length-1&&(c+="/");return(c&&c.lastIndexOf("/")!==-1?c.substr(0,c.lastIndexOf("/")+1):"./")+b.movieURL};ka=function(){if(i!==8&&i!==9)b._wD(n("badFV",i,8)),b.flashVersion=8;var c=b.debugMode||
+b.debugFlash?"_debug.swf":".swf";if(b.useHTML5Audio&&!b.html5Only&&b.audioFormats.mp4.required&&b.flashVersion<9)b._wD(n("needfl9")),b.flashVersion=9;i=b.flashVersion;b.version=b.versionNumber+(b.html5Only?" (HTML5-only mode)":i===9?" (AS3/Flash 9)":" (AS2/Flash 8)");if(i>8)b.defaultOptions=t(b.defaultOptions,b.flash9Options),b.features.buffering=!0;i>8&&b.useMovieStar?(b.defaultOptions=t(b.defaultOptions,b.movieStarOptions),b.filePatterns.flash9=RegExp("\\.(mp3|"+b.netStreamTypes.join("|")+")(\\?.*)?$",
+"i"),b.mimePattern=b.netStreamMimeTypes,b.features.movieStar=!0):(b.useMovieStar=!1,b.features.movieStar=!1);b.filePattern=b.filePatterns[i!==8?"flash9":"flash8"];b.movieURL=(i===8?"soundmanager2.swf":"soundmanager2_flash9.swf").replace(".swf",c);b.features.peakData=b.features.waveformData=b.features.eqData=i>8};ya=function(c,a){if(!b.o||!b.allowPolling)return!1;b.o._setPolling(c,a)};ma=function(){if(b.debugURLParam.test(L))b.debugMode=!0;if(r(b.debugID))return!1;var c,a,e,f;if(b.debugMode&&!r(b.debugID)&&
+(!ta||!b.useConsole||b.useConsole&&ta&&!b.consoleOnly)){c=g.createElement("div");c.id=b.debugID+"-toggle";a={position:"fixed",bottom:"0px",right:"0px",width:"1.2em",height:"1.2em",lineHeight:"1.2em",margin:"2px",textAlign:"center",border:"1px solid #999",cursor:"pointer",background:"#fff",color:"#333",zIndex:10001};c.appendChild(g.createTextNode("-"));c.onclick=Ba;c.title="Toggle SM2 debug console";if(s.match(/msie 6/i))c.style.position="absolute",c.style.cursor="hand";for(f in a)a.hasOwnProperty(f)&&
+(c.style[f]=a[f]);a=g.createElement("div");a.id=b.debugID;a.style.display=b.debugMode?"block":"none";if(b.debugMode&&!r(c.id)){try{e=Y(),e.appendChild(c)}catch(d){throw Error(n("domError")+" \n"+d.toString());}e.appendChild(a)}}};m=this.getSoundById;k=function(c,a){return c?b._wD(n(c),a):""};if(L.indexOf("sm2-debug=alert")+1&&b.debugMode)b._wD=function(b){S.alert(b)};Ba=function(){var c=r(b.debugID),a=r(b.debugID+"-toggle");if(!c)return!1;ha?(a.innerHTML="+",c.style.display="none"):(a.innerHTML="-",
+c.style.display="block");ha=!ha};q=function(b,a,e){if(typeof sm2Debugger!=="undefined")try{sm2Debugger.handleEvent(b,a,e)}catch(f){}return!0};H=function(){var c=[];b.debugMode&&c.push(b.swfCSS.sm2Debug);b.debugFlash&&c.push(b.swfCSS.flashDebug);b.useHighPerformance&&c.push(b.swfCSS.highPerf);return c.join(" ")};oa=function(){var c=n("fbHandler"),a=b.getMoviePercent(),e=b.swfCSS,f={type:"FLASHBLOCK"};if(b.html5Only)return!1;if(b.ok()){if(b.didFlashBlock&&b._wD(c+": Unblocked"),b.oMC)b.oMC.className=
+[H(),e.swfDefault,e.swfLoaded+(b.didFlashBlock?" "+e.swfUnblocked:"")].join(" ")}else{if(w)b.oMC.className=H()+" "+e.swfDefault+" "+(a===null?e.swfTimedout:e.swfError),b._wD(c+": "+n("fbTimeout")+(a?" ("+n("fbLoaded")+")":""));b.didFlashBlock=!0;D({type:"ontimeout",ignoreInit:!0,error:f});G(f)}};ja=function(b,a,e){typeof z[b]==="undefined"&&(z[b]=[]);z[b].push({method:a,scope:e||null,fired:!1})};D=function(c){c||(c={type:"onready"});if(!j&&c&&!c.ignoreInit)return!1;if(c.type==="ontimeout"&&b.ok())return!1;
+var a={success:c&&c.ignoreInit?b.ok():!v},e=c&&c.type?z[c.type]||[]:[],f=[],d,g=[a],k=w&&b.useFlashBlock&&!b.ok();if(c.error)g[0].error=c.error;a=0;for(d=e.length;a<d;a++)e[a].fired!==!0&&f.push(e[a]);if(f.length){b._wD("soundManager: Firing "+f.length+" "+c.type+"() item"+(f.length===1?"":"s"));a=0;for(d=f.length;a<d;a++)if(f[a].scope?f[a].method.apply(f[a].scope,g):f[a].method.apply(this,g),!k)f[a].fired=!0}return!0};E=function(){h.setTimeout(function(){b.useFlashBlock&&oa();D();b.onload instanceof
+Function&&(k("onload",1),b.onload.apply(h),k("onloadOK",1));b.waitForWindowLoad&&p.add(h,"load",E)},1)};ea=function(){if(u!==void 0)return u;var b=!1,a=navigator,e=a.plugins,f,d=h.ActiveXObject;if(e&&e.length)(a=a.mimeTypes)&&a["application/x-shockwave-flash"]&&a["application/x-shockwave-flash"].enabledPlugin&&a["application/x-shockwave-flash"].enabledPlugin.description&&(b=!0);else if(typeof d!=="undefined"){try{f=new d("ShockwaveFlash.ShockwaveFlash")}catch(g){}b=!!f}return u=b};Ea=function(){var c,
+a;if(s.match(/iphone os (1|2|3_0|3_1)/i)){b.hasHTML5=!1;b.html5Only=!0;if(b.oMC)b.oMC.style.display="none";return!1}if(b.useHTML5Audio){if(!b.html5||!b.html5.canPlayType)return b._wD("SoundManager: No HTML5 Audio() support detected."),b.hasHTML5=!1,!0;else b.hasHTML5=!0;if(sa&&(b._wD("soundManager::Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - "+(!u?" would use flash fallback for MP3/MP4, but none detected.":"will use flash fallback for MP3/MP4, if available"),
+1),ea()))return!0}else return!0;for(a in b.audioFormats)if(b.audioFormats.hasOwnProperty(a)&&(b.audioFormats[a].required&&!b.html5.canPlayType(b.audioFormats[a].type)||b.flash[a]||b.flash[b.audioFormats[a].type]))c=!0;b.ignoreFlash&&(c=!1);b.html5Only=b.hasHTML5&&b.useHTML5Audio&&!c;return!b.html5Only};Ca=function(b){if(!b._hasTimer)b._hasTimer=!0};Da=function(b){if(b._hasTimer)b._hasTimer=!1};G=function(c){c=typeof c!=="undefined"?c:{};b.onerror instanceof Function&&b.onerror.apply(h,[{type:typeof c.type!==
+"undefined"?c.type:null}]);typeof c.fatal!=="undefined"&&c.fatal&&b.disable()};Ha=function(){if(!sa||!ea())return!1;var c=b.audioFormats,a,e;for(e in c)if(c.hasOwnProperty(e)&&(e==="mp3"||e==="mp4"))if(b._wD("soundManager: Using flash fallback for "+e+" format"),b.html5[e]=!1,c[e]&&c[e].related)for(a=c[e].related.length;a--;)b.html5[c[e].related[a]]=!1};this._setSandboxType=function(c){var a=b.sandbox;a.type=c;a.description=a.types[typeof a.types[c]!=="undefined"?c:"unknown"];b._wD("Flash security sandbox type: "+
+a.type);if(a.type==="localWithFile")a.noRemote=!0,a.noLocal=!1,k("secNote",2);else if(a.type==="localWithNetwork")a.noRemote=!1,a.noLocal=!0;else if(a.type==="localTrusted")a.noRemote=!1,a.noLocal=!1};this._externalInterfaceOK=function(c){if(b.swfLoaded)return!1;var a=(new Date).getTime();b._wD("soundManager::externalInterfaceOK()"+(c?" (~"+(a-c)+" ms)":""));q("swf",!0);q("flashtojs",!0);b.swfLoaded=!0;J=!1;sa&&Ha();y?setTimeout(U,100):U()};Z=function(c,a){function e(){b._wD("-- SoundManager 2 "+
+b.version+(!b.html5Only&&b.useHTML5Audio?b.hasHTML5?" + HTML5 audio":", no HTML5 audio support":"")+(!b.html5Only?(b.useMovieStar?", MovieStar mode":"")+(b.useHighPerformance?", high performance mode, ":", ")+((b.flashPollingInterval?"custom ("+b.flashPollingInterval+"ms)":b.useFastPolling?"fast":"normal")+" polling")+(b.wmode?", wmode: "+b.wmode:"")+(b.debugFlash?", flash debug mode":"")+(b.useFlashBlock?", flashBlock mode":""):"")+" --",1)}function f(a,b){return'<param name="'+a+'" value="'+b+'" />'}
+if(M&&N)return!1;if(b.html5Only)return ka(),e(),b.oMC=r(b.movieID),U(),N=M=!0,!1;var d=a||b.url,l=b.altURL||d,h;h=Y();var i,o,j=H(),m,p=null,p=(p=g.getElementsByTagName("html")[0])&&p.dir&&p.dir.match(/rtl/i),c=typeof c==="undefined"?b.id:c;ka();b.url=Aa(K?d:l);a=b.url;b.wmode=!b.wmode&&b.useHighPerformance&&!b.useMovieStar?"transparent":b.wmode;if(b.wmode!==null&&(s.match(/msie 8/i)||!y&&!b.useHighPerformance)&&navigator.platform.match(/win32|win64/i))b.specialWmodeCase=!0,k("spcWmode"),b.wmode=
+null;h={name:c,id:c,src:a,width:"auto",height:"auto",quality:"high",allowScriptAccess:b.allowScriptAccess,bgcolor:b.bgColor,pluginspage:Ma+"//www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:b.wmode,hasPriority:"true"};if(b.debugFlash)h.FlashVars="debug=1";b.wmode||delete h.wmode;if(y)d=g.createElement("div"),o=['<object id="'+c+'" data="'+a+'" type="'+h.type+'" title="'+h.title+'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+
+Ma+'//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="'+h.width+'" height="'+h.height+'">',f("movie",a),f("AllowScriptAccess",b.allowScriptAccess),f("quality",h.quality),b.wmode?f("wmode",b.wmode):"",f("bgcolor",b.bgColor),f("hasPriority","true"),b.debugFlash?f("FlashVars",h.FlashVars):"","</object>"].join("");else for(i in d=g.createElement("embed"),h)h.hasOwnProperty(i)&&d.setAttribute(i,h[i]);ma();j=H();if(h=Y())if(b.oMC=r(b.movieID)||g.createElement("div"),
+b.oMC.id){m=b.oMC.className;b.oMC.className=(m?m+" ":b.swfCSS.swfDefault)+(j?" "+j:"");b.oMC.appendChild(d);if(y)i=b.oMC.appendChild(g.createElement("div")),i.className=b.swfCSS.swfBox,i.innerHTML=o;N=!0}else{b.oMC.id=b.movieID;b.oMC.className=b.swfCSS.swfDefault+" "+j;i=j=null;if(!b.useFlashBlock)if(b.useHighPerformance)j={position:"fixed",width:"8px",height:"8px",bottom:"0px",left:"0px",overflow:"hidden"};else if(j={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},p)j.left=
+Math.abs(parseInt(j.left,10))+"px";if(Qa)b.oMC.style.zIndex=1E4;if(!b.debugFlash)for(m in j)j.hasOwnProperty(m)&&(b.oMC.style[m]=j[m]);try{y||b.oMC.appendChild(d);h.appendChild(b.oMC);if(y)i=b.oMC.appendChild(g.createElement("div")),i.className=b.swfCSS.swfBox,i.innerHTML=o;N=!0}catch(q){throw Error(n("domError")+" \n"+q.toString());}}M=!0;e();b._wD("soundManager::createMovie(): Trying to load "+a+(!K&&b.altURL?" (alternate URL)":""),1);return!0};X=function(){if(b.html5Only)return Z(),!1;if(b.o)return!1;
+b.o=b.getMovie(b.id);if(!b.o)P?(y?b.oMC.innerHTML=na:b.oMC.appendChild(P),P=null,M=!0):Z(b.id,b.url),b.o=b.getMovie(b.id);b.o&&k("waitEI");b.oninitmovie instanceof Function&&setTimeout(b.oninitmovie,1);return!0};V=function(){setTimeout(xa,1E3)};xa=function(){if(ca)return!1;ca=!0;p.remove(h,"load",V);if(J&&!ua)return k("waitFocus"),!1;var c;j||(c=b.getMoviePercent(),b._wD(n("waitImpatient",c===100?" (SWF loaded)":c>0?" (SWF "+c+"% loaded)":"")));setTimeout(function(){c=b.getMoviePercent();j||(b._wD("soundManager: No Flash response within expected time.\nLikely causes: "+
+(c===0?"Loading "+b.movieURL+" may have failed (and/or Flash "+i+"+ not present?), ":"")+"Flash blocked or JS-Flash security error."+(b.debugFlash?" "+n("checkSWF"):""),2),!K&&c&&(k("localFail",2),b.debugFlash||k("tryDebug",2)),c===0&&b._wD(n("swf404",b.url)),q("flashtojs",!1,": Timed out"+K?" (Check flash security or flash blockers)":" (No plugin/missing SWF?)"));!j&&Ka&&(c===null?b.useFlashBlock||b.flashLoadTimeout===0?(b.useFlashBlock&&oa(),k("waitForever")):$(!0):b.flashLoadTimeout===0?k("waitForever"):
+$(!0))},b.flashLoadTimeout)};C=function(){function c(){p.remove(h,"focus",C);p.remove(h,"load",C)}if(ua||!J)return c(),!0;ua=Ka=!0;b._wD("soundManager::handleFocus()");I&&J&&p.remove(h,"mousemove",C);ca=!1;c();return!0};O=function(c){if(j)return!1;if(b.html5Only)return b._wD("-- SoundManager 2: loaded --"),j=!0,E(),q("onload",!0),!0;var a;if(!b.useFlashBlock||!b.flashLoadTimeout||b.getMoviePercent())j=!0,v&&(a={type:!u&&w?"NO_FLASH":"INIT_TIMEOUT"});b._wD("-- SoundManager 2 "+(v?"failed to load":
+"loaded")+" ("+(v?"security/load error":"OK")+") --",1);if(v||c){if(b.useFlashBlock&&b.oMC)b.oMC.className=H()+" "+(b.getMoviePercent()===null?b.swfCSS.swfTimedout:b.swfCSS.swfError);D({type:"ontimeout",error:a});q("onload",!1);G(a);return!1}else q("onload",!0);p.add(h,"unload",ga);if(b.waitForWindowLoad&&!ia)return k("waitOnload"),p.add(h,"load",E),!1;else b.waitForWindowLoad&&ia&&k("docLoaded"),E();return!0};Ia=function(){var c,a=[];if(b.useHTML5Audio&&b.hasHTML5){for(c in b.audioFormats)b.audioFormats.hasOwnProperty(c)&&
+a.push(c+": "+b.html5[c]+(!b.html5[c]&&u&&b.flash[c]?" (using flash)":b.preferFlash&&b.flash[c]&&u?" (preferring flash)":!b.html5[c]?" ("+(b.audioFormats[c].required?"required, ":"")+"and no flash support)":""));b._wD("-- SoundManager 2: HTML5 support tests ("+b.html5Test+"): "+a.join(", ")+" --",1)}};U=function(){k("init");if(j)return k("didInit"),!1;if(b.html5Only){if(!j)p.remove(h,"load",b.beginDelayedInit),b.enabled=!0,O();return!0}X();try{k("flashJS"),b.o._externalInterfaceTest(!1),b.allowPolling?
+ya(!0,b.flashPollingInterval||(b.useFastPolling?10:50)):k("noPolling",1),b.debugMode||b.o._disableDebug(),b.enabled=!0,q("jstoflash",!0)}catch(c){return b._wD("js/flash exception: "+c.toString()),q("jstoflash",!1),G({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),$(!0),O(),!1}O();p.remove(h,"load",b.beginDelayedInit);return!0};F=function(){if(la)return!1;la=!0;ma();(function(){var c=L.toLowerCase(),a=null,a=null,e=typeof console!=="undefined"&&typeof console.log!=="undefined";if(c.indexOf("sm2-usehtml5audio=")!==
+-1)a=c.charAt(c.indexOf("sm2-usehtml5audio=")+18)==="1",e&&console.log((a?"Enabling ":"Disabling ")+"useHTML5Audio via URL parameter"),b.useHTML5Audio=a;if(c.indexOf("sm2-preferflash=")!==-1)a=c.charAt(c.indexOf("sm2-preferflash=")+16)==="1",e&&console.log((a?"Enabling ":"Disabling ")+"preferFlash via URL parameter"),b.preferFlash=a})();if(!u&&b.hasHTML5)b._wD("SoundManager: No Flash detected"+(!b.useHTML5Audio?", enabling HTML5.":". Trying HTML5-only mode.")),b.useHTML5Audio=!0,b.preferFlash=!1;
+Fa();b.html5.usingFlash=Ea();w=b.html5.usingFlash;Ia();if(!u&&w)b._wD("SoundManager: Fatal error: Flash is needed to play some required formats, but is not available."),b.flashLoadTimeout=1;g.removeEventListener&&g.removeEventListener("DOMContentLoaded",F,!1);X();return!0};ra=function(){g.readyState==="complete"&&(F(),g.detachEvent("onreadystatechange",ra));return!0};ea();p.add(h,"focus",C);p.add(h,"load",C);p.add(h,"load",V);I&&J&&p.add(h,"mousemove",C);g.addEventListener?g.addEventListener("DOMContentLoaded",
+F,!1):g.attachEvent?g.attachEvent("onreadystatechange",ra):(q("onload",!1),G({type:"NO_DOM2_EVENTS",fatal:!0}));g.readyState==="complete"&&setTimeout(F,100)}var fa=null;if(typeof SM2_DEFER==="undefined"||!SM2_DEFER)fa=new T;S.SoundManager=T;S.soundManager=fa})(window);
Index: /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2-nodebug-jsmin.js
===================================================================
--- /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2-nodebug-jsmin.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2-nodebug-jsmin.js	(revision 28388)
@@ -0,0 +1,76 @@
+/** @license
+
+ SoundManager 2: JavaScript Sound for the Web
+ ----------------------------------------------
+ http://schillmania.com/projects/soundmanager2/
+
+ Copyright (c) 2007, Scott Schiller. All rights reserved.
+ Code provided under the BSD License:
+ http://schillmania.com/projects/soundmanager2/license.txt
+
+ V2.97a.20110801
+*/
+(function(Z){function M(M,Y){function l(b){return function(a){return!this._t||!this._t._a?null:b.call(this,a)}}this.flashVersion=8;this.debugFlash=this.debugMode=!1;this.useConsole=!0;this.waitForWindowLoad=this.consoleOnly=!1;this.nullURL="about:blank";this.allowPolling=!0;this.useFastPolling=!1;this.useMovieStar=!0;this.bgColor="#ffffff";this.useHighPerformance=!1;this.flashPollingInterval=null;this.flashLoadTimeout=1E3;this.wmode=null;this.allowScriptAccess="always";this.useFlashBlock=!1;this.useHTML5Audio=
+!0;this.html5Test=/^(probably|maybe)$/i;this.preferFlash=!0;this.audioFormats={mp3:{type:['audio/mpeg; codecs="mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a"],type:['audio/mp4; codecs="mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs=vorbis"],required:!1},wav:{type:['audio/wav; codecs="1"',"audio/wav","audio/wave","audio/x-wav"],required:!1}};this.defaultOptions={autoLoad:!1,
+stream:!0,autoPlay:!1,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onstop:null,onfailure:null,onfinish:null,onbeforefinish:null,onbeforefinishtime:5E3,onbeforefinishcomplete:null,onjustbeforefinish:null,onjustbeforefinishtime:200,multiShot:!0,multiShotEvents:!1,position:null,pan:0,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null,usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};
+this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.version=null;this.versionNumber="V2.97a.20110801";this.movieURL=null;this.url=M||null;this.altURL=null;this.enabled=this.swfLoaded=!1;this.o=null;this.movieID="sm2-container";this.id=Y||"sm2movie";this.swfCSS={swfBox:"sm2-object-box",swfDefault:"movieContainer",swfError:"swf_error",swfTimedout:"swf_timedout",swfLoaded:"swf_loaded",swfUnblocked:"swf_unblocked",sm2Debug:"sm2_debug",highPerf:"high_performance",flashDebug:"flash_debug"};
+this.oMC=null;this.sounds={};this.soundIDs=[];this.muted=!1;this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.didFlashBlock=this.specialWmodeCase=!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.baseMimeTypes=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.netStreamMimeTypes=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.netStreamTypes=["aac","flv","mov","mp4","m4v","f4v","m4a","mp4v","3gp","3g2"];this.netStreamPattern=
+RegExp("\\.("+this.netStreamTypes.join("|")+")(\\?.*)?$","i");this.mimePattern=this.baseMimeTypes;this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={};this.hasHTML5=typeof Audio!=="undefined"&&typeof(new Audio).canPlayType!=="undefined";this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=!1;var pa,b=this,F,o=navigator.userAgent,h=Z,$=h.location.href.toString(),i=this.flashVersion,g=document,aa,N,t=[],G=!1,H=!1,m=!1,u=!1,qa=!1,I,n,ba,
+y,z,O,ra,ca,w,P,A,da,ea,Q,B,sa,fa,ta,R,ua,J=null,ga=null,x,ha,C,S,T,ia,j,U=!1,ja=!1,va,wa,q=null,xa,V,K,v,ka,ya,k,Fa=Array.prototype.slice,L=!1,p,W,za,r,Aa,Ba=o.match(/(ipad|iphone|ipod)/i),Ga=o.match(/(mobile|pre\/|xoom)/i)||Ba,s=o.match(/msie/i),Ha=o.match(/webkit/i),D=o.match(/safari/i)&&!o.match(/chrome/i),Ia=o.match(/opera/i),la=!$.match(/usehtml5audio/i)&&!$.match(/sm2\-ignorebadua/i)&&D&&o.match(/OS X 10_6_([3-7])/i),ma=typeof g.hasFocus!=="undefined"?g.hasFocus():null,E=D&&typeof g.hasFocus===
+"undefined",Ca=!E,Da=/(mp3|mp4|mpa)/i,na=g.location?g.location.protocol.match(/http/i):null,Ea=!na?"http:":"";this.useAltURL=!na;this._global_a=null;if(Ga&&(b.useHTML5Audio=!0,b.preferFlash=!1,Ba))L=b.ignoreFlash=!0;this.supported=this.ok=function(){return q?m&&!u:b.useHTML5Audio&&b.hasHTML5};this.getMovie=function(b){return s?h[b]:D?F(b)||g[b]:F(b)};this.createSound=function(c){function a(){e=S(e);b.sounds[d.id]=new pa(d);b.soundIDs.push(d.id);return b.sounds[d.id]}var e=null,f=null,d=null;if(!m||
+!b.ok())return ia("soundManager.createSound(): "+x(!m?"notReady":"notOK")),!1;arguments.length===2&&(c={id:arguments[0],url:arguments[1]});d=e=n(c);if(j(d.id,!0))return b.sounds[d.id];if(V(d))f=a(),f._setup_html5(d);else{if(i>8&&b.useMovieStar){if(d.isMovieStar===null)d.isMovieStar=d.serverURL||d.type&&d.type.match(b.netStreamPattern)||d.url.match(b.netStreamPattern)?!0:!1;if(d.isMovieStar&&d.usePeakData)d.usePeakData=!1}d=T(d,"soundManager.createSound(): ");f=a();if(i===8)b.o._createSound(d.id,d.onjustbeforefinishtime,
+d.loops||1,d.usePolicyFile);else if(b.o._createSound(d.id,d.url,d.onjustbeforefinishtime,d.usePeakData,d.useWaveformData,d.useEQData,d.isMovieStar,d.isMovieStar?d.bufferTime:!1,d.loops||1,d.serverURL,d.duration||null,d.autoPlay,!0,d.autoLoad,d.usePolicyFile),!d.serverURL)f.connected=!0,d.onconnect&&d.onconnect.apply(f);!d.serverURL&&(d.autoLoad||d.autoPlay)&&f.load(d)}!d.serverURL&&d.autoPlay&&f.play();return f};this.destroySound=function(c,a){if(!j(c))return!1;var e=b.sounds[c],f;e._iO={};e.stop();
+e.unload();for(f=0;f<b.soundIDs.length;f++)if(b.soundIDs[f]===c){b.soundIDs.splice(f,1);break}a||e.destruct(!0);delete b.sounds[c];return!0};this.load=function(c,a){return!j(c)?!1:b.sounds[c].load(a)};this.unload=function(c){return!j(c)?!1:b.sounds[c].unload()};this.start=this.play=function(c,a){return!m||!b.ok()?(ia("soundManager.play(): "+x(!m?"notReady":"notOK")),!1):!j(c)?(a instanceof Object||(a={url:a}),a&&a.url?(a.id=c,b.createSound(a).play()):!1):b.sounds[c].play(a)};this.setPosition=function(c,
+a){return!j(c)?!1:b.sounds[c].setPosition(a)};this.stop=function(c){return!j(c)?!1:b.sounds[c].stop()};this.stopAll=function(){for(var c in b.sounds)b.sounds.hasOwnProperty(c)&&b.sounds[c].stop()};this.pause=function(c){return!j(c)?!1:b.sounds[c].pause()};this.pauseAll=function(){var c;for(c=b.soundIDs.length;c--;)b.sounds[b.soundIDs[c]].pause()};this.resume=function(c){return!j(c)?!1:b.sounds[c].resume()};this.resumeAll=function(){var c;for(c=b.soundIDs.length;c--;)b.sounds[b.soundIDs[c]].resume()};
+this.togglePause=function(c){return!j(c)?!1:b.sounds[c].togglePause()};this.setPan=function(c,a){return!j(c)?!1:b.sounds[c].setPan(a)};this.setVolume=function(c,a){return!j(c)?!1:b.sounds[c].setVolume(a)};this.mute=function(c){var a=0;typeof c!=="string"&&(c=null);if(c)return!j(c)?!1:b.sounds[c].mute();else{for(a=b.soundIDs.length;a--;)b.sounds[b.soundIDs[a]].mute();b.muted=!0}return!0};this.muteAll=function(){b.mute()};this.unmute=function(c){typeof c!=="string"&&(c=null);if(c)return!j(c)?!1:b.sounds[c].unmute();
+else{for(c=b.soundIDs.length;c--;)b.sounds[b.soundIDs[c]].unmute();b.muted=!1}return!0};this.unmuteAll=function(){b.unmute()};this.toggleMute=function(c){return!j(c)?!1:b.sounds[c].toggleMute()};this.getMemoryUse=function(){var c=0;b.o&&i!==8&&(c=parseInt(b.o._getMemoryUse(),10));return c};this.disable=function(c){var a;typeof c==="undefined"&&(c=!1);if(u)return!1;u=!0;for(a=b.soundIDs.length;a--;)ta(b.sounds[b.soundIDs[a]]);I(c);k.remove(h,"load",z);return!0};this.canPlayMIME=function(c){var a;b.hasHTML5&&
+(a=K({type:c}));return!q||a?a:c?c.match(b.mimePattern)?!0:!1:null};this.canPlayURL=function(c){var a;b.hasHTML5&&(a=K({url:c}));return!q||a?a:c?c.match(b.filePattern)?!0:!1:null};this.canPlayLink=function(c){return typeof c.type!=="undefined"&&c.type&&b.canPlayMIME(c.type)?!0:b.canPlayURL(c.href)};this.getSoundById=function(c){if(!c)throw Error("soundManager.getSoundById(): sID is null/undefined");return b.sounds[c]};this.onready=function(b,a){if(b&&b instanceof Function)return a||(a=h),ba("onready",
+b,a),y(),!0;else throw x("needFunction","onready");};this.ontimeout=function(b,a){if(b&&b instanceof Function)return a||(a=h),ba("ontimeout",b,a),y({type:"ontimeout"}),!0;else throw x("needFunction","ontimeout");};this._wD=this._writeDebug=function(){return!0};this._debug=function(){};this.reboot=function(){var c,a;for(c=b.soundIDs.length;c--;)b.sounds[b.soundIDs[c]].destruct();try{if(s)ga=b.o.innerHTML;J=b.o.parentNode.removeChild(b.o)}catch(e){}ga=J=q=null;b.enabled=da=m=U=ja=G=H=u=b.swfLoaded=
+!1;b.soundIDs=b.sounds=[];b.o=null;for(c in t)if(t.hasOwnProperty(c))for(a=t[c].length;a--;)t[c][a].fired=!1;h.setTimeout(b.beginDelayedInit,20)};this.getMoviePercent=function(){return b.o&&typeof b.o.PercentLoaded!=="undefined"?b.o.PercentLoaded():null};this.beginDelayedInit=function(){qa=!0;A();setTimeout(function(){if(ja)return!1;Q();P();return ja=!0},20);O()};this.destruct=function(){b.disable(!0)};r={abort:l(function(){}),canplay:l(function(){if(this._t._html5_canplay)return!0;this._t._html5_canplay=
+!0;this._t._onbufferchange(0);var b=!isNaN(this._t.position)?this._t.position/1E3:null;if(this._t.position&&this.currentTime!==b)try{this.currentTime=b}catch(a){}}),load:l(function(){this._t.loaded||(this._t._onbufferchange(0),this._t._whileloading(this._t.bytesTotal,this._t.bytesTotal,this._t._get_html5_duration()),this._t._onload(!0))}),emptied:l(function(){}),ended:l(function(){this._t._onfinish()}),error:l(function(){this._t._onload(!1)}),loadeddata:l(function(){var b=this._t,a=b.bytesTotal||
+1;if(!b._loaded&&!D)b.duration=b._get_html5_duration(),b._whileloading(a,a,b._get_html5_duration()),b._onload(!0)}),loadedmetadata:l(function(){}),loadstart:l(function(){this._t._onbufferchange(1)}),play:l(function(){this._t._onbufferchange(0)}),playing:l(function(){this._t._onbufferchange(0)}),progress:l(function(b){if(this._t.loaded)return!1;var a,e=0,f=b.type==="progress",d=b.target.buffered;a=b.loaded||0;var oa=b.total||1;if(d&&d.length){for(a=d.length;a--;)e=d.end(a)-d.start(a);a=e/b.target.duration;
+f&&isNaN(a)}isNaN(a)||(this._t._onbufferchange(0),this._t._whileloading(a,oa,this._t._get_html5_duration()),a&&oa&&a===oa&&r.load.call(this,b))}),ratechange:l(function(){}),suspend:l(function(b){r.progress.call(this,b)}),stalled:l(function(){}),timeupdate:l(function(){this._t._onTimer()}),waiting:l(function(){this._t._onbufferchange(1)})};pa=function(c){var a=this,e,f,d;this.sID=c.id;this.url=c.url;this._iO=this.instanceOptions=this.options=n(c);this.pan=this.options.pan;this.volume=this.options.volume;
+this._lastURL=null;this.isHTML5=!1;this._a=null;this.id3={};this._debug=function(){};this.load=function(c){var d=null;if(typeof c!=="undefined")a._iO=n(c,a.options),a.instanceOptions=a._iO;else if(c=a.options,a._iO=c,a.instanceOptions=a._iO,a._lastURL&&a._lastURL!==a.url)a._iO.url=a.url,a.url=null;if(!a._iO.url)a._iO.url=a.url;if(a._iO.url===a.url&&a.readyState!==0&&a.readyState!==2)return a;a._lastURL=a.url;a.loaded=!1;a.readyState=1;a.playState=0;if(V(a._iO)){if(d=a._setup_html5(a._iO),!d._called_load)a._html5_canplay=
+!1,d.load(),d._called_load=!0,a._iO.autoPlay&&a.play()}else try{a.isHTML5=!1,a._iO=T(S(a._iO)),i===8?b.o._load(a.sID,a._iO.url,a._iO.stream,a._iO.autoPlay,a._iO.whileloading?1:0,a._iO.loops||1,a._iO.usePolicyFile):b.o._load(a.sID,a._iO.url,a._iO.stream?!0:!1,a._iO.autoPlay?!0:!1,a._iO.loops||1,a._iO.autoLoad?!0:!1,a._iO.usePolicyFile)}catch(e){B({type:"SMSOUND_LOAD_JS_EXCEPTION",fatal:!0})}return a};this.unload=function(){if(a.readyState!==0){if(a.isHTML5){if(f(),a._a)a._a.pause(),a._a.src=""}else i===
+8?b.o._unload(a.sID,b.nullURL):b.o._unload(a.sID);e()}return a};this.destruct=function(c){if(a.isHTML5){if(f(),a._a)a._a.pause(),a._a.src="",L||a._remove_html5_events(),a._a._t=null,a._a=null}else a._iO.onfailure=null,b.o._destroySound(a.sID);c||b.destroySound(a.sID,!0)};this.start=this.play=function(c,X){var e,X=X===void 0?!0:X;c||(c={});a._iO=n(c,a._iO);a._iO=n(a._iO,a.options);a.instanceOptions=a._iO;if(a._iO.serverURL&&!a.connected)return a.getAutoPlay()||a.setAutoPlay(!0),a;V(a._iO)&&(a._setup_html5(a._iO),
+d());if(a.playState===1&&!a.paused&&(e=a._iO.multiShot,!e))return a;if(!a.loaded)if(a.readyState===0){if(!a.isHTML5)a._iO.autoPlay=!0;a.load(a._iO)}else if(a.readyState===2)return a;if(!a.isHTML5&&i===9&&a.position>0&&a.position===a.duration)a._iO.position=0;if(a.paused&&a.position&&a.position>0)a.resume();else{a.playState=1;a.paused=!1;(!a.instanceCount||a._iO.multiShotEvents||!a.isHTML5&&i>8&&!a.getAutoPlay())&&a.instanceCount++;a.position=typeof a._iO.position!=="undefined"&&!isNaN(a._iO.position)?
+a._iO.position:0;if(!a.isHTML5)a._iO=T(S(a._iO));if(a._iO.onplay&&X)a._iO.onplay.apply(a),a._onplay_called=!0;a.setVolume(a._iO.volume,!0);a.setPan(a._iO.pan,!0);a.isHTML5?(d(),e=a._setup_html5(),a.setPosition(a._iO.position),e.play()):b.o._start(a.sID,a._iO.loops||1,i===9?a._iO.position:a._iO.position/1E3)}return a};this.stop=function(c){if(a.playState===1){a._onbufferchange(0);a.resetOnPosition(0);if(!a.isHTML5)a.playState=0;a.paused=!1;a._iO.onstop&&a._iO.onstop.apply(a);if(a.isHTML5){if(a._a)a.setPosition(0),
+a._a.pause(),a.playState=0,a._onTimer(),f(),a.unload()}else b.o._stop(a.sID,c),a._iO.serverURL&&a.unload();a.instanceCount=0;a._iO={}}return a};this.setAutoPlay=function(c){a._iO.autoPlay=c;a.isHTML5||(b.o._setAutoPlay(a.sID,c),c&&!a.instanceCount&&a.readyState===1&&a.instanceCount++)};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition=function(c){c===void 0&&(c=0);var d=a.isHTML5?Math.max(c,0):Math.min(a.duration||a._iO.duration,Math.max(c,0));a.position=d;c=a.position/1E3;a.resetOnPosition(a.position);
+a._iO.position=d;if(a.isHTML5){if(a._a&&a._html5_canplay&&a._a.currentTime!==c)try{a._a.currentTime=c,(a.playState===0||a.paused)&&a._a.pause()}catch(e){}}else c=i===9?a.position:c,a.readyState&&a.readyState!==2&&b.o._setPosition(a.sID,c,a.paused||!a.playState);a.isHTML5&&a.paused&&a._onTimer(!0);return a};this.pause=function(c){if(a.paused||a.playState===0&&a.readyState!==1)return a;a.paused=!0;a.isHTML5?(a._setup_html5().pause(),f()):(c||c===void 0)&&b.o._pause(a.sID);a._iO.onpause&&a._iO.onpause.apply(a);
+return a};this.resume=function(){if(!a.paused)return a;a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(),d()):(a._iO.isMovieStar&&a.setPosition(a.position),b.o._pause(a.sID));!a._onplay_called&&a._iO.onplay?(a._iO.onplay.apply(a),a._onplay_called=!0):a._iO.onresume&&a._iO.onresume.apply(a);return a};this.togglePause=function(){if(a.playState===0)return a.play({position:i===9&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(c,d){typeof c===
+"undefined"&&(c=0);typeof d==="undefined"&&(d=!1);a.isHTML5||b.o._setPan(a.sID,c);a._iO.pan=c;if(!d)a.pan=c,a.options.pan=c;return a};this.setVolume=function(c,d){typeof c==="undefined"&&(c=100);typeof d==="undefined"&&(d=!1);if(a.isHTML5){if(a._a)a._a.volume=Math.max(0,Math.min(1,c/100))}else b.o._setVolume(a.sID,b.muted&&!a.muted||a.muted?0:c);a._iO.volume=c;if(!d)a.volume=c,a.options.volume=c;return a};this.mute=function(){a.muted=!0;if(a.isHTML5){if(a._a)a._a.muted=!0}else b.o._setVolume(a.sID,
+0);return a};this.unmute=function(){a.muted=!1;var c=typeof a._iO.volume!=="undefined";if(a.isHTML5){if(a._a)a._a.muted=!1}else b.o._setVolume(a.sID,c?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=function(b,c,d){a._onPositionItems.push({position:b,method:c,scope:typeof d!=="undefined"?d:a,fired:!1});return a};this.processOnPosition=function(){var c,d;c=a._onPositionItems.length;if(!c||!a.playState||a._onPositionFired>=c)return!1;
+for(;c--;)if(d=a._onPositionItems[c],!d.fired&&a.position>=d.position)d.method.apply(d.scope,[d.position]),d.fired=!0,b._onPositionFired++;return!0};this.resetOnPosition=function(c){var d,e;d=a._onPositionItems.length;if(!d)return!1;for(;d--;)if(e=a._onPositionItems[d],e.fired&&c<=e.position)e.fired=!1,b._onPositionFired--;return!0};d=function(){a.isHTML5&&va(a)};f=function(){a.isHTML5&&wa(a)};e=function(){a._onPositionItems=[];a._onPositionFired=0;a._hasTimer=null;a._onplay_called=!1;a._a=null;a._html5_canplay=
+!1;a.bytesLoaded=null;a.bytesTotal=null;a.position=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.failures=0;a.loaded=!1;a.playState=0;a.paused=!1;a.readyState=0;a.muted=!1;a.didBeforeFinish=!1;a.didJustBeforeFinish=!1;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.eqData=[];a.eqData.left=[];a.eqData.right=[]};e();this._onTimer=function(b){var c={};if(a._hasTimer||b)return a._a&&(b||(a.playState>
+0||a.readyState===1)&&!a.paused)?(a.duration=a._get_html5_duration(),a.durationEstimate=a.duration,b=a._a.currentTime?a._a.currentTime*1E3:0,a._whileplaying(b,c,c,c,c),!0):!1};this._get_html5_duration=function(){var b=a._a?a._a.duration*1E3:a._iO?a._iO.duration:void 0;return b&&!isNaN(b)&&b!==Infinity?b:a._iO?a._iO.duration:null};this._setup_html5=function(c){var c=n(a._iO,c),d=L?b._global_a:a._a;decodeURI(c.url);var f=d&&d._t?d._t.instanceOptions:null;if(d){if(d._t&&f.url===c.url&&(!a._lastURL||
+a._lastURL===f.url))return d;L&&d._t&&d._t.playState&&c.url!==f.url&&d._t.stop();e();d.src=c.url;a.url=c.url;a._lastURL=c.url;d._called_load=!1}else if(d=new Audio(c.url),d._called_load=!1,L)b._global_a=d;a.isHTML5=!0;a._a=d;d._t=a;a._add_html5_events();d.loop=c.loops>1?"loop":"";c.autoLoad||c.autoPlay?(d.autobuffer="auto",d.preload="auto",a.load(),d._called_load=!0):(d.autobuffer=!1,d.preload="none");d.loop=c.loops>1?"loop":"";return d};this._add_html5_events=function(){if(a._a._added_events)return!1;
+var b;a._a._added_events=!0;for(b in r)r.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,r[b],!1);return!0};this._remove_html5_events=function(){var b;a._a._added_events=!1;for(b in r)r.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,r[b],!1)};this._onload=function(b){b=b?!0:!1;a.loaded=b;a.readyState=b?3:2;a._onbufferchange(0);a._iO.onload&&a._iO.onload.apply(a,[b]);return!0};this._onbufferchange=function(b){if(a.playState===0)return!1;if(b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=
+b===1;a._iO.onbufferchange&&a._iO.onbufferchange.apply(a);return!0};this._onfailure=function(b,c,d){a.failures++;if(a._iO.onfailure&&a.failures===1)a._iO.onfailure(a,b,c,d)};this._onbeforefinish=function(){if(!a.didBeforeFinish)a.didBeforeFinish=!0,a._iO.onbeforefinish&&a._iO.onbeforefinish.apply(a)};this._onjustbeforefinish=function(){if(!a.didJustBeforeFinish)a.didJustBeforeFinish=!0,a._iO.onjustbeforefinish&&a._iO.onjustbeforefinish.apply(a)};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);
+a.resetOnPosition(0);a._iO.onbeforefinishcomplete&&a._iO.onbeforefinishcomplete.apply(a);a.didBeforeFinish=!1;a.didJustBeforeFinish=!1;if(a.instanceCount){a.instanceCount--;if(!a.instanceCount)a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},f();(!a.instanceCount||a._iO.multiShotEvents)&&b&&b.apply(a)}};this._whileloading=function(b,c,d,e){a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(d);a.bufferLength=e;if(a._iO.isMovieStar)a.durationEstimate=a.duration;else if(a.durationEstimate=
+a._iO.duration?a.duration>a._iO.duration?a.duration:a._iO.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10),a.durationEstimate===void 0)a.durationEstimate=a.duration;a.readyState!==3&&a._iO.whileloading&&a._iO.whileloading.apply(a)};this._whileplaying=function(c,d,e,f,g){if(isNaN(c)||c===null)return!1;a.position=c;a.processOnPosition();if(!a.isHTML5&&i>8){if(a._iO.usePeakData&&typeof d!=="undefined"&&d)a.peakData={left:d.leftPeak,right:d.rightPeak};if(a._iO.useWaveformData&&typeof e!=="undefined"&&
+e)a.waveformData={left:e.split(","),right:f.split(",")};if(a._iO.useEQData&&typeof g!=="undefined"&&g&&g.leftEQ&&(c=g.leftEQ.split(","),a.eqData=c,a.eqData.left=c,typeof g.rightEQ!=="undefined"&&g.rightEQ))a.eqData.right=g.rightEQ.split(",")}a.playState===1&&(!a.isHTML5&&b.flashVersion===8&&!a.position&&a.isBuffering&&a._onbufferchange(0),a._iO.whileplaying&&a._iO.whileplaying.apply(a),(a.loaded||!a.loaded&&a._iO.isMovieStar)&&a._iO.onbeforefinish&&a._iO.onbeforefinishtime&&!a.didBeforeFinish&&a.duration-
+a.position<=a._iO.onbeforefinishtime&&a._onbeforefinish());return!0};this._onid3=function(b,c){var d=[],e,f;e=0;for(f=b.length;e<f;e++)d[b[e]]=c[e];a.id3=n(a.id3,d);a._iO.onid3&&a._iO.onid3.apply(a)};this._onconnect=function(b){b=b===1;if(a.connected=b)a.failures=0,j(a.sID)&&(a.getAutoPlay()?a.play(void 0,a.getAutoPlay()):a._iO.autoLoad&&a.load()),a._iO.onconnect&&a._iO.onconnect.apply(a,[b])};this._ondataerror=function(){a.playState>0&&a._iO.ondataerror&&a._iO.ondataerror.apply(a)}};ea=function(){return g.body||
+g._docElement||g.getElementsByTagName("div")[0]};F=function(b){return g.getElementById(b)};n=function(c,a){var e={},f,d;for(f in c)c.hasOwnProperty(f)&&(e[f]=c[f]);f=typeof a==="undefined"?b.defaultOptions:a;for(d in f)f.hasOwnProperty(d)&&typeof e[d]==="undefined"&&(e[d]=f[d]);return e};k=function(){function b(a){var a=Fa.call(a),c=a.length;e?(a[1]="on"+a[1],c>3&&a.pop()):c===3&&a.push(!1);return a}function a(a,b){var c=a.shift(),g=[f[b]];if(e)c[g](a[0],a[1]);else c[g].apply(c,a)}var e=h.attachEvent,
+f={add:e?"attachEvent":"addEventListener",remove:e?"detachEvent":"removeEventListener"};return{add:function(){a(b(arguments),"add")},remove:function(){a(b(arguments),"remove")}}}();V=function(c){return!c.serverURL&&(c.type?K({type:c.type}):K({url:c.url})||b.html5Only)};K=function(c){function a(a){return b.preferFlash&&p&&!b.ignoreFlash&&typeof b.flash[a]!=="undefined"&&b.flash[a]}if(!b.useHTML5Audio||!b.hasHTML5)return!1;var e=c.url||null,c=c.type||null,f=b.audioFormats,d;if(c&&b.html5[c]!=="undefined")return b.html5[c]&&
+!a(c);if(!v){v=[];for(d in f)f.hasOwnProperty(d)&&(v.push(d),f[d].related&&(v=v.concat(f[d].related)));v=RegExp("\\.("+v.join("|")+")(\\?.*)?$","i")}d=e?e.toLowerCase().match(v):null;if(!d||!d.length)if(c)e=c.indexOf(";"),d=(e!==-1?c.substr(0,e):c).substr(6);else return!1;else d=d[1];return d&&typeof b.html5[d]!=="undefined"?b.html5[d]&&!a(d):(c="audio/"+d,e=b.html5.canPlayType({type:c}),(b.html5[d]=e)&&b.html5[c]&&!a(c))};ya=function(){function c(c){var d,e,f=!1;if(!a||typeof a.canPlayType!=="function")return!1;
+if(c instanceof Array){d=0;for(e=c.length;d<e&&!f;d++)if(b.html5[c[d]]||a.canPlayType(c[d]).match(b.html5Test))f=!0,b.html5[c[d]]=!0,b.flash[c[d]]=!(!b.preferFlash||!p||!c[d].match(Da));return f}else return c=a&&typeof a.canPlayType==="function"?a.canPlayType(c):!1,!(!c||!c.match(b.html5Test))}if(!b.useHTML5Audio||typeof Audio==="undefined")return!1;var a=typeof Audio!=="undefined"?Ia?new Audio(null):new Audio:null,e,f={},d,g;d=b.audioFormats;for(e in d)if(d.hasOwnProperty(e)&&(f[e]=c(d[e].type),
+f["audio/"+e]=f[e],b.flash[e]=b.preferFlash&&!b.ignoreFlash&&e.match(Da)?!0:!1,d[e]&&d[e].related))for(g=d[e].related.length;g--;)f["audio/"+d[e].related[g]]=f[e],b.html5[d[e].related[g]]=f[e],b.flash[d[e].related[g]]=f[e];f.canPlayType=a?c:null;b.html5=n(b.html5,f);return!0};x=function(){};S=function(b){if(i===8&&b.loops>1&&b.stream)b.stream=!1;return b};T=function(b){if(b&&!b.usePolicyFile&&(b.onid3||b.usePeakData||b.useWaveformData||b.useEQData))b.usePolicyFile=!0;return b};ia=function(b){typeof console!==
+"undefined"&&typeof console.warn!=="undefined"&&console.warn(b)};aa=function(){return!1};ta=function(b){for(var a in b)b.hasOwnProperty(a)&&typeof b[a]==="function"&&(b[a]=aa)};R=function(c){typeof c==="undefined"&&(c=!1);(u||c)&&b.disable(c)};ua=function(c){var a=null;if(c)if(c.match(/\.swf(\?.*)?$/i)){if(a=c.substr(c.toLowerCase().lastIndexOf(".swf?")+4))return c}else c.lastIndexOf("/")!==c.length-1&&(c+="/");return(c&&c.lastIndexOf("/")!==-1?c.substr(0,c.lastIndexOf("/")+1):"./")+b.movieURL};ca=
+function(){if(i!==8&&i!==9)b.flashVersion=8;var c=b.debugMode||b.debugFlash?"_debug.swf":".swf";if(b.useHTML5Audio&&!b.html5Only&&b.audioFormats.mp4.required&&b.flashVersion<9)b.flashVersion=9;i=b.flashVersion;b.version=b.versionNumber+(b.html5Only?" (HTML5-only mode)":i===9?" (AS3/Flash 9)":" (AS2/Flash 8)");if(i>8)b.defaultOptions=n(b.defaultOptions,b.flash9Options),b.features.buffering=!0;i>8&&b.useMovieStar?(b.defaultOptions=n(b.defaultOptions,b.movieStarOptions),b.filePatterns.flash9=RegExp("\\.(mp3|"+
+b.netStreamTypes.join("|")+")(\\?.*)?$","i"),b.mimePattern=b.netStreamMimeTypes,b.features.movieStar=!0):(b.useMovieStar=!1,b.features.movieStar=!1);b.filePattern=b.filePatterns[i!==8?"flash9":"flash8"];b.movieURL=(i===8?"soundmanager2.swf":"soundmanager2_flash9.swf").replace(".swf",c);b.features.peakData=b.features.waveformData=b.features.eqData=i>8};sa=function(c,a){if(!b.o||!b.allowPolling)return!1;b.o._setPolling(c,a)};fa=function(){if(b.debugURLParam.test($))b.debugMode=!0};j=this.getSoundById;
+C=function(){var c=[];b.debugMode&&c.push(b.swfCSS.sm2Debug);b.debugFlash&&c.push(b.swfCSS.flashDebug);b.useHighPerformance&&c.push(b.swfCSS.highPerf);return c.join(" ")};ha=function(){x("fbHandler");var c=b.getMoviePercent(),a=b.swfCSS,e={type:"FLASHBLOCK"};if(b.html5Only)return!1;if(b.ok()){if(b.oMC)b.oMC.className=[C(),a.swfDefault,a.swfLoaded+(b.didFlashBlock?" "+a.swfUnblocked:"")].join(" ")}else{if(q)b.oMC.className=C()+" "+a.swfDefault+" "+(c===null?a.swfTimedout:a.swfError);b.didFlashBlock=
+!0;y({type:"ontimeout",ignoreInit:!0,error:e});B(e)}};ba=function(b,a,e){typeof t[b]==="undefined"&&(t[b]=[]);t[b].push({method:a,scope:e||null,fired:!1})};y=function(c){c||(c={type:"onready"});if(!m&&c&&!c.ignoreInit)return!1;if(c.type==="ontimeout"&&b.ok())return!1;var a={success:c&&c.ignoreInit?b.ok():!u},e=c&&c.type?t[c.type]||[]:[],f=[],d,a=[a],g=q&&b.useFlashBlock&&!b.ok();if(c.error)a[0].error=c.error;c=0;for(d=e.length;c<d;c++)e[c].fired!==!0&&f.push(e[c]);if(f.length){c=0;for(d=f.length;c<
+d;c++)if(f[c].scope?f[c].method.apply(f[c].scope,a):f[c].method.apply(this,a),!g)f[c].fired=!0}return!0};z=function(){h.setTimeout(function(){b.useFlashBlock&&ha();y();b.onload instanceof Function&&b.onload.apply(h);b.waitForWindowLoad&&k.add(h,"load",z)},1)};W=function(){if(p!==void 0)return p;var b=!1,a=navigator,e=a.plugins,f,d=h.ActiveXObject;if(e&&e.length)(a=a.mimeTypes)&&a["application/x-shockwave-flash"]&&a["application/x-shockwave-flash"].enabledPlugin&&a["application/x-shockwave-flash"].enabledPlugin.description&&
+(b=!0);else if(typeof d!=="undefined"){try{f=new d("ShockwaveFlash.ShockwaveFlash")}catch(g){}b=!!f}return p=b};xa=function(){var c,a;if(o.match(/iphone os (1|2|3_0|3_1)/i)){b.hasHTML5=!1;b.html5Only=!0;if(b.oMC)b.oMC.style.display="none";return!1}if(b.useHTML5Audio){if(!b.html5||!b.html5.canPlayType)return b.hasHTML5=!1,!0;else b.hasHTML5=!0;if(la&&W())return!0}else return!0;for(a in b.audioFormats)if(b.audioFormats.hasOwnProperty(a)&&(b.audioFormats[a].required&&!b.html5.canPlayType(b.audioFormats[a].type)||
+b.flash[a]||b.flash[b.audioFormats[a].type]))c=!0;b.ignoreFlash&&(c=!1);b.html5Only=b.hasHTML5&&b.useHTML5Audio&&!c;return!b.html5Only};va=function(b){if(!b._hasTimer)b._hasTimer=!0};wa=function(b){if(b._hasTimer)b._hasTimer=!1};B=function(c){c=typeof c!=="undefined"?c:{};b.onerror instanceof Function&&b.onerror.apply(h,[{type:typeof c.type!=="undefined"?c.type:null}]);typeof c.fatal!=="undefined"&&c.fatal&&b.disable()};za=function(){if(!la||!W())return!1;var c=b.audioFormats,a,e;for(e in c)if(c.hasOwnProperty(e)&&
+(e==="mp3"||e==="mp4"))if(b.html5[e]=!1,c[e]&&c[e].related)for(a=c[e].related.length;a--;)b.html5[c[e].related[a]]=!1};this._setSandboxType=function(){};this._externalInterfaceOK=function(){if(b.swfLoaded)return!1;(new Date).getTime();b.swfLoaded=!0;E=!1;la&&za();s?setTimeout(N,100):N()};Q=function(c,a){function e(a,b){return'<param name="'+a+'" value="'+b+'" />'}if(G&&H)return!1;if(b.html5Only)return ca(),b.oMC=F(b.movieID),N(),H=G=!0,!1;var f=a||b.url,d=b.altURL||f,h;h=ea();var i,l,j=C(),k,m=null,
+m=(m=g.getElementsByTagName("html")[0])&&m.dir&&m.dir.match(/rtl/i),c=typeof c==="undefined"?b.id:c;ca();b.url=ua(na?f:d);a=b.url;b.wmode=!b.wmode&&b.useHighPerformance&&!b.useMovieStar?"transparent":b.wmode;if(b.wmode!==null&&(o.match(/msie 8/i)||!s&&!b.useHighPerformance)&&navigator.platform.match(/win32|win64/i))b.specialWmodeCase=!0,b.wmode=null;h={name:c,id:c,src:a,width:"auto",height:"auto",quality:"high",allowScriptAccess:b.allowScriptAccess,bgcolor:b.bgColor,pluginspage:Ea+"//www.macromedia.com/go/getflashplayer",
+title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:b.wmode,hasPriority:"true"};if(b.debugFlash)h.FlashVars="debug=1";b.wmode||delete h.wmode;if(s)f=g.createElement("div"),l=['<object id="'+c+'" data="'+a+'" type="'+h.type+'" title="'+h.title+'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+Ea+'//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="'+h.width+'" height="'+h.height+'">',e("movie",a),e("AllowScriptAccess",
+b.allowScriptAccess),e("quality",h.quality),b.wmode?e("wmode",b.wmode):"",e("bgcolor",b.bgColor),e("hasPriority","true"),b.debugFlash?e("FlashVars",h.FlashVars):"","</object>"].join("");else for(i in f=g.createElement("embed"),h)h.hasOwnProperty(i)&&f.setAttribute(i,h[i]);fa();j=C();if(h=ea())if(b.oMC=F(b.movieID)||g.createElement("div"),b.oMC.id){k=b.oMC.className;b.oMC.className=(k?k+" ":b.swfCSS.swfDefault)+(j?" "+j:"");b.oMC.appendChild(f);if(s)i=b.oMC.appendChild(g.createElement("div")),i.className=
+b.swfCSS.swfBox,i.innerHTML=l;H=!0}else{b.oMC.id=b.movieID;b.oMC.className=b.swfCSS.swfDefault+" "+j;i=j=null;if(!b.useFlashBlock)if(b.useHighPerformance)j={position:"fixed",width:"8px",height:"8px",bottom:"0px",left:"0px",overflow:"hidden"};else if(j={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},m)j.left=Math.abs(parseInt(j.left,10))+"px";if(Ha)b.oMC.style.zIndex=1E4;if(!b.debugFlash)for(k in j)j.hasOwnProperty(k)&&(b.oMC.style[k]=j[k]);try{s||b.oMC.appendChild(f);h.appendChild(b.oMC);
+if(s)i=b.oMC.appendChild(g.createElement("div")),i.className=b.swfCSS.swfBox,i.innerHTML=l;H=!0}catch(n){throw Error(x("domError")+" \n"+n.toString());}}return G=!0};P=function(){if(b.html5Only)return Q(),!1;if(b.o)return!1;b.o=b.getMovie(b.id);if(!b.o)J?(s?b.oMC.innerHTML=ga:b.oMC.appendChild(J),J=null,G=!0):Q(b.id,b.url),b.o=b.getMovie(b.id);b.oninitmovie instanceof Function&&setTimeout(b.oninitmovie,1);return!0};O=function(){setTimeout(ra,1E3)};ra=function(){if(U)return!1;U=!0;k.remove(h,"load",
+O);if(E&&!ma)return!1;var c;m||(c=b.getMoviePercent());setTimeout(function(){c=b.getMoviePercent();!m&&Ca&&(c===null?b.useFlashBlock||b.flashLoadTimeout===0?b.useFlashBlock&&ha():R(!0):b.flashLoadTimeout!==0&&R(!0))},b.flashLoadTimeout)};w=function(){function b(){k.remove(h,"focus",w);k.remove(h,"load",w)}if(ma||!E)return b(),!0;ma=Ca=!0;D&&E&&k.remove(h,"mousemove",w);U=!1;b();return!0};I=function(c){if(m)return!1;if(b.html5Only)return m=!0,z(),!0;var a;if(!b.useFlashBlock||!b.flashLoadTimeout||
+b.getMoviePercent())m=!0,u&&(a={type:!p&&q?"NO_FLASH":"INIT_TIMEOUT"});if(u||c){if(b.useFlashBlock&&b.oMC)b.oMC.className=C()+" "+(b.getMoviePercent()===null?b.swfCSS.swfTimedout:b.swfCSS.swfError);y({type:"ontimeout",error:a});B(a);return!1}k.add(h,"unload",aa);if(b.waitForWindowLoad&&!qa)return k.add(h,"load",z),!1;else z();return!0};Aa=function(){var c,a=[];if(b.useHTML5Audio&&b.hasHTML5)for(c in b.audioFormats)b.audioFormats.hasOwnProperty(c)&&a.push(c+": "+b.html5[c]+(!b.html5[c]&&p&&b.flash[c]?
+" (using flash)":b.preferFlash&&b.flash[c]&&p?" (preferring flash)":!b.html5[c]?" ("+(b.audioFormats[c].required?"required, ":"")+"and no flash support)":""))};N=function(){if(m)return!1;if(b.html5Only){if(!m)k.remove(h,"load",b.beginDelayedInit),b.enabled=!0,I();return!0}P();try{b.o._externalInterfaceTest(!1),b.allowPolling&&sa(!0,b.flashPollingInterval||(b.useFastPolling?10:50)),b.debugMode||b.o._disableDebug(),b.enabled=!0}catch(c){return B({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),R(!0),I(),!1}I();
+k.remove(h,"load",b.beginDelayedInit);return!0};A=function(){if(da)return!1;da=!0;fa();if(!p&&b.hasHTML5)b.useHTML5Audio=!0,b.preferFlash=!1;ya();b.html5.usingFlash=xa();q=b.html5.usingFlash;Aa();if(!p&&q)b.flashLoadTimeout=1;g.removeEventListener&&g.removeEventListener("DOMContentLoaded",A,!1);P();return!0};ka=function(){g.readyState==="complete"&&(A(),g.detachEvent("onreadystatechange",ka));return!0};W();k.add(h,"focus",w);k.add(h,"load",w);k.add(h,"load",O);D&&E&&k.add(h,"mousemove",w);g.addEventListener?
+g.addEventListener("DOMContentLoaded",A,!1):g.attachEvent?g.attachEvent("onreadystatechange",ka):B({type:"NO_DOM2_EVENTS",fatal:!0});g.readyState==="complete"&&setTimeout(A,100)}var Y=null;if(typeof SM2_DEFER==="undefined"||!SM2_DEFER)Y=new M;Z.SoundManager=M;Z.soundManager=Y})(window);
Index: /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2-nodebug.js
===================================================================
--- /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2-nodebug.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2-nodebug.js	(revision 28388)
@@ -0,0 +1,3198 @@
+/** @license
+ * SoundManager 2: JavaScript Sound for the Web
+ * ----------------------------------------------
+ * http://schillmania.com/projects/soundmanager2/
+ *
+ * Copyright (c) 2007, Scott Schiller. All rights reserved.
+ * Code provided under the BSD License:
+ * http://schillmania.com/projects/soundmanager2/license.txt
+ *
+ * V2.97a.20110801
+*/
+
+/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio */
+/*jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true */
+
+(function(window) {
+
+var soundManager = null;
+
+function SoundManager(smURL, smID) {
+
+  this.flashVersion = 8;             // version of flash to require, either 8 or 9. Some API features require Flash 9.
+  this.debugMode = false;             // enable debugging output (div#soundmanager-debug, OR console if available+configured)
+  this.debugFlash = false;           // enable debugging output inside SWF, troubleshoot Flash/browser issues
+  this.useConsole = true;            // use firebug/safari console.log()-type debug console if available
+  this.consoleOnly = false;          // if console is being used, do not create/write to #soundmanager-debug
+  this.waitForWindowLoad = false;    // force SM2 to wait for window.onload() before trying to call soundManager.onload()
+  this.nullURL = 'about:blank';      // path to "null" (empty) MP3 file, used to unload sounds (Flash 8 only)
+  this.allowPolling = true;          // allow flash to poll for status update (required for whileplaying() events, peak, sound spectrum functions to work.)
+  this.useFastPolling = false;       // uses lower flash timer interval for higher callback frequency, best combined with useHighPerformance
+  this.useMovieStar = true;          // enable support for Flash 9.0r115+ (codename "MovieStar") MPEG4 audio formats (AAC, M4V, FLV, MOV etc.)
+  this.bgColor = '#ffffff';          // movie (.swf) background color, eg. '#000000'
+  this.useHighPerformance = false;   // position:fixed flash movie can help increase js/flash speed, minimize lag
+  this.flashPollingInterval = null;  // msec for polling interval. Defaults to 50 unless useFastPolling = true.
+  this.flashLoadTimeout = 1000;      // msec to wait for flash movie to load before failing (0 = infinity)
+  this.wmode = null;                 // string: flash rendering mode - null, transparent, opaque (last two allow layering of HTML on top)
+  this.allowScriptAccess = 'always'; // for scripting the SWF (object/embed property), either 'always' or 'sameDomain'
+  this.useFlashBlock = false;        // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable.
+  this.useHTML5Audio = true;         // Beta feature: Use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (no MP3/MP4.) Ideally, transparent vs. Flash API where possible.
+  this.html5Test = /^(probably|maybe)$/i; // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative.
+  this.preferFlash = true;           // (experimental) if true and flash support present, will try to use flash for MP3/MP4 as needed since HTML5 audio support is still quirky in browsers.
+
+  this.audioFormats = {
+    /*
+     * determines HTML5 support + flash requirements.
+     * if no support for a "required" format, SM2 will fail to start.
+     * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true)
+     * multiple MIME types may be tested while trying to get a positive canPlayType() response.
+    */
+    'mp3': {
+      'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],
+      'required': true
+    },
+    'mp4': {
+      'related': ['aac','m4a'], // additional formats under the MP4 container
+      'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],
+      'required': false
+    },
+    'ogg': {
+      'type': ['audio/ogg; codecs=vorbis'],
+      'required': false
+    },
+    'wav': {
+      'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'],
+      'required': false
+    }
+  };
+
+  this.defaultOptions = {
+    'autoLoad': false,             // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)
+    'stream': true,                // allows playing before entire file has loaded (recommended)
+    'autoPlay': false,             // enable playing of file as soon as possible (much faster if "stream" is true)
+    'loops': 1,                    // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0)
+    'onid3': null,                 // callback function for "ID3 data is added/available"
+    'onload': null,                // callback function for "load finished"
+    'whileloading': null,          // callback function for "download progress update" (X of Y bytes received)
+    'onplay': null,                // callback for "play" start
+    'onpause': null,               // callback for "pause"
+    'onresume': null,              // callback for "resume" (pause toggle)
+    'whileplaying': null,          // callback during play (position update)
+    'onstop': null,                // callback for "user stop"
+    'onfailure': null,             // callback function for when playing fails
+    'onfinish': null,              // callback function for "sound finished playing"
+    'onbeforefinish': null,        // callback for "before sound finished playing (at [time])"
+    'onbeforefinishtime': 5000,    // offset (milliseconds) before end of sound to trigger beforefinish (eg. 1000 msec = 1 second)
+    'onbeforefinishcomplete': null,// function to call when said sound finishes playing
+    'onjustbeforefinish': null,    // callback for [n] msec before end of current sound
+    'onjustbeforefinishtime': 200, // [n] - if not using, set to 0 (or null handler) and event will not fire.
+    'multiShot': true,             // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time
+    'multiShotEvents': false,      // fire multiple sound events (currently onfinish() only) when multiShot is enabled
+    'position': null,              // offset (milliseconds) to seek to within loaded sound data.
+    'pan': 0,                      // "pan" settings, left-to-right, -100 to 100
+    'type': null,                  // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3
+    'usePolicyFile': false,        // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access)
+    'volume': 100                  // self-explanatory. 0-100, the latter being the max.
+  };
+
+  this.flash9Options = {      // flash 9-only options, merged into defaultOptions if flash 9 is being used
+    'isMovieStar': null,      // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL
+    'usePeakData': false,     // enable left/right channel peak (level) data
+    'useWaveformData': false, // enable sound spectrum (raw waveform data) - WARNING: CPU-INTENSIVE: may set CPUs on fire.
+    'useEQData': false,       // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive.
+    'onbufferchange': null,   // callback for "isBuffering" property change
+    'ondataerror': null       // callback for waveform/eq data access error (flash playing audio in other tabs/domains)
+  };
+
+  this.movieStarOptions = { // flash 9.0r115+ MPEG4 audio options, merged into defaultOptions if flash 9+movieStar mode is enabled
+    'bufferTime': 3,        // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.)
+    'serverURL': null,      // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants
+    'onconnect': null,      // rtmp: callback for connection to flash media server
+    'duration': null        // rtmp: song duration (msec)
+  };
+
+  this.version = null;
+  this.versionNumber = 'V2.97a.20110801';
+  this.movieURL = null;
+  this.url = (smURL || null);
+  this.altURL = null;
+  this.swfLoaded = false;
+  this.enabled = false;
+  this.o = null;
+  this.movieID = 'sm2-container';
+  this.id = (smID || 'sm2movie');
+  this.swfCSS = {
+    'swfBox': 'sm2-object-box',
+    'swfDefault': 'movieContainer',
+    'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error)
+    'swfTimedout': 'swf_timedout',
+    'swfLoaded': 'swf_loaded',
+    'swfUnblocked': 'swf_unblocked', // or loaded OK
+    'sm2Debug': 'sm2_debug',
+    'highPerf': 'high_performance',
+    'flashDebug': 'flash_debug'
+  };
+  this.oMC = null;
+  this.sounds = {};
+  this.soundIDs = [];
+  this.muted = false;
+  this.debugID = 'soundmanager-debug';
+  this.debugURLParam = /([#?&])debug=1/i;
+  this.specialWmodeCase = false;
+  this.didFlashBlock = false;
+
+  this.filePattern = null;
+  this.filePatterns = {
+    'flash8': /\.mp3(\?.*)?$/i,
+    'flash9': /\.mp3(\?.*)?$/i
+  };
+
+  this.baseMimeTypes = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // mp3
+  this.netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // mp3, mp4, aac etc.
+  this.netStreamTypes = ['aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'mp4v', '3gp', '3g2']; // Flash v9.0r115+ "moviestar" formats
+  this.netStreamPattern = new RegExp('\\.(' + this.netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
+  this.mimePattern = this.baseMimeTypes;
+
+  this.features = {
+    'buffering': false,
+    'peakData': false,
+    'waveformData': false,
+    'eqData': false,
+    'movieStar': false
+  };
+
+  this.sandbox = {
+    /*
+    'type': null,
+    'types': {
+      'remote': 'remote (domain-based) rules',
+      'localWithFile': 'local with file access (no internet access)',
+      'localWithNetwork': 'local with network (internet access only, no local access)',
+      'localTrusted': 'local, trusted (local+internet access)'
+    },
+    'description': null,
+    'noRemote': null,
+    'noLocal': null
+    */
+  };
+
+  this.hasHTML5 = (typeof Audio !== 'undefined' && typeof new Audio().canPlayType !== 'undefined'); // switch for handling logic
+
+  // stores canPlayType() results, etc. treat as read-only.
+  this.html5 = {
+    // mp3: boolean
+    // mp4: boolean
+    'usingFlash': null // set if/when flash fallback is needed
+  };
+
+  // format support
+  this.flash = {
+    // mp3: boolean
+    // mp4: boolean
+  };
+
+  this.html5Only = false;   // determined at init time
+  this.ignoreFlash = false; // used for special cases (eg. iPad/iPhone/palm OS?)
+
+  /*
+   * a few private internals
+  */
+
+  var SMSound,
+  _s = this, _sm = 'soundManager', _smc = _sm+'::', _h5 = 'HTML5::', _id, _ua = navigator.userAgent, _win = window, _wl = _win.location.href.toString(), _fV = this.flashVersion, _doc = document, _doNothing, _init, _on_queue = [], _debugOpen = true, _debugTS, _didAppend = false, _appendSuccess = false, _didInit = false, _disabled = false, _windowLoaded = false, _wDS, _wdCount = 0, _initComplete, _mixin, _addOnEvent, _processOnEvents, _initUserOnload, _delayWaitForEI, _waitForEI, _setVersionInfo, _handleFocus, _strings, _initMovie, _dcLoaded, _didDCLoaded, _getDocument, _createMovie, _catchError, _setPolling, _initDebug, _debugLevels = ['log', 'info', 'warn', 'error'], _defaultFlashVersion = 8, _disableObject, _failSafely, _normalizeMovieURL, _oRemoved = null, _oRemovedHTML = null, _str, _flashBlockHandler, _getSWFCSS, _toggleDebug, _loopFix, _policyFix, _complain, _idCheck, _waitingForEI = false, _initPending = false, _smTimer, _onTimer, _startTimer, _stopTimer, _needsFlash = null, _featureCheck, _html5OK, _html5CanPlay, _html5Ext,  _dcIE, _testHTML5, _event, _slice = Array.prototype.slice, _useGlobalHTML5Audio = false, _hasFlash, _detectFlash, _badSafariFix, _html5_events, _showSupport,
+  _is_iDevice = _ua.match(/(ipad|iphone|ipod)/i), _likesHTML5 = (_ua.match(/(mobile|pre\/|xoom)/i) || _is_iDevice), _isIE = _ua.match(/msie/i), _isWebkit = _ua.match(/webkit/i), _isSafari = (_ua.match(/safari/i) && !_ua.match(/chrome/i)), _isOpera = (_ua.match(/opera/i)), 
+  _isBadSafari = (!_wl.match(/usehtml5audio/i) && !_wl.match(/sm2\-ignorebadua/i) && _isSafari && _ua.match(/OS X 10_6_([3-7])/i)), // Safari 4 and 5 occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159
+  _hasConsole = (typeof console !== 'undefined' && typeof console.log !== 'undefined'), _isFocused = (typeof _doc.hasFocus !== 'undefined'?_doc.hasFocus():null), _tryInitOnFocus = (_isSafari && typeof _doc.hasFocus === 'undefined'), _okToDisable = !_tryInitOnFocus, _flashMIME = /(mp3|mp4|mpa)/i,
+  _overHTTP = (_doc.location?_doc.location.protocol.match(/http/i):null),
+  _http = (!_overHTTP ? 'http:' : '');
+
+  this.useAltURL = !_overHTTP; // use altURL if not "online"
+  this._global_a = null;
+
+  if (_likesHTML5) {
+    // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point.
+    _s.useHTML5Audio = true;
+    _s.preferFlash = false;
+    if (_is_iDevice) {
+      // by default, use global feature. iOS onfinish() -> next may fail otherwise.
+      _s.ignoreFlash = true;
+      _useGlobalHTML5Audio = true;
+    }
+  }
+
+  /*
+   * public soundManager API
+  */
+
+  this.ok = function() {
+    return (_needsFlash?(_didInit && !_disabled):(_s.useHTML5Audio && _s.hasHTML5));
+  };
+
+  this.supported = this.ok; // legacy
+
+  this.getMovie = function(smID) {
+    return _isIE?_win[smID]:(_isSafari?_id(smID) || _doc[smID]:_id(smID));
+  };
+
+  this.createSound = function(oOptions) {
+    var _cs = _sm+'.createSound(): ',
+    thisOptions = null, oSound = null, _tO = null;
+    if (!_didInit || !_s.ok()) {
+      _complain(_cs + _str(!_didInit?'notReady':'notOK'));
+      return false;
+    }
+    if (arguments.length === 2) {
+      // function overloading in JS! :) ..assume simple createSound(id,url) use case
+      oOptions = {
+        'id': arguments[0],
+        'url': arguments[1]
+      };
+    }
+    thisOptions = _mixin(oOptions); // inherit from defaultOptions
+    _tO = thisOptions; // alias
+    /*
+    if (_tO.id.toString().charAt(0).match(/^[0-9]$/)) {
+      //_s._wD(_cs + _str('badID', _tO.id), 2);
+    }
+    //_s._wD(_cs + _tO.id + ' (' + _tO.url + ')', 1);
+    */
+    if (_idCheck(_tO.id, true)) {
+      //_s._wD(_cs + _tO.id + ' exists', 1);
+      return _s.sounds[_tO.id];
+    }
+
+    function make() {
+      thisOptions = _loopFix(thisOptions);
+      _s.sounds[_tO.id] = new SMSound(_tO);
+      _s.soundIDs.push(_tO.id);
+      return _s.sounds[_tO.id];
+    }
+
+    if (_html5OK(_tO)) {
+      oSound = make();
+      //_s._wD('Loading sound '+_tO.id+' via HTML5');
+      oSound._setup_html5(_tO);
+    } else {
+      if (_fV > 8 && _s.useMovieStar) {
+        if (_tO.isMovieStar === null) {
+          _tO.isMovieStar = ((_tO.serverURL || (_tO.type?_tO.type.match(_s.netStreamPattern):false)||_tO.url.match(_s.netStreamPattern))?true:false);
+        }
+        if (_tO.isMovieStar) {
+          //_s._wD(_cs + 'using MovieStar handling');
+        }
+        if (_tO.isMovieStar) {
+          if (_tO.usePeakData) {
+            //_wDS('noPeak');
+            _tO.usePeakData = false;
+          }
+          if (_tO.loops > 1) {
+            //_wDS('noNSLoop');
+          }
+        }
+      }
+      _tO = _policyFix(_tO, _cs);
+      oSound = make();
+      if (_fV === 8) {
+        _s.o._createSound(_tO.id, _tO.onjustbeforefinishtime, _tO.loops||1, _tO.usePolicyFile);
+      } else {
+        _s.o._createSound(_tO.id, _tO.url, _tO.onjustbeforefinishtime, _tO.usePeakData, _tO.useWaveformData, _tO.useEQData, _tO.isMovieStar, (_tO.isMovieStar?_tO.bufferTime:false), _tO.loops||1, _tO.serverURL, _tO.duration||null, _tO.autoPlay, true, _tO.autoLoad, _tO.usePolicyFile);
+        if (!_tO.serverURL) {
+          // We are connected immediately
+          oSound.connected = true;
+          if (_tO.onconnect) {
+            _tO.onconnect.apply(oSound);
+          }
+        }
+      }
+
+      if (!_tO.serverURL && (_tO.autoLoad || _tO.autoPlay)) {
+        oSound.load(_tO); // call load for non-rtmp streams
+      }
+    }
+    if (!_tO.serverURL && _tO.autoPlay) { // rtmp will play in onconnect
+      oSound.play();
+    }
+    return oSound;
+  };
+
+  this.destroySound = function(sID, _bFromSound) {
+    // explicitly destroy a sound before normal page unload, etc.
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    var oS = _s.sounds[sID], i;
+    oS._iO = {}; // Disable all callbacks while the sound is being destroyed
+    oS.stop();
+    oS.unload();
+    for (i = 0; i < _s.soundIDs.length; i++) {
+      if (_s.soundIDs[i] === sID) {
+        _s.soundIDs.splice(i, 1);
+        break;
+      }
+    }
+    if (!_bFromSound) {
+      // ignore if being called from SMSound instance
+      oS.destruct(true);
+    }
+    oS = null;
+    delete _s.sounds[sID];
+    return true;
+  };
+
+  this.load = function(sID, oOptions) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].load(oOptions);
+  };
+
+  this.unload = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].unload();
+  };
+
+  this.play = function(sID, oOptions) {
+    var fN = _sm+'.play(): ';
+    if (!_didInit || !_s.ok()) {
+      _complain(fN + _str(!_didInit?'notReady':'notOK'));
+      return false;
+    }
+    if (!_idCheck(sID)) {
+      if (!(oOptions instanceof Object)) {
+        oOptions = {
+          url: oOptions
+        }; // overloading use case: play('mySound','/path/to/some.mp3');
+      }
+      if (oOptions && oOptions.url) {
+        // overloading use case, create+play: .play('someID',{url:'/path/to.mp3'});
+        //_s._wD(fN + 'attempting to create "' + sID + '"', 1);
+        oOptions.id = sID;
+        return _s.createSound(oOptions).play();
+      } else {
+        return false;
+      }
+    }
+    return _s.sounds[sID].play(oOptions);
+  };
+
+  this.start = this.play; // just for convenience
+
+  this.setPosition = function(sID, nMsecOffset) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].setPosition(nMsecOffset);
+  };
+
+  this.stop = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    //_s._wD(_sm+'.stop(' + sID + ')', 1);
+    return _s.sounds[sID].stop();
+  };
+
+  this.stopAll = function() {
+    var oSound;
+    //_s._wD(_sm+'.stopAll()', 1);
+    for (oSound in _s.sounds) {
+      if (_s.sounds.hasOwnProperty(oSound)) {
+        _s.sounds[oSound].stop(); // apply only to sound objects
+      }
+    }
+  };
+
+  this.pause = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].pause();
+  };
+
+  this.pauseAll = function() {
+    var i;
+    for (i = _s.soundIDs.length; i--;) {
+      _s.sounds[_s.soundIDs[i]].pause();
+    }
+  };
+
+  this.resume = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].resume();
+  };
+
+  this.resumeAll = function() {
+    var i;
+    for (i = _s.soundIDs.length; i--;) {
+      _s.sounds[_s.soundIDs[i]].resume();
+    }
+  };
+
+  this.togglePause = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].togglePause();
+  };
+
+  this.setPan = function(sID, nPan) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].setPan(nPan);
+  };
+
+  this.setVolume = function(sID, nVol) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].setVolume(nVol);
+  };
+
+  this.mute = function(sID) {
+    var fN = _sm+'.mute(): ',
+    i = 0;
+    if (typeof sID !== 'string') {
+      sID = null;
+    }
+    if (!sID) {
+      //_s._wD(fN + 'Muting all sounds');
+      for (i = _s.soundIDs.length; i--;) {
+        _s.sounds[_s.soundIDs[i]].mute();
+      }
+      _s.muted = true;
+    } else {
+      if (!_idCheck(sID)) {
+        return false;
+      }
+      //_s._wD(fN + 'Muting "' + sID + '"');
+      return _s.sounds[sID].mute();
+    }
+    return true;
+  };
+
+  this.muteAll = function() {
+    _s.mute();
+  };
+
+  this.unmute = function(sID) {
+    var fN = _sm+'.unmute(): ', i;
+    if (typeof sID !== 'string') {
+      sID = null;
+    }
+    if (!sID) {
+      //_s._wD(fN + 'Unmuting all sounds');
+      for (i = _s.soundIDs.length; i--;) {
+        _s.sounds[_s.soundIDs[i]].unmute();
+      }
+      _s.muted = false;
+    } else {
+      if (!_idCheck(sID)) {
+        return false;
+      }
+      //_s._wD(fN + 'Unmuting "' + sID + '"');
+      return _s.sounds[sID].unmute();
+    }
+    return true;
+  };
+
+  this.unmuteAll = function() {
+    _s.unmute();
+  };
+
+  this.toggleMute = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].toggleMute();
+  };
+
+  this.getMemoryUse = function() {
+    // flash-only
+    var ram = 0;
+    if (_s.o && _fV !== 8) {
+      ram = parseInt(_s.o._getMemoryUse(), 10);
+    }
+    return ram;
+  };
+
+  this.disable = function(bNoDisable) {
+    // destroy all functions
+    var i;
+    if (typeof bNoDisable === 'undefined') {
+      bNoDisable = false;
+    }
+    if (_disabled) {
+      return false;
+    }
+    _disabled = true;
+    //_wDS('shutdown', 1);
+    for (i = _s.soundIDs.length; i--;) {
+      _disableObject(_s.sounds[_s.soundIDs[i]]);
+    }
+    _initComplete(bNoDisable); // fire "complete", despite fail
+    _event.remove(_win, 'load', _initUserOnload);
+    return true;
+  };
+
+  this.canPlayMIME = function(sMIME) {
+    var result;
+    if (_s.hasHTML5) {
+      result = _html5CanPlay({type:sMIME});
+    }
+    if (!_needsFlash || result) {
+      // no flash, or OK
+      return result;
+    } else {
+      return (sMIME?(sMIME.match(_s.mimePattern)?true:false):null);
+    }
+  };
+
+  this.canPlayURL = function(sURL) {
+    var result;
+    if (_s.hasHTML5) {
+      result = _html5CanPlay({url: sURL});
+    }
+    if (!_needsFlash || result) {
+      // no flash, or OK
+      return result;
+    } else {
+      return (sURL?(sURL.match(_s.filePattern)?true:false):null);
+    }
+  };
+
+  this.canPlayLink = function(oLink) {
+    if (typeof oLink.type !== 'undefined' && oLink.type) {
+      if (_s.canPlayMIME(oLink.type)) {
+        return true;
+      }
+    }
+    return _s.canPlayURL(oLink.href);
+  };
+
+  this.getSoundById = function(sID, suppressDebug) {
+    if (!sID) {
+      throw new Error(_sm+'.getSoundById(): sID is null/undefined');
+    }
+    var result = _s.sounds[sID];
+    if (!result && !suppressDebug) {
+      //_s._wD('"' + sID + '" is an invalid sound ID.', 2);
+    }
+    return result;
+  };
+
+  this.onready = function(oMethod, oScope) {
+    var sType = 'onready';
+    if (oMethod && oMethod instanceof Function) {
+      if (_didInit) {
+        //_s._wD(_str('queue', sType));
+      }
+      if (!oScope) {
+        oScope = _win;
+      }
+      _addOnEvent(sType, oMethod, oScope);
+      _processOnEvents();
+      return true;
+    } else {
+      throw _str('needFunction', sType);
+    }
+  };
+
+  this.ontimeout = function(oMethod, oScope) {
+    var sType = 'ontimeout';
+    if (oMethod && oMethod instanceof Function) {
+      if (_didInit) {
+        //_s._wD(_str('queue', sType));
+      }
+      if (!oScope) {
+        oScope = _win;
+      }
+      _addOnEvent(sType, oMethod, oScope);
+      _processOnEvents({type:sType});
+      return true;
+    } else {
+      throw _str('needFunction', sType);
+    }
+  };
+
+  this._writeDebug = function(sText, sType, bTimestamp) {
+    // pseudo-private console.log()-style output
+    /*
+    var sDID = 'soundmanager-debug', o, oItem, sMethod;
+    if (!_s.debugMode) {
+      return false;
+    }
+    if (typeof bTimestamp !== 'undefined' && bTimestamp) {
+      sText = sText + ' | ' + new Date().getTime();
+    }
+    if (_hasConsole && _s.useConsole) {
+      sMethod = _debugLevels[sType];
+      if (typeof console[sMethod] !== 'undefined') {
+        console[sMethod](sText);
+      } else {
+        console.log(sText);
+      }
+      if (_s.useConsoleOnly) {
+        return true;
+      }
+    }
+    try {
+      o = _id(sDID);
+      if (!o) {
+        return false;
+      }
+      oItem = _doc.createElement('div');
+      if (++_wdCount % 2 === 0) {
+        oItem.className = 'sm2-alt';
+      }
+      if (typeof sType === 'undefined') {
+        sType = 0;
+      } else {
+        sType = parseInt(sType, 10);
+      }
+      oItem.appendChild(_doc.createTextNode(sText));
+      if (sType) {
+        if (sType >= 2) {
+          oItem.style.fontWeight = 'bold';
+        }
+        if (sType === 3) {
+          oItem.style.color = '#ff3333';
+        }
+      }
+      // o.appendChild(oItem); // top-to-bottom
+      o.insertBefore(oItem, o.firstChild); // bottom-to-top
+    } catch(e) {
+      // oh well
+    }
+    o = null;
+    */
+    return true;
+  };
+  this._wD = this._writeDebug; // alias
+
+  this._debug = function() {
+    /*
+    var i, j;
+    //_wDS('currentObj', 1);
+    for (i = 0, j = _s.soundIDs.length; i < j; i++) {
+      _s.sounds[_s.soundIDs[i]]._debug();
+    }
+    */
+  };
+
+  this.reboot = function() {
+    // attempt to reset and init SM2
+    //_s._wD(_sm+'.reboot()');
+    if (_s.soundIDs.length) {
+      //_s._wD('Destroying ' + _s.soundIDs.length + ' SMSound objects...');
+    }
+    var i, j;
+    for (i = _s.soundIDs.length; i--;) {
+      _s.sounds[_s.soundIDs[i]].destruct();
+    }
+    // trash ze flash
+    try {
+      if (_isIE) {
+        _oRemovedHTML = _s.o.innerHTML;
+      }
+      _oRemoved = _s.o.parentNode.removeChild(_s.o);
+      //_s._wD('Flash movie removed.');
+    } catch(e) {
+      // uh-oh.
+      //_wDS('badRemove', 2);
+    }
+    // actually, force recreate of movie.
+    _oRemovedHTML = _oRemoved = _needsFlash = null;
+    _s.enabled = _didDCLoaded = _didInit = _waitingForEI = _initPending = _didAppend = _appendSuccess = _disabled = _s.swfLoaded = false;
+    _s.soundIDs = _s.sounds = [];
+    _s.o = null;
+    for (i in _on_queue) {
+      if (_on_queue.hasOwnProperty(i)) {
+        for (j = _on_queue[i].length; j--;) {
+          _on_queue[i][j].fired = false;
+        }
+      }
+    }
+    //_s._wD(_sm + ': Rebooting...');
+    _win.setTimeout(_s.beginDelayedInit, 20);
+  };
+
+  this.getMoviePercent = function() {
+    return (_s.o && typeof _s.o.PercentLoaded !== 'undefined' ? _s.o.PercentLoaded() : null);
+  };
+
+  this.beginDelayedInit = function() {
+    _windowLoaded = true;
+    _dcLoaded();
+    setTimeout(function() {
+      if (_initPending) {
+        return false;
+      }
+      _createMovie();
+      _initMovie();
+      _initPending = true;
+      return true;
+    }, 20);
+    _delayWaitForEI();
+  };
+
+  this.destruct = function() {
+    //_s._wD(_sm+'.destruct()');
+    _s.disable(true);
+  };
+
+  /*
+   * internal HTML5 event handling
+  */
+
+  function _html5_event(oFn) {
+    // wrap html5 event handlers so we don't call them on destroyed sounds
+    return function(e) {
+      if (!this._t || !this._t._a) {
+        if (this._t && this._t.sID) {
+          //_s._wD(_h5+'ignoring '+e.type+': '+this._t.sID);
+        } else {
+          //_s._wD(_h5+'ignoring '+e.type);
+        }
+        return null;
+      } else {
+        return oFn.call(this, e);
+      }
+    };
+  }
+
+  _html5_events = {
+
+    // HTML5 event-name-to-handler map
+    abort: _html5_event(function(e) {
+      //_s._wD(_h5+'abort: '+this._t.sID);
+    }),
+
+    // enough has loaded to play
+    canplay: _html5_event(function(e) {
+      if (this._t._html5_canplay) {
+        // this event has already fired. ignore.
+        return true;
+      }
+      this._t._html5_canplay = true;
+      //_s._wD(_h5+'canplay: '+this._t.sID+', '+this._t.url);
+      this._t._onbufferchange(0);
+      var position1K = (!isNaN(this._t.position)?this._t.position/1000:null);
+      // set the position if position was set before the sound loaded
+      if (this._t.position && this.currentTime !== position1K) {
+        //_s._wD(_h5+'canplay: setting position to '+position1K);
+        try {
+          this.currentTime = position1K;
+        } catch(ee) {
+          //_s._wD(_h5+'setting position failed: '+ee.message, 2);
+        }
+      }
+    }),
+
+    load: _html5_event(function(e) {
+      if (!this._t.loaded) {
+        this._t._onbufferchange(0);
+        // should be 1, and the same
+        this._t._whileloading(this._t.bytesTotal, this._t.bytesTotal, this._t._get_html5_duration());
+        this._t._onload(true);
+      }
+    }),
+
+    emptied: _html5_event(function(e) {
+      //_s._wD(_h5+'emptied: '+this._t.sID);
+    }),
+
+    ended: _html5_event(function(e) {
+      //_s._wD(_h5+'ended: '+this._t.sID);
+      this._t._onfinish();
+    }),
+
+    error: _html5_event(function(e) {
+      //_s._wD(_h5+'error: '+this.error.code);
+      // call load with error state?
+      this._t._onload(false);
+    }),
+
+    loadeddata: _html5_event(function(e) {
+      var t = this._t,
+          bytesTotal = t.bytesTotal || 1; // at least 1 byte, so math works
+      //_s._wD(_h5+'loadeddata: '+this._t.sID);
+      if (!t._loaded && !_isSafari) { // safari seems to nicely report progress events, eventually totalling 100%
+        t.duration = t._get_html5_duration();
+        // fire whileloading() with 100% values
+        t._whileloading(bytesTotal, bytesTotal, t._get_html5_duration());
+        t._onload(true);
+      }
+    }),
+
+    loadedmetadata: _html5_event(function(e) {
+      //_s._wD(_h5+'loadedmetadata: '+this._t.sID);
+    }),
+
+    loadstart: _html5_event(function(e) {
+      //_s._wD(_h5+'loadstart: '+this._t.sID);
+      // assume buffering at first
+      this._t._onbufferchange(1);
+    }),
+
+    play: _html5_event(function(e) {
+      //_s._wD(_h5+'play: '+this._t.sID+', '+this._t.url);
+      // once play starts, no buffering
+      this._t._onbufferchange(0);
+    }),
+
+    // TODO: verify if this is actually implemented anywhere yet.
+    playing: _html5_event(function(e) {
+      //_s._wD(_h5+'playing: '+this._t.sID+', '+this._t.url);
+      // once play starts, no buffering
+      this._t._onbufferchange(0);
+    }),
+
+    progress: _html5_event(function(e) {
+
+      if (this._t.loaded) {
+        return false;
+      }
+
+      var i, j, str, buffered = 0,
+          isProgress = (e.type === 'progress'),
+          ranges = e.target.buffered,
+          loaded = (e.loaded||0), // firefox 3.6 implements e.loaded/total (bytes)
+          total = (e.total||1);
+
+      if (ranges && ranges.length) {
+
+        // if loaded is 0, try TimeRanges implementation as % of load
+        // https://developer.mozilla.org/en/DOM/TimeRanges
+        for (i=ranges.length; i--;) {
+          buffered = (ranges.end(i) - ranges.start(i));
+        }
+
+        // linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges
+        loaded = buffered/e.target.duration;
+
+        /*
+        if (isProgress && ranges.length > 1) {
+          str = [];
+          j = ranges.length;
+          for (i=0; i<j; i++) {
+            str.push(e.target.buffered.start(i) +'-'+ e.target.buffered.end(i));
+          }
+          //_s._wD(_h5+'progress: timeRanges: '+str.join(', '));
+        }
+        */
+
+        if (isProgress && !isNaN(loaded)) {
+          //_s._wD(_h5+'progress: '+this._t.sID+': ' + Math.floor(loaded*100)+'% loaded');
+        }
+
+      }
+
+      if (!isNaN(loaded)) {
+
+        this._t._onbufferchange(0); // if progress, likely not buffering
+        this._t._whileloading(loaded, total, this._t._get_html5_duration());
+
+        if (loaded && total && loaded === total) {
+          // in case "onload" doesn't fire (eg. gecko 1.9.2)
+          _html5_events.load.call(this, e);
+        }
+
+      }
+
+    }),
+
+    ratechange: _html5_event(function(e) {
+      //_s._wD(_h5+'ratechange: '+this._t.sID);
+    }),
+
+    suspend: _html5_event(function(e) {
+      // download paused/stopped, may have finished (eg. onload)
+      //_s._wD(_h5+'suspend: '+this._t.sID);
+      _html5_events.progress.call(this, e);
+    }),
+
+    stalled: _html5_event(function(e) {
+      //_s._wD(_h5+'stalled: '+this._t.sID);
+    }),
+
+    timeupdate: _html5_event(function(e) {
+      this._t._onTimer();
+    }),
+
+    waiting: _html5_event(function(e) { // see also: seeking
+      //_s._wD(_h5+'waiting: '+this._t.sID);
+      // playback faster than download rate, etc.
+      this._t._onbufferchange(1);
+    })
+
+  };
+
+  /*
+   * SMSound() (sound object) instance
+  */
+
+  SMSound = function(oOptions) {
+
+    var _t = this, _resetProperties, _stop_html5_timer, _start_html5_timer;
+    this.sID = oOptions.id;
+    this.url = oOptions.url;
+    this.options = _mixin(oOptions);
+    this.instanceOptions = this.options; // per-play-instance-specific options
+    this._iO = this.instanceOptions; // short alias
+    // assign property defaults
+    this.pan = this.options.pan;
+    this.volume = this.options.volume;
+    this._lastURL = null;
+    this.isHTML5 = false;
+    this._a = null;
+
+    // --- public methods ---
+
+    this.id3 = {};
+
+    this._debug = function() {
+      /*
+      // pseudo-private console.log()-style output
+      if (_s.debugMode) {
+        var stuff = null, msg = [], sF, sfBracket, maxLength = 64;
+        for (stuff in _t.options) {
+          if (_t.options[stuff] !== null) {
+            if (_t.options[stuff] instanceof Function) {
+              // handle functions specially
+              sF = _t.options[stuff].toString();
+              sF = sF.replace(/\s\s+/g, ' '); // normalize spaces
+              sfBracket = sF.indexOf('{');
+              msg.push(' ' + stuff + ': {' + sF.substr(sfBracket + 1, (Math.min(Math.max(sF.indexOf('\n') - 1, maxLength), maxLength))).replace(/\n/g, '') + '... }');
+            } else {
+              msg.push(' ' + stuff + ': ' + _t.options[stuff]);
+            }
+          }
+        }
+        //_s._wD('SMSound() merged options: {\n' + msg.join(', \n') + '\n}');
+      }
+      */
+    };
+
+    /*
+    this._debug();
+    */
+
+    this.load = function(oOptions) {
+      var oS = null;
+      if (typeof oOptions !== 'undefined') {
+        _t._iO = _mixin(oOptions, _t.options);
+        _t.instanceOptions = _t._iO;
+      } else {
+        oOptions = _t.options;
+        _t._iO = oOptions;
+        _t.instanceOptions = _t._iO;
+        if (_t._lastURL && _t._lastURL !== _t.url) {
+          //_wDS('manURL');
+          _t._iO.url = _t.url;
+          _t.url = null;
+        }
+      }
+      if (!_t._iO.url) {
+        _t._iO.url = _t.url;
+      }
+      //_s._wD('SMSound.load(): ' + _t._iO.url, 1);
+      if (_t._iO.url === _t.url && _t.readyState !== 0 && _t.readyState !== 2) {
+        //_wDS('onURL', 1);
+        return _t;
+      }
+      _t._lastURL = _t.url;
+      _t.loaded = false;
+      _t.readyState = 1;
+      _t.playState = 0;
+      if (_html5OK(_t._iO)) {
+        oS = _t._setup_html5(_t._iO);
+        if (!oS._called_load) {
+          //_s._wD(_h5+'load: '+_t.sID);
+          _t._html5_canplay = false;
+          oS.load();
+          oS._called_load = true;
+          if (_t._iO.autoPlay) {
+            _t.play();
+          }
+        } else {
+          //_s._wD(_h5+'ignoring request to load again: '+_t.sID);
+        }
+      } else {
+        try {
+          _t.isHTML5 = false;
+          _t._iO = _policyFix(_loopFix(_t._iO));
+          if (_fV === 8) {
+            _s.o._load(_t.sID, _t._iO.url, _t._iO.stream, _t._iO.autoPlay, (_t._iO.whileloading?1:0), _t._iO.loops||1, _t._iO.usePolicyFile);
+          } else {
+            _s.o._load(_t.sID, _t._iO.url, _t._iO.stream?true:false, _t._iO.autoPlay?true:false, _t._iO.loops||1, _t._iO.autoLoad?true:false, _t._iO.usePolicyFile);
+          }
+        } catch(e) {
+          //_wDS('smError', 2);
+          //_debugTS('onload', false);
+          _catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true});
+        }
+      }
+      return _t;
+    };
+
+    this.unload = function() {
+      // Flash 8/AS2 can't "close" a stream - fake it by loading an empty MP3
+      // Flash 9/AS3: Close stream, preventing further load
+      if (_t.readyState !== 0) {
+        //_s._wD('SMSound.unload(): "' + _t.sID + '"');
+        if (!_t.isHTML5) {
+          if (_fV === 8) {
+            _s.o._unload(_t.sID, _s.nullURL);
+          } else {
+            _s.o._unload(_t.sID);
+          }
+        } else {
+          _stop_html5_timer();
+          if (_t._a) {
+            // abort()-style method here, stop loading? (doesn't exist?)
+            _t._a.pause();
+            _t._a.src = ''; // https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media
+          }
+        }
+        // reset load/status flags
+        _resetProperties();
+      }
+      return _t;
+    };
+
+    this.destruct = function(_bFromSM) {
+      //_s._wD('SMSound.destruct(): "' + _t.sID + '"');
+      if (!_t.isHTML5) {
+        // kill sound within Flash
+        // Disable the onfailure handler
+        _t._iO.onfailure = null;
+        _s.o._destroySound(_t.sID);
+      } else {
+        _stop_html5_timer();
+        if (_t._a) {
+          // abort()-style method here, stop loading? (doesn't exist?)
+          _t._a.pause();
+          _t._a.src = ''; // https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media
+          if (!_useGlobalHTML5Audio) {
+            _t._remove_html5_events();
+          }
+          _t._a._t = null; // break potential circular reference
+          _t._a = null;
+        }
+      }
+      if (!_bFromSM) {
+        _s.destroySound(_t.sID, true); // ensure deletion from controller
+      }
+    };
+
+    this.play = function(oOptions, _updatePlayState) {
+      var fN = 'SMSound.play(): ', allowMulti, a;
+      _updatePlayState = _updatePlayState === undefined ? true : _updatePlayState; // default to true
+      if (!oOptions) {
+        oOptions = {};
+      }
+      _t._iO = _mixin(oOptions, _t._iO);
+      _t._iO = _mixin(_t._iO, _t.options);
+      _t.instanceOptions = _t._iO;
+      if (_t._iO.serverURL && !_t.connected) {
+        if (!_t.getAutoPlay()) {
+          //_s._wD(fN+' Netstream not connected yet - setting autoPlay');
+          _t.setAutoPlay(true);
+        }
+        return _t; // play will be called in _onconnect()
+      }
+      if (_html5OK(_t._iO)) {
+        _t._setup_html5(_t._iO);
+        _start_html5_timer();
+      }
+      if (_t.playState === 1 && !_t.paused) {
+        allowMulti = _t._iO.multiShot;
+        if (!allowMulti) {
+          //_s._wD(fN + '"' + _t.sID + '" already playing (one-shot)', 1);
+          return _t;
+        } else {
+          //_s._wD(fN + '"' + _t.sID + '" already playing (multi-shot)', 1);
+        }
+      }
+      if (!_t.loaded) {
+        if (_t.readyState === 0) {
+          //_s._wD(fN + 'Attempting to load "' + _t.sID + '"', 1);
+          // try to get this sound playing ASAP
+          if (!_t.isHTML5) {
+            _t._iO.autoPlay = true; // assign directly because setAutoPlay() increments the instanceCount
+          }
+          _t.load(_t._iO);
+        } else if (_t.readyState === 2) {
+          //_s._wD(fN + 'Could not load "' + _t.sID + '" - exiting', 2);
+          return _t;
+        } else {
+          //_s._wD(fN + '"' + _t.sID + '" is loading - attempting to play..', 1);
+        }
+      } else {
+        //_s._wD(fN + '"' + _t.sID + '"');
+      }
+      if (!_t.isHTML5 && _fV === 9 && _t.position > 0 && _t.position === _t.duration) {
+        // flash 9 needs a position reset if play() is called while at the end of a sound.
+        //_s._wD(fN + '"' + _t.sID + '": Sound at end, resetting to position:0');
+        _t._iO.position = 0;
+      }
+      /*
+       * Streams will pause when their buffer is full if they are being loaded.
+       * In this case paused is true, but the song hasn't started playing yet.
+       * If we just call resume() the onplay() callback will never be called.
+       * So only call resume() if the position is > 0.
+       * Another reason is because options like volume won't have been applied yet.
+      */
+      if (_t.paused && _t.position && _t.position > 0) { // https://gist.github.com/37b17df75cc4d7a90bf6
+        //_s._wD(fN + '"' + _t.sID + '" is resuming from paused state',1);
+        _t.resume();
+      } else {
+        //_s._wD(fN+'"'+ _t.sID+'" is starting to play');
+        _t.playState = 1;
+        _t.paused = false;
+        if (!_t.instanceCount || _t._iO.multiShotEvents || (!_t.isHTML5 && _fV > 8 && !_t.getAutoPlay())) {
+          _t.instanceCount++;
+        }
+        _t.position = (typeof _t._iO.position !== 'undefined' && !isNaN(_t._iO.position)?_t._iO.position:0);
+        if (!_t.isHTML5) {
+          _t._iO = _policyFix(_loopFix(_t._iO));
+        }
+        if (_t._iO.onplay && _updatePlayState) {
+          _t._iO.onplay.apply(_t);
+          _t._onplay_called = true;
+        }
+        _t.setVolume(_t._iO.volume, true);
+        _t.setPan(_t._iO.pan, true);
+        if (!_t.isHTML5) {
+          _s.o._start(_t.sID, _t._iO.loops || 1, (_fV === 9?_t._iO.position:_t._iO.position / 1000));
+        } else {
+          _start_html5_timer();
+          a = _t._setup_html5();
+          _t.setPosition(_t._iO.position);
+          a.play();
+        }
+      }
+      return _t;
+    };
+
+    this.start = this.play; // just for convenience
+
+    this.stop = function(bAll) {
+      if (_t.playState === 1) {
+        _t._onbufferchange(0);
+        _t.resetOnPosition(0);
+        if (!_t.isHTML5) {
+          _t.playState = 0;
+        }
+        _t.paused = false;
+        if (_t._iO.onstop) {
+          _t._iO.onstop.apply(_t);
+        }
+        if (!_t.isHTML5) {
+          _s.o._stop(_t.sID, bAll);
+          // hack for netStream: just unload
+          if (_t._iO.serverURL) {
+            _t.unload();
+          }
+        } else {
+          if (_t._a) {
+            _t.setPosition(0); // act like Flash, though
+            _t._a.pause(); // html5 has no stop()
+            _t.playState = 0;
+            _t._onTimer(); // and update UI
+            _stop_html5_timer();
+            _t.unload();
+          }
+        }
+        _t.instanceCount = 0;
+        _t._iO = {};
+      }
+      return _t;
+    };
+
+    this.setAutoPlay = function(autoPlay) {
+      //_s._wD('sound '+_t.sID+' turned autoplay ' + (autoPlay ? 'on' : 'off'));
+      _t._iO.autoPlay = autoPlay;
+      if (!_t.isHTML5) {
+        _s.o._setAutoPlay(_t.sID, autoPlay);
+        if (autoPlay) {
+          // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP)
+          if (!_t.instanceCount && _t.readyState === 1) {
+            _t.instanceCount++;
+            //_s._wD('sound '+_t.sID+' incremented instance count to '+_t.instanceCount);
+          }
+        }
+      }
+    };
+
+    this.getAutoPlay = function() {
+      return _t._iO.autoPlay;
+    };
+
+    this.setPosition = function(nMsecOffset) {
+      if (nMsecOffset === undefined) {
+        nMsecOffset = 0;
+      }
+      // Use the duration from the instance options, if we don't have a track duration yet.
+      var original_pos, position, position1K,
+          offset = (_t.isHTML5 ? Math.max(nMsecOffset,0) : Math.min(_t.duration || _t._iO.duration, Math.max(nMsecOffset, 0))); // position >= 0 and <= current available (loaded) duration
+      original_pos = _t.position;
+      _t.position = offset;
+      position1K = _t.position/1000;
+      _t.resetOnPosition(_t.position);
+      _t._iO.position = offset;
+      if (!_t.isHTML5) {
+        position = (_fV === 9 ? _t.position : position1K);
+        if (_t.readyState && _t.readyState !== 2) {
+          _s.o._setPosition(_t.sID, position, (_t.paused || !_t.playState)); // if paused or not playing, will not resume (by playing)
+        }
+      } else if (_t._a) {
+        // Set the position in the canplay handler if the sound is not ready yet
+        if (_t._html5_canplay) {
+          if (_t._a.currentTime !== position1K) {
+            /*
+             * DOM/JS errors/exceptions to watch out for:
+             * if seek is beyond (loaded?) position, "DOM exception 11"
+             * "INDEX_SIZE_ERR": DOM exception 1
+            */
+            //_s._wD('setPosition('+position1K+'): setting position');
+            try {
+              _t._a.currentTime = position1K;
+              if (_t.playState === 0 || _t.paused) {
+                // allow seek without auto-play/resume
+                _t._a.pause();
+              }
+            } catch(e) {
+              //_s._wD('setPosition('+position1K+'): setting position failed: '+e.message, 2);
+            }
+          }
+        } else {
+          //_s._wD('setPosition('+position1K+'): delaying, sound not ready');
+        }
+      }
+      if (_t.isHTML5) {
+        if (_t.paused) { // if paused, refresh UI right away
+          _t._onTimer(true); // force update
+        }
+      }
+      return _t;
+    };
+
+    this.pause = function(bCallFlash) {
+      if (_t.paused || (_t.playState === 0 && _t.readyState !== 1)) {
+        return _t;
+      }
+      //_s._wD('SMSound.pause()');
+      _t.paused = true;
+      if (!_t.isHTML5) {
+        if (bCallFlash || bCallFlash === undefined) {
+          _s.o._pause(_t.sID);
+        }
+      } else {
+        _t._setup_html5().pause();
+        _stop_html5_timer();
+      }
+      if (_t._iO.onpause) {
+        _t._iO.onpause.apply(_t);
+      }
+      return _t;
+    };
+
+    /*
+     * When auto-loaded streams pause on buffer full they have a playState of 0.
+     * We need to make sure that the playState is set to 1 when these streams "resume".
+     * When a paused stream is resumed, we need to trigger the onplay() callback if it
+     * hasn't been called already. In this case since the sound is being played for the
+     * first time, I think it's more appropriate to call onplay() rather than onresume().
+    */
+    this.resume = function() {
+      if (!_t.paused) {
+        return _t;
+      }
+      //_s._wD('SMSound.resume()');
+      _t.paused = false;
+      _t.playState = 1;
+      if (!_t.isHTML5) {
+        if (_t._iO.isMovieStar) {
+          // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition.
+          _t.setPosition(_t.position);
+        }
+        _s.o._pause(_t.sID); // flash method is toggle-based (pause/resume)
+      } else {
+        _t._setup_html5().play();
+        _start_html5_timer();
+      }
+      if (!_t._onplay_called && _t._iO.onplay) {
+        _t._iO.onplay.apply(_t);
+        _t._onplay_called = true;
+      } else if (_t._iO.onresume) {
+        _t._iO.onresume.apply(_t);
+      }
+      return _t;
+    };
+
+    this.togglePause = function() {
+      //_s._wD('SMSound.togglePause()');
+      if (_t.playState === 0) {
+        _t.play({
+          position: (_fV === 9 && !_t.isHTML5 ? _t.position : _t.position / 1000)
+        });
+        return _t;
+      }
+      if (_t.paused) {
+        _t.resume();
+      } else {
+        _t.pause();
+      }
+      return _t;
+    };
+
+    this.setPan = function(nPan, bInstanceOnly) {
+      if (typeof nPan === 'undefined') {
+        nPan = 0;
+      }
+      if (typeof bInstanceOnly === 'undefined') {
+        bInstanceOnly = false;
+      }
+      if (!_t.isHTML5) {
+        _s.o._setPan(_t.sID, nPan);
+      } // else { no HTML5 pan? }
+      _t._iO.pan = nPan;
+      if (!bInstanceOnly) {
+        _t.pan = nPan;
+        _t.options.pan = nPan;
+      }
+      return _t;
+    };
+
+    this.setVolume = function(nVol, bInstanceOnly) {
+      if (typeof nVol === 'undefined') {
+        nVol = 100;
+      }
+      if (typeof bInstanceOnly === 'undefined') {
+        bInstanceOnly = false;
+      }
+      if (!_t.isHTML5) {
+        _s.o._setVolume(_t.sID, (_s.muted && !_t.muted) || _t.muted?0:nVol);
+      } else if (_t._a) {
+        _t._a.volume = Math.max(0, Math.min(1, nVol/100)); // valid range: 0-1
+      }
+      _t._iO.volume = nVol;
+      if (!bInstanceOnly) {
+        _t.volume = nVol;
+        _t.options.volume = nVol;
+      }
+      return _t;
+    };
+
+    this.mute = function() {
+      _t.muted = true;
+      if (!_t.isHTML5) {
+        _s.o._setVolume(_t.sID, 0);
+      } else if (_t._a) {
+        _t._a.muted = true;
+      }
+      return _t;
+    };
+
+    this.unmute = function() {
+      _t.muted = false;
+      var hasIO = typeof _t._iO.volume !== 'undefined';
+      if (!_t.isHTML5) {
+        _s.o._setVolume(_t.sID, hasIO?_t._iO.volume:_t.options.volume);
+      } else if (_t._a) {
+        _t._a.muted = false;
+      }
+      return _t;
+    };
+
+    this.toggleMute = function() {
+      return (_t.muted?_t.unmute():_t.mute());
+    };
+
+    this.onposition = function(nPosition, oMethod, oScope) {
+      // TODO: allow for ranges, too? eg. (nPosition instanceof Array)
+      _t._onPositionItems.push({
+        position: nPosition,
+        method: oMethod,
+        scope: (typeof oScope !== 'undefined'?oScope:_t),
+        fired: false
+      });
+      return _t;
+    };
+
+    this.processOnPosition = function() {
+      var i, item, j = _t._onPositionItems.length;
+      if (!j || !_t.playState || _t._onPositionFired >= j) {
+        return false;
+      }
+      for (i=j; i--;) {
+        item = _t._onPositionItems[i];
+        if (!item.fired && _t.position >= item.position) {
+          item.method.apply(item.scope,[item.position]);
+          item.fired = true;
+          _s._onPositionFired++;
+        }
+      }
+      return true;
+    };
+
+    this.resetOnPosition = function(nPosition) {
+      // reset "fired" for items interested in this position
+      var i, item, j = _t._onPositionItems.length;
+      if (!j) {
+        return false;
+      }
+      for (i=j; i--;) {
+        item = _t._onPositionItems[i];
+        if (item.fired && nPosition <= item.position) {
+          item.fired = false;
+          _s._onPositionFired--;
+        }
+      }
+      return true;
+    };
+
+    /*
+     * private internals
+    */
+
+    _start_html5_timer = function() {
+      if (_t.isHTML5) {
+        _startTimer(_t);
+      }
+    };
+
+    _stop_html5_timer = function() {
+      if (_t.isHTML5) {
+        _stopTimer(_t);
+      }
+    };
+
+    _resetProperties = function() {
+      _t._onPositionItems = [];
+      _t._onPositionFired = 0;
+      _t._hasTimer = null;
+      _t._onplay_called = false;
+      _t._a = null;
+      _t._html5_canplay = false;
+      _t.bytesLoaded = null;
+      _t.bytesTotal = null;
+      _t.position = null;
+      _t.duration = (_t._iO && _t._iO.duration?_t._iO.duration:null);
+      _t.durationEstimate = null;
+      _t.failures = 0;
+      _t.loaded = false;
+      _t.playState = 0;
+      _t.paused = false;
+      _t.readyState = 0; // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success
+      _t.muted = false;
+      _t.didBeforeFinish = false;
+      _t.didJustBeforeFinish = false;
+      _t.isBuffering = false;
+      _t.instanceOptions = {};
+      _t.instanceCount = 0;
+      _t.peakData = {
+        left: 0,
+        right: 0
+      };
+      _t.waveformData = {
+        left: [],
+        right: []
+      };
+      _t.eqData = []; // legacy: 1D array
+      _t.eqData.left = [];
+      _t.eqData.right = [];
+    };
+
+    _resetProperties();
+
+    /*
+     * pseudo-private SMSound internals
+    */
+
+    this._onTimer = function(bForce) {
+      // HTML5-only _whileplaying() etc.
+      var time, x = {};
+      if (_t._hasTimer || bForce) {
+        if (_t._a && (bForce || ((_t.playState > 0 || _t.readyState === 1) && !_t.paused))) { // TODO: May not need to track readyState (1 = loading)
+          _t.duration = _t._get_html5_duration();
+          _t.durationEstimate = _t.duration;
+          time = _t._a.currentTime?_t._a.currentTime*1000:0;
+          _t._whileplaying(time,x,x,x,x);
+          return true;
+        } else {
+         //_s._wD('_onTimer: Warn for "'+_t.sID+'": '+(!_t._a?'Could not find element. ':'')+(_t.playState === 0?'playState bad, 0?':'playState = '+_t.playState+', OK'));
+          return false;
+        }
+      }
+    };
+
+    this._get_html5_duration = function() {
+      var d = (_t._a ? _t._a.duration*1000 : (_t._iO ? _t._iO.duration : undefined)),
+          result = (d && !isNaN(d) && d !== Infinity ? d : (_t._iO ? _t._iO.duration : null));
+      return result;
+    };
+
+    this._setup_html5 = function(oOptions) {
+      var _iO = _mixin(_t._iO, oOptions), d = decodeURI,
+          _a = _useGlobalHTML5Audio ? _s._global_a : _t._a,
+          _dURL = d(_iO.url),
+          _oldIO = (_a && _a._t ? _a._t.instanceOptions : null);
+      if (_a) {
+        if (_a._t && _oldIO.url === _iO.url && (!_t._lastURL || (_t._lastURL === _oldIO.url))) {
+          return _a; // same url, ignore request
+        }
+        //_s._wD('setting new URL on existing object: ' + _dURL + (_t._lastURL ? ', old URL: ' + _t._lastURL : ''));
+        /*
+         * "First things first, I, Poppa.." (reset the previous state of the old sound, if playing)
+         * Fixes case with devices that can only play one sound at a time
+         * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state
+        */
+        if (_useGlobalHTML5Audio && _a._t && _a._t.playState && _iO.url !== _oldIO.url) {
+          _a._t.stop();
+        }
+        _resetProperties(); // new URL, so reset load/playstate and so on
+        _a.src = _iO.url;
+        _t.url = _iO.url;
+        _t._lastURL = _iO.url;
+        _a._called_load = false;
+      } else {
+        //_s._wD('creating HTML5 Audio() element with URL: '+_dURL);
+        _a = new Audio(_iO.url);
+        _a._called_load = false;
+        if (_useGlobalHTML5Audio) {
+          _s._global_a = _a;
+        }
+      }
+      _t.isHTML5 = true;
+      _t._a = _a; // store a ref on the track
+      _a._t = _t; // store a ref on the audio
+      _t._add_html5_events();
+      _a.loop = (_iO.loops>1?'loop':'');
+      if (_iO.autoLoad || _iO.autoPlay) {
+        _a.autobuffer = 'auto'; // early HTML5 implementation (non-standard)
+        _a.preload = 'auto'; // standard
+        _t.load();
+        _a._called_load = true;
+      } else {
+        _a.autobuffer = false; // early HTML5 implementation (non-standard)
+        _a.preload = 'none'; // standard
+      }
+      _a.loop = (_iO.loops>1?'loop':''); // boolean instead of "loop", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop
+      return _a;
+    };
+
+    this._add_html5_events = function() {
+
+      if (_t._a._added_events) {
+        return false;
+      }
+
+      var f;
+
+      function add(oEvt, oFn, bCapture) {
+        return _t._a ? _t._a.addEventListener(oEvt, oFn, bCapture||false) : null;
+      }
+
+      //_s._wD(_h5+'adding event listeners: '+_t.sID);
+      _t._a._added_events = true;
+
+      for (f in _html5_events) {
+        if (_html5_events.hasOwnProperty(f)) {
+          add(f, _html5_events[f]);
+        }
+      }
+
+      return true;
+
+    };
+
+    this._remove_html5_events = function() {
+
+      // Remove event listeners
+
+      var f;
+
+      function remove(oEvt, oFn, bCapture) {
+        return (_t._a ? _t._a.removeEventListener(oEvt, oFn, bCapture||false) : null);
+      }
+
+      //_s._wD(_h5+'removing event listeners: '+_t.sID);
+      _t._a._added_events = false;
+
+      for (f in _html5_events) {
+        if (_html5_events.hasOwnProperty(f)) {
+          remove(f, _html5_events[f]);
+        }
+      }
+
+    };
+
+    /*
+     * pseudo-private event internals
+    */
+
+    this._onload = function(nSuccess) {
+      var fN = 'SMSound._onload(): ', loadOK = (nSuccess?true:false);
+      //_s._wD(fN + '"' + _t.sID + '"' + (loadOK?' loaded.':' failed to load? - ' + _t.url), (loadOK?1:2));
+      /*
+      if (!loadOK && !_t.isHTML5) {
+        if (_s.sandbox.noRemote === true) {
+          //_s._wD(fN + _str('noNet'), 1);
+        }
+        if (_s.sandbox.noLocal === true) {
+          //_s._wD(fN + _str('noLocal'), 1);
+        }
+      }
+      */
+      _t.loaded = loadOK;
+      _t.readyState = loadOK?3:2;
+      _t._onbufferchange(0);
+      if (_t._iO.onload) {
+        _t._iO.onload.apply(_t, [loadOK]);
+      }
+      return true;
+    };
+
+    this._onbufferchange = function(nIsBuffering) {
+      var fN = 'SMSound._onbufferchange()';
+      if (_t.playState === 0) {
+        // ignore if not playing
+        return false;
+      }
+      if ((nIsBuffering && _t.isBuffering) || (!nIsBuffering && !_t.isBuffering)) {
+        return false;
+      }
+      _t.isBuffering = (nIsBuffering === 1);
+      if (_t._iO.onbufferchange) {
+        //_s._wD(fN + ': ' + nIsBuffering);
+        _t._iO.onbufferchange.apply(_t);
+      }
+      return true;
+    };
+
+    /*
+     * flash-only method, should fire only once at most
+     * at this point we just recreate failed sounds rather than trying to reconnect
+    */
+    this._onfailure = function(msg, level, code) {
+      _t.failures++;
+      //_s._wD('SMSound._onfailure(): "'+_t.sID+'" count '+_t.failures);
+      if (_t._iO.onfailure && _t.failures === 1) {
+        _t._iO.onfailure(_t, msg, level, code);
+      } else {
+        //_s._wD('SMSound._onfailure(): ignoring');
+      }
+    };
+
+    this._onbeforefinish = function() {
+      if (!_t.didBeforeFinish) {
+        _t.didBeforeFinish = true;
+        if (_t._iO.onbeforefinish) {
+          //_s._wD('SMSound._onbeforefinish(): "' + _t.sID + '"');
+          _t._iO.onbeforefinish.apply(_t);
+        }
+      }
+    };
+
+    this._onjustbeforefinish = function(msOffset) {
+      if (!_t.didJustBeforeFinish) {
+        _t.didJustBeforeFinish = true;
+        if (_t._iO.onjustbeforefinish) {
+          //_s._wD('SMSound._onjustbeforefinish(): "' + _t.sID + '"');
+          _t._iO.onjustbeforefinish.apply(_t);
+        }
+      }
+    };
+
+    this._onfinish = function() {
+      var _io_onfinish = _t._iO.onfinish; // store local copy before it gets trashed..
+      _t._onbufferchange(0);
+      _t.resetOnPosition(0);
+      if (_t._iO.onbeforefinishcomplete) {
+        _t._iO.onbeforefinishcomplete.apply(_t);
+      }
+      // reset some state items
+      _t.didBeforeFinish = false;
+      _t.didJustBeforeFinish = false;
+      if (_t.instanceCount) {
+        _t.instanceCount--;
+        if (!_t.instanceCount) {
+          // reset instance options
+          _t.playState = 0;
+          _t.paused = false;
+          _t.instanceCount = 0;
+          _t.instanceOptions = {};
+          _t._iO = {};
+          _stop_html5_timer();
+        }
+        if (!_t.instanceCount || _t._iO.multiShotEvents) {
+          // fire onfinish for last, or every instance
+          if (_io_onfinish) {
+            //_s._wD('SMSound._onfinish(): "' + _t.sID + '"');
+            _io_onfinish.apply(_t);
+          }
+        }
+      }
+    };
+
+    this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) {
+      _t.bytesLoaded = nBytesLoaded;
+      _t.bytesTotal = nBytesTotal;
+      _t.duration = Math.floor(nDuration);
+      _t.bufferLength = nBufferLength;
+      if (!_t._iO.isMovieStar) {
+        if (_t._iO.duration) {
+          // use options, if specified and larger
+          _t.durationEstimate = (_t.duration > _t._iO.duration) ? _t.duration : _t._iO.duration;
+        } else {
+          _t.durationEstimate = parseInt((_t.bytesTotal / _t.bytesLoaded) * _t.duration, 10);
+        }
+        if (_t.durationEstimate === undefined) {
+          _t.durationEstimate = _t.duration;
+        }
+        if (_t.readyState !== 3 && _t._iO.whileloading) {
+          _t._iO.whileloading.apply(_t);
+        }
+      } else {
+        _t.durationEstimate = _t.duration;
+        if (_t.readyState !== 3 && _t._iO.whileloading) {
+          _t._iO.whileloading.apply(_t);
+        }
+      }
+    };
+
+    this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) {
+      if (isNaN(nPosition) || nPosition === null) {
+        return false; // flash safety net
+      }
+      _t.position = nPosition;
+      _t.processOnPosition();
+      if (!_t.isHTML5 && _fV > 8) {
+        if (_t._iO.usePeakData && typeof oPeakData !== 'undefined' && oPeakData) {
+          _t.peakData = {
+            left: oPeakData.leftPeak,
+            right: oPeakData.rightPeak
+          };
+        }
+        if (_t._iO.useWaveformData && typeof oWaveformDataLeft !== 'undefined' && oWaveformDataLeft) {
+          _t.waveformData = {
+            left: oWaveformDataLeft.split(','),
+            right: oWaveformDataRight.split(',')
+          };
+        }
+        if (_t._iO.useEQData) {
+          if (typeof oEQData !== 'undefined' && oEQData && oEQData.leftEQ) {
+            var eqLeft = oEQData.leftEQ.split(',');
+            _t.eqData = eqLeft;
+            _t.eqData.left = eqLeft;
+            if (typeof oEQData.rightEQ !== 'undefined' && oEQData.rightEQ) {
+              _t.eqData.right = oEQData.rightEQ.split(',');
+            }
+          }
+        }
+      }
+      if (_t.playState === 1) {
+        // special case/hack: ensure buffering is false if loading from cache (and not yet started)
+        if (!_t.isHTML5 && _s.flashVersion === 8 && !_t.position && _t.isBuffering) {
+          _t._onbufferchange(0);
+        }
+        if (_t._iO.whileplaying) {
+          _t._iO.whileplaying.apply(_t); // flash may call after actual finish
+        }
+        if ((_t.loaded || (!_t.loaded && _t._iO.isMovieStar)) && _t._iO.onbeforefinish && _t._iO.onbeforefinishtime && !_t.didBeforeFinish && _t.duration - _t.position <= _t._iO.onbeforefinishtime) {
+          _t._onbeforefinish();
+        }
+      }
+      return true;
+    };
+
+    this._onid3 = function(oID3PropNames, oID3Data) {
+      // oID3PropNames: string array (names)
+      // ID3Data: string array (data)
+      //_s._wD('SMSound._onid3(): "' + this.sID + '" ID3 data received.');
+      var oData = [], i, j;
+      for (i = 0, j = oID3PropNames.length; i < j; i++) {
+        oData[oID3PropNames[i]] = oID3Data[i];
+      }
+      _t.id3 = _mixin(_t.id3, oData);
+      if (_t._iO.onid3) {
+        _t._iO.onid3.apply(_t);
+      }
+    };
+
+    // flash + RTMP
+    this._onconnect = function(bSuccess) {
+      var fN = 'SMSound._onconnect(): ';
+      bSuccess = (bSuccess === 1);
+      //_s._wD(fN+'"'+_t.sID+'"'+(bSuccess?' connected.':' failed to connect? - '+_t.url), (bSuccess?1:2));
+      _t.connected = bSuccess;
+      if (bSuccess) {
+        _t.failures = 0;
+        if (_idCheck(_t.sID)) {
+          if (_t.getAutoPlay()) {
+            _t.play(undefined, _t.getAutoPlay()); // only update the play state if auto playing
+          } else if (_t._iO.autoLoad) {
+            _t.load();
+          }
+        }
+        if (_t._iO.onconnect) {
+          _t._iO.onconnect.apply(_t,[bSuccess]);
+        }
+      }
+    };
+
+    this._ondataerror = function(sError) {
+      // flash 9 wave/eq data handler
+      if (_t.playState > 0) { // hack: called at start, and end from flash at/after onfinish()
+        //_s._wD('SMSound._ondataerror(): ' + sError);
+        if (_t._iO.ondataerror) {
+          _t._iO.ondataerror.apply(_t);
+        }
+      }
+    };
+
+  }; // SMSound()
+
+  /*
+   * private soundManager internals
+  */
+
+  _getDocument = function() {
+    return (_doc.body || _doc._docElement || _doc.getElementsByTagName('div')[0]);
+  };
+
+  _id = function(sID) {
+    return _doc.getElementById(sID);
+  };
+
+  _mixin = function(oMain, oAdd) {
+    // non-destructive merge
+    var o1 = {}, i, o2, o;
+    for (i in oMain) { // clone c1
+      if (oMain.hasOwnProperty(i)) {
+        o1[i] = oMain[i];
+      }
+    }
+    o2 = (typeof oAdd === 'undefined'?_s.defaultOptions:oAdd);
+    for (o in o2) {
+      if (o2.hasOwnProperty(o) && typeof o1[o] === 'undefined') {
+        o1[o] = o2[o];
+      }
+    }
+    return o1;
+  };
+
+  _event = (function() {
+
+    var old = (_win.attachEvent),
+    evt = {
+      add: (old?'attachEvent':'addEventListener'),
+      remove: (old?'detachEvent':'removeEventListener')
+    };
+
+    function getArgs(oArgs) {
+      var args = _slice.call(oArgs), len = args.length;
+      if (old) {
+        args[1] = 'on' + args[1]; // prefix
+        if (len > 3) {
+          args.pop(); // no capture
+        }
+      } else if (len === 3) {
+        args.push(false);
+      }
+      return args;
+    }
+
+    function apply(args, sType) {
+      var element = args.shift(),
+          method = [evt[sType]];
+      if (old) {
+        element[method](args[0], args[1]);
+      } else {
+        element[method].apply(element, args);
+      }
+    }
+
+    function add() {
+      apply(getArgs(arguments), 'add');
+    }
+
+    function remove() {
+      apply(getArgs(arguments), 'remove');
+    }
+
+    return {
+      'add': add,
+      'remove': remove
+    };
+
+  }());
+
+  _html5OK = function(iO) {
+    return (!iO.serverURL && (iO.type?_html5CanPlay({type:iO.type}):_html5CanPlay({url:iO.url})||_s.html5Only)); // Use type, if specified. If HTML5-only mode, no other options, so just give 'er
+  };
+
+  _html5CanPlay = function(o) {
+
+    /*
+     * try to find MIME, test and return truthiness
+     * o = {
+     *  url: '/path/to/an.mp3',
+     *  type: 'audio/mp3'
+     * }
+    */
+
+    if (!_s.useHTML5Audio || !_s.hasHTML5) {
+      return false;
+    }
+
+    var url = (o.url || null),
+        mime = (o.type || null),
+        aF = _s.audioFormats,
+        result,
+        offset,
+        fileExt,
+        item;
+
+    function preferFlashCheck(kind) {
+      // whether flash should play a given type
+      return (_s.preferFlash && _hasFlash && !_s.ignoreFlash && (typeof _s.flash[kind] !== 'undefined' && _s.flash[kind]));
+    }
+
+    // account for known cases like audio/mp3
+    if (mime && _s.html5[mime] !== 'undefined') {
+      return (_s.html5[mime] && !preferFlashCheck(mime));
+    }
+
+    if (!_html5Ext) {
+      _html5Ext = [];
+      for (item in aF) {
+        if (aF.hasOwnProperty(item)) {
+          _html5Ext.push(item);
+          if (aF[item].related) {
+            _html5Ext = _html5Ext.concat(aF[item].related);
+          }
+        }
+      }
+      _html5Ext = new RegExp('\\.('+_html5Ext.join('|')+')(\\?.*)?$','i');
+    }
+
+    fileExt = (url ? url.toLowerCase().match(_html5Ext) : null); // TODO: Strip URL queries, etc.
+
+    if (!fileExt || !fileExt.length) {
+      if (!mime) {
+        return false;
+      } else {
+        // audio/mp3 -> mp3, result should be known
+        offset = mime.indexOf(';');
+        fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6); // strip "audio/X; codecs.."
+      }
+    } else {
+      fileExt = fileExt[1]; // match the raw extension name - "mp3", for example
+    }
+
+    if (fileExt && typeof _s.html5[fileExt] !== 'undefined') {
+      // result known
+      return (_s.html5[fileExt] && !preferFlashCheck(fileExt));
+    } else {
+      mime = 'audio/'+fileExt;
+      result = _s.html5.canPlayType({type:mime});
+      _s.html5[fileExt] = result;
+      // //_s._wD('canPlayType, found result: '+result);
+      return (result && _s.html5[mime] && !preferFlashCheck(mime));
+    }
+
+  };
+
+  _testHTML5 = function() {
+
+    if (!_s.useHTML5Audio || typeof Audio === 'undefined') {
+      return false;
+    }
+
+    // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load "null" as a URL. :/
+    var a = (typeof Audio !== 'undefined' ? (_isOpera ? new Audio(null) : new Audio()) : null),
+        item, support = {}, aF, i;
+
+    function _cp(m) {
+      var canPlay, i, j, isOK = false;
+      if (!a || typeof a.canPlayType !== 'function') {
+        return false;
+      }
+      if (m instanceof Array) {
+        // iterate through all mime types, return any successes
+        for (i=0, j=m.length; i<j && !isOK; i++) {
+          if (_s.html5[m[i]] || a.canPlayType(m[i]).match(_s.html5Test)) {
+            isOK = true;
+            _s.html5[m[i]] = true;
+            // if flash can play and preferred, also mark it for use.
+            _s.flash[m[i]] = !!(_s.preferFlash && _hasFlash && m[i].match(_flashMIME));
+          }
+        }
+        return isOK;
+      } else {
+        canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false);
+        return !!(canPlay && (canPlay.match(_s.html5Test)));
+      }
+    }
+
+    // test all registered formats + codecs
+    aF = _s.audioFormats;
+    for (item in aF) {
+      if (aF.hasOwnProperty(item)) {
+        support[item] = _cp(aF[item].type);
+        support['audio/'+item] = support[item]; // write back generic type too, eg. audio/mp3
+        // assign flash
+        if (_s.preferFlash && !_s.ignoreFlash && item.match(_flashMIME)) {
+          _s.flash[item] = true;
+        } else {
+          _s.flash[item] = false;
+        }
+        // assign result to related formats, too
+        if (aF[item] && aF[item].related) {
+          for (i=aF[item].related.length; i--;) {
+            support['audio/'+aF[item].related[i]] = support[item]; // eg. audio/m4a
+            _s.html5[aF[item].related[i]] = support[item];
+            _s.flash[aF[item].related[i]] = support[item];
+          }
+        }
+      }
+    }
+
+    support.canPlayType = (a?_cp:null);
+    _s.html5 = _mixin(_s.html5, support);
+    return true;
+
+  };
+
+  _strings = {
+    /*
+    notReady: 'Not loaded yet - wait for soundManager.onload()/onready()',
+    notOK: 'Audio support is not available.',
+    domError: _smc + 'createMovie(): appendChild/innerHTML call failed. DOM not ready or other error.',
+    spcWmode: _smc + 'createMovie(): Removing wmode, preventing known SWF loading issue(s)',
+    swf404: _sm + ': Verify that %s is a valid path.',
+    tryDebug: 'Try ' + _sm + '.debugFlash = true for more security details (output goes to SWF.)',
+    checkSWF: 'See SWF output for more debug info.',
+    localFail: _sm + ': Non-HTTP page (' + _doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/',
+    waitFocus: _sm + ': Special case: Waiting for focus-related event..',
+    waitImpatient: _sm + ': Getting impatient, still waiting for Flash%s...',
+    waitForever: _sm + ': Waiting indefinitely for Flash (will recover if unblocked)...',
+    needFunction: _sm + ': Function object expected for %s',
+    badID: 'Warning: Sound ID "%s" should be a string, starting with a non-numeric character',
+    noMS: 'MovieStar mode not enabled. Exiting.',
+    currentObj: '--- ' + _sm + '._debug(): Current sound objects ---',
+    waitEI: _smc + 'initMovie(): Waiting for ExternalInterface call from Flash..',
+    waitOnload: _sm + ': Waiting for window.onload()',
+    docLoaded: _sm + ': Document already loaded',
+    onload: _smc + 'initComplete(): calling soundManager.onload()',
+    onloadOK: _sm + '.onload() complete',
+    init: _smc + 'init()',
+    didInit: _smc + 'init(): Already called?',
+    flashJS: _sm + ': Attempting to call Flash from JS..',
+    noPolling: _sm + ': Polling (whileloading()/whileplaying() support) is disabled.',
+    secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',
+    badRemove: 'Warning: Failed to remove flash movie.',
+    noPeak: 'Warning: peakData features unsupported for movieStar formats',
+    shutdown: _sm + '.disable(): Shutting down',
+    queue: _sm + ': Queueing %s handler',
+    smFail: _sm + ': Failed to initialise.',
+    smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.',
+    fbTimeout: 'No flash response, applying .'+_s.swfCSS.swfTimedout+' CSS..',
+    fbLoaded: 'Flash loaded',
+    fbHandler: _smc+'flashBlockHandler()',
+    manURL: 'SMSound.load(): Using manually-assigned URL',
+    onURL: _sm + '.load(): current URL already assigned.',
+    badFV: _sm + '.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',
+    as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)',
+    noNSLoop: 'Note: Looping not implemented for MovieStar formats',
+    needfl9: 'Note: Switching to flash 9, required for MP4 formats.',
+    mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case',
+    mfOn: 'mobileFlash::enabling on-screen flash repositioning',
+    policy: 'Enabling usePolicyFile for data access'
+    */
+  };
+
+  _str = function() { // o [,items to replace]
+    /*
+    var args = _slice.call(arguments), // real array, please
+    o = args.shift(), // first arg
+    str = (_strings && _strings[o]?_strings[o]:''), i, j;
+    if (str && args && args.length) {
+      for (i = 0, j = args.length; i < j; i++) {
+        str = str.replace('%s', args[i]);
+      }
+    }
+    return str;
+    */
+  };
+
+  _loopFix = function(sOpt) {
+    // flash 8 requires stream = false for looping to work
+    if (_fV === 8 && sOpt.loops > 1 && sOpt.stream) {
+      //_wDS('as2loop');
+      sOpt.stream = false;
+    }
+    return sOpt;
+  };
+
+  _policyFix = function(sOpt, sPre) {
+    if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) {
+      //_s._wD((sPre || '') + _str('policy'));
+      sOpt.usePolicyFile = true;
+    }
+    return sOpt;
+  };
+
+  _complain = function(sMsg) {
+    if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') {
+      console.warn(sMsg);
+    } else {
+      //_s._wD(sMsg);
+    }
+  };
+
+  _doNothing = function() {
+    return false;
+  };
+
+  _disableObject = function(o) {
+    var oProp;
+    for (oProp in o) {
+      if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') {
+        o[oProp] = _doNothing;
+      }
+    }
+    oProp = null;
+  };
+
+  _failSafely = function(bNoDisable) {
+    // general failure exception handler
+    if (typeof bNoDisable === 'undefined') {
+      bNoDisable = false;
+    }
+    if (_disabled || bNoDisable) {
+      //_wDS('smFail', 2);
+      _s.disable(bNoDisable);
+    }
+  };
+
+  _normalizeMovieURL = function(smURL) {
+    var urlParams = null;
+    if (smURL) {
+      if (smURL.match(/\.swf(\?.*)?$/i)) {
+        urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4);
+        if (urlParams) {
+          return smURL; // assume user knows what they're doing
+        }
+      } else if (smURL.lastIndexOf('/') !== smURL.length - 1) {
+        smURL = smURL + '/';
+      }
+    }
+    return (smURL && smURL.lastIndexOf('/') !== - 1?smURL.substr(0, smURL.lastIndexOf('/') + 1):'./') + _s.movieURL;
+  };
+
+  _setVersionInfo = function() {
+
+    if (_fV !== 8 && _fV !== 9) {
+      //_s._wD(_str('badFV', _fV, _defaultFlashVersion));
+      _s.flashVersion = _defaultFlashVersion;
+    }
+    var isDebug = (_s.debugMode || _s.debugFlash?'_debug.swf':'.swf'); // debug flash movie, if applicable
+    if (_s.useHTML5Audio && !_s.html5Only && _s.audioFormats.mp4.required && _s.flashVersion < 9) {
+      //_s._wD(_str('needfl9'));
+      _s.flashVersion = 9;
+    }
+    _fV = _s.flashVersion; // short-hand for internal use
+    _s.version = _s.versionNumber + (_s.html5Only?' (HTML5-only mode)':(_fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)'));
+    // set up default options
+    if (_fV > 8) {
+      _s.defaultOptions = _mixin(_s.defaultOptions, _s.flash9Options);
+      _s.features.buffering = true;
+    }
+    if (_fV > 8 && _s.useMovieStar) {
+      // flash 9+ support for movieStar formats as well as MP3
+      _s.defaultOptions = _mixin(_s.defaultOptions, _s.movieStarOptions);
+      _s.filePatterns.flash9 = new RegExp('\\.(mp3|' + _s.netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
+      _s.mimePattern = _s.netStreamMimeTypes;
+      _s.features.movieStar = true;
+    } else {
+      _s.useMovieStar = false;
+      _s.features.movieStar = false;
+    }
+    _s.filePattern = _s.filePatterns[(_fV !== 8?'flash9':'flash8')];
+    _s.movieURL = (_fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf',isDebug);
+    _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_fV > 8);
+  };
+
+  _setPolling = function(bPolling, bHighPerformance) {
+    if (!_s.o || !_s.allowPolling) {
+      return false;
+    }
+    _s.o._setPolling(bPolling, bHighPerformance);
+  };
+
+  _initDebug = function() {
+    if (_s.debugURLParam.test(_wl)) {
+      _s.debugMode = true; // allow force of debug mode via URL
+    }
+    /*
+    if (_id(_s.debugID)) {
+      return false;
+    }
+    var oD, oDebug, oTarget, oToggle, tmp;
+    if (_s.debugMode && !_id(_s.debugID) && ((!_hasConsole || !_s.useConsole) || (_s.useConsole && _hasConsole && !_s.consoleOnly))) {
+      oD = _doc.createElement('div');
+      oD.id = _s.debugID + '-toggle';
+      oToggle = {
+        'position': 'fixed',
+        'bottom': '0px',
+        'right': '0px',
+        'width': '1.2em',
+        'height': '1.2em',
+        'lineHeight': '1.2em',
+        'margin': '2px',
+        'textAlign': 'center',
+        'border': '1px solid #999',
+        'cursor': 'pointer',
+        'background': '#fff',
+        'color': '#333',
+        'zIndex': 10001
+      };
+      oD.appendChild(_doc.createTextNode('-'));
+      oD.onclick = _toggleDebug;
+      oD.title = 'Toggle SM2 debug console';
+      if (_ua.match(/msie 6/i)) {
+        oD.style.position = 'absolute';
+        oD.style.cursor = 'hand';
+      }
+      for (tmp in oToggle) {
+        if (oToggle.hasOwnProperty(tmp)) {
+          oD.style[tmp] = oToggle[tmp];
+        }
+      }
+      oDebug = _doc.createElement('div');
+      oDebug.id = _s.debugID;
+      oDebug.style.display = (_s.debugMode?'block':'none');
+      if (_s.debugMode && !_id(oD.id)) {
+        try {
+          oTarget = _getDocument();
+          oTarget.appendChild(oD);
+        } catch(e2) {
+          throw new Error(_str('domError')+' \n'+e2.toString());
+        }
+        oTarget.appendChild(oDebug);
+      }
+    }
+    oTarget = null;
+    */
+  };
+
+  _idCheck = this.getSoundById;
+
+  /*
+  _wDS = function(o, errorLevel) {
+    if (!o) {
+      return '';
+    } else {
+      return //_s._wD(_str(o), errorLevel);
+    }
+  };
+
+  // last-resort debugging option
+  if (_wl.indexOf('sm2-debug=alert') + 1 && _s.debugMode) {
+    _s._wD = function(sText) {window.alert(sText);};
+  }
+
+  _toggleDebug = function() {
+    var o = _id(_s.debugID),
+    oT = _id(_s.debugID + '-toggle');
+    if (!o) {
+      return false;
+    }
+    if (_debugOpen) {
+      // minimize
+      oT.innerHTML = '+';
+      o.style.display = 'none';
+    } else {
+      oT.innerHTML = '-';
+      o.style.display = 'block';
+    }
+    _debugOpen = !_debugOpen;
+  };
+
+  _debugTS = function(sEventType, bSuccess, sMessage) {
+    // troubleshooter debug hooks
+    if (typeof sm2Debugger !== 'undefined') {
+      try {
+        sm2Debugger.handleEvent(sEventType, bSuccess, sMessage);
+      } catch(e) {
+        // oh well
+      }
+    }
+    return true;
+  };
+  */
+
+  _getSWFCSS = function() {
+    var css = [];
+    if (_s.debugMode) {
+      css.push(_s.swfCSS.sm2Debug);
+    }
+    if (_s.debugFlash) {
+      css.push(_s.swfCSS.flashDebug);
+    }
+    if (_s.useHighPerformance) {
+      css.push(_s.swfCSS.highPerf);
+    }
+    return css.join(' ');
+  };
+
+  _flashBlockHandler = function() {
+    // *possible* flash block situation.
+    var name = _str('fbHandler'),
+        p = _s.getMoviePercent(),
+        css = _s.swfCSS,
+        error = {type:'FLASHBLOCK'};
+    if (_s.html5Only) {
+      return false;
+    }
+    if (!_s.ok()) {
+      if (_needsFlash) {
+        // make the movie more visible, so user can fix
+        _s.oMC.className = _getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError);
+        //_s._wD(name+': '+_str('fbTimeout')+(p?' ('+_str('fbLoaded')+')':''));
+      }
+      _s.didFlashBlock = true;
+      _processOnEvents({type:'ontimeout', ignoreInit:true, error:error}); // fire onready(), complain lightly
+      _catchError(error);
+    } else {
+      // SM2 loaded OK (or recovered)
+      if (_s.didFlashBlock) {
+        //_s._wD(name+': Unblocked');
+      }
+      if (_s.oMC) {
+        _s.oMC.className = [_getSWFCSS(), css.swfDefault, css.swfLoaded + (_s.didFlashBlock?' '+css.swfUnblocked:'')].join(' ');
+      }
+    }
+  };
+
+  _addOnEvent = function(sType, oMethod, oScope) {
+    if (typeof _on_queue[sType] === 'undefined') {
+      _on_queue[sType] = [];
+    }
+    _on_queue[sType].push({
+      'method': oMethod,
+      'scope': (oScope || null),
+      'fired': false
+    });
+  };
+
+  _processOnEvents = function(oOptions) {
+    if (!oOptions) { // assume onready, if unspecified
+      oOptions = {
+        type: 'onready'
+      };
+    }
+    if (!_didInit && oOptions && !oOptions.ignoreInit) {
+      // not ready yet.
+      return false;
+    }
+    if (oOptions.type === 'ontimeout' && _s.ok()) {
+      // invalid case
+      return false;
+    }
+    var status = {
+          success: (oOptions && oOptions.ignoreInit?_s.ok():!_disabled)
+        },
+        srcQueue = (oOptions && oOptions.type?_on_queue[oOptions.type]||[]:[]), // queue specified by type, or none
+        queue = [], i, j,
+        args = [status],
+        canRetry = (_needsFlash && _s.useFlashBlock && !_s.ok());
+    if (oOptions.error) {
+      args[0].error = oOptions.error;
+    }
+    for (i = 0, j = srcQueue.length; i < j; i++) {
+      if (srcQueue[i].fired !== true) {
+        queue.push(srcQueue[i]);
+      }
+    }
+    if (queue.length) {
+      //_s._wD(_sm + ': Firing ' + queue.length + ' '+oOptions.type+'() item' + (queue.length === 1?'':'s'));
+      for (i = 0, j = queue.length; i < j; i++) {
+        if (queue[i].scope) {
+          queue[i].method.apply(queue[i].scope, args);
+        } else {
+          queue[i].method.apply(this, args);
+        }
+        if (!canRetry) { // flashblock case doesn't count here
+          queue[i].fired = true;
+        }
+      }
+    }
+    return true;
+  };
+
+  _initUserOnload = function() {
+    _win.setTimeout(function() {
+      if (_s.useFlashBlock) {
+        _flashBlockHandler();
+      }
+      _processOnEvents();
+      // call user-defined "onload", scoped to window
+      if (_s.onload instanceof Function) {
+        //_wDS('onload', 1);
+        _s.onload.apply(_win);
+        //_wDS('onloadOK', 1);
+      }
+      if (_s.waitForWindowLoad) {
+        _event.add(_win, 'load', _initUserOnload);
+      }
+    },1);
+  };
+
+  _detectFlash = function() {
+
+    // hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt
+
+    if (_hasFlash !== undefined) {
+      // this work has already been done.
+      return _hasFlash;
+    }
+
+    var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = _win.ActiveXObject;
+
+    if (nP && nP.length) {
+
+      type = 'application/x-shockwave-flash';
+      types = n.mimeTypes;
+      if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) {
+        hasPlugin = true;
+      }
+
+    } else if (typeof AX !== 'undefined') {
+
+      try {
+        obj = new AX('ShockwaveFlash.ShockwaveFlash');
+      } catch(e) {
+        // oh well
+      }
+      hasPlugin = (!!obj);
+
+    }
+
+    _hasFlash = hasPlugin;
+
+    return hasPlugin;
+
+  };
+
+  _featureCheck = function() {
+
+    var needsFlash, item,
+        isSpecial = (_ua.match(/iphone os (1|2|3_0|3_1)/i)?true:false); // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (iPad) + iOS4 works.
+
+    if (isSpecial) {
+      _s.hasHTML5 = false; // has Audio(), but is broken; let it load links directly.
+      _s.html5Only = true; // ignore flash case, however
+      if (_s.oMC) {
+        _s.oMC.style.display = 'none';
+      }
+      return false;
+    }
+
+    if (_s.useHTML5Audio) {
+      if (!_s.html5 || !_s.html5.canPlayType) {
+        //_s._wD('SoundManager: No HTML5 Audio() support detected.');
+        _s.hasHTML5 = false;
+        return true;
+      } else {
+        _s.hasHTML5 = true;
+      }
+      if (_isBadSafari) {
+        //_s._wD(_smc+'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - '+(!_hasFlash?' would use flash fallback for MP3/MP4, but none detected.':'will use flash fallback for MP3/MP4, if available'),1);
+        if (_detectFlash()) {
+          return true;
+        }
+      }
+    } else {
+      // flash needed (or, HTML5 needs enabling.)
+      return true;
+    }
+
+    for (item in _s.audioFormats) {
+      if (_s.audioFormats.hasOwnProperty(item)) {
+        if ( (_s.audioFormats[item].required && !_s.html5.canPlayType(_s.audioFormats[item].type)) || _s.flash[item] || _s.flash[_s.audioFormats[item].type]) {
+          // flash may be required, or preferred for this format
+          needsFlash = true;
+        }
+      }
+    }
+
+    // sanity check..
+    if (_s.ignoreFlash) {
+      needsFlash = false;
+    }
+
+    _s.html5Only = (_s.hasHTML5 && _s.useHTML5Audio && !needsFlash);
+
+    return (!_s.html5Only);
+
+  };
+
+  _startTimer = function(oSound) {
+    if (!oSound._hasTimer) {
+      oSound._hasTimer = true;
+    }
+  };
+
+  _stopTimer = function(oSound) {
+    if (oSound._hasTimer) {
+      oSound._hasTimer = false;
+    }
+  };
+
+  _catchError = function(options) {
+    options = (typeof options !== 'undefined' ? options : {});
+    if (_s.onerror instanceof Function) {
+      _s.onerror.apply(_win, [{type:(typeof options.type !== 'undefined' ? options.type : null)}]);
+    }
+    if (typeof options.fatal !== 'undefined' && options.fatal) {
+      _s.disable();
+    }
+  };
+
+  _badSafariFix = function() {
+    // special case: "bad" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4
+    if (!_isBadSafari || !_detectFlash()) {
+      return false; // doesn't apply
+    }
+    var aF = _s.audioFormats, i, item;
+    for (item in aF) {
+      if (aF.hasOwnProperty(item)) {
+        if (item === 'mp3' || item === 'mp4') {
+          //_s._wD(_sm+': Using flash fallback for '+item+' format');
+          _s.html5[item] = false;
+          // assign result to related formats, too
+          if (aF[item] && aF[item].related) {
+            for (i = aF[item].related.length; i--;) {
+              _s.html5[aF[item].related[i]] = false;
+            }
+          }
+        }
+      }
+    }
+  };
+
+  /*
+   * pseudo-private flash/ExternalInterface methods
+  */
+
+  this._setSandboxType = function(sandboxType) {
+    /*
+    var sb = _s.sandbox;
+    sb.type = sandboxType;
+    sb.description = sb.types[(typeof sb.types[sandboxType] !== 'undefined'?sandboxType:'unknown')];
+    //_s._wD('Flash security sandbox type: ' + sb.type);
+    if (sb.type === 'localWithFile') {
+      sb.noRemote = true;
+      sb.noLocal = false;
+      //_wDS('secNote', 2);
+    } else if (sb.type === 'localWithNetwork') {
+      sb.noRemote = false;
+      sb.noLocal = true;
+    } else if (sb.type === 'localTrusted') {
+      sb.noRemote = false;
+      sb.noLocal = false;
+    }
+    */
+  };
+
+  this._externalInterfaceOK = function(flashDate) {
+    // flash callback confirming flash loaded, EI working etc.
+    // flashDate = approx. timing/delay info for JS/flash bridge
+    if (_s.swfLoaded) {
+      return false;
+    }
+    var eiTime = new Date().getTime();
+    //_s._wD(_smc+'externalInterfaceOK()' + (flashDate?' (~' + (eiTime - flashDate) + ' ms)':''));
+    //_debugTS('swf', true);
+    //_debugTS('flashtojs', true);
+    _s.swfLoaded = true;
+    _tryInitOnFocus = false;
+    if (_isBadSafari) {
+      _badSafariFix();
+    }
+    if (_isIE) {
+      // IE needs a timeout OR delay until window.onload - may need TODO: investigating
+      setTimeout(_init, 100);
+    } else {
+      _init();
+    }
+  };
+
+  /*
+   * private initialization helpers
+  */
+
+  _createMovie = function(smID, smURL) {
+
+    if (_didAppend && _appendSuccess) {
+      return false; // ignore if already succeeded
+    }
+
+    function _initMsg() {
+      //_s._wD('-- SoundManager 2 ' + _s.version + (!_s.html5Only && _s.useHTML5Audio?(_s.hasHTML5?' + HTML5 audio':', no HTML5 audio support'):'') + (!_s.html5Only ? (_s.useMovieStar?', MovieStar mode':'') + (_s.useHighPerformance?', high performance mode, ':', ') + (( _s.flashPollingInterval ? 'custom (' + _s.flashPollingInterval + 'ms)' : (_s.useFastPolling?'fast':'normal')) + ' polling') + (_s.wmode?', wmode: ' + _s.wmode:'') + (_s.debugFlash?', flash debug mode':'') + (_s.useFlashBlock?', flashBlock mode':'') : '') + ' --', 1);
+    }
+
+    if (_s.html5Only) {
+      // 100% HTML5 mode
+      _setVersionInfo();
+      _initMsg();
+      _s.oMC = _id(_s.movieID);
+      _init();
+      // prevent multiple init attempts
+      _didAppend = true;
+      _appendSuccess = true;
+      return false;
+    }
+
+    // flash path
+    var remoteURL = (smURL || _s.url),
+    localURL = (_s.altURL || remoteURL),
+    swfTitle = 'JS/Flash audio component (SoundManager 2)',
+    oEmbed, oMovie, oTarget = _getDocument(), tmp, movieHTML, oEl, extraClass = _getSWFCSS(), s, x, sClass, side = 'auto', isRTL = null, html = _doc.getElementsByTagName('html')[0];
+
+    isRTL = (html && html.dir && html.dir.match(/rtl/i));
+    smID = (typeof smID === 'undefined'?_s.id:smID);
+
+    function param(name, value) {
+      return '<param name="'+name+'" value="'+value+'" />';
+    }
+
+    // safety check for legacy (change to Flash 9 URL)
+    _setVersionInfo();
+    _s.url = _normalizeMovieURL(_overHTTP?remoteURL:localURL);
+    smURL = _s.url;
+
+    _s.wmode = (!_s.wmode && _s.useHighPerformance && !_s.useMovieStar?'transparent':_s.wmode);
+
+    if (_s.wmode !== null && (_ua.match(/msie 8/i) || (!_isIE && !_s.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) {
+      /*
+       * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here
+       * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout
+       * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?)
+      */
+      _s.specialWmodeCase = true;
+      //_wDS('spcWmode');
+      _s.wmode = null;
+    }
+
+    oEmbed = {
+      'name': smID,
+      'id': smID,
+      'src': smURL,
+      'width': side,
+      'height': side,
+      'quality': 'high',
+      'allowScriptAccess': _s.allowScriptAccess,
+      'bgcolor': _s.bgColor,
+      'pluginspage': _http+'//www.macromedia.com/go/getflashplayer',
+      'title': swfTitle,
+      'type': 'application/x-shockwave-flash',
+      'wmode': _s.wmode,
+      'hasPriority': 'true' // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html
+    };
+
+    if (_s.debugFlash) {
+      oEmbed.FlashVars = 'debug=1';
+    }
+
+    if (!_s.wmode) {
+      delete oEmbed.wmode; // don't write empty attribute
+    }
+
+    if (_isIE) {
+
+      // IE is "special".
+      oMovie = _doc.createElement('div');
+      movieHTML = [
+        '<object id="' + smID + '" data="' + smURL + '" type="' + oEmbed.type + '" title="' + oEmbed.title +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="' + _http+'//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="' + oEmbed.width + '" height="' + oEmbed.height + '">',
+        param('movie', smURL),
+        param('AllowScriptAccess', _s.allowScriptAccess),
+        param('quality', oEmbed.quality),
+        (_s.wmode? param('wmode', _s.wmode): ''),
+        param('bgcolor', _s.bgColor),
+        param('hasPriority', 'true'),
+        (_s.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''),
+        '</object>'
+      ].join('');
+
+    } else {
+
+      oMovie = _doc.createElement('embed');
+      for (tmp in oEmbed) {
+        if (oEmbed.hasOwnProperty(tmp)) {
+          oMovie.setAttribute(tmp, oEmbed[tmp]);
+        }
+      }
+
+    }
+
+    _initDebug();
+    extraClass = _getSWFCSS();
+    oTarget = _getDocument();
+
+    if (oTarget) {
+
+      _s.oMC = (_id(_s.movieID) || _doc.createElement('div'));
+
+      if (!_s.oMC.id) {
+
+        _s.oMC.id = _s.movieID;
+        _s.oMC.className = _s.swfCSS.swfDefault + ' ' + extraClass;
+        s = null;
+        oEl = null;
+
+        if (!_s.useFlashBlock) {
+          if (_s.useHighPerformance) {
+            // on-screen at all times
+            s = {
+              'position': 'fixed',
+              'width': '8px',
+              'height': '8px',
+              // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes.
+              'bottom': '0px',
+              'left': '0px',
+              'overflow': 'hidden'
+            };
+          } else {
+            // hide off-screen, lower priority
+            s = {
+              'position': 'absolute',
+              'width': '6px',
+              'height': '6px',
+              'top': '-9999px',
+              'left': '-9999px'
+            };
+            if (isRTL) {
+              s.left = Math.abs(parseInt(s.left,10))+'px';
+            }
+          }
+        }
+
+        if (_isWebkit) {
+          _s.oMC.style.zIndex = 10000; // soundcloud-reported render/crash fix, safari 5
+        }
+
+        if (!_s.debugFlash) {
+          for (x in s) {
+            if (s.hasOwnProperty(x)) {
+              _s.oMC.style[x] = s[x];
+            }
+          }
+        }
+
+        try {
+          if (!_isIE) {
+            _s.oMC.appendChild(oMovie);
+          }
+          oTarget.appendChild(_s.oMC);
+          if (_isIE) {
+            oEl = _s.oMC.appendChild(_doc.createElement('div'));
+            oEl.className = _s.swfCSS.swfBox;
+            oEl.innerHTML = movieHTML;
+          }
+          _appendSuccess = true;
+        } catch(e) {
+          throw new Error(_str('domError')+' \n'+e.toString());
+        }
+
+      } else {
+
+        // SM2 container is already in the document (eg. flashblock use case)
+        sClass = _s.oMC.className;
+        _s.oMC.className = (sClass?sClass+' ':_s.swfCSS.swfDefault) + (extraClass?' '+extraClass:'');
+        _s.oMC.appendChild(oMovie);
+        if (_isIE) {
+          oEl = _s.oMC.appendChild(_doc.createElement('div'));
+          oEl.className = _s.swfCSS.swfBox;
+          oEl.innerHTML = movieHTML;
+        }
+        _appendSuccess = true;
+
+      }
+
+    }
+
+    _didAppend = true;
+    _initMsg();
+    //_s._wD(_smc+'createMovie(): Trying to load ' + smURL + (!_overHTTP && _s.altURL?' (alternate URL)':''), 1);
+
+    return true;
+
+  };
+
+  _initMovie = function() {
+
+    if (_s.html5Only) {
+      _createMovie();
+      return false;
+    }
+
+    // attempt to get, or create, movie
+    if (_s.o) {
+      return false; // may already exist
+    }
+
+    _s.o = _s.getMovie(_s.id); // inline markup
+
+    if (!_s.o) {
+      if (!_oRemoved) {
+        // try to create
+        _createMovie(_s.id, _s.url);
+      } else {
+        // try to re-append removed movie after reboot()
+        if (!_isIE) {
+          _s.oMC.appendChild(_oRemoved);
+        } else {
+          _s.oMC.innerHTML = _oRemovedHTML;
+        }
+        _oRemoved = null;
+        _didAppend = true;
+      }
+      _s.o = _s.getMovie(_s.id);
+    }
+
+    if (_s.o) {
+      //_wDS('waitEI');
+    }
+
+    if (_s.oninitmovie instanceof Function) {
+      setTimeout(_s.oninitmovie, 1);
+    }
+
+    return true;
+
+  };
+
+  _delayWaitForEI = function() {
+    setTimeout(_waitForEI, 1000);
+  };
+
+  _waitForEI = function() {
+
+    if (_waitingForEI) {
+      return false;
+    }
+
+    _waitingForEI = true;
+    _event.remove(_win, 'load', _delayWaitForEI);
+
+    if (_tryInitOnFocus && !_isFocused) {
+      // giant Safari 3.1 hack - assume mousemove = focus given lack of focus event
+      //_wDS('waitFocus');
+      return false;
+    }
+
+    var p;
+    if (!_didInit) {
+      p = _s.getMoviePercent();
+      //_s._wD(_str('waitImpatient', (p === 100?' (SWF loaded)':(p > 0?' (SWF ' + p + '% loaded)':''))));
+    }
+
+    setTimeout(function() {
+
+      p = _s.getMoviePercent();
+
+      if (!_didInit) {
+        //_s._wD(_sm + ': No Flash response within expected time.\nLikely causes: ' + (p === 0?'Loading ' + _s.movieURL + ' may have failed (and/or Flash ' + _fV + '+ not present?), ':'') + 'Flash blocked or JS-Flash security error.' + (_s.debugFlash?' ' + _str('checkSWF'):''), 2);
+        if (!_overHTTP && p) {
+          //_wDS('localFail', 2);
+          if (!_s.debugFlash) {
+            //_wDS('tryDebug', 2);
+          }
+        }
+        if (p === 0) {
+          // if 0 (not null), probably a 404.
+          //_s._wD(_str('swf404', _s.url));
+        }
+        //_debugTS('flashtojs', false, ': Timed out' + _overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)');
+      }
+
+      // give up / time-out, depending
+      if (!_didInit && _okToDisable) {
+        if (p === null) {
+          // SWF failed. Maybe blocked.
+          if (_s.useFlashBlock || _s.flashLoadTimeout === 0) {
+            if (_s.useFlashBlock) {
+              _flashBlockHandler();
+            }
+            //_wDS('waitForever');
+          } else {
+            // old SM2 behaviour, simply fail
+            _failSafely(true);
+          }
+
+        } else {
+          // flash loaded? Shouldn't be a blocking issue, then.
+          if (_s.flashLoadTimeout === 0) {
+             //_wDS('waitForever');
+          } else {
+            _failSafely(true);
+          }
+        }
+      }
+
+    }, _s.flashLoadTimeout);
+
+  };
+
+  _handleFocus = function() {
+    function cleanup() {
+      _event.remove(_win, 'focus', _handleFocus);
+      _event.remove(_win, 'load', _handleFocus);
+    }
+    if (_isFocused || !_tryInitOnFocus) {
+      cleanup();
+      return true;
+    }
+    _okToDisable = true;
+    _isFocused = true;
+    //_s._wD(_smc+'handleFocus()');
+    if (_isSafari && _tryInitOnFocus) {
+      _event.remove(_win, 'mousemove', _handleFocus);
+    }
+    // allow init to restart
+    _waitingForEI = false;
+    cleanup();
+    return true;
+  };
+
+  _initComplete = function(bNoDisable) {
+    if (_didInit) {
+      return false;
+    }
+    if (_s.html5Only) {
+      // all good.
+      //_s._wD('-- SoundManager 2: loaded --');
+      _didInit = true;
+      _initUserOnload();
+      //_debugTS('onload', true);
+      return true;
+    }
+    var wasTimeout = (_s.useFlashBlock && _s.flashLoadTimeout && !_s.getMoviePercent()),
+        error;
+    if (!wasTimeout) {
+      _didInit = true;
+      if (_disabled) {
+        error = {type: (!_hasFlash && _needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')};
+      }
+    }
+    //_s._wD('-- SoundManager 2 ' + (_disabled?'failed to load':'loaded') + ' (' + (_disabled?'security/load error':'OK') + ') --', 1);
+    if (_disabled || bNoDisable) {
+      if (_s.useFlashBlock && _s.oMC) {
+        _s.oMC.className = _getSWFCSS() + ' ' + (_s.getMoviePercent() === null?_s.swfCSS.swfTimedout:_s.swfCSS.swfError);
+      }
+      _processOnEvents({type:'ontimeout', error:error});
+      //_debugTS('onload', false);
+      _catchError(error);
+      return false;
+    } else {
+      //_debugTS('onload', true);
+    }
+    _event.add(_win, 'unload', _doNothing); // prevent browser from showing cached state via back button, because flash will be dead
+    if (_s.waitForWindowLoad && !_windowLoaded) {
+      //_wDS('waitOnload');
+      _event.add(_win, 'load', _initUserOnload);
+      return false;
+    } else {
+      if (_s.waitForWindowLoad && _windowLoaded) {
+        //_wDS('docLoaded');
+      }
+      _initUserOnload();
+    }
+    return true;
+  };
+
+  _showSupport = function() {
+
+    var item, tests = [];
+    if (_s.useHTML5Audio && _s.hasHTML5) {
+      for (item in _s.audioFormats) {
+        if (_s.audioFormats.hasOwnProperty(item)) {
+          tests.push(item + ': ' + _s.html5[item] + (!_s.html5[item] && _hasFlash && _s.flash[item] ? ' (using flash)' : (_s.preferFlash && _s.flash[item] && _hasFlash ? ' (preferring flash)': (!_s.html5[item] ? ' (' + (_s.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : ''))));
+        }
+      }
+      //_s._wD('-- SoundManager 2: HTML5 support tests ('+_s.html5Test+'): '+tests.join(', ')+' --',1);
+    }
+
+  };
+
+  _init = function() {
+
+    //_wDS('init');
+
+    // called after onload()
+    if (_didInit) {
+      //_wDS('didInit');
+      return false;
+    }
+
+    function _cleanup() {
+      _event.remove(_win, 'load', _s.beginDelayedInit);
+    }
+
+    if (_s.html5Only) {
+      if (!_didInit) {
+        // we don't need no steenking flash!
+        _cleanup();
+        _s.enabled = true;
+        _initComplete();
+      }
+      return true;
+    }
+
+    // flash path
+    _initMovie();
+
+    try {
+      //_wDS('flashJS');
+      _s.o._externalInterfaceTest(false); // attempt to talk to Flash
+      if (!_s.allowPolling) {
+        //_wDS('noPolling', 1);
+      } else {
+        _setPolling(true, (_s.flashPollingInterval || (_s.useFastPolling ? 10 : 50)));
+      }
+      if (!_s.debugMode) {
+        _s.o._disableDebug();
+      }
+      _s.enabled = true;
+      //_debugTS('jstoflash', true);
+    } catch(e) {
+      //_s._wD('js/flash exception: ' + e.toString());
+      //_debugTS('jstoflash', false);
+      _catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true});
+      _failSafely(true); // don't disable, for reboot()
+      _initComplete();
+      return false;
+    }
+
+    _initComplete();
+    // event cleanup
+    _cleanup();
+    return true;
+
+  };
+
+  _dcLoaded = function() {
+    if (_didDCLoaded) {
+      return false;
+    }
+    _didDCLoaded = true;
+    _initDebug();
+
+    /*
+     * Temporary feature: allow force of HTML5 via URL params: sm2-usehtml5audio=0 or 1
+     * Ditto for sm2-preferFlash, too.
+    */
+    /*
+    (function(){
+      var a = 'sm2-usehtml5audio=', l = _wl.toLowerCase(), b = null,
+      a2 = 'sm2-preferflash=', b2 = null, hasCon = (typeof console !== 'undefined' && typeof console.log !== 'undefined');
+      if (l.indexOf(a) !== -1) {
+        b = (l.charAt(l.indexOf(a)+a.length) === '1');
+        if (hasCon) {
+          console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter');
+        }
+        _s.useHTML5Audio = b;
+      }
+      if (l.indexOf(a2) !== -1) {
+        b2 = (l.charAt(l.indexOf(a2)+a2.length) === '1');
+        if (hasCon) {
+          console.log((b2?'Enabling ':'Disabling ')+'preferFlash via URL parameter');
+        }
+        _s.preferFlash = b2;
+      }
+    }());
+    */
+
+    if (!_hasFlash && _s.hasHTML5) {
+      //_s._wD('SoundManager: No Flash detected'+(!_s.useHTML5Audio?', enabling HTML5.':'. Trying HTML5-only mode.'));
+      _s.useHTML5Audio = true;
+      // make sure we aren't preferring flash, either
+      // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak.
+      _s.preferFlash = false;
+    }
+
+    _testHTML5();
+    _s.html5.usingFlash = _featureCheck();
+    _needsFlash = _s.html5.usingFlash;
+
+    _showSupport();
+
+    if (!_hasFlash && _needsFlash) {
+      //_s._wD('SoundManager: Fatal error: Flash is needed to play some required formats, but is not available.');
+      // TODO: Fatal here vs. timeout approach, etc.
+      _s.flashLoadTimeout = 1; // hack: fail sooner.
+    }
+
+    if (_doc.removeEventListener) {
+      _doc.removeEventListener('DOMContentLoaded', _dcLoaded, false);
+    }
+    _initMovie();
+    return true;
+  };
+
+  _dcIE = function() {
+    if (_doc.readyState === 'complete') {
+      _dcLoaded();
+      _doc.detachEvent('onreadystatechange', _dcIE);
+    }
+    return true;
+  };
+
+  // sniff up-front
+  _detectFlash();
+
+  // focus and window load, init (primarily flash-driven)
+  _event.add(_win, 'focus', _handleFocus);
+  _event.add(_win, 'load', _handleFocus);
+  _event.add(_win, 'load', _delayWaitForEI);
+  if (_isSafari && _tryInitOnFocus) {
+    _event.add(_win, 'mousemove', _handleFocus); // massive Safari 3.1 focus hack
+  }
+
+  if (_doc.addEventListener) {
+    _doc.addEventListener('DOMContentLoaded', _dcLoaded, false);
+  } else if (_doc.attachEvent) {
+    _doc.attachEvent('onreadystatechange', _dcIE);
+  } else {
+    // no add/attachevent support - safe to assume no JS -> Flash either
+    //_debugTS('onload', false);
+    _catchError({type:'NO_DOM2_EVENTS', fatal:true});
+  }
+
+  if (_doc.readyState === 'complete') {
+    setTimeout(_dcLoaded,100);
+  }
+
+} // SoundManager()
+
+// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading
+if (typeof SM2_DEFER === 'undefined' || !SM2_DEFER) {
+  soundManager = new SoundManager();
+}
+
+// public interfaces
+window.SoundManager = SoundManager; // constructor
+window.soundManager = soundManager; // public API, flash callbacks etc
+
+}(window));
Index: /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2.js
===================================================================
--- /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2.js	(revision 28388)
+++ /gs3-extensions/web-audio/trunk/sound-manager2/script/soundmanager2.js	(revision 28388)
@@ -0,0 +1,3198 @@
+/** @license
+ * SoundManager 2: JavaScript Sound for the Web
+ * ----------------------------------------------
+ * http://schillmania.com/projects/soundmanager2/
+ *
+ * Copyright (c) 2007, Scott Schiller. All rights reserved.
+ * Code provided under the BSD License:
+ * http://schillmania.com/projects/soundmanager2/license.txt
+ *
+ * V2.97a.20110801
+*/
+
+/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio */
+/*jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true */
+
+(function(window) {
+
+var soundManager = null;
+
+function SoundManager(smURL, smID) {
+
+  this.flashVersion = 8;             // version of flash to require, either 8 or 9. Some API features require Flash 9.
+  this.debugMode = true;             // enable debugging output (div#soundmanager-debug, OR console if available+configured)
+  this.debugFlash = false;           // enable debugging output inside SWF, troubleshoot Flash/browser issues
+  this.useConsole = true;            // use firebug/safari console.log()-type debug console if available
+  this.consoleOnly = false;          // if console is being used, do not create/write to #soundmanager-debug
+  this.waitForWindowLoad = false;    // force SM2 to wait for window.onload() before trying to call soundManager.onload()
+  this.nullURL = 'about:blank';      // path to "null" (empty) MP3 file, used to unload sounds (Flash 8 only)
+  this.allowPolling = true;          // allow flash to poll for status update (required for whileplaying() events, peak, sound spectrum functions to work.)
+  this.useFastPolling = false;       // uses lower flash timer interval for higher callback frequency, best combined with useHighPerformance
+  this.useMovieStar = true;          // enable support for Flash 9.0r115+ (codename "MovieStar") MPEG4 audio formats (AAC, M4V, FLV, MOV etc.)
+  this.bgColor = '#ffffff';          // movie (.swf) background color, eg. '#000000'
+  this.useHighPerformance = false;   // position:fixed flash movie can help increase js/flash speed, minimize lag
+  this.flashPollingInterval = null;  // msec for polling interval. Defaults to 50 unless useFastPolling = true.
+  this.flashLoadTimeout = 1000;      // msec to wait for flash movie to load before failing (0 = infinity)
+  this.wmode = null;                 // string: flash rendering mode - null, transparent, opaque (last two allow layering of HTML on top)
+  this.allowScriptAccess = 'always'; // for scripting the SWF (object/embed property), either 'always' or 'sameDomain'
+  this.useFlashBlock = false;        // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable.
+  this.useHTML5Audio = true;         // Beta feature: Use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (no MP3/MP4.) Ideally, transparent vs. Flash API where possible.
+  this.html5Test = /^(probably|maybe)$/i; // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative.
+  this.preferFlash = true;           // (experimental) if true and flash support present, will try to use flash for MP3/MP4 as needed since HTML5 audio support is still quirky in browsers.
+
+  this.audioFormats = {
+    /*
+     * determines HTML5 support + flash requirements.
+     * if no support for a "required" format, SM2 will fail to start.
+     * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true)
+     * multiple MIME types may be tested while trying to get a positive canPlayType() response.
+    */
+    'mp3': {
+      'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],
+      'required': true
+    },
+    'mp4': {
+      'related': ['aac','m4a'], // additional formats under the MP4 container
+      'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],
+      'required': false
+    },
+    'ogg': {
+      'type': ['audio/ogg; codecs=vorbis'],
+      'required': false
+    },
+    'wav': {
+      'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'],
+      'required': false
+    }
+  };
+
+  this.defaultOptions = {
+    'autoLoad': false,             // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)
+    'stream': true,                // allows playing before entire file has loaded (recommended)
+    'autoPlay': false,             // enable playing of file as soon as possible (much faster if "stream" is true)
+    'loops': 1,                    // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0)
+    'onid3': null,                 // callback function for "ID3 data is added/available"
+    'onload': null,                // callback function for "load finished"
+    'whileloading': null,          // callback function for "download progress update" (X of Y bytes received)
+    'onplay': null,                // callback for "play" start
+    'onpause': null,               // callback for "pause"
+    'onresume': null,              // callback for "resume" (pause toggle)
+    'whileplaying': null,          // callback during play (position update)
+    'onstop': null,                // callback for "user stop"
+    'onfailure': null,             // callback function for when playing fails
+    'onfinish': null,              // callback function for "sound finished playing"
+    'onbeforefinish': null,        // callback for "before sound finished playing (at [time])"
+    'onbeforefinishtime': 5000,    // offset (milliseconds) before end of sound to trigger beforefinish (eg. 1000 msec = 1 second)
+    'onbeforefinishcomplete': null,// function to call when said sound finishes playing
+    'onjustbeforefinish': null,    // callback for [n] msec before end of current sound
+    'onjustbeforefinishtime': 200, // [n] - if not using, set to 0 (or null handler) and event will not fire.
+    'multiShot': true,             // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time
+    'multiShotEvents': false,      // fire multiple sound events (currently onfinish() only) when multiShot is enabled
+    'position': null,              // offset (milliseconds) to seek to within loaded sound data.
+    'pan': 0,                      // "pan" settings, left-to-right, -100 to 100
+    'type': null,                  // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3
+    'usePolicyFile': false,        // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access)
+    'volume': 100                  // self-explanatory. 0-100, the latter being the max.
+  };
+
+  this.flash9Options = {      // flash 9-only options, merged into defaultOptions if flash 9 is being used
+    'isMovieStar': null,      // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL
+    'usePeakData': false,     // enable left/right channel peak (level) data
+    'useWaveformData': false, // enable sound spectrum (raw waveform data) - WARNING: CPU-INTENSIVE: may set CPUs on fire.
+    'useEQData': false,       // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive.
+    'onbufferchange': null,   // callback for "isBuffering" property change
+    'ondataerror': null       // callback for waveform/eq data access error (flash playing audio in other tabs/domains)
+  };
+
+  this.movieStarOptions = { // flash 9.0r115+ MPEG4 audio options, merged into defaultOptions if flash 9+movieStar mode is enabled
+    'bufferTime': 3,        // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.)
+    'serverURL': null,      // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants
+    'onconnect': null,      // rtmp: callback for connection to flash media server
+    'duration': null        // rtmp: song duration (msec)
+  };
+
+  this.version = null;
+  this.versionNumber = 'V2.97a.20110801';
+  this.movieURL = null;
+  this.url = (smURL || null);
+  this.altURL = null;
+  this.swfLoaded = false;
+  this.enabled = false;
+  this.o = null;
+  this.movieID = 'sm2-container';
+  this.id = (smID || 'sm2movie');
+  this.swfCSS = {
+    'swfBox': 'sm2-object-box',
+    'swfDefault': 'movieContainer',
+    'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error)
+    'swfTimedout': 'swf_timedout',
+    'swfLoaded': 'swf_loaded',
+    'swfUnblocked': 'swf_unblocked', // or loaded OK
+    'sm2Debug': 'sm2_debug',
+    'highPerf': 'high_performance',
+    'flashDebug': 'flash_debug'
+  };
+  this.oMC = null;
+  this.sounds = {};
+  this.soundIDs = [];
+  this.muted = false;
+  this.debugID = 'soundmanager-debug';
+  this.debugURLParam = /([#?&])debug=1/i;
+  this.specialWmodeCase = false;
+  this.didFlashBlock = false;
+
+  this.filePattern = null;
+  this.filePatterns = {
+    'flash8': /\.mp3(\?.*)?$/i,
+    'flash9': /\.mp3(\?.*)?$/i
+  };
+
+  this.baseMimeTypes = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // mp3
+  this.netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // mp3, mp4, aac etc.
+  this.netStreamTypes = ['aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'mp4v', '3gp', '3g2']; // Flash v9.0r115+ "moviestar" formats
+  this.netStreamPattern = new RegExp('\\.(' + this.netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
+  this.mimePattern = this.baseMimeTypes;
+
+  this.features = {
+    'buffering': false,
+    'peakData': false,
+    'waveformData': false,
+    'eqData': false,
+    'movieStar': false
+  };
+
+  this.sandbox = {
+    // <d>
+    'type': null,
+    'types': {
+      'remote': 'remote (domain-based) rules',
+      'localWithFile': 'local with file access (no internet access)',
+      'localWithNetwork': 'local with network (internet access only, no local access)',
+      'localTrusted': 'local, trusted (local+internet access)'
+    },
+    'description': null,
+    'noRemote': null,
+    'noLocal': null
+    // </d>
+  };
+
+  this.hasHTML5 = (typeof Audio !== 'undefined' && typeof new Audio().canPlayType !== 'undefined'); // switch for handling logic
+
+  // stores canPlayType() results, etc. treat as read-only.
+  this.html5 = {
+    // mp3: boolean
+    // mp4: boolean
+    'usingFlash': null // set if/when flash fallback is needed
+  };
+
+  // format support
+  this.flash = {
+    // mp3: boolean
+    // mp4: boolean
+  };
+
+  this.html5Only = false;   // determined at init time
+  this.ignoreFlash = false; // used for special cases (eg. iPad/iPhone/palm OS?)
+
+  /*
+   * a few private internals
+  */
+
+  var SMSound,
+  _s = this, _sm = 'soundManager', _smc = _sm+'::', _h5 = 'HTML5::', _id, _ua = navigator.userAgent, _win = window, _wl = _win.location.href.toString(), _fV = this.flashVersion, _doc = document, _doNothing, _init, _on_queue = [], _debugOpen = true, _debugTS, _didAppend = false, _appendSuccess = false, _didInit = false, _disabled = false, _windowLoaded = false, _wDS, _wdCount = 0, _initComplete, _mixin, _addOnEvent, _processOnEvents, _initUserOnload, _delayWaitForEI, _waitForEI, _setVersionInfo, _handleFocus, _strings, _initMovie, _dcLoaded, _didDCLoaded, _getDocument, _createMovie, _catchError, _setPolling, _initDebug, _debugLevels = ['log', 'info', 'warn', 'error'], _defaultFlashVersion = 8, _disableObject, _failSafely, _normalizeMovieURL, _oRemoved = null, _oRemovedHTML = null, _str, _flashBlockHandler, _getSWFCSS, _toggleDebug, _loopFix, _policyFix, _complain, _idCheck, _waitingForEI = false, _initPending = false, _smTimer, _onTimer, _startTimer, _stopTimer, _needsFlash = null, _featureCheck, _html5OK, _html5CanPlay, _html5Ext,  _dcIE, _testHTML5, _event, _slice = Array.prototype.slice, _useGlobalHTML5Audio = false, _hasFlash, _detectFlash, _badSafariFix, _html5_events, _showSupport,
+  _is_iDevice = _ua.match(/(ipad|iphone|ipod)/i), _likesHTML5 = (_ua.match(/(mobile|pre\/|xoom)/i) || _is_iDevice), _isIE = _ua.match(/msie/i), _isWebkit = _ua.match(/webkit/i), _isSafari = (_ua.match(/safari/i) && !_ua.match(/chrome/i)), _isOpera = (_ua.match(/opera/i)), 
+  _isBadSafari = (!_wl.match(/usehtml5audio/i) && !_wl.match(/sm2\-ignorebadua/i) && _isSafari && _ua.match(/OS X 10_6_([3-7])/i)), // Safari 4 and 5 occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159
+  _hasConsole = (typeof console !== 'undefined' && typeof console.log !== 'undefined'), _isFocused = (typeof _doc.hasFocus !== 'undefined'?_doc.hasFocus():null), _tryInitOnFocus = (_isSafari && typeof _doc.hasFocus === 'undefined'), _okToDisable = !_tryInitOnFocus, _flashMIME = /(mp3|mp4|mpa)/i,
+  _overHTTP = (_doc.location?_doc.location.protocol.match(/http/i):null),
+  _http = (!_overHTTP ? 'http:' : '');
+
+  this.useAltURL = !_overHTTP; // use altURL if not "online"
+  this._global_a = null;
+
+  if (_likesHTML5) {
+    // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point.
+    _s.useHTML5Audio = true;
+    _s.preferFlash = false;
+    if (_is_iDevice) {
+      // by default, use global feature. iOS onfinish() -> next may fail otherwise.
+      _s.ignoreFlash = true;
+      _useGlobalHTML5Audio = true;
+    }
+  }
+
+  /*
+   * public soundManager API
+  */
+
+  this.ok = function() {
+    return (_needsFlash?(_didInit && !_disabled):(_s.useHTML5Audio && _s.hasHTML5));
+  };
+
+  this.supported = this.ok; // legacy
+
+  this.getMovie = function(smID) {
+    return _isIE?_win[smID]:(_isSafari?_id(smID) || _doc[smID]:_id(smID));
+  };
+
+  this.createSound = function(oOptions) {
+    var _cs = _sm+'.createSound(): ',
+    thisOptions = null, oSound = null, _tO = null;
+    if (!_didInit || !_s.ok()) {
+      _complain(_cs + _str(!_didInit?'notReady':'notOK'));
+      return false;
+    }
+    if (arguments.length === 2) {
+      // function overloading in JS! :) ..assume simple createSound(id,url) use case
+      oOptions = {
+        'id': arguments[0],
+        'url': arguments[1]
+      };
+    }
+    thisOptions = _mixin(oOptions); // inherit from defaultOptions
+    _tO = thisOptions; // alias
+    // <d>
+    if (_tO.id.toString().charAt(0).match(/^[0-9]$/)) {
+      _s._wD(_cs + _str('badID', _tO.id), 2);
+    }
+    _s._wD(_cs + _tO.id + ' (' + _tO.url + ')', 1);
+    // </d>
+    if (_idCheck(_tO.id, true)) {
+      _s._wD(_cs + _tO.id + ' exists', 1);
+      return _s.sounds[_tO.id];
+    }
+
+    function make() {
+      thisOptions = _loopFix(thisOptions);
+      _s.sounds[_tO.id] = new SMSound(_tO);
+      _s.soundIDs.push(_tO.id);
+      return _s.sounds[_tO.id];
+    }
+
+    if (_html5OK(_tO)) {
+      oSound = make();
+      _s._wD('Loading sound '+_tO.id+' via HTML5');
+      oSound._setup_html5(_tO);
+    } else {
+      if (_fV > 8 && _s.useMovieStar) {
+        if (_tO.isMovieStar === null) {
+          _tO.isMovieStar = ((_tO.serverURL || (_tO.type?_tO.type.match(_s.netStreamPattern):false)||_tO.url.match(_s.netStreamPattern))?true:false);
+        }
+        if (_tO.isMovieStar) {
+          _s._wD(_cs + 'using MovieStar handling');
+        }
+        if (_tO.isMovieStar) {
+          if (_tO.usePeakData) {
+            _wDS('noPeak');
+            _tO.usePeakData = false;
+          }
+          if (_tO.loops > 1) {
+            _wDS('noNSLoop');
+          }
+        }
+      }
+      _tO = _policyFix(_tO, _cs);
+      oSound = make();
+      if (_fV === 8) {
+        _s.o._createSound(_tO.id, _tO.onjustbeforefinishtime, _tO.loops||1, _tO.usePolicyFile);
+      } else {
+        _s.o._createSound(_tO.id, _tO.url, _tO.onjustbeforefinishtime, _tO.usePeakData, _tO.useWaveformData, _tO.useEQData, _tO.isMovieStar, (_tO.isMovieStar?_tO.bufferTime:false), _tO.loops||1, _tO.serverURL, _tO.duration||null, _tO.autoPlay, true, _tO.autoLoad, _tO.usePolicyFile);
+        if (!_tO.serverURL) {
+          // We are connected immediately
+          oSound.connected = true;
+          if (_tO.onconnect) {
+            _tO.onconnect.apply(oSound);
+          }
+        }
+      }
+
+      if (!_tO.serverURL && (_tO.autoLoad || _tO.autoPlay)) {
+        oSound.load(_tO); // call load for non-rtmp streams
+      }
+    }
+    if (!_tO.serverURL && _tO.autoPlay) { // rtmp will play in onconnect
+      oSound.play();
+    }
+    return oSound;
+  };
+
+  this.destroySound = function(sID, _bFromSound) {
+    // explicitly destroy a sound before normal page unload, etc.
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    var oS = _s.sounds[sID], i;
+    oS._iO = {}; // Disable all callbacks while the sound is being destroyed
+    oS.stop();
+    oS.unload();
+    for (i = 0; i < _s.soundIDs.length; i++) {
+      if (_s.soundIDs[i] === sID) {
+        _s.soundIDs.splice(i, 1);
+        break;
+      }
+    }
+    if (!_bFromSound) {
+      // ignore if being called from SMSound instance
+      oS.destruct(true);
+    }
+    oS = null;
+    delete _s.sounds[sID];
+    return true;
+  };
+
+  this.load = function(sID, oOptions) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].load(oOptions);
+  };
+
+  this.unload = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].unload();
+  };
+
+  this.play = function(sID, oOptions) {
+    var fN = _sm+'.play(): ';
+    if (!_didInit || !_s.ok()) {
+      _complain(fN + _str(!_didInit?'notReady':'notOK'));
+      return false;
+    }
+    if (!_idCheck(sID)) {
+      if (!(oOptions instanceof Object)) {
+        oOptions = {
+          url: oOptions
+        }; // overloading use case: play('mySound','/path/to/some.mp3');
+      }
+      if (oOptions && oOptions.url) {
+        // overloading use case, create+play: .play('someID',{url:'/path/to.mp3'});
+        _s._wD(fN + 'attempting to create "' + sID + '"', 1);
+        oOptions.id = sID;
+        return _s.createSound(oOptions).play();
+      } else {
+        return false;
+      }
+    }
+    return _s.sounds[sID].play(oOptions);
+  };
+
+  this.start = this.play; // just for convenience
+
+  this.setPosition = function(sID, nMsecOffset) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].setPosition(nMsecOffset);
+  };
+
+  this.stop = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    _s._wD(_sm+'.stop(' + sID + ')', 1);
+    return _s.sounds[sID].stop();
+  };
+
+  this.stopAll = function() {
+    var oSound;
+    _s._wD(_sm+'.stopAll()', 1);
+    for (oSound in _s.sounds) {
+      if (_s.sounds.hasOwnProperty(oSound)) {
+        _s.sounds[oSound].stop(); // apply only to sound objects
+      }
+    }
+  };
+
+  this.pause = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].pause();
+  };
+
+  this.pauseAll = function() {
+    var i;
+    for (i = _s.soundIDs.length; i--;) {
+      _s.sounds[_s.soundIDs[i]].pause();
+    }
+  };
+
+  this.resume = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].resume();
+  };
+
+  this.resumeAll = function() {
+    var i;
+    for (i = _s.soundIDs.length; i--;) {
+      _s.sounds[_s.soundIDs[i]].resume();
+    }
+  };
+
+  this.togglePause = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].togglePause();
+  };
+
+  this.setPan = function(sID, nPan) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].setPan(nPan);
+  };
+
+  this.setVolume = function(sID, nVol) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].setVolume(nVol);
+  };
+
+  this.mute = function(sID) {
+    var fN = _sm+'.mute(): ',
+    i = 0;
+    if (typeof sID !== 'string') {
+      sID = null;
+    }
+    if (!sID) {
+      _s._wD(fN + 'Muting all sounds');
+      for (i = _s.soundIDs.length; i--;) {
+        _s.sounds[_s.soundIDs[i]].mute();
+      }
+      _s.muted = true;
+    } else {
+      if (!_idCheck(sID)) {
+        return false;
+      }
+      _s._wD(fN + 'Muting "' + sID + '"');
+      return _s.sounds[sID].mute();
+    }
+    return true;
+  };
+
+  this.muteAll = function() {
+    _s.mute();
+  };
+
+  this.unmute = function(sID) {
+    var fN = _sm+'.unmute(): ', i;
+    if (typeof sID !== 'string') {
+      sID = null;
+    }
+    if (!sID) {
+      _s._wD(fN + 'Unmuting all sounds');
+      for (i = _s.soundIDs.length; i--;) {
+        _s.sounds[_s.soundIDs[i]].unmute();
+      }
+      _s.muted = false;
+    } else {
+      if (!_idCheck(sID)) {
+        return false;
+      }
+      _s._wD(fN + 'Unmuting "' + sID + '"');
+      return _s.sounds[sID].unmute();
+    }
+    return true;
+  };
+
+  this.unmuteAll = function() {
+    _s.unmute();
+  };
+
+  this.toggleMute = function(sID) {
+    if (!_idCheck(sID)) {
+      return false;
+    }
+    return _s.sounds[sID].toggleMute();
+  };
+
+  this.getMemoryUse = function() {
+    // flash-only
+    var ram = 0;
+    if (_s.o && _fV !== 8) {
+      ram = parseInt(_s.o._getMemoryUse(), 10);
+    }
+    return ram;
+  };
+
+  this.disable = function(bNoDisable) {
+    // destroy all functions
+    var i;
+    if (typeof bNoDisable === 'undefined') {
+      bNoDisable = false;
+    }
+    if (_disabled) {
+      return false;
+    }
+    _disabled = true;
+    _wDS('shutdown', 1);
+    for (i = _s.soundIDs.length; i--;) {
+      _disableObject(_s.sounds[_s.soundIDs[i]]);
+    }
+    _initComplete(bNoDisable); // fire "complete", despite fail
+    _event.remove(_win, 'load', _initUserOnload);
+    return true;
+  };
+
+  this.canPlayMIME = function(sMIME) {
+    var result;
+    if (_s.hasHTML5) {
+      result = _html5CanPlay({type:sMIME});
+    }
+    if (!_needsFlash || result) {
+      // no flash, or OK
+      return result;
+    } else {
+      return (sMIME?(sMIME.match(_s.mimePattern)?true:false):null);
+    }
+  };
+
+  this.canPlayURL = function(sURL) {
+    var result;
+    if (_s.hasHTML5) {
+      result = _html5CanPlay({url: sURL});
+    }
+    if (!_needsFlash || result) {
+      // no flash, or OK
+      return result;
+    } else {
+      return (sURL?(sURL.match(_s.filePattern)?true:false):null);
+    }
+  };
+
+  this.canPlayLink = function(oLink) {
+    if (typeof oLink.type !== 'undefined' && oLink.type) {
+      if (_s.canPlayMIME(oLink.type)) {
+        return true;
+      }
+    }
+    return _s.canPlayURL(oLink.href);
+  };
+
+  this.getSoundById = function(sID, suppressDebug) {
+    if (!sID) {
+      throw new Error(_sm+'.getSoundById(): sID is null/undefined');
+    }
+    var result = _s.sounds[sID];
+    if (!result && !suppressDebug) {
+      _s._wD('"' + sID + '" is an invalid sound ID.', 2);
+    }
+    return result;
+  };
+
+  this.onready = function(oMethod, oScope) {
+    var sType = 'onready';
+    if (oMethod && oMethod instanceof Function) {
+      if (_didInit) {
+        _s._wD(_str('queue', sType));
+      }
+      if (!oScope) {
+        oScope = _win;
+      }
+      _addOnEvent(sType, oMethod, oScope);
+      _processOnEvents();
+      return true;
+    } else {
+      throw _str('needFunction', sType);
+    }
+  };
+
+  this.ontimeout = function(oMethod, oScope) {
+    var sType = 'ontimeout';
+    if (oMethod && oMethod instanceof Function) {
+      if (_didInit) {
+        _s._wD(_str('queue', sType));
+      }
+      if (!oScope) {
+        oScope = _win;
+      }
+      _addOnEvent(sType, oMethod, oScope);
+      _processOnEvents({type:sType});
+      return true;
+    } else {
+      throw _str('needFunction', sType);
+    }
+  };
+
+  this._writeDebug = function(sText, sType, bTimestamp) {
+    // pseudo-private console.log()-style output
+    // <d>
+    var sDID = 'soundmanager-debug', o, oItem, sMethod;
+    if (!_s.debugMode) {
+      return false;
+    }
+    if (typeof bTimestamp !== 'undefined' && bTimestamp) {
+      sText = sText + ' | ' + new Date().getTime();
+    }
+    if (_hasConsole && _s.useConsole) {
+      sMethod = _debugLevels[sType];
+      if (typeof console[sMethod] !== 'undefined') {
+        console[sMethod](sText);
+      } else {
+        console.log(sText);
+      }
+      if (_s.useConsoleOnly) {
+        return true;
+      }
+    }
+    try {
+      o = _id(sDID);
+      if (!o) {
+        return false;
+      }
+      oItem = _doc.createElement('div');
+      if (++_wdCount % 2 === 0) {
+        oItem.className = 'sm2-alt';
+      }
+      if (typeof sType === 'undefined') {
+        sType = 0;
+      } else {
+        sType = parseInt(sType, 10);
+      }
+      oItem.appendChild(_doc.createTextNode(sText));
+      if (sType) {
+        if (sType >= 2) {
+          oItem.style.fontWeight = 'bold';
+        }
+        if (sType === 3) {
+          oItem.style.color = '#ff3333';
+        }
+      }
+      // o.appendChild(oItem); // top-to-bottom
+      o.insertBefore(oItem, o.firstChild); // bottom-to-top
+    } catch(e) {
+      // oh well
+    }
+    o = null;
+    // </d>
+    return true;
+  };
+  this._wD = this._writeDebug; // alias
+
+  this._debug = function() {
+    // <d>
+    var i, j;
+    _wDS('currentObj', 1);
+    for (i = 0, j = _s.soundIDs.length; i < j; i++) {
+      _s.sounds[_s.soundIDs[i]]._debug();
+    }
+    // </d>
+  };
+
+  this.reboot = function() {
+    // attempt to reset and init SM2
+    _s._wD(_sm+'.reboot()');
+    if (_s.soundIDs.length) {
+      _s._wD('Destroying ' + _s.soundIDs.length + ' SMSound objects...');
+    }
+    var i, j;
+    for (i = _s.soundIDs.length; i--;) {
+      _s.sounds[_s.soundIDs[i]].destruct();
+    }
+    // trash ze flash
+    try {
+      if (_isIE) {
+        _oRemovedHTML = _s.o.innerHTML;
+      }
+      _oRemoved = _s.o.parentNode.removeChild(_s.o);
+      _s._wD('Flash movie removed.');
+    } catch(e) {
+      // uh-oh.
+      _wDS('badRemove', 2);
+    }
+    // actually, force recreate of movie.
+    _oRemovedHTML = _oRemoved = _needsFlash = null;
+    _s.enabled = _didDCLoaded = _didInit = _waitingForEI = _initPending = _didAppend = _appendSuccess = _disabled = _s.swfLoaded = false;
+    _s.soundIDs = _s.sounds = [];
+    _s.o = null;
+    for (i in _on_queue) {
+      if (_on_queue.hasOwnProperty(i)) {
+        for (j = _on_queue[i].length; j--;) {
+          _on_queue[i][j].fired = false;
+        }
+      }
+    }
+    _s._wD(_sm + ': Rebooting...');
+    _win.setTimeout(_s.beginDelayedInit, 20);
+  };
+
+  this.getMoviePercent = function() {
+    return (_s.o && typeof _s.o.PercentLoaded !== 'undefined' ? _s.o.PercentLoaded() : null);
+  };
+
+  this.beginDelayedInit = function() {
+    _windowLoaded = true;
+    _dcLoaded();
+    setTimeout(function() {
+      if (_initPending) {
+        return false;
+      }
+      _createMovie();
+      _initMovie();
+      _initPending = true;
+      return true;
+    }, 20);
+    _delayWaitForEI();
+  };
+
+  this.destruct = function() {
+    _s._wD(_sm+'.destruct()');
+    _s.disable(true);
+  };
+
+  /*
+   * internal HTML5 event handling
+  */
+
+  function _html5_event(oFn) {
+    // wrap html5 event handlers so we don't call them on destroyed sounds
+    return function(e) {
+      if (!this._t || !this._t._a) {
+        if (this._t && this._t.sID) {
+          _s._wD(_h5+'ignoring '+e.type+': '+this._t.sID);
+        } else {
+          _s._wD(_h5+'ignoring '+e.type);
+        }
+        return null;
+      } else {
+        return oFn.call(this, e);
+      }
+    };
+  }
+
+  _html5_events = {
+
+    // HTML5 event-name-to-handler map
+    abort: _html5_event(function(e) {
+      _s._wD(_h5+'abort: '+this._t.sID);
+    }),
+
+    // enough has loaded to play
+    canplay: _html5_event(function(e) {
+      if (this._t._html5_canplay) {
+        // this event has already fired. ignore.
+        return true;
+      }
+      this._t._html5_canplay = true;
+      _s._wD(_h5+'canplay: '+this._t.sID+', '+this._t.url);
+      this._t._onbufferchange(0);
+      var position1K = (!isNaN(this._t.position)?this._t.position/1000:null);
+      // set the position if position was set before the sound loaded
+      if (this._t.position && this.currentTime !== position1K) {
+        _s._wD(_h5+'canplay: setting position to '+position1K);
+        try {
+          this.currentTime = position1K;
+        } catch(ee) {
+          _s._wD(_h5+'setting position failed: '+ee.message, 2);
+        }
+      }
+    }),
+
+    load: _html5_event(function(e) {
+      if (!this._t.loaded) {
+        this._t._onbufferchange(0);
+        // should be 1, and the same
+        this._t._whileloading(this._t.bytesTotal, this._t.bytesTotal, this._t._get_html5_duration());
+        this._t._onload(true);
+      }
+    }),
+
+    emptied: _html5_event(function(e) {
+      _s._wD(_h5+'emptied: '+this._t.sID);
+    }),
+
+    ended: _html5_event(function(e) {
+      _s._wD(_h5+'ended: '+this._t.sID);
+      this._t._onfinish();
+    }),
+
+    error: _html5_event(function(e) {
+      _s._wD(_h5+'error: '+this.error.code);
+      // call load with error state?
+      this._t._onload(false);
+    }),
+
+    loadeddata: _html5_event(function(e) {
+      var t = this._t,
+          bytesTotal = t.bytesTotal || 1; // at least 1 byte, so math works
+      _s._wD(_h5+'loadeddata: '+this._t.sID);
+      if (!t._loaded && !_isSafari) { // safari seems to nicely report progress events, eventually totalling 100%
+        t.duration = t._get_html5_duration();
+        // fire whileloading() with 100% values
+        t._whileloading(bytesTotal, bytesTotal, t._get_html5_duration());
+        t._onload(true);
+      }
+    }),
+
+    loadedmetadata: _html5_event(function(e) {
+      _s._wD(_h5+'loadedmetadata: '+this._t.sID);
+    }),
+
+    loadstart: _html5_event(function(e) {
+      _s._wD(_h5+'loadstart: '+this._t.sID);
+      // assume buffering at first
+      this._t._onbufferchange(1);
+    }),
+
+    play: _html5_event(function(e) {
+      _s._wD(_h5+'play: '+this._t.sID+', '+this._t.url);
+      // once play starts, no buffering
+      this._t._onbufferchange(0);
+    }),
+
+    // TODO: verify if this is actually implemented anywhere yet.
+    playing: _html5_event(function(e) {
+      _s._wD(_h5+'playing: '+this._t.sID+', '+this._t.url);
+      // once play starts, no buffering
+      this._t._onbufferchange(0);
+    }),
+
+    progress: _html5_event(function(e) {
+
+      if (this._t.loaded) {
+        return false;
+      }
+
+      var i, j, str, buffered = 0,
+          isProgress = (e.type === 'progress'),
+          ranges = e.target.buffered,
+          loaded = (e.loaded||0), // firefox 3.6 implements e.loaded/total (bytes)
+          total = (e.total||1);
+
+      if (ranges && ranges.length) {
+
+        // if loaded is 0, try TimeRanges implementation as % of load
+        // https://developer.mozilla.org/en/DOM/TimeRanges
+        for (i=ranges.length; i--;) {
+          buffered = (ranges.end(i) - ranges.start(i));
+        }
+
+        // linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges
+        loaded = buffered/e.target.duration;
+
+        // <d>
+        if (isProgress && ranges.length > 1) {
+          str = [];
+          j = ranges.length;
+          for (i=0; i<j; i++) {
+            str.push(e.target.buffered.start(i) +'-'+ e.target.buffered.end(i));
+          }
+          _s._wD(_h5+'progress: timeRanges: '+str.join(', '));
+        }
+        // </d>
+
+        if (isProgress && !isNaN(loaded)) {
+          _s._wD(_h5+'progress: '+this._t.sID+': ' + Math.floor(loaded*100)+'% loaded');
+        }
+
+      }
+
+      if (!isNaN(loaded)) {
+
+        this._t._onbufferchange(0); // if progress, likely not buffering
+        this._t._whileloading(loaded, total, this._t._get_html5_duration());
+
+        if (loaded && total && loaded === total) {
+          // in case "onload" doesn't fire (eg. gecko 1.9.2)
+          _html5_events.load.call(this, e);
+        }
+
+      }
+
+    }),
+
+    ratechange: _html5_event(function(e) {
+      _s._wD(_h5+'ratechange: '+this._t.sID);
+    }),
+
+    suspend: _html5_event(function(e) {
+      // download paused/stopped, may have finished (eg. onload)
+      _s._wD(_h5+'suspend: '+this._t.sID);
+      _html5_events.progress.call(this, e);
+    }),
+
+    stalled: _html5_event(function(e) {
+      _s._wD(_h5+'stalled: '+this._t.sID);
+    }),
+
+    timeupdate: _html5_event(function(e) {
+      this._t._onTimer();
+    }),
+
+    waiting: _html5_event(function(e) { // see also: seeking
+      _s._wD(_h5+'waiting: '+this._t.sID);
+      // playback faster than download rate, etc.
+      this._t._onbufferchange(1);
+    })
+
+  };
+
+  /*
+   * SMSound() (sound object) instance
+  */
+
+  SMSound = function(oOptions) {
+
+    var _t = this, _resetProperties, _stop_html5_timer, _start_html5_timer;
+    this.sID = oOptions.id;
+    this.url = oOptions.url;
+    this.options = _mixin(oOptions);
+    this.instanceOptions = this.options; // per-play-instance-specific options
+    this._iO = this.instanceOptions; // short alias
+    // assign property defaults
+    this.pan = this.options.pan;
+    this.volume = this.options.volume;
+    this._lastURL = null;
+    this.isHTML5 = false;
+    this._a = null;
+
+    // --- public methods ---
+
+    this.id3 = {};
+
+    this._debug = function() {
+      // <d>
+      // pseudo-private console.log()-style output
+      if (_s.debugMode) {
+        var stuff = null, msg = [], sF, sfBracket, maxLength = 64;
+        for (stuff in _t.options) {
+          if (_t.options[stuff] !== null) {
+            if (_t.options[stuff] instanceof Function) {
+              // handle functions specially
+              sF = _t.options[stuff].toString();
+              sF = sF.replace(/\s\s+/g, ' '); // normalize spaces
+              sfBracket = sF.indexOf('{');
+              msg.push(' ' + stuff + ': {' + sF.substr(sfBracket + 1, (Math.min(Math.max(sF.indexOf('\n') - 1, maxLength), maxLength))).replace(/\n/g, '') + '... }');
+            } else {
+              msg.push(' ' + stuff + ': ' + _t.options[stuff]);
+            }
+          }
+        }
+        _s._wD('SMSound() merged options: {\n' + msg.join(', \n') + '\n}');
+      }
+      // </d>
+    };
+
+    // <d>
+    this._debug();
+    // </d>
+
+    this.load = function(oOptions) {
+      var oS = null;
+      if (typeof oOptions !== 'undefined') {
+        _t._iO = _mixin(oOptions, _t.options);
+        _t.instanceOptions = _t._iO;
+      } else {
+        oOptions = _t.options;
+        _t._iO = oOptions;
+        _t.instanceOptions = _t._iO;
+        if (_t._lastURL && _t._lastURL !== _t.url) {
+          _wDS('manURL');
+          _t._iO.url = _t.url;
+          _t.url = null;
+        }
+      }
+      if (!_t._iO.url) {
+        _t._iO.url = _t.url;
+      }
+      _s._wD('SMSound.load(): ' + _t._iO.url, 1);
+      if (_t._iO.url === _t.url && _t.readyState !== 0 && _t.readyState !== 2) {
+        _wDS('onURL', 1);
+        return _t;
+      }
+      _t._lastURL = _t.url;
+      _t.loaded = false;
+      _t.readyState = 1;
+      _t.playState = 0;
+      if (_html5OK(_t._iO)) {
+        oS = _t._setup_html5(_t._iO);
+        if (!oS._called_load) {
+          _s._wD(_h5+'load: '+_t.sID);
+          _t._html5_canplay = false;
+          oS.load();
+          oS._called_load = true;
+          if (_t._iO.autoPlay) {
+            _t.play();
+          }
+        } else {
+          _s._wD(_h5+'ignoring request to load again: '+_t.sID);
+        }
+      } else {
+        try {
+          _t.isHTML5 = false;
+          _t._iO = _policyFix(_loopFix(_t._iO));
+          if (_fV === 8) {
+            _s.o._load(_t.sID, _t._iO.url, _t._iO.stream, _t._iO.autoPlay, (_t._iO.whileloading?1:0), _t._iO.loops||1, _t._iO.usePolicyFile);
+          } else {
+            _s.o._load(_t.sID, _t._iO.url, _t._iO.stream?true:false, _t._iO.autoPlay?true:false, _t._iO.loops||1, _t._iO.autoLoad?true:false, _t._iO.usePolicyFile);
+          }
+        } catch(e) {
+          _wDS('smError', 2);
+          _debugTS('onload', false);
+          _catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true});
+        }
+      }
+      return _t;
+    };
+
+    this.unload = function() {
+      // Flash 8/AS2 can't "close" a stream - fake it by loading an empty MP3
+      // Flash 9/AS3: Close stream, preventing further load
+      if (_t.readyState !== 0) {
+        _s._wD('SMSound.unload(): "' + _t.sID + '"');
+        if (!_t.isHTML5) {
+          if (_fV === 8) {
+            _s.o._unload(_t.sID, _s.nullURL);
+          } else {
+            _s.o._unload(_t.sID);
+          }
+        } else {
+          _stop_html5_timer();
+          if (_t._a) {
+            // abort()-style method here, stop loading? (doesn't exist?)
+            _t._a.pause();
+            _t._a.src = ''; // https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media
+          }
+        }
+        // reset load/status flags
+        _resetProperties();
+      }
+      return _t;
+    };
+
+    this.destruct = function(_bFromSM) {
+      _s._wD('SMSound.destruct(): "' + _t.sID + '"');
+      if (!_t.isHTML5) {
+        // kill sound within Flash
+        // Disable the onfailure handler
+        _t._iO.onfailure = null;
+        _s.o._destroySound(_t.sID);
+      } else {
+        _stop_html5_timer();
+        if (_t._a) {
+          // abort()-style method here, stop loading? (doesn't exist?)
+          _t._a.pause();
+          _t._a.src = ''; // https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media
+          if (!_useGlobalHTML5Audio) {
+            _t._remove_html5_events();
+          }
+          _t._a._t = null; // break potential circular reference
+          _t._a = null;
+        }
+      }
+      if (!_bFromSM) {
+        _s.destroySound(_t.sID, true); // ensure deletion from controller
+      }
+    };
+
+    this.play = function(oOptions, _updatePlayState) {
+      var fN = 'SMSound.play(): ', allowMulti, a;
+      _updatePlayState = _updatePlayState === undefined ? true : _updatePlayState; // default to true
+      if (!oOptions) {
+        oOptions = {};
+      }
+      _t._iO = _mixin(oOptions, _t._iO);
+      _t._iO = _mixin(_t._iO, _t.options);
+      _t.instanceOptions = _t._iO;
+      if (_t._iO.serverURL && !_t.connected) {
+        if (!_t.getAutoPlay()) {
+          _s._wD(fN+' Netstream not connected yet - setting autoPlay');
+          _t.setAutoPlay(true);
+        }
+        return _t; // play will be called in _onconnect()
+      }
+      if (_html5OK(_t._iO)) {
+        _t._setup_html5(_t._iO);
+        _start_html5_timer();
+      }
+      if (_t.playState === 1 && !_t.paused) {
+        allowMulti = _t._iO.multiShot;
+        if (!allowMulti) {
+          _s._wD(fN + '"' + _t.sID + '" already playing (one-shot)', 1);
+          return _t;
+        } else {
+          _s._wD(fN + '"' + _t.sID + '" already playing (multi-shot)', 1);
+        }
+      }
+      if (!_t.loaded) {
+        if (_t.readyState === 0) {
+          _s._wD(fN + 'Attempting to load "' + _t.sID + '"', 1);
+          // try to get this sound playing ASAP
+          if (!_t.isHTML5) {
+            _t._iO.autoPlay = true; // assign directly because setAutoPlay() increments the instanceCount
+          }
+          _t.load(_t._iO);
+        } else if (_t.readyState === 2) {
+          _s._wD(fN + 'Could not load "' + _t.sID + '" - exiting', 2);
+          return _t;
+        } else {
+          _s._wD(fN + '"' + _t.sID + '" is loading - attempting to play..', 1);
+        }
+      } else {
+        _s._wD(fN + '"' + _t.sID + '"');
+      }
+      if (!_t.isHTML5 && _fV === 9 && _t.position > 0 && _t.position === _t.duration) {
+        // flash 9 needs a position reset if play() is called while at the end of a sound.
+        _s._wD(fN + '"' + _t.sID + '": Sound at end, resetting to position:0');
+        _t._iO.position = 0;
+      }
+      /*
+       * Streams will pause when their buffer is full if they are being loaded.
+       * In this case paused is true, but the song hasn't started playing yet.
+       * If we just call resume() the onplay() callback will never be called.
+       * So only call resume() if the position is > 0.
+       * Another reason is because options like volume won't have been applied yet.
+      */
+      if (_t.paused && _t.position && _t.position > 0) { // https://gist.github.com/37b17df75cc4d7a90bf6
+        _s._wD(fN + '"' + _t.sID + '" is resuming from paused state',1);
+        _t.resume();
+      } else {
+        _s._wD(fN+'"'+ _t.sID+'" is starting to play');
+        _t.playState = 1;
+        _t.paused = false;
+        if (!_t.instanceCount || _t._iO.multiShotEvents || (!_t.isHTML5 && _fV > 8 && !_t.getAutoPlay())) {
+          _t.instanceCount++;
+        }
+        _t.position = (typeof _t._iO.position !== 'undefined' && !isNaN(_t._iO.position)?_t._iO.position:0);
+        if (!_t.isHTML5) {
+          _t._iO = _policyFix(_loopFix(_t._iO));
+        }
+        if (_t._iO.onplay && _updatePlayState) {
+          _t._iO.onplay.apply(_t);
+          _t._onplay_called = true;
+        }
+        _t.setVolume(_t._iO.volume, true);
+        _t.setPan(_t._iO.pan, true);
+        if (!_t.isHTML5) {
+          _s.o._start(_t.sID, _t._iO.loops || 1, (_fV === 9?_t._iO.position:_t._iO.position / 1000));
+        } else {
+          _start_html5_timer();
+          a = _t._setup_html5();
+          _t.setPosition(_t._iO.position);
+          a.play();
+        }
+      }
+      return _t;
+    };
+
+    this.start = this.play; // just for convenience
+
+    this.stop = function(bAll) {
+      if (_t.playState === 1) {
+        _t._onbufferchange(0);
+        _t.resetOnPosition(0);
+        if (!_t.isHTML5) {
+          _t.playState = 0;
+        }
+        _t.paused = false;
+        if (_t._iO.onstop) {
+          _t._iO.onstop.apply(_t);
+        }
+        if (!_t.isHTML5) {
+          _s.o._stop(_t.sID, bAll);
+          // hack for netStream: just unload
+          if (_t._iO.serverURL) {
+            _t.unload();
+          }
+        } else {
+          if (_t._a) {
+            _t.setPosition(0); // act like Flash, though
+            _t._a.pause(); // html5 has no stop()
+            _t.playState = 0;
+            _t._onTimer(); // and update UI
+            _stop_html5_timer();
+            _t.unload();
+          }
+        }
+        _t.instanceCount = 0;
+        _t._iO = {};
+      }
+      return _t;
+    };
+
+    this.setAutoPlay = function(autoPlay) {
+      _s._wD('sound '+_t.sID+' turned autoplay ' + (autoPlay ? 'on' : 'off'));
+      _t._iO.autoPlay = autoPlay;
+      if (!_t.isHTML5) {
+        _s.o._setAutoPlay(_t.sID, autoPlay);
+        if (autoPlay) {
+          // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP)
+          if (!_t.instanceCount && _t.readyState === 1) {
+            _t.instanceCount++;
+            _s._wD('sound '+_t.sID+' incremented instance count to '+_t.instanceCount);
+          }
+        }
+      }
+    };
+
+    this.getAutoPlay = function() {
+      return _t._iO.autoPlay;
+    };
+
+    this.setPosition = function(nMsecOffset) {
+      if (nMsecOffset === undefined) {
+        nMsecOffset = 0;
+      }
+      // Use the duration from the instance options, if we don't have a track duration yet.
+      var original_pos, position, position1K,
+          offset = (_t.isHTML5 ? Math.max(nMsecOffset,0) : Math.min(_t.duration || _t._iO.duration, Math.max(nMsecOffset, 0))); // position >= 0 and <= current available (loaded) duration
+      original_pos = _t.position;
+      _t.position = offset;
+      position1K = _t.position/1000;
+      _t.resetOnPosition(_t.position);
+      _t._iO.position = offset;
+      if (!_t.isHTML5) {
+        position = (_fV === 9 ? _t.position : position1K);
+        if (_t.readyState && _t.readyState !== 2) {
+          _s.o._setPosition(_t.sID, position, (_t.paused || !_t.playState)); // if paused or not playing, will not resume (by playing)
+        }
+      } else if (_t._a) {
+        // Set the position in the canplay handler if the sound is not ready yet
+        if (_t._html5_canplay) {
+          if (_t._a.currentTime !== position1K) {
+            /*
+             * DOM/JS errors/exceptions to watch out for:
+             * if seek is beyond (loaded?) position, "DOM exception 11"
+             * "INDEX_SIZE_ERR": DOM exception 1
+            */
+            _s._wD('setPosition('+position1K+'): setting position');
+            try {
+              _t._a.currentTime = position1K;
+              if (_t.playState === 0 || _t.paused) {
+                // allow seek without auto-play/resume
+                _t._a.pause();
+              }
+            } catch(e) {
+              _s._wD('setPosition('+position1K+'): setting position failed: '+e.message, 2);
+            }
+          }
+        } else {
+          _s._wD('setPosition('+position1K+'): delaying, sound not ready');
+        }
+      }
+      if (_t.isHTML5) {
+        if (_t.paused) { // if paused, refresh UI right away
+          _t._onTimer(true); // force update
+        }
+      }
+      return _t;
+    };
+
+    this.pause = function(bCallFlash) {
+      if (_t.paused || (_t.playState === 0 && _t.readyState !== 1)) {
+        return _t;
+      }
+      _s._wD('SMSound.pause()');
+      _t.paused = true;
+      if (!_t.isHTML5) {
+        if (bCallFlash || bCallFlash === undefined) {
+          _s.o._pause(_t.sID);
+        }
+      } else {
+        _t._setup_html5().pause();
+        _stop_html5_timer();
+      }
+      if (_t._iO.onpause) {
+        _t._iO.onpause.apply(_t);
+      }
+      return _t;
+    };
+
+    /*
+     * When auto-loaded streams pause on buffer full they have a playState of 0.
+     * We need to make sure that the playState is set to 1 when these streams "resume".
+     * When a paused stream is resumed, we need to trigger the onplay() callback if it
+     * hasn't been called already. In this case since the sound is being played for the
+     * first time, I think it's more appropriate to call onplay() rather than onresume().
+    */
+    this.resume = function() {
+      if (!_t.paused) {
+        return _t;
+      }
+      _s._wD('SMSound.resume()');
+      _t.paused = false;
+      _t.playState = 1;
+      if (!_t.isHTML5) {
+        if (_t._iO.isMovieStar) {
+          // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition.
+          _t.setPosition(_t.position);
+        }
+        _s.o._pause(_t.sID); // flash method is toggle-based (pause/resume)
+      } else {
+        _t._setup_html5().play();
+        _start_html5_timer();
+      }
+      if (!_t._onplay_called && _t._iO.onplay) {
+        _t._iO.onplay.apply(_t);
+        _t._onplay_called = true;
+      } else if (_t._iO.onresume) {
+        _t._iO.onresume.apply(_t);
+      }
+      return _t;
+    };
+
+    this.togglePause = function() {
+      _s._wD('SMSound.togglePause()');
+      if (_t.playState === 0) {
+        _t.play({
+          position: (_fV === 9 && !_t.isHTML5 ? _t.position : _t.position / 1000)
+        });
+        return _t;
+      }
+      if (_t.paused) {
+        _t.resume();
+      } else {
+        _t.pause();
+      }
+      return _t;
+    };
+
+    this.setPan = function(nPan, bInstanceOnly) {
+      if (typeof nPan === 'undefined') {
+        nPan = 0;
+      }
+      if (typeof bInstanceOnly === 'undefined') {
+        bInstanceOnly = false;
+      }
+      if (!_t.isHTML5) {
+        _s.o._setPan(_t.sID, nPan);
+      } // else { no HTML5 pan? }
+      _t._iO.pan = nPan;
+      if (!bInstanceOnly) {
+        _t.pan = nPan;
+        _t.options.pan = nPan;
+      }
+      return _t;
+    };
+
+    this.setVolume = function(nVol, bInstanceOnly) {
+      if (typeof nVol === 'undefined') {
+        nVol = 100;
+      }
+      if (typeof bInstanceOnly === 'undefined') {
+        bInstanceOnly = false;
+      }
+      if (!_t.isHTML5) {
+        _s.o._setVolume(_t.sID, (_s.muted && !_t.muted) || _t.muted?0:nVol);
+      } else if (_t._a) {
+        _t._a.volume = Math.max(0, Math.min(1, nVol/100)); // valid range: 0-1
+      }
+      _t._iO.volume = nVol;
+      if (!bInstanceOnly) {
+        _t.volume = nVol;
+        _t.options.volume = nVol;
+      }
+      return _t;
+    };
+
+    this.mute = function() {
+      _t.muted = true;
+      if (!_t.isHTML5) {
+        _s.o._setVolume(_t.sID, 0);
+      } else if (_t._a) {
+        _t._a.muted = true;
+      }
+      return _t;
+    };
+
+    this.unmute = function() {
+      _t.muted = false;
+      var hasIO = typeof _t._iO.volume !== 'undefined';
+      if (!_t.isHTML5) {
+        _s.o._setVolume(_t.sID, hasIO?_t._iO.volume:_t.options.volume);
+      } else if (_t._a) {
+        _t._a.muted = false;
+      }
+      return _t;
+    };
+
+    this.toggleMute = function() {
+      return (_t.muted?_t.unmute():_t.mute());
+    };
+
+    this.onposition = function(nPosition, oMethod, oScope) {
+      // TODO: allow for ranges, too? eg. (nPosition instanceof Array)
+      _t._onPositionItems.push({
+        position: nPosition,
+        method: oMethod,
+        scope: (typeof oScope !== 'undefined'?oScope:_t),
+        fired: false
+      });
+      return _t;
+    };
+
+    this.processOnPosition = function() {
+      var i, item, j = _t._onPositionItems.length;
+      if (!j || !_t.playState || _t._onPositionFired >= j) {
+        return false;
+      }
+      for (i=j; i--;) {
+        item = _t._onPositionItems[i];
+        if (!item.fired && _t.position >= item.position) {
+          item.method.apply(item.scope,[item.position]);
+          item.fired = true;
+          _s._onPositionFired++;
+        }
+      }
+      return true;
+    };
+
+    this.resetOnPosition = function(nPosition) {
+      // reset "fired" for items interested in this position
+      var i, item, j = _t._onPositionItems.length;
+      if (!j) {
+        return false;
+      }
+      for (i=j; i--;) {
+        item = _t._onPositionItems[i];
+        if (item.fired && nPosition <= item.position) {
+          item.fired = false;
+          _s._onPositionFired--;
+        }
+      }
+      return true;
+    };
+
+    /*
+     * private internals
+    */
+
+    _start_html5_timer = function() {
+      if (_t.isHTML5) {
+        _startTimer(_t);
+      }
+    };
+
+    _stop_html5_timer = function() {
+      if (_t.isHTML5) {
+        _stopTimer(_t);
+      }
+    };
+
+    _resetProperties = function() {
+      _t._onPositionItems = [];
+      _t._onPositionFired = 0;
+      _t._hasTimer = null;
+      _t._onplay_called = false;
+      _t._a = null;
+      _t._html5_canplay = false;
+      _t.bytesLoaded = null;
+      _t.bytesTotal = null;
+      _t.position = null;
+      _t.duration = (_t._iO && _t._iO.duration?_t._iO.duration:null);
+      _t.durationEstimate = null;
+      _t.failures = 0;
+      _t.loaded = false;
+      _t.playState = 0;
+      _t.paused = false;
+      _t.readyState = 0; // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success
+      _t.muted = false;
+      _t.didBeforeFinish = false;
+      _t.didJustBeforeFinish = false;
+      _t.isBuffering = false;
+      _t.instanceOptions = {};
+      _t.instanceCount = 0;
+      _t.peakData = {
+        left: 0,
+        right: 0
+      };
+      _t.waveformData = {
+        left: [],
+        right: []
+      };
+      _t.eqData = []; // legacy: 1D array
+      _t.eqData.left = [];
+      _t.eqData.right = [];
+    };
+
+    _resetProperties();
+
+    /*
+     * pseudo-private SMSound internals
+    */
+
+    this._onTimer = function(bForce) {
+      // HTML5-only _whileplaying() etc.
+      var time, x = {};
+      if (_t._hasTimer || bForce) {
+        if (_t._a && (bForce || ((_t.playState > 0 || _t.readyState === 1) && !_t.paused))) { // TODO: May not need to track readyState (1 = loading)
+          _t.duration = _t._get_html5_duration();
+          _t.durationEstimate = _t.duration;
+          time = _t._a.currentTime?_t._a.currentTime*1000:0;
+          _t._whileplaying(time,x,x,x,x);
+          return true;
+        } else {
+         _s._wD('_onTimer: Warn for "'+_t.sID+'": '+(!_t._a?'Could not find element. ':'')+(_t.playState === 0?'playState bad, 0?':'playState = '+_t.playState+', OK'));
+          return false;
+        }
+      }
+    };
+
+    this._get_html5_duration = function() {
+      var d = (_t._a ? _t._a.duration*1000 : (_t._iO ? _t._iO.duration : undefined)),
+          result = (d && !isNaN(d) && d !== Infinity ? d : (_t._iO ? _t._iO.duration : null));
+      return result;
+    };
+
+    this._setup_html5 = function(oOptions) {
+      var _iO = _mixin(_t._iO, oOptions), d = decodeURI,
+          _a = _useGlobalHTML5Audio ? _s._global_a : _t._a,
+          _dURL = d(_iO.url),
+          _oldIO = (_a && _a._t ? _a._t.instanceOptions : null);
+      if (_a) {
+        if (_a._t && _oldIO.url === _iO.url && (!_t._lastURL || (_t._lastURL === _oldIO.url))) {
+          return _a; // same url, ignore request
+        }
+        _s._wD('setting new URL on existing object: ' + _dURL + (_t._lastURL ? ', old URL: ' + _t._lastURL : ''));
+        /*
+         * "First things first, I, Poppa.." (reset the previous state of the old sound, if playing)
+         * Fixes case with devices that can only play one sound at a time
+         * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state
+        */
+        if (_useGlobalHTML5Audio && _a._t && _a._t.playState && _iO.url !== _oldIO.url) {
+          _a._t.stop();
+        }
+        _resetProperties(); // new URL, so reset load/playstate and so on
+        _a.src = _iO.url;
+        _t.url = _iO.url;
+        _t._lastURL = _iO.url;
+        _a._called_load = false;
+      } else {
+        _s._wD('creating HTML5 Audio() element with URL: '+_dURL);
+        _a = new Audio(_iO.url);
+        _a._called_load = false;
+        if (_useGlobalHTML5Audio) {
+          _s._global_a = _a;
+        }
+      }
+      _t.isHTML5 = true;
+      _t._a = _a; // store a ref on the track
+      _a._t = _t; // store a ref on the audio
+      _t._add_html5_events();
+      _a.loop = (_iO.loops>1?'loop':'');
+      if (_iO.autoLoad || _iO.autoPlay) {
+        _a.autobuffer = 'auto'; // early HTML5 implementation (non-standard)
+        _a.preload = 'auto'; // standard
+        _t.load();
+        _a._called_load = true;
+      } else {
+        _a.autobuffer = false; // early HTML5 implementation (non-standard)
+        _a.preload = 'none'; // standard
+      }
+      _a.loop = (_iO.loops>1?'loop':''); // boolean instead of "loop", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop
+      return _a;
+    };
+
+    this._add_html5_events = function() {
+
+      if (_t._a._added_events) {
+        return false;
+      }
+
+      var f;
+
+      function add(oEvt, oFn, bCapture) {
+        return _t._a ? _t._a.addEventListener(oEvt, oFn, bCapture||false) : null;
+      }
+
+      _s._wD(_h5+'adding event listeners: '+_t.sID);
+      _t._a._added_events = true;
+
+      for (f in _html5_events) {
+        if (_html5_events.hasOwnProperty(f)) {
+          add(f, _html5_events[f]);
+        }
+      }
+
+      return true;
+
+    };
+
+    this._remove_html5_events = function() {
+
+      // Remove event listeners
+
+      var f;
+
+      function remove(oEvt, oFn, bCapture) {
+        return (_t._a ? _t._a.removeEventListener(oEvt, oFn, bCapture||false) : null);
+      }
+
+      _s._wD(_h5+'removing event listeners: '+_t.sID);
+      _t._a._added_events = false;
+
+      for (f in _html5_events) {
+        if (_html5_events.hasOwnProperty(f)) {
+          remove(f, _html5_events[f]);
+        }
+      }
+
+    };
+
+    /*
+     * pseudo-private event internals
+    */
+
+    this._onload = function(nSuccess) {
+      var fN = 'SMSound._onload(): ', loadOK = (nSuccess?true:false);
+      _s._wD(fN + '"' + _t.sID + '"' + (loadOK?' loaded.':' failed to load? - ' + _t.url), (loadOK?1:2));
+      // <d>
+      if (!loadOK && !_t.isHTML5) {
+        if (_s.sandbox.noRemote === true) {
+          _s._wD(fN + _str('noNet'), 1);
+        }
+        if (_s.sandbox.noLocal === true) {
+          _s._wD(fN + _str('noLocal'), 1);
+        }
+      }
+      // </d>
+      _t.loaded = loadOK;
+      _t.readyState = loadOK?3:2;
+      _t._onbufferchange(0);
+      if (_t._iO.onload) {
+        _t._iO.onload.apply(_t, [loadOK]);
+      }
+      return true;
+    };
+
+    this._onbufferchange = function(nIsBuffering) {
+      var fN = 'SMSound._onbufferchange()';
+      if (_t.playState === 0) {
+        // ignore if not playing
+        return false;
+      }
+      if ((nIsBuffering && _t.isBuffering) || (!nIsBuffering && !_t.isBuffering)) {
+        return false;
+      }
+      _t.isBuffering = (nIsBuffering === 1);
+      if (_t._iO.onbufferchange) {
+        _s._wD(fN + ': ' + nIsBuffering);
+        _t._iO.onbufferchange.apply(_t);
+      }
+      return true;
+    };
+
+    /*
+     * flash-only method, should fire only once at most
+     * at this point we just recreate failed sounds rather than trying to reconnect
+    */
+    this._onfailure = function(msg, level, code) {
+      _t.failures++;
+      _s._wD('SMSound._onfailure(): "'+_t.sID+'" count '+_t.failures);
+      if (_t._iO.onfailure && _t.failures === 1) {
+        _t._iO.onfailure(_t, msg, level, code);
+      } else {
+        _s._wD('SMSound._onfailure(): ignoring');
+      }
+    };
+
+    this._onbeforefinish = function() {
+      if (!_t.didBeforeFinish) {
+        _t.didBeforeFinish = true;
+        if (_t._iO.onbeforefinish) {
+          _s._wD('SMSound._onbeforefinish(): "' + _t.sID + '"');
+          _t._iO.onbeforefinish.apply(_t);
+        }
+      }
+    };
+
+    this._onjustbeforefinish = function(msOffset) {
+      if (!_t.didJustBeforeFinish) {
+        _t.didJustBeforeFinish = true;
+        if (_t._iO.onjustbeforefinish) {
+          _s._wD('SMSound._onjustbeforefinish(): "' + _t.sID + '"');
+          _t._iO.onjustbeforefinish.apply(_t);
+        }
+      }
+    };
+
+    this._onfinish = function() {
+      var _io_onfinish = _t._iO.onfinish; // store local copy before it gets trashed..
+      _t._onbufferchange(0);
+      _t.resetOnPosition(0);
+      if (_t._iO.onbeforefinishcomplete) {
+        _t._iO.onbeforefinishcomplete.apply(_t);
+      }
+      // reset some state items
+      _t.didBeforeFinish = false;
+      _t.didJustBeforeFinish = false;
+      if (_t.instanceCount) {
+        _t.instanceCount--;
+        if (!_t.instanceCount) {
+          // reset instance options
+          _t.playState = 0;
+          _t.paused = false;
+          _t.instanceCount = 0;
+          _t.instanceOptions = {};
+          _t._iO = {};
+          _stop_html5_timer();
+        }
+        if (!_t.instanceCount || _t._iO.multiShotEvents) {
+          // fire onfinish for last, or every instance
+          if (_io_onfinish) {
+            _s._wD('SMSound._onfinish(): "' + _t.sID + '"');
+            _io_onfinish.apply(_t);
+          }
+        }
+      }
+    };
+
+    this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) {
+      _t.bytesLoaded = nBytesLoaded;
+      _t.bytesTotal = nBytesTotal;
+      _t.duration = Math.floor(nDuration);
+      _t.bufferLength = nBufferLength;
+      if (!_t._iO.isMovieStar) {
+        if (_t._iO.duration) {
+          // use options, if specified and larger
+          _t.durationEstimate = (_t.duration > _t._iO.duration) ? _t.duration : _t._iO.duration;
+        } else {
+          _t.durationEstimate = parseInt((_t.bytesTotal / _t.bytesLoaded) * _t.duration, 10);
+        }
+        if (_t.durationEstimate === undefined) {
+          _t.durationEstimate = _t.duration;
+        }
+        if (_t.readyState !== 3 && _t._iO.whileloading) {
+          _t._iO.whileloading.apply(_t);
+        }
+      } else {
+        _t.durationEstimate = _t.duration;
+        if (_t.readyState !== 3 && _t._iO.whileloading) {
+          _t._iO.whileloading.apply(_t);
+        }
+      }
+    };
+
+    this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) {
+      if (isNaN(nPosition) || nPosition === null) {
+        return false; // flash safety net
+      }
+      _t.position = nPosition;
+      _t.processOnPosition();
+      if (!_t.isHTML5 && _fV > 8) {
+        if (_t._iO.usePeakData && typeof oPeakData !== 'undefined' && oPeakData) {
+          _t.peakData = {
+            left: oPeakData.leftPeak,
+            right: oPeakData.rightPeak
+          };
+        }
+        if (_t._iO.useWaveformData && typeof oWaveformDataLeft !== 'undefined' && oWaveformDataLeft) {
+          _t.waveformData = {
+            left: oWaveformDataLeft.split(','),
+            right: oWaveformDataRight.split(',')
+          };
+        }
+        if (_t._iO.useEQData) {
+          if (typeof oEQData !== 'undefined' && oEQData && oEQData.leftEQ) {
+            var eqLeft = oEQData.leftEQ.split(',');
+            _t.eqData = eqLeft;
+            _t.eqData.left = eqLeft;
+            if (typeof oEQData.rightEQ !== 'undefined' && oEQData.rightEQ) {
+              _t.eqData.right = oEQData.rightEQ.split(',');
+            }
+          }
+        }
+      }
+      if (_t.playState === 1) {
+        // special case/hack: ensure buffering is false if loading from cache (and not yet started)
+        if (!_t.isHTML5 && _s.flashVersion === 8 && !_t.position && _t.isBuffering) {
+          _t._onbufferchange(0);
+        }
+        if (_t._iO.whileplaying) {
+          _t._iO.whileplaying.apply(_t); // flash may call after actual finish
+        }
+        if ((_t.loaded || (!_t.loaded && _t._iO.isMovieStar)) && _t._iO.onbeforefinish && _t._iO.onbeforefinishtime && !_t.didBeforeFinish && _t.duration - _t.position <= _t._iO.onbeforefinishtime) {
+          _t._onbeforefinish();
+        }
+      }
+      return true;
+    };
+
+    this._onid3 = function(oID3PropNames, oID3Data) {
+      // oID3PropNames: string array (names)
+      // ID3Data: string array (data)
+      _s._wD('SMSound._onid3(): "' + this.sID + '" ID3 data received.');
+      var oData = [], i, j;
+      for (i = 0, j = oID3PropNames.length; i < j; i++) {
+        oData[oID3PropNames[i]] = oID3Data[i];
+      }
+      _t.id3 = _mixin(_t.id3, oData);
+      if (_t._iO.onid3) {
+        _t._iO.onid3.apply(_t);
+      }
+    };
+
+    // flash + RTMP
+    this._onconnect = function(bSuccess) {
+      var fN = 'SMSound._onconnect(): ';
+      bSuccess = (bSuccess === 1);
+      _s._wD(fN+'"'+_t.sID+'"'+(bSuccess?' connected.':' failed to connect? - '+_t.url), (bSuccess?1:2));
+      _t.connected = bSuccess;
+      if (bSuccess) {
+        _t.failures = 0;
+        if (_idCheck(_t.sID)) {
+          if (_t.getAutoPlay()) {
+            _t.play(undefined, _t.getAutoPlay()); // only update the play state if auto playing
+          } else if (_t._iO.autoLoad) {
+            _t.load();
+          }
+        }
+        if (_t._iO.onconnect) {
+          _t._iO.onconnect.apply(_t,[bSuccess]);
+        }
+      }
+    };
+
+    this._ondataerror = function(sError) {
+      // flash 9 wave/eq data handler
+      if (_t.playState > 0) { // hack: called at start, and end from flash at/after onfinish()
+        _s._wD('SMSound._ondataerror(): ' + sError);
+        if (_t._iO.ondataerror) {
+          _t._iO.ondataerror.apply(_t);
+        }
+      }
+    };
+
+  }; // SMSound()
+
+  /*
+   * private soundManager internals
+  */
+
+  _getDocument = function() {
+    return (_doc.body || _doc._docElement || _doc.getElementsByTagName('div')[0]);
+  };
+
+  _id = function(sID) {
+    return _doc.getElementById(sID);
+  };
+
+  _mixin = function(oMain, oAdd) {
+    // non-destructive merge
+    var o1 = {}, i, o2, o;
+    for (i in oMain) { // clone c1
+      if (oMain.hasOwnProperty(i)) {
+        o1[i] = oMain[i];
+      }
+    }
+    o2 = (typeof oAdd === 'undefined'?_s.defaultOptions:oAdd);
+    for (o in o2) {
+      if (o2.hasOwnProperty(o) && typeof o1[o] === 'undefined') {
+        o1[o] = o2[o];
+      }
+    }
+    return o1;
+  };
+
+  _event = (function() {
+
+    var old = (_win.attachEvent),
+    evt = {
+      add: (old?'attachEvent':'addEventListener'),
+      remove: (old?'detachEvent':'removeEventListener')
+    };
+
+    function getArgs(oArgs) {
+      var args = _slice.call(oArgs), len = args.length;
+      if (old) {
+        args[1] = 'on' + args[1]; // prefix
+        if (len > 3) {
+          args.pop(); // no capture
+        }
+      } else if (len === 3) {
+        args.push(false);
+      }
+      return args;
+    }
+
+    function apply(args, sType) {
+      var element = args.shift(),
+          method = [evt[sType]];
+      if (old) {
+        element[method](args[0], args[1]);
+      } else {
+        element[method].apply(element, args);
+      }
+    }
+
+    function add() {
+      apply(getArgs(arguments), 'add');
+    }
+
+    function remove() {
+      apply(getArgs(arguments), 'remove');
+    }
+
+    return {
+      'add': add,
+      'remove': remove
+    };
+
+  }());
+
+  _html5OK = function(iO) {
+    return (!iO.serverURL && (iO.type?_html5CanPlay({type:iO.type}):_html5CanPlay({url:iO.url})||_s.html5Only)); // Use type, if specified. If HTML5-only mode, no other options, so just give 'er
+  };
+
+  _html5CanPlay = function(o) {
+
+    /*
+     * try to find MIME, test and return truthiness
+     * o = {
+     *  url: '/path/to/an.mp3',
+     *  type: 'audio/mp3'
+     * }
+    */
+
+    if (!_s.useHTML5Audio || !_s.hasHTML5) {
+      return false;
+    }
+
+    var url = (o.url || null),
+        mime = (o.type || null),
+        aF = _s.audioFormats,
+        result,
+        offset,
+        fileExt,
+        item;
+
+    function preferFlashCheck(kind) {
+      // whether flash should play a given type
+      return (_s.preferFlash && _hasFlash && !_s.ignoreFlash && (typeof _s.flash[kind] !== 'undefined' && _s.flash[kind]));
+    }
+
+    // account for known cases like audio/mp3
+    if (mime && _s.html5[mime] !== 'undefined') {
+      return (_s.html5[mime] && !preferFlashCheck(mime));
+    }
+
+    if (!_html5Ext) {
+      _html5Ext = [];
+      for (item in aF) {
+        if (aF.hasOwnProperty(item)) {
+          _html5Ext.push(item);
+          if (aF[item].related) {
+            _html5Ext = _html5Ext.concat(aF[item].related);
+          }
+        }
+      }
+      _html5Ext = new RegExp('\\.('+_html5Ext.join('|')+')(\\?.*)?$','i');
+    }
+
+    fileExt = (url ? url.toLowerCase().match(_html5Ext) : null); // TODO: Strip URL queries, etc.
+
+    if (!fileExt || !fileExt.length) {
+      if (!mime) {
+        return false;
+      } else {
+        // audio/mp3 -> mp3, result should be known
+        offset = mime.indexOf(';');
+        fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6); // strip "audio/X; codecs.."
+      }
+    } else {
+      fileExt = fileExt[1]; // match the raw extension name - "mp3", for example
+    }
+
+    if (fileExt && typeof _s.html5[fileExt] !== 'undefined') {
+      // result known
+      return (_s.html5[fileExt] && !preferFlashCheck(fileExt));
+    } else {
+      mime = 'audio/'+fileExt;
+      result = _s.html5.canPlayType({type:mime});
+      _s.html5[fileExt] = result;
+      // _s._wD('canPlayType, found result: '+result);
+      return (result && _s.html5[mime] && !preferFlashCheck(mime));
+    }
+
+  };
+
+  _testHTML5 = function() {
+
+    if (!_s.useHTML5Audio || typeof Audio === 'undefined') {
+      return false;
+    }
+
+    // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load "null" as a URL. :/
+    var a = (typeof Audio !== 'undefined' ? (_isOpera ? new Audio(null) : new Audio()) : null),
+        item, support = {}, aF, i;
+
+    function _cp(m) {
+      var canPlay, i, j, isOK = false;
+      if (!a || typeof a.canPlayType !== 'function') {
+        return false;
+      }
+      if (m instanceof Array) {
+        // iterate through all mime types, return any successes
+        for (i=0, j=m.length; i<j && !isOK; i++) {
+          if (_s.html5[m[i]] || a.canPlayType(m[i]).match(_s.html5Test)) {
+            isOK = true;
+            _s.html5[m[i]] = true;
+            // if flash can play and preferred, also mark it for use.
+            _s.flash[m[i]] = !!(_s.preferFlash && _hasFlash && m[i].match(_flashMIME));
+          }
+        }
+        return isOK;
+      } else {
+        canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false);
+        return !!(canPlay && (canPlay.match(_s.html5Test)));
+      }
+    }
+
+    // test all registered formats + codecs
+    aF = _s.audioFormats;
+    for (item in aF) {
+      if (aF.hasOwnProperty(item)) {
+        support[item] = _cp(aF[item].type);
+        support['audio/'+item] = support[item]; // write back generic type too, eg. audio/mp3
+        // assign flash
+        if (_s.preferFlash && !_s.ignoreFlash && item.match(_flashMIME)) {
+          _s.flash[item] = true;
+        } else {
+          _s.flash[item] = false;
+        }
+        // assign result to related formats, too
+        if (aF[item] && aF[item].related) {
+          for (i=aF[item].related.length; i--;) {
+            support['audio/'+aF[item].related[i]] = support[item]; // eg. audio/m4a
+            _s.html5[aF[item].related[i]] = support[item];
+            _s.flash[aF[item].related[i]] = support[item];
+          }
+        }
+      }
+    }
+
+    support.canPlayType = (a?_cp:null);
+    _s.html5 = _mixin(_s.html5, support);
+    return true;
+
+  };
+
+  _strings = {
+    // <d>
+    notReady: 'Not loaded yet - wait for soundManager.onload()/onready()',
+    notOK: 'Audio support is not available.',
+    domError: _smc + 'createMovie(): appendChild/innerHTML call failed. DOM not ready or other error.',
+    spcWmode: _smc + 'createMovie(): Removing wmode, preventing known SWF loading issue(s)',
+    swf404: _sm + ': Verify that %s is a valid path.',
+    tryDebug: 'Try ' + _sm + '.debugFlash = true for more security details (output goes to SWF.)',
+    checkSWF: 'See SWF output for more debug info.',
+    localFail: _sm + ': Non-HTTP page (' + _doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/',
+    waitFocus: _sm + ': Special case: Waiting for focus-related event..',
+    waitImpatient: _sm + ': Getting impatient, still waiting for Flash%s...',
+    waitForever: _sm + ': Waiting indefinitely for Flash (will recover if unblocked)...',
+    needFunction: _sm + ': Function object expected for %s',
+    badID: 'Warning: Sound ID "%s" should be a string, starting with a non-numeric character',
+    noMS: 'MovieStar mode not enabled. Exiting.',
+    currentObj: '--- ' + _sm + '._debug(): Current sound objects ---',
+    waitEI: _smc + 'initMovie(): Waiting for ExternalInterface call from Flash..',
+    waitOnload: _sm + ': Waiting for window.onload()',
+    docLoaded: _sm + ': Document already loaded',
+    onload: _smc + 'initComplete(): calling soundManager.onload()',
+    onloadOK: _sm + '.onload() complete',
+    init: _smc + 'init()',
+    didInit: _smc + 'init(): Already called?',
+    flashJS: _sm + ': Attempting to call Flash from JS..',
+    noPolling: _sm + ': Polling (whileloading()/whileplaying() support) is disabled.',
+    secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',
+    badRemove: 'Warning: Failed to remove flash movie.',
+    noPeak: 'Warning: peakData features unsupported for movieStar formats',
+    shutdown: _sm + '.disable(): Shutting down',
+    queue: _sm + ': Queueing %s handler',
+    smFail: _sm + ': Failed to initialise.',
+    smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.',
+    fbTimeout: 'No flash response, applying .'+_s.swfCSS.swfTimedout+' CSS..',
+    fbLoaded: 'Flash loaded',
+    fbHandler: _smc+'flashBlockHandler()',
+    manURL: 'SMSound.load(): Using manually-assigned URL',
+    onURL: _sm + '.load(): current URL already assigned.',
+    badFV: _sm + '.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',
+    as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)',
+    noNSLoop: 'Note: Looping not implemented for MovieStar formats',
+    needfl9: 'Note: Switching to flash 9, required for MP4 formats.',
+    mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case',
+    mfOn: 'mobileFlash::enabling on-screen flash repositioning',
+    policy: 'Enabling usePolicyFile for data access'
+    // </d>
+  };
+
+  _str = function() { // o [,items to replace]
+    // <d>
+    var args = _slice.call(arguments), // real array, please
+    o = args.shift(), // first arg
+    str = (_strings && _strings[o]?_strings[o]:''), i, j;
+    if (str && args && args.length) {
+      for (i = 0, j = args.length; i < j; i++) {
+        str = str.replace('%s', args[i]);
+      }
+    }
+    return str;
+    // </d>
+  };
+
+  _loopFix = function(sOpt) {
+    // flash 8 requires stream = false for looping to work
+    if (_fV === 8 && sOpt.loops > 1 && sOpt.stream) {
+      _wDS('as2loop');
+      sOpt.stream = false;
+    }
+    return sOpt;
+  };
+
+  _policyFix = function(sOpt, sPre) {
+    if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) {
+      _s._wD((sPre || '') + _str('policy'));
+      sOpt.usePolicyFile = true;
+    }
+    return sOpt;
+  };
+
+  _complain = function(sMsg) {
+    if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') {
+      console.warn(sMsg);
+    } else {
+      _s._wD(sMsg);
+    }
+  };
+
+  _doNothing = function() {
+    return false;
+  };
+
+  _disableObject = function(o) {
+    var oProp;
+    for (oProp in o) {
+      if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') {
+        o[oProp] = _doNothing;
+      }
+    }
+    oProp = null;
+  };
+
+  _failSafely = function(bNoDisable) {
+    // general failure exception handler
+    if (typeof bNoDisable === 'undefined') {
+      bNoDisable = false;
+    }
+    if (_disabled || bNoDisable) {
+      _wDS('smFail', 2);
+      _s.disable(bNoDisable);
+    }
+  };
+
+  _normalizeMovieURL = function(smURL) {
+    var urlParams = null;
+    if (smURL) {
+      if (smURL.match(/\.swf(\?.*)?$/i)) {
+        urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4);
+        if (urlParams) {
+          return smURL; // assume user knows what they're doing
+        }
+      } else if (smURL.lastIndexOf('/') !== smURL.length - 1) {
+        smURL = smURL + '/';
+      }
+    }
+    return (smURL && smURL.lastIndexOf('/') !== - 1?smURL.substr(0, smURL.lastIndexOf('/') + 1):'./') + _s.movieURL;
+  };
+
+  _setVersionInfo = function() {
+
+    if (_fV !== 8 && _fV !== 9) {
+      _s._wD(_str('badFV', _fV, _defaultFlashVersion));
+      _s.flashVersion = _defaultFlashVersion;
+    }
+    var isDebug = (_s.debugMode || _s.debugFlash?'_debug.swf':'.swf'); // debug flash movie, if applicable
+    if (_s.useHTML5Audio && !_s.html5Only && _s.audioFormats.mp4.required && _s.flashVersion < 9) {
+      _s._wD(_str('needfl9'));
+      _s.flashVersion = 9;
+    }
+    _fV = _s.flashVersion; // short-hand for internal use
+    _s.version = _s.versionNumber + (_s.html5Only?' (HTML5-only mode)':(_fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)'));
+    // set up default options
+    if (_fV > 8) {
+      _s.defaultOptions = _mixin(_s.defaultOptions, _s.flash9Options);
+      _s.features.buffering = true;
+    }
+    if (_fV > 8 && _s.useMovieStar) {
+      // flash 9+ support for movieStar formats as well as MP3
+      _s.defaultOptions = _mixin(_s.defaultOptions, _s.movieStarOptions);
+      _s.filePatterns.flash9 = new RegExp('\\.(mp3|' + _s.netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
+      _s.mimePattern = _s.netStreamMimeTypes;
+      _s.features.movieStar = true;
+    } else {
+      _s.useMovieStar = false;
+      _s.features.movieStar = false;
+    }
+    _s.filePattern = _s.filePatterns[(_fV !== 8?'flash9':'flash8')];
+    _s.movieURL = (_fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf',isDebug);
+    _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_fV > 8);
+  };
+
+  _setPolling = function(bPolling, bHighPerformance) {
+    if (!_s.o || !_s.allowPolling) {
+      return false;
+    }
+    _s.o._setPolling(bPolling, bHighPerformance);
+  };
+
+  _initDebug = function() {
+    if (_s.debugURLParam.test(_wl)) {
+      _s.debugMode = true; // allow force of debug mode via URL
+    }
+    // <d>
+    if (_id(_s.debugID)) {
+      return false;
+    }
+    var oD, oDebug, oTarget, oToggle, tmp;
+    if (_s.debugMode && !_id(_s.debugID) && ((!_hasConsole || !_s.useConsole) || (_s.useConsole && _hasConsole && !_s.consoleOnly))) {
+      oD = _doc.createElement('div');
+      oD.id = _s.debugID + '-toggle';
+      oToggle = {
+        'position': 'fixed',
+        'bottom': '0px',
+        'right': '0px',
+        'width': '1.2em',
+        'height': '1.2em',
+        'lineHeight': '1.2em',
+        'margin': '2px',
+        'textAlign': 'center',
+        'border': '1px solid #999',
+        'cursor': 'pointer',
+        'background': '#fff',
+        'color': '#333',
+        'zIndex': 10001
+      };
+      oD.appendChild(_doc.createTextNode('-'));
+      oD.onclick = _toggleDebug;
+      oD.title = 'Toggle SM2 debug console';
+      if (_ua.match(/msie 6/i)) {
+        oD.style.position = 'absolute';
+        oD.style.cursor = 'hand';
+      }
+      for (tmp in oToggle) {
+        if (oToggle.hasOwnProperty(tmp)) {
+          oD.style[tmp] = oToggle[tmp];
+        }
+      }
+      oDebug = _doc.createElement('div');
+      oDebug.id = _s.debugID;
+      oDebug.style.display = (_s.debugMode?'block':'none');
+      if (_s.debugMode && !_id(oD.id)) {
+        try {
+          oTarget = _getDocument();
+          oTarget.appendChild(oD);
+        } catch(e2) {
+          throw new Error(_str('domError')+' \n'+e2.toString());
+        }
+        oTarget.appendChild(oDebug);
+      }
+    }
+    oTarget = null;
+    // </d>
+  };
+
+  _idCheck = this.getSoundById;
+
+  // <d>
+  _wDS = function(o, errorLevel) {
+    if (!o) {
+      return '';
+    } else {
+      return _s._wD(_str(o), errorLevel);
+    }
+  };
+
+  // last-resort debugging option
+  if (_wl.indexOf('sm2-debug=alert') + 1 && _s.debugMode) {
+    _s._wD = function(sText) {window.alert(sText);};
+  }
+
+  _toggleDebug = function() {
+    var o = _id(_s.debugID),
+    oT = _id(_s.debugID + '-toggle');
+    if (!o) {
+      return false;
+    }
+    if (_debugOpen) {
+      // minimize
+      oT.innerHTML = '+';
+      o.style.display = 'none';
+    } else {
+      oT.innerHTML = '-';
+      o.style.display = 'block';
+    }
+    _debugOpen = !_debugOpen;
+  };
+
+  _debugTS = function(sEventType, bSuccess, sMessage) {
+    // troubleshooter debug hooks
+    if (typeof sm2Debugger !== 'undefined') {
+      try {
+        sm2Debugger.handleEvent(sEventType, bSuccess, sMessage);
+      } catch(e) {
+        // oh well
+      }
+    }
+    return true;
+  };
+  // </d>
+
+  _getSWFCSS = function() {
+    var css = [];
+    if (_s.debugMode) {
+      css.push(_s.swfCSS.sm2Debug);
+    }
+    if (_s.debugFlash) {
+      css.push(_s.swfCSS.flashDebug);
+    }
+    if (_s.useHighPerformance) {
+      css.push(_s.swfCSS.highPerf);
+    }
+    return css.join(' ');
+  };
+
+  _flashBlockHandler = function() {
+    // *possible* flash block situation.
+    var name = _str('fbHandler'),
+        p = _s.getMoviePercent(),
+        css = _s.swfCSS,
+        error = {type:'FLASHBLOCK'};
+    if (_s.html5Only) {
+      return false;
+    }
+    if (!_s.ok()) {
+      if (_needsFlash) {
+        // make the movie more visible, so user can fix
+        _s.oMC.className = _getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError);
+        _s._wD(name+': '+_str('fbTimeout')+(p?' ('+_str('fbLoaded')+')':''));
+      }
+      _s.didFlashBlock = true;
+      _processOnEvents({type:'ontimeout', ignoreInit:true, error:error}); // fire onready(), complain lightly
+      _catchError(error);
+    } else {
+      // SM2 loaded OK (or recovered)
+      if (_s.didFlashBlock) {
+        _s._wD(name+': Unblocked');
+      }
+      if (_s.oMC) {
+        _s.oMC.className = [_getSWFCSS(), css.swfDefault, css.swfLoaded + (_s.didFlashBlock?' '+css.swfUnblocked:'')].join(' ');
+      }
+    }
+  };
+
+  _addOnEvent = function(sType, oMethod, oScope) {
+    if (typeof _on_queue[sType] === 'undefined') {
+      _on_queue[sType] = [];
+    }
+    _on_queue[sType].push({
+      'method': oMethod,
+      'scope': (oScope || null),
+      'fired': false
+    });
+  };
+
+  _processOnEvents = function(oOptions) {
+    if (!oOptions) { // assume onready, if unspecified
+      oOptions = {
+        type: 'onready'
+      };
+    }
+    if (!_didInit && oOptions && !oOptions.ignoreInit) {
+      // not ready yet.
+      return false;
+    }
+    if (oOptions.type === 'ontimeout' && _s.ok()) {
+      // invalid case
+      return false;
+    }
+    var status = {
+          success: (oOptions && oOptions.ignoreInit?_s.ok():!_disabled)
+        },
+        srcQueue = (oOptions && oOptions.type?_on_queue[oOptions.type]||[]:[]), // queue specified by type, or none
+        queue = [], i, j,
+        args = [status],
+        canRetry = (_needsFlash && _s.useFlashBlock && !_s.ok());
+    if (oOptions.error) {
+      args[0].error = oOptions.error;
+    }
+    for (i = 0, j = srcQueue.length; i < j; i++) {
+      if (srcQueue[i].fired !== true) {
+        queue.push(srcQueue[i]);
+      }
+    }
+    if (queue.length) {
+      _s._wD(_sm + ': Firing ' + queue.length + ' '+oOptions.type+'() item' + (queue.length === 1?'':'s'));
+      for (i = 0, j = queue.length; i < j; i++) {
+        if (queue[i].scope) {
+          queue[i].method.apply(queue[i].scope, args);
+        } else {
+          queue[i].method.apply(this, args);
+        }
+        if (!canRetry) { // flashblock case doesn't count here
+          queue[i].fired = true;
+        }
+      }
+    }
+    return true;
+  };
+
+  _initUserOnload = function() {
+    _win.setTimeout(function() {
+      if (_s.useFlashBlock) {
+        _flashBlockHandler();
+      }
+      _processOnEvents();
+      // call user-defined "onload", scoped to window
+      if (_s.onload instanceof Function) {
+        _wDS('onload', 1);
+        _s.onload.apply(_win);
+        _wDS('onloadOK', 1);
+      }
+      if (_s.waitForWindowLoad) {
+        _event.add(_win, 'load', _initUserOnload);
+      }
+    },1);
+  };
+
+  _detectFlash = function() {
+
+    // hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt
+
+    if (_hasFlash !== undefined) {
+      // this work has already been done.
+      return _hasFlash;
+    }
+
+    var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = _win.ActiveXObject;
+
+    if (nP && nP.length) {
+
+      type = 'application/x-shockwave-flash';
+      types = n.mimeTypes;
+      if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) {
+        hasPlugin = true;
+      }
+
+    } else if (typeof AX !== 'undefined') {
+
+      try {
+        obj = new AX('ShockwaveFlash.ShockwaveFlash');
+      } catch(e) {
+        // oh well
+      }
+      hasPlugin = (!!obj);
+
+    }
+
+    _hasFlash = hasPlugin;
+
+    return hasPlugin;
+
+  };
+
+  _featureCheck = function() {
+
+    var needsFlash, item,
+        isSpecial = (_ua.match(/iphone os (1|2|3_0|3_1)/i)?true:false); // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (iPad) + iOS4 works.
+
+    if (isSpecial) {
+      _s.hasHTML5 = false; // has Audio(), but is broken; let it load links directly.
+      _s.html5Only = true; // ignore flash case, however
+      if (_s.oMC) {
+        _s.oMC.style.display = 'none';
+      }
+      return false;
+    }
+
+    if (_s.useHTML5Audio) {
+      if (!_s.html5 || !_s.html5.canPlayType) {
+        _s._wD('SoundManager: No HTML5 Audio() support detected.');
+        _s.hasHTML5 = false;
+        return true;
+      } else {
+        _s.hasHTML5 = true;
+      }
+      if (_isBadSafari) {
+        _s._wD(_smc+'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - '+(!_hasFlash?' would use flash fallback for MP3/MP4, but none detected.':'will use flash fallback for MP3/MP4, if available'),1);
+        if (_detectFlash()) {
+          return true;
+        }
+      }
+    } else {
+      // flash needed (or, HTML5 needs enabling.)
+      return true;
+    }
+
+    for (item in _s.audioFormats) {
+      if (_s.audioFormats.hasOwnProperty(item)) {
+        if ( (_s.audioFormats[item].required && !_s.html5.canPlayType(_s.audioFormats[item].type)) || _s.flash[item] || _s.flash[_s.audioFormats[item].type]) {
+          // flash may be required, or preferred for this format
+          needsFlash = true;
+        }
+      }
+    }
+
+    // sanity check..
+    if (_s.ignoreFlash) {
+      needsFlash = false;
+    }
+
+    _s.html5Only = (_s.hasHTML5 && _s.useHTML5Audio && !needsFlash);
+
+    return (!_s.html5Only);
+
+  };
+
+  _startTimer = function(oSound) {
+    if (!oSound._hasTimer) {
+      oSound._hasTimer = true;
+    }
+  };
+
+  _stopTimer = function(oSound) {
+    if (oSound._hasTimer) {
+      oSound._hasTimer = false;
+    }
+  };
+
+  _catchError = function(options) {
+    options = (typeof options !== 'undefined' ? options : {});
+    if (_s.onerror instanceof Function) {
+      _s.onerror.apply(_win, [{type:(typeof options.type !== 'undefined' ? options.type : null)}]);
+    }
+    if (typeof options.fatal !== 'undefined' && options.fatal) {
+      _s.disable();
+    }
+  };
+
+  _badSafariFix = function() {
+    // special case: "bad" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4
+    if (!_isBadSafari || !_detectFlash()) {
+      return false; // doesn't apply
+    }
+    var aF = _s.audioFormats, i, item;
+    for (item in aF) {
+      if (aF.hasOwnProperty(item)) {
+        if (item === 'mp3' || item === 'mp4') {
+          _s._wD(_sm+': Using flash fallback for '+item+' format');
+          _s.html5[item] = false;
+          // assign result to related formats, too
+          if (aF[item] && aF[item].related) {
+            for (i = aF[item].related.length; i--;) {
+              _s.html5[aF[item].related[i]] = false;
+            }
+          }
+        }
+      }
+    }
+  };
+
+  /*
+   * pseudo-private flash/ExternalInterface methods
+  */
+
+  this._setSandboxType = function(sandboxType) {
+    // <d>
+    var sb = _s.sandbox;
+    sb.type = sandboxType;
+    sb.description = sb.types[(typeof sb.types[sandboxType] !== 'undefined'?sandboxType:'unknown')];
+    _s._wD('Flash security sandbox type: ' + sb.type);
+    if (sb.type === 'localWithFile') {
+      sb.noRemote = true;
+      sb.noLocal = false;
+      _wDS('secNote', 2);
+    } else if (sb.type === 'localWithNetwork') {
+      sb.noRemote = false;
+      sb.noLocal = true;
+    } else if (sb.type === 'localTrusted') {
+      sb.noRemote = false;
+      sb.noLocal = false;
+    }
+    // </d>
+  };
+
+  this._externalInterfaceOK = function(flashDate) {
+    // flash callback confirming flash loaded, EI working etc.
+    // flashDate = approx. timing/delay info for JS/flash bridge
+    if (_s.swfLoaded) {
+      return false;
+    }
+    var eiTime = new Date().getTime();
+    _s._wD(_smc+'externalInterfaceOK()' + (flashDate?' (~' + (eiTime - flashDate) + ' ms)':''));
+    _debugTS('swf', true);
+    _debugTS('flashtojs', true);
+    _s.swfLoaded = true;
+    _tryInitOnFocus = false;
+    if (_isBadSafari) {
+      _badSafariFix();
+    }
+    if (_isIE) {
+      // IE needs a timeout OR delay until window.onload - may need TODO: investigating
+      setTimeout(_init, 100);
+    } else {
+      _init();
+    }
+  };
+
+  /*
+   * private initialization helpers
+  */
+
+  _createMovie = function(smID, smURL) {
+
+    if (_didAppend && _appendSuccess) {
+      return false; // ignore if already succeeded
+    }
+
+    function _initMsg() {
+      _s._wD('-- SoundManager 2 ' + _s.version + (!_s.html5Only && _s.useHTML5Audio?(_s.hasHTML5?' + HTML5 audio':', no HTML5 audio support'):'') + (!_s.html5Only ? (_s.useMovieStar?', MovieStar mode':'') + (_s.useHighPerformance?', high performance mode, ':', ') + (( _s.flashPollingInterval ? 'custom (' + _s.flashPollingInterval + 'ms)' : (_s.useFastPolling?'fast':'normal')) + ' polling') + (_s.wmode?', wmode: ' + _s.wmode:'') + (_s.debugFlash?', flash debug mode':'') + (_s.useFlashBlock?', flashBlock mode':'') : '') + ' --', 1);
+    }
+
+    if (_s.html5Only) {
+      // 100% HTML5 mode
+      _setVersionInfo();
+      _initMsg();
+      _s.oMC = _id(_s.movieID);
+      _init();
+      // prevent multiple init attempts
+      _didAppend = true;
+      _appendSuccess = true;
+      return false;
+    }
+
+    // flash path
+    var remoteURL = (smURL || _s.url),
+    localURL = (_s.altURL || remoteURL),
+    swfTitle = 'JS/Flash audio component (SoundManager 2)',
+    oEmbed, oMovie, oTarget = _getDocument(), tmp, movieHTML, oEl, extraClass = _getSWFCSS(), s, x, sClass, side = 'auto', isRTL = null, html = _doc.getElementsByTagName('html')[0];
+
+    isRTL = (html && html.dir && html.dir.match(/rtl/i));
+    smID = (typeof smID === 'undefined'?_s.id:smID);
+
+    function param(name, value) {
+      return '<param name="'+name+'" value="'+value+'" />';
+    }
+
+    // safety check for legacy (change to Flash 9 URL)
+    _setVersionInfo();
+    _s.url = _normalizeMovieURL(_overHTTP?remoteURL:localURL);
+    smURL = _s.url;
+
+    _s.wmode = (!_s.wmode && _s.useHighPerformance && !_s.useMovieStar?'transparent':_s.wmode);
+
+    if (_s.wmode !== null && (_ua.match(/msie 8/i) || (!_isIE && !_s.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) {
+      /*
+       * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here
+       * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout
+       * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?)
+      */
+      _s.specialWmodeCase = true;
+      _wDS('spcWmode');
+      _s.wmode = null;
+    }
+
+    oEmbed = {
+      'name': smID,
+      'id': smID,
+      'src': smURL,
+      'width': side,
+      'height': side,
+      'quality': 'high',
+      'allowScriptAccess': _s.allowScriptAccess,
+      'bgcolor': _s.bgColor,
+      'pluginspage': _http+'//www.macromedia.com/go/getflashplayer',
+      'title': swfTitle,
+      'type': 'application/x-shockwave-flash',
+      'wmode': _s.wmode,
+      'hasPriority': 'true' // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html
+    };
+
+    if (_s.debugFlash) {
+      oEmbed.FlashVars = 'debug=1';
+    }
+
+    if (!_s.wmode) {
+      delete oEmbed.wmode; // don't write empty attribute
+    }
+
+    if (_isIE) {
+
+      // IE is "special".
+      oMovie = _doc.createElement('div');
+      movieHTML = [
+        '<object id="' + smID + '" data="' + smURL + '" type="' + oEmbed.type + '" title="' + oEmbed.title +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="' + _http+'//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="' + oEmbed.width + '" height="' + oEmbed.height + '">',
+        param('movie', smURL),
+        param('AllowScriptAccess', _s.allowScriptAccess),
+        param('quality', oEmbed.quality),
+        (_s.wmode? param('wmode', _s.wmode): ''),
+        param('bgcolor', _s.bgColor),
+        param('hasPriority', 'true'),
+        (_s.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''),
+        '</object>'
+      ].join('');
+
+    } else {
+
+      oMovie = _doc.createElement('embed');
+      for (tmp in oEmbed) {
+        if (oEmbed.hasOwnProperty(tmp)) {
+          oMovie.setAttribute(tmp, oEmbed[tmp]);
+        }
+      }
+
+    }
+
+    _initDebug();
+    extraClass = _getSWFCSS();
+    oTarget = _getDocument();
+
+    if (oTarget) {
+
+      _s.oMC = (_id(_s.movieID) || _doc.createElement('div'));
+
+      if (!_s.oMC.id) {
+
+        _s.oMC.id = _s.movieID;
+        _s.oMC.className = _s.swfCSS.swfDefault + ' ' + extraClass;
+        s = null;
+        oEl = null;
+
+        if (!_s.useFlashBlock) {
+          if (_s.useHighPerformance) {
+            // on-screen at all times
+            s = {
+              'position': 'fixed',
+              'width': '8px',
+              'height': '8px',
+              // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes.
+              'bottom': '0px',
+              'left': '0px',
+              'overflow': 'hidden'
+            };
+          } else {
+            // hide off-screen, lower priority
+            s = {
+              'position': 'absolute',
+              'width': '6px',
+              'height': '6px',
+              'top': '-9999px',
+              'left': '-9999px'
+            };
+            if (isRTL) {
+              s.left = Math.abs(parseInt(s.left,10))+'px';
+            }
+          }
+        }
+
+        if (_isWebkit) {
+          _s.oMC.style.zIndex = 10000; // soundcloud-reported render/crash fix, safari 5
+        }
+
+        if (!_s.debugFlash) {
+          for (x in s) {
+            if (s.hasOwnProperty(x)) {
+              _s.oMC.style[x] = s[x];
+            }
+          }
+        }
+
+        try {
+          if (!_isIE) {
+            _s.oMC.appendChild(oMovie);
+          }
+          oTarget.appendChild(_s.oMC);
+          if (_isIE) {
+            oEl = _s.oMC.appendChild(_doc.createElement('div'));
+            oEl.className = _s.swfCSS.swfBox;
+            oEl.innerHTML = movieHTML;
+          }
+          _appendSuccess = true;
+        } catch(e) {
+          throw new Error(_str('domError')+' \n'+e.toString());
+        }
+
+      } else {
+
+        // SM2 container is already in the document (eg. flashblock use case)
+        sClass = _s.oMC.className;
+        _s.oMC.className = (sClass?sClass+' ':_s.swfCSS.swfDefault) + (extraClass?' '+extraClass:'');
+        _s.oMC.appendChild(oMovie);
+        if (_isIE) {
+          oEl = _s.oMC.appendChild(_doc.createElement('div'));
+          oEl.className = _s.swfCSS.swfBox;
+          oEl.innerHTML = movieHTML;
+        }
+        _appendSuccess = true;
+
+      }
+
+    }
+
+    _didAppend = true;
+    _initMsg();
+    _s._wD(_smc+'createMovie(): Trying to load ' + smURL + (!_overHTTP && _s.altURL?' (alternate URL)':''), 1);
+
+    return true;
+
+  };
+
+  _initMovie = function() {
+
+    if (_s.html5Only) {
+      _createMovie();
+      return false;
+    }
+
+    // attempt to get, or create, movie
+    if (_s.o) {
+      return false; // may already exist
+    }
+
+    _s.o = _s.getMovie(_s.id); // inline markup
+
+    if (!_s.o) {
+      if (!_oRemoved) {
+        // try to create
+        _createMovie(_s.id, _s.url);
+      } else {
+        // try to re-append removed movie after reboot()
+        if (!_isIE) {
+          _s.oMC.appendChild(_oRemoved);
+        } else {
+          _s.oMC.innerHTML = _oRemovedHTML;
+        }
+        _oRemoved = null;
+        _didAppend = true;
+      }
+      _s.o = _s.getMovie(_s.id);
+    }
+
+    if (_s.o) {
+      _wDS('waitEI');
+    }
+
+    if (_s.oninitmovie instanceof Function) {
+      setTimeout(_s.oninitmovie, 1);
+    }
+
+    return true;
+
+  };
+
+  _delayWaitForEI = function() {
+    setTimeout(_waitForEI, 1000);
+  };
+
+  _waitForEI = function() {
+
+    if (_waitingForEI) {
+      return false;
+    }
+
+    _waitingForEI = true;
+    _event.remove(_win, 'load', _delayWaitForEI);
+
+    if (_tryInitOnFocus && !_isFocused) {
+      // giant Safari 3.1 hack - assume mousemove = focus given lack of focus event
+      _wDS('waitFocus');
+      return false;
+    }
+
+    var p;
+    if (!_didInit) {
+      p = _s.getMoviePercent();
+      _s._wD(_str('waitImpatient', (p === 100?' (SWF loaded)':(p > 0?' (SWF ' + p + '% loaded)':''))));
+    }
+
+    setTimeout(function() {
+
+      p = _s.getMoviePercent();
+
+      if (!_didInit) {
+        _s._wD(_sm + ': No Flash response within expected time.\nLikely causes: ' + (p === 0?'Loading ' + _s.movieURL + ' may have failed (and/or Flash ' + _fV + '+ not present?), ':'') + 'Flash blocked or JS-Flash security error.' + (_s.debugFlash?' ' + _str('checkSWF'):''), 2);
+        if (!_overHTTP && p) {
+          _wDS('localFail', 2);
+          if (!_s.debugFlash) {
+            _wDS('tryDebug', 2);
+          }
+        }
+        if (p === 0) {
+          // if 0 (not null), probably a 404.
+          _s._wD(_str('swf404', _s.url));
+        }
+        _debugTS('flashtojs', false, ': Timed out' + _overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)');
+      }
+
+      // give up / time-out, depending
+      if (!_didInit && _okToDisable) {
+        if (p === null) {
+          // SWF failed. Maybe blocked.
+          if (_s.useFlashBlock || _s.flashLoadTimeout === 0) {
+            if (_s.useFlashBlock) {
+              _flashBlockHandler();
+            }
+            _wDS('waitForever');
+          } else {
+            // old SM2 behaviour, simply fail
+            _failSafely(true);
+          }
+
+        } else {
+          // flash loaded? Shouldn't be a blocking issue, then.
+          if (_s.flashLoadTimeout === 0) {
+             _wDS('waitForever');
+          } else {
+            _failSafely(true);
+          }
+        }
+      }
+
+    }, _s.flashLoadTimeout);
+
+  };
+
+  _handleFocus = function() {
+    function cleanup() {
+      _event.remove(_win, 'focus', _handleFocus);
+      _event.remove(_win, 'load', _handleFocus);
+    }
+    if (_isFocused || !_tryInitOnFocus) {
+      cleanup();
+      return true;
+    }
+    _okToDisable = true;
+    _isFocused = true;
+    _s._wD(_smc+'handleFocus()');
+    if (_isSafari && _tryInitOnFocus) {
+      _event.remove(_win, 'mousemove', _handleFocus);
+    }
+    // allow init to restart
+    _waitingForEI = false;
+    cleanup();
+    return true;
+  };
+
+  _initComplete = function(bNoDisable) {
+    if (_didInit) {
+      return false;
+    }
+    if (_s.html5Only) {
+      // all good.
+      _s._wD('-- SoundManager 2: loaded --');
+      _didInit = true;
+      _initUserOnload();
+      _debugTS('onload', true);
+      return true;
+    }
+    var wasTimeout = (_s.useFlashBlock && _s.flashLoadTimeout && !_s.getMoviePercent()),
+        error;
+    if (!wasTimeout) {
+      _didInit = true;
+      if (_disabled) {
+        error = {type: (!_hasFlash && _needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')};
+      }
+    }
+    _s._wD('-- SoundManager 2 ' + (_disabled?'failed to load':'loaded') + ' (' + (_disabled?'security/load error':'OK') + ') --', 1);
+    if (_disabled || bNoDisable) {
+      if (_s.useFlashBlock && _s.oMC) {
+        _s.oMC.className = _getSWFCSS() + ' ' + (_s.getMoviePercent() === null?_s.swfCSS.swfTimedout:_s.swfCSS.swfError);
+      }
+      _processOnEvents({type:'ontimeout', error:error});
+      _debugTS('onload', false);
+      _catchError(error);
+      return false;
+    } else {
+      _debugTS('onload', true);
+    }
+    _event.add(_win, 'unload', _doNothing); // prevent browser from showing cached state via back button, because flash will be dead
+    if (_s.waitForWindowLoad && !_windowLoaded) {
+      _wDS('waitOnload');
+      _event.add(_win, 'load', _initUserOnload);
+      return false;
+    } else {
+      if (_s.waitForWindowLoad && _windowLoaded) {
+        _wDS('docLoaded');
+      }
+      _initUserOnload();
+    }
+    return true;
+  };
+
+  _showSupport = function() {
+
+    var item, tests = [];
+    if (_s.useHTML5Audio && _s.hasHTML5) {
+      for (item in _s.audioFormats) {
+        if (_s.audioFormats.hasOwnProperty(item)) {
+          tests.push(item + ': ' + _s.html5[item] + (!_s.html5[item] && _hasFlash && _s.flash[item] ? ' (using flash)' : (_s.preferFlash && _s.flash[item] && _hasFlash ? ' (preferring flash)': (!_s.html5[item] ? ' (' + (_s.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : ''))));
+        }
+      }
+      _s._wD('-- SoundManager 2: HTML5 support tests ('+_s.html5Test+'): '+tests.join(', ')+' --',1);
+    }
+
+  };
+
+  _init = function() {
+
+    _wDS('init');
+
+    // called after onload()
+    if (_didInit) {
+      _wDS('didInit');
+      return false;
+    }
+
+    function _cleanup() {
+      _event.remove(_win, 'load', _s.beginDelayedInit);
+    }
+
+    if (_s.html5Only) {
+      if (!_didInit) {
+        // we don't need no steenking flash!
+        _cleanup();
+        _s.enabled = true;
+        _initComplete();
+      }
+      return true;
+    }
+
+    // flash path
+    _initMovie();
+
+    try {
+      _wDS('flashJS');
+      _s.o._externalInterfaceTest(false); // attempt to talk to Flash
+      if (!_s.allowPolling) {
+        _wDS('noPolling', 1);
+      } else {
+        _setPolling(true, (_s.flashPollingInterval || (_s.useFastPolling ? 10 : 50)));
+      }
+      if (!_s.debugMode) {
+        _s.o._disableDebug();
+      }
+      _s.enabled = true;
+      _debugTS('jstoflash', true);
+    } catch(e) {
+      _s._wD('js/flash exception: ' + e.toString());
+      _debugTS('jstoflash', false);
+      _catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true});
+      _failSafely(true); // don't disable, for reboot()
+      _initComplete();
+      return false;
+    }
+
+    _initComplete();
+    // event cleanup
+    _cleanup();
+    return true;
+
+  };
+
+  _dcLoaded = function() {
+    if (_didDCLoaded) {
+      return false;
+    }
+    _didDCLoaded = true;
+    _initDebug();
+
+    /*
+     * Temporary feature: allow force of HTML5 via URL params: sm2-usehtml5audio=0 or 1
+     * Ditto for sm2-preferFlash, too.
+    */
+    // <d>
+    (function(){
+      var a = 'sm2-usehtml5audio=', l = _wl.toLowerCase(), b = null,
+      a2 = 'sm2-preferflash=', b2 = null, hasCon = (typeof console !== 'undefined' && typeof console.log !== 'undefined');
+      if (l.indexOf(a) !== -1) {
+        b = (l.charAt(l.indexOf(a)+a.length) === '1');
+        if (hasCon) {
+          console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter');
+        }
+        _s.useHTML5Audio = b;
+      }
+      if (l.indexOf(a2) !== -1) {
+        b2 = (l.charAt(l.indexOf(a2)+a2.length) === '1');
+        if (hasCon) {
+          console.log((b2?'Enabling ':'Disabling ')+'preferFlash via URL parameter');
+        }
+        _s.preferFlash = b2;
+      }
+    }());
+    // </d>
+
+    if (!_hasFlash && _s.hasHTML5) {
+      _s._wD('SoundManager: No Flash detected'+(!_s.useHTML5Audio?', enabling HTML5.':'. Trying HTML5-only mode.'));
+      _s.useHTML5Audio = true;
+      // make sure we aren't preferring flash, either
+      // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak.
+      _s.preferFlash = false;
+    }
+
+    _testHTML5();
+    _s.html5.usingFlash = _featureCheck();
+    _needsFlash = _s.html5.usingFlash;
+
+    _showSupport();
+
+    if (!_hasFlash && _needsFlash) {
+      _s._wD('SoundManager: Fatal error: Flash is needed to play some required formats, but is not available.');
+      // TODO: Fatal here vs. timeout approach, etc.
+      _s.flashLoadTimeout = 1; // hack: fail sooner.
+    }
+
+    if (_doc.removeEventListener) {
+      _doc.removeEventListener('DOMContentLoaded', _dcLoaded, false);
+    }
+    _initMovie();
+    return true;
+  };
+
+  _dcIE = function() {
+    if (_doc.readyState === 'complete') {
+      _dcLoaded();
+      _doc.detachEvent('onreadystatechange', _dcIE);
+    }
+    return true;
+  };
+
+  // sniff up-front
+  _detectFlash();
+
+  // focus and window load, init (primarily flash-driven)
+  _event.add(_win, 'focus', _handleFocus);
+  _event.add(_win, 'load', _handleFocus);
+  _event.add(_win, 'load', _delayWaitForEI);
+  if (_isSafari && _tryInitOnFocus) {
+    _event.add(_win, 'mousemove', _handleFocus); // massive Safari 3.1 focus hack
+  }
+
+  if (_doc.addEventListener) {
+    _doc.addEventListener('DOMContentLoaded', _dcLoaded, false);
+  } else if (_doc.attachEvent) {
+    _doc.attachEvent('onreadystatechange', _dcIE);
+  } else {
+    // no add/attachevent support - safe to assume no JS -> Flash either
+    _debugTS('onload', false);
+    _catchError({type:'NO_DOM2_EVENTS', fatal:true});
+  }
+
+  if (_doc.readyState === 'complete') {
+    setTimeout(_dcLoaded,100);
+  }
+
+} // SoundManager()
+
+// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading
+if (typeof SM2_DEFER === 'undefined' || !SM2_DEFER) {
+  soundManager = new SoundManager();
+}
+
+// public interfaces
+window.SoundManager = SoundManager; // constructor
+window.soundManager = soundManager; // public API, flash callbacks etc
+
+}(window));
