UNPKG

@nibble-codes/id-checksum

Version:

A comprehensive library for generating and validating various types of identification numbers

1 lines 56.8 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});class t{validate(t){throw new Error("validate method must be implemented")}}class e{constructor(t,e="",a={}){this.isValid=t,this.message=e,this.details=a}static valid(t="Valid",a={}){return new e(!0,t,a)}static invalid(t,a={}){return new e(!1,t,a)}toString(){return this.isValid?"Valid":`Invalid: ${this.message}`}}class a extends t{constructor(t){super(),this.config=t}validate(t){try{const e=this.validateBasic(t);if(!e.isValid)return e;const a=this.validateFormat(t);if(!a.isValid)return a;return this.validateChecksum(t)}catch(t){return e.invalid(`Validation error: ${t.message}`)}}validateBasic(t){if(!t)return e.invalid("ID cannot be empty");if("string"!=typeof t)return e.invalid("ID must be a string");return 0===t.trim().length?e.invalid("ID cannot be empty"):e.valid()}validateFormat(t){throw new Error("validateFormat must be implemented by subclass")}validateChecksum(t){throw new Error("validateChecksum must be implemented by subclass")}validateRegex(t,a,n){return a.test(t)?e.valid():e.invalid(n)}validateLength(t,a,n){return t.length!==a?e.invalid(n||`ID must be ${a} characters long`):e.valid()}}class n{static calculateHkidChecksum(t){const e=[8,7,6,5,4,3,2];let a=0;if(8===t.length){a+=9*(t.charCodeAt(0)-55);for(let n=1;n<7;n++)a+=parseInt(t[n])*e[n-1]}else{a+=10*(t.charCodeAt(0)-55),a+=9*(t.charCodeAt(1)-55);for(let n=2;n<8;n++)a+=parseInt(t[n])*e[n-2]}const n=a%11;return 0===n?"0":1===n?"A":(11-n).toString()}static calculateTwidChecksum(t){const e={A:10,B:11,C:12,D:13,E:14,F:15,G:16,H:17,I:34,J:18,K:19,L:20,M:21,N:22,O:35,P:23,Q:24,R:25,S:26,T:27,U:28,V:29,W:32,X:30,Y:31,Z:33}[t[0].toUpperCase()];let a=Math.floor(e/10)+e%10*9;for(let e=1;e<9;e++)a+=parseInt(t[e])*(9-e);return(10-a%10)%10}static calculateVerhoeffChecksum(t){const e=[[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]],a=[[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,6,8,7,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]];let n=0;const r=t.split("").reverse();for(let t=0;t<r.length;t++)n=e[n][a[(t+1)%8][parseInt(r[t])]];return n}static calculateNricChecksum(t){const e=[2,7,6,5,4,3,2],a=["A","B","C","D","E","F","G","H","I","Z","J"],n=["K","L","M","N","P","Q","R","T","U","W","X"];let r=0;for(let a=1;a<8;a++)r+=parseInt(t[a])*e[a-1];const s=r%11,i=t[0].toUpperCase();return"S"===i||"T"===i?a[s]:n[s]}static calculateLuhnChecksum(t){let e=0,a=!1;for(let n=t.length-1;n>=0;n--){let r=parseInt(t[n]);a&&(r*=2,r>9&&(r=r%10+1)),e+=r,a=!a}return(10-e%10)%10}static calculateMod11Checksum(t,e=null){e||(e=Array.from({length:t.length},(t,e)=>e%6+2));let a=0;for(let n=0;n<t.length;n++)a+=parseInt(t[n])*e[n];const n=a%11;return n<2?n:11-n}static calculateBsnChecksum(t){const e=[9,8,7,6,5,4,3,2,-1];let a=0;for(let n=0;n<9;n++)a+=parseInt(t[n])*e[n];return a%11==0}static calculateCpfChecksum(t){let e=0;for(let a=0;a<9;a++)e+=parseInt(t[a])*(10-a);let a=e%11;const n=a<2?0:11-a;e=0;for(let a=0;a<9;a++)e+=parseInt(t[a])*(11-a);e+=2*n,a=e%11;return[n,a<2?0:11-a]}static calculateRutChecksum(t){const e=[2,3,4,5,6,7];let a=0,n=0;for(let r=t.length-1;r>=0;r--)a+=parseInt(t[r])*e[n],n=(n+1)%e.length;const r=a%11;return 0===r?"0":1===r?"K":(11-r).toString()}static calculateCuilChecksum(t){const e=[5,4,3,2,7,6,5,4,3,2];let a=0;for(let n=0;n<10;n++)a+=parseInt(t[n])*e[n];const n=a%11;return 0===n?0:1===n?9:11-n}}class r extends a{constructor(){super({name:"Hong Kong Identity Card",pattern:/^[A-Z]{1,2}\d{6}[A-Z0-9]$/i,lengths:[8,9]})}validateFormat(t){const a=t.toUpperCase();return this.config.lengths.includes(a.length)?this.validateRegex(a,this.config.pattern,"HKID format must be 1-2 letters followed by 6 digits and a check character"):e.invalid("HKID must be 8 or 9 characters long")}validateChecksum(t){const a=t.toUpperCase(),r=n.calculateHkidChecksum(a),s=a.slice(-1);return r!==s?e.invalid(`Invalid HKID checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid HKID")}}class s extends a{constructor(){super({name:"Taiwan Identity Card",pattern:/^[A-Z][12]\d{8}$/i,length:10})}validateFormat(t){const e=t.toUpperCase(),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(e,this.config.pattern,"TWID format must be a letter, followed by 1 or 2, then 8 digits"):a}validateChecksum(t){const a=t.toUpperCase(),r=n.calculateTwidChecksum(a),s=parseInt(a.slice(-1));return r!==s?e.invalid(`Invalid TWID checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid TWID")}}class i extends a{constructor(){super({name:"Aadhaar Card",pattern:/^\d{12}$/,length:12})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Aadhaar must be exactly 12 digits"):e}validateChecksum(t){const a=t.slice(0,11),r=n.calculateVerhoeffChecksum(a),s=parseInt(t.slice(-1));return r!==s?e.invalid(`Invalid Aadhaar checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid Aadhaar")}}class l extends a{constructor(){super({name:"Singapore NRIC",pattern:/^[STFG]\d{7}[A-Z]$/i,length:9})}validateFormat(t){const e=t.toUpperCase(),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(e,this.config.pattern,"NRIC format must start with S, T, F, or G, followed by 7 digits and a letter"):a}validateChecksum(t){const a=t.toUpperCase(),r=n.calculateNricChecksum(a),s=a.slice(-1);return r!==s?e.invalid(`Invalid NRIC checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid NRIC")}}class o extends a{constructor(){super({name:"Singapore FIN",pattern:/^[FG]\d{7}[A-Z]$/i,length:9})}validateFormat(t){const e=t.toUpperCase(),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(e,this.config.pattern,"FIN format must start with F or G, followed by 7 digits and a letter"):a}validateChecksum(t){const a=t.toUpperCase(),r=n.calculateNricChecksum(a),s=a.slice(-1);return r!==s?e.invalid(`Invalid FIN checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid FIN")}}class d extends a{constructor(){super({name:"Indian PAN",pattern:/^[A-Z]{5}\d{4}[A-Z]$/i,length:10}),this.entityTypes={P:"Individual",C:"Company",T:"Trust",F:"Firm/LLP",A:"Association of Persons (AOP)",B:"Body of Individuals (BOI)",G:"Government",J:"Artificial Juridical Person",L:"Local Authority",H:"Hindu Undivided Family (HUF)",K:"Krish (rarely used)"}}validateFormat(t){const a=t.toUpperCase(),n=this.validateLength(a,this.config.length);if(!n.isValid)return n;const r=this.validateRegex(a,this.config.pattern,"PAN format must be 5 letters, 4 digits, and 1 letter");if(!r.isValid)return r;const s=a[3];return this.entityTypes[s]?e.valid():e.invalid(`Invalid entity type '${s}'. Must be one of: ${Object.keys(this.entityTypes).join(", ")}`)}validateChecksum(t){return e.valid("Valid PAN structure")}getEntityType(t){if(!t||t.length<4)return null;const e=t.toUpperCase()[3];return this.entityTypes[e]||null}}class c extends a{constructor(){super({name:"US Social Security Number",pattern:/^\d{3}-?\d{2}-?\d{4}$/,length:9})}validateFormat(t){const a=t.replace(/-/g,""),n=this.validateLength(a,this.config.length);if(!n.isValid)return n;const r=this.validateRegex(t,this.config.pattern,"SSN format must be XXX-XX-XXXX or XXXXXXXXX");if(!r.isValid)return r;const s=a.substring(0,3),i=a.substring(3,5),l=a.substring(5,9);return"000"===s||"666"===s||s.startsWith("9")?e.invalid("Invalid SSN area number"):"00"===i?e.invalid("Invalid SSN group number"):"0000"===l?e.invalid("Invalid SSN serial number"):e.valid()}validateChecksum(t){return e.valid("Valid SSN")}}class h extends a{constructor(){super({name:"Canadian Social Insurance Number",pattern:/^\d{3}[\s-]?\d{3}[\s-]?\d{3}$/,length:9})}validateFormat(t){const e=t.replace(/[\s-]/g,""),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(t,this.config.pattern,"SIN format must be XXX XXX XXX or XXX-XXX-XXX or XXXXXXXXX"):a}validateChecksum(t){const a=t.replace(/[\s-]/g,"");let n=0;for(let t=0;t<9;t++){let e=parseInt(a[t]);t%2==1&&(e*=2,e>9&&(e=Math.floor(e/10)+e%10)),n+=e}return n%10!=0?e.invalid("Invalid SIN checksum"):e.valid("Valid SIN")}}class u extends a{constructor(){super({name:"UK National Insurance Number",pattern:/^[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]\d{6}[A-D]$/i,length:9}),this.invalidPrefixes=["BG","GB","NK","KN","TN","NT","ZZ"]}validateFormat(t){const a=t.toUpperCase(),n=this.validateLength(a,this.config.length);if(!n.isValid)return n;const r=this.validateRegex(a,this.config.pattern,"NINO format must be 2 letters, 6 digits, and 1 letter (A-D)");if(!r.isValid)return r;const s=a.substring(0,2);return this.invalidPrefixes.includes(s)?e.invalid(`Invalid NINO prefix: ${s}`):e.valid()}validateChecksum(t){return e.valid("Valid NINO")}}class p extends a{constructor(){super({name:"Dutch BSN",pattern:/^\d{9}$/,length:9})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"BSN must be exactly 9 digits"):e}validateChecksum(t){return n.calculateBsnChecksum(t)?e.valid("Valid BSN"):e.invalid("Invalid BSN checksum")}}class g extends a{constructor(){super({name:"Brazilian CPF",pattern:/^\d{3}\.?\d{3}\.?\d{3}-?\d{2}$/,length:11})}validateFormat(t){const a=t.replace(/[.-]/g,""),n=this.validateLength(a,this.config.length);if(!n.isValid)return n;const r=this.validateRegex(t,this.config.pattern,"CPF format must be XXX.XXX.XXX-XX or XXXXXXXXXXX");return r.isValid?/^(\d)\1{10}$/.test(a)?e.invalid("CPF cannot have all identical digits"):e.valid():r}validateChecksum(t){const a=t.replace(/[.-]/g,""),r=a.substring(0,9),[s,i]=n.calculateCpfChecksum(r),l=parseInt(a[9]),o=parseInt(a[10]);return s!==l||i!==o?e.invalid("Invalid CPF checksum"):e.valid("Valid CPF")}}class m extends a{constructor(){super({name:"Chilean RUT",pattern:/^\d{1,2}\.\d{3}\.\d{3}-[\dK]$/i,minLength:8,maxLength:12})}validateFormat(t){const a=t.toUpperCase();return a.length<this.config.minLength||a.length>this.config.maxLength?e.invalid("RUT length must be between 8 and 12 characters"):this.validateRegex(a,this.config.pattern,"RUT format must be XX.XXX.XXX-X")}validateChecksum(t){const a=t.toUpperCase().split("-"),r=a[0].replace(/\./g,""),s=n.calculateRutChecksum(r),i=a[1];return s!==i?e.invalid(`Invalid RUT checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid RUT")}}class I extends a{constructor(){super({name:"Argentine CUIL",pattern:/^\d{2}-?\d{8}-?\d$/,length:11})}validateFormat(t){const e=t.replace(/-/g,""),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(t,this.config.pattern,"CUIL format must be XX-XXXXXXXX-X or XXXXXXXXXXX"):a}validateChecksum(t){const a=t.replace(/-/g,""),r=a.substring(0,10),s=n.calculateCuilChecksum(r),i=parseInt(a[10]);return s!==i?e.invalid(`Invalid CUIL checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid CUIL")}}class v extends a{constructor(){super({name:"Mexican RFC",pattern:/^[A-Z&Ñ]{3,4}\d{6}[A-Z\d]{3}$/i,minLength:12,maxLength:13})}validateFormat(t){const a=t.toUpperCase();return a.length<this.config.minLength||a.length>this.config.maxLength?e.invalid("RFC length must be 12 or 13 characters"):this.validateRegex(a,this.config.pattern,"RFC format must be 3-4 letters, 6 digits, and 3 alphanumeric characters")}validateChecksum(t){return e.valid("Valid RFC format")}}class f extends a{constructor(){super({name:"Norwegian Personalnummer",pattern:/^\d{11}$/,length:11})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Personalnummer must be exactly 11 digits"):e}validateChecksum(t){const a=[3,7,6,1,8,9,4,5,2];let n=0;for(let e=0;e<9;e++)n+=parseInt(t[e])*a[e];const r=11-n%11;if((11===r?0:r)!==parseInt(t[9]))return e.invalid("Invalid first check digit");const s=[5,4,3,2,7,6,5,4,3,2];let i=0;for(let e=0;e<10;e++)i+=parseInt(t[e])*s[e];const l=11-i%11;return(11===l?0:l)!==parseInt(t[10])?e.invalid("Invalid second check digit"):e.valid("Valid Personalnummer")}}class x extends a{constructor(){super({name:"Swedish Personnummer",pattern:/^\d{6}-?\d{4}$/,length:10})}validateFormat(t){const e=t.replace(/-/g,""),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(t,this.config.pattern,"Personnummer format must be YYMMDD-XXXX or YYMMDDXXXX"):a}validateChecksum(t){const a=t.replace(/-/g,"");let n=0;for(let t=0;t<9;t++){let e=parseInt(a[t]);t%2==1&&(e*=2,e>9&&(e=Math.floor(e/10)+e%10)),n+=e}const r=(10-n%10)%10,s=parseInt(a[9]);return r!==s?e.invalid(`Invalid Personnummer checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid Personnummer")}}class C extends a{constructor(){super({name:"Danish CPR",pattern:/^\d{6}-?\d{4}$/,length:10})}validateFormat(t){const e=t.replace(/-/g,""),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(t,this.config.pattern,"CPR format must be DDMMYY-XXXX or DDMMYYXXXX"):a}validateChecksum(t){const a=t.replace(/-/g,""),n=[4,3,2,7,6,5,4,3,2,1];let r=0;for(let t=0;t<10;t++)r+=parseInt(a[t])*n[t];return r%11!=0?e.invalid("Invalid CPR checksum"):e.valid("Valid CPR")}}class X extends a{constructor(){super({name:"Polish PESEL",pattern:/^\d{11}$/,length:11})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"PESEL must be exactly 11 digits"):e}validateChecksum(t){const a=[1,3,7,9,1,3,7,9,1,3];let n=0;for(let e=0;e<10;e++)n+=parseInt(t[e])*a[e];const r=(10-n%10)%10,s=parseInt(t[10]);return r!==s?e.invalid(`Invalid PESEL checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid PESEL")}}class N extends a{constructor(){super({name:"Romanian CNP",pattern:/^\d{13}$/,length:13})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"CNP must be exactly 13 digits"):e}validateChecksum(t){const a=[2,7,9,1,4,6,3,5,8,2,7,9];let n=0;for(let e=0;e<12;e++)n+=parseInt(t[e])*a[e];let r=n%11;10===r&&(r=1);const s=parseInt(t[12]);return r!==s?e.invalid(`Invalid CNP checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid CNP")}}class D extends a{constructor(){super({name:"Australian Tax File Number",pattern:/^\d{8,9}$/,minLength:8,maxLength:9})}validateFormat(t){return t.length<this.config.minLength||t.length>this.config.maxLength?e.invalid("TFN must be 8 or 9 digits"):this.validateRegex(t,this.config.pattern,"TFN must contain only digits")}validateChecksum(t){const a=[1,4,3,7,5,8,6,9,10];let n=0;for(let e=0;e<Math.min(t.length,8);e++)n+=parseInt(t[e])*a[e];const r=n%11;return 0===r||1===r?e.valid("Valid TFN"):e.invalid("Invalid TFN checksum")}}class $ extends a{constructor(){super({name:"New Zealand IRD Number",pattern:/^\d{8,9}$/,minLength:8,maxLength:9})}validateFormat(t){return t.length<this.config.minLength||t.length>this.config.maxLength?e.invalid("IRD must be 8 or 9 digits"):this.validateRegex(t,this.config.pattern,"IRD must contain only digits")}validateChecksum(t){const a=[3,2,7,6,5,4,3,2];let n=0;for(let e=0;e<Math.min(t.length-1,8);e++)n+=parseInt(t[e])*a[e];const r=n%11;let s;if(0===r)s=0;else{if(1===r)return e.invalid("Invalid IRD - remainder cannot be 1");s=11-r}const i=parseInt(t[t.length-1]);return s!==i?e.invalid(`Invalid IRD checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid IRD")}}class b extends a{constructor(){super({name:"Japanese My Number",pattern:/^\d{12}$/,length:12})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"My Number must be exactly 12 digits"):e}validateChecksum(t){const a=[6,5,4,3,2,7,6,5,4,3,2];let n=0;for(let e=0;e<11;e++)n+=parseInt(t[e])*a[e];const r=n%11;let s;s=r<=1?0:11-r;const i=parseInt(t[11]);return s!==i?e.invalid(`Invalid My Number checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid My Number")}}class V extends a{constructor(){super({name:"Korean Resident Registration Number",pattern:/^\d{6}-?\d{7}$/,length:13})}validateFormat(t){const e=t.replace(/-/g,""),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(t,this.config.pattern,"RRN format must be YYMMDD-XXXXXXX or YYMMDDXXXXXXX"):a}validateChecksum(t){const a=t.replace(/-/g,""),n=[2,3,4,5,6,7,8,9,2,3,4,5];let r=0;for(let t=0;t<12;t++)r+=parseInt(a[t])*n[t];const s=(11-r%11)%10,i=parseInt(a[12]);return s!==i?e.invalid(`Invalid RRN checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid RRN")}}class y extends a{constructor(){super({name:"Chinese Resident Identity Card",pattern:/^\d{17}[\dX]$/i,length:18})}validateFormat(t){const e=t.toUpperCase(),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(e,this.config.pattern,"Chinese ID must be 17 digits followed by a digit or X"):a}validateChecksum(t){const a=t.toUpperCase(),n=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];let r=0;for(let t=0;t<17;t++)r+=parseInt(a[t])*n[t];const s=["1","0","X","9","8","7","6","5","4","3","2"][r%11],i=a[17];return s!==i?e.invalid(`Invalid Chinese ID checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid Chinese ID")}}class R extends a{constructor(){super({name:"Thai National ID",pattern:/^\d{13}$/,length:13})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Thai ID must be exactly 13 digits"):e}validateChecksum(t){let a=0;for(let e=0;e<12;e++)a+=parseInt(t[e])*(13-e);const n=(11-a%11)%10,r=parseInt(t[12]);return n!==r?e.invalid(`Invalid Thai ID checksum. Expected: ${n}, Got: ${r}`):e.valid("Valid Thai ID")}}class k extends a{constructor(){super({name:"Malaysian NRIC",pattern:/^\d{6}-?\d{2}-?\d{4}$/,length:12})}validateFormat(t){const e=t.replace(/-/g,""),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(t,this.config.pattern,"Malaysian NRIC format must be YYMMDD-SS-NNNN"):a}validateChecksum(t){const a=t.replace(/-/g,""),n=a.substring(0,6);a.substring(6,8),parseInt(n.substring(0,2));const r=parseInt(n.substring(2,4)),s=parseInt(n.substring(4,6));return r<1||r>12?e.invalid("Invalid birth month"):s<1||s>31?e.invalid("Invalid birth day"):e.valid("Valid Malaysian NRIC")}}class L extends a{constructor(){super({name:"Philippine UMID",pattern:/^\d{4}-?\d{7}-?\d$/,length:12})}validateFormat(t){const e=t.replace(/-/g,""),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(t,this.config.pattern,"Philippine UMID format must be XXXX-XXXXXXX-X"):a}validateChecksum(t){const a=t.replace(/-/g,"");let n=0,r=!1;for(let t=a.length-2;t>=0;t--){let e=parseInt(a[t]);r&&(e*=2,e>9&&(e=e%10+1)),n+=e,r=!r}const s=(10-n%10)%10,i=parseInt(a[a.length-1]);return s!==i?e.invalid(`Invalid UMID checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid Philippine UMID")}}class A extends a{constructor(){super({name:"Vietnamese Citizen Identity Card",pattern:/^\d{12}$/,length:12})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Vietnamese ID must be exactly 12 digits"):e}validateChecksum(t){const a=t.substring(0,3),n=t.substring(3,4);return t.substring(4,6),parseInt(a)<1||parseInt(a)>96?e.invalid("Invalid province code"):parseInt(n)<0||parseInt(n)>9?e.invalid("Invalid gender/century code"):e.valid("Valid Vietnamese ID")}}class Z extends a{constructor(){super({name:"Indonesian NIK",pattern:/^\d{16}$/,length:16})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Indonesian NIK must be exactly 16 digits"):e}validateChecksum(t){t.substring(0,2),t.substring(2,4),t.substring(4,6);const a=t.substring(6,8),n=t.substring(8,10);t.substring(10,12);const r=parseInt(a),s=parseInt(n),i=r>40?r-40:r;return i<1||i>31?e.invalid("Invalid birth date"):s<1||s>12?e.invalid("Invalid birth month"):e.valid("Valid Indonesian NIK")}}class F extends a{constructor(){super({name:"South African ID Number",pattern:/^\d{13}$/,length:13})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"South African ID must be exactly 13 digits"):e}validateChecksum(t){let a=0,n=!1;for(let e=t.length-2;e>=0;e--){let r=parseInt(t[e]);n&&(r*=2,r>9&&(r=r%10+1)),a+=r,n=!n}const r=(10-a%10)%10,s=parseInt(t[12]);return r!==s?e.invalid(`Invalid South African ID checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid South African ID")}}class G extends a{constructor(){super({name:"Egyptian National ID",pattern:/^\d{14}$/,length:14})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Egyptian ID must be exactly 14 digits"):e}validateChecksum(t){const a=t.substring(0,1);t.substring(1,3);const n=t.substring(3,5),r=t.substring(5,7);return t.substring(7,9),"2"!==a&&"3"!==a?e.invalid("Invalid century code"):parseInt(n)<1||parseInt(n)>12?e.invalid("Invalid birth month"):parseInt(r)<1||parseInt(r)>31?e.invalid("Invalid birth day"):e.valid("Valid Egyptian ID")}}class S extends a{constructor(){super({name:"Nigerian NIN",pattern:/^\d{11}$/,length:11})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Nigerian NIN must be exactly 11 digits"):e}validateChecksum(t){const a=[3,7,3,7,3,7,3,7,3,7];let n=0;for(let e=0;e<10;e++)n+=parseInt(t[e])*a[e];const r=n%10,s=parseInt(t[10]);return r!==s?e.invalid(`Invalid NIN checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid Nigerian NIN")}}class P extends a{constructor(){super({name:"Kenyan National ID",pattern:/^\d{7,8}$/,minLength:7,maxLength:8})}validateFormat(t){return t.length<this.config.minLength||t.length>this.config.maxLength?e.invalid("Kenyan ID must be 7 or 8 digits"):this.validateRegex(t,this.config.pattern,"Kenyan ID must contain only digits")}validateChecksum(t){const a=parseInt(t);return a<1e6||a>99999999?e.invalid("Invalid Kenyan ID number range"):e.valid("Valid Kenyan ID")}}class E extends a{constructor(){super({name:"Ghanaian Ghana Card",pattern:/^GHA-\d{9}-\d$/,length:15})}validateFormat(t){const e=t.toUpperCase(),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(e,this.config.pattern,"Ghana Card format must be GHA-XXXXXXXXX-X"):a}validateChecksum(t){const a=t.toUpperCase().replace(/[^0-9]/g,"");let n=0,r=!1;for(let t=a.length-2;t>=0;t--){let e=parseInt(a[t]);r&&(e*=2,e>9&&(e=e%10+1)),n+=e,r=!r}const s=(10-n%10)%10,i=parseInt(a[a.length-1]);return s!==i?e.invalid(`Invalid Ghana Card checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid Ghana Card")}}class T extends a{constructor(){super({name:"French INSEE Number",pattern:/^\d{13}$/,length:13})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"INSEE number must be exactly 13 digits"):e}validateChecksum(t){const a=t.substring(0,12),n=parseInt(t.substring(12,13)),r=97-parseInt(a)%97;return r!==n?e.invalid(`Invalid INSEE checksum. Expected: ${r}, Got: ${n}`):e.valid("Valid INSEE number")}}class U extends a{constructor(){super({name:"German Tax ID",pattern:/^\d{11}$/,length:11})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"German Tax ID must be exactly 11 digits"):e}validateChecksum(t){let a=10;for(let e=0;e<10;e++){let n=(parseInt(t[e])+a)%10;0===n&&(n=10),a=2*n%11}const n=11-a,r=parseInt(t[10]);return 10===n&&0===r?e.valid("Valid German Tax ID"):n!==r?e.invalid(`Invalid German Tax ID checksum. Expected: ${n}, Got: ${r}`):e.valid("Valid German Tax ID")}}class M extends a{constructor(){super({name:"Italian Fiscal Code",pattern:/^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]$/i,length:16})}validateFormat(t){const e=t.toUpperCase(),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(e,this.config.pattern,"Italian Fiscal Code format must be LLLLLLNNLNNLNNNL"):a}validateChecksum(t){const a=t.toUpperCase(),n={0:1,1:0,2:5,3:7,4:9,5:13,6:15,7:17,8:19,9:21,A:1,B:0,C:5,D:7,E:9,F:13,G:15,H:17,I:19,J:21,K:2,L:4,M:18,N:20,O:11,P:3,Q:6,R:8,S:12,T:14,U:16,V:10,W:22,X:25,Y:24,Z:23},r={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:0,B:1,C:2,D:3,E:4,F:5,G:6,H:7,I:8,J:9,K:10,L:11,M:12,N:13,O:14,P:15,Q:16,R:17,S:18,T:19,U:20,V:21,W:22,X:23,Y:24,Z:25};let s=0;for(let t=0;t<15;t++){const e=a[t];s+=t%2==0?n[e]:r[e]}const i="ABCDEFGHIJKLMNOPQRSTUVWXYZ"[s%26],l=a[15];return i!==l?e.invalid(`Invalid Italian Fiscal Code checksum. Expected: ${i}, Got: ${l}`):e.valid("Valid Italian Fiscal Code")}}class K extends a{constructor(){super({name:"Spanish DNI",pattern:/^\d{8}[A-Z]$/i,length:9})}validateFormat(t){const e=t.toUpperCase(),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(e,this.config.pattern,"Spanish DNI format must be 8 digits followed by a letter"):a}validateChecksum(t){const a=t.toUpperCase(),n=a.substring(0,8),r="TRWAGMYFPDXBNJZSQVHLCKE"[parseInt(n)%23],s=a[8];return r!==s?e.invalid(`Invalid Spanish DNI checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid Spanish DNI")}}class w extends a{constructor(){super({name:"Portuguese Citizen Card",pattern:/^\d{8}\s?\d{1}\s?[A-Z]{2}\d{1}$/i,length:12})}validateFormat(t){const e=t.replace(/\s/g,"").toUpperCase(),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(t,this.config.pattern,"Portuguese Citizen Card format must be XXXXXXXX X XXX"):a}validateChecksum(t){const a=t.replace(/\s/g,"").toUpperCase(),n=a.substring(0,8),r=parseInt(a[8]);let s=0;for(let t=0;t<8;t++)s+=parseInt(n[t])*(9-t);const i=11-s%11,l=i>=10?0:i;return l!==r?e.invalid(`Invalid Portuguese Citizen Card checksum. Expected: ${l}, Got: ${r}`):e.valid("Valid Portuguese Citizen Card")}}class H extends a{constructor(){super({name:"Russian Passport Number",pattern:/^\d{4}\s?\d{6}$/,length:10})}validateFormat(t){const e=t.replace(/\s/g,""),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(t,this.config.pattern,"Russian Passport format must be XXXX XXXXXX or XXXXXXXXXX"):a}validateChecksum(t){const a=t.replace(/\s/g,""),n=a.substring(0,4),r=a.substring(4,10),s=[7,2,4,10,3,5,9,4,6,8];let i=0;for(let t=0;t<4;t++)i+=parseInt(n[t])*s[t];for(let t=0;t<6;t++)i+=parseInt(r[t])*s[t+4];return e.valid("Valid Russian Passport format")}}class B extends a{constructor(){super({name:"Ukrainian Tax Number",pattern:/^\d{10}$/,length:10})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Ukrainian Tax Number must be exactly 10 digits"):e}validateChecksum(t){const a=[-1,5,7,9,4,6,10,5,7];let n=0;for(let e=0;e<9;e++)n+=parseInt(t[e])*a[e];let r=n%11;if(r>=10){const e=[7,1,3,5,8,2,4,6,9];n=0;for(let a=0;a<9;a++)n+=parseInt(t[a])*e[a];r=n%11,r>=10&&(r=0)}const s=parseInt(t[9]);return r!==s?e.invalid(`Invalid Ukrainian Tax Number checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid Ukrainian Tax Number")}}class Y extends a{constructor(){super({name:"Turkish TC Kimlik No",pattern:/^\d{11}$/,length:11})}validateFormat(t){const a=this.validateLength(t,this.config.length);if(!a.isValid)return a;const n=this.validateRegex(t,this.config.pattern,"Turkish TC Kimlik No must be exactly 11 digits");return n.isValid?"0"===t[0]?e.invalid("Turkish TC Kimlik No cannot start with 0"):e.valid():n}validateChecksum(t){let a=0,n=0;for(let e=0;e<9;e++)e%2==0?a+=parseInt(t[e]):n+=parseInt(t[e]);if((7*a-n)%10!==parseInt(t[9]))return e.invalid("Invalid Turkish TC Kimlik No 10th digit");let r=0;for(let e=0;e<10;e++)r+=parseInt(t[e]);return r%10!==parseInt(t[10])?e.invalid("Invalid Turkish TC Kimlik No 11th digit"):e.valid("Valid Turkish TC Kimlik No")}}class O extends a{constructor(){super({name:"Israeli ID Number",pattern:/^\d{9}$/,length:9})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Israeli ID must be exactly 9 digits"):e}validateChecksum(t){let a=0;for(let e=0;e<9;e++){let n=parseInt(t[e]);e%2==1&&(n*=2,n>9&&(n=Math.floor(n/10)+n%10)),a+=n}return a%10!=0?e.invalid("Invalid Israeli ID checksum"):e.valid("Valid Israeli ID")}}class J extends a{constructor(){super({name:"UAE Emirates ID",pattern:/^784-\d{4}-\d{7}-\d$/,length:18})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"UAE Emirates ID format must be 784-XXXX-XXXXXXX-X"):e}validateChecksum(t){const a=t.replace(/-/g,"").substring(3);let n=0,r=!1;for(let t=a.length-2;t>=0;t--){let e=parseInt(a[t]);r&&(e*=2,e>9&&(e=e%10+1)),n+=e,r=!r}const s=(10-n%10)%10,i=parseInt(a[a.length-1]);return s!==i?e.invalid(`Invalid UAE Emirates ID checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid UAE Emirates ID")}}class W extends a{constructor(){super({name:"Saudi Arabian National ID",pattern:/^[12]\d{9}$/,length:10})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Saudi ID must start with 1 or 2 followed by 9 digits"):e}validateChecksum(t){let a=0,n=!1;for(let e=t.length-2;e>=0;e--){let r=parseInt(t[e]);n&&(r*=2,r>9&&(r=r%10+1)),a+=r,n=!n}const r=(10-a%10)%10,s=parseInt(t[t.length-1]);return r!==s?e.invalid(`Invalid Saudi ID checksum. Expected: ${r}, Got: ${s}`):e.valid("Valid Saudi Arabian National ID")}}class Q extends a{constructor(){super({name:"Pakistani CNIC",pattern:/^\d{5}-?\d{7}-?\d$/,length:13})}validateFormat(t){const e=t.replace(/-/g,""),a=this.validateLength(e,this.config.length);return a.isValid?this.validateRegex(t,this.config.pattern,"Pakistani CNIC format must be XXXXX-XXXXXXX-X"):a}validateChecksum(t){const a=t.replace(/-/g,""),n=[6,5,4,3,2,7,6,5,4,3,2,7];let r=0;for(let t=0;t<12;t++)r+=parseInt(a[t])*n[t];const s=r%11;let i;i=s<2?s:11-s;const l=parseInt(a[12]);return i!==l?e.invalid(`Invalid Pakistani CNIC checksum. Expected: ${i}, Got: ${l}`):e.valid("Valid Pakistani CNIC")}}class z extends a{constructor(){super({name:"Bangladeshi National ID",pattern:/^\d{10}|\d{13}|\d{17}$/,minLength:10,maxLength:17})}validateFormat(t){return[10,13,17].includes(t.length)?this.validateRegex(t,this.config.pattern,"Bangladeshi NID must contain only digits"):e.invalid("Bangladeshi NID must be 10, 13, or 17 digits")}validateChecksum(t){if(10===t.length){if(parseInt(t)<1e9)return e.invalid("Invalid 10-digit NID format")}return e.valid("Valid Bangladeshi NID")}}class j extends a{constructor(){super({name:"Sri Lankan National ID",pattern:/^\d{9}[VX]|\d{12}$/i,minLength:10,maxLength:12})}validateFormat(t){const a=t.toUpperCase();return a.length<this.config.minLength||a.length>this.config.maxLength?e.invalid("Sri Lankan NID must be 10 or 12 characters"):this.validateRegex(a,this.config.pattern,"Sri Lankan NID format must be XXXXXXXXXV/X or XXXXXXXXXXXX")}validateChecksum(t){const a=t.toUpperCase();if(10===a.length){a.substring(0,9);const t=a[9];if("V"!==t&&"X"!==t)return e.invalid("Invalid check character - must be V or X")}else if(12===a.length){const t=a.substring(0,4),n=a.substring(4,7);if(parseInt(t)<1900||parseInt(t)>2100)return e.invalid("Invalid birth year");if(parseInt(n)<1||parseInt(n)>366)return e.invalid("Invalid day of year")}return e.valid("Valid Sri Lankan NID")}}class _ extends a{constructor(){super({name:"Myanmar NRC",pattern:/^\d{1,2}\/[A-Z]{6}\([A-Z]\)\d{6}$/i,minLength:14,maxLength:18})}validateFormat(t){const a=t.toUpperCase();return a.length<this.config.minLength||a.length>this.config.maxLength?e.invalid("Myanmar NRC length must be between 14-18 characters"):this.validateRegex(a,this.config.pattern,"Myanmar NRC format must be XX/XXXXXX(X)XXXXXX")}validateChecksum(t){const a=t.toUpperCase().split("/");if(2!==a.length)return e.invalid("Invalid NRC format - missing /");const n=a[0];a[1];const r=parseInt(n);return r<1||r>14?e.invalid("Invalid state code - must be 1-14"):e.valid("Valid Myanmar NRC")}}class q{constructor(){this.validators=new Map([["HKID",r],["TWID",s],["AADHAAR",i],["NRIC",l],["FIN",o],["PAN",d],["SSN",c],["SIN",h],["NINO",u],["BSN",p],["CPF",g],["RUT",m],["CUIL",I],["RFC",v],["PERSONNUMMER",x],["PERSONALNUMMER",f],["CPR",C],["PESEL",X],["CNP",N],["AUS",D],["NZ",$],["JP",b],["KR",V],["CN",y],["TH",R],["MY",k],["PH",L],["VN",A],["ID",Z],["ZA",F],["EG",G],["NG",S],["KE",P],["GH",E],["FR",T],["DE",U],["IT",M],["ES",K],["PT",w],["RU",H],["UA",B],["TR",Y],["IL",O],["AR",J],["SA",W],["PK",Q],["BD",z],["LK",j],["MM",_]])}create(t){const e=this.validators.get(t?.toUpperCase());if(!e)throw new Error(`Unsupported ID type: ${t}`);return new e}register(t,e){this.validators.set(t.toUpperCase(),e)}getSupportedTypes(){return Array.from(this.validators.keys())}}class tt{generate(t={}){throw new Error("generate method must be implemented")}}class et extends tt{constructor(t){super(),this.config=t}randomInt(t,e){return Math.floor(Math.random()*(e-t+1))+t}randomDigits(t){return Array.from({length:t},()=>this.randomInt(0,9)).join("")}randomLetter(t=!0){const e=t?"ABCDEFGHIJKLMNOPQRSTUVWXYZ":"abcdefghijklmnopqrstuvwxyz";return e[this.randomInt(0,e.length-1)]}padZero(t,e){return t.toString().padStart(e,"0")}}class at extends et{generate(t={}){const{doublePrefix:e=!1}=t;let a;a=e?this.randomLetter()+this.randomLetter():this.randomLetter();const r=a+this.randomDigits(6);return r+n.calculateHkidChecksum(r+"0")}}class nt extends et{generate(t={}){const{gender:e=null}=t,a="ABCDEFGHJKLMNPQRSTUVXYWZIO",r=a[this.randomInt(0,25)]+(e||this.randomInt(1,2))+this.randomDigits(7);return r+n.calculateTwidChecksum(r+"0")}}class rt extends et{generate(){const t=this.randomInt(2,9)+this.randomDigits(10);return t+n.calculateVerhoeffChecksum(t)}}class st extends et{generate(t={}){const{prefix:e=null,birthYear:a=null}=t,r=["S","T"],s=e||r[this.randomInt(0,r.length-1)];let i;if(a){i=a.toString().slice(-2)+this.randomDigits(5)}else i=this.randomDigits(7);const l=s+i;return l+n.calculateNricChecksum(l+"A")}}class it extends et{generate(t={}){const{prefix:e=null}=t,a=["F","G"],r=(e||a[this.randomInt(0,a.length-1)])+this.randomDigits(7);return r+n.calculateNricChecksum(r+"A")}}class lt extends et{constructor(){super(),this.entityTypes=["P","C","T","F","A","B","G","J","L","H","K"]}generate(t={}){const{entityType:e=null,prefix:a=null}=t;let n;n=a&&a.length>=3?a.substring(0,3).toUpperCase():this.randomLetter()+this.randomLetter()+this.randomLetter();return n+(e||this.entityTypes[this.randomInt(0,this.entityTypes.length-1)])+this.randomLetter()+this.randomDigits(4)+this.randomLetter()}generateForIndividual(){return this.generate({entityType:"P"})}generateForCompany(){return this.generate({entityType:"C"})}generateForTrust(){return this.generate({entityType:"T"})}}class ot extends et{generate(t={}){const{formatted:e=!0}=t;let a;a=this.randomInt(0,1)?this.padZero(this.randomInt(1,665),3):this.padZero(this.randomInt(667,899),3);const n=this.padZero(this.randomInt(1,99),2),r=this.padZero(this.randomInt(1,9999),4);return e?`${a}-${n}-${r}`:a+n+r}}class dt extends et{generate(t={}){const{formatted:e=!0}=t,a=this.randomDigits(8);let n=0;for(let t=0;t<8;t++){let e=parseInt(a[t]);t%2==1&&(e*=2,e>9&&(e=Math.floor(e/10)+e%10)),n+=e}const r=a+(10-n%10)%10;return e?`${r.substring(0,3)} ${r.substring(3,6)} ${r.substring(6,9)}`:r}}class ct extends et{constructor(){super(),this.validFirstLetters="ACEGHJ-PR-TW-Z".replace(/-/g,"").split(""),this.validSecondLetters="ACEGHJ-NPR-TW-Z".replace(/-/g,"").split(""),this.invalidPrefixes=["BG","GB","NK","KN","TN","NT","ZZ"],this.suffixLetters=["A","B","C","D"]}generate(){let t;do{t=this.validFirstLetters[this.randomInt(0,this.validFirstLetters.length-1)]+this.validSecondLetters[this.randomInt(0,this.validSecondLetters.length-1)]}while(this.invalidPrefixes.includes(t));return t+this.randomDigits(6)+this.suffixLetters[this.randomInt(0,this.suffixLetters.length-1)]}}class ht extends et{generate(){let t;do{t=this.randomDigits(9),"0"===t[0]&&(t=this.randomInt(1,9)+t.substring(1))}while(!n.calculateBsnChecksum(t));return t}}class ut extends et{generate(t={}){const{formatted:e=!0}=t,a=this.randomDigits(9),[r,s]=n.calculateCpfChecksum(a),i=a+r+s;return e?`${i.substring(0,3)}.${i.substring(3,6)}.${i.substring(6,9)}-${i.substring(9,11)}`:i}}class pt extends et{generate(t={}){const{formatted:e=!0}=t,a=this.randomInt(7,8),r=this.randomDigits(a),s=n.calculateRutChecksum(r);return e?7===r.length?`${r.substring(0,1)}.${r.substring(1,4)}.${r.substring(4,7)}-${s}`:`${r.substring(0,2)}.${r.substring(2,5)}.${r.substring(5,8)}-${s}`:r+s}}class gt extends et{generate(t={}){const{formatted:e=!0,gender:a=null}=t;let r;r="male"===a?["20","23","24"][this.randomInt(0,2)]:"female"===a?"27":["20","23","24","27"][this.randomInt(0,3)];const s=r+this.randomDigits(8),i=s+n.calculateCuilChecksum(s);return e?`${i.substring(0,2)}-${i.substring(2,10)}-${i.substring(10,11)}`:i}}class mt extends et{generate(t={}){const{isCompany:e=!1}=t,a=e?4:3;let n="";for(let t=0;t<a;t++)n+=this.randomLetter();return n+this.padZero(this.randomInt(50,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)+(this.randomLetter()+this.randomInt(0,9))+this.randomLetter()}}class It extends et{generate(t={}){const{birthDate:e=null}=t;let a;if(e){const t=new Date(e);a=this.padZero(t.getDate(),2)+this.padZero(t.getMonth()+1,2)+t.getFullYear().toString().slice(-2)}else{a=this.padZero(this.randomInt(1,28),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(0,99),2)}const n=a+this.randomDigits(3),r=[3,7,6,1,8,9,4,5,2];let s=0;for(let t=0;t<9;t++)s+=parseInt(n[t])*r[t];const i=11-s%11,l=n+(11===i?0:i),o=[5,4,3,2,7,6,5,4,3,2];let d=0;for(let t=0;t<10;t++)d+=parseInt(l[t])*o[t];const c=11-d%11;return l+(11===c?0:c)}}class vt extends et{generate(t={}){const{formatted:e=!0,birthYear:a=null}=t,n=(a?a.toString().slice(-2):this.padZero(this.randomInt(0,99),2))+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)+this.randomDigits(3);let r=0;for(let t=0;t<9;t++){let e=parseInt(n[t]);t%2==1&&(e*=2,e>9&&(e=Math.floor(e/10)+e%10)),r+=e}const s=n+(10-r%10)%10;return e?`${s.substring(0,6)}-${s.substring(6,10)}`:s}}class ft extends et{generate(t={}){const{formatted:e=!0,birthDate:a=null}=t;let n,r;if(a){const t=new Date(a);n=this.padZero(t.getDate(),2)+this.padZero(t.getMonth()+1,2)+t.getFullYear().toString().slice(-2)}else{n=this.padZero(this.randomInt(1,28),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(0,99),2)}let s=0;do{r=n+this.randomDigits(3)+this.randomInt(0,9);const t=[4,3,2,7,6,5,4,3,2,1];let e=0;for(let a=0;a<10;a++)e+=parseInt(r[a])*t[a];s++}while(sum%11!=0&&s<100);return e?`${r.substring(0,6)}-${r.substring(6,10)}`:r}}class xt extends et{generate(t={}){const{birthDate:e=null,gender:a=null}=t;let n;if(e){const t=new Date(e);let a=t.getFullYear(),r=t.getMonth()+1;const s=this.padZero(t.getDate(),2);a>=1800&&a<=1899?r+=80:a>=2e3&&a<=2099?r+=20:a>=2100&&a<=2199?r+=40:a>=2200&&a<=2299&&(r+=60),n=a.toString().slice(-2)+this.padZero(r,2)+s}else{n=this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}let r=this.randomDigits(3);"male"===a?r=r.slice(0,2)+(parseInt(r[2])%2==0?parseInt(r[2])+1:r[2]):"female"===a&&(r=r.slice(0,2)+(parseInt(r[2])%2==1?parseInt(r[2])-1:r[2]));const s=n+r,i=[1,3,7,9,1,3,7,9,1,3];let l=0;for(let t=0;t<10;t++)l+=parseInt(s[t])*i[t];return s+(10-l%10)%10}}class Ct extends et{generate(t={}){const{birthDate:e=null,gender:a=null,county:n=null}=t;let r,s;if(r="male"===a?this.randomInt(0,1)?"1":"3":"female"===a?this.randomInt(0,1)?"2":"4":this.randomInt(1,4).toString(),e){const t=new Date(e);s=t.getFullYear().toString().slice(-2)+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{s=this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}const i=r+s+(n||this.padZero(this.randomInt(1,52),2))+this.padZero(this.randomInt(1,999),3),l=[2,7,9,1,4,6,3,5,8,2,7,9];let o=0;for(let t=0;t<12;t++)o+=parseInt(i[t])*l[t];let d=o%11;return 10===d&&(d=1),i+d}}class Xt extends et{generate(){let t,e=0;do{t=this.randomDigits(8),e++}while(!this.isValidTfn(t)&&e<100);return t}isValidTfn(t){const e=[1,4,3,7,5,8,6,9,10];let a=0;for(let n=0;n<8;n++)a+=parseInt(t[n])*e[n];const n=a%11;return 0===n||1===n}}class Nt extends et{generate(){let t,e=0;do{t=this.randomDigits(8),e++}while(!this.isValidIrd(t)&&e<100);return t+this.calculateCheckDigit(t)}calculateCheckDigit(t){const e=[3,2,7,6,5,4,3,2];let a=0;for(let n=0;n<8;n++)a+=parseInt(t[n])*e[n];const n=a%11;return 0===n?"0":1===n?null:(11-n).toString()}isValidIrd(t){return null!==this.calculateCheckDigit(t)}}class Dt extends et{generate(){const t=this.randomDigits(11),e=[6,5,4,3,2,7,6,5,4,3,2];let a=0;for(let n=0;n<11;n++)a+=parseInt(t[n])*e[n];const n=a%11;return t+(n<=1?0:11-n)}}class $t extends et{generate(t={}){const{formatted:e=!0,birthDate:a=null}=t;let n;if(a){const t=new Date(a);n=t.getFullYear().toString().slice(-2)+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{n=this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}const r=n+this.randomDigits(6),s=[2,3,4,5,6,7,8,9,2,3,4,5];let i=0;for(let t=0;t<12;t++)i+=parseInt(r[t])*s[t];const l=r+(11-i%11)%10;return e?`${l.substring(0,6)}-${l.substring(6,13)}`:l}}class bt extends et{generate(t={}){const{birthDate:e=null,gender:a=null}=t,n=["110101","310101","440101","500101","120101"],r=n[this.randomInt(0,n.length-1)];let s;if(e){const t=new Date(e);s=t.getFullYear()+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{s=this.randomInt(1950,2005)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}let i,l=this.randomDigits(2);i="male"===a?2*this.randomInt(0,4)+1:"female"===a?2*this.randomInt(0,4):this.randomInt(0,9),l+=i;const o=r+s+l;return o+this.calculateCheckDigit(o)}calculateCheckDigit(t){const e=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];let a=0;for(let n=0;n<17;n++)a+=parseInt(t[n])*e[n];return["1","0","X","9","8","7","6","5","4","3","2"][a%11]}}class Vt extends et{generate(){const t=this.randomDigits(12);let e=0;for(let a=0;a<12;a++)e+=parseInt(t[a])*(13-a);return t+(11-e%11)%10}}class yt extends et{generate(t={}){const{formatted:e=!0,birthDate:a=null}=t;let n;if(a){const t=new Date(a);n=t.getFullYear().toString().slice(-2)+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{n=this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}const r=["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16"],s=n+r[this.randomInt(0,r.length-1)]+this.randomDigits(4);return e?`${s.substring(0,6)}-${s.substring(6,8)}-${s.substring(8,12)}`:s}}class Rt extends et{generate(t={}){const{formatted:e=!0}=t,a=this.randomDigits(11);let n=0,r=!1;for(let t=a.length-1;t>=0;t--){let e=parseInt(a[t]);r&&(e*=2,e>9&&(e=e%10+1)),n+=e,r=!r}const s=a+(10-n%10)%10;return e?`${s.substring(0,4)}-${s.substring(4,11)}-${s.substring(11,12)}`:s}}class kt extends et{generate(t={}){const{birthYear:e=null,gender:a=null}=t,n=["001","002","004","006","008","010","011","012","014","015"],r=n[this.randomInt(0,n.length-1)];let s;s="male"===a?this.randomInt(0,1)?"0":"2":"female"===a?this.randomInt(0,1)?"1":"3":this.randomInt(0,3).toString();return r+s+(e?e.toString().slice(-2):this.padZero(this.randomInt(0,99),2))+this.randomDigits(6)}}class Lt extends et{generate(t={}){const{birthDate:e=null,gender:a=null}=t,n=["11","12","13","14","15","16","17","18","19","21"],r=n[this.randomInt(0,n.length-1)],s=this.padZero(this.randomInt(1,99),2),i=this.padZero(this.randomInt(1,99),2);let l;if(e){const t=new Date(e);let n=t.getDate();"female"===a&&(n+=40);const r=this.padZero(t.getMonth()+1,2),s=t.getFullYear().toString().slice(-2);l=this.padZero(n,2)+r+s}else{let t=this.randomInt(1,31);("female"===a||null===a&&this.randomInt(0,1))&&(t+=40);const e=this.padZero(this.randomInt(1,12),2),n=this.padZero(this.randomInt(0,99),2);l=this.padZero(t,2)+e+n}return r+s+i+l+this.randomDigits(4)}}class At extends et{generate(t={}){const{birthDate:e=null,gender:a=null}=t;let n,r;if(e){const t=new Date(e);n=t.getFullYear().toString().slice(-2)+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{n=this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}r="male"===a?this.randomInt(5,9):"female"===a?this.randomInt(0,4):this.randomInt(0,9);const s=n+r+this.randomDigits(3)+this.randomInt(0,1)+this.randomInt(8,9);let i=0,l=!1;for(let t=s.length-1;t>=0;t--){let e=parseInt(s[t]);l&&(e*=2,e>9&&(e=e%10+1)),i+=e,l=!l}return s+(10-i%10)%10}}class Zt extends et{generate(t={}){const{birthDate:e=null}=t;let a;if(e){const t=new Date(e),n=t.getFullYear();a=(n>=2e3?"3":"2")+n.toString().slice(-2)+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{a=(this.randomInt(0,1)?"2":"3")+this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}return a+this.padZero(this.randomInt(1,35),2)+this.randomDigits(6)}}class Ft extends et{generate(){const t=this.randomDigits(10),e=[3,7,3,7,3,7,3,7,3,7];let a=0;for(let n=0;n<10;n++)a+=parseInt(t[n])*e[n];return t+a%10}}class Gt extends et{generate(){const t=this.randomInt(7,8);return this.randomDigits(t)}}class St extends et{generate(){const t=this.randomDigits(9);let e=0,a=!1;for(let n=t.length-1;n>=0;n--){let r=parseInt(t[n]);a&&(r*=2,r>9&&(r=r%10+1)),e+=r,a=!a}return`GHA-${t}-${(10-e%10)%10}`}}class Pt extends et{generate(t={}){const{gender:e=null,birthYear:a=null}=t;let n;n="male"===e?"1":"female"===e?"2":this.randomInt(1,2).toString();const r=["01","02","06","13","33","59","69","75","92","93"],s=n+(a?a.toString().slice(-2):this.padZero(this.randomInt(0,99),2))+this.padZero(this.randomInt(1,12),2)+r[this.randomInt(0,r.length-1)]+this.padZero(this.randomInt(1,999),3)+this.padZero(this.randomInt(1,999),3),i=parseInt(s)%97;return s+this.padZero(97-i,2)}}class Et extends et{generate(){let t,e=0;do{const a=this.randomDigits(10);let n=10;for(let t=0;t<10;t++){let e=(parseInt(a[t])+n)%10;0===e&&(e=10),n=2*e%11}let r=11-n;10===r&&(r=0),t=a+r,e++}while(!this.isValidStructure(t)&&e<100);return t}isValidStructure(t){const e={};for(let a of t.substring(0,10))e[a]=(e[a]||0)+1;for(let t of Object.values(e))if(t>3)return!1;return!0}}class Tt extends et{generate(t={}){const{lastName:e=null,firstName:a=null,birthDate:n=null,gender:r=null,birthPlace:s=null}=t,i=e?this.extractConsonants(e,3):this.randomLetter()+this.randomLetter()+this.randomLetter(),l=a?this.extractConsonants(a,3):this.randomLetter()+this.randomLetter()+this.randomLetter();let o;o=n?new Date(n).getFullYear().toString().slice(-2):this.padZero(this.randomInt(0,99),2);const d="ABCDEHLMPRST";let c,h;if(n){c=d[new Date(n).getMonth()]}else c=d[this.randomInt(0,11)];if(n){let t=new Date(n).getDate();"female"===r&&(t+=40),h=this.padZero(t,2)}else{let t=this.randomInt(1,31);("female"===r||null===r&&this.randomInt(0,1))&&(t+=40),h=this.padZero(t,2)}const u=i+l+o+c+h+(s||"H"+this.padZero(this.randomInt(1,999),3));return u+this.calculateCheckDigit(u)}extractConsonants(t,e){const a=t.toUpperCase().replace(/[AEIOU\s]/g,""),n=t.toUpperCase().replace(/[^AEIOU]/g,"");let r=a.substring(0,e);for(r.length<e&&(r+=n.substring(0,e-r.length));r.length<e;)r+="X";return r.substring(0,e)}calculateCheckDigit(t){const e={0:1,1:0,2:5,3:7,4:9,5:13,6:15,7:17,8:19,9:21,A:1,B:0,C:5,D:7,E:9,F:13,G:15,H:17,I:19,J:21,K:2,L:4,M:18,N:20,O:11,P:3,Q:6,R:8,S:12,T:14,U:16,V:10,W:22,X:25,Y:24,Z:23},a={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:0,B:1,C:2,D:3,E:4,F:5,G:6,H:7,I:8,J:9,K:10,L:11,M:12,N:13,O:14,P:15,Q:16,R:17,S:18,T:19,U:20,V:21,W:22,X:23,Y:24,Z:25};let n=0;for(let r=0;r<15;r++){const s=t[r];n+=r%2==0?e[s]:a[s]}return"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n%26]}}class Ut extends et{generate(){const t=this.randomDigits(8);return t+"TRWAGMYFPDXBNJZSQVHLCKE"[parseInt(t)%23]}}class Mt extends et{generate(t={}){const{formatted:e=!0}=t,a=this.randomDigits(8);let n=0;for(let t=0;t<8;t++)n+=parseInt(a[t])*(9-t);const r=n%11,s=a+(r>=10?0:r)+this.randomInt(0,9)+(this.randomLetter()+this.randomLetter())+this.randomInt(0,9);return e?`${s.substring(0,8)} ${s.substring(8,9)} ${s.substring(9,12)}`:s}}class Kt extends et{generate(t={}){const{formatted:e=!0}=t,a=this.randomDigits(4),n=this.randomDigits(6);return e?`${a} ${n}`:a+n}}class wt extends et{generate(){const t=this.randomDigits(9),e=[-1,5,7,9,4,6,10,5,7];let a=0;for(let n=0;n<9;n++)a+=parseInt(t[n])*e[n];let n=a%11;if(n>=10){const e=[7,1,3,5,8,2,4,6,9];a=0;for(let n=0;n<9;n++)a+=parseInt(t[n])*e[n];n=a%11,n>=10&&(n=0)}return t+n}}class Ht extends et{generate(){const t=this.randomInt(1,9)+this.randomDigits(8);let e=0,a=0;for(let n=0;n<9;n++)n%2==0?e+=parseInt(t[n]):a+=parseInt(t[n]);const n=t+(7*e-a)%10;let r=0;for(let t=0;t<10;t++)r+=parseInt(n[t]);return n+r%10}}class Bt extends et{generate(){const t=this.randomDigits(8);let e=0;for(let a=0;a<8;a++){let n=parseInt(t[a]);a%2==1&&(n*=2,n>9&&(n=Math.floor(n/10)+n%10)),e+=n}return t+(10-e%10)%10}}class Yt extends et{generate(){const t=this.randomInt(1950,2010),e=this.randomDigits(7),a=t+e;let n=0,r=!1;for(let t=a.length-1;t>=0;t--){let e=parseInt(a[t]);r&&(e*=2,e>9&&(e=e%10+1)),n+=e,r=!r}return`784-${t}-${e}-${(10-n%10)%10}`}}class Ot extends et{generate(){const t=this.randomInt(1,2)+this.randomDigits(8);let e=0,a=!1;for(let n=t.length-1;n>=0;n--){let r=parseInt(t[n]);a&&(r*=2,r>9&&(r=r%10+1)),e+=r,a=!a}return t+(10-e%10)%10}}class Jt extends et{generate(t={}){const{formatted:e=!0}=t,a=this.randomDigits(12),n=[6,5,4,3,2,7,6,5,4,3,2,7];let r=0;for(let t=0;t<12;t++)r+=parseInt(a[t])*n[t];const s=r%11,i=a+(s<2?s:11-s);return e?`${i.substring(0,5)}-${i.substring(5,12)}-${i.substring(12,13)}`:i}}class Wt extends et{generate(t={}){const{length:e=10