\\n Start by entering the cipher text in the text field and hitting analyze.\\n \\n You are able to change between block deciphered text and a break down of how text was replaced.\\n \\n After having hit analyze you have the options of shifting columns and rows using the '<' keys.\\n \\n You can swap rows by hitting the S key on two columns/rows.\\n \\n You can move the entire grid using the shift down/left/up/right keys to better align your key.\\n \\n You can import a key which will use the i/j replacement assumption.\\n \\n You can save a state which is a current grid layout with a description/name and upon saving it you can set the current\\n grid back to it at any point by hitting restore.\\n\\n
\\n
\\n
\\n
\\n
\\n
\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/app/playfair/playfair.component.html\n// module id = ../../../../../src/app/playfair/playfair.component.html\n// module chunks = main","import { Component, OnInit } from '@angular/core';\r\nimport {UtilsService} from \"../utils.service\";\r\nimport { ApplicationRef } from '@angular/core'\r\nimport { ViewEncapsulation, ChangeDetectorRef } from '@angular/core'\r\n\r\n@Component({\r\n selector: 'app-playfair',\r\n templateUrl: './playfair.component.html',\r\n styleUrls: ['./playfair.component.css'],\r\n encapsulation: ViewEncapsulation.None,\r\n\r\n})\r\nexport class PlayfairComponent implements OnInit {\r\n\r\n text = '';\r\n textCopy = '';\r\n highLightedText = '';\r\n\r\n grid = [];\r\n\r\n row = false;\r\n swap = -1;\r\n\r\n showDecipheredText = false;\r\n decipheredText = '';\r\n\r\n statesList = [];\r\n newStateName = '';\r\n newStateDescription = '';\r\n\r\n constructor(private utils: UtilsService, private applicationRef : ApplicationRef, private cdr:ChangeDetectorRef) {}\r\n ngOnInit() {\r\n }\r\n\r\n changeShowDecipheredText(){\r\n this.showDecipheredText = ! this.showDecipheredText;\r\n }\r\n\r\n analyze(){\r\n this.textCopy = this.utils.stripWhiteSpaceAndFormatting(this.text);\r\n this.highLightedText = this.textCopy;\r\n this.grid = this.generateGrid();\r\n\r\n }\r\n\r\n chunk(str, length) {\r\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\r\n }\r\n\r\n\r\n decipherTuple(grid,quickLookDictionary, text){\r\n var left = text.charAt(0);\r\n var right = text.charAt(1);\r\n var leftCoord = { x : -2, y : -2};\r\n var rightCoord = {x : -3, y : -3};\r\n\r\n\r\n if(left in quickLookDictionary){\r\n leftCoord = quickLookDictionary[left];\r\n }else{\r\n return '--'\r\n }\r\n if(right in quickLookDictionary){\r\n rightCoord = quickLookDictionary[right];\r\n }else{\r\n return '--'\r\n }\r\n\r\n //same row\r\n if(leftCoord.y === rightCoord.y){\r\n var leftPos = leftCoord.x === 0 ? 4 : leftCoord.x - 1 ;\r\n var rightPos = rightCoord.x === 0 ? 4 : rightCoord.x - 1 ;\r\n var newLeft = grid[leftCoord.y][leftPos];\r\n var newRight = grid[leftCoord.y][rightPos];\r\n\r\n var front = newLeft.length === 0 ? '-' : newLeft;\r\n var back = newRight.length === 0 ? '-' : newRight;\r\n\r\n return front + back;\r\n }\r\n //same column\r\n else if(leftCoord.x === rightCoord.x){\r\n var leftPos = leftCoord.y === 0 ? 4 : leftCoord.y - 1;\r\n var rightPos = rightCoord.y === 0 ? 4 : rightCoord.y - 1;\r\n var newLeft = grid[leftPos][leftCoord.x];\r\n var newRight = grid[rightPos][leftCoord.x];\r\n\r\n var front = newLeft.length === 0 ? '-' : newLeft;\r\n var back = newRight.length === 0 ? '-' : newRight;\r\n\r\n return front + back;\r\n }\r\n //square\r\n\r\n else{\r\n var corner1 = grid[leftCoord.y][rightCoord.x];\r\n var corner2 = grid[rightCoord.y][leftCoord.x];\r\n\r\n var front = corner1.length === 0 ? '-' : corner1;\r\n var back = corner2.length === 0 ? '-' : corner2;\r\n\r\n return front + back;\r\n }\r\n }\r\n\r\n replace(x = -1,y = -1){\r\n setTimeout( () => {\r\n\r\n var changedChar = ' ';\r\n if(x >= 0 && y >= 0){\r\n changedChar = this.grid[x][y];\r\n }\r\n\r\n var validChar = this.utils.isLetter(changedChar);\r\n\r\n var replaceKey = {};\r\n for(var i = 0; i < this.grid.length; i++){\r\n for(var j = 0; j < this.grid[i].length; j++){\r\n if(this.grid[j][i].toUpperCase() === changedChar.toUpperCase() && (j !== x || i !== y)){\r\n this.grid[j][i] = '-';\r\n }\r\n\r\n if(this.grid[j][i] != '-'){\r\n replaceKey[ this.grid[j][i].toUpperCase() ] = {x : i, y : j};\r\n }\r\n document.getElementById(i + ' ' + j)['value'] = this.grid[i][j];\r\n }\r\n }\r\n\r\n var decipheredText = ''\r\n var replacedText = '';\r\n var chunks = this.chunk(this.textCopy, 2);\r\n for (var i = 0; i < chunks.length; i++) {\r\n var decipheredChunk = this.decipherTuple(this.grid, replaceKey, chunks[i]).toUpperCase();\r\n decipheredText += decipheredChunk\r\n\r\n if (validChar &&\r\n (decipheredChunk.charAt(0) === changedChar.toUpperCase() ||\r\n decipheredChunk.charAt(1) === changedChar.toUpperCase() ||\r\n chunks[i].charAt(0) === changedChar.toUpperCase() ||\r\n chunks[i].charAt(1) === changedChar.toUpperCase() ) &&\r\n (this.utils.isLetter(decipheredChunk.charAt(0)) || this.utils.isLetter(decipheredChunk.charAt(1)))\r\n ) {\r\n decipheredChunk = \"\" + decipheredChunk + \"\"\r\n }\r\n replacedText += \"
\" + chunks[i] + \"
\" + decipheredChunk + \"
\"\r\n }\r\n this.decipheredText = decipheredText\r\n this.highLightedText = replacedText;\r\n }, 0);\r\n\r\n }\r\n\r\n\r\n\r\n generateGrid(){\r\n var hold = [];\r\n var x = 0;\r\n for(var i = 0; i < 5; i++){\r\n var row = [];\r\n for(var j = 0; j < 5; j++){\r\n row.push('');\r\n x++;\r\n }\r\n hold.push(row)\r\n }\r\n return hold;\r\n }\r\n\r\n selectToShift(index, isRow){\r\n if(this.row == isRow){\r\n if(this.swap > -1){\r\n if(this.row){\r\n this.swapRow(this.swap, index)\r\n }else{\r\n this.swapColumn(this.swap, index)\r\n }\r\n\r\n this.swap = -1;\r\n }else{\r\n this.swap = index;\r\n }\r\n }else{\r\n this.row = isRow;\r\n this.swap = index;\r\n }\r\n\r\n }\r\n\r\n arrayRotate(arr, count) {\r\n count -= arr.length * Math.floor(count / arr.length);\r\n arr.push.apply(arr, arr.splice(0, count));\r\n return arr\r\n }\r\n\r\n fullRotate(shiftAmount){\r\n for(var i = 0; i < this.grid.length; i ++){\r\n this.shiftRow(i, shiftAmount);\r\n }\r\n this.replace();\r\n }\r\n\r\n shiftRow(row, shitAmount){\r\n this.arrayRotate(this.grid[row], shitAmount);\r\n\r\n this.replace();\r\n }\r\n\r\n fullShiftUp(){\r\n for(var i = 0; i < this.grid.length; i++){\r\n this.shiftColumnUp(i)\r\n }\r\n }\r\n\r\n fullShiftDown(){\r\n for(var i = 0; i < this.grid.length; i++){\r\n this.shiftColumnDown(i)\r\n }\r\n }\r\n\r\n shiftColumnUp(index){\r\n var first = this.grid[0][index];\r\n for(var i = 0; i < this.grid.length - 1; i++){\r\n this.grid[i][index] = this.grid[i + 1][index]\r\n }\r\n this.grid[this.grid.length - 1][index] = first;\r\n this.replace();\r\n\r\n }\r\n\r\n shiftColumnDown(index){\r\n var first = this.grid[this.grid.length - 1][index];\r\n for(var i = this.grid.length - 1; i > 0 ; i--){\r\n this.grid[i][index] = this.grid[i - 1][index]\r\n }\r\n this.grid[0][index] = first;\r\n this.replace();\r\n\r\n }\r\n\r\n swapColumn(index1,index2){\r\n for(var i = 0; i < this.grid.length; i++){\r\n var hold = this.grid[i][index1];\r\n this.grid[i][index1] = this.grid[i][index2];\r\n this.grid[i][index2] = hold;\r\n }\r\n this.replace();\r\n\r\n }\r\n\r\n swapRow(index1,index2){\r\n var hold = this.grid[index1];\r\n this.grid[index1] = this.grid[index2];\r\n this.grid[index2] = hold;\r\n\r\n this.replace();\r\n\r\n }\r\n\r\n importKey(key, fill){\r\n var importedKey = this.utils.uniqueString(key.toUpperCase());\r\n var splitKey = importedKey.split('');\r\n\r\n var alphabet = 'a,b,c,d,e,f,g,h,i,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'.toUpperCase().split(',');\r\n if(fill){\r\n for(var i = 0; i < alphabet.length; i++){\r\n if(!splitKey.includes(alphabet[i])){\r\n splitKey.push(alphabet[i]);\r\n }\r\n }\r\n }\r\n this.grid = this.generateGrid();\r\n\r\n for(var i = 0; i < 5; i++){\r\n for(var j = 0; j < 5; j++){\r\n this.grid[i][j] = splitKey[i * 5 + j];\r\n }\r\n }\r\n this.replace();\r\n\r\n }\r\n\r\n saveState(){\r\n var newGrid = this.generateGrid();\r\n for(var i = 0; i < 5; i++){\r\n for(var j = 0; j < 5; j++){\r\n if(!this.grid[i][j].length || this.grid[i][j].length === 0){\r\n newGrid[i][j] = '-'\r\n }else{\r\n newGrid[i][j] = this.grid[i][j];\r\n }\r\n }\r\n }\r\n\r\n this.statesList.push({\r\n name : this.newStateName,\r\n description : this.newStateDescription ,\r\n grid : newGrid\r\n });\r\n\r\n this.newStateName = '';\r\n this.newStateDescription = '';\r\n }\r\n\r\n restoreState(stateIndex){\r\n this.grid = this.statesList[stateIndex].grid;\r\n this.replace();\r\n\r\n }\r\n\r\n deleteState(stateIndex){\r\n this.statesList.splice(stateIndex, 1);\r\n\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/app/playfair/playfair.component.ts","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"\", \"\"]);\n\n// exports\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = module.exports.toString();\n\n\n//////////////////\n// WEBPACK FOOTER\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/app/shift-cypher/shift-cypher.component.css\n// module id = ../../../../../src/app/shift-cypher/shift-cypher.component.css\n// module chunks = main","module.exports = \"
\\n
\\n
\\n
\\n
\\n
\\n\\n
Text to shift
\\n \\n
\\n
\\n \\n \\n
\\n
\\n \\n
\\n \\n
\\n\\n
\\n \\n
\\n\\n
\\n
\\n
\\n\\n
0\\\">\\n
\\n
\\n
\\n
Most Frequent letters
\\n
\\n \\n
\\n
letter
\\n
frequency
\\n
\\n \\n \\n
\\n
{{ letter.letter }}
\\n
{{letter.count}}
\\n
\\n \\n
\\n
\\n\\n
\\n
Shifts
\\n
\\n
\\n {{ deviation.shift }} : {{deviation.text}}\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/app/shift-cypher/shift-cypher.component.html\n// module id = ../../../../../src/app/shift-cypher/shift-cypher.component.html\n// module chunks = main","import { Component, OnInit } from '@angular/core';\r\nimport {UtilsService} from \"../utils.service\";\r\n\r\n@Component({\r\n selector: 'app-shift-cypher',\r\n templateUrl: './shift-cypher.component.html',\r\n styleUrls: ['./shift-cypher.component.css']\r\n})\r\nexport class ShiftCypherComponent {\r\n\r\n constructor(private utils: UtilsService){\r\n\r\n }\r\n\r\n text = '';\r\n\r\n normalizedLetterFrequencyDict = {};\r\n\r\n lettersData = [];\r\n\r\n charactersToShow = 50;\r\n preserveWhiteSpace = false;\r\n\r\n deviations = [];\r\n\r\n public analyize(){\r\n\r\n var copyText = this.text;\r\n\r\n if(!this.preserveWhiteSpace){\r\n copyText = copyText.replace(/ /g,'')\r\n }\r\n\r\n var letterFrequencyDict = this.utils.generateLetterCountDictionary(copyText);\r\n\r\n var sum = this.utils.countDict(letterFrequencyDict);\r\n var alphabet = this.utils.alphabet;\r\n\r\n\r\n this.lettersData = [];\r\n this.normalizedLetterFrequencyDict = {};\r\n for(var i = 0; i < alphabet.length; i++){\r\n this.normalizedLetterFrequencyDict[alphabet[i]] = letterFrequencyDict[alphabet[i]] / sum;\r\n this.lettersData.push({letter : alphabet[i], frequency : letterFrequencyDict[alphabet[i]] / sum, count: letterFrequencyDict[alphabet[i]] })\r\n }\r\n\r\n this.lettersData.sort(function (a,b) {\r\n return a.count > b.count ? -1 : 1\r\n });\r\n\r\n this.generateDeviations(copyText);\r\n }\r\n\r\n public nextCharacterWrapAround(s){\r\n return s.replace(/([a-zA-Z])[^a-zA-Z]*$/, function(a){\r\n var c= a.charCodeAt(0);\r\n switch(c){\r\n case 90: return 'A';\r\n case 122: return 'a';\r\n default: return String.fromCharCode(++c);\r\n }\r\n });\r\n\r\n }\r\n\r\n public generateDeviations (text){\r\n this.deviations = [];\r\n\r\n for(var i = 0; i < 25; i++){\r\n var iteration = '';\r\n for(var j = 0; j < this.charactersToShow; j++){\r\n iteration += this.nextCharacterWrapAround(text.charAt(j));\r\n }\r\n this.deviations.push({shift : i + 1, text : iteration});\r\n text = iteration;\r\n }\r\n }\r\n\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/app/shift-cypher/shift-cypher.component.ts","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"\", \"\"]);\n\n// exports\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = module.exports.toString();\n\n\n//////////////////\n// WEBPACK FOOTER\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/app/text-analysis/text-analysis.component.css\n// module id = ../../../../../src/app/text-analysis/text-analysis.component.css\n// module chunks = main","module.exports = \"
\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/app/text-analysis/text-analysis.component.html\n// module id = ../../../../../src/app/text-analysis/text-analysis.component.html\n// module chunks = main","import { Component, OnInit } from '@angular/core';\r\nimport {UtilsService} from \"../utils.service\";\r\n\r\n@Component({\r\n selector: 'app-text-analysis',\r\n templateUrl: './text-analysis.component.html',\r\n styleUrls: ['./text-analysis.component.css']\r\n})\r\nexport class TextAnalysisComponent implements OnInit {\r\n\r\n /*\r\n text: the text given by the user - avoid changing it\r\n replacedText: text generated after replacing characters from the text\r\n highLightedText: the actual text displayed at the bottom of the screen as html\r\n highlightKeys: comma separated text from the user used to know what to highlight\r\n */\r\n text = '';\r\n replacedText = '';\r\n highLightedText = '';\r\n highlightKeys = '';\r\n\r\n /*\r\n completeDigraphDict: consider removing - would be used for letter matrix\r\n lettersData: letter frequency string for displaying the letter frequency table\r\n nGraphs: list of n-graph data, currently only has digraph and trigraph data\r\n transformKey: list of objects with letter, transformkey letter pairs\r\n */\r\n normalizedLetterFrequencyDict = {};\r\n completeDigraphDict = {};\r\n lettersData = [];\r\n nGraphs = [];\r\n transformKey = [];\r\n\r\n /*\r\n showReplaceKey used for knowing current state of hiding the replaceKey\r\n */\r\n showReplaceKey = true;\r\n\r\n showTable = true;\r\n constructor(private utils: UtilsService) {\r\n }\r\n ngOnInit() {\r\n }\r\n\r\n\r\n public changeTableState() {\r\n this.showTable = ! this.showTable;\r\n }\r\n\r\n\r\n /*\r\n 1. generates a replaceKeyDict which says which particular letters need to be replaced\r\n 2. using this.text, goes through by character and see if it exists in the replaceKeyDict and if so replaces in new text\r\n 3. generate new n-graphs from the replaced text\r\n 4. hightlight the text\r\n */\r\n public replace(){\r\n //1\r\n var replaceKeyDict = {};\r\n for(var i =0; i < this.transformKey.length; i++){\r\n replaceKeyDict[this.transformKey[i].letter] = this.transformKey[i].replacementLetter;\r\n }\r\n\r\n //replace text is for what is displayed\r\n this.replacedText = '';\r\n\r\n //2\r\n for(var j = 0; j < this.text.length; j++){\r\n var char = this.text.charAt(j).toUpperCase();\r\n\r\n //replace char if necessary\r\n if(replaceKeyDict[char]){\r\n char = replaceKeyDict[char];\r\n }\r\n\r\n this.replacedText += char;\r\n\r\n }\r\n\r\n this.replacedText = this.utils.stripWhiteSpaceAndFormatting(this.replacedText);\r\n //3\r\n this.nGraphs = this.generateSortedNgraphsLists(this.replacedText, [2,3]);\r\n //4\r\n this.highlightText();\r\n }\r\n\r\n public highlightText(){\r\n this.highLightedText = this.highlight(this.replacedText);\r\n }\r\n\r\n /**\r\n * Highlights search phrases within the given text.\r\n * @param text - the text to highlight phrases in\r\n * @returns {string} - text with HTML classes that highlight selected phrases\r\n */\r\n highlight(text: string): string {\r\n var keywordsSplit = this.highlightKeys.split(',');\r\n keywordsSplit.sort((a,b) => {\r\n return a.length > b.length ? -1 : 1;\r\n });\r\n //First change the keywords to now be a string with words separated with | per reg exp\r\n let keywords = keywordsSplit.join('|');\r\n\r\n //For every match found replace with a highlighted version\r\n return text.replace(new RegExp(keywords, \"g\"), function myFunction(x) {\r\n return \"\" + x + \"\";\r\n })\r\n }\r\n\r\n duplicateTransform(letterTransform){\r\n for(var i = 0; i < this.transformKey.length; i++){\r\n if(this.transformKey[i].replacementLetter == letterTransform.replacementLetter && this.transformKey[i].letter != letterTransform.letter){\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * generates nGraphs of the sizes passed in into a list of ngraphs with sorted lists of entries\r\n *\r\n * @param text\r\n * @param ngraphSizes\r\n * @returns {Array}\r\n */\r\n generateSortedNgraphsLists(text, ngraphSizes){\r\n var nGraphLists = this.utils.generateNGramDictionary(text,ngraphSizes);\r\n var sortedNGraphs = [];\r\n\r\n //assuming the first one is a size 2\r\n this.completeDigraphDict = nGraphLists[0].grams;\r\n\r\n //iterate through ngraphs given back\r\n for(var i = 0; i < nGraphLists.length; i++){\r\n //generate ngraph object\r\n var g = {name : nGraphLists[i].size, entries : [] };\r\n //create and sort list of all of the ngraph dict\r\n for(var key in nGraphLists[i].grams){\r\n g.entries.push({name : key, frequency : (nGraphLists[i].grams[key] / nGraphLists[i].grams[nGraphLists[i].mostFrequent]).toPrecision(3)} )\r\n }\r\n\r\n g.entries.sort(function (a,b) {\r\n return a.frequency > b.frequency ? -1 : 1\r\n });\r\n //take top 25 entries\r\n g.entries = g.entries.splice(0,25);\r\n\r\n //grab the reverse values\r\n for(var j = 0; j < g.entries.length; j++){\r\n var reverseKey = g.entries[j].name.split(\"\").reverse().join(\"\"); //man I hate this\r\n var reverse = nGraphLists[i].grams[reverseKey] ? nGraphLists[i].grams[reverseKey] : 0;\r\n g.entries[j].reverseKey = reverseKey;\r\n g.entries[j].reverseFrequency = (reverse / nGraphLists[i].grams[nGraphLists[i].mostFrequent]).toPrecision(3);\r\n\r\n }\r\n sortedNGraphs.push(g);\r\n }\r\n return sortedNGraphs;\r\n }\r\n\r\n /**\r\n *\r\n */\r\n public analyize(){\r\n var copyText = this.text;\r\n\r\n //remove white space\r\n copyText = this.utils.stripWhiteSpaceAndFormatting(copyText);\r\n copyText = copyText.toUpperCase();\r\n\r\n //set replace text which is used as a base for highlight\r\n this.replacedText = copyText;\r\n //set hightlight for output text\r\n this.highlightText();\r\n\r\n var letterFrequencyDict = this.utils.generateLetterCountDictionary(copyText);\r\n\r\n var sum = this.utils.countDict(letterFrequencyDict);\r\n var alphabet = this.utils.alphabet;\r\n this.normalizedLetterFrequencyDict = {};\r\n //generate letters data and normalized letter frequency dict and transformKeyList\r\n this.transformKey = [];\r\n this.lettersData = [];\r\n for(var i = 0; i < alphabet.length; i++){\r\n this.normalizedLetterFrequencyDict[alphabet[i]] = letterFrequencyDict[alphabet[i]] / sum;\r\n this.lettersData.push({letter : alphabet[i], frequency : (letterFrequencyDict[alphabet[i]] / sum).toPrecision(3), count: letterFrequencyDict[alphabet[i]] })\r\n\r\n if(letterFrequencyDict[alphabet[i]] > 0){\r\n this.transformKey.push({letter: alphabet[i], replacementLetter : alphabet[i]})\r\n }\r\n }\r\n\r\n\r\n this.lettersData.sort(function (a,b) {\r\n return a.count > b.count ? -1 : 1\r\n });\r\n\r\n\r\n this.nGraphs = this.generateSortedNgraphsLists(copyText, [2,3]);\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/app/text-analysis/text-analysis.component.ts","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"\", \"\"]);\n\n// exports\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = module.exports.toString();\n\n\n//////////////////\n// WEBPACK FOOTER\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/app/transposition/transposition.component.css\n// module id = ../../../../../src/app/transposition/transposition.component.css\n// module chunks = main","module.exports = \"
\\r\\n Guide:\\r\\n \\r\\n First enter your text into the text box.\\r\\n \\r\\n Here you can change the key size to generate how the text should be analyzed for letter frequency. When you hit\\r\\n the keys to shift the base of the alphabet it will show a highlight of that index in the text.\\r\\n \\r\\n Min/max factors let you change the min/max sizes for the table of possible key sizes the table generates. Most likely you dont need to change these.\\r\\n \\r\\n Hit format if you want to change the option for highlighting/block key size then reformat.\\r\\n \\r\\n Hit analyze when you want it to parse the text into the multiple word frequencies, hit analyze whenever you change the key size.\\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/app/vigenere/vigenere.component.html\n// module id = ../../../../../src/app/vigenere/vigenere.component.html\n// module chunks = main","import { Component, OnInit } from '@angular/core';\r\nimport {UtilsService} from \"../utils.service\";\r\n\r\n@Component({\r\n selector: 'app-vigenere',\r\n templateUrl: './vigenere.component.html',\r\n styleUrls: ['./vigenere.component.css']\r\n})\r\n/**\r\n * General explanation for how it takes the text input and makes its initial guess\r\n * 1. text is taken and stored in text and a key length is taken as keyLength\r\n * 2. text is stripped of white space and set to uppercase\r\n * 3. text is stored in replacedText so all manipulations are stored there\r\n * 4. replacedText is used to generate a list of frequencies for each index of the key size\r\n * 5. list of frequencies is then used to compare to standard frequency and find which rotation of each frequency has the least\r\n * amount of deviation from the standard frequency.\r\n * 6. shift the frequencies to the best fit as determined in step 5\r\n */\r\nexport class VigenereComponent implements OnInit {\r\n /*\r\n text: the text given by the user - avoid changing it\r\n replacedText: text generated after replacing characters from the text\r\n highLightedText: the actual text displayed to the right of the screen as html\r\n keyLength: currently selected keylength guess\r\n factors: list of numbers which is from minFactor(inclusive) to maxFactor(inclusive)\r\n frequencies: list of lists(since only strings of length are checked for spacing its effectively just a reference in the way currently) containing frequencies of letters for each index of the key\r\n shiftIndexes: keeps track of how shifted each index is and what letter that gives for the key\r\n sequences: all of the sequences found in the string\r\n currentlyHighLightedIndex: keeps track of which index of the key is currently meant to be highlighted\r\n */\r\n text = '';\r\n replacedText = '';\r\n highLightedText = '';\r\n keyLength = 3;\r\n factors = [];\r\n maxFactor = 20;\r\n minFactor = 2;\r\n frequencies = [];\r\n shiftIndexes = [];\r\n sequences = [];\r\n currentlyHighlightedIndex = 0;\r\n\r\n /*\r\n showKey : knows if formmatting or key should be shown\r\n keySizeBlocks\r\n highlighting\r\n */\r\n showKey = true;\r\n keySizeBlocks = true;\r\n highlighting = true;\r\n\r\n constructor(private utils: UtilsService) { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n public analyize() {\r\n this.replacedText = this.utils.stripWhiteSpaceAndFormatting(this.text);\r\n this.highLightedText = this.replacedText;\r\n this.sequences = this.generateRepeatedSequenceDistances(this.replacedText, [3]);\r\n //this.frequencies = this.generateNthFrequencies(this.replacedText);\r\n this.groupText();\r\n }\r\n\r\n public setKeySize(size){\r\n this.keyLength = size;\r\n this.frequencies = this.generateNthFrequencies(this.replacedText);\r\n this.highLightedText = this.replacedText;\r\n this.groupText();\r\n\r\n }\r\n\r\n public reformat() {\r\n this.groupText();\r\n }\r\n\r\n\r\n groupText(){\r\n var padding = 0;\r\n var text = this.replacedText;\r\n if(this.keySizeBlocks) {\r\n text = text.match(new RegExp('.{1,' + this.keyLength + '}', 'g')).join(' ');\r\n padding = 1;\r\n }\r\n\r\n if(this.highlighting) {\r\n var newText = '';\r\n for (var i = 0; i < text.length; i++) {\r\n if (i % (this.keyLength + padding) != this.currentlyHighlightedIndex) {\r\n newText += text.charAt(i);\r\n } else {\r\n newText += \"\" + text.charAt(i) + \"\";\r\n }\r\n }\r\n text = newText\r\n }\r\n this.highLightedText = \"
\" + text + \"
\";\r\n\r\n }\r\n\r\n /**\r\n * takes in a character, letter and a number, shift and will shift the character by that much in either direction\r\n * NOTE: returns as an uppercase character\r\n * @param letter\r\n * @param shift\r\n * @returns {string}\r\n */\r\n shiftLetter(letter, shift){\r\n letter = letter.toUpperCase();\r\n var letterCode = letter.charCodeAt(0);\r\n letterCode += shift;\r\n letterCode -= 65;\r\n if(letterCode < 0){\r\n letterCode = 26 + letterCode;\r\n }\r\n letterCode = letterCode % 26;\r\n letterCode += 65;\r\n return String.fromCharCode(letterCode);\r\n }\r\n\r\n /**\r\n * takes in an amount to shift by and what offset from 0. I.E if shifting every 3rd character starting at the 2nd char\r\n * in the string. this manipulates replacedText and then calls groupText to update highlightedText to display the changes\r\n * @param shift\r\n * @param offset\r\n */\r\n shiftText(shift, offset){\r\n\r\n //turn into a list because its easier to iterate over and change every nth element\r\n var splitS = this.replacedText.split('');\r\n\r\n for (var i = offset; i < splitS.length-1; i+=this.keyLength) {\r\n splitS[i] = this.shiftLetter(splitS[i], shift);\r\n }\r\n //turn back into a string\r\n this.replacedText = splitS.join(\"\");\r\n\r\n this.groupText();\r\n }\r\n\r\n /**\r\n * meant to be called in the html and correspond with the < > arrow keys for rotating that frequency list by count\r\n * @param index\r\n * @param count\r\n */\r\n shiftFrequnecy(index, count) {\r\n //change highlightedIndex\r\n this.currentlyHighlightedIndex = index;\r\n\r\n //call shift text to update the characters of this index\r\n this.shiftText(-1 * count, index);\r\n\r\n //keep track of this info\r\n this.shiftIndexes[index].shift += count;\r\n this.shiftIndexes[index].currentChar = this.shiftLetter(this.shiftIndexes[index].currentChar, count);\r\n\r\n //now here we need to make a new array of the rotated frequency list by count and reassign to this.frequencies\r\n //because it is an input for the letter-frequency component and the only way for it to know a change happened is when a memory location of a property changes of the object\r\n var arr = [].concat(this.frequencies[index]);\r\n count -= arr.length * Math.floor(count / arr.length);\r\n arr.push.apply(arr, arr.splice(0, count));\r\n\r\n this.frequencies[index] = arr;\r\n }\r\n\r\n /**\r\n * This is responsible for taking the text and parsing it into multiple strings for each index of the key and then\r\n * generating the letter frequency for each string and then flattening that into a ordered letter frequency array.\r\n * It also initializes the shiftIndexes, which keep track of how much you have rotated the arrays\r\n *\r\n * ALSO if not commented out will initialize the positions of the shift indexes in an attempt to help you solve it\r\n * @param text\r\n * @returns {Array}\r\n */\r\n public generateNthFrequencies(text){\r\n //initialize book keeping\r\n this.shiftIndexes = [];\r\n var frequencies = [];\r\n var modStrings = [];\r\n for(var x = 0; x < this.keyLength; x++){\r\n modStrings.push('');\r\n this.shiftIndexes.push({currentChar : 'A', shift : 0});\r\n }\r\n //split the text into multiple strings for each index of the key\r\n var alphabet = this.utils.alphabet;\r\n for(var i = 0; i < text.length; i++) {\r\n var mod = i % this.keyLength;\r\n modStrings[mod] += text.charAt(i);\r\n\r\n }\r\n\r\n //now generate frequences for each index into a list\r\n for(var x = 0; x < modStrings.length; x++){\r\n var normalizedFrequencies = [];\r\n var letterFrequencyDict = this.utils.generateLetterCountDictionary(modStrings[x]);\r\n var sum = this.utils.countDict(letterFrequencyDict);\r\n //generate letters data and normalized letter frequency dict and transformKeyList\r\n for(var i = 0; i < alphabet.length; i++){\r\n normalizedFrequencies.push(letterFrequencyDict[alphabet[i]] / sum);\r\n }\r\n frequencies.push(normalizedFrequencies)\r\n }\r\n\r\n\r\n //comment out if you dont want it to attempt to auto solve it for you.\r\n //get a list of standard letter frequency\r\n // var standardLetterFrequencyDict = this.utils.standardLetterFrequencyDict;\r\n // var alphabet = this.utils.alphabet;\r\n // var standardLetterFrequencyData = [];\r\n // for(var i = 0; i < alphabet.length; i++){\r\n // standardLetterFrequencyData.push(standardLetterFrequencyDict[alphabet[i]]);\r\n // }\r\n // //go through and let auto fit make its best guess and then shift that index of the key to its guess\r\n // for(var i = 0; i < frequencies.length; i++){\r\n // var shift = this.autoFit(frequencies[i],standardLetterFrequencyData);\r\n // this.shiftFrequnecy(i, shift )\r\n // }\r\n //end auto solve\r\n\r\n return frequencies;\r\n }\r\n\r\n /**\r\n * Generates an array of objects {sequence: string, spacings: [number], factors: {number} }\r\n * sizes is a list of numbers for what sizes of the sequences to look for, currently just size 3 is used\r\n * spacings is the distance between every occurence so POW(number of spacings) for a formula for how many to expect\r\n * factors is a dictionary of key pairs which are just meant for quick look up on if the sequence spacings has that as a factor\r\n * @param text\r\n * @param sizes\r\n * @returns {Array}\r\n */\r\n generateRepeatedSequenceDistances(text, sizes: any[]){\r\n //make the base objects for the sequences\r\n var sequenceLengths = [];\r\n for(var i =0; i < sizes.length; i++){\r\n sequenceLengths.push({size: sizes[i], grams:{}})\r\n }\r\n var textLength = text.length;\r\n\r\n //iterate through the text length and then iterate over each sequence length\r\n for(i = 0; i < textLength; i++){\r\n for(var j = 0; j < sequenceLengths.length; j++){\r\n //basically while its not at the end of the string add it\r\n if(textLength - i - sequenceLengths[j].size >= 0){\r\n var g = text.substring(i, i + sequenceLengths[j].size);\r\n\r\n //maintain a list of the locations at which it is seen\r\n if(sequenceLengths[j].grams[g]){\r\n sequenceLengths[j].grams[g].push(i)\r\n }else{\r\n sequenceLengths[j].grams[g] = [i]\r\n }\r\n }\r\n }\r\n }\r\n\r\n //here is where the factors list is created\r\n this.factors = [];\r\n for(var c = this.minFactor; c <= this.maxFactor; c++){\r\n this.factors.push({size: c, count : 0})\r\n }\r\n //iterate over each sequence size\r\n for(var i =0; i < sequenceLengths.length; i++){\r\n var validRepeatedSequences = [];\r\n //for each sequence if it occurs more then once then generate POW set of differences\r\n for(var key in sequenceLengths[i].grams){\r\n var ref = sequenceLengths[i].grams[key];\r\n if(ref.length > 1){\r\n var spacing = [];\r\n //calculate power set of differences\r\n for(var x = 0; x < ref.length; x++){\r\n for(var y = x; y < ref.length - 1; y++)\r\n spacing.push(ref[y + 1] - ref[x])\r\n }\r\n\r\n //check if any spacings that was just generated has a number which is divisble by each factor\r\n var factors = {};\r\n for(var x = this.minFactor; x <= this.maxFactor; x++){\r\n var valid = false;\r\n for(var y = 0; y < spacing.length; y++){\r\n if(spacing[y] % x == 0){\r\n valid = true;\r\n break;\r\n }\r\n }\r\n if(valid){\r\n factors[x] = true;\r\n this.factors[x - this.minFactor].count += 1\r\n }\r\n }\r\n validRepeatedSequences.push({sequence: key, spacings : spacing, factors: factors})\r\n }\r\n }\r\n //sort the sequences so that the table displays them by how spacings it has first\r\n validRepeatedSequences.sort(function (a,b) {\r\n return a.spacings.length > b.spacings.length ? -1 : 1\r\n });\r\n\r\n sequenceLengths[i].grams = validRepeatedSequences;\r\n }\r\n return sequenceLengths\r\n }\r\n\r\n /**\r\n * helper function for rotating arrays\r\n * @param arr\r\n * @param count\r\n * @returns {any}\r\n */\r\n arrayRotate(arr, count) {\r\n count -= arr.length * Math.floor(count / arr.length)\r\n arr.push.apply(arr, arr.splice(0, count))\r\n return arr\r\n }\r\n\r\n /**\r\n * neat function which actually does the guessing and is very simple.\r\n * take in a frequency list and a reference frequency list(should be standard frequency)\r\n * @param frequency\r\n * @param reference\r\n * @returns {number}\r\n */\r\n autoFit(frequency, reference){\r\n //initialize bookkeeping to some large value so it will get properly set\r\n var lowestIndex = 0;\r\n var indexValue = 1000;\r\n\r\n //make new reference\r\n var arr = [].concat(frequency);\r\n\r\n /*\r\n Now the logic is as follows:\r\n 1. Compare each column and take absolute difference and make a running sum\r\n 2. rotate the frequency and repeat step 1 until having shifted to the length of the frequency\r\n 2.1 if the sum is less then the smallest sum found so far, keep track of it\r\n 3. return the lowest sum found\r\n */\r\n for(var j = 0; j < frequency.length; j++){\r\n var value = 0;\r\n for(var i = 0; i < frequency.length; i++){\r\n value += Math.abs(arr[i] - reference[i]);\r\n }\r\n if(value < indexValue){\r\n lowestIndex = j;\r\n indexValue = value\r\n }\r\n arr = this.arrayRotate(arr, 1)\r\n }\r\n\r\n console.log( String.fromCharCode(65 + lowestIndex));\r\n return lowestIndex;\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/app/vigenere/vigenere.component.ts","// The file contents for the current environment will overwrite these during build.\n// The build system defaults to the dev environment which uses `environment.ts`, but if you do\n// `ng build --env=prod` then `environment.prod.ts` will be used instead.\n// The list of which env maps to which file can be found in `.angular-cli.json`.\n\nexport const environment = {\n production: false\n};\n\n\n\n// WEBPACK FOOTER //\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/environments/environment.ts","import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment';\n\nimport 'hammerjs';\n\n\nif (environment.production) {\n enableProdMode();\n}\n\nplatformBrowserDynamic().bootstrapModule(AppModule)\n .catch(err => console.log(err));\n\n\n\n// WEBPACK FOOTER //\n// C:/Users/Jeffrey/Documents/web development/ciphersite/src/main.ts","var map = {\n\t\"./af\": \"../../../../moment/locale/af.js\",\n\t\"./af.js\": \"../../../../moment/locale/af.js\",\n\t\"./ar\": \"../../../../moment/locale/ar.js\",\n\t\"./ar-dz\": \"../../../../moment/locale/ar-dz.js\",\n\t\"./ar-dz.js\": \"../../../../moment/locale/ar-dz.js\",\n\t\"./ar-kw\": \"../../../../moment/locale/ar-kw.js\",\n\t\"./ar-kw.js\": \"../../../../moment/locale/ar-kw.js\",\n\t\"./ar-ly\": \"../../../../moment/locale/ar-ly.js\",\n\t\"./ar-ly.js\": \"../../../../moment/locale/ar-ly.js\",\n\t\"./ar-ma\": \"../../../../moment/locale/ar-ma.js\",\n\t\"./ar-ma.js\": \"../../../../moment/locale/ar-ma.js\",\n\t\"./ar-sa\": \"../../../../moment/locale/ar-sa.js\",\n\t\"./ar-sa.js\": \"../../../../moment/locale/ar-sa.js\",\n\t\"./ar-tn\": \"../../../../moment/locale/ar-tn.js\",\n\t\"./ar-tn.js\": \"../../../../moment/locale/ar-tn.js\",\n\t\"./ar.js\": \"../../../../moment/locale/ar.js\",\n\t\"./az\": \"../../../../moment/locale/az.js\",\n\t\"./az.js\": \"../../../../moment/locale/az.js\",\n\t\"./be\": \"../../../../moment/locale/be.js\",\n\t\"./be.js\": \"../../../../moment/locale/be.js\",\n\t\"./bg\": \"../../../../moment/locale/bg.js\",\n\t\"./bg.js\": \"../../../../moment/locale/bg.js\",\n\t\"./bn\": \"../../../../moment/locale/bn.js\",\n\t\"./bn.js\": \"../../../../moment/locale/bn.js\",\n\t\"./bo\": \"../../../../moment/locale/bo.js\",\n\t\"./bo.js\": \"../../../../moment/locale/bo.js\",\n\t\"./br\": \"../../../../moment/locale/br.js\",\n\t\"./br.js\": \"../../../../moment/locale/br.js\",\n\t\"./bs\": \"../../../../moment/locale/bs.js\",\n\t\"./bs.js\": \"../../../../moment/locale/bs.js\",\n\t\"./ca\": \"../../../../moment/locale/ca.js\",\n\t\"./ca.js\": \"../../../../moment/locale/ca.js\",\n\t\"./cs\": \"../../../../moment/locale/cs.js\",\n\t\"./cs.js\": \"../../../../moment/locale/cs.js\",\n\t\"./cv\": \"../../../../moment/locale/cv.js\",\n\t\"./cv.js\": \"../../../../moment/locale/cv.js\",\n\t\"./cy\": \"../../../../moment/locale/cy.js\",\n\t\"./cy.js\": \"../../../../moment/locale/cy.js\",\n\t\"./da\": \"../../../../moment/locale/da.js\",\n\t\"./da.js\": \"../../../../moment/locale/da.js\",\n\t\"./de\": \"../../../../moment/locale/de.js\",\n\t\"./de-at\": \"../../../../moment/locale/de-at.js\",\n\t\"./de-at.js\": \"../../../../moment/locale/de-at.js\",\n\t\"./de-ch\": \"../../../../moment/locale/de-ch.js\",\n\t\"./de-ch.js\": \"../../../../moment/locale/de-ch.js\",\n\t\"./de.js\": \"../../../../moment/locale/de.js\",\n\t\"./dv\": \"../../../../moment/locale/dv.js\",\n\t\"./dv.js\": \"../../../../moment/locale/dv.js\",\n\t\"./el\": \"../../../../moment/locale/el.js\",\n\t\"./el.js\": \"../../../../moment/locale/el.js\",\n\t\"./en-au\": \"../../../../moment/locale/en-au.js\",\n\t\"./en-au.js\": \"../../../../moment/locale/en-au.js\",\n\t\"./en-ca\": \"../../../../moment/locale/en-ca.js\",\n\t\"./en-ca.js\": \"../../../../moment/locale/en-ca.js\",\n\t\"./en-gb\": \"../../../../moment/locale/en-gb.js\",\n\t\"./en-gb.js\": \"../../../../moment/locale/en-gb.js\",\n\t\"./en-ie\": \"../../../../moment/locale/en-ie.js\",\n\t\"./en-ie.js\": \"../../../../moment/locale/en-ie.js\",\n\t\"./en-nz\": \"../../../../moment/locale/en-nz.js\",\n\t\"./en-nz.js\": \"../../../../moment/locale/en-nz.js\",\n\t\"./eo\": \"../../../../moment/locale/eo.js\",\n\t\"./eo.js\": \"../../../../moment/locale/eo.js\",\n\t\"./es\": \"../../../../moment/locale/es.js\",\n\t\"./es-do\": \"../../../../moment/locale/es-do.js\",\n\t\"./es-do.js\": \"../../../../moment/locale/es-do.js\",\n\t\"./es.js\": \"../../../../moment/locale/es.js\",\n\t\"./et\": \"../../../../moment/locale/et.js\",\n\t\"./et.js\": \"../../../../moment/locale/et.js\",\n\t\"./eu\": \"../../../../moment/locale/eu.js\",\n\t\"./eu.js\": \"../../../../moment/locale/eu.js\",\n\t\"./fa\": \"../../../../moment/locale/fa.js\",\n\t\"./fa.js\": \"../../../../moment/locale/fa.js\",\n\t\"./fi\": \"../../../../moment/locale/fi.js\",\n\t\"./fi.js\": \"../../../../moment/locale/fi.js\",\n\t\"./fo\": \"../../../../moment/locale/fo.js\",\n\t\"./fo.js\": \"../../../../moment/locale/fo.js\",\n\t\"./fr\": \"../../../../moment/locale/fr.js\",\n\t\"./fr-ca\": \"../../../../moment/locale/fr-ca.js\",\n\t\"./fr-ca.js\": \"../../../../moment/locale/fr-ca.js\",\n\t\"./fr-ch\": \"../../../../moment/locale/fr-ch.js\",\n\t\"./fr-ch.js\": \"../../../../moment/locale/fr-ch.js\",\n\t\"./fr.js\": \"../../../../moment/locale/fr.js\",\n\t\"./fy\": \"../../../../moment/locale/fy.js\",\n\t\"./fy.js\": \"../../../../moment/locale/fy.js\",\n\t\"./gd\": \"../../../../moment/locale/gd.js\",\n\t\"./gd.js\": \"../../../../moment/locale/gd.js\",\n\t\"./gl\": \"../../../../moment/locale/gl.js\",\n\t\"./gl.js\": \"../../../../moment/locale/gl.js\",\n\t\"./gom-latn\": \"../../../../moment/locale/gom-latn.js\",\n\t\"./gom-latn.js\": \"../../../../moment/locale/gom-latn.js\",\n\t\"./he\": \"../../../../moment/locale/he.js\",\n\t\"./he.js\": \"../../../../moment/locale/he.js\",\n\t\"./hi\": \"../../../../moment/locale/hi.js\",\n\t\"./hi.js\": \"../../../../moment/locale/hi.js\",\n\t\"./hr\": \"../../../../moment/locale/hr.js\",\n\t\"./hr.js\": \"../../../../moment/locale/hr.js\",\n\t\"./hu\": \"../../../../moment/locale/hu.js\",\n\t\"./hu.js\": \"../../../../moment/locale/hu.js\",\n\t\"./hy-am\": \"../../../../moment/locale/hy-am.js\",\n\t\"./hy-am.js\": \"../../../../moment/locale/hy-am.js\",\n\t\"./id\": \"../../../../moment/locale/id.js\",\n\t\"./id.js\": \"../../../../moment/locale/id.js\",\n\t\"./is\": \"../../../../moment/locale/is.js\",\n\t\"./is.js\": \"../../../../moment/locale/is.js\",\n\t\"./it\": \"../../../../moment/locale/it.js\",\n\t\"./it.js\": \"../../../../moment/locale/it.js\",\n\t\"./ja\": \"../../../../moment/locale/ja.js\",\n\t\"./ja.js\": \"../../../../moment/locale/ja.js\",\n\t\"./jv\": \"../../../../moment/locale/jv.js\",\n\t\"./jv.js\": \"../../../../moment/locale/jv.js\",\n\t\"./ka\": \"../../../../moment/locale/ka.js\",\n\t\"./ka.js\": \"../../../../moment/locale/ka.js\",\n\t\"./kk\": \"../../../../moment/locale/kk.js\",\n\t\"./kk.js\": \"../../../../moment/locale/kk.js\",\n\t\"./km\": \"../../../../moment/locale/km.js\",\n\t\"./km.js\": \"../../../../moment/locale/km.js\",\n\t\"./kn\": \"../../../../moment/locale/kn.js\",\n\t\"./kn.js\": \"../../../../moment/locale/kn.js\",\n\t\"./ko\": \"../../../../moment/locale/ko.js\",\n\t\"./ko.js\": \"../../../../moment/locale/ko.js\",\n\t\"./ky\": \"../../../../moment/locale/ky.js\",\n\t\"./ky.js\": \"../../../../moment/locale/ky.js\",\n\t\"./lb\": \"../../../../moment/locale/lb.js\",\n\t\"./lb.js\": \"../../../../moment/locale/lb.js\",\n\t\"./lo\": \"../../../../moment/locale/lo.js\",\n\t\"./lo.js\": \"../../../../moment/locale/lo.js\",\n\t\"./lt\": \"../../../../moment/locale/lt.js\",\n\t\"./lt.js\": \"../../../../moment/locale/lt.js\",\n\t\"./lv\": \"../../../../moment/locale/lv.js\",\n\t\"./lv.js\": \"../../../../moment/locale/lv.js\",\n\t\"./me\": \"../../../../moment/locale/me.js\",\n\t\"./me.js\": \"../../../../moment/locale/me.js\",\n\t\"./mi\": \"../../../../moment/locale/mi.js\",\n\t\"./mi.js\": \"../../../../moment/locale/mi.js\",\n\t\"./mk\": \"../../../../moment/locale/mk.js\",\n\t\"./mk.js\": \"../../../../moment/locale/mk.js\",\n\t\"./ml\": \"../../../../moment/locale/ml.js\",\n\t\"./ml.js\": \"../../../../moment/locale/ml.js\",\n\t\"./mr\": \"../../../../moment/locale/mr.js\",\n\t\"./mr.js\": \"../../../../moment/locale/mr.js\",\n\t\"./ms\": \"../../../../moment/locale/ms.js\",\n\t\"./ms-my\": \"../../../../moment/locale/ms-my.js\",\n\t\"./ms-my.js\": \"../../../../moment/locale/ms-my.js\",\n\t\"./ms.js\": \"../../../../moment/locale/ms.js\",\n\t\"./my\": \"../../../../moment/locale/my.js\",\n\t\"./my.js\": \"../../../../moment/locale/my.js\",\n\t\"./nb\": \"../../../../moment/locale/nb.js\",\n\t\"./nb.js\": \"../../../../moment/locale/nb.js\",\n\t\"./ne\": \"../../../../moment/locale/ne.js\",\n\t\"./ne.js\": \"../../../../moment/locale/ne.js\",\n\t\"./nl\": \"../../../../moment/locale/nl.js\",\n\t\"./nl-be\": \"../../../../moment/locale/nl-be.js\",\n\t\"./nl-be.js\": \"../../../../moment/locale/nl-be.js\",\n\t\"./nl.js\": \"../../../../moment/locale/nl.js\",\n\t\"./nn\": \"../../../../moment/locale/nn.js\",\n\t\"./nn.js\": \"../../../../moment/locale/nn.js\",\n\t\"./pa-in\": \"../../../../moment/locale/pa-in.js\",\n\t\"./pa-in.js\": \"../../../../moment/locale/pa-in.js\",\n\t\"./pl\": \"../../../../moment/locale/pl.js\",\n\t\"./pl.js\": \"../../../../moment/locale/pl.js\",\n\t\"./pt\": \"../../../../moment/locale/pt.js\",\n\t\"./pt-br\": \"../../../../moment/locale/pt-br.js\",\n\t\"./pt-br.js\": \"../../../../moment/locale/pt-br.js\",\n\t\"./pt.js\": \"../../../../moment/locale/pt.js\",\n\t\"./ro\": \"../../../../moment/locale/ro.js\",\n\t\"./ro.js\": \"../../../../moment/locale/ro.js\",\n\t\"./ru\": \"../../../../moment/locale/ru.js\",\n\t\"./ru.js\": \"../../../../moment/locale/ru.js\",\n\t\"./sd\": \"../../../../moment/locale/sd.js\",\n\t\"./sd.js\": \"../../../../moment/locale/sd.js\",\n\t\"./se\": \"../../../../moment/locale/se.js\",\n\t\"./se.js\": \"../../../../moment/locale/se.js\",\n\t\"./si\": \"../../../../moment/locale/si.js\",\n\t\"./si.js\": \"../../../../moment/locale/si.js\",\n\t\"./sk\": \"../../../../moment/locale/sk.js\",\n\t\"./sk.js\": \"../../../../moment/locale/sk.js\",\n\t\"./sl\": \"../../../../moment/locale/sl.js\",\n\t\"./sl.js\": \"../../../../moment/locale/sl.js\",\n\t\"./sq\": \"../../../../moment/locale/sq.js\",\n\t\"./sq.js\": \"../../../../moment/locale/sq.js\",\n\t\"./sr\": \"../../../../moment/locale/sr.js\",\n\t\"./sr-cyrl\": \"../../../../moment/locale/sr-cyrl.js\",\n\t\"./sr-cyrl.js\": \"../../../../moment/locale/sr-cyrl.js\",\n\t\"./sr.js\": \"../../../../moment/locale/sr.js\",\n\t\"./ss\": \"../../../../moment/locale/ss.js\",\n\t\"./ss.js\": \"../../../../moment/locale/ss.js\",\n\t\"./sv\": \"../../../../moment/locale/sv.js\",\n\t\"./sv.js\": \"../../../../moment/locale/sv.js\",\n\t\"./sw\": \"../../../../moment/locale/sw.js\",\n\t\"./sw.js\": \"../../../../moment/locale/sw.js\",\n\t\"./ta\": \"../../../../moment/locale/ta.js\",\n\t\"./ta.js\": \"../../../../moment/locale/ta.js\",\n\t\"./te\": \"../../../../moment/locale/te.js\",\n\t\"./te.js\": \"../../../../moment/locale/te.js\",\n\t\"./tet\": \"../../../../moment/locale/tet.js\",\n\t\"./tet.js\": \"../../../../moment/locale/tet.js\",\n\t\"./th\": \"../../../../moment/locale/th.js\",\n\t\"./th.js\": \"../../../../moment/locale/th.js\",\n\t\"./tl-ph\": \"../../../../moment/locale/tl-ph.js\",\n\t\"./tl-ph.js\": \"../../../../moment/locale/tl-ph.js\",\n\t\"./tlh\": \"../../../../moment/locale/tlh.js\",\n\t\"./tlh.js\": \"../../../../moment/locale/tlh.js\",\n\t\"./tr\": \"../../../../moment/locale/tr.js\",\n\t\"./tr.js\": \"../../../../moment/locale/tr.js\",\n\t\"./tzl\": \"../../../../moment/locale/tzl.js\",\n\t\"./tzl.js\": \"../../../../moment/locale/tzl.js\",\n\t\"./tzm\": \"../../../../moment/locale/tzm.js\",\n\t\"./tzm-latn\": \"../../../../moment/locale/tzm-latn.js\",\n\t\"./tzm-latn.js\": \"../../../../moment/locale/tzm-latn.js\",\n\t\"./tzm.js\": \"../../../../moment/locale/tzm.js\",\n\t\"./uk\": \"../../../../moment/locale/uk.js\",\n\t\"./uk.js\": \"../../../../moment/locale/uk.js\",\n\t\"./ur\": \"../../../../moment/locale/ur.js\",\n\t\"./ur.js\": \"../../../../moment/locale/ur.js\",\n\t\"./uz\": \"../../../../moment/locale/uz.js\",\n\t\"./uz-latn\": \"../../../../moment/locale/uz-latn.js\",\n\t\"./uz-latn.js\": \"../../../../moment/locale/uz-latn.js\",\n\t\"./uz.js\": \"../../../../moment/locale/uz.js\",\n\t\"./vi\": \"../../../../moment/locale/vi.js\",\n\t\"./vi.js\": \"../../../../moment/locale/vi.js\",\n\t\"./x-pseudo\": \"../../../../moment/locale/x-pseudo.js\",\n\t\"./x-pseudo.js\": \"../../../../moment/locale/x-pseudo.js\",\n\t\"./yo\": \"../../../../moment/locale/yo.js\",\n\t\"./yo.js\": \"../../../../moment/locale/yo.js\",\n\t\"./zh-cn\": \"../../../../moment/locale/zh-cn.js\",\n\t\"./zh-cn.js\": \"../../../../moment/locale/zh-cn.js\",\n\t\"./zh-hk\": \"../../../../moment/locale/zh-hk.js\",\n\t\"./zh-hk.js\": \"../../../../moment/locale/zh-hk.js\",\n\t\"./zh-tw\": \"../../../../moment/locale/zh-tw.js\",\n\t\"./zh-tw.js\": \"../../../../moment/locale/zh-tw.js\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"../../../../moment/locale recursive ^\\\\.\\\\/.*$\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// C:/Users/Jeffrey/Documents/web development/ciphersite/node_modules/moment/locale ^\\.\\/.*$\n// module id = ../../../../moment/locale recursive ^\\.\\/.*$\n// module chunks = main"],"sourceRoot":"webpack:///"}