{"version":3,"sources":["webpack://TBC/webpack/universalModuleDefinition","webpack://TBC/webpack/bootstrap","webpack://TBC/./node_modules/after/index.js","webpack://TBC/./node_modules/arraybuffer.slice/index.js","webpack://TBC/./node_modules/backo2/index.js","webpack://TBC/./node_modules/base64-arraybuffer/lib/base64-arraybuffer.js","webpack://TBC/./node_modules/base64-js/index.js","webpack://TBC/./node_modules/blob/index.js","webpack://TBC/./node_modules/buffer/index.js","webpack://TBC/./node_modules/component-bind/index.js","webpack://TBC/./node_modules/component-emitter/index.js","webpack://TBC/./node_modules/component-inherit/index.js","webpack://TBC/./node_modules/engine.io-client/lib/index.js","webpack://TBC/./node_modules/engine.io-client/lib/socket.js","webpack://TBC/./node_modules/engine.io-client/lib/transport.js","webpack://TBC/./node_modules/engine.io-client/lib/transports/index.js","webpack://TBC/./node_modules/engine.io-client/lib/transports/polling-jsonp.js","webpack://TBC/./node_modules/engine.io-client/lib/transports/polling-xhr.js","webpack://TBC/./node_modules/engine.io-client/lib/transports/polling.js","webpack://TBC/./node_modules/engine.io-client/lib/transports/websocket.js","webpack://TBC/./node_modules/engine.io-client/lib/xmlhttprequest.js","webpack://TBC/./node_modules/engine.io-client/node_modules/debug/src/browser.js","webpack://TBC/./node_modules/engine.io-client/node_modules/debug/src/debug.js","webpack://TBC/./node_modules/engine.io-parser/lib/browser.js","webpack://TBC/./node_modules/engine.io-parser/lib/keys.js","webpack://TBC/./node_modules/engine.io-parser/lib/utf8.js","webpack://TBC/./node_modules/events/events.js","webpack://TBC/./node_modules/has-binary2/index.js","webpack://TBC/./node_modules/has-binary2/node_modules/isarray/index.js","webpack://TBC/./node_modules/has-cors/index.js","webpack://TBC/./node_modules/ieee754/index.js","webpack://TBC/./node_modules/indexof/index.js","webpack://TBC/./node_modules/isarray/index.js","webpack://TBC/./node_modules/ms/index.js","webpack://TBC/./node_modules/parseqs/index.js","webpack://TBC/./node_modules/parseuri/index.js","webpack://TBC/./node_modules/process/browser.js","webpack://TBC/./node_modules/socket.io-client/lib/index.js","webpack://TBC/./node_modules/socket.io-client/lib/manager.js","webpack://TBC/./node_modules/socket.io-client/lib/on.js","webpack://TBC/./node_modules/socket.io-client/lib/socket.js","webpack://TBC/./node_modules/socket.io-client/lib/url.js","webpack://TBC/./node_modules/socket.io-client/node_modules/debug/src/browser.js","webpack://TBC/./node_modules/socket.io-client/node_modules/debug/src/debug.js","webpack://TBC/./node_modules/socket.io-parser/binary.js","webpack://TBC/./node_modules/socket.io-parser/index.js","webpack://TBC/./node_modules/socket.io-parser/is-buffer.js","webpack://TBC/./node_modules/socket.io-parser/node_modules/debug/src/browser.js","webpack://TBC/./node_modules/socket.io-parser/node_modules/debug/src/debug.js","webpack://TBC/./node_modules/socket.io-parser/node_modules/isarray/index.js","webpack://TBC/./node_modules/to-array/index.js","webpack://TBC/./node_modules/url-search-params-polyfill/index.js","webpack://TBC/(webpack)/buildin/global.js","webpack://TBC/./node_modules/yeast/index.js","webpack://TBC/./src/config.js","webpack://TBC/./src/constants.js","webpack://TBC/./src/crunch.js","webpack://TBC/./src/editor.js","webpack://TBC/./src/globalVars.js","webpack://TBC/./src/index.js","webpack://TBC/./src/renderers/common.js","webpack://TBC/./src/renderers/index.js","webpack://TBC/./src/renderers/layerrenderer.js","webpack://TBC/./src/renderers/renderers.js","webpack://TBC/./src/renderers/textrenderer.js","webpack://TBC/./src/tbc.js","webpack://TBC/./src/urlcreator.js","webpack://TBC/./src/vizzy.js","webpack://TBC/ws (ignored)"],"names":["config","CONFIG","overrideConfig","newConfig","getConfig","types","visualisation","layered","contentTypes","imagePng","imageGif","textText","videoYoutube","imageImage","mp4","json","csv","CELL_WIDTH","CELL_HEIGHT","BIG_CRUNCH_URL","sdkConnectionUrl","isAudio","type","test","isVideo","getSocket","crunchSocket","getCrunchSocket","url","spacesSocketUrl","createCrunchSocket","on","value","space","spaceListener","getSpaceListener","atob","location","encodedUuid","lastValue","lastSpace","emitter","emit","console","error","spaceId","user","listenToSpace","sectorId","callback","errorCallback","userCallback","addSpaceListener","EventEmitter","undefined","close","removeListener","readSpaceId","encodedSpaceId","slice","decodedString","e","createCallBacks","changeCall","errorChangeCallback","userArrivesCallback","crunch","callbacks","crunchWithSectorId","crunchBySpaceName","name","spaceListenerId","cellUuid","listener","commands","SET_VALUE","SET_TITLE","setValue","position","contentType","window","parent","postMessage","command","setEditorTitle","title","edit","cellToEditCallback","URLSearchParams","search","editingSpace","get","editor","global","href","addEventListener","nodejs","btoa","str","Buffer","from","toString","tbcListeners","io","isCrunchSocketAvailable","tbc","urlcreator","renderers","layerrenderer","textrenderer","defaultOptions","fit","getOptions","options","Object","assign","setFullHeightWidth","element","style","width","height","getFullscreenSize","screen","canvasSize","ctx","canvasWidth","canvas","canvasHeight","elementSize","box","getBoundingClientRect","findDrawingArea","w","h","x","y","actualX","actualY","validateCellSize","cellSize","size","findDrawingAreaElement","fullscreen","findDrawingAreaCanvas","findCentredDrawingArea","setElementToSpaceRatio","setElementToParentSize","child","parentBox","fullScreenSize","nodeName","createLayerCanvas","parentElement","document","createElement","createLayerDiv","div","createElementForSpace","layerDiv","renderImageToCanvas","renderTextToElement","renderTextToCanvas","renderVisualisationToElement","renderImageToElement","renderLayersToElement","renderCellToElement","createTurtleDivFromLayer","layer","properties","top","left","crunchLayer","layerSpace","innerHTML","renderElement","appendChild","renderSpaceIntoElement","opts","depth","turtleContainer","overflow","baseElement","layerConnections","layers","forEach","push","conn","image","Image","drawImage","src","getSpaceImageUrl","span","getFontProperties","color","fontWeight","font","getFontStyleFromProperties","textContent","append","drawText","content","params","odo","getSpaceVizzyUrl","sandbox","img","renderYoutubeVideoToElement","videoId","iframe","frameBorder","renderVideoToElement","video","getSpaceVideoUrl","controls","autoplay","loop","renderAudioToElement","audio","getSpaceAudioUrl","renderJsonToElement","getContext","includes","elementToDrawIn","LEFTRIGHTPADDING","MAX_FONT_SIZE","MIN_FONT_SIZE","defaultProperties","alignment","isNumeric","text","t","Number","split","join","isNaN","findXStart","findYStart","setDefaultAlignmentRightIfNumeric","isNumber","currentAlignment","setContextFontProperties","backgroundColor","fillStyle","fillRect","textBaseline","textAlign","calculateRelativeSizeFont","props","fontSize","setContextForNativeDraw","relativeFontSize","createMiniCanvas","clearRect","truncateWideText","textCanvas","fillText","drawFittedTextOnMiniCanvas","getFontHeight","fontStyle","createTextNode","alignSelf","body","result","offsetHeight","removeChild","getLinePosition","lineCount","fontHeight","shortenWordToFitWidth","currentWord","measureText","substring","length","drawNativeText","fontProperties","truncatedTextImage","drawFittedText","Math","floor","low","high","proposedSize","actualProperties","display","whiteSpace","scrollWidth","scrollHeight","drawWrappedText","miniCanvas","localX","localY","words","lineAccumulator","linesWritten","i","shortenedWord","splice","substr","currentLine","trim","getDefaultFontProperties","addWindowEvents","event","preventDefault","clipboardData","setData","key","metaKey","ctrlKey","stopPropagation","buttons","clientX","clientY","shiftKey","scroll","deltaX","deltaY","deltaMode","wheelDeltaX","wheelDeltaY","passive","addUniverseEventListeners","TBCAddedEvents","vizzy","listenToVizzy","indexOf","messageHandlers","zoomFactorChanged","zoomFactor","scaleOnZoom","queryParams","zoom","data","handler","Renderers","renderGifToElement","isS3AssetEnabled","assetProvider","getCdnUrlPrefix","s3Domain","protocol","nginxMainPort","cdnDomain","convertUrlToPath","items","getImageUrlPrefix","imageUrl","getVideoUrlPrefix","videoUrl","getAudioUrlPrefix","audioUrl","removeSlash","charAt","getAppImageUrl","appname","appStoreImagesUrl","getWebServerUrl","port","getAppStoreEndPoint","appStoreEndPoint","vizziesUrl","getSpaceVizzySourceUrl","getWebViewLink","webViewUrl","getProfilePictureUrl","profilePicture","getUserProfileUrl","username","id","inputParameters","inputCells","inputsOriginalOrdered","vizzySocket","customConfig","c","JSON","parse","decodeURIComponent","sortParametersByIndex","parameters","keys","map","index","cell","sort","a","b","buildParameterInputsList","input","getIndexOfParam","paramId","find","callTBCReady","tbcReady","listenForVizzyParams","onChange","spaceUuid","inputIndex","param","paramName","arrayValueUpdate","inputArray","inputCellArray","offset","onConfig","currentScript","getAttribute"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;AClFA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,0BAA0B,sCAAsC;;AAEhE,kBAAkB,gBAAgB;AAClC,gBAAgB,cAAc;AAC9B,oBAAoB,aAAa;;AAEjC;AACA;AACA;;AAEA;AACA;AACA,6BAA6B,SAAS;AACtC;AACA;AACA;AACA;;;;;;;;;;;;;AC3BA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;;AAEA;AACA;AACA;;AAEA,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,eAAe,SAAS;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;;;;;;;;;;;;AClEW;;AAEZ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kCAAkC,SAAS;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,SAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C,UAAU;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;ACtJA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA,yDAAyD;AACzD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,CAAC;;;;;;;;;;;;;ACnGD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEY;;AAEZ,aAAa,mBAAO,CAAC,oDAAW;AAChC,cAAc,mBAAO,CAAC,gDAAS;AAC/B,cAAc,mBAAO,CAAC,gDAAS;;AAE/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,mDAAmD;AACxE;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,UAAU;AAC7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,uCAAuC,SAAS;AAChD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;;AAEA;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gDAAgD,EAAE;AAClD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,wBAAwB,QAAQ;AAChC;AACA,qBAAqB,eAAe;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qBAAqB,SAAS;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qBAAqB,SAAS;AAC9B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,qBAAqB,SAAS;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,mBAAmB,cAAc;AACjC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,qBAAqB,QAAQ;AAC7B;AACA;AACA,GAAG;AACH;AACA,eAAe,SAAS;AACxB;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,mBAAmB,SAAS;AAC5B;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,YAAY;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;AC5vDA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,gBAAgB;AAC3B,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACrBA;AACA;AACA;;AAEA,IAAI,IAA6B;AACjC;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,YAAY;AACZ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;ACjKA;AACA;AACA;AACA;AACA;AACA,E;;;;;;;;;;;;ACLA,iBAAiB,mBAAO,CAAC,+DAAU;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAO,CAAC,wEAAkB;;;;;;;;;;;;ACTlD;AACA;AACA;;AAEA,iBAAiB,mBAAO,CAAC,mFAAoB;AAC7C,cAAc,mBAAO,CAAC,oEAAmB;AACzC,YAAY,mBAAO,CAAC,gFAAO;AAC3B,YAAY,mBAAO,CAAC,gDAAS;AAC7B,aAAa,mBAAO,CAAC,wEAAkB;AACvC,eAAe,mBAAO,CAAC,kDAAU;AACjC,cAAc,mBAAO,CAAC,gDAAS;;AAE/B;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F;;AAE3F;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,kCAAkC;;AAElC;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,mBAAO,CAAC,qEAAa;AACxC,oBAAoB,mBAAO,CAAC,mFAAoB;AAChD,gBAAgB,mBAAO,CAAC,wEAAkB;;AAE1C;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA,8CAA8C,WAAW;AACzD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,8BAA8B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,2BAA2B,kBAAkB;AAC7C;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6CAA6C,OAAO;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,OAAO;AAC7C;AACA;AACA;AACA;;;;;;;;;;;;ACzuBA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,wEAAkB;AACvC,cAAc,mBAAO,CAAC,oEAAmB;;AAEzC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,UAAU;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC/JA;AACA;AACA;;AAEA,qBAAqB,mBAAO,CAAC,iFAAoB;AACjD,UAAU,mBAAO,CAAC,oFAAe;AACjC,YAAY,mBAAO,CAAC,wFAAiB;AACrC,gBAAgB,mBAAO,CAAC,gFAAa;;AAErC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;;;;;;;;;;;ACpDA;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,4EAAW;AACjC,cAAc,mBAAO,CAAC,oEAAmB;;AAEzC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;;;;;;;;;;;AC9OA;;AAEA;AACA;AACA;;AAEA,qBAAqB,mBAAO,CAAC,iFAAoB;AACjD,cAAc,mBAAO,CAAC,4EAAW;AACjC,cAAc,mBAAO,CAAC,oEAAmB;AACzC,cAAc,mBAAO,CAAC,oEAAmB;AACzC,YAAY,mBAAO,CAAC,gFAAO;;AAE3B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB;AACA;;AAEA;AACA;AACA,0BAA0B,iDAAiD;AAC3E;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;;AAEd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,2DAA2D;AAC3D;AACA,OAAO;AACP;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC9ZA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,sEAAc;AACtC,cAAc,mBAAO,CAAC,gDAAS;AAC/B,aAAa,mBAAO,CAAC,wEAAkB;AACvC,cAAc,mBAAO,CAAC,oEAAmB;AACzC,YAAY,mBAAO,CAAC,4CAAO;AAC3B,YAAY,mBAAO,CAAC,gFAAO;;AAE3B;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,uBAAuB,mBAAO,CAAC,iFAAoB;AACnD,gCAAgC,iBAAiB;AACjD;AACA,CAAC;;AAED;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,SAAS;AACpB;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAiB,gBAAgB;AACjC;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACpPA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,sEAAc;AACtC,aAAa,mBAAO,CAAC,wEAAkB;AACvC,cAAc,mBAAO,CAAC,gDAAS;AAC/B,cAAc,mBAAO,CAAC,oEAAmB;AACzC,YAAY,mBAAO,CAAC,4CAAO;AAC3B,YAAY,mBAAO,CAAC,gFAAO;AAC3B;AACA;AACA;AACA,oBAAoB,mBAAO,CAAC,WAAI;AAChC,GAAG,YAAY;AACf,CAAC;AACD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,SAAS,OAAO;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA,OAAO;AACP,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;AC3RA;;AAEA,cAAc,mBAAO,CAAC,kDAAU;;AAEhC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG,YAAY;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,YAAY;;AAEf;AACA;AACA;AACA,KAAK,YAAY;AACjB;AACA;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,mBAAO,CAAC,gFAAS;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAO,CAAC,sCAAI;;AAE/B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc;AACd;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,aAAa,SAAS;AACtB,4BAA4B;AAC5B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA,aAAa,8BAA8B;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AChOA;AACA;AACA;;AAEA,WAAW,mBAAO,CAAC,2DAAQ;AAC3B,gBAAgB,mBAAO,CAAC,wDAAa;AACrC,kBAAkB,mBAAO,CAAC,oEAAmB;AAC7C,YAAY,mBAAO,CAAC,4CAAO;AAC3B,WAAW,mBAAO,CAAC,2DAAQ;;AAE3B;AACA;AACA,kBAAkB,mBAAO,CAAC,uFAAoB;AAC9C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,WAAW;;AAEX;AACA;AACA;;AAEA,WAAW,mBAAO,CAAC,0CAAM;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA,8BAA8B;AAC9B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,8DAA8D,gBAAgB;AAC9E;;AAEA;;AAEA;;AAEA;AACA,+BAA+B;AAC/B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB,yBAAyB;AAC1C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,0BAA0B,qCAAqC;AAC/D;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc;AACd,KAAK;AACL,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,8BAA8B,gBAAgB;AAC9C,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;AACA,YAAY,oBAAoB,oCAAoC;AACpE;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA,iBAAiB,gBAAgB;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,kCAAkC,OAAO;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,YAAY,YAAY;AACxB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,mDAAmD;AACnD,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA,OAAO,OAAO;AACd;AACA;;AAEA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;;AAEA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA,KAAK;;AAEL;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,YAAY;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mBAAmB,EAAE;AACrB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;;AC3lBA;AACA;AACA;AACA,YAAY,MAAM;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClBA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,IAAI;AACJ,2BAA2B;AAC3B;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACjNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC7SA;;AAEA;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,yEAAS;;AAE/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,OAAO;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;AC/DA,iBAAiB;;AAEjB;AACA;AACA;;;;;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,QAAQ,WAAW;;AAEnB;AACA;AACA;AACA,QAAQ,WAAW;;AAEnB;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA,QAAQ,WAAW;;AAEnB;AACA;AACA,QAAQ,UAAU;;AAElB;AACA;;;;;;;;;;;;;AClFA;;AAEA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA,E;;;;;;;;;;;ACTA,iBAAiB;;AAEjB;AACA;AACA;;;;;;;;;;;;ACJA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,OAAO;AAClB,YAAY,MAAM;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;;AAEA,yGAAyG,IAAI,GAAG,IAAI,SAAS,IAAI;;AAEjI;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,wEAAwE;AACxE;;AAEA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wEAAwE;AACxE,kFAAkF;AAClF;AACA;;AAEA;AACA;;;;;;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qCAAqC;;AAErC;AACA;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;AACA,4BAA4B,UAAU;;;;;;;;;;;;;ACtLtC;AACA;AACA;;AAEA,UAAU,mBAAO,CAAC,yDAAO;AACzB,aAAa,mBAAO,CAAC,kEAAkB;AACvC,cAAc,mBAAO,CAAC,iEAAW;AACjC,YAAY,mBAAO,CAAC,gFAAO;;AAE3B;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,kBAAkB,mBAAO,CAAC,iEAAW;AACrC,iBAAiB,mBAAO,CAAC,+DAAU;;;;;;;;;;;;;AC5FnC;AACA;AACA;;AAEA,UAAU,mBAAO,CAAC,sEAAkB;AACpC,aAAa,mBAAO,CAAC,+DAAU;AAC/B,cAAc,mBAAO,CAAC,oEAAmB;AACzC,aAAa,mBAAO,CAAC,kEAAkB;AACvC,SAAS,mBAAO,CAAC,uDAAM;AACvB,WAAW,mBAAO,CAAC,8DAAgB;AACnC,YAAY,mBAAO,CAAC,gFAAO;AAC3B,cAAc,mBAAO,CAAC,gDAAS;AAC/B,cAAc,mBAAO,CAAC,8CAAQ;;AAE9B;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,SAAS;AACpB,YAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG,OAAO;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC3jBA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACtBA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,kEAAkB;AACvC,cAAc,mBAAO,CAAC,oEAAmB;AACzC,cAAc,mBAAO,CAAC,kDAAU;AAChC,SAAS,mBAAO,CAAC,uDAAM;AACvB,WAAW,mBAAO,CAAC,8DAAgB;AACnC,YAAY,mBAAO,CAAC,gFAAO;AAC3B,cAAc,mBAAO,CAAC,gDAAS;AAC/B,aAAa,mBAAO,CAAC,wDAAa;;AAElC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mCAAmC;AACtD,KAAK;AACL,mBAAmB,qBAAqB;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,+BAA+B;AAC5C;AACA;AACA;;AAEA,aAAa,4BAA4B;AACzC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,sBAAsB;AACzC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,0BAA0B;AAC3C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;ACpbA;AACA;AACA;;AAEA,eAAe,mBAAO,CAAC,kDAAU;AACjC,YAAY,mBAAO,CAAC,gFAAO;;AAE3B;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;AC1EA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,mBAAO,CAAC,gFAAS;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAO,CAAC,sCAAI;;AAE/B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc;AACd;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,aAAa,SAAS;AACtB,4BAA4B;AAC5B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA,aAAa,8BAA8B;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AChOA;;AAEA;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,8EAAS;AAC/B,YAAY,mBAAO,CAAC,iEAAa;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC,UAAU;AACV;;AAEA;AACA;;AAEA;AACA,uBAAuB;AACvB;AACA;AACA,GAAG;AACH;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA,iCAAiC;AACjC;AACA;;AAEA;AACA;;AAEA;AACA,6BAA6B;AAC7B,GAAG;AACH,mBAAmB,iBAAiB;AACpC;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wCAAwC;AACxC,KAAK,yBAAyB;AAC9B,qBAAqB,gBAAgB;AACrC;AACA;AACA,KAAK,mDAAmD;AACxD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC3IA;AACA;AACA;;AAEA,YAAY,mBAAO,CAAC,gFAAO;AAC3B,cAAc,mBAAO,CAAC,oEAAmB;AACzC,aAAa,mBAAO,CAAC,2DAAU;AAC/B,cAAc,mBAAO,CAAC,8EAAS;AAC/B,YAAY,mBAAO,CAAC,iEAAa;;AAEjC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,0BAA0B;AAC1B,sBAAsB;AACtB;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA,qFAAqF;AACrF;;AAEA;AACA;AACA;AACA;AACA,KAAK,OAAO;AACZ;AACA;AACA,GAAG,qCAAqC;AACxC;AACA;AACA,KAAK;AACL;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,oBAAoB;AAChC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,qBAAqB;AAChC,YAAY,cAAc;AAC1B;AACA;AACA;;AAEA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC7ZA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,mBAAO,CAAC,gFAAS;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAO,CAAC,sCAAI;;AAE/B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc;AACd;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,aAAa,SAAS;AACtB,4BAA4B;AAC5B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA,aAAa,8BAA8B;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AChOA,iBAAiB;;AAEjB;AACA;AACA;;;;;;;;;;;;ACJA;;AAEA;AACA;;AAEA;;AAEA,4BAA4B,iBAAiB;AAC7C;AACA;;AAEA;AACA;;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,0FAA0F,KAAK;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA,eAAe,8BAA8B;AAC7C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,0CAA0C,kBAAkB;AAC5D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;;AAGA;;AAEA;;AAEA;AACA;AACA,eAAe,SAAS;AACxB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,iBAAiB;AACpC;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,kBAAkB;AAC7C;AACA;;AAEA;AACA;;AAEA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA,CAAC;;;;;;;;;;;;;ACzTD;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;;AAEA;AACA;AACA,4CAA4C;;AAE5C;;;;;;;;;;;;;ACnBa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA,aAAa,gBAAgB;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM,YAAY;;AAElB;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACnEA;AAAA;AAAA;AAAA,IA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","file":"tbc_sdk.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"TBC\"] = factory();\n\telse\n\t\troot[\"TBC\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/public\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./src/index.js\");\n","module.exports = after\n\nfunction after(count, callback, err_cb) {\n    var bail = false\n    err_cb = err_cb || noop\n    proxy.count = count\n\n    return (count === 0) ? callback() : proxy\n\n    function proxy(err, result) {\n        if (proxy.count <= 0) {\n            throw new Error('after called too many times')\n        }\n        --proxy.count\n\n        // after first error, rest are passed to err_cb\n        if (err) {\n            bail = true\n            callback(err)\n            // future error callbacks will go to error handler\n            callback = err_cb\n        } else if (proxy.count === 0 && !bail) {\n            callback(null, result)\n        }\n    }\n}\n\nfunction noop() {}\n","/**\n * An abstraction for slicing an arraybuffer even when\n * ArrayBuffer.prototype.slice is not supported\n *\n * @api public\n */\n\nmodule.exports = function(arraybuffer, start, end) {\n  var bytes = arraybuffer.byteLength;\n  start = start || 0;\n  end = end || bytes;\n\n  if (arraybuffer.slice) { return arraybuffer.slice(start, end); }\n\n  if (start < 0) { start += bytes; }\n  if (end < 0) { end += bytes; }\n  if (end > bytes) { end = bytes; }\n\n  if (start >= bytes || start >= end || bytes === 0) {\n    return new ArrayBuffer(0);\n  }\n\n  var abv = new Uint8Array(arraybuffer);\n  var result = new Uint8Array(end - start);\n  for (var i = start, ii = 0; i < end; i++, ii++) {\n    result[ii] = abv[i];\n  }\n  return result.buffer;\n};\n","\n/**\n * Expose `Backoff`.\n */\n\nmodule.exports = Backoff;\n\n/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction Backoff(opts) {\n  opts = opts || {};\n  this.ms = opts.min || 100;\n  this.max = opts.max || 10000;\n  this.factor = opts.factor || 2;\n  this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n  this.attempts = 0;\n}\n\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\n\nBackoff.prototype.duration = function(){\n  var ms = this.ms * Math.pow(this.factor, this.attempts++);\n  if (this.jitter) {\n    var rand =  Math.random();\n    var deviation = Math.floor(rand * this.jitter * ms);\n    ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;\n  }\n  return Math.min(ms, this.max) | 0;\n};\n\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\n\nBackoff.prototype.reset = function(){\n  this.attempts = 0;\n};\n\n/**\n * Set the minimum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMin = function(min){\n  this.ms = min;\n};\n\n/**\n * Set the maximum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMax = function(max){\n  this.max = max;\n};\n\n/**\n * Set the jitter\n *\n * @api public\n */\n\nBackoff.prototype.setJitter = function(jitter){\n  this.jitter = jitter;\n};\n\n","/*\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n(function(){\n  \"use strict\";\n\n  var chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n  // Use a lookup table to find the index.\n  var lookup = new Uint8Array(256);\n  for (var i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n  }\n\n  exports.encode = function(arraybuffer) {\n    var bytes = new Uint8Array(arraybuffer),\n    i, len = bytes.length, base64 = \"\";\n\n    for (i = 0; i < len; i+=3) {\n      base64 += chars[bytes[i] >> 2];\n      base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n      base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n      base64 += chars[bytes[i + 2] & 63];\n    }\n\n    if ((len % 3) === 2) {\n      base64 = base64.substring(0, base64.length - 1) + \"=\";\n    } else if (len % 3 === 1) {\n      base64 = base64.substring(0, base64.length - 2) + \"==\";\n    }\n\n    return base64;\n  };\n\n  exports.decode =  function(base64) {\n    var bufferLength = base64.length * 0.75,\n    len = base64.length, i, p = 0,\n    encoded1, encoded2, encoded3, encoded4;\n\n    if (base64[base64.length - 1] === \"=\") {\n      bufferLength--;\n      if (base64[base64.length - 2] === \"=\") {\n        bufferLength--;\n      }\n    }\n\n    var arraybuffer = new ArrayBuffer(bufferLength),\n    bytes = new Uint8Array(arraybuffer);\n\n    for (i = 0; i < len; i+=4) {\n      encoded1 = lookup[base64.charCodeAt(i)];\n      encoded2 = lookup[base64.charCodeAt(i+1)];\n      encoded3 = lookup[base64.charCodeAt(i+2)];\n      encoded4 = lookup[base64.charCodeAt(i+3)];\n\n      bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n      bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n      bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n\n    return arraybuffer;\n  };\n})();\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  for (var i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(\n      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n    ))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n","/**\r\n * Create a blob builder even when vendor prefixes exist\r\n */\r\n\r\nvar BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :\r\n  typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder :\r\n  typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :\r\n  typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : \r\n  false;\r\n\r\n/**\r\n * Check if Blob constructor is supported\r\n */\r\n\r\nvar blobSupported = (function() {\r\n  try {\r\n    var a = new Blob(['hi']);\r\n    return a.size === 2;\r\n  } catch(e) {\r\n    return false;\r\n  }\r\n})();\r\n\r\n/**\r\n * Check if Blob constructor supports ArrayBufferViews\r\n * Fails in Safari 6, so we need to map to ArrayBuffers there.\r\n */\r\n\r\nvar blobSupportsArrayBufferView = blobSupported && (function() {\r\n  try {\r\n    var b = new Blob([new Uint8Array([1,2])]);\r\n    return b.size === 2;\r\n  } catch(e) {\r\n    return false;\r\n  }\r\n})();\r\n\r\n/**\r\n * Check if BlobBuilder is supported\r\n */\r\n\r\nvar blobBuilderSupported = BlobBuilder\r\n  && BlobBuilder.prototype.append\r\n  && BlobBuilder.prototype.getBlob;\r\n\r\n/**\r\n * Helper function that maps ArrayBufferViews to ArrayBuffers\r\n * Used by BlobBuilder constructor and old browsers that didn't\r\n * support it in the Blob constructor.\r\n */\r\n\r\nfunction mapArrayBufferViews(ary) {\r\n  return ary.map(function(chunk) {\r\n    if (chunk.buffer instanceof ArrayBuffer) {\r\n      var buf = chunk.buffer;\r\n\r\n      // if this is a subarray, make a copy so we only\r\n      // include the subarray region from the underlying buffer\r\n      if (chunk.byteLength !== buf.byteLength) {\r\n        var copy = new Uint8Array(chunk.byteLength);\r\n        copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));\r\n        buf = copy.buffer;\r\n      }\r\n\r\n      return buf;\r\n    }\r\n\r\n    return chunk;\r\n  });\r\n}\r\n\r\nfunction BlobBuilderConstructor(ary, options) {\r\n  options = options || {};\r\n\r\n  var bb = new BlobBuilder();\r\n  mapArrayBufferViews(ary).forEach(function(part) {\r\n    bb.append(part);\r\n  });\r\n\r\n  return (options.type) ? bb.getBlob(options.type) : bb.getBlob();\r\n};\r\n\r\nfunction BlobConstructor(ary, options) {\r\n  return new Blob(mapArrayBufferViews(ary), options || {});\r\n};\r\n\r\nif (typeof Blob !== 'undefined') {\r\n  BlobBuilderConstructor.prototype = Blob.prototype;\r\n  BlobConstructor.prototype = Blob.prototype;\r\n}\r\n\r\nmodule.exports = (function() {\r\n  if (blobSupported) {\r\n    return blobSupportsArrayBufferView ? Blob : BlobConstructor;\r\n  } else if (blobBuilderSupported) {\r\n    return BlobBuilderConstructor;\r\n  } else {\r\n    return undefined;\r\n  }\r\n})();\r\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n","/**\n * Slice reference.\n */\n\nvar slice = [].slice;\n\n/**\n * Bind `obj` to `fn`.\n *\n * @param {Object} obj\n * @param {Function|String} fn or string\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function(obj, fn){\n  if ('string' == typeof fn) fn = obj[fn];\n  if ('function' != typeof fn) throw new Error('bind() requires a function');\n  var args = slice.call(arguments, 2);\n  return function(){\n    return fn.apply(obj, args.concat(slice.call(arguments)));\n  }\n};\n","\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (typeof module !== 'undefined') {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  var args = [].slice.call(arguments, 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n","\nmodule.exports = function(a, b){\n  var fn = function(){};\n  fn.prototype = b.prototype;\n  a.prototype = new fn;\n  a.prototype.constructor = a;\n};","\nmodule.exports = require('./socket');\n\n/**\n * Exports parser\n *\n * @api public\n *\n */\nmodule.exports.parser = require('engine.io-parser');\n","/**\n * Module dependencies.\n */\n\nvar transports = require('./transports/index');\nvar Emitter = require('component-emitter');\nvar debug = require('debug')('engine.io-client:socket');\nvar index = require('indexof');\nvar parser = require('engine.io-parser');\nvar parseuri = require('parseuri');\nvar parseqs = require('parseqs');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Socket;\n\n/**\n * Socket constructor.\n *\n * @param {String|Object} uri or options\n * @param {Object} options\n * @api public\n */\n\nfunction Socket (uri, opts) {\n  if (!(this instanceof Socket)) return new Socket(uri, opts);\n\n  opts = opts || {};\n\n  if (uri && 'object' === typeof uri) {\n    opts = uri;\n    uri = null;\n  }\n\n  if (uri) {\n    uri = parseuri(uri);\n    opts.hostname = uri.host;\n    opts.secure = uri.protocol === 'https' || uri.protocol === 'wss';\n    opts.port = uri.port;\n    if (uri.query) opts.query = uri.query;\n  } else if (opts.host) {\n    opts.hostname = parseuri(opts.host).host;\n  }\n\n  this.secure = null != opts.secure ? opts.secure\n    : (typeof location !== 'undefined' && 'https:' === location.protocol);\n\n  if (opts.hostname && !opts.port) {\n    // if no port is specified manually, use the protocol default\n    opts.port = this.secure ? '443' : '80';\n  }\n\n  this.agent = opts.agent || false;\n  this.hostname = opts.hostname ||\n    (typeof location !== 'undefined' ? location.hostname : 'localhost');\n  this.port = opts.port || (typeof location !== 'undefined' && location.port\n      ? location.port\n      : (this.secure ? 443 : 80));\n  this.query = opts.query || {};\n  if ('string' === typeof this.query) this.query = parseqs.decode(this.query);\n  this.upgrade = false !== opts.upgrade;\n  this.path = (opts.path || '/engine.io').replace(/\\/$/, '') + '/';\n  this.forceJSONP = !!opts.forceJSONP;\n  this.jsonp = false !== opts.jsonp;\n  this.forceBase64 = !!opts.forceBase64;\n  this.enablesXDR = !!opts.enablesXDR;\n  this.timestampParam = opts.timestampParam || 't';\n  this.timestampRequests = opts.timestampRequests;\n  this.transports = opts.transports || ['polling', 'websocket'];\n  this.transportOptions = opts.transportOptions || {};\n  this.readyState = '';\n  this.writeBuffer = [];\n  this.prevBufferLen = 0;\n  this.policyPort = opts.policyPort || 843;\n  this.rememberUpgrade = opts.rememberUpgrade || false;\n  this.binaryType = null;\n  this.onlyBinaryUpgrades = opts.onlyBinaryUpgrades;\n  this.perMessageDeflate = false !== opts.perMessageDeflate ? (opts.perMessageDeflate || {}) : false;\n\n  if (true === this.perMessageDeflate) this.perMessageDeflate = {};\n  if (this.perMessageDeflate && null == this.perMessageDeflate.threshold) {\n    this.perMessageDeflate.threshold = 1024;\n  }\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx || null;\n  this.key = opts.key || null;\n  this.passphrase = opts.passphrase || null;\n  this.cert = opts.cert || null;\n  this.ca = opts.ca || null;\n  this.ciphers = opts.ciphers || null;\n  this.rejectUnauthorized = opts.rejectUnauthorized === undefined ? true : opts.rejectUnauthorized;\n  this.forceNode = !!opts.forceNode;\n\n  // detect ReactNative environment\n  this.isReactNative = (typeof navigator !== 'undefined' && typeof navigator.product === 'string' && navigator.product.toLowerCase() === 'reactnative');\n\n  // other options for Node.js or ReactNative client\n  if (typeof self === 'undefined' || this.isReactNative) {\n    if (opts.extraHeaders && Object.keys(opts.extraHeaders).length > 0) {\n      this.extraHeaders = opts.extraHeaders;\n    }\n\n    if (opts.localAddress) {\n      this.localAddress = opts.localAddress;\n    }\n  }\n\n  // set on handshake\n  this.id = null;\n  this.upgrades = null;\n  this.pingInterval = null;\n  this.pingTimeout = null;\n\n  // set on heartbeat\n  this.pingIntervalTimer = null;\n  this.pingTimeoutTimer = null;\n\n  this.open();\n}\n\nSocket.priorWebsocketSuccess = false;\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nSocket.protocol = parser.protocol; // this is an int\n\n/**\n * Expose deps for legacy compatibility\n * and standalone browser access.\n */\n\nSocket.Socket = Socket;\nSocket.Transport = require('./transport');\nSocket.transports = require('./transports/index');\nSocket.parser = require('engine.io-parser');\n\n/**\n * Creates transport of the given type.\n *\n * @param {String} transport name\n * @return {Transport}\n * @api private\n */\n\nSocket.prototype.createTransport = function (name) {\n  debug('creating transport \"%s\"', name);\n  var query = clone(this.query);\n\n  // append engine.io protocol identifier\n  query.EIO = parser.protocol;\n\n  // transport name\n  query.transport = name;\n\n  // per-transport options\n  var options = this.transportOptions[name] || {};\n\n  // session id if we already have one\n  if (this.id) query.sid = this.id;\n\n  var transport = new transports[name]({\n    query: query,\n    socket: this,\n    agent: options.agent || this.agent,\n    hostname: options.hostname || this.hostname,\n    port: options.port || this.port,\n    secure: options.secure || this.secure,\n    path: options.path || this.path,\n    forceJSONP: options.forceJSONP || this.forceJSONP,\n    jsonp: options.jsonp || this.jsonp,\n    forceBase64: options.forceBase64 || this.forceBase64,\n    enablesXDR: options.enablesXDR || this.enablesXDR,\n    timestampRequests: options.timestampRequests || this.timestampRequests,\n    timestampParam: options.timestampParam || this.timestampParam,\n    policyPort: options.policyPort || this.policyPort,\n    pfx: options.pfx || this.pfx,\n    key: options.key || this.key,\n    passphrase: options.passphrase || this.passphrase,\n    cert: options.cert || this.cert,\n    ca: options.ca || this.ca,\n    ciphers: options.ciphers || this.ciphers,\n    rejectUnauthorized: options.rejectUnauthorized || this.rejectUnauthorized,\n    perMessageDeflate: options.perMessageDeflate || this.perMessageDeflate,\n    extraHeaders: options.extraHeaders || this.extraHeaders,\n    forceNode: options.forceNode || this.forceNode,\n    localAddress: options.localAddress || this.localAddress,\n    requestTimeout: options.requestTimeout || this.requestTimeout,\n    protocols: options.protocols || void (0),\n    isReactNative: this.isReactNative\n  });\n\n  return transport;\n};\n\nfunction clone (obj) {\n  var o = {};\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      o[i] = obj[i];\n    }\n  }\n  return o;\n}\n\n/**\n * Initializes transport to use and starts probe.\n *\n * @api private\n */\nSocket.prototype.open = function () {\n  var transport;\n  if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') !== -1) {\n    transport = 'websocket';\n  } else if (0 === this.transports.length) {\n    // Emit error on next tick so it can be listened to\n    var self = this;\n    setTimeout(function () {\n      self.emit('error', 'No transports available');\n    }, 0);\n    return;\n  } else {\n    transport = this.transports[0];\n  }\n  this.readyState = 'opening';\n\n  // Retry with the next transport if the transport is disabled (jsonp: false)\n  try {\n    transport = this.createTransport(transport);\n  } catch (e) {\n    this.transports.shift();\n    this.open();\n    return;\n  }\n\n  transport.open();\n  this.setTransport(transport);\n};\n\n/**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @api private\n */\n\nSocket.prototype.setTransport = function (transport) {\n  debug('setting transport %s', transport.name);\n  var self = this;\n\n  if (this.transport) {\n    debug('clearing existing transport %s', this.transport.name);\n    this.transport.removeAllListeners();\n  }\n\n  // set up transport\n  this.transport = transport;\n\n  // set up transport listeners\n  transport\n  .on('drain', function () {\n    self.onDrain();\n  })\n  .on('packet', function (packet) {\n    self.onPacket(packet);\n  })\n  .on('error', function (e) {\n    self.onError(e);\n  })\n  .on('close', function () {\n    self.onClose('transport close');\n  });\n};\n\n/**\n * Probes a transport.\n *\n * @param {String} transport name\n * @api private\n */\n\nSocket.prototype.probe = function (name) {\n  debug('probing transport \"%s\"', name);\n  var transport = this.createTransport(name, { probe: 1 });\n  var failed = false;\n  var self = this;\n\n  Socket.priorWebsocketSuccess = false;\n\n  function onTransportOpen () {\n    if (self.onlyBinaryUpgrades) {\n      var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;\n      failed = failed || upgradeLosesBinary;\n    }\n    if (failed) return;\n\n    debug('probe transport \"%s\" opened', name);\n    transport.send([{ type: 'ping', data: 'probe' }]);\n    transport.once('packet', function (msg) {\n      if (failed) return;\n      if ('pong' === msg.type && 'probe' === msg.data) {\n        debug('probe transport \"%s\" pong', name);\n        self.upgrading = true;\n        self.emit('upgrading', transport);\n        if (!transport) return;\n        Socket.priorWebsocketSuccess = 'websocket' === transport.name;\n\n        debug('pausing current transport \"%s\"', self.transport.name);\n        self.transport.pause(function () {\n          if (failed) return;\n          if ('closed' === self.readyState) return;\n          debug('changing transport and sending upgrade packet');\n\n          cleanup();\n\n          self.setTransport(transport);\n          transport.send([{ type: 'upgrade' }]);\n          self.emit('upgrade', transport);\n          transport = null;\n          self.upgrading = false;\n          self.flush();\n        });\n      } else {\n        debug('probe transport \"%s\" failed', name);\n        var err = new Error('probe error');\n        err.transport = transport.name;\n        self.emit('upgradeError', err);\n      }\n    });\n  }\n\n  function freezeTransport () {\n    if (failed) return;\n\n    // Any callback called by transport should be ignored since now\n    failed = true;\n\n    cleanup();\n\n    transport.close();\n    transport = null;\n  }\n\n  // Handle any error that happens while probing\n  function onerror (err) {\n    var error = new Error('probe error: ' + err);\n    error.transport = transport.name;\n\n    freezeTransport();\n\n    debug('probe transport \"%s\" failed because of error: %s', name, err);\n\n    self.emit('upgradeError', error);\n  }\n\n  function onTransportClose () {\n    onerror('transport closed');\n  }\n\n  // When the socket is closed while we're probing\n  function onclose () {\n    onerror('socket closed');\n  }\n\n  // When the socket is upgraded while we're probing\n  function onupgrade (to) {\n    if (transport && to.name !== transport.name) {\n      debug('\"%s\" works - aborting \"%s\"', to.name, transport.name);\n      freezeTransport();\n    }\n  }\n\n  // Remove all listeners on the transport and on self\n  function cleanup () {\n    transport.removeListener('open', onTransportOpen);\n    transport.removeListener('error', onerror);\n    transport.removeListener('close', onTransportClose);\n    self.removeListener('close', onclose);\n    self.removeListener('upgrading', onupgrade);\n  }\n\n  transport.once('open', onTransportOpen);\n  transport.once('error', onerror);\n  transport.once('close', onTransportClose);\n\n  this.once('close', onclose);\n  this.once('upgrading', onupgrade);\n\n  transport.open();\n};\n\n/**\n * Called when connection is deemed open.\n *\n * @api public\n */\n\nSocket.prototype.onOpen = function () {\n  debug('socket open');\n  this.readyState = 'open';\n  Socket.priorWebsocketSuccess = 'websocket' === this.transport.name;\n  this.emit('open');\n  this.flush();\n\n  // we check for `readyState` in case an `open`\n  // listener already closed the socket\n  if ('open' === this.readyState && this.upgrade && this.transport.pause) {\n    debug('starting upgrade probes');\n    for (var i = 0, l = this.upgrades.length; i < l; i++) {\n      this.probe(this.upgrades[i]);\n    }\n  }\n};\n\n/**\n * Handles a packet.\n *\n * @api private\n */\n\nSocket.prototype.onPacket = function (packet) {\n  if ('opening' === this.readyState || 'open' === this.readyState ||\n      'closing' === this.readyState) {\n    debug('socket receive: type \"%s\", data \"%s\"', packet.type, packet.data);\n\n    this.emit('packet', packet);\n\n    // Socket is live - any packet counts\n    this.emit('heartbeat');\n\n    switch (packet.type) {\n      case 'open':\n        this.onHandshake(JSON.parse(packet.data));\n        break;\n\n      case 'pong':\n        this.setPing();\n        this.emit('pong');\n        break;\n\n      case 'error':\n        var err = new Error('server error');\n        err.code = packet.data;\n        this.onError(err);\n        break;\n\n      case 'message':\n        this.emit('data', packet.data);\n        this.emit('message', packet.data);\n        break;\n    }\n  } else {\n    debug('packet received with socket readyState \"%s\"', this.readyState);\n  }\n};\n\n/**\n * Called upon handshake completion.\n *\n * @param {Object} handshake obj\n * @api private\n */\n\nSocket.prototype.onHandshake = function (data) {\n  this.emit('handshake', data);\n  this.id = data.sid;\n  this.transport.query.sid = data.sid;\n  this.upgrades = this.filterUpgrades(data.upgrades);\n  this.pingInterval = data.pingInterval;\n  this.pingTimeout = data.pingTimeout;\n  this.onOpen();\n  // In case open handler closes socket\n  if ('closed' === this.readyState) return;\n  this.setPing();\n\n  // Prolong liveness of socket on heartbeat\n  this.removeListener('heartbeat', this.onHeartbeat);\n  this.on('heartbeat', this.onHeartbeat);\n};\n\n/**\n * Resets ping timeout.\n *\n * @api private\n */\n\nSocket.prototype.onHeartbeat = function (timeout) {\n  clearTimeout(this.pingTimeoutTimer);\n  var self = this;\n  self.pingTimeoutTimer = setTimeout(function () {\n    if ('closed' === self.readyState) return;\n    self.onClose('ping timeout');\n  }, timeout || (self.pingInterval + self.pingTimeout));\n};\n\n/**\n * Pings server every `this.pingInterval` and expects response\n * within `this.pingTimeout` or closes connection.\n *\n * @api private\n */\n\nSocket.prototype.setPing = function () {\n  var self = this;\n  clearTimeout(self.pingIntervalTimer);\n  self.pingIntervalTimer = setTimeout(function () {\n    debug('writing ping packet - expecting pong within %sms', self.pingTimeout);\n    self.ping();\n    self.onHeartbeat(self.pingTimeout);\n  }, self.pingInterval);\n};\n\n/**\n* Sends a ping packet.\n*\n* @api private\n*/\n\nSocket.prototype.ping = function () {\n  var self = this;\n  this.sendPacket('ping', function () {\n    self.emit('ping');\n  });\n};\n\n/**\n * Called on `drain` event\n *\n * @api private\n */\n\nSocket.prototype.onDrain = function () {\n  this.writeBuffer.splice(0, this.prevBufferLen);\n\n  // setting prevBufferLen = 0 is very important\n  // for example, when upgrading, upgrade packet is sent over,\n  // and a nonzero prevBufferLen could cause problems on `drain`\n  this.prevBufferLen = 0;\n\n  if (0 === this.writeBuffer.length) {\n    this.emit('drain');\n  } else {\n    this.flush();\n  }\n};\n\n/**\n * Flush write buffers.\n *\n * @api private\n */\n\nSocket.prototype.flush = function () {\n  if ('closed' !== this.readyState && this.transport.writable &&\n    !this.upgrading && this.writeBuffer.length) {\n    debug('flushing %d packets in socket', this.writeBuffer.length);\n    this.transport.send(this.writeBuffer);\n    // keep track of current length of writeBuffer\n    // splice writeBuffer and callbackBuffer on `drain`\n    this.prevBufferLen = this.writeBuffer.length;\n    this.emit('flush');\n  }\n};\n\n/**\n * Sends a message.\n *\n * @param {String} message.\n * @param {Function} callback function.\n * @param {Object} options.\n * @return {Socket} for chaining.\n * @api public\n */\n\nSocket.prototype.write =\nSocket.prototype.send = function (msg, options, fn) {\n  this.sendPacket('message', msg, options, fn);\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {String} packet type.\n * @param {String} data.\n * @param {Object} options.\n * @param {Function} callback function.\n * @api private\n */\n\nSocket.prototype.sendPacket = function (type, data, options, fn) {\n  if ('function' === typeof data) {\n    fn = data;\n    data = undefined;\n  }\n\n  if ('function' === typeof options) {\n    fn = options;\n    options = null;\n  }\n\n  if ('closing' === this.readyState || 'closed' === this.readyState) {\n    return;\n  }\n\n  options = options || {};\n  options.compress = false !== options.compress;\n\n  var packet = {\n    type: type,\n    data: data,\n    options: options\n  };\n  this.emit('packetCreate', packet);\n  this.writeBuffer.push(packet);\n  if (fn) this.once('flush', fn);\n  this.flush();\n};\n\n/**\n * Closes the connection.\n *\n * @api private\n */\n\nSocket.prototype.close = function () {\n  if ('opening' === this.readyState || 'open' === this.readyState) {\n    this.readyState = 'closing';\n\n    var self = this;\n\n    if (this.writeBuffer.length) {\n      this.once('drain', function () {\n        if (this.upgrading) {\n          waitForUpgrade();\n        } else {\n          close();\n        }\n      });\n    } else if (this.upgrading) {\n      waitForUpgrade();\n    } else {\n      close();\n    }\n  }\n\n  function close () {\n    self.onClose('forced close');\n    debug('socket closing - telling transport to close');\n    self.transport.close();\n  }\n\n  function cleanupAndClose () {\n    self.removeListener('upgrade', cleanupAndClose);\n    self.removeListener('upgradeError', cleanupAndClose);\n    close();\n  }\n\n  function waitForUpgrade () {\n    // wait for upgrade to finish since we can't send packets while pausing a transport\n    self.once('upgrade', cleanupAndClose);\n    self.once('upgradeError', cleanupAndClose);\n  }\n\n  return this;\n};\n\n/**\n * Called upon transport error\n *\n * @api private\n */\n\nSocket.prototype.onError = function (err) {\n  debug('socket error %j', err);\n  Socket.priorWebsocketSuccess = false;\n  this.emit('error', err);\n  this.onClose('transport error', err);\n};\n\n/**\n * Called upon transport close.\n *\n * @api private\n */\n\nSocket.prototype.onClose = function (reason, desc) {\n  if ('opening' === this.readyState || 'open' === this.readyState || 'closing' === this.readyState) {\n    debug('socket close with reason: \"%s\"', reason);\n    var self = this;\n\n    // clear timers\n    clearTimeout(this.pingIntervalTimer);\n    clearTimeout(this.pingTimeoutTimer);\n\n    // stop event from firing again for transport\n    this.transport.removeAllListeners('close');\n\n    // ensure transport won't stay open\n    this.transport.close();\n\n    // ignore further transport communication\n    this.transport.removeAllListeners();\n\n    // set ready state\n    this.readyState = 'closed';\n\n    // clear session id\n    this.id = null;\n\n    // emit close event\n    this.emit('close', reason, desc);\n\n    // clean buffers after, so users can still\n    // grab the buffers on `close` event\n    self.writeBuffer = [];\n    self.prevBufferLen = 0;\n  }\n};\n\n/**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} server upgrades\n * @api private\n *\n */\n\nSocket.prototype.filterUpgrades = function (upgrades) {\n  var filteredUpgrades = [];\n  for (var i = 0, j = upgrades.length; i < j; i++) {\n    if (~index(this.transports, upgrades[i])) filteredUpgrades.push(upgrades[i]);\n  }\n  return filteredUpgrades;\n};\n","/**\n * Module dependencies.\n */\n\nvar parser = require('engine.io-parser');\nvar Emitter = require('component-emitter');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Transport;\n\n/**\n * Transport abstract constructor.\n *\n * @param {Object} options.\n * @api private\n */\n\nfunction Transport (opts) {\n  this.path = opts.path;\n  this.hostname = opts.hostname;\n  this.port = opts.port;\n  this.secure = opts.secure;\n  this.query = opts.query;\n  this.timestampParam = opts.timestampParam;\n  this.timestampRequests = opts.timestampRequests;\n  this.readyState = '';\n  this.agent = opts.agent || false;\n  this.socket = opts.socket;\n  this.enablesXDR = opts.enablesXDR;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n  this.forceNode = opts.forceNode;\n\n  // results of ReactNative environment detection\n  this.isReactNative = opts.isReactNative;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n  this.localAddress = opts.localAddress;\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Transport.prototype);\n\n/**\n * Emits an error.\n *\n * @param {String} str\n * @return {Transport} for chaining\n * @api public\n */\n\nTransport.prototype.onError = function (msg, desc) {\n  var err = new Error(msg);\n  err.type = 'TransportError';\n  err.description = desc;\n  this.emit('error', err);\n  return this;\n};\n\n/**\n * Opens the transport.\n *\n * @api public\n */\n\nTransport.prototype.open = function () {\n  if ('closed' === this.readyState || '' === this.readyState) {\n    this.readyState = 'opening';\n    this.doOpen();\n  }\n\n  return this;\n};\n\n/**\n * Closes the transport.\n *\n * @api private\n */\n\nTransport.prototype.close = function () {\n  if ('opening' === this.readyState || 'open' === this.readyState) {\n    this.doClose();\n    this.onClose();\n  }\n\n  return this;\n};\n\n/**\n * Sends multiple packets.\n *\n * @param {Array} packets\n * @api private\n */\n\nTransport.prototype.send = function (packets) {\n  if ('open' === this.readyState) {\n    this.write(packets);\n  } else {\n    throw new Error('Transport not open');\n  }\n};\n\n/**\n * Called upon open\n *\n * @api private\n */\n\nTransport.prototype.onOpen = function () {\n  this.readyState = 'open';\n  this.writable = true;\n  this.emit('open');\n};\n\n/**\n * Called with data.\n *\n * @param {String} data\n * @api private\n */\n\nTransport.prototype.onData = function (data) {\n  var packet = parser.decodePacket(data, this.socket.binaryType);\n  this.onPacket(packet);\n};\n\n/**\n * Called with a decoded packet.\n */\n\nTransport.prototype.onPacket = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon close.\n *\n * @api private\n */\n\nTransport.prototype.onClose = function () {\n  this.readyState = 'closed';\n  this.emit('close');\n};\n","/**\n * Module dependencies\n */\n\nvar XMLHttpRequest = require('xmlhttprequest-ssl');\nvar XHR = require('./polling-xhr');\nvar JSONP = require('./polling-jsonp');\nvar websocket = require('./websocket');\n\n/**\n * Export transports.\n */\n\nexports.polling = polling;\nexports.websocket = websocket;\n\n/**\n * Polling transport polymorphic constructor.\n * Decides on xhr vs jsonp based on feature detection.\n *\n * @api private\n */\n\nfunction polling (opts) {\n  var xhr;\n  var xd = false;\n  var xs = false;\n  var jsonp = false !== opts.jsonp;\n\n  if (typeof location !== 'undefined') {\n    var isSSL = 'https:' === location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    xd = opts.hostname !== location.hostname || port !== opts.port;\n    xs = opts.secure !== isSSL;\n  }\n\n  opts.xdomain = xd;\n  opts.xscheme = xs;\n  xhr = new XMLHttpRequest(opts);\n\n  if ('open' in xhr && !opts.forceJSONP) {\n    return new XHR(opts);\n  } else {\n    if (!jsonp) throw new Error('JSONP disabled');\n    return new JSONP(opts);\n  }\n}\n","/**\n * Module requirements.\n */\n\nvar Polling = require('./polling');\nvar inherit = require('component-inherit');\n\n/**\n * Module exports.\n */\n\nmodule.exports = JSONPPolling;\n\n/**\n * Cached regular expressions.\n */\n\nvar rNewline = /\\n/g;\nvar rEscapedNewline = /\\\\n/g;\n\n/**\n * Global JSONP callbacks.\n */\n\nvar callbacks;\n\n/**\n * Noop.\n */\n\nfunction empty () { }\n\n/**\n * Until https://github.com/tc39/proposal-global is shipped.\n */\nfunction glob () {\n  return typeof self !== 'undefined' ? self\n      : typeof window !== 'undefined' ? window\n      : typeof global !== 'undefined' ? global : {};\n}\n\n/**\n * JSONP Polling constructor.\n *\n * @param {Object} opts.\n * @api public\n */\n\nfunction JSONPPolling (opts) {\n  Polling.call(this, opts);\n\n  this.query = this.query || {};\n\n  // define global callbacks array if not present\n  // we do this here (lazily) to avoid unneeded global pollution\n  if (!callbacks) {\n    // we need to consider multiple engines in the same page\n    var global = glob();\n    callbacks = global.___eio = (global.___eio || []);\n  }\n\n  // callback identifier\n  this.index = callbacks.length;\n\n  // add callback to jsonp global\n  var self = this;\n  callbacks.push(function (msg) {\n    self.onData(msg);\n  });\n\n  // append to query string\n  this.query.j = this.index;\n\n  // prevent spurious errors from being emitted when the window is unloaded\n  if (typeof addEventListener === 'function') {\n    addEventListener('beforeunload', function () {\n      if (self.script) self.script.onerror = empty;\n    }, false);\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(JSONPPolling, Polling);\n\n/*\n * JSONP only supports binary as base64 encoded strings\n */\n\nJSONPPolling.prototype.supportsBinary = false;\n\n/**\n * Closes the socket.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doClose = function () {\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  if (this.form) {\n    this.form.parentNode.removeChild(this.form);\n    this.form = null;\n    this.iframe = null;\n  }\n\n  Polling.prototype.doClose.call(this);\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doPoll = function () {\n  var self = this;\n  var script = document.createElement('script');\n\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  script.async = true;\n  script.src = this.uri();\n  script.onerror = function (e) {\n    self.onError('jsonp poll error', e);\n  };\n\n  var insertAt = document.getElementsByTagName('script')[0];\n  if (insertAt) {\n    insertAt.parentNode.insertBefore(script, insertAt);\n  } else {\n    (document.head || document.body).appendChild(script);\n  }\n  this.script = script;\n\n  var isUAgecko = 'undefined' !== typeof navigator && /gecko/i.test(navigator.userAgent);\n\n  if (isUAgecko) {\n    setTimeout(function () {\n      var iframe = document.createElement('iframe');\n      document.body.appendChild(iframe);\n      document.body.removeChild(iframe);\n    }, 100);\n  }\n};\n\n/**\n * Writes with a hidden iframe.\n *\n * @param {String} data to send\n * @param {Function} called upon flush.\n * @api private\n */\n\nJSONPPolling.prototype.doWrite = function (data, fn) {\n  var self = this;\n\n  if (!this.form) {\n    var form = document.createElement('form');\n    var area = document.createElement('textarea');\n    var id = this.iframeId = 'eio_iframe_' + this.index;\n    var iframe;\n\n    form.className = 'socketio';\n    form.style.position = 'absolute';\n    form.style.top = '-1000px';\n    form.style.left = '-1000px';\n    form.target = id;\n    form.method = 'POST';\n    form.setAttribute('accept-charset', 'utf-8');\n    area.name = 'd';\n    form.appendChild(area);\n    document.body.appendChild(form);\n\n    this.form = form;\n    this.area = area;\n  }\n\n  this.form.action = this.uri();\n\n  function complete () {\n    initIframe();\n    fn();\n  }\n\n  function initIframe () {\n    if (self.iframe) {\n      try {\n        self.form.removeChild(self.iframe);\n      } catch (e) {\n        self.onError('jsonp polling iframe removal error', e);\n      }\n    }\n\n    try {\n      // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n      var html = '<iframe src=\"javascript:0\" name=\"' + self.iframeId + '\">';\n      iframe = document.createElement(html);\n    } catch (e) {\n      iframe = document.createElement('iframe');\n      iframe.name = self.iframeId;\n      iframe.src = 'javascript:0';\n    }\n\n    iframe.id = self.iframeId;\n\n    self.form.appendChild(iframe);\n    self.iframe = iframe;\n  }\n\n  initIframe();\n\n  // escape \\n to prevent it from being converted into \\r\\n by some UAs\n  // double escaping is required for escaped new lines because unescaping of new lines can be done safely on server-side\n  data = data.replace(rEscapedNewline, '\\\\\\n');\n  this.area.value = data.replace(rNewline, '\\\\n');\n\n  try {\n    this.form.submit();\n  } catch (e) {}\n\n  if (this.iframe.attachEvent) {\n    this.iframe.onreadystatechange = function () {\n      if (self.iframe.readyState === 'complete') {\n        complete();\n      }\n    };\n  } else {\n    this.iframe.onload = complete;\n  }\n};\n","/* global attachEvent */\n\n/**\n * Module requirements.\n */\n\nvar XMLHttpRequest = require('xmlhttprequest-ssl');\nvar Polling = require('./polling');\nvar Emitter = require('component-emitter');\nvar inherit = require('component-inherit');\nvar debug = require('debug')('engine.io-client:polling-xhr');\n\n/**\n * Module exports.\n */\n\nmodule.exports = XHR;\nmodule.exports.Request = Request;\n\n/**\n * Empty function\n */\n\nfunction empty () {}\n\n/**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction XHR (opts) {\n  Polling.call(this, opts);\n  this.requestTimeout = opts.requestTimeout;\n  this.extraHeaders = opts.extraHeaders;\n\n  if (typeof location !== 'undefined') {\n    var isSSL = 'https:' === location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    this.xd = (typeof location !== 'undefined' && opts.hostname !== location.hostname) ||\n      port !== opts.port;\n    this.xs = opts.secure !== isSSL;\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(XHR, Polling);\n\n/**\n * XHR supports binary\n */\n\nXHR.prototype.supportsBinary = true;\n\n/**\n * Creates a request.\n *\n * @param {String} method\n * @api private\n */\n\nXHR.prototype.request = function (opts) {\n  opts = opts || {};\n  opts.uri = this.uri();\n  opts.xd = this.xd;\n  opts.xs = this.xs;\n  opts.agent = this.agent || false;\n  opts.supportsBinary = this.supportsBinary;\n  opts.enablesXDR = this.enablesXDR;\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n  opts.requestTimeout = this.requestTimeout;\n\n  // other options for Node.js client\n  opts.extraHeaders = this.extraHeaders;\n\n  return new Request(opts);\n};\n\n/**\n * Sends data.\n *\n * @param {String} data to send.\n * @param {Function} called upon flush.\n * @api private\n */\n\nXHR.prototype.doWrite = function (data, fn) {\n  var isBinary = typeof data !== 'string' && data !== undefined;\n  var req = this.request({ method: 'POST', data: data, isBinary: isBinary });\n  var self = this;\n  req.on('success', fn);\n  req.on('error', function (err) {\n    self.onError('xhr post error', err);\n  });\n  this.sendXhr = req;\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nXHR.prototype.doPoll = function () {\n  debug('xhr poll');\n  var req = this.request();\n  var self = this;\n  req.on('data', function (data) {\n    self.onData(data);\n  });\n  req.on('error', function (err) {\n    self.onError('xhr poll error', err);\n  });\n  this.pollXhr = req;\n};\n\n/**\n * Request constructor\n *\n * @param {Object} options\n * @api public\n */\n\nfunction Request (opts) {\n  this.method = opts.method || 'GET';\n  this.uri = opts.uri;\n  this.xd = !!opts.xd;\n  this.xs = !!opts.xs;\n  this.async = false !== opts.async;\n  this.data = undefined !== opts.data ? opts.data : null;\n  this.agent = opts.agent;\n  this.isBinary = opts.isBinary;\n  this.supportsBinary = opts.supportsBinary;\n  this.enablesXDR = opts.enablesXDR;\n  this.requestTimeout = opts.requestTimeout;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n\n  this.create();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Request.prototype);\n\n/**\n * Creates the XHR object and sends the request.\n *\n * @api private\n */\n\nRequest.prototype.create = function () {\n  var opts = { agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR };\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n\n  var xhr = this.xhr = new XMLHttpRequest(opts);\n  var self = this;\n\n  try {\n    debug('xhr open %s: %s', this.method, this.uri);\n    xhr.open(this.method, this.uri, this.async);\n    try {\n      if (this.extraHeaders) {\n        xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n        for (var i in this.extraHeaders) {\n          if (this.extraHeaders.hasOwnProperty(i)) {\n            xhr.setRequestHeader(i, this.extraHeaders[i]);\n          }\n        }\n      }\n    } catch (e) {}\n\n    if ('POST' === this.method) {\n      try {\n        if (this.isBinary) {\n          xhr.setRequestHeader('Content-type', 'application/octet-stream');\n        } else {\n          xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n        }\n      } catch (e) {}\n    }\n\n    try {\n      xhr.setRequestHeader('Accept', '*/*');\n    } catch (e) {}\n\n    // ie6 check\n    if ('withCredentials' in xhr) {\n      xhr.withCredentials = true;\n    }\n\n    if (this.requestTimeout) {\n      xhr.timeout = this.requestTimeout;\n    }\n\n    if (this.hasXDR()) {\n      xhr.onload = function () {\n        self.onLoad();\n      };\n      xhr.onerror = function () {\n        self.onError(xhr.responseText);\n      };\n    } else {\n      xhr.onreadystatechange = function () {\n        if (xhr.readyState === 2) {\n          try {\n            var contentType = xhr.getResponseHeader('Content-Type');\n            if (self.supportsBinary && contentType === 'application/octet-stream') {\n              xhr.responseType = 'arraybuffer';\n            }\n          } catch (e) {}\n        }\n        if (4 !== xhr.readyState) return;\n        if (200 === xhr.status || 1223 === xhr.status) {\n          self.onLoad();\n        } else {\n          // make sure the `error` event handler that's user-set\n          // does not throw in the same tick and gets caught here\n          setTimeout(function () {\n            self.onError(xhr.status);\n          }, 0);\n        }\n      };\n    }\n\n    debug('xhr data %s', this.data);\n    xhr.send(this.data);\n  } catch (e) {\n    // Need to defer since .create() is called directly fhrom the constructor\n    // and thus the 'error' event can only be only bound *after* this exception\n    // occurs.  Therefore, also, we cannot throw here at all.\n    setTimeout(function () {\n      self.onError(e);\n    }, 0);\n    return;\n  }\n\n  if (typeof document !== 'undefined') {\n    this.index = Request.requestsCount++;\n    Request.requests[this.index] = this;\n  }\n};\n\n/**\n * Called upon successful response.\n *\n * @api private\n */\n\nRequest.prototype.onSuccess = function () {\n  this.emit('success');\n  this.cleanup();\n};\n\n/**\n * Called if we have data.\n *\n * @api private\n */\n\nRequest.prototype.onData = function (data) {\n  this.emit('data', data);\n  this.onSuccess();\n};\n\n/**\n * Called upon error.\n *\n * @api private\n */\n\nRequest.prototype.onError = function (err) {\n  this.emit('error', err);\n  this.cleanup(true);\n};\n\n/**\n * Cleans up house.\n *\n * @api private\n */\n\nRequest.prototype.cleanup = function (fromError) {\n  if ('undefined' === typeof this.xhr || null === this.xhr) {\n    return;\n  }\n  // xmlhttprequest\n  if (this.hasXDR()) {\n    this.xhr.onload = this.xhr.onerror = empty;\n  } else {\n    this.xhr.onreadystatechange = empty;\n  }\n\n  if (fromError) {\n    try {\n      this.xhr.abort();\n    } catch (e) {}\n  }\n\n  if (typeof document !== 'undefined') {\n    delete Request.requests[this.index];\n  }\n\n  this.xhr = null;\n};\n\n/**\n * Called upon load.\n *\n * @api private\n */\n\nRequest.prototype.onLoad = function () {\n  var data;\n  try {\n    var contentType;\n    try {\n      contentType = this.xhr.getResponseHeader('Content-Type');\n    } catch (e) {}\n    if (contentType === 'application/octet-stream') {\n      data = this.xhr.response || this.xhr.responseText;\n    } else {\n      data = this.xhr.responseText;\n    }\n  } catch (e) {\n    this.onError(e);\n  }\n  if (null != data) {\n    this.onData(data);\n  }\n};\n\n/**\n * Check if it has XDomainRequest.\n *\n * @api private\n */\n\nRequest.prototype.hasXDR = function () {\n  return typeof XDomainRequest !== 'undefined' && !this.xs && this.enablesXDR;\n};\n\n/**\n * Aborts the request.\n *\n * @api public\n */\n\nRequest.prototype.abort = function () {\n  this.cleanup();\n};\n\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\n\nRequest.requestsCount = 0;\nRequest.requests = {};\n\nif (typeof document !== 'undefined') {\n  if (typeof attachEvent === 'function') {\n    attachEvent('onunload', unloadHandler);\n  } else if (typeof addEventListener === 'function') {\n    var terminationEvent = 'onpagehide' in self ? 'pagehide' : 'unload';\n    addEventListener(terminationEvent, unloadHandler, false);\n  }\n}\n\nfunction unloadHandler () {\n  for (var i in Request.requests) {\n    if (Request.requests.hasOwnProperty(i)) {\n      Request.requests[i].abort();\n    }\n  }\n}\n","/**\n * Module dependencies.\n */\n\nvar Transport = require('../transport');\nvar parseqs = require('parseqs');\nvar parser = require('engine.io-parser');\nvar inherit = require('component-inherit');\nvar yeast = require('yeast');\nvar debug = require('debug')('engine.io-client:polling');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Polling;\n\n/**\n * Is XHR2 supported?\n */\n\nvar hasXHR2 = (function () {\n  var XMLHttpRequest = require('xmlhttprequest-ssl');\n  var xhr = new XMLHttpRequest({ xdomain: false });\n  return null != xhr.responseType;\n})();\n\n/**\n * Polling interface.\n *\n * @param {Object} opts\n * @api private\n */\n\nfunction Polling (opts) {\n  var forceBase64 = (opts && opts.forceBase64);\n  if (!hasXHR2 || forceBase64) {\n    this.supportsBinary = false;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(Polling, Transport);\n\n/**\n * Transport name.\n */\n\nPolling.prototype.name = 'polling';\n\n/**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @api private\n */\n\nPolling.prototype.doOpen = function () {\n  this.poll();\n};\n\n/**\n * Pauses polling.\n *\n * @param {Function} callback upon buffers are flushed and transport is paused\n * @api private\n */\n\nPolling.prototype.pause = function (onPause) {\n  var self = this;\n\n  this.readyState = 'pausing';\n\n  function pause () {\n    debug('paused');\n    self.readyState = 'paused';\n    onPause();\n  }\n\n  if (this.polling || !this.writable) {\n    var total = 0;\n\n    if (this.polling) {\n      debug('we are currently polling - waiting to pause');\n      total++;\n      this.once('pollComplete', function () {\n        debug('pre-pause polling complete');\n        --total || pause();\n      });\n    }\n\n    if (!this.writable) {\n      debug('we are currently writing - waiting to pause');\n      total++;\n      this.once('drain', function () {\n        debug('pre-pause writing complete');\n        --total || pause();\n      });\n    }\n  } else {\n    pause();\n  }\n};\n\n/**\n * Starts polling cycle.\n *\n * @api public\n */\n\nPolling.prototype.poll = function () {\n  debug('polling');\n  this.polling = true;\n  this.doPoll();\n  this.emit('poll');\n};\n\n/**\n * Overloads onData to detect payloads.\n *\n * @api private\n */\n\nPolling.prototype.onData = function (data) {\n  var self = this;\n  debug('polling got data %s', data);\n  var callback = function (packet, index, total) {\n    // if its the first message we consider the transport open\n    if ('opening' === self.readyState) {\n      self.onOpen();\n    }\n\n    // if its a close packet, we close the ongoing requests\n    if ('close' === packet.type) {\n      self.onClose();\n      return false;\n    }\n\n    // otherwise bypass onData and handle the message\n    self.onPacket(packet);\n  };\n\n  // decode payload\n  parser.decodePayload(data, this.socket.binaryType, callback);\n\n  // if an event did not trigger closing\n  if ('closed' !== this.readyState) {\n    // if we got data we're not polling\n    this.polling = false;\n    this.emit('pollComplete');\n\n    if ('open' === this.readyState) {\n      this.poll();\n    } else {\n      debug('ignoring poll - transport state \"%s\"', this.readyState);\n    }\n  }\n};\n\n/**\n * For polling, send a close packet.\n *\n * @api private\n */\n\nPolling.prototype.doClose = function () {\n  var self = this;\n\n  function close () {\n    debug('writing close packet');\n    self.write([{ type: 'close' }]);\n  }\n\n  if ('open' === this.readyState) {\n    debug('transport open - closing');\n    close();\n  } else {\n    // in case we're trying to close while\n    // handshaking is in progress (GH-164)\n    debug('transport not open - deferring close');\n    this.once('open', close);\n  }\n};\n\n/**\n * Writes a packets payload.\n *\n * @param {Array} data packets\n * @param {Function} drain callback\n * @api private\n */\n\nPolling.prototype.write = function (packets) {\n  var self = this;\n  this.writable = false;\n  var callbackfn = function () {\n    self.writable = true;\n    self.emit('drain');\n  };\n\n  parser.encodePayload(packets, this.supportsBinary, function (data) {\n    self.doWrite(data, callbackfn);\n  });\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nPolling.prototype.uri = function () {\n  var query = this.query || {};\n  var schema = this.secure ? 'https' : 'http';\n  var port = '';\n\n  // cache busting is forced\n  if (false !== this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  if (!this.supportsBinary && !query.sid) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // avoid port if default for schema\n  if (this.port && (('https' === schema && Number(this.port) !== 443) ||\n     ('http' === schema && Number(this.port) !== 80))) {\n    port = ':' + this.port;\n  }\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n","/**\n * Module dependencies.\n */\n\nvar Transport = require('../transport');\nvar parser = require('engine.io-parser');\nvar parseqs = require('parseqs');\nvar inherit = require('component-inherit');\nvar yeast = require('yeast');\nvar debug = require('debug')('engine.io-client:websocket');\nvar BrowserWebSocket, NodeWebSocket;\nif (typeof self === 'undefined') {\n  try {\n    NodeWebSocket = require('ws');\n  } catch (e) { }\n} else {\n  BrowserWebSocket = self.WebSocket || self.MozWebSocket;\n}\n\n/**\n * Get either the `WebSocket` or `MozWebSocket` globals\n * in the browser or try to resolve WebSocket-compatible\n * interface exposed by `ws` for Node-like environment.\n */\n\nvar WebSocket = BrowserWebSocket || NodeWebSocket;\n\n/**\n * Module exports.\n */\n\nmodule.exports = WS;\n\n/**\n * WebSocket transport constructor.\n *\n * @api {Object} connection options\n * @api public\n */\n\nfunction WS (opts) {\n  var forceBase64 = (opts && opts.forceBase64);\n  if (forceBase64) {\n    this.supportsBinary = false;\n  }\n  this.perMessageDeflate = opts.perMessageDeflate;\n  this.usingBrowserWebSocket = BrowserWebSocket && !opts.forceNode;\n  this.protocols = opts.protocols;\n  if (!this.usingBrowserWebSocket) {\n    WebSocket = NodeWebSocket;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(WS, Transport);\n\n/**\n * Transport name.\n *\n * @api public\n */\n\nWS.prototype.name = 'websocket';\n\n/*\n * WebSockets support binary\n */\n\nWS.prototype.supportsBinary = true;\n\n/**\n * Opens socket.\n *\n * @api private\n */\n\nWS.prototype.doOpen = function () {\n  if (!this.check()) {\n    // let probe timeout\n    return;\n  }\n\n  var uri = this.uri();\n  var protocols = this.protocols;\n  var opts = {\n    agent: this.agent,\n    perMessageDeflate: this.perMessageDeflate\n  };\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n  if (this.extraHeaders) {\n    opts.headers = this.extraHeaders;\n  }\n  if (this.localAddress) {\n    opts.localAddress = this.localAddress;\n  }\n\n  try {\n    this.ws = this.usingBrowserWebSocket && !this.isReactNative ? (protocols ? new WebSocket(uri, protocols) : new WebSocket(uri)) : new WebSocket(uri, protocols, opts);\n  } catch (err) {\n    return this.emit('error', err);\n  }\n\n  if (this.ws.binaryType === undefined) {\n    this.supportsBinary = false;\n  }\n\n  if (this.ws.supports && this.ws.supports.binary) {\n    this.supportsBinary = true;\n    this.ws.binaryType = 'nodebuffer';\n  } else {\n    this.ws.binaryType = 'arraybuffer';\n  }\n\n  this.addEventListeners();\n};\n\n/**\n * Adds event listeners to the socket\n *\n * @api private\n */\n\nWS.prototype.addEventListeners = function () {\n  var self = this;\n\n  this.ws.onopen = function () {\n    self.onOpen();\n  };\n  this.ws.onclose = function () {\n    self.onClose();\n  };\n  this.ws.onmessage = function (ev) {\n    self.onData(ev.data);\n  };\n  this.ws.onerror = function (e) {\n    self.onError('websocket error', e);\n  };\n};\n\n/**\n * Writes data to socket.\n *\n * @param {Array} array of packets.\n * @api private\n */\n\nWS.prototype.write = function (packets) {\n  var self = this;\n  this.writable = false;\n\n  // encodePacket efficient as it uses WS framing\n  // no need for encodePayload\n  var total = packets.length;\n  for (var i = 0, l = total; i < l; i++) {\n    (function (packet) {\n      parser.encodePacket(packet, self.supportsBinary, function (data) {\n        if (!self.usingBrowserWebSocket) {\n          // always create a new object (GH-437)\n          var opts = {};\n          if (packet.options) {\n            opts.compress = packet.options.compress;\n          }\n\n          if (self.perMessageDeflate) {\n            var len = 'string' === typeof data ? Buffer.byteLength(data) : data.length;\n            if (len < self.perMessageDeflate.threshold) {\n              opts.compress = false;\n            }\n          }\n        }\n\n        // Sometimes the websocket has already been closed but the browser didn't\n        // have a chance of informing us about it yet, in that case send will\n        // throw an error\n        try {\n          if (self.usingBrowserWebSocket) {\n            // TypeError is thrown when passing the second argument on Safari\n            self.ws.send(data);\n          } else {\n            self.ws.send(data, opts);\n          }\n        } catch (e) {\n          debug('websocket closed before onclose event');\n        }\n\n        --total || done();\n      });\n    })(packets[i]);\n  }\n\n  function done () {\n    self.emit('flush');\n\n    // fake drain\n    // defer to next tick to allow Socket to clear writeBuffer\n    setTimeout(function () {\n      self.writable = true;\n      self.emit('drain');\n    }, 0);\n  }\n};\n\n/**\n * Called upon close\n *\n * @api private\n */\n\nWS.prototype.onClose = function () {\n  Transport.prototype.onClose.call(this);\n};\n\n/**\n * Closes socket.\n *\n * @api private\n */\n\nWS.prototype.doClose = function () {\n  if (typeof this.ws !== 'undefined') {\n    this.ws.close();\n  }\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nWS.prototype.uri = function () {\n  var query = this.query || {};\n  var schema = this.secure ? 'wss' : 'ws';\n  var port = '';\n\n  // avoid port if default for schema\n  if (this.port && (('wss' === schema && Number(this.port) !== 443) ||\n    ('ws' === schema && Number(this.port) !== 80))) {\n    port = ':' + this.port;\n  }\n\n  // append timestamp to URI\n  if (this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  // communicate binary support capabilities\n  if (!this.supportsBinary) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n\n/**\n * Feature detection for WebSocket.\n *\n * @return {Boolean} whether this transport is available.\n * @api public\n */\n\nWS.prototype.check = function () {\n  return !!WebSocket && !('__initialize' in WebSocket && this.name === WS.prototype.name);\n};\n","// browser shim for xmlhttprequest module\n\nvar hasCORS = require('has-cors');\n\nmodule.exports = function (opts) {\n  var xdomain = opts.xdomain;\n\n  // scheme must be same when usign XDomainRequest\n  // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx\n  var xscheme = opts.xscheme;\n\n  // XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.\n  // https://github.com/Automattic/engine.io-client/pull/217\n  var enablesXDR = opts.enablesXDR;\n\n  // XMLHttpRequest can be disabled on IE\n  try {\n    if ('undefined' !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n      return new XMLHttpRequest();\n    }\n  } catch (e) { }\n\n  // Use XDomainRequest for IE8 if enablesXDR is true\n  // because loading bar keeps flashing when using jsonp-polling\n  // https://github.com/yujiosaka/socke.io-ie8-loading-example\n  try {\n    if ('undefined' !== typeof XDomainRequest && !xscheme && enablesXDR) {\n      return new XDomainRequest();\n    }\n  } catch (e) { }\n\n  if (!xdomain) {\n    try {\n      return new self[['Active'].concat('Object').join('X')]('Microsoft.XMLHTTP');\n    } catch (e) { }\n  }\n};\n","/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n               && 'undefined' != typeof chrome.storage\n                  ? chrome.storage.local\n                  : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n  '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',\n  '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',\n  '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',\n  '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',\n  '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',\n  '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',\n  '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',\n  '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',\n  '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',\n  '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',\n  '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n  // NB: In an Electron preload script, document will be defined but not fully\n  // initialized. Since we know we're in Chrome, we'll just detect this case\n  // explicitly\n  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n    return true;\n  }\n\n  // Internet Explorer and Edge do not support colors.\n  if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n    return false;\n  }\n\n  // is webkit? http://stackoverflow.com/a/16459606/376773\n  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n    // is firebug? http://stackoverflow.com/a/398120/376773\n    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n    // is firefox >= v31?\n    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n    // double check webkit in userAgent just in case we are in a worker\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n  try {\n    return JSON.stringify(v);\n  } catch (err) {\n    return '[UnexpectedJSONParseError]: ' + err.message;\n  }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n  var useColors = this.useColors;\n\n  args[0] = (useColors ? '%c' : '')\n    + this.namespace\n    + (useColors ? ' %c' : ' ')\n    + args[0]\n    + (useColors ? '%c ' : ' ')\n    + '+' + exports.humanize(this.diff);\n\n  if (!useColors) return;\n\n  var c = 'color: ' + this.color;\n  args.splice(1, 0, c, 'color: inherit')\n\n  // the final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-zA-Z%]/g, function(match) {\n    if ('%%' === match) return;\n    index++;\n    if ('%c' === match) {\n      // we only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n\n  args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n  // this hackery is required for IE8/9, where\n  // the `console.log` function doesn't have 'apply'\n  return 'object' === typeof console\n    && console.log\n    && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  try {\n    if (null == namespaces) {\n      exports.storage.removeItem('debug');\n    } else {\n      exports.storage.debug = namespaces;\n    }\n  } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  var r;\n  try {\n    r = exports.storage.debug;\n  } catch(e) {}\n\n  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n  if (!r && typeof process !== 'undefined' && 'env' in process) {\n    r = process.env.DEBUG;\n  }\n\n  return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n  try {\n    return window.localStorage;\n  } catch (e) {}\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * Active `debug` instances.\n */\nexports.instances = [];\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n  var hash = 0, i;\n\n  for (i in namespace) {\n    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);\n    hash |= 0; // Convert to 32bit integer\n  }\n\n  return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n  var prevTime;\n\n  function debug() {\n    // disabled?\n    if (!debug.enabled) return;\n\n    var self = debug;\n\n    // set `diff` timestamp\n    var curr = +new Date();\n    var ms = curr - (prevTime || curr);\n    self.diff = ms;\n    self.prev = prevTime;\n    self.curr = curr;\n    prevTime = curr;\n\n    // turn the `arguments` into a proper Array\n    var args = new Array(arguments.length);\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i];\n    }\n\n    args[0] = exports.coerce(args[0]);\n\n    if ('string' !== typeof args[0]) {\n      // anything else let's inspect with %O\n      args.unshift('%O');\n    }\n\n    // apply any `formatters` transformations\n    var index = 0;\n    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n      // if we encounter an escaped % then don't increase the array index\n      if (match === '%%') return match;\n      index++;\n      var formatter = exports.formatters[format];\n      if ('function' === typeof formatter) {\n        var val = args[index];\n        match = formatter.call(self, val);\n\n        // now we need to remove `args[index]` since it's inlined in the `format`\n        args.splice(index, 1);\n        index--;\n      }\n      return match;\n    });\n\n    // apply env-specific formatting (colors, etc.)\n    exports.formatArgs.call(self, args);\n\n    var logFn = debug.log || exports.log || console.log.bind(console);\n    logFn.apply(self, args);\n  }\n\n  debug.namespace = namespace;\n  debug.enabled = exports.enabled(namespace);\n  debug.useColors = exports.useColors();\n  debug.color = selectColor(namespace);\n  debug.destroy = destroy;\n\n  // env-specific initialization logic for debug instances\n  if ('function' === typeof exports.init) {\n    exports.init(debug);\n  }\n\n  exports.instances.push(debug);\n\n  return debug;\n}\n\nfunction destroy () {\n  var index = exports.instances.indexOf(this);\n  if (index !== -1) {\n    exports.instances.splice(index, 1);\n    return true;\n  } else {\n    return false;\n  }\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n  exports.save(namespaces);\n\n  exports.names = [];\n  exports.skips = [];\n\n  var i;\n  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n  var len = split.length;\n\n  for (i = 0; i < len; i++) {\n    if (!split[i]) continue; // ignore empty strings\n    namespaces = split[i].replace(/\\*/g, '.*?');\n    if (namespaces[0] === '-') {\n      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n    } else {\n      exports.names.push(new RegExp('^' + namespaces + '$'));\n    }\n  }\n\n  for (i = 0; i < exports.instances.length; i++) {\n    var instance = exports.instances[i];\n    instance.enabled = exports.enabled(instance.namespace);\n  }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n  exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n  if (name[name.length - 1] === '*') {\n    return true;\n  }\n  var i, len;\n  for (i = 0, len = exports.skips.length; i < len; i++) {\n    if (exports.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (i = 0, len = exports.names.length; i < len; i++) {\n    if (exports.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n","/**\n * Module dependencies.\n */\n\nvar keys = require('./keys');\nvar hasBinary = require('has-binary2');\nvar sliceBuffer = require('arraybuffer.slice');\nvar after = require('after');\nvar utf8 = require('./utf8');\n\nvar base64encoder;\nif (typeof ArrayBuffer !== 'undefined') {\n  base64encoder = require('base64-arraybuffer');\n}\n\n/**\n * Check if we are running an android browser. That requires us to use\n * ArrayBuffer with polling transports...\n *\n * http://ghinda.net/jpeg-blob-ajax-android/\n */\n\nvar isAndroid = typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent);\n\n/**\n * Check if we are running in PhantomJS.\n * Uploading a Blob with PhantomJS does not work correctly, as reported here:\n * https://github.com/ariya/phantomjs/issues/11395\n * @type boolean\n */\nvar isPhantomJS = typeof navigator !== 'undefined' && /PhantomJS/i.test(navigator.userAgent);\n\n/**\n * When true, avoids using Blobs to encode payloads.\n * @type boolean\n */\nvar dontSendBlobs = isAndroid || isPhantomJS;\n\n/**\n * Current protocol version.\n */\n\nexports.protocol = 3;\n\n/**\n * Packet types.\n */\n\nvar packets = exports.packets = {\n    open:     0    // non-ws\n  , close:    1    // non-ws\n  , ping:     2\n  , pong:     3\n  , message:  4\n  , upgrade:  5\n  , noop:     6\n};\n\nvar packetslist = keys(packets);\n\n/**\n * Premade error packet.\n */\n\nvar err = { type: 'error', data: 'parser error' };\n\n/**\n * Create a blob api even for blob builder when vendor prefixes exist\n */\n\nvar Blob = require('blob');\n\n/**\n * Encodes a packet.\n *\n *     <packet type id> [ <data> ]\n *\n * Example:\n *\n *     5hello world\n *     3\n *     4\n *\n * Binary is encoded in an identical principle\n *\n * @api private\n */\n\nexports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {\n  if (typeof supportsBinary === 'function') {\n    callback = supportsBinary;\n    supportsBinary = false;\n  }\n\n  if (typeof utf8encode === 'function') {\n    callback = utf8encode;\n    utf8encode = null;\n  }\n\n  var data = (packet.data === undefined)\n    ? undefined\n    : packet.data.buffer || packet.data;\n\n  if (typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) {\n    return encodeArrayBuffer(packet, supportsBinary, callback);\n  } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n    return encodeBlob(packet, supportsBinary, callback);\n  }\n\n  // might be an object with { base64: true, data: dataAsBase64String }\n  if (data && data.base64) {\n    return encodeBase64Object(packet, callback);\n  }\n\n  // Sending data as a utf-8 string\n  var encoded = packets[packet.type];\n\n  // data fragment is optional\n  if (undefined !== packet.data) {\n    encoded += utf8encode ? utf8.encode(String(packet.data), { strict: false }) : String(packet.data);\n  }\n\n  return callback('' + encoded);\n\n};\n\nfunction encodeBase64Object(packet, callback) {\n  // packet data is an object { base64: true, data: dataAsBase64String }\n  var message = 'b' + exports.packets[packet.type] + packet.data.data;\n  return callback(message);\n}\n\n/**\n * Encode packet helpers for binary types\n */\n\nfunction encodeArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var data = packet.data;\n  var contentArray = new Uint8Array(data);\n  var resultBuffer = new Uint8Array(1 + data.byteLength);\n\n  resultBuffer[0] = packets[packet.type];\n  for (var i = 0; i < contentArray.length; i++) {\n    resultBuffer[i+1] = contentArray[i];\n  }\n\n  return callback(resultBuffer.buffer);\n}\n\nfunction encodeBlobAsArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var fr = new FileReader();\n  fr.onload = function() {\n    exports.encodePacket({ type: packet.type, data: fr.result }, supportsBinary, true, callback);\n  };\n  return fr.readAsArrayBuffer(packet.data);\n}\n\nfunction encodeBlob(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  if (dontSendBlobs) {\n    return encodeBlobAsArrayBuffer(packet, supportsBinary, callback);\n  }\n\n  var length = new Uint8Array(1);\n  length[0] = packets[packet.type];\n  var blob = new Blob([length.buffer, packet.data]);\n\n  return callback(blob);\n}\n\n/**\n * Encodes a packet with binary data in a base64 string\n *\n * @param {Object} packet, has `type` and `data`\n * @return {String} base64 encoded message\n */\n\nexports.encodeBase64Packet = function(packet, callback) {\n  var message = 'b' + exports.packets[packet.type];\n  if (typeof Blob !== 'undefined' && packet.data instanceof Blob) {\n    var fr = new FileReader();\n    fr.onload = function() {\n      var b64 = fr.result.split(',')[1];\n      callback(message + b64);\n    };\n    return fr.readAsDataURL(packet.data);\n  }\n\n  var b64data;\n  try {\n    b64data = String.fromCharCode.apply(null, new Uint8Array(packet.data));\n  } catch (e) {\n    // iPhone Safari doesn't let you apply with typed arrays\n    var typed = new Uint8Array(packet.data);\n    var basic = new Array(typed.length);\n    for (var i = 0; i < typed.length; i++) {\n      basic[i] = typed[i];\n    }\n    b64data = String.fromCharCode.apply(null, basic);\n  }\n  message += btoa(b64data);\n  return callback(message);\n};\n\n/**\n * Decodes a packet. Changes format to Blob if requested.\n *\n * @return {Object} with `type` and `data` (if any)\n * @api private\n */\n\nexports.decodePacket = function (data, binaryType, utf8decode) {\n  if (data === undefined) {\n    return err;\n  }\n  // String data\n  if (typeof data === 'string') {\n    if (data.charAt(0) === 'b') {\n      return exports.decodeBase64Packet(data.substr(1), binaryType);\n    }\n\n    if (utf8decode) {\n      data = tryDecode(data);\n      if (data === false) {\n        return err;\n      }\n    }\n    var type = data.charAt(0);\n\n    if (Number(type) != type || !packetslist[type]) {\n      return err;\n    }\n\n    if (data.length > 1) {\n      return { type: packetslist[type], data: data.substring(1) };\n    } else {\n      return { type: packetslist[type] };\n    }\n  }\n\n  var asArray = new Uint8Array(data);\n  var type = asArray[0];\n  var rest = sliceBuffer(data, 1);\n  if (Blob && binaryType === 'blob') {\n    rest = new Blob([rest]);\n  }\n  return { type: packetslist[type], data: rest };\n};\n\nfunction tryDecode(data) {\n  try {\n    data = utf8.decode(data, { strict: false });\n  } catch (e) {\n    return false;\n  }\n  return data;\n}\n\n/**\n * Decodes a packet encoded in a base64 string\n *\n * @param {String} base64 encoded message\n * @return {Object} with `type` and `data` (if any)\n */\n\nexports.decodeBase64Packet = function(msg, binaryType) {\n  var type = packetslist[msg.charAt(0)];\n  if (!base64encoder) {\n    return { type: type, data: { base64: true, data: msg.substr(1) } };\n  }\n\n  var data = base64encoder.decode(msg.substr(1));\n\n  if (binaryType === 'blob' && Blob) {\n    data = new Blob([data]);\n  }\n\n  return { type: type, data: data };\n};\n\n/**\n * Encodes multiple messages (payload).\n *\n *     <length>:data\n *\n * Example:\n *\n *     11:hello world2:hi\n *\n * If any contents are binary, they will be encoded as base64 strings. Base64\n * encoded strings are marked with a b before the length specifier\n *\n * @param {Array} packets\n * @api private\n */\n\nexports.encodePayload = function (packets, supportsBinary, callback) {\n  if (typeof supportsBinary === 'function') {\n    callback = supportsBinary;\n    supportsBinary = null;\n  }\n\n  var isBinary = hasBinary(packets);\n\n  if (supportsBinary && isBinary) {\n    if (Blob && !dontSendBlobs) {\n      return exports.encodePayloadAsBlob(packets, callback);\n    }\n\n    return exports.encodePayloadAsArrayBuffer(packets, callback);\n  }\n\n  if (!packets.length) {\n    return callback('0:');\n  }\n\n  function setLengthHeader(message) {\n    return message.length + ':' + message;\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, !isBinary ? false : supportsBinary, false, function(message) {\n      doneCallback(null, setLengthHeader(message));\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(results.join(''));\n  });\n};\n\n/**\n * Async array map using after\n */\n\nfunction map(ary, each, done) {\n  var result = new Array(ary.length);\n  var next = after(ary.length, done);\n\n  var eachWithIndex = function(i, el, cb) {\n    each(el, function(error, msg) {\n      result[i] = msg;\n      cb(error, result);\n    });\n  };\n\n  for (var i = 0; i < ary.length; i++) {\n    eachWithIndex(i, ary[i], next);\n  }\n}\n\n/*\n * Decodes data when a payload is maybe expected. Possible binary contents are\n * decoded from their base64 representation\n *\n * @param {String} data, callback method\n * @api public\n */\n\nexports.decodePayload = function (data, binaryType, callback) {\n  if (typeof data !== 'string') {\n    return exports.decodePayloadAsBinary(data, binaryType, callback);\n  }\n\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var packet;\n  if (data === '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n  var length = '', n, msg;\n\n  for (var i = 0, l = data.length; i < l; i++) {\n    var chr = data.charAt(i);\n\n    if (chr !== ':') {\n      length += chr;\n      continue;\n    }\n\n    if (length === '' || (length != (n = Number(length)))) {\n      // parser error - ignoring payload\n      return callback(err, 0, 1);\n    }\n\n    msg = data.substr(i + 1, n);\n\n    if (length != msg.length) {\n      // parser error - ignoring payload\n      return callback(err, 0, 1);\n    }\n\n    if (msg.length) {\n      packet = exports.decodePacket(msg, binaryType, false);\n\n      if (err.type === packet.type && err.data === packet.data) {\n        // parser error in individual packet - ignoring payload\n        return callback(err, 0, 1);\n      }\n\n      var ret = callback(packet, i + n, l);\n      if (false === ret) return;\n    }\n\n    // advance cursor\n    i += n;\n    length = '';\n  }\n\n  if (length !== '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n};\n\n/**\n * Encodes multiple messages (payload) as binary.\n *\n * <1 = binary, 0 = string><number from 0-9><number from 0-9>[...]<number\n * 255><data>\n *\n * Example:\n * 1 3 255 1 2 3, if the binary contents are interpreted as 8 bit integers\n *\n * @param {Array} packets\n * @return {ArrayBuffer} encoded payload\n * @api private\n */\n\nexports.encodePayloadAsArrayBuffer = function(packets, callback) {\n  if (!packets.length) {\n    return callback(new ArrayBuffer(0));\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(data) {\n      return doneCallback(null, data);\n    });\n  }\n\n  map(packets, encodeOne, function(err, encodedPackets) {\n    var totalLength = encodedPackets.reduce(function(acc, p) {\n      var len;\n      if (typeof p === 'string'){\n        len = p.length;\n      } else {\n        len = p.byteLength;\n      }\n      return acc + len.toString().length + len + 2; // string/binary identifier + separator = 2\n    }, 0);\n\n    var resultArray = new Uint8Array(totalLength);\n\n    var bufferIndex = 0;\n    encodedPackets.forEach(function(p) {\n      var isString = typeof p === 'string';\n      var ab = p;\n      if (isString) {\n        var view = new Uint8Array(p.length);\n        for (var i = 0; i < p.length; i++) {\n          view[i] = p.charCodeAt(i);\n        }\n        ab = view.buffer;\n      }\n\n      if (isString) { // not true binary\n        resultArray[bufferIndex++] = 0;\n      } else { // true binary\n        resultArray[bufferIndex++] = 1;\n      }\n\n      var lenStr = ab.byteLength.toString();\n      for (var i = 0; i < lenStr.length; i++) {\n        resultArray[bufferIndex++] = parseInt(lenStr[i]);\n      }\n      resultArray[bufferIndex++] = 255;\n\n      var view = new Uint8Array(ab);\n      for (var i = 0; i < view.length; i++) {\n        resultArray[bufferIndex++] = view[i];\n      }\n    });\n\n    return callback(resultArray.buffer);\n  });\n};\n\n/**\n * Encode as Blob\n */\n\nexports.encodePayloadAsBlob = function(packets, callback) {\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(encoded) {\n      var binaryIdentifier = new Uint8Array(1);\n      binaryIdentifier[0] = 1;\n      if (typeof encoded === 'string') {\n        var view = new Uint8Array(encoded.length);\n        for (var i = 0; i < encoded.length; i++) {\n          view[i] = encoded.charCodeAt(i);\n        }\n        encoded = view.buffer;\n        binaryIdentifier[0] = 0;\n      }\n\n      var len = (encoded instanceof ArrayBuffer)\n        ? encoded.byteLength\n        : encoded.size;\n\n      var lenStr = len.toString();\n      var lengthAry = new Uint8Array(lenStr.length + 1);\n      for (var i = 0; i < lenStr.length; i++) {\n        lengthAry[i] = parseInt(lenStr[i]);\n      }\n      lengthAry[lenStr.length] = 255;\n\n      if (Blob) {\n        var blob = new Blob([binaryIdentifier.buffer, lengthAry.buffer, encoded]);\n        doneCallback(null, blob);\n      }\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(new Blob(results));\n  });\n};\n\n/*\n * Decodes data when a payload is maybe expected. Strings are decoded by\n * interpreting each byte as a key code for entries marked to start with 0. See\n * description of encodePayloadAsBinary\n *\n * @param {ArrayBuffer} data, callback method\n * @api public\n */\n\nexports.decodePayloadAsBinary = function (data, binaryType, callback) {\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var bufferTail = data;\n  var buffers = [];\n\n  while (bufferTail.byteLength > 0) {\n    var tailArray = new Uint8Array(bufferTail);\n    var isString = tailArray[0] === 0;\n    var msgLength = '';\n\n    for (var i = 1; ; i++) {\n      if (tailArray[i] === 255) break;\n\n      // 310 = char length of Number.MAX_VALUE\n      if (msgLength.length > 310) {\n        return callback(err, 0, 1);\n      }\n\n      msgLength += tailArray[i];\n    }\n\n    bufferTail = sliceBuffer(bufferTail, 2 + msgLength.length);\n    msgLength = parseInt(msgLength);\n\n    var msg = sliceBuffer(bufferTail, 0, msgLength);\n    if (isString) {\n      try {\n        msg = String.fromCharCode.apply(null, new Uint8Array(msg));\n      } catch (e) {\n        // iPhone Safari doesn't let you apply to typed arrays\n        var typed = new Uint8Array(msg);\n        msg = '';\n        for (var i = 0; i < typed.length; i++) {\n          msg += String.fromCharCode(typed[i]);\n        }\n      }\n    }\n\n    buffers.push(msg);\n    bufferTail = sliceBuffer(bufferTail, msgLength);\n  }\n\n  var total = buffers.length;\n  buffers.forEach(function(buffer, i) {\n    callback(exports.decodePacket(buffer, binaryType, true), i, total);\n  });\n};\n","\n/**\n * Gets the keys for an object.\n *\n * @return {Array} keys\n * @api private\n */\n\nmodule.exports = Object.keys || function keys (obj){\n  var arr = [];\n  var has = Object.prototype.hasOwnProperty;\n\n  for (var i in obj) {\n    if (has.call(obj, i)) {\n      arr.push(i);\n    }\n  }\n  return arr;\n};\n","/*! https://mths.be/utf8js v2.1.2 by @mathias */\n\nvar stringFromCharCode = String.fromCharCode;\n\n// Taken from https://mths.be/punycode\nfunction ucs2decode(string) {\n\tvar output = [];\n\tvar counter = 0;\n\tvar length = string.length;\n\tvar value;\n\tvar extra;\n\twhile (counter < length) {\n\t\tvalue = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// high surrogate, and there is a next character\n\t\t\textra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n// Taken from https://mths.be/punycode\nfunction ucs2encode(array) {\n\tvar length = array.length;\n\tvar index = -1;\n\tvar value;\n\tvar output = '';\n\twhile (++index < length) {\n\t\tvalue = array[index];\n\t\tif (value > 0xFFFF) {\n\t\t\tvalue -= 0x10000;\n\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t}\n\t\toutput += stringFromCharCode(value);\n\t}\n\treturn output;\n}\n\nfunction checkScalarValue(codePoint, strict) {\n\tif (codePoint >= 0xD800 && codePoint <= 0xDFFF) {\n\t\tif (strict) {\n\t\t\tthrow Error(\n\t\t\t\t'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +\n\t\t\t\t' is not a scalar value'\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t}\n\treturn true;\n}\n/*--------------------------------------------------------------------------*/\n\nfunction createByte(codePoint, shift) {\n\treturn stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n}\n\nfunction encodeCodePoint(codePoint, strict) {\n\tif ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n\t\treturn stringFromCharCode(codePoint);\n\t}\n\tvar symbol = '';\n\tif ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n\t\tsymbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n\t}\n\telse if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n\t\tif (!checkScalarValue(codePoint, strict)) {\n\t\t\tcodePoint = 0xFFFD;\n\t\t}\n\t\tsymbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n\t\tsymbol += createByte(codePoint, 6);\n\t}\n\telse if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n\t\tsymbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n\t\tsymbol += createByte(codePoint, 12);\n\t\tsymbol += createByte(codePoint, 6);\n\t}\n\tsymbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n\treturn symbol;\n}\n\nfunction utf8encode(string, opts) {\n\topts = opts || {};\n\tvar strict = false !== opts.strict;\n\n\tvar codePoints = ucs2decode(string);\n\tvar length = codePoints.length;\n\tvar index = -1;\n\tvar codePoint;\n\tvar byteString = '';\n\twhile (++index < length) {\n\t\tcodePoint = codePoints[index];\n\t\tbyteString += encodeCodePoint(codePoint, strict);\n\t}\n\treturn byteString;\n}\n\n/*--------------------------------------------------------------------------*/\n\nfunction readContinuationByte() {\n\tif (byteIndex >= byteCount) {\n\t\tthrow Error('Invalid byte index');\n\t}\n\n\tvar continuationByte = byteArray[byteIndex] & 0xFF;\n\tbyteIndex++;\n\n\tif ((continuationByte & 0xC0) == 0x80) {\n\t\treturn continuationByte & 0x3F;\n\t}\n\n\t// If we end up here, it’s not a continuation byte\n\tthrow Error('Invalid continuation byte');\n}\n\nfunction decodeSymbol(strict) {\n\tvar byte1;\n\tvar byte2;\n\tvar byte3;\n\tvar byte4;\n\tvar codePoint;\n\n\tif (byteIndex > byteCount) {\n\t\tthrow Error('Invalid byte index');\n\t}\n\n\tif (byteIndex == byteCount) {\n\t\treturn false;\n\t}\n\n\t// Read first byte\n\tbyte1 = byteArray[byteIndex] & 0xFF;\n\tbyteIndex++;\n\n\t// 1-byte sequence (no continuation bytes)\n\tif ((byte1 & 0x80) == 0) {\n\t\treturn byte1;\n\t}\n\n\t// 2-byte sequence\n\tif ((byte1 & 0xE0) == 0xC0) {\n\t\tbyte2 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x1F) << 6) | byte2;\n\t\tif (codePoint >= 0x80) {\n\t\t\treturn codePoint;\n\t\t} else {\n\t\t\tthrow Error('Invalid continuation byte');\n\t\t}\n\t}\n\n\t// 3-byte sequence (may include unpaired surrogates)\n\tif ((byte1 & 0xF0) == 0xE0) {\n\t\tbyte2 = readContinuationByte();\n\t\tbyte3 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n\t\tif (codePoint >= 0x0800) {\n\t\t\treturn checkScalarValue(codePoint, strict) ? codePoint : 0xFFFD;\n\t\t} else {\n\t\t\tthrow Error('Invalid continuation byte');\n\t\t}\n\t}\n\n\t// 4-byte sequence\n\tif ((byte1 & 0xF8) == 0xF0) {\n\t\tbyte2 = readContinuationByte();\n\t\tbyte3 = readContinuationByte();\n\t\tbyte4 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |\n\t\t\t(byte3 << 0x06) | byte4;\n\t\tif (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n\t\t\treturn codePoint;\n\t\t}\n\t}\n\n\tthrow Error('Invalid UTF-8 detected');\n}\n\nvar byteArray;\nvar byteCount;\nvar byteIndex;\nfunction utf8decode(byteString, opts) {\n\topts = opts || {};\n\tvar strict = false !== opts.strict;\n\n\tbyteArray = ucs2decode(byteString);\n\tbyteCount = byteArray.length;\n\tbyteIndex = 0;\n\tvar codePoints = [];\n\tvar tmp;\n\twhile ((tmp = decodeSymbol(strict)) !== false) {\n\t\tcodePoints.push(tmp);\n\t}\n\treturn ucs2encode(codePoints);\n}\n\nmodule.exports = {\n\tversion: '2.1.2',\n\tencode: utf8encode,\n\tdecode: utf8decode\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        // At least give some kind of context to the user\n        var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n        err.context = er;\n        throw err;\n      }\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    args = Array.prototype.slice.call(arguments, 1);\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (listeners) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n  if (this._events) {\n    var evlistener = this._events[type];\n\n    if (isFunction(evlistener))\n      return 1;\n    else if (evlistener)\n      return evlistener.length;\n  }\n  return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n","/* global Blob File */\n\n/*\n * Module requirements.\n */\n\nvar isArray = require('isarray');\n\nvar toString = Object.prototype.toString;\nvar withNativeBlob = typeof Blob === 'function' ||\n                        typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]';\nvar withNativeFile = typeof File === 'function' ||\n                        typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]';\n\n/**\n * Module exports.\n */\n\nmodule.exports = hasBinary;\n\n/**\n * Checks for binary data.\n *\n * Supports Buffer, ArrayBuffer, Blob and File.\n *\n * @param {Object} anything\n * @api public\n */\n\nfunction hasBinary (obj) {\n  if (!obj || typeof obj !== 'object') {\n    return false;\n  }\n\n  if (isArray(obj)) {\n    for (var i = 0, l = obj.length; i < l; i++) {\n      if (hasBinary(obj[i])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  if ((typeof Buffer === 'function' && Buffer.isBuffer && Buffer.isBuffer(obj)) ||\n    (typeof ArrayBuffer === 'function' && obj instanceof ArrayBuffer) ||\n    (withNativeBlob && obj instanceof Blob) ||\n    (withNativeFile && obj instanceof File)\n  ) {\n    return true;\n  }\n\n  // see: https://github.com/Automattic/has-binary/pull/4\n  if (obj.toJSON && typeof obj.toJSON === 'function' && arguments.length === 1) {\n    return hasBinary(obj.toJSON(), true);\n  }\n\n  for (var key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n      return true;\n    }\n  }\n\n  return false;\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n","\n/**\n * Module exports.\n *\n * Logic borrowed from Modernizr:\n *\n *   - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js\n */\n\ntry {\n  module.exports = typeof XMLHttpRequest !== 'undefined' &&\n    'withCredentials' in new XMLHttpRequest();\n} catch (err) {\n  // if XMLHttp support is disabled in IE then it will throw\n  // when trying to create\n  module.exports = false;\n}\n","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n","\nvar indexOf = [].indexOf;\n\nmodule.exports = function(arr, obj){\n  if (indexOf) return arr.indexOf(obj);\n  for (var i = 0; i < arr.length; ++i) {\n    if (arr[i] === obj) return i;\n  }\n  return -1;\n};","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isNaN(val) === false) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  if (ms >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (ms >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (ms >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (ms >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  return plural(ms, d, 'day') ||\n    plural(ms, h, 'hour') ||\n    plural(ms, m, 'minute') ||\n    plural(ms, s, 'second') ||\n    ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n  if (ms < n) {\n    return;\n  }\n  if (ms < n * 1.5) {\n    return Math.floor(ms / n) + ' ' + name;\n  }\n  return Math.ceil(ms / n) + ' ' + name + 's';\n}\n","/**\r\n * Compiles a querystring\r\n * Returns string representation of the object\r\n *\r\n * @param {Object}\r\n * @api private\r\n */\r\n\r\nexports.encode = function (obj) {\r\n  var str = '';\r\n\r\n  for (var i in obj) {\r\n    if (obj.hasOwnProperty(i)) {\r\n      if (str.length) str += '&';\r\n      str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\r\n    }\r\n  }\r\n\r\n  return str;\r\n};\r\n\r\n/**\r\n * Parses a simple querystring into an object\r\n *\r\n * @param {String} qs\r\n * @api private\r\n */\r\n\r\nexports.decode = function(qs){\r\n  var qry = {};\r\n  var pairs = qs.split('&');\r\n  for (var i = 0, l = pairs.length; i < l; i++) {\r\n    var pair = pairs[i].split('=');\r\n    qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\r\n  }\r\n  return qry;\r\n};\r\n","/**\r\n * Parses an URI\r\n *\r\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\r\n * @api private\r\n */\r\n\r\nvar re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\r\n\r\nvar parts = [\r\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\r\n];\r\n\r\nmodule.exports = function parseuri(str) {\r\n    var src = str,\r\n        b = str.indexOf('['),\r\n        e = str.indexOf(']');\r\n\r\n    if (b != -1 && e != -1) {\r\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\r\n    }\r\n\r\n    var m = re.exec(str || ''),\r\n        uri = {},\r\n        i = 14;\r\n\r\n    while (i--) {\r\n        uri[parts[i]] = m[i] || '';\r\n    }\r\n\r\n    if (b != -1 && e != -1) {\r\n        uri.source = src;\r\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\r\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\r\n        uri.ipv6uri = true;\r\n    }\r\n\r\n    return uri;\r\n};\r\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","\n/**\n * Module dependencies.\n */\n\nvar url = require('./url');\nvar parser = require('socket.io-parser');\nvar Manager = require('./manager');\nvar debug = require('debug')('socket.io-client');\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = lookup;\n\n/**\n * Managers cache.\n */\n\nvar cache = exports.managers = {};\n\n/**\n * Looks up an existing `Manager` for multiplexing.\n * If the user summons:\n *\n *   `io('http://localhost/a');`\n *   `io('http://localhost/b');`\n *\n * We reuse the existing instance based on same scheme/port/host,\n * and we initialize sockets for each namespace.\n *\n * @api public\n */\n\nfunction lookup (uri, opts) {\n  if (typeof uri === 'object') {\n    opts = uri;\n    uri = undefined;\n  }\n\n  opts = opts || {};\n\n  var parsed = url(uri);\n  var source = parsed.source;\n  var id = parsed.id;\n  var path = parsed.path;\n  var sameNamespace = cache[id] && path in cache[id].nsps;\n  var newConnection = opts.forceNew || opts['force new connection'] ||\n                      false === opts.multiplex || sameNamespace;\n\n  var io;\n\n  if (newConnection) {\n    debug('ignoring socket cache for %s', source);\n    io = Manager(source, opts);\n  } else {\n    if (!cache[id]) {\n      debug('new io instance for %s', source);\n      cache[id] = Manager(source, opts);\n    }\n    io = cache[id];\n  }\n  if (parsed.query && !opts.query) {\n    opts.query = parsed.query;\n  }\n  return io.socket(parsed.path, opts);\n}\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = parser.protocol;\n\n/**\n * `connect`.\n *\n * @param {String} uri\n * @api public\n */\n\nexports.connect = lookup;\n\n/**\n * Expose constructors for standalone build.\n *\n * @api public\n */\n\nexports.Manager = require('./manager');\nexports.Socket = require('./socket');\n","\n/**\n * Module dependencies.\n */\n\nvar eio = require('engine.io-client');\nvar Socket = require('./socket');\nvar Emitter = require('component-emitter');\nvar parser = require('socket.io-parser');\nvar on = require('./on');\nvar bind = require('component-bind');\nvar debug = require('debug')('socket.io-client:manager');\nvar indexOf = require('indexof');\nvar Backoff = require('backo2');\n\n/**\n * IE6+ hasOwnProperty\n */\n\nvar has = Object.prototype.hasOwnProperty;\n\n/**\n * Module exports\n */\n\nmodule.exports = Manager;\n\n/**\n * `Manager` constructor.\n *\n * @param {String} engine instance or engine uri/opts\n * @param {Object} options\n * @api public\n */\n\nfunction Manager (uri, opts) {\n  if (!(this instanceof Manager)) return new Manager(uri, opts);\n  if (uri && ('object' === typeof uri)) {\n    opts = uri;\n    uri = undefined;\n  }\n  opts = opts || {};\n\n  opts.path = opts.path || '/socket.io';\n  this.nsps = {};\n  this.subs = [];\n  this.opts = opts;\n  this.reconnection(opts.reconnection !== false);\n  this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n  this.reconnectionDelay(opts.reconnectionDelay || 1000);\n  this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n  this.randomizationFactor(opts.randomizationFactor || 0.5);\n  this.backoff = new Backoff({\n    min: this.reconnectionDelay(),\n    max: this.reconnectionDelayMax(),\n    jitter: this.randomizationFactor()\n  });\n  this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n  this.readyState = 'closed';\n  this.uri = uri;\n  this.connecting = [];\n  this.lastPing = null;\n  this.encoding = false;\n  this.packetBuffer = [];\n  var _parser = opts.parser || parser;\n  this.encoder = new _parser.Encoder();\n  this.decoder = new _parser.Decoder();\n  this.autoConnect = opts.autoConnect !== false;\n  if (this.autoConnect) this.open();\n}\n\n/**\n * Propagate given event to sockets and emit on `this`\n *\n * @api private\n */\n\nManager.prototype.emitAll = function () {\n  this.emit.apply(this, arguments);\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);\n    }\n  }\n};\n\n/**\n * Update `socket.id` of all sockets\n *\n * @api private\n */\n\nManager.prototype.updateSocketIds = function () {\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].id = this.generateId(nsp);\n    }\n  }\n};\n\n/**\n * generate `socket.id` for the given `nsp`\n *\n * @param {String} nsp\n * @return {String}\n * @api private\n */\n\nManager.prototype.generateId = function (nsp) {\n  return (nsp === '/' ? '' : (nsp + '#')) + this.engine.id;\n};\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Manager.prototype);\n\n/**\n * Sets the `reconnection` config.\n *\n * @param {Boolean} true/false if it should automatically reconnect\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnection = function (v) {\n  if (!arguments.length) return this._reconnection;\n  this._reconnection = !!v;\n  return this;\n};\n\n/**\n * Sets the reconnection attempts config.\n *\n * @param {Number} max reconnection attempts before giving up\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionAttempts = function (v) {\n  if (!arguments.length) return this._reconnectionAttempts;\n  this._reconnectionAttempts = v;\n  return this;\n};\n\n/**\n * Sets the delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelay = function (v) {\n  if (!arguments.length) return this._reconnectionDelay;\n  this._reconnectionDelay = v;\n  this.backoff && this.backoff.setMin(v);\n  return this;\n};\n\nManager.prototype.randomizationFactor = function (v) {\n  if (!arguments.length) return this._randomizationFactor;\n  this._randomizationFactor = v;\n  this.backoff && this.backoff.setJitter(v);\n  return this;\n};\n\n/**\n * Sets the maximum delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelayMax = function (v) {\n  if (!arguments.length) return this._reconnectionDelayMax;\n  this._reconnectionDelayMax = v;\n  this.backoff && this.backoff.setMax(v);\n  return this;\n};\n\n/**\n * Sets the connection timeout. `false` to disable\n *\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.timeout = function (v) {\n  if (!arguments.length) return this._timeout;\n  this._timeout = v;\n  return this;\n};\n\n/**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @api private\n */\n\nManager.prototype.maybeReconnectOnOpen = function () {\n  // Only try to reconnect if it's the first time we're connecting\n  if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {\n    // keeps reconnection from firing twice for the same reconnection loop\n    this.reconnect();\n  }\n};\n\n/**\n * Sets the current transport `socket`.\n *\n * @param {Function} optional, callback\n * @return {Manager} self\n * @api public\n */\n\nManager.prototype.open =\nManager.prototype.connect = function (fn, opts) {\n  debug('readyState %s', this.readyState);\n  if (~this.readyState.indexOf('open')) return this;\n\n  debug('opening %s', this.uri);\n  this.engine = eio(this.uri, this.opts);\n  var socket = this.engine;\n  var self = this;\n  this.readyState = 'opening';\n  this.skipReconnect = false;\n\n  // emit `open`\n  var openSub = on(socket, 'open', function () {\n    self.onopen();\n    fn && fn();\n  });\n\n  // emit `connect_error`\n  var errorSub = on(socket, 'error', function (data) {\n    debug('connect_error');\n    self.cleanup();\n    self.readyState = 'closed';\n    self.emitAll('connect_error', data);\n    if (fn) {\n      var err = new Error('Connection error');\n      err.data = data;\n      fn(err);\n    } else {\n      // Only do this if there is no fn to handle the error\n      self.maybeReconnectOnOpen();\n    }\n  });\n\n  // emit `connect_timeout`\n  if (false !== this._timeout) {\n    var timeout = this._timeout;\n    debug('connect attempt will timeout after %d', timeout);\n\n    // set timer\n    var timer = setTimeout(function () {\n      debug('connect attempt timed out after %d', timeout);\n      openSub.destroy();\n      socket.close();\n      socket.emit('error', 'timeout');\n      self.emitAll('connect_timeout', timeout);\n    }, timeout);\n\n    this.subs.push({\n      destroy: function () {\n        clearTimeout(timer);\n      }\n    });\n  }\n\n  this.subs.push(openSub);\n  this.subs.push(errorSub);\n\n  return this;\n};\n\n/**\n * Called upon transport open.\n *\n * @api private\n */\n\nManager.prototype.onopen = function () {\n  debug('open');\n\n  // clear old subs\n  this.cleanup();\n\n  // mark as open\n  this.readyState = 'open';\n  this.emit('open');\n\n  // add new subs\n  var socket = this.engine;\n  this.subs.push(on(socket, 'data', bind(this, 'ondata')));\n  this.subs.push(on(socket, 'ping', bind(this, 'onping')));\n  this.subs.push(on(socket, 'pong', bind(this, 'onpong')));\n  this.subs.push(on(socket, 'error', bind(this, 'onerror')));\n  this.subs.push(on(socket, 'close', bind(this, 'onclose')));\n  this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));\n};\n\n/**\n * Called upon a ping.\n *\n * @api private\n */\n\nManager.prototype.onping = function () {\n  this.lastPing = new Date();\n  this.emitAll('ping');\n};\n\n/**\n * Called upon a packet.\n *\n * @api private\n */\n\nManager.prototype.onpong = function () {\n  this.emitAll('pong', new Date() - this.lastPing);\n};\n\n/**\n * Called with data.\n *\n * @api private\n */\n\nManager.prototype.ondata = function (data) {\n  this.decoder.add(data);\n};\n\n/**\n * Called when parser fully decodes a packet.\n *\n * @api private\n */\n\nManager.prototype.ondecoded = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon socket error.\n *\n * @api private\n */\n\nManager.prototype.onerror = function (err) {\n  debug('error', err);\n  this.emitAll('error', err);\n};\n\n/**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @api public\n */\n\nManager.prototype.socket = function (nsp, opts) {\n  var socket = this.nsps[nsp];\n  if (!socket) {\n    socket = new Socket(this, nsp, opts);\n    this.nsps[nsp] = socket;\n    var self = this;\n    socket.on('connecting', onConnecting);\n    socket.on('connect', function () {\n      socket.id = self.generateId(nsp);\n    });\n\n    if (this.autoConnect) {\n      // manually call here since connecting event is fired before listening\n      onConnecting();\n    }\n  }\n\n  function onConnecting () {\n    if (!~indexOf(self.connecting, socket)) {\n      self.connecting.push(socket);\n    }\n  }\n\n  return socket;\n};\n\n/**\n * Called upon a socket close.\n *\n * @param {Socket} socket\n */\n\nManager.prototype.destroy = function (socket) {\n  var index = indexOf(this.connecting, socket);\n  if (~index) this.connecting.splice(index, 1);\n  if (this.connecting.length) return;\n\n  this.close();\n};\n\n/**\n * Writes a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nManager.prototype.packet = function (packet) {\n  debug('writing packet %j', packet);\n  var self = this;\n  if (packet.query && packet.type === 0) packet.nsp += '?' + packet.query;\n\n  if (!self.encoding) {\n    // encode, then write to engine with result\n    self.encoding = true;\n    this.encoder.encode(packet, function (encodedPackets) {\n      for (var i = 0; i < encodedPackets.length; i++) {\n        self.engine.write(encodedPackets[i], packet.options);\n      }\n      self.encoding = false;\n      self.processPacketQueue();\n    });\n  } else { // add packet to the queue\n    self.packetBuffer.push(packet);\n  }\n};\n\n/**\n * If packet buffer is non-empty, begins encoding the\n * next packet in line.\n *\n * @api private\n */\n\nManager.prototype.processPacketQueue = function () {\n  if (this.packetBuffer.length > 0 && !this.encoding) {\n    var pack = this.packetBuffer.shift();\n    this.packet(pack);\n  }\n};\n\n/**\n * Clean up transport subscriptions and packet buffer.\n *\n * @api private\n */\n\nManager.prototype.cleanup = function () {\n  debug('cleanup');\n\n  var subsLength = this.subs.length;\n  for (var i = 0; i < subsLength; i++) {\n    var sub = this.subs.shift();\n    sub.destroy();\n  }\n\n  this.packetBuffer = [];\n  this.encoding = false;\n  this.lastPing = null;\n\n  this.decoder.destroy();\n};\n\n/**\n * Close the current socket.\n *\n * @api private\n */\n\nManager.prototype.close =\nManager.prototype.disconnect = function () {\n  debug('disconnect');\n  this.skipReconnect = true;\n  this.reconnecting = false;\n  if ('opening' === this.readyState) {\n    // `onclose` will not fire because\n    // an open event never happened\n    this.cleanup();\n  }\n  this.backoff.reset();\n  this.readyState = 'closed';\n  if (this.engine) this.engine.close();\n};\n\n/**\n * Called upon engine close.\n *\n * @api private\n */\n\nManager.prototype.onclose = function (reason) {\n  debug('onclose');\n\n  this.cleanup();\n  this.backoff.reset();\n  this.readyState = 'closed';\n  this.emit('close', reason);\n\n  if (this._reconnection && !this.skipReconnect) {\n    this.reconnect();\n  }\n};\n\n/**\n * Attempt a reconnection.\n *\n * @api private\n */\n\nManager.prototype.reconnect = function () {\n  if (this.reconnecting || this.skipReconnect) return this;\n\n  var self = this;\n\n  if (this.backoff.attempts >= this._reconnectionAttempts) {\n    debug('reconnect failed');\n    this.backoff.reset();\n    this.emitAll('reconnect_failed');\n    this.reconnecting = false;\n  } else {\n    var delay = this.backoff.duration();\n    debug('will wait %dms before reconnect attempt', delay);\n\n    this.reconnecting = true;\n    var timer = setTimeout(function () {\n      if (self.skipReconnect) return;\n\n      debug('attempting reconnect');\n      self.emitAll('reconnect_attempt', self.backoff.attempts);\n      self.emitAll('reconnecting', self.backoff.attempts);\n\n      // check again for the case socket closed in above events\n      if (self.skipReconnect) return;\n\n      self.open(function (err) {\n        if (err) {\n          debug('reconnect attempt error');\n          self.reconnecting = false;\n          self.reconnect();\n          self.emitAll('reconnect_error', err.data);\n        } else {\n          debug('reconnect success');\n          self.onreconnect();\n        }\n      });\n    }, delay);\n\n    this.subs.push({\n      destroy: function () {\n        clearTimeout(timer);\n      }\n    });\n  }\n};\n\n/**\n * Called upon successful reconnect.\n *\n * @api private\n */\n\nManager.prototype.onreconnect = function () {\n  var attempt = this.backoff.attempts;\n  this.reconnecting = false;\n  this.backoff.reset();\n  this.updateSocketIds();\n  this.emitAll('reconnect', attempt);\n};\n","\n/**\n * Module exports.\n */\n\nmodule.exports = on;\n\n/**\n * Helper for subscriptions.\n *\n * @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`\n * @param {String} event name\n * @param {Function} callback\n * @api public\n */\n\nfunction on (obj, ev, fn) {\n  obj.on(ev, fn);\n  return {\n    destroy: function () {\n      obj.removeListener(ev, fn);\n    }\n  };\n}\n","\n/**\n * Module dependencies.\n */\n\nvar parser = require('socket.io-parser');\nvar Emitter = require('component-emitter');\nvar toArray = require('to-array');\nvar on = require('./on');\nvar bind = require('component-bind');\nvar debug = require('debug')('socket.io-client:socket');\nvar parseqs = require('parseqs');\nvar hasBin = require('has-binary2');\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = Socket;\n\n/**\n * Internal events (blacklisted).\n * These events can't be emitted by the user.\n *\n * @api private\n */\n\nvar events = {\n  connect: 1,\n  connect_error: 1,\n  connect_timeout: 1,\n  connecting: 1,\n  disconnect: 1,\n  error: 1,\n  reconnect: 1,\n  reconnect_attempt: 1,\n  reconnect_failed: 1,\n  reconnect_error: 1,\n  reconnecting: 1,\n  ping: 1,\n  pong: 1\n};\n\n/**\n * Shortcut to `Emitter#emit`.\n */\n\nvar emit = Emitter.prototype.emit;\n\n/**\n * `Socket` constructor.\n *\n * @api public\n */\n\nfunction Socket (io, nsp, opts) {\n  this.io = io;\n  this.nsp = nsp;\n  this.json = this; // compat\n  this.ids = 0;\n  this.acks = {};\n  this.receiveBuffer = [];\n  this.sendBuffer = [];\n  this.connected = false;\n  this.disconnected = true;\n  this.flags = {};\n  if (opts && opts.query) {\n    this.query = opts.query;\n  }\n  if (this.io.autoConnect) this.open();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Subscribe to open, close and packet events\n *\n * @api private\n */\n\nSocket.prototype.subEvents = function () {\n  if (this.subs) return;\n\n  var io = this.io;\n  this.subs = [\n    on(io, 'open', bind(this, 'onopen')),\n    on(io, 'packet', bind(this, 'onpacket')),\n    on(io, 'close', bind(this, 'onclose'))\n  ];\n};\n\n/**\n * \"Opens\" the socket.\n *\n * @api public\n */\n\nSocket.prototype.open =\nSocket.prototype.connect = function () {\n  if (this.connected) return this;\n\n  this.subEvents();\n  this.io.open(); // ensure open\n  if ('open' === this.io.readyState) this.onopen();\n  this.emit('connecting');\n  return this;\n};\n\n/**\n * Sends a `message` event.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.send = function () {\n  var args = toArray(arguments);\n  args.unshift('message');\n  this.emit.apply(this, args);\n  return this;\n};\n\n/**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @param {String} event name\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.emit = function (ev) {\n  if (events.hasOwnProperty(ev)) {\n    emit.apply(this, arguments);\n    return this;\n  }\n\n  var args = toArray(arguments);\n  var packet = {\n    type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) ? parser.BINARY_EVENT : parser.EVENT,\n    data: args\n  };\n\n  packet.options = {};\n  packet.options.compress = !this.flags || false !== this.flags.compress;\n\n  // event ack callback\n  if ('function' === typeof args[args.length - 1]) {\n    debug('emitting packet with ack id %d', this.ids);\n    this.acks[this.ids] = args.pop();\n    packet.id = this.ids++;\n  }\n\n  if (this.connected) {\n    this.packet(packet);\n  } else {\n    this.sendBuffer.push(packet);\n  }\n\n  this.flags = {};\n\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.packet = function (packet) {\n  packet.nsp = this.nsp;\n  this.io.packet(packet);\n};\n\n/**\n * Called upon engine `open`.\n *\n * @api private\n */\n\nSocket.prototype.onopen = function () {\n  debug('transport is open - connecting');\n\n  // write connect packet if necessary\n  if ('/' !== this.nsp) {\n    if (this.query) {\n      var query = typeof this.query === 'object' ? parseqs.encode(this.query) : this.query;\n      debug('sending connect packet with query %s', query);\n      this.packet({type: parser.CONNECT, query: query});\n    } else {\n      this.packet({type: parser.CONNECT});\n    }\n  }\n};\n\n/**\n * Called upon engine `close`.\n *\n * @param {String} reason\n * @api private\n */\n\nSocket.prototype.onclose = function (reason) {\n  debug('close (%s)', reason);\n  this.connected = false;\n  this.disconnected = true;\n  delete this.id;\n  this.emit('disconnect', reason);\n};\n\n/**\n * Called with socket packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onpacket = function (packet) {\n  var sameNamespace = packet.nsp === this.nsp;\n  var rootNamespaceError = packet.type === parser.ERROR && packet.nsp === '/';\n\n  if (!sameNamespace && !rootNamespaceError) return;\n\n  switch (packet.type) {\n    case parser.CONNECT:\n      this.onconnect();\n      break;\n\n    case parser.EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.BINARY_EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.ACK:\n      this.onack(packet);\n      break;\n\n    case parser.BINARY_ACK:\n      this.onack(packet);\n      break;\n\n    case parser.DISCONNECT:\n      this.ondisconnect();\n      break;\n\n    case parser.ERROR:\n      this.emit('error', packet.data);\n      break;\n  }\n};\n\n/**\n * Called upon a server event.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onevent = function (packet) {\n  var args = packet.data || [];\n  debug('emitting event %j', args);\n\n  if (null != packet.id) {\n    debug('attaching ack callback to event');\n    args.push(this.ack(packet.id));\n  }\n\n  if (this.connected) {\n    emit.apply(this, args);\n  } else {\n    this.receiveBuffer.push(args);\n  }\n};\n\n/**\n * Produces an ack callback to emit with an event.\n *\n * @api private\n */\n\nSocket.prototype.ack = function (id) {\n  var self = this;\n  var sent = false;\n  return function () {\n    // prevent double callbacks\n    if (sent) return;\n    sent = true;\n    var args = toArray(arguments);\n    debug('sending ack %j', args);\n\n    self.packet({\n      type: hasBin(args) ? parser.BINARY_ACK : parser.ACK,\n      id: id,\n      data: args\n    });\n  };\n};\n\n/**\n * Called upon a server acknowlegement.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onack = function (packet) {\n  var ack = this.acks[packet.id];\n  if ('function' === typeof ack) {\n    debug('calling ack %s with %j', packet.id, packet.data);\n    ack.apply(this, packet.data);\n    delete this.acks[packet.id];\n  } else {\n    debug('bad ack %s', packet.id);\n  }\n};\n\n/**\n * Called upon server connect.\n *\n * @api private\n */\n\nSocket.prototype.onconnect = function () {\n  this.connected = true;\n  this.disconnected = false;\n  this.emit('connect');\n  this.emitBuffered();\n};\n\n/**\n * Emit buffered events (received and emitted).\n *\n * @api private\n */\n\nSocket.prototype.emitBuffered = function () {\n  var i;\n  for (i = 0; i < this.receiveBuffer.length; i++) {\n    emit.apply(this, this.receiveBuffer[i]);\n  }\n  this.receiveBuffer = [];\n\n  for (i = 0; i < this.sendBuffer.length; i++) {\n    this.packet(this.sendBuffer[i]);\n  }\n  this.sendBuffer = [];\n};\n\n/**\n * Called upon server disconnect.\n *\n * @api private\n */\n\nSocket.prototype.ondisconnect = function () {\n  debug('server disconnect (%s)', this.nsp);\n  this.destroy();\n  this.onclose('io server disconnect');\n};\n\n/**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @api private.\n */\n\nSocket.prototype.destroy = function () {\n  if (this.subs) {\n    // clean subscriptions to avoid reconnections\n    for (var i = 0; i < this.subs.length; i++) {\n      this.subs[i].destroy();\n    }\n    this.subs = null;\n  }\n\n  this.io.destroy(this);\n};\n\n/**\n * Disconnects the socket manually.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.close =\nSocket.prototype.disconnect = function () {\n  if (this.connected) {\n    debug('performing disconnect (%s)', this.nsp);\n    this.packet({ type: parser.DISCONNECT });\n  }\n\n  // remove socket from pool\n  this.destroy();\n\n  if (this.connected) {\n    // fire events\n    this.onclose('io client disconnect');\n  }\n  return this;\n};\n\n/**\n * Sets the compress flag.\n *\n * @param {Boolean} if `true`, compresses the sending data\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.compress = function (compress) {\n  this.flags.compress = compress;\n  return this;\n};\n\n/**\n * Sets the binary flag\n *\n * @param {Boolean} whether the emitted data contains binary\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.binary = function (binary) {\n  this.flags.binary = binary;\n  return this;\n};\n","\n/**\n * Module dependencies.\n */\n\nvar parseuri = require('parseuri');\nvar debug = require('debug')('socket.io-client:url');\n\n/**\n * Module exports.\n */\n\nmodule.exports = url;\n\n/**\n * URL parser.\n *\n * @param {String} url\n * @param {Object} An object meant to mimic window.location.\n *                 Defaults to window.location.\n * @api public\n */\n\nfunction url (uri, loc) {\n  var obj = uri;\n\n  // default to window.location\n  loc = loc || (typeof location !== 'undefined' && location);\n  if (null == uri) uri = loc.protocol + '//' + loc.host;\n\n  // relative path support\n  if ('string' === typeof uri) {\n    if ('/' === uri.charAt(0)) {\n      if ('/' === uri.charAt(1)) {\n        uri = loc.protocol + uri;\n      } else {\n        uri = loc.host + uri;\n      }\n    }\n\n    if (!/^(https?|wss?):\\/\\//.test(uri)) {\n      debug('protocol-less url %s', uri);\n      if ('undefined' !== typeof loc) {\n        uri = loc.protocol + '//' + uri;\n      } else {\n        uri = 'https://' + uri;\n      }\n    }\n\n    // parse\n    debug('parse %s', uri);\n    obj = parseuri(uri);\n  }\n\n  // make sure we treat `localhost:80` and `localhost` equally\n  if (!obj.port) {\n    if (/^(http|ws)$/.test(obj.protocol)) {\n      obj.port = '80';\n    } else if (/^(http|ws)s$/.test(obj.protocol)) {\n      obj.port = '443';\n    }\n  }\n\n  obj.path = obj.path || '/';\n\n  var ipv6 = obj.host.indexOf(':') !== -1;\n  var host = ipv6 ? '[' + obj.host + ']' : obj.host;\n\n  // define unique id\n  obj.id = obj.protocol + '://' + host + ':' + obj.port;\n  // define href\n  obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : (':' + obj.port));\n\n  return obj;\n}\n","/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n               && 'undefined' != typeof chrome.storage\n                  ? chrome.storage.local\n                  : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n  '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',\n  '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',\n  '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',\n  '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',\n  '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',\n  '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',\n  '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',\n  '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',\n  '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',\n  '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',\n  '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n  // NB: In an Electron preload script, document will be defined but not fully\n  // initialized. Since we know we're in Chrome, we'll just detect this case\n  // explicitly\n  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n    return true;\n  }\n\n  // Internet Explorer and Edge do not support colors.\n  if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n    return false;\n  }\n\n  // is webkit? http://stackoverflow.com/a/16459606/376773\n  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n    // is firebug? http://stackoverflow.com/a/398120/376773\n    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n    // is firefox >= v31?\n    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n    // double check webkit in userAgent just in case we are in a worker\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n  try {\n    return JSON.stringify(v);\n  } catch (err) {\n    return '[UnexpectedJSONParseError]: ' + err.message;\n  }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n  var useColors = this.useColors;\n\n  args[0] = (useColors ? '%c' : '')\n    + this.namespace\n    + (useColors ? ' %c' : ' ')\n    + args[0]\n    + (useColors ? '%c ' : ' ')\n    + '+' + exports.humanize(this.diff);\n\n  if (!useColors) return;\n\n  var c = 'color: ' + this.color;\n  args.splice(1, 0, c, 'color: inherit')\n\n  // the final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-zA-Z%]/g, function(match) {\n    if ('%%' === match) return;\n    index++;\n    if ('%c' === match) {\n      // we only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n\n  args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n  // this hackery is required for IE8/9, where\n  // the `console.log` function doesn't have 'apply'\n  return 'object' === typeof console\n    && console.log\n    && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  try {\n    if (null == namespaces) {\n      exports.storage.removeItem('debug');\n    } else {\n      exports.storage.debug = namespaces;\n    }\n  } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  var r;\n  try {\n    r = exports.storage.debug;\n  } catch(e) {}\n\n  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n  if (!r && typeof process !== 'undefined' && 'env' in process) {\n    r = process.env.DEBUG;\n  }\n\n  return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n  try {\n    return window.localStorage;\n  } catch (e) {}\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * Active `debug` instances.\n */\nexports.instances = [];\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n  var hash = 0, i;\n\n  for (i in namespace) {\n    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);\n    hash |= 0; // Convert to 32bit integer\n  }\n\n  return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n  var prevTime;\n\n  function debug() {\n    // disabled?\n    if (!debug.enabled) return;\n\n    var self = debug;\n\n    // set `diff` timestamp\n    var curr = +new Date();\n    var ms = curr - (prevTime || curr);\n    self.diff = ms;\n    self.prev = prevTime;\n    self.curr = curr;\n    prevTime = curr;\n\n    // turn the `arguments` into a proper Array\n    var args = new Array(arguments.length);\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i];\n    }\n\n    args[0] = exports.coerce(args[0]);\n\n    if ('string' !== typeof args[0]) {\n      // anything else let's inspect with %O\n      args.unshift('%O');\n    }\n\n    // apply any `formatters` transformations\n    var index = 0;\n    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n      // if we encounter an escaped % then don't increase the array index\n      if (match === '%%') return match;\n      index++;\n      var formatter = exports.formatters[format];\n      if ('function' === typeof formatter) {\n        var val = args[index];\n        match = formatter.call(self, val);\n\n        // now we need to remove `args[index]` since it's inlined in the `format`\n        args.splice(index, 1);\n        index--;\n      }\n      return match;\n    });\n\n    // apply env-specific formatting (colors, etc.)\n    exports.formatArgs.call(self, args);\n\n    var logFn = debug.log || exports.log || console.log.bind(console);\n    logFn.apply(self, args);\n  }\n\n  debug.namespace = namespace;\n  debug.enabled = exports.enabled(namespace);\n  debug.useColors = exports.useColors();\n  debug.color = selectColor(namespace);\n  debug.destroy = destroy;\n\n  // env-specific initialization logic for debug instances\n  if ('function' === typeof exports.init) {\n    exports.init(debug);\n  }\n\n  exports.instances.push(debug);\n\n  return debug;\n}\n\nfunction destroy () {\n  var index = exports.instances.indexOf(this);\n  if (index !== -1) {\n    exports.instances.splice(index, 1);\n    return true;\n  } else {\n    return false;\n  }\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n  exports.save(namespaces);\n\n  exports.names = [];\n  exports.skips = [];\n\n  var i;\n  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n  var len = split.length;\n\n  for (i = 0; i < len; i++) {\n    if (!split[i]) continue; // ignore empty strings\n    namespaces = split[i].replace(/\\*/g, '.*?');\n    if (namespaces[0] === '-') {\n      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n    } else {\n      exports.names.push(new RegExp('^' + namespaces + '$'));\n    }\n  }\n\n  for (i = 0; i < exports.instances.length; i++) {\n    var instance = exports.instances[i];\n    instance.enabled = exports.enabled(instance.namespace);\n  }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n  exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n  if (name[name.length - 1] === '*') {\n    return true;\n  }\n  var i, len;\n  for (i = 0, len = exports.skips.length; i < len; i++) {\n    if (exports.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (i = 0, len = exports.names.length; i < len; i++) {\n    if (exports.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n","/*global Blob,File*/\n\n/**\n * Module requirements\n */\n\nvar isArray = require('isarray');\nvar isBuf = require('./is-buffer');\nvar toString = Object.prototype.toString;\nvar withNativeBlob = typeof Blob === 'function' || (typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]');\nvar withNativeFile = typeof File === 'function' || (typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]');\n\n/**\n * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.\n * Anything with blobs or files should be fed through removeBlobs before coming\n * here.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @api public\n */\n\nexports.deconstructPacket = function(packet) {\n  var buffers = [];\n  var packetData = packet.data;\n  var pack = packet;\n  pack.data = _deconstructPacket(packetData, buffers);\n  pack.attachments = buffers.length; // number of binary 'attachments'\n  return {packet: pack, buffers: buffers};\n};\n\nfunction _deconstructPacket(data, buffers) {\n  if (!data) return data;\n\n  if (isBuf(data)) {\n    var placeholder = { _placeholder: true, num: buffers.length };\n    buffers.push(data);\n    return placeholder;\n  } else if (isArray(data)) {\n    var newData = new Array(data.length);\n    for (var i = 0; i < data.length; i++) {\n      newData[i] = _deconstructPacket(data[i], buffers);\n    }\n    return newData;\n  } else if (typeof data === 'object' && !(data instanceof Date)) {\n    var newData = {};\n    for (var key in data) {\n      newData[key] = _deconstructPacket(data[key], buffers);\n    }\n    return newData;\n  }\n  return data;\n}\n\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @api public\n */\n\nexports.reconstructPacket = function(packet, buffers) {\n  packet.data = _reconstructPacket(packet.data, buffers);\n  packet.attachments = undefined; // no longer useful\n  return packet;\n};\n\nfunction _reconstructPacket(data, buffers) {\n  if (!data) return data;\n\n  if (data && data._placeholder) {\n    return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n  } else if (isArray(data)) {\n    for (var i = 0; i < data.length; i++) {\n      data[i] = _reconstructPacket(data[i], buffers);\n    }\n  } else if (typeof data === 'object') {\n    for (var key in data) {\n      data[key] = _reconstructPacket(data[key], buffers);\n    }\n  }\n\n  return data;\n}\n\n/**\n * Asynchronously removes Blobs or Files from data via\n * FileReader's readAsArrayBuffer method. Used before encoding\n * data as msgpack. Calls callback with the blobless data.\n *\n * @param {Object} data\n * @param {Function} callback\n * @api private\n */\n\nexports.removeBlobs = function(data, callback) {\n  function _removeBlobs(obj, curKey, containingObject) {\n    if (!obj) return obj;\n\n    // convert any blob\n    if ((withNativeBlob && obj instanceof Blob) ||\n        (withNativeFile && obj instanceof File)) {\n      pendingBlobs++;\n\n      // async filereader\n      var fileReader = new FileReader();\n      fileReader.onload = function() { // this.result == arraybuffer\n        if (containingObject) {\n          containingObject[curKey] = this.result;\n        }\n        else {\n          bloblessData = this.result;\n        }\n\n        // if nothing pending its callback time\n        if(! --pendingBlobs) {\n          callback(bloblessData);\n        }\n      };\n\n      fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer\n    } else if (isArray(obj)) { // handle array\n      for (var i = 0; i < obj.length; i++) {\n        _removeBlobs(obj[i], i, obj);\n      }\n    } else if (typeof obj === 'object' && !isBuf(obj)) { // and object\n      for (var key in obj) {\n        _removeBlobs(obj[key], key, obj);\n      }\n    }\n  }\n\n  var pendingBlobs = 0;\n  var bloblessData = data;\n  _removeBlobs(bloblessData);\n  if (!pendingBlobs) {\n    callback(bloblessData);\n  }\n};\n","\n/**\n * Module dependencies.\n */\n\nvar debug = require('debug')('socket.io-parser');\nvar Emitter = require('component-emitter');\nvar binary = require('./binary');\nvar isArray = require('isarray');\nvar isBuf = require('./is-buffer');\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = 4;\n\n/**\n * Packet types.\n *\n * @api public\n */\n\nexports.types = [\n  'CONNECT',\n  'DISCONNECT',\n  'EVENT',\n  'ACK',\n  'ERROR',\n  'BINARY_EVENT',\n  'BINARY_ACK'\n];\n\n/**\n * Packet type `connect`.\n *\n * @api public\n */\n\nexports.CONNECT = 0;\n\n/**\n * Packet type `disconnect`.\n *\n * @api public\n */\n\nexports.DISCONNECT = 1;\n\n/**\n * Packet type `event`.\n *\n * @api public\n */\n\nexports.EVENT = 2;\n\n/**\n * Packet type `ack`.\n *\n * @api public\n */\n\nexports.ACK = 3;\n\n/**\n * Packet type `error`.\n *\n * @api public\n */\n\nexports.ERROR = 4;\n\n/**\n * Packet type 'binary event'\n *\n * @api public\n */\n\nexports.BINARY_EVENT = 5;\n\n/**\n * Packet type `binary ack`. For acks with binary arguments.\n *\n * @api public\n */\n\nexports.BINARY_ACK = 6;\n\n/**\n * Encoder constructor.\n *\n * @api public\n */\n\nexports.Encoder = Encoder;\n\n/**\n * Decoder constructor.\n *\n * @api public\n */\n\nexports.Decoder = Decoder;\n\n/**\n * A socket.io Encoder instance\n *\n * @api public\n */\n\nfunction Encoder() {}\n\nvar ERROR_PACKET = exports.ERROR + '\"encode error\"';\n\n/**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n * @param {Function} callback - function to handle encodings (likely engine.write)\n * @return Calls callback with Array of encodings\n * @api public\n */\n\nEncoder.prototype.encode = function(obj, callback){\n  debug('encoding packet %j', obj);\n\n  if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {\n    encodeAsBinary(obj, callback);\n  } else {\n    var encoding = encodeAsString(obj);\n    callback([encoding]);\n  }\n};\n\n/**\n * Encode packet as string.\n *\n * @param {Object} packet\n * @return {String} encoded\n * @api private\n */\n\nfunction encodeAsString(obj) {\n\n  // first is type\n  var str = '' + obj.type;\n\n  // attachments if we have them\n  if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {\n    str += obj.attachments + '-';\n  }\n\n  // if we have a namespace other than `/`\n  // we append it followed by a comma `,`\n  if (obj.nsp && '/' !== obj.nsp) {\n    str += obj.nsp + ',';\n  }\n\n  // immediately followed by the id\n  if (null != obj.id) {\n    str += obj.id;\n  }\n\n  // json data\n  if (null != obj.data) {\n    var payload = tryStringify(obj.data);\n    if (payload !== false) {\n      str += payload;\n    } else {\n      return ERROR_PACKET;\n    }\n  }\n\n  debug('encoded %j as %s', obj, str);\n  return str;\n}\n\nfunction tryStringify(str) {\n  try {\n    return JSON.stringify(str);\n  } catch(e){\n    return false;\n  }\n}\n\n/**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n *\n * @param {Object} packet\n * @return {Buffer} encoded\n * @api private\n */\n\nfunction encodeAsBinary(obj, callback) {\n\n  function writeEncoding(bloblessData) {\n    var deconstruction = binary.deconstructPacket(bloblessData);\n    var pack = encodeAsString(deconstruction.packet);\n    var buffers = deconstruction.buffers;\n\n    buffers.unshift(pack); // add packet info to beginning of data list\n    callback(buffers); // write all the buffers\n  }\n\n  binary.removeBlobs(obj, writeEncoding);\n}\n\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n * @api public\n */\n\nfunction Decoder() {\n  this.reconstructor = null;\n}\n\n/**\n * Mix in `Emitter` with Decoder.\n */\n\nEmitter(Decoder.prototype);\n\n/**\n * Decodes an encoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n * @return {Object} packet\n * @api public\n */\n\nDecoder.prototype.add = function(obj) {\n  var packet;\n  if (typeof obj === 'string') {\n    packet = decodeString(obj);\n    if (exports.BINARY_EVENT === packet.type || exports.BINARY_ACK === packet.type) { // binary packet's json\n      this.reconstructor = new BinaryReconstructor(packet);\n\n      // no attachments, labeled binary but no binary data to follow\n      if (this.reconstructor.reconPack.attachments === 0) {\n        this.emit('decoded', packet);\n      }\n    } else { // non-binary full packet\n      this.emit('decoded', packet);\n    }\n  } else if (isBuf(obj) || obj.base64) { // raw binary data\n    if (!this.reconstructor) {\n      throw new Error('got binary data when not reconstructing a packet');\n    } else {\n      packet = this.reconstructor.takeBinaryData(obj);\n      if (packet) { // received final buffer\n        this.reconstructor = null;\n        this.emit('decoded', packet);\n      }\n    }\n  } else {\n    throw new Error('Unknown type: ' + obj);\n  }\n};\n\n/**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n * @api private\n */\n\nfunction decodeString(str) {\n  var i = 0;\n  // look up type\n  var p = {\n    type: Number(str.charAt(0))\n  };\n\n  if (null == exports.types[p.type]) {\n    return error('unknown packet type ' + p.type);\n  }\n\n  // look up attachments if type binary\n  if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) {\n    var buf = '';\n    while (str.charAt(++i) !== '-') {\n      buf += str.charAt(i);\n      if (i == str.length) break;\n    }\n    if (buf != Number(buf) || str.charAt(i) !== '-') {\n      throw new Error('Illegal attachments');\n    }\n    p.attachments = Number(buf);\n  }\n\n  // look up namespace (if any)\n  if ('/' === str.charAt(i + 1)) {\n    p.nsp = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (',' === c) break;\n      p.nsp += c;\n      if (i === str.length) break;\n    }\n  } else {\n    p.nsp = '/';\n  }\n\n  // look up id\n  var next = str.charAt(i + 1);\n  if ('' !== next && Number(next) == next) {\n    p.id = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (null == c || Number(c) != c) {\n        --i;\n        break;\n      }\n      p.id += str.charAt(i);\n      if (i === str.length) break;\n    }\n    p.id = Number(p.id);\n  }\n\n  // look up json data\n  if (str.charAt(++i)) {\n    var payload = tryParse(str.substr(i));\n    var isPayloadValid = payload !== false && (p.type === exports.ERROR || isArray(payload));\n    if (isPayloadValid) {\n      p.data = payload;\n    } else {\n      return error('invalid payload');\n    }\n  }\n\n  debug('decoded %s as %j', str, p);\n  return p;\n}\n\nfunction tryParse(str) {\n  try {\n    return JSON.parse(str);\n  } catch(e){\n    return false;\n  }\n}\n\n/**\n * Deallocates a parser's resources\n *\n * @api public\n */\n\nDecoder.prototype.destroy = function() {\n  if (this.reconstructor) {\n    this.reconstructor.finishedReconstruction();\n  }\n};\n\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n * @api private\n */\n\nfunction BinaryReconstructor(packet) {\n  this.reconPack = packet;\n  this.buffers = [];\n}\n\n/**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n *   a reconstructed packet object if all buffers have been received.\n * @api private\n */\n\nBinaryReconstructor.prototype.takeBinaryData = function(binData) {\n  this.buffers.push(binData);\n  if (this.buffers.length === this.reconPack.attachments) { // done with buffer list\n    var packet = binary.reconstructPacket(this.reconPack, this.buffers);\n    this.finishedReconstruction();\n    return packet;\n  }\n  return null;\n};\n\n/**\n * Cleans up binary packet reconstruction variables.\n *\n * @api private\n */\n\nBinaryReconstructor.prototype.finishedReconstruction = function() {\n  this.reconPack = null;\n  this.buffers = [];\n};\n\nfunction error(msg) {\n  return {\n    type: exports.ERROR,\n    data: 'parser error: ' + msg\n  };\n}\n","\nmodule.exports = isBuf;\n\nvar withNativeBuffer = typeof Buffer === 'function' && typeof Buffer.isBuffer === 'function';\nvar withNativeArrayBuffer = typeof ArrayBuffer === 'function';\n\nvar isView = function (obj) {\n  return typeof ArrayBuffer.isView === 'function' ? ArrayBuffer.isView(obj) : (obj.buffer instanceof ArrayBuffer);\n};\n\n/**\n * Returns true if obj is a buffer or an arraybuffer.\n *\n * @api private\n */\n\nfunction isBuf(obj) {\n  return (withNativeBuffer && Buffer.isBuffer(obj)) ||\n          (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj)));\n}\n","/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n               && 'undefined' != typeof chrome.storage\n                  ? chrome.storage.local\n                  : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n  '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',\n  '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',\n  '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',\n  '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',\n  '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',\n  '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',\n  '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',\n  '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',\n  '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',\n  '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',\n  '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n  // NB: In an Electron preload script, document will be defined but not fully\n  // initialized. Since we know we're in Chrome, we'll just detect this case\n  // explicitly\n  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n    return true;\n  }\n\n  // Internet Explorer and Edge do not support colors.\n  if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n    return false;\n  }\n\n  // is webkit? http://stackoverflow.com/a/16459606/376773\n  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n    // is firebug? http://stackoverflow.com/a/398120/376773\n    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n    // is firefox >= v31?\n    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n    // double check webkit in userAgent just in case we are in a worker\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n  try {\n    return JSON.stringify(v);\n  } catch (err) {\n    return '[UnexpectedJSONParseError]: ' + err.message;\n  }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n  var useColors = this.useColors;\n\n  args[0] = (useColors ? '%c' : '')\n    + this.namespace\n    + (useColors ? ' %c' : ' ')\n    + args[0]\n    + (useColors ? '%c ' : ' ')\n    + '+' + exports.humanize(this.diff);\n\n  if (!useColors) return;\n\n  var c = 'color: ' + this.color;\n  args.splice(1, 0, c, 'color: inherit')\n\n  // the final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-zA-Z%]/g, function(match) {\n    if ('%%' === match) return;\n    index++;\n    if ('%c' === match) {\n      // we only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n\n  args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n  // this hackery is required for IE8/9, where\n  // the `console.log` function doesn't have 'apply'\n  return 'object' === typeof console\n    && console.log\n    && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  try {\n    if (null == namespaces) {\n      exports.storage.removeItem('debug');\n    } else {\n      exports.storage.debug = namespaces;\n    }\n  } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  var r;\n  try {\n    r = exports.storage.debug;\n  } catch(e) {}\n\n  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n  if (!r && typeof process !== 'undefined' && 'env' in process) {\n    r = process.env.DEBUG;\n  }\n\n  return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n  try {\n    return window.localStorage;\n  } catch (e) {}\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * Active `debug` instances.\n */\nexports.instances = [];\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n  var hash = 0, i;\n\n  for (i in namespace) {\n    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);\n    hash |= 0; // Convert to 32bit integer\n  }\n\n  return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n  var prevTime;\n\n  function debug() {\n    // disabled?\n    if (!debug.enabled) return;\n\n    var self = debug;\n\n    // set `diff` timestamp\n    var curr = +new Date();\n    var ms = curr - (prevTime || curr);\n    self.diff = ms;\n    self.prev = prevTime;\n    self.curr = curr;\n    prevTime = curr;\n\n    // turn the `arguments` into a proper Array\n    var args = new Array(arguments.length);\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i];\n    }\n\n    args[0] = exports.coerce(args[0]);\n\n    if ('string' !== typeof args[0]) {\n      // anything else let's inspect with %O\n      args.unshift('%O');\n    }\n\n    // apply any `formatters` transformations\n    var index = 0;\n    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n      // if we encounter an escaped % then don't increase the array index\n      if (match === '%%') return match;\n      index++;\n      var formatter = exports.formatters[format];\n      if ('function' === typeof formatter) {\n        var val = args[index];\n        match = formatter.call(self, val);\n\n        // now we need to remove `args[index]` since it's inlined in the `format`\n        args.splice(index, 1);\n        index--;\n      }\n      return match;\n    });\n\n    // apply env-specific formatting (colors, etc.)\n    exports.formatArgs.call(self, args);\n\n    var logFn = debug.log || exports.log || console.log.bind(console);\n    logFn.apply(self, args);\n  }\n\n  debug.namespace = namespace;\n  debug.enabled = exports.enabled(namespace);\n  debug.useColors = exports.useColors();\n  debug.color = selectColor(namespace);\n  debug.destroy = destroy;\n\n  // env-specific initialization logic for debug instances\n  if ('function' === typeof exports.init) {\n    exports.init(debug);\n  }\n\n  exports.instances.push(debug);\n\n  return debug;\n}\n\nfunction destroy () {\n  var index = exports.instances.indexOf(this);\n  if (index !== -1) {\n    exports.instances.splice(index, 1);\n    return true;\n  } else {\n    return false;\n  }\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n  exports.save(namespaces);\n\n  exports.names = [];\n  exports.skips = [];\n\n  var i;\n  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n  var len = split.length;\n\n  for (i = 0; i < len; i++) {\n    if (!split[i]) continue; // ignore empty strings\n    namespaces = split[i].replace(/\\*/g, '.*?');\n    if (namespaces[0] === '-') {\n      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n    } else {\n      exports.names.push(new RegExp('^' + namespaces + '$'));\n    }\n  }\n\n  for (i = 0; i < exports.instances.length; i++) {\n    var instance = exports.instances[i];\n    instance.enabled = exports.enabled(instance.namespace);\n  }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n  exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n  if (name[name.length - 1] === '*') {\n    return true;\n  }\n  var i, len;\n  for (i = 0, len = exports.skips.length; i < len; i++) {\n    if (exports.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (i = 0, len = exports.names.length; i < len; i++) {\n    if (exports.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n","module.exports = toArray\n\nfunction toArray(list, index) {\n    var array = []\n\n    index = index || 0\n\n    for (var i = index || 0; i < list.length; i++) {\n        array[i - index] = list[i]\n    }\n\n    return array\n}\n","/**\n *\n *\n * @author Jerry Bendy <jerry@icewingcc.com>\n * @licence MIT\n *\n */\n\n(function(self) {\n    'use strict';\n\n    var nativeURLSearchParams = self.URLSearchParams ? self.URLSearchParams : null,\n        isSupportObjectConstructor = nativeURLSearchParams && (new nativeURLSearchParams({a: 1})).toString() === 'a=1',\n        // There is a bug in safari 10.1 (and earlier) that incorrectly decodes `%2B` as an empty space and not a plus.\n        decodesPlusesCorrectly = nativeURLSearchParams && (new nativeURLSearchParams('s=%2B').get('s') === '+'),\n        __URLSearchParams__ = \"__URLSearchParams__\",\n        // Fix bug in Edge which cannot encode ' &' correctly\n        encodesAmpersandsCorrectly = nativeURLSearchParams ? (function() {\n            var ampersandTest = new nativeURLSearchParams();\n            ampersandTest.append('s', ' &');\n            return ampersandTest.toString() === 's=+%26';\n        })() : true,\n        prototype = URLSearchParamsPolyfill.prototype,\n        iterable = !!(self.Symbol && self.Symbol.iterator);\n\n    if (nativeURLSearchParams && isSupportObjectConstructor && decodesPlusesCorrectly && encodesAmpersandsCorrectly) {\n        return;\n    }\n\n\n    /**\n     * Make a URLSearchParams instance\n     *\n     * @param {object|string|URLSearchParams} search\n     * @constructor\n     */\n    function URLSearchParamsPolyfill(search) {\n        search = search || \"\";\n\n        // support construct object with another URLSearchParams instance\n        if (search instanceof URLSearchParams || search instanceof URLSearchParamsPolyfill) {\n            search = search.toString();\n        }\n        this [__URLSearchParams__] = parseToDict(search);\n    }\n\n\n    /**\n     * Appends a specified key/value pair as a new search parameter.\n     *\n     * @param {string} name\n     * @param {string} value\n     */\n    prototype.append = function(name, value) {\n        appendTo(this [__URLSearchParams__], name, value);\n    };\n\n    /**\n     * Deletes the given search parameter, and its associated value,\n     * from the list of all search parameters.\n     *\n     * @param {string} name\n     */\n    prototype.delete = function(name) {\n        delete this [__URLSearchParams__] [name];\n    };\n\n    /**\n     * Returns the first value associated to the given search parameter.\n     *\n     * @param {string} name\n     * @returns {string|null}\n     */\n    prototype.get = function(name) {\n        var dict = this [__URLSearchParams__];\n        return name in dict ? dict[name][0] : null;\n    };\n\n    /**\n     * Returns all the values association with a given search parameter.\n     *\n     * @param {string} name\n     * @returns {Array}\n     */\n    prototype.getAll = function(name) {\n        var dict = this [__URLSearchParams__];\n        return name in dict ? dict [name].slice(0) : [];\n    };\n\n    /**\n     * Returns a Boolean indicating if such a search parameter exists.\n     *\n     * @param {string} name\n     * @returns {boolean}\n     */\n    prototype.has = function(name) {\n        return name in this [__URLSearchParams__];\n    };\n\n    /**\n     * Sets the value associated to a given search parameter to\n     * the given value. If there were several values, delete the\n     * others.\n     *\n     * @param {string} name\n     * @param {string} value\n     */\n    prototype.set = function set(name, value) {\n        this [__URLSearchParams__][name] = ['' + value];\n    };\n\n    /**\n     * Returns a string containg a query string suitable for use in a URL.\n     *\n     * @returns {string}\n     */\n    prototype.toString = function() {\n        var dict = this[__URLSearchParams__], query = [], i, key, name, value;\n        for (key in dict) {\n            name = encode(key);\n            for (i = 0, value = dict[key]; i < value.length; i++) {\n                query.push(name + '=' + encode(value[i]));\n            }\n        }\n        return query.join('&');\n    };\n\n    // There is a bug in Safari 10.1 and `Proxy`ing it is not enough.\n    var forSureUsePolyfill = !decodesPlusesCorrectly;\n    var useProxy = (!forSureUsePolyfill && nativeURLSearchParams && !isSupportObjectConstructor && self.Proxy)\n    /*\n     * Apply polifill to global object and append other prototype into it\n     */\n    self.URLSearchParams = useProxy ?\n        // Safari 10.0 doesn't support Proxy, so it won't extend URLSearchParams on safari 10.0\n        new Proxy(nativeURLSearchParams, {\n            construct: function(target, args) {\n                return new target((new URLSearchParamsPolyfill(args[0]).toString()));\n            }\n        }) :\n        URLSearchParamsPolyfill;\n\n\n    var USPProto = self.URLSearchParams.prototype;\n\n    USPProto.polyfill = true;\n\n    /**\n     *\n     * @param {function} callback\n     * @param {object} thisArg\n     */\n    USPProto.forEach = USPProto.forEach || function(callback, thisArg) {\n        var dict = parseToDict(this.toString());\n        Object.getOwnPropertyNames(dict).forEach(function(name) {\n            dict[name].forEach(function(value) {\n                callback.call(thisArg, value, name, this);\n            }, this);\n        }, this);\n    };\n\n    /**\n     * Sort all name-value pairs\n     */\n    USPProto.sort = USPProto.sort || function() {\n        var dict = parseToDict(this.toString()), keys = [], k, i, j;\n        for (k in dict) {\n            keys.push(k);\n        }\n        keys.sort();\n\n        for (i = 0; i < keys.length; i++) {\n            this.delete(keys[i]);\n        }\n        for (i = 0; i < keys.length; i++) {\n            var key = keys[i], values = dict[key];\n            for (j = 0; j < values.length; j++) {\n                this.append(key, values[j]);\n            }\n        }\n    };\n\n    /**\n     * Returns an iterator allowing to go through all keys of\n     * the key/value pairs contained in this object.\n     *\n     * @returns {function}\n     */\n    USPProto.keys = USPProto.keys || function() {\n        var items = [];\n        this.forEach(function(item, name) {\n            items.push(name);\n        });\n        return makeIterator(items);\n    };\n\n    /**\n     * Returns an iterator allowing to go through all values of\n     * the key/value pairs contained in this object.\n     *\n     * @returns {function}\n     */\n    USPProto.values = USPProto.values || function() {\n        var items = [];\n        this.forEach(function(item) {\n            items.push(item);\n        });\n        return makeIterator(items);\n    };\n\n    /**\n     * Returns an iterator allowing to go through all key/value\n     * pairs contained in this object.\n     *\n     * @returns {function}\n     */\n    USPProto.entries = USPProto.entries || function() {\n        var items = [];\n        this.forEach(function(item, name) {\n            items.push([name, item]);\n        });\n        return makeIterator(items);\n    };\n\n\n    if (iterable) {\n        USPProto[self.Symbol.iterator] = USPProto[self.Symbol.iterator] || USPProto.entries;\n    }\n\n\n    function encode(str) {\n        var replace = {\n            '!': '%21',\n            \"'\": '%27',\n            '(': '%28',\n            ')': '%29',\n            '~': '%7E',\n            '%20': '+',\n            '%00': '\\x00'\n        };\n        return encodeURIComponent(str).replace(/[!'\\(\\)~]|%20|%00/g, function(match) {\n            return replace[match];\n        });\n    }\n\n    function decode(str) {\n        return decodeURIComponent(str.replace(/\\+/g, ' '));\n    }\n\n    function makeIterator(arr) {\n        var iterator = {\n            next: function() {\n                var value = arr.shift();\n                return {done: value === undefined, value: value};\n            }\n        };\n\n        if (iterable) {\n            iterator[self.Symbol.iterator] = function() {\n                return iterator;\n            };\n        }\n\n        return iterator;\n    }\n\n    function parseToDict(search) {\n        var dict = {};\n\n        if (typeof search === \"object\") {\n            for (var key in search) {\n                if (search.hasOwnProperty(key)) {\n                    appendTo(dict, key, search[key])\n                }\n            }\n\n        } else {\n            // remove first '?'\n            if (search.indexOf(\"?\") === 0) {\n                search = search.slice(1);\n            }\n\n            var pairs = search.split(\"&\");\n            for (var j = 0; j < pairs.length; j++) {\n                var value = pairs [j],\n                    index = value.indexOf('=');\n\n                if (-1 < index) {\n                    appendTo(dict, decode(value.slice(0, index)), decode(value.slice(index + 1)));\n\n                } else {\n                    if (value) {\n                        appendTo(dict, decode(value), '');\n                    }\n                }\n            }\n        }\n\n        return dict;\n    }\n\n    function appendTo(dict, name, value) {\n        var val = typeof value === 'string' ? value : (\n            value !== null && value !== undefined && typeof value.toString === 'function' ? value.toString() : JSON.stringify(value)\n        )\n\n        if (name in dict) {\n            dict[name].push(val);\n        } else {\n            dict[name] = [val];\n        }\n    }\n\n})(typeof global !== 'undefined' ? global : (typeof window !== 'undefined' ? window : this));\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","'use strict';\n\nvar alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')\n  , length = 64\n  , map = {}\n  , seed = 0\n  , i = 0\n  , prev;\n\n/**\n * Return a string representing the specified number.\n *\n * @param {Number} num The number to convert.\n * @returns {String} The string representation of the number.\n * @api public\n */\nfunction encode(num) {\n  var encoded = '';\n\n  do {\n    encoded = alphabet[num % length] + encoded;\n    num = Math.floor(num / length);\n  } while (num > 0);\n\n  return encoded;\n}\n\n/**\n * Return the integer value specified by the given string.\n *\n * @param {String} str The string to convert.\n * @returns {Number} The integer value represented by the string.\n * @api public\n */\nfunction decode(str) {\n  var decoded = 0;\n\n  for (i = 0; i < str.length; i++) {\n    decoded = decoded * length + map[str.charAt(i)];\n  }\n\n  return decoded;\n}\n\n/**\n * Yeast: A tiny growing id generator.\n *\n * @returns {String} A unique id.\n * @api public\n */\nfunction yeast() {\n  var now = encode(+new Date());\n\n  if (now !== prev) return seed = 0, prev = now;\n  return now +'.'+ encode(seed++);\n}\n\n//\n// Map each character to its index.\n//\nfor (; i < length; i++) map[alphabet[i]] = i;\n\n//\n// Expose the `yeast`, `encode` and `decode` functions.\n//\nyeast.encode = encode;\nyeast.decode = decode;\nmodule.exports = yeast;\n","let config = CONFIG;\n\nexport function overrideConfig(newConfig) {\n    config = newConfig;\n}\n\nexport function getConfig() {\n    return config;\n}\n","import { getConfig } from \"./config\";\n\nexport const types = {\n    visualisation: \"vizzy\",\n    layered: \"turtle\"\n};\n\nexport const contentTypes = {\n    imagePng: \"image/png\",\n    imageGif: \"image/gif\",\n    textText: \"text/text\",\n    videoYoutube: \"video/youtube\",\n    imageImage: \"image\",\n    mp4: \"video/mp4\",\n    json: \"file/json\",\n    csv: \"file/csv\"\n};\n\nexport const CELL_WIDTH = 22;\nexport const CELL_HEIGHT = 20;\n\nexport const BIG_CRUNCH_URL = getConfig().sdkConnectionUrl;\n\nexport const isAudio = type => /^audio\\//.test(type);\n\nexport const isVideo = type => /^video\\//.test(type);\n","import EventEmitter from \"events\";\nimport { getConfig } from \"./config\";\n\nimport {\n    createCrunchSocket,\n    getSpaceListener,\n    addSpaceListener,\n    getCrunchSocket\n} from \"./globalVars\";\n\nconst getSocket = function getSocket() {\n    let crunchSocket = getCrunchSocket();\n    if (!crunchSocket) {\n        const url = getConfig().spacesSocketUrl;\n        crunchSocket = createCrunchSocket(url);\n\n        crunchSocket.on(\"update\", (value, space) => {\n            // Bug here - If you're listening to the same cell on tbc_x_y and uuid this will only send it to one.\n            const spaceListener =\n                getSpaceListener(atob(space.location)) ||\n                getSpaceListener(space.encodedUuid);\n            if (spaceListener) {\n                spaceListener.lastValue = value;\n                spaceListener.lastSpace = space;\n                spaceListener.emitter.emit(\"spaceUpdate\", value, space);\n            } else {\n                // This happens if a connection has been closed and there is no longer a callback for it.\n                //We should leave the room in this case perhaps.\n                console.error(\n                    \"Received a space value we were not listening to: \",\n                    space.value\n                );\n            }\n        });\n        crunchSocket.on(\"spaceNotFound\", spaceId => {\n            const spaceListener =\n                getSpaceListener(spaceId) || getSpaceListener(atob(spaceId));\n            if (spaceListener) {\n                spaceListener.emitter.emit(\"spaceNotFound\", \"invalid space\");\n            }\n        });\n\n        crunchSocket.on(\"user\", (user, spaceId) => {\n            const spaceListener =\n                getSpaceListener(spaceId) || getSpaceListener(atob(spaceId));\n\n            if (spaceListener) {\n                spaceListener.emitter.emit(\"user\", user);\n            }\n        });\n    } else {\n        // reusing existing crunch sockets\n    }\n    return crunchSocket;\n};\n\n// Listens to changes in the whole space (for SDK users)\nconst listenToSpace = (\n    spaceId,\n    sectorId,\n    callback,\n    errorCallback,\n    userCallback\n) => {\n    const crunchSocket = getSocket();\n    let spaceListener = getSpaceListener(spaceId);\n    if (!spaceListener) {\n        spaceListener = addSpaceListener(spaceId, new EventEmitter(), \"\", {});\n        crunchSocket.emit(\"join\", spaceId, sectorId);\n    } else {\n        callback(spaceListener.lastValue, spaceListener.lastSpace);\n    }\n    spaceListener.emitter.on(\"spaceUpdate\", callback);\n    spaceListener.emitter.on(\"spaceNotFound\", errorCallback);\n\n    if (userCallback !== undefined) {\n        crunchSocket.emit(\"get_user\", spaceId, sectorId, userCallback);\n    }\n\n    return {\n        close: () => {\n            spaceListener.emitter.removeListener(\"spaceUpdate\", callback);\n            spaceListener.emitter.removeListener(\n                \"spaceNotFound\",\n                errorCallback\n            );\n        }\n    };\n};\n\nfunction readSpaceId(encodedSpaceId) {\n    if (!encodedSpaceId) {\n        return;\n    }\n\n    if (encodedSpaceId.slice(0, 3) === \"tbc\") {\n        // Old school format tbc_x_y\n        return encodedSpaceId;\n    }\n\n    try {\n        const decodedString = atob(encodedSpaceId);\n        // Middle school format ascii encoded tbc_x_y\n        if (decodedString.slice(0, 3) === \"tbc\") {\n            return atob(encodedSpaceId);\n        } else {\n            // Current model nothing to do here.\n            return encodedSpaceId;\n        }\n    } catch (e) {\n        // Not a valid base64 string\n\n        // Current model nothing to do here.\n        return encodedSpaceId;\n    }\n}\n\nfunction createCallBacks(callback, errorCallback, userCallback) {\n    const changeCall = typeof callback === \"function\" ? callback : undefined;\n    const errorChangeCallback =\n        typeof errorCallback === \"function\" ? errorCallback : () => {};\n    const userArrivesCallback =\n        typeof userCallback === \"function\" ? userCallback : undefined;\n\n    return {\n        changeCall,\n        errorChangeCallback,\n        userArrivesCallback\n    };\n}\n\n// Register for updates to the specified space ID.\n// - callback: function will be invoked with native values and the end-user friendly space object\nexport function crunch(encodedSpaceId, callback, errorCallback, userCallback) {\n    const spaceId = readSpaceId(encodedSpaceId);\n    const callbacks = createCallBacks(callback, errorCallback, userCallback);\n    if (!callbacks.changeCall) {\n        console.error(\n            \"The Big Crunch: You must supply a callback function to TBC.crunch()\"\n        );\n        return;\n    }\n\n    if (!spaceId) {\n        console.error(\"Cell ID not provided to TBC.crunch\");\n        return;\n    }\n\n    return listenToSpace(\n        spaceId,\n        undefined,\n        callbacks.changeCall,\n        callbacks.errorChangeCallback,\n        callbacks.userArrivesCallback\n    );\n}\n\n// This is more performant\nexport function crunchWithSectorId(\n    encodedSpaceId,\n    sectorId,\n    callback,\n    errorCallback,\n    userCallback\n) {\n    const spaceId = readSpaceId(encodedSpaceId);\n    const callbacks = createCallBacks(callback, errorCallback, userCallback);\n    if (!callbacks.changeCall) {\n        console.error(\n            \"The Big Crunch: You must supply a callback function to TBC.crunch()\"\n        );\n        return;\n    }\n\n    if (!spaceId) {\n        console.error(\"Cell ID not provided to TBC.crunch\");\n        return;\n    }\n\n    if (!sectorId) {\n        console.error(\"Sector ID not provided to TBC.crunch\");\n        return;\n    }\n    return listenToSpace(\n        spaceId,\n        sectorId,\n        callbacks.changeCall,\n        callbacks.errorChangeCallback,\n        callbacks.userArrivesCallback\n    );\n}\n\nexport function crunchBySpaceName(spaceId, name, callback, errorCallback) {\n    if (!spaceId || !name) {\n        console.error(\n            \"The Big Crunch: You must supply a spaceId and a name to TBC.crunchBySpaceName\"\n        );\n    }\n\n    crunchSocket = getSocket();\n    let spaceListenerId;\n    crunchSocket.emit(\n        \"get_space_uuid_from_name_space\",\n        { spaceId, name },\n        cellUuid => {\n            spaceListenerId = cellUuid;\n            // Hacky, we need to return this close function.\n            return crunch(cellUuid, callback, errorCallback).close;\n        }\n    );\n\n    const listener = {\n        close: () => {\n            let spaceListener = getSpaceListener(spaceListenerId);\n\n            spaceListener.emitter.removeListener(\"spaceUpdate\", callback);\n            if (errorCallback) {\n                spaceListener.emitter.removeListener(\n                    \"spaceNotFound\",\n                    errorCallback\n                );\n            }\n        }\n    };\n\n    return listener;\n}\n","import { crunch } from \"./crunch\";\n\nconst commands = {\n    SET_VALUE: \"setValue\",\n    SET_TITLE: \"setTitle\"\n};\n\nconst setValue = function setValue(value, position, contentType = \"text/text\") {\n    window.parent.postMessage(\n        {\n            command: commands.SET_VALUE,\n            value,\n            contentType,\n            position\n        },\n        `*`\n    );\n};\n\nconst setEditorTitle = function setEditorTitle(title) {\n    window.parent.postMessage(\n        {\n            command: commands.SET_TITLE,\n            title\n        },\n        `*`\n    );\n};\n\nconst edit = function edit(title, cellToEditCallback) {\n    setEditorTitle(title);\n\n    const url = new URLSearchParams(window.location.search);\n    const editingSpace = url.get(\"editing\");\n    crunch(editingSpace, cellToEditCallback);\n};\n\nconst editor = {\n    setValue,\n    commands,\n    edit\n};\n\nexport default editor;\n","/**\n * this file is used to store global variables in window object in browser or local variable in NodeJS\n */\nimport io from \"socket.io-client\";\n\n// check whether window is defined in the context\nif (typeof window === \"undefined\") {\n    global.window = {\n        location: { href: \"\" },\n        addEventListener: () => {},\n        parent: { postMessage: () => {} },\n        nodejs: true,\n        crunchSocket: null,\n        btoa: str => Buffer.from(str).toString(\"base64\")\n    };\n    global.atob = str => Buffer.from(str, \"base64\").toString();\n    global.btoa = str => Buffer.from(str).toString(\"base64\");\n}\n\nif (!window.tbcListeners) {\n    window.tbcListeners = {};\n}\n\nexport const getSpaceListener = spaceId => {\n    return window ? window.tbcListeners[spaceId] : null;\n};\n\nexport const createCrunchSocket = url => {\n    window.crunchSocket = io(url);\n    return window.crunchSocket;\n};\n\nexport const isCrunchSocketAvailable = () => !!window.crunchSocket;\n\nexport const addSpaceListener = (spaceId, emitter, lastValue, lastSpace) => {\n    window.tbcListeners[spaceId] = { emitter, lastValue, lastSpace };\n    return window.tbcListeners[spaceId];\n};\n\nexport const getCrunchSocket = () => window.crunchSocket;\n","//\n// The Big Crunch Vizzy SDK\n//\nimport './globalVars';\nimport tbc from './tbc';\nimport * as urlcreator from './urlcreator';\nimport * as editor from './editor';\nimport * as renderers from './renderers';\nimport * as layerrenderer from './renderers/layerrenderer';\nimport * as textrenderer from './renderers/textrenderer';\nimport { overrideConfig } from './config';\n\nexport default {\n  ...tbc,\n  ...urlcreator,\n  ...editor,\n  ...renderers,\n  ...layerrenderer,\n  ...textrenderer,\n  overrideConfig\n};\n","import { contentTypes, CELL_HEIGHT, CELL_WIDTH, types } from \"../constants\";\n\nconst defaultOptions = {\n    fit: \"cellaspect\"\n};\n\nexport const getOptions = function getOptions(options) {\n    return Object.assign({}, defaultOptions, options);\n};\n\nexport const setFullHeightWidth = function setFullHeightWidth(element) {\n    element.style.width = \"99%\";\n    element.style.height = \"100%\";\n};\n\nexport const getFullscreenSize = function getFullscreenSize() {\n    return { width: screen.width, height: screen.height };\n};\n\nexport const canvasSize = function canvasSize(ctx) {\n    return { canvasWidth: ctx.canvas.width, canvasHeight: ctx.canvas.height };\n};\n\nconst elementSize = function elementSize(element) {\n    const box = element.getBoundingClientRect();\n    return { width: box.width, height: box.height };\n};\n\nexport const findDrawingArea = function findDrawingArea({ x, y }, w, h) {\n    const actualX = (x + 1) * CELL_WIDTH;\n    const actualY = (y + 1) * CELL_HEIGHT;\n    // Set proposed width to the canvas width\n    let width = w;\n    // Calculate the height at the aspect ratio\n    let height = (width * actualY) / actualX;\n\n    // If the height is too high for the canvas\n    if (height > h) {\n        // Set the height to the canvas height\n        height = h;\n        // Calculate the width at the aspect ratio\n        width = (height * actualX) / actualY;\n    }\n    return { width, height };\n};\n\nconst validateCellSize = function validateCellSize(cellSize) {\n    let size = cellSize;\n    if (!cellSize) {\n        size = { x: 0, y: 0 };\n    }\n    return size;\n};\n\nexport const findDrawingAreaElement = function findDrawingAreaElement(\n    { cellSize },\n    element,\n    options\n) {\n    const size = validateCellSize(cellSize);\n    const { width, height } = options.fullscreen\n        ? getFullscreenSize()\n        : elementSize(element);\n    return findDrawingArea(size, width, height);\n};\n\nexport const findDrawingAreaCanvas = function findDrawingAreaCanvas(\n    { cellSize },\n    ctx,\n    options = {}\n) {\n    const size = validateCellSize(cellSize);\n    if (options.fullscreen) {\n        const { height, width } = getFullscreenSize();\n        return findDrawingArea(size, width, height);\n    }\n    const { canvasWidth, canvasHeight } = canvasSize(ctx);\n    return findDrawingArea(size, canvasWidth, canvasHeight);\n};\n\nexport const findCentredDrawingArea = function findCentredDrawingArea(\n    width,\n    height,\n    ctx\n) {\n    const { canvasWidth, canvasHeight } = canvasSize(ctx);\n    return { x: (canvasWidth - width) / 2, y: (canvasHeight - height) / 2 };\n};\n\nexport const setElementToSpaceRatio = function setElementToSpaceRatio(\n    space,\n    element,\n    options\n) {\n    const { width, height } = findDrawingAreaElement(space, element, options);\n    element.style.width = `${width}px`;\n    element.style.height = `${height}px`;\n};\n\nexport const setElementToParentSize = function setElementToParentSize(\n    child,\n    parent,\n    options\n) {\n    const parentBox = parent.getBoundingClientRect();\n    const fullScreenSize = getFullscreenSize();\n    if (child.nodeName === \"CANVAS\") {\n        if (options && options.fullscreen) {\n            child.width = fullScreenSize.width;\n            child.height = fullScreenSize.height;\n        } else if (parentBox.width !== 0 || parentBox.height !== 0) {\n            child.width = parentBox.width;\n            child.height = parentBox.height;\n        }\n        // If we can't get the size of the canvas we're out of luck for now. It draws at the default size 300px x 150px.\n        // We could check the size of the space the turtle is in then calculate the x and y which is a painnnnnn - FLASH 17/07/2018\n    } else if (options && options.fullscreen) {\n        child.style.width = `${fullScreenSize.width}px`;\n        child.style.height = `${fullScreenSize.height}px`;\n    } else {\n        child.style.width = `${parentBox.width}px`;\n        child.style.height = `${parentBox.height}px`;\n    }\n};\n\nconst createLayerCanvas = function createLayerCanvas(parentElement) {\n    const canvas = document.createElement(\"canvas\");\n    if (parentElement) {\n        setElementToParentSize(canvas, parentElement);\n    }\n    return canvas;\n};\n\nconst createLayerDiv = function createLayerDiv() {\n    const div = document.createElement(\"div\");\n    setFullHeightWidth(div);\n\n    return div;\n};\n\nexport const createElementForSpace = function createElementForSpace(\n    space,\n    layerDiv\n) {\n    if (space.type === types.visualisation) {\n        return createLayerDiv();\n    }\n\n    switch (space.contentType) {\n        case contentTypes.textText:\n            return createLayerCanvas(layerDiv);\n        default:\n            return createLayerDiv();\n    }\n};\n","import {\n    renderImageToCanvas,\n    renderTextToElement,\n    renderTextToCanvas,\n    renderVisualisationToElement,\n    renderImageToElement,\n    renderCellToElement\n} from './renderers';\n\nimport renderLayersToElement from './layerrenderer';\n\nexport default {\n    renderImageToCanvas,\n    renderTextToElement,\n    renderTextToCanvas,\n    renderVisualisationToElement,\n    renderImageToElement,\n    renderLayersToElement,\n    renderCellToElement\n};","// This file is separate to the renderers file because drawing layers is more complicated than\n// the other renders\nimport {\n    getOptions,\n    setElementToSpaceRatio,\n    createElementForSpace,\n    setFullHeightWidth,\n    setElementToParentSize\n} from \"./common\";\nimport { renderSpaceIntoElement } from \"./renderers\";\nimport { crunch } from \"../crunch\";\nimport { types } from \"../constants\";\n\nconst createTurtleDivFromLayer = function createTurtleDivFromLayer(layer) {\n    const element = document.createElement(\"div\");\n    const properties = layer.properties;\n\n    element.style.width = properties.width;\n    element.style.height = properties.height;\n    element.style.top = properties.top;\n    element.style.left = properties.left;\n    element.style.position = \"absolute\";\n    return element;\n};\n\nexport const crunchLayer = function crunchLayer(location, layerDiv) {\n    // Fetch the space from the server\n    return crunch(location, (value, layerSpace) => {\n        // Empty the div, if we're rendering for a second time\n        layerDiv.innerHTML = \"\";\n\n        if (value === null && layerSpace.type !== types.visualisation) {\n            return;\n        }\n        // Get the element to draw into canvas or div\n        const renderElement = createElementForSpace(layerSpace, layerDiv);\n        setFullHeightWidth(renderElement);\n\n        layerDiv.appendChild(renderElement);\n        // Draw the layer\n        renderSpaceIntoElement(layerSpace, renderElement, { fit: \"stretch\" }); // Turtles stretch\n    });\n};\n\n/**\n * Renders a layered space to the canvas.\n * @param space\n * @param element a document element to put the layers in\n * @param opts {fit: 'stretch or cellaspect }\n * @param depth the recursive count\n */\nexport default function renderLayersToElement(space, element, opts, depth = 5) {\n    if (depth === 0) return;\n    const options = getOptions(opts);\n    const turtleContainer = document.createElement(\"div\");\n    setElementToParentSize(turtleContainer, element);\n    element.appendChild(turtleContainer);\n\n    if (options.fit === \"cellaspect\") {\n        setElementToSpaceRatio(space, turtleContainer, options);\n    }\n\n    // This makes sure the turtle layers overlay.\n    turtleContainer.style.position = \"relative\";\n    turtleContainer.style.overflow = \"hidden\";\n\n    const baseElement = createElementForSpace(space);\n    setElementToParentSize(baseElement, turtleContainer);\n    // Append element before renderering so it's got a size.\n    turtleContainer.appendChild(baseElement);\n    renderSpaceIntoElement(space, baseElement, options);\n\n    const layerConnections = [];\n    space.layers.forEach(layer => {\n        // Create a div for this layer\n        const layerDiv = createTurtleDivFromLayer(layer);\n        turtleContainer.appendChild(layerDiv);\n\n        layerConnections.push(crunchLayer(layer.location, layerDiv, depth));\n    });\n\n    return {\n        close: () => {\n            layerConnections.forEach(conn => {\n                conn.close();\n            });\n        }\n    };\n}\n","import {\n    getSpaceImageUrl,\n    getSpaceVizzyUrl,\n    getSpaceVideoUrl,\n    getSpaceAudioUrl\n} from \"../urlcreator\";\nimport {\n    getFontProperties,\n    getFontStyleFromProperties,\n    drawText\n} from \"./textrenderer\";\nimport {\n    getOptions,\n    findDrawingAreaCanvas,\n    findCentredDrawingArea,\n    canvasSize,\n    setElementToSpaceRatio,\n    setFullHeightWidth,\n    createElementForSpace,\n    setElementToParentSize\n} from \"./common\";\nimport { contentTypes, types, isAudio, isVideo } from \"../constants\";\n\n/**\n * Renders the image to the canvas which is pixel perfect representation of the space in The Big Crunch\n * @param space the space that is an image from TBC.crunch\n * @param ctx a 2d canvas context\n */\nexport const renderImageToCanvas = function renderImageToCanvas(\n    space,\n    ctx,\n    opts\n) {\n    const options = getOptions(opts);\n    // Get size\n    const { width, height } = findDrawingAreaCanvas(space, ctx, options);\n\n    // Draw Image\n    const image = new Image();\n    image.addEventListener(\"load\", () => {\n        ctx.drawImage(image, 0, 0, width, height);\n    });\n    image.src = getSpaceImageUrl(space);\n};\n\n/**\n * Renders the text to the canvas which is pixel perfect representation of the space in The Big Crunch\n * @param {*} space the space that is an image from TBC.crunch\n * @param {*} ctx a 2d canvas context\n */\nexport const renderTextToElement = function renderTextToElement(\n    space,\n    element\n) {\n    const span = document.createElement(\"span\");\n    const properties = getFontProperties(space);\n    const size = 25; // TODO sort this out.\n    span.style.color = properties.color;\n    span.style.fontWeight = properties[\"font-weight\"];\n    span.style.font = getFontStyleFromProperties(properties, size);\n    span.textContent = space.value;\n\n    element.append(span);\n};\n\n/**\n * Renders text to the canvas the same as The Big Crunch Universe\n * @param {*} space\n * @param {*} ctx\n */\nexport const renderTextToCanvas = function renderTextToCanvas(\n    space,\n    ctx,\n    opts\n) {\n    const options = getOptions(opts);\n    // Get size\n    const { width, height } = findDrawingAreaCanvas(space, ctx, options);\n    const canvas = drawText(\n        space.value,\n        width,\n        height,\n        space.properties.content\n    );\n\n    if (options.fit === \"stretch\") {\n        const { canvasWidth, canvasHeight } = canvasSize(ctx);\n\n        // Stretch the text over the entire canvas\n        ctx.drawImage(canvas, 0, 0, canvasWidth, canvasHeight);\n    } else {\n        // Centre the text in the canvas. This is for cases where the text doesn't fit the canvas completely\n        const { x, y } = findCentredDrawingArea(width, height, ctx);\n        ctx.drawImage(canvas, x, y, width, height);\n    }\n};\n\n/**\n * Renders the visualisation into a div which is pixel perfect representation of the space in The Big Crunch\n * @param space the space that is passed from the callback of TBC.crunch\n * @param element the container to place the visualisation IFrame in. A raw dom element\n */\nexport const renderVisualisationToElement = function renderVisualisationToElement(\n    space,\n    element,\n    opts\n) {\n    const options = getOptions(opts);\n    const visualisation = document.createElement(\"iframe\");\n    let params = \"\";\n    if (opts.odo) {\n        params = \"&odo=true\";\n    }\n    visualisation.src =\n        getSpaceVizzyUrl(space.encodedUuid) + window.location.search + params;\n    visualisation.sandbox =\n        \"allow-same-origin allow-scripts allow-popups allow-forms\";\n    setFullHeightWidth(visualisation);\n\n    if (options.fit === \"cellaspect\") {\n        setElementToSpaceRatio(space, element, options);\n    }\n\n    element.append(visualisation);\n    return visualisation;\n};\n\n/**\n * Render a image space to an element\n * @param space\n * @param element\n * @param options\n */\nexport const renderImageToElement = function renderImageToElement(\n    space,\n    element,\n    opts\n) {\n    const options = getOptions(opts);\n    const img = document.createElement(\"img\");\n    setFullHeightWidth(img);\n    img.src = getSpaceImageUrl(space);\n\n    if (options.fit === \"cellaspect\") {\n        setElementToSpaceRatio(space, element, options);\n    }\n\n    element.append(img);\n    return img;\n};\n\nexport const renderYoutubeVideoToElement = function renderYoutubeVideoToElement(\n    space,\n    element,\n    opts\n) {\n    const options = getOptions(opts);\n    const videoId = space.value;\n    const iframe = document.createElement(\"iframe\");\n    iframe.src = `https://www.youtube.com/embed/${videoId}`;\n    iframe.frameBorder = 0;\n    setFullHeightWidth(iframe);\n\n    if (options.fit === \"cellaspect\") {\n        setElementToSpaceRatio(space, element, options);\n    }\n\n    element.append(iframe);\n    return iframe;\n};\n\nexport const renderVideoToElement = function renderVideoToElement(\n    space,\n    element,\n    opts\n) {\n    const options = getOptions(opts);\n    const video = document.createElement(\"video\");\n    video.src = `${getSpaceVideoUrl(space)}`;\n    video.controls = \"controls\";\n    video.type = space.contentType;\n    video.autoplay = \"autoplay\";\n    video.loop = \"loop\";\n    setFullHeightWidth(video);\n\n    if (options.fit === \"cellaspect\") {\n        setElementToSpaceRatio(space, element, options);\n    }\n\n    element.append(video);\n    return video;\n};\n\nexport const renderAudioToElement = function renderAudioToElement(\n    space,\n    element,\n    opts\n) {\n    const options = getOptions(opts);\n    const audio = document.createElement(\"audio\");\n    audio.src = `${getSpaceAudioUrl(space)}`;\n    audio.controls = \"controls\";\n    audio.type = space.contentType;\n    audio.autoplay = \"autoplay\";\n    audio.loop = \"loop\";\n    setFullHeightWidth(audio);\n\n    if (options.fit === \"cellaspect\") {\n        setElementToSpaceRatio(space, element, options);\n    }\n\n    element.append(audio);\n    return audio;\n};\n\nexport const renderJsonToElement = function renderJsonToElement(\n    space,\n    element,\n    opts\n) {\n    const options = getOptions(opts);\n    const div = document.createElement(\"div\");\n    setFullHeightWidth(div);\n    if (options.fit === \"cellaspect\") {\n        setElementToSpaceRatio(space, element, options);\n    }\n    element.append(div);\n    return div;\n};\n\nexport const renderSpaceIntoElement = function renderSpaceIntoElement(\n    space,\n    element,\n    options\n) {\n    if (space.type === types.visualisation) {\n        renderVisualisationToElement(space, element, options);\n    } else if (space.contentType === contentTypes.textText) {\n        renderTextToCanvas(space, element.getContext(\"2d\"), options);\n    } else if (space.contentType === contentTypes.videoYoutube) {\n        renderYoutubeVideoToElement(space, element, options);\n    } else if (\n        space.contentType &&\n        space.contentType.includes(contentTypes.imageImage)\n    ) {\n        renderImageToElement(space, element, options);\n    } else if (space.contentType && isVideo(space.contentType)) {\n        renderVideoToElement(space, element, options);\n    } else if (space.contentType && isAudio(space.contentType)) {\n        renderAudioToElement(space, element, options);\n    } else if (space.contentType === contentTypes.json) {\n        renderJsonToElement(space, element, options);\n    }\n};\n\n/**\n *\n * @param {*} space\n * @param {*} element\n * @param {*} opts\n */\nexport const renderCellToElement = function renderCellToElement(\n    space,\n    element,\n    opts\n) {\n    const options = getOptions(opts);\n    const elementToDrawIn = createElementForSpace(space);\n    element.appendChild(elementToDrawIn);\n    setElementToParentSize(elementToDrawIn, element, options);\n    renderSpaceIntoElement(space, elementToDrawIn, options);\n};\n","/**\n * Renderers are generic components without any dependencies.\n * They can be called from the SDK, universe and fullscreen mode\n * At somepoint this could be split out into an npm package\n * We will also write a block post on drawing text into a box.\n */\n\nconst LEFTRIGHTPADDING = 4; // 5px of padding\n// const LEFTRIGHTPADDING = 0.05; // 5px of the space padding\nconst MAX_FONT_SIZE = 400;\nconst MIN_FONT_SIZE = 0;\n\nconst defaultProperties = {\n    alignment: \"left\",\n    \"font-weight\": \"100\",\n    \"font-style\": [],\n    \"font-multiplier\": 1,\n    \"font-family\": \"Roboto Slab\",\n    color: \"#000000\"\n};\n\nconst isNumeric = function isNumeric(text) {\n    let t = text;\n    if (typeof t === \"string\") {\n        t = Number(t.split(\",\").join(\"\"));\n    }\n    return !Number.isNaN(t);\n};\n\n/**\n *\n * @param {*} alignment The alignment of the text\n * @param {*} x The leftmost x position for the canvas coords\n * @param {*} width the width of the box\n */\nconst findXStart = function findXStart(alignment, x, width) {\n    switch (alignment) {\n        case \"center\":\n            return x + width / 2;\n        case \"left\":\n            return x + LEFTRIGHTPADDING;\n        case \"right\":\n            return x + width - LEFTRIGHTPADDING;\n        default:\n            console.error(\n                `[TextRenderer] Incorrect alignment value ${alignment}`\n            );\n    }\n};\n\nconst findYStart = function findYStart(y, height) {\n    return y + height / 2;\n};\n\nexport const getFontStyleFromProperties = function getFontStyleFromProperties(\n    properties,\n    size\n) {\n    return `${properties[\"font-weight\"]} ${\n        properties[\"font-style\"]\n    } ${size}px ${properties[\"font-family\"]}`;\n};\n\nconst setDefaultAlignmentRightIfNumeric = function setDefaultAlignmentRightIfNumeric(\n    properties,\n    isNumber,\n    currentAlignment\n) {\n    if ((!properties || !properties.alignment) && isNumber) {\n        return \"right\";\n    }\n    return currentAlignment;\n};\n\nexport const getFontProperties = function getFontProperties(properties) {\n    return !properties\n        ? { ...defaultProperties }\n        : Object.assign({}, defaultProperties, properties);\n};\n\nconst setContextFontProperties = function setContextFontProperties(\n    ctx,\n    properties,\n    size,\n    width,\n    height\n) {\n    if (properties && properties.backgroundColor) {\n        ctx.fillStyle = properties.backgroundColor;\n        ctx.fillRect(0, 0, width, height);\n    }\n    ctx.font = getFontStyleFromProperties(properties, size);\n    ctx.fillStyle = properties.color;\n    ctx.textBaseline = \"middle\"; // Vertical alignment to middle.\n    ctx.textAlign = properties.alignment;\n};\n\nconst calculateRelativeSizeFont = function calculateRelativeSizeFont(\n    props,\n    fontSize\n) {\n    return fontSize * props[\"font-multiplier\"];\n};\n\nconst setContextForNativeDraw = function setContextForNativeDraw(\n    ctx,\n    properties,\n    fontSize,\n    isNumber,\n    width,\n    height\n) {\n    const props = getFontProperties(properties);\n\n    // Set default alignment, if it's a number right align, otherwise center\n    props.alignment = setDefaultAlignmentRightIfNumeric(\n        properties,\n        isNumber,\n        props.alignment\n    );\n\n    const relativeFontSize = calculateRelativeSizeFont(props, fontSize);\n    setContextFontProperties(ctx, props, relativeFontSize, width, height);\n    return props;\n};\n\nconst createMiniCanvas = function createMiniCanvas(width, height) {\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = width;\n    canvas.height = height;\n    const ctx = canvas.getContext(\"2d\");\n    ctx.clearRect(0, 0, width, height);\n    return canvas;\n};\n\nconst truncateWideText = function truncateWideText(\n    text,\n    properties,\n    width,\n    height,\n    fontSize\n) {\n    const textCanvas = createMiniCanvas(width, height);\n    const ctx = textCanvas.getContext(\"2d\");\n\n    const props = setContextForNativeDraw(\n        ctx,\n        properties,\n        fontSize,\n        isNumeric(text),\n        width,\n        height\n    );\n    ctx.fillText(\n        text,\n        findXStart(props.alignment, 0, width),\n        findYStart(0, height)\n    );\n\n    return textCanvas;\n};\n\nconst drawFittedTextOnMiniCanvas = function drawFittedTextOnMiniCanvas(\n    text,\n    properties,\n    width,\n    height,\n    fontSize\n) {\n    const textCanvas = createMiniCanvas(width, height);\n    const ctx = textCanvas.getContext(\"2d\");\n\n    setContextFontProperties(ctx, properties, fontSize, width, height);\n\n    ctx.fillText(\n        text,\n        findXStart(properties.alignment, 0, width),\n        findYStart(0, height)\n    );\n\n    return textCanvas;\n};\n\n/**\n * https://www.goodboydigital.com/pixijs/docs/files/src_pixi_Text.js.html determineFontHeight\n * There is no easy way to measure the height of text on a canvas. We could consider hard coding the\n * height of fonts. But there isn't always a great calculate for each font type.\n * This might be slow and we should consider caching results.\n * @param {*} fontStyle\n */\nexport const getFontHeight = function getFontHeight(fontStyle) {\n    const div = document.createElement(\"div\");\n\n    // Put an M in the div this is a high character.\n    // Once the text is appended to the DOM we can inspect it's height.\n    div.appendChild(document.createTextNode(\"M\"));\n    div.style.font = fontStyle;\n    div.style.alignSelf = \"flex-start\";\n    document.body.appendChild(div);\n\n    const result = div.offsetHeight;\n    // Once we're done remove the div leaving no trace.\n    document.body.removeChild(div);\n    return result + 1; // Add one for a bit of extra space between lines\n};\n\nconst getLinePosition = function getLinePosition(y, lineCount, fontHeight) {\n    return y + fontHeight * lineCount;\n};\n\nconst shortenWordToFitWidth = function shortenWordToFitWidth(\n    ctx,\n    currentWord,\n    width\n) {\n    let text = currentWord;\n    // If the current word is too long for the space\n    // Consider a binary search here\n    while (ctx.measureText(text).width > width) {\n        // Shorten it by one character until it fits\n        text = text.substring(0, text.length - 1);\n        // If none of the letters fit write the first one.\n        if (text.length === 0) {\n            return currentWord[0];\n        }\n    }\n\n    return text;\n};\n\n/**\n * @param ctx The canvas context to draw on\n * @param text The text to draw\n * @param x The location on the canvas to draw the text\n * @param y The location on the canvas to draw the text\n * @param width The width of the text to draw\n * @param height The height of the text to draw\n * @param fontProperties The font properties, font style, weight, bold, italic etc.\n */\nexport function drawNativeText(text, width, height, fontProperties) {\n    // Find fontsize\n    const fontSize = height / 2;\n    // Set the context to the properties\n    // Test drawing the text\n    // Draw on a mini canvas\n    const truncatedTextImage = truncateWideText(\n        text,\n        fontProperties,\n        width,\n        height,\n        fontSize\n    );\n    return truncatedTextImage;\n}\n\n/**\n * Draws text that fits within the bounding box.\n * https://github.com/STRML/textFit/blob/master/textFit.js\n * Algorithm one -\n * 1. place text into a div, with the width and height set to the same as the space\n * 2. measure the scroll distance on the span\n * 3. if the span scroll distance is longer than the size of the div make text smaller.\n * 4. if the scroll distance is the same, make the text bigger.\n *\n * https://gist.githubusercontent.com/videlais/9588989/raw/f2c60f3421308806a4842e884461ec432ed16422/fontHeight.js\n * Algorithm two -\n * 1. draw the text on a hidden canvas\n * 2. place the letter M (highest letter) into a span\n * 3. use context2d measure text to determine the width\n * 4. measure the height of the span to determine the height of the text\n * 5. if the text is within the bounds, make it bigger. If it's outside make it smaller\n * @param {*} ctx\n * @param {*} text\n * @param {*} x\n * @param {*} y\n * @param {*} width\n * @param {*} height\n * @param {*} fontProperties\n */\nexport function drawFittedText(text, w, h, fontProperties) {\n    // Flooring the width and height is required because the span.scrollwidth/height is rounded to nearest whole number.\n    const width = Math.floor(w);\n    const height = Math.floor(h);\n    let low = MIN_FONT_SIZE + 1;\n    let high = MAX_FONT_SIZE + 1;\n    let proposedSize = (low + high) / 2;\n    const actualProperties = getFontProperties(fontProperties);\n\n    /* \n        Alternate span implementation\n    */\n    const span = document.createElement(\"span\");\n    span.style.display = \"inline-block\";\n    span.style.width = `${width}px`;\n    span.style.height = `${height}px`;\n    span.style.textAlign = \"center\";\n    span.style.whiteSpace = \"nowrap\";\n    span.innerHTML = text;\n    document.body.appendChild(span);\n\n    while (low <= high) {\n        proposedSize = (low + high) / 2;\n        const fontStyle = getFontStyleFromProperties(\n            actualProperties,\n            proposedSize\n        );\n        span.style.font = fontStyle;\n        // ctx.font = fontStyle;\n\n        // We have two implementations here at the moment. One that use's measure text and\n        // a span for line height, which has it\n        // An alternative implementation would be to make a span with the right width / height\n        // Keep changing the font properties checking the scroll width and height like text fit does.\n        // If we are under sized\n        // if (ctx.measureText(text).width < width && getFontHeight(fontStyle) < height) {\n        if (span.scrollWidth <= width && span.scrollHeight <= height) {\n            low = proposedSize + 1;\n        } else {\n            // If we are oversized\n            high = proposedSize - 1;\n        }\n    }\n\n    // When exiting the loop we have 1 px more font size than we need.\n    document.body.removeChild(span);\n\n    const image = drawFittedTextOnMiniCanvas(\n        text,\n        actualProperties,\n        w,\n        h,\n        proposedSize - 1\n    );\n\n    return image;\n}\n\nexport function drawWrappedText(text, width, height, fontProperties) {\n    const actualProperties = getFontProperties(fontProperties);\n    const miniCanvas = createMiniCanvas(width, height);\n    const ctx = miniCanvas.getContext(\"2d\");\n\n    // X, ys for drawing on the mini canvas\n    const localX = findXStart(actualProperties.alignment, 0, width);\n    const localY = 0;\n\n    const fontSize = calculateRelativeSizeFont(actualProperties, height / 2);\n    setContextFontProperties(ctx, actualProperties, fontSize, width, height);\n    ctx.textBaseline = \"top\";\n\n    const words = text.split(\" \"); // Split on - and _, . as well\n    const fontHeight = getFontHeight(\n        getFontStyleFromProperties(actualProperties, fontSize)\n    );\n    let lineAccumulator = \"\";\n    let linesWritten = 0;\n\n    for (let i = 0; i < words.length; i += 1) {\n        const currentWord = words[i];\n        const shortenedWord = shortenWordToFitWidth(ctx, currentWord, width);\n\n        // if we have had to chop the word\n        if (currentWord !== shortenedWord) {\n            // splice the remaining part of the word into the array at the next index for processing later\n            words.splice(i + 1, 0, words[i].substr(shortenedWord.length));\n        }\n\n        const currentLine = `${lineAccumulator}${shortenedWord} `;\n\n        // If this word has send us over the edge\n        if (ctx.measureText(currentLine).width > width && i !== 0) {\n            // Write to the canvas\n            ctx.fillText(\n                lineAccumulator.trim(),\n                localX,\n                getLinePosition(localY, linesWritten, fontHeight)\n            );\n            // Add this word to the next line\n            lineAccumulator = `${shortenedWord} `;\n            linesWritten += 1;\n        } else {\n            lineAccumulator = currentLine;\n        }\n    }\n\n    ctx.fillText(\n        lineAccumulator,\n        localX,\n        getLinePosition(localY, linesWritten, fontHeight)\n    );\n\n    return miniCanvas;\n}\n\nexport function drawText(text, w, h, properties) {\n    if (properties && properties.content === \"fit\") {\n        return drawFittedText(text, w, h, properties);\n    } else if (properties && properties.content === \"wrap\") {\n        return drawWrappedText(text.toString(), w, h, properties);\n    }\n    return drawNativeText(text, w, h, properties);\n}\n\nexport function getDefaultFontProperties() {\n    return { ...defaultProperties };\n}\n","//\n// The Big Crunch Vizzy SDK\n//\nimport { listenToVizzy } from \"./vizzy\";\nimport Renderers from \"./renderers/\";\nimport { types, contentTypes, BIG_CRUNCH_URL } from \"./constants\";\nimport { crunch, crunchBySpaceName, crunchWithSectorId } from \"./crunch\";\nimport editor from \"./editor\";\n\n// public\n\n// Intialise client as a vizzy. Options:\n// - spaceId: register for updates to the specified space ID. Defaults to `id` from query paramters.\n// - selector: element will be injected with native values.\n// - onConfig: function will be invoked with vizzy custom config if available.\n// - onChange: function will be invoked with cell data, including value and inputs.\n\nconst addWindowEvents = () => {\n    window.addEventListener(\"mousedown\", event => {\n        parent.postMessage({ type: \"vizzyMouseDown\" }, \"*\");\n    });\n\n    window.addEventListener(\"mouseup\", event => {\n        parent.postMessage({ type: \"vizzyMouseUp\" }, \"*\");\n    });\n\n    window.addEventListener(\"mouseout\", event => {\n        parent.postMessage({ type: \"vizzyMouseout\" }, \"*\");\n    });\n\n    window.addEventListener(\"dragstart\", event => {\n        parent.postMessage({ type: \"vizzyMouseDown\" }, \"*\");\n    });\n\n    window.addEventListener(\"dragend\", event => {\n        parent.postMessage({ type: \"vizzyMouseUp\" }, \"*\");\n    });\n\n    window.addEventListener(\"mouseout\", event => {\n        parent.postMessage({ type: \"vizzyMouseout\" }, \"*\");\n    });\n\n    window.addEventListener(\"mouseout\", event => {\n        parent.postMessage({ type: \"vizzyMouseout\" }, \"*\");\n    });\n\n    document.addEventListener(\"copy\", event => {\n        event.preventDefault();\n        event.clipboardData.setData(\"application/tbc-range\", \"vizzy-range\");\n        parent.postMessage({ type: \"vizzyCopy\" }, \"*\");\n    });\n\n    window.addEventListener(\"keyup\", event => {\n        switch (event.key) {\n            case \"Shift\":\n                parent.postMessage({ type: \"vizzyShiftUp\" }, \"*\");\n                break;\n        }\n    });\n\n    window.addEventListener(\"keydown\", event => {\n        switch (event.key) {\n            case \"ArrowLeft\":\n                parent.postMessage({ type: \"vizzyLeft\" }, \"*\");\n                break;\n            case \"ArrowRight\":\n                parent.postMessage({ type: \"vizzyRight\" }, \"*\");\n                break;\n            case \"ArrowDown\":\n                parent.postMessage({ type: \"vizzyDown\" }, \"*\");\n                break;\n            case \"ArrowUp\":\n                parent.postMessage({ type: \"vizzyUp\" }, \"*\");\n                break;\n            case \"1\":\n                parent.postMessage({ type: \"vizzyOne\" }, \"*\");\n                break;\n            case \"2\":\n                parent.postMessage({ type: \"vizzyTwo\" }, \"*\");\n                break;\n            case \"Enter\":\n                if (event.metaKey || event.ctrlKey) {\n                    parent.postMessage({ type: \"vizzyCtrlEnter\" }, \"*\");\n                } else {\n                    // TODO: how to find the target origin\n                    parent.postMessage({ type: \"vizzyEnter\" }, \"*\");\n                }\n                break;\n            case \"m\":\n                if (event.metaKey || event.ctrlKey) {\n                    parent.postMessage({ type: \"vizzyMerge\" }, \"*\");\n                }\n                e.preventDefault();\n                e.stopPropagation();\n                break;\n            case \"u\":\n                if (event.metaKey || event.ctrlKey) {\n                    parent.postMessage({ type: \"vizzyUnMerge\" }, \"*\");\n                }\n                e.preventDefault();\n                e.stopPropagation();\n                break;\n            case \"+\":\n                parent.postMessage({ type: \"vizzyFormula\" }, \"*\");\n                break;\n            case \"Delete\":\n            case \"Backspace\":\n                parent.postMessage({ type: \"vizzyClear\" }, \"*\");\n                break;\n            case \"Shift\":\n                parent.postMessage({ type: \"vizzyShiftDown\" }, \"*\");\n                break;\n        }\n    });\n\n    window.addEventListener(\"dblclick\", event => {\n        parent.postMessage({ type: \"vizzyDblClick\" }, \"*\");\n    });\n\n    window.addEventListener(\"mousemove\", event => {\n        if (event.buttons === 1 && (event.ctrlKey || event.metaKey)) {\n            parent.postMessage(\n                {\n                    type: \"vizzyPan\",\n                    event: {\n                        clientX: event.clientX,\n                        clientY: event.clientY,\n                        ctrlKey: event.ctrlKey,\n                        metaKey: event.metaKey\n                    }\n                },\n                \"*\"\n            );\n        }\n        if (event.buttons === 1) {\n            parent.postMessage(\n                {\n                    type: \"vizzyMousemove\",\n                    event: {\n                        clientX: event.clientX,\n                        clientY: event.clientY,\n                        shiftKey: event.shiftKey\n                    }\n                },\n                \"*\"\n            );\n        }\n    });\n\n    function scroll(event) {\n        parent.postMessage(\n            {\n                type: \"vizzyScroll\",\n                event: {\n                    deltaX: event.deltaX,\n                    deltaY: event.deltaY,\n                    deltaMode: event.deltaMode,\n                    wheelDeltaX: event.wheelDeltaX,\n                    wheelDeltaY: event.wheelDeltaY\n                }\n            },\n            \"*\"\n        );\n        event.preventDefault();\n        event.stopPropagation();\n        return false;\n    }\n\n    window.addEventListener(\"DOMMouseScroll\", scroll, { passive: false });\n    window.addEventListener(\"wheel\", scroll, { passive: false });\n};\n\nconst addUniverseEventListeners = function addUniverseEventListeners() {\n    if (!window.TBCAddedEvents) {\n        window.TBCAddedEvents = true;\n        addWindowEvents();\n    }\n};\n\nconst vizzy = (options = {}) => {\n    listenToVizzy(options);\n\n    if (window.location.href.indexOf(\"universe=true\") > -1) {\n        addUniverseEventListeners();\n    }\n};\n\nconst messageHandlers = {\n    zoomFactorChanged: ({ zoomFactor }) => {\n        const scaleOnZoom = queryParams.get(\"scaleOnZoom\");\n\n        if (scaleOnZoom) {\n            document.body.style.zoom = zoomFactor;\n        }\n    }\n};\n\nwindow.addEventListener(\"message\", e => {\n    if (e && e.data && e.data.type && e.data.data) {\n        const { type, data } = e.data;\n        const handler = type ? messageHandlers[type] : null;\n        if (handler) handler(data); // Note: webpack sends messages too, so ignore them.\n    }\n});\n\nconst tbc = {\n    vizzy,\n    crunch,\n    crunchBySpaceName,\n    crunchWithSectorId,\n    renderImageToCanvas: Renderers.renderImageToCanvas,\n    renderTextToElement: Renderers.renderTextToElement,\n    renderVisualisationToElement: Renderers.renderVisualisationToElement,\n    renderLayersToElement: Renderers.renderLayersToElement,\n    renderGifToElement: Renderers.renderGifToElement,\n    renderTextToCanvas: Renderers.renderTextToCanvas,\n    renderCellToElement: Renderers.renderCellToElement,\n    types,\n    contentTypes,\n    BIG_CRUNCH_URL,\n    editor,\n    edit: editor.edit\n};\n\nexport default tbc;\n","import { getConfig } from \"./config\";\n\nconst isS3AssetEnabled = () => getConfig().assetProvider === \"s3\";\n\n/**\n * if s3 asset is enabled, it will return s3 domain name otherwise return cdn domain\n */\nconst getCdnUrlPrefix = () => {\n    if (isS3AssetEnabled()) {\n        return `${getConfig().s3Domain}/`;\n    }\n    const protocol = getConfig().nginxMainPort === \"443\" ? \"https\" : \"http\";\n\n    return `${protocol}://${getConfig().cdnDomain}:${\n        getConfig().nginxMainPort\n    }/`;\n};\n\n/**\n * this method is used to make sure assets path is compitable between local and s3\n * local nginx path is using `cell_images` while s3 path is `images/cell`\n * @param {*} url\n */\nconst convertUrlToPath = url => {\n    if (isS3AssetEnabled()) {\n        const items = url.split(\"_\");\n        if (items.length > 1) {\n            return `${items[1]}/${items[0]}s/`;\n        }\n    }\n    return `${url}/`;\n};\n\nconst getImageUrlPrefix = () =>\n    `${getCdnUrlPrefix()}${convertUrlToPath(getConfig().imageUrl)}`;\nconst getVideoUrlPrefix = () =>\n    `${getCdnUrlPrefix()}${convertUrlToPath(getConfig().videoUrl)}`;\nconst getAudioUrlPrefix = () =>\n    `${getCdnUrlPrefix()}${convertUrlToPath(getConfig().audioUrl)}`;\n\nconst removeSlash = space => {\n    if (space && space.value.charAt(0) === \"/\") {\n        return space.value.substring(1);\n    }\n\n    return space.value;\n};\nexport const getSpaceImageUrl = function getSpaceImageUrl(space) {\n    // hack hack hack for CSIRO TODO FIX FLASH 20/04/2018\n    if (space.value.indexOf(\"://\") !== -1) {\n        return space.value;\n    }\n    return `${getImageUrlPrefix()}${removeSlash(space)}`;\n};\n\nexport const getSpaceVideoUrl = function getSpaceVideoUrl(space) {\n    return `${getVideoUrlPrefix()}${removeSlash(space)}`;\n};\n\nexport const getSpaceAudioUrl = function getSpaceAudioUrl(space) {\n    return `${getAudioUrlPrefix()}${removeSlash(space)}`;\n};\n\nexport const getAppImageUrl = function getAppImageUrl(appname) {\n    return `${getCdnUrlPrefix()}${\n        getConfig().appStoreImagesUrl\n    }/${appname}.png`;\n};\n\nconst getWebServerUrl = function getWebServerUrl() {\n    let port = \"\";\n    if (!getConfig().isS3AssetEnabled) {\n        port = `:${getConfig().nginxMainPort}`;\n    } else if (window.location.port !== \"\") {\n        port = `:${window.location.port}`;\n    }\n    return `${getConfig().sdkConnectionUrl}${port}`;\n};\n\nexport const getAppStoreEndPoint = function getAppStoreEndPoint() {\n    return `${getWebServerUrl()}/${getConfig().appStoreEndPoint}`;\n};\n\nexport const getSpaceVizzyUrl = function getSpaceVizzyUrl(spaceId) {\n    return `${getWebServerUrl()}/${getConfig().vizziesUrl}/${spaceId}`;\n};\n\nexport const getSpaceVizzySourceUrl = function getSpaceVizzySourceUrl(spaceId) {\n    return `${getWebServerUrl()}/${getConfig().vizziesUrl}/source/${spaceId}`;\n};\n\nexport const getWebViewLink = function getWebViewLink(space) {\n    return `${getConfig().webViewUrl}/v/${space.encodedUuid}`;\n};\n\nexport const getProfilePictureUrl = function getProfilePictureUrl(user) {\n    // Hard coded, should be configurable later.\n    return `${getCdnUrlPrefix()}profilepictures/users/${user.profilePicture}`;\n};\n\n// Sometimes users don't have usernames. This should be! So in the mean time\n// lets make it handle both cases.\nexport const getUserProfileUrl = function getUserProfileUrl(user) {\n    let url = getConfig().webViewUrl;\n    if (!user) return url;\n    else\n        return user.username\n            ? `${url}/u/${user.username}`\n            : `${url}/u/id/${user.id}`;\n};\n","import io from \"socket.io-client\";\nimport \"url-search-params-polyfill\";\nimport { getConfig } from \"./config\";\n\nconst inputParameters = {}; // save and collect up inputs as they come in\nconst inputCells = {}; // The cell objects of the inputs.\nconst inputsOriginalOrdered = {};\nconst queryParams = new URLSearchParams(window.location.search);\n\nlet vizzySocket;\n\nconst customConfig = (() => {\n    const c = queryParams.get(\"customConfig\");\n    return c ? JSON.parse(decodeURIComponent(c)) : null;\n})();\n\nconst sortParametersByIndex = function sortParametersByIndex(parameters) {\n    return Object.keys(parameters)\n        .map(id => ({\n            id,\n            name: parameters[id].name,\n            value: parameters[id].value,\n            index: parameters[id].index,\n            cell: parameters[id].cell\n        }))\n        .sort((a, b) => a.index - b.index);\n};\n\n// Build two lists:\n//  1/ the orignal list, in index order, including ids.\n//  2/ the inputs[] list for vizzies to access vi array or by name and for updates individual items\nconst buildParameterInputsList = function buildParameterInputsList(\n    spaceId,\n    parameters\n) {\n    sortParametersByIndex(parameters).forEach(input => {\n        inputsOriginalOrdered[spaceId].push(input);\n        // make names available by name in the input object\n        if (input.name) {\n            inputParameters[spaceId][input.name] = input.value;\n            inputCells[spaceId][input.name] = input.cell;\n        }\n\n        // make every variable (named or unnamed) available by index\n        inputParameters[spaceId].push(input.value);\n        inputCells[spaceId].push(input.cell);\n    });\n};\n\n// Get the positional index into the inputs array of the give param id thats stored in the origianl ordered list\nconst getIndexOfParam = function getIndexOfParam(spaceId, paramId) {\n    const input = inputsOriginalOrdered[spaceId].find(e => e.id === paramId);\n\n    return input.index;\n};\n\nconst callTBCReady = function callTBCReady() {\n    if (window && window.tbcReady) {\n        window.tbcReady();\n    }\n};\n\n// Vizzies use this method to connect to the server for the first time and start to receive their\n// initial prarameters and subsequent ones.\n//\n// TODO: Handle delete param\n// TODO: Disconnect any existing sockets here so we don't get old update'\n// TODO: pass in the same of the parameter which has been updated\n//\nconst listenForVizzyParams = function listenForVizzyParams(spaceId, onChange) {\n    inputsOriginalOrdered[spaceId] = [];\n    inputParameters[spaceId] = [];\n    inputCells[spaceId] = [];\n\n    if (!vizzySocket) {\n        vizzySocket = io(getConfig().spacesSocketUrl);\n    }\n    vizzySocket\n        .on(\"all_params_update\", (id, data) => {\n            if (id === spaceId) {\n                buildParameterInputsList(spaceId, data);\n                onChange(inputParameters[spaceId], inputCells[spaceId]); // tell the vizzy we have its inputs\n                callTBCReady();\n            }\n        })\n        .on(\"params_update\", (id, input, spaceUuid) => {\n            // id is location tbc_x_y and spaceuuid is the uuid\n            if (id !== spaceId && spaceUuid !== spaceId) {\n                // If this update isn't for this space forget it.\n                return;\n            }\n            if (inputsOriginalOrdered[spaceId].length === 0) {\n                // We haven't received the original parameters for this space.\n                return;\n            }\n            // - Only poke in a few updates, no need to rebuild lists\n            const inputIndex = getIndexOfParam(spaceId, input.param);\n            inputParameters[spaceId][inputIndex] = input.value;\n            inputCells[spaceId][inputIndex] = input.cell;\n\n            // If this is a named parameter we also need to put it into the name because values aren't stored by reference like array params.\n            if (input.paramName !== null) {\n                inputParameters[spaceId][input.paramName] = input.value;\n                inputCells[spaceId][input.paramName] = input.cell;\n            }\n\n            onChange(inputParameters[spaceId], inputCells[spaceId]);\n            callTBCReady();\n        })\n        .on(\"array_param_update\", (id, arrayValueUpdate, spaceUuid) => {\n            //id is location tbc_x_y and spaceuuid is the uuid\n            if (id !== spaceId && spaceUuid !== spaceId) {\n                // If this update isn't for this space forget it.\n                return;\n            }\n\n            if (inputsOriginalOrdered[spaceId].length === 0) {\n                // We haven't received the original parameters for this space.\n                return;\n            }\n            // inject the array value into its position in the parameter array\n            // Get the index of the parameter from the original list\n            const inputIndex = getIndexOfParam(spaceId, arrayValueUpdate.param);\n            const inputArray = inputParameters[spaceId][inputIndex];\n            const inputCellArray = inputCells[spaceId][inputIndex];\n\n            if (inputArray) {\n                inputArray[arrayValueUpdate.offset.y][\n                    arrayValueUpdate.offset.x\n                ] = arrayValueUpdate.value;\n                inputCellArray[arrayValueUpdate.offset.y][\n                    arrayValueUpdate.offset.x\n                ] = arrayValueUpdate.cell;\n                onChange(inputParameters[spaceId], inputCells[spaceId]); // Give the vizzy everything back, not just the one that was ListeningStateChangedEvent. Could change this.\n            } else {\n                inputArray[arrayValueUpdate.offset.y][\n                    arrayValueUpdate.offset.x\n                ] = arrayValueUpdate.value;\n                inputCellArray[arrayValueUpdate.offset.y][\n                    arrayValueUpdate.offset.x\n                ] = arrayValueUpdate.cell;\n                onChange(inputParameters[spaceId], inputCells[spaceId]);\n            }\n            callTBCReady();\n        });\n    vizzySocket.emit(\"join\", spaceId);\n};\n\nexport const listenToVizzy = function listenToVizzy(options = []) {\n    const { onChange, onConfig } = options;\n\n    if (onConfig && customConfig) onConfig(customConfig);\n\n    let spaceId;\n    if (options.spaceId) {\n        spaceId = options.spaceId;\n    } else if (\n        document.currentScript &&\n        document.currentScript.getAttribute(\"data-tbc-id\")\n    ) {\n        // document.currentScript is not support in IE 11.\n        spaceId = atob(document.currentScript.getAttribute(\"data-tbc-id\"));\n    } else if (options.spaceId) {\n        spaceId = options.spaceId;\n    } else if (queryParams.get(\"id\")) {\n        spaceId = queryParams.get(\"id\");\n    }\n\n    if (!spaceId) {\n        console.error(\"The cell ID was not provided to TBC.vizzy\");\n        return;\n    }\n\n    // Reset the input parameters for this space\n    inputParameters[spaceId] = {};\n\n    // Listen to changes to the vizzy parameters (if we actually do something with them)\n    if (onChange) {\n        listenForVizzyParams(spaceId, onChange);\n    }\n};\n","/* (ignored) */"],"sourceRoot":""}