dynamsoft-mrz-scanner
Version:
Dynamsoft MRZ Scanner JavaScript Edition is a ready-to-use SDK for web applications that accurately recognizes and parses Machine-Readable Zones on Machine-Readable Travel Documents.
1 lines • 56.7 kB
JavaScript
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("dynamsoft-capture-vision-bundle")):"function"==typeof define&&define.amd?define(["exports","dynamsoft-capture-vision-bundle"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).Dynamsoft=e.Dynamsoft||{},e.Dynamsoft)}(this,(function(e,n){"use strict";function t(e){var n=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var i=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,i.get?i:{enumerable:!0,get:function(){return e[t]}})}})),n.default=e,Object.freeze(n)}var i,a,s,o=t(n);e.EnumMRZScanMode=void 0,(i=e.EnumMRZScanMode||(e.EnumMRZScanMode={})).Passport="passport",i.TD1="td1",i.TD2="td2",i.PassportAndTD1="passportAndTd1",i.PassportAndTD2="passportAndTd2",i.TD1AndTD2="td1AndTd2",i.All="all",e.EnumMRZDocumentType=void 0,(a=e.EnumMRZDocumentType||(e.EnumMRZDocumentType={})).Passport="passport",a.TD1="td1",a.TD2="td2",e.EnumMRZScannerViews=void 0,(s=e.EnumMRZScannerViews||(e.EnumMRZScannerViews={})).Scanner="scanner",s.Result="scan-result";const r={[e.EnumMRZScanMode.Passport]:"ReadPassport",[e.EnumMRZScanMode.TD1]:"ReadId-TD1",[e.EnumMRZScanMode.TD2]:"ReadId-TD2",[e.EnumMRZScanMode.PassportAndTD1]:"ReadPassportAndId-TD1",[e.EnumMRZScanMode.PassportAndTD2]:"ReadPassportAndId-TD2",[e.EnumMRZScanMode.TD1AndTD2]:"ReadId",[e.EnumMRZScanMode.All]:"ReadPassportAndId"};var l;function c(e){if("string"==typeof e){const n=document.querySelector(e);if(!n)throw new Error("Element not found");return n}return e instanceof HTMLElement?e:null}e.EnumResultStatus=void 0,(l=e.EnumResultStatus||(e.EnumResultStatus={}))[l.RS_SUCCESS=0]="RS_SUCCESS",l[l.RS_CANCELLED=1]="RS_CANCELLED",l[l.RS_FAILED=2]="RS_FAILED";function d(e,n){if(!document.getElementById(e)){const t=document.createElement("style");t.id=e,t.textContent=n,document.head.appendChild(t)}}const u=e=>!e||0===Object.keys(e).length;function h(e){return e?e.charAt(0).toUpperCase()+e.slice(1):""}const m={"4k":{width:3840,height:2160},"2k":{width:2560,height:1440},"1080p":{width:1920,height:1080},"720p":{width:1280,height:720},"480p":{width:640,height:480}};function g(e,n={}){const{message:t,spinnerSize:i=32}=n,a=document.createElement("div");a.className="dynamsoft-mrz-loading-screen";const s=document.createElement("div");s.className="dynamsoft-mrz-loading";const o=document.createElement("div");o.className="dynamsoft-mrz-loading-content";const r=`\n <svg \n xmlns="http://www.w3.org/2000/svg" \n viewBox="0 0 24 24" \n fill="none" \n stroke="white" \n stroke-linecap="round" \n stroke-linejoin="round" \n width="${i}" \n height="${i}" \n stroke-width="0.75"\n > \n <path d="M12 3a9 9 0 1 0 9 9"></path> \n </svg>\n `;if(o.innerHTML=r,t){const e=document.createElement("div");e.className="dynamsoft-mrz-loading-message",e.textContent=t,o.appendChild(e)}return s.appendChild(o),a.appendChild(s),e.appendChild(a),{element:a,updateMessage:e=>{let n=s.querySelector(".dynamsoft-mrz-loading-message");null!==e?n?n.textContent=e:(n=document.createElement("div"),n.className="dynamsoft-mrz-loading-message",n.textContent=e,o.appendChild(n)):null==n||n.remove()},hide:()=>{a&&a.parentNode&&(a.classList.add("fade-out"),setTimeout((()=>{var e;null===(e=a.parentNode)||void 0===e||e.removeChild(a)}),200))}}}const p='\n .dynamsoft-mrz-loading-screen {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: #323234;\n z-index: 998;\n opacity: 1;\n transition: opacity 0.2s ease-out;\n }\n\n .dynamsoft-mrz-loading-screen.fade-out {\n opacity: 0;\n }\n\n .dynamsoft-mrz-loading {\n position: absolute;\n left: 50%;\n top: 50%;\n color: white;\n z-index: 999;\n transform: translate(-50%, -50%);\n }\n\n .dynamsoft-mrz-loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n }\n\n .dynamsoft-mrz-loading svg {\n animation: spin 1s linear infinite;\n }\n\n .dynamsoft-mrz-loading-message {\n color: white;\n font-family: "Verdana";\n font-size: 14px;\n text-align: center;\n max-width: 200px;\n line-height: 1.4;\n opacity: 0.9;\n }\n\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n';var f;e.EnumMRZData=void 0,(f=e.EnumMRZData||(e.EnumMRZData={})).InvalidFields="invalidFields",f.DocumentType="documentType",f.DocumentNumber="documentNumber",f.MRZText="mrzText",f.FirstName="firstName",f.LastName="lastName",f.Age="age",f.Sex="sex",f.IssuingState="issuingState",f.IssuingStateRaw="issuingStateRaw",f.Nationality="nationality",f.NationalityRaw="nationalityRaw",f.DateOfBirth="dateOfBirth",f.DateOfExpiry="dateOfExpiry";const y={[e.EnumMRZData.InvalidFields]:"Invalid Fields",[e.EnumMRZData.DocumentType]:"Document Type",[e.EnumMRZData.DocumentNumber]:"Document Number",[e.EnumMRZData.MRZText]:"MRZ Text",[e.EnumMRZData.FirstName]:"Given Name(s)",[e.EnumMRZData.LastName]:"Surname",[e.EnumMRZData.Age]:"Age",[e.EnumMRZData.Sex]:"Sex",[e.EnumMRZData.IssuingState]:"Issuing State",[e.EnumMRZData.IssuingStateRaw]:"Issuing State (Raw Value)",[e.EnumMRZData.Nationality]:"Nationality",[e.EnumMRZData.NationalityRaw]:"Nationality State (Raw Value)",[e.EnumMRZData.DateOfBirth]:"Date Of Birth (YYYY-MM-DD)",[e.EnumMRZData.DateOfExpiry]:"Date Of Expiry (YYYY-MM-DD)"};function R(e,n,t,i=!1){const a=parseInt(e,10);let s;if(i)s=a>=60?1900+a:2e3+a;else{s=a>(new Date).getFullYear()%100?1900+a:2e3+a}return{year:s,month:parseInt(n,10),day:parseInt(t,10)}}function w(e){const n=e=>{var n;return 1===(null===(n=`${e}`)||void 0===n?void 0:n.length)?`0${e}`:e};return`${null==e?void 0:e.year}-${n(null==e?void 0:e.month)}${(null==e?void 0:e.day)&&`-${n(null==e?void 0:e.day)}`}`}function v(e){return"D<<"===e?"D":e}function E(t,i){const a=[],s=e=>i.getFieldValidationStatus(e)===n.EnumValidationStatus.VS_FAILED,o=i.codeType,r=function(n){switch(n){case"MRTD_TD1_ID":return e.EnumMRZDocumentType.TD1;case"MRTD_TD2_ID":case"MRTD_TD2_VISA":case"MRTD_TD2_FRENCH_ID":return e.EnumMRZDocumentType.TD2;case"MRTD_TD3_PASSPORT":case"MRTD_TD3_VISA":return e.EnumMRZDocumentType.Passport;default:throw new Error(`Unknown document type: ${n}`)}}(o),l=function(e){switch(e){case"MRTD_TD1_ID":return"ID (TD1)";case"MRTD_TD2_ID":return"ID (TD2)";case"MRTD_TD2_VISA":return"ID (VISA)";case"MRTD_TD2_FRENCH_ID":return"French ID (TD2)";case"MRTD_TD3_PASSPORT":return"Passport (TD3)";case"MRTD_TD3_VISA":return"Visa (TD3)";default:throw new Error(`Unknown document type: ${e}`)}}(o),c=r===e.EnumMRZDocumentType.Passport&&"MRTD_TD3_PASSPORT"===o?"passportNumber":"documentNumber",d=R(i.getFieldValue("birthYear"),i.getFieldValue("birthMonth"),i.getFieldValue("birthDay")),u=R(i.getFieldValue("expiryYear"),i.getFieldValue("expiryMonth"),i.getFieldValue("expiryDay"),!0);["birthYear","birthMonth","birthDay"].forEach((n=>{s(n)&&a.push(e.EnumMRZData.DateOfBirth)})),["expiryYear","expiryMonth","expiryDay"].forEach((n=>{s(n)&&a.push(e.EnumMRZData.DateOfExpiry)}));const m={[e.EnumMRZData.LastName]:i.getFieldValue("primaryIdentifier"),[e.EnumMRZData.FirstName]:i.getFieldValue("secondaryIdentifier"),[e.EnumMRZData.Nationality]:i.getFieldValue("nationality"),[e.EnumMRZData.NationalityRaw]:v(i.getFieldRawValue("nationality")),[e.EnumMRZData.DocumentNumber]:i.getFieldValue(c)||i.getFieldValue("longDocumentNumber"),[e.EnumMRZData.IssuingState]:i.getFieldValue("issuingState"),[e.EnumMRZData.IssuingStateRaw]:v(i.getFieldRawValue("issuingState")),[e.EnumMRZData.Sex]:h(i.getFieldValue("sex"))};Object.keys(m).forEach((n=>{let t=!1;switch(n){case e.EnumMRZData.FirstName:t=s("secondaryIdentifier");break;case e.EnumMRZData.LastName:t=s("primaryIdentifier");break;case e.EnumMRZData.DocumentNumber:t=s(c)||s("longDocumentNumber");break;default:t=s(n)}t&&a.push(n)}));const g=function(e){const n=new Date,t=n.getMonth()+1>e.month||n.getMonth()+1===e.month&&n.getDate()>=e.day;return n.getFullYear()-e.year-(t?0:1)}(d);g<1&&a.push(e.EnumMRZData.Age);return{[e.EnumMRZData.InvalidFields]:a,[e.EnumMRZData.FirstName]:m[e.EnumMRZData.FirstName],[e.EnumMRZData.LastName]:m[e.EnumMRZData.LastName],[e.EnumMRZData.Age]:g,[e.EnumMRZData.DateOfBirth]:d,[e.EnumMRZData.Sex]:m[e.EnumMRZData.Sex],[e.EnumMRZData.Nationality]:m[e.EnumMRZData.Nationality],[e.EnumMRZData.NationalityRaw]:m[e.EnumMRZData.NationalityRaw],[e.EnumMRZData.DocumentNumber]:m[e.EnumMRZData.DocumentNumber],[e.EnumMRZData.DateOfExpiry]:u,[e.EnumMRZData.IssuingState]:m[e.EnumMRZData.IssuingState],[e.EnumMRZData.IssuingStateRaw]:m[e.EnumMRZData.IssuingStateRaw],[e.EnumMRZData.DocumentType]:h(l),[e.EnumMRZData.MRZText]:t}}const M={[e.EnumMRZDocumentType.TD1]:{width:85.6,height:53.98},[e.EnumMRZDocumentType.TD2]:{width:105,height:74},[e.EnumMRZDocumentType.Passport]:{width:125,height:88}};class D{showScannerLoadingOverlay(e){const n=c(this.config.container);this.loadingScreen=g(n,{message:e}),n.style.display="block",n.style.position="relative"}hideScannerLoadingOverlay(e=!1){this.loadingScreen&&(this.loadingScreen.hide(),this.loadingScreen=null,e&&(c(this.config.container).style.display="none"))}constructor(n,t){this.resources=n,this.config=t,this.isSoundFeedbackOn=!1,this.scanModeManager={[e.EnumMRZDocumentType.Passport]:!0,[e.EnumMRZDocumentType.TD1]:!0,[e.EnumMRZDocumentType.TD2]:!0},this.currentScanMode=e.EnumMRZScanMode.All,this.resizeTimer=null,this.capturedResultItems=[],this.originalImageData=null,this.initialized=!1,this.initializedDCE=!1,this.DCE_ELEMENTS={selectCameraBtn:null,uploadImageBtn:null,soundFeedbackBtn:null,closeScannerBtn:null,scanModeSelectContainer:null,passportModeOption:null,td1ModeOption:null,td2ModeOption:null,toast:null},this.loadingScreen=null,this.handleResize=()=>{this.toggleScanGuide(!1),this.resizeTimer&&window.clearTimeout(this.resizeTimer),this.resizeTimer=window.setTimeout((()=>{this.toggleScanGuide(!0)}),500)},this.firstFrame=!0}async initialize(){if(!this.initialized){this.initializeScanModeManager(),this.currentScanMode=this.getScanMode(),d("dynamsoft-mrz-loading-screen-style",p);try{const{cameraView:e,cameraEnhancer:t,cvRouter:i}=this.resources;if(e.setScanRegionMaskStyle({strokeStyle:"transparent",fillStyle:"transparent",lineWidth:0}),e.setVideoFit("cover"),i.setInput(t),!0===this.config.enableMultiFrameCrossFilter){const e=new n.MultiFrameResultCrossFilter;e.enableResultCrossVerification(n.EnumCapturedResultItemType.CRIT_TEXT_LINE,!0),await i.addResultFilter(e)}const a=new n.CapturedResultReceiver;a.onCapturedResultReceived=e=>this.handleMRZResult(e),await i.addResultReceiver(a),this.toggleSoundFeedback(!1),!1===this.config.showScanGuide&&this.toggleScanGuide(!1),this.initialized=!0}catch(n){let t=(null==n?void 0:n.message)||n;console.error(t),alert(t),this.closeCamera();const i={status:{code:e.EnumResultStatus.RS_FAILED,message:"Dynamsoft MRZ Scanner initialize error"}};this.currentScanResolver(i)}}}initializeElements(){var e;const n=c(this.config.container),t=n.children[n.children.length-1];if(!(null==t?void 0:t.shadowRoot))throw new Error("Shadow root not found");if(this.DCE_ELEMENTS={selectCameraBtn:t.shadowRoot.querySelector(".dce-mn-select-camera-icon"),uploadImageBtn:t.shadowRoot.querySelector(".dce-mn-upload-image-icon"),soundFeedbackBtn:t.shadowRoot.querySelector(".dce-mn-sound-feedback"),closeScannerBtn:t.shadowRoot.querySelector(".dce-mn-close"),scanModeSelectContainer:t.shadowRoot.querySelector(".dce-mn-scan-mode-select"),passportModeOption:t.shadowRoot.querySelector(".scan-mode-option-passport"),td1ModeOption:t.shadowRoot.querySelector(".scan-mode-option-td1"),td2ModeOption:t.shadowRoot.querySelector(".scan-mode-option-td2"),toast:t.shadowRoot.querySelector(".dce-mn-toast")},this.setupScanModeSelector(),this.assignDCEClickEvents(),this.DCE_ELEMENTS.toast.style.display="none",!1===this.config.showUploadImage&&(this.DCE_ELEMENTS.uploadImageBtn.style.visibility="hidden"),!1===this.config.showSoundToggle&&(this.DCE_ELEMENTS.soundFeedbackBtn.style.visibility="hidden"),!1===(null===(e=this.config)||void 0===e?void 0:e.showPoweredByDynamsoft)){t.shadowRoot.querySelector(".dce-mn-msg-poweredby").style.display="none"}this.initializedDCE=!0}setupScanModeSelector(){if(!1!==this.config.showFormatSelector)switch(this.currentScanMode){case e.EnumMRZScanMode.PassportAndTD1:this.DCE_ELEMENTS.td2ModeOption.style.display="none";break;case e.EnumMRZScanMode.PassportAndTD2:this.DCE_ELEMENTS.td1ModeOption.style.display="none";break;case e.EnumMRZScanMode.TD1AndTD2:this.DCE_ELEMENTS.passportModeOption.style.display="none";break;case e.EnumMRZScanMode.All:break;default:this.DCE_ELEMENTS.scanModeSelectContainer.style.display="none"}else this.DCE_ELEMENTS.scanModeSelectContainer.style.display="none"}assignDCEClickEvents(){if(!Object.values(this.DCE_ELEMENTS).every(Boolean))throw new Error("Camera control elements not found");this.closeCamera=this.closeCamera.bind(this),this.DCE_ELEMENTS.uploadImageBtn.onclick=()=>this.uploadFile(),this.DCE_ELEMENTS.soundFeedbackBtn.onclick=()=>this.toggleSoundFeedback(),this.DCE_ELEMENTS.closeScannerBtn.onclick=()=>this.handleCloseBtn(),this.DCE_ELEMENTS.selectCameraBtn.onclick=e=>{e.stopPropagation(),this.toggleSelectCameraBox()},this.DCE_ELEMENTS.passportModeOption.onclick=async()=>{"none"!==this.DCE_ELEMENTS.passportModeOption.style.display&&await this.toggleScanDocType(e.EnumMRZDocumentType.Passport)},this.DCE_ELEMENTS.td1ModeOption.onclick=async()=>{"none"!==this.DCE_ELEMENTS.td1ModeOption.style.display&&await this.toggleScanDocType(e.EnumMRZDocumentType.TD1)},this.DCE_ELEMENTS.td2ModeOption.onclick=async()=>{"none"!==this.DCE_ELEMENTS.td2ModeOption.style.display&&await this.toggleScanDocType(e.EnumMRZDocumentType.TD2)}}handleCloseBtn(){this.closeCamera(),this.currentScanResolver&&this.currentScanResolver({status:{code:e.EnumResultStatus.RS_CANCELLED,message:"Cancelled"}})}attachOptionClickListeners(){const e=c(this.config.container),n=e.children[e.children.length-1];if(!(null==n?void 0:n.shadowRoot))return;const t=n.shadowRoot.querySelector(".dce-mn-camera-and-resolution-settings");[...n.shadowRoot.querySelectorAll(".dce-mn-camera-option"),...n.shadowRoot.querySelectorAll(".dce-mn-resolution-option")].forEach((e=>{e.addEventListener("click",(async n=>{const i=e.getAttribute("data-davice-id"),a=e.getAttribute("data-height"),s=e.getAttribute("data-width");i?this.resources.cameraEnhancer.selectCamera(i).then((()=>{this.toggleScanGuide()})):a&&s&&this.resources.cameraEnhancer.setResolution({width:parseInt(s),height:parseInt(a)}).then((()=>{this.toggleScanGuide()})),"none"!==t.style.display&&this.toggleSelectCameraBox()}))}))}highlightCameraAndResolutionOption(){const e=c(this.config.container),n=e.children[e.children.length-1];if(!(null==n?void 0:n.shadowRoot))return;const t=n.shadowRoot.querySelector(".dce-mn-camera-and-resolution-settings"),i=t.querySelectorAll(".dce-mn-camera-option"),a=t.querySelectorAll(".dce-mn-resolution-option"),s=this.resources.cameraEnhancer.getSelectedCamera(),o=this.resources.cameraEnhancer.getResolution();i.forEach((e=>{const n=e;n.getAttribute("data-davice-id")===(null==s?void 0:s.deviceId)?n.style.border="2px solid #fe814a":n.style.border="none"}));const r={"480p":"480","720p":"720","1080p":"1080","2k":"1440","4k":"2160"},l=function(e){const n=e.width*e.height,t=e.width/e.height;let i="480p",a=Number.MAX_VALUE;for(const[e,s]of Object.entries(m)){const o=s.width*s.height,r=s.width/s.height,l=.7*Math.abs(o-n)+Math.abs(r-t)*o*.3;l<a&&(a=l,i=e)}return i}(o);a.forEach((e=>{const n=e,t=n.getAttribute("data-height");n.style.border=t===r[l]?"2px solid #fe814a":"none"}))}toggleSelectCameraBox(){const e=c(this.config.container),n=e.children[e.children.length-1];if(!(null==n?void 0:n.shadowRoot))return;const t=n.shadowRoot.querySelector(".dce-mn-resolution-box");this.highlightCameraAndResolutionOption(),this.attachOptionClickListeners(),t.click()}async relaunch(){}async uploadFile(){var t,i,a,s,o,r;const{cvRouter:l}=this.resources,c=document.createElement("input");c.type="file",c.accept=null!==(t=this.config.uploadAcceptedTypes)&&void 0!==t?t:"image/*",c.style.display="none",document.body.appendChild(c);try{this.showScannerLoadingOverlay("Processing file..."),await this.closeCamera(!1);const t=await new Promise(((e,n)=>{c.onchange=t=>{var i;const a=null===(i=t.target.files)||void 0===i?void 0:i[0];a?e(a):n(new Error("No file selected"))},c.addEventListener("cancel",(async()=>{this.hideScannerLoadingOverlay(!1),this.showScannerLoadingOverlay("Initializing camera..."),await this.openCamera(),this.toggleScanGuide(),await this.startCapturing(),this.hideScannerLoadingOverlay()})),c.click()}));if(!t)return;let d;if(this.config.uploadFileConverter&&!t.type.startsWith("image/"))try{d=await this.config.uploadFileConverter(t)}catch(e){throw new Error(`Error converting file: ${e.message}`)}else{if(!t.type.startsWith("image/"))throw new Error("Unsupported file type. Please provide a converter function for this file type.");d=t}const u=this.config.utilizedTemplateNames[this.currentScanMode];if(!1!==this.config.showScanGuide){const e=await l.getSimplifiedSettings(u);e.roiMeasuredInPercentage=!0,e.roi.points=[{x:0,y:0},{x:100,y:0},{x:100,y:100},{x:0,y:100}],await l.updateSettings(u,e)}const h=await l.capture(d,u);this.capturedResultItems=h.items;const m=this.capturedResultItems.filter((e=>e.type===n.EnumCapturedResultItemType.CRIT_ORIGINAL_IMAGE));if(0===m.length)throw new Error("No image data found in the captured result");const g=m[0].imageData;g.toCanvas=()=>n._toCanvas(g),g.toBlob=async()=>await n._toBlob("image/png",g),this.originalImageData=g;const p=null===(i=null==h?void 0:h.parsedResult)||void 0===i?void 0:i.parsedResultItems;let f={};if(null==p?void 0:p.length){const e=(null===(s=null===(a=p[0])||void 0===a?void 0:a.referencedItem)||void 0===s?void 0:s.text)||"";f=E(e,p[0])}const y={status:{code:e.EnumResultStatus.RS_SUCCESS,message:"Success"},originalImageResult:this.originalImageData,data:f,imageData:!0,_imageData:this.originalImageData};null===(r=(o=this.resources).onResultUpdated)||void 0===r||r.call(o,y),this.currentScanResolver(y)}catch(n){let t=(null==n?void 0:n.message)||n;console.error(t),alert(t),this.closeCamera();const i={status:{code:e.EnumResultStatus.RS_FAILED,message:`Error processing file: ${t}`}};this.currentScanResolver(i)}finally{this.hideScannerLoadingOverlay(!0),document.body.removeChild(c)}}toggleSoundFeedback(e){this.isSoundFeedbackOn=void 0!==e?e:!this.isSoundFeedbackOn;const n=c(this.config.container),t=n.children[n.children.length-1];if(!(null==t?void 0:t.shadowRoot))return;const i=t.shadowRoot.querySelector(".dce-mn-sound-feedback"),a=i.querySelector(".dce-mn-sound-feedback-on");i.querySelector(".dce-mn-sound-feedback-off").style.display=this.isSoundFeedbackOn?"none":"block",a.style.display=this.isSoundFeedbackOn?"block":"none"}calculateScanRegion(e){const{cameraEnhancer:n,cameraView:t}=this.resources;if(!n||!n.isOpen())return;const i=M[e].width/M[e].height;let a;const s=t.getVisibleRegionOfVideo({inPixels:!0}),{width:o,height:r}=s;if(s){if(s.width>s.height){const e=.5*r*i,n=Math.round(e/o*100),t=(100-n)/2;a={left:t,right:t+n,top:25,bottom:75,isMeasuredInPercentage:!0}}else{const e=.9*o/i,n=Math.round(e/r*100),t=(100-n)/2;a={left:5,right:95,top:t,bottom:t+n,isMeasuredInPercentage:!0}}null==t||t.setScanRegionMaskVisible(!0),n.setScanRegion(a)}}toggleScanGuide(n){const t=c(this.config.container),i=t.children[t.children.length-1];if(!(null==i?void 0:i.shadowRoot))return;const a=i.shadowRoot.querySelector(".dce-scanguide-passport"),s=i.shadowRoot.querySelector(".dce-scanguide-td1"),o=i.shadowRoot.querySelector(".dce-scanguide-td2");if(!1===n||!1===this.config.showScanGuide)return a.style.display="none",s.style.display="none",void(o.style.display="none");switch(this.currentScanMode){case e.EnumMRZScanMode.All:case e.EnumMRZScanMode.Passport:case e.EnumMRZScanMode.PassportAndTD1:case e.EnumMRZScanMode.PassportAndTD2:a.style.display="block",s.style.display="none",o.style.display="none",this.calculateScanRegion(e.EnumMRZDocumentType.Passport);break;case e.EnumMRZScanMode.TD1:case e.EnumMRZScanMode.TD1AndTD2:a.style.display="none",s.style.display="block",o.style.display="none",this.calculateScanRegion(e.EnumMRZDocumentType.TD1);break;case e.EnumMRZScanMode.TD2:a.style.display="none",s.style.display="none",o.style.display="block",this.calculateScanRegion(e.EnumMRZDocumentType.TD2)}}async openCamera(){try{const{cameraEnhancer:e,cameraView:n}=this.resources,t=c(this.config.container);if(t.style.display="block",e.isOpen())e.isPaused()&&await e.resume();else{const i=n.getUIElement();i.parentElement||t.append(i),await e.open()}await e.setResolution({width:2560,height:1440}),!this.initializedDCE&&e.isOpen()&&await this.initializeElements(),window.addEventListener("resize",this.handleResize);const i=t.children[t.children.length-1];if(!(null==i?void 0:i.shadowRoot))throw new Error("Shadow root not found");i.shadowRoot.querySelector(".dce-mn-torch-off").style.display="none",i.shadowRoot.querySelector(".dce-mn-torch-on").style.display="none"}catch(n){let t=(null==n?void 0:n.message)||n;console.error(t),alert(t),this.closeCamera();const i={status:{code:e.EnumResultStatus.RS_FAILED,message:"MRZ Scanner Open Camera Error"}};this.currentScanResolver(i)}}async closeCamera(e=!0){try{window.removeEventListener("resize",this.handleResize),this.resizeTimer&&(window.clearTimeout(this.resizeTimer),this.resizeTimer=null);const{cameraEnhancer:n,cameraView:t}=this.resources,i=c(this.config.container);i.style.display=e?"none":"block",(null==t?void 0:t.getUIElement().parentElement)&&i.removeChild(t.getUIElement()),n.close(),this.stopCapturing()}catch(e){let n=(null==e?void 0:e.message)||e;console.error(`Close Camera error: ${n}`)}}pauseCamera(){const{cameraEnhancer:e}=this.resources;e.pause()}stopCapturing(){const{cameraView:e,cvRouter:n}=this.resources;n.stopCapturing(),e.clearAllInnerDrawingItems()}async handleMRZResult(t){var i,a,s;if(this.firstFrame)this.firstFrame=!1;else if(!(t.items.length<=1)){this.capturedResultItems=t.items;try{const{onResultUpdated:o}=this.resources,r=t.items.filter((e=>e.type===n.EnumCapturedResultItemType.CRIT_ORIGINAL_IMAGE))[0].imageData;r.toCanvas=()=>n._toCanvas(r),r.toBlob=async()=>await n._toBlob("image/png",r),this.originalImageData=r;const l=null===(i=null==t?void 0:t.parsedResult)||void 0===i?void 0:i.parsedResultItems;if(null==l?void 0:l.length){this.isSoundFeedbackOn&&n.Feedback.beep();const t=(null===(s=null===(a=l[0])||void 0===a?void 0:a.referencedItem)||void 0===s?void 0:s.text)||"",i=E(t,l[0]);this.closeCamera();const r={status:{code:e.EnumResultStatus.RS_SUCCESS,message:"Success"},originalImageResult:this.originalImageData,data:i,imageData:!0,_imageData:this.originalImageData};null==o||o(r),this.currentScanResolver(r)}}catch(n){let t=(null==n?void 0:n.message)||n;console.error(t),alert(t),this.closeCamera();const i={status:{code:e.EnumResultStatus.RS_FAILED,message:"Error capturing image"}};this.currentScanResolver(i)}}}initializeScanModeManager(){const{mrzFormatType:n}=this.config;if(this.scanModeManager={[e.EnumMRZDocumentType.Passport]:!0,[e.EnumMRZDocumentType.TD1]:!0,[e.EnumMRZDocumentType.TD2]:!0},!n||Array.isArray(n)&&0===n.length)return;Object.keys(this.scanModeManager).forEach((e=>{this.scanModeManager[e]=!1}));(Array.isArray(n)?n:[n]).forEach((e=>{this.scanModeManager[e]=!0}))}getScanMode(){const n=Object.entries(this.scanModeManager).filter((([e,n])=>n)).map((([e])=>e)).sort().join(",");return{[e.EnumMRZDocumentType.Passport]:e.EnumMRZScanMode.Passport,[e.EnumMRZDocumentType.TD1]:e.EnumMRZScanMode.TD1,[e.EnumMRZDocumentType.TD2]:e.EnumMRZScanMode.TD2,[`${e.EnumMRZDocumentType.Passport},${e.EnumMRZDocumentType.TD1}`]:e.EnumMRZScanMode.PassportAndTD1,[`${e.EnumMRZDocumentType.Passport},${e.EnumMRZDocumentType.TD2}`]:e.EnumMRZScanMode.PassportAndTD2,[`${e.EnumMRZDocumentType.TD1},${e.EnumMRZDocumentType.TD2}`]:e.EnumMRZScanMode.TD1AndTD2,[`${e.EnumMRZDocumentType.Passport},${e.EnumMRZDocumentType.TD1},${e.EnumMRZDocumentType.TD2}`]:e.EnumMRZScanMode.All,"":e.EnumMRZScanMode.All}[n]}DCEShowToast(e,n=3e3){this.DCE_ELEMENTS.toast&&(this.DCE_ELEMENTS.toast.textContent=e,this.DCE_ELEMENTS.toast.style.display="",setTimeout((()=>{this.DCE_ELEMENTS.toast.style.display="none"}),n))}async startCapturing(){const{cvRouter:t,cameraEnhancer:i}=this.resources,a=this.config.utilizedTemplateNames[this.currentScanMode];try{if(!1!==this.config.showScanGuide){const e=await t.getSimplifiedSettings(a);e.roiMeasuredInPercentage=!0,e.roi.points=[{x:0,y:50},{x:100,y:50},{x:100,y:100},{x:0,y:100}],await t.updateSettings(a,e)}this.firstFrame=!0,await t.startCapturing(a),i.setPixelFormat(n.EnumImagePixelFormat.IPF_ABGR_8888)}catch(n){let t=(null==n?void 0:n.message)||n;console.error("Failed to start capturing:",t),this.closeCamera(),this.currentScanResolver&&this.currentScanResolver({status:{code:e.EnumResultStatus.RS_FAILED,message:"Failed to start capturing"}})}}async toggleScanDocType(n){try{if(this.scanModeManager[n]&&0===Object.entries(this.scanModeManager).filter((([e,t])=>t&&e!==n)).length)return console.warn("MRZ Scanner - At least one mode must be enabled"),void this.DCEShowToast("At least one mode must be enabled");this.scanModeManager[n]=!this.scanModeManager[n],this.currentScanMode=this.getScanMode(),this.stopCapturing(),this.toggleScanGuide(),await this.startCapturing(),this.DCE_ELEMENTS.td1ModeOption.classList.toggle("selected",this.scanModeManager[e.EnumMRZDocumentType.TD1]),this.DCE_ELEMENTS.td2ModeOption.classList.toggle("selected",this.scanModeManager[e.EnumMRZDocumentType.TD2]),this.DCE_ELEMENTS.passportModeOption.classList.toggle("selected",this.scanModeManager[e.EnumMRZDocumentType.Passport])}catch(n){let t=(null==n?void 0:n.message)||n;console.error("MRZ Scanner switch scan mode error: ",t),this.closeCamera();const i={status:{code:e.EnumResultStatus.RS_FAILED,message:"MRZ Scanner switch scan mode error"}};this.currentScanResolver(i)}}async launch(){try{await this.initialize();const{cvRouter:e,cameraEnhancer:n}=this.resources;return new Promise((async e=>{this.currentScanResolver=e,this.showScannerLoadingOverlay("Initializing camera..."),await this.openCamera(),!this.initializedDCE&&n.isOpen()&&await this.initializeElements(),this.toggleScanGuide(),await this.startCapturing(),this.hideScannerLoadingOverlay()}))}catch(n){let t=(null==n?void 0:n.message)||n;console.error("MRZ Scanner launch error: ",t),this.closeCamera();const i={status:{code:e.EnumResultStatus.RS_FAILED,message:"MRZ Scanner launch error"}};this.currentScanResolver(i)}}}const S={cancel:'\n<svg id="cancel" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">\n <defs>\n <clipPath id="cancelclip-path">\n <rect id="Rectangle_2774" data-name="Rectangle 2774" width="24" height="24" fill="currentColor"/>\n </clipPath>\n </defs>\n <g id="Group_582" data-name="Group 582" clip-path="url(#cancelclip-path)" transform="rotate(180 12 12)">\n <path id="Path_1524" data-name="Path 1524" d="M12,0A12,12,0,1,0,24,12,12.013,12.013,0,0,0,12,0m0,23A11,11,0,1,1,23,12,11.013,11.013,0,0,1,12,23" fill="currentColor"/>\n <path id="Path_1525" data-name="Path 1525" d="M19.862,12a.17.17,0,0,0,0-.024.512.512,0,0,0-.033-.168.532.532,0,0,0-.113-.17l-4.219-4.29a.5.5,0,0,0-.714,0,.51.51,0,0,0,0,.719l3.371,3.428H4.643a.509.509,0,0,0,0,1.018h13.5l-3.373,3.428a.512.512,0,0,0,0,.72.5.5,0,0,0,.714,0l4.224-4.295a.438.438,0,0,0,.056-.086.5.5,0,0,0,.051-.078A.521.521,0,0,0,19.862,12h0" fill="currentColor"/>\n </g>\n</svg> \n ',rescan:'<svg id="re-take" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.761" height="23" viewBox="0 0 28.761 23">\n<defs>\n<clipPath id="retakeclip-path">\n <rect id="Rectangle_2773" data-name="Rectangle 2773" width="28.761" height="23" fill="#fff"/>\n</clipPath>\n</defs>\n<g id="Group_580" data-name="Group 580" clip-path="url(#retakeclip-path)">\n<path id="Path_1522" data-name="Path 1522" d="M25.877,3.639H21.663a.7.7,0,0,1-.575-.288l-.575-.764C19.264.961,18.59,0,17.44,0H11.4C10.151,0,9.486.961,8.336,2.588l-.674.764a.7.7,0,0,1-.575.288H2.875C.476,3.639,0,5.077,0,6.227v13.9C0,22.041,1.051,23,2.974,23H25.787c1.914,0,2.974-.961,2.974-2.776v-14c-.008-1.147-.485-2.585-2.884-2.585m-.1,18.411H2.974c-1.339,0-2.013-.575-2.013-1.824v-14c0-.863.189-1.626,1.914-1.626H7.188a1.666,1.666,0,0,0,1.339-.674L9.1,3.162c1.15-1.626,1.536-2.2,2.2-2.2H17.34c.674,0,1.15.575,2.3,2.2l.575.764a1.562,1.562,0,0,0,1.339.674h4.313c1.725,0,1.914.764,1.914,1.626v14h.009c0,1.249-.673,1.824-2.012,1.824" fill="#fff"/>\n<path id="Path_1523" data-name="Path 1523" d="M15.978,9.16H9.462l1.745-1.743A.5.5,0,0,0,10.5,6.71l-2.6,2.6a.484.484,0,0,0-.108.162.5.5,0,0,0,0,.382.479.479,0,0,0,.108.163l2.6,2.6a.5.5,0,0,0,.708-.708L9.462,10.16h6.516a4.028,4.028,0,0,1,0,8.055H10.255a.5.5,0,1,0,0,1h5.723a5.028,5.028,0,0,0,0-10.055" fill="#fff"/>\n</g>\n</svg>\n',complete:'\n<svg id="continue" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">\n<defs>\n<clipPath id="continueclip-path">\n <rect id="Rectangle_2774" data-name="Rectangle 2774" width="24" height="24" fill="currentColor"/>\n</clipPath>\n</defs>\n<g id="Group_582" data-name="Group 582" clip-path="url(#continueclip-path)">\n<path id="Path_1524" data-name="Path 1524" d="M12,0A12,12,0,1,0,24,12,12.013,12.013,0,0,0,12,0m0,23A11,11,0,1,1,23,12,11.013,11.013,0,0,1,12,23" fill="currentColor"/>\n<path id="Path_1525" data-name="Path 1525" d="M19.862,12a.17.17,0,0,0,0-.024.512.512,0,0,0-.033-.168.532.532,0,0,0-.113-.17l-4.219-4.29a.5.5,0,0,0-.714,0,.51.51,0,0,0,0,.719l3.371,3.428H4.643a.509.509,0,0,0,0,1.018h13.5l-3.373,3.428a.512.512,0,0,0,0,.72.5.5,0,0,0,.714,0l4.224-4.295a.438.438,0,0,0,.056-.086.5.5,0,0,0,.051-.078A.521.521,0,0,0,19.862,12h0" fill="currentColor"/>\n</g>\n</svg>\n',failed:'\n <svg\n xmlns="http://www.w3.org/2000/svg"\n width="20"\n height="20"\n viewBox="0 0 20 20"\n fill="none"\n stroke="#ef4444"\n stroke-width="2"\n stroke-linecap="round"\n stroke-linejoin="round"\n>\n <path d="M18 6l-12 12" />\n <path d="M6 6l12 12" />\n</svg>\n',info:'\n<svg\n xmlns="http://www.w3.org/2000/svg"\n width="24"\n height="24"\n viewBox="0 0 24 24"\n fill="none"\n stroke="white"\n stroke-width="2"\n stroke-linecap="round"\n stroke-linejoin="round"\n>\n <path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" />\n <path d="M12 9h.01" />\n <path d="M11 12h1v4h1" />\n</svg>\n'};class C{constructor(e,n,t){this.resources=e,this.config=n,this.scannerView=t,this.editedFields={}}async launch(){try{return c(this.config.container).textContent="",await this.initialize(),c(this.config.container).style.display="flex",new Promise((e=>{this.currentScanResultViewResolver=e}))}catch(e){let n=(null==e?void 0:e.message)||e;throw console.error(n),n}}async handleRescan(){var n;try{if(!this.scannerView)return void console.error("Scanner View not initialized");this.hideView();const t=await this.scannerView.launch();if((null===(n=null==t?void 0:t.status)||void 0===n?void 0:n.code)===e.EnumResultStatus.RS_FAILED)return void(this.currentScanResultViewResolver&&this.currentScanResultViewResolver(t));this.resources.onResultUpdated&&((null==t?void 0:t.status.code)===e.EnumResultStatus.RS_CANCELLED?this.resources.onResultUpdated(this.resources.result):(null==t?void 0:t.status.code)===e.EnumResultStatus.RS_SUCCESS&&this.resources.onResultUpdated(t)),this.dispose(!0),await this.initialize(),c(this.config.container).style.display="flex"}catch(n){throw console.error("Error in rescan handler:",n),this.currentScanResultViewResolver&&this.currentScanResultViewResolver({status:{code:e.EnumResultStatus.RS_FAILED,message:(null==n?void 0:n.message)||n}}),n}}async handleCancel(){var n;try{(null===(n=this.config)||void 0===n?void 0:n.onCancel)&&await this.config.onCancel(this.resources.result),this.currentScanResultViewResolver&&this.currentScanResultViewResolver({status:{code:e.EnumResultStatus.RS_CANCELLED,message:"Upload file cancelled"}}),this.hideView(),this.dispose()}catch(n){throw console.error("Error in cancel handler:",n),this.currentScanResultViewResolver&&this.currentScanResultViewResolver({status:{code:e.EnumResultStatus.RS_FAILED,message:(null==n?void 0:n.message)||n}}),n}}async handleDone(){var n,t;try{(null===(n=this.resources.result)||void 0===n?void 0:n.data)&&!u(this.editedFields)&&(this.resources.result.data=Object.assign(Object.assign({},this.resources.result.data),this.editedFields),this.resources.onResultUpdated&&this.resources.onResultUpdated(this.resources.result)),(null===(t=this.config)||void 0===t?void 0:t.onDone)&&await this.config.onDone(this.resources.result),this.currentScanResultViewResolver&&this.resources.result&&this.currentScanResultViewResolver(this.resources.result),this.hideView(),this.dispose()}catch(n){throw console.error("Error in done handler:",n),this.currentScanResultViewResolver&&this.currentScanResultViewResolver({status:{code:e.EnumResultStatus.RS_FAILED,message:(null==n?void 0:n.message)||n}}),n}}createControls(){var e,n,t,i,a,s,o,r,l,c,u,h;const{toolbarButtonsConfig:m}=this.config;return function(e){d("dynamsoft-mrz-controls-style","\n .dynamsoft-mrz-controls {\n display: flex;\n height: 6rem;\n background-color: #323234;\n align-items: center;\n font-size: 12px;\n font-family: Verdana;\n color: white;\n width: 100%;\n }\n\n .dynamsoft-mrz-control-btn {\n background-color: #323234;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n height: 100%;\n width: 100%;\n gap: 0.5rem;\n text-align: center;\n user-select: none;\n }\n\n .dynamsoft-mrz-control-btn.hide {\n display: none;\n }\n\n .dynamsoft-mrz-control-btn.disabled {\n opacity: 0.4;\n pointer-events: none;\n cursor: default;\n }\n\n .dynamsoft-mrz-control-icon-wrapper {\n flex: 0.75;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n min-height: 40px;\n }\n\n .dynamsoft-mrz-control-icon img,\n .dynamsoft-mrz-control-icon svg {\n width: 32px;\n height: 32px;\n fill: #fe8e14;\n }\n\n .dynamsoft-mrz-control-text {\n flex: 0.5;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-bottom: 0.5rem;\n }\n\n \n @media screen and (orientation: landscape) and (max-width: 1024px) and (max-height: 600px) {\n .dynamsoft-mrz-controls {\n flex-direction: column;\n height: 100%;\n width: 5rem;\n }\n\n .dynamsoft-mrz-control-text {\n padding: 0 0.5rem 0.5rem;\n }\n }\n");const n=document.createElement("div");return n.className="dynamsoft-mrz-controls",e.forEach((e=>{const t=document.createElement("div");t.className=`dynamsoft-mrz-control-btn ${null==e?void 0:e.className}`;const i=document.createElement("div");if(i.className="dynamsoft-mrz-control-icon-wrapper",(a=e.icon).trim().startsWith("<svg")&&a.trim().endsWith("</svg>"))i.innerHTML=e.icon;else{const n=document.createElement("img");n.src=e.icon,n.alt=e.label,n.width=24,n.height=24,i.appendChild(n)}var a;const s=document.createElement("div");s.className="dynamsoft-mrz-control-text",s.textContent=e.label,e.isDisabled&&t.classList.add("disabled"),e.isHidden&&t.classList.add("hide"),t.appendChild(i),t.appendChild(s),e.onClick&&!e.isDisabled&&t.addEventListener("click",e.onClick),n.appendChild(t)})),n}([this.config._isFileMode?{id:"dynamsoft-mrz-scanResult-cancel",icon:(null===(e=null==m?void 0:m.cancel)||void 0===e?void 0:e.icon)||S.cancel,label:(null===(n=null==m?void 0:m.cancel)||void 0===n?void 0:n.label)||"Cancel",onClick:()=>this.handleCancel(),className:`${(null===(t=null==m?void 0:m.cancel)||void 0===t?void 0:t.className)||""}`,isHidden:(null===(i=null==m?void 0:m.cancel)||void 0===i?void 0:i.isHidden)||!1}:{id:"dynamsoft-mrz-scanResult-rescan",icon:(null===(a=null==m?void 0:m.rescan)||void 0===a?void 0:a.icon)||S.rescan,label:(null===(s=null==m?void 0:m.rescan)||void 0===s?void 0:s.label)||"Re-scan",onClick:()=>this.handleRescan(),className:`${(null===(o=null==m?void 0:m.rescan)||void 0===o?void 0:o.className)||""}`,isHidden:(null===(r=null==m?void 0:m.rescan)||void 0===r?void 0:r.isHidden)||!1,isDisabled:!this.scannerView},{id:"dynamsoft-mrz-scanResult-done",icon:(null===(l=null==m?void 0:m.done)||void 0===l?void 0:l.icon)||S.complete,label:(null===(c=null==m?void 0:m.done)||void 0===c?void 0:c.label)||"Done",className:`${(null===(u=null==m?void 0:m.done)||void 0===u?void 0:u.className)||""}`,isHidden:(null===(h=null==m?void 0:m.done)||void 0===h?void 0:h.isHidden)||!1,onClick:()=>this.handleDone()}])}handleFieldEdit(n,t){if(n===e.EnumMRZData.DateOfBirth||n===e.EnumMRZData.DateOfExpiry)try{const[e,i,a]=t.split(/[\/\-\.]/);a&&i&&e&&(this.editedFields[n]={day:parseInt(a,10),month:parseInt(i,10),year:parseInt(e,10)})}catch(e){console.error("Error parsing date",e)}else this.editedFields[n]=t}createMRZDataDisplay(){var n,t,i,a;const s=(null===(n=this.resources.result)||void 0===n?void 0:n.data)||{},o=!!this.config.allowResultEditing,r=s.invalidFields||[],l=[e.EnumMRZData.InvalidFields,e.EnumMRZData.IssuingStateRaw,e.EnumMRZData.NationalityRaw];!1===(null===(t=this.config)||void 0===t?void 0:t.showMRZText)&&l.push(e.EnumMRZData.MRZText);const c=document.createElement("div");if(c.className="dynamsoft-mrz-data-container",u(s)){const e=document.createElement("div");return e.className="dynamsoft-mrz-data-row empty",e.innerText=null!==(a=null===(i=this.config)||void 0===i?void 0:i.emptyResultMessage)&&void 0!==a?a:"The necessary information could not be detected. Please try again.",c.appendChild(e),c}if(r.length>0){const e=document.createElement("div");e.className="dynamsoft-mrz-error-notification",e.innerHTML=`\n <div class="dynamsoft-mrz-error-icon">${S.failed}</div>\n <div class="dynamsoft-mrz-error-message">\n ${o?"Some fields require correction. Please review highlighted fields.":"Some fields contain invalid information. Please rescan the document."}\n </div>\n `,c.appendChild(e)}else if(0===r.length&&o){const e=document.createElement("div");e.className="dynamsoft-mrz-info-notification",e.innerHTML=`\n <div class="dynamsoft-mrz-info-icon">${S.info}</div>\n <div class="dynamsoft-mrz-info-message">\n Please review all fields to ensure the information is correct.\n </div>\n `,c.appendChild(e)}return Object.entries(s).forEach((([n,t])=>{if(l.includes(n)||!t)return;const i=document.createElement("div");i.className="dynamsoft-mrz-data-row";const a=r.includes(n);a&&i.classList.add("invalid-field");const s=[e.EnumMRZData.MRZText,e.EnumMRZData.DocumentType,e.EnumMRZData.IssuingStateRaw,e.EnumMRZData.NationalityRaw],d=document.createElement("span");if(d.className="dynamsoft-mrz-data-label",d.innerText=y[n]||n,a){const e=document.createElement("span");if(e.className="dynamsoft-mrz-error-icon",e.innerHTML=S.failed,d.appendChild(e),o){const e=document.createElement("span");e.className="dynamsoft-mrz-error-hint",e.textContent="Please correct this field",d.appendChild(e)}}const u=document.createElement("div");if(u.className="dynamsoft-mrz-data-value",o&&!s.includes(n)){const s=document.createElement("input");s.className="dynamsoft-mrz-data-input",a&&s.classList.add("invalid"),n===e.EnumMRZData.DateOfBirth||n===e.EnumMRZData.DateOfExpiry?(s.value=w(t),s.setAttribute("placeholder","YYYY-MM-DD")):s.value=t,s.addEventListener("input",(e=>{if(this.handleFieldEdit(n,e.target.value),a){s.classList.remove("invalid"),i.classList.remove("invalid-field"),this.editedFields.invalidFields||(this.editedFields.invalidFields=[...r]);const e=this.editedFields.invalidFields.indexOf(n);e>-1&&this.editedFields.invalidFields.splice(e,1)}})),u.appendChild(s)}else n===e.EnumMRZData.MRZText?(u.classList.add("code"),u.innerText=t):n===e.EnumMRZData.DateOfBirth||n===e.EnumMRZData.DateOfExpiry?u.innerText=w(t):u.innerText=t,a&&u.classList.add("invalid-value");i.appendChild(d),i.appendChild(u),c.appendChild(i)})),c}async initialize(){try{if(!this.resources.result)throw Error("Captured image is missing. Please capture an image first!");if(!this.config.container)throw new Error("Please create a Scan Result View Container element");d("dynamsoft-mrz-result-view-style",T);const e=document.createElement("div");if(e.className="dynamsoft-mrz-result-view-container",!1!==this.config.showOriginalImage){const n=this.resources.result.originalImageResult,t=document.createElement("div");let i;t.className="dynamsoft-mrz-result-view-image-container",(null==n?void 0:n.toCanvas)&&(i=null==n?void 0:n.toCanvas()),Object.assign(i.style,{maxWidth:"100%",maxHeight:"100%",objectFit:"contain"}),t.appendChild(i),e.appendChild(t)}const n=this.createMRZDataDisplay();e.appendChild(n);const t=this.createControls();e.appendChild(t),c(this.config.container).appendChild(e)}catch(e){let n=(null==e?void 0:e.message)||e;console.error(n),alert(n)}}hideView(){c(this.config.container).style.display="none"}dispose(e=!1){c(this.config.container).textContent="",e||(this.currentScanResultViewResolver=void 0)}}const T="\n .dynamsoft-mrz-result-view-container {\n display: flex;\n width: 100%;\n height: 100%;\n background-color:#575757;\n font-size: 12px;\n flex-direction: column;\n align-items: center;\n }\n\n .dynamsoft-mrz-result-view-image-container {\n width: 100%;\n height: 200px;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: #323234;\n }\n\n \n.dynamsoft-mrz-data-container {\n font-size: 16px;\n font-family: Verdana;\n color: white;\n overflow: auto;\n width: 100%;\n height: 100%;\n min-height: 0;\n margin: 1rem 0;\n}\n\n.dynamsoft-mrz-data-row {\n padding: 0.5rem 2rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n transition: background-color 0.3s ease;\n}\n\n.dynamsoft-mrz-data-row.invalid-field {\n background-color: rgba(231, 76, 60, 0.1);\n border-left: 3px solid #e74c3c;\n padding-left: calc(2rem - 3px);\n}\n\n.dynamsoft-mrz-data-label {\n color: #aaa;\n display: flex;\n gap: 0.5rem;\n align-items: end;\n flex-wrap: wrap;\n}\n\n.dynamsoft-mrz-error-notification,\n.dynamsoft-mrz-info-notification {\n color: white;\n padding: 1rem;\n margin: 0.5rem 2rem;\n border-radius: 4px;\n display: flex;\n align-items: center;\n gap: 1rem;\n text-align: start;\n}\n\n.dynamsoft-mrz-error-notification {\n background-color: rgba(231, 76, 60, 0.2);\n}\n\n.dynamsoft-mrz-info-notification {\n background-color: #fe8e14;\n}\n\n.dynamsoft-mrz-edit-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: #aaa;\n}\n\n.dynamsoft-mrz-error-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: #e74c3c;\n}\n\n.dynamsoft-mrz-info-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n}\n\n.dynamsoft-mrz-info-message,\n.dynamsoft-mrz-error-message {\n flex: 1;\n}\n\n.dynamsoft-mrz-error-hint {\n font-size: 0.8rem;\n color: #e74c3c;\n}\n\n.dynamsoft-mrz-data-value {\n word-wrap: break-word;\n text-align: start;\n}\n\n.dynamsoft-mrz-data-value.code {\n font-family: monospace;\n}\n\n.dynamsoft-mrz-data-value.invalid-value {\n color: #e74c3c;\n text-decoration: wavy underline #e74c3c;\n text-decoration-skip-ink: none;\n}\n\n.dynamsoft-mrz-data-input {\n width: 100%;\n padding: 5px;\n background-color: rgba(255, 255, 255, 0.1);\n border: 1px solid rgba(255, 255, 255, 0.3);\n color: white;\n border-radius: 4px;\n font-size: 14px;\n transition: all 0.3s ease;\n}\n\n.dynamsoft-mrz-data-input.invalid {\n background-color: rgba(231, 76, 60, 0.1);\n border-color: #e74c3c;\n}\n\n.dynamsoft-mrz-data-input:focus {\n background-color: rgba(255, 255, 255, 0.2);\n border-color: #fe8e14;\n outline: none;\n}\n\n@media screen and (orientation: landscape) and (max-width: 1024px) and (max-height: 600px) {\n .dynamsoft-mrz-result-view-container {\n flex-direction: row;\n }\n\n .dynamsoft-mrz-result-view-image-container{\n flex: 1;\n height: 100%;\n }\n\n .dynamsoft-mrz-data-container{\n flex: 1;\n }\n\n .dynamsoft-mrz-data-row:first-of-type {\n padding-top: 2rem;\n }\n\n .dynamsoft-mrz-data-row:last-of-type {\n padding-bottom: 2rem;\n }\n\n .dynamsoft-mrz-data-row.empty {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding-top: 0;\n padding-bottom: 0;\n }\n}\n",b={rootDirectory:"https://cdn.jsdelivr.net/npm/"};class Z{showLoadingOverlay(e){var n,t;const i=c(null===(n=this.config.scannerViewConfig)||void 0===n?void 0:n.container)||c(null===(t=this.config.resultViewConfig)||void 0===t?void 0:t.container);this.loadingScreen=g(i,{message:e}),i.style.display="block",i.style.position="relative"}hideLoadingOverlay(e=!1){var n,t,i;const a=c(null===(n=this.config.scannerViewConfig)||void 0===n?void 0:n.container)||c(null===(t=this.config.resultViewConfig)||void 0===t?void 0:t.container);this.loadingScreen&&(this.loadingScreen.hide(),this.loadingScreen=null,a.style.display="none",e&&(null===(i=this.config)||void 0===i?void 0:i.container)&&(c(this.config.container).style.display="none"))}constructor(e){this.config=e,this.resources={},this.isInitialized=!1,this.isCapturing=!1,this.loadingScreen=null,this.isDynamsoftResourcesLoaded=!1,this.isFileMode=!1,this.isDynamsoftResourcesLoaded||this.initializeDynamsoftResources()}async initialize(){if(this.isInitialized)return{resources:this.resources,components:{scannerView:this.scannerView,resultView:this.resultView}};try{if(!this.initializeMRZScannerConfig())return console.error("Failed to initialize mrz scanner config"),{resources:this.resources,components:{}};d("dynamsoft-mrz-loading-screen-style",p),this.showLoadingOverlay("Loading..."),await this.initializeDCVResources(),this.resources.onResultUpdated=e=>{this.resources.result=e};const e={};return!this.isFileMode&&this.config.scannerViewConfig&&(this.scannerView=new D(this.resources,this.config.scannerViewConfig),e.scannerView=this.scannerView,await this.scannerView.initialize()),this.config.resultViewConfig&&(this.resultView=new C(this.resources,this.config.resultViewConfig,this.scannerView),e.resultView=this.resultView),this.isInitialized=!0,{resources:this.resources,components:e}}catch(e){this.isInitialized=!1;const n=`Initialization Failed: ${(null==e?void 0:e.message)||e}`;throw console.error(n),new Error(n)}finally{this.hideLoadingOverlay(!0)}}initializeDynamsoftResources(){var e;n.CoreModule.engineResourcePaths=u(null===(e=this.config)||void 0===e?void 0:e.engineResourcePaths)?b:this.config.engineResourcePaths,n.CoreModule.loadWasm(),n.CodeParserModule.loadSpec("MRTD_TD3_PASSPORT"),n.CodeParserModule.loadSpec("MRTD_TD3_VISA"),n.CodeParserModule.loadSpec("MRTD_TD1_ID"),n.CodeParserModule.loadSpec("MRTD_TD2_ID"),n.CodeParserModule.loadSpec("MRTD_TD2_VISA"),this.isDynamsoftResourcesLoaded=!0}async initializeDCVResources(){var e,t,i,a;try{this.isDynamsoftResourcesLoaded||this.initializeDynamsoftResources(),n.LicenseManager._onAuthMessage=e=>e.replace("(https://www.dynamsoft.com/customer/license/trialLicense?product=unknown&deploymenttype=unknown)","(https://www.dynamsoft.com/customer/license/trialLicense?product=mrz&deploymenttype=web)"),await n.LicenseManager.initLicense((null===(e=this.config)||void 0===e?void 0:e.license)||"",{executeNow:!0}),this.isFileMode||(this.resources.cameraView=await n.CameraView.createInstance((null===(t=this.config.scannerViewConfig)||void 0===t?void 0:t.uiPath)||(null===(i=this.config.scannerViewConfig)||void 0===i?void 0:i.cameraEnhancerUIPath)),this.resources.cameraEnhancer=await n.CameraEnhancer.createInstance(this.resources.cameraView)),this.resources.cvRouter=await n.CaptureVisionRouter.createInstance(),await this.resources.cvRouter.initSettings(this.config.templateFilePath)}catch(e){let n="string"==typeof e?e:null!==(a=null==e?void 0:e.message)&&void 0!==a?a:"object"==typeof e?JSON.stringify(e):String(e);const t=(null==n?void 0:n.toLowerCase().includes("license"))?"The MRZ Scanner license is invalid or has expired. Please contact the site administrator to resolve this issue.":`Resource Initialization Failed: ${n}`;throw console.error(t),new Error(t)}}shouldCreateDefaultContainer(){var e,n;const t=!this.config.container,i=!((null===(e=this.config.scannerViewConfig)||void 0===e?void 0:e.container)||(null===(n=this.config.resultViewConfig)||void 0===n?void 0:n.container));return t&&i}createDefaultMRZScannerContainer(){const e=document.createElement("div");return e.className="mrz-scanner-main-container",Object.assign(e.style,{height:"100dvh",width:"100%",position:"absolute",left:"0",top:"0",zIndex:"999"}),document.body.append(e),e}checkForTemporaryLicense(e){return!(null==e?void 0:e.length)||(null==e?void 0:e.startsWith("A"))||(null==e?void 0:e.startsWith("L"))||(null==e?void 0:e.startsWith("P"))||(null==e?void 0:e.startsWith("Y"))?"DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9":e}validateViewConfigs(){var e,n,t,i,a,s,o,r;if(!this.config.container){if((null===(e=this.config.scannerViewConfig)||void 0===e?void 0:e.container)&&this.config.showResultView&&!(null===(n=this.config.resultViewConfig)||void 0===n?void 0:n.container)){const e="MRZResultView container is required when showResultView is true";return alert(e),console.error(e),!1}if(!(null===(t=this.config.scannerViewConfig)||void 0===t?void 0:t.container)&&(null===(i=this.config.resultViewConfig)||void 0===i?void 0:i.container)&&!this.resources.result){const e="Result is