| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | 
							- var r;
 
- module.exports = function rand(len) {
 
-   if (!r)
 
-     r = new Rand(null);
 
-   return r.generate(len);
 
- };
 
- function Rand(rand) {
 
-   this.rand = rand;
 
- }
 
- module.exports.Rand = Rand;
 
- Rand.prototype.generate = function generate(len) {
 
-   return this._rand(len);
 
- };
 
- // Emulate crypto API using randy
 
- Rand.prototype._rand = function _rand(n) {
 
-   if (this.rand.getBytes)
 
-     return this.rand.getBytes(n);
 
-   var res = new Uint8Array(n);
 
-   for (var i = 0; i < res.length; i++)
 
-     res[i] = this.rand.getByte();
 
-   return res;
 
- };
 
- if (typeof self === 'object') {
 
-   if (self.crypto && self.crypto.getRandomValues) {
 
-     // Modern browsers
 
-     Rand.prototype._rand = function _rand(n) {
 
-       var arr = new Uint8Array(n);
 
-       self.crypto.getRandomValues(arr);
 
-       return arr;
 
-     };
 
-   } else if (self.msCrypto && self.msCrypto.getRandomValues) {
 
-     // IE
 
-     Rand.prototype._rand = function _rand(n) {
 
-       var arr = new Uint8Array(n);
 
-       self.msCrypto.getRandomValues(arr);
 
-       return arr;
 
-     };
 
-   // Safari's WebWorkers do not have `crypto`
 
-   } else if (typeof window === 'object') {
 
-     // Old junk
 
-     Rand.prototype._rand = function() {
 
-       throw new Error('Not implemented yet');
 
-     };
 
-   }
 
- } else {
 
-   // Node.js or Web worker with no crypto support
 
-   try {
 
-     var crypto = require('crypto');
 
-     if (typeof crypto.randomBytes !== 'function')
 
-       throw new Error('Not supported');
 
-     Rand.prototype._rand = function _rand(n) {
 
-       return crypto.randomBytes(n);
 
-     };
 
-   } catch (e) {
 
-   }
 
- }
 
 
  |