UNPKG

360 kBJavaScriptView Raw
1// Chance.js 1.1.3
2// http://chancejs.com
3// (c) 2013 Victor Quinn
4// Chance may be freely distributed or modified under the MIT license.
5
6(function () {
7
8 // Constants
9 var MAX_INT = 9007199254740992;
10 var MIN_INT = -MAX_INT;
11 var NUMBERS = '0123456789';
12 var CHARS_LOWER = 'abcdefghijklmnopqrstuvwxyz';
13 var CHARS_UPPER = CHARS_LOWER.toUpperCase();
14 var HEX_POOL = NUMBERS + "abcdef";
15
16 // Errors
17 function UnsupportedError(message) {
18 this.name = 'UnsupportedError';
19 this.message = message || 'This feature is not supported on this platform';
20 }
21
22 UnsupportedError.prototype = new Error();
23 UnsupportedError.prototype.constructor = UnsupportedError;
24
25 // Cached array helpers
26 var slice = Array.prototype.slice;
27
28 // Constructor
29 function Chance (seed) {
30 if (!(this instanceof Chance)) {
31 if (!seed) { seed = null; } // handle other non-truthy seeds, as described in issue #322
32 return seed === null ? new Chance() : new Chance(seed);
33 }
34
35 // if user has provided a function, use that as the generator
36 if (typeof seed === 'function') {
37 this.random = seed;
38 return this;
39 }
40
41 if (arguments.length) {
42 // set a starting value of zero so we can add to it
43 this.seed = 0;
44 }
45
46 // otherwise, leave this.seed blank so that MT will receive a blank
47
48 for (var i = 0; i < arguments.length; i++) {
49 var seedling = 0;
50 if (Object.prototype.toString.call(arguments[i]) === '[object String]') {
51 for (var j = 0; j < arguments[i].length; j++) {
52 // create a numeric hash for each argument, add to seedling
53 var hash = 0;
54 for (var k = 0; k < arguments[i].length; k++) {
55 hash = arguments[i].charCodeAt(k) + (hash << 6) + (hash << 16) - hash;
56 }
57 seedling += hash;
58 }
59 } else {
60 seedling = arguments[i];
61 }
62 this.seed += (arguments.length - i) * seedling;
63 }
64
65 // If no generator function was provided, use our MT
66 this.mt = this.mersenne_twister(this.seed);
67 this.bimd5 = this.blueimp_md5();
68 this.random = function () {
69 return this.mt.random(this.seed);
70 };
71
72 return this;
73 }
74
75 Chance.prototype.VERSION = "1.1.3";
76
77 // Random helper functions
78 function initOptions(options, defaults) {
79 options = options || {};
80
81 if (defaults) {
82 for (var i in defaults) {
83 if (typeof options[i] === 'undefined') {
84 options[i] = defaults[i];
85 }
86 }
87 }
88
89 return options;
90 }
91
92 function range(size) {
93 return Array.apply(null, Array(size)).map(function (_, i) {return i;});
94 }
95
96 function testRange(test, errorMessage) {
97 if (test) {
98 throw new RangeError(errorMessage);
99 }
100 }
101
102 /**
103 * Encode the input string with Base64.
104 */
105 var base64 = function() {
106 throw new Error('No Base64 encoder available.');
107 };
108
109 // Select proper Base64 encoder.
110 (function determineBase64Encoder() {
111 if (typeof btoa === 'function') {
112 base64 = btoa;
113 } else if (typeof Buffer === 'function') {
114 base64 = function(input) {
115 return new Buffer(input).toString('base64');
116 };
117 }
118 })();
119
120 // -- Basics --
121
122 /**
123 * Return a random bool, either true or false
124 *
125 * @param {Object} [options={ likelihood: 50 }] alter the likelihood of
126 * receiving a true or false value back.
127 * @throws {RangeError} if the likelihood is out of bounds
128 * @returns {Bool} either true or false
129 */
130 Chance.prototype.bool = function (options) {
131 // likelihood of success (true)
132 options = initOptions(options, {likelihood : 50});
133
134 // Note, we could get some minor perf optimizations by checking range
135 // prior to initializing defaults, but that makes code a bit messier
136 // and the check more complicated as we have to check existence of
137 // the object then existence of the key before checking constraints.
138 // Since the options initialization should be minor computationally,
139 // decision made for code cleanliness intentionally. This is mentioned
140 // here as it's the first occurrence, will not be mentioned again.
141 testRange(
142 options.likelihood < 0 || options.likelihood > 100,
143 "Chance: Likelihood accepts values from 0 to 100."
144 );
145
146 return this.random() * 100 < options.likelihood;
147 };
148
149 Chance.prototype.falsy = function (options) {
150 // return a random falsy value
151 options = initOptions(options, {pool: [false, null, 0, NaN, '']})
152 var pool = options.pool,
153 index = this.integer({min: 0, max: pool.length}),
154 value = pool[index];
155
156 return value;
157 }
158
159 Chance.prototype.animal = function (options){
160 //returns a random animal
161 options = initOptions(options);
162
163 if(typeof options.type !== 'undefined'){
164 //if user does not put in a valid animal type, user will get an error
165 testRange(
166 !this.get("animals")[options.type.toLowerCase()],
167 "Please pick from desert, ocean, grassland, forest, zoo, pets, farm."
168 );
169 //if user does put in valid animal type, will return a random animal of that type
170 return this.pick(this.get("animals")[options.type.toLowerCase()]);
171 }
172 //if user does not put in any animal type, will return a random animal regardless
173 var animalTypeArray = ["desert","forest","ocean","zoo","farm","pet","grassland"];
174 return this.pick(this.get("animals")[this.pick(animalTypeArray)]);
175 };
176
177 /**
178 * Return a random character.
179 *
180 * @param {Object} [options={}] can specify a character pool or alpha,
181 * numeric, symbols and casing (lower or upper)
182 * @returns {String} a single random character
183 */
184 Chance.prototype.character = function (options) {
185 options = initOptions(options);
186
187 var symbols = "!@#$%^&*()[]",
188 letters, pool;
189
190 if (options.casing === 'lower') {
191 letters = CHARS_LOWER;
192 } else if (options.casing === 'upper') {
193 letters = CHARS_UPPER;
194 } else {
195 letters = CHARS_LOWER + CHARS_UPPER;
196 }
197
198 if (options.pool) {
199 pool = options.pool;
200 } else {
201 pool = '';
202 if (options.alpha) {
203 pool += letters;
204 }
205 if (options.numeric) {
206 pool += NUMBERS;
207 }
208 if (options.symbols) {
209 pool += symbols;
210 }
211 if (!pool) {
212 pool = letters + NUMBERS + symbols;
213 }
214 }
215
216 return pool.charAt(this.natural({max: (pool.length - 1)}));
217 };
218
219 // Note, wanted to use "float" or "double" but those are both JS reserved words.
220
221 // Note, fixed means N OR LESS digits after the decimal. This because
222 // It could be 14.9000 but in JavaScript, when this is cast as a number,
223 // the trailing zeroes are dropped. Left to the consumer if trailing zeroes are
224 // needed
225 /**
226 * Return a random floating point number
227 *
228 * @param {Object} [options={}] can specify a fixed precision, min, max
229 * @returns {Number} a single floating point number
230 * @throws {RangeError} Can only specify fixed or precision, not both. Also
231 * min cannot be greater than max
232 */
233 Chance.prototype.floating = function (options) {
234 options = initOptions(options, {fixed : 4});
235 testRange(
236 options.fixed && options.precision,
237 "Chance: Cannot specify both fixed and precision."
238 );
239
240 var num;
241 var fixed = Math.pow(10, options.fixed);
242
243 var max = MAX_INT / fixed;
244 var min = -max;
245
246 testRange(
247 options.min && options.fixed && options.min < min,
248 "Chance: Min specified is out of range with fixed. Min should be, at least, " + min
249 );
250 testRange(
251 options.max && options.fixed && options.max > max,
252 "Chance: Max specified is out of range with fixed. Max should be, at most, " + max
253 );
254
255 options = initOptions(options, { min : min, max : max });
256
257 // Todo - Make this work!
258 // options.precision = (typeof options.precision !== "undefined") ? options.precision : false;
259
260 num = this.integer({min: options.min * fixed, max: options.max * fixed});
261 var num_fixed = (num / fixed).toFixed(options.fixed);
262
263 return parseFloat(num_fixed);
264 };
265
266 /**
267 * Return a random integer
268 *
269 * NOTE the max and min are INCLUDED in the range. So:
270 * chance.integer({min: 1, max: 3});
271 * would return either 1, 2, or 3.
272 *
273 * @param {Object} [options={}] can specify a min and/or max
274 * @returns {Number} a single random integer number
275 * @throws {RangeError} min cannot be greater than max
276 */
277 Chance.prototype.integer = function (options) {
278 // 9007199254740992 (2^53) is the max integer number in JavaScript
279 // See: http://vq.io/132sa2j
280 options = initOptions(options, {min: MIN_INT, max: MAX_INT});
281 testRange(options.min > options.max, "Chance: Min cannot be greater than Max.");
282
283 return Math.floor(this.random() * (options.max - options.min + 1) + options.min);
284 };
285
286 /**
287 * Return a random natural
288 *
289 * NOTE the max and min are INCLUDED in the range. So:
290 * chance.natural({min: 1, max: 3});
291 * would return either 1, 2, or 3.
292 *
293 * @param {Object} [options={}] can specify a min and/or max or a numerals count.
294 * @returns {Number} a single random integer number
295 * @throws {RangeError} min cannot be greater than max
296 */
297 Chance.prototype.natural = function (options) {
298 options = initOptions(options, {min: 0, max: MAX_INT});
299 if (typeof options.numerals === 'number'){
300 testRange(options.numerals < 1, "Chance: Numerals cannot be less than one.");
301 options.min = Math.pow(10, options.numerals - 1);
302 options.max = Math.pow(10, options.numerals) - 1;
303 }
304 testRange(options.min < 0, "Chance: Min cannot be less than zero.");
305
306 if (options.exclude) {
307 testRange(!Array.isArray(options.exclude), "Chance: exclude must be an array.")
308
309 for (var exclusionIndex in options.exclude) {
310 testRange(!Number.isInteger(options.exclude[exclusionIndex]), "Chance: exclude must be numbers.")
311 }
312
313 let random = options.min + this.natural({max: options.max - options.min - options.exclude.length})
314 var sortedExclusions = options.exclude.sort();
315 for (var exclusionIndex in sortedExclusions) {
316 if (random < sortedExclusions[exclusionIndex]) {
317 break
318 }
319 random++
320 }
321 return random
322 }
323 return this.integer(options);
324 };
325
326 /**
327 * Return a random prime number
328 *
329 * NOTE the max and min are INCLUDED in the range.
330 *
331 * @param {Object} [options={}] can specify a min and/or max
332 * @returns {Number} a single random prime number
333 * @throws {RangeError} min cannot be greater than max nor negative
334 */
335 Chance.prototype.prime = function (options) {
336 options = initOptions(options, {min: 0, max: 10000});
337 testRange(options.min < 0, "Chance: Min cannot be less than zero.");
338 testRange(options.min > options.max, "Chance: Min cannot be greater than Max.");
339
340 var lastPrime = data.primes[data.primes.length - 1];
341 if (options.max > lastPrime) {
342 for (var i = lastPrime + 2; i <= options.max; ++i) {
343 if (this.is_prime(i)) {
344 data.primes.push(i);
345 }
346 }
347 }
348 var targetPrimes = data.primes.filter(function (prime) {
349 return prime >= options.min && prime <= options.max;
350 });
351 return this.pick(targetPrimes);
352 };
353
354 /**
355 * Determine whether a given number is prime or not.
356 */
357 Chance.prototype.is_prime = function (n) {
358 if (n % 1 || n < 2) {
359 return false;
360 }
361 if (n % 2 === 0) {
362 return n === 2;
363 }
364 if (n % 3 === 0) {
365 return n === 3;
366 }
367 var m = Math.sqrt(n);
368 for (var i = 5; i <= m; i += 6) {
369 if (n % i === 0 || n % (i + 2) === 0) {
370 return false;
371 }
372 }
373 return true;
374 };
375
376 /**
377 * Return a random hex number as string
378 *
379 * NOTE the max and min are INCLUDED in the range. So:
380 * chance.hex({min: '9', max: 'B'});
381 * would return either '9', 'A' or 'B'.
382 *
383 * @param {Object} [options={}] can specify a min and/or max and/or casing
384 * @returns {String} a single random string hex number
385 * @throws {RangeError} min cannot be greater than max
386 */
387 Chance.prototype.hex = function (options) {
388 options = initOptions(options, {min: 0, max: MAX_INT, casing: 'lower'});
389 testRange(options.min < 0, "Chance: Min cannot be less than zero.");
390 var integer = this.natural({min: options.min, max: options.max});
391 if (options.casing === 'upper') {
392 return integer.toString(16).toUpperCase();
393 }
394 return integer.toString(16);
395 };
396
397 Chance.prototype.letter = function(options) {
398 options = initOptions(options, {casing: 'lower'});
399 var pool = "abcdefghijklmnopqrstuvwxyz";
400 var letter = this.character({pool: pool});
401 if (options.casing === 'upper') {
402 letter = letter.toUpperCase();
403 }
404 return letter;
405 }
406
407 /**
408 * Return a random string
409 *
410 * @param {Object} [options={}] can specify a length or min and max
411 * @returns {String} a string of random length
412 * @throws {RangeError} length cannot be less than zero
413 */
414 Chance.prototype.string = function (options) {
415 options = initOptions(options, { min: 5, max: 20 });
416
417 if (!options.length) {
418 options.length = this.natural({ min: options.min, max: options.max })
419 }
420
421 testRange(options.length < 0, "Chance: Length cannot be less than zero.");
422 var length = options.length,
423 text = this.n(this.character, length, options);
424
425 return text.join("");
426 };
427
428 function CopyToken(c) {
429 this.c = c
430 }
431
432 CopyToken.prototype = {
433 substitute: function () {
434 return this.c
435 }
436 }
437
438 function EscapeToken(c) {
439 this.c = c
440 }
441
442 EscapeToken.prototype = {
443 substitute: function () {
444 if (!/[{}\\]/.test(this.c)) {
445 throw new Error('Invalid escape sequence: "\\' + this.c + '".')
446 }
447 return this.c
448 }
449 }
450
451 function ReplaceToken(c) {
452 this.c = c
453 }
454
455 ReplaceToken.prototype = {
456 replacers: {
457 '#': function (chance) { return chance.character({ pool: NUMBERS }) },
458 'A': function (chance) { return chance.character({ pool: CHARS_UPPER }) },
459 'a': function (chance) { return chance.character({ pool: CHARS_LOWER }) },
460 },
461
462 substitute: function (chance) {
463 var replacer = this.replacers[this.c]
464 if (!replacer) {
465 throw new Error('Invalid replacement character: "' + this.c + '".')
466 }
467 return replacer(chance)
468 }
469 }
470
471 function parseTemplate(template) {
472 var tokens = []
473 var mode = 'identity'
474 for (var i = 0; i<template.length; i++) {
475 var c = template[i]
476 switch (mode) {
477 case 'escape':
478 tokens.push(new EscapeToken(c))
479 mode = 'identity'
480 break
481 case 'identity':
482 if (c === '{') {
483 mode = 'replace'
484 } else if (c === '\\') {
485 mode = 'escape'
486 } else {
487 tokens.push(new CopyToken(c))
488 }
489 break
490 case 'replace':
491 if (c === '}') {
492 mode = 'identity'
493 } else {
494 tokens.push(new ReplaceToken(c))
495 }
496 break
497 }
498 }
499 return tokens
500 }
501
502 /**
503 * Return a random string matching the given template.
504 *
505 * The template consists of any number of "character replacement" and
506 * "character literal" sequences. A "character replacement" sequence
507 * starts with a left brace, has any number of special replacement
508 * characters, and ends with a right brace. A character literal can be any
509 * character except a brace or a backslash. A literal brace or backslash
510 * character can be included in the output by escaping with a backslash.
511 *
512 * The following replacement characters can be used in a replacement
513 * sequence:
514 *
515 * "#": a random digit
516 * "a": a random lower case letter
517 * "A": a random upper case letter
518 *
519 * Example: chance.template('{AA###}-{##}')
520 *
521 * @param {String} template string.
522 * @returns {String} a random string matching the template.
523 */
524 Chance.prototype.template = function (template) {
525 if (!template) {
526 throw new Error('Template string is required')
527 }
528 var self = this
529 return parseTemplate(template)
530 .map(function (token) { return token.substitute(self) })
531 .join('');
532 };
533
534
535 /**
536 * Return a random buffer
537 *
538 * @param {Object} [options={}] can specify a length
539 * @returns {Buffer} a buffer of random length
540 * @throws {RangeError} length cannot be less than zero
541 */
542 Chance.prototype.buffer = function (options) {
543 if (typeof Buffer === 'undefined') {
544 throw new UnsupportedError('Sorry, the buffer() function is not supported on your platform');
545 }
546 options = initOptions(options, { length: this.natural({min: 5, max: 20}) });
547 testRange(options.length < 0, "Chance: Length cannot be less than zero.");
548 var length = options.length;
549 var content = this.n(this.character, length, options);
550
551 return Buffer.from(content);
552 };
553
554 // -- End Basics --
555
556 // -- Helpers --
557
558 Chance.prototype.capitalize = function (word) {
559 return word.charAt(0).toUpperCase() + word.substr(1);
560 };
561
562 Chance.prototype.mixin = function (obj) {
563 for (var func_name in obj) {
564 Chance.prototype[func_name] = obj[func_name];
565 }
566 return this;
567 };
568
569 /**
570 * Given a function that generates something random and a number of items to generate,
571 * return an array of items where none repeat.
572 *
573 * @param {Function} fn the function that generates something random
574 * @param {Number} num number of terms to generate
575 * @param {Object} options any options to pass on to the generator function
576 * @returns {Array} an array of length `num` with every item generated by `fn` and unique
577 *
578 * There can be more parameters after these. All additional parameters are provided to the given function
579 */
580 Chance.prototype.unique = function(fn, num, options) {
581 testRange(
582 typeof fn !== "function",
583 "Chance: The first argument must be a function."
584 );
585
586 var comparator = function(arr, val) { return arr.indexOf(val) !== -1; };
587
588 if (options) {
589 comparator = options.comparator || comparator;
590 }
591
592 var arr = [], count = 0, result, MAX_DUPLICATES = num * 50, params = slice.call(arguments, 2);
593
594 while (arr.length < num) {
595 var clonedParams = JSON.parse(JSON.stringify(params));
596 result = fn.apply(this, clonedParams);
597 if (!comparator(arr, result)) {
598 arr.push(result);
599 // reset count when unique found
600 count = 0;
601 }
602
603 if (++count > MAX_DUPLICATES) {
604 throw new RangeError("Chance: num is likely too large for sample set");
605 }
606 }
607 return arr;
608 };
609
610 /**
611 * Gives an array of n random terms
612 *
613 * @param {Function} fn the function that generates something random
614 * @param {Number} n number of terms to generate
615 * @returns {Array} an array of length `n` with items generated by `fn`
616 *
617 * There can be more parameters after these. All additional parameters are provided to the given function
618 */
619 Chance.prototype.n = function(fn, n) {
620 testRange(
621 typeof fn !== "function",
622 "Chance: The first argument must be a function."
623 );
624
625 if (typeof n === 'undefined') {
626 n = 1;
627 }
628 var i = n, arr = [], params = slice.call(arguments, 2);
629
630 // Providing a negative count should result in a noop.
631 i = Math.max( 0, i );
632
633 for (null; i--; null) {
634 arr.push(fn.apply(this, params));
635 }
636
637 return arr;
638 };
639
640 // H/T to SO for this one: http://vq.io/OtUrZ5
641 Chance.prototype.pad = function (number, width, pad) {
642 // Default pad to 0 if none provided
643 pad = pad || '0';
644 // Convert number to a string
645 number = number + '';
646 return number.length >= width ? number : new Array(width - number.length + 1).join(pad) + number;
647 };
648
649 // DEPRECATED on 2015-10-01
650 Chance.prototype.pick = function (arr, count) {
651 if (arr.length === 0) {
652 throw new RangeError("Chance: Cannot pick() from an empty array");
653 }
654 if (!count || count === 1) {
655 return arr[this.natural({max: arr.length - 1})];
656 } else {
657 return this.shuffle(arr).slice(0, count);
658 }
659 };
660
661 // Given an array, returns a single random element
662 Chance.prototype.pickone = function (arr) {
663 if (arr.length === 0) {
664 throw new RangeError("Chance: Cannot pickone() from an empty array");
665 }
666 return arr[this.natural({max: arr.length - 1})];
667 };
668
669 // Given an array, returns a random set with 'count' elements
670 Chance.prototype.pickset = function (arr, count) {
671 if (count === 0) {
672 return [];
673 }
674 if (arr.length === 0) {
675 throw new RangeError("Chance: Cannot pickset() from an empty array");
676 }
677 if (count < 0) {
678 throw new RangeError("Chance: Count must be a positive number");
679 }
680 if (!count || count === 1) {
681 return [ this.pickone(arr) ];
682 } else {
683 var array = arr.slice(0);
684 var end = array.length;
685
686 return this.n(function () {
687 var index = this.natural({max: --end});
688 var value = array[index];
689 array[index] = array[end];
690 return value;
691 }, Math.min(end, count));
692 }
693 };
694
695 Chance.prototype.shuffle = function (arr) {
696 var new_array = [],
697 j = 0,
698 length = Number(arr.length),
699 source_indexes = range(length),
700 last_source_index = length - 1,
701 selected_source_index;
702
703 for (var i = 0; i < length; i++) {
704 // Pick a random index from the array
705 selected_source_index = this.natural({max: last_source_index});
706 j = source_indexes[selected_source_index];
707
708 // Add it to the new array
709 new_array[i] = arr[j];
710
711 // Mark the source index as used
712 source_indexes[selected_source_index] = source_indexes[last_source_index];
713 last_source_index -= 1;
714 }
715
716 return new_array;
717 };
718
719 // Returns a single item from an array with relative weighting of odds
720 Chance.prototype.weighted = function (arr, weights, trim) {
721 if (arr.length !== weights.length) {
722 throw new RangeError("Chance: Length of array and weights must match");
723 }
724
725 // scan weights array and sum valid entries
726 var sum = 0;
727 var val;
728 for (var weightIndex = 0; weightIndex < weights.length; ++weightIndex) {
729 val = weights[weightIndex];
730 if (isNaN(val)) {
731 throw new RangeError("Chance: All weights must be numbers");
732 }
733
734 if (val > 0) {
735 sum += val;
736 }
737 }
738
739 if (sum === 0) {
740 throw new RangeError("Chance: No valid entries in array weights");
741 }
742
743 // select a value within range
744 var selected = this.random() * sum;
745
746 // find array entry corresponding to selected value
747 var total = 0;
748 var lastGoodIdx = -1;
749 var chosenIdx;
750 for (weightIndex = 0; weightIndex < weights.length; ++weightIndex) {
751 val = weights[weightIndex];
752 total += val;
753 if (val > 0) {
754 if (selected <= total) {
755 chosenIdx = weightIndex;
756 break;
757 }
758 lastGoodIdx = weightIndex;
759 }
760
761 // handle any possible rounding error comparison to ensure something is picked
762 if (weightIndex === (weights.length - 1)) {
763 chosenIdx = lastGoodIdx;
764 }
765 }
766
767 var chosen = arr[chosenIdx];
768 trim = (typeof trim === 'undefined') ? false : trim;
769 if (trim) {
770 arr.splice(chosenIdx, 1);
771 weights.splice(chosenIdx, 1);
772 }
773
774 return chosen;
775 };
776
777 // -- End Helpers --
778
779 // -- Text --
780
781 Chance.prototype.paragraph = function (options) {
782 options = initOptions(options);
783
784 var sentences = options.sentences || this.natural({min: 3, max: 7}),
785 sentence_array = this.n(this.sentence, sentences);
786
787 return sentence_array.join(' ');
788 };
789
790 // Could get smarter about this than generating random words and
791 // chaining them together. Such as: http://vq.io/1a5ceOh
792 Chance.prototype.sentence = function (options) {
793 options = initOptions(options);
794
795 var words = options.words || this.natural({min: 12, max: 18}),
796 punctuation = options.punctuation,
797 text, word_array = this.n(this.word, words);
798
799 text = word_array.join(' ');
800
801 // Capitalize first letter of sentence
802 text = this.capitalize(text);
803
804 // Make sure punctuation has a usable value
805 if (punctuation !== false && !/^[.?;!:]$/.test(punctuation)) {
806 punctuation = '.';
807 }
808
809 // Add punctuation mark
810 if (punctuation) {
811 text += punctuation;
812 }
813
814 return text;
815 };
816
817 Chance.prototype.syllable = function (options) {
818 options = initOptions(options);
819
820 var length = options.length || this.natural({min: 2, max: 3}),
821 consonants = 'bcdfghjklmnprstvwz', // consonants except hard to speak ones
822 vowels = 'aeiou', // vowels
823 all = consonants + vowels, // all
824 text = '',
825 chr;
826
827 // I'm sure there's a more elegant way to do this, but this works
828 // decently well.
829 for (var i = 0; i < length; i++) {
830 if (i === 0) {
831 // First character can be anything
832 chr = this.character({pool: all});
833 } else if (consonants.indexOf(chr) === -1) {
834 // Last character was a vowel, now we want a consonant
835 chr = this.character({pool: consonants});
836 } else {
837 // Last character was a consonant, now we want a vowel
838 chr = this.character({pool: vowels});
839 }
840
841 text += chr;
842 }
843
844 if (options.capitalize) {
845 text = this.capitalize(text);
846 }
847
848 return text;
849 };
850
851 Chance.prototype.word = function (options) {
852 options = initOptions(options);
853
854 testRange(
855 options.syllables && options.length,
856 "Chance: Cannot specify both syllables AND length."
857 );
858
859 var syllables = options.syllables || this.natural({min: 1, max: 3}),
860 text = '';
861
862 if (options.length) {
863 // Either bound word by length
864 do {
865 text += this.syllable();
866 } while (text.length < options.length);
867 text = text.substring(0, options.length);
868 } else {
869 // Or by number of syllables
870 for (var i = 0; i < syllables; i++) {
871 text += this.syllable();
872 }
873 }
874
875 if (options.capitalize) {
876 text = this.capitalize(text);
877 }
878
879 return text;
880 };
881
882 // -- End Text --
883
884 // -- Person --
885
886 Chance.prototype.age = function (options) {
887 options = initOptions(options);
888 var ageRange;
889
890 switch (options.type) {
891 case 'child':
892 ageRange = {min: 0, max: 12};
893 break;
894 case 'teen':
895 ageRange = {min: 13, max: 19};
896 break;
897 case 'adult':
898 ageRange = {min: 18, max: 65};
899 break;
900 case 'senior':
901 ageRange = {min: 65, max: 100};
902 break;
903 case 'all':
904 ageRange = {min: 0, max: 100};
905 break;
906 default:
907 ageRange = {min: 18, max: 65};
908 break;
909 }
910
911 return this.natural(ageRange);
912 };
913
914 Chance.prototype.birthday = function (options) {
915 var age = this.age(options);
916 var currentYear = new Date().getFullYear();
917
918 if (options && options.type) {
919 var min = new Date();
920 var max = new Date();
921 min.setFullYear(currentYear - age - 1);
922 max.setFullYear(currentYear - age);
923
924 options = initOptions(options, {
925 min: min,
926 max: max
927 });
928 } else {
929 options = initOptions(options, {
930 year: currentYear - age
931 });
932 }
933
934 return this.date(options);
935 };
936
937 // CPF; ID to identify taxpayers in Brazil
938 Chance.prototype.cpf = function (options) {
939 options = initOptions(options, {
940 formatted: true
941 });
942
943 var n = this.n(this.natural, 9, { max: 9 });
944 var d1 = n[8]*2+n[7]*3+n[6]*4+n[5]*5+n[4]*6+n[3]*7+n[2]*8+n[1]*9+n[0]*10;
945 d1 = 11 - (d1 % 11);
946 if (d1>=10) {
947 d1 = 0;
948 }
949 var d2 = d1*2+n[8]*3+n[7]*4+n[6]*5+n[5]*6+n[4]*7+n[3]*8+n[2]*9+n[1]*10+n[0]*11;
950 d2 = 11 - (d2 % 11);
951 if (d2>=10) {
952 d2 = 0;
953 }
954 var cpf = ''+n[0]+n[1]+n[2]+'.'+n[3]+n[4]+n[5]+'.'+n[6]+n[7]+n[8]+'-'+d1+d2;
955 return options.formatted ? cpf : cpf.replace(/\D/g,'');
956 };
957
958 // CNPJ: ID to identify companies in Brazil
959 Chance.prototype.cnpj = function (options) {
960 options = initOptions(options, {
961 formatted: true
962 });
963
964 var n = this.n(this.natural, 12, { max: 12 });
965 var d1 = n[11]*2+n[10]*3+n[9]*4+n[8]*5+n[7]*6+n[6]*7+n[5]*8+n[4]*9+n[3]*2+n[2]*3+n[1]*4+n[0]*5;
966 d1 = 11 - (d1 % 11);
967 if (d1<2) {
968 d1 = 0;
969 }
970 var d2 = d1*2+n[11]*3+n[10]*4+n[9]*5+n[8]*6+n[7]*7+n[6]*8+n[5]*9+n[4]*2+n[3]*3+n[2]*4+n[1]*5+n[0]*6;
971 d2 = 11 - (d2 % 11);
972 if (d2<2) {
973 d2 = 0;
974 }
975 var cnpj = ''+n[0]+n[1]+'.'+n[2]+n[3]+n[4]+'.'+n[5]+n[6]+n[7]+'/'+n[8]+n[9]+n[10]+n[11]+'-'+d1+d2;
976 return options.formatted ? cnpj : cnpj.replace(/\D/g,'');
977 };
978
979 Chance.prototype.first = function (options) {
980 options = initOptions(options, {gender: this.gender(), nationality: 'en'});
981 return this.pick(this.get("firstNames")[options.gender.toLowerCase()][options.nationality.toLowerCase()]);
982 };
983
984 Chance.prototype.profession = function (options) {
985 options = initOptions(options);
986 if(options.rank){
987 return this.pick(['Apprentice ', 'Junior ', 'Senior ', 'Lead ']) + this.pick(this.get("profession"));
988 } else{
989 return this.pick(this.get("profession"));
990 }
991 };
992
993 Chance.prototype.company = function (){
994 return this.pick(this.get("company"));
995 };
996
997 Chance.prototype.gender = function (options) {
998 options = initOptions(options, {extraGenders: []});
999 return this.pick(['Male', 'Female'].concat(options.extraGenders));
1000 };
1001
1002 Chance.prototype.last = function (options) {
1003 options = initOptions(options, {nationality: '*'});
1004 if (options.nationality === "*") {
1005 var allLastNames = []
1006 var lastNames = this.get("lastNames")
1007 Object.keys(lastNames).forEach(function(key){
1008 allLastNames = allLastNames.concat(lastNames[key])
1009 })
1010 return this.pick(allLastNames)
1011 }
1012 else {
1013 return this.pick(this.get("lastNames")[options.nationality.toLowerCase()]);
1014 }
1015
1016 };
1017
1018 Chance.prototype.israelId=function(){
1019 var x=this.string({pool: '0123456789',length:8});
1020 var y=0;
1021 for (var i=0;i<x.length;i++){
1022 var thisDigit= x[i] * (i/2===parseInt(i/2) ? 1 : 2);
1023 thisDigit=this.pad(thisDigit,2).toString();
1024 thisDigit=parseInt(thisDigit[0]) + parseInt(thisDigit[1]);
1025 y=y+thisDigit;
1026 }
1027 x=x+(10-parseInt(y.toString().slice(-1))).toString().slice(-1);
1028 return x;
1029 };
1030
1031 Chance.prototype.mrz = function (options) {
1032 var checkDigit = function (input) {
1033 var alpha = "<ABCDEFGHIJKLMNOPQRSTUVWXYXZ".split(''),
1034 multipliers = [ 7, 3, 1 ],
1035 runningTotal = 0;
1036
1037 if (typeof input !== 'string') {
1038 input = input.toString();
1039 }
1040
1041 input.split('').forEach(function(character, idx) {
1042 var pos = alpha.indexOf(character);
1043
1044 if(pos !== -1) {
1045 character = pos === 0 ? 0 : pos + 9;
1046 } else {
1047 character = parseInt(character, 10);
1048 }
1049 character *= multipliers[idx % multipliers.length];
1050 runningTotal += character;
1051 });
1052 return runningTotal % 10;
1053 };
1054 var generate = function (opts) {
1055 var pad = function (length) {
1056 return new Array(length + 1).join('<');
1057 };
1058 var number = [ 'P<',
1059 opts.issuer,
1060 opts.last.toUpperCase(),
1061 '<<',
1062 opts.first.toUpperCase(),
1063 pad(39 - (opts.last.length + opts.first.length + 2)),
1064 opts.passportNumber,
1065 checkDigit(opts.passportNumber),
1066 opts.nationality,
1067 opts.dob,
1068 checkDigit(opts.dob),
1069 opts.gender,
1070 opts.expiry,
1071 checkDigit(opts.expiry),
1072 pad(14),
1073 checkDigit(pad(14)) ].join('');
1074
1075 return number +
1076 (checkDigit(number.substr(44, 10) +
1077 number.substr(57, 7) +
1078 number.substr(65, 7)));
1079 };
1080
1081 var that = this;
1082
1083 options = initOptions(options, {
1084 first: this.first(),
1085 last: this.last(),
1086 passportNumber: this.integer({min: 100000000, max: 999999999}),
1087 dob: (function () {
1088 var date = that.birthday({type: 'adult'});
1089 return [date.getFullYear().toString().substr(2),
1090 that.pad(date.getMonth() + 1, 2),
1091 that.pad(date.getDate(), 2)].join('');
1092 }()),
1093 expiry: (function () {
1094 var date = new Date();
1095 return [(date.getFullYear() + 5).toString().substr(2),
1096 that.pad(date.getMonth() + 1, 2),
1097 that.pad(date.getDate(), 2)].join('');
1098 }()),
1099 gender: this.gender() === 'Female' ? 'F': 'M',
1100 issuer: 'GBR',
1101 nationality: 'GBR'
1102 });
1103 return generate (options);
1104 };
1105
1106 Chance.prototype.name = function (options) {
1107 options = initOptions(options);
1108
1109 var first = this.first(options),
1110 last = this.last(options),
1111 name;
1112
1113 if (options.middle) {
1114 name = first + ' ' + this.first(options) + ' ' + last;
1115 } else if (options.middle_initial) {
1116 name = first + ' ' + this.character({alpha: true, casing: 'upper'}) + '. ' + last;
1117 } else {
1118 name = first + ' ' + last;
1119 }
1120
1121 if (options.prefix) {
1122 name = this.prefix(options) + ' ' + name;
1123 }
1124
1125 if (options.suffix) {
1126 name = name + ' ' + this.suffix(options);
1127 }
1128
1129 return name;
1130 };
1131
1132 // Return the list of available name prefixes based on supplied gender.
1133 // @todo introduce internationalization
1134 Chance.prototype.name_prefixes = function (gender) {
1135 gender = gender || "all";
1136 gender = gender.toLowerCase();
1137
1138 var prefixes = [
1139 { name: 'Doctor', abbreviation: 'Dr.' }
1140 ];
1141
1142 if (gender === "male" || gender === "all") {
1143 prefixes.push({ name: 'Mister', abbreviation: 'Mr.' });
1144 }
1145
1146 if (gender === "female" || gender === "all") {
1147 prefixes.push({ name: 'Miss', abbreviation: 'Miss' });
1148 prefixes.push({ name: 'Misses', abbreviation: 'Mrs.' });
1149 }
1150
1151 return prefixes;
1152 };
1153
1154 // Alias for name_prefix
1155 Chance.prototype.prefix = function (options) {
1156 return this.name_prefix(options);
1157 };
1158
1159 Chance.prototype.name_prefix = function (options) {
1160 options = initOptions(options, { gender: "all" });
1161 return options.full ?
1162 this.pick(this.name_prefixes(options.gender)).name :
1163 this.pick(this.name_prefixes(options.gender)).abbreviation;
1164 };
1165 //Hungarian ID number
1166 Chance.prototype.HIDN= function(){
1167 //Hungarian ID nuber structure: XXXXXXYY (X=number,Y=Capital Latin letter)
1168 var idn_pool="0123456789";
1169 var idn_chrs="ABCDEFGHIJKLMNOPQRSTUVWXYXZ";
1170 var idn="";
1171 idn+=this.string({pool:idn_pool,length:6});
1172 idn+=this.string({pool:idn_chrs,length:2});
1173 return idn;
1174 };
1175
1176
1177 Chance.prototype.ssn = function (options) {
1178 options = initOptions(options, {ssnFour: false, dashes: true});
1179 var ssn_pool = "1234567890",
1180 ssn,
1181 dash = options.dashes ? '-' : '';
1182
1183 if(!options.ssnFour) {
1184 ssn = this.string({pool: ssn_pool, length: 3}) + dash +
1185 this.string({pool: ssn_pool, length: 2}) + dash +
1186 this.string({pool: ssn_pool, length: 4});
1187 } else {
1188 ssn = this.string({pool: ssn_pool, length: 4});
1189 }
1190 return ssn;
1191 };
1192
1193 // Aadhar is similar to ssn, used in India to uniquely identify a person
1194 Chance.prototype.aadhar = function (options) {
1195 options = initOptions(options, {onlyLastFour: false, separatedByWhiteSpace: true});
1196 var aadhar_pool = "1234567890",
1197 aadhar,
1198 whiteSpace = options.separatedByWhiteSpace ? ' ' : '';
1199
1200 if(!options.onlyLastFour) {
1201 aadhar = this.string({pool: aadhar_pool, length: 4}) + whiteSpace +
1202 this.string({pool: aadhar_pool, length: 4}) + whiteSpace +
1203 this.string({pool: aadhar_pool, length: 4});
1204 } else {
1205 aadhar = this.string({pool: aadhar_pool, length: 4});
1206 }
1207 return aadhar;
1208 };
1209
1210 // Return the list of available name suffixes
1211 // @todo introduce internationalization
1212 Chance.prototype.name_suffixes = function () {
1213 var suffixes = [
1214 { name: 'Doctor of Osteopathic Medicine', abbreviation: 'D.O.' },
1215 { name: 'Doctor of Philosophy', abbreviation: 'Ph.D.' },
1216 { name: 'Esquire', abbreviation: 'Esq.' },
1217 { name: 'Junior', abbreviation: 'Jr.' },
1218 { name: 'Juris Doctor', abbreviation: 'J.D.' },
1219 { name: 'Master of Arts', abbreviation: 'M.A.' },
1220 { name: 'Master of Business Administration', abbreviation: 'M.B.A.' },
1221 { name: 'Master of Science', abbreviation: 'M.S.' },
1222 { name: 'Medical Doctor', abbreviation: 'M.D.' },
1223 { name: 'Senior', abbreviation: 'Sr.' },
1224 { name: 'The Third', abbreviation: 'III' },
1225 { name: 'The Fourth', abbreviation: 'IV' },
1226 { name: 'Bachelor of Engineering', abbreviation: 'B.E' },
1227 { name: 'Bachelor of Technology', abbreviation: 'B.TECH' }
1228 ];
1229 return suffixes;
1230 };
1231
1232 // Alias for name_suffix
1233 Chance.prototype.suffix = function (options) {
1234 return this.name_suffix(options);
1235 };
1236
1237 Chance.prototype.name_suffix = function (options) {
1238 options = initOptions(options);
1239 return options.full ?
1240 this.pick(this.name_suffixes()).name :
1241 this.pick(this.name_suffixes()).abbreviation;
1242 };
1243
1244 Chance.prototype.nationalities = function () {
1245 return this.get("nationalities");
1246 };
1247
1248 // Generate random nationality based on json list
1249 Chance.prototype.nationality = function () {
1250 var nationality = this.pick(this.nationalities());
1251 return nationality.name;
1252 };
1253
1254 // -- End Person --
1255
1256 // -- Mobile --
1257 // Android GCM Registration ID
1258 Chance.prototype.android_id = function () {
1259 return "APA91" + this.string({ pool: "0123456789abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_", length: 178 });
1260 };
1261
1262 // Apple Push Token
1263 Chance.prototype.apple_token = function () {
1264 return this.string({ pool: "abcdef1234567890", length: 64 });
1265 };
1266
1267 // Windows Phone 8 ANID2
1268 Chance.prototype.wp8_anid2 = function () {
1269 return base64( this.hash( { length : 32 } ) );
1270 };
1271
1272 // Windows Phone 7 ANID
1273 Chance.prototype.wp7_anid = function () {
1274 return 'A=' + this.guid().replace(/-/g, '').toUpperCase() + '&E=' + this.hash({ length:3 }) + '&W=' + this.integer({ min:0, max:9 });
1275 };
1276
1277 // BlackBerry Device PIN
1278 Chance.prototype.bb_pin = function () {
1279 return this.hash({ length: 8 });
1280 };
1281
1282 // -- End Mobile --
1283
1284 // -- Web --
1285 Chance.prototype.avatar = function (options) {
1286 var url = null;
1287 var URL_BASE = '//www.gravatar.com/avatar/';
1288 var PROTOCOLS = {
1289 http: 'http',
1290 https: 'https'
1291 };
1292 var FILE_TYPES = {
1293 bmp: 'bmp',
1294 gif: 'gif',
1295 jpg: 'jpg',
1296 png: 'png'
1297 };
1298 var FALLBACKS = {
1299 '404': '404', // Return 404 if not found
1300 mm: 'mm', // Mystery man
1301 identicon: 'identicon', // Geometric pattern based on hash
1302 monsterid: 'monsterid', // A generated monster icon
1303 wavatar: 'wavatar', // A generated face
1304 retro: 'retro', // 8-bit icon
1305 blank: 'blank' // A transparent png
1306 };
1307 var RATINGS = {
1308 g: 'g',
1309 pg: 'pg',
1310 r: 'r',
1311 x: 'x'
1312 };
1313 var opts = {
1314 protocol: null,
1315 email: null,
1316 fileExtension: null,
1317 size: null,
1318 fallback: null,
1319 rating: null
1320 };
1321
1322 if (!options) {
1323 // Set to a random email
1324 opts.email = this.email();
1325 options = {};
1326 }
1327 else if (typeof options === 'string') {
1328 opts.email = options;
1329 options = {};
1330 }
1331 else if (typeof options !== 'object') {
1332 return null;
1333 }
1334 else if (options.constructor === 'Array') {
1335 return null;
1336 }
1337
1338 opts = initOptions(options, opts);
1339
1340 if (!opts.email) {
1341 // Set to a random email
1342 opts.email = this.email();
1343 }
1344
1345 // Safe checking for params
1346 opts.protocol = PROTOCOLS[opts.protocol] ? opts.protocol + ':' : '';
1347 opts.size = parseInt(opts.size, 0) ? opts.size : '';
1348 opts.rating = RATINGS[opts.rating] ? opts.rating : '';
1349 opts.fallback = FALLBACKS[opts.fallback] ? opts.fallback : '';
1350 opts.fileExtension = FILE_TYPES[opts.fileExtension] ? opts.fileExtension : '';
1351
1352 url =
1353 opts.protocol +
1354 URL_BASE +
1355 this.bimd5.md5(opts.email) +
1356 (opts.fileExtension ? '.' + opts.fileExtension : '') +
1357 (opts.size || opts.rating || opts.fallback ? '?' : '') +
1358 (opts.size ? '&s=' + opts.size.toString() : '') +
1359 (opts.rating ? '&r=' + opts.rating : '') +
1360 (opts.fallback ? '&d=' + opts.fallback : '')
1361 ;
1362
1363 return url;
1364 };
1365
1366 /**
1367 * #Description:
1368 * ===============================================
1369 * Generate random color value base on color type:
1370 * -> hex
1371 * -> rgb
1372 * -> rgba
1373 * -> 0x
1374 * -> named color
1375 *
1376 * #Examples:
1377 * ===============================================
1378 * * Geerate random hex color
1379 * chance.color() => '#79c157' / 'rgb(110,52,164)' / '0x67ae0b' / '#e2e2e2' / '#29CFA7'
1380 *
1381 * * Generate Hex based color value
1382 * chance.color({format: 'hex'}) => '#d67118'
1383 *
1384 * * Generate simple rgb value
1385 * chance.color({format: 'rgb'}) => 'rgb(110,52,164)'
1386 *
1387 * * Generate Ox based color value
1388 * chance.color({format: '0x'}) => '0x67ae0b'
1389 *
1390 * * Generate graiscale based value
1391 * chance.color({grayscale: true}) => '#e2e2e2'
1392 *
1393 * * Return valide color name
1394 * chance.color({format: 'name'}) => 'red'
1395 *
1396 * * Make color uppercase
1397 * chance.color({casing: 'upper'}) => '#29CFA7'
1398 *
1399 * * Min Max values for RGBA
1400 * var light_red = chance.color({format: 'hex', min_red: 200, max_red: 255, max_green: 0, max_blue: 0, min_alpha: .2, max_alpha: .3});
1401 *
1402 * @param [object] options
1403 * @return [string] color value
1404 */
1405 Chance.prototype.color = function (options) {
1406 function gray(value, delimiter) {
1407 return [value, value, value].join(delimiter || '');
1408 }
1409
1410 function rgb(hasAlpha) {
1411 var rgbValue = (hasAlpha) ? 'rgba' : 'rgb';
1412 var alphaChannel = (hasAlpha) ? (',' + this.floating({min:min_alpha, max:max_alpha})) : "";
1413 var colorValue = (isGrayscale) ? (gray(this.natural({min: min_rgb, max: max_rgb}), ',')) : (this.natural({min: min_green, max: max_green}) + ',' + this.natural({min: min_blue, max: max_blue}) + ',' + this.natural({max: 255}));
1414 return rgbValue + '(' + colorValue + alphaChannel + ')';
1415 }
1416
1417 function hex(start, end, withHash) {
1418 var symbol = (withHash) ? "#" : "";
1419 var hexstring = "";
1420
1421 if (isGrayscale) {
1422 hexstring = gray(this.pad(this.hex({min: min_rgb, max: max_rgb}), 2));
1423 if (options.format === "shorthex") {
1424 hexstring = gray(this.hex({min: 0, max: 15}));
1425 }
1426 }
1427 else {
1428 if (options.format === "shorthex") {
1429 hexstring = this.pad(this.hex({min: Math.floor(min_red / 16), max: Math.floor(max_red / 16)}), 1) + this.pad(this.hex({min: Math.floor(min_green / 16), max: Math.floor(max_green / 16)}), 1) + this.pad(this.hex({min: Math.floor(min_blue / 16), max: Math.floor(max_blue / 16)}), 1);
1430 }
1431 else if (min_red !== undefined || max_red !== undefined || min_green !== undefined || max_green !== undefined || min_blue !== undefined || max_blue !== undefined) {
1432 hexstring = this.pad(this.hex({min: min_red, max: max_red}), 2) + this.pad(this.hex({min: min_green, max: max_green}), 2) + this.pad(this.hex({min: min_blue, max: max_blue}), 2);
1433 }
1434 else {
1435 hexstring = this.pad(this.hex({min: min_rgb, max: max_rgb}), 2) + this.pad(this.hex({min: min_rgb, max: max_rgb}), 2) + this.pad(this.hex({min: min_rgb, max: max_rgb}), 2);
1436 }
1437 }
1438
1439 return symbol + hexstring;
1440 }
1441
1442 options = initOptions(options, {
1443 format: this.pick(['hex', 'shorthex', 'rgb', 'rgba', '0x', 'name']),
1444 grayscale: false,
1445 casing: 'lower',
1446 min: 0,
1447 max: 255,
1448 min_red: undefined,
1449 max_red: undefined,
1450 min_green: undefined,
1451 max_green: undefined,
1452 min_blue: undefined,
1453 max_blue: undefined,
1454 min_alpha: 0,
1455 max_alpha: 1
1456 });
1457
1458 var isGrayscale = options.grayscale;
1459 var min_rgb = options.min;
1460 var max_rgb = options.max;
1461 var min_red = options.min_red;
1462 var max_red = options.max_red;
1463 var min_green = options.min_green;
1464 var max_green = options.max_green;
1465 var min_blue = options.min_blue;
1466 var max_blue = options.max_blue;
1467 var min_alpha = options.min_alpha;
1468 var max_alpha = options.max_alpha;
1469 if (options.min_red === undefined) { min_red = min_rgb; }
1470 if (options.max_red === undefined) { max_red = max_rgb; }
1471 if (options.min_green === undefined) { min_green = min_rgb; }
1472 if (options.max_green === undefined) { max_green = max_rgb; }
1473 if (options.min_blue === undefined) { min_blue = min_rgb; }
1474 if (options.max_blue === undefined) { max_blue = max_rgb; }
1475 if (options.min_alpha === undefined) { min_alpha = 0; }
1476 if (options.max_alpha === undefined) { max_alpha = 1; }
1477 if (isGrayscale && min_rgb === 0 && max_rgb === 255 && min_red !== undefined && max_red !== undefined) {
1478 min_rgb = ((min_red + min_green + min_blue) / 3);
1479 max_rgb = ((max_red + max_green + max_blue) / 3);
1480 }
1481 var colorValue;
1482
1483 if (options.format === 'hex') {
1484 colorValue = hex.call(this, 2, 6, true);
1485 }
1486 else if (options.format === 'shorthex') {
1487 colorValue = hex.call(this, 1, 3, true);
1488 }
1489 else if (options.format === 'rgb') {
1490 colorValue = rgb.call(this, false);
1491 }
1492 else if (options.format === 'rgba') {
1493 colorValue = rgb.call(this, true);
1494 }
1495 else if (options.format === '0x') {
1496 colorValue = '0x' + hex.call(this, 2, 6);
1497 }
1498 else if(options.format === 'name') {
1499 return this.pick(this.get("colorNames"));
1500 }
1501 else {
1502 throw new RangeError('Invalid format provided. Please provide one of "hex", "shorthex", "rgb", "rgba", "0x" or "name".');
1503 }
1504
1505 if (options.casing === 'upper' ) {
1506 colorValue = colorValue.toUpperCase();
1507 }
1508
1509 return colorValue;
1510 };
1511
1512 Chance.prototype.domain = function (options) {
1513 options = initOptions(options);
1514 return this.word() + '.' + (options.tld || this.tld());
1515 };
1516
1517 Chance.prototype.email = function (options) {
1518 options = initOptions(options);
1519 return this.word({length: options.length}) + '@' + (options.domain || this.domain());
1520 };
1521
1522 /**
1523 * #Description:
1524 * ===============================================
1525 * Generate a random Facebook id, aka fbid.
1526 *
1527 * NOTE: At the moment (Sep 2017), Facebook ids are
1528 * "numeric strings" of length 16.
1529 * However, Facebook Graph API documentation states that
1530 * "it is extremely likely to change over time".
1531 * @see https://developers.facebook.com/docs/graph-api/overview/
1532 *
1533 * #Examples:
1534 * ===============================================
1535 * chance.fbid() => '1000035231661304'
1536 *
1537 * @return [string] facebook id
1538 */
1539 Chance.prototype.fbid = function () {
1540 return '10000' + this.string({pool: "1234567890", length: 11});
1541 };
1542
1543 Chance.prototype.google_analytics = function () {
1544 var account = this.pad(this.natural({max: 999999}), 6);
1545 var property = this.pad(this.natural({max: 99}), 2);
1546
1547 return 'UA-' + account + '-' + property;
1548 };
1549
1550 Chance.prototype.hashtag = function () {
1551 return '#' + this.word();
1552 };
1553
1554 Chance.prototype.ip = function () {
1555 // Todo: This could return some reserved IPs. See http://vq.io/137dgYy
1556 // this should probably be updated to account for that rare as it may be
1557 return this.natural({min: 1, max: 254}) + '.' +
1558 this.natural({max: 255}) + '.' +
1559 this.natural({max: 255}) + '.' +
1560 this.natural({min: 1, max: 254});
1561 };
1562
1563 Chance.prototype.ipv6 = function () {
1564 var ip_addr = this.n(this.hash, 8, {length: 4});
1565
1566 return ip_addr.join(":");
1567 };
1568
1569 Chance.prototype.klout = function () {
1570 return this.natural({min: 1, max: 99});
1571 };
1572
1573 Chance.prototype.semver = function (options) {
1574 options = initOptions(options, { include_prerelease: true });
1575
1576 var range = this.pickone(["^", "~", "<", ">", "<=", ">=", "="]);
1577 if (options.range) {
1578 range = options.range;
1579 }
1580
1581 var prerelease = "";
1582 if (options.include_prerelease) {
1583 prerelease = this.weighted(["", "-dev", "-beta", "-alpha"], [50, 10, 5, 1]);
1584 }
1585 return range + this.rpg('3d10').join('.') + prerelease;
1586 };
1587
1588 Chance.prototype.tlds = function () {
1589 return ['com', 'org', 'edu', 'gov', 'co.uk', 'net', 'io', 'ac', 'ad', 'ae', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq', 'ar', 'as', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb', 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'bj', 'bm', 'bn', 'bo', 'bq', 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cc', 'cd', 'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'cr', 'cu', 'cv', 'cw', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec', 'ee', 'eg', 'eh', 'er', 'es', 'et', 'eu', 'fi', 'fj', 'fk', 'fm', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi', 'gl', 'gm', 'gn', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'io', 'iq', 'ir', 'is', 'it', 'je', 'jm', 'jo', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp', 'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu', 'lv', 'ly', 'ma', 'mc', 'md', 'me', 'mg', 'mh', 'mk', 'ml', 'mm', 'mn', 'mo', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nc', 'ne', 'nf', 'ng', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'pa', 'pe', 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'ps', 'pt', 'pw', 'py', 'qa', 're', 'ro', 'rs', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sj', 'sk', 'sl', 'sm', 'sn', 'so', 'sr', 'ss', 'st', 'su', 'sv', 'sx', 'sy', 'sz', 'tc', 'td', 'tf', 'tg', 'th', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'tp', 'tr', 'tt', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'us', 'uy', 'uz', 'va', 'vc', 've', 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'ye', 'yt', 'za', 'zm', 'zw'];
1590 };
1591
1592 Chance.prototype.tld = function () {
1593 return this.pick(this.tlds());
1594 };
1595
1596 Chance.prototype.twitter = function () {
1597 return '@' + this.word();
1598 };
1599
1600 Chance.prototype.url = function (options) {
1601 options = initOptions(options, { protocol: "http", domain: this.domain(options), domain_prefix: "", path: this.word(), extensions: []});
1602
1603 var extension = options.extensions.length > 0 ? "." + this.pick(options.extensions) : "";
1604 var domain = options.domain_prefix ? options.domain_prefix + "." + options.domain : options.domain;
1605
1606 return options.protocol + "://" + domain + "/" + options.path + extension;
1607 };
1608
1609 Chance.prototype.port = function() {
1610 return this.integer({min: 0, max: 65535});
1611 };
1612
1613 Chance.prototype.locale = function (options) {
1614 options = initOptions(options);
1615 if (options.region){
1616 return this.pick(this.get("locale_regions"));
1617 } else {
1618 return this.pick(this.get("locale_languages"));
1619 }
1620 };
1621
1622 Chance.prototype.locales = function (options) {
1623 options = initOptions(options);
1624 if (options.region){
1625 return this.get("locale_regions");
1626 } else {
1627 return this.get("locale_languages");
1628 }
1629 };
1630
1631 Chance.prototype.loremPicsum = function (options) {
1632 options = initOptions(options, { width: 500, height: 500, greyscale: false, blurred: false });
1633
1634 var greyscale = options.greyscale ? 'g/' : '';
1635 var query = options.blurred ? '/?blur' : '/?random';
1636
1637 return 'https://picsum.photos/' + greyscale + options.width + '/' + options.height + query;
1638 }
1639
1640 // -- End Web --
1641
1642 // -- Location --
1643
1644 Chance.prototype.address = function (options) {
1645 options = initOptions(options);
1646 return this.natural({min: 5, max: 2000}) + ' ' + this.street(options);
1647 };
1648
1649 Chance.prototype.altitude = function (options) {
1650 options = initOptions(options, {fixed: 5, min: 0, max: 8848});
1651 return this.floating({
1652 min: options.min,
1653 max: options.max,
1654 fixed: options.fixed
1655 });
1656 };
1657
1658 Chance.prototype.areacode = function (options) {
1659 options = initOptions(options, {parens : true});
1660 // Don't want area codes to start with 1, or have a 9 as the second digit
1661 var areacode = this.natural({min: 2, max: 9}).toString() +
1662 this.natural({min: 0, max: 8}).toString() +
1663 this.natural({min: 0, max: 9}).toString();
1664
1665 return options.parens ? '(' + areacode + ')' : areacode;
1666 };
1667
1668 Chance.prototype.city = function () {
1669 return this.capitalize(this.word({syllables: 3}));
1670 };
1671
1672 Chance.prototype.coordinates = function (options) {
1673 return this.latitude(options) + ', ' + this.longitude(options);
1674 };
1675
1676 Chance.prototype.countries = function () {
1677 return this.get("countries");
1678 };
1679
1680 Chance.prototype.country = function (options) {
1681 options = initOptions(options);
1682 var country = this.pick(this.countries());
1683 return options.raw ? country : options.full ? country.name : country.abbreviation;
1684 };
1685
1686 Chance.prototype.depth = function (options) {
1687 options = initOptions(options, {fixed: 5, min: -10994, max: 0});
1688 return this.floating({
1689 min: options.min,
1690 max: options.max,
1691 fixed: options.fixed
1692 });
1693 };
1694
1695 Chance.prototype.geohash = function (options) {
1696 options = initOptions(options, { length: 7 });
1697 return this.string({ length: options.length, pool: '0123456789bcdefghjkmnpqrstuvwxyz' });
1698 };
1699
1700 Chance.prototype.geojson = function (options) {
1701 return this.latitude(options) + ', ' + this.longitude(options) + ', ' + this.altitude(options);
1702 };
1703
1704 Chance.prototype.latitude = function (options) {
1705 options = initOptions(options, {fixed: 5, min: -90, max: 90});
1706 return this.floating({min: options.min, max: options.max, fixed: options.fixed});
1707 };
1708
1709 Chance.prototype.longitude = function (options) {
1710 options = initOptions(options, {fixed: 5, min: -180, max: 180});
1711 return this.floating({min: options.min, max: options.max, fixed: options.fixed});
1712 };
1713
1714 Chance.prototype.phone = function (options) {
1715 var self = this,
1716 numPick,
1717 ukNum = function (parts) {
1718 var section = [];
1719 //fills the section part of the phone number with random numbers.
1720 parts.sections.forEach(function(n) {
1721 section.push(self.string({ pool: '0123456789', length: n}));
1722 });
1723 return parts.area + section.join(' ');
1724 };
1725 options = initOptions(options, {
1726 formatted: true,
1727 country: 'us',
1728 mobile: false
1729 });
1730 if (!options.formatted) {
1731 options.parens = false;
1732 }
1733 var phone;
1734 switch (options.country) {
1735 case 'fr':
1736 if (!options.mobile) {
1737 numPick = this.pick([
1738 // Valid zone and département codes.
1739 '01' + this.pick(['30', '34', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '53', '55', '56', '58', '60', '64', '69', '70', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83']) + self.string({ pool: '0123456789', length: 6}),
1740 '02' + this.pick(['14', '18', '22', '23', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '40', '41', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '56', '57', '61', '62', '69', '72', '76', '77', '78', '85', '90', '96', '97', '98', '99']) + self.string({ pool: '0123456789', length: 6}),
1741 '03' + this.pick(['10', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '39', '44', '45', '51', '52', '54', '55', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90']) + self.string({ pool: '0123456789', length: 6}),
1742 '04' + this.pick(['11', '13', '15', '20', '22', '26', '27', '30', '32', '34', '37', '42', '43', '44', '50', '56', '57', '63', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '88', '89', '90', '91', '92', '93', '94', '95', '97', '98']) + self.string({ pool: '0123456789', length: 6}),
1743 '05' + this.pick(['08', '16', '17', '19', '24', '31', '32', '33', '34', '35', '40', '45', '46', '47', '49', '53', '55', '56', '57', '58', '59', '61', '62', '63', '64', '65', '67', '79', '81', '82', '86', '87', '90', '94']) + self.string({ pool: '0123456789', length: 6}),
1744 '09' + self.string({ pool: '0123456789', length: 8}),
1745 ]);
1746 phone = options.formatted ? numPick.match(/../g).join(' ') : numPick;
1747 } else {
1748 numPick = this.pick(['06', '07']) + self.string({ pool: '0123456789', length: 8});
1749 phone = options.formatted ? numPick.match(/../g).join(' ') : numPick;
1750 }
1751 break;
1752 case 'uk':
1753 if (!options.mobile) {
1754 numPick = this.pick([
1755 //valid area codes of major cities/counties followed by random numbers in required format.
1756
1757 { area: '01' + this.character({ pool: '234569' }) + '1 ', sections: [3,4] },
1758 { area: '020 ' + this.character({ pool: '378' }), sections: [3,4] },
1759 { area: '023 ' + this.character({ pool: '89' }), sections: [3,4] },
1760 { area: '024 7', sections: [3,4] },
1761 { area: '028 ' + this.pick(['25','28','37','71','82','90','92','95']), sections: [2,4] },
1762 { area: '012' + this.pick(['04','08','54','76','97','98']) + ' ', sections: [6] },
1763 { area: '013' + this.pick(['63','64','84','86']) + ' ', sections: [6] },
1764 { area: '014' + this.pick(['04','20','60','61','80','88']) + ' ', sections: [6] },
1765 { area: '015' + this.pick(['24','27','62','66']) + ' ', sections: [6] },
1766 { area: '016' + this.pick(['06','29','35','47','59','95']) + ' ', sections: [6] },
1767 { area: '017' + this.pick(['26','44','50','68']) + ' ', sections: [6] },
1768 { area: '018' + this.pick(['27','37','84','97']) + ' ', sections: [6] },
1769 { area: '019' + this.pick(['00','05','35','46','49','63','95']) + ' ', sections: [6] }
1770 ]);
1771 phone = options.formatted ? ukNum(numPick) : ukNum(numPick).replace(' ', '', 'g');
1772 } else {
1773 numPick = this.pick([
1774 { area: '07' + this.pick(['4','5','7','8','9']), sections: [2,6] },
1775 { area: '07624 ', sections: [6] }
1776 ]);
1777 phone = options.formatted ? ukNum(numPick) : ukNum(numPick).replace(' ', '');
1778 }
1779 break;
1780 case 'za':
1781 if (!options.mobile) {
1782 numPick = this.pick([
1783 '01' + this.pick(['0', '1', '2', '3', '4', '5', '6', '7', '8']) + self.string({ pool: '0123456789', length: 7}),
1784 '02' + this.pick(['1', '2', '3', '4', '7', '8']) + self.string({ pool: '0123456789', length: 7}),
1785 '03' + this.pick(['1', '2', '3', '5', '6', '9']) + self.string({ pool: '0123456789', length: 7}),
1786 '04' + this.pick(['1', '2', '3', '4', '5','6','7', '8','9']) + self.string({ pool: '0123456789', length: 7}),
1787 '05' + this.pick(['1', '3', '4', '6', '7', '8']) + self.string({ pool: '0123456789', length: 7}),
1788 ]);
1789 phone = options.formatted || numPick;
1790 } else {
1791 numPick = this.pick([
1792 '060' + this.pick(['3','4','5','6','7','8','9']) + self.string({ pool: '0123456789', length: 6}),
1793 '061' + this.pick(['0','1','2','3','4','5','8']) + self.string({ pool: '0123456789', length: 6}),
1794 '06' + self.string({ pool: '0123456789', length: 7}),
1795 '071' + this.pick(['0','1','2','3','4','5','6','7','8','9']) + self.string({ pool: '0123456789', length: 6}),
1796 '07' + this.pick(['2','3','4','6','7','8','9']) + self.string({ pool: '0123456789', length: 7}),
1797 '08' + this.pick(['0','1','2','3','4','5']) + self.string({ pool: '0123456789', length: 7}),
1798 ]);
1799 phone = options.formatted || numPick;
1800 }
1801 break;
1802 case 'us':
1803 var areacode = this.areacode(options).toString();
1804 var exchange = this.natural({ min: 2, max: 9 }).toString() +
1805 this.natural({ min: 0, max: 9 }).toString() +
1806 this.natural({ min: 0, max: 9 }).toString();
1807 var subscriber = this.natural({ min: 1000, max: 9999 }).toString(); // this could be random [0-9]{4}
1808 phone = options.formatted ? areacode + ' ' + exchange + '-' + subscriber : areacode + exchange + subscriber;
1809 break;
1810 case 'br':
1811 var areaCode = this.pick(["11", "12", "13", "14", "15", "16", "17", "18", "19", "21", "22", "24", "27", "28", "31", "32", "33", "34", "35", "37", "38", "41", "42", "43", "44", "45", "46", "47", "48", "49", "51", "53", "54", "55", "61", "62", "63", "64", "65", "66", "67", "68", "69", "71", "73", "74", "75", "77", "79", "81", "82", "83", "84", "85", "86", "87", "88", "89", "91", "92", "93", "94", "95", "96", "97", "98", "99"]);
1812 var prefix;
1813 if (options.mobile) {
1814 // Brasilian official reference (mobile): http://www.anatel.gov.br/setorregulado/plano-de-numeracao-brasileiro?id=330
1815 prefix = '9' + self.string({ pool: '0123456789', length: 4});
1816 } else {
1817 // Brasilian official reference: http://www.anatel.gov.br/setorregulado/plano-de-numeracao-brasileiro?id=331
1818 prefix = this.natural({ min: 2000, max: 5999 }).toString();
1819 }
1820 var mcdu = self.string({ pool: '0123456789', length: 4});
1821 phone = options.formatted ? '(' + areaCode + ') ' + prefix + '-' + mcdu : areaCode + prefix + mcdu;
1822 break;
1823 }
1824 return phone;
1825 };
1826
1827 Chance.prototype.postal = function () {
1828 // Postal District
1829 var pd = this.character({pool: "XVTSRPNKLMHJGECBA"});
1830 // Forward Sortation Area (FSA)
1831 var fsa = pd + this.natural({max: 9}) + this.character({alpha: true, casing: "upper"});
1832 // Local Delivery Unut (LDU)
1833 var ldu = this.natural({max: 9}) + this.character({alpha: true, casing: "upper"}) + this.natural({max: 9});
1834
1835 return fsa + " " + ldu;
1836 };
1837
1838 Chance.prototype.postcode = function () {
1839 // Area
1840 var area = this.pick(this.get("postcodeAreas")).code;
1841 // District
1842 var district = this.natural({max: 9});
1843 // Sub-District
1844 var subDistrict = this.bool() ? this.character({alpha: true, casing: "upper"}) : "";
1845 // Outward Code
1846 var outward = area + district + subDistrict;
1847 // Sector
1848 var sector = this.natural({max: 9});
1849 // Unit
1850 var unit = this.character({alpha: true, casing: "upper"}) + this.character({alpha: true, casing: "upper"});
1851 // Inward Code
1852 var inward = sector + unit;
1853
1854 return outward + " " + inward;
1855 };
1856
1857 Chance.prototype.counties = function (options) {
1858 options = initOptions(options, { country: 'uk' });
1859 return this.get("counties")[options.country.toLowerCase()];
1860 };
1861
1862 Chance.prototype.county = function (options) {
1863 return this.pick(this.counties(options)).name;
1864 };
1865
1866 Chance.prototype.provinces = function (options) {
1867 options = initOptions(options, { country: 'ca' });
1868 return this.get("provinces")[options.country.toLowerCase()];
1869 };
1870
1871 Chance.prototype.province = function (options) {
1872 return (options && options.full) ?
1873 this.pick(this.provinces(options)).name :
1874 this.pick(this.provinces(options)).abbreviation;
1875 };
1876
1877 Chance.prototype.state = function (options) {
1878 return (options && options.full) ?
1879 this.pick(this.states(options)).name :
1880 this.pick(this.states(options)).abbreviation;
1881 };
1882
1883 Chance.prototype.states = function (options) {
1884 options = initOptions(options, { country: 'us', us_states_and_dc: true } );
1885
1886 var states;
1887
1888 switch (options.country.toLowerCase()) {
1889 case 'us':
1890 var us_states_and_dc = this.get("us_states_and_dc"),
1891 territories = this.get("territories"),
1892 armed_forces = this.get("armed_forces");
1893
1894 states = [];
1895
1896 if (options.us_states_and_dc) {
1897 states = states.concat(us_states_and_dc);
1898 }
1899 if (options.territories) {
1900 states = states.concat(territories);
1901 }
1902 if (options.armed_forces) {
1903 states = states.concat(armed_forces);
1904 }
1905 break;
1906 case 'it':
1907 case 'mx':
1908 states = this.get("country_regions")[options.country.toLowerCase()];
1909 break;
1910 case 'uk':
1911 states = this.get("counties")[options.country.toLowerCase()];
1912 break;
1913 }
1914
1915 return states;
1916 };
1917
1918 Chance.prototype.street = function (options) {
1919 options = initOptions(options, { country: 'us', syllables: 2 });
1920 var street;
1921
1922 switch (options.country.toLowerCase()) {
1923 case 'us':
1924 street = this.word({ syllables: options.syllables });
1925 street = this.capitalize(street);
1926 street += ' ';
1927 street += options.short_suffix ?
1928 this.street_suffix(options).abbreviation :
1929 this.street_suffix(options).name;
1930 break;
1931 case 'it':
1932 street = this.word({ syllables: options.syllables });
1933 street = this.capitalize(street);
1934 street = (options.short_suffix ?
1935 this.street_suffix(options).abbreviation :
1936 this.street_suffix(options).name) + " " + street;
1937 break;
1938 }
1939 return street;
1940 };
1941
1942 Chance.prototype.street_suffix = function (options) {
1943 options = initOptions(options, { country: 'us' });
1944 return this.pick(this.street_suffixes(options));
1945 };
1946
1947 Chance.prototype.street_suffixes = function (options) {
1948 options = initOptions(options, { country: 'us' });
1949 // These are the most common suffixes.
1950 return this.get("street_suffixes")[options.country.toLowerCase()];
1951 };
1952
1953 // Note: only returning US zip codes, internationalization will be a whole
1954 // other beast to tackle at some point.
1955 Chance.prototype.zip = function (options) {
1956 var zip = this.n(this.natural, 5, {max: 9});
1957
1958 if (options && options.plusfour === true) {
1959 zip.push('-');
1960 zip = zip.concat(this.n(this.natural, 4, {max: 9}));
1961 }
1962
1963 return zip.join("");
1964 };
1965
1966 // -- End Location --
1967
1968 // -- Time
1969
1970 Chance.prototype.ampm = function () {
1971 return this.bool() ? 'am' : 'pm';
1972 };
1973
1974 Chance.prototype.date = function (options) {
1975 var date_string, date;
1976
1977 // If interval is specified we ignore preset
1978 if(options && (options.min || options.max)) {
1979 options = initOptions(options, {
1980 american: true,
1981 string: false
1982 });
1983 var min = typeof options.min !== "undefined" ? options.min.getTime() : 1;
1984 // 100,000,000 days measured relative to midnight at the beginning of 01 January, 1970 UTC. http://es5.github.io/#x15.9.1.1
1985 var max = typeof options.max !== "undefined" ? options.max.getTime() : 8640000000000000;
1986
1987 date = new Date(this.integer({min: min, max: max}));
1988 } else {
1989 var m = this.month({raw: true});
1990 var daysInMonth = m.days;
1991
1992 if(options && options.month) {
1993 // Mod 12 to allow months outside range of 0-11 (not encouraged, but also not prevented).
1994 daysInMonth = this.get('months')[((options.month % 12) + 12) % 12].days;
1995 }
1996
1997 options = initOptions(options, {
1998 year: parseInt(this.year(), 10),
1999 // Necessary to subtract 1 because Date() 0-indexes month but not day or year
2000 // for some reason.
2001 month: m.numeric - 1,
2002 day: this.natural({min: 1, max: daysInMonth}),
2003 hour: this.hour({twentyfour: true}),
2004 minute: this.minute(),
2005 second: this.second(),
2006 millisecond: this.millisecond(),
2007 american: true,
2008 string: false
2009 });
2010
2011 date = new Date(options.year, options.month, options.day, options.hour, options.minute, options.second, options.millisecond);
2012 }
2013
2014 if (options.american) {
2015 // Adding 1 to the month is necessary because Date() 0-indexes
2016 // months but not day for some odd reason.
2017 date_string = (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();
2018 } else {
2019 date_string = date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear();
2020 }
2021
2022 return options.string ? date_string : date;
2023 };
2024
2025 Chance.prototype.hammertime = function (options) {
2026 return this.date(options).getTime();
2027 };
2028
2029 Chance.prototype.hour = function (options) {
2030 options = initOptions(options, {
2031 min: options && options.twentyfour ? 0 : 1,
2032 max: options && options.twentyfour ? 23 : 12
2033 });
2034
2035 testRange(options.min < 0, "Chance: Min cannot be less than 0.");
2036 testRange(options.twentyfour && options.max > 23, "Chance: Max cannot be greater than 23 for twentyfour option.");
2037 testRange(!options.twentyfour && options.max > 12, "Chance: Max cannot be greater than 12.");
2038 testRange(options.min > options.max, "Chance: Min cannot be greater than Max.");
2039
2040 return this.natural({min: options.min, max: options.max});
2041 };
2042
2043 Chance.prototype.millisecond = function () {
2044 return this.natural({max: 999});
2045 };
2046
2047 Chance.prototype.minute = Chance.prototype.second = function (options) {
2048 options = initOptions(options, {min: 0, max: 59});
2049
2050 testRange(options.min < 0, "Chance: Min cannot be less than 0.");
2051 testRange(options.max > 59, "Chance: Max cannot be greater than 59.");
2052 testRange(options.min > options.max, "Chance: Min cannot be greater than Max.");
2053
2054 return this.natural({min: options.min, max: options.max});
2055 };
2056
2057 Chance.prototype.month = function (options) {
2058 options = initOptions(options, {min: 1, max: 12});
2059
2060 testRange(options.min < 1, "Chance: Min cannot be less than 1.");
2061 testRange(options.max > 12, "Chance: Max cannot be greater than 12.");
2062 testRange(options.min > options.max, "Chance: Min cannot be greater than Max.");
2063
2064 var month = this.pick(this.months().slice(options.min - 1, options.max));
2065 return options.raw ? month : month.name;
2066 };
2067
2068 Chance.prototype.months = function () {
2069 return this.get("months");
2070 };
2071
2072 Chance.prototype.second = function () {
2073 return this.natural({max: 59});
2074 };
2075
2076 Chance.prototype.timestamp = function () {
2077 return this.natural({min: 1, max: parseInt(new Date().getTime() / 1000, 10)});
2078 };
2079
2080 Chance.prototype.weekday = function (options) {
2081 options = initOptions(options, {weekday_only: false});
2082 var weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
2083 if (!options.weekday_only) {
2084 weekdays.push("Saturday");
2085 weekdays.push("Sunday");
2086 }
2087 return this.pickone(weekdays);
2088 };
2089
2090 Chance.prototype.year = function (options) {
2091 // Default to current year as min if none specified
2092 options = initOptions(options, {min: new Date().getFullYear()});
2093
2094 // Default to one century after current year as max if none specified
2095 options.max = (typeof options.max !== "undefined") ? options.max : options.min + 100;
2096
2097 return this.natural(options).toString();
2098 };
2099
2100 // -- End Time
2101
2102 // -- Finance --
2103
2104 Chance.prototype.cc = function (options) {
2105 options = initOptions(options);
2106
2107 var type, number, to_generate;
2108
2109 type = (options.type) ?
2110 this.cc_type({ name: options.type, raw: true }) :
2111 this.cc_type({ raw: true });
2112
2113 number = type.prefix.split("");
2114 to_generate = type.length - type.prefix.length - 1;
2115
2116 // Generates n - 1 digits
2117 number = number.concat(this.n(this.integer, to_generate, {min: 0, max: 9}));
2118
2119 // Generates the last digit according to Luhn algorithm
2120 number.push(this.luhn_calculate(number.join("")));
2121
2122 return number.join("");
2123 };
2124
2125 Chance.prototype.cc_types = function () {
2126 // http://en.wikipedia.org/wiki/Bank_card_number#Issuer_identification_number_.28IIN.29
2127 return this.get("cc_types");
2128 };
2129
2130 Chance.prototype.cc_type = function (options) {
2131 options = initOptions(options);
2132 var types = this.cc_types(),
2133 type = null;
2134
2135 if (options.name) {
2136 for (var i = 0; i < types.length; i++) {
2137 // Accept either name or short_name to specify card type
2138 if (types[i].name === options.name || types[i].short_name === options.name) {
2139 type = types[i];
2140 break;
2141 }
2142 }
2143 if (type === null) {
2144 throw new RangeError("Chance: Credit card type '" + options.name + "' is not supported");
2145 }
2146 } else {
2147 type = this.pick(types);
2148 }
2149
2150 return options.raw ? type : type.name;
2151 };
2152
2153 // return all world currency by ISO 4217
2154 Chance.prototype.currency_types = function () {
2155 return this.get("currency_types");
2156 };
2157
2158 // return random world currency by ISO 4217
2159 Chance.prototype.currency = function () {
2160 return this.pick(this.currency_types());
2161 };
2162
2163 // return all timezones available
2164 Chance.prototype.timezones = function () {
2165 return this.get("timezones");
2166 };
2167
2168 // return random timezone
2169 Chance.prototype.timezone = function () {
2170 return this.pick(this.timezones());
2171 };
2172
2173 //Return random correct currency exchange pair (e.g. EUR/USD) or array of currency code
2174 Chance.prototype.currency_pair = function (returnAsString) {
2175 var currencies = this.unique(this.currency, 2, {
2176 comparator: function(arr, val) {
2177
2178 return arr.reduce(function(acc, item) {
2179 // If a match has been found, short circuit check and just return
2180 return acc || (item.code === val.code);
2181 }, false);
2182 }
2183 });
2184
2185 if (returnAsString) {
2186 return currencies[0].code + '/' + currencies[1].code;
2187 } else {
2188 return currencies;
2189 }
2190 };
2191
2192 Chance.prototype.dollar = function (options) {
2193 // By default, a somewhat more sane max for dollar than all available numbers
2194 options = initOptions(options, {max : 10000, min : 0});
2195
2196 var dollar = this.floating({min: options.min, max: options.max, fixed: 2}).toString(),
2197 cents = dollar.split('.')[1];
2198
2199 if (cents === undefined) {
2200 dollar += '.00';
2201 } else if (cents.length < 2) {
2202 dollar = dollar + '0';
2203 }
2204
2205 if (dollar < 0) {
2206 return '-$' + dollar.replace('-', '');
2207 } else {
2208 return '$' + dollar;
2209 }
2210 };
2211
2212 Chance.prototype.euro = function (options) {
2213 return Number(this.dollar(options).replace("$", "")).toLocaleString() + "€";
2214 };
2215
2216 Chance.prototype.exp = function (options) {
2217 options = initOptions(options);
2218 var exp = {};
2219
2220 exp.year = this.exp_year();
2221
2222 // If the year is this year, need to ensure month is greater than the
2223 // current month or this expiration will not be valid
2224 if (exp.year === (new Date().getFullYear()).toString()) {
2225 exp.month = this.exp_month({future: true});
2226 } else {
2227 exp.month = this.exp_month();
2228 }
2229
2230 return options.raw ? exp : exp.month + '/' + exp.year;
2231 };
2232
2233 Chance.prototype.exp_month = function (options) {
2234 options = initOptions(options);
2235 var month, month_int,
2236 // Date object months are 0 indexed
2237 curMonth = new Date().getMonth() + 1;
2238
2239 if (options.future && (curMonth !== 12)) {
2240 do {
2241 month = this.month({raw: true}).numeric;
2242 month_int = parseInt(month, 10);
2243 } while (month_int <= curMonth);
2244 } else {
2245 month = this.month({raw: true}).numeric;
2246 }
2247
2248 return month;
2249 };
2250
2251 Chance.prototype.exp_year = function () {
2252 var curMonth = new Date().getMonth() + 1,
2253 curYear = new Date().getFullYear();
2254
2255 return this.year({min: ((curMonth === 12) ? (curYear + 1) : curYear), max: (curYear + 10)});
2256 };
2257
2258 Chance.prototype.vat = function (options) {
2259 options = initOptions(options, { country: 'it' });
2260 switch (options.country.toLowerCase()) {
2261 case 'it':
2262 return this.it_vat();
2263 }
2264 };
2265
2266 /**
2267 * Generate a string matching IBAN pattern (https://en.wikipedia.org/wiki/International_Bank_Account_Number).
2268 * No country-specific formats support (yet)
2269 */
2270 Chance.prototype.iban = function () {
2271 var alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
2272 var alphanum = alpha + '0123456789';
2273 var iban =
2274 this.string({ length: 2, pool: alpha }) +
2275 this.pad(this.integer({ min: 0, max: 99 }), 2) +
2276 this.string({ length: 4, pool: alphanum }) +
2277 this.pad(this.natural(), this.natural({ min: 6, max: 26 }));
2278 return iban;
2279 };
2280
2281 // -- End Finance
2282
2283 // -- Regional
2284
2285 Chance.prototype.it_vat = function () {
2286 var it_vat = this.natural({min: 1, max: 1800000});
2287
2288 it_vat = this.pad(it_vat, 7) + this.pad(this.pick(this.provinces({ country: 'it' })).code, 3);
2289 return it_vat + this.luhn_calculate(it_vat);
2290 };
2291
2292 /*
2293 * this generator is written following the official algorithm
2294 * all data can be passed explicitely or randomized by calling chance.cf() without options
2295 * the code does not check that the input data is valid (it goes beyond the scope of the generator)
2296 *
2297 * @param [Object] options = { first: first name,
2298 * last: last name,
2299 * gender: female|male,
2300 birthday: JavaScript date object,
2301 city: string(4), 1 letter + 3 numbers
2302 }
2303 * @return [string] codice fiscale
2304 *
2305 */
2306 Chance.prototype.cf = function (options) {
2307 options = options || {};
2308 var gender = !!options.gender ? options.gender : this.gender(),
2309 first = !!options.first ? options.first : this.first( { gender: gender, nationality: 'it'} ),
2310 last = !!options.last ? options.last : this.last( { nationality: 'it'} ),
2311 birthday = !!options.birthday ? options.birthday : this.birthday(),
2312 city = !!options.city ? options.city : this.pickone(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'L', 'M', 'Z']) + this.pad(this.natural({max:999}), 3),
2313 cf = [],
2314 name_generator = function(name, isLast) {
2315 var temp,
2316 return_value = [];
2317
2318 if (name.length < 3) {
2319 return_value = name.split("").concat("XXX".split("")).splice(0,3);
2320 }
2321 else {
2322 temp = name.toUpperCase().split('').map(function(c){
2323 return ("BCDFGHJKLMNPRSTVWZ".indexOf(c) !== -1) ? c : undefined;
2324 }).join('');
2325 if (temp.length > 3) {
2326 if (isLast) {
2327 temp = temp.substr(0,3);
2328 } else {
2329 temp = temp[0] + temp.substr(2,2);
2330 }
2331 }
2332 if (temp.length < 3) {
2333 return_value = temp;
2334 temp = name.toUpperCase().split('').map(function(c){
2335 return ("AEIOU".indexOf(c) !== -1) ? c : undefined;
2336 }).join('').substr(0, 3 - return_value.length);
2337 }
2338 return_value = return_value + temp;
2339 }
2340
2341 return return_value;
2342 },
2343 date_generator = function(birthday, gender, that) {
2344 var lettermonths = ['A', 'B', 'C', 'D', 'E', 'H', 'L', 'M', 'P', 'R', 'S', 'T'];
2345
2346 return birthday.getFullYear().toString().substr(2) +
2347 lettermonths[birthday.getMonth()] +
2348 that.pad(birthday.getDate() + ((gender.toLowerCase() === "female") ? 40 : 0), 2);
2349 },
2350 checkdigit_generator = function(cf) {
2351 var range1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",
2352 range2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ",
2353 evens = "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
2354 odds = "BAKPLCQDREVOSFTGUHMINJWZYX",
2355 digit = 0;
2356
2357
2358 for(var i = 0; i < 15; i++) {
2359 if (i % 2 !== 0) {
2360 digit += evens.indexOf(range2[range1.indexOf(cf[i])]);
2361 }
2362 else {
2363 digit += odds.indexOf(range2[range1.indexOf(cf[i])]);
2364 }
2365 }
2366 return evens[digit % 26];
2367 };
2368
2369 cf = cf.concat(name_generator(last, true), name_generator(first), date_generator(birthday, gender, this), city.toUpperCase().split("")).join("");
2370 cf += checkdigit_generator(cf.toUpperCase(), this);
2371
2372 return cf.toUpperCase();
2373 };
2374
2375 Chance.prototype.pl_pesel = function () {
2376 var number = this.natural({min: 1, max: 9999999999});
2377 var arr = this.pad(number, 10).split('');
2378 for (var i = 0; i < arr.length; i++) {
2379 arr[i] = parseInt(arr[i]);
2380 }
2381
2382 var controlNumber = (1 * arr[0] + 3 * arr[1] + 7 * arr[2] + 9 * arr[3] + 1 * arr[4] + 3 * arr[5] + 7 * arr[6] + 9 * arr[7] + 1 * arr[8] + 3 * arr[9]) % 10;
2383 if(controlNumber !== 0) {
2384 controlNumber = 10 - controlNumber;
2385 }
2386
2387 return arr.join('') + controlNumber;
2388 };
2389
2390 Chance.prototype.pl_nip = function () {
2391 var number = this.natural({min: 1, max: 999999999});
2392 var arr = this.pad(number, 9).split('');
2393 for (var i = 0; i < arr.length; i++) {
2394 arr[i] = parseInt(arr[i]);
2395 }
2396
2397 var controlNumber = (6 * arr[0] + 5 * arr[1] + 7 * arr[2] + 2 * arr[3] + 3 * arr[4] + 4 * arr[5] + 5 * arr[6] + 6 * arr[7] + 7 * arr[8]) % 11;
2398 if(controlNumber === 10) {
2399 return this.pl_nip();
2400 }
2401
2402 return arr.join('') + controlNumber;
2403 };
2404
2405 Chance.prototype.pl_regon = function () {
2406 var number = this.natural({min: 1, max: 99999999});
2407 var arr = this.pad(number, 8).split('');
2408 for (var i = 0; i < arr.length; i++) {
2409 arr[i] = parseInt(arr[i]);
2410 }
2411
2412 var controlNumber = (8 * arr[0] + 9 * arr[1] + 2 * arr[2] + 3 * arr[3] + 4 * arr[4] + 5 * arr[5] + 6 * arr[6] + 7 * arr[7]) % 11;
2413 if(controlNumber === 10) {
2414 controlNumber = 0;
2415 }
2416
2417 return arr.join('') + controlNumber;
2418 };
2419
2420 // -- End Regional
2421
2422 // -- Music --
2423
2424 Chance.prototype.note = function(options) {
2425 // choices for 'notes' option:
2426 // flatKey - chromatic scale with flat notes (default)
2427 // sharpKey - chromatic scale with sharp notes
2428 // flats - just flat notes
2429 // sharps - just sharp notes
2430 // naturals - just natural notes
2431 // all - naturals, sharps and flats
2432 options = initOptions(options, { notes : 'flatKey'});
2433 var scales = {
2434 naturals: ['C', 'D', 'E', 'F', 'G', 'A', 'B'],
2435 flats: ['D♭', 'E♭', 'G♭', 'A♭', 'B♭'],
2436 sharps: ['C♯', 'D♯', 'F♯', 'G♯', 'A♯']
2437 };
2438 scales.all = scales.naturals.concat(scales.flats.concat(scales.sharps))
2439 scales.flatKey = scales.naturals.concat(scales.flats)
2440 scales.sharpKey = scales.naturals.concat(scales.sharps)
2441 return this.pickone(scales[options.notes]);
2442 }
2443
2444 Chance.prototype.midi_note = function(options) {
2445 var min = 0;
2446 var max = 127;
2447 options = initOptions(options, { min : min, max : max });
2448 return this.integer({min: options.min, max: options.max});
2449 }
2450
2451 Chance.prototype.chord_quality = function(options) {
2452 options = initOptions(options, { jazz: true });
2453 var chord_qualities = ['maj', 'min', 'aug', 'dim'];
2454 if (options.jazz){
2455 chord_qualities = [
2456 'maj7',
2457 'min7',
2458 '7',
2459 'sus',
2460 'dim',
2461 'ø'
2462 ];
2463 }
2464 return this.pickone(chord_qualities);
2465 }
2466
2467 Chance.prototype.chord = function (options) {
2468 options = initOptions(options);
2469 return this.note(options) + this.chord_quality(options);
2470 }
2471
2472 Chance.prototype.tempo = function (options) {
2473 var min = 40;
2474 var max = 320;
2475 options = initOptions(options, {min: min, max: max});
2476 return this.integer({min: options.min, max: options.max});
2477 }
2478
2479 // -- End Music
2480
2481 // -- Miscellaneous --
2482
2483 // Coin - Flip, flip, flipadelphia
2484 Chance.prototype.coin = function() {
2485 return this.bool() ? "heads" : "tails";
2486 }
2487
2488 // Dice - For all the board game geeks out there, myself included ;)
2489 function diceFn (range) {
2490 return function () {
2491 return this.natural(range);
2492 };
2493 }
2494 Chance.prototype.d4 = diceFn({min: 1, max: 4});
2495 Chance.prototype.d6 = diceFn({min: 1, max: 6});
2496 Chance.prototype.d8 = diceFn({min: 1, max: 8});
2497 Chance.prototype.d10 = diceFn({min: 1, max: 10});
2498 Chance.prototype.d12 = diceFn({min: 1, max: 12});
2499 Chance.prototype.d20 = diceFn({min: 1, max: 20});
2500 Chance.prototype.d30 = diceFn({min: 1, max: 30});
2501 Chance.prototype.d100 = diceFn({min: 1, max: 100});
2502
2503 Chance.prototype.rpg = function (thrown, options) {
2504 options = initOptions(options);
2505 if (!thrown) {
2506 throw new RangeError("Chance: A type of die roll must be included");
2507 } else {
2508 var bits = thrown.toLowerCase().split("d"),
2509 rolls = [];
2510
2511 if (bits.length !== 2 || !parseInt(bits[0], 10) || !parseInt(bits[1], 10)) {
2512 throw new Error("Chance: Invalid format provided. Please provide #d# where the first # is the number of dice to roll, the second # is the max of each die");
2513 }
2514 for (var i = bits[0]; i > 0; i--) {
2515 rolls[i - 1] = this.natural({min: 1, max: bits[1]});
2516 }
2517 return (typeof options.sum !== 'undefined' && options.sum) ? rolls.reduce(function (p, c) { return p + c; }) : rolls;
2518 }
2519 };
2520
2521 // Guid
2522 Chance.prototype.guid = function (options) {
2523 options = initOptions(options, { version: 5 });
2524
2525 var guid_pool = "abcdef1234567890",
2526 variant_pool = "ab89",
2527 guid = this.string({ pool: guid_pool, length: 8 }) + '-' +
2528 this.string({ pool: guid_pool, length: 4 }) + '-' +
2529 // The Version
2530 options.version +
2531 this.string({ pool: guid_pool, length: 3 }) + '-' +
2532 // The Variant
2533 this.string({ pool: variant_pool, length: 1 }) +
2534 this.string({ pool: guid_pool, length: 3 }) + '-' +
2535 this.string({ pool: guid_pool, length: 12 });
2536 return guid;
2537 };
2538
2539 // Hash
2540 Chance.prototype.hash = function (options) {
2541 options = initOptions(options, {length : 40, casing: 'lower'});
2542 var pool = options.casing === 'upper' ? HEX_POOL.toUpperCase() : HEX_POOL;
2543 return this.string({pool: pool, length: options.length});
2544 };
2545
2546 Chance.prototype.luhn_check = function (num) {
2547 var str = num.toString();
2548 var checkDigit = +str.substring(str.length - 1);
2549 return checkDigit === this.luhn_calculate(+str.substring(0, str.length - 1));
2550 };
2551
2552 Chance.prototype.luhn_calculate = function (num) {
2553 var digits = num.toString().split("").reverse();
2554 var sum = 0;
2555 var digit;
2556
2557 for (var i = 0, l = digits.length; l > i; ++i) {
2558 digit = +digits[i];
2559 if (i % 2 === 0) {
2560 digit *= 2;
2561 if (digit > 9) {
2562 digit -= 9;
2563 }
2564 }
2565 sum += digit;
2566 }
2567 return (sum * 9) % 10;
2568 };
2569
2570 // MD5 Hash
2571 Chance.prototype.md5 = function(options) {
2572 var opts = { str: '', key: null, raw: false };
2573
2574 if (!options) {
2575 opts.str = this.string();
2576 options = {};
2577 }
2578 else if (typeof options === 'string') {
2579 opts.str = options;
2580 options = {};
2581 }
2582 else if (typeof options !== 'object') {
2583 return null;
2584 }
2585 else if(options.constructor === 'Array') {
2586 return null;
2587 }
2588
2589 opts = initOptions(options, opts);
2590
2591 if(!opts.str){
2592 throw new Error('A parameter is required to return an md5 hash.');
2593 }
2594
2595 return this.bimd5.md5(opts.str, opts.key, opts.raw);
2596 };
2597
2598 /**
2599 * #Description:
2600 * =====================================================
2601 * Generate random file name with extension
2602 *
2603 * The argument provide extension type
2604 * -> raster
2605 * -> vector
2606 * -> 3d
2607 * -> document
2608 *
2609 * If nothing is provided the function return random file name with random
2610 * extension type of any kind
2611 *
2612 * The user can validate the file name length range
2613 * If nothing provided the generated file name is random
2614 *
2615 * #Extension Pool :
2616 * * Currently the supported extensions are
2617 * -> some of the most popular raster image extensions
2618 * -> some of the most popular vector image extensions
2619 * -> some of the most popular 3d image extensions
2620 * -> some of the most popular document extensions
2621 *
2622 * #Examples :
2623 * =====================================================
2624 *
2625 * Return random file name with random extension. The file extension
2626 * is provided by a predefined collection of extensions. More about the extension
2627 * pool can be found in #Extension Pool section
2628 *
2629 * chance.file()
2630 * => dsfsdhjf.xml
2631 *
2632 * In order to generate a file name with specific length, specify the
2633 * length property and integer value. The extension is going to be random
2634 *
2635 * chance.file({length : 10})
2636 * => asrtineqos.pdf
2637 *
2638 * In order to generate file with extension from some of the predefined groups
2639 * of the extension pool just specify the extension pool category in fileType property
2640 *
2641 * chance.file({fileType : 'raster'})
2642 * => dshgssds.psd
2643 *
2644 * You can provide specific extension for your files
2645 * chance.file({extension : 'html'})
2646 * => djfsd.html
2647 *
2648 * Or you could pass custom collection of extensions by array or by object
2649 * chance.file({extensions : [...]})
2650 * => dhgsdsd.psd
2651 *
2652 * chance.file({extensions : { key : [...], key : [...]}})
2653 * => djsfksdjsd.xml
2654 *
2655 * @param [collection] options
2656 * @return [string]
2657 *
2658 */
2659 Chance.prototype.file = function(options) {
2660
2661 var fileOptions = options || {};
2662 var poolCollectionKey = "fileExtension";
2663 var typeRange = Object.keys(this.get("fileExtension"));//['raster', 'vector', '3d', 'document'];
2664 var fileName;
2665 var fileExtension;
2666
2667 // Generate random file name
2668 fileName = this.word({length : fileOptions.length});
2669
2670 // Generate file by specific extension provided by the user
2671 if(fileOptions.extension) {
2672
2673 fileExtension = fileOptions.extension;
2674 return (fileName + '.' + fileExtension);
2675 }
2676
2677 // Generate file by specific extension collection
2678 if(fileOptions.extensions) {
2679
2680 if(Array.isArray(fileOptions.extensions)) {
2681
2682 fileExtension = this.pickone(fileOptions.extensions);
2683 return (fileName + '.' + fileExtension);
2684 }
2685 else if(fileOptions.extensions.constructor === Object) {
2686
2687 var extensionObjectCollection = fileOptions.extensions;
2688 var keys = Object.keys(extensionObjectCollection);
2689
2690 fileExtension = this.pickone(extensionObjectCollection[this.pickone(keys)]);
2691 return (fileName + '.' + fileExtension);
2692 }
2693
2694 throw new Error("Chance: Extensions must be an Array or Object");
2695 }
2696
2697 // Generate file extension based on specific file type
2698 if(fileOptions.fileType) {
2699
2700 var fileType = fileOptions.fileType;
2701 if(typeRange.indexOf(fileType) !== -1) {
2702
2703 fileExtension = this.pickone(this.get(poolCollectionKey)[fileType]);
2704 return (fileName + '.' + fileExtension);
2705 }
2706
2707 throw new RangeError("Chance: Expect file type value to be 'raster', 'vector', '3d' or 'document'");
2708 }
2709
2710 // Generate random file name if no extension options are passed
2711 fileExtension = this.pickone(this.get(poolCollectionKey)[this.pickone(typeRange)]);
2712 return (fileName + '.' + fileExtension);
2713 };
2714
2715 var data = {
2716
2717 firstNames: {
2718 "male": {
2719 "en": ["James", "John", "Robert", "Michael", "William", "David", "Richard", "Joseph", "Charles", "Thomas", "Christopher", "Daniel", "Matthew", "George", "Donald", "Anthony", "Paul", "Mark", "Edward", "Steven", "Kenneth", "Andrew", "Brian", "Joshua", "Kevin", "Ronald", "Timothy", "Jason", "Jeffrey", "Frank", "Gary", "Ryan", "Nicholas", "Eric", "Stephen", "Jacob", "Larry", "Jonathan", "Scott", "Raymond", "Justin", "Brandon", "Gregory", "Samuel", "Benjamin", "Patrick", "Jack", "Henry", "Walter", "Dennis", "Jerry", "Alexander", "Peter", "Tyler", "Douglas", "Harold", "Aaron", "Jose", "Adam", "Arthur", "Zachary", "Carl", "Nathan", "Albert", "Kyle", "Lawrence", "Joe", "Willie", "Gerald", "Roger", "Keith", "Jeremy", "Terry", "Harry", "Ralph", "Sean", "Jesse", "Roy", "Louis", "Billy", "Austin", "Bruce", "Eugene", "Christian", "Bryan", "Wayne", "Russell", "Howard", "Fred", "Ethan", "Jordan", "Philip", "Alan", "Juan", "Randy", "Vincent", "Bobby", "Dylan", "Johnny", "Phillip", "Victor", "Clarence", "Ernest", "Martin", "Craig", "Stanley", "Shawn", "Travis", "Bradley", "Leonard", "Earl", "Gabriel", "Jimmy", "Francis", "Todd", "Noah", "Danny", "Dale", "Cody", "Carlos", "Allen", "Frederick", "Logan", "Curtis", "Alex", "Joel", "Luis", "Norman", "Marvin", "Glenn", "Tony", "Nathaniel", "Rodney", "Melvin", "Alfred", "Steve", "Cameron", "Chad", "Edwin", "Caleb", "Evan", "Antonio", "Lee", "Herbert", "Jeffery", "Isaac", "Derek", "Ricky", "Marcus", "Theodore", "Elijah", "Luke", "Jesus", "Eddie", "Troy", "Mike", "Dustin", "Ray", "Adrian", "Bernard", "Leroy", "Angel", "Randall", "Wesley", "Ian", "Jared", "Mason", "Hunter", "Calvin", "Oscar", "Clifford", "Jay", "Shane", "Ronnie", "Barry", "Lucas", "Corey", "Manuel", "Leo", "Tommy", "Warren", "Jackson", "Isaiah", "Connor", "Don", "Dean", "Jon", "Julian", "Miguel", "Bill", "Lloyd", "Charlie", "Mitchell", "Leon", "Jerome", "Darrell", "Jeremiah", "Alvin", "Brett", "Seth", "Floyd", "Jim", "Blake", "Micheal", "Gordon", "Trevor", "Lewis", "Erik", "Edgar", "Vernon", "Devin", "Gavin", "Jayden", "Chris", "Clyde", "Tom", "Derrick", "Mario", "Brent", "Marc", "Herman", "Chase", "Dominic", "Ricardo", "Franklin", "Maurice", "Max", "Aiden", "Owen", "Lester", "Gilbert", "Elmer", "Gene", "Francisco", "Glen", "Cory", "Garrett", "Clayton", "Sam", "Jorge", "Chester", "Alejandro", "Jeff", "Harvey", "Milton", "Cole", "Ivan", "Andre", "Duane", "Landon"],
2720 // Data taken from http://www.dati.gov.it/dataset/comune-di-firenze_0163
2721 "it": ["Adolfo", "Alberto", "Aldo", "Alessandro", "Alessio", "Alfredo", "Alvaro", "Andrea", "Angelo", "Angiolo", "Antonino", "Antonio", "Attilio", "Benito", "Bernardo", "Bruno", "Carlo", "Cesare", "Christian", "Claudio", "Corrado", "Cosimo", "Cristian", "Cristiano", "Daniele", "Dario", "David", "Davide", "Diego", "Dino", "Domenico", "Duccio", "Edoardo", "Elia", "Elio", "Emanuele", "Emiliano", "Emilio", "Enrico", "Enzo", "Ettore", "Fabio", "Fabrizio", "Federico", "Ferdinando", "Fernando", "Filippo", "Francesco", "Franco", "Gabriele", "Giacomo", "Giampaolo", "Giampiero", "Giancarlo", "Gianfranco", "Gianluca", "Gianmarco", "Gianni", "Gino", "Giorgio", "Giovanni", "Giuliano", "Giulio", "Giuseppe", "Graziano", "Gregorio", "Guido", "Iacopo", "Jacopo", "Lapo", "Leonardo", "Lorenzo", "Luca", "Luciano", "Luigi", "Manuel", "Marcello", "Marco", "Marino", "Mario", "Massimiliano", "Massimo", "Matteo", "Mattia", "Maurizio", "Mauro", "Michele", "Mirko", "Mohamed", "Nello", "Neri", "Niccolò", "Nicola", "Osvaldo", "Otello", "Paolo", "Pier Luigi", "Piero", "Pietro", "Raffaele", "Remo", "Renato", "Renzo", "Riccardo", "Roberto", "Rolando", "Romano", "Salvatore", "Samuele", "Sandro", "Sergio", "Silvano", "Simone", "Stefano", "Thomas", "Tommaso", "Ubaldo", "Ugo", "Umberto", "Valerio", "Valter", "Vasco", "Vincenzo", "Vittorio"],
2722 // Data taken from http://www.svbkindernamen.nl/int/nl/kindernamen/index.html
2723 "nl": ["Aaron","Abel","Adam","Adriaan","Albert","Alexander","Ali","Arjen","Arno","Bart","Bas","Bastiaan","Benjamin","Bob", "Boris","Bram","Brent","Cas","Casper","Chris","Christiaan","Cornelis","Daan","Daley","Damian","Dani","Daniel","Daniël","David","Dean","Dirk","Dylan","Egbert","Elijah","Erik","Erwin","Evert","Ezra","Fabian","Fedde","Finn","Florian","Floris","Frank","Frans","Frederik","Freek","Geert","Gerard","Gerben","Gerrit","Gijs","Guus","Hans","Hendrik","Henk","Herman","Hidde","Hugo","Jaap","Jan Jaap","Jan-Willem","Jack","Jacob","Jan","Jason","Jasper","Jayden","Jelle","Jelte","Jens","Jeroen","Jesse","Jim","Job","Joep","Johannes","John","Jonathan","Joris","Joshua","Joël","Julian","Kees","Kevin","Koen","Lars","Laurens","Leendert","Lennard","Lodewijk","Luc","Luca","Lucas","Lukas","Luuk","Maarten","Marcus","Martijn","Martin","Matthijs","Maurits","Max","Mees","Melle","Mick","Mika","Milan","Mohamed","Mohammed","Morris","Muhammed","Nathan","Nick","Nico","Niek","Niels","Noah","Noud","Olivier","Oscar","Owen","Paul","Pepijn","Peter","Pieter","Pim","Quinten","Reinier","Rens","Robin","Ruben","Sam","Samuel","Sander","Sebastiaan","Sem","Sep","Sepp","Siem","Simon","Stan","Stef","Steven","Stijn","Sven","Teun","Thijmen","Thijs","Thomas","Tijn","Tim","Timo","Tobias","Tom","Victor","Vince","Willem","Wim","Wouter","Yusuf"],
2724 // Data taken from https://fr.wikipedia.org/wiki/Liste_de_pr%C3%A9noms_fran%C3%A7ais_et_de_la_francophonie
2725 "fr": ["Aaron","Abdon","Abel","Abélard","Abelin","Abondance","Abraham","Absalon","Acace","Achaire","Achille","Adalard","Adalbald","Adalbéron","Adalbert","Adalric","Adam","Adegrin","Adel","Adelin","Andelin","Adelphe","Adam","Adéodat","Adhémar","Adjutor","Adolphe","Adonis","Adon","Adrien","Agapet","Agathange","Agathon","Agilbert","Agénor","Agnan","Aignan","Agrippin","Aimable","Aimé","Alain","Alban","Albin","Aubin","Albéric","Albert","Albertet","Alcibiade","Alcide","Alcée","Alcime","Aldonce","Aldric","Aldéric","Aleaume","Alexandre","Alexis","Alix","Alliaume","Aleaume","Almine","Almire","Aloïs","Alphée","Alphonse","Alpinien","Alverède","Amalric","Amaury","Amandin","Amant","Ambroise","Amédée","Amélien","Amiel","Amour","Anaël","Anastase","Anatole","Ancelin","Andéol","Andoche","André","Andoche","Ange","Angelin","Angilbe","Anglebert","Angoustan","Anicet","Anne","Annibal","Ansbert","Anselme","Anthelme","Antheaume","Anthime","Antide","Antoine","Antonius","Antonin","Apollinaire","Apollon","Aquilin","Arcade","Archambaud","Archambeau","Archange","Archibald","Arian","Ariel","Ariste","Aristide","Armand","Armel","Armin","Arnould","Arnaud","Arolde","Arsène","Arsinoé","Arthaud","Arthème","Arthur","Ascelin","Athanase","Aubry","Audebert","Audouin","Audran","Audric","Auguste","Augustin","Aurèle","Aurélien","Aurian","Auxence","Axel","Aymard","Aymeric","Aymon","Aymond","Balthazar","Baptiste","Barnabé","Barthélemy","Bartimée","Basile","Bastien","Baudouin","Bénigne","Benjamin","Benoît","Bérenger","Bérard","Bernard","Bertrand","Blaise","Bon","Boniface","Bouchard","Brice","Brieuc","Bruno","Brunon","Calixte","Calliste","Camélien","Camille","Camillien","Candide","Caribert","Carloman","Cassandre","Cassien","Cédric","Céleste","Célestin","Célien","Césaire","César","Charles","Charlemagne","Childebert","Chilpéric","Chrétien","Christian","Christodule","Christophe","Chrysostome","Clarence","Claude","Claudien","Cléandre","Clément","Clotaire","Côme","Constance","Constant","Constantin","Corentin","Cyprien","Cyriaque","Cyrille","Cyril","Damien","Daniel","David","Delphin","Denis","Désiré","Didier","Dieudonné","Dimitri","Dominique","Dorian","Dorothée","Edgard","Edmond","Édouard","Éleuthère","Élie","Élisée","Émeric","Émile","Émilien","Emmanuel","Enguerrand","Épiphane","Éric","Esprit","Ernest","Étienne","Eubert","Eudes","Eudoxe","Eugène","Eusèbe","Eustache","Évariste","Évrard","Fabien","Fabrice","Falba","Félicité","Félix","Ferdinand","Fiacre","Fidèle","Firmin","Flavien","Flodoard","Florent","Florentin","Florestan","Florian","Fortuné","Foulques","Francisque","François","Français","Franciscus","Francs","Frédéric","Fulbert","Fulcran","Fulgence","Gabin","Gabriel","Gaël","Garnier","Gaston","Gaspard","Gatien","Gaud","Gautier","Gédéon","Geoffroy","Georges","Géraud","Gérard","Gerbert","Germain","Gervais","Ghislain","Gilbert","Gilles","Girart","Gislebert","Gondebaud","Gonthier","Gontran","Gonzague","Grégoire","Guérin","Gui","Guillaume","Gustave","Guy","Guyot","Hardouin","Hector","Hédelin","Hélier","Henri","Herbert","Herluin","Hervé","Hilaire","Hildebert","Hincmar","Hippolyte","Honoré","Hubert","Hugues","Innocent","Isabeau","Isidore","Jacques","Japhet","Jason","Jean","Jeannel","Jeannot","Jérémie","Jérôme","Joachim","Joanny","Job","Jocelyn","Joël","Johan","Jonas","Jonathan","Joseph","Josse","Josselin","Jourdain","Jude","Judicaël","Jules","Julien","Juste","Justin","Lambert","Landry","Laurent","Lazare","Léandre","Léon","Léonard","Léopold","Leu","Loup","Leufroy","Libère","Liétald","Lionel","Loïc","Longin","Lorrain","Lorraine","Lothaire","Louis","Loup","Luc","Lucas","Lucien","Ludolphe","Ludovic","Macaire","Malo","Mamert","Manassé","Marc","Marceau","Marcel","Marcelin","Marius","Marseille","Martial","Martin","Mathurin","Matthias","Mathias","Matthieu","Maugis","Maurice","Mauricet","Maxence","Maxime","Maximilien","Mayeul","Médéric","Melchior","Mence","Merlin","Mérovée","Michaël","Michel","Moïse","Morgan","Nathan","Nathanaël","Narcisse","Néhémie","Nestor","Nestor","Nicéphore","Nicolas","Noé","Noël","Norbert","Normand","Normands","Octave","Odilon","Odon","Oger","Olivier","Oury","Pacôme","Palémon","Parfait","Pascal","Paterne","Patrice","Paul","Pépin","Perceval","Philémon","Philibert","Philippe","Philothée","Pie","Pierre","Pierrick","Prosper","Quentin","Raoul","Raphaël","Raymond","Régis","Réjean","Rémi","Renaud","René","Reybaud","Richard","Robert","Roch","Rodolphe","Rodrigue","Roger","Roland","Romain","Romuald","Roméo","Rome","Ronan","Roselin","Salomon","Samuel","Savin","Savinien","Scholastique","Sébastien","Séraphin","Serge","Séverin","Sidoine","Sigebert","Sigismond","Silvère","Simon","Siméon","Sixte","Stanislas","Stéphane","Stephan","Sylvain","Sylvestre","Tancrède","Tanguy","Taurin","Théodore","Théodose","Théophile","Théophraste","Thibault","Thibert","Thierry","Thomas","Timoléon","Timothée","Titien","Tonnin","Toussaint","Trajan","Tristan","Turold","Tim","Ulysse","Urbain","Valentin","Valère","Valéry","Venance","Venant","Venceslas","Vianney","Victor","Victorien","Victorin","Vigile","Vincent","Vital","Vitalien","Vivien","Waleran","Wandrille","Xavier","Xénophon","Yves","Zacharie","Zaché","Zéphirin"]
2726 },
2727
2728 "female": {
2729 "en": ["Mary", "Emma", "Elizabeth", "Minnie", "Margaret", "Ida", "Alice", "Bertha", "Sarah", "Annie", "Clara", "Ella", "Florence", "Cora", "Martha", "Laura", "Nellie", "Grace", "Carrie", "Maude", "Mabel", "Bessie", "Jennie", "Gertrude", "Julia", "Hattie", "Edith", "Mattie", "Rose", "Catherine", "Lillian", "Ada", "Lillie", "Helen", "Jessie", "Louise", "Ethel", "Lula", "Myrtle", "Eva", "Frances", "Lena", "Lucy", "Edna", "Maggie", "Pearl", "Daisy", "Fannie", "Josephine", "Dora", "Rosa", "Katherine", "Agnes", "Marie", "Nora", "May", "Mamie", "Blanche", "Stella", "Ellen", "Nancy", "Effie", "Sallie", "Nettie", "Della", "Lizzie", "Flora", "Susie", "Maud", "Mae", "Etta", "Harriet", "Sadie", "Caroline", "Katie", "Lydia", "Elsie", "Kate", "Susan", "Mollie", "Alma", "Addie", "Georgia", "Eliza", "Lulu", "Nannie", "Lottie", "Amanda", "Belle", "Charlotte", "Rebecca", "Ruth", "Viola", "Olive", "Amelia", "Hannah", "Jane", "Virginia", "Emily", "Matilda", "Irene", "Kathryn", "Esther", "Willie", "Henrietta", "Ollie", "Amy", "Rachel", "Sara", "Estella", "Theresa", "Augusta", "Ora", "Pauline", "Josie", "Lola", "Sophia", "Leona", "Anne", "Mildred", "Ann", "Beulah", "Callie", "Lou", "Delia", "Eleanor", "Barbara", "Iva", "Louisa", "Maria", "Mayme", "Evelyn", "Estelle", "Nina", "Betty", "Marion", "Bettie", "Dorothy", "Luella", "Inez", "Lela", "Rosie", "Allie", "Millie", "Janie", "Cornelia", "Victoria", "Ruby", "Winifred", "Alta", "Celia", "Christine", "Beatrice", "Birdie", "Harriett", "Mable", "Myra", "Sophie", "Tillie", "Isabel", "Sylvia", "Carolyn", "Isabelle", "Leila", "Sally", "Ina", "Essie", "Bertie", "Nell", "Alberta", "Katharine", "Lora", "Rena", "Mina", "Rhoda", "Mathilda", "Abbie", "Eula", "Dollie", "Hettie", "Eunice", "Fanny", "Ola", "Lenora", "Adelaide", "Christina", "Lelia", "Nelle", "Sue", "Johanna", "Lilly", "Lucinda", "Minerva", "Lettie", "Roxie", "Cynthia", "Helena", "Hilda", "Hulda", "Bernice", "Genevieve", "Jean", "Cordelia", "Marian", "Francis", "Jeanette", "Adeline", "Gussie", "Leah", "Lois", "Lura", "Mittie", "Hallie", "Isabella", "Olga", "Phoebe", "Teresa", "Hester", "Lida", "Lina", "Winnie", "Claudia", "Marguerite", "Vera", "Cecelia", "Bess", "Emilie", "Rosetta", "Verna", "Myrtie", "Cecilia", "Elva", "Olivia", "Ophelia", "Georgie", "Elnora", "Violet", "Adele", "Lily", "Linnie", "Loretta", "Madge", "Polly", "Virgie", "Eugenia", "Lucile", "Lucille", "Mabelle", "Rosalie"],
2730 // Data taken from http://www.dati.gov.it/dataset/comune-di-firenze_0162
2731 "it": ["Ada", "Adriana", "Alessandra", "Alessia", "Alice", "Angela", "Anna", "Anna Maria", "Annalisa", "Annita", "Annunziata", "Antonella", "Arianna", "Asia", "Assunta", "Aurora", "Barbara", "Beatrice", "Benedetta", "Bianca", "Bruna", "Camilla", "Carla", "Carlotta", "Carmela", "Carolina", "Caterina", "Catia", "Cecilia", "Chiara", "Cinzia", "Clara", "Claudia", "Costanza", "Cristina", "Daniela", "Debora", "Diletta", "Dina", "Donatella", "Elena", "Eleonora", "Elisa", "Elisabetta", "Emanuela", "Emma", "Eva", "Federica", "Fernanda", "Fiorella", "Fiorenza", "Flora", "Franca", "Francesca", "Gabriella", "Gaia", "Gemma", "Giada", "Gianna", "Gina", "Ginevra", "Giorgia", "Giovanna", "Giulia", "Giuliana", "Giuseppa", "Giuseppina", "Grazia", "Graziella", "Greta", "Ida", "Ilaria", "Ines", "Iolanda", "Irene", "Irma", "Isabella", "Jessica", "Laura", "Lea", "Letizia", "Licia", "Lidia", "Liliana", "Lina", "Linda", "Lisa", "Livia", "Loretta", "Luana", "Lucia", "Luciana", "Lucrezia", "Luisa", "Manuela", "Mara", "Marcella", "Margherita", "Maria", "Maria Cristina", "Maria Grazia", "Maria Luisa", "Maria Pia", "Maria Teresa", "Marina", "Marisa", "Marta", "Martina", "Marzia", "Matilde", "Melissa", "Michela", "Milena", "Mirella", "Monica", "Natalina", "Nella", "Nicoletta", "Noemi", "Olga", "Paola", "Patrizia", "Piera", "Pierina", "Raffaella", "Rebecca", "Renata", "Rina", "Rita", "Roberta", "Rosa", "Rosanna", "Rossana", "Rossella", "Sabrina", "Sandra", "Sara", "Serena", "Silvana", "Silvia", "Simona", "Simonetta", "Sofia", "Sonia", "Stefania", "Susanna", "Teresa", "Tina", "Tiziana", "Tosca", "Valentina", "Valeria", "Vanda", "Vanessa", "Vanna", "Vera", "Veronica", "Vilma", "Viola", "Virginia", "Vittoria"],
2732 // Data taken from http://www.svbkindernamen.nl/int/nl/kindernamen/index.html
2733 "nl": ["Ada", "Arianne", "Afke", "Amanda", "Amber", "Amy", "Aniek", "Anita", "Anja", "Anna", "Anne", "Annelies", "Annemarie", "Annette", "Anouk", "Astrid", "Aukje", "Barbara", "Bianca", "Carla", "Carlijn", "Carolien", "Chantal", "Charlotte", "Claudia", "Daniëlle", "Debora", "Diane", "Dora", "Eline", "Elise", "Ella", "Ellen", "Emma", "Esmee", "Evelien", "Esther", "Erica", "Eva", "Femke", "Fleur", "Floor", "Froukje", "Gea", "Gerda", "Hanna", "Hanneke", "Heleen", "Hilde", "Ilona", "Ina", "Inge", "Ingrid", "Iris", "Isabel", "Isabelle", "Janneke", "Jasmijn", "Jeanine", "Jennifer", "Jessica", "Johanna", "Joke", "Julia", "Julie", "Karen", "Karin", "Katja", "Kim", "Lara", "Laura", "Lena", "Lianne", "Lieke", "Lilian", "Linda", "Lisa", "Lisanne", "Lotte", "Louise", "Maaike", "Manon", "Marga", "Maria", "Marissa", "Marit", "Marjolein", "Martine", "Marleen", "Melissa", "Merel", "Miranda", "Michelle", "Mirjam", "Mirthe", "Naomi", "Natalie", 'Nienke', "Nina", "Noortje", "Olivia", "Patricia", "Paula", "Paulien", "Ramona", "Ria", "Rianne", "Roos", "Rosanne", "Ruth", "Sabrina", "Sandra", "Sanne", "Sara", "Saskia", "Silvia", "Sofia", "Sophie", "Sonja", "Suzanne", "Tamara", "Tess", "Tessa", "Tineke", "Valerie", "Vanessa", "Veerle", "Vera", "Victoria", "Wendy", "Willeke", "Yvonne", "Zoë"],
2734 // Data taken from https://fr.wikipedia.org/wiki/Liste_de_pr%C3%A9noms_fran%C3%A7ais_et_de_la_francophonie
2735 "fr": ["Abdon","Abel","Abigaëlle","Abigaïl","Acacius","Acanthe","Adalbert","Adalsinde","Adegrine","Adélaïde","Adèle","Adélie","Adeline","Adeltrude","Adolphe","Adonis","Adrastée","Adrehilde","Adrienne","Agathe","Agilbert","Aglaé","Aignan","Agneflète","Agnès","Agrippine","Aimé","Alaine","Alaïs","Albane","Albérade","Alberte","Alcide","Alcine","Alcyone","Aldegonde","Aleth","Alexandrine","Alexine","Alice","Aliénor","Aliette","Aline","Alix","Alizé","Aloïse","Aloyse","Alphonsine","Althée","Amaliane","Amalthée","Amande","Amandine","Amant","Amarande","Amaranthe","Amaryllis","Ambre","Ambroisie","Amélie","Améthyste","Aminte","Anaël","Anaïs","Anastasie","Anatole","Ancelin","Andrée","Anémone","Angadrême","Angèle","Angeline","Angélique","Angilbert","Anicet","Annabelle","Anne","Annette","Annick","Annie","Annonciade","Ansbert","Anstrudie","Anthelme","Antigone","Antoinette","Antonine","Aphélie","Apolline","Apollonie","Aquiline","Arabelle","Arcadie","Archange","Argine","Ariane","Aricie","Ariel","Arielle","Arlette","Armance","Armande","Armandine","Armelle","Armide","Armelle","Armin","Arnaud","Arsène","Arsinoé","Artémis","Arthur","Ascelin","Ascension","Assomption","Astarté","Astérie","Astrée","Astrid","Athalie","Athanasie","Athina","Aube","Albert","Aude","Audrey","Augustine","Aure","Aurélie","Aurélien","Aurèle","Aurore","Auxence","Aveline","Abigaëlle","Avoye","Axelle","Aymard","Azalée","Adèle","Adeline","Barbe","Basilisse","Bathilde","Béatrice","Béatrix","Bénédicte","Bérengère","Bernadette","Berthe","Bertille","Beuve","Blanche","Blanc","Blandine","Brigitte","Brune","Brunehilde","Callista","Camille","Capucine","Carine","Caroline","Cassandre","Catherine","Cécile","Céleste","Célestine","Céline","Chantal","Charlène","Charline","Charlotte","Chloé","Christelle","Christiane","Christine","Claire","Clara","Claude","Claudine","Clarisse","Clémence","Clémentine","Cléo","Clio","Clotilde","Coline","Conception","Constance","Coralie","Coraline","Corentine","Corinne","Cyrielle","Daniel","Daniel","Daphné","Débora","Delphine","Denise","Diane","Dieudonné","Dominique","Doriane","Dorothée","Douce","Édith","Edmée","Éléonore","Éliane","Élia","Éliette","Élisabeth","Élise","Ella","Élodie","Éloïse","Elsa","Émeline","Émérance","Émérentienne","Émérencie","Émilie","Emma","Emmanuelle","Emmelie","Ernestine","Esther","Estelle","Eudoxie","Eugénie","Eulalie","Euphrasie","Eusébie","Évangéline","Eva","Ève","Évelyne","Fanny","Fantine","Faustine","Félicie","Fernande","Flavie","Fleur","Flore","Florence","Florie","Fortuné","France","Francia","Françoise","Francine","Gabrielle","Gaëlle","Garance","Geneviève","Georgette","Gerberge","Germaine","Gertrude","Gisèle","Guenièvre","Guilhemine","Guillemette","Gustave","Gwenael","Hélène","Héloïse","Henriette","Hermine","Hermione","Hippolyte","Honorine","Hortense","Huguette","Ines","Irène","Irina","Iris","Isabeau","Isabelle","Iseult","Isolde","Ismérie","Jacinthe","Jacqueline","Jade","Janine","Jeanne","Jocelyne","Joëlle","Joséphine","Judith","Julia","Julie","Jules","Juliette","Justine","Katy","Kathy","Katie","Laura","Laure","Laureline","Laurence","Laurene","Lauriane","Laurianne","Laurine","Léa","Léna","Léonie","Léon","Léontine","Lorraine","Lucie","Lucienne","Lucille","Ludivine","Lydie","Lydie","Megane","Madeleine","Magali","Maguelone","Mallaury","Manon","Marceline","Margot","Marguerite","Marianne","Marie","Myriam","Marie","Marine","Marion","Marlène","Marthe","Martine","Mathilde","Maud","Maureen","Mauricette","Maxime","Mélanie","Melissa","Mélissandre","Mélisande","Mélodie","Michel","Micheline","Mireille","Miriam","Moïse","Monique","Morgane","Muriel","Mylène","Nadège","Nadine","Nathalie","Nicole","Nicolette","Nine","Noël","Noémie","Océane","Odette","Odile","Olive","Olivia","Olympe","Ombline","Ombeline","Ophélie","Oriande","Oriane","Ozanne","Pascale","Pascaline","Paule","Paulette","Pauline","Priscille","Prisca","Prisque","Pécine","Pélagie","Pénélope","Perrine","Pétronille","Philippine","Philomène","Philothée","Primerose","Prudence","Pulchérie","Quentine","Quiéta","Quintia","Quintilla","Rachel","Raphaëlle","Raymonde","Rebecca","Régine","Réjeanne","René","Rita","Rita","Rolande","Romane","Rosalie","Rose","Roseline","Sabine","Salomé","Sandra","Sandrine","Sarah","Ségolène","Séverine","Sibylle","Simone","Sixt","Solange","Soline","Solène","Sophie","Stéphanie","Suzanne","Sylvain","Sylvie","Tatiana","Thaïs","Théodora","Thérèse","Tiphaine","Ursule","Valentine","Valérie","Véronique","Victoire","Victorine","Vinciane","Violette","Virginie","Viviane","Xavière","Yolande","Ysaline","Yvette","Yvonne","Zélie","Zita","Zoé"]
2736 }
2737 },
2738
2739 lastNames: {
2740 "en": ['Smith', 'Johnson', 'Williams', 'Jones', 'Brown', 'Davis', 'Miller', 'Wilson', 'Moore', 'Taylor', 'Anderson', 'Thomas', 'Jackson', 'White', 'Harris', 'Martin', 'Thompson', 'Garcia', 'Martinez', 'Robinson', 'Clark', 'Rodriguez', 'Lewis', 'Lee', 'Walker', 'Hall', 'Allen', 'Young', 'Hernandez', 'King', 'Wright', 'Lopez', 'Hill', 'Scott', 'Green', 'Adams', 'Baker', 'Gonzalez', 'Nelson', 'Carter', 'Mitchell', 'Perez', 'Roberts', 'Turner', 'Phillips', 'Campbell', 'Parker', 'Evans', 'Edwards', 'Collins', 'Stewart', 'Sanchez', 'Morris', 'Rogers', 'Reed', 'Cook', 'Morgan', 'Bell', 'Murphy', 'Bailey', 'Rivera', 'Cooper', 'Richardson', 'Cox', 'Howard', 'Ward', 'Torres', 'Peterson', 'Gray', 'Ramirez', 'James', 'Watson', 'Brooks', 'Kelly', 'Sanders', 'Price', 'Bennett', 'Wood', 'Barnes', 'Ross', 'Henderson', 'Coleman', 'Jenkins', 'Perry', 'Powell', 'Long', 'Patterson', 'Hughes', 'Flores', 'Washington', 'Butler', 'Simmons', 'Foster', 'Gonzales', 'Bryant', 'Alexander', 'Russell', 'Griffin', 'Diaz', 'Hayes', 'Myers', 'Ford', 'Hamilton', 'Graham', 'Sullivan', 'Wallace', 'Woods', 'Cole', 'West', 'Jordan', 'Owens', 'Reynolds', 'Fisher', 'Ellis', 'Harrison', 'Gibson', 'McDonald', 'Cruz', 'Marshall', 'Ortiz', 'Gomez', 'Murray', 'Freeman', 'Wells', 'Webb', 'Simpson', 'Stevens', 'Tucker', 'Porter', 'Hunter', 'Hicks', 'Crawford', 'Henry', 'Boyd', 'Mason', 'Morales', 'Kennedy', 'Warren', 'Dixon', 'Ramos', 'Reyes', 'Burns', 'Gordon', 'Shaw', 'Holmes', 'Rice', 'Robertson', 'Hunt', 'Black', 'Daniels', 'Palmer', 'Mills', 'Nichols', 'Grant', 'Knight', 'Ferguson', 'Rose', 'Stone', 'Hawkins', 'Dunn', 'Perkins', 'Hudson', 'Spencer', 'Gardner', 'Stephens', 'Payne', 'Pierce', 'Berry', 'Matthews', 'Arnold', 'Wagner', 'Willis', 'Ray', 'Watkins', 'Olson', 'Carroll', 'Duncan', 'Snyder', 'Hart', 'Cunningham', 'Bradley', 'Lane', 'Andrews', 'Ruiz', 'Harper', 'Fox', 'Riley', 'Armstrong', 'Carpenter', 'Weaver', 'Greene', 'Lawrence', 'Elliott', 'Chavez', 'Sims', 'Austin', 'Peters', 'Kelley', 'Franklin', 'Lawson', 'Fields', 'Gutierrez', 'Ryan', 'Schmidt', 'Carr', 'Vasquez', 'Castillo', 'Wheeler', 'Chapman', 'Oliver', 'Montgomery', 'Richards', 'Williamson', 'Johnston', 'Banks', 'Meyer', 'Bishop', 'McCoy', 'Howell', 'Alvarez', 'Morrison', 'Hansen', 'Fernandez', 'Garza', 'Harvey', 'Little', 'Burton', 'Stanley', 'Nguyen', 'George', 'Jacobs', 'Reid', 'Kim', 'Fuller', 'Lynch', 'Dean', 'Gilbert', 'Garrett', 'Romero', 'Welch', 'Larson', 'Frazier', 'Burke', 'Hanson', 'Day', 'Mendoza', 'Moreno', 'Bowman', 'Medina', 'Fowler', 'Brewer', 'Hoffman', 'Carlson', 'Silva', 'Pearson', 'Holland', 'Douglas', 'Fleming', 'Jensen', 'Vargas', 'Byrd', 'Davidson', 'Hopkins', 'May', 'Terry', 'Herrera', 'Wade', 'Soto', 'Walters', 'Curtis', 'Neal', 'Caldwell', 'Lowe', 'Jennings', 'Barnett', 'Graves', 'Jimenez', 'Horton', 'Shelton', 'Barrett', 'Obrien', 'Castro', 'Sutton', 'Gregory', 'McKinney', 'Lucas', 'Miles', 'Craig', 'Rodriquez', 'Chambers', 'Holt', 'Lambert', 'Fletcher', 'Watts', 'Bates', 'Hale', 'Rhodes', 'Pena', 'Beck', 'Newman', 'Haynes', 'McDaniel', 'Mendez', 'Bush', 'Vaughn', 'Parks', 'Dawson', 'Santiago', 'Norris', 'Hardy', 'Love', 'Steele', 'Curry', 'Powers', 'Schultz', 'Barker', 'Guzman', 'Page', 'Munoz', 'Ball', 'Keller', 'Chandler', 'Weber', 'Leonard', 'Walsh', 'Lyons', 'Ramsey', 'Wolfe', 'Schneider', 'Mullins', 'Benson', 'Sharp', 'Bowen', 'Daniel', 'Barber', 'Cummings', 'Hines', 'Baldwin', 'Griffith', 'Valdez', 'Hubbard', 'Salazar', 'Reeves', 'Warner', 'Stevenson', 'Burgess', 'Santos', 'Tate', 'Cross', 'Garner', 'Mann', 'Mack', 'Moss', 'Thornton', 'Dennis', 'McGee', 'Farmer', 'Delgado', 'Aguilar', 'Vega', 'Glover', 'Manning', 'Cohen', 'Harmon', 'Rodgers', 'Robbins', 'Newton', 'Todd', 'Blair', 'Higgins', 'Ingram', 'Reese', 'Cannon', 'Strickland', 'Townsend', 'Potter', 'Goodwin', 'Walton', 'Rowe', 'Hampton', 'Ortega', 'Patton', 'Swanson', 'Joseph', 'Francis', 'Goodman', 'Maldonado', 'Yates', 'Becker', 'Erickson', 'Hodges', 'Rios', 'Conner', 'Adkins', 'Webster', 'Norman', 'Malone', 'Hammond', 'Flowers', 'Cobb', 'Moody', 'Quinn', 'Blake', 'Maxwell', 'Pope', 'Floyd', 'Osborne', 'Paul', 'McCarthy', 'Guerrero', 'Lindsey', 'Estrada', 'Sandoval', 'Gibbs', 'Tyler', 'Gross', 'Fitzgerald', 'Stokes', 'Doyle', 'Sherman', 'Saunders', 'Wise', 'Colon', 'Gill', 'Alvarado', 'Greer', 'Padilla', 'Simon', 'Waters', 'Nunez', 'Ballard', 'Schwartz', 'McBride', 'Houston', 'Christensen', 'Klein', 'Pratt', 'Briggs', 'Parsons', 'McLaughlin', 'Zimmerman', 'French', 'Buchanan', 'Moran', 'Copeland', 'Roy', 'Pittman', 'Brady', 'McCormick', 'Holloway', 'Brock', 'Poole', 'Frank', 'Logan', 'Owen', 'Bass', 'Marsh', 'Drake', 'Wong', 'Jefferson', 'Park', 'Morton', 'Abbott', 'Sparks', 'Patrick', 'Norton', 'Huff', 'Clayton', 'Massey', 'Lloyd', 'Figueroa', 'Carson', 'Bowers', 'Roberson', 'Barton', 'Tran', 'Lamb', 'Harrington', 'Casey', 'Boone', 'Cortez', 'Clarke', 'Mathis', 'Singleton', 'Wilkins', 'Cain', 'Bryan', 'Underwood', 'Hogan', 'McKenzie', 'Collier', 'Luna', 'Phelps', 'McGuire', 'Allison', 'Bridges', 'Wilkerson', 'Nash', 'Summers', 'Atkins'],
2741 // Data taken from http://www.dati.gov.it/dataset/comune-di-firenze_0164 (first 1000)
2742 "it": ["Acciai", "Aglietti", "Agostini", "Agresti", "Ahmed", "Aiazzi", "Albanese", "Alberti", "Alessi", "Alfani", "Alinari", "Alterini", "Amato", "Ammannati", "Ancillotti", "Andrei", "Andreini", "Andreoni", "Angeli", "Anichini", "Antonelli", "Antonini", "Arena", "Ariani", "Arnetoli", "Arrighi", "Baccani", "Baccetti", "Bacci", "Bacherini", "Badii", "Baggiani", "Baglioni", "Bagni", "Bagnoli", "Baldassini", "Baldi", "Baldini", "Ballerini", "Balli", "Ballini", "Balloni", "Bambi", "Banchi", "Bandinelli", "Bandini", "Bani", "Barbetti", "Barbieri", "Barchielli", "Bardazzi", "Bardelli", "Bardi", "Barducci", "Bargellini", "Bargiacchi", "Barni", "Baroncelli", "Baroncini", "Barone", "Baroni", "Baronti", "Bartalesi", "Bartoletti", "Bartoli", "Bartolini", "Bartoloni", "Bartolozzi", "Basagni", "Basile", "Bassi", "Batacchi", "Battaglia", "Battaglini", "Bausi", "Becagli", "Becattini", "Becchi", "Becucci", "Bellandi", "Bellesi", "Belli", "Bellini", "Bellucci", "Bencini", "Benedetti", "Benelli", "Beni", "Benini", "Bensi", "Benucci", "Benvenuti", "Berlincioni", "Bernacchioni", "Bernardi", "Bernardini", "Berni", "Bernini", "Bertelli", "Berti", "Bertini", "Bessi", "Betti", "Bettini", "Biagi", "Biagini", "Biagioni", "Biagiotti", "Biancalani", "Bianchi", "Bianchini", "Bianco", "Biffoli", "Bigazzi", "Bigi", "Biliotti", "Billi", "Binazzi", "Bindi", "Bini", "Biondi", "Bizzarri", "Bocci", "Bogani", "Bolognesi", "Bonaiuti", "Bonanni", "Bonciani", "Boncinelli", "Bondi", "Bonechi", "Bongini", "Boni", "Bonini", "Borchi", "Boretti", "Borghi", "Borghini", "Borgioli", "Borri", "Borselli", "Boschi", "Bottai", "Bracci", "Braccini", "Brandi", "Braschi", "Bravi", "Brazzini", "Breschi", "Brilli", "Brizzi", "Brogelli", "Brogi", "Brogioni", "Brunelli", "Brunetti", "Bruni", "Bruno", "Brunori", "Bruschi", "Bucci", "Bucciarelli", "Buccioni", "Bucelli", "Bulli", "Burberi", "Burchi", "Burgassi", "Burroni", "Bussotti", "Buti", "Caciolli", "Caiani", "Calabrese", "Calamai", "Calamandrei", "Caldini", "Calo'", "Calonaci", "Calosi", "Calvelli", "Cambi", "Camiciottoli", "Cammelli", "Cammilli", "Campolmi", "Cantini", "Capanni", "Capecchi", "Caponi", "Cappelletti", "Cappelli", "Cappellini", "Cappugi", "Capretti", "Caputo", "Carbone", "Carboni", "Cardini", "Carlesi", "Carletti", "Carli", "Caroti", "Carotti", "Carrai", "Carraresi", "Carta", "Caruso", "Casalini", "Casati", "Caselli", "Casini", "Castagnoli", "Castellani", "Castelli", "Castellucci", "Catalano", "Catarzi", "Catelani", "Cavaciocchi", "Cavallaro", "Cavallini", "Cavicchi", "Cavini", "Ceccarelli", "Ceccatelli", "Ceccherelli", "Ceccherini", "Cecchi", "Cecchini", "Cecconi", "Cei", "Cellai", "Celli", "Cellini", "Cencetti", "Ceni", "Cenni", "Cerbai", "Cesari", "Ceseri", "Checcacci", "Checchi", "Checcucci", "Cheli", "Chellini", "Chen", "Cheng", "Cherici", "Cherubini", "Chiaramonti", "Chiarantini", "Chiarelli", "Chiari", "Chiarini", "Chiarugi", "Chiavacci", "Chiesi", "Chimenti", "Chini", "Chirici", "Chiti", "Ciabatti", "Ciampi", "Cianchi", "Cianfanelli", "Cianferoni", "Ciani", "Ciapetti", "Ciappi", "Ciardi", "Ciatti", "Cicali", "Ciccone", "Cinelli", "Cini", "Ciobanu", "Ciolli", "Cioni", "Cipriani", "Cirillo", "Cirri", "Ciucchi", "Ciuffi", "Ciulli", "Ciullini", "Clemente", "Cocchi", "Cognome", "Coli", "Collini", "Colombo", "Colzi", "Comparini", "Conforti", "Consigli", "Conte", "Conti", "Contini", "Coppini", "Coppola", "Corsi", "Corsini", "Corti", "Cortini", "Cosi", "Costa", "Costantini", "Costantino", "Cozzi", "Cresci", "Crescioli", "Cresti", "Crini", "Curradi", "D'Agostino", "D'Alessandro", "D'Amico", "D'Angelo", "Daddi", "Dainelli", "Dallai", "Danti", "Davitti", "De Angelis", "De Luca", "De Marco", "De Rosa", "De Santis", "De Simone", "De Vita", "Degl'Innocenti", "Degli Innocenti", "Dei", "Del Lungo", "Del Re", "Di Marco", "Di Stefano", "Dini", "Diop", "Dobre", "Dolfi", "Donati", "Dondoli", "Dong", "Donnini", "Ducci", "Dumitru", "Ermini", "Esposito", "Evangelisti", "Fabbri", "Fabbrini", "Fabbrizzi", "Fabbroni", "Fabbrucci", "Fabiani", "Facchini", "Faggi", "Fagioli", "Failli", "Faini", "Falciani", "Falcini", "Falcone", "Fallani", "Falorni", "Falsini", "Falugiani", "Fancelli", "Fanelli", "Fanetti", "Fanfani", "Fani", "Fantappie'", "Fantechi", "Fanti", "Fantini", "Fantoni", "Farina", "Fattori", "Favilli", "Fedi", "Fei", "Ferrante", "Ferrara", "Ferrari", "Ferraro", "Ferretti", "Ferri", "Ferrini", "Ferroni", "Fiaschi", "Fibbi", "Fiesoli", "Filippi", "Filippini", "Fini", "Fioravanti", "Fiore", "Fiorentini", "Fiorini", "Fissi", "Focardi", "Foggi", "Fontana", "Fontanelli", "Fontani", "Forconi", "Formigli", "Forte", "Forti", "Fortini", "Fossati", "Fossi", "Francalanci", "Franceschi", "Franceschini", "Franchi", "Franchini", "Franci", "Francini", "Francioni", "Franco", "Frassineti", "Frati", "Fratini", "Frilli", "Frizzi", "Frosali", "Frosini", "Frullini", "Fusco", "Fusi", "Gabbrielli", "Gabellini", "Gagliardi", "Galanti", "Galardi", "Galeotti", "Galletti", "Galli", "Gallo", "Gallori", "Gambacciani", "Gargani", "Garofalo", "Garuglieri", "Gashi", "Gasperini", "Gatti", "Gelli", "Gensini", "Gentile", "Gentili", "Geri", "Gerini", "Gheri", "Ghini", "Giachetti", "Giachi", "Giacomelli", "Gianassi", "Giani", "Giannelli", "Giannetti", "Gianni", "Giannini", "Giannoni", "Giannotti", "Giannozzi", "Gigli", "Giordano", "Giorgetti", "Giorgi", "Giovacchini", "Giovannelli", "Giovannetti", "Giovannini", "Giovannoni", "Giuliani", "Giunti", "Giuntini", "Giusti", "Gonnelli", "Goretti", "Gori", "Gradi", "Gramigni", "Grassi", "Grasso", "Graziani", "Grazzini", "Greco", "Grifoni", "Grillo", "Grimaldi", "Grossi", "Gualtieri", "Guarducci", "Guarino", "Guarnieri", "Guasti", "Guerra", "Guerri", "Guerrini", "Guidi", "Guidotti", "He", "Hoxha", "Hu", "Huang", "Iandelli", "Ignesti", "Innocenti", "Jin", "La Rosa", "Lai", "Landi", "Landini", "Lanini", "Lapi", "Lapini", "Lari", "Lascialfari", "Lastrucci", "Latini", "Lazzeri", "Lazzerini", "Lelli", "Lenzi", "Leonardi", "Leoncini", "Leone", "Leoni", "Lepri", "Li", "Liao", "Lin", "Linari", "Lippi", "Lisi", "Livi", "Lombardi", "Lombardini", "Lombardo", "Longo", "Lopez", "Lorenzi", "Lorenzini", "Lorini", "Lotti", "Lu", "Lucchesi", "Lucherini", "Lunghi", "Lupi", "Madiai", "Maestrini", "Maffei", "Maggi", "Maggini", "Magherini", "Magini", "Magnani", "Magnelli", "Magni", "Magnolfi", "Magrini", "Malavolti", "Malevolti", "Manca", "Mancini", "Manetti", "Manfredi", "Mangani", "Mannelli", "Manni", "Mannini", "Mannucci", "Manuelli", "Manzini", "Marcelli", "Marchese", "Marchetti", "Marchi", "Marchiani", "Marchionni", "Marconi", "Marcucci", "Margheri", "Mari", "Mariani", "Marilli", "Marinai", "Marinari", "Marinelli", "Marini", "Marino", "Mariotti", "Marsili", "Martelli", "Martinelli", "Martini", "Martino", "Marzi", "Masi", "Masini", "Masoni", "Massai", "Materassi", "Mattei", "Matteini", "Matteucci", "Matteuzzi", "Mattioli", "Mattolini", "Matucci", "Mauro", "Mazzanti", "Mazzei", "Mazzetti", "Mazzi", "Mazzini", "Mazzocchi", "Mazzoli", "Mazzoni", "Mazzuoli", "Meacci", "Mecocci", "Meini", "Melani", "Mele", "Meli", "Mengoni", "Menichetti", "Meoni", "Merlini", "Messeri", "Messina", "Meucci", "Miccinesi", "Miceli", "Micheli", "Michelini", "Michelozzi", "Migliori", "Migliorini", "Milani", "Miniati", "Misuri", "Monaco", "Montagnani", "Montagni", "Montanari", "Montelatici", "Monti", "Montigiani", "Montini", "Morandi", "Morandini", "Morelli", "Moretti", "Morganti", "Mori", "Morini", "Moroni", "Morozzi", "Mugnai", "Mugnaini", "Mustafa", "Naldi", "Naldini", "Nannelli", "Nanni", "Nannini", "Nannucci", "Nardi", "Nardini", "Nardoni", "Natali", "Ndiaye", "Nencetti", "Nencini", "Nencioni", "Neri", "Nesi", "Nesti", "Niccolai", "Niccoli", "Niccolini", "Nigi", "Nistri", "Nocentini", "Noferini", "Novelli", "Nucci", "Nuti", "Nutini", "Oliva", "Olivieri", "Olmi", "Orlandi", "Orlandini", "Orlando", "Orsini", "Ortolani", "Ottanelli", "Pacciani", "Pace", "Paci", "Pacini", "Pagani", "Pagano", "Paggetti", "Pagliai", "Pagni", "Pagnini", "Paladini", "Palagi", "Palchetti", "Palloni", "Palmieri", "Palumbo", "Pampaloni", "Pancani", "Pandolfi", "Pandolfini", "Panerai", "Panichi", "Paoletti", "Paoli", "Paolini", "Papi", "Papini", "Papucci", "Parenti", "Parigi", "Parisi", "Parri", "Parrini", "Pasquini", "Passeri", "Pecchioli", "Pecorini", "Pellegrini", "Pepi", "Perini", "Perrone", "Peruzzi", "Pesci", "Pestelli", "Petri", "Petrini", "Petrucci", "Pettini", "Pezzati", "Pezzatini", "Piani", "Piazza", "Piazzesi", "Piazzini", "Piccardi", "Picchi", "Piccini", "Piccioli", "Pieraccini", "Pieraccioni", "Pieralli", "Pierattini", "Pieri", "Pierini", "Pieroni", "Pietrini", "Pini", "Pinna", "Pinto", "Pinzani", "Pinzauti", "Piras", "Pisani", "Pistolesi", "Poggesi", "Poggi", "Poggiali", "Poggiolini", "Poli", "Pollastri", "Porciani", "Pozzi", "Pratellesi", "Pratesi", "Prosperi", "Pruneti", "Pucci", "Puccini", "Puccioni", "Pugi", "Pugliese", "Puliti", "Querci", "Quercioli", "Raddi", "Radu", "Raffaelli", "Ragazzini", "Ranfagni", "Ranieri", "Rastrelli", "Raugei", "Raveggi", "Renai", "Renzi", "Rettori", "Ricci", "Ricciardi", "Ridi", "Ridolfi", "Rigacci", "Righi", "Righini", "Rinaldi", "Risaliti", "Ristori", "Rizzo", "Rocchi", "Rocchini", "Rogai", "Romagnoli", "Romanelli", "Romani", "Romano", "Romei", "Romeo", "Romiti", "Romoli", "Romolini", "Rontini", "Rosati", "Roselli", "Rosi", "Rossetti", "Rossi", "Rossini", "Rovai", "Ruggeri", "Ruggiero", "Russo", "Sabatini", "Saccardi", "Sacchetti", "Sacchi", "Sacco", "Salerno", "Salimbeni", "Salucci", "Salvadori", "Salvestrini", "Salvi", "Salvini", "Sanesi", "Sani", "Sanna", "Santi", "Santini", "Santoni", "Santoro", "Santucci", "Sardi", "Sarri", "Sarti", "Sassi", "Sbolci", "Scali", "Scarpelli", "Scarselli", "Scopetani", "Secci", "Selvi", "Senatori", "Senesi", "Serafini", "Sereni", "Serra", "Sestini", "Sguanci", "Sieni", "Signorini", "Silvestri", "Simoncini", "Simonetti", "Simoni", "Singh", "Sodi", "Soldi", "Somigli", "Sorbi", "Sorelli", "Sorrentino", "Sottili", "Spina", "Spinelli", "Staccioli", "Staderini", "Stefanelli", "Stefani", "Stefanini", "Stella", "Susini", "Tacchi", "Tacconi", "Taddei", "Tagliaferri", "Tamburini", "Tanganelli", "Tani", "Tanini", "Tapinassi", "Tarchi", "Tarchiani", "Targioni", "Tassi", "Tassini", "Tempesti", "Terzani", "Tesi", "Testa", "Testi", "Tilli", "Tinti", "Tirinnanzi", "Toccafondi", "Tofanari", "Tofani", "Tognaccini", "Tonelli", "Tonini", "Torelli", "Torrini", "Tosi", "Toti", "Tozzi", "Trambusti", "Trapani", "Tucci", "Turchi", "Ugolini", "Ulivi", "Valente", "Valenti", "Valentini", "Vangelisti", "Vanni", "Vannini", "Vannoni", "Vannozzi", "Vannucchi", "Vannucci", "Ventura", "Venturi", "Venturini", "Vestri", "Vettori", "Vichi", "Viciani", "Vieri", "Vigiani", "Vignoli", "Vignolini", "Vignozzi", "Villani", "Vinci", "Visani", "Vitale", "Vitali", "Viti", "Viviani", "Vivoli", "Volpe", "Volpi", "Wang", "Wu", "Xu", "Yang", "Ye", "Zagli", "Zani", "Zanieri", "Zanobini", "Zecchi", "Zetti", "Zhang", "Zheng", "Zhou", "Zhu", "Zingoni", "Zini", "Zoppi"],
2743 // http://www.voornamelijk.nl/meest-voorkomende-achternamen-in-nederland-en-amsterdam/
2744 "nl":["Albers", "Alblas", "Appelman", "Baars", "Baas", "Bakker", "Blank", "Bleeker", "Blok", "Blom", "Boer", "Boers", "Boldewijn", "Boon", "Boot", "Bos", "Bosch", "Bosma", "Bosman", "Bouma", "Bouman", "Bouwman", "Brands", "Brouwer", "Burger", "Buijs", "Buitenhuis", "Ceder", "Cohen", "Dekker", "Dekkers", "Dijkman", "Dijkstra", "Driessen", "Drost", "Engel", "Evers", "Faber", "Franke", "Gerritsen", "Goedhart", "Goossens", "Groen", "Groenenberg", "Groot", "Haan", "Hart", "Heemskerk", "Hendriks", "Hermans", "Hoekstra", "Hofman", "Hopman", "Huisman", "Jacobs", "Jansen", "Janssen", "Jonker", "Jaspers", "Keijzer", "Klaassen", "Klein", "Koek", "Koenders", "Kok", "Kool", "Koopman", "Koopmans", "Koning", "Koster", "Kramer", "Kroon", "Kuijpers", "Kuiper", "Kuipers", "Kurt", "Koster", "Kwakman", "Los", "Lubbers", "Maas", "Markus", "Martens", "Meijer", "Mol", "Molenaar", "Mulder", "Nieuwenhuis", "Peeters", "Peters", "Pengel", "Pieters", "Pool", "Post", "Postma", "Prins", "Pronk", "Reijnders", "Rietveld", "Roest", "Roos", "Sanders", "Schaap", "Scheffer", "Schenk", "Schilder", "Schipper", "Schmidt", "Scholten", "Schouten", "Schut", "Schutte", "Schuurman", "Simons", "Smeets", "Smit", "Smits", "Snel", "Swinkels", "Tas", "Terpstra", "Timmermans", "Tol", "Tromp", "Troost", "Valk", "Veenstra", "Veldkamp", "Verbeek", "Verheul", "Verhoeven", "Vermeer", "Vermeulen", "Verweij", "Vink", "Visser", "Voorn", "Vos", "Wagenaar", "Wiersema", "Willems", "Willemsen", "Witteveen", "Wolff", "Wolters", "Zijlstra", "Zwart", "de Beer", "de Boer", "de Bruijn", "de Bruin", "de Graaf", "de Groot", "de Haan", "de Haas", "de Jager", "de Jong", "de Jonge", "de Koning", "de Lange", "de Leeuw", "de Ridder", "de Rooij", "de Ruiter", "de Vos", "de Vries", "de Waal", "de Wit", "de Zwart", "van Beek", "van Boven", "van Dam", "van Dijk", "van Dongen", "van Doorn", "van Egmond", "van Eijk", "van Es", "van Gelder", "van Gelderen", "van Houten", "van Hulst", "van Kempen", "van Kesteren", "van Leeuwen", "van Loon", "van Mill", "van Noord", "van Ommen", "van Ommeren", "van Oosten", "van Oostveen", "van Rijn", "van Schaik", "van Veen", "van Vliet", "van Wijk", "van Wijngaarden", "van den Poel", "van de Pol", "van den Ploeg", "van de Ven", "van den Berg", "van den Bosch", "van den Brink", "van den Broek", "van den Heuvel", "van der Heijden", "van der Horst", "van der Hulst", "van der Kroon", "van der Laan", "van der Linden", "van der Meer", "van der Meij", "van der Meulen", "van der Molen", "van der Sluis", "van der Spek", "van der Veen", "van der Velde", "van der Velden", "van der Vliet", "van der Wal"],
2745 // https://surnames.behindthename.com/top/lists/england-wales/1991
2746 "uk":["Smith","Jones","Williams","Taylor","Brown","Davies","Evans","Wilson","Thomas","Johnson","Roberts","Robinson","Thompson","Wright","Walker","White","Edwards","Hughes","Green","Hall","Lewis","Harris","Clarke","Patel","Jackson","Wood","Turner","Martin","Cooper","Hill","Ward","Morris","Moore","Clark","Lee","King","Baker","Harrison","Morgan","Allen","James","Scott","Phillips","Watson","Davis","Parker","Price","Bennett","Young","Griffiths","Mitchell","Kelly","Cook","Carter","Richardson","Bailey","Collins","Bell","Shaw","Murphy","Miller","Cox","Richards","Khan","Marshall","Anderson","Simpson","Ellis","Adams","Singh","Begum","Wilkinson","Foster","Chapman","Powell","Webb","Rogers","Gray","Mason","Ali","Hunt","Hussain","Campbell","Matthews","Owen","Palmer","Holmes","Mills","Barnes","Knight","Lloyd","Butler","Russell","Barker","Fisher","Stevens","Jenkins","Murray","Dixon","Harvey","Graham","Pearson","Ahmed","Fletcher","Walsh","Kaur","Gibson","Howard","Andrews","Stewart","Elliott","Reynolds","Saunders","Payne","Fox","Ford","Pearce","Day","Brooks","West","Lawrence","Cole","Atkinson","Bradley","Spencer","Gill","Dawson","Ball","Burton","O'brien","Watts","Rose","Booth","Perry","Ryan","Grant","Wells","Armstrong","Francis","Rees","Hayes","Hart","Hudson","Newman","Barrett","Webster","Hunter","Gregory","Carr","Lowe","Page","Marsh","Riley","Dunn","Woods","Parsons","Berry","Stone","Reid","Holland","Hawkins","Harding","Porter","Robertson","Newton","Oliver","Reed","Kennedy","Williamson","Bird","Gardner","Shah","Dean","Lane","Cooke","Bates","Henderson","Parry","Burgess","Bishop","Walton","Burns","Nicholson","Shepherd","Ross","Cross","Long","Freeman","Warren","Nicholls","Hamilton","Byrne","Sutton","Mcdonald","Yates","Hodgson","Robson","Curtis","Hopkins","O'connor","Harper","Coleman","Watkins","Moss","Mccarthy","Chambers","O'neill","Griffin","Sharp","Hardy","Wheeler","Potter","Osborne","Johnston","Gordon","Doyle","Wallace","George","Jordan","Hutchinson","Rowe","Burke","May","Pritchard","Gilbert","Willis","Higgins","Read","Miles","Stevenson","Stephenson","Hammond","Arnold","Buckley","Walters","Hewitt","Barber","Nelson","Slater","Austin","Sullivan","Whitehead","Mann","Frost","Lambert","Stephens","Blake","Akhtar","Lynch","Goodwin","Barton","Woodward","Thomson","Cunningham","Quinn","Barnett","Baxter","Bibi","Clayton","Nash","Greenwood","Jennings","Holt","Kemp","Poole","Gallagher","Bond","Stokes","Tucker","Davidson","Fowler","Heath","Norman","Middleton","Lawson","Banks","French","Stanley","Jarvis","Gibbs","Ferguson","Hayward","Carroll","Douglas","Dickinson","Todd","Barlow","Peters","Lucas","Knowles","Hartley","Miah","Simmons","Morton","Alexander","Field","Morrison","Norris","Townsend","Preston","Hancock","Thornton","Baldwin","Burrows","Briggs","Parkinson","Reeves","Macdonald","Lamb","Black","Abbott","Sanders","Thorpe","Holden","Tomlinson","Perkins","Ashton","Rhodes","Fuller","Howe","Bryant","Vaughan","Dale","Davey","Weston","Bartlett","Whittaker","Davison","Kent","Skinner","Birch","Morley","Daniels","Glover","Howell","Cartwright","Pugh","Humphreys","Goddard","Brennan","Wall","Kirby","Bowen","Savage","Bull","Wong","Dobson","Smart","Wilkins","Kirk","Fraser","Duffy","Hicks","Patterson","Bradshaw","Little","Archer","Warner","Waters","O'sullivan","Farrell","Brookes","Atkins","Kay","Dodd","Bentley","Flynn","John","Schofield","Short","Haynes","Wade","Butcher","Henry","Sanderson","Crawford","Sheppard","Bolton","Coates","Giles","Gould","Houghton","Gibbons","Pratt","Manning","Law","Hooper","Noble","Dyer","Rahman","Clements","Moran","Sykes","Chan","Doherty","Connolly","Joyce","Franklin","Hobbs","Coles","Herbert","Steele","Kerr","Leach","Winter","Owens","Duncan","Naylor","Fleming","Horton","Finch","Fitzgerald","Randall","Carpenter","Marsden","Browne","Garner","Pickering","Hale","Dennis","Vincent","Chadwick","Chandler","Sharpe","Nolan","Lyons","Hurst","Collier","Peacock","Howarth","Faulkner","Rice","Pollard","Welch","Norton","Gough","Sinclair","Blackburn","Bryan","Conway","Power","Cameron","Daly","Allan","Hanson","Gardiner","Boyle","Myers","Turnbull","Wallis","Mahmood","Sims","Swift","Iqbal","Pope","Brady","Chamberlain","Rowley","Tyler","Farmer","Metcalfe","Hilton","Godfrey","Holloway","Parkin","Bray","Talbot","Donnelly","Nixon","Charlton","Benson","Whitehouse","Barry","Hope","Lord","North","Storey","Connor","Potts","Bevan","Hargreaves","Mclean","Mistry","Bruce","Howells","Hyde","Parkes","Wyatt","Fry","Lees","O'donnell","Craig","Forster","Mckenzie","Humphries","Mellor","Carey","Ingram","Summers","Leonard"],
2747 // https://surnames.behindthename.com/top/lists/germany/2017
2748 "de": ["Müller","Schmidt","Schneider","Fischer","Weber","Meyer","Wagner","Becker","Schulz","Hoffmann","Schäfer","Koch","Bauer","Richter","Klein","Wolf","Schröder","Neumann","Schwarz","Zimmermann","Braun","Krüger","Hofmann","Hartmann","Lange","Schmitt","Werner","Schmitz","Krause","Meier","Lehmann","Schmid","Schulze","Maier","Köhler","Herrmann","König","Walter","Mayer","Huber","Kaiser","Fuchs","Peters","Lang","Scholz","Möller","Weiß","Jung","Hahn","Schubert","Vogel","Friedrich","Keller","Günther","Frank","Berger","Winkler","Roth","Beck","Lorenz","Baumann","Franke","Albrecht","Schuster","Simon","Ludwig","Böhm","Winter","Kraus","Martin","Schumacher","Krämer","Vogt","Stein","Jäger","Otto","Sommer","Groß","Seidel","Heinrich","Brandt","Haas","Schreiber","Graf","Schulte","Dietrich","Ziegler","Kuhn","Kühn","Pohl","Engel","Horn","Busch","Bergmann","Thomas","Voigt","Sauer","Arnold","Wolff","Pfeiffer"],
2749 // http://www.japantimes.co.jp/life/2009/10/11/lifestyle/japans-top-100-most-common-family-names/
2750 "jp": ["Sato","Suzuki","Takahashi","Tanaka","Watanabe","Ito","Yamamoto","Nakamura","Kobayashi","Kato","Yoshida","Yamada","Sasaki","Yamaguchi","Saito","Matsumoto","Inoue","Kimura","Hayashi","Shimizu","Yamazaki","Mori","Abe","Ikeda","Hashimoto","Yamashita","Ishikawa","Nakajima","Maeda","Fujita","Ogawa","Goto","Okada","Hasegawa","Murakami","Kondo","Ishii","Saito","Sakamoto","Endo","Aoki","Fujii","Nishimura","Fukuda","Ota","Miura","Fujiwara","Okamoto","Matsuda","Nakagawa","Nakano","Harada","Ono","Tamura","Takeuchi","Kaneko","Wada","Nakayama","Ishida","Ueda","Morita","Hara","Shibata","Sakai","Kudo","Yokoyama","Miyazaki","Miyamoto","Uchida","Takagi","Ando","Taniguchi","Ohno","Maruyama","Imai","Takada","Fujimoto","Takeda","Murata","Ueno","Sugiyama","Masuda","Sugawara","Hirano","Kojima","Otsuka","Chiba","Kubo","Matsui","Iwasaki","Sakurai","Kinoshita","Noguchi","Matsuo","Nomura","Kikuchi","Sano","Onishi","Sugimoto","Arai"],
2751 // http://www.lowchensaustralia.com/names/popular-spanish-names.htm
2752 "es": ["Garcia","Fernandez","Lopez","Martinez","Gonzalez","Rodriguez","Sanchez","Perez","Martin","Gomez","Ruiz","Diaz","Hernandez","Alvarez","Jimenez","Moreno","Munoz","Alonso","Romero","Navarro","Gutierrez","Torres","Dominguez","Gil","Vazquez","Blanco","Serrano","Ramos","Castro","Suarez","Sanz","Rubio","Ortega","Molina","Delgado","Ortiz","Morales","Ramirez","Marin","Iglesias","Santos","Castillo","Garrido","Calvo","Pena","Cruz","Cano","Nunez","Prieto","Diez","Lozano","Vidal","Pascual","Ferrer","Medina","Vega","Leon","Herrero","Vicente","Mendez","Guerrero","Fuentes","Campos","Nieto","Cortes","Caballero","Ibanez","Lorenzo","Pastor","Gimenez","Saez","Soler","Marquez","Carrasco","Herrera","Montero","Arias","Crespo","Flores","Andres","Aguilar","Hidalgo","Cabrera","Mora","Duran","Velasco","Rey","Pardo","Roman","Vila","Bravo","Merino","Moya","Soto","Izquierdo","Reyes","Redondo","Marcos","Carmona","Menendez"],
2753 // Data taken from https://fr.wikipedia.org/wiki/Liste_des_noms_de_famille_les_plus_courants_en_France
2754 "fr": ["Martin","Bernard","Thomas","Petit","Robert","Richard","Durand","Dubois","Moreau","Laurent","Simon","Michel","Lefèvre","Leroy","Roux","David","Bertrand","Morel","Fournier","Girard","Bonnet","Dupont","Lambert","Fontaine","Rousseau","Vincent","Müller","Lefèvre","Faure","André","Mercier","Blanc","Guérin","Boyer","Garnier","Chevalier","François","Legrand","Gauthier","Garcia","Perrin","Robin","Clément","Morin","Nicolas","Henry","Roussel","Matthieu","Gautier","Masson","Marchand","Duval","Denis","Dumont","Marie","Lemaire","Noël","Meyer","Dufour","Meunier","Brun","Blanchard","Giraud","Joly","Rivière","Lucas","Brunet","Gaillard","Barbier","Arnaud","Martínez","Gérard","Roche","Renard","Schmitt","Roy","Leroux","Colin","Vidal","Caron","Picard","Roger","Fabre","Aubert","Lemoine","Renaud","Dumas","Lacroix","Olivier","Philippe","Bourgeois","Pierre","Benoît","Rey","Leclerc","Payet","Rolland","Leclercq","Guillaume","Lecomte","López","Jean","Dupuy","Guillot","Hubert","Berger","Carpentier","Sánchez","Dupuis","Moulin","Louis","Deschamps","Huet","Vasseur","Perez","Boucher","Fleury","Royer","Klein","Jacquet","Adam","Paris","Poirier","Marty","Aubry","Guyot","Carré","Charles","Renault","Charpentier","Ménard","Maillard","Baron","Bertin","Bailly","Hervé","Schneider","Fernández","Le GallGall","Collet","Léger","Bouvier","Julien","Prévost","Millet","Perrot","Daniel","Le RouxRoux","Cousin","Germain","Breton","Besson","Langlois","Rémi","Le GoffGoff","Pelletier","Lévêque","Perrier","Leblanc","Barré","Lebrun","Marchal","Weber","Mallet","Hamon","Boulanger","Jacob","Monnier","Michaud","Rodríguez","Guichard","Gillet","Étienne","Grondin","Poulain","Tessier","Chevallier","Collin","Chauvin","Da SilvaSilva","Bouchet","Gay","Lemaître","Bénard","Maréchal","Humbert","Reynaud","Antoine","Hoarau","Perret","Barthélemy","Cordier","Pichon","Lejeune","Gilbert","Lamy","Delaunay","Pasquier","Carlier","LaporteLaporte"]
2755 },
2756
2757 // Data taken from http://geoportal.statistics.gov.uk/datasets/ons-postcode-directory-latest-centroids
2758 postcodeAreas: [{code: 'AB'}, {code: 'AL'}, {code: 'B'}, {code: 'BA'}, {code: 'BB'}, {code: 'BD'}, {code: 'BH'}, {code: 'BL'}, {code: 'BN'}, {code: 'BR'}, {code: 'BS'}, {code: 'BT'}, {code: 'CA'}, {code: 'CB'}, {code: 'CF'}, {code: 'CH'}, {code: 'CM'}, {code: 'CO'}, {code: 'CR'}, {code: 'CT'}, {code: 'CV'}, {code: 'CW'}, {code: 'DA'}, {code: 'DD'}, {code: 'DE'}, {code: 'DG'}, {code: 'DH'}, {code: 'DL'}, {code: 'DN'}, {code: 'DT'}, {code: 'DY'}, {code: 'E'}, {code: 'EC'}, {code: 'EH'}, {code: 'EN'}, {code: 'EX'}, {code: 'FK'}, {code: 'FY'}, {code: 'G'}, {code: 'GL'}, {code: 'GU'}, {code: 'GY'}, {code: 'HA'}, {code: 'HD'}, {code: 'HG'}, {code: 'HP'}, {code: 'HR'}, {code: 'HS'}, {code: 'HU'}, {code: 'HX'}, {code: 'IG'}, {code: 'IM'}, {code: 'IP'}, {code: 'IV'}, {code: 'JE'}, {code: 'KA'}, {code: 'KT'}, {code: 'KW'}, {code: 'KY'}, {code: 'L'}, {code: 'LA'}, {code: 'LD'}, {code: 'LE'}, {code: 'LL'}, {code: 'LN'}, {code: 'LS'}, {code: 'LU'}, {code: 'M'}, {code: 'ME'}, {code: 'MK'}, {code: 'ML'}, {code: 'N'}, {code: 'NE'}, {code: 'NG'}, {code: 'NN'}, {code: 'NP'}, {code: 'NR'}, {code: 'NW'}, {code: 'OL'}, {code: 'OX'}, {code: 'PA'}, {code: 'PE'}, {code: 'PH'}, {code: 'PL'}, {code: 'PO'}, {code: 'PR'}, {code: 'RG'}, {code: 'RH'}, {code: 'RM'}, {code: 'S'}, {code: 'SA'}, {code: 'SE'}, {code: 'SG'}, {code: 'SK'}, {code: 'SL'}, {code: 'SM'}, {code: 'SN'}, {code: 'SO'}, {code: 'SP'}, {code: 'SR'}, {code: 'SS'}, {code: 'ST'}, {code: 'SW'}, {code: 'SY'}, {code: 'TA'}, {code: 'TD'}, {code: 'TF'}, {code: 'TN'}, {code: 'TQ'}, {code: 'TR'}, {code: 'TS'}, {code: 'TW'}, {code: 'UB'}, {code: 'W'}, {code: 'WA'}, {code: 'WC'}, {code: 'WD'}, {code: 'WF'}, {code: 'WN'}, {code: 'WR'}, {code: 'WS'}, {code: 'WV'}, {code: 'YO'}, {code: 'ZE'}],
2759
2760 // Data taken from https://github.com/umpirsky/country-list/blob/master/data/en_US/country.json
2761 countries: [{"name":"Afghanistan","abbreviation":"AF"},{"name":"Åland Islands","abbreviation":"AX"},{"name":"Albania","abbreviation":"AL"},{"name":"Algeria","abbreviation":"DZ"},{"name":"American Samoa","abbreviation":"AS"},{"name":"Andorra","abbreviation":"AD"},{"name":"Angola","abbreviation":"AO"},{"name":"Anguilla","abbreviation":"AI"},{"name":"Antarctica","abbreviation":"AQ"},{"name":"Antigua & Barbuda","abbreviation":"AG"},{"name":"Argentina","abbreviation":"AR"},{"name":"Armenia","abbreviation":"AM"},{"name":"Aruba","abbreviation":"AW"},{"name":"Ascension Island","abbreviation":"AC"},{"name":"Australia","abbreviation":"AU"},{"name":"Austria","abbreviation":"AT"},{"name":"Azerbaijan","abbreviation":"AZ"},{"name":"Bahamas","abbreviation":"BS"},{"name":"Bahrain","abbreviation":"BH"},{"name":"Bangladesh","abbreviation":"BD"},{"name":"Barbados","abbreviation":"BB"},{"name":"Belarus","abbreviation":"BY"},{"name":"Belgium","abbreviation":"BE"},{"name":"Belize","abbreviation":"BZ"},{"name":"Benin","abbreviation":"BJ"},{"name":"Bermuda","abbreviation":"BM"},{"name":"Bhutan","abbreviation":"BT"},{"name":"Bolivia","abbreviation":"BO"},{"name":"Bosnia & Herzegovina","abbreviation":"BA"},{"name":"Botswana","abbreviation":"BW"},{"name":"Brazil","abbreviation":"BR"},{"name":"British Indian Ocean Territory","abbreviation":"IO"},{"name":"British Virgin Islands","abbreviation":"VG"},{"name":"Brunei","abbreviation":"BN"},{"name":"Bulgaria","abbreviation":"BG"},{"name":"Burkina Faso","abbreviation":"BF"},{"name":"Burundi","abbreviation":"BI"},{"name":"Cambodia","abbreviation":"KH"},{"name":"Cameroon","abbreviation":"CM"},{"name":"Canada","abbreviation":"CA"},{"name":"Canary Islands","abbreviation":"IC"},{"name":"Cape Verde","abbreviation":"CV"},{"name":"Caribbean Netherlands","abbreviation":"BQ"},{"name":"Cayman Islands","abbreviation":"KY"},{"name":"Central African Republic","abbreviation":"CF"},{"name":"Ceuta & Melilla","abbreviation":"EA"},{"name":"Chad","abbreviation":"TD"},{"name":"Chile","abbreviation":"CL"},{"name":"China","abbreviation":"CN"},{"name":"Christmas Island","abbreviation":"CX"},{"name":"Cocos (Keeling) Islands","abbreviation":"CC"},{"name":"Colombia","abbreviation":"CO"},{"name":"Comoros","abbreviation":"KM"},{"name":"Congo - Brazzaville","abbreviation":"CG"},{"name":"Congo - Kinshasa","abbreviation":"CD"},{"name":"Cook Islands","abbreviation":"CK"},{"name":"Costa Rica","abbreviation":"CR"},{"name":"Côte d'Ivoire","abbreviation":"CI"},{"name":"Croatia","abbreviation":"HR"},{"name":"Cuba","abbreviation":"CU"},{"name":"Curaçao","abbreviation":"CW"},{"name":"Cyprus","abbreviation":"CY"},{"name":"Czech Republic","abbreviation":"CZ"},{"name":"Denmark","abbreviation":"DK"},{"name":"Diego Garcia","abbreviation":"DG"},{"name":"Djibouti","abbreviation":"DJ"},{"name":"Dominica","abbreviation":"DM"},{"name":"Dominican Republic","abbreviation":"DO"},{"name":"Ecuador","abbreviation":"EC"},{"name":"Egypt","abbreviation":"EG"},{"name":"El Salvador","abbreviation":"SV"},{"name":"Equatorial Guinea","abbreviation":"GQ"},{"name":"Eritrea","abbreviation":"ER"},{"name":"Estonia","abbreviation":"EE"},{"name":"Ethiopia","abbreviation":"ET"},{"name":"Falkland Islands","abbreviation":"FK"},{"name":"Faroe Islands","abbreviation":"FO"},{"name":"Fiji","abbreviation":"FJ"},{"name":"Finland","abbreviation":"FI"},{"name":"France","abbreviation":"FR"},{"name":"French Guiana","abbreviation":"GF"},{"name":"French Polynesia","abbreviation":"PF"},{"name":"French Southern Territories","abbreviation":"TF"},{"name":"Gabon","abbreviation":"GA"},{"name":"Gambia","abbreviation":"GM"},{"name":"Georgia","abbreviation":"GE"},{"name":"Germany","abbreviation":"DE"},{"name":"Ghana","abbreviation":"GH"},{"name":"Gibraltar","abbreviation":"GI"},{"name":"Greece","abbreviation":"GR"},{"name":"Greenland","abbreviation":"GL"},{"name":"Grenada","abbreviation":"GD"},{"name":"Guadeloupe","abbreviation":"GP"},{"name":"Guam","abbreviation":"GU"},{"name":"Guatemala","abbreviation":"GT"},{"name":"Guernsey","abbreviation":"GG"},{"name":"Guinea","abbreviation":"GN"},{"name":"Guinea-Bissau","abbreviation":"GW"},{"name":"Guyana","abbreviation":"GY"},{"name":"Haiti","abbreviation":"HT"},{"name":"Honduras","abbreviation":"HN"},{"name":"Hong Kong SAR China","abbreviation":"HK"},{"name":"Hungary","abbreviation":"HU"},{"name":"Iceland","abbreviation":"IS"},{"name":"India","abbreviation":"IN"},{"name":"Indonesia","abbreviation":"ID"},{"name":"Iran","abbreviation":"IR"},{"name":"Iraq","abbreviation":"IQ"},{"name":"Ireland","abbreviation":"IE"},{"name":"Isle of Man","abbreviation":"IM"},{"name":"Israel","abbreviation":"IL"},{"name":"Italy","abbreviation":"IT"},{"name":"Jamaica","abbreviation":"JM"},{"name":"Japan","abbreviation":"JP"},{"name":"Jersey","abbreviation":"JE"},{"name":"Jordan","abbreviation":"JO"},{"name":"Kazakhstan","abbreviation":"KZ"},{"name":"Kenya","abbreviation":"KE"},{"name":"Kiribati","abbreviation":"KI"},{"name":"Kosovo","abbreviation":"XK"},{"name":"Kuwait","abbreviation":"KW"},{"name":"Kyrgyzstan","abbreviation":"KG"},{"name":"Laos","abbreviation":"LA"},{"name":"Latvia","abbreviation":"LV"},{"name":"Lebanon","abbreviation":"LB"},{"name":"Lesotho","abbreviation":"LS"},{"name":"Liberia","abbreviation":"LR"},{"name":"Libya","abbreviation":"LY"},{"name":"Liechtenstein","abbreviation":"LI"},{"name":"Lithuania","abbreviation":"LT"},{"name":"Luxembourg","abbreviation":"LU"},{"name":"Macau SAR China","abbreviation":"MO"},{"name":"Macedonia","abbreviation":"MK"},{"name":"Madagascar","abbreviation":"MG"},{"name":"Malawi","abbreviation":"MW"},{"name":"Malaysia","abbreviation":"MY"},{"name":"Maldives","abbreviation":"MV"},{"name":"Mali","abbreviation":"ML"},{"name":"Malta","abbreviation":"MT"},{"name":"Marshall Islands","abbreviation":"MH"},{"name":"Martinique","abbreviation":"MQ"},{"name":"Mauritania","abbreviation":"MR"},{"name":"Mauritius","abbreviation":"MU"},{"name":"Mayotte","abbreviation":"YT"},{"name":"Mexico","abbreviation":"MX"},{"name":"Micronesia","abbreviation":"FM"},{"name":"Moldova","abbreviation":"MD"},{"name":"Monaco","abbreviation":"MC"},{"name":"Mongolia","abbreviation":"MN"},{"name":"Montenegro","abbreviation":"ME"},{"name":"Montserrat","abbreviation":"MS"},{"name":"Morocco","abbreviation":"MA"},{"name":"Mozambique","abbreviation":"MZ"},{"name":"Myanmar (Burma)","abbreviation":"MM"},{"name":"Namibia","abbreviation":"NA"},{"name":"Nauru","abbreviation":"NR"},{"name":"Nepal","abbreviation":"NP"},{"name":"Netherlands","abbreviation":"NL"},{"name":"New Caledonia","abbreviation":"NC"},{"name":"New Zealand","abbreviation":"NZ"},{"name":"Nicaragua","abbreviation":"NI"},{"name":"Niger","abbreviation":"NE"},{"name":"Nigeria","abbreviation":"NG"},{"name":"Niue","abbreviation":"NU"},{"name":"Norfolk Island","abbreviation":"NF"},{"name":"North Korea","abbreviation":"KP"},{"name":"Northern Mariana Islands","abbreviation":"MP"},{"name":"Norway","abbreviation":"NO"},{"name":"Oman","abbreviation":"OM"},{"name":"Pakistan","abbreviation":"PK"},{"name":"Palau","abbreviation":"PW"},{"name":"Palestinian Territories","abbreviation":"PS"},{"name":"Panama","abbreviation":"PA"},{"name":"Papua New Guinea","abbreviation":"PG"},{"name":"Paraguay","abbreviation":"PY"},{"name":"Peru","abbreviation":"PE"},{"name":"Philippines","abbreviation":"PH"},{"name":"Pitcairn Islands","abbreviation":"PN"},{"name":"Poland","abbreviation":"PL"},{"name":"Portugal","abbreviation":"PT"},{"name":"Puerto Rico","abbreviation":"PR"},{"name":"Qatar","abbreviation":"QA"},{"name":"Réunion","abbreviation":"RE"},{"name":"Romania","abbreviation":"RO"},{"name":"Russia","abbreviation":"RU"},{"name":"Rwanda","abbreviation":"RW"},{"name":"Samoa","abbreviation":"WS"},{"name":"San Marino","abbreviation":"SM"},{"name":"São Tomé and Príncipe","abbreviation":"ST"},{"name":"Saudi Arabia","abbreviation":"SA"},{"name":"Senegal","abbreviation":"SN"},{"name":"Serbia","abbreviation":"RS"},{"name":"Seychelles","abbreviation":"SC"},{"name":"Sierra Leone","abbreviation":"SL"},{"name":"Singapore","abbreviation":"SG"},{"name":"Sint Maarten","abbreviation":"SX"},{"name":"Slovakia","abbreviation":"SK"},{"name":"Slovenia","abbreviation":"SI"},{"name":"Solomon Islands","abbreviation":"SB"},{"name":"Somalia","abbreviation":"SO"},{"name":"South Africa","abbreviation":"ZA"},{"name":"South Georgia & South Sandwich Islands","abbreviation":"GS"},{"name":"South Korea","abbreviation":"KR"},{"name":"South Sudan","abbreviation":"SS"},{"name":"Spain","abbreviation":"ES"},{"name":"Sri Lanka","abbreviation":"LK"},{"name":"St. Barthélemy","abbreviation":"BL"},{"name":"St. Helena","abbreviation":"SH"},{"name":"St. Kitts & Nevis","abbreviation":"KN"},{"name":"St. Lucia","abbreviation":"LC"},{"name":"St. Martin","abbreviation":"MF"},{"name":"St. Pierre & Miquelon","abbreviation":"PM"},{"name":"St. Vincent & Grenadines","abbreviation":"VC"},{"name":"Sudan","abbreviation":"SD"},{"name":"Suriname","abbreviation":"SR"},{"name":"Svalbard & Jan Mayen","abbreviation":"SJ"},{"name":"Swaziland","abbreviation":"SZ"},{"name":"Sweden","abbreviation":"SE"},{"name":"Switzerland","abbreviation":"CH"},{"name":"Syria","abbreviation":"SY"},{"name":"Taiwan","abbreviation":"TW"},{"name":"Tajikistan","abbreviation":"TJ"},{"name":"Tanzania","abbreviation":"TZ"},{"name":"Thailand","abbreviation":"TH"},{"name":"Timor-Leste","abbreviation":"TL"},{"name":"Togo","abbreviation":"TG"},{"name":"Tokelau","abbreviation":"TK"},{"name":"Tonga","abbreviation":"TO"},{"name":"Trinidad & Tobago","abbreviation":"TT"},{"name":"Tristan da Cunha","abbreviation":"TA"},{"name":"Tunisia","abbreviation":"TN"},{"name":"Turkey","abbreviation":"TR"},{"name":"Turkmenistan","abbreviation":"TM"},{"name":"Turks & Caicos Islands","abbreviation":"TC"},{"name":"Tuvalu","abbreviation":"TV"},{"name":"U.S. Outlying Islands","abbreviation":"UM"},{"name":"U.S. Virgin Islands","abbreviation":"VI"},{"name":"Uganda","abbreviation":"UG"},{"name":"Ukraine","abbreviation":"UA"},{"name":"United Arab Emirates","abbreviation":"AE"},{"name":"United Kingdom","abbreviation":"GB"},{"name":"United States","abbreviation":"US"},{"name":"Uruguay","abbreviation":"UY"},{"name":"Uzbekistan","abbreviation":"UZ"},{"name":"Vanuatu","abbreviation":"VU"},{"name":"Vatican City","abbreviation":"VA"},{"name":"Venezuela","abbreviation":"VE"},{"name":"Vietnam","abbreviation":"VN"},{"name":"Wallis & Futuna","abbreviation":"WF"},{"name":"Western Sahara","abbreviation":"EH"},{"name":"Yemen","abbreviation":"YE"},{"name":"Zambia","abbreviation":"ZM"},{"name":"Zimbabwe","abbreviation":"ZW"}],
2762
2763 counties: {
2764 // Data taken from http://www.downloadexcelfiles.com/gb_en/download-excel-file-list-counties-uk
2765 "uk": [
2766 {name: 'Bath and North East Somerset'},
2767 {name: 'Aberdeenshire'},
2768 {name: 'Anglesey'},
2769 {name: 'Angus'},
2770 {name: 'Bedford'},
2771 {name: 'Blackburn with Darwen'},
2772 {name: 'Blackpool'},
2773 {name: 'Bournemouth'},
2774 {name: 'Bracknell Forest'},
2775 {name: 'Brighton & Hove'},
2776 {name: 'Bristol'},
2777 {name: 'Buckinghamshire'},
2778 {name: 'Cambridgeshire'},
2779 {name: 'Carmarthenshire'},
2780 {name: 'Central Bedfordshire'},
2781 {name: 'Ceredigion'},
2782 {name: 'Cheshire East'},
2783 {name: 'Cheshire West and Chester'},
2784 {name: 'Clackmannanshire'},
2785 {name: 'Conwy'},
2786 {name: 'Cornwall'},
2787 {name: 'County Antrim'},
2788 {name: 'County Armagh'},
2789 {name: 'County Down'},
2790 {name: 'County Durham'},
2791 {name: 'County Fermanagh'},
2792 {name: 'County Londonderry'},
2793 {name: 'County Tyrone'},
2794 {name: 'Cumbria'},
2795 {name: 'Darlington'},
2796 {name: 'Denbighshire'},
2797 {name: 'Derby'},
2798 {name: 'Derbyshire'},
2799 {name: 'Devon'},
2800 {name: 'Dorset'},
2801 {name: 'Dumfries and Galloway'},
2802 {name: 'Dundee'},
2803 {name: 'East Lothian'},
2804 {name: 'East Riding of Yorkshire'},
2805 {name: 'East Sussex'},
2806 {name: 'Edinburgh?'},
2807 {name: 'Essex'},
2808 {name: 'Falkirk'},
2809 {name: 'Fife'},
2810 {name: 'Flintshire'},
2811 {name: 'Gloucestershire'},
2812 {name: 'Greater London'},
2813 {name: 'Greater Manchester'},
2814 {name: 'Gwent'},
2815 {name: 'Gwynedd'},
2816 {name: 'Halton'},
2817 {name: 'Hampshire'},
2818 {name: 'Hartlepool'},
2819 {name: 'Herefordshire'},
2820 {name: 'Hertfordshire'},
2821 {name: 'Highlands'},
2822 {name: 'Hull'},
2823 {name: 'Isle of Wight'},
2824 {name: 'Isles of Scilly'},
2825 {name: 'Kent'},
2826 {name: 'Lancashire'},
2827 {name: 'Leicester'},
2828 {name: 'Leicestershire'},
2829 {name: 'Lincolnshire'},
2830 {name: 'Lothian'},
2831 {name: 'Luton'},
2832 {name: 'Medway'},
2833 {name: 'Merseyside'},
2834 {name: 'Mid Glamorgan'},
2835 {name: 'Middlesbrough'},
2836 {name: 'Milton Keynes'},
2837 {name: 'Monmouthshire'},
2838 {name: 'Moray'},
2839 {name: 'Norfolk'},
2840 {name: 'North East Lincolnshire'},
2841 {name: 'North Lincolnshire'},
2842 {name: 'North Somerset'},
2843 {name: 'North Yorkshire'},
2844 {name: 'Northamptonshire'},
2845 {name: 'Northumberland'},
2846 {name: 'Nottingham'},
2847 {name: 'Nottinghamshire'},
2848 {name: 'Oxfordshire'},
2849 {name: 'Pembrokeshire'},
2850 {name: 'Perth and Kinross'},
2851 {name: 'Peterborough'},
2852 {name: 'Plymouth'},
2853 {name: 'Poole'},
2854 {name: 'Portsmouth'},
2855 {name: 'Powys'},
2856 {name: 'Reading'},
2857 {name: 'Redcar and Cleveland'},
2858 {name: 'Rutland'},
2859 {name: 'Scottish Borders'},
2860 {name: 'Shropshire'},
2861 {name: 'Slough'},
2862 {name: 'Somerset'},
2863 {name: 'South Glamorgan'},
2864 {name: 'South Gloucestershire'},
2865 {name: 'South Yorkshire'},
2866 {name: 'Southampton'},
2867 {name: 'Southend-on-Sea'},
2868 {name: 'Staffordshire'},
2869 {name: 'Stirlingshire'},
2870 {name: 'Stockton-on-Tees'},
2871 {name: 'Stoke-on-Trent'},
2872 {name: 'Strathclyde'},
2873 {name: 'Suffolk'},
2874 {name: 'Surrey'},
2875 {name: 'Swindon'},
2876 {name: 'Telford and Wrekin'},
2877 {name: 'Thurrock'},
2878 {name: 'Torbay'},
2879 {name: 'Tyne and Wear'},
2880 {name: 'Warrington'},
2881 {name: 'Warwickshire'},
2882 {name: 'West Berkshire'},
2883 {name: 'West Glamorgan'},
2884 {name: 'West Lothian'},
2885 {name: 'West Midlands'},
2886 {name: 'West Sussex'},
2887 {name: 'West Yorkshire'},
2888 {name: 'Western Isles'},
2889 {name: 'Wiltshire'},
2890 {name: 'Windsor and Maidenhead'},
2891 {name: 'Wokingham'},
2892 {name: 'Worcestershire'},
2893 {name: 'Wrexham'},
2894 {name: 'York'}]
2895 },
2896 provinces: {
2897 "ca": [
2898 {name: 'Alberta', abbreviation: 'AB'},
2899 {name: 'British Columbia', abbreviation: 'BC'},
2900 {name: 'Manitoba', abbreviation: 'MB'},
2901 {name: 'New Brunswick', abbreviation: 'NB'},
2902 {name: 'Newfoundland and Labrador', abbreviation: 'NL'},
2903 {name: 'Nova Scotia', abbreviation: 'NS'},
2904 {name: 'Ontario', abbreviation: 'ON'},
2905 {name: 'Prince Edward Island', abbreviation: 'PE'},
2906 {name: 'Quebec', abbreviation: 'QC'},
2907 {name: 'Saskatchewan', abbreviation: 'SK'},
2908
2909 // The case could be made that the following are not actually provinces
2910 // since they are technically considered "territories" however they all
2911 // look the same on an envelope!
2912 {name: 'Northwest Territories', abbreviation: 'NT'},
2913 {name: 'Nunavut', abbreviation: 'NU'},
2914 {name: 'Yukon', abbreviation: 'YT'}
2915 ],
2916 "it": [
2917 { name: "Agrigento", abbreviation: "AG", code: 84 },
2918 { name: "Alessandria", abbreviation: "AL", code: 6 },
2919 { name: "Ancona", abbreviation: "AN", code: 42 },
2920 { name: "Aosta", abbreviation: "AO", code: 7 },
2921 { name: "L'Aquila", abbreviation: "AQ", code: 66 },
2922 { name: "Arezzo", abbreviation: "AR", code: 51 },
2923 { name: "Ascoli-Piceno", abbreviation: "AP", code: 44 },
2924 { name: "Asti", abbreviation: "AT", code: 5 },
2925 { name: "Avellino", abbreviation: "AV", code: 64 },
2926 { name: "Bari", abbreviation: "BA", code: 72 },
2927 { name: "Barletta-Andria-Trani", abbreviation: "BT", code: 72 },
2928 { name: "Belluno", abbreviation: "BL", code: 25 },
2929 { name: "Benevento", abbreviation: "BN", code: 62 },
2930 { name: "Bergamo", abbreviation: "BG", code: 16 },
2931 { name: "Biella", abbreviation: "BI", code: 96 },
2932 { name: "Bologna", abbreviation: "BO", code: 37 },
2933 { name: "Bolzano", abbreviation: "BZ", code: 21 },
2934 { name: "Brescia", abbreviation: "BS", code: 17 },
2935 { name: "Brindisi", abbreviation: "BR", code: 74 },
2936 { name: "Cagliari", abbreviation: "CA", code: 92 },
2937 { name: "Caltanissetta", abbreviation: "CL", code: 85 },
2938 { name: "Campobasso", abbreviation: "CB", code: 70 },
2939 { name: "Carbonia Iglesias", abbreviation: "CI", code: 70 },
2940 { name: "Caserta", abbreviation: "CE", code: 61 },
2941 { name: "Catania", abbreviation: "CT", code: 87 },
2942 { name: "Catanzaro", abbreviation: "CZ", code: 79 },
2943 { name: "Chieti", abbreviation: "CH", code: 69 },
2944 { name: "Como", abbreviation: "CO", code: 13 },
2945 { name: "Cosenza", abbreviation: "CS", code: 78 },
2946 { name: "Cremona", abbreviation: "CR", code: 19 },
2947 { name: "Crotone", abbreviation: "KR", code: 101 },
2948 { name: "Cuneo", abbreviation: "CN", code: 4 },
2949 { name: "Enna", abbreviation: "EN", code: 86 },
2950 { name: "Fermo", abbreviation: "FM", code: 86 },
2951 { name: "Ferrara", abbreviation: "FE", code: 38 },
2952 { name: "Firenze", abbreviation: "FI", code: 48 },
2953 { name: "Foggia", abbreviation: "FG", code: 71 },
2954 { name: "Forli-Cesena", abbreviation: "FC", code: 71 },
2955 { name: "Frosinone", abbreviation: "FR", code: 60 },
2956 { name: "Genova", abbreviation: "GE", code: 10 },
2957 { name: "Gorizia", abbreviation: "GO", code: 31 },
2958 { name: "Grosseto", abbreviation: "GR", code: 53 },
2959 { name: "Imperia", abbreviation: "IM", code: 8 },
2960 { name: "Isernia", abbreviation: "IS", code: 94 },
2961 { name: "La-Spezia", abbreviation: "SP", code: 66 },
2962 { name: "Latina", abbreviation: "LT", code: 59 },
2963 { name: "Lecce", abbreviation: "LE", code: 75 },
2964 { name: "Lecco", abbreviation: "LC", code: 97 },
2965 { name: "Livorno", abbreviation: "LI", code: 49 },
2966 { name: "Lodi", abbreviation: "LO", code: 98 },
2967 { name: "Lucca", abbreviation: "LU", code: 46 },
2968 { name: "Macerata", abbreviation: "MC", code: 43 },
2969 { name: "Mantova", abbreviation: "MN", code: 20 },
2970 { name: "Massa-Carrara", abbreviation: "MS", code: 45 },
2971 { name: "Matera", abbreviation: "MT", code: 77 },
2972 { name: "Medio Campidano", abbreviation: "VS", code: 77 },
2973 { name: "Messina", abbreviation: "ME", code: 83 },
2974 { name: "Milano", abbreviation: "MI", code: 15 },
2975 { name: "Modena", abbreviation: "MO", code: 36 },
2976 { name: "Monza-Brianza", abbreviation: "MB", code: 36 },
2977 { name: "Napoli", abbreviation: "NA", code: 63 },
2978 { name: "Novara", abbreviation: "NO", code: 3 },
2979 { name: "Nuoro", abbreviation: "NU", code: 91 },
2980 { name: "Ogliastra", abbreviation: "OG", code: 91 },
2981 { name: "Olbia Tempio", abbreviation: "OT", code: 91 },
2982 { name: "Oristano", abbreviation: "OR", code: 95 },
2983 { name: "Padova", abbreviation: "PD", code: 28 },
2984 { name: "Palermo", abbreviation: "PA", code: 82 },
2985 { name: "Parma", abbreviation: "PR", code: 34 },
2986 { name: "Pavia", abbreviation: "PV", code: 18 },
2987 { name: "Perugia", abbreviation: "PG", code: 54 },
2988 { name: "Pesaro-Urbino", abbreviation: "PU", code: 41 },
2989 { name: "Pescara", abbreviation: "PE", code: 68 },
2990 { name: "Piacenza", abbreviation: "PC", code: 33 },
2991 { name: "Pisa", abbreviation: "PI", code: 50 },
2992 { name: "Pistoia", abbreviation: "PT", code: 47 },
2993 { name: "Pordenone", abbreviation: "PN", code: 93 },
2994 { name: "Potenza", abbreviation: "PZ", code: 76 },
2995 { name: "Prato", abbreviation: "PO", code: 100 },
2996 { name: "Ragusa", abbreviation: "RG", code: 88 },
2997 { name: "Ravenna", abbreviation: "RA", code: 39 },
2998 { name: "Reggio-Calabria", abbreviation: "RC", code: 35 },
2999 { name: "Reggio-Emilia", abbreviation: "RE", code: 35 },
3000 { name: "Rieti", abbreviation: "RI", code: 57 },
3001 { name: "Rimini", abbreviation: "RN", code: 99 },
3002 { name: "Roma", abbreviation: "Roma", code: 58 },
3003 { name: "Rovigo", abbreviation: "RO", code: 29 },
3004 { name: "Salerno", abbreviation: "SA", code: 65 },
3005 { name: "Sassari", abbreviation: "SS", code: 90 },
3006 { name: "Savona", abbreviation: "SV", code: 9 },
3007 { name: "Siena", abbreviation: "SI", code: 52 },
3008 { name: "Siracusa", abbreviation: "SR", code: 89 },
3009 { name: "Sondrio", abbreviation: "SO", code: 14 },
3010 { name: "Taranto", abbreviation: "TA", code: 73 },
3011 { name: "Teramo", abbreviation: "TE", code: 67 },
3012 { name: "Terni", abbreviation: "TR", code: 55 },
3013 { name: "Torino", abbreviation: "TO", code: 1 },
3014 { name: "Trapani", abbreviation: "TP", code: 81 },
3015 { name: "Trento", abbreviation: "TN", code: 22 },
3016 { name: "Treviso", abbreviation: "TV", code: 26 },
3017 { name: "Trieste", abbreviation: "TS", code: 32 },
3018 { name: "Udine", abbreviation: "UD", code: 30 },
3019 { name: "Varese", abbreviation: "VA", code: 12 },
3020 { name: "Venezia", abbreviation: "VE", code: 27 },
3021 { name: "Verbania", abbreviation: "VB", code: 27 },
3022 { name: "Vercelli", abbreviation: "VC", code: 2 },
3023 { name: "Verona", abbreviation: "VR", code: 23 },
3024 { name: "Vibo-Valentia", abbreviation: "VV", code: 102 },
3025 { name: "Vicenza", abbreviation: "VI", code: 24 },
3026 { name: "Viterbo", abbreviation: "VT", code: 56 }
3027 ]
3028 },
3029
3030 // from: https://github.com/samsargent/Useful-Autocomplete-Data/blob/master/data/nationalities.json
3031 nationalities: [
3032 {name: 'Afghan'},
3033 {name: 'Albanian'},
3034 {name: 'Algerian'},
3035 {name: 'American'},
3036 {name: 'Andorran'},
3037 {name: 'Angolan'},
3038 {name: 'Antiguans'},
3039 {name: 'Argentinean'},
3040 {name: 'Armenian'},
3041 {name: 'Australian'},
3042 {name: 'Austrian'},
3043 {name: 'Azerbaijani'},
3044 {name: 'Bahami'},
3045 {name: 'Bahraini'},
3046 {name: 'Bangladeshi'},
3047 {name: 'Barbadian'},
3048 {name: 'Barbudans'},
3049 {name: 'Batswana'},
3050 {name: 'Belarusian'},
3051 {name: 'Belgian'},
3052 {name: 'Belizean'},
3053 {name: 'Beninese'},
3054 {name: 'Bhutanese'},
3055 {name: 'Bolivian'},
3056 {name: 'Bosnian'},
3057 {name: 'Brazilian'},
3058 {name: 'British'},
3059 {name: 'Bruneian'},
3060 {name: 'Bulgarian'},
3061 {name: 'Burkinabe'},
3062 {name: 'Burmese'},
3063 {name: 'Burundian'},
3064 {name: 'Cambodian'},
3065 {name: 'Cameroonian'},
3066 {name: 'Canadian'},
3067 {name: 'Cape Verdean'},
3068 {name: 'Central African'},
3069 {name: 'Chadian'},
3070 {name: 'Chilean'},
3071 {name: 'Chinese'},
3072 {name: 'Colombian'},
3073 {name: 'Comoran'},
3074 {name: 'Congolese'},
3075 {name: 'Costa Rican'},
3076 {name: 'Croatian'},
3077 {name: 'Cuban'},
3078 {name: 'Cypriot'},
3079 {name: 'Czech'},
3080 {name: 'Danish'},
3081 {name: 'Djibouti'},
3082 {name: 'Dominican'},
3083 {name: 'Dutch'},
3084 {name: 'East Timorese'},
3085 {name: 'Ecuadorean'},
3086 {name: 'Egyptian'},
3087 {name: 'Emirian'},
3088 {name: 'Equatorial Guinean'},
3089 {name: 'Eritrean'},
3090 {name: 'Estonian'},
3091 {name: 'Ethiopian'},
3092 {name: 'Fijian'},
3093 {name: 'Filipino'},
3094 {name: 'Finnish'},
3095 {name: 'French'},
3096 {name: 'Gabonese'},
3097 {name: 'Gambian'},
3098 {name: 'Georgian'},
3099 {name: 'German'},
3100 {name: 'Ghanaian'},
3101 {name: 'Greek'},
3102 {name: 'Grenadian'},
3103 {name: 'Guatemalan'},
3104 {name: 'Guinea-Bissauan'},
3105 {name: 'Guinean'},
3106 {name: 'Guyanese'},
3107 {name: 'Haitian'},
3108 {name: 'Herzegovinian'},
3109 {name: 'Honduran'},
3110 {name: 'Hungarian'},
3111 {name: 'I-Kiribati'},
3112 {name: 'Icelander'},
3113 {name: 'Indian'},
3114 {name: 'Indonesian'},
3115 {name: 'Iranian'},
3116 {name: 'Iraqi'},
3117 {name: 'Irish'},
3118 {name: 'Israeli'},
3119 {name: 'Italian'},
3120 {name: 'Ivorian'},
3121 {name: 'Jamaican'},
3122 {name: 'Japanese'},
3123 {name: 'Jordanian'},
3124 {name: 'Kazakhstani'},
3125 {name: 'Kenyan'},
3126 {name: 'Kittian and Nevisian'},
3127 {name: 'Kuwaiti'},
3128 {name: 'Kyrgyz'},
3129 {name: 'Laotian'},
3130 {name: 'Latvian'},
3131 {name: 'Lebanese'},
3132 {name: 'Liberian'},
3133 {name: 'Libyan'},
3134 {name: 'Liechtensteiner'},
3135 {name: 'Lithuanian'},
3136 {name: 'Luxembourger'},
3137 {name: 'Macedonian'},
3138 {name: 'Malagasy'},
3139 {name: 'Malawian'},
3140 {name: 'Malaysian'},
3141 {name: 'Maldivan'},
3142 {name: 'Malian'},
3143 {name: 'Maltese'},
3144 {name: 'Marshallese'},
3145 {name: 'Mauritanian'},
3146 {name: 'Mauritian'},
3147 {name: 'Mexican'},
3148 {name: 'Micronesian'},
3149 {name: 'Moldovan'},
3150 {name: 'Monacan'},
3151 {name: 'Mongolian'},
3152 {name: 'Moroccan'},
3153 {name: 'Mosotho'},
3154 {name: 'Motswana'},
3155 {name: 'Mozambican'},
3156 {name: 'Namibian'},
3157 {name: 'Nauruan'},
3158 {name: 'Nepalese'},
3159 {name: 'New Zealander'},
3160 {name: 'Nicaraguan'},
3161 {name: 'Nigerian'},
3162 {name: 'Nigerien'},
3163 {name: 'North Korean'},
3164 {name: 'Northern Irish'},
3165 {name: 'Norwegian'},
3166 {name: 'Omani'},
3167 {name: 'Pakistani'},
3168 {name: 'Palauan'},
3169 {name: 'Panamanian'},
3170 {name: 'Papua New Guinean'},
3171 {name: 'Paraguayan'},
3172 {name: 'Peruvian'},
3173 {name: 'Polish'},
3174 {name: 'Portuguese'},
3175 {name: 'Qatari'},
3176 {name: 'Romani'},
3177 {name: 'Russian'},
3178 {name: 'Rwandan'},
3179 {name: 'Saint Lucian'},
3180 {name: 'Salvadoran'},
3181 {name: 'Samoan'},
3182 {name: 'San Marinese'},
3183 {name: 'Sao Tomean'},
3184 {name: 'Saudi'},
3185 {name: 'Scottish'},
3186 {name: 'Senegalese'},
3187 {name: 'Serbian'},
3188 {name: 'Seychellois'},
3189 {name: 'Sierra Leonean'},
3190 {name: 'Singaporean'},
3191 {name: 'Slovakian'},
3192 {name: 'Slovenian'},
3193 {name: 'Solomon Islander'},
3194 {name: 'Somali'},
3195 {name: 'South African'},
3196 {name: 'South Korean'},
3197 {name: 'Spanish'},
3198 {name: 'Sri Lankan'},
3199 {name: 'Sudanese'},
3200 {name: 'Surinamer'},
3201 {name: 'Swazi'},
3202 {name: 'Swedish'},
3203 {name: 'Swiss'},
3204 {name: 'Syrian'},
3205 {name: 'Taiwanese'},
3206 {name: 'Tajik'},
3207 {name: 'Tanzanian'},
3208 {name: 'Thai'},
3209 {name: 'Togolese'},
3210 {name: 'Tongan'},
3211 {name: 'Trinidadian or Tobagonian'},
3212 {name: 'Tunisian'},
3213 {name: 'Turkish'},
3214 {name: 'Tuvaluan'},
3215 {name: 'Ugandan'},
3216 {name: 'Ukrainian'},
3217 {name: 'Uruguaya'},
3218 {name: 'Uzbekistani'},
3219 {name: 'Venezuela'},
3220 {name: 'Vietnamese'},
3221 {name: 'Wels'},
3222 {name: 'Yemenit'},
3223 {name: 'Zambia'},
3224 {name: 'Zimbabwe'},
3225 ],
3226 // http://www.loc.gov/standards/iso639-2/php/code_list.php (ISO-639-1 codes)
3227 locale_languages: [
3228 "aa",
3229 "ab",
3230 "ae",
3231 "af",
3232 "ak",
3233 "am",
3234 "an",
3235 "ar",
3236 "as",
3237 "av",
3238 "ay",
3239 "az",
3240 "ba",
3241 "be",
3242 "bg",
3243 "bh",
3244 "bi",
3245 "bm",
3246 "bn",
3247 "bo",
3248 "br",
3249 "bs",
3250 "ca",
3251 "ce",
3252 "ch",
3253 "co",
3254 "cr",
3255 "cs",
3256 "cu",
3257 "cv",
3258 "cy",
3259 "da",
3260 "de",
3261 "dv",
3262 "dz",
3263 "ee",
3264 "el",
3265 "en",
3266 "eo",
3267 "es",
3268 "et",
3269 "eu",
3270 "fa",
3271 "ff",
3272 "fi",
3273 "fj",
3274 "fo",
3275 "fr",
3276 "fy",
3277 "ga",
3278 "gd",
3279 "gl",
3280 "gn",
3281 "gu",
3282 "gv",
3283 "ha",
3284 "he",
3285 "hi",
3286 "ho",
3287 "hr",
3288 "ht",
3289 "hu",
3290 "hy",
3291 "hz",
3292 "ia",
3293 "id",
3294 "ie",
3295 "ig",
3296 "ii",
3297 "ik",
3298 "io",
3299 "is",
3300 "it",
3301 "iu",
3302 "ja",
3303 "jv",
3304 "ka",
3305 "kg",
3306 "ki",
3307 "kj",
3308 "kk",
3309 "kl",
3310 "km",
3311 "kn",
3312 "ko",
3313 "kr",
3314 "ks",
3315 "ku",
3316 "kv",
3317 "kw",
3318 "ky",
3319 "la",
3320 "lb",
3321 "lg",
3322 "li",
3323 "ln",
3324 "lo",
3325 "lt",
3326 "lu",
3327 "lv",
3328 "mg",
3329 "mh",
3330 "mi",
3331 "mk",
3332 "ml",
3333 "mn",
3334 "mr",
3335 "ms",
3336 "mt",
3337 "my",
3338 "na",
3339 "nb",
3340 "nd",
3341 "ne",
3342 "ng",
3343 "nl",
3344 "nn",
3345 "no",
3346 "nr",
3347 "nv",
3348 "ny",
3349 "oc",
3350 "oj",
3351 "om",
3352 "or",
3353 "os",
3354 "pa",
3355 "pi",
3356 "pl",
3357 "ps",
3358 "pt",
3359 "qu",
3360 "rm",
3361 "rn",
3362 "ro",
3363 "ru",
3364 "rw",
3365 "sa",
3366 "sc",
3367 "sd",
3368 "se",
3369 "sg",
3370 "si",
3371 "sk",
3372 "sl",
3373 "sm",
3374 "sn",
3375 "so",
3376 "sq",
3377 "sr",
3378 "ss",
3379 "st",
3380 "su",
3381 "sv",
3382 "sw",
3383 "ta",
3384 "te",
3385 "tg",
3386 "th",
3387 "ti",
3388 "tk",
3389 "tl",
3390 "tn",
3391 "to",
3392 "tr",
3393 "ts",
3394 "tt",
3395 "tw",
3396 "ty",
3397 "ug",
3398 "uk",
3399 "ur",
3400 "uz",
3401 "ve",
3402 "vi",
3403 "vo",
3404 "wa",
3405 "wo",
3406 "xh",
3407 "yi",
3408 "yo",
3409 "za",
3410 "zh",
3411 "zu"
3412 ],
3413
3414 // From http://data.okfn.org/data/core/language-codes#resource-language-codes-full (IETF language tags)
3415 locale_regions: [
3416 "agq-CM",
3417 "asa-TZ",
3418 "ast-ES",
3419 "bas-CM",
3420 "bem-ZM",
3421 "bez-TZ",
3422 "brx-IN",
3423 "cgg-UG",
3424 "chr-US",
3425 "dav-KE",
3426 "dje-NE",
3427 "dsb-DE",
3428 "dua-CM",
3429 "dyo-SN",
3430 "ebu-KE",
3431 "ewo-CM",
3432 "fil-PH",
3433 "fur-IT",
3434 "gsw-CH",
3435 "gsw-FR",
3436 "gsw-LI",
3437 "guz-KE",
3438 "haw-US",
3439 "hsb-DE",
3440 "jgo-CM",
3441 "jmc-TZ",
3442 "kab-DZ",
3443 "kam-KE",
3444 "kde-TZ",
3445 "kea-CV",
3446 "khq-ML",
3447 "kkj-CM",
3448 "kln-KE",
3449 "kok-IN",
3450 "ksb-TZ",
3451 "ksf-CM",
3452 "ksh-DE",
3453 "lag-TZ",
3454 "lkt-US",
3455 "luo-KE",
3456 "luy-KE",
3457 "mas-KE",
3458 "mas-TZ",
3459 "mer-KE",
3460 "mfe-MU",
3461 "mgh-MZ",
3462 "mgo-CM",
3463 "mua-CM",
3464 "naq-NA",
3465 "nmg-CM",
3466 "nnh-CM",
3467 "nus-SD",
3468 "nyn-UG",
3469 "rof-TZ",
3470 "rwk-TZ",
3471 "sah-RU",
3472 "saq-KE",
3473 "sbp-TZ",
3474 "seh-MZ",
3475 "ses-ML",
3476 "shi-Latn",
3477 "shi-Latn-MA",
3478 "shi-Tfng",
3479 "shi-Tfng-MA",
3480 "smn-FI",
3481 "teo-KE",
3482 "teo-UG",
3483 "twq-NE",
3484 "tzm-Latn",
3485 "tzm-Latn-MA",
3486 "vai-Latn",
3487 "vai-Latn-LR",
3488 "vai-Vaii",
3489 "vai-Vaii-LR",
3490 "vun-TZ",
3491 "wae-CH",
3492 "xog-UG",
3493 "yav-CM",
3494 "zgh-MA",
3495 "af-NA",
3496 "af-ZA",
3497 "ak-GH",
3498 "am-ET",
3499 "ar-001",
3500 "ar-AE",
3501 "ar-BH",
3502 "ar-DJ",
3503 "ar-DZ",
3504 "ar-EG",
3505 "ar-EH",
3506 "ar-ER",
3507 "ar-IL",
3508 "ar-IQ",
3509 "ar-JO",
3510 "ar-KM",
3511 "ar-KW",
3512 "ar-LB",
3513 "ar-LY",
3514 "ar-MA",
3515 "ar-MR",
3516 "ar-OM",
3517 "ar-PS",
3518 "ar-QA",
3519 "ar-SA",
3520 "ar-SD",
3521 "ar-SO",
3522 "ar-SS",
3523 "ar-SY",
3524 "ar-TD",
3525 "ar-TN",
3526 "ar-YE",
3527 "as-IN",
3528 "az-Cyrl",
3529 "az-Cyrl-AZ",
3530 "az-Latn",
3531 "az-Latn-AZ",
3532 "be-BY",
3533 "bg-BG",
3534 "bm-Latn",
3535 "bm-Latn-ML",
3536 "bn-BD",
3537 "bn-IN",
3538 "bo-CN",
3539 "bo-IN",
3540 "br-FR",
3541 "bs-Cyrl",
3542 "bs-Cyrl-BA",
3543 "bs-Latn",
3544 "bs-Latn-BA",
3545 "ca-AD",
3546 "ca-ES",
3547 "ca-ES-VALENCIA",
3548 "ca-FR",
3549 "ca-IT",
3550 "cs-CZ",
3551 "cy-GB",
3552 "da-DK",
3553 "da-GL",
3554 "de-AT",
3555 "de-BE",
3556 "de-CH",
3557 "de-DE",
3558 "de-LI",
3559 "de-LU",
3560 "dz-BT",
3561 "ee-GH",
3562 "ee-TG",
3563 "el-CY",
3564 "el-GR",
3565 "en-001",
3566 "en-150",
3567 "en-AG",
3568 "en-AI",
3569 "en-AS",
3570 "en-AU",
3571 "en-BB",
3572 "en-BE",
3573 "en-BM",
3574 "en-BS",
3575 "en-BW",
3576 "en-BZ",
3577 "en-CA",
3578 "en-CC",
3579 "en-CK",
3580 "en-CM",
3581 "en-CX",
3582 "en-DG",
3583 "en-DM",
3584 "en-ER",
3585 "en-FJ",
3586 "en-FK",
3587 "en-FM",
3588 "en-GB",
3589 "en-GD",
3590 "en-GG",
3591 "en-GH",
3592 "en-GI",
3593 "en-GM",
3594 "en-GU",
3595 "en-GY",
3596 "en-HK",
3597 "en-IE",
3598 "en-IM",
3599 "en-IN",
3600 "en-IO",
3601 "en-JE",
3602 "en-JM",
3603 "en-KE",
3604 "en-KI",
3605 "en-KN",
3606 "en-KY",
3607 "en-LC",
3608 "en-LR",
3609 "en-LS",
3610 "en-MG",
3611 "en-MH",
3612 "en-MO",
3613 "en-MP",
3614 "en-MS",
3615 "en-MT",
3616 "en-MU",
3617 "en-MW",
3618 "en-MY",
3619 "en-NA",
3620 "en-NF",
3621 "en-NG",
3622 "en-NR",
3623 "en-NU",
3624 "en-NZ",
3625 "en-PG",
3626 "en-PH",
3627 "en-PK",
3628 "en-PN",
3629 "en-PR",
3630 "en-PW",
3631 "en-RW",
3632 "en-SB",
3633 "en-SC",
3634 "en-SD",
3635 "en-SG",
3636 "en-SH",
3637 "en-SL",
3638 "en-SS",
3639 "en-SX",
3640 "en-SZ",
3641 "en-TC",
3642 "en-TK",
3643 "en-TO",
3644 "en-TT",
3645 "en-TV",
3646 "en-TZ",
3647 "en-UG",
3648 "en-UM",
3649 "en-US",
3650 "en-US-POSIX",
3651 "en-VC",
3652 "en-VG",
3653 "en-VI",
3654 "en-VU",
3655 "en-WS",
3656 "en-ZA",
3657 "en-ZM",
3658 "en-ZW",
3659 "eo-001",
3660 "es-419",
3661 "es-AR",
3662 "es-BO",
3663 "es-CL",
3664 "es-CO",
3665 "es-CR",
3666 "es-CU",
3667 "es-DO",
3668 "es-EA",
3669 "es-EC",
3670 "es-ES",
3671 "es-GQ",
3672 "es-GT",
3673 "es-HN",
3674 "es-IC",
3675 "es-MX",
3676 "es-NI",
3677 "es-PA",
3678 "es-PE",
3679 "es-PH",
3680 "es-PR",
3681 "es-PY",
3682 "es-SV",
3683 "es-US",
3684 "es-UY",
3685 "es-VE",
3686 "et-EE",
3687 "eu-ES",
3688 "fa-AF",
3689 "fa-IR",
3690 "ff-CM",
3691 "ff-GN",
3692 "ff-MR",
3693 "ff-SN",
3694 "fi-FI",
3695 "fo-FO",
3696 "fr-BE",
3697 "fr-BF",
3698 "fr-BI",
3699 "fr-BJ",
3700 "fr-BL",
3701 "fr-CA",
3702 "fr-CD",
3703 "fr-CF",
3704 "fr-CG",
3705 "fr-CH",
3706 "fr-CI",
3707 "fr-CM",
3708 "fr-DJ",
3709 "fr-DZ",
3710 "fr-FR",
3711 "fr-GA",
3712 "fr-GF",
3713 "fr-GN",
3714 "fr-GP",
3715 "fr-GQ",
3716 "fr-HT",
3717 "fr-KM",
3718 "fr-LU",
3719 "fr-MA",
3720 "fr-MC",
3721 "fr-MF",
3722 "fr-MG",
3723 "fr-ML",
3724 "fr-MQ",
3725 "fr-MR",
3726 "fr-MU",
3727 "fr-NC",
3728 "fr-NE",
3729 "fr-PF",
3730 "fr-PM",
3731 "fr-RE",
3732 "fr-RW",
3733 "fr-SC",
3734 "fr-SN",
3735 "fr-SY",
3736 "fr-TD",
3737 "fr-TG",
3738 "fr-TN",
3739 "fr-VU",
3740 "fr-WF",
3741 "fr-YT",
3742 "fy-NL",
3743 "ga-IE",
3744 "gd-GB",
3745 "gl-ES",
3746 "gu-IN",
3747 "gv-IM",
3748 "ha-Latn",
3749 "ha-Latn-GH",
3750 "ha-Latn-NE",
3751 "ha-Latn-NG",
3752 "he-IL",
3753 "hi-IN",
3754 "hr-BA",
3755 "hr-HR",
3756 "hu-HU",
3757 "hy-AM",
3758 "id-ID",
3759 "ig-NG",
3760 "ii-CN",
3761 "is-IS",
3762 "it-CH",
3763 "it-IT",
3764 "it-SM",
3765 "ja-JP",
3766 "ka-GE",
3767 "ki-KE",
3768 "kk-Cyrl",
3769 "kk-Cyrl-KZ",
3770 "kl-GL",
3771 "km-KH",
3772 "kn-IN",
3773 "ko-KP",
3774 "ko-KR",
3775 "ks-Arab",
3776 "ks-Arab-IN",
3777 "kw-GB",
3778 "ky-Cyrl",
3779 "ky-Cyrl-KG",
3780 "lb-LU",
3781 "lg-UG",
3782 "ln-AO",
3783 "ln-CD",
3784 "ln-CF",
3785 "ln-CG",
3786 "lo-LA",
3787 "lt-LT",
3788 "lu-CD",
3789 "lv-LV",
3790 "mg-MG",
3791 "mk-MK",
3792 "ml-IN",
3793 "mn-Cyrl",
3794 "mn-Cyrl-MN",
3795 "mr-IN",
3796 "ms-Latn",
3797 "ms-Latn-BN",
3798 "ms-Latn-MY",
3799 "ms-Latn-SG",
3800 "mt-MT",
3801 "my-MM",
3802 "nb-NO",
3803 "nb-SJ",
3804 "nd-ZW",
3805 "ne-IN",
3806 "ne-NP",
3807 "nl-AW",
3808 "nl-BE",
3809 "nl-BQ",
3810 "nl-CW",
3811 "nl-NL",
3812 "nl-SR",
3813 "nl-SX",
3814 "nn-NO",
3815 "om-ET",
3816 "om-KE",
3817 "or-IN",
3818 "os-GE",
3819 "os-RU",
3820 "pa-Arab",
3821 "pa-Arab-PK",
3822 "pa-Guru",
3823 "pa-Guru-IN",
3824 "pl-PL",
3825 "ps-AF",
3826 "pt-AO",
3827 "pt-BR",
3828 "pt-CV",
3829 "pt-GW",
3830 "pt-MO",
3831 "pt-MZ",
3832 "pt-PT",
3833 "pt-ST",
3834 "pt-TL",
3835 "qu-BO",
3836 "qu-EC",
3837 "qu-PE",
3838 "rm-CH",
3839 "rn-BI",
3840 "ro-MD",
3841 "ro-RO",
3842 "ru-BY",
3843 "ru-KG",
3844 "ru-KZ",
3845 "ru-MD",
3846 "ru-RU",
3847 "ru-UA",
3848 "rw-RW",
3849 "se-FI",
3850 "se-NO",
3851 "se-SE",
3852 "sg-CF",
3853 "si-LK",
3854 "sk-SK",
3855 "sl-SI",
3856 "sn-ZW",
3857 "so-DJ",
3858 "so-ET",
3859 "so-KE",
3860 "so-SO",
3861 "sq-AL",
3862 "sq-MK",
3863 "sq-XK",
3864 "sr-Cyrl",
3865 "sr-Cyrl-BA",
3866 "sr-Cyrl-ME",
3867 "sr-Cyrl-RS",
3868 "sr-Cyrl-XK",
3869 "sr-Latn",
3870 "sr-Latn-BA",
3871 "sr-Latn-ME",
3872 "sr-Latn-RS",
3873 "sr-Latn-XK",
3874 "sv-AX",
3875 "sv-FI",
3876 "sv-SE",
3877 "sw-CD",
3878 "sw-KE",
3879 "sw-TZ",
3880 "sw-UG",
3881 "ta-IN",
3882 "ta-LK",
3883 "ta-MY",
3884 "ta-SG",
3885 "te-IN",
3886 "th-TH",
3887 "ti-ER",
3888 "ti-ET",
3889 "to-TO",
3890 "tr-CY",
3891 "tr-TR",
3892 "ug-Arab",
3893 "ug-Arab-CN",
3894 "uk-UA",
3895 "ur-IN",
3896 "ur-PK",
3897 "uz-Arab",
3898 "uz-Arab-AF",
3899 "uz-Cyrl",
3900 "uz-Cyrl-UZ",
3901 "uz-Latn",
3902 "uz-Latn-UZ",
3903 "vi-VN",
3904 "yi-001",
3905 "yo-BJ",
3906 "yo-NG",
3907 "zh-Hans",
3908 "zh-Hans-CN",
3909 "zh-Hans-HK",
3910 "zh-Hans-MO",
3911 "zh-Hans-SG",
3912 "zh-Hant",
3913 "zh-Hant-HK",
3914 "zh-Hant-MO",
3915 "zh-Hant-TW",
3916 "zu-ZA"
3917 ],
3918
3919 us_states_and_dc: [
3920 {name: 'Alabama', abbreviation: 'AL'},
3921 {name: 'Alaska', abbreviation: 'AK'},
3922 {name: 'Arizona', abbreviation: 'AZ'},
3923 {name: 'Arkansas', abbreviation: 'AR'},
3924 {name: 'California', abbreviation: 'CA'},
3925 {name: 'Colorado', abbreviation: 'CO'},
3926 {name: 'Connecticut', abbreviation: 'CT'},
3927 {name: 'Delaware', abbreviation: 'DE'},
3928 {name: 'District of Columbia', abbreviation: 'DC'},
3929 {name: 'Florida', abbreviation: 'FL'},
3930 {name: 'Georgia', abbreviation: 'GA'},
3931 {name: 'Hawaii', abbreviation: 'HI'},
3932 {name: 'Idaho', abbreviation: 'ID'},
3933 {name: 'Illinois', abbreviation: 'IL'},
3934 {name: 'Indiana', abbreviation: 'IN'},
3935 {name: 'Iowa', abbreviation: 'IA'},
3936 {name: 'Kansas', abbreviation: 'KS'},
3937 {name: 'Kentucky', abbreviation: 'KY'},
3938 {name: 'Louisiana', abbreviation: 'LA'},
3939 {name: 'Maine', abbreviation: 'ME'},
3940 {name: 'Maryland', abbreviation: 'MD'},
3941 {name: 'Massachusetts', abbreviation: 'MA'},
3942 {name: 'Michigan', abbreviation: 'MI'},
3943 {name: 'Minnesota', abbreviation: 'MN'},
3944 {name: 'Mississippi', abbreviation: 'MS'},
3945 {name: 'Missouri', abbreviation: 'MO'},
3946 {name: 'Montana', abbreviation: 'MT'},
3947 {name: 'Nebraska', abbreviation: 'NE'},
3948 {name: 'Nevada', abbreviation: 'NV'},
3949 {name: 'New Hampshire', abbreviation: 'NH'},
3950 {name: 'New Jersey', abbreviation: 'NJ'},
3951 {name: 'New Mexico', abbreviation: 'NM'},
3952 {name: 'New York', abbreviation: 'NY'},
3953 {name: 'North Carolina', abbreviation: 'NC'},
3954 {name: 'North Dakota', abbreviation: 'ND'},
3955 {name: 'Ohio', abbreviation: 'OH'},
3956 {name: 'Oklahoma', abbreviation: 'OK'},
3957 {name: 'Oregon', abbreviation: 'OR'},
3958 {name: 'Pennsylvania', abbreviation: 'PA'},
3959 {name: 'Rhode Island', abbreviation: 'RI'},
3960 {name: 'South Carolina', abbreviation: 'SC'},
3961 {name: 'South Dakota', abbreviation: 'SD'},
3962 {name: 'Tennessee', abbreviation: 'TN'},
3963 {name: 'Texas', abbreviation: 'TX'},
3964 {name: 'Utah', abbreviation: 'UT'},
3965 {name: 'Vermont', abbreviation: 'VT'},
3966 {name: 'Virginia', abbreviation: 'VA'},
3967 {name: 'Washington', abbreviation: 'WA'},
3968 {name: 'West Virginia', abbreviation: 'WV'},
3969 {name: 'Wisconsin', abbreviation: 'WI'},
3970 {name: 'Wyoming', abbreviation: 'WY'}
3971 ],
3972
3973 territories: [
3974 {name: 'American Samoa', abbreviation: 'AS'},
3975 {name: 'Federated States of Micronesia', abbreviation: 'FM'},
3976 {name: 'Guam', abbreviation: 'GU'},
3977 {name: 'Marshall Islands', abbreviation: 'MH'},
3978 {name: 'Northern Mariana Islands', abbreviation: 'MP'},
3979 {name: 'Puerto Rico', abbreviation: 'PR'},
3980 {name: 'Virgin Islands, U.S.', abbreviation: 'VI'}
3981 ],
3982
3983 armed_forces: [
3984 {name: 'Armed Forces Europe', abbreviation: 'AE'},
3985 {name: 'Armed Forces Pacific', abbreviation: 'AP'},
3986 {name: 'Armed Forces the Americas', abbreviation: 'AA'}
3987 ],
3988
3989 country_regions: {
3990 it: [
3991 { name: "Valle d'Aosta", abbreviation: "VDA" },
3992 { name: "Piemonte", abbreviation: "PIE" },
3993 { name: "Lombardia", abbreviation: "LOM" },
3994 { name: "Veneto", abbreviation: "VEN" },
3995 { name: "Trentino Alto Adige", abbreviation: "TAA" },
3996 { name: "Friuli Venezia Giulia", abbreviation: "FVG" },
3997 { name: "Liguria", abbreviation: "LIG" },
3998 { name: "Emilia Romagna", abbreviation: "EMR" },
3999 { name: "Toscana", abbreviation: "TOS" },
4000 { name: "Umbria", abbreviation: "UMB" },
4001 { name: "Marche", abbreviation: "MAR" },
4002 { name: "Abruzzo", abbreviation: "ABR" },
4003 { name: "Lazio", abbreviation: "LAZ" },
4004 { name: "Campania", abbreviation: "CAM" },
4005 { name: "Puglia", abbreviation: "PUG" },
4006 { name: "Basilicata", abbreviation: "BAS" },
4007 { name: "Molise", abbreviation: "MOL" },
4008 { name: "Calabria", abbreviation: "CAL" },
4009 { name: "Sicilia", abbreviation: "SIC" },
4010 { name: "Sardegna", abbreviation: "SAR" }
4011 ],
4012 mx: [
4013 { name: 'Aguascalientes', abbreviation: 'AGU' },
4014 { name: 'Baja California', abbreviation: 'BCN' },
4015 { name: 'Baja California Sur', abbreviation: 'BCS' },
4016 { name: 'Campeche', abbreviation: 'CAM' },
4017 { name: 'Chiapas', abbreviation: 'CHP' },
4018 { name: 'Chihuahua', abbreviation: 'CHH' },
4019 { name: 'Ciudad de México', abbreviation: 'DIF' },
4020 { name: 'Coahuila', abbreviation: 'COA' },
4021 { name: 'Colima', abbreviation: 'COL' },
4022 { name: 'Durango', abbreviation: 'DUR' },
4023 { name: 'Guanajuato', abbreviation: 'GUA' },
4024 { name: 'Guerrero', abbreviation: 'GRO' },
4025 { name: 'Hidalgo', abbreviation: 'HID' },
4026 { name: 'Jalisco', abbreviation: 'JAL' },
4027 { name: 'México', abbreviation: 'MEX' },
4028 { name: 'Michoacán', abbreviation: 'MIC' },
4029 { name: 'Morelos', abbreviation: 'MOR' },
4030 { name: 'Nayarit', abbreviation: 'NAY' },
4031 { name: 'Nuevo León', abbreviation: 'NLE' },
4032 { name: 'Oaxaca', abbreviation: 'OAX' },
4033 { name: 'Puebla', abbreviation: 'PUE' },
4034 { name: 'Querétaro', abbreviation: 'QUE' },
4035 { name: 'Quintana Roo', abbreviation: 'ROO' },
4036 { name: 'San Luis Potosí', abbreviation: 'SLP' },
4037 { name: 'Sinaloa', abbreviation: 'SIN' },
4038 { name: 'Sonora', abbreviation: 'SON' },
4039 { name: 'Tabasco', abbreviation: 'TAB' },
4040 { name: 'Tamaulipas', abbreviation: 'TAM' },
4041 { name: 'Tlaxcala', abbreviation: 'TLA' },
4042 { name: 'Veracruz', abbreviation: 'VER' },
4043 { name: 'Yucatán', abbreviation: 'YUC' },
4044 { name: 'Zacatecas', abbreviation: 'ZAC' }
4045 ]
4046 },
4047
4048 street_suffixes: {
4049 'us': [
4050 {name: 'Avenue', abbreviation: 'Ave'},
4051 {name: 'Boulevard', abbreviation: 'Blvd'},
4052 {name: 'Center', abbreviation: 'Ctr'},
4053 {name: 'Circle', abbreviation: 'Cir'},
4054 {name: 'Court', abbreviation: 'Ct'},
4055 {name: 'Drive', abbreviation: 'Dr'},
4056 {name: 'Extension', abbreviation: 'Ext'},
4057 {name: 'Glen', abbreviation: 'Gln'},
4058 {name: 'Grove', abbreviation: 'Grv'},
4059 {name: 'Heights', abbreviation: 'Hts'},
4060 {name: 'Highway', abbreviation: 'Hwy'},
4061 {name: 'Junction', abbreviation: 'Jct'},
4062 {name: 'Key', abbreviation: 'Key'},
4063 {name: 'Lane', abbreviation: 'Ln'},
4064 {name: 'Loop', abbreviation: 'Loop'},
4065 {name: 'Manor', abbreviation: 'Mnr'},
4066 {name: 'Mill', abbreviation: 'Mill'},
4067 {name: 'Park', abbreviation: 'Park'},
4068 {name: 'Parkway', abbreviation: 'Pkwy'},
4069 {name: 'Pass', abbreviation: 'Pass'},
4070 {name: 'Path', abbreviation: 'Path'},
4071 {name: 'Pike', abbreviation: 'Pike'},
4072 {name: 'Place', abbreviation: 'Pl'},
4073 {name: 'Plaza', abbreviation: 'Plz'},
4074 {name: 'Point', abbreviation: 'Pt'},
4075 {name: 'Ridge', abbreviation: 'Rdg'},
4076 {name: 'River', abbreviation: 'Riv'},
4077 {name: 'Road', abbreviation: 'Rd'},
4078 {name: 'Square', abbreviation: 'Sq'},
4079 {name: 'Street', abbreviation: 'St'},
4080 {name: 'Terrace', abbreviation: 'Ter'},
4081 {name: 'Trail', abbreviation: 'Trl'},
4082 {name: 'Turnpike', abbreviation: 'Tpke'},
4083 {name: 'View', abbreviation: 'Vw'},
4084 {name: 'Way', abbreviation: 'Way'}
4085 ],
4086 'it': [
4087 { name: 'Accesso', abbreviation: 'Acc.' },
4088 { name: 'Alzaia', abbreviation: 'Alz.' },
4089 { name: 'Arco', abbreviation: 'Arco' },
4090 { name: 'Archivolto', abbreviation: 'Acv.' },
4091 { name: 'Arena', abbreviation: 'Arena' },
4092 { name: 'Argine', abbreviation: 'Argine' },
4093 { name: 'Bacino', abbreviation: 'Bacino' },
4094 { name: 'Banchi', abbreviation: 'Banchi' },
4095 { name: 'Banchina', abbreviation: 'Ban.' },
4096 { name: 'Bastioni', abbreviation: 'Bas.' },
4097 { name: 'Belvedere', abbreviation: 'Belv.' },
4098 { name: 'Borgata', abbreviation: 'B.ta' },
4099 { name: 'Borgo', abbreviation: 'B.go' },
4100 { name: 'Calata', abbreviation: 'Cal.' },
4101 { name: 'Calle', abbreviation: 'Calle' },
4102 { name: 'Campiello', abbreviation: 'Cam.' },
4103 { name: 'Campo', abbreviation: 'Cam.' },
4104 { name: 'Canale', abbreviation: 'Can.' },
4105 { name: 'Carraia', abbreviation: 'Carr.' },
4106 { name: 'Cascina', abbreviation: 'Cascina' },
4107 { name: 'Case sparse', abbreviation: 'c.s.' },
4108 { name: 'Cavalcavia', abbreviation: 'Cv.' },
4109 { name: 'Circonvallazione', abbreviation: 'Cv.' },
4110 { name: 'Complanare', abbreviation: 'C.re' },
4111 { name: 'Contrada', abbreviation: 'C.da' },
4112 { name: 'Corso', abbreviation: 'C.so' },
4113 { name: 'Corte', abbreviation: 'C.te' },
4114 { name: 'Cortile', abbreviation: 'C.le' },
4115 { name: 'Diramazione', abbreviation: 'Dir.' },
4116 { name: 'Fondaco', abbreviation: 'F.co' },
4117 { name: 'Fondamenta', abbreviation: 'F.ta' },
4118 { name: 'Fondo', abbreviation: 'F.do' },
4119 { name: 'Frazione', abbreviation: 'Fr.' },
4120 { name: 'Isola', abbreviation: 'Is.' },
4121 { name: 'Largo', abbreviation: 'L.go' },
4122 { name: 'Litoranea', abbreviation: 'Lit.' },
4123 { name: 'Lungolago', abbreviation: 'L.go lago' },
4124 { name: 'Lungo Po', abbreviation: 'l.go Po' },
4125 { name: 'Molo', abbreviation: 'Molo' },
4126 { name: 'Mura', abbreviation: 'Mura' },
4127 { name: 'Passaggio privato', abbreviation: 'pass. priv.' },
4128 { name: 'Passeggiata', abbreviation: 'Pass.' },
4129 { name: 'Piazza', abbreviation: 'P.zza' },
4130 { name: 'Piazzale', abbreviation: 'P.le' },
4131 { name: 'Ponte', abbreviation: 'P.te' },
4132 { name: 'Portico', abbreviation: 'P.co' },
4133 { name: 'Rampa', abbreviation: 'Rampa' },
4134 { name: 'Regione', abbreviation: 'Reg.' },
4135 { name: 'Rione', abbreviation: 'R.ne' },
4136 { name: 'Rio', abbreviation: 'Rio' },
4137 { name: 'Ripa', abbreviation: 'Ripa' },
4138 { name: 'Riva', abbreviation: 'Riva' },
4139 { name: 'Rondò', abbreviation: 'Rondò' },
4140 { name: 'Rotonda', abbreviation: 'Rot.' },
4141 { name: 'Sagrato', abbreviation: 'Sagr.' },
4142 { name: 'Salita', abbreviation: 'Sal.' },
4143 { name: 'Scalinata', abbreviation: 'Scal.' },
4144 { name: 'Scalone', abbreviation: 'Scal.' },
4145 { name: 'Slargo', abbreviation: 'Sl.' },
4146 { name: 'Sottoportico', abbreviation: 'Sott.' },
4147 { name: 'Strada', abbreviation: 'Str.' },
4148 { name: 'Stradale', abbreviation: 'Str.le' },
4149 { name: 'Strettoia', abbreviation: 'Strett.' },
4150 { name: 'Traversa', abbreviation: 'Trav.' },
4151 { name: 'Via', abbreviation: 'V.' },
4152 { name: 'Viale', abbreviation: 'V.le' },
4153 { name: 'Vicinale', abbreviation: 'Vic.le' },
4154 { name: 'Vicolo', abbreviation: 'Vic.' }
4155 ],
4156 'uk' : [
4157 {name: 'Avenue', abbreviation: 'Ave'},
4158 {name: 'Close', abbreviation: 'Cl'},
4159 {name: 'Court', abbreviation: 'Ct'},
4160 {name: 'Crescent', abbreviation: 'Cr'},
4161 {name: 'Drive', abbreviation: 'Dr'},
4162 {name: 'Garden', abbreviation: 'Gdn'},
4163 {name: 'Gardens', abbreviation: 'Gdns'},
4164 {name: 'Green', abbreviation: 'Gn'},
4165 {name: 'Grove', abbreviation: 'Gr'},
4166 {name: 'Lane', abbreviation: 'Ln'},
4167 {name: 'Mount', abbreviation: 'Mt'},
4168 {name: 'Place', abbreviation: 'Pl'},
4169 {name: 'Park', abbreviation: 'Pk'},
4170 {name: 'Ridge', abbreviation: 'Rdg'},
4171 {name: 'Road', abbreviation: 'Rd'},
4172 {name: 'Square', abbreviation: 'Sq'},
4173 {name: 'Street', abbreviation: 'St'},
4174 {name: 'Terrace', abbreviation: 'Ter'},
4175 {name: 'Valley', abbreviation: 'Val'}
4176 ]
4177 },
4178
4179 months: [
4180 {name: 'January', short_name: 'Jan', numeric: '01', days: 31},
4181 // Not messing with leap years...
4182 {name: 'February', short_name: 'Feb', numeric: '02', days: 28},
4183 {name: 'March', short_name: 'Mar', numeric: '03', days: 31},
4184 {name: 'April', short_name: 'Apr', numeric: '04', days: 30},
4185 {name: 'May', short_name: 'May', numeric: '05', days: 31},
4186 {name: 'June', short_name: 'Jun', numeric: '06', days: 30},
4187 {name: 'July', short_name: 'Jul', numeric: '07', days: 31},
4188 {name: 'August', short_name: 'Aug', numeric: '08', days: 31},
4189 {name: 'September', short_name: 'Sep', numeric: '09', days: 30},
4190 {name: 'October', short_name: 'Oct', numeric: '10', days: 31},
4191 {name: 'November', short_name: 'Nov', numeric: '11', days: 30},
4192 {name: 'December', short_name: 'Dec', numeric: '12', days: 31}
4193 ],
4194
4195 // http://en.wikipedia.org/wiki/Bank_card_number#Issuer_identification_number_.28IIN.29
4196 cc_types: [
4197 {name: "American Express", short_name: 'amex', prefix: '34', length: 15},
4198 {name: "Bankcard", short_name: 'bankcard', prefix: '5610', length: 16},
4199 {name: "China UnionPay", short_name: 'chinaunion', prefix: '62', length: 16},
4200 {name: "Diners Club Carte Blanche", short_name: 'dccarte', prefix: '300', length: 14},
4201 {name: "Diners Club enRoute", short_name: 'dcenroute', prefix: '2014', length: 15},
4202 {name: "Diners Club International", short_name: 'dcintl', prefix: '36', length: 14},
4203 {name: "Diners Club United States & Canada", short_name: 'dcusc', prefix: '54', length: 16},
4204 {name: "Discover Card", short_name: 'discover', prefix: '6011', length: 16},
4205 {name: "InstaPayment", short_name: 'instapay', prefix: '637', length: 16},
4206 {name: "JCB", short_name: 'jcb', prefix: '3528', length: 16},
4207 {name: "Laser", short_name: 'laser', prefix: '6304', length: 16},
4208 {name: "Maestro", short_name: 'maestro', prefix: '5018', length: 16},
4209 {name: "Mastercard", short_name: 'mc', prefix: '51', length: 16},
4210 {name: "Solo", short_name: 'solo', prefix: '6334', length: 16},
4211 {name: "Switch", short_name: 'switch', prefix: '4903', length: 16},
4212 {name: "Visa", short_name: 'visa', prefix: '4', length: 16},
4213 {name: "Visa Electron", short_name: 'electron', prefix: '4026', length: 16}
4214 ],
4215
4216 //return all world currency by ISO 4217
4217 currency_types: [
4218 {'code' : 'AED', 'name' : 'United Arab Emirates Dirham'},
4219 {'code' : 'AFN', 'name' : 'Afghanistan Afghani'},
4220 {'code' : 'ALL', 'name' : 'Albania Lek'},
4221 {'code' : 'AMD', 'name' : 'Armenia Dram'},
4222 {'code' : 'ANG', 'name' : 'Netherlands Antilles Guilder'},
4223 {'code' : 'AOA', 'name' : 'Angola Kwanza'},
4224 {'code' : 'ARS', 'name' : 'Argentina Peso'},
4225 {'code' : 'AUD', 'name' : 'Australia Dollar'},
4226 {'code' : 'AWG', 'name' : 'Aruba Guilder'},
4227 {'code' : 'AZN', 'name' : 'Azerbaijan New Manat'},
4228 {'code' : 'BAM', 'name' : 'Bosnia and Herzegovina Convertible Marka'},
4229 {'code' : 'BBD', 'name' : 'Barbados Dollar'},
4230 {'code' : 'BDT', 'name' : 'Bangladesh Taka'},
4231 {'code' : 'BGN', 'name' : 'Bulgaria Lev'},
4232 {'code' : 'BHD', 'name' : 'Bahrain Dinar'},
4233 {'code' : 'BIF', 'name' : 'Burundi Franc'},
4234 {'code' : 'BMD', 'name' : 'Bermuda Dollar'},
4235 {'code' : 'BND', 'name' : 'Brunei Darussalam Dollar'},
4236 {'code' : 'BOB', 'name' : 'Bolivia Boliviano'},
4237 {'code' : 'BRL', 'name' : 'Brazil Real'},
4238 {'code' : 'BSD', 'name' : 'Bahamas Dollar'},
4239 {'code' : 'BTN', 'name' : 'Bhutan Ngultrum'},
4240 {'code' : 'BWP', 'name' : 'Botswana Pula'},
4241 {'code' : 'BYR', 'name' : 'Belarus Ruble'},
4242 {'code' : 'BZD', 'name' : 'Belize Dollar'},
4243 {'code' : 'CAD', 'name' : 'Canada Dollar'},
4244 {'code' : 'CDF', 'name' : 'Congo/Kinshasa Franc'},
4245 {'code' : 'CHF', 'name' : 'Switzerland Franc'},
4246 {'code' : 'CLP', 'name' : 'Chile Peso'},
4247 {'code' : 'CNY', 'name' : 'China Yuan Renminbi'},
4248 {'code' : 'COP', 'name' : 'Colombia Peso'},
4249 {'code' : 'CRC', 'name' : 'Costa Rica Colon'},
4250 {'code' : 'CUC', 'name' : 'Cuba Convertible Peso'},
4251 {'code' : 'CUP', 'name' : 'Cuba Peso'},
4252 {'code' : 'CVE', 'name' : 'Cape Verde Escudo'},
4253 {'code' : 'CZK', 'name' : 'Czech Republic Koruna'},
4254 {'code' : 'DJF', 'name' : 'Djibouti Franc'},
4255 {'code' : 'DKK', 'name' : 'Denmark Krone'},
4256 {'code' : 'DOP', 'name' : 'Dominican Republic Peso'},
4257 {'code' : 'DZD', 'name' : 'Algeria Dinar'},
4258 {'code' : 'EGP', 'name' : 'Egypt Pound'},
4259 {'code' : 'ERN', 'name' : 'Eritrea Nakfa'},
4260 {'code' : 'ETB', 'name' : 'Ethiopia Birr'},
4261 {'code' : 'EUR', 'name' : 'Euro Member Countries'},
4262 {'code' : 'FJD', 'name' : 'Fiji Dollar'},
4263 {'code' : 'FKP', 'name' : 'Falkland Islands (Malvinas) Pound'},
4264 {'code' : 'GBP', 'name' : 'United Kingdom Pound'},
4265 {'code' : 'GEL', 'name' : 'Georgia Lari'},
4266 {'code' : 'GGP', 'name' : 'Guernsey Pound'},
4267 {'code' : 'GHS', 'name' : 'Ghana Cedi'},
4268 {'code' : 'GIP', 'name' : 'Gibraltar Pound'},
4269 {'code' : 'GMD', 'name' : 'Gambia Dalasi'},
4270 {'code' : 'GNF', 'name' : 'Guinea Franc'},
4271 {'code' : 'GTQ', 'name' : 'Guatemala Quetzal'},
4272 {'code' : 'GYD', 'name' : 'Guyana Dollar'},
4273 {'code' : 'HKD', 'name' : 'Hong Kong Dollar'},
4274 {'code' : 'HNL', 'name' : 'Honduras Lempira'},
4275 {'code' : 'HRK', 'name' : 'Croatia Kuna'},
4276 {'code' : 'HTG', 'name' : 'Haiti Gourde'},
4277 {'code' : 'HUF', 'name' : 'Hungary Forint'},
4278 {'code' : 'IDR', 'name' : 'Indonesia Rupiah'},
4279 {'code' : 'ILS', 'name' : 'Israel Shekel'},
4280 {'code' : 'IMP', 'name' : 'Isle of Man Pound'},
4281 {'code' : 'INR', 'name' : 'India Rupee'},
4282 {'code' : 'IQD', 'name' : 'Iraq Dinar'},
4283 {'code' : 'IRR', 'name' : 'Iran Rial'},
4284 {'code' : 'ISK', 'name' : 'Iceland Krona'},
4285 {'code' : 'JEP', 'name' : 'Jersey Pound'},
4286 {'code' : 'JMD', 'name' : 'Jamaica Dollar'},
4287 {'code' : 'JOD', 'name' : 'Jordan Dinar'},
4288 {'code' : 'JPY', 'name' : 'Japan Yen'},
4289 {'code' : 'KES', 'name' : 'Kenya Shilling'},
4290 {'code' : 'KGS', 'name' : 'Kyrgyzstan Som'},
4291 {'code' : 'KHR', 'name' : 'Cambodia Riel'},
4292 {'code' : 'KMF', 'name' : 'Comoros Franc'},
4293 {'code' : 'KPW', 'name' : 'Korea (North) Won'},
4294 {'code' : 'KRW', 'name' : 'Korea (South) Won'},
4295 {'code' : 'KWD', 'name' : 'Kuwait Dinar'},
4296 {'code' : 'KYD', 'name' : 'Cayman Islands Dollar'},
4297 {'code' : 'KZT', 'name' : 'Kazakhstan Tenge'},
4298 {'code' : 'LAK', 'name' : 'Laos Kip'},
4299 {'code' : 'LBP', 'name' : 'Lebanon Pound'},
4300 {'code' : 'LKR', 'name' : 'Sri Lanka Rupee'},
4301 {'code' : 'LRD', 'name' : 'Liberia Dollar'},
4302 {'code' : 'LSL', 'name' : 'Lesotho Loti'},
4303 {'code' : 'LTL', 'name' : 'Lithuania Litas'},
4304 {'code' : 'LYD', 'name' : 'Libya Dinar'},
4305 {'code' : 'MAD', 'name' : 'Morocco Dirham'},
4306 {'code' : 'MDL', 'name' : 'Moldova Leu'},
4307 {'code' : 'MGA', 'name' : 'Madagascar Ariary'},
4308 {'code' : 'MKD', 'name' : 'Macedonia Denar'},
4309 {'code' : 'MMK', 'name' : 'Myanmar (Burma) Kyat'},
4310 {'code' : 'MNT', 'name' : 'Mongolia Tughrik'},
4311 {'code' : 'MOP', 'name' : 'Macau Pataca'},
4312 {'code' : 'MRO', 'name' : 'Mauritania Ouguiya'},
4313 {'code' : 'MUR', 'name' : 'Mauritius Rupee'},
4314 {'code' : 'MVR', 'name' : 'Maldives (Maldive Islands) Rufiyaa'},
4315 {'code' : 'MWK', 'name' : 'Malawi Kwacha'},
4316 {'code' : 'MXN', 'name' : 'Mexico Peso'},
4317 {'code' : 'MYR', 'name' : 'Malaysia Ringgit'},
4318 {'code' : 'MZN', 'name' : 'Mozambique Metical'},
4319 {'code' : 'NAD', 'name' : 'Namibia Dollar'},
4320 {'code' : 'NGN', 'name' : 'Nigeria Naira'},
4321 {'code' : 'NIO', 'name' : 'Nicaragua Cordoba'},
4322 {'code' : 'NOK', 'name' : 'Norway Krone'},
4323 {'code' : 'NPR', 'name' : 'Nepal Rupee'},
4324 {'code' : 'NZD', 'name' : 'New Zealand Dollar'},
4325 {'code' : 'OMR', 'name' : 'Oman Rial'},
4326 {'code' : 'PAB', 'name' : 'Panama Balboa'},
4327 {'code' : 'PEN', 'name' : 'Peru Nuevo Sol'},
4328 {'code' : 'PGK', 'name' : 'Papua New Guinea Kina'},
4329 {'code' : 'PHP', 'name' : 'Philippines Peso'},
4330 {'code' : 'PKR', 'name' : 'Pakistan Rupee'},
4331 {'code' : 'PLN', 'name' : 'Poland Zloty'},
4332 {'code' : 'PYG', 'name' : 'Paraguay Guarani'},
4333 {'code' : 'QAR', 'name' : 'Qatar Riyal'},
4334 {'code' : 'RON', 'name' : 'Romania New Leu'},
4335 {'code' : 'RSD', 'name' : 'Serbia Dinar'},
4336 {'code' : 'RUB', 'name' : 'Russia Ruble'},
4337 {'code' : 'RWF', 'name' : 'Rwanda Franc'},
4338 {'code' : 'SAR', 'name' : 'Saudi Arabia Riyal'},
4339 {'code' : 'SBD', 'name' : 'Solomon Islands Dollar'},
4340 {'code' : 'SCR', 'name' : 'Seychelles Rupee'},
4341 {'code' : 'SDG', 'name' : 'Sudan Pound'},
4342 {'code' : 'SEK', 'name' : 'Sweden Krona'},
4343 {'code' : 'SGD', 'name' : 'Singapore Dollar'},
4344 {'code' : 'SHP', 'name' : 'Saint Helena Pound'},
4345 {'code' : 'SLL', 'name' : 'Sierra Leone Leone'},
4346 {'code' : 'SOS', 'name' : 'Somalia Shilling'},
4347 {'code' : 'SPL', 'name' : 'Seborga Luigino'},
4348 {'code' : 'SRD', 'name' : 'Suriname Dollar'},
4349 {'code' : 'STD', 'name' : 'São Tomé and Príncipe Dobra'},
4350 {'code' : 'SVC', 'name' : 'El Salvador Colon'},
4351 {'code' : 'SYP', 'name' : 'Syria Pound'},
4352 {'code' : 'SZL', 'name' : 'Swaziland Lilangeni'},
4353 {'code' : 'THB', 'name' : 'Thailand Baht'},
4354 {'code' : 'TJS', 'name' : 'Tajikistan Somoni'},
4355 {'code' : 'TMT', 'name' : 'Turkmenistan Manat'},
4356 {'code' : 'TND', 'name' : 'Tunisia Dinar'},
4357 {'code' : 'TOP', 'name' : 'Tonga Pa\'anga'},
4358 {'code' : 'TRY', 'name' : 'Turkey Lira'},
4359 {'code' : 'TTD', 'name' : 'Trinidad and Tobago Dollar'},
4360 {'code' : 'TVD', 'name' : 'Tuvalu Dollar'},
4361 {'code' : 'TWD', 'name' : 'Taiwan New Dollar'},
4362 {'code' : 'TZS', 'name' : 'Tanzania Shilling'},
4363 {'code' : 'UAH', 'name' : 'Ukraine Hryvnia'},
4364 {'code' : 'UGX', 'name' : 'Uganda Shilling'},
4365 {'code' : 'USD', 'name' : 'United States Dollar'},
4366 {'code' : 'UYU', 'name' : 'Uruguay Peso'},
4367 {'code' : 'UZS', 'name' : 'Uzbekistan Som'},
4368 {'code' : 'VEF', 'name' : 'Venezuela Bolivar'},
4369 {'code' : 'VND', 'name' : 'Viet Nam Dong'},
4370 {'code' : 'VUV', 'name' : 'Vanuatu Vatu'},
4371 {'code' : 'WST', 'name' : 'Samoa Tala'},
4372 {'code' : 'XAF', 'name' : 'Communauté Financière Africaine (BEAC) CFA Franc BEAC'},
4373 {'code' : 'XCD', 'name' : 'East Caribbean Dollar'},
4374 {'code' : 'XDR', 'name' : 'International Monetary Fund (IMF) Special Drawing Rights'},
4375 {'code' : 'XOF', 'name' : 'Communauté Financière Africaine (BCEAO) Franc'},
4376 {'code' : 'XPF', 'name' : 'Comptoirs Français du Pacifique (CFP) Franc'},
4377 {'code' : 'YER', 'name' : 'Yemen Rial'},
4378 {'code' : 'ZAR', 'name' : 'South Africa Rand'},
4379 {'code' : 'ZMW', 'name' : 'Zambia Kwacha'},
4380 {'code' : 'ZWD', 'name' : 'Zimbabwe Dollar'}
4381 ],
4382
4383 // return the names of all valide colors
4384 colorNames : [ "AliceBlue", "Black", "Navy", "DarkBlue", "MediumBlue", "Blue", "DarkGreen", "Green", "Teal", "DarkCyan", "DeepSkyBlue", "DarkTurquoise", "MediumSpringGreen", "Lime", "SpringGreen",
4385 "Aqua", "Cyan", "MidnightBlue", "DodgerBlue", "LightSeaGreen", "ForestGreen", "SeaGreen", "DarkSlateGray", "LimeGreen", "MediumSeaGreen", "Turquoise", "RoyalBlue", "SteelBlue", "DarkSlateBlue", "MediumTurquoise",
4386 "Indigo", "DarkOliveGreen", "CadetBlue", "CornflowerBlue", "RebeccaPurple", "MediumAquaMarine", "DimGray", "SlateBlue", "OliveDrab", "SlateGray", "LightSlateGray", "MediumSlateBlue", "LawnGreen", "Chartreuse",
4387 "Aquamarine", "Maroon", "Purple", "Olive", "Gray", "SkyBlue", "LightSkyBlue", "BlueViolet", "DarkRed", "DarkMagenta", "SaddleBrown", "Ivory", "White",
4388 "DarkSeaGreen", "LightGreen", "MediumPurple", "DarkViolet", "PaleGreen", "DarkOrchid", "YellowGreen", "Sienna", "Brown", "DarkGray", "LightBlue", "GreenYellow", "PaleTurquoise", "LightSteelBlue", "PowderBlue",
4389 "FireBrick", "DarkGoldenRod", "MediumOrchid", "RosyBrown", "DarkKhaki", "Silver", "MediumVioletRed", "IndianRed", "Peru", "Chocolate", "Tan", "LightGray", "Thistle", "Orchid", "GoldenRod", "PaleVioletRed",
4390 "Crimson", "Gainsboro", "Plum", "BurlyWood", "LightCyan", "Lavender", "DarkSalmon", "Violet", "PaleGoldenRod", "LightCoral", "Khaki", "AliceBlue", "HoneyDew", "Azure", "SandyBrown", "Wheat", "Beige", "WhiteSmoke",
4391 "MintCream", "GhostWhite", "Salmon", "AntiqueWhite", "Linen", "LightGoldenRodYellow", "OldLace", "Red", "Fuchsia", "Magenta", "DeepPink", "OrangeRed", "Tomato", "HotPink", "Coral", "DarkOrange", "LightSalmon", "Orange",
4392 "LightPink", "Pink", "Gold", "PeachPuff", "NavajoWhite", "Moccasin", "Bisque", "MistyRose", "BlanchedAlmond", "PapayaWhip", "LavenderBlush", "SeaShell", "Cornsilk", "LemonChiffon", "FloralWhite", "Snow", "Yellow", "LightYellow"
4393 ],
4394
4395 // Data taken from https://www.sec.gov/rules/other/4-460list.htm
4396 company: [ "3Com Corp",
4397 "3M Company",
4398 "A.G. Edwards Inc.",
4399 "Abbott Laboratories",
4400 "Abercrombie & Fitch Co.",
4401 "ABM Industries Incorporated",
4402 "Ace Hardware Corporation",
4403 "ACT Manufacturing Inc.",
4404 "Acterna Corp.",
4405 "Adams Resources & Energy, Inc.",
4406 "ADC Telecommunications, Inc.",
4407 "Adelphia Communications Corporation",
4408 "Administaff, Inc.",
4409 "Adobe Systems Incorporated",
4410 "Adolph Coors Company",
4411 "Advance Auto Parts, Inc.",
4412 "Advanced Micro Devices, Inc.",
4413 "AdvancePCS, Inc.",
4414 "Advantica Restaurant Group, Inc.",
4415 "The AES Corporation",
4416 "Aetna Inc.",
4417 "Affiliated Computer Services, Inc.",
4418 "AFLAC Incorporated",
4419 "AGCO Corporation",
4420 "Agilent Technologies, Inc.",
4421 "Agway Inc.",
4422 "Apartment Investment and Management Company",
4423 "Air Products and Chemicals, Inc.",
4424 "Airborne, Inc.",
4425 "Airgas, Inc.",
4426 "AK Steel Holding Corporation",
4427 "Alaska Air Group, Inc.",
4428 "Alberto-Culver Company",
4429 "Albertson's, Inc.",
4430 "Alcoa Inc.",
4431 "Alleghany Corporation",
4432 "Allegheny Energy, Inc.",
4433 "Allegheny Technologies Incorporated",
4434 "Allergan, Inc.",
4435 "ALLETE, Inc.",
4436 "Alliant Energy Corporation",
4437 "Allied Waste Industries, Inc.",
4438 "Allmerica Financial Corporation",
4439 "The Allstate Corporation",
4440 "ALLTEL Corporation",
4441 "The Alpine Group, Inc.",
4442 "Amazon.com, Inc.",
4443 "AMC Entertainment Inc.",
4444 "American Power Conversion Corporation",
4445 "Amerada Hess Corporation",
4446 "AMERCO",
4447 "Ameren Corporation",
4448 "America West Holdings Corporation",
4449 "American Axle & Manufacturing Holdings, Inc.",
4450 "American Eagle Outfitters, Inc.",
4451 "American Electric Power Company, Inc.",
4452 "American Express Company",
4453 "American Financial Group, Inc.",
4454 "American Greetings Corporation",
4455 "American International Group, Inc.",
4456 "American Standard Companies Inc.",
4457 "American Water Works Company, Inc.",
4458 "AmerisourceBergen Corporation",
4459 "Ames Department Stores, Inc.",
4460 "Amgen Inc.",
4461 "Amkor Technology, Inc.",
4462 "AMR Corporation",
4463 "AmSouth Bancorp.",
4464 "Amtran, Inc.",
4465 "Anadarko Petroleum Corporation",
4466 "Analog Devices, Inc.",
4467 "Anheuser-Busch Companies, Inc.",
4468 "Anixter International Inc.",
4469 "AnnTaylor Inc.",
4470 "Anthem, Inc.",
4471 "AOL Time Warner Inc.",
4472 "Aon Corporation",
4473 "Apache Corporation",
4474 "Apple Computer, Inc.",
4475 "Applera Corporation",
4476 "Applied Industrial Technologies, Inc.",
4477 "Applied Materials, Inc.",
4478 "Aquila, Inc.",
4479 "ARAMARK Corporation",
4480 "Arch Coal, Inc.",
4481 "Archer Daniels Midland Company",
4482 "Arkansas Best Corporation",
4483 "Armstrong Holdings, Inc.",
4484 "Arrow Electronics, Inc.",
4485 "ArvinMeritor, Inc.",
4486 "Ashland Inc.",
4487 "Astoria Financial Corporation",
4488 "AT&T Corp.",
4489 "Atmel Corporation",
4490 "Atmos Energy Corporation",
4491 "Audiovox Corporation",
4492 "Autoliv, Inc.",
4493 "Automatic Data Processing, Inc.",
4494 "AutoNation, Inc.",
4495 "AutoZone, Inc.",
4496 "Avaya Inc.",
4497 "Avery Dennison Corporation",
4498 "Avista Corporation",
4499 "Avnet, Inc.",
4500 "Avon Products, Inc.",
4501 "Baker Hughes Incorporated",
4502 "Ball Corporation",
4503 "Bank of America Corporation",
4504 "The Bank of New York Company, Inc.",
4505 "Bank One Corporation",
4506 "Banknorth Group, Inc.",
4507 "Banta Corporation",
4508 "Barnes & Noble, Inc.",
4509 "Bausch & Lomb Incorporated",
4510 "Baxter International Inc.",
4511 "BB&T Corporation",
4512 "The Bear Stearns Companies Inc.",
4513 "Beazer Homes USA, Inc.",
4514 "Beckman Coulter, Inc.",
4515 "Becton, Dickinson and Company",
4516 "Bed Bath & Beyond Inc.",
4517 "Belk, Inc.",
4518 "Bell Microproducts Inc.",
4519 "BellSouth Corporation",
4520 "Belo Corp.",
4521 "Bemis Company, Inc.",
4522 "Benchmark Electronics, Inc.",
4523 "Berkshire Hathaway Inc.",
4524 "Best Buy Co., Inc.",
4525 "Bethlehem Steel Corporation",
4526 "Beverly Enterprises, Inc.",
4527 "Big Lots, Inc.",
4528 "BJ Services Company",
4529 "BJ's Wholesale Club, Inc.",
4530 "The Black & Decker Corporation",
4531 "Black Hills Corporation",
4532 "BMC Software, Inc.",
4533 "The Boeing Company",
4534 "Boise Cascade Corporation",
4535 "Borders Group, Inc.",
4536 "BorgWarner Inc.",
4537 "Boston Scientific Corporation",
4538 "Bowater Incorporated",
4539 "Briggs & Stratton Corporation",
4540 "Brightpoint, Inc.",
4541 "Brinker International, Inc.",
4542 "Bristol-Myers Squibb Company",
4543 "Broadwing, Inc.",
4544 "Brown Shoe Company, Inc.",
4545 "Brown-Forman Corporation",
4546 "Brunswick Corporation",
4547 "Budget Group, Inc.",
4548 "Burlington Coat Factory Warehouse Corporation",
4549 "Burlington Industries, Inc.",
4550 "Burlington Northern Santa Fe Corporation",
4551 "Burlington Resources Inc.",
4552 "C. H. Robinson Worldwide Inc.",
4553 "Cablevision Systems Corp",
4554 "Cabot Corp",
4555 "Cadence Design Systems, Inc.",
4556 "Calpine Corp.",
4557 "Campbell Soup Co.",
4558 "Capital One Financial Corp.",
4559 "Cardinal Health Inc.",
4560 "Caremark Rx Inc.",
4561 "Carlisle Cos. Inc.",
4562 "Carpenter Technology Corp.",
4563 "Casey's General Stores Inc.",
4564 "Caterpillar Inc.",
4565 "CBRL Group Inc.",
4566 "CDI Corp.",
4567 "CDW Computer Centers Inc.",
4568 "CellStar Corp.",
4569 "Cendant Corp",
4570 "Cenex Harvest States Cooperatives",
4571 "Centex Corp.",
4572 "CenturyTel Inc.",
4573 "Ceridian Corp.",
4574 "CH2M Hill Cos. Ltd.",
4575 "Champion Enterprises Inc.",
4576 "Charles Schwab Corp.",
4577 "Charming Shoppes Inc.",
4578 "Charter Communications Inc.",
4579 "Charter One Financial Inc.",
4580 "ChevronTexaco Corp.",
4581 "Chiquita Brands International Inc.",
4582 "Chubb Corp",
4583 "Ciena Corp.",
4584 "Cigna Corp",
4585 "Cincinnati Financial Corp.",
4586 "Cinergy Corp.",
4587 "Cintas Corp.",
4588 "Circuit City Stores Inc.",
4589 "Cisco Systems Inc.",
4590 "Citigroup, Inc",
4591 "Citizens Communications Co.",
4592 "CKE Restaurants Inc.",
4593 "Clear Channel Communications Inc.",
4594 "The Clorox Co.",
4595 "CMGI Inc.",
4596 "CMS Energy Corp.",
4597 "CNF Inc.",
4598 "Coca-Cola Co.",
4599 "Coca-Cola Enterprises Inc.",
4600 "Colgate-Palmolive Co.",
4601 "Collins & Aikman Corp.",
4602 "Comcast Corp.",
4603 "Comdisco Inc.",
4604 "Comerica Inc.",
4605 "Comfort Systems USA Inc.",
4606 "Commercial Metals Co.",
4607 "Community Health Systems Inc.",
4608 "Compass Bancshares Inc",
4609 "Computer Associates International Inc.",
4610 "Computer Sciences Corp.",
4611 "Compuware Corp.",
4612 "Comverse Technology Inc.",
4613 "ConAgra Foods Inc.",
4614 "Concord EFS Inc.",
4615 "Conectiv, Inc",
4616 "Conoco Inc",
4617 "Conseco Inc.",
4618 "Consolidated Freightways Corp.",
4619 "Consolidated Edison Inc.",
4620 "Constellation Brands Inc.",
4621 "Constellation Emergy Group Inc.",
4622 "Continental Airlines Inc.",
4623 "Convergys Corp.",
4624 "Cooper Cameron Corp.",
4625 "Cooper Industries Ltd.",
4626 "Cooper Tire & Rubber Co.",
4627 "Corn Products International Inc.",
4628 "Corning Inc.",
4629 "Costco Wholesale Corp.",
4630 "Countrywide Credit Industries Inc.",
4631 "Coventry Health Care Inc.",
4632 "Cox Communications Inc.",
4633 "Crane Co.",
4634 "Crompton Corp.",
4635 "Crown Cork & Seal Co. Inc.",
4636 "CSK Auto Corp.",
4637 "CSX Corp.",
4638 "Cummins Inc.",
4639 "CVS Corp.",
4640 "Cytec Industries Inc.",
4641 "D&K Healthcare Resources, Inc.",
4642 "D.R. Horton Inc.",
4643 "Dana Corporation",
4644 "Danaher Corporation",
4645 "Darden Restaurants Inc.",
4646 "DaVita Inc.",
4647 "Dean Foods Company",
4648 "Deere & Company",
4649 "Del Monte Foods Co",
4650 "Dell Computer Corporation",
4651 "Delphi Corp.",
4652 "Delta Air Lines Inc.",
4653 "Deluxe Corporation",
4654 "Devon Energy Corporation",
4655 "Di Giorgio Corporation",
4656 "Dial Corporation",
4657 "Diebold Incorporated",
4658 "Dillard's Inc.",
4659 "DIMON Incorporated",
4660 "Dole Food Company, Inc.",
4661 "Dollar General Corporation",
4662 "Dollar Tree Stores, Inc.",
4663 "Dominion Resources, Inc.",
4664 "Domino's Pizza LLC",
4665 "Dover Corporation, Inc.",
4666 "Dow Chemical Company",
4667 "Dow Jones & Company, Inc.",
4668 "DPL Inc.",
4669 "DQE Inc.",
4670 "Dreyer's Grand Ice Cream, Inc.",
4671 "DST Systems, Inc.",
4672 "DTE Energy Co.",
4673 "E.I. Du Pont de Nemours and Company",
4674 "Duke Energy Corp",
4675 "Dun & Bradstreet Inc.",
4676 "DURA Automotive Systems Inc.",
4677 "DynCorp",
4678 "Dynegy Inc.",
4679 "E*Trade Group, Inc.",
4680 "E.W. Scripps Company",
4681 "Earthlink, Inc.",
4682 "Eastman Chemical Company",
4683 "Eastman Kodak Company",
4684 "Eaton Corporation",
4685 "Echostar Communications Corporation",
4686 "Ecolab Inc.",
4687 "Edison International",
4688 "EGL Inc.",
4689 "El Paso Corporation",
4690 "Electronic Arts Inc.",
4691 "Electronic Data Systems Corp.",
4692 "Eli Lilly and Company",
4693 "EMC Corporation",
4694 "Emcor Group Inc.",
4695 "Emerson Electric Co.",
4696 "Encompass Services Corporation",
4697 "Energizer Holdings Inc.",
4698 "Energy East Corporation",
4699 "Engelhard Corporation",
4700 "Enron Corp.",
4701 "Entergy Corporation",
4702 "Enterprise Products Partners L.P.",
4703 "EOG Resources, Inc.",
4704 "Equifax Inc.",
4705 "Equitable Resources Inc.",
4706 "Equity Office Properties Trust",
4707 "Equity Residential Properties Trust",
4708 "Estee Lauder Companies Inc.",
4709 "Exelon Corporation",
4710 "Exide Technologies",
4711 "Expeditors International of Washington Inc.",
4712 "Express Scripts Inc.",
4713 "ExxonMobil Corporation",
4714 "Fairchild Semiconductor International Inc.",
4715 "Family Dollar Stores Inc.",
4716 "Farmland Industries Inc.",
4717 "Federal Mogul Corp.",
4718 "Federated Department Stores Inc.",
4719 "Federal Express Corp.",
4720 "Felcor Lodging Trust Inc.",
4721 "Ferro Corp.",
4722 "Fidelity National Financial Inc.",
4723 "Fifth Third Bancorp",
4724 "First American Financial Corp.",
4725 "First Data Corp.",
4726 "First National of Nebraska Inc.",
4727 "First Tennessee National Corp.",
4728 "FirstEnergy Corp.",
4729 "Fiserv Inc.",
4730 "Fisher Scientific International Inc.",
4731 "FleetBoston Financial Co.",
4732 "Fleetwood Enterprises Inc.",
4733 "Fleming Companies Inc.",
4734 "Flowers Foods Inc.",
4735 "Flowserv Corp",
4736 "Fluor Corp",
4737 "FMC Corp",
4738 "Foamex International Inc",
4739 "Foot Locker Inc",
4740 "Footstar Inc.",
4741 "Ford Motor Co",
4742 "Forest Laboratories Inc.",
4743 "Fortune Brands Inc.",
4744 "Foster Wheeler Ltd.",
4745 "FPL Group Inc.",
4746 "Franklin Resources Inc.",
4747 "Freeport McMoran Copper & Gold Inc.",
4748 "Frontier Oil Corp",
4749 "Furniture Brands International Inc.",
4750 "Gannett Co., Inc.",
4751 "Gap Inc.",
4752 "Gateway Inc.",
4753 "GATX Corporation",
4754 "Gemstar-TV Guide International Inc.",
4755 "GenCorp Inc.",
4756 "General Cable Corporation",
4757 "General Dynamics Corporation",
4758 "General Electric Company",
4759 "General Mills Inc",
4760 "General Motors Corporation",
4761 "Genesis Health Ventures Inc.",
4762 "Gentek Inc.",
4763 "Gentiva Health Services Inc.",
4764 "Genuine Parts Company",
4765 "Genuity Inc.",
4766 "Genzyme Corporation",
4767 "Georgia Gulf Corporation",
4768 "Georgia-Pacific Corporation",
4769 "Gillette Company",
4770 "Gold Kist Inc.",
4771 "Golden State Bancorp Inc.",
4772 "Golden West Financial Corporation",
4773 "Goldman Sachs Group Inc.",
4774 "Goodrich Corporation",
4775 "The Goodyear Tire & Rubber Company",
4776 "Granite Construction Incorporated",
4777 "Graybar Electric Company Inc.",
4778 "Great Lakes Chemical Corporation",
4779 "Great Plains Energy Inc.",
4780 "GreenPoint Financial Corp.",
4781 "Greif Bros. Corporation",
4782 "Grey Global Group Inc.",
4783 "Group 1 Automotive Inc.",
4784 "Guidant Corporation",
4785 "H&R Block Inc.",
4786 "H.B. Fuller Company",
4787 "H.J. Heinz Company",
4788 "Halliburton Co.",
4789 "Harley-Davidson Inc.",
4790 "Harman International Industries Inc.",
4791 "Harrah's Entertainment Inc.",
4792 "Harris Corp.",
4793 "Harsco Corp.",
4794 "Hartford Financial Services Group Inc.",
4795 "Hasbro Inc.",
4796 "Hawaiian Electric Industries Inc.",
4797 "HCA Inc.",
4798 "Health Management Associates Inc.",
4799 "Health Net Inc.",
4800 "Healthsouth Corp",
4801 "Henry Schein Inc.",
4802 "Hercules Inc.",
4803 "Herman Miller Inc.",
4804 "Hershey Foods Corp.",
4805 "Hewlett-Packard Company",
4806 "Hibernia Corp.",
4807 "Hillenbrand Industries Inc.",
4808 "Hilton Hotels Corp.",
4809 "Hollywood Entertainment Corp.",
4810 "Home Depot Inc.",
4811 "Hon Industries Inc.",
4812 "Honeywell International Inc.",
4813 "Hormel Foods Corp.",
4814 "Host Marriott Corp.",
4815 "Household International Corp.",
4816 "Hovnanian Enterprises Inc.",
4817 "Hub Group Inc.",
4818 "Hubbell Inc.",
4819 "Hughes Supply Inc.",
4820 "Humana Inc.",
4821 "Huntington Bancshares Inc.",
4822 "Idacorp Inc.",
4823 "IDT Corporation",
4824 "IKON Office Solutions Inc.",
4825 "Illinois Tool Works Inc.",
4826 "IMC Global Inc.",
4827 "Imperial Sugar Company",
4828 "IMS Health Inc.",
4829 "Ingles Market Inc",
4830 "Ingram Micro Inc.",
4831 "Insight Enterprises Inc.",
4832 "Integrated Electrical Services Inc.",
4833 "Intel Corporation",
4834 "International Paper Co.",
4835 "Interpublic Group of Companies Inc.",
4836 "Interstate Bakeries Corporation",
4837 "International Business Machines Corp.",
4838 "International Flavors & Fragrances Inc.",
4839 "International Multifoods Corporation",
4840 "Intuit Inc.",
4841 "IT Group Inc.",
4842 "ITT Industries Inc.",
4843 "Ivax Corp.",
4844 "J.B. Hunt Transport Services Inc.",
4845 "J.C. Penny Co.",
4846 "J.P. Morgan Chase & Co.",
4847 "Jabil Circuit Inc.",
4848 "Jack In The Box Inc.",
4849 "Jacobs Engineering Group Inc.",
4850 "JDS Uniphase Corp.",
4851 "Jefferson-Pilot Co.",
4852 "John Hancock Financial Services Inc.",
4853 "Johnson & Johnson",
4854 "Johnson Controls Inc.",
4855 "Jones Apparel Group Inc.",
4856 "KB Home",
4857 "Kellogg Company",
4858 "Kellwood Company",
4859 "Kelly Services Inc.",
4860 "Kemet Corp.",
4861 "Kennametal Inc.",
4862 "Kerr-McGee Corporation",
4863 "KeyCorp",
4864 "KeySpan Corp.",
4865 "Kimball International Inc.",
4866 "Kimberly-Clark Corporation",
4867 "Kindred Healthcare Inc.",
4868 "KLA-Tencor Corporation",
4869 "K-Mart Corp.",
4870 "Knight-Ridder Inc.",
4871 "Kohl's Corp.",
4872 "KPMG Consulting Inc.",
4873 "Kroger Co.",
4874 "L-3 Communications Holdings Inc.",
4875 "Laboratory Corporation of America Holdings",
4876 "Lam Research Corporation",
4877 "LandAmerica Financial Group Inc.",
4878 "Lands' End Inc.",
4879 "Landstar System Inc.",
4880 "La-Z-Boy Inc.",
4881 "Lear Corporation",
4882 "Legg Mason Inc.",
4883 "Leggett & Platt Inc.",
4884 "Lehman Brothers Holdings Inc.",
4885 "Lennar Corporation",
4886 "Lennox International Inc.",
4887 "Level 3 Communications Inc.",
4888 "Levi Strauss & Co.",
4889 "Lexmark International Inc.",
4890 "Limited Inc.",
4891 "Lincoln National Corporation",
4892 "Linens 'n Things Inc.",
4893 "Lithia Motors Inc.",
4894 "Liz Claiborne Inc.",
4895 "Lockheed Martin Corporation",
4896 "Loews Corporation",
4897 "Longs Drug Stores Corporation",
4898 "Louisiana-Pacific Corporation",
4899 "Lowe's Companies Inc.",
4900 "LSI Logic Corporation",
4901 "The LTV Corporation",
4902 "The Lubrizol Corporation",
4903 "Lucent Technologies Inc.",
4904 "Lyondell Chemical Company",
4905 "M & T Bank Corporation",
4906 "Magellan Health Services Inc.",
4907 "Mail-Well Inc.",
4908 "Mandalay Resort Group",
4909 "Manor Care Inc.",
4910 "Manpower Inc.",
4911 "Marathon Oil Corporation",
4912 "Mariner Health Care Inc.",
4913 "Markel Corporation",
4914 "Marriott International Inc.",
4915 "Marsh & McLennan Companies Inc.",
4916 "Marsh Supermarkets Inc.",
4917 "Marshall & Ilsley Corporation",
4918 "Martin Marietta Materials Inc.",
4919 "Masco Corporation",
4920 "Massey Energy Company",
4921 "MasTec Inc.",
4922 "Mattel Inc.",
4923 "Maxim Integrated Products Inc.",
4924 "Maxtor Corporation",
4925 "Maxxam Inc.",
4926 "The May Department Stores Company",
4927 "Maytag Corporation",
4928 "MBNA Corporation",
4929 "McCormick & Company Incorporated",
4930 "McDonald's Corporation",
4931 "The McGraw-Hill Companies Inc.",
4932 "McKesson Corporation",
4933 "McLeodUSA Incorporated",
4934 "M.D.C. Holdings Inc.",
4935 "MDU Resources Group Inc.",
4936 "MeadWestvaco Corporation",
4937 "Medtronic Inc.",
4938 "Mellon Financial Corporation",
4939 "The Men's Wearhouse Inc.",
4940 "Merck & Co., Inc.",
4941 "Mercury General Corporation",
4942 "Merrill Lynch & Co. Inc.",
4943 "Metaldyne Corporation",
4944 "Metals USA Inc.",
4945 "MetLife Inc.",
4946 "Metris Companies Inc",
4947 "MGIC Investment Corporation",
4948 "MGM Mirage",
4949 "Michaels Stores Inc.",
4950 "Micron Technology Inc.",
4951 "Microsoft Corporation",
4952 "Milacron Inc.",
4953 "Millennium Chemicals Inc.",
4954 "Mirant Corporation",
4955 "Mohawk Industries Inc.",
4956 "Molex Incorporated",
4957 "The MONY Group Inc.",
4958 "Morgan Stanley Dean Witter & Co.",
4959 "Motorola Inc.",
4960 "MPS Group Inc.",
4961 "Murphy Oil Corporation",
4962 "Nabors Industries Inc",
4963 "Nacco Industries Inc",
4964 "Nash Finch Company",
4965 "National City Corp.",
4966 "National Commerce Financial Corporation",
4967 "National Fuel Gas Company",
4968 "National Oilwell Inc",
4969 "National Rural Utilities Cooperative Finance Corporation",
4970 "National Semiconductor Corporation",
4971 "National Service Industries Inc",
4972 "Navistar International Corporation",
4973 "NCR Corporation",
4974 "The Neiman Marcus Group Inc.",
4975 "New Jersey Resources Corporation",
4976 "New York Times Company",
4977 "Newell Rubbermaid Inc",
4978 "Newmont Mining Corporation",
4979 "Nextel Communications Inc",
4980 "Nicor Inc",
4981 "Nike Inc",
4982 "NiSource Inc",
4983 "Noble Energy Inc",
4984 "Nordstrom Inc",
4985 "Norfolk Southern Corporation",
4986 "Nortek Inc",
4987 "North Fork Bancorporation Inc",
4988 "Northeast Utilities System",
4989 "Northern Trust Corporation",
4990 "Northrop Grumman Corporation",
4991 "NorthWestern Corporation",
4992 "Novellus Systems Inc",
4993 "NSTAR",
4994 "NTL Incorporated",
4995 "Nucor Corp",
4996 "Nvidia Corp",
4997 "NVR Inc",
4998 "Northwest Airlines Corp",
4999 "Occidental Petroleum Corp",
5000 "Ocean Energy Inc",
5001 "Office Depot Inc.",
5002 "OfficeMax Inc",
5003 "OGE Energy Corp",
5004 "Oglethorpe Power Corp.",
5005 "Ohio Casualty Corp.",
5006 "Old Republic International Corp.",
5007 "Olin Corp.",
5008 "OM Group Inc",
5009 "Omnicare Inc",
5010 "Omnicom Group",
5011 "On Semiconductor Corp",
5012 "ONEOK Inc",
5013 "Oracle Corp",
5014 "Oshkosh Truck Corp",
5015 "Outback Steakhouse Inc.",
5016 "Owens & Minor Inc.",
5017 "Owens Corning",
5018 "Owens-Illinois Inc",
5019 "Oxford Health Plans Inc",
5020 "Paccar Inc",
5021 "PacifiCare Health Systems Inc",
5022 "Packaging Corp. of America",
5023 "Pactiv Corp",
5024 "Pall Corp",
5025 "Pantry Inc",
5026 "Park Place Entertainment Corp",
5027 "Parker Hannifin Corp.",
5028 "Pathmark Stores Inc.",
5029 "Paychex Inc",
5030 "Payless Shoesource Inc",
5031 "Penn Traffic Co.",
5032 "Pennzoil-Quaker State Company",
5033 "Pentair Inc",
5034 "Peoples Energy Corp.",
5035 "PeopleSoft Inc",
5036 "Pep Boys Manny, Moe & Jack",
5037 "Potomac Electric Power Co.",
5038 "Pepsi Bottling Group Inc.",
5039 "PepsiAmericas Inc.",
5040 "PepsiCo Inc.",
5041 "Performance Food Group Co.",
5042 "Perini Corp",
5043 "PerkinElmer Inc",
5044 "Perot Systems Corp",
5045 "Petco Animal Supplies Inc.",
5046 "Peter Kiewit Sons', Inc.",
5047 "PETsMART Inc",
5048 "Pfizer Inc",
5049 "Pacific Gas & Electric Corp.",
5050 "Pharmacia Corp",
5051 "Phar Mor Inc.",
5052 "Phelps Dodge Corp.",
5053 "Philip Morris Companies Inc.",
5054 "Phillips Petroleum Co",
5055 "Phillips Van Heusen Corp.",
5056 "Phoenix Companies Inc",
5057 "Pier 1 Imports Inc.",
5058 "Pilgrim's Pride Corporation",
5059 "Pinnacle West Capital Corp",
5060 "Pioneer-Standard Electronics Inc.",
5061 "Pitney Bowes Inc.",
5062 "Pittston Brinks Group",
5063 "Plains All American Pipeline LP",
5064 "PNC Financial Services Group Inc.",
5065 "PNM Resources Inc",
5066 "Polaris Industries Inc.",
5067 "Polo Ralph Lauren Corp",
5068 "PolyOne Corp",
5069 "Popular Inc",
5070 "Potlatch Corp",
5071 "PPG Industries Inc",
5072 "PPL Corp",
5073 "Praxair Inc",
5074 "Precision Castparts Corp",
5075 "Premcor Inc.",
5076 "Pride International Inc",
5077 "Primedia Inc",
5078 "Principal Financial Group Inc.",
5079 "Procter & Gamble Co.",
5080 "Pro-Fac Cooperative Inc.",
5081 "Progress Energy Inc",
5082 "Progressive Corporation",
5083 "Protective Life Corp",
5084 "Provident Financial Group",
5085 "Providian Financial Corp.",
5086 "Prudential Financial Inc.",
5087 "PSS World Medical Inc",
5088 "Public Service Enterprise Group Inc.",
5089 "Publix Super Markets Inc.",
5090 "Puget Energy Inc.",
5091 "Pulte Homes Inc",
5092 "Qualcomm Inc",
5093 "Quanta Services Inc.",
5094 "Quantum Corp",
5095 "Quest Diagnostics Inc.",
5096 "Questar Corp",
5097 "Quintiles Transnational",
5098 "Qwest Communications Intl Inc",
5099 "R.J. Reynolds Tobacco Company",
5100 "R.R. Donnelley & Sons Company",
5101 "Radio Shack Corporation",
5102 "Raymond James Financial Inc.",
5103 "Raytheon Company",
5104 "Reader's Digest Association Inc.",
5105 "Reebok International Ltd.",
5106 "Regions Financial Corp.",
5107 "Regis Corporation",
5108 "Reliance Steel & Aluminum Co.",
5109 "Reliant Energy Inc.",
5110 "Rent A Center Inc",
5111 "Republic Services Inc",
5112 "Revlon Inc",
5113 "RGS Energy Group Inc",
5114 "Rite Aid Corp",
5115 "Riverwood Holding Inc.",
5116 "RoadwayCorp",
5117 "Robert Half International Inc.",
5118 "Rock-Tenn Co",
5119 "Rockwell Automation Inc",
5120 "Rockwell Collins Inc",
5121 "Rohm & Haas Co.",
5122 "Ross Stores Inc",
5123 "RPM Inc.",
5124 "Ruddick Corp",
5125 "Ryder System Inc",
5126 "Ryerson Tull Inc",
5127 "Ryland Group Inc.",
5128 "Sabre Holdings Corp",
5129 "Safeco Corp",
5130 "Safeguard Scientifics Inc.",
5131 "Safeway Inc",
5132 "Saks Inc",
5133 "Sanmina-SCI Inc",
5134 "Sara Lee Corp",
5135 "SBC Communications Inc",
5136 "Scana Corp.",
5137 "Schering-Plough Corp",
5138 "Scholastic Corp",
5139 "SCI Systems Onc.",
5140 "Science Applications Intl. Inc.",
5141 "Scientific-Atlanta Inc",
5142 "Scotts Company",
5143 "Seaboard Corp",
5144 "Sealed Air Corp",
5145 "Sears Roebuck & Co",
5146 "Sempra Energy",
5147 "Sequa Corp",
5148 "Service Corp. International",
5149 "ServiceMaster Co",
5150 "Shaw Group Inc",
5151 "Sherwin-Williams Company",
5152 "Shopko Stores Inc",
5153 "Siebel Systems Inc",
5154 "Sierra Health Services Inc",
5155 "Sierra Pacific Resources",
5156 "Silgan Holdings Inc.",
5157 "Silicon Graphics Inc",
5158 "Simon Property Group Inc",
5159 "SLM Corporation",
5160 "Smith International Inc",
5161 "Smithfield Foods Inc",
5162 "Smurfit-Stone Container Corp",
5163 "Snap-On Inc",
5164 "Solectron Corp",
5165 "Solutia Inc",
5166 "Sonic Automotive Inc.",
5167 "Sonoco Products Co.",
5168 "Southern Company",
5169 "Southern Union Company",
5170 "SouthTrust Corp.",
5171 "Southwest Airlines Co",
5172 "Southwest Gas Corp",
5173 "Sovereign Bancorp Inc.",
5174 "Spartan Stores Inc",
5175 "Spherion Corp",
5176 "Sports Authority Inc",
5177 "Sprint Corp.",
5178 "SPX Corp",
5179 "St. Jude Medical Inc",
5180 "St. Paul Cos.",
5181 "Staff Leasing Inc.",
5182 "StanCorp Financial Group Inc",
5183 "Standard Pacific Corp.",
5184 "Stanley Works",
5185 "Staples Inc",
5186 "Starbucks Corp",
5187 "Starwood Hotels & Resorts Worldwide Inc",
5188 "State Street Corp.",
5189 "Stater Bros. Holdings Inc.",
5190 "Steelcase Inc",
5191 "Stein Mart Inc",
5192 "Stewart & Stevenson Services Inc",
5193 "Stewart Information Services Corp",
5194 "Stilwell Financial Inc",
5195 "Storage Technology Corporation",
5196 "Stryker Corp",
5197 "Sun Healthcare Group Inc.",
5198 "Sun Microsystems Inc.",
5199 "SunGard Data Systems Inc.",
5200 "Sunoco Inc.",
5201 "SunTrust Banks Inc",
5202 "Supervalu Inc",
5203 "Swift Transportation, Co., Inc",
5204 "Symbol Technologies Inc",
5205 "Synovus Financial Corp.",
5206 "Sysco Corp",
5207 "Systemax Inc.",
5208 "Target Corp.",
5209 "Tech Data Corporation",
5210 "TECO Energy Inc",
5211 "Tecumseh Products Company",
5212 "Tektronix Inc",
5213 "Teleflex Incorporated",
5214 "Telephone & Data Systems Inc",
5215 "Tellabs Inc.",
5216 "Temple-Inland Inc",
5217 "Tenet Healthcare Corporation",
5218 "Tenneco Automotive Inc.",
5219 "Teradyne Inc",
5220 "Terex Corp",
5221 "Tesoro Petroleum Corp.",
5222 "Texas Industries Inc.",
5223 "Texas Instruments Incorporated",
5224 "Textron Inc",
5225 "Thermo Electron Corporation",
5226 "Thomas & Betts Corporation",
5227 "Tiffany & Co",
5228 "Timken Company",
5229 "TJX Companies Inc",
5230 "TMP Worldwide Inc",
5231 "Toll Brothers Inc",
5232 "Torchmark Corporation",
5233 "Toro Company",
5234 "Tower Automotive Inc.",
5235 "Toys 'R' Us Inc",
5236 "Trans World Entertainment Corp.",
5237 "TransMontaigne Inc",
5238 "Transocean Inc",
5239 "TravelCenters of America Inc.",
5240 "Triad Hospitals Inc",
5241 "Tribune Company",
5242 "Trigon Healthcare Inc.",
5243 "Trinity Industries Inc",
5244 "Trump Hotels & Casino Resorts Inc.",
5245 "TruServ Corporation",
5246 "TRW Inc",
5247 "TXU Corp",
5248 "Tyson Foods Inc",
5249 "U.S. Bancorp",
5250 "U.S. Industries Inc.",
5251 "UAL Corporation",
5252 "UGI Corporation",
5253 "Unified Western Grocers Inc",
5254 "Union Pacific Corporation",
5255 "Union Planters Corp",
5256 "Unisource Energy Corp",
5257 "Unisys Corporation",
5258 "United Auto Group Inc",
5259 "United Defense Industries Inc.",
5260 "United Parcel Service Inc",
5261 "United Rentals Inc",
5262 "United Stationers Inc",
5263 "United Technologies Corporation",
5264 "UnitedHealth Group Incorporated",
5265 "Unitrin Inc",
5266 "Universal Corporation",
5267 "Universal Forest Products Inc",
5268 "Universal Health Services Inc",
5269 "Unocal Corporation",
5270 "Unova Inc",
5271 "UnumProvident Corporation",
5272 "URS Corporation",
5273 "US Airways Group Inc",
5274 "US Oncology Inc",
5275 "USA Interactive",
5276 "USFreighways Corporation",
5277 "USG Corporation",
5278 "UST Inc",
5279 "Valero Energy Corporation",
5280 "Valspar Corporation",
5281 "Value City Department Stores Inc",
5282 "Varco International Inc",
5283 "Vectren Corporation",
5284 "Veritas Software Corporation",
5285 "Verizon Communications Inc",
5286 "VF Corporation",
5287 "Viacom Inc",
5288 "Viad Corp",
5289 "Viasystems Group Inc",
5290 "Vishay Intertechnology Inc",
5291 "Visteon Corporation",
5292 "Volt Information Sciences Inc",
5293 "Vulcan Materials Company",
5294 "W.R. Berkley Corporation",
5295 "W.R. Grace & Co",
5296 "W.W. Grainger Inc",
5297 "Wachovia Corporation",
5298 "Wakenhut Corporation",
5299 "Walgreen Co",
5300 "Wallace Computer Services Inc",
5301 "Wal-Mart Stores Inc",
5302 "Walt Disney Co",
5303 "Walter Industries Inc",
5304 "Washington Mutual Inc",
5305 "Washington Post Co.",
5306 "Waste Management Inc",
5307 "Watsco Inc",
5308 "Weatherford International Inc",
5309 "Weis Markets Inc.",
5310 "Wellpoint Health Networks Inc",
5311 "Wells Fargo & Company",
5312 "Wendy's International Inc",
5313 "Werner Enterprises Inc",
5314 "WESCO International Inc",
5315 "Western Digital Inc",
5316 "Western Gas Resources Inc",
5317 "WestPoint Stevens Inc",
5318 "Weyerhauser Company",
5319 "WGL Holdings Inc",
5320 "Whirlpool Corporation",
5321 "Whole Foods Market Inc",
5322 "Willamette Industries Inc.",
5323 "Williams Companies Inc",
5324 "Williams Sonoma Inc",
5325 "Winn Dixie Stores Inc",
5326 "Wisconsin Energy Corporation",
5327 "Wm Wrigley Jr Company",
5328 "World Fuel Services Corporation",
5329 "WorldCom Inc",
5330 "Worthington Industries Inc",
5331 "WPS Resources Corporation",
5332 "Wyeth",
5333 "Wyndham International Inc",
5334 "Xcel Energy Inc",
5335 "Xerox Corp",
5336 "Xilinx Inc",
5337 "XO Communications Inc",
5338 "Yellow Corporation",
5339 "York International Corp",
5340 "Yum Brands Inc.",
5341 "Zale Corporation",
5342 "Zions Bancorporation"
5343 ],
5344
5345 fileExtension : {
5346 "raster" : ["bmp", "gif", "gpl", "ico", "jpeg", "psd", "png", "psp", "raw", "tiff"],
5347 "vector" : ["3dv", "amf", "awg", "ai", "cgm", "cdr", "cmx", "dxf", "e2d", "egt", "eps", "fs", "odg", "svg", "xar"],
5348 "3d" : ["3dmf", "3dm", "3mf", "3ds", "an8", "aoi", "blend", "cal3d", "cob", "ctm", "iob", "jas", "max", "mb", "mdx", "obj", "x", "x3d"],
5349 "document" : ["doc", "docx", "dot", "html", "xml", "odt", "odm", "ott", "csv", "rtf", "tex", "xhtml", "xps"]
5350 },
5351
5352 // Data taken from https://github.com/dmfilipenko/timezones.json/blob/master/timezones.json
5353 timezones: [
5354 {
5355 "name": "Dateline Standard Time",
5356 "abbr": "DST",
5357 "offset": -12,
5358 "isdst": false,
5359 "text": "(UTC-12:00) International Date Line West",
5360 "utc": [
5361 "Etc/GMT+12"
5362 ]
5363 },
5364 {
5365 "name": "UTC-11",
5366 "abbr": "U",
5367 "offset": -11,
5368 "isdst": false,
5369 "text": "(UTC-11:00) Coordinated Universal Time-11",
5370 "utc": [
5371 "Etc/GMT+11",
5372 "Pacific/Midway",
5373 "Pacific/Niue",
5374 "Pacific/Pago_Pago"
5375 ]
5376 },
5377 {
5378 "name": "Hawaiian Standard Time",
5379 "abbr": "HST",
5380 "offset": -10,
5381 "isdst": false,
5382 "text": "(UTC-10:00) Hawaii",
5383 "utc": [
5384 "Etc/GMT+10",
5385 "Pacific/Honolulu",
5386 "Pacific/Johnston",
5387 "Pacific/Rarotonga",
5388 "Pacific/Tahiti"
5389 ]
5390 },
5391 {
5392 "name": "Alaskan Standard Time",
5393 "abbr": "AKDT",
5394 "offset": -8,
5395 "isdst": true,
5396 "text": "(UTC-09:00) Alaska",
5397 "utc": [
5398 "America/Anchorage",
5399 "America/Juneau",
5400 "America/Nome",
5401 "America/Sitka",
5402 "America/Yakutat"
5403 ]
5404 },
5405 {
5406 "name": "Pacific Standard Time (Mexico)",
5407 "abbr": "PDT",
5408 "offset": -7,
5409 "isdst": true,
5410 "text": "(UTC-08:00) Baja California",
5411 "utc": [
5412 "America/Santa_Isabel"
5413 ]
5414 },
5415 {
5416 "name": "Pacific Standard Time",
5417 "abbr": "PDT",
5418 "offset": -7,
5419 "isdst": true,
5420 "text": "(UTC-08:00) Pacific Time (US & Canada)",
5421 "utc": [
5422 "America/Dawson",
5423 "America/Los_Angeles",
5424 "America/Tijuana",
5425 "America/Vancouver",
5426 "America/Whitehorse",
5427 "PST8PDT"
5428 ]
5429 },
5430 {
5431 "name": "US Mountain Standard Time",
5432 "abbr": "UMST",
5433 "offset": -7,
5434 "isdst": false,
5435 "text": "(UTC-07:00) Arizona",
5436 "utc": [
5437 "America/Creston",
5438 "America/Dawson_Creek",
5439 "America/Hermosillo",
5440 "America/Phoenix",
5441 "Etc/GMT+7"
5442 ]
5443 },
5444 {
5445 "name": "Mountain Standard Time (Mexico)",
5446 "abbr": "MDT",
5447 "offset": -6,
5448 "isdst": true,
5449 "text": "(UTC-07:00) Chihuahua, La Paz, Mazatlan",
5450 "utc": [
5451 "America/Chihuahua",
5452 "America/Mazatlan"
5453 ]
5454 },
5455 {
5456 "name": "Mountain Standard Time",
5457 "abbr": "MDT",
5458 "offset": -6,
5459 "isdst": true,
5460 "text": "(UTC-07:00) Mountain Time (US & Canada)",
5461 "utc": [
5462 "America/Boise",
5463 "America/Cambridge_Bay",
5464 "America/Denver",
5465 "America/Edmonton",
5466 "America/Inuvik",
5467 "America/Ojinaga",
5468 "America/Yellowknife",
5469 "MST7MDT"
5470 ]
5471 },
5472 {
5473 "name": "Central America Standard Time",
5474 "abbr": "CAST",
5475 "offset": -6,
5476 "isdst": false,
5477 "text": "(UTC-06:00) Central America",
5478 "utc": [
5479 "America/Belize",
5480 "America/Costa_Rica",
5481 "America/El_Salvador",
5482 "America/Guatemala",
5483 "America/Managua",
5484 "America/Tegucigalpa",
5485 "Etc/GMT+6",
5486 "Pacific/Galapagos"
5487 ]
5488 },
5489 {
5490 "name": "Central Standard Time",
5491 "abbr": "CDT",
5492 "offset": -5,
5493 "isdst": true,
5494 "text": "(UTC-06:00) Central Time (US & Canada)",
5495 "utc": [
5496 "America/Chicago",
5497 "America/Indiana/Knox",
5498 "America/Indiana/Tell_City",
5499 "America/Matamoros",
5500 "America/Menominee",
5501 "America/North_Dakota/Beulah",
5502 "America/North_Dakota/Center",
5503 "America/North_Dakota/New_Salem",
5504 "America/Rainy_River",
5505 "America/Rankin_Inlet",
5506 "America/Resolute",
5507 "America/Winnipeg",
5508 "CST6CDT"
5509 ]
5510 },
5511 {
5512 "name": "Central Standard Time (Mexico)",
5513 "abbr": "CDT",
5514 "offset": -5,
5515 "isdst": true,
5516 "text": "(UTC-06:00) Guadalajara, Mexico City, Monterrey",
5517 "utc": [
5518 "America/Bahia_Banderas",
5519 "America/Cancun",
5520 "America/Merida",
5521 "America/Mexico_City",
5522 "America/Monterrey"
5523 ]
5524 },
5525 {
5526 "name": "Canada Central Standard Time",
5527 "abbr": "CCST",
5528 "offset": -6,
5529 "isdst": false,
5530 "text": "(UTC-06:00) Saskatchewan",
5531 "utc": [
5532 "America/Regina",
5533 "America/Swift_Current"
5534 ]
5535 },
5536 {
5537 "name": "SA Pacific Standard Time",
5538 "abbr": "SPST",
5539 "offset": -5,
5540 "isdst": false,
5541 "text": "(UTC-05:00) Bogota, Lima, Quito",
5542 "utc": [
5543 "America/Bogota",
5544 "America/Cayman",
5545 "America/Coral_Harbour",
5546 "America/Eirunepe",
5547 "America/Guayaquil",
5548 "America/Jamaica",
5549 "America/Lima",
5550 "America/Panama",
5551 "America/Rio_Branco",
5552 "Etc/GMT+5"
5553 ]
5554 },
5555 {
5556 "name": "Eastern Standard Time",
5557 "abbr": "EDT",
5558 "offset": -4,
5559 "isdst": true,
5560 "text": "(UTC-05:00) Eastern Time (US & Canada)",
5561 "utc": [
5562 "America/Detroit",
5563 "America/Havana",
5564 "America/Indiana/Petersburg",
5565 "America/Indiana/Vincennes",
5566 "America/Indiana/Winamac",
5567 "America/Iqaluit",
5568 "America/Kentucky/Monticello",
5569 "America/Louisville",
5570 "America/Montreal",
5571 "America/Nassau",
5572 "America/New_York",
5573 "America/Nipigon",
5574 "America/Pangnirtung",
5575 "America/Port-au-Prince",
5576 "America/Thunder_Bay",
5577 "America/Toronto",
5578 "EST5EDT"
5579 ]
5580 },
5581 {
5582 "name": "US Eastern Standard Time",
5583 "abbr": "UEDT",
5584 "offset": -4,
5585 "isdst": true,
5586 "text": "(UTC-05:00) Indiana (East)",
5587 "utc": [
5588 "America/Indiana/Marengo",
5589 "America/Indiana/Vevay",
5590 "America/Indianapolis"
5591 ]
5592 },
5593 {
5594 "name": "Venezuela Standard Time",
5595 "abbr": "VST",
5596 "offset": -4.5,
5597 "isdst": false,
5598 "text": "(UTC-04:30) Caracas",
5599 "utc": [
5600 "America/Caracas"
5601 ]
5602 },
5603 {
5604 "name": "Paraguay Standard Time",
5605 "abbr": "PST",
5606 "offset": -4,
5607 "isdst": false,
5608 "text": "(UTC-04:00) Asuncion",
5609 "utc": [
5610 "America/Asuncion"
5611 ]
5612 },
5613 {
5614 "name": "Atlantic Standard Time",
5615 "abbr": "ADT",
5616 "offset": -3,
5617 "isdst": true,
5618 "text": "(UTC-04:00) Atlantic Time (Canada)",
5619 "utc": [
5620 "America/Glace_Bay",
5621 "America/Goose_Bay",
5622 "America/Halifax",
5623 "America/Moncton",
5624 "America/Thule",
5625 "Atlantic/Bermuda"
5626 ]
5627 },
5628 {
5629 "name": "Central Brazilian Standard Time",
5630 "abbr": "CBST",
5631 "offset": -4,
5632 "isdst": false,
5633 "text": "(UTC-04:00) Cuiaba",
5634 "utc": [
5635 "America/Campo_Grande",
5636 "America/Cuiaba"
5637 ]
5638 },
5639 {
5640 "name": "SA Western Standard Time",
5641 "abbr": "SWST",
5642 "offset": -4,
5643 "isdst": false,
5644 "text": "(UTC-04:00) Georgetown, La Paz, Manaus, San Juan",
5645 "utc": [
5646 "America/Anguilla",
5647 "America/Antigua",
5648 "America/Aruba",
5649 "America/Barbados",
5650 "America/Blanc-Sablon",
5651 "America/Boa_Vista",
5652 "America/Curacao",
5653 "America/Dominica",
5654 "America/Grand_Turk",
5655 "America/Grenada",
5656 "America/Guadeloupe",
5657 "America/Guyana",
5658 "America/Kralendijk",
5659 "America/La_Paz",
5660 "America/Lower_Princes",
5661 "America/Manaus",
5662 "America/Marigot",
5663 "America/Martinique",
5664 "America/Montserrat",
5665 "America/Port_of_Spain",
5666 "America/Porto_Velho",
5667 "America/Puerto_Rico",
5668 "America/Santo_Domingo",
5669 "America/St_Barthelemy",
5670 "America/St_Kitts",
5671 "America/St_Lucia",
5672 "America/St_Thomas",
5673 "America/St_Vincent",
5674 "America/Tortola",
5675 "Etc/GMT+4"
5676 ]
5677 },
5678 {
5679 "name": "Pacific SA Standard Time",
5680 "abbr": "PSST",
5681 "offset": -4,
5682 "isdst": false,
5683 "text": "(UTC-04:00) Santiago",
5684 "utc": [
5685 "America/Santiago",
5686 "Antarctica/Palmer"
5687 ]
5688 },
5689 {
5690 "name": "Newfoundland Standard Time",
5691 "abbr": "NDT",
5692 "offset": -2.5,
5693 "isdst": true,
5694 "text": "(UTC-03:30) Newfoundland",
5695 "utc": [
5696 "America/St_Johns"
5697 ]
5698 },
5699 {
5700 "name": "E. South America Standard Time",
5701 "abbr": "ESAST",
5702 "offset": -3,
5703 "isdst": false,
5704 "text": "(UTC-03:00) Brasilia",
5705 "utc": [
5706 "America/Sao_Paulo"
5707 ]
5708 },
5709 {
5710 "name": "Argentina Standard Time",
5711 "abbr": "AST",
5712 "offset": -3,
5713 "isdst": false,
5714 "text": "(UTC-03:00) Buenos Aires",
5715 "utc": [
5716 "America/Argentina/La_Rioja",
5717 "America/Argentina/Rio_Gallegos",
5718 "America/Argentina/Salta",
5719 "America/Argentina/San_Juan",
5720 "America/Argentina/San_Luis",
5721 "America/Argentina/Tucuman",
5722 "America/Argentina/Ushuaia",
5723 "America/Buenos_Aires",
5724 "America/Catamarca",
5725 "America/Cordoba",
5726 "America/Jujuy",
5727 "America/Mendoza"
5728 ]
5729 },
5730 {
5731 "name": "SA Eastern Standard Time",
5732 "abbr": "SEST",
5733 "offset": -3,
5734 "isdst": false,
5735 "text": "(UTC-03:00) Cayenne, Fortaleza",
5736 "utc": [
5737 "America/Araguaina",
5738 "America/Belem",
5739 "America/Cayenne",
5740 "America/Fortaleza",
5741 "America/Maceio",
5742 "America/Paramaribo",
5743 "America/Recife",
5744 "America/Santarem",
5745 "Antarctica/Rothera",
5746 "Atlantic/Stanley",
5747 "Etc/GMT+3"
5748 ]
5749 },
5750 {
5751 "name": "Greenland Standard Time",
5752 "abbr": "GDT",
5753 "offset": -2,
5754 "isdst": true,
5755 "text": "(UTC-03:00) Greenland",
5756 "utc": [
5757 "America/Godthab"
5758 ]
5759 },
5760 {
5761 "name": "Montevideo Standard Time",
5762 "abbr": "MST",
5763 "offset": -3,
5764 "isdst": false,
5765 "text": "(UTC-03:00) Montevideo",
5766 "utc": [
5767 "America/Montevideo"
5768 ]
5769 },
5770 {
5771 "name": "Bahia Standard Time",
5772 "abbr": "BST",
5773 "offset": -3,
5774 "isdst": false,
5775 "text": "(UTC-03:00) Salvador",
5776 "utc": [
5777 "America/Bahia"
5778 ]
5779 },
5780 {
5781 "name": "UTC-02",
5782 "abbr": "U",
5783 "offset": -2,
5784 "isdst": false,
5785 "text": "(UTC-02:00) Coordinated Universal Time-02",
5786 "utc": [
5787 "America/Noronha",
5788 "Atlantic/South_Georgia",
5789 "Etc/GMT+2"
5790 ]
5791 },
5792 {
5793 "name": "Mid-Atlantic Standard Time",
5794 "abbr": "MDT",
5795 "offset": -1,
5796 "isdst": true,
5797 "text": "(UTC-02:00) Mid-Atlantic - Old"
5798 },
5799 {
5800 "name": "Azores Standard Time",
5801 "abbr": "ADT",
5802 "offset": 0,
5803 "isdst": true,
5804 "text": "(UTC-01:00) Azores",
5805 "utc": [
5806 "America/Scoresbysund",
5807 "Atlantic/Azores"
5808 ]
5809 },
5810 {
5811 "name": "Cape Verde Standard Time",
5812 "abbr": "CVST",
5813 "offset": -1,
5814 "isdst": false,
5815 "text": "(UTC-01:00) Cape Verde Is.",
5816 "utc": [
5817 "Atlantic/Cape_Verde",
5818 "Etc/GMT+1"
5819 ]
5820 },
5821 {
5822 "name": "Morocco Standard Time",
5823 "abbr": "MDT",
5824 "offset": 1,
5825 "isdst": true,
5826 "text": "(UTC) Casablanca",
5827 "utc": [
5828 "Africa/Casablanca",
5829 "Africa/El_Aaiun"
5830 ]
5831 },
5832 {
5833 "name": "UTC",
5834 "abbr": "CUT",
5835 "offset": 0,
5836 "isdst": false,
5837 "text": "(UTC) Coordinated Universal Time",
5838 "utc": [
5839 "America/Danmarkshavn",
5840 "Etc/GMT"
5841 ]
5842 },
5843 {
5844 "name": "GMT Standard Time",
5845 "abbr": "GDT",
5846 "offset": 1,
5847 "isdst": true,
5848 "text": "(UTC) Dublin, Edinburgh, Lisbon, London",
5849 "utc": [
5850 "Atlantic/Canary",
5851 "Atlantic/Faeroe",
5852 "Atlantic/Madeira",
5853 "Europe/Dublin",
5854 "Europe/Guernsey",
5855 "Europe/Isle_of_Man",
5856 "Europe/Jersey",
5857 "Europe/Lisbon",
5858 "Europe/London"
5859 ]
5860 },
5861 {
5862 "name": "Greenwich Standard Time",
5863 "abbr": "GST",
5864 "offset": 0,
5865 "isdst": false,
5866 "text": "(UTC) Monrovia, Reykjavik",
5867 "utc": [
5868 "Africa/Abidjan",
5869 "Africa/Accra",
5870 "Africa/Bamako",
5871 "Africa/Banjul",
5872 "Africa/Bissau",
5873 "Africa/Conakry",
5874 "Africa/Dakar",
5875 "Africa/Freetown",
5876 "Africa/Lome",
5877 "Africa/Monrovia",
5878 "Africa/Nouakchott",
5879 "Africa/Ouagadougou",
5880 "Africa/Sao_Tome",
5881 "Atlantic/Reykjavik",
5882 "Atlantic/St_Helena"
5883 ]
5884 },
5885 {
5886 "name": "W. Europe Standard Time",
5887 "abbr": "WEDT",
5888 "offset": 2,
5889 "isdst": true,
5890 "text": "(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna",
5891 "utc": [
5892 "Arctic/Longyearbyen",
5893 "Europe/Amsterdam",
5894 "Europe/Andorra",
5895 "Europe/Berlin",
5896 "Europe/Busingen",
5897 "Europe/Gibraltar",
5898 "Europe/Luxembourg",
5899 "Europe/Malta",
5900 "Europe/Monaco",
5901 "Europe/Oslo",
5902 "Europe/Rome",
5903 "Europe/San_Marino",
5904 "Europe/Stockholm",
5905 "Europe/Vaduz",
5906 "Europe/Vatican",
5907 "Europe/Vienna",
5908 "Europe/Zurich"
5909 ]
5910 },
5911 {
5912 "name": "Central Europe Standard Time",
5913 "abbr": "CEDT",
5914 "offset": 2,
5915 "isdst": true,
5916 "text": "(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague",
5917 "utc": [
5918 "Europe/Belgrade",
5919 "Europe/Bratislava",
5920 "Europe/Budapest",
5921 "Europe/Ljubljana",
5922 "Europe/Podgorica",
5923 "Europe/Prague",
5924 "Europe/Tirane"
5925 ]
5926 },
5927 {
5928 "name": "Romance Standard Time",
5929 "abbr": "RDT",
5930 "offset": 2,
5931 "isdst": true,
5932 "text": "(UTC+01:00) Brussels, Copenhagen, Madrid, Paris",
5933 "utc": [
5934 "Africa/Ceuta",
5935 "Europe/Brussels",
5936 "Europe/Copenhagen",
5937 "Europe/Madrid",
5938 "Europe/Paris"
5939 ]
5940 },
5941 {
5942 "name": "Central European Standard Time",
5943 "abbr": "CEDT",
5944 "offset": 2,
5945 "isdst": true,
5946 "text": "(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb",
5947 "utc": [
5948 "Europe/Sarajevo",
5949 "Europe/Skopje",
5950 "Europe/Warsaw",
5951 "Europe/Zagreb"
5952 ]
5953 },
5954 {
5955 "name": "W. Central Africa Standard Time",
5956 "abbr": "WCAST",
5957 "offset": 1,
5958 "isdst": false,
5959 "text": "(UTC+01:00) West Central Africa",
5960 "utc": [
5961 "Africa/Algiers",
5962 "Africa/Bangui",
5963 "Africa/Brazzaville",
5964 "Africa/Douala",
5965 "Africa/Kinshasa",
5966 "Africa/Lagos",
5967 "Africa/Libreville",
5968 "Africa/Luanda",
5969 "Africa/Malabo",
5970 "Africa/Ndjamena",
5971 "Africa/Niamey",
5972 "Africa/Porto-Novo",
5973 "Africa/Tunis",
5974 "Etc/GMT-1"
5975 ]
5976 },
5977 {
5978 "name": "Namibia Standard Time",
5979 "abbr": "NST",
5980 "offset": 1,
5981 "isdst": false,
5982 "text": "(UTC+01:00) Windhoek",
5983 "utc": [
5984 "Africa/Windhoek"
5985 ]
5986 },
5987 {
5988 "name": "GTB Standard Time",
5989 "abbr": "GDT",
5990 "offset": 3,
5991 "isdst": true,
5992 "text": "(UTC+02:00) Athens, Bucharest",
5993 "utc": [
5994 "Asia/Nicosia",
5995 "Europe/Athens",
5996 "Europe/Bucharest",
5997 "Europe/Chisinau"
5998 ]
5999 },
6000 {
6001 "name": "Middle East Standard Time",
6002 "abbr": "MEDT",
6003 "offset": 3,
6004 "isdst": true,
6005 "text": "(UTC+02:00) Beirut",
6006 "utc": [
6007 "Asia/Beirut"
6008 ]
6009 },
6010 {
6011 "name": "Egypt Standard Time",
6012 "abbr": "EST",
6013 "offset": 2,
6014 "isdst": false,
6015 "text": "(UTC+02:00) Cairo",
6016 "utc": [
6017 "Africa/Cairo"
6018 ]
6019 },
6020 {
6021 "name": "Syria Standard Time",
6022 "abbr": "SDT",
6023 "offset": 3,
6024 "isdst": true,
6025 "text": "(UTC+02:00) Damascus",
6026 "utc": [
6027 "Asia/Damascus"
6028 ]
6029 },
6030 {
6031 "name": "E. Europe Standard Time",
6032 "abbr": "EEDT",
6033 "offset": 3,
6034 "isdst": true,
6035 "text": "(UTC+02:00) E. Europe"
6036 },
6037 {
6038 "name": "South Africa Standard Time",
6039 "abbr": "SAST",
6040 "offset": 2,
6041 "isdst": false,
6042 "text": "(UTC+02:00) Harare, Pretoria",
6043 "utc": [
6044 "Africa/Blantyre",
6045 "Africa/Bujumbura",
6046 "Africa/Gaborone",
6047 "Africa/Harare",
6048 "Africa/Johannesburg",
6049 "Africa/Kigali",
6050 "Africa/Lubumbashi",
6051 "Africa/Lusaka",
6052 "Africa/Maputo",
6053 "Africa/Maseru",
6054 "Africa/Mbabane",
6055 "Etc/GMT-2"
6056 ]
6057 },
6058 {
6059 "name": "FLE Standard Time",
6060 "abbr": "FDT",
6061 "offset": 3,
6062 "isdst": true,
6063 "text": "(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius",
6064 "utc": [
6065 "Europe/Helsinki",
6066 "Europe/Kiev",
6067 "Europe/Mariehamn",
6068 "Europe/Riga",
6069 "Europe/Sofia",
6070 "Europe/Tallinn",
6071 "Europe/Uzhgorod",
6072 "Europe/Vilnius",
6073 "Europe/Zaporozhye"
6074 ]
6075 },
6076 {
6077 "name": "Turkey Standard Time",
6078 "abbr": "TDT",
6079 "offset": 3,
6080 "isdst": true,
6081 "text": "(UTC+02:00) Istanbul",
6082 "utc": [
6083 "Europe/Istanbul"
6084 ]
6085 },
6086 {
6087 "name": "Israel Standard Time",
6088 "abbr": "JDT",
6089 "offset": 3,
6090 "isdst": true,
6091 "text": "(UTC+02:00) Jerusalem",
6092 "utc": [
6093 "Asia/Jerusalem"
6094 ]
6095 },
6096 {
6097 "name": "Libya Standard Time",
6098 "abbr": "LST",
6099 "offset": 2,
6100 "isdst": false,
6101 "text": "(UTC+02:00) Tripoli",
6102 "utc": [
6103 "Africa/Tripoli"
6104 ]
6105 },
6106 {
6107 "name": "Jordan Standard Time",
6108 "abbr": "JST",
6109 "offset": 3,
6110 "isdst": false,
6111 "text": "(UTC+03:00) Amman",
6112 "utc": [
6113 "Asia/Amman"
6114 ]
6115 },
6116 {
6117 "name": "Arabic Standard Time",
6118 "abbr": "AST",
6119 "offset": 3,
6120 "isdst": false,
6121 "text": "(UTC+03:00) Baghdad",
6122 "utc": [
6123 "Asia/Baghdad"
6124 ]
6125 },
6126 {
6127 "name": "Kaliningrad Standard Time",
6128 "abbr": "KST",
6129 "offset": 3,
6130 "isdst": false,
6131 "text": "(UTC+03:00) Kaliningrad, Minsk",
6132 "utc": [
6133 "Europe/Kaliningrad",
6134 "Europe/Minsk"
6135 ]
6136 },
6137 {
6138 "name": "Arab Standard Time",
6139 "abbr": "AST",
6140 "offset": 3,
6141 "isdst": false,
6142 "text": "(UTC+03:00) Kuwait, Riyadh",
6143 "utc": [
6144 "Asia/Aden",
6145 "Asia/Bahrain",
6146 "Asia/Kuwait",
6147 "Asia/Qatar",
6148 "Asia/Riyadh"
6149 ]
6150 },
6151 {
6152 "name": "E. Africa Standard Time",
6153 "abbr": "EAST",
6154 "offset": 3,
6155 "isdst": false,
6156 "text": "(UTC+03:00) Nairobi",
6157 "utc": [
6158 "Africa/Addis_Ababa",
6159 "Africa/Asmera",
6160 "Africa/Dar_es_Salaam",
6161 "Africa/Djibouti",
6162 "Africa/Juba",
6163 "Africa/Kampala",
6164 "Africa/Khartoum",
6165 "Africa/Mogadishu",
6166 "Africa/Nairobi",
6167 "Antarctica/Syowa",
6168 "Etc/GMT-3",
6169 "Indian/Antananarivo",
6170 "Indian/Comoro",
6171 "Indian/Mayotte"
6172 ]
6173 },
6174 {
6175 "name": "Iran Standard Time",
6176 "abbr": "IDT",
6177 "offset": 4.5,
6178 "isdst": true,
6179 "text": "(UTC+03:30) Tehran",
6180 "utc": [
6181 "Asia/Tehran"
6182 ]
6183 },
6184 {
6185 "name": "Arabian Standard Time",
6186 "abbr": "AST",
6187 "offset": 4,
6188 "isdst": false,
6189 "text": "(UTC+04:00) Abu Dhabi, Muscat",
6190 "utc": [
6191 "Asia/Dubai",
6192 "Asia/Muscat",
6193 "Etc/GMT-4"
6194 ]
6195 },
6196 {
6197 "name": "Azerbaijan Standard Time",
6198 "abbr": "ADT",
6199 "offset": 5,
6200 "isdst": true,
6201 "text": "(UTC+04:00) Baku",
6202 "utc": [
6203 "Asia/Baku"
6204 ]
6205 },
6206 {
6207 "name": "Russian Standard Time",
6208 "abbr": "RST",
6209 "offset": 4,
6210 "isdst": false,
6211 "text": "(UTC+04:00) Moscow, St. Petersburg, Volgograd",
6212 "utc": [
6213 "Europe/Moscow",
6214 "Europe/Samara",
6215 "Europe/Simferopol",
6216 "Europe/Volgograd"
6217 ]
6218 },
6219 {
6220 "name": "Mauritius Standard Time",
6221 "abbr": "MST",
6222 "offset": 4,
6223 "isdst": false,
6224 "text": "(UTC+04:00) Port Louis",
6225 "utc": [
6226 "Indian/Mahe",
6227 "Indian/Mauritius",
6228 "Indian/Reunion"
6229 ]
6230 },
6231 {
6232 "name": "Georgian Standard Time",
6233 "abbr": "GST",
6234 "offset": 4,
6235 "isdst": false,
6236 "text": "(UTC+04:00) Tbilisi",
6237 "utc": [
6238 "Asia/Tbilisi"
6239 ]
6240 },
6241 {
6242 "name": "Caucasus Standard Time",
6243 "abbr": "CST",
6244 "offset": 4,
6245 "isdst": false,
6246 "text": "(UTC+04:00) Yerevan",
6247 "utc": [
6248 "Asia/Yerevan"
6249 ]
6250 },
6251 {
6252 "name": "Afghanistan Standard Time",
6253 "abbr": "AST",
6254 "offset": 4.5,
6255 "isdst": false,
6256 "text": "(UTC+04:30) Kabul",
6257 "utc": [
6258 "Asia/Kabul"
6259 ]
6260 },
6261 {
6262 "name": "West Asia Standard Time",
6263 "abbr": "WAST",
6264 "offset": 5,
6265 "isdst": false,
6266 "text": "(UTC+05:00) Ashgabat, Tashkent",
6267 "utc": [
6268 "Antarctica/Mawson",
6269 "Asia/Aqtau",
6270 "Asia/Aqtobe",
6271 "Asia/Ashgabat",
6272 "Asia/Dushanbe",
6273 "Asia/Oral",
6274 "Asia/Samarkand",
6275 "Asia/Tashkent",
6276 "Etc/GMT-5",
6277 "Indian/Kerguelen",
6278 "Indian/Maldives"
6279 ]
6280 },
6281 {
6282 "name": "Pakistan Standard Time",
6283 "abbr": "PST",
6284 "offset": 5,
6285 "isdst": false,
6286 "text": "(UTC+05:00) Islamabad, Karachi",
6287 "utc": [
6288 "Asia/Karachi"
6289 ]
6290 },
6291 {
6292 "name": "India Standard Time",
6293 "abbr": "IST",
6294 "offset": 5.5,
6295 "isdst": false,
6296 "text": "(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi",
6297 "utc": [
6298 "Asia/Calcutta"
6299 ]
6300 },
6301 {
6302 "name": "Sri Lanka Standard Time",
6303 "abbr": "SLST",
6304 "offset": 5.5,
6305 "isdst": false,
6306 "text": "(UTC+05:30) Sri Jayawardenepura",
6307 "utc": [
6308 "Asia/Colombo"
6309 ]
6310 },
6311 {
6312 "name": "Nepal Standard Time",
6313 "abbr": "NST",
6314 "offset": 5.75,
6315 "isdst": false,
6316 "text": "(UTC+05:45) Kathmandu",
6317 "utc": [
6318 "Asia/Katmandu"
6319 ]
6320 },
6321 {
6322 "name": "Central Asia Standard Time",
6323 "abbr": "CAST",
6324 "offset": 6,
6325 "isdst": false,
6326 "text": "(UTC+06:00) Astana",
6327 "utc": [
6328 "Antarctica/Vostok",
6329 "Asia/Almaty",
6330 "Asia/Bishkek",
6331 "Asia/Qyzylorda",
6332 "Asia/Urumqi",
6333 "Etc/GMT-6",
6334 "Indian/Chagos"
6335 ]
6336 },
6337 {
6338 "name": "Bangladesh Standard Time",
6339 "abbr": "BST",
6340 "offset": 6,
6341 "isdst": false,
6342 "text": "(UTC+06:00) Dhaka",
6343 "utc": [
6344 "Asia/Dhaka",
6345 "Asia/Thimphu"
6346 ]
6347 },
6348 {
6349 "name": "Ekaterinburg Standard Time",
6350 "abbr": "EST",
6351 "offset": 6,
6352 "isdst": false,
6353 "text": "(UTC+06:00) Ekaterinburg",
6354 "utc": [
6355 "Asia/Yekaterinburg"
6356 ]
6357 },
6358 {
6359 "name": "Myanmar Standard Time",
6360 "abbr": "MST",
6361 "offset": 6.5,
6362 "isdst": false,
6363 "text": "(UTC+06:30) Yangon (Rangoon)",
6364 "utc": [
6365 "Asia/Rangoon",
6366 "Indian/Cocos"
6367 ]
6368 },
6369 {
6370 "name": "SE Asia Standard Time",
6371 "abbr": "SAST",
6372 "offset": 7,
6373 "isdst": false,
6374 "text": "(UTC+07:00) Bangkok, Hanoi, Jakarta",
6375 "utc": [
6376 "Antarctica/Davis",
6377 "Asia/Bangkok",
6378 "Asia/Hovd",
6379 "Asia/Jakarta",
6380 "Asia/Phnom_Penh",
6381 "Asia/Pontianak",
6382 "Asia/Saigon",
6383 "Asia/Vientiane",
6384 "Etc/GMT-7",
6385 "Indian/Christmas"
6386 ]
6387 },
6388 {
6389 "name": "N. Central Asia Standard Time",
6390 "abbr": "NCAST",
6391 "offset": 7,
6392 "isdst": false,
6393 "text": "(UTC+07:00) Novosibirsk",
6394 "utc": [
6395 "Asia/Novokuznetsk",
6396 "Asia/Novosibirsk",
6397 "Asia/Omsk"
6398 ]
6399 },
6400 {
6401 "name": "China Standard Time",
6402 "abbr": "CST",
6403 "offset": 8,
6404 "isdst": false,
6405 "text": "(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi",
6406 "utc": [
6407 "Asia/Hong_Kong",
6408 "Asia/Macau",
6409 "Asia/Shanghai"
6410 ]
6411 },
6412 {
6413 "name": "North Asia Standard Time",
6414 "abbr": "NAST",
6415 "offset": 8,
6416 "isdst": false,
6417 "text": "(UTC+08:00) Krasnoyarsk",
6418 "utc": [
6419 "Asia/Krasnoyarsk"
6420 ]
6421 },
6422 {
6423 "name": "Singapore Standard Time",
6424 "abbr": "MPST",
6425 "offset": 8,
6426 "isdst": false,
6427 "text": "(UTC+08:00) Kuala Lumpur, Singapore",
6428 "utc": [
6429 "Asia/Brunei",
6430 "Asia/Kuala_Lumpur",
6431 "Asia/Kuching",
6432 "Asia/Makassar",
6433 "Asia/Manila",
6434 "Asia/Singapore",
6435 "Etc/GMT-8"
6436 ]
6437 },
6438 {
6439 "name": "W. Australia Standard Time",
6440 "abbr": "WAST",
6441 "offset": 8,
6442 "isdst": false,
6443 "text": "(UTC+08:00) Perth",
6444 "utc": [
6445 "Antarctica/Casey",
6446 "Australia/Perth"
6447 ]
6448 },
6449 {
6450 "name": "Taipei Standard Time",
6451 "abbr": "TST",
6452 "offset": 8,
6453 "isdst": false,
6454 "text": "(UTC+08:00) Taipei",
6455 "utc": [
6456 "Asia/Taipei"
6457 ]
6458 },
6459 {
6460 "name": "Ulaanbaatar Standard Time",
6461 "abbr": "UST",
6462 "offset": 8,
6463 "isdst": false,
6464 "text": "(UTC+08:00) Ulaanbaatar",
6465 "utc": [
6466 "Asia/Choibalsan",
6467 "Asia/Ulaanbaatar"
6468 ]
6469 },
6470 {
6471 "name": "North Asia East Standard Time",
6472 "abbr": "NAEST",
6473 "offset": 9,
6474 "isdst": false,
6475 "text": "(UTC+09:00) Irkutsk",
6476 "utc": [
6477 "Asia/Irkutsk"
6478 ]
6479 },
6480 {
6481 "name": "Tokyo Standard Time",
6482 "abbr": "TST",
6483 "offset": 9,
6484 "isdst": false,
6485 "text": "(UTC+09:00) Osaka, Sapporo, Tokyo",
6486 "utc": [
6487 "Asia/Dili",
6488 "Asia/Jayapura",
6489 "Asia/Tokyo",
6490 "Etc/GMT-9",
6491 "Pacific/Palau"
6492 ]
6493 },
6494 {
6495 "name": "Korea Standard Time",
6496 "abbr": "KST",
6497 "offset": 9,
6498 "isdst": false,
6499 "text": "(UTC+09:00) Seoul",
6500 "utc": [
6501 "Asia/Pyongyang",
6502 "Asia/Seoul"
6503 ]
6504 },
6505 {
6506 "name": "Cen. Australia Standard Time",
6507 "abbr": "CAST",
6508 "offset": 9.5,
6509 "isdst": false,
6510 "text": "(UTC+09:30) Adelaide",
6511 "utc": [
6512 "Australia/Adelaide",
6513 "Australia/Broken_Hill"
6514 ]
6515 },
6516 {
6517 "name": "AUS Central Standard Time",
6518 "abbr": "ACST",
6519 "offset": 9.5,
6520 "isdst": false,
6521 "text": "(UTC+09:30) Darwin",
6522 "utc": [
6523 "Australia/Darwin"
6524 ]
6525 },
6526 {
6527 "name": "E. Australia Standard Time",
6528 "abbr": "EAST",
6529 "offset": 10,
6530 "isdst": false,
6531 "text": "(UTC+10:00) Brisbane",
6532 "utc": [
6533 "Australia/Brisbane",
6534 "Australia/Lindeman"
6535 ]
6536 },
6537 {
6538 "name": "AUS Eastern Standard Time",
6539 "abbr": "AEST",
6540 "offset": 10,
6541 "isdst": false,
6542 "text": "(UTC+10:00) Canberra, Melbourne, Sydney",
6543 "utc": [
6544 "Australia/Melbourne",
6545 "Australia/Sydney"
6546 ]
6547 },
6548 {
6549 "name": "West Pacific Standard Time",
6550 "abbr": "WPST",
6551 "offset": 10,
6552 "isdst": false,
6553 "text": "(UTC+10:00) Guam, Port Moresby",
6554 "utc": [
6555 "Antarctica/DumontDUrville",
6556 "Etc/GMT-10",
6557 "Pacific/Guam",
6558 "Pacific/Port_Moresby",
6559 "Pacific/Saipan",
6560 "Pacific/Truk"
6561 ]
6562 },
6563 {
6564 "name": "Tasmania Standard Time",
6565 "abbr": "TST",
6566 "offset": 10,
6567 "isdst": false,
6568 "text": "(UTC+10:00) Hobart",
6569 "utc": [
6570 "Australia/Currie",
6571 "Australia/Hobart"
6572 ]
6573 },
6574 {
6575 "name": "Yakutsk Standard Time",
6576 "abbr": "YST",
6577 "offset": 10,
6578 "isdst": false,
6579 "text": "(UTC+10:00) Yakutsk",
6580 "utc": [
6581 "Asia/Chita",
6582 "Asia/Khandyga",
6583 "Asia/Yakutsk"
6584 ]
6585 },
6586 {
6587 "name": "Central Pacific Standard Time",
6588 "abbr": "CPST",
6589 "offset": 11,
6590 "isdst": false,
6591 "text": "(UTC+11:00) Solomon Is., New Caledonia",
6592 "utc": [
6593 "Antarctica/Macquarie",
6594 "Etc/GMT-11",
6595 "Pacific/Efate",
6596 "Pacific/Guadalcanal",
6597 "Pacific/Kosrae",
6598 "Pacific/Noumea",
6599 "Pacific/Ponape"
6600 ]
6601 },
6602 {
6603 "name": "Vladivostok Standard Time",
6604 "abbr": "VST",
6605 "offset": 11,
6606 "isdst": false,
6607 "text": "(UTC+11:00) Vladivostok",
6608 "utc": [
6609 "Asia/Sakhalin",
6610 "Asia/Ust-Nera",
6611 "Asia/Vladivostok"
6612 ]
6613 },
6614 {
6615 "name": "New Zealand Standard Time",
6616 "abbr": "NZST",
6617 "offset": 12,
6618 "isdst": false,
6619 "text": "(UTC+12:00) Auckland, Wellington",
6620 "utc": [
6621 "Antarctica/McMurdo",
6622 "Pacific/Auckland"
6623 ]
6624 },
6625 {
6626 "name": "UTC+12",
6627 "abbr": "U",
6628 "offset": 12,
6629 "isdst": false,
6630 "text": "(UTC+12:00) Coordinated Universal Time+12",
6631 "utc": [
6632 "Etc/GMT-12",
6633 "Pacific/Funafuti",
6634 "Pacific/Kwajalein",
6635 "Pacific/Majuro",
6636 "Pacific/Nauru",
6637 "Pacific/Tarawa",
6638 "Pacific/Wake",
6639 "Pacific/Wallis"
6640 ]
6641 },
6642 {
6643 "name": "Fiji Standard Time",
6644 "abbr": "FST",
6645 "offset": 12,
6646 "isdst": false,
6647 "text": "(UTC+12:00) Fiji",
6648 "utc": [
6649 "Pacific/Fiji"
6650 ]
6651 },
6652 {
6653 "name": "Magadan Standard Time",
6654 "abbr": "MST",
6655 "offset": 12,
6656 "isdst": false,
6657 "text": "(UTC+12:00) Magadan",
6658 "utc": [
6659 "Asia/Anadyr",
6660 "Asia/Kamchatka",
6661 "Asia/Magadan",
6662 "Asia/Srednekolymsk"
6663 ]
6664 },
6665 {
6666 "name": "Kamchatka Standard Time",
6667 "abbr": "KDT",
6668 "offset": 13,
6669 "isdst": true,
6670 "text": "(UTC+12:00) Petropavlovsk-Kamchatsky - Old"
6671 },
6672 {
6673 "name": "Tonga Standard Time",
6674 "abbr": "TST",
6675 "offset": 13,
6676 "isdst": false,
6677 "text": "(UTC+13:00) Nuku'alofa",
6678 "utc": [
6679 "Etc/GMT-13",
6680 "Pacific/Enderbury",
6681 "Pacific/Fakaofo",
6682 "Pacific/Tongatapu"
6683 ]
6684 },
6685 {
6686 "name": "Samoa Standard Time",
6687 "abbr": "SST",
6688 "offset": 13,
6689 "isdst": false,
6690 "text": "(UTC+13:00) Samoa",
6691 "utc": [
6692 "Pacific/Apia"
6693 ]
6694 }
6695 ],
6696 //List source: http://answers.google.com/answers/threadview/id/589312.html
6697 profession: [
6698 "Airline Pilot",
6699 "Academic Team",
6700 "Accountant",
6701 "Account Executive",
6702 "Actor",
6703 "Actuary",
6704 "Acquisition Analyst",
6705 "Administrative Asst.",
6706 "Administrative Analyst",
6707 "Administrator",
6708 "Advertising Director",
6709 "Aerospace Engineer",
6710 "Agent",
6711 "Agricultural Inspector",
6712 "Agricultural Scientist",
6713 "Air Traffic Controller",
6714 "Animal Trainer",
6715 "Anthropologist",
6716 "Appraiser",
6717 "Architect",
6718 "Art Director",
6719 "Artist",
6720 "Astronomer",
6721 "Athletic Coach",
6722 "Auditor",
6723 "Author",
6724 "Baker",
6725 "Banker",
6726 "Bankruptcy Attorney",
6727 "Benefits Manager",
6728 "Biologist",
6729 "Bio-feedback Specialist",
6730 "Biomedical Engineer",
6731 "Biotechnical Researcher",
6732 "Broadcaster",
6733 "Broker",
6734 "Building Manager",
6735 "Building Contractor",
6736 "Building Inspector",
6737 "Business Analyst",
6738 "Business Planner",
6739 "Business Manager",
6740 "Buyer",
6741 "Call Center Manager",
6742 "Career Counselor",
6743 "Cash Manager",
6744 "Ceramic Engineer",
6745 "Chief Executive Officer",
6746 "Chief Operation Officer",
6747 "Chef",
6748 "Chemical Engineer",
6749 "Chemist",
6750 "Child Care Manager",
6751 "Chief Medical Officer",
6752 "Chiropractor",
6753 "Cinematographer",
6754 "City Housing Manager",
6755 "City Manager",
6756 "Civil Engineer",
6757 "Claims Manager",
6758 "Clinical Research Assistant",
6759 "Collections Manager",
6760 "Compliance Manager",
6761 "Comptroller",
6762 "Computer Manager",
6763 "Commercial Artist",
6764 "Communications Affairs Director",
6765 "Communications Director",
6766 "Communications Engineer",
6767 "Compensation Analyst",
6768 "Computer Programmer",
6769 "Computer Ops. Manager",
6770 "Computer Engineer",
6771 "Computer Operator",
6772 "Computer Graphics Specialist",
6773 "Construction Engineer",
6774 "Construction Manager",
6775 "Consultant",
6776 "Consumer Relations Manager",
6777 "Contract Administrator",
6778 "Copyright Attorney",
6779 "Copywriter",
6780 "Corporate Planner",
6781 "Corrections Officer",
6782 "Cosmetologist",
6783 "Credit Analyst",
6784 "Cruise Director",
6785 "Chief Information Officer",
6786 "Chief Technology Officer",
6787 "Customer Service Manager",
6788 "Cryptologist",
6789 "Dancer",
6790 "Data Security Manager",
6791 "Database Manager",
6792 "Day Care Instructor",
6793 "Dentist",
6794 "Designer",
6795 "Design Engineer",
6796 "Desktop Publisher",
6797 "Developer",
6798 "Development Officer",
6799 "Diamond Merchant",
6800 "Dietitian",
6801 "Direct Marketer",
6802 "Director",
6803 "Distribution Manager",
6804 "Diversity Manager",
6805 "Economist",
6806 "EEO Compliance Manager",
6807 "Editor",
6808 "Education Adminator",
6809 "Electrical Engineer",
6810 "Electro Optical Engineer",
6811 "Electronics Engineer",
6812 "Embassy Management",
6813 "Employment Agent",
6814 "Engineer Technician",
6815 "Entrepreneur",
6816 "Environmental Analyst",
6817 "Environmental Attorney",
6818 "Environmental Engineer",
6819 "Environmental Specialist",
6820 "Escrow Officer",
6821 "Estimator",
6822 "Executive Assistant",
6823 "Executive Director",
6824 "Executive Recruiter",
6825 "Facilities Manager",
6826 "Family Counselor",
6827 "Fashion Events Manager",
6828 "Fashion Merchandiser",
6829 "Fast Food Manager",
6830 "Film Producer",
6831 "Film Production Assistant",
6832 "Financial Analyst",
6833 "Financial Planner",
6834 "Financier",
6835 "Fine Artist",
6836 "Wildlife Specialist",
6837 "Fitness Consultant",
6838 "Flight Attendant",
6839 "Flight Engineer",
6840 "Floral Designer",
6841 "Food & Beverage Director",
6842 "Food Service Manager",
6843 "Forestry Technician",
6844 "Franchise Management",
6845 "Franchise Sales",
6846 "Fraud Investigator",
6847 "Freelance Writer",
6848 "Fund Raiser",
6849 "General Manager",
6850 "Geologist",
6851 "General Counsel",
6852 "Geriatric Specialist",
6853 "Gerontologist",
6854 "Glamour Photographer",
6855 "Golf Club Manager",
6856 "Gourmet Chef",
6857 "Graphic Designer",
6858 "Grounds Keeper",
6859 "Hazardous Waste Manager",
6860 "Health Care Manager",
6861 "Health Therapist",
6862 "Health Service Administrator",
6863 "Hearing Officer",
6864 "Home Economist",
6865 "Horticulturist",
6866 "Hospital Administrator",
6867 "Hotel Manager",
6868 "Human Resources Manager",
6869 "Importer",
6870 "Industrial Designer",
6871 "Industrial Engineer",
6872 "Information Director",
6873 "Inside Sales",
6874 "Insurance Adjuster",
6875 "Interior Decorator",
6876 "Internal Controls Director",
6877 "International Acct.",
6878 "International Courier",
6879 "International Lawyer",
6880 "Interpreter",
6881 "Investigator",
6882 "Investment Banker",
6883 "Investment Manager",
6884 "IT Architect",
6885 "IT Project Manager",
6886 "IT Systems Analyst",
6887 "Jeweler",
6888 "Joint Venture Manager",
6889 "Journalist",
6890 "Labor Negotiator",
6891 "Labor Organizer",
6892 "Labor Relations Manager",
6893 "Lab Services Director",
6894 "Lab Technician",
6895 "Land Developer",
6896 "Landscape Architect",
6897 "Law Enforcement Officer",
6898 "Lawyer",
6899 "Lead Software Engineer",
6900 "Lead Software Test Engineer",
6901 "Leasing Manager",
6902 "Legal Secretary",
6903 "Library Manager",
6904 "Litigation Attorney",
6905 "Loan Officer",
6906 "Lobbyist",
6907 "Logistics Manager",
6908 "Maintenance Manager",
6909 "Management Consultant",
6910 "Managed Care Director",
6911 "Managing Partner",
6912 "Manufacturing Director",
6913 "Manpower Planner",
6914 "Marine Biologist",
6915 "Market Res. Analyst",
6916 "Marketing Director",
6917 "Materials Manager",
6918 "Mathematician",
6919 "Membership Chairman",
6920 "Mechanic",
6921 "Mechanical Engineer",
6922 "Media Buyer",
6923 "Medical Investor",
6924 "Medical Secretary",
6925 "Medical Technician",
6926 "Mental Health Counselor",
6927 "Merchandiser",
6928 "Metallurgical Engineering",
6929 "Meteorologist",
6930 "Microbiologist",
6931 "MIS Manager",
6932 "Motion Picture Director",
6933 "Multimedia Director",
6934 "Musician",
6935 "Network Administrator",
6936 "Network Specialist",
6937 "Network Operator",
6938 "New Product Manager",
6939 "Novelist",
6940 "Nuclear Engineer",
6941 "Nuclear Specialist",
6942 "Nutritionist",
6943 "Nursing Administrator",
6944 "Occupational Therapist",
6945 "Oceanographer",
6946 "Office Manager",
6947 "Operations Manager",
6948 "Operations Research Director",
6949 "Optical Technician",
6950 "Optometrist",
6951 "Organizational Development Manager",
6952 "Outplacement Specialist",
6953 "Paralegal",
6954 "Park Ranger",
6955 "Patent Attorney",
6956 "Payroll Specialist",
6957 "Personnel Specialist",
6958 "Petroleum Engineer",
6959 "Pharmacist",
6960 "Photographer",
6961 "Physical Therapist",
6962 "Physician",
6963 "Physician Assistant",
6964 "Physicist",
6965 "Planning Director",
6966 "Podiatrist",
6967 "Political Analyst",
6968 "Political Scientist",
6969 "Politician",
6970 "Portfolio Manager",
6971 "Preschool Management",
6972 "Preschool Teacher",
6973 "Principal",
6974 "Private Banker",
6975 "Private Investigator",
6976 "Probation Officer",
6977 "Process Engineer",
6978 "Producer",
6979 "Product Manager",
6980 "Product Engineer",
6981 "Production Engineer",
6982 "Production Planner",
6983 "Professional Athlete",
6984 "Professional Coach",
6985 "Professor",
6986 "Project Engineer",
6987 "Project Manager",
6988 "Program Manager",
6989 "Property Manager",
6990 "Public Administrator",
6991 "Public Safety Director",
6992 "PR Specialist",
6993 "Publisher",
6994 "Purchasing Agent",
6995 "Publishing Director",
6996 "Quality Assurance Specialist",
6997 "Quality Control Engineer",
6998 "Quality Control Inspector",
6999 "Radiology Manager",
7000 "Railroad Engineer",
7001 "Real Estate Broker",
7002 "Recreational Director",
7003 "Recruiter",
7004 "Redevelopment Specialist",
7005 "Regulatory Affairs Manager",
7006 "Registered Nurse",
7007 "Rehabilitation Counselor",
7008 "Relocation Manager",
7009 "Reporter",
7010 "Research Specialist",
7011 "Restaurant Manager",
7012 "Retail Store Manager",
7013 "Risk Analyst",
7014 "Safety Engineer",
7015 "Sales Engineer",
7016 "Sales Trainer",
7017 "Sales Promotion Manager",
7018 "Sales Representative",
7019 "Sales Manager",
7020 "Service Manager",
7021 "Sanitation Engineer",
7022 "Scientific Programmer",
7023 "Scientific Writer",
7024 "Securities Analyst",
7025 "Security Consultant",
7026 "Security Director",
7027 "Seminar Presenter",
7028 "Ship's Officer",
7029 "Singer",
7030 "Social Director",
7031 "Social Program Planner",
7032 "Social Research",
7033 "Social Scientist",
7034 "Social Worker",
7035 "Sociologist",
7036 "Software Developer",
7037 "Software Engineer",
7038 "Software Test Engineer",
7039 "Soil Scientist",
7040 "Special Events Manager",
7041 "Special Education Teacher",
7042 "Special Projects Director",
7043 "Speech Pathologist",
7044 "Speech Writer",
7045 "Sports Event Manager",
7046 "Statistician",
7047 "Store Manager",
7048 "Strategic Alliance Director",
7049 "Strategic Planning Director",
7050 "Stress Reduction Specialist",
7051 "Stockbroker",
7052 "Surveyor",
7053 "Structural Engineer",
7054 "Superintendent",
7055 "Supply Chain Director",
7056 "System Engineer",
7057 "Systems Analyst",
7058 "Systems Programmer",
7059 "System Administrator",
7060 "Tax Specialist",
7061 "Teacher",
7062 "Technical Support Specialist",
7063 "Technical Illustrator",
7064 "Technical Writer",
7065 "Technology Director",
7066 "Telecom Analyst",
7067 "Telemarketer",
7068 "Theatrical Director",
7069 "Title Examiner",
7070 "Tour Escort",
7071 "Tour Guide Director",
7072 "Traffic Manager",
7073 "Trainer Translator",
7074 "Transportation Manager",
7075 "Travel Agent",
7076 "Treasurer",
7077 "TV Programmer",
7078 "Underwriter",
7079 "Union Representative",
7080 "University Administrator",
7081 "University Dean",
7082 "Urban Planner",
7083 "Veterinarian",
7084 "Vendor Relations Director",
7085 "Viticulturist",
7086 "Warehouse Manager"
7087 ],
7088 animals : {
7089 //list of ocean animals comes from https://owlcation.com/stem/list-of-ocean-animals
7090 "ocean" : ["Acantharea","Anemone","Angelfish King","Ahi Tuna","Albacore","American Oyster","Anchovy","Armored Snail","Arctic Char","Atlantic Bluefin Tuna","Atlantic Cod","Atlantic Goliath Grouper","Atlantic Trumpetfish","Atlantic Wolffish","Baleen Whale","Banded Butterflyfish","Banded Coral Shrimp","Banded Sea Krait","Barnacle","Barndoor Skate","Barracuda","Basking Shark","Bass","Beluga Whale","Bluebanded Goby","Bluehead Wrasse","Bluefish","Bluestreak Cleaner-Wrasse","Blue Marlin","Blue Shark","Blue Spiny Lobster","Blue Tang","Blue Whale","Broadclub Cuttlefish","Bull Shark","Chambered Nautilus","Chilean Basket Star","Chilean Jack Mackerel","Chinook Salmon","Christmas Tree Worm","Clam","Clown Anemonefish","Clown Triggerfish","Cod","Coelacanth","Cockscomb Cup Coral","Common Fangtooth","Conch","Cookiecutter Shark","Copepod","Coral","Corydoras","Cownose Ray","Crab","Crown-of-Thorns Starfish","Cushion Star","Cuttlefish","California Sea Otters","Dolphin","Dolphinfish","Dory","Devil Fish","Dugong","Dumbo Octopus","Dungeness Crab","Eccentric Sand Dollar","Edible Sea Cucumber","Eel","Elephant Seal","Elkhorn Coral","Emperor Shrimp","Estuarine Crocodile","Fathead Sculpin","Fiddler Crab","Fin Whale","Flameback","Flamingo Tongue Snail","Flashlight Fish","Flatback Turtle","Flatfish","Flying Fish","Flounder","Fluke","French Angelfish","Frilled Shark","Fugu (also called Pufferfish)","Gar","Geoduck","Giant Barrel Sponge","Giant Caribbean Sea Anemone","Giant Clam","Giant Isopod","Giant Kingfish","Giant Oarfish","Giant Pacific Octopus","Giant Pyrosome","Giant Sea Star","Giant Squid","Glowing Sucker Octopus","Giant Tube Worm","Goblin Shark","Goosefish","Great White Shark","Greenland Shark","Grey Atlantic Seal","Grouper","Grunion","Guineafowl Puffer","Haddock","Hake","Halibut","Hammerhead Shark","Hapuka","Harbor Porpoise","Harbor Seal","Hatchetfish","Hawaiian Monk Seal","Hawksbill Turtle","Hector's Dolphin","Hermit Crab","Herring","Hoki","Horn Shark","Horseshoe Crab","Humpback Anglerfish","Humpback Whale","Icefish","Imperator Angelfish","Irukandji Jellyfish","Isopod","Ivory Bush Coral","Japanese Spider Crab","Jellyfish","John Dory","Juan Fernandez Fur Seal","Killer Whale","Kiwa Hirsuta","Krill","Lagoon Triggerfish","Lamprey","Leafy Seadragon","Leopard Seal","Limpet","Ling","Lionfish","Lions Mane Jellyfish","Lobe Coral","Lobster","Loggerhead Turtle","Longnose Sawshark","Longsnout Seahorse","Lophelia Coral","Marrus Orthocanna","Manatee","Manta Ray","Marlin","Megamouth Shark","Mexican Lookdown","Mimic Octopus","Moon Jelly","Mollusk","Monkfish","Moray Eel","Mullet","Mussel","Megaladon","Napoleon Wrasse","Nassau Grouper","Narwhal","Nautilus","Needlefish","Northern Seahorse","North Atlantic Right Whale","Northern Red Snapper","Norway Lobster","Nudibranch","Nurse Shark","Oarfish","Ocean Sunfish","Oceanic Whitetip Shark","Octopus","Olive Sea Snake","Orange Roughy","Ostracod","Otter","Oyster","Pacific Angelshark","Pacific Blackdragon","Pacific Halibut","Pacific Sardine","Pacific Sea Nettle Jellyfish","Pacific White Sided Dolphin","Pantropical Spotted Dolphin","Patagonian Toothfish","Peacock Mantis Shrimp","Pelagic Thresher Shark","Penguin","Peruvian Anchoveta","Pilchard","Pink Salmon","Pinniped","Plankton","Porpoise","Polar Bear","Portuguese Man o' War","Pycnogonid Sea Spider","Quahog","Queen Angelfish","Queen Conch","Queen Parrotfish","Queensland Grouper","Ragfish","Ratfish","Rattail Fish","Ray","Red Drum","Red King Crab","Ringed Seal","Risso's Dolphin","Ross Seals","Sablefish","Salmon","Sand Dollar","Sandbar Shark","Sawfish","Sarcastic Fringehead","Scalloped Hammerhead Shark","Seahorse","Sea Cucumber","Sea Lion","Sea Urchin","Seal","Shark","Shortfin Mako Shark","Shovelnose Guitarfish","Shrimp","Silverside Fish","Skipjack Tuna","Slender Snipe Eel","Smalltooth Sawfish","Smelts","Sockeye Salmon","Southern Stingray","Sponge","Spotted Porcupinefish","Spotted Dolphin","Spotted Eagle Ray","Spotted Moray","Squid","Squidworm","Starfish","Stickleback","Stonefish","Stoplight Loosejaw","Sturgeon","Swordfish","Tan Bristlemouth","Tasseled Wobbegong","Terrible Claw Lobster","Threespot Damselfish","Tiger Prawn","Tiger Shark","Tilefish","Toadfish","Tropical Two-Wing Flyfish","Tuna","Umbrella Squid","Velvet Crab","Venus Flytrap Sea Anemone","Vigtorniella Worm","Viperfish","Vampire Squid","Vaquita","Wahoo","Walrus","West Indian Manatee","Whale","Whale Shark","Whiptail Gulper","White-Beaked Dolphin","White-Ring Garden Eel","White Shrimp","Wobbegong","Wrasse","Wreckfish","Xiphosura","Yellowtail Damselfish","Yelloweye Rockfish","Yellow Cup Black Coral","Yellow Tube Sponge","Yellowfin Tuna","Zebrashark","Zooplankton"],
7091 //list of desert, grassland, and forest animals comes from http://www.skyenimals.com/
7092 "desert" : ["Aardwolf","Addax","African Wild Ass","Ant","Antelope","Armadillo","Baboon","Badger","Bat","Bearded Dragon","Beetle","Bird","Black-footed Cat","Boa","Brown Bear","Bustard","Butterfly","Camel","Caracal","Caracara","Caterpillar","Centipede","Cheetah","Chipmunk","Chuckwalla","Climbing Mouse","Coati","Cobra","Cotton Rat","Cougar","Courser","Crane Fly","Crow","Dassie Rat","Dove","Dunnart","Eagle","Echidna","Elephant","Emu","Falcon","Fly","Fox","Frogmouth","Gecko","Geoffroy's Cat","Gerbil","Grasshopper","Guanaco","Gundi","Hamster","Hawk","Hedgehog","Hyena","Hyrax","Jackal","Kangaroo","Kangaroo Rat","Kestrel","Kowari","Kultarr","Leopard","Lion","Macaw","Meerkat","Mouse","Oryx","Ostrich","Owl","Pronghorn","Python","Rabbit","Raccoon","Rattlesnake","Rhinoceros","Sand Cat","Spectacled Bear","Spiny Mouse","Starling","Stick Bug","Tarantula","Tit","Toad","Tortoise","Tyrant Flycatcher","Viper","Vulture","Waxwing","Xerus","Zebra"],
7093 "grassland" : ["Aardvark","Aardwolf","Accentor","African Buffalo","African Wild Dog","Alpaca","Anaconda","Ant","Anteater","Antelope","Armadillo","Baboon","Badger","Bandicoot","Barbet","Bat","Bee","Bee-eater","Beetle","Bird","Bison","Black-footed Cat","Black-footed Ferret","Bluebird","Boa","Bowerbird","Brown Bear","Bush Dog","Bushshrike","Bustard","Butterfly","Buzzard","Caracal","Caracara","Cardinal","Caterpillar","Cheetah","Chipmunk","Civet","Climbing Mouse","Clouded Leopard","Coati","Cobra","Cockatoo","Cockroach","Common Genet","Cotton Rat","Cougar","Courser","Coyote","Crane","Crane Fly","Cricket","Crow","Culpeo","Death Adder","Deer","Deer Mouse","Dingo","Dinosaur","Dove","Drongo","Duck","Duiker","Dunnart","Eagle","Echidna","Elephant","Elk","Emu","Falcon","Finch","Flea","Fly","Flying Frog","Fox","Frog","Frogmouth","Garter Snake","Gazelle","Gecko","Geoffroy's Cat","Gerbil","Giant Tortoise","Giraffe","Grasshopper","Grison","Groundhog","Grouse","Guanaco","Guinea Pig","Hamster","Harrier","Hartebeest","Hawk","Hedgehog","Helmetshrike","Hippopotamus","Hornbill","Hyena","Hyrax","Impala","Jackal","Jaguar","Jaguarundi","Kangaroo","Kangaroo Rat","Kestrel","Kultarr","Ladybug","Leopard","Lion","Macaw","Meerkat","Mouse","Newt","Oryx","Ostrich","Owl","Pangolin","Pheasant","Prairie Dog","Pronghorn","Przewalski's Horse","Python","Quoll","Rabbit","Raven","Rhinoceros","Shelduck","Sloth Bear","Spectacled Bear","Squirrel","Starling","Stick Bug","Tamandua","Tasmanian Devil","Thornbill","Thrush","Toad","Tortoise"],
7094 "forest" : ["Agouti","Anaconda","Anoa","Ant","Anteater","Antelope","Armadillo","Asian Black Bear","Aye-aye","Babirusa","Baboon","Badger","Bandicoot","Banteng","Barbet","Basilisk","Bat","Bearded Dragon","Bee","Bee-eater","Beetle","Bettong","Binturong","Bird-of-paradise","Bongo","Bowerbird","Bulbul","Bush Dog","Bushbaby","Bushshrike","Butterfly","Buzzard","Caecilian","Cardinal","Cassowary","Caterpillar","Centipede","Chameleon","Chimpanzee","Cicada","Civet","Clouded Leopard","Coati","Cobra","Cockatoo","Cockroach","Colugo","Cotinga","Cotton Rat","Cougar","Crane Fly","Cricket","Crocodile","Crow","Cuckoo","Cuscus","Death Adder","Deer","Dhole","Dingo","Dinosaur","Drongo","Duck","Duiker","Eagle","Echidna","Elephant","Finch","Flat-headed Cat","Flea","Flowerpecker","Fly","Flying Frog","Fossa","Frog","Frogmouth","Gaur","Gecko","Gorilla","Grison","Hawaiian Honeycreeper","Hawk","Hedgehog","Helmetshrike","Hornbill","Hyrax","Iguana","Jackal","Jaguar","Jaguarundi","Kestrel","Ladybug","Lemur","Leopard","Lion","Macaw","Mandrill","Margay","Monkey","Mouse","Mouse Deer","Newt","Okapi","Old World Flycatcher","Orangutan","Owl","Pangolin","Peafowl","Pheasant","Possum","Python","Quokka","Rabbit","Raccoon","Red Panda","Red River Hog","Rhinoceros","Sloth Bear","Spectacled Bear","Squirrel","Starling","Stick Bug","Sun Bear","Tamandua","Tamarin","Tapir","Tarantula","Thrush","Tiger","Tit","Toad","Tortoise","Toucan","Trogon","Trumpeter","Turaco","Turtle","Tyrant Flycatcher","Viper","Vulture","Wallaby","Warbler","Wasp","Waxwing","Weaver","Weaver-finch","Whistler","White-eye","Whydah","Woodswallow","Worm","Wren","Xenops","Yellowjacket","Accentor","African Buffalo","American Black Bear","Anole","Bird","Bison","Boa","Brown Bear","Chipmunk","Common Genet","Copperhead","Coyote","Deer Mouse","Dormouse","Elk","Emu","Fisher","Fox","Garter Snake","Giant Panda","Giant Tortoise","Groundhog","Grouse","Guanaco","Himalayan Tahr","Kangaroo","Koala","Numbat","Quoll","Raccoon dog","Tasmanian Devil","Thornbill","Turkey","Vole","Weasel","Wildcat","Wolf","Wombat","Woodchuck","Woodpecker"],
7095 //list of farm animals comes from https://www.buzzle.com/articles/farm-animals-list.html
7096 "farm" : ["Alpaca","Buffalo","Banteng","Cow","Cat","Chicken","Carp","Camel","Donkey","Dog","Duck","Emu","Goat","Gayal","Guinea","Goose","Horse","Honey","Llama","Pig","Pigeon","Rhea","Rabbit","Sheep","Silkworm","Turkey","Yak","Zebu"],
7097 //list of pet animals comes from https://www.dogbreedinfo.com/pets/pet.htm
7098 "pet" : ["Bearded Dragon","Birds","Burro","Cats","Chameleons","Chickens","Chinchillas","Chinese Water Dragon","Cows","Dogs","Donkey","Ducks","Ferrets","Fish","Geckos","Geese","Gerbils","Goats","Guinea Fowl","Guinea Pigs","Hamsters","Hedgehogs","Horses","Iguanas","Llamas","Lizards","Mice","Mule","Peafowl","Pigs and Hogs","Pigeons","Ponies","Pot Bellied Pig","Rabbits","Rats","Sheep","Skinks","Snakes","Stick Insects","Sugar Gliders","Tarantula","Turkeys","Turtles"],
7099 //list of zoo animals comes from https://bronxzoo.com/animals
7100 "zoo" : ["Aardvark","African Wild Dog","Aldabra Tortoise","American Alligator","American Bison","Amur Tiger","Anaconda","Andean Condor","Asian Elephant","Baby Doll Sheep","Bald Eagle","Barred Owl","Blue Iguana","Boer Goat","California Sea Lion","Caribbean Flamingo","Chinchilla","Collared Lemur","Coquerel's Sifaka","Cuban Amazon Parrot","Ebony Langur","Fennec Fox","Fossa","Gelada","Giant Anteater","Giraffe","Gorilla","Grizzly Bear","Henkel's Leaf-tailed Gecko","Indian Gharial","Indian Rhinoceros","King Cobra","King Vulture","Komodo Dragon","Linne's Two-toed Sloth","Lion","Little Penguin","Madagascar Tree Boa","Magellanic Penguin","Malayan Tapir","Malayan Tiger","Matschies Tree Kangaroo","Mini Donkey","Monarch Butterfly","Nile crocodile","North American Porcupine","Nubian Ibex","Okapi","Poison Dart Frog","Polar Bear","Pygmy Marmoset","Radiated Tortoise","Red Panda","Red Ruffed Lemur","Ring-tailed Lemur","Ring-tailed Mongoose","Rock Hyrax","Small Clawed Asian Otter","Snow Leopard","Snowy Owl","Southern White-faced Owl","Southern White Rhinocerous","Squirrel Monkey","Tufted Puffin","White Cheeked Gibbon","White-throated Bee Eater","Zebra"]
7101 },
7102 primes: [
7103 // 1230 first primes, i.e. all primes up to the first one greater than 10000, inclusive.
7104 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699,2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909,2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037,3041,3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,3167,3169,3181,3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,3271,3299,3301,3307,3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389,3391,3407,3413,3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517,3527,3529,3533,3539,3541,3547,3557,3559,3571,3581,3583,3593,3607,3613,3617,3623,3631,3637,3643,3659,3671,3673,3677,3691,3697,3701,3709,3719,3727,3733,3739,3761,3767,3769,3779,3793,3797,3803,3821,3823,3833,3847,3851,3853,3863,3877,3881,3889,3907,3911,3917,3919,3923,3929,3931,3943,3947,3967,3989,4001,4003,4007,4013,4019,4021,4027,4049,4051,4057,4073,4079,4091,4093,4099,4111,4127,4129,4133,4139,4153,4157,4159,4177,4201,4211,4217,4219,4229,4231,4241,4243,4253,4259,4261,4271,4273,4283,4289,4297,4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,4421,4423,4441,4447,4451,4457,4463,4481,4483,4493,4507,4513,4517,4519,4523,4547,4549,4561,4567,4583,4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,4663,4673,4679,4691,4703,4721,4723,4729,4733,4751,4759,4783,4787,4789,4793,4799,4801,4813,4817,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933,4937,4943,4951,4957,4967,4969,4973,4987,4993,4999,5003,5009,5011,5021,5023,5039,5051,5059,5077,5081,5087,5099,5101,5107,5113,5119,5147,5153,5167,5171,5179,5189,5197,5209,5227,5231,5233,5237,5261,5273,5279,5281,5297,5303,5309,5323,5333,5347,5351,5381,5387,5393,5399,5407,5413,5417,5419,5431,5437,5441,5443,5449,5471,5477,5479,5483,5501,5503,5507,5519,5521,5527,5531,5557,5563,5569,5573,5581,5591,5623,5639,5641,5647,5651,5653,5657,5659,5669,5683,5689,5693,5701,5711,5717,5737,5741,5743,5749,5779,5783,5791,5801,5807,5813,5821,5827,5839,5843,5849,5851,5857,5861,5867,5869,5879,5881,5897,5903,5923,5927,5939,5953,5981,5987,6007,6011,6029,6037,6043,6047,6053,6067,6073,6079,6089,6091,6101,6113,6121,6131,6133,6143,6151,6163,6173,6197,6199,6203,6211,6217,6221,6229,6247,6257,6263,6269,6271,6277,6287,6299,6301,6311,6317,6323,6329,6337,6343,6353,6359,6361,6367,6373,6379,6389,6397,6421,6427,6449,6451,6469,6473,6481,6491,6521,6529,6547,6551,6553,6563,6569,6571,6577,6581,6599,6607,6619,6637,6653,6659,6661,6673,6679,6689,6691,6701,6703,6709,6719,6733,6737,6761,6763,6779,6781,6791,6793,6803,6823,6827,6829,6833,6841,6857,6863,6869,6871,6883,6899,6907,6911,6917,6947,6949,6959,6961,6967,6971,6977,6983,6991,6997,7001,7013,7019,7027,7039,7043,7057,7069,7079,7103,7109,7121,7127,7129,7151,7159,7177,7187,7193,7207,7211,7213,7219,7229,7237,7243,7247,7253,7283,7297,7307,7309,7321,7331,7333,7349,7351,7369,7393,7411,7417,7433,7451,7457,7459,7477,7481,7487,7489,7499,7507,7517,7523,7529,7537,7541,7547,7549,7559,7561,7573,7577,7583,7589,7591,7603,7607,7621,7639,7643,7649,7669,7673,7681,7687,7691,7699,7703,7717,7723,7727,7741,7753,7757,7759,7789,7793,7817,7823,7829,7841,7853,7867,7873,7877,7879,7883,7901,7907,7919,7927,7933,7937,7949,7951,7963,7993,8009,8011,8017,8039,8053,8059,8069,8081,8087,8089,8093,8101,8111,8117,8123,8147,8161,8167,8171,8179,8191,8209,8219,8221,8231,8233,8237,8243,8263,8269,8273,8287,8291,8293,8297,8311,8317,8329,8353,8363,8369,8377,8387,8389,8419,8423,8429,8431,8443,8447,8461,8467,8501,8513,8521,8527,8537,8539,8543,8563,8573,8581,8597,8599,8609,8623,8627,8629,8641,8647,8663,8669,8677,8681,8689,8693,8699,8707,8713,8719,8731,8737,8741,8747,8753,8761,8779,8783,8803,8807,8819,8821,8831,8837,8839,8849,8861,8863,8867,8887,8893,8923,8929,8933,8941,8951,8963,8969,8971,8999,9001,9007,9011,9013,9029,9041,9043,9049,9059,9067,9091,9103,9109,9127,9133,9137,9151,9157,9161,9173,9181,9187,9199,9203,9209,9221,9227,9239,9241,9257,9277,9281,9283,9293,9311,9319,9323,9337,9341,9343,9349,9371,9377,9391,9397,9403,9413,9419,9421,9431,9433,9437,9439,9461,9463,9467,9473,9479,9491,9497,9511,9521,9533,9539,9547,9551,9587,9601,9613,9619,9623,9629,9631,9643,9649,9661,9677,9679,9689,9697,9719,9721,9733,9739,9743,9749,9767,9769,9781,9787,9791,9803,9811,9817,9829,9833,9839,9851,9857,9859,9871,9883,9887,9901,9907,9923,9929,9931,9941,9949,9967,9973,10007
7105 ],
7106 emotions: [
7107 "love",
7108 "joy",
7109 "surprise",
7110 "anger",
7111 "sadness",
7112 "fear"
7113 ],
7114 };
7115
7116 var o_hasOwnProperty = Object.prototype.hasOwnProperty;
7117 var o_keys = (Object.keys || function(obj) {
7118 var result = [];
7119 for (var key in obj) {
7120 if (o_hasOwnProperty.call(obj, key)) {
7121 result.push(key);
7122 }
7123 }
7124
7125 return result;
7126 });
7127
7128
7129 function _copyObject(source, target) {
7130 var keys = o_keys(source);
7131 var key;
7132
7133 for (var i = 0, l = keys.length; i < l; i++) {
7134 key = keys[i];
7135 target[key] = source[key] || target[key];
7136 }
7137 }
7138
7139 function _copyArray(source, target) {
7140 for (var i = 0, l = source.length; i < l; i++) {
7141 target[i] = source[i];
7142 }
7143 }
7144
7145 function copyObject(source, _target) {
7146 var isArray = Array.isArray(source);
7147 var target = _target || (isArray ? new Array(source.length) : {});
7148
7149 if (isArray) {
7150 _copyArray(source, target);
7151 } else {
7152 _copyObject(source, target);
7153 }
7154
7155 return target;
7156 }
7157
7158 /** Get the data based on key**/
7159 Chance.prototype.get = function (name) {
7160 return copyObject(data[name]);
7161 };
7162
7163 // Mac Address
7164 Chance.prototype.mac_address = function(options){
7165 // typically mac addresses are separated by ":"
7166 // however they can also be separated by "-"
7167 // the network variant uses a dot every fourth byte
7168
7169 options = initOptions(options);
7170 if(!options.separator) {
7171 options.separator = options.networkVersion ? "." : ":";
7172 }
7173
7174 var mac_pool="ABCDEF1234567890",
7175 mac = "";
7176 if(!options.networkVersion) {
7177 mac = this.n(this.string, 6, { pool: mac_pool, length:2 }).join(options.separator);
7178 } else {
7179 mac = this.n(this.string, 3, { pool: mac_pool, length:4 }).join(options.separator);
7180 }
7181
7182 return mac;
7183 };
7184
7185 Chance.prototype.normal = function (options) {
7186 options = initOptions(options, {mean : 0, dev : 1, pool : []});
7187
7188 testRange(
7189 options.pool.constructor !== Array,
7190 "Chance: The pool option must be a valid array."
7191 );
7192 testRange(
7193 typeof options.mean !== 'number',
7194 "Chance: Mean (mean) must be a number"
7195 );
7196 testRange(
7197 typeof options.dev !== 'number',
7198 "Chance: Standard deviation (dev) must be a number"
7199 );
7200
7201 // If a pool has been passed, then we are returning an item from that pool,
7202 // using the normal distribution settings that were passed in
7203 if (options.pool.length > 0) {
7204 return this.normal_pool(options);
7205 }
7206
7207 // The Marsaglia Polar method
7208 var s, u, v, norm,
7209 mean = options.mean,
7210 dev = options.dev;
7211
7212 do {
7213 // U and V are from the uniform distribution on (-1, 1)
7214 u = this.random() * 2 - 1;
7215 v = this.random() * 2 - 1;
7216
7217 s = u * u + v * v;
7218 } while (s >= 1);
7219
7220 // Compute the standard normal variate
7221 norm = u * Math.sqrt(-2 * Math.log(s) / s);
7222
7223 // Shape and scale
7224 return dev * norm + mean;
7225 };
7226
7227 Chance.prototype.normal_pool = function(options) {
7228 var performanceCounter = 0;
7229 do {
7230 var idx = Math.round(this.normal({ mean: options.mean, dev: options.dev }));
7231 if (idx < options.pool.length && idx >= 0) {
7232 return options.pool[idx];
7233 } else {
7234 performanceCounter++;
7235 }
7236 } while(performanceCounter < 100);
7237
7238 throw new RangeError("Chance: Your pool is too small for the given mean and standard deviation. Please adjust.");
7239 };
7240
7241 Chance.prototype.radio = function (options) {
7242 // Initial Letter (Typically Designated by Side of Mississippi River)
7243 options = initOptions(options, {side : "?"});
7244 var fl = "";
7245 switch (options.side.toLowerCase()) {
7246 case "east":
7247 case "e":
7248 fl = "W";
7249 break;
7250 case "west":
7251 case "w":
7252 fl = "K";
7253 break;
7254 default:
7255 fl = this.character({pool: "KW"});
7256 break;
7257 }
7258
7259 return fl + this.character({alpha: true, casing: "upper"}) +
7260 this.character({alpha: true, casing: "upper"}) +
7261 this.character({alpha: true, casing: "upper"});
7262 };
7263
7264 // Set the data as key and data or the data map
7265 Chance.prototype.set = function (name, values) {
7266 if (typeof name === "string") {
7267 data[name] = values;
7268 } else {
7269 data = copyObject(name, data);
7270 }
7271 };
7272
7273 Chance.prototype.tv = function (options) {
7274 return this.radio(options);
7275 };
7276
7277 // ID number for Brazil companies
7278 Chance.prototype.cnpj = function () {
7279 var n = this.n(this.natural, 8, { max: 9 });
7280 var d1 = 2+n[7]*6+n[6]*7+n[5]*8+n[4]*9+n[3]*2+n[2]*3+n[1]*4+n[0]*5;
7281 d1 = 11 - (d1 % 11);
7282 if (d1>=10){
7283 d1 = 0;
7284 }
7285 var d2 = d1*2+3+n[7]*7+n[6]*8+n[5]*9+n[4]*2+n[3]*3+n[2]*4+n[1]*5+n[0]*6;
7286 d2 = 11 - (d2 % 11);
7287 if (d2>=10){
7288 d2 = 0;
7289 }
7290 return ''+n[0]+n[1]+'.'+n[2]+n[3]+n[4]+'.'+n[5]+n[6]+n[7]+'/0001-'+d1+d2;
7291 };
7292
7293 Chance.prototype.emotion = function () {
7294 return this.pick(this.get("emotions"));
7295 };
7296
7297 // -- End Miscellaneous --
7298
7299 Chance.prototype.mersenne_twister = function (seed) {
7300 return new MersenneTwister(seed);
7301 };
7302
7303 Chance.prototype.blueimp_md5 = function () {
7304 return new BlueImpMD5();
7305 };
7306
7307 // Mersenne Twister from https://gist.github.com/banksean/300494
7308 /*
7309 A C-program for MT19937, with initialization improved 2002/1/26.
7310 Coded by Takuji Nishimura and Makoto Matsumoto.
7311
7312 Before using, initialize the state by using init_genrand(seed)
7313 or init_by_array(init_key, key_length).
7314
7315 Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
7316 All rights reserved.
7317
7318 Redistribution and use in source and binary forms, with or without
7319 modification, are permitted provided that the following conditions
7320 are met:
7321
7322 1. Redistributions of source code must retain the above copyright
7323 notice, this list of conditions and the following disclaimer.
7324
7325 2. Redistributions in binary form must reproduce the above copyright
7326 notice, this list of conditions and the following disclaimer in the
7327 documentation and/or other materials provided with the distribution.
7328
7329 3. The names of its contributors may not be used to endorse or promote
7330 products derived from this software without specific prior written
7331 permission.
7332
7333 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
7334 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7335 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
7336 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
7337 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
7338 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
7339 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
7340 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
7341 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
7342 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
7343 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
7344
7345
7346 Any feedback is very welcome.
7347 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
7348 email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
7349 */
7350 var MersenneTwister = function (seed) {
7351 if (seed === undefined) {
7352 // kept random number same size as time used previously to ensure no unexpected results downstream
7353 seed = Math.floor(Math.random()*Math.pow(10,13));
7354 }
7355 /* Period parameters */
7356 this.N = 624;
7357 this.M = 397;
7358 this.MATRIX_A = 0x9908b0df; /* constant vector a */
7359 this.UPPER_MASK = 0x80000000; /* most significant w-r bits */
7360 this.LOWER_MASK = 0x7fffffff; /* least significant r bits */
7361
7362 this.mt = new Array(this.N); /* the array for the state vector */
7363 this.mti = this.N + 1; /* mti==N + 1 means mt[N] is not initialized */
7364
7365 this.init_genrand(seed);
7366 };
7367
7368 /* initializes mt[N] with a seed */
7369 MersenneTwister.prototype.init_genrand = function (s) {
7370 this.mt[0] = s >>> 0;
7371 for (this.mti = 1; this.mti < this.N; this.mti++) {
7372 s = this.mt[this.mti - 1] ^ (this.mt[this.mti - 1] >>> 30);
7373 this.mt[this.mti] = (((((s & 0xffff0000) >>> 16) * 1812433253) << 16) + (s & 0x0000ffff) * 1812433253) + this.mti;
7374 /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
7375 /* In the previous versions, MSBs of the seed affect */
7376 /* only MSBs of the array mt[]. */
7377 /* 2002/01/09 modified by Makoto Matsumoto */
7378 this.mt[this.mti] >>>= 0;
7379 /* for >32 bit machines */
7380 }
7381 };
7382
7383 /* initialize by an array with array-length */
7384 /* init_key is the array for initializing keys */
7385 /* key_length is its length */
7386 /* slight change for C++, 2004/2/26 */
7387 MersenneTwister.prototype.init_by_array = function (init_key, key_length) {
7388 var i = 1, j = 0, k, s;
7389 this.init_genrand(19650218);
7390 k = (this.N > key_length ? this.N : key_length);
7391 for (; k; k--) {
7392 s = this.mt[i - 1] ^ (this.mt[i - 1] >>> 30);
7393 this.mt[i] = (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1664525) << 16) + ((s & 0x0000ffff) * 1664525))) + init_key[j] + j; /* non linear */
7394 this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */
7395 i++;
7396 j++;
7397 if (i >= this.N) { this.mt[0] = this.mt[this.N - 1]; i = 1; }
7398 if (j >= key_length) { j = 0; }
7399 }
7400 for (k = this.N - 1; k; k--) {
7401 s = this.mt[i - 1] ^ (this.mt[i - 1] >>> 30);
7402 this.mt[i] = (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1566083941) << 16) + (s & 0x0000ffff) * 1566083941)) - i; /* non linear */
7403 this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */
7404 i++;
7405 if (i >= this.N) { this.mt[0] = this.mt[this.N - 1]; i = 1; }
7406 }
7407
7408 this.mt[0] = 0x80000000; /* MSB is 1; assuring non-zero initial array */
7409 };
7410
7411 /* generates a random number on [0,0xffffffff]-interval */
7412 MersenneTwister.prototype.genrand_int32 = function () {
7413 var y;
7414 var mag01 = new Array(0x0, this.MATRIX_A);
7415 /* mag01[x] = x * MATRIX_A for x=0,1 */
7416
7417 if (this.mti >= this.N) { /* generate N words at one time */
7418 var kk;
7419
7420 if (this.mti === this.N + 1) { /* if init_genrand() has not been called, */
7421 this.init_genrand(5489); /* a default initial seed is used */
7422 }
7423 for (kk = 0; kk < this.N - this.M; kk++) {
7424 y = (this.mt[kk]&this.UPPER_MASK)|(this.mt[kk + 1]&this.LOWER_MASK);
7425 this.mt[kk] = this.mt[kk + this.M] ^ (y >>> 1) ^ mag01[y & 0x1];
7426 }
7427 for (;kk < this.N - 1; kk++) {
7428 y = (this.mt[kk]&this.UPPER_MASK)|(this.mt[kk + 1]&this.LOWER_MASK);
7429 this.mt[kk] = this.mt[kk + (this.M - this.N)] ^ (y >>> 1) ^ mag01[y & 0x1];
7430 }
7431 y = (this.mt[this.N - 1]&this.UPPER_MASK)|(this.mt[0]&this.LOWER_MASK);
7432 this.mt[this.N - 1] = this.mt[this.M - 1] ^ (y >>> 1) ^ mag01[y & 0x1];
7433
7434 this.mti = 0;
7435 }
7436
7437 y = this.mt[this.mti++];
7438
7439 /* Tempering */
7440 y ^= (y >>> 11);
7441 y ^= (y << 7) & 0x9d2c5680;
7442 y ^= (y << 15) & 0xefc60000;
7443 y ^= (y >>> 18);
7444
7445 return y >>> 0;
7446 };
7447
7448 /* generates a random number on [0,0x7fffffff]-interval */
7449 MersenneTwister.prototype.genrand_int31 = function () {
7450 return (this.genrand_int32() >>> 1);
7451 };
7452
7453 /* generates a random number on [0,1]-real-interval */
7454 MersenneTwister.prototype.genrand_real1 = function () {
7455 return this.genrand_int32() * (1.0 / 4294967295.0);
7456 /* divided by 2^32-1 */
7457 };
7458
7459 /* generates a random number on [0,1)-real-interval */
7460 MersenneTwister.prototype.random = function () {
7461 return this.genrand_int32() * (1.0 / 4294967296.0);
7462 /* divided by 2^32 */
7463 };
7464
7465 /* generates a random number on (0,1)-real-interval */
7466 MersenneTwister.prototype.genrand_real3 = function () {
7467 return (this.genrand_int32() + 0.5) * (1.0 / 4294967296.0);
7468 /* divided by 2^32 */
7469 };
7470
7471 /* generates a random number on [0,1) with 53-bit resolution*/
7472 MersenneTwister.prototype.genrand_res53 = function () {
7473 var a = this.genrand_int32()>>>5, b = this.genrand_int32()>>>6;
7474 return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0);
7475 };
7476
7477 // BlueImp MD5 hashing algorithm from https://github.com/blueimp/JavaScript-MD5
7478 var BlueImpMD5 = function () {};
7479
7480 BlueImpMD5.prototype.VERSION = '1.0.1';
7481
7482 /*
7483 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
7484 * to work around bugs in some JS interpreters.
7485 */
7486 BlueImpMD5.prototype.safe_add = function safe_add(x, y) {
7487 var lsw = (x & 0xFFFF) + (y & 0xFFFF),
7488 msw = (x >> 16) + (y >> 16) + (lsw >> 16);
7489 return (msw << 16) | (lsw & 0xFFFF);
7490 };
7491
7492 /*
7493 * Bitwise rotate a 32-bit number to the left.
7494 */
7495 BlueImpMD5.prototype.bit_roll = function (num, cnt) {
7496 return (num << cnt) | (num >>> (32 - cnt));
7497 };
7498
7499 /*
7500 * These functions implement the five basic operations the algorithm uses.
7501 */
7502 BlueImpMD5.prototype.md5_cmn = function (q, a, b, x, s, t) {
7503 return this.safe_add(this.bit_roll(this.safe_add(this.safe_add(a, q), this.safe_add(x, t)), s), b);
7504 };
7505 BlueImpMD5.prototype.md5_ff = function (a, b, c, d, x, s, t) {
7506 return this.md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
7507 };
7508 BlueImpMD5.prototype.md5_gg = function (a, b, c, d, x, s, t) {
7509 return this.md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
7510 };
7511 BlueImpMD5.prototype.md5_hh = function (a, b, c, d, x, s, t) {
7512 return this.md5_cmn(b ^ c ^ d, a, b, x, s, t);
7513 };
7514 BlueImpMD5.prototype.md5_ii = function (a, b, c, d, x, s, t) {
7515 return this.md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
7516 };
7517
7518 /*
7519 * Calculate the MD5 of an array of little-endian words, and a bit length.
7520 */
7521 BlueImpMD5.prototype.binl_md5 = function (x, len) {
7522 /* append padding */
7523 x[len >> 5] |= 0x80 << (len % 32);
7524 x[(((len + 64) >>> 9) << 4) + 14] = len;
7525
7526 var i, olda, oldb, oldc, oldd,
7527 a = 1732584193,
7528 b = -271733879,
7529 c = -1732584194,
7530 d = 271733878;
7531
7532 for (i = 0; i < x.length; i += 16) {
7533 olda = a;
7534 oldb = b;
7535 oldc = c;
7536 oldd = d;
7537
7538 a = this.md5_ff(a, b, c, d, x[i], 7, -680876936);
7539 d = this.md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
7540 c = this.md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
7541 b = this.md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
7542 a = this.md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
7543 d = this.md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
7544 c = this.md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
7545 b = this.md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
7546 a = this.md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
7547 d = this.md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
7548 c = this.md5_ff(c, d, a, b, x[i + 10], 17, -42063);
7549 b = this.md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
7550 a = this.md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
7551 d = this.md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
7552 c = this.md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
7553 b = this.md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
7554
7555 a = this.md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
7556 d = this.md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
7557 c = this.md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
7558 b = this.md5_gg(b, c, d, a, x[i], 20, -373897302);
7559 a = this.md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
7560 d = this.md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
7561 c = this.md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
7562 b = this.md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
7563 a = this.md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
7564 d = this.md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
7565 c = this.md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
7566 b = this.md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
7567 a = this.md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
7568 d = this.md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
7569 c = this.md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
7570 b = this.md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
7571
7572 a = this.md5_hh(a, b, c, d, x[i + 5], 4, -378558);
7573 d = this.md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
7574 c = this.md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
7575 b = this.md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
7576 a = this.md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
7577 d = this.md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
7578 c = this.md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
7579 b = this.md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
7580 a = this.md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
7581 d = this.md5_hh(d, a, b, c, x[i], 11, -358537222);
7582 c = this.md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
7583 b = this.md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
7584 a = this.md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
7585 d = this.md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
7586 c = this.md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
7587 b = this.md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
7588
7589 a = this.md5_ii(a, b, c, d, x[i], 6, -198630844);
7590 d = this.md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
7591 c = this.md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
7592 b = this.md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
7593 a = this.md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
7594 d = this.md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
7595 c = this.md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
7596 b = this.md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
7597 a = this.md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
7598 d = this.md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
7599 c = this.md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
7600 b = this.md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
7601 a = this.md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
7602 d = this.md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
7603 c = this.md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
7604 b = this.md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
7605
7606 a = this.safe_add(a, olda);
7607 b = this.safe_add(b, oldb);
7608 c = this.safe_add(c, oldc);
7609 d = this.safe_add(d, oldd);
7610 }
7611 return [a, b, c, d];
7612 };
7613
7614 /*
7615 * Convert an array of little-endian words to a string
7616 */
7617 BlueImpMD5.prototype.binl2rstr = function (input) {
7618 var i,
7619 output = '';
7620 for (i = 0; i < input.length * 32; i += 8) {
7621 output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
7622 }
7623 return output;
7624 };
7625
7626 /*
7627 * Convert a raw string to an array of little-endian words
7628 * Characters >255 have their high-byte silently ignored.
7629 */
7630 BlueImpMD5.prototype.rstr2binl = function (input) {
7631 var i,
7632 output = [];
7633 output[(input.length >> 2) - 1] = undefined;
7634 for (i = 0; i < output.length; i += 1) {
7635 output[i] = 0;
7636 }
7637 for (i = 0; i < input.length * 8; i += 8) {
7638 output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
7639 }
7640 return output;
7641 };
7642
7643 /*
7644 * Calculate the MD5 of a raw string
7645 */
7646 BlueImpMD5.prototype.rstr_md5 = function (s) {
7647 return this.binl2rstr(this.binl_md5(this.rstr2binl(s), s.length * 8));
7648 };
7649
7650 /*
7651 * Calculate the HMAC-MD5, of a key and some data (raw strings)
7652 */
7653 BlueImpMD5.prototype.rstr_hmac_md5 = function (key, data) {
7654 var i,
7655 bkey = this.rstr2binl(key),
7656 ipad = [],
7657 opad = [],
7658 hash;
7659 ipad[15] = opad[15] = undefined;
7660 if (bkey.length > 16) {
7661 bkey = this.binl_md5(bkey, key.length * 8);
7662 }
7663 for (i = 0; i < 16; i += 1) {
7664 ipad[i] = bkey[i] ^ 0x36363636;
7665 opad[i] = bkey[i] ^ 0x5C5C5C5C;
7666 }
7667 hash = this.binl_md5(ipad.concat(this.rstr2binl(data)), 512 + data.length * 8);
7668 return this.binl2rstr(this.binl_md5(opad.concat(hash), 512 + 128));
7669 };
7670
7671 /*
7672 * Convert a raw string to a hex string
7673 */
7674 BlueImpMD5.prototype.rstr2hex = function (input) {
7675 var hex_tab = '0123456789abcdef',
7676 output = '',
7677 x,
7678 i;
7679 for (i = 0; i < input.length; i += 1) {
7680 x = input.charCodeAt(i);
7681 output += hex_tab.charAt((x >>> 4) & 0x0F) +
7682 hex_tab.charAt(x & 0x0F);
7683 }
7684 return output;
7685 };
7686
7687 /*
7688 * Encode a string as utf-8
7689 */
7690 BlueImpMD5.prototype.str2rstr_utf8 = function (input) {
7691 return unescape(encodeURIComponent(input));
7692 };
7693
7694 /*
7695 * Take string arguments and return either raw or hex encoded strings
7696 */
7697 BlueImpMD5.prototype.raw_md5 = function (s) {
7698 return this.rstr_md5(this.str2rstr_utf8(s));
7699 };
7700 BlueImpMD5.prototype.hex_md5 = function (s) {
7701 return this.rstr2hex(this.raw_md5(s));
7702 };
7703 BlueImpMD5.prototype.raw_hmac_md5 = function (k, d) {
7704 return this.rstr_hmac_md5(this.str2rstr_utf8(k), this.str2rstr_utf8(d));
7705 };
7706 BlueImpMD5.prototype.hex_hmac_md5 = function (k, d) {
7707 return this.rstr2hex(this.raw_hmac_md5(k, d));
7708 };
7709
7710 BlueImpMD5.prototype.md5 = function (string, key, raw) {
7711 if (!key) {
7712 if (!raw) {
7713 return this.hex_md5(string);
7714 }
7715
7716 return this.raw_md5(string);
7717 }
7718
7719 if (!raw) {
7720 return this.hex_hmac_md5(key, string);
7721 }
7722
7723 return this.raw_hmac_md5(key, string);
7724 };
7725
7726 // CommonJS module
7727 if (typeof exports !== 'undefined') {
7728 if (typeof module !== 'undefined' && module.exports) {
7729 exports = module.exports = Chance;
7730 }
7731 exports.Chance = Chance;
7732 }
7733
7734 // Register as an anonymous AMD module
7735 if (typeof define === 'function' && define.amd) {
7736 define([], function () {
7737 return Chance;
7738 });
7739 }
7740
7741 // if there is a importsScrips object define chance for worker
7742 // allows worker to use full Chance functionality with seed
7743 if (typeof importScripts !== 'undefined') {
7744 chance = new Chance();
7745 self.Chance = Chance;
7746 }
7747
7748 // If there is a window object, that at least has a document property,
7749 // instantiate and define chance on the window
7750 if (typeof window === "object" && typeof window.document === "object") {
7751 window.Chance = Chance;
7752 window.chance = new Chance();
7753 }
7754})();