UNPKG

360 kBJavaScriptView Raw
1// Chance.js 1.0.18
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.0.18";
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 (const exclusion of options.exclude) {
310 testRange(!Number.isInteger(exclusion), "Chance: exclude must be numbers.")
311 }
312
313 let random = options.min + this.natural({max: options.max - options.min - options.exclude.length})
314 for (const exclusion of options.exclude.sort()) {
315 if (random < exclusion) {
316 break
317 }
318 random++
319 }
320 return random
321 }
322 return this.integer(options);
323 };
324
325 /**
326 * Return a random prime number
327 *
328 * NOTE the max and min are INCLUDED in the range.
329 *
330 * @param {Object} [options={}] can specify a min and/or max
331 * @returns {Number} a single random prime number
332 * @throws {RangeError} min cannot be greater than max nor negative
333 */
334 Chance.prototype.prime = function (options) {
335 options = initOptions(options, {min: 0, max: 10000});
336 testRange(options.min < 0, "Chance: Min cannot be less than zero.");
337 testRange(options.min > options.max, "Chance: Min cannot be greater than Max.");
338
339 var lastPrime = data.primes[data.primes.length - 1];
340 if (options.max > lastPrime) {
341 for (var i = lastPrime + 2; i <= options.max; ++i) {
342 if (this.is_prime(i)) {
343 data.primes.push(i);
344 }
345 }
346 }
347 var targetPrimes = data.primes.filter(function (prime) {
348 return prime >= options.min && prime <= options.max;
349 });
350 return this.pick(targetPrimes);
351 };
352
353 /**
354 * Determine whether a given number is prime or not.
355 */
356 Chance.prototype.is_prime = function (n) {
357 if (n % 1 || n < 2) {
358 return false;
359 }
360 if (n % 2 === 0) {
361 return n === 2;
362 }
363 if (n % 3 === 0) {
364 return n === 3;
365 }
366 var m = Math.sqrt(n);
367 for (var i = 5; i <= m; i += 6) {
368 if (n % i === 0 || n % (i + 2) === 0) {
369 return false;
370 }
371 }
372 return true;
373 };
374
375 /**
376 * Return a random hex number as string
377 *
378 * NOTE the max and min are INCLUDED in the range. So:
379 * chance.hex({min: '9', max: 'B'});
380 * would return either '9', 'A' or 'B'.
381 *
382 * @param {Object} [options={}] can specify a min and/or max and/or casing
383 * @returns {String} a single random string hex number
384 * @throws {RangeError} min cannot be greater than max
385 */
386 Chance.prototype.hex = function (options) {
387 options = initOptions(options, {min: 0, max: MAX_INT, casing: 'lower'});
388 testRange(options.min < 0, "Chance: Min cannot be less than zero.");
389 var integer = this.natural({min: options.min, max: options.max});
390 if (options.casing === 'upper') {
391 return integer.toString(16).toUpperCase();
392 }
393 return integer.toString(16);
394 };
395
396 Chance.prototype.letter = function(options) {
397 options = initOptions(options, {casing: 'lower'});
398 var pool = "abcdefghijklmnopqrstuvwxyz";
399 var letter = this.character({pool: pool});
400 if (options.casing === 'upper') {
401 letter = letter.toUpperCase();
402 }
403 return letter;
404 }
405
406 /**
407 * Return a random string
408 *
409 * @param {Object} [options={}] can specify a length
410 * @returns {String} a string of random length
411 * @throws {RangeError} length cannot be less than zero
412 */
413 Chance.prototype.string = function (options) {
414 options = initOptions(options, { length: this.natural({min: 5, max: 20}) });
415 testRange(options.length < 0, "Chance: Length cannot be less than zero.");
416 var length = options.length,
417 text = this.n(this.character, length, options);
418
419 return text.join("");
420 };
421
422 function CopyToken(c) {
423 this.c = c
424 }
425
426 CopyToken.prototype = {
427 substitute: function () {
428 return this.c
429 }
430 }
431
432 function EscapeToken(c) {
433 this.c = c
434 }
435
436 EscapeToken.prototype = {
437 substitute: function () {
438 if (!/[{}\\]/.test(this.c)) {
439 throw new Error('Invalid escape sequence: "\\' + this.c + '".')
440 }
441 return this.c
442 }
443 }
444
445 function ReplaceToken(c) {
446 this.c = c
447 }
448
449 ReplaceToken.prototype = {
450 replacers: {
451 '#': function (chance) { return chance.character({ pool: NUMBERS }) },
452 'A': function (chance) { return chance.character({ pool: CHARS_UPPER }) },
453 'a': function (chance) { return chance.character({ pool: CHARS_LOWER }) },
454 },
455
456 substitute: function (chance) {
457 var replacer = this.replacers[this.c]
458 if (!replacer) {
459 throw new Error('Invalid replacement character: "' + this.c + '".')
460 }
461 return replacer(chance)
462 }
463 }
464
465 function parseTemplate(template) {
466 var tokens = []
467 var mode = 'identity'
468 for (var i = 0; i<template.length; i++) {
469 var c = template[i]
470 switch (mode) {
471 case 'escape':
472 tokens.push(new EscapeToken(c))
473 mode = 'identity'
474 break
475 case 'identity':
476 if (c === '{') {
477 mode = 'replace'
478 } else if (c === '\\') {
479 mode = 'escape'
480 } else {
481 tokens.push(new CopyToken(c))
482 }
483 break
484 case 'replace':
485 if (c === '}') {
486 mode = 'identity'
487 } else {
488 tokens.push(new ReplaceToken(c))
489 }
490 break
491 }
492 }
493 return tokens
494 }
495
496 /**
497 * Return a random string matching the given template.
498 *
499 * The template consists of any number of "character replacement" and
500 * "character literal" sequences. A "character replacement" sequence
501 * starts with a left brace, has any number of special replacement
502 * characters, and ends with a right brace. A character literal can be any
503 * character except a brace or a backslash. A literal brace or backslash
504 * character can be included in the output by escaping with a backslash.
505 *
506 * The following replacement characters can be used in a replacement
507 * sequence:
508 *
509 * "#": a random digit
510 * "a": a random lower case letter
511 * "A": a random upper case letter
512 *
513 * Example: chance.template('{AA###}-{##}')
514 *
515 * @param {String} template string.
516 * @returns {String} a random string matching the template.
517 */
518 Chance.prototype.template = function (template) {
519 if (!template) {
520 throw new Error('Template string is required')
521 }
522 var self = this
523 return parseTemplate(template)
524 .map(function (token) { return token.substitute(self) })
525 .join('');
526 };
527
528
529 /**
530 * Return a random buffer
531 *
532 * @param {Object} [options={}] can specify a length
533 * @returns {Buffer} a buffer of random length
534 * @throws {RangeError} length cannot be less than zero
535 */
536 Chance.prototype.buffer = function (options) {
537 if (typeof Buffer === 'undefined') {
538 throw new UnsupportedError('Sorry, the buffer() function is not supported on your platform');
539 }
540 options = initOptions(options, { length: this.natural({min: 5, max: 20}) });
541 testRange(options.length < 0, "Chance: Length cannot be less than zero.");
542 var length = options.length;
543 var content = this.n(this.character, length, options);
544
545 return Buffer.from(content);
546 };
547
548 // -- End Basics --
549
550 // -- Helpers --
551
552 Chance.prototype.capitalize = function (word) {
553 return word.charAt(0).toUpperCase() + word.substr(1);
554 };
555
556 Chance.prototype.mixin = function (obj) {
557 for (var func_name in obj) {
558 Chance.prototype[func_name] = obj[func_name];
559 }
560 return this;
561 };
562
563 /**
564 * Given a function that generates something random and a number of items to generate,
565 * return an array of items where none repeat.
566 *
567 * @param {Function} fn the function that generates something random
568 * @param {Number} num number of terms to generate
569 * @param {Object} options any options to pass on to the generator function
570 * @returns {Array} an array of length `num` with every item generated by `fn` and unique
571 *
572 * There can be more parameters after these. All additional parameters are provided to the given function
573 */
574 Chance.prototype.unique = function(fn, num, options) {
575 testRange(
576 typeof fn !== "function",
577 "Chance: The first argument must be a function."
578 );
579
580 var comparator = function(arr, val) { return arr.indexOf(val) !== -1; };
581
582 if (options) {
583 comparator = options.comparator || comparator;
584 }
585
586 var arr = [], count = 0, result, MAX_DUPLICATES = num * 50, params = slice.call(arguments, 2);
587
588 while (arr.length < num) {
589 var clonedParams = JSON.parse(JSON.stringify(params));
590 result = fn.apply(this, clonedParams);
591 if (!comparator(arr, result)) {
592 arr.push(result);
593 // reset count when unique found
594 count = 0;
595 }
596
597 if (++count > MAX_DUPLICATES) {
598 throw new RangeError("Chance: num is likely too large for sample set");
599 }
600 }
601 return arr;
602 };
603
604 /**
605 * Gives an array of n random terms
606 *
607 * @param {Function} fn the function that generates something random
608 * @param {Number} n number of terms to generate
609 * @returns {Array} an array of length `n` with items generated by `fn`
610 *
611 * There can be more parameters after these. All additional parameters are provided to the given function
612 */
613 Chance.prototype.n = function(fn, n) {
614 testRange(
615 typeof fn !== "function",
616 "Chance: The first argument must be a function."
617 );
618
619 if (typeof n === 'undefined') {
620 n = 1;
621 }
622 var i = n, arr = [], params = slice.call(arguments, 2);
623
624 // Providing a negative count should result in a noop.
625 i = Math.max( 0, i );
626
627 for (null; i--; null) {
628 arr.push(fn.apply(this, params));
629 }
630
631 return arr;
632 };
633
634 // H/T to SO for this one: http://vq.io/OtUrZ5
635 Chance.prototype.pad = function (number, width, pad) {
636 // Default pad to 0 if none provided
637 pad = pad || '0';
638 // Convert number to a string
639 number = number + '';
640 return number.length >= width ? number : new Array(width - number.length + 1).join(pad) + number;
641 };
642
643 // DEPRECATED on 2015-10-01
644 Chance.prototype.pick = function (arr, count) {
645 if (arr.length === 0) {
646 throw new RangeError("Chance: Cannot pick() from an empty array");
647 }
648 if (!count || count === 1) {
649 return arr[this.natural({max: arr.length - 1})];
650 } else {
651 return this.shuffle(arr).slice(0, count);
652 }
653 };
654
655 // Given an array, returns a single random element
656 Chance.prototype.pickone = function (arr) {
657 if (arr.length === 0) {
658 throw new RangeError("Chance: Cannot pickone() from an empty array");
659 }
660 return arr[this.natural({max: arr.length - 1})];
661 };
662
663 // Given an array, returns a random set with 'count' elements
664 Chance.prototype.pickset = function (arr, count) {
665 if (count === 0) {
666 return [];
667 }
668 if (arr.length === 0) {
669 throw new RangeError("Chance: Cannot pickset() from an empty array");
670 }
671 if (count < 0) {
672 throw new RangeError("Chance: Count must be a positive number");
673 }
674 if (!count || count === 1) {
675 return [ this.pickone(arr) ];
676 } else {
677 var array = arr.slice(0);
678 var end = array.length;
679
680 return this.n(function () {
681 var index = this.natural({max: --end});
682 var value = array[index];
683 array[index] = array[end];
684 return value;
685 }, Math.min(end, count));
686 }
687 };
688
689 Chance.prototype.shuffle = function (arr) {
690 var new_array = [],
691 j = 0,
692 length = Number(arr.length),
693 source_indexes = range(length),
694 last_source_index = length - 1,
695 selected_source_index;
696
697 for (var i = 0; i < length; i++) {
698 // Pick a random index from the array
699 selected_source_index = this.natural({max: last_source_index});
700 j = source_indexes[selected_source_index];
701
702 // Add it to the new array
703 new_array[i] = arr[j];
704
705 // Mark the source index as used
706 source_indexes[selected_source_index] = source_indexes[last_source_index];
707 last_source_index -= 1;
708 }
709
710 return new_array;
711 };
712
713 // Returns a single item from an array with relative weighting of odds
714 Chance.prototype.weighted = function (arr, weights, trim) {
715 if (arr.length !== weights.length) {
716 throw new RangeError("Chance: Length of array and weights must match");
717 }
718
719 // scan weights array and sum valid entries
720 var sum = 0;
721 var val;
722 for (var weightIndex = 0; weightIndex < weights.length; ++weightIndex) {
723 val = weights[weightIndex];
724 if (isNaN(val)) {
725 throw new RangeError("Chance: All weights must be numbers");
726 }
727
728 if (val > 0) {
729 sum += val;
730 }
731 }
732
733 if (sum === 0) {
734 throw new RangeError("Chance: No valid entries in array weights");
735 }
736
737 // select a value within range
738 var selected = this.random() * sum;
739
740 // find array entry corresponding to selected value
741 var total = 0;
742 var lastGoodIdx = -1;
743 var chosenIdx;
744 for (weightIndex = 0; weightIndex < weights.length; ++weightIndex) {
745 val = weights[weightIndex];
746 total += val;
747 if (val > 0) {
748 if (selected <= total) {
749 chosenIdx = weightIndex;
750 break;
751 }
752 lastGoodIdx = weightIndex;
753 }
754
755 // handle any possible rounding error comparison to ensure something is picked
756 if (weightIndex === (weights.length - 1)) {
757 chosenIdx = lastGoodIdx;
758 }
759 }
760
761 var chosen = arr[chosenIdx];
762 trim = (typeof trim === 'undefined') ? false : trim;
763 if (trim) {
764 arr.splice(chosenIdx, 1);
765 weights.splice(chosenIdx, 1);
766 }
767
768 return chosen;
769 };
770
771 // -- End Helpers --
772
773 // -- Text --
774
775 Chance.prototype.paragraph = function (options) {
776 options = initOptions(options);
777
778 var sentences = options.sentences || this.natural({min: 3, max: 7}),
779 sentence_array = this.n(this.sentence, sentences);
780
781 return sentence_array.join(' ');
782 };
783
784 // Could get smarter about this than generating random words and
785 // chaining them together. Such as: http://vq.io/1a5ceOh
786 Chance.prototype.sentence = function (options) {
787 options = initOptions(options);
788
789 var words = options.words || this.natural({min: 12, max: 18}),
790 punctuation = options.punctuation,
791 text, word_array = this.n(this.word, words);
792
793 text = word_array.join(' ');
794
795 // Capitalize first letter of sentence
796 text = this.capitalize(text);
797
798 // Make sure punctuation has a usable value
799 if (punctuation !== false && !/^[.?;!:]$/.test(punctuation)) {
800 punctuation = '.';
801 }
802
803 // Add punctuation mark
804 if (punctuation) {
805 text += punctuation;
806 }
807
808 return text;
809 };
810
811 Chance.prototype.syllable = function (options) {
812 options = initOptions(options);
813
814 var length = options.length || this.natural({min: 2, max: 3}),
815 consonants = 'bcdfghjklmnprstvwz', // consonants except hard to speak ones
816 vowels = 'aeiou', // vowels
817 all = consonants + vowels, // all
818 text = '',
819 chr;
820
821 // I'm sure there's a more elegant way to do this, but this works
822 // decently well.
823 for (var i = 0; i < length; i++) {
824 if (i === 0) {
825 // First character can be anything
826 chr = this.character({pool: all});
827 } else if (consonants.indexOf(chr) === -1) {
828 // Last character was a vowel, now we want a consonant
829 chr = this.character({pool: consonants});
830 } else {
831 // Last character was a consonant, now we want a vowel
832 chr = this.character({pool: vowels});
833 }
834
835 text += chr;
836 }
837
838 if (options.capitalize) {
839 text = this.capitalize(text);
840 }
841
842 return text;
843 };
844
845 Chance.prototype.word = function (options) {
846 options = initOptions(options);
847
848 testRange(
849 options.syllables && options.length,
850 "Chance: Cannot specify both syllables AND length."
851 );
852
853 var syllables = options.syllables || this.natural({min: 1, max: 3}),
854 text = '';
855
856 if (options.length) {
857 // Either bound word by length
858 do {
859 text += this.syllable();
860 } while (text.length < options.length);
861 text = text.substring(0, options.length);
862 } else {
863 // Or by number of syllables
864 for (var i = 0; i < syllables; i++) {
865 text += this.syllable();
866 }
867 }
868
869 if (options.capitalize) {
870 text = this.capitalize(text);
871 }
872
873 return text;
874 };
875
876 // -- End Text --
877
878 // -- Person --
879
880 Chance.prototype.age = function (options) {
881 options = initOptions(options);
882 var ageRange;
883
884 switch (options.type) {
885 case 'child':
886 ageRange = {min: 0, max: 12};
887 break;
888 case 'teen':
889 ageRange = {min: 13, max: 19};
890 break;
891 case 'adult':
892 ageRange = {min: 18, max: 65};
893 break;
894 case 'senior':
895 ageRange = {min: 65, max: 100};
896 break;
897 case 'all':
898 ageRange = {min: 0, max: 100};
899 break;
900 default:
901 ageRange = {min: 18, max: 65};
902 break;
903 }
904
905 return this.natural(ageRange);
906 };
907
908 Chance.prototype.birthday = function (options) {
909 var age = this.age(options);
910 var currentYear = new Date().getFullYear();
911
912 if (options && options.type) {
913 var min = new Date();
914 var max = new Date();
915 min.setFullYear(currentYear - age - 1);
916 max.setFullYear(currentYear - age);
917
918 options = initOptions(options, {
919 min: min,
920 max: max
921 });
922 } else {
923 options = initOptions(options, {
924 year: currentYear - age
925 });
926 }
927
928 return this.date(options);
929 };
930
931 // CPF; ID to identify taxpayers in Brazil
932 Chance.prototype.cpf = function (options) {
933 options = initOptions(options, {
934 formatted: true
935 });
936
937 var n = this.n(this.natural, 9, { max: 9 });
938 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;
939 d1 = 11 - (d1 % 11);
940 if (d1>=10) {
941 d1 = 0;
942 }
943 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;
944 d2 = 11 - (d2 % 11);
945 if (d2>=10) {
946 d2 = 0;
947 }
948 var cpf = ''+n[0]+n[1]+n[2]+'.'+n[3]+n[4]+n[5]+'.'+n[6]+n[7]+n[8]+'-'+d1+d2;
949 return options.formatted ? cpf : cpf.replace(/\D/g,'');
950 };
951
952 // CNPJ: ID to identify companies in Brazil
953 Chance.prototype.cnpj = function (options) {
954 options = initOptions(options, {
955 formatted: true
956 });
957
958 var n = this.n(this.natural, 12, { max: 12 });
959 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;
960 d1 = 11 - (d1 % 11);
961 if (d1<2) {
962 d1 = 0;
963 }
964 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;
965 d2 = 11 - (d2 % 11);
966 if (d2<2) {
967 d2 = 0;
968 }
969 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;
970 return options.formatted ? cnpj : cnpj.replace(/\D/g,'');
971 };
972
973 Chance.prototype.first = function (options) {
974 options = initOptions(options, {gender: this.gender(), nationality: 'en'});
975 return this.pick(this.get("firstNames")[options.gender.toLowerCase()][options.nationality.toLowerCase()]);
976 };
977
978 Chance.prototype.profession = function (options) {
979 options = initOptions(options);
980 if(options.rank){
981 return this.pick(['Apprentice ', 'Junior ', 'Senior ', 'Lead ']) + this.pick(this.get("profession"));
982 } else{
983 return this.pick(this.get("profession"));
984 }
985 };
986
987 Chance.prototype.company = function (){
988 return this.pick(this.get("company"));
989 };
990
991 Chance.prototype.gender = function (options) {
992 options = initOptions(options, {extraGenders: []});
993 return this.pick(['Male', 'Female'].concat(options.extraGenders));
994 };
995
996 Chance.prototype.last = function (options) {
997 options = initOptions(options, {nationality: '*'});
998 if (options.nationality === "*") {
999 var allLastNames = []
1000 var lastNames = this.get("lastNames")
1001 Object.keys(lastNames).forEach(function(key){
1002 allLastNames = allLastNames.concat(lastNames[key])
1003 })
1004 return this.pick(allLastNames)
1005 }
1006 else {
1007 return this.pick(this.get("lastNames")[options.nationality.toLowerCase()]);
1008 }
1009
1010 };
1011
1012 Chance.prototype.israelId=function(){
1013 var x=this.string({pool: '0123456789',length:8});
1014 var y=0;
1015 for (var i=0;i<x.length;i++){
1016 var thisDigit= x[i] * (i/2===parseInt(i/2) ? 1 : 2);
1017 thisDigit=this.pad(thisDigit,2).toString();
1018 thisDigit=parseInt(thisDigit[0]) + parseInt(thisDigit[1]);
1019 y=y+thisDigit;
1020 }
1021 x=x+(10-parseInt(y.toString().slice(-1))).toString().slice(-1);
1022 return x;
1023 };
1024
1025 Chance.prototype.mrz = function (options) {
1026 var checkDigit = function (input) {
1027 var alpha = "<ABCDEFGHIJKLMNOPQRSTUVWXYXZ".split(''),
1028 multipliers = [ 7, 3, 1 ],
1029 runningTotal = 0;
1030
1031 if (typeof input !== 'string') {
1032 input = input.toString();
1033 }
1034
1035 input.split('').forEach(function(character, idx) {
1036 var pos = alpha.indexOf(character);
1037
1038 if(pos !== -1) {
1039 character = pos === 0 ? 0 : pos + 9;
1040 } else {
1041 character = parseInt(character, 10);
1042 }
1043 character *= multipliers[idx % multipliers.length];
1044 runningTotal += character;
1045 });
1046 return runningTotal % 10;
1047 };
1048 var generate = function (opts) {
1049 var pad = function (length) {
1050 return new Array(length + 1).join('<');
1051 };
1052 var number = [ 'P<',
1053 opts.issuer,
1054 opts.last.toUpperCase(),
1055 '<<',
1056 opts.first.toUpperCase(),
1057 pad(39 - (opts.last.length + opts.first.length + 2)),
1058 opts.passportNumber,
1059 checkDigit(opts.passportNumber),
1060 opts.nationality,
1061 opts.dob,
1062 checkDigit(opts.dob),
1063 opts.gender,
1064 opts.expiry,
1065 checkDigit(opts.expiry),
1066 pad(14),
1067 checkDigit(pad(14)) ].join('');
1068
1069 return number +
1070 (checkDigit(number.substr(44, 10) +
1071 number.substr(57, 7) +
1072 number.substr(65, 7)));
1073 };
1074
1075 var that = this;
1076
1077 options = initOptions(options, {
1078 first: this.first(),
1079 last: this.last(),
1080 passportNumber: this.integer({min: 100000000, max: 999999999}),
1081 dob: (function () {
1082 var date = that.birthday({type: 'adult'});
1083 return [date.getFullYear().toString().substr(2),
1084 that.pad(date.getMonth() + 1, 2),
1085 that.pad(date.getDate(), 2)].join('');
1086 }()),
1087 expiry: (function () {
1088 var date = new Date();
1089 return [(date.getFullYear() + 5).toString().substr(2),
1090 that.pad(date.getMonth() + 1, 2),
1091 that.pad(date.getDate(), 2)].join('');
1092 }()),
1093 gender: this.gender() === 'Female' ? 'F': 'M',
1094 issuer: 'GBR',
1095 nationality: 'GBR'
1096 });
1097 return generate (options);
1098 };
1099
1100 Chance.prototype.name = function (options) {
1101 options = initOptions(options);
1102
1103 var first = this.first(options),
1104 last = this.last(options),
1105 name;
1106
1107 if (options.middle) {
1108 name = first + ' ' + this.first(options) + ' ' + last;
1109 } else if (options.middle_initial) {
1110 name = first + ' ' + this.character({alpha: true, casing: 'upper'}) + '. ' + last;
1111 } else {
1112 name = first + ' ' + last;
1113 }
1114
1115 if (options.prefix) {
1116 name = this.prefix(options) + ' ' + name;
1117 }
1118
1119 if (options.suffix) {
1120 name = name + ' ' + this.suffix(options);
1121 }
1122
1123 return name;
1124 };
1125
1126 // Return the list of available name prefixes based on supplied gender.
1127 // @todo introduce internationalization
1128 Chance.prototype.name_prefixes = function (gender) {
1129 gender = gender || "all";
1130 gender = gender.toLowerCase();
1131
1132 var prefixes = [
1133 { name: 'Doctor', abbreviation: 'Dr.' }
1134 ];
1135
1136 if (gender === "male" || gender === "all") {
1137 prefixes.push({ name: 'Mister', abbreviation: 'Mr.' });
1138 }
1139
1140 if (gender === "female" || gender === "all") {
1141 prefixes.push({ name: 'Miss', abbreviation: 'Miss' });
1142 prefixes.push({ name: 'Misses', abbreviation: 'Mrs.' });
1143 }
1144
1145 return prefixes;
1146 };
1147
1148 // Alias for name_prefix
1149 Chance.prototype.prefix = function (options) {
1150 return this.name_prefix(options);
1151 };
1152
1153 Chance.prototype.name_prefix = function (options) {
1154 options = initOptions(options, { gender: "all" });
1155 return options.full ?
1156 this.pick(this.name_prefixes(options.gender)).name :
1157 this.pick(this.name_prefixes(options.gender)).abbreviation;
1158 };
1159 //Hungarian ID number
1160 Chance.prototype.HIDN= function(){
1161 //Hungarian ID nuber structure: XXXXXXYY (X=number,Y=Capital Latin letter)
1162 var idn_pool="0123456789";
1163 var idn_chrs="ABCDEFGHIJKLMNOPQRSTUVWXYXZ";
1164 var idn="";
1165 idn+=this.string({pool:idn_pool,length:6});
1166 idn+=this.string({pool:idn_chrs,length:2});
1167 return idn;
1168 };
1169
1170
1171 Chance.prototype.ssn = function (options) {
1172 options = initOptions(options, {ssnFour: false, dashes: true});
1173 var ssn_pool = "1234567890",
1174 ssn,
1175 dash = options.dashes ? '-' : '';
1176
1177 if(!options.ssnFour) {
1178 ssn = this.string({pool: ssn_pool, length: 3}) + dash +
1179 this.string({pool: ssn_pool, length: 2}) + dash +
1180 this.string({pool: ssn_pool, length: 4});
1181 } else {
1182 ssn = this.string({pool: ssn_pool, length: 4});
1183 }
1184 return ssn;
1185 };
1186
1187 // Aadhar is similar to ssn, used in India to uniquely identify a person
1188 Chance.prototype.aadhar = function (options) {
1189 options = initOptions(options, {onlyLastFour: false, separatedByWhiteSpace: true});
1190 var aadhar_pool = "1234567890",
1191 aadhar,
1192 whiteSpace = options.separatedByWhiteSpace ? ' ' : '';
1193
1194 if(!options.onlyLastFour) {
1195 aadhar = this.string({pool: aadhar_pool, length: 4}) + whiteSpace +
1196 this.string({pool: aadhar_pool, length: 4}) + whiteSpace +
1197 this.string({pool: aadhar_pool, length: 4});
1198 } else {
1199 aadhar = this.string({pool: aadhar_pool, length: 4});
1200 }
1201 return aadhar;
1202 };
1203
1204 // Return the list of available name suffixes
1205 // @todo introduce internationalization
1206 Chance.prototype.name_suffixes = function () {
1207 var suffixes = [
1208 { name: 'Doctor of Osteopathic Medicine', abbreviation: 'D.O.' },
1209 { name: 'Doctor of Philosophy', abbreviation: 'Ph.D.' },
1210 { name: 'Esquire', abbreviation: 'Esq.' },
1211 { name: 'Junior', abbreviation: 'Jr.' },
1212 { name: 'Juris Doctor', abbreviation: 'J.D.' },
1213 { name: 'Master of Arts', abbreviation: 'M.A.' },
1214 { name: 'Master of Business Administration', abbreviation: 'M.B.A.' },
1215 { name: 'Master of Science', abbreviation: 'M.S.' },
1216 { name: 'Medical Doctor', abbreviation: 'M.D.' },
1217 { name: 'Senior', abbreviation: 'Sr.' },
1218 { name: 'The Third', abbreviation: 'III' },
1219 { name: 'The Fourth', abbreviation: 'IV' },
1220 { name: 'Bachelor of Engineering', abbreviation: 'B.E' },
1221 { name: 'Bachelor of Technology', abbreviation: 'B.TECH' }
1222 ];
1223 return suffixes;
1224 };
1225
1226 // Alias for name_suffix
1227 Chance.prototype.suffix = function (options) {
1228 return this.name_suffix(options);
1229 };
1230
1231 Chance.prototype.name_suffix = function (options) {
1232 options = initOptions(options);
1233 return options.full ?
1234 this.pick(this.name_suffixes()).name :
1235 this.pick(this.name_suffixes()).abbreviation;
1236 };
1237
1238 Chance.prototype.nationalities = function () {
1239 return this.get("nationalities");
1240 };
1241
1242 // Generate random nationality based on json list
1243 Chance.prototype.nationality = function () {
1244 var nationality = this.pick(this.nationalities());
1245 return nationality.name;
1246 };
1247
1248 // -- End Person --
1249
1250 // -- Mobile --
1251 // Android GCM Registration ID
1252 Chance.prototype.android_id = function () {
1253 return "APA91" + this.string({ pool: "0123456789abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_", length: 178 });
1254 };
1255
1256 // Apple Push Token
1257 Chance.prototype.apple_token = function () {
1258 return this.string({ pool: "abcdef1234567890", length: 64 });
1259 };
1260
1261 // Windows Phone 8 ANID2
1262 Chance.prototype.wp8_anid2 = function () {
1263 return base64( this.hash( { length : 32 } ) );
1264 };
1265
1266 // Windows Phone 7 ANID
1267 Chance.prototype.wp7_anid = function () {
1268 return 'A=' + this.guid().replace(/-/g, '').toUpperCase() + '&E=' + this.hash({ length:3 }) + '&W=' + this.integer({ min:0, max:9 });
1269 };
1270
1271 // BlackBerry Device PIN
1272 Chance.prototype.bb_pin = function () {
1273 return this.hash({ length: 8 });
1274 };
1275
1276 // -- End Mobile --
1277
1278 // -- Web --
1279 Chance.prototype.avatar = function (options) {
1280 var url = null;
1281 var URL_BASE = '//www.gravatar.com/avatar/';
1282 var PROTOCOLS = {
1283 http: 'http',
1284 https: 'https'
1285 };
1286 var FILE_TYPES = {
1287 bmp: 'bmp',
1288 gif: 'gif',
1289 jpg: 'jpg',
1290 png: 'png'
1291 };
1292 var FALLBACKS = {
1293 '404': '404', // Return 404 if not found
1294 mm: 'mm', // Mystery man
1295 identicon: 'identicon', // Geometric pattern based on hash
1296 monsterid: 'monsterid', // A generated monster icon
1297 wavatar: 'wavatar', // A generated face
1298 retro: 'retro', // 8-bit icon
1299 blank: 'blank' // A transparent png
1300 };
1301 var RATINGS = {
1302 g: 'g',
1303 pg: 'pg',
1304 r: 'r',
1305 x: 'x'
1306 };
1307 var opts = {
1308 protocol: null,
1309 email: null,
1310 fileExtension: null,
1311 size: null,
1312 fallback: null,
1313 rating: null
1314 };
1315
1316 if (!options) {
1317 // Set to a random email
1318 opts.email = this.email();
1319 options = {};
1320 }
1321 else if (typeof options === 'string') {
1322 opts.email = options;
1323 options = {};
1324 }
1325 else if (typeof options !== 'object') {
1326 return null;
1327 }
1328 else if (options.constructor === 'Array') {
1329 return null;
1330 }
1331
1332 opts = initOptions(options, opts);
1333
1334 if (!opts.email) {
1335 // Set to a random email
1336 opts.email = this.email();
1337 }
1338
1339 // Safe checking for params
1340 opts.protocol = PROTOCOLS[opts.protocol] ? opts.protocol + ':' : '';
1341 opts.size = parseInt(opts.size, 0) ? opts.size : '';
1342 opts.rating = RATINGS[opts.rating] ? opts.rating : '';
1343 opts.fallback = FALLBACKS[opts.fallback] ? opts.fallback : '';
1344 opts.fileExtension = FILE_TYPES[opts.fileExtension] ? opts.fileExtension : '';
1345
1346 url =
1347 opts.protocol +
1348 URL_BASE +
1349 this.bimd5.md5(opts.email) +
1350 (opts.fileExtension ? '.' + opts.fileExtension : '') +
1351 (opts.size || opts.rating || opts.fallback ? '?' : '') +
1352 (opts.size ? '&s=' + opts.size.toString() : '') +
1353 (opts.rating ? '&r=' + opts.rating : '') +
1354 (opts.fallback ? '&d=' + opts.fallback : '')
1355 ;
1356
1357 return url;
1358 };
1359
1360 /**
1361 * #Description:
1362 * ===============================================
1363 * Generate random color value base on color type:
1364 * -> hex
1365 * -> rgb
1366 * -> rgba
1367 * -> 0x
1368 * -> named color
1369 *
1370 * #Examples:
1371 * ===============================================
1372 * * Geerate random hex color
1373 * chance.color() => '#79c157' / 'rgb(110,52,164)' / '0x67ae0b' / '#e2e2e2' / '#29CFA7'
1374 *
1375 * * Generate Hex based color value
1376 * chance.color({format: 'hex'}) => '#d67118'
1377 *
1378 * * Generate simple rgb value
1379 * chance.color({format: 'rgb'}) => 'rgb(110,52,164)'
1380 *
1381 * * Generate Ox based color value
1382 * chance.color({format: '0x'}) => '0x67ae0b'
1383 *
1384 * * Generate graiscale based value
1385 * chance.color({grayscale: true}) => '#e2e2e2'
1386 *
1387 * * Return valide color name
1388 * chance.color({format: 'name'}) => 'red'
1389 *
1390 * * Make color uppercase
1391 * chance.color({casing: 'upper'}) => '#29CFA7'
1392 *
1393 * * Min Max values for RGBA
1394 * 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});
1395 *
1396 * @param [object] options
1397 * @return [string] color value
1398 */
1399 Chance.prototype.color = function (options) {
1400 function gray(value, delimiter) {
1401 return [value, value, value].join(delimiter || '');
1402 }
1403
1404 function rgb(hasAlpha) {
1405 var rgbValue = (hasAlpha) ? 'rgba' : 'rgb';
1406 var alphaChannel = (hasAlpha) ? (',' + this.floating({min:min_alpha, max:max_alpha})) : "";
1407 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}));
1408 return rgbValue + '(' + colorValue + alphaChannel + ')';
1409 }
1410
1411 function hex(start, end, withHash) {
1412 var symbol = (withHash) ? "#" : "";
1413 var hexstring = "";
1414
1415 if (isGrayscale) {
1416 hexstring = gray(this.pad(this.hex({min: min_rgb, max: max_rgb}), 2));
1417 if (options.format === "shorthex") {
1418 hexstring = gray(this.hex({min: 0, max: 15}));
1419 }
1420 }
1421 else {
1422 if (options.format === "shorthex") {
1423 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);
1424 }
1425 else if (min_red !== undefined || max_red !== undefined || min_green !== undefined || max_green !== undefined || min_blue !== undefined || max_blue !== undefined) {
1426 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);
1427 }
1428 else {
1429 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);
1430 }
1431 }
1432
1433 return symbol + hexstring;
1434 }
1435
1436 options = initOptions(options, {
1437 format: this.pick(['hex', 'shorthex', 'rgb', 'rgba', '0x', 'name']),
1438 grayscale: false,
1439 casing: 'lower',
1440 min: 0,
1441 max: 255,
1442 min_red: undefined,
1443 max_red: undefined,
1444 min_green: undefined,
1445 max_green: undefined,
1446 min_blue: undefined,
1447 max_blue: undefined,
1448 min_alpha: 0,
1449 max_alpha: 1
1450 });
1451
1452 var isGrayscale = options.grayscale;
1453 var min_rgb = options.min;
1454 var max_rgb = options.max;
1455 var min_red = options.min_red;
1456 var max_red = options.max_red;
1457 var min_green = options.min_green;
1458 var max_green = options.max_green;
1459 var min_blue = options.min_blue;
1460 var max_blue = options.max_blue;
1461 var min_alpha = options.min_alpha;
1462 var max_alpha = options.max_alpha;
1463 if (options.min_red === undefined) { min_red = min_rgb; }
1464 if (options.max_red === undefined) { max_red = max_rgb; }
1465 if (options.min_green === undefined) { min_green = min_rgb; }
1466 if (options.max_green === undefined) { max_green = max_rgb; }
1467 if (options.min_blue === undefined) { min_blue = min_rgb; }
1468 if (options.max_blue === undefined) { max_blue = max_rgb; }
1469 if (options.min_alpha === undefined) { min_alpha = 0; }
1470 if (options.max_alpha === undefined) { max_alpha = 1; }
1471 if (isGrayscale && min_rgb === 0 && max_rgb === 255 && min_red !== undefined && max_red !== undefined) {
1472 min_rgb = ((min_red + min_green + min_blue) / 3);
1473 max_rgb = ((max_red + max_green + max_blue) / 3);
1474 }
1475 var colorValue;
1476
1477 if (options.format === 'hex') {
1478 colorValue = hex.call(this, 2, 6, true);
1479 }
1480 else if (options.format === 'shorthex') {
1481 colorValue = hex.call(this, 1, 3, true);
1482 }
1483 else if (options.format === 'rgb') {
1484 colorValue = rgb.call(this, false);
1485 }
1486 else if (options.format === 'rgba') {
1487 colorValue = rgb.call(this, true);
1488 }
1489 else if (options.format === '0x') {
1490 colorValue = '0x' + hex.call(this, 2, 6);
1491 }
1492 else if(options.format === 'name') {
1493 return this.pick(this.get("colorNames"));
1494 }
1495 else {
1496 throw new RangeError('Invalid format provided. Please provide one of "hex", "shorthex", "rgb", "rgba", "0x" or "name".');
1497 }
1498
1499 if (options.casing === 'upper' ) {
1500 colorValue = colorValue.toUpperCase();
1501 }
1502
1503 return colorValue;
1504 };
1505
1506 Chance.prototype.domain = function (options) {
1507 options = initOptions(options);
1508 return this.word() + '.' + (options.tld || this.tld());
1509 };
1510
1511 Chance.prototype.email = function (options) {
1512 options = initOptions(options);
1513 return this.word({length: options.length}) + '@' + (options.domain || this.domain());
1514 };
1515
1516 /**
1517 * #Description:
1518 * ===============================================
1519 * Generate a random Facebook id, aka fbid.
1520 *
1521 * NOTE: At the moment (Sep 2017), Facebook ids are
1522 * "numeric strings" of length 16.
1523 * However, Facebook Graph API documentation states that
1524 * "it is extremely likely to change over time".
1525 * @see https://developers.facebook.com/docs/graph-api/overview/
1526 *
1527 * #Examples:
1528 * ===============================================
1529 * chance.fbid() => '1000035231661304'
1530 *
1531 * @return [string] facebook id
1532 */
1533 Chance.prototype.fbid = function () {
1534 return '10000' + this.string({pool: "1234567890", length: 11});
1535 };
1536
1537 Chance.prototype.google_analytics = function () {
1538 var account = this.pad(this.natural({max: 999999}), 6);
1539 var property = this.pad(this.natural({max: 99}), 2);
1540
1541 return 'UA-' + account + '-' + property;
1542 };
1543
1544 Chance.prototype.hashtag = function () {
1545 return '#' + this.word();
1546 };
1547
1548 Chance.prototype.ip = function () {
1549 // Todo: This could return some reserved IPs. See http://vq.io/137dgYy
1550 // this should probably be updated to account for that rare as it may be
1551 return this.natural({min: 1, max: 254}) + '.' +
1552 this.natural({max: 255}) + '.' +
1553 this.natural({max: 255}) + '.' +
1554 this.natural({min: 1, max: 254});
1555 };
1556
1557 Chance.prototype.ipv6 = function () {
1558 var ip_addr = this.n(this.hash, 8, {length: 4});
1559
1560 return ip_addr.join(":");
1561 };
1562
1563 Chance.prototype.klout = function () {
1564 return this.natural({min: 1, max: 99});
1565 };
1566
1567 Chance.prototype.semver = function (options) {
1568 options = initOptions(options, { include_prerelease: true });
1569
1570 var range = this.pickone(["^", "~", "<", ">", "<=", ">=", "="]);
1571 if (options.range) {
1572 range = options.range;
1573 }
1574
1575 var prerelease = "";
1576 if (options.include_prerelease) {
1577 prerelease = this.weighted(["", "-dev", "-beta", "-alpha"], [50, 10, 5, 1]);
1578 }
1579 return range + this.rpg('3d10').join('.') + prerelease;
1580 };
1581
1582 Chance.prototype.tlds = function () {
1583 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'];
1584 };
1585
1586 Chance.prototype.tld = function () {
1587 return this.pick(this.tlds());
1588 };
1589
1590 Chance.prototype.twitter = function () {
1591 return '@' + this.word();
1592 };
1593
1594 Chance.prototype.url = function (options) {
1595 options = initOptions(options, { protocol: "http", domain: this.domain(options), domain_prefix: "", path: this.word(), extensions: []});
1596
1597 var extension = options.extensions.length > 0 ? "." + this.pick(options.extensions) : "";
1598 var domain = options.domain_prefix ? options.domain_prefix + "." + options.domain : options.domain;
1599
1600 return options.protocol + "://" + domain + "/" + options.path + extension;
1601 };
1602
1603 Chance.prototype.port = function() {
1604 return this.integer({min: 0, max: 65535});
1605 };
1606
1607 Chance.prototype.locale = function (options) {
1608 options = initOptions(options);
1609 if (options.region){
1610 return this.pick(this.get("locale_regions"));
1611 } else {
1612 return this.pick(this.get("locale_languages"));
1613 }
1614 };
1615
1616 Chance.prototype.locales = function (options) {
1617 options = initOptions(options);
1618 if (options.region){
1619 return this.get("locale_regions");
1620 } else {
1621 return this.get("locale_languages");
1622 }
1623 };
1624
1625 Chance.prototype.loremPicsum = function (options) {
1626 options = initOptions(options, { width: 500, height: 500, greyscale: false, blurred: false });
1627
1628 var greyscale = options.greyscale ? 'g/' : '';
1629 var query = options.blurred ? '/?blur' : '/?random';
1630
1631 return 'https://picsum.photos/' + greyscale + options.width + '/' + options.height + query;
1632 }
1633
1634 // -- End Web --
1635
1636 // -- Location --
1637
1638 Chance.prototype.address = function (options) {
1639 options = initOptions(options);
1640 return this.natural({min: 5, max: 2000}) + ' ' + this.street(options);
1641 };
1642
1643 Chance.prototype.altitude = function (options) {
1644 options = initOptions(options, {fixed: 5, min: 0, max: 8848});
1645 return this.floating({
1646 min: options.min,
1647 max: options.max,
1648 fixed: options.fixed
1649 });
1650 };
1651
1652 Chance.prototype.areacode = function (options) {
1653 options = initOptions(options, {parens : true});
1654 // Don't want area codes to start with 1, or have a 9 as the second digit
1655 var areacode = this.natural({min: 2, max: 9}).toString() +
1656 this.natural({min: 0, max: 8}).toString() +
1657 this.natural({min: 0, max: 9}).toString();
1658
1659 return options.parens ? '(' + areacode + ')' : areacode;
1660 };
1661
1662 Chance.prototype.city = function () {
1663 return this.capitalize(this.word({syllables: 3}));
1664 };
1665
1666 Chance.prototype.coordinates = function (options) {
1667 return this.latitude(options) + ', ' + this.longitude(options);
1668 };
1669
1670 Chance.prototype.countries = function () {
1671 return this.get("countries");
1672 };
1673
1674 Chance.prototype.country = function (options) {
1675 options = initOptions(options);
1676 var country = this.pick(this.countries());
1677 return options.raw ? country : options.full ? country.name : country.abbreviation;
1678 };
1679
1680 Chance.prototype.depth = function (options) {
1681 options = initOptions(options, {fixed: 5, min: -10994, max: 0});
1682 return this.floating({
1683 min: options.min,
1684 max: options.max,
1685 fixed: options.fixed
1686 });
1687 };
1688
1689 Chance.prototype.geohash = function (options) {
1690 options = initOptions(options, { length: 7 });
1691 return this.string({ length: options.length, pool: '0123456789bcdefghjkmnpqrstuvwxyz' });
1692 };
1693
1694 Chance.prototype.geojson = function (options) {
1695 return this.latitude(options) + ', ' + this.longitude(options) + ', ' + this.altitude(options);
1696 };
1697
1698 Chance.prototype.latitude = function (options) {
1699 options = initOptions(options, {fixed: 5, min: -90, max: 90});
1700 return this.floating({min: options.min, max: options.max, fixed: options.fixed});
1701 };
1702
1703 Chance.prototype.longitude = function (options) {
1704 options = initOptions(options, {fixed: 5, min: -180, max: 180});
1705 return this.floating({min: options.min, max: options.max, fixed: options.fixed});
1706 };
1707
1708 Chance.prototype.phone = function (options) {
1709 var self = this,
1710 numPick,
1711 ukNum = function (parts) {
1712 var section = [];
1713 //fills the section part of the phone number with random numbers.
1714 parts.sections.forEach(function(n) {
1715 section.push(self.string({ pool: '0123456789', length: n}));
1716 });
1717 return parts.area + section.join(' ');
1718 };
1719 options = initOptions(options, {
1720 formatted: true,
1721 country: 'us',
1722 mobile: false
1723 });
1724 if (!options.formatted) {
1725 options.parens = false;
1726 }
1727 var phone;
1728 switch (options.country) {
1729 case 'fr':
1730 if (!options.mobile) {
1731 numPick = this.pick([
1732 // Valid zone and département codes.
1733 '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}),
1734 '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}),
1735 '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}),
1736 '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}),
1737 '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}),
1738 '09' + self.string({ pool: '0123456789', length: 8}),
1739 ]);
1740 phone = options.formatted ? numPick.match(/../g).join(' ') : numPick;
1741 } else {
1742 numPick = this.pick(['06', '07']) + self.string({ pool: '0123456789', length: 8});
1743 phone = options.formatted ? numPick.match(/../g).join(' ') : numPick;
1744 }
1745 break;
1746 case 'uk':
1747 if (!options.mobile) {
1748 numPick = this.pick([
1749 //valid area codes of major cities/counties followed by random numbers in required format.
1750
1751 { area: '01' + this.character({ pool: '234569' }) + '1 ', sections: [3,4] },
1752 { area: '020 ' + this.character({ pool: '378' }), sections: [3,4] },
1753 { area: '023 ' + this.character({ pool: '89' }), sections: [3,4] },
1754 { area: '024 7', sections: [3,4] },
1755 { area: '028 ' + this.pick(['25','28','37','71','82','90','92','95']), sections: [2,4] },
1756 { area: '012' + this.pick(['04','08','54','76','97','98']) + ' ', sections: [6] },
1757 { area: '013' + this.pick(['63','64','84','86']) + ' ', sections: [6] },
1758 { area: '014' + this.pick(['04','20','60','61','80','88']) + ' ', sections: [6] },
1759 { area: '015' + this.pick(['24','27','62','66']) + ' ', sections: [6] },
1760 { area: '016' + this.pick(['06','29','35','47','59','95']) + ' ', sections: [6] },
1761 { area: '017' + this.pick(['26','44','50','68']) + ' ', sections: [6] },
1762 { area: '018' + this.pick(['27','37','84','97']) + ' ', sections: [6] },
1763 { area: '019' + this.pick(['00','05','35','46','49','63','95']) + ' ', sections: [6] }
1764 ]);
1765 phone = options.formatted ? ukNum(numPick) : ukNum(numPick).replace(' ', '', 'g');
1766 } else {
1767 numPick = this.pick([
1768 { area: '07' + this.pick(['4','5','7','8','9']), sections: [2,6] },
1769 { area: '07624 ', sections: [6] }
1770 ]);
1771 phone = options.formatted ? ukNum(numPick) : ukNum(numPick).replace(' ', '');
1772 }
1773 break;
1774 case 'za':
1775 if (!options.mobile) {
1776 numPick = this.pick([
1777 '01' + this.pick(['0', '1', '2', '3', '4', '5', '6', '7', '8']) + self.string({ pool: '0123456789', length: 7}),
1778 '02' + this.pick(['1', '2', '3', '4', '7', '8']) + self.string({ pool: '0123456789', length: 7}),
1779 '03' + this.pick(['1', '2', '3', '5', '6', '9']) + self.string({ pool: '0123456789', length: 7}),
1780 '04' + this.pick(['1', '2', '3', '4', '5','6','7', '8','9']) + self.string({ pool: '0123456789', length: 7}),
1781 '05' + this.pick(['1', '3', '4', '6', '7', '8']) + self.string({ pool: '0123456789', length: 7}),
1782 ]);
1783 phone = options.formatted || numPick;
1784 } else {
1785 numPick = this.pick([
1786 '060' + this.pick(['3','4','5','6','7','8','9']) + self.string({ pool: '0123456789', length: 6}),
1787 '061' + this.pick(['0','1','2','3','4','5','8']) + self.string({ pool: '0123456789', length: 6}),
1788 '06' + self.string({ pool: '0123456789', length: 7}),
1789 '071' + this.pick(['0','1','2','3','4','5','6','7','8','9']) + self.string({ pool: '0123456789', length: 6}),
1790 '07' + this.pick(['2','3','4','6','7','8','9']) + self.string({ pool: '0123456789', length: 7}),
1791 '08' + this.pick(['0','1','2','3','4','5']) + self.string({ pool: '0123456789', length: 7}),
1792 ]);
1793 phone = options.formatted || numPick;
1794 }
1795 break;
1796 case 'us':
1797 var areacode = this.areacode(options).toString();
1798 var exchange = this.natural({ min: 2, max: 9 }).toString() +
1799 this.natural({ min: 0, max: 9 }).toString() +
1800 this.natural({ min: 0, max: 9 }).toString();
1801 var subscriber = this.natural({ min: 1000, max: 9999 }).toString(); // this could be random [0-9]{4}
1802 phone = options.formatted ? areacode + ' ' + exchange + '-' + subscriber : areacode + exchange + subscriber;
1803 break;
1804 case 'br':
1805 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"]);
1806 var prefix;
1807 if (options.mobile) {
1808 // Brasilian official reference (mobile): http://www.anatel.gov.br/setorregulado/plano-de-numeracao-brasileiro?id=330
1809 prefix = '9' + self.string({ pool: '0123456789', length: 4});
1810 } else {
1811 // Brasilian official reference: http://www.anatel.gov.br/setorregulado/plano-de-numeracao-brasileiro?id=331
1812 prefix = this.natural({ min: 2000, max: 5999 }).toString();
1813 }
1814 var mcdu = self.string({ pool: '0123456789', length: 4});
1815 phone = options.formatted ? '(' + areaCode + ') ' + prefix + '-' + mcdu : areaCode + prefix + mcdu;
1816 break;
1817 }
1818 return phone;
1819 };
1820
1821 Chance.prototype.postal = function () {
1822 // Postal District
1823 var pd = this.character({pool: "XVTSRPNKLMHJGECBA"});
1824 // Forward Sortation Area (FSA)
1825 var fsa = pd + this.natural({max: 9}) + this.character({alpha: true, casing: "upper"});
1826 // Local Delivery Unut (LDU)
1827 var ldu = this.natural({max: 9}) + this.character({alpha: true, casing: "upper"}) + this.natural({max: 9});
1828
1829 return fsa + " " + ldu;
1830 };
1831
1832 Chance.prototype.postcode = function () {
1833 // Area
1834 var area = this.pick(this.get("postcodeAreas")).code;
1835 // District
1836 var district = this.natural({max: 9});
1837 // Sub-District
1838 var subDistrict = this.bool() ? this.character({alpha: true, casing: "upper"}) : "";
1839 // Outward Code
1840 var outward = area + district + subDistrict;
1841 // Sector
1842 var sector = this.natural({max: 9});
1843 // Unit
1844 var unit = this.character({alpha: true, casing: "upper"}) + this.character({alpha: true, casing: "upper"});
1845 // Inward Code
1846 var inward = sector + unit;
1847
1848 return outward + " " + inward;
1849 };
1850
1851 Chance.prototype.counties = function (options) {
1852 options = initOptions(options, { country: 'uk' });
1853 return this.get("counties")[options.country.toLowerCase()];
1854 };
1855
1856 Chance.prototype.county = function (options) {
1857 return this.pick(this.counties(options)).name;
1858 };
1859
1860 Chance.prototype.provinces = function (options) {
1861 options = initOptions(options, { country: 'ca' });
1862 return this.get("provinces")[options.country.toLowerCase()];
1863 };
1864
1865 Chance.prototype.province = function (options) {
1866 return (options && options.full) ?
1867 this.pick(this.provinces(options)).name :
1868 this.pick(this.provinces(options)).abbreviation;
1869 };
1870
1871 Chance.prototype.state = function (options) {
1872 return (options && options.full) ?
1873 this.pick(this.states(options)).name :
1874 this.pick(this.states(options)).abbreviation;
1875 };
1876
1877 Chance.prototype.states = function (options) {
1878 options = initOptions(options, { country: 'us', us_states_and_dc: true } );
1879
1880 var states;
1881
1882 switch (options.country.toLowerCase()) {
1883 case 'us':
1884 var us_states_and_dc = this.get("us_states_and_dc"),
1885 territories = this.get("territories"),
1886 armed_forces = this.get("armed_forces");
1887
1888 states = [];
1889
1890 if (options.us_states_and_dc) {
1891 states = states.concat(us_states_and_dc);
1892 }
1893 if (options.territories) {
1894 states = states.concat(territories);
1895 }
1896 if (options.armed_forces) {
1897 states = states.concat(armed_forces);
1898 }
1899 break;
1900 case 'it':
1901 case 'mx':
1902 states = this.get("country_regions")[options.country.toLowerCase()];
1903 break;
1904 case 'uk':
1905 states = this.get("counties")[options.country.toLowerCase()];
1906 break;
1907 }
1908
1909 return states;
1910 };
1911
1912 Chance.prototype.street = function (options) {
1913 options = initOptions(options, { country: 'us', syllables: 2 });
1914 var street;
1915
1916 switch (options.country.toLowerCase()) {
1917 case 'us':
1918 street = this.word({ syllables: options.syllables });
1919 street = this.capitalize(street);
1920 street += ' ';
1921 street += options.short_suffix ?
1922 this.street_suffix(options).abbreviation :
1923 this.street_suffix(options).name;
1924 break;
1925 case 'it':
1926 street = this.word({ syllables: options.syllables });
1927 street = this.capitalize(street);
1928 street = (options.short_suffix ?
1929 this.street_suffix(options).abbreviation :
1930 this.street_suffix(options).name) + " " + street;
1931 break;
1932 }
1933 return street;
1934 };
1935
1936 Chance.prototype.street_suffix = function (options) {
1937 options = initOptions(options, { country: 'us' });
1938 return this.pick(this.street_suffixes(options));
1939 };
1940
1941 Chance.prototype.street_suffixes = function (options) {
1942 options = initOptions(options, { country: 'us' });
1943 // These are the most common suffixes.
1944 return this.get("street_suffixes")[options.country.toLowerCase()];
1945 };
1946
1947 // Note: only returning US zip codes, internationalization will be a whole
1948 // other beast to tackle at some point.
1949 Chance.prototype.zip = function (options) {
1950 var zip = this.n(this.natural, 5, {max: 9});
1951
1952 if (options && options.plusfour === true) {
1953 zip.push('-');
1954 zip = zip.concat(this.n(this.natural, 4, {max: 9}));
1955 }
1956
1957 return zip.join("");
1958 };
1959
1960 // -- End Location --
1961
1962 // -- Time
1963
1964 Chance.prototype.ampm = function () {
1965 return this.bool() ? 'am' : 'pm';
1966 };
1967
1968 Chance.prototype.date = function (options) {
1969 var date_string, date;
1970
1971 // If interval is specified we ignore preset
1972 if(options && (options.min || options.max)) {
1973 options = initOptions(options, {
1974 american: true,
1975 string: false
1976 });
1977 var min = typeof options.min !== "undefined" ? options.min.getTime() : 1;
1978 // 100,000,000 days measured relative to midnight at the beginning of 01 January, 1970 UTC. http://es5.github.io/#x15.9.1.1
1979 var max = typeof options.max !== "undefined" ? options.max.getTime() : 8640000000000000;
1980
1981 date = new Date(this.integer({min: min, max: max}));
1982 } else {
1983 var m = this.month({raw: true});
1984 var daysInMonth = m.days;
1985
1986 if(options && options.month) {
1987 // Mod 12 to allow months outside range of 0-11 (not encouraged, but also not prevented).
1988 daysInMonth = this.get('months')[((options.month % 12) + 12) % 12].days;
1989 }
1990
1991 options = initOptions(options, {
1992 year: parseInt(this.year(), 10),
1993 // Necessary to subtract 1 because Date() 0-indexes month but not day or year
1994 // for some reason.
1995 month: m.numeric - 1,
1996 day: this.natural({min: 1, max: daysInMonth}),
1997 hour: this.hour({twentyfour: true}),
1998 minute: this.minute(),
1999 second: this.second(),
2000 millisecond: this.millisecond(),
2001 american: true,
2002 string: false
2003 });
2004
2005 date = new Date(options.year, options.month, options.day, options.hour, options.minute, options.second, options.millisecond);
2006 }
2007
2008 if (options.american) {
2009 // Adding 1 to the month is necessary because Date() 0-indexes
2010 // months but not day for some odd reason.
2011 date_string = (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();
2012 } else {
2013 date_string = date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear();
2014 }
2015
2016 return options.string ? date_string : date;
2017 };
2018
2019 Chance.prototype.hammertime = function (options) {
2020 return this.date(options).getTime();
2021 };
2022
2023 Chance.prototype.hour = function (options) {
2024 options = initOptions(options, {
2025 min: options && options.twentyfour ? 0 : 1,
2026 max: options && options.twentyfour ? 23 : 12
2027 });
2028
2029 testRange(options.min < 0, "Chance: Min cannot be less than 0.");
2030 testRange(options.twentyfour && options.max > 23, "Chance: Max cannot be greater than 23 for twentyfour option.");
2031 testRange(!options.twentyfour && options.max > 12, "Chance: Max cannot be greater than 12.");
2032 testRange(options.min > options.max, "Chance: Min cannot be greater than Max.");
2033
2034 return this.natural({min: options.min, max: options.max});
2035 };
2036
2037 Chance.prototype.millisecond = function () {
2038 return this.natural({max: 999});
2039 };
2040
2041 Chance.prototype.minute = Chance.prototype.second = function (options) {
2042 options = initOptions(options, {min: 0, max: 59});
2043
2044 testRange(options.min < 0, "Chance: Min cannot be less than 0.");
2045 testRange(options.max > 59, "Chance: Max cannot be greater than 59.");
2046 testRange(options.min > options.max, "Chance: Min cannot be greater than Max.");
2047
2048 return this.natural({min: options.min, max: options.max});
2049 };
2050
2051 Chance.prototype.month = function (options) {
2052 options = initOptions(options, {min: 1, max: 12});
2053
2054 testRange(options.min < 1, "Chance: Min cannot be less than 1.");
2055 testRange(options.max > 12, "Chance: Max cannot be greater than 12.");
2056 testRange(options.min > options.max, "Chance: Min cannot be greater than Max.");
2057
2058 var month = this.pick(this.months().slice(options.min - 1, options.max));
2059 return options.raw ? month : month.name;
2060 };
2061
2062 Chance.prototype.months = function () {
2063 return this.get("months");
2064 };
2065
2066 Chance.prototype.second = function () {
2067 return this.natural({max: 59});
2068 };
2069
2070 Chance.prototype.timestamp = function () {
2071 return this.natural({min: 1, max: parseInt(new Date().getTime() / 1000, 10)});
2072 };
2073
2074 Chance.prototype.weekday = function (options) {
2075 options = initOptions(options, {weekday_only: false});
2076 var weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
2077 if (!options.weekday_only) {
2078 weekdays.push("Saturday");
2079 weekdays.push("Sunday");
2080 }
2081 return this.pickone(weekdays);
2082 };
2083
2084 Chance.prototype.year = function (options) {
2085 // Default to current year as min if none specified
2086 options = initOptions(options, {min: new Date().getFullYear()});
2087
2088 // Default to one century after current year as max if none specified
2089 options.max = (typeof options.max !== "undefined") ? options.max : options.min + 100;
2090
2091 return this.natural(options).toString();
2092 };
2093
2094 // -- End Time
2095
2096 // -- Finance --
2097
2098 Chance.prototype.cc = function (options) {
2099 options = initOptions(options);
2100
2101 var type, number, to_generate;
2102
2103 type = (options.type) ?
2104 this.cc_type({ name: options.type, raw: true }) :
2105 this.cc_type({ raw: true });
2106
2107 number = type.prefix.split("");
2108 to_generate = type.length - type.prefix.length - 1;
2109
2110 // Generates n - 1 digits
2111 number = number.concat(this.n(this.integer, to_generate, {min: 0, max: 9}));
2112
2113 // Generates the last digit according to Luhn algorithm
2114 number.push(this.luhn_calculate(number.join("")));
2115
2116 return number.join("");
2117 };
2118
2119 Chance.prototype.cc_types = function () {
2120 // http://en.wikipedia.org/wiki/Bank_card_number#Issuer_identification_number_.28IIN.29
2121 return this.get("cc_types");
2122 };
2123
2124 Chance.prototype.cc_type = function (options) {
2125 options = initOptions(options);
2126 var types = this.cc_types(),
2127 type = null;
2128
2129 if (options.name) {
2130 for (var i = 0; i < types.length; i++) {
2131 // Accept either name or short_name to specify card type
2132 if (types[i].name === options.name || types[i].short_name === options.name) {
2133 type = types[i];
2134 break;
2135 }
2136 }
2137 if (type === null) {
2138 throw new RangeError("Chance: Credit card type '" + options.name + "' is not supported");
2139 }
2140 } else {
2141 type = this.pick(types);
2142 }
2143
2144 return options.raw ? type : type.name;
2145 };
2146
2147 // return all world currency by ISO 4217
2148 Chance.prototype.currency_types = function () {
2149 return this.get("currency_types");
2150 };
2151
2152 // return random world currency by ISO 4217
2153 Chance.prototype.currency = function () {
2154 return this.pick(this.currency_types());
2155 };
2156
2157 // return all timezones available
2158 Chance.prototype.timezones = function () {
2159 return this.get("timezones");
2160 };
2161
2162 // return random timezone
2163 Chance.prototype.timezone = function () {
2164 return this.pick(this.timezones());
2165 };
2166
2167 //Return random correct currency exchange pair (e.g. EUR/USD) or array of currency code
2168 Chance.prototype.currency_pair = function (returnAsString) {
2169 var currencies = this.unique(this.currency, 2, {
2170 comparator: function(arr, val) {
2171
2172 return arr.reduce(function(acc, item) {
2173 // If a match has been found, short circuit check and just return
2174 return acc || (item.code === val.code);
2175 }, false);
2176 }
2177 });
2178
2179 if (returnAsString) {
2180 return currencies[0].code + '/' + currencies[1].code;
2181 } else {
2182 return currencies;
2183 }
2184 };
2185
2186 Chance.prototype.dollar = function (options) {
2187 // By default, a somewhat more sane max for dollar than all available numbers
2188 options = initOptions(options, {max : 10000, min : 0});
2189
2190 var dollar = this.floating({min: options.min, max: options.max, fixed: 2}).toString(),
2191 cents = dollar.split('.')[1];
2192
2193 if (cents === undefined) {
2194 dollar += '.00';
2195 } else if (cents.length < 2) {
2196 dollar = dollar + '0';
2197 }
2198
2199 if (dollar < 0) {
2200 return '-$' + dollar.replace('-', '');
2201 } else {
2202 return '$' + dollar;
2203 }
2204 };
2205
2206 Chance.prototype.euro = function (options) {
2207 return Number(this.dollar(options).replace("$", "")).toLocaleString() + "€";
2208 };
2209
2210 Chance.prototype.exp = function (options) {
2211 options = initOptions(options);
2212 var exp = {};
2213
2214 exp.year = this.exp_year();
2215
2216 // If the year is this year, need to ensure month is greater than the
2217 // current month or this expiration will not be valid
2218 if (exp.year === (new Date().getFullYear()).toString()) {
2219 exp.month = this.exp_month({future: true});
2220 } else {
2221 exp.month = this.exp_month();
2222 }
2223
2224 return options.raw ? exp : exp.month + '/' + exp.year;
2225 };
2226
2227 Chance.prototype.exp_month = function (options) {
2228 options = initOptions(options);
2229 var month, month_int,
2230 // Date object months are 0 indexed
2231 curMonth = new Date().getMonth() + 1;
2232
2233 if (options.future && (curMonth !== 12)) {
2234 do {
2235 month = this.month({raw: true}).numeric;
2236 month_int = parseInt(month, 10);
2237 } while (month_int <= curMonth);
2238 } else {
2239 month = this.month({raw: true}).numeric;
2240 }
2241
2242 return month;
2243 };
2244
2245 Chance.prototype.exp_year = function () {
2246 var curMonth = new Date().getMonth() + 1,
2247 curYear = new Date().getFullYear();
2248
2249 return this.year({min: ((curMonth === 12) ? (curYear + 1) : curYear), max: (curYear + 10)});
2250 };
2251
2252 Chance.prototype.vat = function (options) {
2253 options = initOptions(options, { country: 'it' });
2254 switch (options.country.toLowerCase()) {
2255 case 'it':
2256 return this.it_vat();
2257 }
2258 };
2259
2260 /**
2261 * Generate a string matching IBAN pattern (https://en.wikipedia.org/wiki/International_Bank_Account_Number).
2262 * No country-specific formats support (yet)
2263 */
2264 Chance.prototype.iban = function () {
2265 var alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
2266 var alphanum = alpha + '0123456789';
2267 var iban =
2268 this.string({ length: 2, pool: alpha }) +
2269 this.pad(this.integer({ min: 0, max: 99 }), 2) +
2270 this.string({ length: 4, pool: alphanum }) +
2271 this.pad(this.natural(), this.natural({ min: 6, max: 26 }));
2272 return iban;
2273 };
2274
2275 // -- End Finance
2276
2277 // -- Regional
2278
2279 Chance.prototype.it_vat = function () {
2280 var it_vat = this.natural({min: 1, max: 1800000});
2281
2282 it_vat = this.pad(it_vat, 7) + this.pad(this.pick(this.provinces({ country: 'it' })).code, 3);
2283 return it_vat + this.luhn_calculate(it_vat);
2284 };
2285
2286 /*
2287 * this generator is written following the official algorithm
2288 * all data can be passed explicitely or randomized by calling chance.cf() without options
2289 * the code does not check that the input data is valid (it goes beyond the scope of the generator)
2290 *
2291 * @param [Object] options = { first: first name,
2292 * last: last name,
2293 * gender: female|male,
2294 birthday: JavaScript date object,
2295 city: string(4), 1 letter + 3 numbers
2296 }
2297 * @return [string] codice fiscale
2298 *
2299 */
2300 Chance.prototype.cf = function (options) {
2301 options = options || {};
2302 var gender = !!options.gender ? options.gender : this.gender(),
2303 first = !!options.first ? options.first : this.first( { gender: gender, nationality: 'it'} ),
2304 last = !!options.last ? options.last : this.last( { nationality: 'it'} ),
2305 birthday = !!options.birthday ? options.birthday : this.birthday(),
2306 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),
2307 cf = [],
2308 name_generator = function(name, isLast) {
2309 var temp,
2310 return_value = [];
2311
2312 if (name.length < 3) {
2313 return_value = name.split("").concat("XXX".split("")).splice(0,3);
2314 }
2315 else {
2316 temp = name.toUpperCase().split('').map(function(c){
2317 return ("BCDFGHJKLMNPRSTVWZ".indexOf(c) !== -1) ? c : undefined;
2318 }).join('');
2319 if (temp.length > 3) {
2320 if (isLast) {
2321 temp = temp.substr(0,3);
2322 } else {
2323 temp = temp[0] + temp.substr(2,2);
2324 }
2325 }
2326 if (temp.length < 3) {
2327 return_value = temp;
2328 temp = name.toUpperCase().split('').map(function(c){
2329 return ("AEIOU".indexOf(c) !== -1) ? c : undefined;
2330 }).join('').substr(0, 3 - return_value.length);
2331 }
2332 return_value = return_value + temp;
2333 }
2334
2335 return return_value;
2336 },
2337 date_generator = function(birthday, gender, that) {
2338 var lettermonths = ['A', 'B', 'C', 'D', 'E', 'H', 'L', 'M', 'P', 'R', 'S', 'T'];
2339
2340 return birthday.getFullYear().toString().substr(2) +
2341 lettermonths[birthday.getMonth()] +
2342 that.pad(birthday.getDate() + ((gender.toLowerCase() === "female") ? 40 : 0), 2);
2343 },
2344 checkdigit_generator = function(cf) {
2345 var range1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",
2346 range2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ",
2347 evens = "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
2348 odds = "BAKPLCQDREVOSFTGUHMINJWZYX",
2349 digit = 0;
2350
2351
2352 for(var i = 0; i < 15; i++) {
2353 if (i % 2 !== 0) {
2354 digit += evens.indexOf(range2[range1.indexOf(cf[i])]);
2355 }
2356 else {
2357 digit += odds.indexOf(range2[range1.indexOf(cf[i])]);
2358 }
2359 }
2360 return evens[digit % 26];
2361 };
2362
2363 cf = cf.concat(name_generator(last, true), name_generator(first), date_generator(birthday, gender, this), city.toUpperCase().split("")).join("");
2364 cf += checkdigit_generator(cf.toUpperCase(), this);
2365
2366 return cf.toUpperCase();
2367 };
2368
2369 Chance.prototype.pl_pesel = function () {
2370 var number = this.natural({min: 1, max: 9999999999});
2371 var arr = this.pad(number, 10).split('');
2372 for (var i = 0; i < arr.length; i++) {
2373 arr[i] = parseInt(arr[i]);
2374 }
2375
2376 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;
2377 if(controlNumber !== 0) {
2378 controlNumber = 10 - controlNumber;
2379 }
2380
2381 return arr.join('') + controlNumber;
2382 };
2383
2384 Chance.prototype.pl_nip = function () {
2385 var number = this.natural({min: 1, max: 999999999});
2386 var arr = this.pad(number, 9).split('');
2387 for (var i = 0; i < arr.length; i++) {
2388 arr[i] = parseInt(arr[i]);
2389 }
2390
2391 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;
2392 if(controlNumber === 10) {
2393 return this.pl_nip();
2394 }
2395
2396 return arr.join('') + controlNumber;
2397 };
2398
2399 Chance.prototype.pl_regon = function () {
2400 var number = this.natural({min: 1, max: 99999999});
2401 var arr = this.pad(number, 8).split('');
2402 for (var i = 0; i < arr.length; i++) {
2403 arr[i] = parseInt(arr[i]);
2404 }
2405
2406 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;
2407 if(controlNumber === 10) {
2408 controlNumber = 0;
2409 }
2410
2411 return arr.join('') + controlNumber;
2412 };
2413
2414 // -- End Regional
2415
2416 // -- Music --
2417
2418 Chance.prototype.note = function(options) {
2419 // choices for 'notes' option:
2420 // flatKey - chromatic scale with flat notes (default)
2421 // sharpKey - chromatic scale with sharp notes
2422 // flats - just flat notes
2423 // sharps - just sharp notes
2424 // naturals - just natural notes
2425 // all - naturals, sharps and flats
2426 options = initOptions(options, { notes : 'flatKey'});
2427 var scales = {
2428 naturals: ['C', 'D', 'E', 'F', 'G', 'A', 'B'],
2429 flats: ['D♭', 'E♭', 'G♭', 'A♭', 'B♭'],
2430 sharps: ['C♯', 'D♯', 'F♯', 'G♯', 'A♯']
2431 };
2432 scales.all = scales.naturals.concat(scales.flats.concat(scales.sharps))
2433 scales.flatKey = scales.naturals.concat(scales.flats)
2434 scales.sharpKey = scales.naturals.concat(scales.sharps)
2435 return this.pickone(scales[options.notes]);
2436 }
2437
2438 Chance.prototype.midi_note = function(options) {
2439 var min = 0;
2440 var max = 127;
2441 options = initOptions(options, { min : min, max : max });
2442 return this.integer({min: options.min, max: options.max});
2443 }
2444
2445 Chance.prototype.chord_quality = function(options) {
2446 options = initOptions(options, { jazz: true });
2447 var chord_qualities = ['maj', 'min', 'aug', 'dim'];
2448 if (options.jazz){
2449 chord_qualities = [
2450 'maj7',
2451 'min7',
2452 '7',
2453 'sus',
2454 'dim',
2455 'ø'
2456 ];
2457 }
2458 return this.pickone(chord_qualities);
2459 }
2460
2461 Chance.prototype.chord = function (options) {
2462 options = initOptions(options);
2463 return this.note(options) + this.chord_quality(options);
2464 }
2465
2466 Chance.prototype.tempo = function (options) {
2467 var min = 40;
2468 var max = 320;
2469 options = initOptions(options, {min: min, max: max});
2470 return this.integer({min: options.min, max: options.max});
2471 }
2472
2473 // -- End Music
2474
2475 // -- Miscellaneous --
2476
2477 // Coin - Flip, flip, flipadelphia
2478 Chance.prototype.coin = function() {
2479 return this.bool() ? "heads" : "tails";
2480 }
2481
2482 // Dice - For all the board game geeks out there, myself included ;)
2483 function diceFn (range) {
2484 return function () {
2485 return this.natural(range);
2486 };
2487 }
2488 Chance.prototype.d4 = diceFn({min: 1, max: 4});
2489 Chance.prototype.d6 = diceFn({min: 1, max: 6});
2490 Chance.prototype.d8 = diceFn({min: 1, max: 8});
2491 Chance.prototype.d10 = diceFn({min: 1, max: 10});
2492 Chance.prototype.d12 = diceFn({min: 1, max: 12});
2493 Chance.prototype.d20 = diceFn({min: 1, max: 20});
2494 Chance.prototype.d30 = diceFn({min: 1, max: 30});
2495 Chance.prototype.d100 = diceFn({min: 1, max: 100});
2496
2497 Chance.prototype.rpg = function (thrown, options) {
2498 options = initOptions(options);
2499 if (!thrown) {
2500 throw new RangeError("Chance: A type of die roll must be included");
2501 } else {
2502 var bits = thrown.toLowerCase().split("d"),
2503 rolls = [];
2504
2505 if (bits.length !== 2 || !parseInt(bits[0], 10) || !parseInt(bits[1], 10)) {
2506 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");
2507 }
2508 for (var i = bits[0]; i > 0; i--) {
2509 rolls[i - 1] = this.natural({min: 1, max: bits[1]});
2510 }
2511 return (typeof options.sum !== 'undefined' && options.sum) ? rolls.reduce(function (p, c) { return p + c; }) : rolls;
2512 }
2513 };
2514
2515 // Guid
2516 Chance.prototype.guid = function (options) {
2517 options = initOptions(options, { version: 5 });
2518
2519 var guid_pool = "abcdef1234567890",
2520 variant_pool = "ab89",
2521 guid = this.string({ pool: guid_pool, length: 8 }) + '-' +
2522 this.string({ pool: guid_pool, length: 4 }) + '-' +
2523 // The Version
2524 options.version +
2525 this.string({ pool: guid_pool, length: 3 }) + '-' +
2526 // The Variant
2527 this.string({ pool: variant_pool, length: 1 }) +
2528 this.string({ pool: guid_pool, length: 3 }) + '-' +
2529 this.string({ pool: guid_pool, length: 12 });
2530 return guid;
2531 };
2532
2533 // Hash
2534 Chance.prototype.hash = function (options) {
2535 options = initOptions(options, {length : 40, casing: 'lower'});
2536 var pool = options.casing === 'upper' ? HEX_POOL.toUpperCase() : HEX_POOL;
2537 return this.string({pool: pool, length: options.length});
2538 };
2539
2540 Chance.prototype.luhn_check = function (num) {
2541 var str = num.toString();
2542 var checkDigit = +str.substring(str.length - 1);
2543 return checkDigit === this.luhn_calculate(+str.substring(0, str.length - 1));
2544 };
2545
2546 Chance.prototype.luhn_calculate = function (num) {
2547 var digits = num.toString().split("").reverse();
2548 var sum = 0;
2549 var digit;
2550
2551 for (var i = 0, l = digits.length; l > i; ++i) {
2552 digit = +digits[i];
2553 if (i % 2 === 0) {
2554 digit *= 2;
2555 if (digit > 9) {
2556 digit -= 9;
2557 }
2558 }
2559 sum += digit;
2560 }
2561 return (sum * 9) % 10;
2562 };
2563
2564 // MD5 Hash
2565 Chance.prototype.md5 = function(options) {
2566 var opts = { str: '', key: null, raw: false };
2567
2568 if (!options) {
2569 opts.str = this.string();
2570 options = {};
2571 }
2572 else if (typeof options === 'string') {
2573 opts.str = options;
2574 options = {};
2575 }
2576 else if (typeof options !== 'object') {
2577 return null;
2578 }
2579 else if(options.constructor === 'Array') {
2580 return null;
2581 }
2582
2583 opts = initOptions(options, opts);
2584
2585 if(!opts.str){
2586 throw new Error('A parameter is required to return an md5 hash.');
2587 }
2588
2589 return this.bimd5.md5(opts.str, opts.key, opts.raw);
2590 };
2591
2592 /**
2593 * #Description:
2594 * =====================================================
2595 * Generate random file name with extension
2596 *
2597 * The argument provide extension type
2598 * -> raster
2599 * -> vector
2600 * -> 3d
2601 * -> document
2602 *
2603 * If nothing is provided the function return random file name with random
2604 * extension type of any kind
2605 *
2606 * The user can validate the file name length range
2607 * If nothing provided the generated file name is random
2608 *
2609 * #Extension Pool :
2610 * * Currently the supported extensions are
2611 * -> some of the most popular raster image extensions
2612 * -> some of the most popular vector image extensions
2613 * -> some of the most popular 3d image extensions
2614 * -> some of the most popular document extensions
2615 *
2616 * #Examples :
2617 * =====================================================
2618 *
2619 * Return random file name with random extension. The file extension
2620 * is provided by a predefined collection of extensions. More about the extension
2621 * pool can be found in #Extension Pool section
2622 *
2623 * chance.file()
2624 * => dsfsdhjf.xml
2625 *
2626 * In order to generate a file name with specific length, specify the
2627 * length property and integer value. The extension is going to be random
2628 *
2629 * chance.file({length : 10})
2630 * => asrtineqos.pdf
2631 *
2632 * In order to generate file with extension from some of the predefined groups
2633 * of the extension pool just specify the extension pool category in fileType property
2634 *
2635 * chance.file({fileType : 'raster'})
2636 * => dshgssds.psd
2637 *
2638 * You can provide specific extension for your files
2639 * chance.file({extension : 'html'})
2640 * => djfsd.html
2641 *
2642 * Or you could pass custom collection of extensions by array or by object
2643 * chance.file({extensions : [...]})
2644 * => dhgsdsd.psd
2645 *
2646 * chance.file({extensions : { key : [...], key : [...]}})
2647 * => djsfksdjsd.xml
2648 *
2649 * @param [collection] options
2650 * @return [string]
2651 *
2652 */
2653 Chance.prototype.file = function(options) {
2654
2655 var fileOptions = options || {};
2656 var poolCollectionKey = "fileExtension";
2657 var typeRange = Object.keys(this.get("fileExtension"));//['raster', 'vector', '3d', 'document'];
2658 var fileName;
2659 var fileExtension;
2660
2661 // Generate random file name
2662 fileName = this.word({length : fileOptions.length});
2663
2664 // Generate file by specific extension provided by the user
2665 if(fileOptions.extension) {
2666
2667 fileExtension = fileOptions.extension;
2668 return (fileName + '.' + fileExtension);
2669 }
2670
2671 // Generate file by specific extension collection
2672 if(fileOptions.extensions) {
2673
2674 if(Array.isArray(fileOptions.extensions)) {
2675
2676 fileExtension = this.pickone(fileOptions.extensions);
2677 return (fileName + '.' + fileExtension);
2678 }
2679 else if(fileOptions.extensions.constructor === Object) {
2680
2681 var extensionObjectCollection = fileOptions.extensions;
2682 var keys = Object.keys(extensionObjectCollection);
2683
2684 fileExtension = this.pickone(extensionObjectCollection[this.pickone(keys)]);
2685 return (fileName + '.' + fileExtension);
2686 }
2687
2688 throw new Error("Chance: Extensions must be an Array or Object");
2689 }
2690
2691 // Generate file extension based on specific file type
2692 if(fileOptions.fileType) {
2693
2694 var fileType = fileOptions.fileType;
2695 if(typeRange.indexOf(fileType) !== -1) {
2696
2697 fileExtension = this.pickone(this.get(poolCollectionKey)[fileType]);
2698 return (fileName + '.' + fileExtension);
2699 }
2700
2701 throw new RangeError("Chance: Expect file type value to be 'raster', 'vector', '3d' or 'document'");
2702 }
2703
2704 // Generate random file name if no extension options are passed
2705 fileExtension = this.pickone(this.get(poolCollectionKey)[this.pickone(typeRange)]);
2706 return (fileName + '.' + fileExtension);
2707 };
2708
2709 var data = {
2710
2711 firstNames: {
2712 "male": {
2713 "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"],
2714 // Data taken from http://www.dati.gov.it/dataset/comune-di-firenze_0163
2715 "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"],
2716 // Data taken from http://www.svbkindernamen.nl/int/nl/kindernamen/index.html
2717 "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"],
2718 // Data taken from https://fr.wikipedia.org/wiki/Liste_de_pr%C3%A9noms_fran%C3%A7ais_et_de_la_francophonie
2719 "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"]
2720 },
2721
2722 "female": {
2723 "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"],
2724 // Data taken from http://www.dati.gov.it/dataset/comune-di-firenze_0162
2725 "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"],
2726 // Data taken from http://www.svbkindernamen.nl/int/nl/kindernamen/index.html
2727 "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ë"],
2728 // Data taken from https://fr.wikipedia.org/wiki/Liste_de_pr%C3%A9noms_fran%C3%A7ais_et_de_la_francophonie
2729 "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é"]
2730 }
2731 },
2732
2733 lastNames: {
2734 "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'],
2735 // Data taken from http://www.dati.gov.it/dataset/comune-di-firenze_0164 (first 1000)
2736 "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"],
2737 // http://www.voornamelijk.nl/meest-voorkomende-achternamen-in-nederland-en-amsterdam/
2738 "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"],
2739 // https://surnames.behindthename.com/top/lists/england-wales/1991
2740 "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"],
2741 // https://surnames.behindthename.com/top/lists/germany/2017
2742 "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"],
2743 // http://www.japantimes.co.jp/life/2009/10/11/lifestyle/japans-top-100-most-common-family-names/
2744 "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"],
2745 // http://www.lowchensaustralia.com/names/popular-spanish-names.htm
2746 "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"],
2747 // Data taken from https://fr.wikipedia.org/wiki/Liste_des_noms_de_famille_les_plus_courants_en_France
2748 "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"]
2749 },
2750
2751 // Data taken from http://geoportal.statistics.gov.uk/datasets/ons-postcode-directory-latest-centroids
2752 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'}],
2753
2754 // Data taken from https://github.com/umpirsky/country-list/blob/master/data/en_US/country.json
2755 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"}],
2756
2757 counties: {
2758 // Data taken from http://www.downloadexcelfiles.com/gb_en/download-excel-file-list-counties-uk
2759 "uk": [
2760 {name: 'Bath and North East Somerset'},
2761 {name: 'Aberdeenshire'},
2762 {name: 'Anglesey'},
2763 {name: 'Angus'},
2764 {name: 'Bedford'},
2765 {name: 'Blackburn with Darwen'},
2766 {name: 'Blackpool'},
2767 {name: 'Bournemouth'},
2768 {name: 'Bracknell Forest'},
2769 {name: 'Brighton & Hove'},
2770 {name: 'Bristol'},
2771 {name: 'Buckinghamshire'},
2772 {name: 'Cambridgeshire'},
2773 {name: 'Carmarthenshire'},
2774 {name: 'Central Bedfordshire'},
2775 {name: 'Ceredigion'},
2776 {name: 'Cheshire East'},
2777 {name: 'Cheshire West and Chester'},
2778 {name: 'Clackmannanshire'},
2779 {name: 'Conwy'},
2780 {name: 'Cornwall'},
2781 {name: 'County Antrim'},
2782 {name: 'County Armagh'},
2783 {name: 'County Down'},
2784 {name: 'County Durham'},
2785 {name: 'County Fermanagh'},
2786 {name: 'County Londonderry'},
2787 {name: 'County Tyrone'},
2788 {name: 'Cumbria'},
2789 {name: 'Darlington'},
2790 {name: 'Denbighshire'},
2791 {name: 'Derby'},
2792 {name: 'Derbyshire'},
2793 {name: 'Devon'},
2794 {name: 'Dorset'},
2795 {name: 'Dumfries and Galloway'},
2796 {name: 'Dundee'},
2797 {name: 'East Lothian'},
2798 {name: 'East Riding of Yorkshire'},
2799 {name: 'East Sussex'},
2800 {name: 'Edinburgh?'},
2801 {name: 'Essex'},
2802 {name: 'Falkirk'},
2803 {name: 'Fife'},
2804 {name: 'Flintshire'},
2805 {name: 'Gloucestershire'},
2806 {name: 'Greater London'},
2807 {name: 'Greater Manchester'},
2808 {name: 'Gwent'},
2809 {name: 'Gwynedd'},
2810 {name: 'Halton'},
2811 {name: 'Hampshire'},
2812 {name: 'Hartlepool'},
2813 {name: 'Herefordshire'},
2814 {name: 'Hertfordshire'},
2815 {name: 'Highlands'},
2816 {name: 'Hull'},
2817 {name: 'Isle of Wight'},
2818 {name: 'Isles of Scilly'},
2819 {name: 'Kent'},
2820 {name: 'Lancashire'},
2821 {name: 'Leicester'},
2822 {name: 'Leicestershire'},
2823 {name: 'Lincolnshire'},
2824 {name: 'Lothian'},
2825 {name: 'Luton'},
2826 {name: 'Medway'},
2827 {name: 'Merseyside'},
2828 {name: 'Mid Glamorgan'},
2829 {name: 'Middlesbrough'},
2830 {name: 'Milton Keynes'},
2831 {name: 'Monmouthshire'},
2832 {name: 'Moray'},
2833 {name: 'Norfolk'},
2834 {name: 'North East Lincolnshire'},
2835 {name: 'North Lincolnshire'},
2836 {name: 'North Somerset'},
2837 {name: 'North Yorkshire'},
2838 {name: 'Northamptonshire'},
2839 {name: 'Northumberland'},
2840 {name: 'Nottingham'},
2841 {name: 'Nottinghamshire'},
2842 {name: 'Oxfordshire'},
2843 {name: 'Pembrokeshire'},
2844 {name: 'Perth and Kinross'},
2845 {name: 'Peterborough'},
2846 {name: 'Plymouth'},
2847 {name: 'Poole'},
2848 {name: 'Portsmouth'},
2849 {name: 'Powys'},
2850 {name: 'Reading'},
2851 {name: 'Redcar and Cleveland'},
2852 {name: 'Rutland'},
2853 {name: 'Scottish Borders'},
2854 {name: 'Shropshire'},
2855 {name: 'Slough'},
2856 {name: 'Somerset'},
2857 {name: 'South Glamorgan'},
2858 {name: 'South Gloucestershire'},
2859 {name: 'South Yorkshire'},
2860 {name: 'Southampton'},
2861 {name: 'Southend-on-Sea'},
2862 {name: 'Staffordshire'},
2863 {name: 'Stirlingshire'},
2864 {name: 'Stockton-on-Tees'},
2865 {name: 'Stoke-on-Trent'},
2866 {name: 'Strathclyde'},
2867 {name: 'Suffolk'},
2868 {name: 'Surrey'},
2869 {name: 'Swindon'},
2870 {name: 'Telford and Wrekin'},
2871 {name: 'Thurrock'},
2872 {name: 'Torbay'},
2873 {name: 'Tyne and Wear'},
2874 {name: 'Warrington'},
2875 {name: 'Warwickshire'},
2876 {name: 'West Berkshire'},
2877 {name: 'West Glamorgan'},
2878 {name: 'West Lothian'},
2879 {name: 'West Midlands'},
2880 {name: 'West Sussex'},
2881 {name: 'West Yorkshire'},
2882 {name: 'Western Isles'},
2883 {name: 'Wiltshire'},
2884 {name: 'Windsor and Maidenhead'},
2885 {name: 'Wokingham'},
2886 {name: 'Worcestershire'},
2887 {name: 'Wrexham'},
2888 {name: 'York'}]
2889 },
2890 provinces: {
2891 "ca": [
2892 {name: 'Alberta', abbreviation: 'AB'},
2893 {name: 'British Columbia', abbreviation: 'BC'},
2894 {name: 'Manitoba', abbreviation: 'MB'},
2895 {name: 'New Brunswick', abbreviation: 'NB'},
2896 {name: 'Newfoundland and Labrador', abbreviation: 'NL'},
2897 {name: 'Nova Scotia', abbreviation: 'NS'},
2898 {name: 'Ontario', abbreviation: 'ON'},
2899 {name: 'Prince Edward Island', abbreviation: 'PE'},
2900 {name: 'Quebec', abbreviation: 'QC'},
2901 {name: 'Saskatchewan', abbreviation: 'SK'},
2902
2903 // The case could be made that the following are not actually provinces
2904 // since they are technically considered "territories" however they all
2905 // look the same on an envelope!
2906 {name: 'Northwest Territories', abbreviation: 'NT'},
2907 {name: 'Nunavut', abbreviation: 'NU'},
2908 {name: 'Yukon', abbreviation: 'YT'}
2909 ],
2910 "it": [
2911 { name: "Agrigento", abbreviation: "AG", code: 84 },
2912 { name: "Alessandria", abbreviation: "AL", code: 6 },
2913 { name: "Ancona", abbreviation: "AN", code: 42 },
2914 { name: "Aosta", abbreviation: "AO", code: 7 },
2915 { name: "L'Aquila", abbreviation: "AQ", code: 66 },
2916 { name: "Arezzo", abbreviation: "AR", code: 51 },
2917 { name: "Ascoli-Piceno", abbreviation: "AP", code: 44 },
2918 { name: "Asti", abbreviation: "AT", code: 5 },
2919 { name: "Avellino", abbreviation: "AV", code: 64 },
2920 { name: "Bari", abbreviation: "BA", code: 72 },
2921 { name: "Barletta-Andria-Trani", abbreviation: "BT", code: 72 },
2922 { name: "Belluno", abbreviation: "BL", code: 25 },
2923 { name: "Benevento", abbreviation: "BN", code: 62 },
2924 { name: "Bergamo", abbreviation: "BG", code: 16 },
2925 { name: "Biella", abbreviation: "BI", code: 96 },
2926 { name: "Bologna", abbreviation: "BO", code: 37 },
2927 { name: "Bolzano", abbreviation: "BZ", code: 21 },
2928 { name: "Brescia", abbreviation: "BS", code: 17 },
2929 { name: "Brindisi", abbreviation: "BR", code: 74 },
2930 { name: "Cagliari", abbreviation: "CA", code: 92 },
2931 { name: "Caltanissetta", abbreviation: "CL", code: 85 },
2932 { name: "Campobasso", abbreviation: "CB", code: 70 },
2933 { name: "Carbonia Iglesias", abbreviation: "CI", code: 70 },
2934 { name: "Caserta", abbreviation: "CE", code: 61 },
2935 { name: "Catania", abbreviation: "CT", code: 87 },
2936 { name: "Catanzaro", abbreviation: "CZ", code: 79 },
2937 { name: "Chieti", abbreviation: "CH", code: 69 },
2938 { name: "Como", abbreviation: "CO", code: 13 },
2939 { name: "Cosenza", abbreviation: "CS", code: 78 },
2940 { name: "Cremona", abbreviation: "CR", code: 19 },
2941 { name: "Crotone", abbreviation: "KR", code: 101 },
2942 { name: "Cuneo", abbreviation: "CN", code: 4 },
2943 { name: "Enna", abbreviation: "EN", code: 86 },
2944 { name: "Fermo", abbreviation: "FM", code: 86 },
2945 { name: "Ferrara", abbreviation: "FE", code: 38 },
2946 { name: "Firenze", abbreviation: "FI", code: 48 },
2947 { name: "Foggia", abbreviation: "FG", code: 71 },
2948 { name: "Forli-Cesena", abbreviation: "FC", code: 71 },
2949 { name: "Frosinone", abbreviation: "FR", code: 60 },
2950 { name: "Genova", abbreviation: "GE", code: 10 },
2951 { name: "Gorizia", abbreviation: "GO", code: 31 },
2952 { name: "Grosseto", abbreviation: "GR", code: 53 },
2953 { name: "Imperia", abbreviation: "IM", code: 8 },
2954 { name: "Isernia", abbreviation: "IS", code: 94 },
2955 { name: "La-Spezia", abbreviation: "SP", code: 66 },
2956 { name: "Latina", abbreviation: "LT", code: 59 },
2957 { name: "Lecce", abbreviation: "LE", code: 75 },
2958 { name: "Lecco", abbreviation: "LC", code: 97 },
2959 { name: "Livorno", abbreviation: "LI", code: 49 },
2960 { name: "Lodi", abbreviation: "LO", code: 98 },
2961 { name: "Lucca", abbreviation: "LU", code: 46 },
2962 { name: "Macerata", abbreviation: "MC", code: 43 },
2963 { name: "Mantova", abbreviation: "MN", code: 20 },
2964 { name: "Massa-Carrara", abbreviation: "MS", code: 45 },
2965 { name: "Matera", abbreviation: "MT", code: 77 },
2966 { name: "Medio Campidano", abbreviation: "VS", code: 77 },
2967 { name: "Messina", abbreviation: "ME", code: 83 },
2968 { name: "Milano", abbreviation: "MI", code: 15 },
2969 { name: "Modena", abbreviation: "MO", code: 36 },
2970 { name: "Monza-Brianza", abbreviation: "MB", code: 36 },
2971 { name: "Napoli", abbreviation: "NA", code: 63 },
2972 { name: "Novara", abbreviation: "NO", code: 3 },
2973 { name: "Nuoro", abbreviation: "NU", code: 91 },
2974 { name: "Ogliastra", abbreviation: "OG", code: 91 },
2975 { name: "Olbia Tempio", abbreviation: "OT", code: 91 },
2976 { name: "Oristano", abbreviation: "OR", code: 95 },
2977 { name: "Padova", abbreviation: "PD", code: 28 },
2978 { name: "Palermo", abbreviation: "PA", code: 82 },
2979 { name: "Parma", abbreviation: "PR", code: 34 },
2980 { name: "Pavia", abbreviation: "PV", code: 18 },
2981 { name: "Perugia", abbreviation: "PG", code: 54 },
2982 { name: "Pesaro-Urbino", abbreviation: "PU", code: 41 },
2983 { name: "Pescara", abbreviation: "PE", code: 68 },
2984 { name: "Piacenza", abbreviation: "PC", code: 33 },
2985 { name: "Pisa", abbreviation: "PI", code: 50 },
2986 { name: "Pistoia", abbreviation: "PT", code: 47 },
2987 { name: "Pordenone", abbreviation: "PN", code: 93 },
2988 { name: "Potenza", abbreviation: "PZ", code: 76 },
2989 { name: "Prato", abbreviation: "PO", code: 100 },
2990 { name: "Ragusa", abbreviation: "RG", code: 88 },
2991 { name: "Ravenna", abbreviation: "RA", code: 39 },
2992 { name: "Reggio-Calabria", abbreviation: "RC", code: 35 },
2993 { name: "Reggio-Emilia", abbreviation: "RE", code: 35 },
2994 { name: "Rieti", abbreviation: "RI", code: 57 },
2995 { name: "Rimini", abbreviation: "RN", code: 99 },
2996 { name: "Roma", abbreviation: "Roma", code: 58 },
2997 { name: "Rovigo", abbreviation: "RO", code: 29 },
2998 { name: "Salerno", abbreviation: "SA", code: 65 },
2999 { name: "Sassari", abbreviation: "SS", code: 90 },
3000 { name: "Savona", abbreviation: "SV", code: 9 },
3001 { name: "Siena", abbreviation: "SI", code: 52 },
3002 { name: "Siracusa", abbreviation: "SR", code: 89 },
3003 { name: "Sondrio", abbreviation: "SO", code: 14 },
3004 { name: "Taranto", abbreviation: "TA", code: 73 },
3005 { name: "Teramo", abbreviation: "TE", code: 67 },
3006 { name: "Terni", abbreviation: "TR", code: 55 },
3007 { name: "Torino", abbreviation: "TO", code: 1 },
3008 { name: "Trapani", abbreviation: "TP", code: 81 },
3009 { name: "Trento", abbreviation: "TN", code: 22 },
3010 { name: "Treviso", abbreviation: "TV", code: 26 },
3011 { name: "Trieste", abbreviation: "TS", code: 32 },
3012 { name: "Udine", abbreviation: "UD", code: 30 },
3013 { name: "Varese", abbreviation: "VA", code: 12 },
3014 { name: "Venezia", abbreviation: "VE", code: 27 },
3015 { name: "Verbania", abbreviation: "VB", code: 27 },
3016 { name: "Vercelli", abbreviation: "VC", code: 2 },
3017 { name: "Verona", abbreviation: "VR", code: 23 },
3018 { name: "Vibo-Valentia", abbreviation: "VV", code: 102 },
3019 { name: "Vicenza", abbreviation: "VI", code: 24 },
3020 { name: "Viterbo", abbreviation: "VT", code: 56 }
3021 ]
3022 },
3023
3024 // from: https://github.com/samsargent/Useful-Autocomplete-Data/blob/master/data/nationalities.json
3025 nationalities: [
3026 {name: 'Afghan'},
3027 {name: 'Albanian'},
3028 {name: 'Algerian'},
3029 {name: 'American'},
3030 {name: 'Andorran'},
3031 {name: 'Angolan'},
3032 {name: 'Antiguans'},
3033 {name: 'Argentinean'},
3034 {name: 'Armenian'},
3035 {name: 'Australian'},
3036 {name: 'Austrian'},
3037 {name: 'Azerbaijani'},
3038 {name: 'Bahami'},
3039 {name: 'Bahraini'},
3040 {name: 'Bangladeshi'},
3041 {name: 'Barbadian'},
3042 {name: 'Barbudans'},
3043 {name: 'Batswana'},
3044 {name: 'Belarusian'},
3045 {name: 'Belgian'},
3046 {name: 'Belizean'},
3047 {name: 'Beninese'},
3048 {name: 'Bhutanese'},
3049 {name: 'Bolivian'},
3050 {name: 'Bosnian'},
3051 {name: 'Brazilian'},
3052 {name: 'British'},
3053 {name: 'Bruneian'},
3054 {name: 'Bulgarian'},
3055 {name: 'Burkinabe'},
3056 {name: 'Burmese'},
3057 {name: 'Burundian'},
3058 {name: 'Cambodian'},
3059 {name: 'Cameroonian'},
3060 {name: 'Canadian'},
3061 {name: 'Cape Verdean'},
3062 {name: 'Central African'},
3063 {name: 'Chadian'},
3064 {name: 'Chilean'},
3065 {name: 'Chinese'},
3066 {name: 'Colombian'},
3067 {name: 'Comoran'},
3068 {name: 'Congolese'},
3069 {name: 'Costa Rican'},
3070 {name: 'Croatian'},
3071 {name: 'Cuban'},
3072 {name: 'Cypriot'},
3073 {name: 'Czech'},
3074 {name: 'Danish'},
3075 {name: 'Djibouti'},
3076 {name: 'Dominican'},
3077 {name: 'Dutch'},
3078 {name: 'East Timorese'},
3079 {name: 'Ecuadorean'},
3080 {name: 'Egyptian'},
3081 {name: 'Emirian'},
3082 {name: 'Equatorial Guinean'},
3083 {name: 'Eritrean'},
3084 {name: 'Estonian'},
3085 {name: 'Ethiopian'},
3086 {name: 'Fijian'},
3087 {name: 'Filipino'},
3088 {name: 'Finnish'},
3089 {name: 'French'},
3090 {name: 'Gabonese'},
3091 {name: 'Gambian'},
3092 {name: 'Georgian'},
3093 {name: 'German'},
3094 {name: 'Ghanaian'},
3095 {name: 'Greek'},
3096 {name: 'Grenadian'},
3097 {name: 'Guatemalan'},
3098 {name: 'Guinea-Bissauan'},
3099 {name: 'Guinean'},
3100 {name: 'Guyanese'},
3101 {name: 'Haitian'},
3102 {name: 'Herzegovinian'},
3103 {name: 'Honduran'},
3104 {name: 'Hungarian'},
3105 {name: 'I-Kiribati'},
3106 {name: 'Icelander'},
3107 {name: 'Indian'},
3108 {name: 'Indonesian'},
3109 {name: 'Iranian'},
3110 {name: 'Iraqi'},
3111 {name: 'Irish'},
3112 {name: 'Israeli'},
3113 {name: 'Italian'},
3114 {name: 'Ivorian'},
3115 {name: 'Jamaican'},
3116 {name: 'Japanese'},
3117 {name: 'Jordanian'},
3118 {name: 'Kazakhstani'},
3119 {name: 'Kenyan'},
3120 {name: 'Kittian and Nevisian'},
3121 {name: 'Kuwaiti'},
3122 {name: 'Kyrgyz'},
3123 {name: 'Laotian'},
3124 {name: 'Latvian'},
3125 {name: 'Lebanese'},
3126 {name: 'Liberian'},
3127 {name: 'Libyan'},
3128 {name: 'Liechtensteiner'},
3129 {name: 'Lithuanian'},
3130 {name: 'Luxembourger'},
3131 {name: 'Macedonian'},
3132 {name: 'Malagasy'},
3133 {name: 'Malawian'},
3134 {name: 'Malaysian'},
3135 {name: 'Maldivan'},
3136 {name: 'Malian'},
3137 {name: 'Maltese'},
3138 {name: 'Marshallese'},
3139 {name: 'Mauritanian'},
3140 {name: 'Mauritian'},
3141 {name: 'Mexican'},
3142 {name: 'Micronesian'},
3143 {name: 'Moldovan'},
3144 {name: 'Monacan'},
3145 {name: 'Mongolian'},
3146 {name: 'Moroccan'},
3147 {name: 'Mosotho'},
3148 {name: 'Motswana'},
3149 {name: 'Mozambican'},
3150 {name: 'Namibian'},
3151 {name: 'Nauruan'},
3152 {name: 'Nepalese'},
3153 {name: 'New Zealander'},
3154 {name: 'Nicaraguan'},
3155 {name: 'Nigerian'},
3156 {name: 'Nigerien'},
3157 {name: 'North Korean'},
3158 {name: 'Northern Irish'},
3159 {name: 'Norwegian'},
3160 {name: 'Omani'},
3161 {name: 'Pakistani'},
3162 {name: 'Palauan'},
3163 {name: 'Panamanian'},
3164 {name: 'Papua New Guinean'},
3165 {name: 'Paraguayan'},
3166 {name: 'Peruvian'},
3167 {name: 'Polish'},
3168 {name: 'Portuguese'},
3169 {name: 'Qatari'},
3170 {name: 'Romani'},
3171 {name: 'Russian'},
3172 {name: 'Rwandan'},
3173 {name: 'Saint Lucian'},
3174 {name: 'Salvadoran'},
3175 {name: 'Samoan'},
3176 {name: 'San Marinese'},
3177 {name: 'Sao Tomean'},
3178 {name: 'Saudi'},
3179 {name: 'Scottish'},
3180 {name: 'Senegalese'},
3181 {name: 'Serbian'},
3182 {name: 'Seychellois'},
3183 {name: 'Sierra Leonean'},
3184 {name: 'Singaporean'},
3185 {name: 'Slovakian'},
3186 {name: 'Slovenian'},
3187 {name: 'Solomon Islander'},
3188 {name: 'Somali'},
3189 {name: 'South African'},
3190 {name: 'South Korean'},
3191 {name: 'Spanish'},
3192 {name: 'Sri Lankan'},
3193 {name: 'Sudanese'},
3194 {name: 'Surinamer'},
3195 {name: 'Swazi'},
3196 {name: 'Swedish'},
3197 {name: 'Swiss'},
3198 {name: 'Syrian'},
3199 {name: 'Taiwanese'},
3200 {name: 'Tajik'},
3201 {name: 'Tanzanian'},
3202 {name: 'Thai'},
3203 {name: 'Togolese'},
3204 {name: 'Tongan'},
3205 {name: 'Trinidadian or Tobagonian'},
3206 {name: 'Tunisian'},
3207 {name: 'Turkish'},
3208 {name: 'Tuvaluan'},
3209 {name: 'Ugandan'},
3210 {name: 'Ukrainian'},
3211 {name: 'Uruguaya'},
3212 {name: 'Uzbekistani'},
3213 {name: 'Venezuela'},
3214 {name: 'Vietnamese'},
3215 {name: 'Wels'},
3216 {name: 'Yemenit'},
3217 {name: 'Zambia'},
3218 {name: 'Zimbabwe'},
3219 ],
3220 // http://www.loc.gov/standards/iso639-2/php/code_list.php (ISO-639-1 codes)
3221 locale_languages: [
3222 "aa",
3223 "ab",
3224 "ae",
3225 "af",
3226 "ak",
3227 "am",
3228 "an",
3229 "ar",
3230 "as",
3231 "av",
3232 "ay",
3233 "az",
3234 "ba",
3235 "be",
3236 "bg",
3237 "bh",
3238 "bi",
3239 "bm",
3240 "bn",
3241 "bo",
3242 "br",
3243 "bs",
3244 "ca",
3245 "ce",
3246 "ch",
3247 "co",
3248 "cr",
3249 "cs",
3250 "cu",
3251 "cv",
3252 "cy",
3253 "da",
3254 "de",
3255 "dv",
3256 "dz",
3257 "ee",
3258 "el",
3259 "en",
3260 "eo",
3261 "es",
3262 "et",
3263 "eu",
3264 "fa",
3265 "ff",
3266 "fi",
3267 "fj",
3268 "fo",
3269 "fr",
3270 "fy",
3271 "ga",
3272 "gd",
3273 "gl",
3274 "gn",
3275 "gu",
3276 "gv",
3277 "ha",
3278 "he",
3279 "hi",
3280 "ho",
3281 "hr",
3282 "ht",
3283 "hu",
3284 "hy",
3285 "hz",
3286 "ia",
3287 "id",
3288 "ie",
3289 "ig",
3290 "ii",
3291 "ik",
3292 "io",
3293 "is",
3294 "it",
3295 "iu",
3296 "ja",
3297 "jv",
3298 "ka",
3299 "kg",
3300 "ki",
3301 "kj",
3302 "kk",
3303 "kl",
3304 "km",
3305 "kn",
3306 "ko",
3307 "kr",
3308 "ks",
3309 "ku",
3310 "kv",
3311 "kw",
3312 "ky",
3313 "la",
3314 "lb",
3315 "lg",
3316 "li",
3317 "ln",
3318 "lo",
3319 "lt",
3320 "lu",
3321 "lv",
3322 "mg",
3323 "mh",
3324 "mi",
3325 "mk",
3326 "ml",
3327 "mn",
3328 "mr",
3329 "ms",
3330 "mt",
3331 "my",
3332 "na",
3333 "nb",
3334 "nd",
3335 "ne",
3336 "ng",
3337 "nl",
3338 "nn",
3339 "no",
3340 "nr",
3341 "nv",
3342 "ny",
3343 "oc",
3344 "oj",
3345 "om",
3346 "or",
3347 "os",
3348 "pa",
3349 "pi",
3350 "pl",
3351 "ps",
3352 "pt",
3353 "qu",
3354 "rm",
3355 "rn",
3356 "ro",
3357 "ru",
3358 "rw",
3359 "sa",
3360 "sc",
3361 "sd",
3362 "se",
3363 "sg",
3364 "si",
3365 "sk",
3366 "sl",
3367 "sm",
3368 "sn",
3369 "so",
3370 "sq",
3371 "sr",
3372 "ss",
3373 "st",
3374 "su",
3375 "sv",
3376 "sw",
3377 "ta",
3378 "te",
3379 "tg",
3380 "th",
3381 "ti",
3382 "tk",
3383 "tl",
3384 "tn",
3385 "to",
3386 "tr",
3387 "ts",
3388 "tt",
3389 "tw",
3390 "ty",
3391 "ug",
3392 "uk",
3393 "ur",
3394 "uz",
3395 "ve",
3396 "vi",
3397 "vo",
3398 "wa",
3399 "wo",
3400 "xh",
3401 "yi",
3402 "yo",
3403 "za",
3404 "zh",
3405 "zu"
3406 ],
3407
3408 // From http://data.okfn.org/data/core/language-codes#resource-language-codes-full (IETF language tags)
3409 locale_regions: [
3410 "agq-CM",
3411 "asa-TZ",
3412 "ast-ES",
3413 "bas-CM",
3414 "bem-ZM",
3415 "bez-TZ",
3416 "brx-IN",
3417 "cgg-UG",
3418 "chr-US",
3419 "dav-KE",
3420 "dje-NE",
3421 "dsb-DE",
3422 "dua-CM",
3423 "dyo-SN",
3424 "ebu-KE",
3425 "ewo-CM",
3426 "fil-PH",
3427 "fur-IT",
3428 "gsw-CH",
3429 "gsw-FR",
3430 "gsw-LI",
3431 "guz-KE",
3432 "haw-US",
3433 "hsb-DE",
3434 "jgo-CM",
3435 "jmc-TZ",
3436 "kab-DZ",
3437 "kam-KE",
3438 "kde-TZ",
3439 "kea-CV",
3440 "khq-ML",
3441 "kkj-CM",
3442 "kln-KE",
3443 "kok-IN",
3444 "ksb-TZ",
3445 "ksf-CM",
3446 "ksh-DE",
3447 "lag-TZ",
3448 "lkt-US",
3449 "luo-KE",
3450 "luy-KE",
3451 "mas-KE",
3452 "mas-TZ",
3453 "mer-KE",
3454 "mfe-MU",
3455 "mgh-MZ",
3456 "mgo-CM",
3457 "mua-CM",
3458 "naq-NA",
3459 "nmg-CM",
3460 "nnh-CM",
3461 "nus-SD",
3462 "nyn-UG",
3463 "rof-TZ",
3464 "rwk-TZ",
3465 "sah-RU",
3466 "saq-KE",
3467 "sbp-TZ",
3468 "seh-MZ",
3469 "ses-ML",
3470 "shi-Latn",
3471 "shi-Latn-MA",
3472 "shi-Tfng",
3473 "shi-Tfng-MA",
3474 "smn-FI",
3475 "teo-KE",
3476 "teo-UG",
3477 "twq-NE",
3478 "tzm-Latn",
3479 "tzm-Latn-MA",
3480 "vai-Latn",
3481 "vai-Latn-LR",
3482 "vai-Vaii",
3483 "vai-Vaii-LR",
3484 "vun-TZ",
3485 "wae-CH",
3486 "xog-UG",
3487 "yav-CM",
3488 "zgh-MA",
3489 "af-NA",
3490 "af-ZA",
3491 "ak-GH",
3492 "am-ET",
3493 "ar-001",
3494 "ar-AE",
3495 "ar-BH",
3496 "ar-DJ",
3497 "ar-DZ",
3498 "ar-EG",
3499 "ar-EH",
3500 "ar-ER",
3501 "ar-IL",
3502 "ar-IQ",
3503 "ar-JO",
3504 "ar-KM",
3505 "ar-KW",
3506 "ar-LB",
3507 "ar-LY",
3508 "ar-MA",
3509 "ar-MR",
3510 "ar-OM",
3511 "ar-PS",
3512 "ar-QA",
3513 "ar-SA",
3514 "ar-SD",
3515 "ar-SO",
3516 "ar-SS",
3517 "ar-SY",
3518 "ar-TD",
3519 "ar-TN",
3520 "ar-YE",
3521 "as-IN",
3522 "az-Cyrl",
3523 "az-Cyrl-AZ",
3524 "az-Latn",
3525 "az-Latn-AZ",
3526 "be-BY",
3527 "bg-BG",
3528 "bm-Latn",
3529 "bm-Latn-ML",
3530 "bn-BD",
3531 "bn-IN",
3532 "bo-CN",
3533 "bo-IN",
3534 "br-FR",
3535 "bs-Cyrl",
3536 "bs-Cyrl-BA",
3537 "bs-Latn",
3538 "bs-Latn-BA",
3539 "ca-AD",
3540 "ca-ES",
3541 "ca-ES-VALENCIA",
3542 "ca-FR",
3543 "ca-IT",
3544 "cs-CZ",
3545 "cy-GB",
3546 "da-DK",
3547 "da-GL",
3548 "de-AT",
3549 "de-BE",
3550 "de-CH",
3551 "de-DE",
3552 "de-LI",
3553 "de-LU",
3554 "dz-BT",
3555 "ee-GH",
3556 "ee-TG",
3557 "el-CY",
3558 "el-GR",
3559 "en-001",
3560 "en-150",
3561 "en-AG",
3562 "en-AI",
3563 "en-AS",
3564 "en-AU",
3565 "en-BB",
3566 "en-BE",
3567 "en-BM",
3568 "en-BS",
3569 "en-BW",
3570 "en-BZ",
3571 "en-CA",
3572 "en-CC",
3573 "en-CK",
3574 "en-CM",
3575 "en-CX",
3576 "en-DG",
3577 "en-DM",
3578 "en-ER",
3579 "en-FJ",
3580 "en-FK",
3581 "en-FM",
3582 "en-GB",
3583 "en-GD",
3584 "en-GG",
3585 "en-GH",
3586 "en-GI",
3587 "en-GM",
3588 "en-GU",
3589 "en-GY",
3590 "en-HK",
3591 "en-IE",
3592 "en-IM",
3593 "en-IN",
3594 "en-IO",
3595 "en-JE",
3596 "en-JM",
3597 "en-KE",
3598 "en-KI",
3599 "en-KN",
3600 "en-KY",
3601 "en-LC",
3602 "en-LR",
3603 "en-LS",
3604 "en-MG",
3605 "en-MH",
3606 "en-MO",
3607 "en-MP",
3608 "en-MS",
3609 "en-MT",
3610 "en-MU",
3611 "en-MW",
3612 "en-MY",
3613 "en-NA",
3614 "en-NF",
3615 "en-NG",
3616 "en-NR",
3617 "en-NU",
3618 "en-NZ",
3619 "en-PG",
3620 "en-PH",
3621 "en-PK",
3622 "en-PN",
3623 "en-PR",
3624 "en-PW",
3625 "en-RW",
3626 "en-SB",
3627 "en-SC",
3628 "en-SD",
3629 "en-SG",
3630 "en-SH",
3631 "en-SL",
3632 "en-SS",
3633 "en-SX",
3634 "en-SZ",
3635 "en-TC",
3636 "en-TK",
3637 "en-TO",
3638 "en-TT",
3639 "en-TV",
3640 "en-TZ",
3641 "en-UG",
3642 "en-UM",
3643 "en-US",
3644 "en-US-POSIX",
3645 "en-VC",
3646 "en-VG",
3647 "en-VI",
3648 "en-VU",
3649 "en-WS",
3650 "en-ZA",
3651 "en-ZM",
3652 "en-ZW",
3653 "eo-001",
3654 "es-419",
3655 "es-AR",
3656 "es-BO",
3657 "es-CL",
3658 "es-CO",
3659 "es-CR",
3660 "es-CU",
3661 "es-DO",
3662 "es-EA",
3663 "es-EC",
3664 "es-ES",
3665 "es-GQ",
3666 "es-GT",
3667 "es-HN",
3668 "es-IC",
3669 "es-MX",
3670 "es-NI",
3671 "es-PA",
3672 "es-PE",
3673 "es-PH",
3674 "es-PR",
3675 "es-PY",
3676 "es-SV",
3677 "es-US",
3678 "es-UY",
3679 "es-VE",
3680 "et-EE",
3681 "eu-ES",
3682 "fa-AF",
3683 "fa-IR",
3684 "ff-CM",
3685 "ff-GN",
3686 "ff-MR",
3687 "ff-SN",
3688 "fi-FI",
3689 "fo-FO",
3690 "fr-BE",
3691 "fr-BF",
3692 "fr-BI",
3693 "fr-BJ",
3694 "fr-BL",
3695 "fr-CA",
3696 "fr-CD",
3697 "fr-CF",
3698 "fr-CG",
3699 "fr-CH",
3700 "fr-CI",
3701 "fr-CM",
3702 "fr-DJ",
3703 "fr-DZ",
3704 "fr-FR",
3705 "fr-GA",
3706 "fr-GF",
3707 "fr-GN",
3708 "fr-GP",
3709 "fr-GQ",
3710 "fr-HT",
3711 "fr-KM",
3712 "fr-LU",
3713 "fr-MA",
3714 "fr-MC",
3715 "fr-MF",
3716 "fr-MG",
3717 "fr-ML",
3718 "fr-MQ",
3719 "fr-MR",
3720 "fr-MU",
3721 "fr-NC",
3722 "fr-NE",
3723 "fr-PF",
3724 "fr-PM",
3725 "fr-RE",
3726 "fr-RW",
3727 "fr-SC",
3728 "fr-SN",
3729 "fr-SY",
3730 "fr-TD",
3731 "fr-TG",
3732 "fr-TN",
3733 "fr-VU",
3734 "fr-WF",
3735 "fr-YT",
3736 "fy-NL",
3737 "ga-IE",
3738 "gd-GB",
3739 "gl-ES",
3740 "gu-IN",
3741 "gv-IM",
3742 "ha-Latn",
3743 "ha-Latn-GH",
3744 "ha-Latn-NE",
3745 "ha-Latn-NG",
3746 "he-IL",
3747 "hi-IN",
3748 "hr-BA",
3749 "hr-HR",
3750 "hu-HU",
3751 "hy-AM",
3752 "id-ID",
3753 "ig-NG",
3754 "ii-CN",
3755 "is-IS",
3756 "it-CH",
3757 "it-IT",
3758 "it-SM",
3759 "ja-JP",
3760 "ka-GE",
3761 "ki-KE",
3762 "kk-Cyrl",
3763 "kk-Cyrl-KZ",
3764 "kl-GL",
3765 "km-KH",
3766 "kn-IN",
3767 "ko-KP",
3768 "ko-KR",
3769 "ks-Arab",
3770 "ks-Arab-IN",
3771 "kw-GB",
3772 "ky-Cyrl",
3773 "ky-Cyrl-KG",
3774 "lb-LU",
3775 "lg-UG",
3776 "ln-AO",
3777 "ln-CD",
3778 "ln-CF",
3779 "ln-CG",
3780 "lo-LA",
3781 "lt-LT",
3782 "lu-CD",
3783 "lv-LV",
3784 "mg-MG",
3785 "mk-MK",
3786 "ml-IN",
3787 "mn-Cyrl",
3788 "mn-Cyrl-MN",
3789 "mr-IN",
3790 "ms-Latn",
3791 "ms-Latn-BN",
3792 "ms-Latn-MY",
3793 "ms-Latn-SG",
3794 "mt-MT",
3795 "my-MM",
3796 "nb-NO",
3797 "nb-SJ",
3798 "nd-ZW",
3799 "ne-IN",
3800 "ne-NP",
3801 "nl-AW",
3802 "nl-BE",
3803 "nl-BQ",
3804 "nl-CW",
3805 "nl-NL",
3806 "nl-SR",
3807 "nl-SX",
3808 "nn-NO",
3809 "om-ET",
3810 "om-KE",
3811 "or-IN",
3812 "os-GE",
3813 "os-RU",
3814 "pa-Arab",
3815 "pa-Arab-PK",
3816 "pa-Guru",
3817 "pa-Guru-IN",
3818 "pl-PL",
3819 "ps-AF",
3820 "pt-AO",
3821 "pt-BR",
3822 "pt-CV",
3823 "pt-GW",
3824 "pt-MO",
3825 "pt-MZ",
3826 "pt-PT",
3827 "pt-ST",
3828 "pt-TL",
3829 "qu-BO",
3830 "qu-EC",
3831 "qu-PE",
3832 "rm-CH",
3833 "rn-BI",
3834 "ro-MD",
3835 "ro-RO",
3836 "ru-BY",
3837 "ru-KG",
3838 "ru-KZ",
3839 "ru-MD",
3840 "ru-RU",
3841 "ru-UA",
3842 "rw-RW",
3843 "se-FI",
3844 "se-NO",
3845 "se-SE",
3846 "sg-CF",
3847 "si-LK",
3848 "sk-SK",
3849 "sl-SI",
3850 "sn-ZW",
3851 "so-DJ",
3852 "so-ET",
3853 "so-KE",
3854 "so-SO",
3855 "sq-AL",
3856 "sq-MK",
3857 "sq-XK",
3858 "sr-Cyrl",
3859 "sr-Cyrl-BA",
3860 "sr-Cyrl-ME",
3861 "sr-Cyrl-RS",
3862 "sr-Cyrl-XK",
3863 "sr-Latn",
3864 "sr-Latn-BA",
3865 "sr-Latn-ME",
3866 "sr-Latn-RS",
3867 "sr-Latn-XK",
3868 "sv-AX",
3869 "sv-FI",
3870 "sv-SE",
3871 "sw-CD",
3872 "sw-KE",
3873 "sw-TZ",
3874 "sw-UG",
3875 "ta-IN",
3876 "ta-LK",
3877 "ta-MY",
3878 "ta-SG",
3879 "te-IN",
3880 "th-TH",
3881 "ti-ER",
3882 "ti-ET",
3883 "to-TO",
3884 "tr-CY",
3885 "tr-TR",
3886 "ug-Arab",
3887 "ug-Arab-CN",
3888 "uk-UA",
3889 "ur-IN",
3890 "ur-PK",
3891 "uz-Arab",
3892 "uz-Arab-AF",
3893 "uz-Cyrl",
3894 "uz-Cyrl-UZ",
3895 "uz-Latn",
3896 "uz-Latn-UZ",
3897 "vi-VN",
3898 "yi-001",
3899 "yo-BJ",
3900 "yo-NG",
3901 "zh-Hans",
3902 "zh-Hans-CN",
3903 "zh-Hans-HK",
3904 "zh-Hans-MO",
3905 "zh-Hans-SG",
3906 "zh-Hant",
3907 "zh-Hant-HK",
3908 "zh-Hant-MO",
3909 "zh-Hant-TW",
3910 "zu-ZA"
3911 ],
3912
3913 us_states_and_dc: [
3914 {name: 'Alabama', abbreviation: 'AL'},
3915 {name: 'Alaska', abbreviation: 'AK'},
3916 {name: 'Arizona', abbreviation: 'AZ'},
3917 {name: 'Arkansas', abbreviation: 'AR'},
3918 {name: 'California', abbreviation: 'CA'},
3919 {name: 'Colorado', abbreviation: 'CO'},
3920 {name: 'Connecticut', abbreviation: 'CT'},
3921 {name: 'Delaware', abbreviation: 'DE'},
3922 {name: 'District of Columbia', abbreviation: 'DC'},
3923 {name: 'Florida', abbreviation: 'FL'},
3924 {name: 'Georgia', abbreviation: 'GA'},
3925 {name: 'Hawaii', abbreviation: 'HI'},
3926 {name: 'Idaho', abbreviation: 'ID'},
3927 {name: 'Illinois', abbreviation: 'IL'},
3928 {name: 'Indiana', abbreviation: 'IN'},
3929 {name: 'Iowa', abbreviation: 'IA'},
3930 {name: 'Kansas', abbreviation: 'KS'},
3931 {name: 'Kentucky', abbreviation: 'KY'},
3932 {name: 'Louisiana', abbreviation: 'LA'},
3933 {name: 'Maine', abbreviation: 'ME'},
3934 {name: 'Maryland', abbreviation: 'MD'},
3935 {name: 'Massachusetts', abbreviation: 'MA'},
3936 {name: 'Michigan', abbreviation: 'MI'},
3937 {name: 'Minnesota', abbreviation: 'MN'},
3938 {name: 'Mississippi', abbreviation: 'MS'},
3939 {name: 'Missouri', abbreviation: 'MO'},
3940 {name: 'Montana', abbreviation: 'MT'},
3941 {name: 'Nebraska', abbreviation: 'NE'},
3942 {name: 'Nevada', abbreviation: 'NV'},
3943 {name: 'New Hampshire', abbreviation: 'NH'},
3944 {name: 'New Jersey', abbreviation: 'NJ'},
3945 {name: 'New Mexico', abbreviation: 'NM'},
3946 {name: 'New York', abbreviation: 'NY'},
3947 {name: 'North Carolina', abbreviation: 'NC'},
3948 {name: 'North Dakota', abbreviation: 'ND'},
3949 {name: 'Ohio', abbreviation: 'OH'},
3950 {name: 'Oklahoma', abbreviation: 'OK'},
3951 {name: 'Oregon', abbreviation: 'OR'},
3952 {name: 'Pennsylvania', abbreviation: 'PA'},
3953 {name: 'Rhode Island', abbreviation: 'RI'},
3954 {name: 'South Carolina', abbreviation: 'SC'},
3955 {name: 'South Dakota', abbreviation: 'SD'},
3956 {name: 'Tennessee', abbreviation: 'TN'},
3957 {name: 'Texas', abbreviation: 'TX'},
3958 {name: 'Utah', abbreviation: 'UT'},
3959 {name: 'Vermont', abbreviation: 'VT'},
3960 {name: 'Virginia', abbreviation: 'VA'},
3961 {name: 'Washington', abbreviation: 'WA'},
3962 {name: 'West Virginia', abbreviation: 'WV'},
3963 {name: 'Wisconsin', abbreviation: 'WI'},
3964 {name: 'Wyoming', abbreviation: 'WY'}
3965 ],
3966
3967 territories: [
3968 {name: 'American Samoa', abbreviation: 'AS'},
3969 {name: 'Federated States of Micronesia', abbreviation: 'FM'},
3970 {name: 'Guam', abbreviation: 'GU'},
3971 {name: 'Marshall Islands', abbreviation: 'MH'},
3972 {name: 'Northern Mariana Islands', abbreviation: 'MP'},
3973 {name: 'Puerto Rico', abbreviation: 'PR'},
3974 {name: 'Virgin Islands, U.S.', abbreviation: 'VI'}
3975 ],
3976
3977 armed_forces: [
3978 {name: 'Armed Forces Europe', abbreviation: 'AE'},
3979 {name: 'Armed Forces Pacific', abbreviation: 'AP'},
3980 {name: 'Armed Forces the Americas', abbreviation: 'AA'}
3981 ],
3982
3983 country_regions: {
3984 it: [
3985 { name: "Valle d'Aosta", abbreviation: "VDA" },
3986 { name: "Piemonte", abbreviation: "PIE" },
3987 { name: "Lombardia", abbreviation: "LOM" },
3988 { name: "Veneto", abbreviation: "VEN" },
3989 { name: "Trentino Alto Adige", abbreviation: "TAA" },
3990 { name: "Friuli Venezia Giulia", abbreviation: "FVG" },
3991 { name: "Liguria", abbreviation: "LIG" },
3992 { name: "Emilia Romagna", abbreviation: "EMR" },
3993 { name: "Toscana", abbreviation: "TOS" },
3994 { name: "Umbria", abbreviation: "UMB" },
3995 { name: "Marche", abbreviation: "MAR" },
3996 { name: "Abruzzo", abbreviation: "ABR" },
3997 { name: "Lazio", abbreviation: "LAZ" },
3998 { name: "Campania", abbreviation: "CAM" },
3999 { name: "Puglia", abbreviation: "PUG" },
4000 { name: "Basilicata", abbreviation: "BAS" },
4001 { name: "Molise", abbreviation: "MOL" },
4002 { name: "Calabria", abbreviation: "CAL" },
4003 { name: "Sicilia", abbreviation: "SIC" },
4004 { name: "Sardegna", abbreviation: "SAR" }
4005 ],
4006 mx: [
4007 { name: 'Aguascalientes', abbreviation: 'AGU' },
4008 { name: 'Baja California', abbreviation: 'BCN' },
4009 { name: 'Baja California Sur', abbreviation: 'BCS' },
4010 { name: 'Campeche', abbreviation: 'CAM' },
4011 { name: 'Chiapas', abbreviation: 'CHP' },
4012 { name: 'Chihuahua', abbreviation: 'CHH' },
4013 { name: 'Ciudad de México', abbreviation: 'DIF' },
4014 { name: 'Coahuila', abbreviation: 'COA' },
4015 { name: 'Colima', abbreviation: 'COL' },
4016 { name: 'Durango', abbreviation: 'DUR' },
4017 { name: 'Guanajuato', abbreviation: 'GUA' },
4018 { name: 'Guerrero', abbreviation: 'GRO' },
4019 { name: 'Hidalgo', abbreviation: 'HID' },
4020 { name: 'Jalisco', abbreviation: 'JAL' },
4021 { name: 'México', abbreviation: 'MEX' },
4022 { name: 'Michoacán', abbreviation: 'MIC' },
4023 { name: 'Morelos', abbreviation: 'MOR' },
4024 { name: 'Nayarit', abbreviation: 'NAY' },
4025 { name: 'Nuevo León', abbreviation: 'NLE' },
4026 { name: 'Oaxaca', abbreviation: 'OAX' },
4027 { name: 'Puebla', abbreviation: 'PUE' },
4028 { name: 'Querétaro', abbreviation: 'QUE' },
4029 { name: 'Quintana Roo', abbreviation: 'ROO' },
4030 { name: 'San Luis Potosí', abbreviation: 'SLP' },
4031 { name: 'Sinaloa', abbreviation: 'SIN' },
4032 { name: 'Sonora', abbreviation: 'SON' },
4033 { name: 'Tabasco', abbreviation: 'TAB' },
4034 { name: 'Tamaulipas', abbreviation: 'TAM' },
4035 { name: 'Tlaxcala', abbreviation: 'TLA' },
4036 { name: 'Veracruz', abbreviation: 'VER' },
4037 { name: 'Yucatán', abbreviation: 'YUC' },
4038 { name: 'Zacatecas', abbreviation: 'ZAC' }
4039 ]
4040 },
4041
4042 street_suffixes: {
4043 'us': [
4044 {name: 'Avenue', abbreviation: 'Ave'},
4045 {name: 'Boulevard', abbreviation: 'Blvd'},
4046 {name: 'Center', abbreviation: 'Ctr'},
4047 {name: 'Circle', abbreviation: 'Cir'},
4048 {name: 'Court', abbreviation: 'Ct'},
4049 {name: 'Drive', abbreviation: 'Dr'},
4050 {name: 'Extension', abbreviation: 'Ext'},
4051 {name: 'Glen', abbreviation: 'Gln'},
4052 {name: 'Grove', abbreviation: 'Grv'},
4053 {name: 'Heights', abbreviation: 'Hts'},
4054 {name: 'Highway', abbreviation: 'Hwy'},
4055 {name: 'Junction', abbreviation: 'Jct'},
4056 {name: 'Key', abbreviation: 'Key'},
4057 {name: 'Lane', abbreviation: 'Ln'},
4058 {name: 'Loop', abbreviation: 'Loop'},
4059 {name: 'Manor', abbreviation: 'Mnr'},
4060 {name: 'Mill', abbreviation: 'Mill'},
4061 {name: 'Park', abbreviation: 'Park'},
4062 {name: 'Parkway', abbreviation: 'Pkwy'},
4063 {name: 'Pass', abbreviation: 'Pass'},
4064 {name: 'Path', abbreviation: 'Path'},
4065 {name: 'Pike', abbreviation: 'Pike'},
4066 {name: 'Place', abbreviation: 'Pl'},
4067 {name: 'Plaza', abbreviation: 'Plz'},
4068 {name: 'Point', abbreviation: 'Pt'},
4069 {name: 'Ridge', abbreviation: 'Rdg'},
4070 {name: 'River', abbreviation: 'Riv'},
4071 {name: 'Road', abbreviation: 'Rd'},
4072 {name: 'Square', abbreviation: 'Sq'},
4073 {name: 'Street', abbreviation: 'St'},
4074 {name: 'Terrace', abbreviation: 'Ter'},
4075 {name: 'Trail', abbreviation: 'Trl'},
4076 {name: 'Turnpike', abbreviation: 'Tpke'},
4077 {name: 'View', abbreviation: 'Vw'},
4078 {name: 'Way', abbreviation: 'Way'}
4079 ],
4080 'it': [
4081 { name: 'Accesso', abbreviation: 'Acc.' },
4082 { name: 'Alzaia', abbreviation: 'Alz.' },
4083 { name: 'Arco', abbreviation: 'Arco' },
4084 { name: 'Archivolto', abbreviation: 'Acv.' },
4085 { name: 'Arena', abbreviation: 'Arena' },
4086 { name: 'Argine', abbreviation: 'Argine' },
4087 { name: 'Bacino', abbreviation: 'Bacino' },
4088 { name: 'Banchi', abbreviation: 'Banchi' },
4089 { name: 'Banchina', abbreviation: 'Ban.' },
4090 { name: 'Bastioni', abbreviation: 'Bas.' },
4091 { name: 'Belvedere', abbreviation: 'Belv.' },
4092 { name: 'Borgata', abbreviation: 'B.ta' },
4093 { name: 'Borgo', abbreviation: 'B.go' },
4094 { name: 'Calata', abbreviation: 'Cal.' },
4095 { name: 'Calle', abbreviation: 'Calle' },
4096 { name: 'Campiello', abbreviation: 'Cam.' },
4097 { name: 'Campo', abbreviation: 'Cam.' },
4098 { name: 'Canale', abbreviation: 'Can.' },
4099 { name: 'Carraia', abbreviation: 'Carr.' },
4100 { name: 'Cascina', abbreviation: 'Cascina' },
4101 { name: 'Case sparse', abbreviation: 'c.s.' },
4102 { name: 'Cavalcavia', abbreviation: 'Cv.' },
4103 { name: 'Circonvallazione', abbreviation: 'Cv.' },
4104 { name: 'Complanare', abbreviation: 'C.re' },
4105 { name: 'Contrada', abbreviation: 'C.da' },
4106 { name: 'Corso', abbreviation: 'C.so' },
4107 { name: 'Corte', abbreviation: 'C.te' },
4108 { name: 'Cortile', abbreviation: 'C.le' },
4109 { name: 'Diramazione', abbreviation: 'Dir.' },
4110 { name: 'Fondaco', abbreviation: 'F.co' },
4111 { name: 'Fondamenta', abbreviation: 'F.ta' },
4112 { name: 'Fondo', abbreviation: 'F.do' },
4113 { name: 'Frazione', abbreviation: 'Fr.' },
4114 { name: 'Isola', abbreviation: 'Is.' },
4115 { name: 'Largo', abbreviation: 'L.go' },
4116 { name: 'Litoranea', abbreviation: 'Lit.' },
4117 { name: 'Lungolago', abbreviation: 'L.go lago' },
4118 { name: 'Lungo Po', abbreviation: 'l.go Po' },
4119 { name: 'Molo', abbreviation: 'Molo' },
4120 { name: 'Mura', abbreviation: 'Mura' },
4121 { name: 'Passaggio privato', abbreviation: 'pass. priv.' },
4122 { name: 'Passeggiata', abbreviation: 'Pass.' },
4123 { name: 'Piazza', abbreviation: 'P.zza' },
4124 { name: 'Piazzale', abbreviation: 'P.le' },
4125 { name: 'Ponte', abbreviation: 'P.te' },
4126 { name: 'Portico', abbreviation: 'P.co' },
4127 { name: 'Rampa', abbreviation: 'Rampa' },
4128 { name: 'Regione', abbreviation: 'Reg.' },
4129 { name: 'Rione', abbreviation: 'R.ne' },
4130 { name: 'Rio', abbreviation: 'Rio' },
4131 { name: 'Ripa', abbreviation: 'Ripa' },
4132 { name: 'Riva', abbreviation: 'Riva' },
4133 { name: 'Rondò', abbreviation: 'Rondò' },
4134 { name: 'Rotonda', abbreviation: 'Rot.' },
4135 { name: 'Sagrato', abbreviation: 'Sagr.' },
4136 { name: 'Salita', abbreviation: 'Sal.' },
4137 { name: 'Scalinata', abbreviation: 'Scal.' },
4138 { name: 'Scalone', abbreviation: 'Scal.' },
4139 { name: 'Slargo', abbreviation: 'Sl.' },
4140 { name: 'Sottoportico', abbreviation: 'Sott.' },
4141 { name: 'Strada', abbreviation: 'Str.' },
4142 { name: 'Stradale', abbreviation: 'Str.le' },
4143 { name: 'Strettoia', abbreviation: 'Strett.' },
4144 { name: 'Traversa', abbreviation: 'Trav.' },
4145 { name: 'Via', abbreviation: 'V.' },
4146 { name: 'Viale', abbreviation: 'V.le' },
4147 { name: 'Vicinale', abbreviation: 'Vic.le' },
4148 { name: 'Vicolo', abbreviation: 'Vic.' }
4149 ],
4150 'uk' : [
4151 {name: 'Avenue', abbreviation: 'Ave'},
4152 {name: 'Close', abbreviation: 'Cl'},
4153 {name: 'Court', abbreviation: 'Ct'},
4154 {name: 'Crescent', abbreviation: 'Cr'},
4155 {name: 'Drive', abbreviation: 'Dr'},
4156 {name: 'Garden', abbreviation: 'Gdn'},
4157 {name: 'Gardens', abbreviation: 'Gdns'},
4158 {name: 'Green', abbreviation: 'Gn'},
4159 {name: 'Grove', abbreviation: 'Gr'},
4160 {name: 'Lane', abbreviation: 'Ln'},
4161 {name: 'Mount', abbreviation: 'Mt'},
4162 {name: 'Place', abbreviation: 'Pl'},
4163 {name: 'Park', abbreviation: 'Pk'},
4164 {name: 'Ridge', abbreviation: 'Rdg'},
4165 {name: 'Road', abbreviation: 'Rd'},
4166 {name: 'Square', abbreviation: 'Sq'},
4167 {name: 'Street', abbreviation: 'St'},
4168 {name: 'Terrace', abbreviation: 'Ter'},
4169 {name: 'Valley', abbreviation: 'Val'}
4170 ]
4171 },
4172
4173 months: [
4174 {name: 'January', short_name: 'Jan', numeric: '01', days: 31},
4175 // Not messing with leap years...
4176 {name: 'February', short_name: 'Feb', numeric: '02', days: 28},
4177 {name: 'March', short_name: 'Mar', numeric: '03', days: 31},
4178 {name: 'April', short_name: 'Apr', numeric: '04', days: 30},
4179 {name: 'May', short_name: 'May', numeric: '05', days: 31},
4180 {name: 'June', short_name: 'Jun', numeric: '06', days: 30},
4181 {name: 'July', short_name: 'Jul', numeric: '07', days: 31},
4182 {name: 'August', short_name: 'Aug', numeric: '08', days: 31},
4183 {name: 'September', short_name: 'Sep', numeric: '09', days: 30},
4184 {name: 'October', short_name: 'Oct', numeric: '10', days: 31},
4185 {name: 'November', short_name: 'Nov', numeric: '11', days: 30},
4186 {name: 'December', short_name: 'Dec', numeric: '12', days: 31}
4187 ],
4188
4189 // http://en.wikipedia.org/wiki/Bank_card_number#Issuer_identification_number_.28IIN.29
4190 cc_types: [
4191 {name: "American Express", short_name: 'amex', prefix: '34', length: 15},
4192 {name: "Bankcard", short_name: 'bankcard', prefix: '5610', length: 16},
4193 {name: "China UnionPay", short_name: 'chinaunion', prefix: '62', length: 16},
4194 {name: "Diners Club Carte Blanche", short_name: 'dccarte', prefix: '300', length: 14},
4195 {name: "Diners Club enRoute", short_name: 'dcenroute', prefix: '2014', length: 15},
4196 {name: "Diners Club International", short_name: 'dcintl', prefix: '36', length: 14},
4197 {name: "Diners Club United States & Canada", short_name: 'dcusc', prefix: '54', length: 16},
4198 {name: "Discover Card", short_name: 'discover', prefix: '6011', length: 16},
4199 {name: "InstaPayment", short_name: 'instapay', prefix: '637', length: 16},
4200 {name: "JCB", short_name: 'jcb', prefix: '3528', length: 16},
4201 {name: "Laser", short_name: 'laser', prefix: '6304', length: 16},
4202 {name: "Maestro", short_name: 'maestro', prefix: '5018', length: 16},
4203 {name: "Mastercard", short_name: 'mc', prefix: '51', length: 16},
4204 {name: "Solo", short_name: 'solo', prefix: '6334', length: 16},
4205 {name: "Switch", short_name: 'switch', prefix: '4903', length: 16},
4206 {name: "Visa", short_name: 'visa', prefix: '4', length: 16},
4207 {name: "Visa Electron", short_name: 'electron', prefix: '4026', length: 16}
4208 ],
4209
4210 //return all world currency by ISO 4217
4211 currency_types: [
4212 {'code' : 'AED', 'name' : 'United Arab Emirates Dirham'},
4213 {'code' : 'AFN', 'name' : 'Afghanistan Afghani'},
4214 {'code' : 'ALL', 'name' : 'Albania Lek'},
4215 {'code' : 'AMD', 'name' : 'Armenia Dram'},
4216 {'code' : 'ANG', 'name' : 'Netherlands Antilles Guilder'},
4217 {'code' : 'AOA', 'name' : 'Angola Kwanza'},
4218 {'code' : 'ARS', 'name' : 'Argentina Peso'},
4219 {'code' : 'AUD', 'name' : 'Australia Dollar'},
4220 {'code' : 'AWG', 'name' : 'Aruba Guilder'},
4221 {'code' : 'AZN', 'name' : 'Azerbaijan New Manat'},
4222 {'code' : 'BAM', 'name' : 'Bosnia and Herzegovina Convertible Marka'},
4223 {'code' : 'BBD', 'name' : 'Barbados Dollar'},
4224 {'code' : 'BDT', 'name' : 'Bangladesh Taka'},
4225 {'code' : 'BGN', 'name' : 'Bulgaria Lev'},
4226 {'code' : 'BHD', 'name' : 'Bahrain Dinar'},
4227 {'code' : 'BIF', 'name' : 'Burundi Franc'},
4228 {'code' : 'BMD', 'name' : 'Bermuda Dollar'},
4229 {'code' : 'BND', 'name' : 'Brunei Darussalam Dollar'},
4230 {'code' : 'BOB', 'name' : 'Bolivia Boliviano'},
4231 {'code' : 'BRL', 'name' : 'Brazil Real'},
4232 {'code' : 'BSD', 'name' : 'Bahamas Dollar'},
4233 {'code' : 'BTN', 'name' : 'Bhutan Ngultrum'},
4234 {'code' : 'BWP', 'name' : 'Botswana Pula'},
4235 {'code' : 'BYR', 'name' : 'Belarus Ruble'},
4236 {'code' : 'BZD', 'name' : 'Belize Dollar'},
4237 {'code' : 'CAD', 'name' : 'Canada Dollar'},
4238 {'code' : 'CDF', 'name' : 'Congo/Kinshasa Franc'},
4239 {'code' : 'CHF', 'name' : 'Switzerland Franc'},
4240 {'code' : 'CLP', 'name' : 'Chile Peso'},
4241 {'code' : 'CNY', 'name' : 'China Yuan Renminbi'},
4242 {'code' : 'COP', 'name' : 'Colombia Peso'},
4243 {'code' : 'CRC', 'name' : 'Costa Rica Colon'},
4244 {'code' : 'CUC', 'name' : 'Cuba Convertible Peso'},
4245 {'code' : 'CUP', 'name' : 'Cuba Peso'},
4246 {'code' : 'CVE', 'name' : 'Cape Verde Escudo'},
4247 {'code' : 'CZK', 'name' : 'Czech Republic Koruna'},
4248 {'code' : 'DJF', 'name' : 'Djibouti Franc'},
4249 {'code' : 'DKK', 'name' : 'Denmark Krone'},
4250 {'code' : 'DOP', 'name' : 'Dominican Republic Peso'},
4251 {'code' : 'DZD', 'name' : 'Algeria Dinar'},
4252 {'code' : 'EGP', 'name' : 'Egypt Pound'},
4253 {'code' : 'ERN', 'name' : 'Eritrea Nakfa'},
4254 {'code' : 'ETB', 'name' : 'Ethiopia Birr'},
4255 {'code' : 'EUR', 'name' : 'Euro Member Countries'},
4256 {'code' : 'FJD', 'name' : 'Fiji Dollar'},
4257 {'code' : 'FKP', 'name' : 'Falkland Islands (Malvinas) Pound'},
4258 {'code' : 'GBP', 'name' : 'United Kingdom Pound'},
4259 {'code' : 'GEL', 'name' : 'Georgia Lari'},
4260 {'code' : 'GGP', 'name' : 'Guernsey Pound'},
4261 {'code' : 'GHS', 'name' : 'Ghana Cedi'},
4262 {'code' : 'GIP', 'name' : 'Gibraltar Pound'},
4263 {'code' : 'GMD', 'name' : 'Gambia Dalasi'},
4264 {'code' : 'GNF', 'name' : 'Guinea Franc'},
4265 {'code' : 'GTQ', 'name' : 'Guatemala Quetzal'},
4266 {'code' : 'GYD', 'name' : 'Guyana Dollar'},
4267 {'code' : 'HKD', 'name' : 'Hong Kong Dollar'},
4268 {'code' : 'HNL', 'name' : 'Honduras Lempira'},
4269 {'code' : 'HRK', 'name' : 'Croatia Kuna'},
4270 {'code' : 'HTG', 'name' : 'Haiti Gourde'},
4271 {'code' : 'HUF', 'name' : 'Hungary Forint'},
4272 {'code' : 'IDR', 'name' : 'Indonesia Rupiah'},
4273 {'code' : 'ILS', 'name' : 'Israel Shekel'},
4274 {'code' : 'IMP', 'name' : 'Isle of Man Pound'},
4275 {'code' : 'INR', 'name' : 'India Rupee'},
4276 {'code' : 'IQD', 'name' : 'Iraq Dinar'},
4277 {'code' : 'IRR', 'name' : 'Iran Rial'},
4278 {'code' : 'ISK', 'name' : 'Iceland Krona'},
4279 {'code' : 'JEP', 'name' : 'Jersey Pound'},
4280 {'code' : 'JMD', 'name' : 'Jamaica Dollar'},
4281 {'code' : 'JOD', 'name' : 'Jordan Dinar'},
4282 {'code' : 'JPY', 'name' : 'Japan Yen'},
4283 {'code' : 'KES', 'name' : 'Kenya Shilling'},
4284 {'code' : 'KGS', 'name' : 'Kyrgyzstan Som'},
4285 {'code' : 'KHR', 'name' : 'Cambodia Riel'},
4286 {'code' : 'KMF', 'name' : 'Comoros Franc'},
4287 {'code' : 'KPW', 'name' : 'Korea (North) Won'},
4288 {'code' : 'KRW', 'name' : 'Korea (South) Won'},
4289 {'code' : 'KWD', 'name' : 'Kuwait Dinar'},
4290 {'code' : 'KYD', 'name' : 'Cayman Islands Dollar'},
4291 {'code' : 'KZT', 'name' : 'Kazakhstan Tenge'},
4292 {'code' : 'LAK', 'name' : 'Laos Kip'},
4293 {'code' : 'LBP', 'name' : 'Lebanon Pound'},
4294 {'code' : 'LKR', 'name' : 'Sri Lanka Rupee'},
4295 {'code' : 'LRD', 'name' : 'Liberia Dollar'},
4296 {'code' : 'LSL', 'name' : 'Lesotho Loti'},
4297 {'code' : 'LTL', 'name' : 'Lithuania Litas'},
4298 {'code' : 'LYD', 'name' : 'Libya Dinar'},
4299 {'code' : 'MAD', 'name' : 'Morocco Dirham'},
4300 {'code' : 'MDL', 'name' : 'Moldova Leu'},
4301 {'code' : 'MGA', 'name' : 'Madagascar Ariary'},
4302 {'code' : 'MKD', 'name' : 'Macedonia Denar'},
4303 {'code' : 'MMK', 'name' : 'Myanmar (Burma) Kyat'},
4304 {'code' : 'MNT', 'name' : 'Mongolia Tughrik'},
4305 {'code' : 'MOP', 'name' : 'Macau Pataca'},
4306 {'code' : 'MRO', 'name' : 'Mauritania Ouguiya'},
4307 {'code' : 'MUR', 'name' : 'Mauritius Rupee'},
4308 {'code' : 'MVR', 'name' : 'Maldives (Maldive Islands) Rufiyaa'},
4309 {'code' : 'MWK', 'name' : 'Malawi Kwacha'},
4310 {'code' : 'MXN', 'name' : 'Mexico Peso'},
4311 {'code' : 'MYR', 'name' : 'Malaysia Ringgit'},
4312 {'code' : 'MZN', 'name' : 'Mozambique Metical'},
4313 {'code' : 'NAD', 'name' : 'Namibia Dollar'},
4314 {'code' : 'NGN', 'name' : 'Nigeria Naira'},
4315 {'code' : 'NIO', 'name' : 'Nicaragua Cordoba'},
4316 {'code' : 'NOK', 'name' : 'Norway Krone'},
4317 {'code' : 'NPR', 'name' : 'Nepal Rupee'},
4318 {'code' : 'NZD', 'name' : 'New Zealand Dollar'},
4319 {'code' : 'OMR', 'name' : 'Oman Rial'},
4320 {'code' : 'PAB', 'name' : 'Panama Balboa'},
4321 {'code' : 'PEN', 'name' : 'Peru Nuevo Sol'},
4322 {'code' : 'PGK', 'name' : 'Papua New Guinea Kina'},
4323 {'code' : 'PHP', 'name' : 'Philippines Peso'},
4324 {'code' : 'PKR', 'name' : 'Pakistan Rupee'},
4325 {'code' : 'PLN', 'name' : 'Poland Zloty'},
4326 {'code' : 'PYG', 'name' : 'Paraguay Guarani'},
4327 {'code' : 'QAR', 'name' : 'Qatar Riyal'},
4328 {'code' : 'RON', 'name' : 'Romania New Leu'},
4329 {'code' : 'RSD', 'name' : 'Serbia Dinar'},
4330 {'code' : 'RUB', 'name' : 'Russia Ruble'},
4331 {'code' : 'RWF', 'name' : 'Rwanda Franc'},
4332 {'code' : 'SAR', 'name' : 'Saudi Arabia Riyal'},
4333 {'code' : 'SBD', 'name' : 'Solomon Islands Dollar'},
4334 {'code' : 'SCR', 'name' : 'Seychelles Rupee'},
4335 {'code' : 'SDG', 'name' : 'Sudan Pound'},
4336 {'code' : 'SEK', 'name' : 'Sweden Krona'},
4337 {'code' : 'SGD', 'name' : 'Singapore Dollar'},
4338 {'code' : 'SHP', 'name' : 'Saint Helena Pound'},
4339 {'code' : 'SLL', 'name' : 'Sierra Leone Leone'},
4340 {'code' : 'SOS', 'name' : 'Somalia Shilling'},
4341 {'code' : 'SPL', 'name' : 'Seborga Luigino'},
4342 {'code' : 'SRD', 'name' : 'Suriname Dollar'},
4343 {'code' : 'STD', 'name' : 'São Tomé and Príncipe Dobra'},
4344 {'code' : 'SVC', 'name' : 'El Salvador Colon'},
4345 {'code' : 'SYP', 'name' : 'Syria Pound'},
4346 {'code' : 'SZL', 'name' : 'Swaziland Lilangeni'},
4347 {'code' : 'THB', 'name' : 'Thailand Baht'},
4348 {'code' : 'TJS', 'name' : 'Tajikistan Somoni'},
4349 {'code' : 'TMT', 'name' : 'Turkmenistan Manat'},
4350 {'code' : 'TND', 'name' : 'Tunisia Dinar'},
4351 {'code' : 'TOP', 'name' : 'Tonga Pa\'anga'},
4352 {'code' : 'TRY', 'name' : 'Turkey Lira'},
4353 {'code' : 'TTD', 'name' : 'Trinidad and Tobago Dollar'},
4354 {'code' : 'TVD', 'name' : 'Tuvalu Dollar'},
4355 {'code' : 'TWD', 'name' : 'Taiwan New Dollar'},
4356 {'code' : 'TZS', 'name' : 'Tanzania Shilling'},
4357 {'code' : 'UAH', 'name' : 'Ukraine Hryvnia'},
4358 {'code' : 'UGX', 'name' : 'Uganda Shilling'},
4359 {'code' : 'USD', 'name' : 'United States Dollar'},
4360 {'code' : 'UYU', 'name' : 'Uruguay Peso'},
4361 {'code' : 'UZS', 'name' : 'Uzbekistan Som'},
4362 {'code' : 'VEF', 'name' : 'Venezuela Bolivar'},
4363 {'code' : 'VND', 'name' : 'Viet Nam Dong'},
4364 {'code' : 'VUV', 'name' : 'Vanuatu Vatu'},
4365 {'code' : 'WST', 'name' : 'Samoa Tala'},
4366 {'code' : 'XAF', 'name' : 'Communauté Financière Africaine (BEAC) CFA Franc BEAC'},
4367 {'code' : 'XCD', 'name' : 'East Caribbean Dollar'},
4368 {'code' : 'XDR', 'name' : 'International Monetary Fund (IMF) Special Drawing Rights'},
4369 {'code' : 'XOF', 'name' : 'Communauté Financière Africaine (BCEAO) Franc'},
4370 {'code' : 'XPF', 'name' : 'Comptoirs Français du Pacifique (CFP) Franc'},
4371 {'code' : 'YER', 'name' : 'Yemen Rial'},
4372 {'code' : 'ZAR', 'name' : 'South Africa Rand'},
4373 {'code' : 'ZMW', 'name' : 'Zambia Kwacha'},
4374 {'code' : 'ZWD', 'name' : 'Zimbabwe Dollar'}
4375 ],
4376
4377 // return the names of all valide colors
4378 colorNames : [ "AliceBlue", "Black", "Navy", "DarkBlue", "MediumBlue", "Blue", "DarkGreen", "Green", "Teal", "DarkCyan", "DeepSkyBlue", "DarkTurquoise", "MediumSpringGreen", "Lime", "SpringGreen",
4379 "Aqua", "Cyan", "MidnightBlue", "DodgerBlue", "LightSeaGreen", "ForestGreen", "SeaGreen", "DarkSlateGray", "LimeGreen", "MediumSeaGreen", "Turquoise", "RoyalBlue", "SteelBlue", "DarkSlateBlue", "MediumTurquoise",
4380 "Indigo", "DarkOliveGreen", "CadetBlue", "CornflowerBlue", "RebeccaPurple", "MediumAquaMarine", "DimGray", "SlateBlue", "OliveDrab", "SlateGray", "LightSlateGray", "MediumSlateBlue", "LawnGreen", "Chartreuse",
4381 "Aquamarine", "Maroon", "Purple", "Olive", "Gray", "SkyBlue", "LightSkyBlue", "BlueViolet", "DarkRed", "DarkMagenta", "SaddleBrown", "Ivory", "White",
4382 "DarkSeaGreen", "LightGreen", "MediumPurple", "DarkViolet", "PaleGreen", "DarkOrchid", "YellowGreen", "Sienna", "Brown", "DarkGray", "LightBlue", "GreenYellow", "PaleTurquoise", "LightSteelBlue", "PowderBlue",
4383 "FireBrick", "DarkGoldenRod", "MediumOrchid", "RosyBrown", "DarkKhaki", "Silver", "MediumVioletRed", "IndianRed", "Peru", "Chocolate", "Tan", "LightGray", "Thistle", "Orchid", "GoldenRod", "PaleVioletRed",
4384 "Crimson", "Gainsboro", "Plum", "BurlyWood", "LightCyan", "Lavender", "DarkSalmon", "Violet", "PaleGoldenRod", "LightCoral", "Khaki", "AliceBlue", "HoneyDew", "Azure", "SandyBrown", "Wheat", "Beige", "WhiteSmoke",
4385 "MintCream", "GhostWhite", "Salmon", "AntiqueWhite", "Linen", "LightGoldenRodYellow", "OldLace", "Red", "Fuchsia", "Magenta", "DeepPink", "OrangeRed", "Tomato", "HotPink", "Coral", "DarkOrange", "LightSalmon", "Orange",
4386 "LightPink", "Pink", "Gold", "PeachPuff", "NavajoWhite", "Moccasin", "Bisque", "MistyRose", "BlanchedAlmond", "PapayaWhip", "LavenderBlush", "SeaShell", "Cornsilk", "LemonChiffon", "FloralWhite", "Snow", "Yellow", "LightYellow"
4387 ],
4388
4389 // Data taken from https://www.sec.gov/rules/other/4-460list.htm
4390 company: [ "3Com Corp",
4391 "3M Company",
4392 "A.G. Edwards Inc.",
4393 "Abbott Laboratories",
4394 "Abercrombie & Fitch Co.",
4395 "ABM Industries Incorporated",
4396 "Ace Hardware Corporation",
4397 "ACT Manufacturing Inc.",
4398 "Acterna Corp.",
4399 "Adams Resources & Energy, Inc.",
4400 "ADC Telecommunications, Inc.",
4401 "Adelphia Communications Corporation",
4402 "Administaff, Inc.",
4403 "Adobe Systems Incorporated",
4404 "Adolph Coors Company",
4405 "Advance Auto Parts, Inc.",
4406 "Advanced Micro Devices, Inc.",
4407 "AdvancePCS, Inc.",
4408 "Advantica Restaurant Group, Inc.",
4409 "The AES Corporation",
4410 "Aetna Inc.",
4411 "Affiliated Computer Services, Inc.",
4412 "AFLAC Incorporated",
4413 "AGCO Corporation",
4414 "Agilent Technologies, Inc.",
4415 "Agway Inc.",
4416 "Apartment Investment and Management Company",
4417 "Air Products and Chemicals, Inc.",
4418 "Airborne, Inc.",
4419 "Airgas, Inc.",
4420 "AK Steel Holding Corporation",
4421 "Alaska Air Group, Inc.",
4422 "Alberto-Culver Company",
4423 "Albertson's, Inc.",
4424 "Alcoa Inc.",
4425 "Alleghany Corporation",
4426 "Allegheny Energy, Inc.",
4427 "Allegheny Technologies Incorporated",
4428 "Allergan, Inc.",
4429 "ALLETE, Inc.",
4430 "Alliant Energy Corporation",
4431 "Allied Waste Industries, Inc.",
4432 "Allmerica Financial Corporation",
4433 "The Allstate Corporation",
4434 "ALLTEL Corporation",
4435 "The Alpine Group, Inc.",
4436 "Amazon.com, Inc.",
4437 "AMC Entertainment Inc.",
4438 "American Power Conversion Corporation",
4439 "Amerada Hess Corporation",
4440 "AMERCO",
4441 "Ameren Corporation",
4442 "America West Holdings Corporation",
4443 "American Axle & Manufacturing Holdings, Inc.",
4444 "American Eagle Outfitters, Inc.",
4445 "American Electric Power Company, Inc.",
4446 "American Express Company",
4447 "American Financial Group, Inc.",
4448 "American Greetings Corporation",
4449 "American International Group, Inc.",
4450 "American Standard Companies Inc.",
4451 "American Water Works Company, Inc.",
4452 "AmerisourceBergen Corporation",
4453 "Ames Department Stores, Inc.",
4454 "Amgen Inc.",
4455 "Amkor Technology, Inc.",
4456 "AMR Corporation",
4457 "AmSouth Bancorp.",
4458 "Amtran, Inc.",
4459 "Anadarko Petroleum Corporation",
4460 "Analog Devices, Inc.",
4461 "Anheuser-Busch Companies, Inc.",
4462 "Anixter International Inc.",
4463 "AnnTaylor Inc.",
4464 "Anthem, Inc.",
4465 "AOL Time Warner Inc.",
4466 "Aon Corporation",
4467 "Apache Corporation",
4468 "Apple Computer, Inc.",
4469 "Applera Corporation",
4470 "Applied Industrial Technologies, Inc.",
4471 "Applied Materials, Inc.",
4472 "Aquila, Inc.",
4473 "ARAMARK Corporation",
4474 "Arch Coal, Inc.",
4475 "Archer Daniels Midland Company",
4476 "Arkansas Best Corporation",
4477 "Armstrong Holdings, Inc.",
4478 "Arrow Electronics, Inc.",
4479 "ArvinMeritor, Inc.",
4480 "Ashland Inc.",
4481 "Astoria Financial Corporation",
4482 "AT&T Corp.",
4483 "Atmel Corporation",
4484 "Atmos Energy Corporation",
4485 "Audiovox Corporation",
4486 "Autoliv, Inc.",
4487 "Automatic Data Processing, Inc.",
4488 "AutoNation, Inc.",
4489 "AutoZone, Inc.",
4490 "Avaya Inc.",
4491 "Avery Dennison Corporation",
4492 "Avista Corporation",
4493 "Avnet, Inc.",
4494 "Avon Products, Inc.",
4495 "Baker Hughes Incorporated",
4496 "Ball Corporation",
4497 "Bank of America Corporation",
4498 "The Bank of New York Company, Inc.",
4499 "Bank One Corporation",
4500 "Banknorth Group, Inc.",
4501 "Banta Corporation",
4502 "Barnes & Noble, Inc.",
4503 "Bausch & Lomb Incorporated",
4504 "Baxter International Inc.",
4505 "BB&T Corporation",
4506 "The Bear Stearns Companies Inc.",
4507 "Beazer Homes USA, Inc.",
4508 "Beckman Coulter, Inc.",
4509 "Becton, Dickinson and Company",
4510 "Bed Bath & Beyond Inc.",
4511 "Belk, Inc.",
4512 "Bell Microproducts Inc.",
4513 "BellSouth Corporation",
4514 "Belo Corp.",
4515 "Bemis Company, Inc.",
4516 "Benchmark Electronics, Inc.",
4517 "Berkshire Hathaway Inc.",
4518 "Best Buy Co., Inc.",
4519 "Bethlehem Steel Corporation",
4520 "Beverly Enterprises, Inc.",
4521 "Big Lots, Inc.",
4522 "BJ Services Company",
4523 "BJ's Wholesale Club, Inc.",
4524 "The Black & Decker Corporation",
4525 "Black Hills Corporation",
4526 "BMC Software, Inc.",
4527 "The Boeing Company",
4528 "Boise Cascade Corporation",
4529 "Borders Group, Inc.",
4530 "BorgWarner Inc.",
4531 "Boston Scientific Corporation",
4532 "Bowater Incorporated",
4533 "Briggs & Stratton Corporation",
4534 "Brightpoint, Inc.",
4535 "Brinker International, Inc.",
4536 "Bristol-Myers Squibb Company",
4537 "Broadwing, Inc.",
4538 "Brown Shoe Company, Inc.",
4539 "Brown-Forman Corporation",
4540 "Brunswick Corporation",
4541 "Budget Group, Inc.",
4542 "Burlington Coat Factory Warehouse Corporation",
4543 "Burlington Industries, Inc.",
4544 "Burlington Northern Santa Fe Corporation",
4545 "Burlington Resources Inc.",
4546 "C. H. Robinson Worldwide Inc.",
4547 "Cablevision Systems Corp",
4548 "Cabot Corp",
4549 "Cadence Design Systems, Inc.",
4550 "Calpine Corp.",
4551 "Campbell Soup Co.",
4552 "Capital One Financial Corp.",
4553 "Cardinal Health Inc.",
4554 "Caremark Rx Inc.",
4555 "Carlisle Cos. Inc.",
4556 "Carpenter Technology Corp.",
4557 "Casey's General Stores Inc.",
4558 "Caterpillar Inc.",
4559 "CBRL Group Inc.",
4560 "CDI Corp.",
4561 "CDW Computer Centers Inc.",
4562 "CellStar Corp.",
4563 "Cendant Corp",
4564 "Cenex Harvest States Cooperatives",
4565 "Centex Corp.",
4566 "CenturyTel Inc.",
4567 "Ceridian Corp.",
4568 "CH2M Hill Cos. Ltd.",
4569 "Champion Enterprises Inc.",
4570 "Charles Schwab Corp.",
4571 "Charming Shoppes Inc.",
4572 "Charter Communications Inc.",
4573 "Charter One Financial Inc.",
4574 "ChevronTexaco Corp.",
4575 "Chiquita Brands International Inc.",
4576 "Chubb Corp",
4577 "Ciena Corp.",
4578 "Cigna Corp",
4579 "Cincinnati Financial Corp.",
4580 "Cinergy Corp.",
4581 "Cintas Corp.",
4582 "Circuit City Stores Inc.",
4583 "Cisco Systems Inc.",
4584 "Citigroup, Inc",
4585 "Citizens Communications Co.",
4586 "CKE Restaurants Inc.",
4587 "Clear Channel Communications Inc.",
4588 "The Clorox Co.",
4589 "CMGI Inc.",
4590 "CMS Energy Corp.",
4591 "CNF Inc.",
4592 "Coca-Cola Co.",
4593 "Coca-Cola Enterprises Inc.",
4594 "Colgate-Palmolive Co.",
4595 "Collins & Aikman Corp.",
4596 "Comcast Corp.",
4597 "Comdisco Inc.",
4598 "Comerica Inc.",
4599 "Comfort Systems USA Inc.",
4600 "Commercial Metals Co.",
4601 "Community Health Systems Inc.",
4602 "Compass Bancshares Inc",
4603 "Computer Associates International Inc.",
4604 "Computer Sciences Corp.",
4605 "Compuware Corp.",
4606 "Comverse Technology Inc.",
4607 "ConAgra Foods Inc.",
4608 "Concord EFS Inc.",
4609 "Conectiv, Inc",
4610 "Conoco Inc",
4611 "Conseco Inc.",
4612 "Consolidated Freightways Corp.",
4613 "Consolidated Edison Inc.",
4614 "Constellation Brands Inc.",
4615 "Constellation Emergy Group Inc.",
4616 "Continental Airlines Inc.",
4617 "Convergys Corp.",
4618 "Cooper Cameron Corp.",
4619 "Cooper Industries Ltd.",
4620 "Cooper Tire & Rubber Co.",
4621 "Corn Products International Inc.",
4622 "Corning Inc.",
4623 "Costco Wholesale Corp.",
4624 "Countrywide Credit Industries Inc.",
4625 "Coventry Health Care Inc.",
4626 "Cox Communications Inc.",
4627 "Crane Co.",
4628 "Crompton Corp.",
4629 "Crown Cork & Seal Co. Inc.",
4630 "CSK Auto Corp.",
4631 "CSX Corp.",
4632 "Cummins Inc.",
4633 "CVS Corp.",
4634 "Cytec Industries Inc.",
4635 "D&K Healthcare Resources, Inc.",
4636 "D.R. Horton Inc.",
4637 "Dana Corporation",
4638 "Danaher Corporation",
4639 "Darden Restaurants Inc.",
4640 "DaVita Inc.",
4641 "Dean Foods Company",
4642 "Deere & Company",
4643 "Del Monte Foods Co",
4644 "Dell Computer Corporation",
4645 "Delphi Corp.",
4646 "Delta Air Lines Inc.",
4647 "Deluxe Corporation",
4648 "Devon Energy Corporation",
4649 "Di Giorgio Corporation",
4650 "Dial Corporation",
4651 "Diebold Incorporated",
4652 "Dillard's Inc.",
4653 "DIMON Incorporated",
4654 "Dole Food Company, Inc.",
4655 "Dollar General Corporation",
4656 "Dollar Tree Stores, Inc.",
4657 "Dominion Resources, Inc.",
4658 "Domino's Pizza LLC",
4659 "Dover Corporation, Inc.",
4660 "Dow Chemical Company",
4661 "Dow Jones & Company, Inc.",
4662 "DPL Inc.",
4663 "DQE Inc.",
4664 "Dreyer's Grand Ice Cream, Inc.",
4665 "DST Systems, Inc.",
4666 "DTE Energy Co.",
4667 "E.I. Du Pont de Nemours and Company",
4668 "Duke Energy Corp",
4669 "Dun & Bradstreet Inc.",
4670 "DURA Automotive Systems Inc.",
4671 "DynCorp",
4672 "Dynegy Inc.",
4673 "E*Trade Group, Inc.",
4674 "E.W. Scripps Company",
4675 "Earthlink, Inc.",
4676 "Eastman Chemical Company",
4677 "Eastman Kodak Company",
4678 "Eaton Corporation",
4679 "Echostar Communications Corporation",
4680 "Ecolab Inc.",
4681 "Edison International",
4682 "EGL Inc.",
4683 "El Paso Corporation",
4684 "Electronic Arts Inc.",
4685 "Electronic Data Systems Corp.",
4686 "Eli Lilly and Company",
4687 "EMC Corporation",
4688 "Emcor Group Inc.",
4689 "Emerson Electric Co.",
4690 "Encompass Services Corporation",
4691 "Energizer Holdings Inc.",
4692 "Energy East Corporation",
4693 "Engelhard Corporation",
4694 "Enron Corp.",
4695 "Entergy Corporation",
4696 "Enterprise Products Partners L.P.",
4697 "EOG Resources, Inc.",
4698 "Equifax Inc.",
4699 "Equitable Resources Inc.",
4700 "Equity Office Properties Trust",
4701 "Equity Residential Properties Trust",
4702 "Estee Lauder Companies Inc.",
4703 "Exelon Corporation",
4704 "Exide Technologies",
4705 "Expeditors International of Washington Inc.",
4706 "Express Scripts Inc.",
4707 "ExxonMobil Corporation",
4708 "Fairchild Semiconductor International Inc.",
4709 "Family Dollar Stores Inc.",
4710 "Farmland Industries Inc.",
4711 "Federal Mogul Corp.",
4712 "Federated Department Stores Inc.",
4713 "Federal Express Corp.",
4714 "Felcor Lodging Trust Inc.",
4715 "Ferro Corp.",
4716 "Fidelity National Financial Inc.",
4717 "Fifth Third Bancorp",
4718 "First American Financial Corp.",
4719 "First Data Corp.",
4720 "First National of Nebraska Inc.",
4721 "First Tennessee National Corp.",
4722 "FirstEnergy Corp.",
4723 "Fiserv Inc.",
4724 "Fisher Scientific International Inc.",
4725 "FleetBoston Financial Co.",
4726 "Fleetwood Enterprises Inc.",
4727 "Fleming Companies Inc.",
4728 "Flowers Foods Inc.",
4729 "Flowserv Corp",
4730 "Fluor Corp",
4731 "FMC Corp",
4732 "Foamex International Inc",
4733 "Foot Locker Inc",
4734 "Footstar Inc.",
4735 "Ford Motor Co",
4736 "Forest Laboratories Inc.",
4737 "Fortune Brands Inc.",
4738 "Foster Wheeler Ltd.",
4739 "FPL Group Inc.",
4740 "Franklin Resources Inc.",
4741 "Freeport McMoran Copper & Gold Inc.",
4742 "Frontier Oil Corp",
4743 "Furniture Brands International Inc.",
4744 "Gannett Co., Inc.",
4745 "Gap Inc.",
4746 "Gateway Inc.",
4747 "GATX Corporation",
4748 "Gemstar-TV Guide International Inc.",
4749 "GenCorp Inc.",
4750 "General Cable Corporation",
4751 "General Dynamics Corporation",
4752 "General Electric Company",
4753 "General Mills Inc",
4754 "General Motors Corporation",
4755 "Genesis Health Ventures Inc.",
4756 "Gentek Inc.",
4757 "Gentiva Health Services Inc.",
4758 "Genuine Parts Company",
4759 "Genuity Inc.",
4760 "Genzyme Corporation",
4761 "Georgia Gulf Corporation",
4762 "Georgia-Pacific Corporation",
4763 "Gillette Company",
4764 "Gold Kist Inc.",
4765 "Golden State Bancorp Inc.",
4766 "Golden West Financial Corporation",
4767 "Goldman Sachs Group Inc.",
4768 "Goodrich Corporation",
4769 "The Goodyear Tire & Rubber Company",
4770 "Granite Construction Incorporated",
4771 "Graybar Electric Company Inc.",
4772 "Great Lakes Chemical Corporation",
4773 "Great Plains Energy Inc.",
4774 "GreenPoint Financial Corp.",
4775 "Greif Bros. Corporation",
4776 "Grey Global Group Inc.",
4777 "Group 1 Automotive Inc.",
4778 "Guidant Corporation",
4779 "H&R Block Inc.",
4780 "H.B. Fuller Company",
4781 "H.J. Heinz Company",
4782 "Halliburton Co.",
4783 "Harley-Davidson Inc.",
4784 "Harman International Industries Inc.",
4785 "Harrah's Entertainment Inc.",
4786 "Harris Corp.",
4787 "Harsco Corp.",
4788 "Hartford Financial Services Group Inc.",
4789 "Hasbro Inc.",
4790 "Hawaiian Electric Industries Inc.",
4791 "HCA Inc.",
4792 "Health Management Associates Inc.",
4793 "Health Net Inc.",
4794 "Healthsouth Corp",
4795 "Henry Schein Inc.",
4796 "Hercules Inc.",
4797 "Herman Miller Inc.",
4798 "Hershey Foods Corp.",
4799 "Hewlett-Packard Company",
4800 "Hibernia Corp.",
4801 "Hillenbrand Industries Inc.",
4802 "Hilton Hotels Corp.",
4803 "Hollywood Entertainment Corp.",
4804 "Home Depot Inc.",
4805 "Hon Industries Inc.",
4806 "Honeywell International Inc.",
4807 "Hormel Foods Corp.",
4808 "Host Marriott Corp.",
4809 "Household International Corp.",
4810 "Hovnanian Enterprises Inc.",
4811 "Hub Group Inc.",
4812 "Hubbell Inc.",
4813 "Hughes Supply Inc.",
4814 "Humana Inc.",
4815 "Huntington Bancshares Inc.",
4816 "Idacorp Inc.",
4817 "IDT Corporation",
4818 "IKON Office Solutions Inc.",
4819 "Illinois Tool Works Inc.",
4820 "IMC Global Inc.",
4821 "Imperial Sugar Company",
4822 "IMS Health Inc.",
4823 "Ingles Market Inc",
4824 "Ingram Micro Inc.",
4825 "Insight Enterprises Inc.",
4826 "Integrated Electrical Services Inc.",
4827 "Intel Corporation",
4828 "International Paper Co.",
4829 "Interpublic Group of Companies Inc.",
4830 "Interstate Bakeries Corporation",
4831 "International Business Machines Corp.",
4832 "International Flavors & Fragrances Inc.",
4833 "International Multifoods Corporation",
4834 "Intuit Inc.",
4835 "IT Group Inc.",
4836 "ITT Industries Inc.",
4837 "Ivax Corp.",
4838 "J.B. Hunt Transport Services Inc.",
4839 "J.C. Penny Co.",
4840 "J.P. Morgan Chase & Co.",
4841 "Jabil Circuit Inc.",
4842 "Jack In The Box Inc.",
4843 "Jacobs Engineering Group Inc.",
4844 "JDS Uniphase Corp.",
4845 "Jefferson-Pilot Co.",
4846 "John Hancock Financial Services Inc.",
4847 "Johnson & Johnson",
4848 "Johnson Controls Inc.",
4849 "Jones Apparel Group Inc.",
4850 "KB Home",
4851 "Kellogg Company",
4852 "Kellwood Company",
4853 "Kelly Services Inc.",
4854 "Kemet Corp.",
4855 "Kennametal Inc.",
4856 "Kerr-McGee Corporation",
4857 "KeyCorp",
4858 "KeySpan Corp.",
4859 "Kimball International Inc.",
4860 "Kimberly-Clark Corporation",
4861 "Kindred Healthcare Inc.",
4862 "KLA-Tencor Corporation",
4863 "K-Mart Corp.",
4864 "Knight-Ridder Inc.",
4865 "Kohl's Corp.",
4866 "KPMG Consulting Inc.",
4867 "Kroger Co.",
4868 "L-3 Communications Holdings Inc.",
4869 "Laboratory Corporation of America Holdings",
4870 "Lam Research Corporation",
4871 "LandAmerica Financial Group Inc.",
4872 "Lands' End Inc.",
4873 "Landstar System Inc.",
4874 "La-Z-Boy Inc.",
4875 "Lear Corporation",
4876 "Legg Mason Inc.",
4877 "Leggett & Platt Inc.",
4878 "Lehman Brothers Holdings Inc.",
4879 "Lennar Corporation",
4880 "Lennox International Inc.",
4881 "Level 3 Communications Inc.",
4882 "Levi Strauss & Co.",
4883 "Lexmark International Inc.",
4884 "Limited Inc.",
4885 "Lincoln National Corporation",
4886 "Linens 'n Things Inc.",
4887 "Lithia Motors Inc.",
4888 "Liz Claiborne Inc.",
4889 "Lockheed Martin Corporation",
4890 "Loews Corporation",
4891 "Longs Drug Stores Corporation",
4892 "Louisiana-Pacific Corporation",
4893 "Lowe's Companies Inc.",
4894 "LSI Logic Corporation",
4895 "The LTV Corporation",
4896 "The Lubrizol Corporation",
4897 "Lucent Technologies Inc.",
4898 "Lyondell Chemical Company",
4899 "M & T Bank Corporation",
4900 "Magellan Health Services Inc.",
4901 "Mail-Well Inc.",
4902 "Mandalay Resort Group",
4903 "Manor Care Inc.",
4904 "Manpower Inc.",
4905 "Marathon Oil Corporation",
4906 "Mariner Health Care Inc.",
4907 "Markel Corporation",
4908 "Marriott International Inc.",
4909 "Marsh & McLennan Companies Inc.",
4910 "Marsh Supermarkets Inc.",
4911 "Marshall & Ilsley Corporation",
4912 "Martin Marietta Materials Inc.",
4913 "Masco Corporation",
4914 "Massey Energy Company",
4915 "MasTec Inc.",
4916 "Mattel Inc.",
4917 "Maxim Integrated Products Inc.",
4918 "Maxtor Corporation",
4919 "Maxxam Inc.",
4920 "The May Department Stores Company",
4921 "Maytag Corporation",
4922 "MBNA Corporation",
4923 "McCormick & Company Incorporated",
4924 "McDonald's Corporation",
4925 "The McGraw-Hill Companies Inc.",
4926 "McKesson Corporation",
4927 "McLeodUSA Incorporated",
4928 "M.D.C. Holdings Inc.",
4929 "MDU Resources Group Inc.",
4930 "MeadWestvaco Corporation",
4931 "Medtronic Inc.",
4932 "Mellon Financial Corporation",
4933 "The Men's Wearhouse Inc.",
4934 "Merck & Co., Inc.",
4935 "Mercury General Corporation",
4936 "Merrill Lynch & Co. Inc.",
4937 "Metaldyne Corporation",
4938 "Metals USA Inc.",
4939 "MetLife Inc.",
4940 "Metris Companies Inc",
4941 "MGIC Investment Corporation",
4942 "MGM Mirage",
4943 "Michaels Stores Inc.",
4944 "Micron Technology Inc.",
4945 "Microsoft Corporation",
4946 "Milacron Inc.",
4947 "Millennium Chemicals Inc.",
4948 "Mirant Corporation",
4949 "Mohawk Industries Inc.",
4950 "Molex Incorporated",
4951 "The MONY Group Inc.",
4952 "Morgan Stanley Dean Witter & Co.",
4953 "Motorola Inc.",
4954 "MPS Group Inc.",
4955 "Murphy Oil Corporation",
4956 "Nabors Industries Inc",
4957 "Nacco Industries Inc",
4958 "Nash Finch Company",
4959 "National City Corp.",
4960 "National Commerce Financial Corporation",
4961 "National Fuel Gas Company",
4962 "National Oilwell Inc",
4963 "National Rural Utilities Cooperative Finance Corporation",
4964 "National Semiconductor Corporation",
4965 "National Service Industries Inc",
4966 "Navistar International Corporation",
4967 "NCR Corporation",
4968 "The Neiman Marcus Group Inc.",
4969 "New Jersey Resources Corporation",
4970 "New York Times Company",
4971 "Newell Rubbermaid Inc",
4972 "Newmont Mining Corporation",
4973 "Nextel Communications Inc",
4974 "Nicor Inc",
4975 "Nike Inc",
4976 "NiSource Inc",
4977 "Noble Energy Inc",
4978 "Nordstrom Inc",
4979 "Norfolk Southern Corporation",
4980 "Nortek Inc",
4981 "North Fork Bancorporation Inc",
4982 "Northeast Utilities System",
4983 "Northern Trust Corporation",
4984 "Northrop Grumman Corporation",
4985 "NorthWestern Corporation",
4986 "Novellus Systems Inc",
4987 "NSTAR",
4988 "NTL Incorporated",
4989 "Nucor Corp",
4990 "Nvidia Corp",
4991 "NVR Inc",
4992 "Northwest Airlines Corp",
4993 "Occidental Petroleum Corp",
4994 "Ocean Energy Inc",
4995 "Office Depot Inc.",
4996 "OfficeMax Inc",
4997 "OGE Energy Corp",
4998 "Oglethorpe Power Corp.",
4999 "Ohio Casualty Corp.",
5000 "Old Republic International Corp.",
5001 "Olin Corp.",
5002 "OM Group Inc",
5003 "Omnicare Inc",
5004 "Omnicom Group",
5005 "On Semiconductor Corp",
5006 "ONEOK Inc",
5007 "Oracle Corp",
5008 "Oshkosh Truck Corp",
5009 "Outback Steakhouse Inc.",
5010 "Owens & Minor Inc.",
5011 "Owens Corning",
5012 "Owens-Illinois Inc",
5013 "Oxford Health Plans Inc",
5014 "Paccar Inc",
5015 "PacifiCare Health Systems Inc",
5016 "Packaging Corp. of America",
5017 "Pactiv Corp",
5018 "Pall Corp",
5019 "Pantry Inc",
5020 "Park Place Entertainment Corp",
5021 "Parker Hannifin Corp.",
5022 "Pathmark Stores Inc.",
5023 "Paychex Inc",
5024 "Payless Shoesource Inc",
5025 "Penn Traffic Co.",
5026 "Pennzoil-Quaker State Company",
5027 "Pentair Inc",
5028 "Peoples Energy Corp.",
5029 "PeopleSoft Inc",
5030 "Pep Boys Manny, Moe & Jack",
5031 "Potomac Electric Power Co.",
5032 "Pepsi Bottling Group Inc.",
5033 "PepsiAmericas Inc.",
5034 "PepsiCo Inc.",
5035 "Performance Food Group Co.",
5036 "Perini Corp",
5037 "PerkinElmer Inc",
5038 "Perot Systems Corp",
5039 "Petco Animal Supplies Inc.",
5040 "Peter Kiewit Sons', Inc.",
5041 "PETsMART Inc",
5042 "Pfizer Inc",
5043 "Pacific Gas & Electric Corp.",
5044 "Pharmacia Corp",
5045 "Phar Mor Inc.",
5046 "Phelps Dodge Corp.",
5047 "Philip Morris Companies Inc.",
5048 "Phillips Petroleum Co",
5049 "Phillips Van Heusen Corp.",
5050 "Phoenix Companies Inc",
5051 "Pier 1 Imports Inc.",
5052 "Pilgrim's Pride Corporation",
5053 "Pinnacle West Capital Corp",
5054 "Pioneer-Standard Electronics Inc.",
5055 "Pitney Bowes Inc.",
5056 "Pittston Brinks Group",
5057 "Plains All American Pipeline LP",
5058 "PNC Financial Services Group Inc.",
5059 "PNM Resources Inc",
5060 "Polaris Industries Inc.",
5061 "Polo Ralph Lauren Corp",
5062 "PolyOne Corp",
5063 "Popular Inc",
5064 "Potlatch Corp",
5065 "PPG Industries Inc",
5066 "PPL Corp",
5067 "Praxair Inc",
5068 "Precision Castparts Corp",
5069 "Premcor Inc.",
5070 "Pride International Inc",
5071 "Primedia Inc",
5072 "Principal Financial Group Inc.",
5073 "Procter & Gamble Co.",
5074 "Pro-Fac Cooperative Inc.",
5075 "Progress Energy Inc",
5076 "Progressive Corporation",
5077 "Protective Life Corp",
5078 "Provident Financial Group",
5079 "Providian Financial Corp.",
5080 "Prudential Financial Inc.",
5081 "PSS World Medical Inc",
5082 "Public Service Enterprise Group Inc.",
5083 "Publix Super Markets Inc.",
5084 "Puget Energy Inc.",
5085 "Pulte Homes Inc",
5086 "Qualcomm Inc",
5087 "Quanta Services Inc.",
5088 "Quantum Corp",
5089 "Quest Diagnostics Inc.",
5090 "Questar Corp",
5091 "Quintiles Transnational",
5092 "Qwest Communications Intl Inc",
5093 "R.J. Reynolds Tobacco Company",
5094 "R.R. Donnelley & Sons Company",
5095 "Radio Shack Corporation",
5096 "Raymond James Financial Inc.",
5097 "Raytheon Company",
5098 "Reader's Digest Association Inc.",
5099 "Reebok International Ltd.",
5100 "Regions Financial Corp.",
5101 "Regis Corporation",
5102 "Reliance Steel & Aluminum Co.",
5103 "Reliant Energy Inc.",
5104 "Rent A Center Inc",
5105 "Republic Services Inc",
5106 "Revlon Inc",
5107 "RGS Energy Group Inc",
5108 "Rite Aid Corp",
5109 "Riverwood Holding Inc.",
5110 "RoadwayCorp",
5111 "Robert Half International Inc.",
5112 "Rock-Tenn Co",
5113 "Rockwell Automation Inc",
5114 "Rockwell Collins Inc",
5115 "Rohm & Haas Co.",
5116 "Ross Stores Inc",
5117 "RPM Inc.",
5118 "Ruddick Corp",
5119 "Ryder System Inc",
5120 "Ryerson Tull Inc",
5121 "Ryland Group Inc.",
5122 "Sabre Holdings Corp",
5123 "Safeco Corp",
5124 "Safeguard Scientifics Inc.",
5125 "Safeway Inc",
5126 "Saks Inc",
5127 "Sanmina-SCI Inc",
5128 "Sara Lee Corp",
5129 "SBC Communications Inc",
5130 "Scana Corp.",
5131 "Schering-Plough Corp",
5132 "Scholastic Corp",
5133 "SCI Systems Onc.",
5134 "Science Applications Intl. Inc.",
5135 "Scientific-Atlanta Inc",
5136 "Scotts Company",
5137 "Seaboard Corp",
5138 "Sealed Air Corp",
5139 "Sears Roebuck & Co",
5140 "Sempra Energy",
5141 "Sequa Corp",
5142 "Service Corp. International",
5143 "ServiceMaster Co",
5144 "Shaw Group Inc",
5145 "Sherwin-Williams Company",
5146 "Shopko Stores Inc",
5147 "Siebel Systems Inc",
5148 "Sierra Health Services Inc",
5149 "Sierra Pacific Resources",
5150 "Silgan Holdings Inc.",
5151 "Silicon Graphics Inc",
5152 "Simon Property Group Inc",
5153 "SLM Corporation",
5154 "Smith International Inc",
5155 "Smithfield Foods Inc",
5156 "Smurfit-Stone Container Corp",
5157 "Snap-On Inc",
5158 "Solectron Corp",
5159 "Solutia Inc",
5160 "Sonic Automotive Inc.",
5161 "Sonoco Products Co.",
5162 "Southern Company",
5163 "Southern Union Company",
5164 "SouthTrust Corp.",
5165 "Southwest Airlines Co",
5166 "Southwest Gas Corp",
5167 "Sovereign Bancorp Inc.",
5168 "Spartan Stores Inc",
5169 "Spherion Corp",
5170 "Sports Authority Inc",
5171 "Sprint Corp.",
5172 "SPX Corp",
5173 "St. Jude Medical Inc",
5174 "St. Paul Cos.",
5175 "Staff Leasing Inc.",
5176 "StanCorp Financial Group Inc",
5177 "Standard Pacific Corp.",
5178 "Stanley Works",
5179 "Staples Inc",
5180 "Starbucks Corp",
5181 "Starwood Hotels & Resorts Worldwide Inc",
5182 "State Street Corp.",
5183 "Stater Bros. Holdings Inc.",
5184 "Steelcase Inc",
5185 "Stein Mart Inc",
5186 "Stewart & Stevenson Services Inc",
5187 "Stewart Information Services Corp",
5188 "Stilwell Financial Inc",
5189 "Storage Technology Corporation",
5190 "Stryker Corp",
5191 "Sun Healthcare Group Inc.",
5192 "Sun Microsystems Inc.",
5193 "SunGard Data Systems Inc.",
5194 "Sunoco Inc.",
5195 "SunTrust Banks Inc",
5196 "Supervalu Inc",
5197 "Swift Transportation, Co., Inc",
5198 "Symbol Technologies Inc",
5199 "Synovus Financial Corp.",
5200 "Sysco Corp",
5201 "Systemax Inc.",
5202 "Target Corp.",
5203 "Tech Data Corporation",
5204 "TECO Energy Inc",
5205 "Tecumseh Products Company",
5206 "Tektronix Inc",
5207 "Teleflex Incorporated",
5208 "Telephone & Data Systems Inc",
5209 "Tellabs Inc.",
5210 "Temple-Inland Inc",
5211 "Tenet Healthcare Corporation",
5212 "Tenneco Automotive Inc.",
5213 "Teradyne Inc",
5214 "Terex Corp",
5215 "Tesoro Petroleum Corp.",
5216 "Texas Industries Inc.",
5217 "Texas Instruments Incorporated",
5218 "Textron Inc",
5219 "Thermo Electron Corporation",
5220 "Thomas & Betts Corporation",
5221 "Tiffany & Co",
5222 "Timken Company",
5223 "TJX Companies Inc",
5224 "TMP Worldwide Inc",
5225 "Toll Brothers Inc",
5226 "Torchmark Corporation",
5227 "Toro Company",
5228 "Tower Automotive Inc.",
5229 "Toys 'R' Us Inc",
5230 "Trans World Entertainment Corp.",
5231 "TransMontaigne Inc",
5232 "Transocean Inc",
5233 "TravelCenters of America Inc.",
5234 "Triad Hospitals Inc",
5235 "Tribune Company",
5236 "Trigon Healthcare Inc.",
5237 "Trinity Industries Inc",
5238 "Trump Hotels & Casino Resorts Inc.",
5239 "TruServ Corporation",
5240 "TRW Inc",
5241 "TXU Corp",
5242 "Tyson Foods Inc",
5243 "U.S. Bancorp",
5244 "U.S. Industries Inc.",
5245 "UAL Corporation",
5246 "UGI Corporation",
5247 "Unified Western Grocers Inc",
5248 "Union Pacific Corporation",
5249 "Union Planters Corp",
5250 "Unisource Energy Corp",
5251 "Unisys Corporation",
5252 "United Auto Group Inc",
5253 "United Defense Industries Inc.",
5254 "United Parcel Service Inc",
5255 "United Rentals Inc",
5256 "United Stationers Inc",
5257 "United Technologies Corporation",
5258 "UnitedHealth Group Incorporated",
5259 "Unitrin Inc",
5260 "Universal Corporation",
5261 "Universal Forest Products Inc",
5262 "Universal Health Services Inc",
5263 "Unocal Corporation",
5264 "Unova Inc",
5265 "UnumProvident Corporation",
5266 "URS Corporation",
5267 "US Airways Group Inc",
5268 "US Oncology Inc",
5269 "USA Interactive",
5270 "USFreighways Corporation",
5271 "USG Corporation",
5272 "UST Inc",
5273 "Valero Energy Corporation",
5274 "Valspar Corporation",
5275 "Value City Department Stores Inc",
5276 "Varco International Inc",
5277 "Vectren Corporation",
5278 "Veritas Software Corporation",
5279 "Verizon Communications Inc",
5280 "VF Corporation",
5281 "Viacom Inc",
5282 "Viad Corp",
5283 "Viasystems Group Inc",
5284 "Vishay Intertechnology Inc",
5285 "Visteon Corporation",
5286 "Volt Information Sciences Inc",
5287 "Vulcan Materials Company",
5288 "W.R. Berkley Corporation",
5289 "W.R. Grace & Co",
5290 "W.W. Grainger Inc",
5291 "Wachovia Corporation",
5292 "Wakenhut Corporation",
5293 "Walgreen Co",
5294 "Wallace Computer Services Inc",
5295 "Wal-Mart Stores Inc",
5296 "Walt Disney Co",
5297 "Walter Industries Inc",
5298 "Washington Mutual Inc",
5299 "Washington Post Co.",
5300 "Waste Management Inc",
5301 "Watsco Inc",
5302 "Weatherford International Inc",
5303 "Weis Markets Inc.",
5304 "Wellpoint Health Networks Inc",
5305 "Wells Fargo & Company",
5306 "Wendy's International Inc",
5307 "Werner Enterprises Inc",
5308 "WESCO International Inc",
5309 "Western Digital Inc",
5310 "Western Gas Resources Inc",
5311 "WestPoint Stevens Inc",
5312 "Weyerhauser Company",
5313 "WGL Holdings Inc",
5314 "Whirlpool Corporation",
5315 "Whole Foods Market Inc",
5316 "Willamette Industries Inc.",
5317 "Williams Companies Inc",
5318 "Williams Sonoma Inc",
5319 "Winn Dixie Stores Inc",
5320 "Wisconsin Energy Corporation",
5321 "Wm Wrigley Jr Company",
5322 "World Fuel Services Corporation",
5323 "WorldCom Inc",
5324 "Worthington Industries Inc",
5325 "WPS Resources Corporation",
5326 "Wyeth",
5327 "Wyndham International Inc",
5328 "Xcel Energy Inc",
5329 "Xerox Corp",
5330 "Xilinx Inc",
5331 "XO Communications Inc",
5332 "Yellow Corporation",
5333 "York International Corp",
5334 "Yum Brands Inc.",
5335 "Zale Corporation",
5336 "Zions Bancorporation"
5337 ],
5338
5339 fileExtension : {
5340 "raster" : ["bmp", "gif", "gpl", "ico", "jpeg", "psd", "png", "psp", "raw", "tiff"],
5341 "vector" : ["3dv", "amf", "awg", "ai", "cgm", "cdr", "cmx", "dxf", "e2d", "egt", "eps", "fs", "odg", "svg", "xar"],
5342 "3d" : ["3dmf", "3dm", "3mf", "3ds", "an8", "aoi", "blend", "cal3d", "cob", "ctm", "iob", "jas", "max", "mb", "mdx", "obj", "x", "x3d"],
5343 "document" : ["doc", "docx", "dot", "html", "xml", "odt", "odm", "ott", "csv", "rtf", "tex", "xhtml", "xps"]
5344 },
5345
5346 // Data taken from https://github.com/dmfilipenko/timezones.json/blob/master/timezones.json
5347 timezones: [
5348 {
5349 "name": "Dateline Standard Time",
5350 "abbr": "DST",
5351 "offset": -12,
5352 "isdst": false,
5353 "text": "(UTC-12:00) International Date Line West",
5354 "utc": [
5355 "Etc/GMT+12"
5356 ]
5357 },
5358 {
5359 "name": "UTC-11",
5360 "abbr": "U",
5361 "offset": -11,
5362 "isdst": false,
5363 "text": "(UTC-11:00) Coordinated Universal Time-11",
5364 "utc": [
5365 "Etc/GMT+11",
5366 "Pacific/Midway",
5367 "Pacific/Niue",
5368 "Pacific/Pago_Pago"
5369 ]
5370 },
5371 {
5372 "name": "Hawaiian Standard Time",
5373 "abbr": "HST",
5374 "offset": -10,
5375 "isdst": false,
5376 "text": "(UTC-10:00) Hawaii",
5377 "utc": [
5378 "Etc/GMT+10",
5379 "Pacific/Honolulu",
5380 "Pacific/Johnston",
5381 "Pacific/Rarotonga",
5382 "Pacific/Tahiti"
5383 ]
5384 },
5385 {
5386 "name": "Alaskan Standard Time",
5387 "abbr": "AKDT",
5388 "offset": -8,
5389 "isdst": true,
5390 "text": "(UTC-09:00) Alaska",
5391 "utc": [
5392 "America/Anchorage",
5393 "America/Juneau",
5394 "America/Nome",
5395 "America/Sitka",
5396 "America/Yakutat"
5397 ]
5398 },
5399 {
5400 "name": "Pacific Standard Time (Mexico)",
5401 "abbr": "PDT",
5402 "offset": -7,
5403 "isdst": true,
5404 "text": "(UTC-08:00) Baja California",
5405 "utc": [
5406 "America/Santa_Isabel"
5407 ]
5408 },
5409 {
5410 "name": "Pacific Standard Time",
5411 "abbr": "PDT",
5412 "offset": -7,
5413 "isdst": true,
5414 "text": "(UTC-08:00) Pacific Time (US & Canada)",
5415 "utc": [
5416 "America/Dawson",
5417 "America/Los_Angeles",
5418 "America/Tijuana",
5419 "America/Vancouver",
5420 "America/Whitehorse",
5421 "PST8PDT"
5422 ]
5423 },
5424 {
5425 "name": "US Mountain Standard Time",
5426 "abbr": "UMST",
5427 "offset": -7,
5428 "isdst": false,
5429 "text": "(UTC-07:00) Arizona",
5430 "utc": [
5431 "America/Creston",
5432 "America/Dawson_Creek",
5433 "America/Hermosillo",
5434 "America/Phoenix",
5435 "Etc/GMT+7"
5436 ]
5437 },
5438 {
5439 "name": "Mountain Standard Time (Mexico)",
5440 "abbr": "MDT",
5441 "offset": -6,
5442 "isdst": true,
5443 "text": "(UTC-07:00) Chihuahua, La Paz, Mazatlan",
5444 "utc": [
5445 "America/Chihuahua",
5446 "America/Mazatlan"
5447 ]
5448 },
5449 {
5450 "name": "Mountain Standard Time",
5451 "abbr": "MDT",
5452 "offset": -6,
5453 "isdst": true,
5454 "text": "(UTC-07:00) Mountain Time (US & Canada)",
5455 "utc": [
5456 "America/Boise",
5457 "America/Cambridge_Bay",
5458 "America/Denver",
5459 "America/Edmonton",
5460 "America/Inuvik",
5461 "America/Ojinaga",
5462 "America/Yellowknife",
5463 "MST7MDT"
5464 ]
5465 },
5466 {
5467 "name": "Central America Standard Time",
5468 "abbr": "CAST",
5469 "offset": -6,
5470 "isdst": false,
5471 "text": "(UTC-06:00) Central America",
5472 "utc": [
5473 "America/Belize",
5474 "America/Costa_Rica",
5475 "America/El_Salvador",
5476 "America/Guatemala",
5477 "America/Managua",
5478 "America/Tegucigalpa",
5479 "Etc/GMT+6",
5480 "Pacific/Galapagos"
5481 ]
5482 },
5483 {
5484 "name": "Central Standard Time",
5485 "abbr": "CDT",
5486 "offset": -5,
5487 "isdst": true,
5488 "text": "(UTC-06:00) Central Time (US & Canada)",
5489 "utc": [
5490 "America/Chicago",
5491 "America/Indiana/Knox",
5492 "America/Indiana/Tell_City",
5493 "America/Matamoros",
5494 "America/Menominee",
5495 "America/North_Dakota/Beulah",
5496 "America/North_Dakota/Center",
5497 "America/North_Dakota/New_Salem",
5498 "America/Rainy_River",
5499 "America/Rankin_Inlet",
5500 "America/Resolute",
5501 "America/Winnipeg",
5502 "CST6CDT"
5503 ]
5504 },
5505 {
5506 "name": "Central Standard Time (Mexico)",
5507 "abbr": "CDT",
5508 "offset": -5,
5509 "isdst": true,
5510 "text": "(UTC-06:00) Guadalajara, Mexico City, Monterrey",
5511 "utc": [
5512 "America/Bahia_Banderas",
5513 "America/Cancun",
5514 "America/Merida",
5515 "America/Mexico_City",
5516 "America/Monterrey"
5517 ]
5518 },
5519 {
5520 "name": "Canada Central Standard Time",
5521 "abbr": "CCST",
5522 "offset": -6,
5523 "isdst": false,
5524 "text": "(UTC-06:00) Saskatchewan",
5525 "utc": [
5526 "America/Regina",
5527 "America/Swift_Current"
5528 ]
5529 },
5530 {
5531 "name": "SA Pacific Standard Time",
5532 "abbr": "SPST",
5533 "offset": -5,
5534 "isdst": false,
5535 "text": "(UTC-05:00) Bogota, Lima, Quito",
5536 "utc": [
5537 "America/Bogota",
5538 "America/Cayman",
5539 "America/Coral_Harbour",
5540 "America/Eirunepe",
5541 "America/Guayaquil",
5542 "America/Jamaica",
5543 "America/Lima",
5544 "America/Panama",
5545 "America/Rio_Branco",
5546 "Etc/GMT+5"
5547 ]
5548 },
5549 {
5550 "name": "Eastern Standard Time",
5551 "abbr": "EDT",
5552 "offset": -4,
5553 "isdst": true,
5554 "text": "(UTC-05:00) Eastern Time (US & Canada)",
5555 "utc": [
5556 "America/Detroit",
5557 "America/Havana",
5558 "America/Indiana/Petersburg",
5559 "America/Indiana/Vincennes",
5560 "America/Indiana/Winamac",
5561 "America/Iqaluit",
5562 "America/Kentucky/Monticello",
5563 "America/Louisville",
5564 "America/Montreal",
5565 "America/Nassau",
5566 "America/New_York",
5567 "America/Nipigon",
5568 "America/Pangnirtung",
5569 "America/Port-au-Prince",
5570 "America/Thunder_Bay",
5571 "America/Toronto",
5572 "EST5EDT"
5573 ]
5574 },
5575 {
5576 "name": "US Eastern Standard Time",
5577 "abbr": "UEDT",
5578 "offset": -4,
5579 "isdst": true,
5580 "text": "(UTC-05:00) Indiana (East)",
5581 "utc": [
5582 "America/Indiana/Marengo",
5583 "America/Indiana/Vevay",
5584 "America/Indianapolis"
5585 ]
5586 },
5587 {
5588 "name": "Venezuela Standard Time",
5589 "abbr": "VST",
5590 "offset": -4.5,
5591 "isdst": false,
5592 "text": "(UTC-04:30) Caracas",
5593 "utc": [
5594 "America/Caracas"
5595 ]
5596 },
5597 {
5598 "name": "Paraguay Standard Time",
5599 "abbr": "PST",
5600 "offset": -4,
5601 "isdst": false,
5602 "text": "(UTC-04:00) Asuncion",
5603 "utc": [
5604 "America/Asuncion"
5605 ]
5606 },
5607 {
5608 "name": "Atlantic Standard Time",
5609 "abbr": "ADT",
5610 "offset": -3,
5611 "isdst": true,
5612 "text": "(UTC-04:00) Atlantic Time (Canada)",
5613 "utc": [
5614 "America/Glace_Bay",
5615 "America/Goose_Bay",
5616 "America/Halifax",
5617 "America/Moncton",
5618 "America/Thule",
5619 "Atlantic/Bermuda"
5620 ]
5621 },
5622 {
5623 "name": "Central Brazilian Standard Time",
5624 "abbr": "CBST",
5625 "offset": -4,
5626 "isdst": false,
5627 "text": "(UTC-04:00) Cuiaba",
5628 "utc": [
5629 "America/Campo_Grande",
5630 "America/Cuiaba"
5631 ]
5632 },
5633 {
5634 "name": "SA Western Standard Time",
5635 "abbr": "SWST",
5636 "offset": -4,
5637 "isdst": false,
5638 "text": "(UTC-04:00) Georgetown, La Paz, Manaus, San Juan",
5639 "utc": [
5640 "America/Anguilla",
5641 "America/Antigua",
5642 "America/Aruba",
5643 "America/Barbados",
5644 "America/Blanc-Sablon",
5645 "America/Boa_Vista",
5646 "America/Curacao",
5647 "America/Dominica",
5648 "America/Grand_Turk",
5649 "America/Grenada",
5650 "America/Guadeloupe",
5651 "America/Guyana",
5652 "America/Kralendijk",
5653 "America/La_Paz",
5654 "America/Lower_Princes",
5655 "America/Manaus",
5656 "America/Marigot",
5657 "America/Martinique",
5658 "America/Montserrat",
5659 "America/Port_of_Spain",
5660 "America/Porto_Velho",
5661 "America/Puerto_Rico",
5662 "America/Santo_Domingo",
5663 "America/St_Barthelemy",
5664 "America/St_Kitts",
5665 "America/St_Lucia",
5666 "America/St_Thomas",
5667 "America/St_Vincent",
5668 "America/Tortola",
5669 "Etc/GMT+4"
5670 ]
5671 },
5672 {
5673 "name": "Pacific SA Standard Time",
5674 "abbr": "PSST",
5675 "offset": -4,
5676 "isdst": false,
5677 "text": "(UTC-04:00) Santiago",
5678 "utc": [
5679 "America/Santiago",
5680 "Antarctica/Palmer"
5681 ]
5682 },
5683 {
5684 "name": "Newfoundland Standard Time",
5685 "abbr": "NDT",
5686 "offset": -2.5,
5687 "isdst": true,
5688 "text": "(UTC-03:30) Newfoundland",
5689 "utc": [
5690 "America/St_Johns"
5691 ]
5692 },
5693 {
5694 "name": "E. South America Standard Time",
5695 "abbr": "ESAST",
5696 "offset": -3,
5697 "isdst": false,
5698 "text": "(UTC-03:00) Brasilia",
5699 "utc": [
5700 "America/Sao_Paulo"
5701 ]
5702 },
5703 {
5704 "name": "Argentina Standard Time",
5705 "abbr": "AST",
5706 "offset": -3,
5707 "isdst": false,
5708 "text": "(UTC-03:00) Buenos Aires",
5709 "utc": [
5710 "America/Argentina/La_Rioja",
5711 "America/Argentina/Rio_Gallegos",
5712 "America/Argentina/Salta",
5713 "America/Argentina/San_Juan",
5714 "America/Argentina/San_Luis",
5715 "America/Argentina/Tucuman",
5716 "America/Argentina/Ushuaia",
5717 "America/Buenos_Aires",
5718 "America/Catamarca",
5719 "America/Cordoba",
5720 "America/Jujuy",
5721 "America/Mendoza"
5722 ]
5723 },
5724 {
5725 "name": "SA Eastern Standard Time",
5726 "abbr": "SEST",
5727 "offset": -3,
5728 "isdst": false,
5729 "text": "(UTC-03:00) Cayenne, Fortaleza",
5730 "utc": [
5731 "America/Araguaina",
5732 "America/Belem",
5733 "America/Cayenne",
5734 "America/Fortaleza",
5735 "America/Maceio",
5736 "America/Paramaribo",
5737 "America/Recife",
5738 "America/Santarem",
5739 "Antarctica/Rothera",
5740 "Atlantic/Stanley",
5741 "Etc/GMT+3"
5742 ]
5743 },
5744 {
5745 "name": "Greenland Standard Time",
5746 "abbr": "GDT",
5747 "offset": -2,
5748 "isdst": true,
5749 "text": "(UTC-03:00) Greenland",
5750 "utc": [
5751 "America/Godthab"
5752 ]
5753 },
5754 {
5755 "name": "Montevideo Standard Time",
5756 "abbr": "MST",
5757 "offset": -3,
5758 "isdst": false,
5759 "text": "(UTC-03:00) Montevideo",
5760 "utc": [
5761 "America/Montevideo"
5762 ]
5763 },
5764 {
5765 "name": "Bahia Standard Time",
5766 "abbr": "BST",
5767 "offset": -3,
5768 "isdst": false,
5769 "text": "(UTC-03:00) Salvador",
5770 "utc": [
5771 "America/Bahia"
5772 ]
5773 },
5774 {
5775 "name": "UTC-02",
5776 "abbr": "U",
5777 "offset": -2,
5778 "isdst": false,
5779 "text": "(UTC-02:00) Coordinated Universal Time-02",
5780 "utc": [
5781 "America/Noronha",
5782 "Atlantic/South_Georgia",
5783 "Etc/GMT+2"
5784 ]
5785 },
5786 {
5787 "name": "Mid-Atlantic Standard Time",
5788 "abbr": "MDT",
5789 "offset": -1,
5790 "isdst": true,
5791 "text": "(UTC-02:00) Mid-Atlantic - Old"
5792 },
5793 {
5794 "name": "Azores Standard Time",
5795 "abbr": "ADT",
5796 "offset": 0,
5797 "isdst": true,
5798 "text": "(UTC-01:00) Azores",
5799 "utc": [
5800 "America/Scoresbysund",
5801 "Atlantic/Azores"
5802 ]
5803 },
5804 {
5805 "name": "Cape Verde Standard Time",
5806 "abbr": "CVST",
5807 "offset": -1,
5808 "isdst": false,
5809 "text": "(UTC-01:00) Cape Verde Is.",
5810 "utc": [
5811 "Atlantic/Cape_Verde",
5812 "Etc/GMT+1"
5813 ]
5814 },
5815 {
5816 "name": "Morocco Standard Time",
5817 "abbr": "MDT",
5818 "offset": 1,
5819 "isdst": true,
5820 "text": "(UTC) Casablanca",
5821 "utc": [
5822 "Africa/Casablanca",
5823 "Africa/El_Aaiun"
5824 ]
5825 },
5826 {
5827 "name": "UTC",
5828 "abbr": "CUT",
5829 "offset": 0,
5830 "isdst": false,
5831 "text": "(UTC) Coordinated Universal Time",
5832 "utc": [
5833 "America/Danmarkshavn",
5834 "Etc/GMT"
5835 ]
5836 },
5837 {
5838 "name": "GMT Standard Time",
5839 "abbr": "GDT",
5840 "offset": 1,
5841 "isdst": true,
5842 "text": "(UTC) Dublin, Edinburgh, Lisbon, London",
5843 "utc": [
5844 "Atlantic/Canary",
5845 "Atlantic/Faeroe",
5846 "Atlantic/Madeira",
5847 "Europe/Dublin",
5848 "Europe/Guernsey",
5849 "Europe/Isle_of_Man",
5850 "Europe/Jersey",
5851 "Europe/Lisbon",
5852 "Europe/London"
5853 ]
5854 },
5855 {
5856 "name": "Greenwich Standard Time",
5857 "abbr": "GST",
5858 "offset": 0,
5859 "isdst": false,
5860 "text": "(UTC) Monrovia, Reykjavik",
5861 "utc": [
5862 "Africa/Abidjan",
5863 "Africa/Accra",
5864 "Africa/Bamako",
5865 "Africa/Banjul",
5866 "Africa/Bissau",
5867 "Africa/Conakry",
5868 "Africa/Dakar",
5869 "Africa/Freetown",
5870 "Africa/Lome",
5871 "Africa/Monrovia",
5872 "Africa/Nouakchott",
5873 "Africa/Ouagadougou",
5874 "Africa/Sao_Tome",
5875 "Atlantic/Reykjavik",
5876 "Atlantic/St_Helena"
5877 ]
5878 },
5879 {
5880 "name": "W. Europe Standard Time",
5881 "abbr": "WEDT",
5882 "offset": 2,
5883 "isdst": true,
5884 "text": "(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna",
5885 "utc": [
5886 "Arctic/Longyearbyen",
5887 "Europe/Amsterdam",
5888 "Europe/Andorra",
5889 "Europe/Berlin",
5890 "Europe/Busingen",
5891 "Europe/Gibraltar",
5892 "Europe/Luxembourg",
5893 "Europe/Malta",
5894 "Europe/Monaco",
5895 "Europe/Oslo",
5896 "Europe/Rome",
5897 "Europe/San_Marino",
5898 "Europe/Stockholm",
5899 "Europe/Vaduz",
5900 "Europe/Vatican",
5901 "Europe/Vienna",
5902 "Europe/Zurich"
5903 ]
5904 },
5905 {
5906 "name": "Central Europe Standard Time",
5907 "abbr": "CEDT",
5908 "offset": 2,
5909 "isdst": true,
5910 "text": "(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague",
5911 "utc": [
5912 "Europe/Belgrade",
5913 "Europe/Bratislava",
5914 "Europe/Budapest",
5915 "Europe/Ljubljana",
5916 "Europe/Podgorica",
5917 "Europe/Prague",
5918 "Europe/Tirane"
5919 ]
5920 },
5921 {
5922 "name": "Romance Standard Time",
5923 "abbr": "RDT",
5924 "offset": 2,
5925 "isdst": true,
5926 "text": "(UTC+01:00) Brussels, Copenhagen, Madrid, Paris",
5927 "utc": [
5928 "Africa/Ceuta",
5929 "Europe/Brussels",
5930 "Europe/Copenhagen",
5931 "Europe/Madrid",
5932 "Europe/Paris"
5933 ]
5934 },
5935 {
5936 "name": "Central European Standard Time",
5937 "abbr": "CEDT",
5938 "offset": 2,
5939 "isdst": true,
5940 "text": "(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb",
5941 "utc": [
5942 "Europe/Sarajevo",
5943 "Europe/Skopje",
5944 "Europe/Warsaw",
5945 "Europe/Zagreb"
5946 ]
5947 },
5948 {
5949 "name": "W. Central Africa Standard Time",
5950 "abbr": "WCAST",
5951 "offset": 1,
5952 "isdst": false,
5953 "text": "(UTC+01:00) West Central Africa",
5954 "utc": [
5955 "Africa/Algiers",
5956 "Africa/Bangui",
5957 "Africa/Brazzaville",
5958 "Africa/Douala",
5959 "Africa/Kinshasa",
5960 "Africa/Lagos",
5961 "Africa/Libreville",
5962 "Africa/Luanda",
5963 "Africa/Malabo",
5964 "Africa/Ndjamena",
5965 "Africa/Niamey",
5966 "Africa/Porto-Novo",
5967 "Africa/Tunis",
5968 "Etc/GMT-1"
5969 ]
5970 },
5971 {
5972 "name": "Namibia Standard Time",
5973 "abbr": "NST",
5974 "offset": 1,
5975 "isdst": false,
5976 "text": "(UTC+01:00) Windhoek",
5977 "utc": [
5978 "Africa/Windhoek"
5979 ]
5980 },
5981 {
5982 "name": "GTB Standard Time",
5983 "abbr": "GDT",
5984 "offset": 3,
5985 "isdst": true,
5986 "text": "(UTC+02:00) Athens, Bucharest",
5987 "utc": [
5988 "Asia/Nicosia",
5989 "Europe/Athens",
5990 "Europe/Bucharest",
5991 "Europe/Chisinau"
5992 ]
5993 },
5994 {
5995 "name": "Middle East Standard Time",
5996 "abbr": "MEDT",
5997 "offset": 3,
5998 "isdst": true,
5999 "text": "(UTC+02:00) Beirut",
6000 "utc": [
6001 "Asia/Beirut"
6002 ]
6003 },
6004 {
6005 "name": "Egypt Standard Time",
6006 "abbr": "EST",
6007 "offset": 2,
6008 "isdst": false,
6009 "text": "(UTC+02:00) Cairo",
6010 "utc": [
6011 "Africa/Cairo"
6012 ]
6013 },
6014 {
6015 "name": "Syria Standard Time",
6016 "abbr": "SDT",
6017 "offset": 3,
6018 "isdst": true,
6019 "text": "(UTC+02:00) Damascus",
6020 "utc": [
6021 "Asia/Damascus"
6022 ]
6023 },
6024 {
6025 "name": "E. Europe Standard Time",
6026 "abbr": "EEDT",
6027 "offset": 3,
6028 "isdst": true,
6029 "text": "(UTC+02:00) E. Europe"
6030 },
6031 {
6032 "name": "South Africa Standard Time",
6033 "abbr": "SAST",
6034 "offset": 2,
6035 "isdst": false,
6036 "text": "(UTC+02:00) Harare, Pretoria",
6037 "utc": [
6038 "Africa/Blantyre",
6039 "Africa/Bujumbura",
6040 "Africa/Gaborone",
6041 "Africa/Harare",
6042 "Africa/Johannesburg",
6043 "Africa/Kigali",
6044 "Africa/Lubumbashi",
6045 "Africa/Lusaka",
6046 "Africa/Maputo",
6047 "Africa/Maseru",
6048 "Africa/Mbabane",
6049 "Etc/GMT-2"
6050 ]
6051 },
6052 {
6053 "name": "FLE Standard Time",
6054 "abbr": "FDT",
6055 "offset": 3,
6056 "isdst": true,
6057 "text": "(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius",
6058 "utc": [
6059 "Europe/Helsinki",
6060 "Europe/Kiev",
6061 "Europe/Mariehamn",
6062 "Europe/Riga",
6063 "Europe/Sofia",
6064 "Europe/Tallinn",
6065 "Europe/Uzhgorod",
6066 "Europe/Vilnius",
6067 "Europe/Zaporozhye"
6068 ]
6069 },
6070 {
6071 "name": "Turkey Standard Time",
6072 "abbr": "TDT",
6073 "offset": 3,
6074 "isdst": true,
6075 "text": "(UTC+02:00) Istanbul",
6076 "utc": [
6077 "Europe/Istanbul"
6078 ]
6079 },
6080 {
6081 "name": "Israel Standard Time",
6082 "abbr": "JDT",
6083 "offset": 3,
6084 "isdst": true,
6085 "text": "(UTC+02:00) Jerusalem",
6086 "utc": [
6087 "Asia/Jerusalem"
6088 ]
6089 },
6090 {
6091 "name": "Libya Standard Time",
6092 "abbr": "LST",
6093 "offset": 2,
6094 "isdst": false,
6095 "text": "(UTC+02:00) Tripoli",
6096 "utc": [
6097 "Africa/Tripoli"
6098 ]
6099 },
6100 {
6101 "name": "Jordan Standard Time",
6102 "abbr": "JST",
6103 "offset": 3,
6104 "isdst": false,
6105 "text": "(UTC+03:00) Amman",
6106 "utc": [
6107 "Asia/Amman"
6108 ]
6109 },
6110 {
6111 "name": "Arabic Standard Time",
6112 "abbr": "AST",
6113 "offset": 3,
6114 "isdst": false,
6115 "text": "(UTC+03:00) Baghdad",
6116 "utc": [
6117 "Asia/Baghdad"
6118 ]
6119 },
6120 {
6121 "name": "Kaliningrad Standard Time",
6122 "abbr": "KST",
6123 "offset": 3,
6124 "isdst": false,
6125 "text": "(UTC+03:00) Kaliningrad, Minsk",
6126 "utc": [
6127 "Europe/Kaliningrad",
6128 "Europe/Minsk"
6129 ]
6130 },
6131 {
6132 "name": "Arab Standard Time",
6133 "abbr": "AST",
6134 "offset": 3,
6135 "isdst": false,
6136 "text": "(UTC+03:00) Kuwait, Riyadh",
6137 "utc": [
6138 "Asia/Aden",
6139 "Asia/Bahrain",
6140 "Asia/Kuwait",
6141 "Asia/Qatar",
6142 "Asia/Riyadh"
6143 ]
6144 },
6145 {
6146 "name": "E. Africa Standard Time",
6147 "abbr": "EAST",
6148 "offset": 3,
6149 "isdst": false,
6150 "text": "(UTC+03:00) Nairobi",
6151 "utc": [
6152 "Africa/Addis_Ababa",
6153 "Africa/Asmera",
6154 "Africa/Dar_es_Salaam",
6155 "Africa/Djibouti",
6156 "Africa/Juba",
6157 "Africa/Kampala",
6158 "Africa/Khartoum",
6159 "Africa/Mogadishu",
6160 "Africa/Nairobi",
6161 "Antarctica/Syowa",
6162 "Etc/GMT-3",
6163 "Indian/Antananarivo",
6164 "Indian/Comoro",
6165 "Indian/Mayotte"
6166 ]
6167 },
6168 {
6169 "name": "Iran Standard Time",
6170 "abbr": "IDT",
6171 "offset": 4.5,
6172 "isdst": true,
6173 "text": "(UTC+03:30) Tehran",
6174 "utc": [
6175 "Asia/Tehran"
6176 ]
6177 },
6178 {
6179 "name": "Arabian Standard Time",
6180 "abbr": "AST",
6181 "offset": 4,
6182 "isdst": false,
6183 "text": "(UTC+04:00) Abu Dhabi, Muscat",
6184 "utc": [
6185 "Asia/Dubai",
6186 "Asia/Muscat",
6187 "Etc/GMT-4"
6188 ]
6189 },
6190 {
6191 "name": "Azerbaijan Standard Time",
6192 "abbr": "ADT",
6193 "offset": 5,
6194 "isdst": true,
6195 "text": "(UTC+04:00) Baku",
6196 "utc": [
6197 "Asia/Baku"
6198 ]
6199 },
6200 {
6201 "name": "Russian Standard Time",
6202 "abbr": "RST",
6203 "offset": 4,
6204 "isdst": false,
6205 "text": "(UTC+04:00) Moscow, St. Petersburg, Volgograd",
6206 "utc": [
6207 "Europe/Moscow",
6208 "Europe/Samara",
6209 "Europe/Simferopol",
6210 "Europe/Volgograd"
6211 ]
6212 },
6213 {
6214 "name": "Mauritius Standard Time",
6215 "abbr": "MST",
6216 "offset": 4,
6217 "isdst": false,
6218 "text": "(UTC+04:00) Port Louis",
6219 "utc": [
6220 "Indian/Mahe",
6221 "Indian/Mauritius",
6222 "Indian/Reunion"
6223 ]
6224 },
6225 {
6226 "name": "Georgian Standard Time",
6227 "abbr": "GST",
6228 "offset": 4,
6229 "isdst": false,
6230 "text": "(UTC+04:00) Tbilisi",
6231 "utc": [
6232 "Asia/Tbilisi"
6233 ]
6234 },
6235 {
6236 "name": "Caucasus Standard Time",
6237 "abbr": "CST",
6238 "offset": 4,
6239 "isdst": false,
6240 "text": "(UTC+04:00) Yerevan",
6241 "utc": [
6242 "Asia/Yerevan"
6243 ]
6244 },
6245 {
6246 "name": "Afghanistan Standard Time",
6247 "abbr": "AST",
6248 "offset": 4.5,
6249 "isdst": false,
6250 "text": "(UTC+04:30) Kabul",
6251 "utc": [
6252 "Asia/Kabul"
6253 ]
6254 },
6255 {
6256 "name": "West Asia Standard Time",
6257 "abbr": "WAST",
6258 "offset": 5,
6259 "isdst": false,
6260 "text": "(UTC+05:00) Ashgabat, Tashkent",
6261 "utc": [
6262 "Antarctica/Mawson",
6263 "Asia/Aqtau",
6264 "Asia/Aqtobe",
6265 "Asia/Ashgabat",
6266 "Asia/Dushanbe",
6267 "Asia/Oral",
6268 "Asia/Samarkand",
6269 "Asia/Tashkent",
6270 "Etc/GMT-5",
6271 "Indian/Kerguelen",
6272 "Indian/Maldives"
6273 ]
6274 },
6275 {
6276 "name": "Pakistan Standard Time",
6277 "abbr": "PST",
6278 "offset": 5,
6279 "isdst": false,
6280 "text": "(UTC+05:00) Islamabad, Karachi",
6281 "utc": [
6282 "Asia/Karachi"
6283 ]
6284 },
6285 {
6286 "name": "India Standard Time",
6287 "abbr": "IST",
6288 "offset": 5.5,
6289 "isdst": false,
6290 "text": "(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi",
6291 "utc": [
6292 "Asia/Calcutta"
6293 ]
6294 },
6295 {
6296 "name": "Sri Lanka Standard Time",
6297 "abbr": "SLST",
6298 "offset": 5.5,
6299 "isdst": false,
6300 "text": "(UTC+05:30) Sri Jayawardenepura",
6301 "utc": [
6302 "Asia/Colombo"
6303 ]
6304 },
6305 {
6306 "name": "Nepal Standard Time",
6307 "abbr": "NST",
6308 "offset": 5.75,
6309 "isdst": false,
6310 "text": "(UTC+05:45) Kathmandu",
6311 "utc": [
6312 "Asia/Katmandu"
6313 ]
6314 },
6315 {
6316 "name": "Central Asia Standard Time",
6317 "abbr": "CAST",
6318 "offset": 6,
6319 "isdst": false,
6320 "text": "(UTC+06:00) Astana",
6321 "utc": [
6322 "Antarctica/Vostok",
6323 "Asia/Almaty",
6324 "Asia/Bishkek",
6325 "Asia/Qyzylorda",
6326 "Asia/Urumqi",
6327 "Etc/GMT-6",
6328 "Indian/Chagos"
6329 ]
6330 },
6331 {
6332 "name": "Bangladesh Standard Time",
6333 "abbr": "BST",
6334 "offset": 6,
6335 "isdst": false,
6336 "text": "(UTC+06:00) Dhaka",
6337 "utc": [
6338 "Asia/Dhaka",
6339 "Asia/Thimphu"
6340 ]
6341 },
6342 {
6343 "name": "Ekaterinburg Standard Time",
6344 "abbr": "EST",
6345 "offset": 6,
6346 "isdst": false,
6347 "text": "(UTC+06:00) Ekaterinburg",
6348 "utc": [
6349 "Asia/Yekaterinburg"
6350 ]
6351 },
6352 {
6353 "name": "Myanmar Standard Time",
6354 "abbr": "MST",
6355 "offset": 6.5,
6356 "isdst": false,
6357 "text": "(UTC+06:30) Yangon (Rangoon)",
6358 "utc": [
6359 "Asia/Rangoon",
6360 "Indian/Cocos"
6361 ]
6362 },
6363 {
6364 "name": "SE Asia Standard Time",
6365 "abbr": "SAST",
6366 "offset": 7,
6367 "isdst": false,
6368 "text": "(UTC+07:00) Bangkok, Hanoi, Jakarta",
6369 "utc": [
6370 "Antarctica/Davis",
6371 "Asia/Bangkok",
6372 "Asia/Hovd",
6373 "Asia/Jakarta",
6374 "Asia/Phnom_Penh",
6375 "Asia/Pontianak",
6376 "Asia/Saigon",
6377 "Asia/Vientiane",
6378 "Etc/GMT-7",
6379 "Indian/Christmas"
6380 ]
6381 },
6382 {
6383 "name": "N. Central Asia Standard Time",
6384 "abbr": "NCAST",
6385 "offset": 7,
6386 "isdst": false,
6387 "text": "(UTC+07:00) Novosibirsk",
6388 "utc": [
6389 "Asia/Novokuznetsk",
6390 "Asia/Novosibirsk",
6391 "Asia/Omsk"
6392 ]
6393 },
6394 {
6395 "name": "China Standard Time",
6396 "abbr": "CST",
6397 "offset": 8,
6398 "isdst": false,
6399 "text": "(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi",
6400 "utc": [
6401 "Asia/Hong_Kong",
6402 "Asia/Macau",
6403 "Asia/Shanghai"
6404 ]
6405 },
6406 {
6407 "name": "North Asia Standard Time",
6408 "abbr": "NAST",
6409 "offset": 8,
6410 "isdst": false,
6411 "text": "(UTC+08:00) Krasnoyarsk",
6412 "utc": [
6413 "Asia/Krasnoyarsk"
6414 ]
6415 },
6416 {
6417 "name": "Singapore Standard Time",
6418 "abbr": "MPST",
6419 "offset": 8,
6420 "isdst": false,
6421 "text": "(UTC+08:00) Kuala Lumpur, Singapore",
6422 "utc": [
6423 "Asia/Brunei",
6424 "Asia/Kuala_Lumpur",
6425 "Asia/Kuching",
6426 "Asia/Makassar",
6427 "Asia/Manila",
6428 "Asia/Singapore",
6429 "Etc/GMT-8"
6430 ]
6431 },
6432 {
6433 "name": "W. Australia Standard Time",
6434 "abbr": "WAST",
6435 "offset": 8,
6436 "isdst": false,
6437 "text": "(UTC+08:00) Perth",
6438 "utc": [
6439 "Antarctica/Casey",
6440 "Australia/Perth"
6441 ]
6442 },
6443 {
6444 "name": "Taipei Standard Time",
6445 "abbr": "TST",
6446 "offset": 8,
6447 "isdst": false,
6448 "text": "(UTC+08:00) Taipei",
6449 "utc": [
6450 "Asia/Taipei"
6451 ]
6452 },
6453 {
6454 "name": "Ulaanbaatar Standard Time",
6455 "abbr": "UST",
6456 "offset": 8,
6457 "isdst": false,
6458 "text": "(UTC+08:00) Ulaanbaatar",
6459 "utc": [
6460 "Asia/Choibalsan",
6461 "Asia/Ulaanbaatar"
6462 ]
6463 },
6464 {
6465 "name": "North Asia East Standard Time",
6466 "abbr": "NAEST",
6467 "offset": 9,
6468 "isdst": false,
6469 "text": "(UTC+09:00) Irkutsk",
6470 "utc": [
6471 "Asia/Irkutsk"
6472 ]
6473 },
6474 {
6475 "name": "Tokyo Standard Time",
6476 "abbr": "TST",
6477 "offset": 9,
6478 "isdst": false,
6479 "text": "(UTC+09:00) Osaka, Sapporo, Tokyo",
6480 "utc": [
6481 "Asia/Dili",
6482 "Asia/Jayapura",
6483 "Asia/Tokyo",
6484 "Etc/GMT-9",
6485 "Pacific/Palau"
6486 ]
6487 },
6488 {
6489 "name": "Korea Standard Time",
6490 "abbr": "KST",
6491 "offset": 9,
6492 "isdst": false,
6493 "text": "(UTC+09:00) Seoul",
6494 "utc": [
6495 "Asia/Pyongyang",
6496 "Asia/Seoul"
6497 ]
6498 },
6499 {
6500 "name": "Cen. Australia Standard Time",
6501 "abbr": "CAST",
6502 "offset": 9.5,
6503 "isdst": false,
6504 "text": "(UTC+09:30) Adelaide",
6505 "utc": [
6506 "Australia/Adelaide",
6507 "Australia/Broken_Hill"
6508 ]
6509 },
6510 {
6511 "name": "AUS Central Standard Time",
6512 "abbr": "ACST",
6513 "offset": 9.5,
6514 "isdst": false,
6515 "text": "(UTC+09:30) Darwin",
6516 "utc": [
6517 "Australia/Darwin"
6518 ]
6519 },
6520 {
6521 "name": "E. Australia Standard Time",
6522 "abbr": "EAST",
6523 "offset": 10,
6524 "isdst": false,
6525 "text": "(UTC+10:00) Brisbane",
6526 "utc": [
6527 "Australia/Brisbane",
6528 "Australia/Lindeman"
6529 ]
6530 },
6531 {
6532 "name": "AUS Eastern Standard Time",
6533 "abbr": "AEST",
6534 "offset": 10,
6535 "isdst": false,
6536 "text": "(UTC+10:00) Canberra, Melbourne, Sydney",
6537 "utc": [
6538 "Australia/Melbourne",
6539 "Australia/Sydney"
6540 ]
6541 },
6542 {
6543 "name": "West Pacific Standard Time",
6544 "abbr": "WPST",
6545 "offset": 10,
6546 "isdst": false,
6547 "text": "(UTC+10:00) Guam, Port Moresby",
6548 "utc": [
6549 "Antarctica/DumontDUrville",
6550 "Etc/GMT-10",
6551 "Pacific/Guam",
6552 "Pacific/Port_Moresby",
6553 "Pacific/Saipan",
6554 "Pacific/Truk"
6555 ]
6556 },
6557 {
6558 "name": "Tasmania Standard Time",
6559 "abbr": "TST",
6560 "offset": 10,
6561 "isdst": false,
6562 "text": "(UTC+10:00) Hobart",
6563 "utc": [
6564 "Australia/Currie",
6565 "Australia/Hobart"
6566 ]
6567 },
6568 {
6569 "name": "Yakutsk Standard Time",
6570 "abbr": "YST",
6571 "offset": 10,
6572 "isdst": false,
6573 "text": "(UTC+10:00) Yakutsk",
6574 "utc": [
6575 "Asia/Chita",
6576 "Asia/Khandyga",
6577 "Asia/Yakutsk"
6578 ]
6579 },
6580 {
6581 "name": "Central Pacific Standard Time",
6582 "abbr": "CPST",
6583 "offset": 11,
6584 "isdst": false,
6585 "text": "(UTC+11:00) Solomon Is., New Caledonia",
6586 "utc": [
6587 "Antarctica/Macquarie",
6588 "Etc/GMT-11",
6589 "Pacific/Efate",
6590 "Pacific/Guadalcanal",
6591 "Pacific/Kosrae",
6592 "Pacific/Noumea",
6593 "Pacific/Ponape"
6594 ]
6595 },
6596 {
6597 "name": "Vladivostok Standard Time",
6598 "abbr": "VST",
6599 "offset": 11,
6600 "isdst": false,
6601 "text": "(UTC+11:00) Vladivostok",
6602 "utc": [
6603 "Asia/Sakhalin",
6604 "Asia/Ust-Nera",
6605 "Asia/Vladivostok"
6606 ]
6607 },
6608 {
6609 "name": "New Zealand Standard Time",
6610 "abbr": "NZST",
6611 "offset": 12,
6612 "isdst": false,
6613 "text": "(UTC+12:00) Auckland, Wellington",
6614 "utc": [
6615 "Antarctica/McMurdo",
6616 "Pacific/Auckland"
6617 ]
6618 },
6619 {
6620 "name": "UTC+12",
6621 "abbr": "U",
6622 "offset": 12,
6623 "isdst": false,
6624 "text": "(UTC+12:00) Coordinated Universal Time+12",
6625 "utc": [
6626 "Etc/GMT-12",
6627 "Pacific/Funafuti",
6628 "Pacific/Kwajalein",
6629 "Pacific/Majuro",
6630 "Pacific/Nauru",
6631 "Pacific/Tarawa",
6632 "Pacific/Wake",
6633 "Pacific/Wallis"
6634 ]
6635 },
6636 {
6637 "name": "Fiji Standard Time",
6638 "abbr": "FST",
6639 "offset": 12,
6640 "isdst": false,
6641 "text": "(UTC+12:00) Fiji",
6642 "utc": [
6643 "Pacific/Fiji"
6644 ]
6645 },
6646 {
6647 "name": "Magadan Standard Time",
6648 "abbr": "MST",
6649 "offset": 12,
6650 "isdst": false,
6651 "text": "(UTC+12:00) Magadan",
6652 "utc": [
6653 "Asia/Anadyr",
6654 "Asia/Kamchatka",
6655 "Asia/Magadan",
6656 "Asia/Srednekolymsk"
6657 ]
6658 },
6659 {
6660 "name": "Kamchatka Standard Time",
6661 "abbr": "KDT",
6662 "offset": 13,
6663 "isdst": true,
6664 "text": "(UTC+12:00) Petropavlovsk-Kamchatsky - Old"
6665 },
6666 {
6667 "name": "Tonga Standard Time",
6668 "abbr": "TST",
6669 "offset": 13,
6670 "isdst": false,
6671 "text": "(UTC+13:00) Nuku'alofa",
6672 "utc": [
6673 "Etc/GMT-13",
6674 "Pacific/Enderbury",
6675 "Pacific/Fakaofo",
6676 "Pacific/Tongatapu"
6677 ]
6678 },
6679 {
6680 "name": "Samoa Standard Time",
6681 "abbr": "SST",
6682 "offset": 13,
6683 "isdst": false,
6684 "text": "(UTC+13:00) Samoa",
6685 "utc": [
6686 "Pacific/Apia"
6687 ]
6688 }
6689 ],
6690 //List source: http://answers.google.com/answers/threadview/id/589312.html
6691 profession: [
6692 "Airline Pilot",
6693 "Academic Team",
6694 "Accountant",
6695 "Account Executive",
6696 "Actor",
6697 "Actuary",
6698 "Acquisition Analyst",
6699 "Administrative Asst.",
6700 "Administrative Analyst",
6701 "Administrator",
6702 "Advertising Director",
6703 "Aerospace Engineer",
6704 "Agent",
6705 "Agricultural Inspector",
6706 "Agricultural Scientist",
6707 "Air Traffic Controller",
6708 "Animal Trainer",
6709 "Anthropologist",
6710 "Appraiser",
6711 "Architect",
6712 "Art Director",
6713 "Artist",
6714 "Astronomer",
6715 "Athletic Coach",
6716 "Auditor",
6717 "Author",
6718 "Baker",
6719 "Banker",
6720 "Bankruptcy Attorney",
6721 "Benefits Manager",
6722 "Biologist",
6723 "Bio-feedback Specialist",
6724 "Biomedical Engineer",
6725 "Biotechnical Researcher",
6726 "Broadcaster",
6727 "Broker",
6728 "Building Manager",
6729 "Building Contractor",
6730 "Building Inspector",
6731 "Business Analyst",
6732 "Business Planner",
6733 "Business Manager",
6734 "Buyer",
6735 "Call Center Manager",
6736 "Career Counselor",
6737 "Cash Manager",
6738 "Ceramic Engineer",
6739 "Chief Executive Officer",
6740 "Chief Operation Officer",
6741 "Chef",
6742 "Chemical Engineer",
6743 "Chemist",
6744 "Child Care Manager",
6745 "Chief Medical Officer",
6746 "Chiropractor",
6747 "Cinematographer",
6748 "City Housing Manager",
6749 "City Manager",
6750 "Civil Engineer",
6751 "Claims Manager",
6752 "Clinical Research Assistant",
6753 "Collections Manager",
6754 "Compliance Manager",
6755 "Comptroller",
6756 "Computer Manager",
6757 "Commercial Artist",
6758 "Communications Affairs Director",
6759 "Communications Director",
6760 "Communications Engineer",
6761 "Compensation Analyst",
6762 "Computer Programmer",
6763 "Computer Ops. Manager",
6764 "Computer Engineer",
6765 "Computer Operator",
6766 "Computer Graphics Specialist",
6767 "Construction Engineer",
6768 "Construction Manager",
6769 "Consultant",
6770 "Consumer Relations Manager",
6771 "Contract Administrator",
6772 "Copyright Attorney",
6773 "Copywriter",
6774 "Corporate Planner",
6775 "Corrections Officer",
6776 "Cosmetologist",
6777 "Credit Analyst",
6778 "Cruise Director",
6779 "Chief Information Officer",
6780 "Chief Technology Officer",
6781 "Customer Service Manager",
6782 "Cryptologist",
6783 "Dancer",
6784 "Data Security Manager",
6785 "Database Manager",
6786 "Day Care Instructor",
6787 "Dentist",
6788 "Designer",
6789 "Design Engineer",
6790 "Desktop Publisher",
6791 "Developer",
6792 "Development Officer",
6793 "Diamond Merchant",
6794 "Dietitian",
6795 "Direct Marketer",
6796 "Director",
6797 "Distribution Manager",
6798 "Diversity Manager",
6799 "Economist",
6800 "EEO Compliance Manager",
6801 "Editor",
6802 "Education Adminator",
6803 "Electrical Engineer",
6804 "Electro Optical Engineer",
6805 "Electronics Engineer",
6806 "Embassy Management",
6807 "Employment Agent",
6808 "Engineer Technician",
6809 "Entrepreneur",
6810 "Environmental Analyst",
6811 "Environmental Attorney",
6812 "Environmental Engineer",
6813 "Environmental Specialist",
6814 "Escrow Officer",
6815 "Estimator",
6816 "Executive Assistant",
6817 "Executive Director",
6818 "Executive Recruiter",
6819 "Facilities Manager",
6820 "Family Counselor",
6821 "Fashion Events Manager",
6822 "Fashion Merchandiser",
6823 "Fast Food Manager",
6824 "Film Producer",
6825 "Film Production Assistant",
6826 "Financial Analyst",
6827 "Financial Planner",
6828 "Financier",
6829 "Fine Artist",
6830 "Wildlife Specialist",
6831 "Fitness Consultant",
6832 "Flight Attendant",
6833 "Flight Engineer",
6834 "Floral Designer",
6835 "Food & Beverage Director",
6836 "Food Service Manager",
6837 "Forestry Technician",
6838 "Franchise Management",
6839 "Franchise Sales",
6840 "Fraud Investigator",
6841 "Freelance Writer",
6842 "Fund Raiser",
6843 "General Manager",
6844 "Geologist",
6845 "General Counsel",
6846 "Geriatric Specialist",
6847 "Gerontologist",
6848 "Glamour Photographer",
6849 "Golf Club Manager",
6850 "Gourmet Chef",
6851 "Graphic Designer",
6852 "Grounds Keeper",
6853 "Hazardous Waste Manager",
6854 "Health Care Manager",
6855 "Health Therapist",
6856 "Health Service Administrator",
6857 "Hearing Officer",
6858 "Home Economist",
6859 "Horticulturist",
6860 "Hospital Administrator",
6861 "Hotel Manager",
6862 "Human Resources Manager",
6863 "Importer",
6864 "Industrial Designer",
6865 "Industrial Engineer",
6866 "Information Director",
6867 "Inside Sales",
6868 "Insurance Adjuster",
6869 "Interior Decorator",
6870 "Internal Controls Director",
6871 "International Acct.",
6872 "International Courier",
6873 "International Lawyer",
6874 "Interpreter",
6875 "Investigator",
6876 "Investment Banker",
6877 "Investment Manager",
6878 "IT Architect",
6879 "IT Project Manager",
6880 "IT Systems Analyst",
6881 "Jeweler",
6882 "Joint Venture Manager",
6883 "Journalist",
6884 "Labor Negotiator",
6885 "Labor Organizer",
6886 "Labor Relations Manager",
6887 "Lab Services Director",
6888 "Lab Technician",
6889 "Land Developer",
6890 "Landscape Architect",
6891 "Law Enforcement Officer",
6892 "Lawyer",
6893 "Lead Software Engineer",
6894 "Lead Software Test Engineer",
6895 "Leasing Manager",
6896 "Legal Secretary",
6897 "Library Manager",
6898 "Litigation Attorney",
6899 "Loan Officer",
6900 "Lobbyist",
6901 "Logistics Manager",
6902 "Maintenance Manager",
6903 "Management Consultant",
6904 "Managed Care Director",
6905 "Managing Partner",
6906 "Manufacturing Director",
6907 "Manpower Planner",
6908 "Marine Biologist",
6909 "Market Res. Analyst",
6910 "Marketing Director",
6911 "Materials Manager",
6912 "Mathematician",
6913 "Membership Chairman",
6914 "Mechanic",
6915 "Mechanical Engineer",
6916 "Media Buyer",
6917 "Medical Investor",
6918 "Medical Secretary",
6919 "Medical Technician",
6920 "Mental Health Counselor",
6921 "Merchandiser",
6922 "Metallurgical Engineering",
6923 "Meteorologist",
6924 "Microbiologist",
6925 "MIS Manager",
6926 "Motion Picture Director",
6927 "Multimedia Director",
6928 "Musician",
6929 "Network Administrator",
6930 "Network Specialist",
6931 "Network Operator",
6932 "New Product Manager",
6933 "Novelist",
6934 "Nuclear Engineer",
6935 "Nuclear Specialist",
6936 "Nutritionist",
6937 "Nursing Administrator",
6938 "Occupational Therapist",
6939 "Oceanographer",
6940 "Office Manager",
6941 "Operations Manager",
6942 "Operations Research Director",
6943 "Optical Technician",
6944 "Optometrist",
6945 "Organizational Development Manager",
6946 "Outplacement Specialist",
6947 "Paralegal",
6948 "Park Ranger",
6949 "Patent Attorney",
6950 "Payroll Specialist",
6951 "Personnel Specialist",
6952 "Petroleum Engineer",
6953 "Pharmacist",
6954 "Photographer",
6955 "Physical Therapist",
6956 "Physician",
6957 "Physician Assistant",
6958 "Physicist",
6959 "Planning Director",
6960 "Podiatrist",
6961 "Political Analyst",
6962 "Political Scientist",
6963 "Politician",
6964 "Portfolio Manager",
6965 "Preschool Management",
6966 "Preschool Teacher",
6967 "Principal",
6968 "Private Banker",
6969 "Private Investigator",
6970 "Probation Officer",
6971 "Process Engineer",
6972 "Producer",
6973 "Product Manager",
6974 "Product Engineer",
6975 "Production Engineer",
6976 "Production Planner",
6977 "Professional Athlete",
6978 "Professional Coach",
6979 "Professor",
6980 "Project Engineer",
6981 "Project Manager",
6982 "Program Manager",
6983 "Property Manager",
6984 "Public Administrator",
6985 "Public Safety Director",
6986 "PR Specialist",
6987 "Publisher",
6988 "Purchasing Agent",
6989 "Publishing Director",
6990 "Quality Assurance Specialist",
6991 "Quality Control Engineer",
6992 "Quality Control Inspector",
6993 "Radiology Manager",
6994 "Railroad Engineer",
6995 "Real Estate Broker",
6996 "Recreational Director",
6997 "Recruiter",
6998 "Redevelopment Specialist",
6999 "Regulatory Affairs Manager",
7000 "Registered Nurse",
7001 "Rehabilitation Counselor",
7002 "Relocation Manager",
7003 "Reporter",
7004 "Research Specialist",
7005 "Restaurant Manager",
7006 "Retail Store Manager",
7007 "Risk Analyst",
7008 "Safety Engineer",
7009 "Sales Engineer",
7010 "Sales Trainer",
7011 "Sales Promotion Manager",
7012 "Sales Representative",
7013 "Sales Manager",
7014 "Service Manager",
7015 "Sanitation Engineer",
7016 "Scientific Programmer",
7017 "Scientific Writer",
7018 "Securities Analyst",
7019 "Security Consultant",
7020 "Security Director",
7021 "Seminar Presenter",
7022 "Ship's Officer",
7023 "Singer",
7024 "Social Director",
7025 "Social Program Planner",
7026 "Social Research",
7027 "Social Scientist",
7028 "Social Worker",
7029 "Sociologist",
7030 "Software Developer",
7031 "Software Engineer",
7032 "Software Test Engineer",
7033 "Soil Scientist",
7034 "Special Events Manager",
7035 "Special Education Teacher",
7036 "Special Projects Director",
7037 "Speech Pathologist",
7038 "Speech Writer",
7039 "Sports Event Manager",
7040 "Statistician",
7041 "Store Manager",
7042 "Strategic Alliance Director",
7043 "Strategic Planning Director",
7044 "Stress Reduction Specialist",
7045 "Stockbroker",
7046 "Surveyor",
7047 "Structural Engineer",
7048 "Superintendent",
7049 "Supply Chain Director",
7050 "System Engineer",
7051 "Systems Analyst",
7052 "Systems Programmer",
7053 "System Administrator",
7054 "Tax Specialist",
7055 "Teacher",
7056 "Technical Support Specialist",
7057 "Technical Illustrator",
7058 "Technical Writer",
7059 "Technology Director",
7060 "Telecom Analyst",
7061 "Telemarketer",
7062 "Theatrical Director",
7063 "Title Examiner",
7064 "Tour Escort",
7065 "Tour Guide Director",
7066 "Traffic Manager",
7067 "Trainer Translator",
7068 "Transportation Manager",
7069 "Travel Agent",
7070 "Treasurer",
7071 "TV Programmer",
7072 "Underwriter",
7073 "Union Representative",
7074 "University Administrator",
7075 "University Dean",
7076 "Urban Planner",
7077 "Veterinarian",
7078 "Vendor Relations Director",
7079 "Viticulturist",
7080 "Warehouse Manager"
7081 ],
7082 animals : {
7083 //list of ocean animals comes from https://owlcation.com/stem/list-of-ocean-animals
7084 "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"],
7085 //list of desert, grassland, and forest animals comes from http://www.skyenimals.com/
7086 "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"],
7087 "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"],
7088 "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"],
7089 //list of farm animals comes from https://www.buzzle.com/articles/farm-animals-list.html
7090 "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"],
7091 //list of pet animals comes from https://www.dogbreedinfo.com/pets/pet.htm
7092 "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"],
7093 //list of zoo animals comes from https://bronxzoo.com/animals
7094 "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"]
7095 },
7096 primes: [
7097 // 1230 first primes, i.e. all primes up to the first one greater than 10000, inclusive.
7098 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
7099 ],
7100 emotions: [
7101 "love",
7102 "joy",
7103 "surprise",
7104 "anger",
7105 "sadness",
7106 "fear"
7107 ],
7108 };
7109
7110 var o_hasOwnProperty = Object.prototype.hasOwnProperty;
7111 var o_keys = (Object.keys || function(obj) {
7112 var result = [];
7113 for (var key in obj) {
7114 if (o_hasOwnProperty.call(obj, key)) {
7115 result.push(key);
7116 }
7117 }
7118
7119 return result;
7120 });
7121
7122
7123 function _copyObject(source, target) {
7124 var keys = o_keys(source);
7125 var key;
7126
7127 for (var i = 0, l = keys.length; i < l; i++) {
7128 key = keys[i];
7129 target[key] = source[key] || target[key];
7130 }
7131 }
7132
7133 function _copyArray(source, target) {
7134 for (var i = 0, l = source.length; i < l; i++) {
7135 target[i] = source[i];
7136 }
7137 }
7138
7139 function copyObject(source, _target) {
7140 var isArray = Array.isArray(source);
7141 var target = _target || (isArray ? new Array(source.length) : {});
7142
7143 if (isArray) {
7144 _copyArray(source, target);
7145 } else {
7146 _copyObject(source, target);
7147 }
7148
7149 return target;
7150 }
7151
7152 /** Get the data based on key**/
7153 Chance.prototype.get = function (name) {
7154 return copyObject(data[name]);
7155 };
7156
7157 // Mac Address
7158 Chance.prototype.mac_address = function(options){
7159 // typically mac addresses are separated by ":"
7160 // however they can also be separated by "-"
7161 // the network variant uses a dot every fourth byte
7162
7163 options = initOptions(options);
7164 if(!options.separator) {
7165 options.separator = options.networkVersion ? "." : ":";
7166 }
7167
7168 var mac_pool="ABCDEF1234567890",
7169 mac = "";
7170 if(!options.networkVersion) {
7171 mac = this.n(this.string, 6, { pool: mac_pool, length:2 }).join(options.separator);
7172 } else {
7173 mac = this.n(this.string, 3, { pool: mac_pool, length:4 }).join(options.separator);
7174 }
7175
7176 return mac;
7177 };
7178
7179 Chance.prototype.normal = function (options) {
7180 options = initOptions(options, {mean : 0, dev : 1, pool : []});
7181
7182 testRange(
7183 options.pool.constructor !== Array,
7184 "Chance: The pool option must be a valid array."
7185 );
7186 testRange(
7187 typeof options.mean !== 'number',
7188 "Chance: Mean (mean) must be a number"
7189 );
7190 testRange(
7191 typeof options.dev !== 'number',
7192 "Chance: Standard deviation (dev) must be a number"
7193 );
7194
7195 // If a pool has been passed, then we are returning an item from that pool,
7196 // using the normal distribution settings that were passed in
7197 if (options.pool.length > 0) {
7198 return this.normal_pool(options);
7199 }
7200
7201 // The Marsaglia Polar method
7202 var s, u, v, norm,
7203 mean = options.mean,
7204 dev = options.dev;
7205
7206 do {
7207 // U and V are from the uniform distribution on (-1, 1)
7208 u = this.random() * 2 - 1;
7209 v = this.random() * 2 - 1;
7210
7211 s = u * u + v * v;
7212 } while (s >= 1);
7213
7214 // Compute the standard normal variate
7215 norm = u * Math.sqrt(-2 * Math.log(s) / s);
7216
7217 // Shape and scale
7218 return dev * norm + mean;
7219 };
7220
7221 Chance.prototype.normal_pool = function(options) {
7222 var performanceCounter = 0;
7223 do {
7224 var idx = Math.round(this.normal({ mean: options.mean, dev: options.dev }));
7225 if (idx < options.pool.length && idx >= 0) {
7226 return options.pool[idx];
7227 } else {
7228 performanceCounter++;
7229 }
7230 } while(performanceCounter < 100);
7231
7232 throw new RangeError("Chance: Your pool is too small for the given mean and standard deviation. Please adjust.");
7233 };
7234
7235 Chance.prototype.radio = function (options) {
7236 // Initial Letter (Typically Designated by Side of Mississippi River)
7237 options = initOptions(options, {side : "?"});
7238 var fl = "";
7239 switch (options.side.toLowerCase()) {
7240 case "east":
7241 case "e":
7242 fl = "W";
7243 break;
7244 case "west":
7245 case "w":
7246 fl = "K";
7247 break;
7248 default:
7249 fl = this.character({pool: "KW"});
7250 break;
7251 }
7252
7253 return fl + this.character({alpha: true, casing: "upper"}) +
7254 this.character({alpha: true, casing: "upper"}) +
7255 this.character({alpha: true, casing: "upper"});
7256 };
7257
7258 // Set the data as key and data or the data map
7259 Chance.prototype.set = function (name, values) {
7260 if (typeof name === "string") {
7261 data[name] = values;
7262 } else {
7263 data = copyObject(name, data);
7264 }
7265 };
7266
7267 Chance.prototype.tv = function (options) {
7268 return this.radio(options);
7269 };
7270
7271 // ID number for Brazil companies
7272 Chance.prototype.cnpj = function () {
7273 var n = this.n(this.natural, 8, { max: 9 });
7274 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;
7275 d1 = 11 - (d1 % 11);
7276 if (d1>=10){
7277 d1 = 0;
7278 }
7279 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;
7280 d2 = 11 - (d2 % 11);
7281 if (d2>=10){
7282 d2 = 0;
7283 }
7284 return ''+n[0]+n[1]+'.'+n[2]+n[3]+n[4]+'.'+n[5]+n[6]+n[7]+'/0001-'+d1+d2;
7285 };
7286
7287 Chance.prototype.emotion = function () {
7288 return this.pick(this.get("emotions"));
7289 };
7290
7291 // -- End Miscellaneous --
7292
7293 Chance.prototype.mersenne_twister = function (seed) {
7294 return new MersenneTwister(seed);
7295 };
7296
7297 Chance.prototype.blueimp_md5 = function () {
7298 return new BlueImpMD5();
7299 };
7300
7301 // Mersenne Twister from https://gist.github.com/banksean/300494
7302 /*
7303 A C-program for MT19937, with initialization improved 2002/1/26.
7304 Coded by Takuji Nishimura and Makoto Matsumoto.
7305
7306 Before using, initialize the state by using init_genrand(seed)
7307 or init_by_array(init_key, key_length).
7308
7309 Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
7310 All rights reserved.
7311
7312 Redistribution and use in source and binary forms, with or without
7313 modification, are permitted provided that the following conditions
7314 are met:
7315
7316 1. Redistributions of source code must retain the above copyright
7317 notice, this list of conditions and the following disclaimer.
7318
7319 2. Redistributions in binary form must reproduce the above copyright
7320 notice, this list of conditions and the following disclaimer in the
7321 documentation and/or other materials provided with the distribution.
7322
7323 3. The names of its contributors may not be used to endorse or promote
7324 products derived from this software without specific prior written
7325 permission.
7326
7327 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
7328 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7329 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
7330 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
7331 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
7332 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
7333 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
7334 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
7335 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
7336 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
7337 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
7338
7339
7340 Any feedback is very welcome.
7341 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
7342 email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
7343 */
7344 var MersenneTwister = function (seed) {
7345 if (seed === undefined) {
7346 // kept random number same size as time used previously to ensure no unexpected results downstream
7347 seed = Math.floor(Math.random()*Math.pow(10,13));
7348 }
7349 /* Period parameters */
7350 this.N = 624;
7351 this.M = 397;
7352 this.MATRIX_A = 0x9908b0df; /* constant vector a */
7353 this.UPPER_MASK = 0x80000000; /* most significant w-r bits */
7354 this.LOWER_MASK = 0x7fffffff; /* least significant r bits */
7355
7356 this.mt = new Array(this.N); /* the array for the state vector */
7357 this.mti = this.N + 1; /* mti==N + 1 means mt[N] is not initialized */
7358
7359 this.init_genrand(seed);
7360 };
7361
7362 /* initializes mt[N] with a seed */
7363 MersenneTwister.prototype.init_genrand = function (s) {
7364 this.mt[0] = s >>> 0;
7365 for (this.mti = 1; this.mti < this.N; this.mti++) {
7366 s = this.mt[this.mti - 1] ^ (this.mt[this.mti - 1] >>> 30);
7367 this.mt[this.mti] = (((((s & 0xffff0000) >>> 16) * 1812433253) << 16) + (s & 0x0000ffff) * 1812433253) + this.mti;
7368 /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
7369 /* In the previous versions, MSBs of the seed affect */
7370 /* only MSBs of the array mt[]. */
7371 /* 2002/01/09 modified by Makoto Matsumoto */
7372 this.mt[this.mti] >>>= 0;
7373 /* for >32 bit machines */
7374 }
7375 };
7376
7377 /* initialize by an array with array-length */
7378 /* init_key is the array for initializing keys */
7379 /* key_length is its length */
7380 /* slight change for C++, 2004/2/26 */
7381 MersenneTwister.prototype.init_by_array = function (init_key, key_length) {
7382 var i = 1, j = 0, k, s;
7383 this.init_genrand(19650218);
7384 k = (this.N > key_length ? this.N : key_length);
7385 for (; k; k--) {
7386 s = this.mt[i - 1] ^ (this.mt[i - 1] >>> 30);
7387 this.mt[i] = (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1664525) << 16) + ((s & 0x0000ffff) * 1664525))) + init_key[j] + j; /* non linear */
7388 this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */
7389 i++;
7390 j++;
7391 if (i >= this.N) { this.mt[0] = this.mt[this.N - 1]; i = 1; }
7392 if (j >= key_length) { j = 0; }
7393 }
7394 for (k = this.N - 1; k; k--) {
7395 s = this.mt[i - 1] ^ (this.mt[i - 1] >>> 30);
7396 this.mt[i] = (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1566083941) << 16) + (s & 0x0000ffff) * 1566083941)) - i; /* non linear */
7397 this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */
7398 i++;
7399 if (i >= this.N) { this.mt[0] = this.mt[this.N - 1]; i = 1; }
7400 }
7401
7402 this.mt[0] = 0x80000000; /* MSB is 1; assuring non-zero initial array */
7403 };
7404
7405 /* generates a random number on [0,0xffffffff]-interval */
7406 MersenneTwister.prototype.genrand_int32 = function () {
7407 var y;
7408 var mag01 = new Array(0x0, this.MATRIX_A);
7409 /* mag01[x] = x * MATRIX_A for x=0,1 */
7410
7411 if (this.mti >= this.N) { /* generate N words at one time */
7412 var kk;
7413
7414 if (this.mti === this.N + 1) { /* if init_genrand() has not been called, */
7415 this.init_genrand(5489); /* a default initial seed is used */
7416 }
7417 for (kk = 0; kk < this.N - this.M; kk++) {
7418 y = (this.mt[kk]&this.UPPER_MASK)|(this.mt[kk + 1]&this.LOWER_MASK);
7419 this.mt[kk] = this.mt[kk + this.M] ^ (y >>> 1) ^ mag01[y & 0x1];
7420 }
7421 for (;kk < this.N - 1; kk++) {
7422 y = (this.mt[kk]&this.UPPER_MASK)|(this.mt[kk + 1]&this.LOWER_MASK);
7423 this.mt[kk] = this.mt[kk + (this.M - this.N)] ^ (y >>> 1) ^ mag01[y & 0x1];
7424 }
7425 y = (this.mt[this.N - 1]&this.UPPER_MASK)|(this.mt[0]&this.LOWER_MASK);
7426 this.mt[this.N - 1] = this.mt[this.M - 1] ^ (y >>> 1) ^ mag01[y & 0x1];
7427
7428 this.mti = 0;
7429 }
7430
7431 y = this.mt[this.mti++];
7432
7433 /* Tempering */
7434 y ^= (y >>> 11);
7435 y ^= (y << 7) & 0x9d2c5680;
7436 y ^= (y << 15) & 0xefc60000;
7437 y ^= (y >>> 18);
7438
7439 return y >>> 0;
7440 };
7441
7442 /* generates a random number on [0,0x7fffffff]-interval */
7443 MersenneTwister.prototype.genrand_int31 = function () {
7444 return (this.genrand_int32() >>> 1);
7445 };
7446
7447 /* generates a random number on [0,1]-real-interval */
7448 MersenneTwister.prototype.genrand_real1 = function () {
7449 return this.genrand_int32() * (1.0 / 4294967295.0);
7450 /* divided by 2^32-1 */
7451 };
7452
7453 /* generates a random number on [0,1)-real-interval */
7454 MersenneTwister.prototype.random = function () {
7455 return this.genrand_int32() * (1.0 / 4294967296.0);
7456 /* divided by 2^32 */
7457 };
7458
7459 /* generates a random number on (0,1)-real-interval */
7460 MersenneTwister.prototype.genrand_real3 = function () {
7461 return (this.genrand_int32() + 0.5) * (1.0 / 4294967296.0);
7462 /* divided by 2^32 */
7463 };
7464
7465 /* generates a random number on [0,1) with 53-bit resolution*/
7466 MersenneTwister.prototype.genrand_res53 = function () {
7467 var a = this.genrand_int32()>>>5, b = this.genrand_int32()>>>6;
7468 return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0);
7469 };
7470
7471 // BlueImp MD5 hashing algorithm from https://github.com/blueimp/JavaScript-MD5
7472 var BlueImpMD5 = function () {};
7473
7474 BlueImpMD5.prototype.VERSION = '1.0.1';
7475
7476 /*
7477 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
7478 * to work around bugs in some JS interpreters.
7479 */
7480 BlueImpMD5.prototype.safe_add = function safe_add(x, y) {
7481 var lsw = (x & 0xFFFF) + (y & 0xFFFF),
7482 msw = (x >> 16) + (y >> 16) + (lsw >> 16);
7483 return (msw << 16) | (lsw & 0xFFFF);
7484 };
7485
7486 /*
7487 * Bitwise rotate a 32-bit number to the left.
7488 */
7489 BlueImpMD5.prototype.bit_roll = function (num, cnt) {
7490 return (num << cnt) | (num >>> (32 - cnt));
7491 };
7492
7493 /*
7494 * These functions implement the five basic operations the algorithm uses.
7495 */
7496 BlueImpMD5.prototype.md5_cmn = function (q, a, b, x, s, t) {
7497 return this.safe_add(this.bit_roll(this.safe_add(this.safe_add(a, q), this.safe_add(x, t)), s), b);
7498 };
7499 BlueImpMD5.prototype.md5_ff = function (a, b, c, d, x, s, t) {
7500 return this.md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
7501 };
7502 BlueImpMD5.prototype.md5_gg = function (a, b, c, d, x, s, t) {
7503 return this.md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
7504 };
7505 BlueImpMD5.prototype.md5_hh = function (a, b, c, d, x, s, t) {
7506 return this.md5_cmn(b ^ c ^ d, a, b, x, s, t);
7507 };
7508 BlueImpMD5.prototype.md5_ii = function (a, b, c, d, x, s, t) {
7509 return this.md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
7510 };
7511
7512 /*
7513 * Calculate the MD5 of an array of little-endian words, and a bit length.
7514 */
7515 BlueImpMD5.prototype.binl_md5 = function (x, len) {
7516 /* append padding */
7517 x[len >> 5] |= 0x80 << (len % 32);
7518 x[(((len + 64) >>> 9) << 4) + 14] = len;
7519
7520 var i, olda, oldb, oldc, oldd,
7521 a = 1732584193,
7522 b = -271733879,
7523 c = -1732584194,
7524 d = 271733878;
7525
7526 for (i = 0; i < x.length; i += 16) {
7527 olda = a;
7528 oldb = b;
7529 oldc = c;
7530 oldd = d;
7531
7532 a = this.md5_ff(a, b, c, d, x[i], 7, -680876936);
7533 d = this.md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
7534 c = this.md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
7535 b = this.md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
7536 a = this.md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
7537 d = this.md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
7538 c = this.md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
7539 b = this.md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
7540 a = this.md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
7541 d = this.md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
7542 c = this.md5_ff(c, d, a, b, x[i + 10], 17, -42063);
7543 b = this.md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
7544 a = this.md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
7545 d = this.md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
7546 c = this.md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
7547 b = this.md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
7548
7549 a = this.md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
7550 d = this.md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
7551 c = this.md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
7552 b = this.md5_gg(b, c, d, a, x[i], 20, -373897302);
7553 a = this.md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
7554 d = this.md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
7555 c = this.md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
7556 b = this.md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
7557 a = this.md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
7558 d = this.md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
7559 c = this.md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
7560 b = this.md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
7561 a = this.md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
7562 d = this.md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
7563 c = this.md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
7564 b = this.md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
7565
7566 a = this.md5_hh(a, b, c, d, x[i + 5], 4, -378558);
7567 d = this.md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
7568 c = this.md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
7569 b = this.md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
7570 a = this.md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
7571 d = this.md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
7572 c = this.md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
7573 b = this.md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
7574 a = this.md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
7575 d = this.md5_hh(d, a, b, c, x[i], 11, -358537222);
7576 c = this.md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
7577 b = this.md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
7578 a = this.md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
7579 d = this.md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
7580 c = this.md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
7581 b = this.md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
7582
7583 a = this.md5_ii(a, b, c, d, x[i], 6, -198630844);
7584 d = this.md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
7585 c = this.md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
7586 b = this.md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
7587 a = this.md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
7588 d = this.md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
7589 c = this.md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
7590 b = this.md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
7591 a = this.md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
7592 d = this.md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
7593 c = this.md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
7594 b = this.md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
7595 a = this.md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
7596 d = this.md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
7597 c = this.md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
7598 b = this.md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
7599
7600 a = this.safe_add(a, olda);
7601 b = this.safe_add(b, oldb);
7602 c = this.safe_add(c, oldc);
7603 d = this.safe_add(d, oldd);
7604 }
7605 return [a, b, c, d];
7606 };
7607
7608 /*
7609 * Convert an array of little-endian words to a string
7610 */
7611 BlueImpMD5.prototype.binl2rstr = function (input) {
7612 var i,
7613 output = '';
7614 for (i = 0; i < input.length * 32; i += 8) {
7615 output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
7616 }
7617 return output;
7618 };
7619
7620 /*
7621 * Convert a raw string to an array of little-endian words
7622 * Characters >255 have their high-byte silently ignored.
7623 */
7624 BlueImpMD5.prototype.rstr2binl = function (input) {
7625 var i,
7626 output = [];
7627 output[(input.length >> 2) - 1] = undefined;
7628 for (i = 0; i < output.length; i += 1) {
7629 output[i] = 0;
7630 }
7631 for (i = 0; i < input.length * 8; i += 8) {
7632 output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
7633 }
7634 return output;
7635 };
7636
7637 /*
7638 * Calculate the MD5 of a raw string
7639 */
7640 BlueImpMD5.prototype.rstr_md5 = function (s) {
7641 return this.binl2rstr(this.binl_md5(this.rstr2binl(s), s.length * 8));
7642 };
7643
7644 /*
7645 * Calculate the HMAC-MD5, of a key and some data (raw strings)
7646 */
7647 BlueImpMD5.prototype.rstr_hmac_md5 = function (key, data) {
7648 var i,
7649 bkey = this.rstr2binl(key),
7650 ipad = [],
7651 opad = [],
7652 hash;
7653 ipad[15] = opad[15] = undefined;
7654 if (bkey.length > 16) {
7655 bkey = this.binl_md5(bkey, key.length * 8);
7656 }
7657 for (i = 0; i < 16; i += 1) {
7658 ipad[i] = bkey[i] ^ 0x36363636;
7659 opad[i] = bkey[i] ^ 0x5C5C5C5C;
7660 }
7661 hash = this.binl_md5(ipad.concat(this.rstr2binl(data)), 512 + data.length * 8);
7662 return this.binl2rstr(this.binl_md5(opad.concat(hash), 512 + 128));
7663 };
7664
7665 /*
7666 * Convert a raw string to a hex string
7667 */
7668 BlueImpMD5.prototype.rstr2hex = function (input) {
7669 var hex_tab = '0123456789abcdef',
7670 output = '',
7671 x,
7672 i;
7673 for (i = 0; i < input.length; i += 1) {
7674 x = input.charCodeAt(i);
7675 output += hex_tab.charAt((x >>> 4) & 0x0F) +
7676 hex_tab.charAt(x & 0x0F);
7677 }
7678 return output;
7679 };
7680
7681 /*
7682 * Encode a string as utf-8
7683 */
7684 BlueImpMD5.prototype.str2rstr_utf8 = function (input) {
7685 return unescape(encodeURIComponent(input));
7686 };
7687
7688 /*
7689 * Take string arguments and return either raw or hex encoded strings
7690 */
7691 BlueImpMD5.prototype.raw_md5 = function (s) {
7692 return this.rstr_md5(this.str2rstr_utf8(s));
7693 };
7694 BlueImpMD5.prototype.hex_md5 = function (s) {
7695 return this.rstr2hex(this.raw_md5(s));
7696 };
7697 BlueImpMD5.prototype.raw_hmac_md5 = function (k, d) {
7698 return this.rstr_hmac_md5(this.str2rstr_utf8(k), this.str2rstr_utf8(d));
7699 };
7700 BlueImpMD5.prototype.hex_hmac_md5 = function (k, d) {
7701 return this.rstr2hex(this.raw_hmac_md5(k, d));
7702 };
7703
7704 BlueImpMD5.prototype.md5 = function (string, key, raw) {
7705 if (!key) {
7706 if (!raw) {
7707 return this.hex_md5(string);
7708 }
7709
7710 return this.raw_md5(string);
7711 }
7712
7713 if (!raw) {
7714 return this.hex_hmac_md5(key, string);
7715 }
7716
7717 return this.raw_hmac_md5(key, string);
7718 };
7719
7720 // CommonJS module
7721 if (typeof exports !== 'undefined') {
7722 if (typeof module !== 'undefined' && module.exports) {
7723 exports = module.exports = Chance;
7724 }
7725 exports.Chance = Chance;
7726 }
7727
7728 // Register as an anonymous AMD module
7729 if (typeof define === 'function' && define.amd) {
7730 define([], function () {
7731 return Chance;
7732 });
7733 }
7734
7735 // if there is a importsScrips object define chance for worker
7736 // allows worker to use full Chance functionality with seed
7737 if (typeof importScripts !== 'undefined') {
7738 chance = new Chance();
7739 self.Chance = Chance;
7740 }
7741
7742 // If there is a window object, that at least has a document property,
7743 // instantiate and define chance on the window
7744 if (typeof window === "object" && typeof window.document === "object") {
7745 window.Chance = Chance;
7746 window.chance = new Chance();
7747 }
7748})();