/* * Fingerprintjs2 0.0.1 - Modern & flexible browser fingerprint library v2 * https://github.com/Valve/fingerprintjs2 * Copyright (c) 2015 Valentin Vasilyev (valentin.vasilyev@outlook.com) * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ (function(name,context,definition){"use strict";if(typeof module!=="undefined"&&module.exports){module.exports=definition();} else if(typeof define==="function"&&define.amd){define(definition);} else{context[name]=definition();}})("Fingerprint2",this,function(){"use strict";var DEBUG=true;var Fingerprint2=function(options){var defaultOptions={swfContainerId:"fingerprintjs2",swfPath:"flash/compiled/FontList.swf"};this.options=this.extend(options,defaultOptions);this.nativeForEach=Array.prototype.forEach;this.nativeMap=Array.prototype.map;};Fingerprint2.prototype={extend:function(source,target){if(source==null){return target;} for(var k in source){if(source[k]!=null&&target[k]!==source[k]){target[k]=source[k];}} return target;},log:function(msg){if(window.console){console.log(msg);}},get:function(done){var keys=[];keys=this.userAgentKey(keys);keys=this.languageKey(keys);keys=this.colorDepthKey(keys);keys=this.screenResolutionKey(keys);keys=this.timezoneOffsetKey(keys);keys=this.sessionStorageKey(keys);keys=this.localStorageKey(keys);keys=this.indexedDbKey(keys);keys=this.addBehaviorKey(keys);keys=this.openDatabaseKey(keys);keys=this.cpuClassKey(keys);keys=this.platformKey(keys);keys=this.doNotTrackKey(keys);keys=this.canvasKey(keys);var that=this;this.flashFontsKey(keys,function(newKeys){var murmur=that.x64hash128(newKeys.join("~~~"),31);return done(murmur);});},userAgentKey:function(keys){if(!this.options.excludeUserAgent){keys.push(navigator.userAgent);} return keys;},languageKey:function(keys){if(!this.options.excludeLanguage){keys.push(navigator.language);} return keys;},colorDepthKey:function(keys){if(!this.options.excludeColorDepth){keys.push(screen.colorDepth);} return keys;},screenResolutionKey:function(keys){if(!this.options.excludeScreenResolution){var resolution=this.getScreenResolution();if(typeof resolution!=="undefined"){keys.push(resolution.join("x"));}} return keys;},getScreenResolution:function(){var resolution;if(this.options.detectScreenOrientation){resolution=(screen.height>screen.width)?[screen.height,screen.width]:[screen.width,screen.height];}else{resolution=[screen.height,screen.width];} return resolution;},timezoneOffsetKey:function(keys){if(!this.options.excludeTimezoneOffset){keys.push(new Date().getTimezoneOffset());} return keys;},sessionStorageKey:function(keys){if(!this.options.excludeSessionStorage&&this.hasSessionStorage()){keys.push("sessionStorageKey");} return keys;},localStorageKey:function(keys){if(!this.options.excludeSessionStorage&&this.hasLocalStorage()){keys.push("localStorageKey");} return keys;},indexedDbKey:function(keys){if(!this.options.excludeIndexedDB&&this.hasIndexedDB()){keys.push("indexedDbKey");} return keys;},addBehaviorKey:function(keys){if(document.body&&!this.options.excludeAddBehavior&&document.body.addBehavior){keys.push("addBehaviorKey");} return keys;},openDatabaseKey:function(keys){if(!this.options.excludeOpenDatabase&&window.openDatabase){keys.push("openDatabase");} return keys;},cpuClassKey:function(keys){if(!this.options.excludeCpuClass){keys.push(this.getNavigatorCpuClass());} return keys;},platformKey:function(keys){if(!this.options.excludePlatform){keys.push(this.getNavigatorPlatform());} return keys;},doNotTrackKey:function(keys){if(!this.options.excludeDoNotTrack){keys.push(this.getDoNotTrack());} return keys;},canvasKey:function(keys){if(!this.options.excludeCanvas&&this.isCanvasSupported()){keys.push(this.getCanvasFp());} return keys;},flashFontsKey:function(keys,done){if(this.options.excludeFlashFonts){if(DEBUG){this.log("Skipping flash fonts detection per excludeFlashFonts configuration option");} return done(keys);} if(!this.hasSwfObjectLoaded()){if(DEBUG){this.log("Swfobject is not detected, Flash fonts enumeration is skipped");} return done(keys);} if(!this.hasMinFlashInstalled()){if(DEBUG){this.log("Flash is not installed, skipping Flash fonts enumeration");} return done(keys);} if(typeof this.options.swfPath==="undefined"){if(DEBUG){this.log("To use Flash fonts detection, you must pass the swfPath option, skipping Flash fonts enumeration");} return done(keys);} this.loadSwfAndDetectFonts(function(fonts){keys.push(fonts.join(";"));done(keys);});},hasSessionStorage:function(){try{return!!window.sessionStorage;}catch(e){return true;}},hasLocalStorage:function(){try{return!!window.localStorage;}catch(e){return true;}},hasIndexedDB:function(){return!!window.indexedDB;},getNavigatorCpuClass:function(){if(navigator.cpuClass){return"navigatorCpuClass: "+navigator.cpuClass;}else{return"navigatorCpuClass: unknown";}},getNavigatorPlatform:function(){if(navigator.platform){return"navigatorPlatform: "+navigator.platform;}else{return"navigatorPlatform: unknown";}},getDoNotTrack:function(){if(navigator.doNotTrack){return"doNotTrack: "+navigator.doNotTrack;}else{return"doNotTrack: unknown";}},getCanvasFp:function(){var canvas=document.createElement("canvas");var ctx=canvas.getContext("2d");var txt="Cwm fjordbank glyphs vext quiz, https://github.com/valve ὠ";ctx.textBaseline="top";ctx.font="70px 'Arial'";ctx.textBaseline="alphabetic";ctx.fillStyle="#f60";ctx.fillRect(125,1,62,20);ctx.fillStyle="#069";ctx.fillText(txt,2,15);ctx.fillStyle="rgba(102, 204, 0, 0.7)";ctx.fillText(txt,4,17);return canvas.toDataURL();},isCanvasSupported:function(){var elem=document.createElement("canvas");return!!(elem.getContext&&elem.getContext("2d"));},hasSwfObjectLoaded:function(){return typeof window.swfobject!=="undefined";},hasMinFlashInstalled:function(){return swfobject.hasFlashPlayerVersion("9.0.0");},addFlashDivNode:function(){var node=document.createElement("div");node.setAttribute("id",this.options.swfContainerId);document.body.appendChild(node);},loadSwfAndDetectFonts:function(done){var hiddenCallback="___fp_swf_loaded";window[hiddenCallback]=function(fonts){done(fonts);};var id=this.options.swfContainerId;this.addFlashDivNode();var flashvars={onReady:hiddenCallback};var flashparams={allowScriptAccess:"always",menu:"false"};swfobject.embedSWF(this.options.swfPath,id,"1","1","9.0.0",false,flashvars,flashparams,{});},each:function(obj,iterator,context){if(obj===null){return;} if(this.nativeForEach&&obj.forEach===this.nativeForEach){obj.forEach(iterator,context);}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i>>16,m[0]&0xffff,m[1]>>>16,m[1]&0xffff];n=[n[0]>>>16,n[0]&0xffff,n[1]>>>16,n[1]&0xffff];var o=[0,0,0,0];o[3]+=m[3]+n[3];o[2]+=o[3]>>>16;o[3]&=0xffff;o[2]+=m[2]+n[2];o[1]+=o[2]>>>16;o[2]&=0xffff;o[1]+=m[1]+n[1];o[0]+=o[1]>>>16;o[1]&=0xffff;o[0]+=m[0]+n[0];o[0]&=0xffff;return[(o[0]<<16)|o[1],(o[2]<<16)|o[3]];},x64Multiply:function(m,n){m=[m[0]>>>16,m[0]&0xffff,m[1]>>>16,m[1]&0xffff];n=[n[0]>>>16,n[0]&0xffff,n[1]>>>16,n[1]&0xffff];var o=[0,0,0,0];o[3]+=m[3]*n[3];o[2]+=o[3]>>>16;o[3]&=0xffff;o[2]+=m[2]*n[3];o[1]+=o[2]>>>16;o[2]&=0xffff;o[2]+=m[3]*n[2];o[1]+=o[2]>>>16;o[2]&=0xffff;o[1]+=m[1]*n[3];o[0]+=o[1]>>>16;o[1]&=0xffff;o[1]+=m[2]*n[2];o[0]+=o[1]>>>16;o[1]&=0xffff;o[1]+=m[3]*n[1];o[0]+=o[1]>>>16;o[1]&=0xffff;o[0]+=(m[0]*n[3])+(m[1]*n[2])+(m[2]*n[1])+(m[3]*n[0]);o[0]&=0xffff;return[(o[0]<<16)|o[1],(o[2]<<16)|o[3]];},x64Rotl:function(m,n){n%=64;if(n===32){return[m[1],m[0]];} else if(n<32){return[(m[0]<>>(32-n)),(m[1]<>>(32-n))];} else{n-=32;return[(m[1]<>>(32-n)),(m[0]<>>(32-n))];}},x64LeftShift:function(m,n){n%=64;if(n===0){return m;} else if(n<32){return[(m[0]<>>(32-n)),m[1]<>>1]);h=this.x64Multiply(h,[0xff51afd7,0xed558ccd]);h=this.x64Xor(h,[0,h[0]>>>1]);h=this.x64Multiply(h,[0xc4ceb9fe,0x1a85ec53]);h=this.x64Xor(h,[0,h[0]>>>1]);return h;},x64hash128:function(key,seed){key=key||"";seed=seed||0;var remainder=key.length%16;var bytes=key.length-remainder;var h1=[0,seed];var h2=[0,seed];var k1=[0,0];var k2=[0,0];var c1=[0x87c37b91,0x114253d5];var c2=[0x4cf5ad43,0x2745937f];for(var i=0;i>>0).toString(16)).slice(-8)+("00000000"+(h1[1]>>>0).toString(16)).slice(-8)+("00000000"+(h2[0]>>>0).toString(16)).slice(-8)+("00000000"+(h2[1]>>>0).toString(16)).slice(-8);}};return Fingerprint2;});