;(function (root, factory) { 
 | 
    if (typeof exports === "object") { 
 | 
        // CommonJS 
 | 
        module.exports = exports = factory(); 
 | 
    } 
 | 
    else if (typeof define === "function" && define.amd) { 
 | 
        // AMD 
 | 
        define([], factory); 
 | 
    } 
 | 
    else { 
 | 
        // Global (browser) 
 | 
        root.CryptoJS = factory(); 
 | 
    } 
 | 
}(this, function () { 
 | 
  
 | 
    /*globals window, global, require*/ 
 | 
  
 | 
    /** 
 | 
     * CryptoJS core components. 
 | 
     */ 
 | 
    var CryptoJS = CryptoJS || (function (Math, undefined) { 
 | 
  
 | 
        var crypto; 
 | 
  
 | 
        // Native crypto from window (Browser) 
 | 
        if (typeof window !== 'undefined' && window.crypto) { 
 | 
            crypto = window.crypto; 
 | 
        } 
 | 
  
 | 
        // Native crypto in web worker (Browser) 
 | 
        if (typeof self !== 'undefined' && self.crypto) { 
 | 
            crypto = self.crypto; 
 | 
        } 
 | 
  
 | 
        // Native crypto from worker 
 | 
        if (typeof globalThis !== 'undefined' && globalThis.crypto) { 
 | 
            crypto = globalThis.crypto; 
 | 
        } 
 | 
  
 | 
        // Native (experimental IE 11) crypto from window (Browser) 
 | 
        if (!crypto && typeof window !== 'undefined' && window.msCrypto) { 
 | 
            crypto = window.msCrypto; 
 | 
        } 
 | 
  
 | 
        // Native crypto from global (NodeJS) 
 | 
        if (!crypto && typeof global !== 'undefined' && global.crypto) { 
 | 
            crypto = global.crypto; 
 | 
        } 
 | 
  
 | 
        // Native crypto import via require (NodeJS) 
 | 
        if (!crypto && typeof require === 'function') { 
 | 
            try { 
 | 
                crypto = require('crypto'); 
 | 
            } catch (err) {} 
 | 
        } 
 | 
  
 | 
        /* 
 | 
         * Cryptographically secure pseudorandom number generator 
 | 
         * 
 | 
         * As Math.random() is cryptographically not safe to use 
 | 
         */ 
 | 
        var cryptoSecureRandomInt = function () { 
 | 
            if (crypto) { 
 | 
                // Use getRandomValues method (Browser) 
 | 
                if (typeof crypto.getRandomValues === 'function') { 
 | 
                    try { 
 | 
                        return crypto.getRandomValues(new Uint32Array(1))[0]; 
 | 
                    } catch (err) {} 
 | 
                } 
 | 
  
 | 
                // Use randomBytes method (NodeJS) 
 | 
                if (typeof crypto.randomBytes === 'function') { 
 | 
                    try { 
 | 
                        return crypto.randomBytes(4).readInt32LE(); 
 | 
                    } catch (err) {} 
 | 
                } 
 | 
            } 
 | 
  
 | 
            throw new Error('Native crypto module could not be used to get secure random number.'); 
 | 
        }; 
 | 
  
 | 
        /* 
 | 
         * Local polyfill of Object.create 
 | 
  
 | 
         */ 
 | 
        var create = Object.create || (function () { 
 | 
            function F() {} 
 | 
  
 | 
            return function (obj) { 
 | 
                var subtype; 
 | 
  
 | 
                F.prototype = obj; 
 | 
  
 | 
                subtype = new F(); 
 | 
  
 | 
                F.prototype = null; 
 | 
  
 | 
                return subtype; 
 | 
            }; 
 | 
        }()); 
 | 
  
 | 
        /** 
 | 
         * CryptoJS namespace. 
 | 
         */ 
 | 
        var C = {}; 
 | 
  
 | 
        /** 
 | 
         * Library namespace. 
 | 
         */ 
 | 
        var C_lib = C.lib = {}; 
 | 
  
 | 
        /** 
 | 
         * Base object for prototypal inheritance. 
 | 
         */ 
 | 
        var Base = C_lib.Base = (function () { 
 | 
  
 | 
  
 | 
            return { 
 | 
                /** 
 | 
                 * Creates a new object that inherits from this object. 
 | 
                 * 
 | 
                 * @param {Object} overrides Properties to copy into the new object. 
 | 
                 * 
 | 
                 * @return {Object} The new object. 
 | 
                 * 
 | 
                 * @static 
 | 
                 * 
 | 
                 * @example 
 | 
                 * 
 | 
                 *     var MyType = CryptoJS.lib.Base.extend({ 
 | 
                 *         field: 'value', 
 | 
                 * 
 | 
                 *         method: function () { 
 | 
                 *         } 
 | 
                 *     }); 
 | 
                 */ 
 | 
                extend: function (overrides) { 
 | 
                    // Spawn 
 | 
                    var subtype = create(this); 
 | 
  
 | 
                    // Augment 
 | 
                    if (overrides) { 
 | 
                        subtype.mixIn(overrides); 
 | 
                    } 
 | 
  
 | 
                    // Create default initializer 
 | 
                    if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { 
 | 
                        subtype.init = function () { 
 | 
                            subtype.$super.init.apply(this, arguments); 
 | 
                        }; 
 | 
                    } 
 | 
  
 | 
                    // Initializer's prototype is the subtype object 
 | 
                    subtype.init.prototype = subtype; 
 | 
  
 | 
                    // Reference supertype 
 | 
                    subtype.$super = this; 
 | 
  
 | 
                    return subtype; 
 | 
                }, 
 | 
  
 | 
                /** 
 | 
                 * Extends this object and runs the init method. 
 | 
                 * Arguments to create() will be passed to init(). 
 | 
                 * 
 | 
                 * @return {Object} The new object. 
 | 
                 * 
 | 
                 * @static 
 | 
                 * 
 | 
                 * @example 
 | 
                 * 
 | 
                 *     var instance = MyType.create(); 
 | 
                 */ 
 | 
                create: function () { 
 | 
                    var instance = this.extend(); 
 | 
                    instance.init.apply(instance, arguments); 
 | 
  
 | 
                    return instance; 
 | 
                }, 
 | 
  
 | 
                /** 
 | 
                 * Initializes a newly created object. 
 | 
                 * Override this method to add some logic when your objects are created. 
 | 
                 * 
 | 
                 * @example 
 | 
                 * 
 | 
                 *     var MyType = CryptoJS.lib.Base.extend({ 
 | 
                 *         init: function () { 
 | 
                 *             // ... 
 | 
                 *         } 
 | 
                 *     }); 
 | 
                 */ 
 | 
                init: function () { 
 | 
                }, 
 | 
  
 | 
                /** 
 | 
                 * Copies properties into this object. 
 | 
                 * 
 | 
                 * @param {Object} properties The properties to mix in. 
 | 
                 * 
 | 
                 * @example 
 | 
                 * 
 | 
                 *     MyType.mixIn({ 
 | 
                 *         field: 'value' 
 | 
                 *     }); 
 | 
                 */ 
 | 
                mixIn: function (properties) { 
 | 
                    for (var propertyName in properties) { 
 | 
                        if (properties.hasOwnProperty(propertyName)) { 
 | 
                            this[propertyName] = properties[propertyName]; 
 | 
                        } 
 | 
                    } 
 | 
  
 | 
                    // IE won't copy toString using the loop above 
 | 
                    if (properties.hasOwnProperty('toString')) { 
 | 
                        this.toString = properties.toString; 
 | 
                    } 
 | 
                }, 
 | 
  
 | 
                /** 
 | 
                 * Creates a copy of this object. 
 | 
                 * 
 | 
                 * @return {Object} The clone. 
 | 
                 * 
 | 
                 * @example 
 | 
                 * 
 | 
                 *     var clone = instance.clone(); 
 | 
                 */ 
 | 
                clone: function () { 
 | 
                    return this.init.prototype.extend(this); 
 | 
                } 
 | 
            }; 
 | 
        }()); 
 | 
  
 | 
        /** 
 | 
         * An array of 32-bit words. 
 | 
         * 
 | 
         * @property {Array} words The array of 32-bit words. 
 | 
         * @property {number} sigBytes The number of significant bytes in this word array. 
 | 
         */ 
 | 
        var WordArray = C_lib.WordArray = Base.extend({ 
 | 
            /** 
 | 
             * Initializes a newly created word array. 
 | 
             * 
 | 
             * @param {Array} words (Optional) An array of 32-bit words. 
 | 
             * @param {number} sigBytes (Optional) The number of significant bytes in the words. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var wordArray = CryptoJS.lib.WordArray.create(); 
 | 
             *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); 
 | 
             *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); 
 | 
             */ 
 | 
            init: function (words, sigBytes) { 
 | 
                words = this.words = words || []; 
 | 
  
 | 
                if (sigBytes != undefined) { 
 | 
                    this.sigBytes = sigBytes; 
 | 
                } else { 
 | 
                    this.sigBytes = words.length * 4; 
 | 
                } 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Converts this word array to a string. 
 | 
             * 
 | 
             * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex 
 | 
             * 
 | 
             * @return {string} The stringified word array. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var string = wordArray + ''; 
 | 
             *     var string = wordArray.toString(); 
 | 
             *     var string = wordArray.toString(CryptoJS.enc.Utf8); 
 | 
             */ 
 | 
            toString: function (encoder) { 
 | 
                return (encoder || Hex).stringify(this); 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Concatenates a word array to this word array. 
 | 
             * 
 | 
             * @param {WordArray} wordArray The word array to append. 
 | 
             * 
 | 
             * @return {WordArray} This word array. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     wordArray1.concat(wordArray2); 
 | 
             */ 
 | 
            concat: function (wordArray) { 
 | 
                // Shortcuts 
 | 
                var thisWords = this.words; 
 | 
                var thatWords = wordArray.words; 
 | 
                var thisSigBytes = this.sigBytes; 
 | 
                var thatSigBytes = wordArray.sigBytes; 
 | 
  
 | 
                // Clamp excess bits 
 | 
                this.clamp(); 
 | 
  
 | 
                // Concat 
 | 
                if (thisSigBytes % 4) { 
 | 
                    // Copy one byte at a time 
 | 
                    for (var i = 0; i < thatSigBytes; i++) { 
 | 
                        var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 
 | 
                        thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); 
 | 
                    } 
 | 
                } else { 
 | 
                    // Copy one word at a time 
 | 
                    for (var j = 0; j < thatSigBytes; j += 4) { 
 | 
                        thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; 
 | 
                    } 
 | 
                } 
 | 
                this.sigBytes += thatSigBytes; 
 | 
  
 | 
                // Chainable 
 | 
                return this; 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Removes insignificant bits. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     wordArray.clamp(); 
 | 
             */ 
 | 
            clamp: function () { 
 | 
                // Shortcuts 
 | 
                var words = this.words; 
 | 
                var sigBytes = this.sigBytes; 
 | 
  
 | 
                // Clamp 
 | 
                words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); 
 | 
                words.length = Math.ceil(sigBytes / 4); 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Creates a copy of this word array. 
 | 
             * 
 | 
             * @return {WordArray} The clone. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var clone = wordArray.clone(); 
 | 
             */ 
 | 
            clone: function () { 
 | 
                var clone = Base.clone.call(this); 
 | 
                clone.words = this.words.slice(0); 
 | 
  
 | 
                return clone; 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Creates a word array filled with random bytes. 
 | 
             * 
 | 
             * @param {number} nBytes The number of random bytes to generate. 
 | 
             * 
 | 
             * @return {WordArray} The random word array. 
 | 
             * 
 | 
             * @static 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var wordArray = CryptoJS.lib.WordArray.random(16); 
 | 
             */ 
 | 
            random: function (nBytes) { 
 | 
                var words = []; 
 | 
  
 | 
                for (var i = 0; i < nBytes; i += 4) { 
 | 
                    words.push(cryptoSecureRandomInt()); 
 | 
                } 
 | 
  
 | 
                return new WordArray.init(words, nBytes); 
 | 
            } 
 | 
        }); 
 | 
  
 | 
        /** 
 | 
         * Encoder namespace. 
 | 
         */ 
 | 
        var C_enc = C.enc = {}; 
 | 
  
 | 
        /** 
 | 
         * Hex encoding strategy. 
 | 
         */ 
 | 
        var Hex = C_enc.Hex = { 
 | 
            /** 
 | 
             * Converts a word array to a hex string. 
 | 
             * 
 | 
             * @param {WordArray} wordArray The word array. 
 | 
             * 
 | 
             * @return {string} The hex string. 
 | 
             * 
 | 
             * @static 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var hexString = CryptoJS.enc.Hex.stringify(wordArray); 
 | 
             */ 
 | 
            stringify: function (wordArray) { 
 | 
                // Shortcuts 
 | 
                var words = wordArray.words; 
 | 
                var sigBytes = wordArray.sigBytes; 
 | 
  
 | 
                // Convert 
 | 
                var hexChars = []; 
 | 
                for (var i = 0; i < sigBytes; i++) { 
 | 
                    var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 
 | 
                    hexChars.push((bite >>> 4).toString(16)); 
 | 
                    hexChars.push((bite & 0x0f).toString(16)); 
 | 
                } 
 | 
  
 | 
                return hexChars.join(''); 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Converts a hex string to a word array. 
 | 
             * 
 | 
             * @param {string} hexStr The hex string. 
 | 
             * 
 | 
             * @return {WordArray} The word array. 
 | 
             * 
 | 
             * @static 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var wordArray = CryptoJS.enc.Hex.parse(hexString); 
 | 
             */ 
 | 
            parse: function (hexStr) { 
 | 
                // Shortcut 
 | 
                var hexStrLength = hexStr.length; 
 | 
  
 | 
                // Convert 
 | 
                var words = []; 
 | 
                for (var i = 0; i < hexStrLength; i += 2) { 
 | 
                    words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); 
 | 
                } 
 | 
  
 | 
                return new WordArray.init(words, hexStrLength / 2); 
 | 
            } 
 | 
        }; 
 | 
  
 | 
        /** 
 | 
         * Latin1 encoding strategy. 
 | 
         */ 
 | 
        var Latin1 = C_enc.Latin1 = { 
 | 
            /** 
 | 
             * Converts a word array to a Latin1 string. 
 | 
             * 
 | 
             * @param {WordArray} wordArray The word array. 
 | 
             * 
 | 
             * @return {string} The Latin1 string. 
 | 
             * 
 | 
             * @static 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); 
 | 
             */ 
 | 
            stringify: function (wordArray) { 
 | 
                // Shortcuts 
 | 
                var words = wordArray.words; 
 | 
                var sigBytes = wordArray.sigBytes; 
 | 
  
 | 
                // Convert 
 | 
                var latin1Chars = []; 
 | 
                for (var i = 0; i < sigBytes; i++) { 
 | 
                    var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 
 | 
                    latin1Chars.push(String.fromCharCode(bite)); 
 | 
                } 
 | 
  
 | 
                return latin1Chars.join(''); 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Converts a Latin1 string to a word array. 
 | 
             * 
 | 
             * @param {string} latin1Str The Latin1 string. 
 | 
             * 
 | 
             * @return {WordArray} The word array. 
 | 
             * 
 | 
             * @static 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String); 
 | 
             */ 
 | 
            parse: function (latin1Str) { 
 | 
                // Shortcut 
 | 
                var latin1StrLength = latin1Str.length; 
 | 
  
 | 
                // Convert 
 | 
                var words = []; 
 | 
                for (var i = 0; i < latin1StrLength; i++) { 
 | 
                    words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); 
 | 
                } 
 | 
  
 | 
                return new WordArray.init(words, latin1StrLength); 
 | 
            } 
 | 
        }; 
 | 
  
 | 
        /** 
 | 
         * UTF-8 encoding strategy. 
 | 
         */ 
 | 
        var Utf8 = C_enc.Utf8 = { 
 | 
            /** 
 | 
             * Converts a word array to a UTF-8 string. 
 | 
             * 
 | 
             * @param {WordArray} wordArray The word array. 
 | 
             * 
 | 
             * @return {string} The UTF-8 string. 
 | 
             * 
 | 
             * @static 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); 
 | 
             */ 
 | 
            stringify: function (wordArray) { 
 | 
                try { 
 | 
                    return decodeURIComponent(escape(Latin1.stringify(wordArray))); 
 | 
                } catch (e) { 
 | 
                    throw new Error('Malformed UTF-8 data'); 
 | 
                } 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Converts a UTF-8 string to a word array. 
 | 
             * 
 | 
             * @param {string} utf8Str The UTF-8 string. 
 | 
             * 
 | 
             * @return {WordArray} The word array. 
 | 
             * 
 | 
             * @static 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String); 
 | 
             */ 
 | 
            parse: function (utf8Str) { 
 | 
                return Latin1.parse(unescape(encodeURIComponent(utf8Str))); 
 | 
            } 
 | 
        }; 
 | 
  
 | 
        /** 
 | 
         * Abstract buffered block algorithm template. 
 | 
         * 
 | 
         * The property blockSize must be implemented in a concrete subtype. 
 | 
         * 
 | 
         * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 
 | 
         */ 
 | 
        var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ 
 | 
            /** 
 | 
             * Resets this block algorithm's data buffer to its initial state. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     bufferedBlockAlgorithm.reset(); 
 | 
             */ 
 | 
            reset: function () { 
 | 
                // Initial values 
 | 
                this._data = new WordArray.init(); 
 | 
                this._nDataBytes = 0; 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Adds new data to this block algorithm's buffer. 
 | 
             * 
 | 
             * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     bufferedBlockAlgorithm._append('data'); 
 | 
             *     bufferedBlockAlgorithm._append(wordArray); 
 | 
             */ 
 | 
            _append: function (data) { 
 | 
                // Convert string to WordArray, else assume WordArray already 
 | 
                if (typeof data == 'string') { 
 | 
                    data = Utf8.parse(data); 
 | 
                } 
 | 
  
 | 
                // Append 
 | 
                this._data.concat(data); 
 | 
                this._nDataBytes += data.sigBytes; 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Processes available data blocks. 
 | 
             * 
 | 
             * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. 
 | 
             * 
 | 
             * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. 
 | 
             * 
 | 
             * @return {WordArray} The processed data. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var processedData = bufferedBlockAlgorithm._process(); 
 | 
             *     var processedData = bufferedBlockAlgorithm._process(!!'flush'); 
 | 
             */ 
 | 
            _process: function (doFlush) { 
 | 
                var processedWords; 
 | 
  
 | 
                // Shortcuts 
 | 
                var data = this._data; 
 | 
                var dataWords = data.words; 
 | 
                var dataSigBytes = data.sigBytes; 
 | 
                var blockSize = this.blockSize; 
 | 
                var blockSizeBytes = blockSize * 4; 
 | 
  
 | 
                // Count blocks ready 
 | 
                var nBlocksReady = dataSigBytes / blockSizeBytes; 
 | 
                if (doFlush) { 
 | 
                    // Round up to include partial blocks 
 | 
                    nBlocksReady = Math.ceil(nBlocksReady); 
 | 
                } else { 
 | 
                    // Round down to include only full blocks, 
 | 
                    // less the number of blocks that must remain in the buffer 
 | 
                    nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); 
 | 
                } 
 | 
  
 | 
                // Count words ready 
 | 
                var nWordsReady = nBlocksReady * blockSize; 
 | 
  
 | 
                // Count bytes ready 
 | 
                var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); 
 | 
  
 | 
                // Process blocks 
 | 
                if (nWordsReady) { 
 | 
                    for (var offset = 0; offset < nWordsReady; offset += blockSize) { 
 | 
                        // Perform concrete-algorithm logic 
 | 
                        this._doProcessBlock(dataWords, offset); 
 | 
                    } 
 | 
  
 | 
                    // Remove processed words 
 | 
                    processedWords = dataWords.splice(0, nWordsReady); 
 | 
                    data.sigBytes -= nBytesReady; 
 | 
                } 
 | 
  
 | 
                // Return processed words 
 | 
                return new WordArray.init(processedWords, nBytesReady); 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Creates a copy of this object. 
 | 
             * 
 | 
             * @return {Object} The clone. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var clone = bufferedBlockAlgorithm.clone(); 
 | 
             */ 
 | 
            clone: function () { 
 | 
                var clone = Base.clone.call(this); 
 | 
                clone._data = this._data.clone(); 
 | 
  
 | 
                return clone; 
 | 
            }, 
 | 
  
 | 
            _minBufferSize: 0 
 | 
        }); 
 | 
  
 | 
        /** 
 | 
         * Abstract hasher template. 
 | 
         * 
 | 
         * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) 
 | 
         */ 
 | 
        var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ 
 | 
            /** 
 | 
             * Configuration options. 
 | 
             */ 
 | 
            cfg: Base.extend(), 
 | 
  
 | 
            /** 
 | 
             * Initializes a newly created hasher. 
 | 
             * 
 | 
             * @param {Object} cfg (Optional) The configuration options to use for this hash computation. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var hasher = CryptoJS.algo.SHA256.create(); 
 | 
             */ 
 | 
            init: function (cfg) { 
 | 
                // Apply config defaults 
 | 
                this.cfg = this.cfg.extend(cfg); 
 | 
  
 | 
                // Set initial values 
 | 
                this.reset(); 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Resets this hasher to its initial state. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     hasher.reset(); 
 | 
             */ 
 | 
            reset: function () { 
 | 
                // Reset data buffer 
 | 
                BufferedBlockAlgorithm.reset.call(this); 
 | 
  
 | 
                // Perform concrete-hasher logic 
 | 
                this._doReset(); 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Updates this hasher with a message. 
 | 
             * 
 | 
             * @param {WordArray|string} messageUpdate The message to append. 
 | 
             * 
 | 
             * @return {Hasher} This hasher. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     hasher.update('message'); 
 | 
             *     hasher.update(wordArray); 
 | 
             */ 
 | 
            update: function (messageUpdate) { 
 | 
                // Append 
 | 
                this._append(messageUpdate); 
 | 
  
 | 
                // Update the hash 
 | 
                this._process(); 
 | 
  
 | 
                // Chainable 
 | 
                return this; 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Finalizes the hash computation. 
 | 
             * Note that the finalize operation is effectively a destructive, read-once operation. 
 | 
             * 
 | 
             * @param {WordArray|string} messageUpdate (Optional) A final message update. 
 | 
             * 
 | 
             * @return {WordArray} The hash. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var hash = hasher.finalize(); 
 | 
             *     var hash = hasher.finalize('message'); 
 | 
             *     var hash = hasher.finalize(wordArray); 
 | 
             */ 
 | 
            finalize: function (messageUpdate) { 
 | 
                // Final message update 
 | 
                if (messageUpdate) { 
 | 
                    this._append(messageUpdate); 
 | 
                } 
 | 
  
 | 
                // Perform concrete-hasher logic 
 | 
                var hash = this._doFinalize(); 
 | 
  
 | 
                return hash; 
 | 
            }, 
 | 
  
 | 
            blockSize: 512/32, 
 | 
  
 | 
            /** 
 | 
             * Creates a shortcut function to a hasher's object interface. 
 | 
             * 
 | 
             * @param {Hasher} hasher The hasher to create a helper for. 
 | 
             * 
 | 
             * @return {Function} The shortcut function. 
 | 
             * 
 | 
             * @static 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); 
 | 
             */ 
 | 
            _createHelper: function (hasher) { 
 | 
                return function (message, cfg) { 
 | 
                    return new hasher.init(cfg).finalize(message); 
 | 
                }; 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Creates a shortcut function to the HMAC's object interface. 
 | 
             * 
 | 
             * @param {Hasher} hasher The hasher to use in this HMAC helper. 
 | 
             * 
 | 
             * @return {Function} The shortcut function. 
 | 
             * 
 | 
             * @static 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); 
 | 
             */ 
 | 
            _createHmacHelper: function (hasher) { 
 | 
                return function (message, key) { 
 | 
                    return new C_algo.HMAC.init(hasher, key).finalize(message); 
 | 
                }; 
 | 
            } 
 | 
        }); 
 | 
  
 | 
        /** 
 | 
         * Algorithm namespace. 
 | 
         */ 
 | 
        var C_algo = C.algo = {}; 
 | 
  
 | 
        return C; 
 | 
    }(Math)); 
 | 
  
 | 
  
 | 
    return CryptoJS; 
 | 
  
 | 
})); 
 |