;(function (root, factory, undef) { 
 | 
    if (typeof exports === "object") { 
 | 
        // CommonJS 
 | 
        module.exports = exports = factory(require("./core"), require("./cipher-core")); 
 | 
    } 
 | 
    else if (typeof define === "function" && define.amd) { 
 | 
        // AMD 
 | 
        define(["./core", "./cipher-core"], factory); 
 | 
    } 
 | 
    else { 
 | 
        // Global (browser) 
 | 
        factory(root.CryptoJS); 
 | 
    } 
 | 
}(this, function (CryptoJS) { 
 | 
  
 | 
    /** 
 | 
     * Cipher Feedback block mode. 
 | 
     */ 
 | 
    CryptoJS.mode.CFB = (function () { 
 | 
        var CFB = CryptoJS.lib.BlockCipherMode.extend(); 
 | 
  
 | 
        CFB.Encryptor = CFB.extend({ 
 | 
            processBlock: function (words, offset) { 
 | 
                // Shortcuts 
 | 
                var cipher = this._cipher; 
 | 
                var blockSize = cipher.blockSize; 
 | 
  
 | 
                generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); 
 | 
  
 | 
                // Remember this block to use with next block 
 | 
                this._prevBlock = words.slice(offset, offset + blockSize); 
 | 
            } 
 | 
        }); 
 | 
  
 | 
        CFB.Decryptor = CFB.extend({ 
 | 
            processBlock: function (words, offset) { 
 | 
                // Shortcuts 
 | 
                var cipher = this._cipher; 
 | 
                var blockSize = cipher.blockSize; 
 | 
  
 | 
                // Remember this block to use with next block 
 | 
                var thisBlock = words.slice(offset, offset + blockSize); 
 | 
  
 | 
                generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); 
 | 
  
 | 
                // This block becomes the previous block 
 | 
                this._prevBlock = thisBlock; 
 | 
            } 
 | 
        }); 
 | 
  
 | 
        function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { 
 | 
            var keystream; 
 | 
  
 | 
            // Shortcut 
 | 
            var iv = this._iv; 
 | 
  
 | 
            // Generate keystream 
 | 
            if (iv) { 
 | 
                keystream = iv.slice(0); 
 | 
  
 | 
                // Remove IV for subsequent blocks 
 | 
                this._iv = undefined; 
 | 
            } else { 
 | 
                keystream = this._prevBlock; 
 | 
            } 
 | 
            cipher.encryptBlock(keystream, 0); 
 | 
  
 | 
            // Encrypt 
 | 
            for (var i = 0; i < blockSize; i++) { 
 | 
                words[offset + i] ^= keystream[i]; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        return CFB; 
 | 
    }()); 
 | 
  
 | 
  
 | 
    return CryptoJS.mode.CFB; 
 | 
  
 | 
})); 
 |