diff --git a/app/controllers/account_reset/pending_controller.rb b/app/controllers/account_reset/pending_controller.rb index 855a6e12452..d1a713ea934 100644 --- a/app/controllers/account_reset/pending_controller.rb +++ b/app/controllers/account_reset/pending_controller.rb @@ -1,7 +1,7 @@ module AccountReset class PendingController < ApplicationController include UserAuthenticator - include ActionView::Helpers::DateHelper + include AccountResetConcern before_action :authenticate_user before_action :confirm_account_reset_request_exists @@ -12,7 +12,7 @@ def show end def confirm - @account_reset_deletion_period_interval = account_reset_deletion_period_interval + @account_reset_deletion_period_interval = account_reset_deletion_period_interval(current_user) end def cancel @@ -32,16 +32,5 @@ def pending_account_reset_request current_user, ).call end - - def account_reset_deletion_period_interval - current_time = Time.zone.now - - distance_of_time_in_words( - current_time, - current_time + IdentityConfig.store.account_reset_wait_period_days.days, - true, - accumulate_on: :hours, - ) - end end end diff --git a/app/controllers/account_reset/request_controller.rb b/app/controllers/account_reset/request_controller.rb index afc55e4df98..7f51aea7740 100644 --- a/app/controllers/account_reset/request_controller.rb +++ b/app/controllers/account_reset/request_controller.rb @@ -1,13 +1,13 @@ module AccountReset class RequestController < ApplicationController include TwoFactorAuthenticatable - include ActionView::Helpers::DateHelper + include AccountResetConcern before_action :confirm_two_factor_enabled def show analytics.account_reset_visit - @account_reset_deletion_period_interval = account_reset_deletion_period_interval + @account_reset_deletion_period_interval = account_reset_deletion_period_interval(current_user) end def create @@ -41,16 +41,5 @@ def analytics_attributes email_addresses: current_user.email_addresses.count, } end - - def account_reset_deletion_period_interval - current_time = Time.zone.now - - distance_of_time_in_words( - current_time, - current_time + IdentityConfig.store.account_reset_wait_period_days.days, - true, - accumulate_on: :hours, - ) - end end end diff --git a/app/controllers/concerns/account_reset_concern.rb b/app/controllers/concerns/account_reset_concern.rb new file mode 100644 index 00000000000..15457c8fb87 --- /dev/null +++ b/app/controllers/concerns/account_reset_concern.rb @@ -0,0 +1,38 @@ +module AccountResetConcern + include ActionView::Helpers::DateHelper + def account_reset_deletion_period_interval(user) + current_time = Time.zone.now + + distance_of_time_in_words( + current_time, + current_time + account_reset_wait_period_days(user), + true, + accumulate_on: reset_accumulation_type(user), + ) + end + + def account_reset_wait_period_days(user) + if supports_fraud_account_reset?(user) + IdentityConfig.store.account_reset_fraud_user_wait_period_days.days + else + IdentityConfig.store.account_reset_wait_period_days.days + end + end + + def supports_fraud_account_reset?(user) + IdentityConfig.store.account_reset_fraud_user_wait_period_days.present? && + fraud_state?(user) + end + + def fraud_state?(user) + user.fraud_review_pending? || user.fraud_rejection? + end + + def reset_accumulation_type(user) + if account_reset_wait_period_days(user) > 3.days + :days + else + :hours + end + end +end diff --git a/app/controllers/concerns/fraud_review_concern.rb b/app/controllers/concerns/fraud_review_concern.rb index c70dce1b2fc..585efd4bc7f 100644 --- a/app/controllers/concerns/fraud_review_concern.rb +++ b/app/controllers/concerns/fraud_review_concern.rb @@ -26,8 +26,7 @@ def handle_fraud_rejection def in_person_prevent_fraud_redirection? IdentityConfig.store.in_person_proofing_enforce_tmx && - !current_user.in_person_enrollment_status.nil? && - current_user.in_person_enrollment_status != 'passed' + current_user.ipp_enrollment_status_not_passed? end def redirect_to_fraud_review diff --git a/app/controllers/concerns/rate_limit_concern.rb b/app/controllers/concerns/rate_limit_concern.rb index 0f082a8b0c1..cb46d134e7b 100644 --- a/app/controllers/concerns/rate_limit_concern.rb +++ b/app/controllers/concerns/rate_limit_concern.rb @@ -43,14 +43,7 @@ def rate_limit_redirect!(rate_limit_type) def track_rate_limited_event(rate_limit_type) analytics_args = { limiter_type: rate_limit_type } - limiter_context = 'single-session' - - if rate_limit_type == :proof_address - analytics_args[:step_name] = :phone - elsif rate_limit_type == :proof_ssn - analytics_args[:step_name] = 'verify_info' - limiter_context = 'multi-session' - end + limiter_context = rate_limit_type == :proof_ssn ? 'multi-session' : 'single-session' irs_attempts_api_tracker.idv_verification_rate_limited(limiter_context: limiter_context) analytics.rate_limit_reached(**analytics_args) diff --git a/app/controllers/concerns/saml_idp_auth_concern.rb b/app/controllers/concerns/saml_idp_auth_concern.rb index 3e4a139b7a1..a4373d9ee05 100644 --- a/app/controllers/concerns/saml_idp_auth_concern.rb +++ b/app/controllers/concerns/saml_idp_auth_concern.rb @@ -55,9 +55,7 @@ def check_sp_active def validate_service_provider_and_authn_context return if result.success? - analytics.saml_auth( - **result.to_h.merge(request_signed: saml_request.signed?), - ) + capture_analytics render 'saml_idp/auth/error', status: :bad_request end diff --git a/app/controllers/concerns/verify_profile_concern.rb b/app/controllers/concerns/verify_profile_concern.rb index 5d29d7178d6..33d39c7de27 100644 --- a/app/controllers/concerns/verify_profile_concern.rb +++ b/app/controllers/concerns/verify_profile_concern.rb @@ -4,6 +4,9 @@ module VerifyProfileConcern def url_for_pending_profile_reason return idv_verify_by_mail_enter_code_url if current_user.gpo_verification_pending_profile? return idv_in_person_ready_to_verify_url if current_user.in_person_pending_profile? + # We don't want to hit idv_please_call_url in cases where the user + # has fraud review pending and not passed at the post office + return idv_welcome_url if user_failed_ipp_with_fraud_review_pending? return idv_please_call_url if current_user.fraud_review_pending? idv_not_verified_url if current_user.fraud_rejection? end @@ -19,4 +22,10 @@ def pending_profile_policy biometric_comparison_requested: nil, ) end + + def user_failed_ipp_with_fraud_review_pending? + IdentityConfig.store.in_person_proofing_enforce_tmx && + current_user.ipp_enrollment_status_not_passed? && + current_user.fraud_review_pending? + end end diff --git a/app/controllers/idv/by_mail/enter_code_controller.rb b/app/controllers/idv/by_mail/enter_code_controller.rb index 6dbb94bd0d5..b8e58373ba5 100644 --- a/app/controllers/idv/by_mail/enter_code_controller.rb +++ b/app/controllers/idv/by_mail/enter_code_controller.rb @@ -11,34 +11,21 @@ class EnterCodeController < ApplicationController before_action :confirm_verification_needed def index - # GPO reminder emails include an "I did not receive my letter!" link that results in - # slightly different copy on this screen. - @user_did_not_receive_letter = !!params[:did_not_receive_letter] - analytics.idv_verify_by_mail_enter_code_visited( - source: if @user_did_not_receive_letter then 'gpo_reminder_email' end, + source: user_did_not_receive_letter? ? 'gpo_reminder_email' : nil, + otp_rate_limited: rate_limiter.limited?, + user_can_request_another_letter: user_can_request_another_letter?, ) if rate_limiter.limited? - redirect_to idv_enter_code_rate_limited_url - return + return redirect_to idv_enter_code_rate_limited_url + elsif pii_locked? + return redirect_to capture_password_url end - @last_date_letter_was_sent = last_date_letter_was_sent - @gpo_verify_form = GpoVerifyForm.new(user: current_user, pii: pii) - @code = session[:last_gpo_confirmation_code] if FeatureManagement.reveal_gpo_code? - - gpo_mail = Idv::GpoMail.new(current_user) - @can_request_another_letter = - FeatureManagement.gpo_verification_enabled? && - !gpo_mail.rate_limited? && - !gpo_mail.profile_too_old? - - if pii_locked? - redirect_to capture_password_url - else - render :index - end + prefilled_code = session[:last_gpo_confirmation_code] if FeatureManagement.reveal_gpo_code? + @gpo_verify_form = GpoVerifyForm.new(user: current_user, pii: pii, otp: prefilled_code) + render_enter_code_form end def pii @@ -66,19 +53,23 @@ def create if rate_limiter.limited? redirect_to idv_enter_code_rate_limited_url else - flash[:error] = @gpo_verify_form.errors.first.message if !rate_limiter.limited? - redirect_to idv_verify_by_mail_enter_code_url + render_enter_code_form end - return + else + prepare_for_personal_key + redirect_to idv_personal_key_url end - - prepare_for_personal_key - - redirect_to idv_personal_key_url end private + def render_enter_code_form + @can_request_another_letter = user_can_request_another_letter? + @user_did_not_receive_letter = user_did_not_receive_letter? + @last_date_letter_was_sent = last_date_letter_was_sent + render :index + end + def pending_in_person_enrollment? return false unless IdentityConfig.store.in_person_proofing_enabled current_user.pending_in_person_enrollment.present? @@ -150,9 +141,29 @@ def pii_locked? !Pii::Cacher.new(current_user, user_session).exists_in_session? end + # GPO reminder emails include an "I did not receive my letter!" link that results in + # slightly different copy on this screen. + def user_did_not_receive_letter? + !!params[:did_not_receive_letter] + end + + def user_can_request_another_letter? + return @user_can_request_another_letter if defined?(@user_can_request_another_letter) + gpo_mail = Idv::GpoMail.new(current_user) + @user_can_request_another_letter = + FeatureManagement.gpo_verification_enabled? && + !gpo_mail.rate_limited? && + !gpo_mail.profile_too_old? + end + def last_date_letter_was_sent - current_user.gpo_verification_pending_profile&.gpo_confirmation_codes&. - pluck(:updated_at)&.max + return @last_date_letter_was_sent if defined?(@last_date_letter_was_sent) + + @last_date_letter_was_sent = current_user. + gpo_verification_pending_profile&. + gpo_confirmation_codes&. + pluck(:updated_at)&. + max end end end diff --git a/app/controllers/idv/document_capture_controller.rb b/app/controllers/idv/document_capture_controller.rb index 99ff49e8da4..d266ba6297b 100644 --- a/app/controllers/idv/document_capture_controller.rb +++ b/app/controllers/idv/document_capture_controller.rb @@ -7,7 +7,7 @@ class DocumentCaptureController < ApplicationController include StepIndicatorConcern before_action :confirm_not_rate_limited, except: [:update] - before_action :confirm_step_allowed + before_action :confirm_step_allowed, unless: -> { allow_direct_ipp? } before_action :override_csp_to_allow_acuant def show @@ -47,6 +47,7 @@ def extra_view_variables sp_name: decorated_sp_session.sp_name, failure_to_proof_url: return_to_sp_failure_to_proof_url(step: 'document_capture'), skip_doc_auth: idv_session.skip_doc_auth, + skip_doc_auth_from_handoff: idv_session.skip_doc_auth_from_handoff, opted_in_to_in_person_proofing: idv_session.opted_in_to_in_person_proofing, doc_auth_selfie_capture: decorated_sp_session.selfie_required?, }.merge( @@ -62,6 +63,7 @@ def self.step_info preconditions: ->(idv_session:, user:) { idv_session.flow_path == 'standard' && ( # mobile + idv_session.skip_doc_auth_from_handoff || idv_session.skip_hybrid_handoff || idv_session.skip_doc_auth || !idv_session.selfie_check_required || # desktop but selfie not required @@ -109,5 +111,22 @@ def handle_stored_result failure(I18n.t('doc_auth.errors.general.network_error'), extra) end end + + def allow_direct_ipp? + return false unless idv_session.welcome_visited && + idv_session.idv_consent_given + # not allowed when no step param and action:show(get request) + return false if params[:step].blank? || params[:action].to_s != 'show' || + idv_session.flow_path == 'hybrid' + # Only allow direct access to document capture if IPP available + return false unless IdentityConfig.store.in_person_doc_auth_button_enabled && + Idv::InPersonConfig.enabled_for_issuer?(decorated_sp_session.sp_issuer) + @previous_step_url = params[:step] == 'hybrid_handoff' ? idv_hybrid_handoff_path : nil + # allow + idv_session.flow_path = 'standard' + idv_session.skip_doc_auth_from_handoff = true + idv_session.skip_hybrid_handoff = nil + true + end end end diff --git a/app/controllers/idv/hybrid_handoff_controller.rb b/app/controllers/idv/hybrid_handoff_controller.rb index 829ff2abe7c..0625337bd78 100644 --- a/app/controllers/idv/hybrid_handoff_controller.rb +++ b/app/controllers/idv/hybrid_handoff_controller.rb @@ -13,6 +13,11 @@ def show @upload_disabled = idv_session.selfie_check_required && !idv_session.desktop_selfie_test_mode_enabled? + @direct_ipp_with_selfie_enabled = IdentityConfig.store.in_person_doc_auth_button_enabled && + Idv::InPersonConfig.enabled_for_issuer?( + decorated_sp_session.sp_issuer, + ) + @selfie_required = idv_session.selfie_check_required analytics.idv_doc_auth_hybrid_handoff_visited(**analytics_arguments) @@ -22,6 +27,8 @@ def show true ) + # reset if we visit or come back + idv_session.skip_doc_auth_from_handoff = nil render :show, locals: extra_view_variables end @@ -55,7 +62,9 @@ def self.step_info next_steps: [:link_sent, :document_capture], preconditions: ->(idv_session:, user:) { idv_session.idv_consent_given && - self.selected_remote(idv_session: idv_session) + (self.selected_remote(idv_session: idv_session) || # from opt-in screen + # back from ipp doc capture screen + idv_session.skip_doc_auth_from_handoff) }, undo_step: ->(idv_session:, user:) do idv_session.flow_path = nil diff --git a/app/controllers/idv/link_sent_controller.rb b/app/controllers/idv/link_sent_controller.rb index c99e007ac44..1ae381f7868 100644 --- a/app/controllers/idv/link_sent_controller.rb +++ b/app/controllers/idv/link_sent_controller.rb @@ -72,7 +72,7 @@ def handle_document_verification_success def render_document_capture_cancelled redirect_to idv_hybrid_handoff_url idv_session.flow_path = nil - failure(I18n.t('errors.doc_auth.document_capture_cancelled')) + failure(I18n.t('errors.doc_auth.document_capture_canceled')) end def render_step_incomplete_error diff --git a/app/controllers/openid_connect/authorization_controller.rb b/app/controllers/openid_connect/authorization_controller.rb index d057729a6ad..9c3b3483c15 100644 --- a/app/controllers/openid_connect/authorization_controller.rb +++ b/app/controllers/openid_connect/authorization_controller.rb @@ -156,6 +156,7 @@ def pre_validate_authorize_form **result.to_h.except(:redirect_uri, :code_digest).merge( user_fully_authenticated: user_fully_authenticated?, referer: request.referer, + vtr_param: params[:vtr], ), ) return if result.success? @@ -214,6 +215,8 @@ def track_events ial: event_ial_context.ial, billed_ial: event_ial_context.bill_for_ial_1_or_2, sign_in_flow: session[:sign_in_flow], + vtr: sp_session[:vtr], + acr_values: sp_session[:acr_values], ) track_billing_events end diff --git a/app/controllers/saml_idp_controller.rb b/app/controllers/saml_idp_controller.rb index e2d1ac49c3d..a09148c54af 100644 --- a/app/controllers/saml_idp_controller.rb +++ b/app/controllers/saml_idp_controller.rb @@ -136,6 +136,7 @@ def log_external_saml_auth_request analytics.saml_auth_request( requested_ial: requested_ial, + authn_context: saml_request&.requested_authn_contexts, requested_aal_authn_context: saml_request&.requested_aal_authn_context, requested_vtr_authn_context: saml_request&.requested_vtr_authn_context, force_authn: saml_request&.force_authn?, @@ -181,6 +182,8 @@ def track_events ial: resolved_authn_context_int_ial, billed_ial: ial_context.bill_for_ial_1_or_2, sign_in_flow: session[:sign_in_flow], + vtr: sp_session[:vtr], + acr_values: sp_session[:acr_values], ) track_billing_events end diff --git a/app/javascript/packages/document-capture/components/acuant-selfie-capture-canvas.jsx b/app/javascript/packages/document-capture/components/acuant-selfie-capture-canvas.jsx index 932cc3342db..86dab1889a2 100644 --- a/app/javascript/packages/document-capture/components/acuant-selfie-capture-canvas.jsx +++ b/app/javascript/packages/document-capture/components/acuant-selfie-capture-canvas.jsx @@ -24,12 +24,13 @@ function AcuantSelfieCaptureCanvas({ imageCaptureText, onSelfieCaptureClosed }) return ( <> {!isReady && } -
-

- {imageCaptureText && ( - {imageCaptureText} - )} -

+
+

+ {imageCaptureText && ( + {imageCaptureText} + )} +

+
diff --git a/app/javascript/packages/document-capture/components/document-capture.tsx b/app/javascript/packages/document-capture/components/document-capture.tsx index 4c1f7885bb1..0b8e36b8b8a 100644 --- a/app/javascript/packages/document-capture/components/document-capture.tsx +++ b/app/javascript/packages/document-capture/components/document-capture.tsx @@ -37,7 +37,8 @@ function DocumentCapture({ onStepChange = () => {} }: DocumentCaptureProps) { const { t } = useI18n(); const { flowPath } = useContext(UploadContext); const { trackSubmitEvent, trackVisitEvent } = useContext(AnalyticsContext); - const { inPersonFullAddressEntryEnabled, inPersonURL, skipDocAuth } = useContext(InPersonContext); + const { inPersonFullAddressEntryEnabled, inPersonURL, skipDocAuth, skipDocAuthFromHandoff } = + useContext(InPersonContext); const appName = getConfigValue('appName'); useDidUpdateEffect(onStepChange, [stepName]); @@ -137,12 +138,14 @@ function DocumentCapture({ onStepChange = () => {} }: DocumentCaptureProps) { // If the user got here by opting-in to in-person proofing, when skipDocAuth === true, // then set steps to inPersonSteps - const steps: FormStep[] = skipDocAuth ? inPersonSteps : defaultSteps; + const isInPersonStepEnabled = skipDocAuth || skipDocAuthFromHandoff; + const steps: FormStep[] = isInPersonStepEnabled ? inPersonSteps : defaultSteps; - // If the user got here by opting-in to in-person proofing, when skipDocAuth === true, + // If the user got here by opting-in to in-person proofing, when skipDocAuth === true; + // or opting-in ipp from handoff page, and selfie is required, when skipDocAuthFromHandoff === true // then set stepIndicatorPath to VerifyFlowPath.IN_PERSON const stepIndicatorPath = - (stepName && ['location', 'prepare', 'switch_back'].includes(stepName)) || skipDocAuth + (stepName && ['location', 'prepare', 'switch_back'].includes(stepName)) || isInPersonStepEnabled ? VerifyFlowPath.IN_PERSON : VerifyFlowPath.DEFAULT; @@ -181,7 +184,7 @@ function DocumentCapture({ onStepChange = () => {} }: DocumentCaptureProps) { onStepSubmit={trackSubmitEvent} autoFocus={!!submissionError} titleFormat={`%{step} - ${appName}`} - initialStep={skipDocAuth ? steps[0].name : undefined} + initialStep={isInPersonStepEnabled ? steps[0].name : undefined} /> )} diff --git a/app/javascript/packages/document-capture/components/in-person-prepare-step.tsx b/app/javascript/packages/document-capture/components/in-person-prepare-step.tsx index 91ed67aad59..a8de5bbe374 100644 --- a/app/javascript/packages/document-capture/components/in-person-prepare-step.tsx +++ b/app/javascript/packages/document-capture/components/in-person-prepare-step.tsx @@ -20,11 +20,16 @@ function InPersonPrepareStep({ toPreviousStep }) { inPersonOutageMessageEnabled, inPersonOutageExpectedUpdateDate, skipDocAuth, + skipDocAuthFromHandoff, howToVerifyURL, + previousStepURL, } = useContext(InPersonContext); function goBack() { - if (skipDocAuth && howToVerifyURL) { + if (skipDocAuthFromHandoff && previousStepURL) { + // directly from handoff page + forceRedirect(previousStepURL); + } else if (skipDocAuth && howToVerifyURL) { forceRedirect(howToVerifyURL); } else { toPreviousStep(); diff --git a/app/javascript/packages/document-capture/context/in-person.ts b/app/javascript/packages/document-capture/context/in-person.ts index 90900fb8acf..5de622d6ccb 100644 --- a/app/javascript/packages/document-capture/context/in-person.ts +++ b/app/javascript/packages/document-capture/context/in-person.ts @@ -49,10 +49,21 @@ export interface InPersonContextProps { */ skipDocAuth?: boolean; + /** + * Flag set when user select IPP from handoff page when IPP is available + * and selfie is required + */ + skipDocAuthFromHandoff?: boolean; + /** * URL for Opt-in IPP, used when in_person_proofing_opt_in_enabled is enabled */ howToVerifyURL?: string; + + /** + * URL for going back to previous steps in Doc Auth, like handoff and howToVerify + */ + previousStepURL?: string; } const InPersonContext = createContext({ diff --git a/app/javascript/packages/phone-input/package.json b/app/javascript/packages/phone-input/package.json index 5c64f08ceb9..88e166c96dc 100644 --- a/app/javascript/packages/phone-input/package.json +++ b/app/javascript/packages/phone-input/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "dependencies": { "intl-tel-input": "^17.0.19", - "libphonenumber-js": "^1.10.58" + "libphonenumber-js": "^1.10.59" }, "sideEffects": [ "./index.ts" diff --git a/app/javascript/packs/document-capture.tsx b/app/javascript/packs/document-capture.tsx index 68e690dd167..d40211a206e 100644 --- a/app/javascript/packs/document-capture.tsx +++ b/app/javascript/packs/document-capture.tsx @@ -37,7 +37,9 @@ interface AppRootData { optedInToInPersonProofing: string; securityAndPrivacyHowItWorksUrl: string; skipDocAuth: string; + skipDocAuthFromHandoff: string; howToVerifyURL: string; + previousStepUrl: string; uiExitQuestionSectionEnabled: string; docAuthSelfieDesktopTestMode: string; } @@ -105,7 +107,9 @@ const { optedInToInPersonProofing, usStatesTerritories = '', skipDocAuth, + skipDocAuthFromHandoff, howToVerifyUrl, + previousStepUrl, uiExitQuestionSectionEnabled = '', docAuthSelfieDesktopTestMode, } = appRoot.dataset as DOMStringMap & AppRootData; @@ -131,7 +135,9 @@ const App = composeComponents( optedInToInPersonProofing: optedInToInPersonProofing === 'true', usStatesTerritories: parsedUsStatesTerritories, skipDocAuth: skipDocAuth === 'true', + skipDocAuthFromHandoff: skipDocAuthFromHandoff === 'true', howToVerifyURL: howToVerifyUrl, + previousStepURL: previousStepUrl, }, }, ], diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 19ff2a46794..5027083feb7 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -15,6 +15,7 @@ class UserMailer < ActionMailer::Base include Mailable include LocaleHelper + include AccountResetConcern include ActionView::Helpers::DateHelper class UserEmailAddressMismatchError < StandardError; end @@ -144,10 +145,10 @@ def personal_key_regenerated def account_reset_request(account_reset) with_user_locale(user) do @token = account_reset&.request_token - @account_reset_deletion_period_hours = account_reset_deletion_period_hours + @account_reset_deletion_period_interval = account_reset_deletion_period_interval(user) @header = t( 'user_mailer.account_reset_request.header', - interval: account_reset_deletion_period_interval, + interval: @account_reset_deletion_period_interval, ) mail( to: email_address.email, @@ -160,7 +161,7 @@ def account_reset_granted(account_reset) with_user_locale(user) do @token = account_reset&.request_token @granted_token = account_reset&.granted_token - @account_reset_deletion_period_hours = account_reset_deletion_period_hours + @account_reset_deletion_period_interval = account_reset_deletion_period_interval(user) @account_reset_token_valid_period = account_reset_token_valid_period mail( to: email_address.email, @@ -431,21 +432,6 @@ def account_reinstated private - def account_reset_deletion_period_interval - current_time = Time.zone.now - - distance_of_time_in_words( - current_time, - current_time + IdentityConfig.store.account_reset_wait_period_days.days, - true, - accumulate_on: :hours, - ) - end - - def account_reset_deletion_period_hours - IdentityConfig.store.account_reset_wait_period_days.days.in_hours.to_i - end - def account_reset_token_valid_period current_time = Time.zone.now diff --git a/app/models/user.rb b/app/models/user.rb index 77a7d18dedd..0a7d8f74bb3 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -213,6 +213,11 @@ def in_person_enrollment_status pending_profile&.in_person_enrollment&.status end + def ipp_enrollment_status_not_passed? + !in_person_enrollment_status.blank? && + in_person_enrollment_status != 'passed' + end + def has_in_person_enrollment? pending_in_person_enrollment.present? || establishing_in_person_enrollment.present? end diff --git a/app/presenters/account_reset/pending_presenter.rb b/app/presenters/account_reset/pending_presenter.rb index 636b7bcd081..3325adec06d 100644 --- a/app/presenters/account_reset/pending_presenter.rb +++ b/app/presenters/account_reset/pending_presenter.rb @@ -1,5 +1,6 @@ module AccountReset class PendingPresenter + include AccountResetConcern include ActionView::Helpers::DateHelper attr_reader :account_reset_request @@ -9,7 +10,7 @@ def initialize(account_reset_request) end def time_remaining_until_granted(now: Time.zone.now) - wait_time = IdentityConfig.store.account_reset_wait_period_days.days + wait_time = account_reset_wait_period_days(user) distance_of_time_in_words( now, @@ -19,8 +20,12 @@ def time_remaining_until_granted(now: Time.zone.now) ) end - def account_reset_deletion_period_hours - IdentityConfig.store.account_reset_wait_period_days.days.in_hours.to_i + def account_reset_deletion_period + account_reset_deletion_period_interval(user) + end + + def user + account_reset_request.user end end end diff --git a/app/presenters/two_factor_login_options_presenter.rb b/app/presenters/two_factor_login_options_presenter.rb index 0d9556a4168..cff2c81bfb0 100644 --- a/app/presenters/two_factor_login_options_presenter.rb +++ b/app/presenters/two_factor_login_options_presenter.rb @@ -1,4 +1,5 @@ class TwoFactorLoginOptionsPresenter < TwoFactorAuthCode::GenericDeliveryPresenter + include AccountResetConcern include ActionView::Helpers::TranslationHelper attr_reader :user, :reauthentication_context, :phishing_resistant_required, :piv_cac_required @@ -117,7 +118,7 @@ def account_reset_cancel_link [ t( 'two_factor_authentication.account_reset.pending', - interval: account_reset_deletion_period_interval, + interval: account_reset_deletion_period_interval(user), ), @view.link_to( t('two_factor_authentication.account_reset.cancel_link'), @@ -143,15 +144,4 @@ def sp_name APP_NAME end end - - def account_reset_deletion_period_interval - current_time = Time.zone.now - - view.distance_of_time_in_words( - current_time, - current_time + IdentityConfig.store.account_reset_wait_period_days.days, - true, - accumulate_on: :hours, - ) - end end diff --git a/app/services/account_reset/create_request.rb b/app/services/account_reset/create_request.rb index bbe2d05de2b..61da2996239 100644 --- a/app/services/account_reset/create_request.rb +++ b/app/services/account_reset/create_request.rb @@ -1,5 +1,6 @@ module AccountReset class CreateRequest + include AccountResetConcern include ActionView::Helpers::DateHelper def initialize(user, requesting_issuer) @@ -48,23 +49,12 @@ def notify_user_by_sms_if_applicable @telephony_response = Telephony.send_account_reset_notice( to: phone, country_code: Phonelib.parse(phone).country, - interval: account_reset_wait_period, + interval: account_reset_deletion_period_interval(user), ) end def extra_analytics_attributes @telephony_response&.extra&.slice(:request_id, :message_id) || {} end - - def account_reset_wait_period - current_time = Time.zone.now - - distance_of_time_in_words( - current_time, - current_time + IdentityConfig.store.account_reset_wait_period_days, - true, - accumulate_on: :hours, - ) - end end end diff --git a/app/services/account_reset/find_pending_request_for_user.rb b/app/services/account_reset/find_pending_request_for_user.rb index e8d27db2f04..79ca655beba 100644 --- a/app/services/account_reset/find_pending_request_for_user.rb +++ b/app/services/account_reset/find_pending_request_for_user.rb @@ -1,5 +1,6 @@ module AccountReset class FindPendingRequestForUser + include AccountResetConcern attr_reader :user def initialize(user) @@ -13,7 +14,7 @@ def call cancelled_at: nil, ).where( 'requested_at > ?', - IdentityConfig.store.account_reset_wait_period_days.days.ago, + account_reset_wait_period_days(user).ago, ).order(requested_at: :asc).first end end diff --git a/app/services/account_reset/grant_request.rb b/app/services/account_reset/grant_request.rb index 0598458378b..0dec3f3d27f 100644 --- a/app/services/account_reset/grant_request.rb +++ b/app/services/account_reset/grant_request.rb @@ -7,9 +7,10 @@ def initialize(user) def call token = SecureRandom.uuid arr = AccountResetRequest.find_by(user_id: @user_id) + return false if fraud_user?(arr) && fraud_wait_period_not_met?(arr) result = arr.with_lock do if !arr.granted_token_valid? - account_reset_request.update( + arr.update( granted_at: Time.zone.now, granted_token: token, ) @@ -21,8 +22,21 @@ def call private - def account_reset_request - AccountResetRequest.create_or_find_by(user_id: @user_id) + def fraud_user?(arr) + arr.user.fraud_review_pending? || + arr.user.fraud_rejection? + end + + def fraud_wait_period_not_met?(arr) + if fraud_wait_period_days.present? + return arr.requested_at > (Time.zone.now - fraud_wait_period_days.days) + else + false + end + end + + def fraud_wait_period_days + IdentityConfig.store.account_reset_fraud_user_wait_period_days end end end diff --git a/app/services/analytics_events.rb b/app/services/analytics_events.rb index 9b5923a4da6..3d42c776102 100644 --- a/app/services/analytics_events.rb +++ b/app/services/analytics_events.rb @@ -808,12 +808,22 @@ def idv_barcode_warning_retake_photos_clicked(liveness_checking_required:, **ext # @param [String] step the step that the user was on when they clicked cancel # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The user confirmed their choice to cancel going through IDV - def idv_cancellation_confirmed(step:, proofing_components: nil, **extra) + def idv_cancellation_confirmed( + step:, + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'IdV: cancellation confirmed', step: step, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -823,6 +833,8 @@ def idv_cancellation_confirmed(step:, proofing_components: nil, **extra) # @param [boolean,nil] cancelled_enrollment Whether the user's IPP enrollment has been canceled # @param [String,nil] enrollment_code IPP enrollment code # @param [Integer,nil] enrollment_id ID of the associated IPP enrollment record + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The user chose to go back instead of cancel IDV def idv_cancellation_go_back( step:, @@ -830,6 +842,8 @@ def idv_cancellation_go_back( cancelled_enrollment: nil, enrollment_code: nil, enrollment_id: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -839,6 +853,8 @@ def idv_cancellation_go_back( cancelled_enrollment: cancelled_enrollment, enrollment_code: enrollment_code, enrollment_id: enrollment_id, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -847,11 +863,15 @@ def idv_cancellation_go_back( # @param [String] request_came_from the controller and action from the # source such as "users/sessions#new" # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The user clicked cancel during IDV (presented with an option to go back or confirm) def idv_cancellation_visited( step:, request_came_from:, proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -859,6 +879,8 @@ def idv_cancellation_visited( step: step, request_came_from: request_came_from, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -1240,6 +1262,8 @@ def idv_doc_auth_welcome_visited(**extra) # @param [Boolean] in_person_verification_pending # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components # @param [String, nil] deactivation_reason Reason user's profile was deactivated, if any. + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # @identity.idp.previous_event_name IdV: review info visited def idv_enter_password_submitted( success:, @@ -1249,6 +1273,8 @@ def idv_enter_password_submitted( in_person_verification_pending:, deactivation_reason: nil, proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -1260,6 +1286,8 @@ def idv_enter_password_submitted( in_person_verification_pending: in_person_verification_pending, fraud_rejection: fraud_rejection, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -1267,18 +1295,24 @@ def idv_enter_password_submitted( # @param [Idv::ProofingComponentsLogging] proofing_components User's # current proofing components # @param [String] address_verification_method The method (phone or gpo) being + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # used to verify the user's identity # User visited IDV password confirm page # @identity.idp.previous_event_name IdV: review info visited def idv_enter_password_visited( proofing_components: nil, address_verification_method: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( :idv_enter_password_visited, address_verification_method: address_verification_method, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -1315,6 +1349,9 @@ def idv_exit_optional_questions( # @param [Boolean] gpo_verification_pending Profile is awaiting gpo verificaiton # @param [Boolean] in_person_verification_pending Profile is awaiting in person verificaiton # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. + # @param [Array,nil] profile_history Array of user's profiles (oldest to newest). # @see Reporting::IdentityVerificationReport#query This event is used by the identity verification # report. Changes here should be reflected there. # Tracks the last step of IDV, indicates the user successfully proofed @@ -1326,6 +1363,9 @@ def idv_final( in_person_verification_pending:, deactivation_reason: nil, proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + profile_history: nil, **extra ) track_event( @@ -1337,26 +1377,47 @@ def idv_final( in_person_verification_pending: in_person_verification_pending, deactivation_reason: deactivation_reason, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, + profile_history: profile_history, **extra, ) end # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # User visited forgot password page - def idv_forgot_password(proofing_components: nil, **extra) + def idv_forgot_password( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'IdV: forgot password visited', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # User confirmed forgot password - def idv_forgot_password_confirmed(proofing_components: nil, **extra) + def idv_forgot_password_confirmed( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'IdV: forgot password confirmed', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -1486,6 +1547,8 @@ def idv_front_image_clicked( # and now in hours # @param [Integer] phone_step_attempts Number of attempts at phone step before requesting letter # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # GPO letter was enqueued and the time at which it was enqueued def idv_gpo_address_letter_enqueued( enqueued_at:, @@ -1494,6 +1557,8 @@ def idv_gpo_address_letter_enqueued( hours_since_first_letter:, phone_step_attempts:, proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -1504,6 +1569,8 @@ def idv_gpo_address_letter_enqueued( hours_since_first_letter: hours_since_first_letter, phone_step_attempts: phone_step_attempts, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -1514,6 +1581,8 @@ def idv_gpo_address_letter_enqueued( # and now in hours # @param [Integer] phone_step_attempts Number of attempts at phone step before requesting letter # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # GPO letter was requested def idv_gpo_address_letter_requested( resend:, @@ -1521,6 +1590,8 @@ def idv_gpo_address_letter_requested( hours_since_first_letter:, phone_step_attempts:, proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -1530,6 +1601,8 @@ def idv_gpo_address_letter_requested( hours_since_first_letter:, phone_step_attempts:, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -1975,12 +2048,18 @@ def idv_in_person_ready_to_verify_sp_link_clicked(**extra) end # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The user visited the "ready to verify" page for the in person proofing flow def idv_in_person_ready_to_verify_visit(proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra) track_event( 'IdV: in person ready to verify visited', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2415,8 +2494,25 @@ def idv_in_person_usps_request_enroll_exception( end # User visits IdV - def idv_intro_visit(**extra) - track_event('IdV: intro visited', **extra) + # @param [Hash,nil] proofing_components User's proofing components. + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. + # @param [Array,nil] profile_history Array of user's profiles (oldest to newest). + def idv_intro_visit( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + profile_history: nil, + **extra + ) + track_event( + 'IdV: intro visited', + proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, + profile_history: profile_history, + **extra, + ) end # @param [String] enrollment_id @@ -2434,11 +2530,20 @@ def idv_ipp_deactivated_for_never_visiting_post_office( # The user visited the "letter enqueued" page shown during the verify by mail flow # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # @identity.idp.previous_event_name IdV: come back later visited - def idv_letter_enqueued_visit(proofing_components: nil, **extra) + def idv_letter_enqueued_visit( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'IdV: letter enqueued visited', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2531,12 +2636,22 @@ def idv_not_verified_visited(**extra) # key creation # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components # @param [boolean] checked whether the user checked or un-checked + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # the box with this click - def idv_personal_key_acknowledgment_toggled(checked:, proofing_components:, **extra) + def idv_personal_key_acknowledgment_toggled( + checked:, + proofing_components:, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'IdV: personal key acknowledgment toggled', checked: checked, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2544,10 +2659,19 @@ def idv_personal_key_acknowledgment_toggled(checked:, proofing_components:, **ex # A user has downloaded their personal key. This event is no longer emitted. # @identity.idp.previous_event_name IdV: download personal key # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components - def idv_personal_key_downloaded(proofing_components: nil, **extra) + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. + def idv_personal_key_downloaded( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'IdV: personal key downloaded', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2558,6 +2682,8 @@ def idv_personal_key_downloaded(proofing_components: nil, **extra) # @param [Boolean] fraud_rejection Profile is rejected due to fraud # @param [Boolean] in_person_verification_pending Profile is pending in-person verification # @param [String] address_verification_method "phone" or "gpo" + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # User submitted IDV personal key page def idv_personal_key_submitted( address_verification_method:, @@ -2566,6 +2692,8 @@ def idv_personal_key_submitted( in_person_verification_pending:, proofing_components: nil, deactivation_reason: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -2576,6 +2704,8 @@ def idv_personal_key_submitted( fraud_review_pending: fraud_review_pending, fraud_rejection: fraud_rejection, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2584,12 +2714,16 @@ def idv_personal_key_submitted( # @param [String] address_verification_method "phone" or "gpo" # @param [Boolean,nil] in_person_verification_pending # @param [Boolean] encrypted_profiles_missing True if user's session had no encrypted pii + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # User visited IDV personal key page def idv_personal_key_visited( proofing_components: nil, address_verification_method: nil, in_person_verification_pending: nil, encrypted_profiles_missing: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -2598,6 +2732,8 @@ def idv_personal_key_visited( address_verification_method: address_verification_method, in_person_verification_pending: in_person_verification_pending, encrypted_profiles_missing: encrypted_profiles_missing, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2606,12 +2742,16 @@ def idv_personal_key_visited( # @param [Hash] errors # @param ["sms", "voice"] otp_delivery_preference # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The user submitted their phone on the phone confirmation page def idv_phone_confirmation_form_submitted( success:, otp_delivery_preference:, errors:, proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -2620,36 +2760,65 @@ def idv_phone_confirmation_form_submitted( errors: errors, otp_delivery_preference: otp_delivery_preference, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The user was rate limited for submitting too many OTPs during the IDV phone step - def idv_phone_confirmation_otp_rate_limit_attempts(proofing_components: nil, **extra) + def idv_phone_confirmation_otp_rate_limit_attempts( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'Idv: Phone OTP attempts rate limited', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The user was locked out for hitting the phone OTP rate limit during IDV - def idv_phone_confirmation_otp_rate_limit_locked_out(proofing_components: nil, **extra) + def idv_phone_confirmation_otp_rate_limit_locked_out( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'Idv: Phone OTP rate limited user', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The user was rate limited for requesting too many OTPs during the IDV phone step - def idv_phone_confirmation_otp_rate_limit_sends(proofing_components: nil, **extra) + def idv_phone_confirmation_otp_rate_limit_sends( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'Idv: Phone OTP sends rate limited', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2663,6 +2832,8 @@ def idv_phone_confirmation_otp_rate_limit_sends(proofing_components: nil, **extr # @param [Hash] telephony_response response from Telephony gem # @param [String] phone_fingerprint Fingerprint string identifying phone number # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The user resent an OTP during the IDV phone step def idv_phone_confirmation_otp_resent( success:, @@ -2674,6 +2845,8 @@ def idv_phone_confirmation_otp_resent( telephony_response:, phone_fingerprint:, proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -2687,6 +2860,8 @@ def idv_phone_confirmation_otp_resent( telephony_response: telephony_response, phone_fingerprint: phone_fingerprint, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2701,6 +2876,8 @@ def idv_phone_confirmation_otp_resent( # @param [Hash] telephony_response response from Telephony gem # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components # @param [:test, :pinpoint] adapter which adapter the OTP was delivered with + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The user requested an OTP to confirm their phone during the IDV phone step def idv_phone_confirmation_otp_sent( success:, @@ -2713,6 +2890,8 @@ def idv_phone_confirmation_otp_sent( telephony_response:, adapter:, proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -2727,6 +2906,8 @@ def idv_phone_confirmation_otp_sent( telephony_response: telephony_response, adapter: adapter, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2738,6 +2919,8 @@ def idv_phone_confirmation_otp_sent( # @param [Integer] second_factor_attempts_count number of attempts to confirm this phone # @param [Time, nil] second_factor_locked_at timestamp when the phone was locked out # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # When a user attempts to confirm posession of a new phone number during the IDV process def idv_phone_confirmation_otp_submitted( success:, @@ -2747,6 +2930,8 @@ def idv_phone_confirmation_otp_submitted( second_factor_attempts_count:, second_factor_locked_at:, proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -2758,16 +2943,27 @@ def idv_phone_confirmation_otp_submitted( second_factor_attempts_count: second_factor_attempts_count, second_factor_locked_at: second_factor_locked_at, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # When a user visits the page to confirm posession of a new phone number during the IDV process - def idv_phone_confirmation_otp_visit(proofing_components: nil, **extra) + def idv_phone_confirmation_otp_visit( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'IdV: phone confirmation otp visited', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2775,11 +2971,15 @@ def idv_phone_confirmation_otp_visit(proofing_components: nil, **extra) # @param [Boolean] success # @param [Hash] errors # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The vendor finished the process of confirming the users phone def idv_phone_confirmation_vendor_submitted( success:, errors:, proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -2787,6 +2987,8 @@ def idv_phone_confirmation_vendor_submitted( success: success, errors: errors, proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2796,12 +2998,16 @@ def idv_phone_confirmation_vendor_submitted( # @param [Integer] remaining_submit_attempts number of submit attempts remaining # (previously called "remaining_attempts") # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # When a user gets an error during the phone finder flow of IDV def idv_phone_error_visited( type:, proofing_components: nil, limiter_expires_at: nil, remaining_submit_attempts: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -2811,17 +3017,28 @@ def idv_phone_error_visited( proofing_components: proofing_components, limiter_expires_at: limiter_expires_at, remaining_submit_attempts: remaining_submit_attempts, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, }.compact, ) end # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # User visited idv phone of record - def idv_phone_of_record_visited(proofing_components: nil, **extra) + def idv_phone_of_record_visited( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'IdV: phone of record visited', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2831,12 +3048,16 @@ def idv_phone_of_record_visited(proofing_components: nil, **extra) # @param [Hash] errors # @param [Hash] error_details # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. def idv_phone_otp_delivery_selection_submitted( success:, otp_delivery_preference:, proofing_components: nil, errors: nil, error_details: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **extra ) track_event( @@ -2849,15 +3070,26 @@ def idv_phone_otp_delivery_selection_submitted( proofing_components: proofing_components, **extra, }.compact, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, ) end # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # User visited idv phone OTP delivery selection - def idv_phone_otp_delivery_selection_visit(proofing_components: nil, **extra) + def idv_phone_otp_delivery_selection_visit( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'IdV: Phone OTP delivery Selection Visited', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -2876,21 +3108,42 @@ def idv_phone_use_different(step:, proofing_components: nil, **extra) # @identity.idp.previous_event_name IdV: Verify setup errors visited # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. + # @param [Array,nil] profile_history Array of user's profiles (oldest to newest). # Tracks when the user reaches the verify please call page after failing proofing - def idv_please_call_visited(proofing_components: nil, **extra) + def idv_please_call_visited( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + profile_history: nil, + **extra + ) track_event( 'IdV: Verify please call visited', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, + profile_history: profile_history, **extra, ) end # @param [Idv::ProofingComponentsLogging] proofing_components User's current proofing components + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. # The system encountered an error and the proofing results are missing - def idv_proofing_resolution_result_missing(proofing_components: nil, **extra) + def idv_proofing_resolution_result_missing( + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + **extra + ) track_event( 'IdV: proofing resolution result missing', proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, **extra, ) end @@ -3024,6 +3277,9 @@ def idv_selfie_image_added( # @param [String] source # @param [String] use_alternate_sdk # @param [Boolean] liveness_checking_required + # @param [Hash,nil] proofing_components User's proofing components. + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. def idv_selfie_image_clicked( acuant_sdk_upgrade_a_b_testing_enabled:, acuant_version:, @@ -3032,6 +3288,9 @@ def idv_selfie_image_clicked( source:, use_alternate_sdk:, liveness_checking_required: nil, + proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, **_extra ) track_event( @@ -3043,6 +3302,9 @@ def idv_selfie_image_clicked( source: source, use_alternate_sdk: use_alternate_sdk, liveness_checking_required: liveness_checking_required, + proofing_components: proofing_components, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, ) end # rubocop:enable Naming/VariableName,Naming/MethodParameterName @@ -3069,6 +3331,9 @@ def idv_session_error_visited( # @param [boolean,nil] cancelled_enrollment Whether the user's IPP enrollment has been canceled # @param [String,nil] enrollment_code IPP enrollment code # @param [Integer,nil] enrollment_id ID of the associated IPP enrollment record + # @param [String,nil] active_profile_idv_level ID verification level of user's active profile. + # @param [String,nil] pending_profile_idv_level ID verification level of user's pending profile. + # @param [Array,nil] profile_history Array of user's profiles (oldest to newest). # User started over idv def idv_start_over( step:, @@ -3077,6 +3342,9 @@ def idv_start_over( enrollment_code: nil, enrollment_id: nil, proofing_components: nil, + active_profile_idv_level: nil, + pending_profile_idv_level: nil, + profile_history: nil, **extra ) track_event( @@ -3087,6 +3355,9 @@ def idv_start_over( cancelled_enrollment: cancelled_enrollment, enrollment_code: enrollment_code, enrollment_id: enrollment_id, + active_profile_idv_level: active_profile_idv_level, + pending_profile_idv_level: pending_profile_idv_level, + profile_history: profile_history, **extra, ) end @@ -3800,6 +4071,7 @@ def openid_connect_bearer_token(success:, ial:, client_id:, errors:, **extra) # @param [String] scope # @param [Array] acr_values # @param [Array] vtr + # @param [String, nil] vtr_param # @param [Boolean] unauthorized_scope # @param [Boolean] user_fully_authenticated def openid_connect_request_authorization( @@ -3807,6 +4079,7 @@ def openid_connect_request_authorization( scope:, acr_values:, vtr:, + vtr_param:, unauthorized_scope:, user_fully_authenticated:, **extra @@ -3817,6 +4090,7 @@ def openid_connect_request_authorization( scope: scope, acr_values: acr_values, vtr: vtr, + vtr_param: vtr_param, unauthorized_scope: unauthorized_scope, user_fully_authenticated: user_fully_authenticated, **extra, @@ -4459,6 +4733,12 @@ def rules_of_use_visit # @param [Array] authn_context # @param [String] authn_context_comparison # @param [String] service_provider + # @param [String] endpoint + # @param [Boolean] idv + # @param [Boolean] finish_profile + # @param [Integer] requested_ial + # @param [Boolean] request_signed + # @param [String] matching_cert_serial def saml_auth( success:, errors:, @@ -4466,6 +4746,12 @@ def saml_auth( authn_context:, authn_context_comparison:, service_provider:, + endpoint:, + idv:, + finish_profile:, + requested_ial:, + request_signed:, + matching_cert_serial:, **extra ) track_event( @@ -4476,29 +4762,47 @@ def saml_auth( authn_context: authn_context, authn_context_comparison: authn_context_comparison, service_provider: service_provider, + endpoint: endpoint, + idv: idv, + finish_profile: finish_profile, + requested_ial: requested_ial, + request_signed: request_signed, + matching_cert_serial: matching_cert_serial, **extra, ) end # @param [Integer] requested_ial - # @param [String,nil] requested_aal_authn_context - # @param [Boolean,nil] force_authn + # @param [Array] authn_context + # @param [String, nil] requested_aal_authn_context + # @param [String, nil] requested_vtr_authn_context + # @param [Boolean] force_authn + # @param [Boolean] final_auth_request # @param [String] service_provider + # @param [Boolean] user_fully_authenticated # An external request for SAML Authentication was received def saml_auth_request( requested_ial:, + authn_context:, requested_aal_authn_context:, + requested_vtr_authn_context:, force_authn:, + final_auth_request:, service_provider:, + user_fully_authenticated:, **extra ) track_event( 'SAML Auth Request', { requested_ial: requested_ial, + authn_context: authn_context, requested_aal_authn_context: requested_aal_authn_context, + requested_vtr_authn_context: requested_vtr_authn_context, force_authn: force_authn, + final_auth_request: final_auth_request, service_provider: service_provider, + user_fully_authenticated: user_fully_authenticated, **extra, }.compact, ) @@ -4624,12 +4928,16 @@ def sp_inactive_visit # @param [Integer] ial # @param [Integer] billed_ial # @param [String, nil] sign_in_flow - def sp_redirect_initiated(ial:, billed_ial:, sign_in_flow:, **extra) + # @param [String, nil] vtr + # @param [String, nil] acr_values + def sp_redirect_initiated(ial:, billed_ial:, sign_in_flow:, vtr:, acr_values:, **extra) track_event( 'SP redirect initiated', ial:, billed_ial:, sign_in_flow:, + vtr: vtr, + acr_values: acr_values, **extra, ) end diff --git a/app/services/idv/analytics_events_enhancer.rb b/app/services/idv/analytics_events_enhancer.rb index 24124a09655..188d381d165 100644 --- a/app/services/idv/analytics_events_enhancer.rb +++ b/app/services/idv/analytics_events_enhancer.rb @@ -84,7 +84,6 @@ module AnalyticsEventsEnhancer idv_in_person_usps_proofing_results_job_unexpected_response idv_in_person_usps_proofing_results_job_user_sent_to_fraud_review idv_in_person_usps_request_enroll_exception - idv_intro_visit idv_ipp_deactivated_for_never_visiting_post_office idv_link_sent_capture_doc_polling_complete idv_link_sent_capture_doc_polling_started @@ -109,6 +108,20 @@ module AnalyticsEventsEnhancer idv_warning_shown ].to_set.freeze + STANDARD_ARGUMENTS = %i[ + proofing_components + active_profile_idv_level + pending_profile_idv_level + ].freeze + + METHODS_WITH_PROFILE_HISTORY = %i[ + idv_doc_auth_verify_proofing_results + idv_intro_visit + idv_final + idv_please_call_visited + idv_start_over + ].to_set.freeze + def self.included(_mod) raise 'this mixin is intended to be prepended, not included' end @@ -117,7 +130,7 @@ def self.prepended(mod) mod.instance_methods.each do |method_name| if should_enhance_method?(method_name) mod.define_method method_name do |**kwargs| - super(**kwargs, **common_analytics_attributes) + super(**kwargs, **analytics_attributes(method_name)) end end end @@ -125,16 +138,48 @@ def self.prepended(mod) def self.should_enhance_method?(method_name) return false if IGNORED_METHODS.include?(method_name) - method_name.start_with?('idv_') end + def self.extra_args_for_method(method_name) + return [] unless should_enhance_method?(method_name) + + args = STANDARD_ARGUMENTS + + if METHODS_WITH_PROFILE_HISTORY.include?(method_name) + args = [ + *args, + :profile_history, + ] + end + + args + end + private - def common_analytics_attributes - { - proofing_components: proofing_components, - }.compact + def analytics_attributes(method_name) + AnalyticsEventsEnhancer.extra_args_for_method(method_name). + index_with do |arg_name| + send(arg_name.to_s).presence + end. + compact + end + + def active_profile_idv_level + user&.respond_to?(:active_profile) && user&.active_profile&.idv_level + end + + def pending_profile_idv_level + user&.respond_to?(:pending_profile) && user&.pending_profile&.idv_level + end + + def profile_history + return if !user&.respond_to?(:profiles) + + (user&.profiles || []). + sort_by { |profile| profile.created_at }. + map { |profile| ProfileLogging.new(profile) } end def proofing_components diff --git a/app/services/idv/profile_logging.rb b/app/services/idv/profile_logging.rb new file mode 100644 index 00000000000..5f113451c19 --- /dev/null +++ b/app/services/idv/profile_logging.rb @@ -0,0 +1,22 @@ +module Idv + ProfileLogging = Struct.new(:profile) do + def as_json + profile.slice( + %i[ + id + active + idv_level + created_at + verified_at + activated_at + in_person_verification_pending_at + gpo_verification_pending_at + fraud_review_pending_at + fraud_rejection_at + fraud_pending_reason + deactivation_reason + ], + ).compact + end + end +end diff --git a/app/services/idv/session.rb b/app/services/idv/session.rb index 9a9c7db6171..534a07ff45c 100644 --- a/app/services/idv/session.rb +++ b/app/services/idv/session.rb @@ -25,6 +25,7 @@ class Session selfie_check_performed selfie_check_required skip_doc_auth + skip_doc_auth_from_handoff skip_hybrid_handoff ssn threatmetrix_review_status diff --git a/app/services/phone_number_capabilities.rb b/app/services/phone_number_capabilities.rb index 04b84984bd6..9c6734f9a8b 100644 --- a/app/services/phone_number_capabilities.rb +++ b/app/services/phone_number_capabilities.rb @@ -11,20 +11,29 @@ def self.load_config attr_reader :phone, :phone_confirmed - def self.translated_international_codes - @translated_intl_codes_data = nil if Rails.env.development? - return @translated_intl_codes_data[I18n.locale] if @translated_intl_codes_data - - @translated_intl_codes_data = Hash.new { |h, k| h[k] = {} } + def self.generate_translated_international_codes_data + translated_intl_codes_data = Hash.new { |h, k| h[k] = {} } I18n.available_locales.each do |locale| INTERNATIONAL_CODES.each do |k, value| - @translated_intl_codes_data[locale][k] = + translated_intl_codes_data[locale][k] = value.merge('name' => I18n.t("countries.#{k.downcase}", locale: locale)) end end - @translated_intl_codes_data[I18n.locale] + translated_intl_codes_data end + def self.translated_international_codes + translated_intl_codes_data = if Rails.env.development? + generate_translated_international_codes_data + else + TRANSLATED_INTL_CODES_DATA + end + + translated_intl_codes_data[I18n.locale] if translated_intl_codes_data + end + + TRANSLATED_INTL_CODES_DATA = generate_translated_international_codes_data + def initialize(phone, phone_confirmed:) @phone = phone @phone_confirmed = phone_confirmed diff --git a/app/services/profanity_detector.rb b/app/services/profanity_detector.rb index 1d53231e745..e7e88f1a5c7 100644 --- a/app/services/profanity_detector.rb +++ b/app/services/profanity_detector.rb @@ -20,12 +20,10 @@ def without_profanity(limit: 1_000) # ProfanityFilter::Base.profane? splits by word, but this # checks all substrings def profane?(str) - preprocess_if_needed! - str_no_whitespace = str.gsub(/\W/, '').downcase - (min_profanity_length..[str_no_whitespace.length, max_profanity_length].min).each do |size| - profane_regex = @regex_by_length[size] + (MIN_PROFANITY_LENGTH..[str_no_whitespace.length, MAX_PROFANITY_LENGTH].min).each do |size| + profane_regex = REGEX_BY_LENGTH[size] next if profane_regex.nil? return true if profane_regex.match?(str_no_whitespace) end @@ -33,14 +31,7 @@ def profane?(str) false end - class << self - attr_reader :min_profanity_length - attr_reader :max_profanity_length - end - - def preprocess_if_needed! - return if @preprocessed - + def self.preprocess_lengths! # Map of {Integer => Set} profanity_by_length = Hash.new { |h, k| h[k] = Set.new } @@ -49,15 +40,17 @@ def preprocess_if_needed! end # Map of {Integer => Regexp} - @regex_by_length = Hash.new + regex_by_length = Hash.new profanity_by_length.each do |k, v| escaped = v.to_a.map { |x| Regexp.escape(x) } - @regex_by_length[k] = Regexp.new("(#{escaped.join('|')})") + regex_by_length[k] = Regexp.new("(#{escaped.join('|')})") end - @min_profanity_length, @max_profanity_length = profanity_by_length.keys.minmax + min_profanity_length, max_profanity_length = profanity_by_length.keys.minmax - @preprocessed = true + [regex_by_length, min_profanity_length, max_profanity_length] end + + REGEX_BY_LENGTH, MIN_PROFANITY_LENGTH, MAX_PROFANITY_LENGTH = self.preprocess_lengths! end diff --git a/app/services/saml_endpoint.rb b/app/services/saml_endpoint.rb index 5adc56792dc..340954a3cd3 100644 --- a/app/services/saml_endpoint.rb +++ b/app/services/saml_endpoint.rb @@ -10,7 +10,7 @@ def self.suffixes end def self.endpoint_configs - @endpoint_configs ||= IdentityConfig.store.saml_endpoint_configs + IdentityConfig.store.saml_endpoint_configs end def secret_key diff --git a/app/services/vot/legacy_component_values.rb b/app/services/vot/legacy_component_values.rb index d21b47ccc78..5ac5bab7836 100644 --- a/app/services/vot/legacy_component_values.rb +++ b/app/services/vot/legacy_component_values.rb @@ -76,11 +76,13 @@ module LegacyComponentValues requirements: [:aal2, :hspd12], ) + NAME_HASH = constants.map do |constant| + component_value = const_get(constant) + [component_value.name, component_value] + end.to_h + def self.by_name - @by_name ||= constants.map do |constant| - component_value = const_get(constant) - [component_value.name, component_value] - end.to_h + NAME_HASH end end end diff --git a/app/services/vot/supported_component_values.rb b/app/services/vot/supported_component_values.rb index ee8ba8e862e..8329e88b3bc 100644 --- a/app/services/vot/supported_component_values.rb +++ b/app/services/vot/supported_component_values.rb @@ -37,11 +37,13 @@ module SupportedComponentValues requirements: [:biometric_comparison], ) + NAME_HASH = constants.map do |constant| + component_value = const_get(constant) + [component_value.name, component_value] + end.to_h + def self.by_name - @by_name ||= constants.map do |constant| - component_value = const_get(constant) - [component_value.name, component_value] - end.to_h + NAME_HASH end end end diff --git a/app/views/account_reset/pending/cancel.html.erb b/app/views/account_reset/pending/cancel.html.erb index 2194bffda43..19663ddeb73 100644 --- a/app/views/account_reset/pending/cancel.html.erb +++ b/app/views/account_reset/pending/cancel.html.erb @@ -1,6 +1,6 @@ -<% self.title = t('account_reset.pending.cancelled') %> +<% self.title = t('account_reset.pending.canceled') %> -<%= render PageHeadingComponent.new.with_content(t('account_reset.pending.cancelled')) %> +<%= render PageHeadingComponent.new.with_content(t('account_reset.pending.canceled')) %> <%= link_to( t('links.continue_sign_in'), diff --git a/app/views/account_reset/pending/show.html.erb b/app/views/account_reset/pending/show.html.erb index ceb730fe1fc..970283d4574 100644 --- a/app/views/account_reset/pending/show.html.erb +++ b/app/views/account_reset/pending/show.html.erb @@ -5,7 +5,7 @@

<%= t( 'account_reset.pending.wait_html', - hours: @pending_presenter.account_reset_deletion_period_hours, + waiting_period: @pending_presenter.account_reset_deletion_period, interval: @pending_presenter.time_remaining_until_granted, ) %>

diff --git a/app/views/idv/by_mail/enter_code/_did_not_receive_letter.html.erb b/app/views/idv/by_mail/enter_code/_did_not_receive_letter.html.erb new file mode 100644 index 00000000000..d6b970d9eca --- /dev/null +++ b/app/views/idv/by_mail/enter_code/_did_not_receive_letter.html.erb @@ -0,0 +1,52 @@ +<% if !@can_request_another_letter %> + <%= render AlertComponent.new(type: :warning, class: 'margin-bottom-4') do %> + <%= t( + 'idv.gpo.alert_rate_limit_warning_html', + date_letter_was_sent: I18n.l( + @last_date_letter_was_sent, + format: :event_date, + ), + ) %> + <% end %> +<% end %> + +<%= render AlertComponent.new(type: :info, class: 'margin-bottom-4', text_tag: 'div') do %> +

+ <%= t('idv.gpo.alert_info') %> +
+ <%= render 'shared/address', address: @gpo_verify_form.pii %> +

+

+ <%= t('idv.gpo.wrong_address') %> + <%= link_to t('idv.gpo.clear_and_start_over'), idv_confirm_start_over_path %> +

+<% end %> + +<%= render PageHeadingComponent.new.with_content(t('idv.gpo.did_not_receive_letter.title')) %> + +<% if @can_request_another_letter %> + <%= t( + 'idv.gpo.did_not_receive_letter.intro.request_new_letter_prompt_html', + request_new_letter_link: link_to( + t('idv.gpo.did_not_receive_letter.intro.request_new_letter_link'), + idv_request_letter_path, + ), + ) %> +<% end %> +<%= t('idv.gpo.did_not_receive_letter.intro.be_patient_html') %> + +
+ +

<%= t('idv.gpo.form.title') %>

+ +

+ <%= t('idv.gpo.did_not_receive_letter.form.instructions') %> +

+ +<%= render 'form' %> + +<%= link_to t('idv.gpo.return_to_profile'), account_path %> + +
+ <%= link_to t('idv.messages.clear_and_start_over'), idv_confirm_start_over_path %> +
diff --git a/app/views/idv/by_mail/enter_code/_enter_code.html.erb b/app/views/idv/by_mail/enter_code/_enter_code.html.erb new file mode 100644 index 00000000000..c30a8fcff09 --- /dev/null +++ b/app/views/idv/by_mail/enter_code/_enter_code.html.erb @@ -0,0 +1,47 @@ +<% if !@can_request_another_letter %> + <%= render AlertComponent.new(type: :warning, class: 'margin-bottom-4') do %> + <%= t( + 'idv.gpo.alert_rate_limit_warning_html', + date_letter_was_sent: I18n.l( + @last_date_letter_was_sent, + format: :event_date, + ), + ) %> + <% end %> +<% end %> + +<%= render AlertComponent.new(type: :info, class: 'margin-bottom-4', text_tag: 'div') do %> +

+ <%= t('idv.gpo.alert_info') %> +
+ <%= render 'shared/address', address: @gpo_verify_form.pii %> +

+

+ <%= t('idv.gpo.wrong_address') %> + <%= link_to t('idv.gpo.clear_and_start_over'), idv_confirm_start_over_path %> +

+<% end %> + +<%= render PageHeadingComponent.new.with_content(t('idv.gpo.title')) %> + +<%= t('idv.gpo.intro_html') %> + +
+ +

<%= t('idv.gpo.form.title') %>

+ +

+ <%= t('idv.gpo.form.instructions') %> +

+ +<%= render 'form' %> + +<% if @can_request_another_letter %> + <%= link_to t('idv.messages.gpo.resend'), idv_request_letter_path, class: 'display-block margin-bottom-2' %> +<% end %> + +<%= link_to t('idv.gpo.return_to_profile'), account_path %> + +
+ <%= link_to t('idv.messages.clear_and_start_over'), idv_confirm_start_over_path %> +
diff --git a/app/views/idv/by_mail/enter_code/_form.html.erb b/app/views/idv/by_mail/enter_code/_form.html.erb new file mode 100644 index 00000000000..b34ee6f707a --- /dev/null +++ b/app/views/idv/by_mail/enter_code/_form.html.erb @@ -0,0 +1,20 @@ +<%= simple_form_for( + @gpo_verify_form, + url: idv_verify_by_mail_enter_code_path, + html: { autocomplete: 'off', method: :post }, + ) do |f| %> +
+
+ <%= render ValidatedFieldComponent.new( + form: f, + name: :otp, + maxlength: 10, + required: true, + autofocus: true, + label: t('idv.gpo.form.otp_label'), + ) %> + <%= hidden_field_tag :did_not_receive_letter, @did_not_receive_letter %> + <%= f.submit t('idv.gpo.form.submit'), full_width: true, wide: false, class: 'display-block margin-top-5' %> +
+
+<% end %> diff --git a/app/views/idv/by_mail/enter_code/index.html.erb b/app/views/idv/by_mail/enter_code/index.html.erb index 1bc72fa6e6a..98d858879e4 100644 --- a/app/views/idv/by_mail/enter_code/index.html.erb +++ b/app/views/idv/by_mail/enter_code/index.html.erb @@ -9,98 +9,8 @@ <% if @user_did_not_receive_letter %> <% self.title = t('idv.gpo.did_not_receive_letter.title') %> + <%= render 'did_not_receive_letter' %> <% else %> <% self.title = t('idv.gpo.title') %> + <%= render 'enter_code' %> <% end %> - -<% if !@can_request_another_letter %> - <%= render AlertComponent.new(type: :warning, class: 'margin-bottom-4') do %> - <%= t( - 'idv.gpo.alert_rate_limit_warning_html', - date_letter_was_sent: I18n.l( - @last_date_letter_was_sent, - format: :event_date, - ), - ) %> - <% end %> -<% end %> - -<%= render AlertComponent.new(type: :info, class: 'margin-bottom-4', text_tag: 'div') do %> -

- <%= t('idv.gpo.alert_info') %> -
- <%= render 'shared/address', address: @gpo_verify_form.pii %> -

-

- <%= t('idv.gpo.wrong_address') %> - <%= link_to t('idv.gpo.clear_and_start_over'), idv_confirm_start_over_path %> -

-<% end %> - -<%= render PageHeadingComponent.new.with_content( - if @user_did_not_receive_letter - t('idv.gpo.did_not_receive_letter.title') - else - t('idv.gpo.title') - end, - ) %> - -<% if @user_did_not_receive_letter %> - <% if @can_request_another_letter %> - <%= t( - 'idv.gpo.did_not_receive_letter.intro.request_new_letter_prompt_html', - request_new_letter_link: link_to( - t('idv.gpo.did_not_receive_letter.intro.request_new_letter_link'), - idv_request_letter_path, - ), - ) %> - <% end %> - <%= t('idv.gpo.did_not_receive_letter.intro.be_patient_html') %> -<% else %> - <%= t('idv.gpo.intro_html') %> -<% end %> -
-

<%= t('idv.gpo.form.title') %>

- -

- <%= if @user_did_not_receive_letter - t('idv.gpo.did_not_receive_letter.form.instructions') - else - t('idv.gpo.form.instructions') - end %> -

- -<%= simple_form_for( - @gpo_verify_form, - url: idv_verify_by_mail_enter_code_path, - html: { autocomplete: 'off', method: :post }, - ) do |f| %> -
-
- <%= render ValidatedFieldComponent.new( - form: f, - name: :otp, - maxlength: 10, - required: true, - autofocus: true, - input_html: { - value: @code, - }, - label: t('idv.gpo.form.otp_label'), - ) %> - <%= f.submit t('idv.gpo.form.submit'), full_width: true, wide: false, class: 'display-block margin-top-5' %> -
-
-<% end %> - -<% if @can_request_another_letter %> - <% unless @user_did_not_receive_letter %> - <%= link_to t('idv.messages.gpo.resend'), idv_request_letter_path, class: 'display-block margin-bottom-2' %> - <% end %> -<% end %> - -<%= link_to t('idv.gpo.return_to_profile'), account_path %> - -
- <%= link_to t('idv.messages.clear_and_start_over'), idv_confirm_start_over_path %> -
diff --git a/app/views/idv/cancellations/destroy.html.erb b/app/views/idv/cancellations/destroy.html.erb index a22093dd3ba..47f56b2a197 100644 --- a/app/views/idv/cancellations/destroy.html.erb +++ b/app/views/idv/cancellations/destroy.html.erb @@ -1,4 +1,4 @@ -<% self.title = t('titles.idv.cancelled') %> +<% self.title = t('titles.idv.canceled') %> <%= render StatusPageComponent.new(status: :error) do |c| %> <% c.with_header { t('idv.cancel.headings.confirmation.hybrid') } %> diff --git a/app/views/idv/document_capture/show.html.erb b/app/views/idv/document_capture/show.html.erb index 4ef8ddd986b..67482ca0a14 100644 --- a/app/views/idv/document_capture/show.html.erb +++ b/app/views/idv/document_capture/show.html.erb @@ -9,5 +9,6 @@ acuant_version: acuant_version, opted_in_to_in_person_proofing: opted_in_to_in_person_proofing, skip_doc_auth: skip_doc_auth, + skip_doc_auth_from_handoff: skip_doc_auth_from_handoff, doc_auth_selfie_capture: doc_auth_selfie_capture, ) %> diff --git a/app/views/idv/how_to_verify/show.html.erb b/app/views/idv/how_to_verify/show.html.erb index 93ac3f7b5c1..2955d67dbce 100644 --- a/app/views/idv/how_to_verify/show.html.erb +++ b/app/views/idv/how_to_verify/show.html.erb @@ -3,66 +3,79 @@ <%= render PageHeadingComponent.new.with_content(t('doc_auth.headings.how_to_verify')) %>

<%= t('doc_auth.info.how_to_verify') %>

-<%= simple_form_for( - @idv_how_to_verify_form, - html: { autocomplete: 'off' }, - method: :put, - url: idv_how_to_verify_url, - ) do |f| -%> -
- <%= f.radio_button( +
+
+ <%= image_tag( + asset_url('idv/remote.svg'), + width: 88, + height: 88, + class: 'margin-right-1 margin-top-4', + alt: t('image_description.laptop_and_phone'), + ) %> +
+
+ <%= simple_form_for( + @idv_how_to_verify_form, + html: { autocomplete: 'off', + 'aria-label': t('forms.buttons.continue_remote') }, + method: :put, + url: idv_how_to_verify_url, + ) do |f| + %> + <%= f.hidden_field( :selection, - Idv::HowToVerifyForm::REMOTE, - class: 'usa-radio__input usa-radio__input--tile', + value: Idv::HowToVerifyForm::REMOTE, ) %> <%= f.label( :selection_remote, - class: 'usa-radio__label usa-radio__label--illustrated usa-radio__label-illustrated-large', ) do %> - <%= image_tag asset_url('idv/remote.svg'), - width: 88, - height: 92, - class: 'usa-radio__image', - alt: t('image_description.laptop_and_phone') - %> -
- - <%= t('doc_auth.tips.most_common') %> - -

<%= t('doc_auth.headings.verify_online') %>

- -

<%= t('doc_auth.info.verify_online_instruction') %>

-

<%= t('doc_auth.info.verify_online_description') %>

-
-
+

<%= t('doc_auth.headings.verify_online') %>

+
+

<%= t('doc_auth.info.verify_online_instruction') %>

+

<%= t('doc_auth.info.verify_online_description') %>

+
+ <% end %> - <%= f.radio_button( - :selection, - Idv::HowToVerifyForm::IPP, - class: 'usa-radio__input usa-radio__input--tile', - ) %> - <%= f.label( - :selection_ipp, - class: 'usa-radio__label usa-radio__label--illustrated usa-radio__label-illustrated-large', - ) do %> - <%= image_tag asset_url('idv/in-person.svg'), - width: 88, - height: 92, - class: 'usa-radio__image', - alt: t('image_description.post_office') - %> -
-

<%= t('doc_auth.headings.verify_at_post_office') %>

- + <%= f.submit t('forms.buttons.continue_remote'), class: 'display-block margin-top-3 margin-bottom-5' %> + <% end %> +
+
+
+
+ <%= image_tag( + asset_url('idv/in-person.svg'), + width: 88, + height: 88, + class: 'margin-right-1 margin-top-4', + alt: t('image_description.post_office'), + ) %> +
+
+ <%= simple_form_for( + @idv_how_to_verify_form, + html: { autocomplete: 'off', + 'aria-label': t('forms.buttons.continue_ipp') }, + method: :put, + url: idv_how_to_verify_url, + ) do |f| + %> + <%= f.hidden_field( + :selection, + value: Idv::HowToVerifyForm::IPP, + ) %> + <%= f.label( + :selection_ipp, + ) do %> +

<%= t('doc_auth.headings.verify_at_post_office') %>

+

<%= t('doc_auth.info.verify_at_post_office_instruction') %>

<%= t('doc_auth.info.verify_at_post_office_description') %>

- -
- <% end %> +
+ <% end %> + <%= f.submit t('forms.buttons.continue_ipp'), class: 'display-block margin-top-3 margin-bottom-5', outline: true %> + <% end %>
- <%= f.submit t('forms.buttons.continue'), class: 'display-block margin-y-5' %> -<% end %> +
<%= render( 'shared/troubleshooting_options', @@ -87,3 +100,4 @@ }, ], ) %> +<%= render 'idv/doc_auth/cancel', step: 'how_to_verify' %> diff --git a/app/views/idv/hybrid_handoff/show.html.erb b/app/views/idv/hybrid_handoff/show.html.erb index a7164548357..9674077ff28 100644 --- a/app/views/idv/hybrid_handoff/show.html.erb +++ b/app/views/idv/hybrid_handoff/show.html.erb @@ -89,6 +89,16 @@ <%= f.submit t('forms.buttons.send_link') %> <% end %>
+ <% if @direct_ipp_with_selfie_enabled %> +
+

+ <%= t('doc_auth.info.hybrid_handoff_ipp_html') %> +

+

+ <%= link_to t('in_person_proofing.headings.prepare'), idv_document_capture_path(step: :hybrid_handoff) %> +

+
+ <% end %>
<% end %> diff --git a/app/views/idv/hybrid_mobile/document_capture/show.html.erb b/app/views/idv/hybrid_mobile/document_capture/show.html.erb index 1432d0e6782..1be2d1127bc 100644 --- a/app/views/idv/hybrid_mobile/document_capture/show.html.erb +++ b/app/views/idv/hybrid_mobile/document_capture/show.html.erb @@ -9,5 +9,6 @@ acuant_version: acuant_version, opted_in_to_in_person_proofing: false, skip_doc_auth: false, + skip_doc_auth_from_handoff: nil, doc_auth_selfie_capture: doc_auth_selfie_capture, ) %> diff --git a/app/views/idv/shared/_document_capture.html.erb b/app/views/idv/shared/_document_capture.html.erb index 02e22f02c8e..fb6e4cb1367 100644 --- a/app/views/idv/shared/_document_capture.html.erb +++ b/app/views/idv/shared/_document_capture.html.erb @@ -39,7 +39,9 @@ doc_auth_selfie_capture: FeatureManagement.idv_allow_selfie_check? && doc_auth_selfie_capture, doc_auth_selfie_desktop_test_mode: IdentityConfig.store.doc_auth_selfie_desktop_test_mode, skip_doc_auth: skip_doc_auth, + skip_doc_auth_from_handoff: skip_doc_auth_from_handoff, how_to_verify_url: idv_how_to_verify_url, + previous_step_url: @previous_step_url, ui_exit_question_section_enabled: IdentityConfig.store.doc_auth_exit_question_section_enabled, } %> <%= simple_form_for( diff --git a/app/views/user_mailer/account_reset_granted.html.erb b/app/views/user_mailer/account_reset_granted.html.erb index 70d608be1d9..4da0fcc5ec8 100644 --- a/app/views/user_mailer/account_reset_granted.html.erb +++ b/app/views/user_mailer/account_reset_granted.html.erb @@ -1,5 +1,5 @@

- <%= t('user_mailer.account_reset_granted.intro_html', hours: @account_reset_deletion_period_hours, app_name: link_to(APP_NAME, IdentityConfig.store.mailer_domain_name, class: 'gray')) %> + <%= t('user_mailer.account_reset_granted.intro_html', waiting_period: @account_reset_deletion_period_interval, app_name: link_to(APP_NAME, IdentityConfig.store.mailer_domain_name, class: 'gray')) %>

diff --git a/app/views/user_mailer/account_reset_request.html.erb b/app/views/user_mailer/account_reset_request.html.erb index d486d654efc..932fcfad3a5 100644 --- a/app/views/user_mailer/account_reset_request.html.erb +++ b/app/views/user_mailer/account_reset_request.html.erb @@ -1,5 +1,5 @@

- <%= t('user_mailer.account_reset_request.intro_html', app_name: link_to(APP_NAME, IdentityConfig.store.mailer_domain_name, class: 'gray'), hours: @account_reset_deletion_period_hours) %> + <%= t('user_mailer.account_reset_request.intro_html', app_name: link_to(APP_NAME, IdentityConfig.store.mailer_domain_name, class: 'gray'), waiting_period: @account_reset_deletion_period_interval) %>

diff --git a/config.ru b/config.ru index 7b660323fd5..c83e59dd895 100644 --- a/config.ru +++ b/config.ru @@ -8,5 +8,4 @@ STDOUT.sync = true require ::File.expand_path('../config/environment', __FILE__) -use Rack::ContentLength run Rails.application diff --git a/config/application.yml.default b/config/application.yml.default index 865bba115a4..b188461db5c 100644 --- a/config/application.yml.default +++ b/config/application.yml.default @@ -24,6 +24,7 @@ all_redirect_uris_cache_duration_minutes: 2 allowed_ialmax_providers: '[]' allowed_verified_within_providers: '[]' account_reset_token_valid_for_days: 1 +account_reset_fraud_user_wait_period_days: account_reset_wait_period_days: 1 account_suspended_support_code: EFGHI acuant_assure_id_password: '' @@ -509,6 +510,7 @@ production: test: aamva_private_key: 123abc aamva_public_key: 123abc + account_reset_fraud_user_wait_period_days: 30 acuant_assure_id_url: https://example.com acuant_facial_match_url: https://facial_match.example.com acuant_passlive_url: https://liveness.example.com diff --git a/config/initializers/rack_timeout.rb b/config/initializers/rack_timeout.rb index 700bc9f30f9..a6e0df3b7eb 100644 --- a/config/initializers/rack_timeout.rb +++ b/config/initializers/rack_timeout.rb @@ -11,10 +11,6 @@ class Timeout [path] + Idp::Constants::AVAILABLE_LOCALES.map { |locale| "/#{locale}#{path}" } end + ['/api/verify/images'] - class << self - attr_accessor :excludes - end - def call_with_excludes(env) if EXCLUDES.any? { |path| env['REQUEST_URI']&.start_with?(path) } @app.call(env) diff --git a/config/locales/account_reset/en.yml b/config/locales/account_reset/en.yml index f3fe9cf0d60..944b6119d3d 100644 --- a/config/locales/account_reset/en.yml +++ b/config/locales/account_reset/en.yml @@ -29,12 +29,12 @@ en: title: Deleting your account should be your last resort pending: cancel_request: Cancel request - cancelled: We have cancelled your request to delete your account. + canceled: We have canceled your request to delete your account. confirm: If you cancel now, you must create a new request and wait another %{interval} to delete your account. header: You requested to delete your account - wait_html: There is a %{hours}-hour waiting period to delete your account. In - %{interval}, you will receive an email with + wait_html: There is a waiting period of %{waiting_period} to delete your + account. In %{interval}, you will receive an email with instructions to complete the deletion. recovery_options: check_saved_credential: See if you have a saved credential diff --git a/config/locales/account_reset/es.yml b/config/locales/account_reset/es.yml index 9f8f1dc4317..1e44f0e8054 100644 --- a/config/locales/account_reset/es.yml +++ b/config/locales/account_reset/es.yml @@ -30,13 +30,13 @@ es: title: Eliminar tu cuenta debería ser tu último recurso pending: cancel_request: Cancelar petición - cancelled: Hemos cancelado su solicitud para eliminar su cuenta. + canceled: Hemos cancelado su solicitud para eliminar su cuenta. confirm: Si cancela ahora, debe crear una nueva solicitud y esperar otras %{interval} para eliminar su cuenta. header: Solicitaste eliminar tu cuenta - wait_html: Hay un período de espera de %{hours} horas para eliminar su cuenta. - En %{interval}, recibirá un correo electrónico con - instrucciones para completar la eliminación. + wait_html: Hay un período de espera de %{waiting_period} para eliminar su + cuenta. En %{interval}, recibirá un correo electrónico + con instrucciones para completar la eliminación. recovery_options: check_saved_credential: Verifica si tienes una credencial almacenada check_webauthn_platform_info: Si has habilitado el desbloqueo facial o táctil, diff --git a/config/locales/account_reset/fr.yml b/config/locales/account_reset/fr.yml index cd52a50fa08..164458c9ede 100644 --- a/config/locales/account_reset/fr.yml +++ b/config/locales/account_reset/fr.yml @@ -30,11 +30,11 @@ fr: title: La suppression de votre compte devrait être votre dernier recours pending: cancel_request: Demande d’annulation - cancelled: Nous avons annulé votre demande de suppression de votre compte. + canceled: Nous avons annulé votre demande de suppression de votre compte. confirm: Si vous annulez maintenant, vous devez créer une nouvelle demande et attendre encore %{interval} pour supprimer votre compte. header: Vous avez demandé de supprimer votre compte - wait_html: Il y a un délai d’attente de %{hours} heures pour supprimer votre + wait_html: Il y a un délai d’attente de %{waiting_period} pour supprimer votre compte. Dans %{interval}, vous recevrez un e-mail avec des instructions pour terminer la suppression. recovery_options: diff --git a/config/locales/doc_auth/en.yml b/config/locales/doc_auth/en.yml index 9396854a2df..734145929a0 100644 --- a/config/locales/doc_auth/en.yml +++ b/config/locales/doc_auth/en.yml @@ -206,9 +206,11 @@ en: pretending to be you. %{link_html}' getting_started_learn_more: Learn more about verifying your identity how_to_verify: You have the option to verify your identity online, or in person - at a participating Post Office + at a participating Post Office. how_to_verify_troubleshooting_options_header: Want to learn more about how to verify your identity? hybrid_handoff: We’ll collect information about you by reading your state‑issued ID. + hybrid_handoff_ipp_html: Don’t have a mobile phone? You can + verify your identity at a United States Post Office instead. image_loaded: Image loaded image_loading: Image loading image_updated: Image updated @@ -242,14 +244,13 @@ en: this computer after you take photos. Your mobile phone must have a camera and a web browser. verify_at_post_office_description: This option is better if you don’t have a - mobile device or an easy way to take photos of your ID. + phone to take photos of your ID. verify_at_post_office_instruction: You’ll enter your ID information online, and verify your identity in person at a participating Post Office. verify_at_post_office_link_text: Learn more about verifying in person verify_identity: We’ll ask for your ID, phone number, and other personal information to verify your identity against public records. - verify_online_description: This option is better if you have a mobile device or - a way to take photos of your ID. + verify_online_description: This option is better if you have a phone to take photos of your ID. verify_online_instruction: You’ll take photos of your ID to verify your identity fully online. Most users finish this process in one sitting. verify_online_link_text: Learn more about verifying online @@ -288,7 +289,6 @@ en: document_capture_selfie_text1: Hold your device at eye level document_capture_selfie_text2: Make sure your whole face is visible document_capture_selfie_text3: Take your photo in a well-lit place - most_common: Most Common review_issues_id_header_text: 'Review the images of your state‑issued ID:' review_issues_id_text1: Did you use a dark background? review_issues_id_text2: Did you take the photo on a flat surface? diff --git a/config/locales/doc_auth/es.yml b/config/locales/doc_auth/es.yml index bc0015c3d2e..c6d05cc9a55 100644 --- a/config/locales/doc_auth/es.yml +++ b/config/locales/doc_auth/es.yml @@ -244,6 +244,9 @@ es: how_to_verify_troubleshooting_options_header: ¿Quiere saber más sobre cómo verificar su identidad? hybrid_handoff: Recopilaremos información sobre usted leyendo su documento de identidad expedido por el estado. + hybrid_handoff_ipp_html: ¿No tiene celular? Como alternativa, + puede verificar su identidad en una oficina de correos de Estados + Unidos. image_loaded: Imagen cargada image_loading: Cargando la imagen image_updated: Imagen actualizada @@ -280,21 +283,20 @@ es: upload_from_phone: No tendrá que volver a iniciar sesión y volverá a cambiar a esta computadora después de tomar las fotos. Su teléfono móvil debe tener una cámara y un navegador web. - verify_at_post_office_description: Esta opción es mejor si no tiene un - dispositivo móvil o una manera fácil de tomar fotografías de su - identificación. + verify_at_post_office_description: Esta opción es mejor si no tiene un teléfono + para tomar fotografías de su identificación. verify_at_post_office_instruction: Ingresará su información de identificación en - línea y verificará tu identidad en persona en una oficina de correos + línea y verificará su identidad en persona en una oficina de correos participante. verify_at_post_office_link_text: Obtenga más información sobre la verificación en persona verify_identity: Le pediremos su identificación, número de teléfono y otros datos personales para verificar su identidad comparándola con los registros públicos. - verify_online_description: La mayoría de los usuarios finalizan este proceso de - una sola vez. Esta opción es mejor si tiene un dispositivo móvil o una - forma de tomar fotografías de su identificación. - verify_online_instruction: Tomará fotografías de tu identificación para - verificar tu identidad completamente en línea. + verify_online_description: Esta opción es mejor si tiene un teléfono para tomar + fotografías de su identificación. + verify_online_instruction: Tomará fotografías de su identificación para + verificar su identidad completamente en línea. La mayoría de los + usuarios finalizan este proceso de una sola vez. verify_online_link_text: Obtenga más información sobre la verificación en línea you_entered: 'Ud. entregó:' instructions: @@ -333,7 +335,6 @@ es: document_capture_selfie_text1: Mantenga el dispositivo al mismo nivel que los ojos document_capture_selfie_text2: Asegúrate de que tu rostro completo sea visible document_capture_selfie_text3: Tómese la foto en un sitio con buena iluminación - most_common: Más común review_issues_id_header_text: 'Revise las imágenes de su documento de identidad expedido por el estado:' review_issues_id_text1: '¿Ha usado un fondo oscuro?' diff --git a/config/locales/doc_auth/fr.yml b/config/locales/doc_auth/fr.yml index 59def98d035..30b9e236d0c 100644 --- a/config/locales/doc_auth/fr.yml +++ b/config/locales/doc_auth/fr.yml @@ -218,9 +218,9 @@ fr: text_message: Nous avons envoyé un message à votre téléphone upload_from_computer: Continuer sur cet ordinateur upload_from_phone: Utilisez votre téléphone pour prendre des photos - verify_at_post_office: Confirmez votre identité un bureau de poste + verify_at_post_office: Vérifiez votre identité un bureau de poste verify_identity: Vérifier votre identité - verify_online: Confirmez votre identité en ligne + verify_online: Vérifiez votre identité en ligne welcome: Vérifions votre identité pour %{sp_name} hybrid_flow_warning: explanation_html: Vous utilisez %{app_name} pour vérifier votre @@ -248,11 +248,14 @@ fr: getting_started_html: '%{sp_name} doit s’assurer que vous êtes bien vous, et non quelqu’un qui se fait passer pour vous. %{link_html}' getting_started_learn_more: Pour plus d’informations sur la vérification de votre identité - how_to_verify: Vous avez la possibilité de confirmer votre identité en ligne ou + how_to_verify: Vous avez la possibilité de vérifier votre identité en ligne ou en personne dans un bureau de poste participant. how_to_verify_troubleshooting_options_header: Vous voulez en savoir plus sur la façon de vérifier votre identité? hybrid_handoff: Nous recueillons des informations sur vous en lisant votre carte d’identité délivrée par l’État. + hybrid_handoff_ipp_html: Vous n’avez pas de téléphone + cellulaire? Vous pouvez vérifier votre identité dans un bureau + de poste américain. image_loaded: Image chargée image_loading: Chargement de l’image image_updated: Image mise à jour @@ -292,9 +295,8 @@ fr: upload_from_phone: Vous n’aurez pas à vous reconnecter. Vous reviendrez sur cet ordinateur après avoir pris des photos. Votre téléphone portable doit être équipé d’un appareil photo et d’un navigateur web. - verify_at_post_office_description: Cette option est préférable si vous ne - disposez pas d’un appareil mobile ou d’un moyen facile de prendre des - photos de votre pièce d’identité. + verify_at_post_office_description: Cette option est préférable si vous n’avez + pas de téléphone pour prendre des photos de votre pièce d’identité. verify_at_post_office_instruction: Vous saisissez vos données d’identification en ligne et confirmez votre identité en personne dans un bureau de poste participant. @@ -302,12 +304,11 @@ fr: verify_identity: Nous vous demanderons votre pièce d’identité, numéro de téléphone et d’autres renseignements personnels afin de confirmer votre identité par rapport aux registres publics. - verify_online_description: La plupart des utilisateurs terminent ce processus en - une seule fois. Cette option est préférable si vous disposez d’un - appareil mobile ou d’un moyen de prendre des photos de votre pièce - d’identité. + verify_online_description: Cette option est préférable si vous disposez d’un + téléphone pour prendre des photos de votre pièce d’identité. verify_online_instruction: Vous prendrez des photos de votre pièce d’identité - pour confirmer votre identité entièrement en ligne. + pour confirmer votre identité entièrement en ligne. La plupart des + utilisateurs terminent ce processus en une seule fois. verify_online_link_text: En savoir plus sur la confirmation en ligne you_entered: 'Tu as soumis:' instructions: @@ -346,7 +347,6 @@ fr: document_capture_selfie_text1: Tenez votre appareil à hauteur des yeux document_capture_selfie_text2: Veillez à ce que l’ensemble de votre visage soit visible document_capture_selfie_text3: Prenez votre photo dans un endroit bien éclairé - most_common: Le plus commun review_issues_id_header_text: 'Examinez les images de votre carte d’identité délivrée par l’État:' review_issues_id_text1: Avez-vous utilisé un fond sombre? review_issues_id_text2: Avez-vous pris la photo sur une surface plane? diff --git a/config/locales/errors/en.yml b/config/locales/errors/en.yml index 7fae8fb0483..711e2a1f6a5 100644 --- a/config/locales/errors/en.yml +++ b/config/locales/errors/en.yml @@ -25,7 +25,7 @@ en: consent_form: Before you can continue, you must give us permission. Please check the box below and then click continue. doc_type_not_supported_heading: We only accept a driver’s license or a state ID - document_capture_cancelled: You have cancelled uploading photos of your ID on your phone. + document_capture_canceled: You have canceled uploading photos of your ID on your phone. how_to_verify_form: Select a way to verify your identity. phone_step_incomplete: You must go to your phone and upload photos of your ID before continuing. We sent you a link with instructions. @@ -53,7 +53,7 @@ en: already_confirmed: was already confirmed, please try signing in blank: Please fill in this field. blank_cert_element_req: We cannot detect a certificate in your request. - confirmation_code_incorrect: Incorrect verification code. Did you type it in correctly? + confirmation_code_incorrect: Incorrect verification code confirmation_invalid_token: Invalid confirmation link. Either the link expired or you already confirmed your account. confirmation_period_expired: Expired confirmation link. You can click “Resend diff --git a/config/locales/errors/es.yml b/config/locales/errors/es.yml index 913873d3cd4..bd5943484ca 100644 --- a/config/locales/errors/es.yml +++ b/config/locales/errors/es.yml @@ -27,7 +27,7 @@ es: continuación y luego haga clic en continuar. doc_type_not_supported_heading: Solo aceptamos una licencia de conducir o un documento de identidad estatal - document_capture_cancelled: Ha cancelado la carga de fotos de su identificación en este teléfono. + document_capture_canceled: Ha cancelado la carga de fotos de su identificación en este teléfono. how_to_verify_form: Seleccione una forma de verificar su identidad. phone_step_incomplete: Debe ir a su teléfono y cargar fotos de su identificación antes de continuar. Te enviamos un enlace con instrucciones. @@ -57,7 +57,7 @@ es: already_confirmed: ya estaba confirmado, por favor intente iniciar una sesión blank: Por favor, rellenar este campo. blank_cert_element_req: No podemos detectar un certificado en su solicitud. - confirmation_code_incorrect: Código de verificación incorrecto. ¿Lo escribió correctamente? + confirmation_code_incorrect: Código de verificación incorrecto confirmation_invalid_token: El enlace de confirmación no es válido. El enlace expiró o usted ya ha confirmado su cuenta. confirmation_period_expired: El enlace de confirmación expiró. Puede hacer clic diff --git a/config/locales/errors/fr.yml b/config/locales/errors/fr.yml index bc1400b2b4d..570122627c4 100644 --- a/config/locales/errors/fr.yml +++ b/config/locales/errors/fr.yml @@ -29,7 +29,7 @@ fr: Veuillez cocher la case ci-dessous puis cliquez sur continuer. doc_type_not_supported_heading: Nous n’acceptons que les permis de conduire ou les cartes d’identité délivrées par l’État - document_capture_cancelled: Vous avez annulé le téléchargement de vos photos + document_capture_canceled: Vous avez annulé le téléchargement de vos photos d’identité sur votre téléphone. how_to_verify_form: Sélectionnez un moyen de vérifier votre identité. phone_step_incomplete: Vous devez aller sur votre téléphone et télécharger des @@ -63,7 +63,7 @@ fr: already_confirmed: a déjà été confirmé, veuillez essayer de vous connecter blank: Veuillez remplir ce champ. blank_cert_element_req: Nous ne pouvons pas détecter un certificat sur votre demande. - confirmation_code_incorrect: Code de vérification incorrect. L’avez-vous saisi correctement ? + confirmation_code_incorrect: Code de vérification incorrect confirmation_invalid_token: Lien de confirmation non valide. Le lien est expiré ou vous avez déjà confirmé votre compte. confirmation_period_expired: Lien de confirmation expiré. Vous pouvez cliquer diff --git a/config/locales/forms/en.yml b/config/locales/forms/en.yml index beb0fdfa66a..0091389d2b2 100644 --- a/config/locales/forms/en.yml +++ b/config/locales/forms/en.yml @@ -31,6 +31,8 @@ en: cancel: Yes, cancel confirm: Confirm continue: Continue + continue_ipp: Continue in person + continue_remote: Continue online delete: Delete disable: Delete edit: Edit diff --git a/config/locales/forms/es.yml b/config/locales/forms/es.yml index 333146dd940..95c932fb8f6 100644 --- a/config/locales/forms/es.yml +++ b/config/locales/forms/es.yml @@ -34,6 +34,8 @@ es: cancel: Sí, cancelar confirm: Confirmar continue: Continuar + continue_ipp: Continúe en persona + continue_remote: Continúe en línea delete: Borrar disable: Borrar edit: Editar diff --git a/config/locales/forms/fr.yml b/config/locales/forms/fr.yml index 3718919c48c..08a3c3d74ce 100644 --- a/config/locales/forms/fr.yml +++ b/config/locales/forms/fr.yml @@ -35,6 +35,8 @@ fr: cancel: Oui, annuler confirm: Confirmer continue: Continuer + continue_ipp: Continuer en personne + continue_remote: Continuer en ligne delete: Effacer disable: Effacer edit: Modifier diff --git a/config/locales/idv/en.yml b/config/locales/idv/en.yml index 543a20bf3b1..94eed1b0f34 100644 --- a/config/locales/idv/en.yml +++ b/config/locales/idv/en.yml @@ -43,7 +43,7 @@ en: start_over: If you start over, you will restart this process from the beginning. headings: confirmation: - hybrid: You have cancelled uploading photos of your ID on this phone + hybrid: You have canceled uploading photos of your ID on this phone exit: with_sp: Exit %{app_name} and return to %{sp_name} without_sp: Exit identity verification and go to your account page diff --git a/config/locales/telephony/en.yml b/config/locales/telephony/en.yml index b6a9a6e0808..2b5517c100b 100644 --- a/config/locales/telephony/en.yml +++ b/config/locales/telephony/en.yml @@ -2,7 +2,7 @@ en: telephony: account_deleted_notice: This text message confirms you have deleted your %{app_name} account. - account_reset_cancellation_notice: Your request to delete your %{app_name} account has been cancelled. + account_reset_cancellation_notice: Your request to delete your %{app_name} account has been canceled. account_reset_notice: As requested, your %{app_name} account will be deleted in %{interval}. Don't want to delete your account? Sign in to your %{app_name} account to cancel. diff --git a/config/locales/titles/en.yml b/config/locales/titles/en.yml index 1a58bbca528..1cb3c13fa70 100644 --- a/config/locales/titles/en.yml +++ b/config/locales/titles/en.yml @@ -31,8 +31,8 @@ en: phone_verification: Phone number not verified forget_all_browsers: Forget all browsers idv: + canceled: Identity verification is canceled cancellation_prompt: Cancel identity verification - cancelled: Identity verification is cancelled come_back_soon: Come back soon enter_one_time_code: Enter your one-time code enter_password: Re-enter your password diff --git a/config/locales/titles/es.yml b/config/locales/titles/es.yml index 6d2268a9d0c..d2db4d2eebc 100644 --- a/config/locales/titles/es.yml +++ b/config/locales/titles/es.yml @@ -31,8 +31,8 @@ es: phone_verification: Número telefónico no verificado forget_all_browsers: Olvídate de todos los navegadores idv: + canceled: Se canceló la verificación de identidad cancellation_prompt: Cancela la verificación de identidad - cancelled: Se canceló la verificación de identidad come_back_soon: Vuelve pronto enter_one_time_code: Introduzca su código único enter_password: Vuelve a ingresar tu contraseña diff --git a/config/locales/titles/fr.yml b/config/locales/titles/fr.yml index c79bac9bf3b..3af1c90e41d 100644 --- a/config/locales/titles/fr.yml +++ b/config/locales/titles/fr.yml @@ -31,8 +31,8 @@ fr: phone_verification: Numéro de téléphone non vérifié forget_all_browsers: Oubliez tous les navigateurs idv: + canceled: La vérification d’identité est annulée cancellation_prompt: Annulez la vérification d’identité - cancelled: La vérification d’identité est annulée come_back_soon: Revenez bientôt enter_one_time_code: Entrez votre code à usage unique enter_password: Saisissez à nouveau votre mot de passe diff --git a/config/locales/two_factor_authentication/en.yml b/config/locales/two_factor_authentication/en.yml index 98e96e49019..674be3a1555 100644 --- a/config/locales/two_factor_authentication/en.yml +++ b/config/locales/two_factor_authentication/en.yml @@ -14,7 +14,7 @@ en: %{interval} from the time you made the request to complete the process. Please check back later. successful_cancel: Thank you. Your request to delete your %{app_name} account - has been cancelled. + has been canceled. text_html: If you can’t use any of the authentication methods above, you can reset your preferences by %{link_html}. attempt_remaining_warning_html: diff --git a/config/locales/user_mailer/en.yml b/config/locales/user_mailer/en.yml index 430d6552c71..d2cf1b14368 100644 --- a/config/locales/user_mailer/en.yml +++ b/config/locales/user_mailer/en.yml @@ -10,7 +10,7 @@ en: agency whose service you are trying to access. subject: We couldn’t verify your identity account_reset_cancel: - intro_html: This email confirms you have cancelled your request to delete your + intro_html: This email confirms you have canceled your request to delete your %{app_name_html} account. subject: Request canceled account_reset_complete: @@ -20,8 +20,8 @@ en: button: Yes, continue deleting cancel_link_text: please cancel help_html: If you don’t want to delete your account, %{cancel_account_reset_html}. - intro_html: Your %{hours} hour waiting period has ended. Please complete step 2 - of the process.

If you’ve been unable to locate your + intro_html: Your waiting period of %{waiting_period} has ended. Please complete + step 2 of the process.

If you’ve been unable to locate your authentication methods, select “confirm deletion” to delete your %{app_name} account.

In the future, if you need to access participating government websites who use %{app_name}, you can create a @@ -33,13 +33,14 @@ en: to cancel. header: Your account will be deleted in %{interval} intro_html: 'As a security measure, %{app_name} requires a two-step process to - delete your account:

Step One: There is a %{hours} hour waiting - period if you have lost access to your authentication methods and need - to delete your account. If you locate your authentication methods, you - can sign in to your %{app_name} account to cancel this request.

- Step Two: After your %{hours} hour waiting period, you will receive an - email that will ask you to confirm the deletion of your %{app_name} - account. Your account will not be deleted until you confirm.' + delete your account:

Step One: There is a waiting period of + %{waiting_period} if you have lost access to your authentication methods + and need to delete your account. If you locate your authentication + methods, you can sign in to your %{app_name} account to cancel this + request.

Step Two: After the waiting period of + %{waiting_period}, you will receive an email that will ask you to + confirm the deletion of your %{app_name} account. Your account will not + be deleted until you confirm.' subject: How to delete your %{app_name} account account_verified: change_password_link: change your password diff --git a/config/locales/user_mailer/es.yml b/config/locales/user_mailer/es.yml index e71f33c9287..b7c372edafb 100644 --- a/config/locales/user_mailer/es.yml +++ b/config/locales/user_mailer/es.yml @@ -22,8 +22,8 @@ es: button: Sí, continúa eliminando cancel_link_text: por favor cancele help_html: Si no desea eliminar su cuenta, %{cancel_account_reset_html}. - intro_html: Su período de espera de %{hours} horas ha finalizado. Complete el - paso 2 del proceso.

Si no ha podido localizar sus métodos de + intro_html: Su período de espera de %{waiting_period} finalizó. Complete el paso + 2 del proceso.

Si no ha podido localizar sus métodos de autenticación, seleccione “confirmar eliminación” para eliminar su cuenta de %{app_name}.

En el futuro, si necesita acceder a los sitios web gubernamentales participantes que utilizan %{app_name}, puede @@ -35,14 +35,14 @@ es: para cancelar.' header: Su cuenta será eliminada en %{interval} intro_html: 'Como medida de seguridad, %{app_name} requiere un proceso de dos - pasos para eliminar su cuenta:

Paso uno: hay un período de - espera de %{hours} horas si ha perdido el acceso a sus métodos de + pasos para eliminar su cuenta:

Paso uno: Hay un período de + espera de %{waiting_period} si perdió el acceso a sus métodos de autenticación y necesita eliminar su cuenta. Si encuentra sus métodos de autenticación, puede iniciar sesión en su cuenta %{app_name} para - cancelar esta solicitud.

Paso dos: Después de su período de - espera de %{hours} horas, recibirá un correo electrónico que le pedirá - que confirme la eliminación de su cuenta %{app_name}. Su cuenta no se - eliminará hasta que confirme.' + cancelar esta solicitud.

Paso dos: Tras el período de espera de + %{waiting_period}, recibirás un correo electrónico en el que te + pediremos que confirmes la eliminación de tu cuenta %{app_name}. Tu + cuenta no se eliminará hasta que lo confirmes.' subject: Cómo eliminar su cuenta de %{app_name} account_verified: change_password_link: cambiar tu contraseña diff --git a/config/locales/user_mailer/fr.yml b/config/locales/user_mailer/fr.yml index cf220fa3213..b52f7806e2d 100644 --- a/config/locales/user_mailer/fr.yml +++ b/config/locales/user_mailer/fr.yml @@ -22,7 +22,7 @@ fr: cancel_link_text: veuillez annuler help_html: Si vous ne souhaitez pas supprimer votre compte, %{cancel_account_reset_html}. - intro_html: Votre période d’attente de %{hours} heures est terminée. Veuillez + intro_html: Votre délai d’attente de %{waiting_period} est terminé. Veuillez terminer l’étape 2 du processus.

Si vous ne parvenez pas à localiser vos méthodes d’authentification, sélectionnez “confirmer la suppression” pour supprimer votre compte %{app_name}.

À @@ -36,15 +36,14 @@ fr: %{app_name} pour annuler. header: Votre compte sera supprimé dans %{interval} intro_html: 'Par mesure de sécurité, %{app_name} nécessite un processus en deux - étapes pour supprimer votre compte:

Étape 1: Il y a une - période d’attente de %{hours} heures si vous avez perdu l’accès à vos - méthodes d’authentification et devez supprimer votre compte. Si vous - trouvez vos méthodes d’authentification, vous pouvez vous connecter à - votre compte %{app_name} pour annuler cette demande.

Deuxième - étape: après votre période d’attente de %{hours} heures, vous recevrez - un e-mail qui vous demandera de confirmer la suppression de votre compte - %{app_name}. Votre compte ne sera pas supprimé tant que vous ne l’aurez - pas confirmé.' + étapes pour supprimer votre compte:

Étape 1: Il y a un delai + d’attente de %{waiting_period} si vous avez perdu l’accès à vos méthodes + d’authentification et devez supprimer votre compte. Si vous trouvez vos + méthodes d’authentification, vous pouvez vous connecter à votre compte + %{app_name} pour annuler cette demande.

Deuxième étape: après + la période d’attente de %{waiting_period}, vous recevrez un e-mail qui + vous demandera de confirmer la suppression de votre compte %{app_name}. + Votre compte ne sera pas supprimé tant que vous n’aurez pas confirmé.' subject: Comment supprimer votre compte %{app_name} account_verified: change_password_link: changer votre mot de passe diff --git a/db/primary_migrate/20240326181600_add_piv_cac_recommended_dismissed_at_to_user.rb b/db/primary_migrate/20240326181600_add_piv_cac_recommended_dismissed_at_to_user.rb new file mode 100644 index 00000000000..3bba84069ec --- /dev/null +++ b/db/primary_migrate/20240326181600_add_piv_cac_recommended_dismissed_at_to_user.rb @@ -0,0 +1,5 @@ +class AddPivCacRecommendedDismissedAtToUser < ActiveRecord::Migration[7.1] + def change + add_column :users, :piv_cac_recommended_dismissed_at, :datetime, default: nil + end +end diff --git a/db/schema.rb b/db/schema.rb index 4c3a718d4d5..bf030067ebe 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_02_16_184124) do +ActiveRecord::Schema[7.1].define(version: 2024_03_26_181600) do # These are extensions that must be enabled in order to support this database enable_extension "citext" enable_extension "pg_stat_statements" @@ -612,6 +612,7 @@ t.string "encrypted_password_digest_multi_region" t.string "encrypted_recovery_code_digest_multi_region" t.datetime "second_mfa_reminder_dismissed_at" + t.datetime "piv_cac_recommended_dismissed_at" t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true t.index ["uuid"], name: "index_users_on_uuid", unique: true end diff --git a/docs/sdk-upgrade.md b/docs/sdk-upgrade.md index e484e91f3fa..ab3caef8f31 100644 --- a/docs/sdk-upgrade.md +++ b/docs/sdk-upgrade.md @@ -43,8 +43,31 @@ Steps: ![acuant-version-location](https://user-images.githubusercontent.com/546123/232644328-35922329-ad30-489e-943f-4125c009f74d.png) - -7. Assuming the version is correct, you are ready to test it. On your phone, tap to photograph your state ID card. Point the camera at the card. Ensure the SDK finds the edges of the card and captures an image. Normally the SDK will put a yellowish box over the card to show where it believes the edges are. +7. Assuming the version is correct and you have it set in your `application.yml`, you are ready to test it. + + 1. See below for a sample chart of what you might want to test. +
+ + | device | chrome | firefox | safari | manual capture | sdk capture | upload | + |---------|--------|---------|--------|----------------|-------------|--------| + | ios | | | | | | | + | android | | N/A | N/A | | | | + + 1. Look at the [Testing Considerations](#testing-considerations) for other ideas on what you might want to test. + 1. Here is a sample plan: + - For each combination of devices and browsers above: + 1. Set `doc_auth_selfie_capture_enabled: true` in your `application.yml` + 1. Locally go to `/test/oidc/login` and choose `biometrics` + 1. First test document capture + 1. On your phone, tap to photograph your state ID card + 1. Point the camera at the card + 1. Ensure the SDK finds the edges of the card and captures an image. Normally the SDK will put a yellowish box over the card to show where it believes the edges are + 1. Then test selfie capture. Make sure you see: + 1. an outline for the face + 1. hint text when your face is not aligned (like - "Too close to the frame" and "Face not found") + 1. make sure you're able to take a picture of yourself that is then saved and displayed on the `verify/document_capture` page + 1. Follow through until your identity is verified + 1. Go to the next device / browser combination 8. After you have photographed the front and back of your card, you have tested the SDK locally. You do not need to submit the images. If you have both an Android and an iPhone, test the SDK with both of them. (Or, pair with someone who has the other type of phone.) @@ -133,6 +156,11 @@ Browser: * Firefox * Safari +Capture methods: + * SDK + * Upload + * Native camera capture + ## Monitor A/B testing Per the handbook, above, you should monitor the server instances as they come online and manually verify image capture still works. diff --git a/lib/aws/ses.rb b/lib/aws/ses.rb index f19655fedad..c69b253edee 100644 --- a/lib/aws/ses.rb +++ b/lib/aws/ses.rb @@ -4,8 +4,6 @@ module Aws module SES class Base - cattr_accessor :region_pool - def initialize(*); end def deliver(mail) diff --git a/lib/identity_config.rb b/lib/identity_config.rb index 45029c9bd20..40436cf5024 100644 --- a/lib/identity_config.rb +++ b/lib/identity_config.rb @@ -108,6 +108,7 @@ def self.build_store(config_map) config.add(:aamva_verification_url) config.add(:account_reset_token_valid_for_days, type: :integer) config.add(:account_reset_wait_period_days, type: :integer) + config.add(:account_reset_fraud_user_wait_period_days, type: :integer, allow_nil: true) config.add(:account_suspended_support_code, type: :string) config.add(:acuant_assure_id_password) config.add(:acuant_assure_id_subscription_id) diff --git a/lib/reporting/drop_off_report.rb b/lib/reporting/drop_off_report.rb index c2240fed43e..34ad179b546 100644 --- a/lib/reporting/drop_off_report.rb +++ b/lib/reporting/drop_off_report.rb @@ -48,18 +48,19 @@ module Events IDV_ENTER_PASSWORD_SUBMITTED = 'idv_enter_password_submitted' OLD_IDV_ENTER_PASSWORD_SUBMITTED = 'IdV: review complete' IDV_PERSONAL_KEY_SUBMITTED = 'IdV: personal key submitted' + IDV_FINAL_RESOLUTION = 'IdV: final resolution' def self.all_events constants.map { |c| const_get(c) } end end + module Results + IDV_FINAL_RESOLUTION_VERIFIED = 'IdV: final resolution - Verified' + end + def as_emailable_reports [ - Reporting::EmailableReport.new( - title: 'Proofing Funnel Definitions', - table: proofing_definition_table, - ), Reporting::EmailableReport.new( title: 'Step Definitions', table: step_definition_table, @@ -215,20 +216,6 @@ def dropoff_metrics_table denominator: idv_started, ), ], - [ - 'USPS letter enqueued (event)', - idv_pending_gpo, - dropoff = idv_enter_password_submitted - - idv_pending_gpo, - percent( - numerator: dropoff, - denominator: idv_enter_password_submitted, - ), - percent( - numerator: idv_pending_gpo, - denominator: idv_started, - ), - ], [ 'Verified (event)', idv_personal_key_submitted, @@ -243,34 +230,21 @@ def dropoff_metrics_table denominator: idv_started, ), ], - ] - end - - # rubocop:disable Layout/LineLength - def proofing_definition_table - [ - ['Term', 'Description', 'Definition', 'Calculated'], - [ - 'Blanket Proofing', - 'Full funnel: People who started proofing from welcome screen, successfully got verified credential and encrypted account', - 'Percentage of users that successfully proofed over the total number of users that began the proofing process', - 'Steps: "Verified" divided by "User agreement"', - ], - [ - 'Actual Proofing', - 'Proofing funnel: People that submit and get verified', - 'Percentage of users who submitted documents, passed instant verify and phone finder', - 'Steps: "Encrypt account: enter password" divided by "Document submitted"', - ], [ - 'Verified Proofing', - 'Proofing + encryption: People that get verified, encypt account and are passed back to Service Provider', - 'Number of users who submitted documents, passed instant verify and phone finder, encrypted account, and sent to consent screen for sharing data with Service Provider', - 'Steps: "Verified" divided by "Document submitted"', + 'Workflow Complete - Total Pending', + idv_final_resolution_total_pending, ], ] end - # rubocop:enable Layout/LineLength + + def idv_final_resolution_total_pending + @idv_final_resolution_total_pending ||= + (data[Events::IDV_FINAL_RESOLUTION] - data[Results::IDV_FINAL_RESOLUTION_VERIFIED]).count + end + + def idv_final_resolution_verified + data[Results::IDV_FINAL_RESOLUTION_VERIFIED].count + end def step_definition_table [ @@ -319,6 +293,10 @@ def step_definition_table 'Verified (event)', 'Users who confirm their personal key and complete setting up their verified account', ], + [ + 'Workflow Complete - Total Pending', + 'Total count of users who are pending IDV', + ], ] end @@ -374,7 +352,6 @@ def idv_pending_gpo def as_tables [ - proofing_definition_table, step_definition_table, overview_table, dropoff_metrics_table, @@ -427,6 +404,14 @@ def data fetch_results.each do |row| event_users[row['name']] << row['user_id'] + + event = row['name'] + case event + when Events::IDV_FINAL_RESOLUTION + if row['identity_verified'] == '1' + event_users[Results::IDV_FINAL_RESOLUTION_VERIFIED] << user_id + end + end end event_users diff --git a/public/acuant/11.9.3/AcuantCamera.min.js b/public/acuant/11.9.3/AcuantCamera.min.js new file mode 100644 index 00000000000..2a0594af164 --- /dev/null +++ b/public/acuant/11.9.3/AcuantCamera.min.js @@ -0,0 +1 @@ +var AcuantCameraUI=function(){"use strict";let e=null,t=null,i=null,a=null,n={start:function(e,i){s=e.onError,i&&(g=i,g.text.hasOwnProperty("BIG_DOCUMENT")||(g.text.BIG_DOCUMENT="TOO CLOSE"));AcuantCamera.isCameraSupported?r||(r=!0,w(),function(e){let i=0,n=(new Date).getTime();a=document.getElementById("acuant-camera"),a&&a.addEventListener("acuantcameracreated",E);AcuantCamera.start((a=>{!function(e,t){if(t>=3)return!0;{let t=(new Date).getTime()-e;return t{y(),e.onCaptured(i),AcuantCamera.evaluateImage(i.data,i.width,i.height,i.isPortraitOrientation,t,(t=>{e.onCropped(t)}))}))}function A(e,t){y(),s&&s(e,t),s=null}function x(){!function a(){e&&!e.paused&&!e.ended&&r&&(!function(){if(i.clearRect(0,0,t.width,t.height),o)if(o.state===h)I("#00ff00"),D("rgba(0, 255, 0, 0.2)"),O(g.text.CAPTURING,.05,"#00ff00",!1);else if(o.state===m)I("#000000"),O(g.text.TAP_TO_CAPTURE);else if(o.state===AcuantCamera.DOCUMENT_STATE.GOOD_DOCUMENT)if(I("#ffff00"),D("rgba(255, 255, 0, 0.2)"),g.text.GOOD_DOCUMENT)O(g.text.GOOD_DOCUMENT,.09,"#ff0000",!1);else{let e=Math.ceil((f-((new Date).getTime()-c))/1e3);e<=0&&(e=1),O(e+"...",.09,"#ff0000",!1)}else o.state===AcuantCamera.DOCUMENT_STATE.SMALL_DOCUMENT?(I("#ff0000"),O(g.text.SMALL_DOCUMENT)):o.state===AcuantCamera.DOCUMENT_STATE.BIG_DOCUMENT?(I("#ff0000"),O(g.text.BIG_DOCUMENT)):(I("#000000"),O(g.text.NONE));else I("#000000"),O(g.text.NONE)}(),u=setTimeout(a,100))}()}function O(e,t=.04,a="#ffffff",n=!0){let r=k(),o=window.orientation,c=i.measureText(e),d=.01*Math.max(r.width,r.height),s=.02*Math.max(r.width,r.height),l=(r.height-s-c.width)/2,u=-(r.width/2-d),h=90;0!==o&&(h=0,l=(r.width-d-c.width)/2,u=r.height/2-s+.04*Math.max(r.width,r.height)),i.rotate(h*Math.PI/180),n&&(i.fillStyle="rgba(0, 0, 0, 0.5)",i.fillRect(Math.round(l-d),Math.round(u+d),Math.round(c.width+s),-Math.round(.05*Math.max(r.width,r.height)))),i.font=(Math.ceil(Math.max(r.width,r.height)*t)||0)+"px Sans-serif",i.fillStyle=a,i.fillText(e,l,u),S(e),i.rotate(-h*Math.PI/180)}const S=e=>{d||(d=document.createElement("p"),d.id="doc-state-text",d.style.height="1px",d.style.width="1px",d.style.margin="-1px",d.style.overflow="hidden",d.style.position="absolute",d.style.whiteSpace="nowrap",d.setAttribute("role","alert"),d.setAttribute("aria-live","assertive"),t.parentNode.insertBefore(d,t)),d.innerHTML!=e&&(d.innerHTML=e)};function k(){return{height:t.height,width:t.width}}function M(e,t){let a=window.orientation,n=k(),r=.08*n.width,o=.07*n.height;switch(0!==a&&(r=.07*n.width,o=.08*n.height),t.toString()){case"1":r=-r;break;case"2":r=-r,o=-o;break;case"3":o=-o}!function(e,t,a){i.beginPath();const n=Math.round(e.x),r=Math.round(e.y);i.moveTo(n,r),i.lineTo(Math.round(n+t),r),i.moveTo(n,r),i.lineTo(n,Math.round(r+a)),i.stroke()}(e,r,o)}function D(e){if(o&&o.points&&4===o.points.length){i.beginPath(),i.moveTo(Math.round(o.points[0].x),Math.round(o.points[0].y));for(let e=1;et.height?(a=.85*t.width,n=.85*t.width/1.5887,n>.85*t.height&&(a=a/n*.85*t.height,n=.85*t.height)):(a=.85*t.height/1.5887,n=.85*t.height,a>.85*t.width&&(n=n/a*.85*t.width,a=.85*t.width)),e=a/2,i=n/2,[{x:r.x-e,y:r.y-i},{x:r.x+e,y:r.y-i},{x:r.x+e,y:r.y+i},{x:r.x-e,y:r.y+i}].forEach(((e,t)=>{M(e,t)}))}}return n}(),AcuantCamera=(()=>{"use strict";let e=null,t=null,i=null,a=null,n=null,r=null;const o={NO_DOCUMENT:0,SMALL_DOCUMENT:1,BIG_DOCUMENT:2,GOOD_DOCUMENT:3},c={NONE:0,ID:1,PASSPORT:2},d=700,s=1920;let l,u,h=null,m=null,g=null,f=!1,p=!1,v=null,w={start:S,startManualCapture:k,triggerCapture:function(t){let i,a;try{if(0==e.videoWidth)throw"width 0";n.width=e.videoWidth,n.height=e.videoHeight,r.drawImage(e,0,0,n.width,n.height),i=r.getImageData(0,0,n.width,n.height),r.clearRect(0,0,n.width,n.height),a=window.matchMedia("(orientation: portrait)").matches}catch(e){return void ie()}t({data:i,width:n.width,height:n.height,isPortraitOrientation:a})},end:W,DOCUMENT_STATE:o,ACUANT_DOCUMENT_TYPE:c,isCameraSupported:"mediaDevices"in navigator&&function(){let e=!1;return function(t){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|playbook|silk/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4)))&&(e=!0)}(navigator.userAgent||navigator.vendor||window.opera),(e||C())&&!y()}(),isIOSWebview:function(){const e=window.navigator.standalone,t=window.navigator.userAgent.toLowerCase(),i=/safari/.test(t);return/iphone|ipod|ipad/.test(t)&&!i&&!e}(),isIOS:C,setRepeatFrameProcessor:Z,evaluateImage:G};function y(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function C(){return/iPad|iPhone|iPod/.test(navigator.platform)&&_()[0]>=13||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1}function b(){let e;e=u||navigator.userAgent;const t=e.match(/SM-[N|G|S]\d{3}/);if(!t)return!1;const i=parseInt(t[0].match(/\d{3}/)[0],10),a=e.match(/SM-S\d{3}/)?900:970;return!isNaN(i)&&i>=a}const E=function(){let e={frameScale:1,primaryConstraints:{video:{facingMode:{exact:"environment"},aspectRatio:4/3,resizeMode:"none"}},fixedHeight:null,fixedWidth:null};C()?L()?(e.primaryConstraints.video.aspectRatio=1*Math.max(window.innerWidth,window.innerHeight)/Math.min(window.innerWidth,window.innerHeight),e.primaryConstraints.video.height={min:1440,ideal:2880}):N()?e.primaryConstraints.video.width={min:s,ideal:s}:e.primaryConstraints.video.height={min:1440,ideal:1440}:e.primaryConstraints.video.height={min:1440,ideal:1440};return e}();function T(t){j().then((()=>{f=!0,e.srcObject=t,function(){b()&&document.addEventListener("visibilitychange",z);window.addEventListener("resize",R),e&&(e.addEventListener("play",J),e.addEventListener("loadedmetadata",F))}(),e.play()}))}function A(e,t){document.cookie="AcuantCameraHasFailed="+t,W(),m&&"function"==typeof m?m(e,t):(console.error("No error callback set. Review implementation."),console.error(e,t))}function x(){return new Promise((e=>{navigator.mediaDevices.enumerateDevices().then((t=>{const i={suffix:void 0,device:void 0},a=t.find((e=>"Back Dual Wide Camera"===e.label));(function(){let e=_();return e&&-1!=e&&e.length>=1&&16==e[0]&&e[1]>=4})()&&a?i.device=a:t.filter((e=>"videoinput"===e.kind)).forEach((e=>{if(t=e.label,["rear","back","rück","arrière","trasera","trás","traseira","posteriore","后面","後面","背面","задней","الخلفية","후","arka","achterzijde","หลัง","baksidan","bagside","sau","bak","tylny","takakamera","belakang","אחורית","πίσω","spate","hátsó","zadní","darrere","zadná","задня","stražnja","belakang","बैक"].some((e=>t.includes(e)))){let t=e.label.split(","),a=parseInt(t[0][t[0].length-1]);(a||0===a)&&(void 0===i.suffix||i.suffix>a)&&(i.suffix=a,i.device=e)}var t})),e(i.device)})).catch((()=>{e()}))}))}function O(e,t=0){0===t&&l.dispatchEvent(new Event("acuantcameracreated"));const i=Boolean(e.video.deviceId);navigator.mediaDevices.getUserMedia(e).then((e=>{!i&&t<2?x().then((i=>{i&&i.deviceId!==e.getVideoTracks()[0].getSettings().deviceId?(E.primaryConstraints.video.deviceId=i.deviceId,U(e),O(E.primaryConstraints,t++)):T(e)})):T(e)})).catch((e=>{A(e,AcuantJavascriptWebSdk.START_FAIL_CODE)}))}function S(a,o,c){if(c&&(m=c),function(){let e="AcuantCameraHasFailed=";return decodeURIComponent(document.cookie).includes(e)}())return c("Live capture has previously failed and was called again. User was sent to manual capture.",AcuantJavascriptWebSdk.REPEAT_FAIL_CODE),void k(o);l=document.getElementById("acuant-camera"),l?(l.style.position="relative",l.innerHTML='',e=document.getElementById("acuant-player"),n=document.createElement("canvas"),r=n.getContext("2d",{willReadFrequently:!C()}),t=document.getElementById("acuant-ui-canvas"),f?A("already started.",AcuantJavascriptWebSdk.START_FAIL_CODE):e&&t?(i=t.getContext("2d"),a&&(h=a),navigator.userAgentData&&navigator.userAgentData.getHighEntropyValues?navigator.userAgentData.getHighEntropyValues(["model"]).then((e=>{"string"==typeof e?u=e:"string"==typeof e.model&&(u=e.model)})).finally((()=>{b()?E.primaryConstraints.video.zoom=2:P()&&(E.primaryConstraints.video.zoom=1.6),O(E.primaryConstraints)})):(b()?E.primaryConstraints.video.zoom=2:P()&&(E.primaryConstraints.video.zoom=1.6),O(E.primaryConstraints))):A("Missing HTML elements.",AcuantJavascriptWebSdk.START_FAIL_CODE)):A("Expected div with 'acuant-camera' id",AcuantJavascriptWebSdk.START_FAIL_CODE)}function k(e){g=e,a||(a=document.createElement("input"),a.type="file",a.capture="environment",a.accept="image/*",a.onclick=function(e){e&&e.target&&(e.target.value="")}),a.onchange=D,a.click()}let M=-1;function D(e){n=document.createElement("canvas"),r=n.getContext("2d"),r.mozImageSmoothingEnabled=!1,r.webkitImageSmoothingEnabled=!1,r.msImageSmoothingEnabled=!1,r.imageSmoothingEnabled=!1;let t=e.target,i=new FileReader;const a=e.target.files[0]&&e.target.files[0].name&&e.target.files[0].name.toLowerCase().endsWith(".heic");i.onload=a?e=>{var t;(t=e.target.result,new Promise(((e,i)=>{const a=window["magick-wasm"];a?a.initializeImageMagick().then((()=>{a.ImageMagick.read(new Uint8Array(t),(t=>{const{width:i,height:a}=I(t.width,t.height);n.width=i,n.height=a,t.resize(i,a),t.writeToCanvas(n);const o=r.getImageData(0,0,i,a);e({data:o,width:i,height:a})}))})):i({error:"HEIC image processing failed. Please make sure Image Magick scripts were integrated as expected.",code:AcuantJavascriptWebSdk.HEIC_NOT_SUPPORTED_CODE})}))).then((e=>{M=6,g.onCaptured(e),G(e.data,e.width,e.height,!1,"MANUAL",g.onCropped)})).catch((e=>g.onError(e.error,e.code)))}:e=>{M=function(e){const t=new DataView(e.target.result);if(65496!=t.getUint16(0,!1))return-2;const i=t.byteLength;let a=2;for(;a{const{width:e,height:i}=I(t.width,t.height);n.width=e,n.height=i,r.drawImage(t,0,0,e,i);const a=r.getImageData(0,0,e,i);r.clearRect(0,0,e,i),t.remove(),g.onCaptured({data:a,width:e,height:i}),G(a,e,i,!1,"MANUAL",g.onCropped)},t.src="data:image/jpeg;base64,"+ae(e.target.result)},t&&t.files[0]&&i.readAsArrayBuffer(t.files[0])}function I(e,t){let i=2560,a=1920;N()&&(i=s,a=Math.floor(1440));if((e>t?e:t)>i)if(e{e.stop()}))}function W(){f=!1,p=!1,M=-1,v&&(clearTimeout(v),v=null),function(){b()&&document.removeEventListener("visibilitychange",z);window.removeEventListener("resize",R),e&&(e.removeEventListener("play",J),e.removeEventListener("loadedmetadata",F))}(),e&&(e.pause(),e.srcObject&&U(e.srcObject),e=null),l&&(l.innerHTML=""),a&&(a.remove(),a=null)}function _(){if(/iP(hone|od|ad)/.test(navigator.platform))try{const e=navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);return[parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3]||0,10)]}catch(e){return-1}return-1}function N(){let e=_();return e&&-1!=e&&e.length>=1&&15==e[0]}function P(){let e=_();return e&&-1!=e&&e.length>=1&&e[0]>=17}function L(){let e=decodeURIComponent(document.cookie);if(e.includes("AcuantForceRegularCapture=true"))return!1;if(e.includes("AcuantForceDistantCapture=true"))return!0;if(function(){let e=_();return e&&-1!=e&&e.length>=1&&16==e[0]&&e[1]<4}()){let e=[screen.width,screen.height],t=Math.max(...e),i=Math.min(...e);if(852==t&&393==i)return!0;if(932==t&&430==i)return!0;if(844==t&&390==i)return!0;if(926==t&&428==i)return!0}return!1}function R(){i.clearRect(0,0,t.width,t.height),e&&(C()&&(function(){const e=window.navigator.userAgent,t=e.indexOf("WebKit")>-1,i=e.indexOf("CriOS")>-1;return t&&i&&C()}()||function(){let e=_();return e&&-1!=e&&e.length>=2&&14==e[0]&&e[1]>=4}())?(W(),S()):H())}function H(){let i,a;if(e.videoWidthE.fixedHeight&&(E.fixedHeight=l.clientWidth,E.fixedWidth=l.clientHeight),window.matchMedia("(orientation: portrait)").matches){if(E.fixedWidth)E.fixedWidth{AcuantJavascriptWebSdk.startMetricsWorker(e)}));const c=await Q(e,t,i),d=await K(r.image);r={...r,...c,...d},AcuantJavascriptWebSdk.endMetricsWorker();const{imageBase64:s,imageBytes:l}=$(r,a);r.image.bytes=l;const u=await Y(s);r.image.barcodeText=u;const h=await ee(r,a,s);await j();const m=await X(h);return r.image.data=m,V(),r}(e,t,i,n,a).then(r):async function(e,t,i,a,n){let r={isPortraitOrientation:n};const[o,c]=await Promise.all([q(e,t,i),Q(e,t,i)]);if(!o)return null;r={...r,...o};const d=await K(r.image);r={...r,...c,...d};const{imageBase64:s,imageBytes:l}=$(r,a);r.image.bytes=l;const u=await Y(s);r.image.barcodeText=u;const h=await ee(r,a,s),m=await X(h);return r.image.data=m,r}(e,t,i,n,a).then(r)}function j(){return new Promise((e=>{AcuantJavascriptWebSdk.startImageWorker(e)}))}function V(){AcuantJavascriptWebSdk.endImageWorker()}function q(e,t,i){return new Promise((a=>{AcuantJavascriptWebSdk.crop(e,t,i,{onSuccess:({image:e,dpi:t,cardType:i})=>a({image:e,dpi:t,cardType:i}),onFail:a})}))}function Q(e,t,i){return new Promise((a=>{AcuantJavascriptWebSdk.moire(e,t,i,{onSuccess:(e,t)=>a({moire:e,moireraw:t}),onFail:()=>a({moire:-1,moireraw:-1})})}))}function K(e){return new Promise((t=>{AcuantJavascriptWebSdk.metrics(e,e.width,e.height,{onSuccess:(e,i)=>t({sharpness:e,glare:i}),onFail:()=>t({sharpness:-1,glare:-1})})}))}function X(e){return new Promise((t=>{const i=function(e){const t=window.atob(e.split("base64,")[1]),i=t.length,a=new Uint8Array(new ArrayBuffer(i));for(let e=0;et("data:image/jpeg;base64,"+ae(e)),onFail:t})}))}async function Y(e){if(!document.getElementById(AcuantJavascriptWebSdk.BARCODE_READER_ID))return null;try{return await function(e){let t=e.split(","),i=t[0].match(/:(.*?);/)[1],a=atob(t[1]),n=a.length,r=new Uint8Array(n);for(;n--;)r[n]=a.charCodeAt(n);const o=new File([r],"imageFile",{type:i});return new Html5Qrcode(AcuantJavascriptWebSdk.BARCODE_READER_ID,{formatsToSupport:[Html5QrcodeSupportedFormats.PDF_417]}).scanFile(o,!1)}(e)}catch{return null}}function Z(){if(!f||p)return;if(0==e.videoWidth)return void ie();p=!0;let t=Math.max(e.videoWidth,e.videoHeight),i=Math.min(e.videoWidth,e.videoHeight),a=0,s=0;if(t>d&&i>500?e.videoWidth>=e.videoHeight?(E.frameScale=d/e.videoWidth,s=d,a=e.videoHeight*E.frameScale):(E.frameScale=d/e.videoHeight,s=e.videoWidth*E.frameScale,a=d):(E.frameScale=1,s=e.videoWidth,a=e.videoHeight),s==n.width&&a==n.height||(n.width=s,n.height=a),f){let t;try{r.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,n.width,n.height),t=r.getImageData(0,0,n.width,n.height),r.clearRect(0,0,n.width,n.height)}catch(e){return void ie()}!function(t,i,a){AcuantJavascriptWebSdk.detect(t,i,a,{onSuccess:function(t){if(!n||!e||e.paused||e.ended)return;t.points.forEach((t=>{void 0!==t.x&&void 0!==t.y&&(t.x=t.x/E.frameScale*e.width/e.videoWidth,t.y=t.y/E.frameScale*e.height/e.videoHeight)}));const i=Math.min(t.dimensions.width,t.dimensions.height)/Math.min(n.width,n.height),a=Math.max(t.dimensions.width,t.dimensions.height)/Math.max(n.width,n.height),r=2==t.type;let d=.8,s=.85,l=.6,u=.65;r&&(d=.9,s=.95),C()&&(l=.65,u=.7,L()?r?(d=.72,s=.77,l=.22,u=.28):(d=.41,s=.45,l=.22,u=.28):r&&(d=.95,s=1,l=.7,u=.75));const m=!t.isCorrectAspectRatio||i=d||a>=s;t.type===c.NONE?t.state=o.NO_DOCUMENT:t.state=g?o.BIG_DOCUMENT:m?o.SMALL_DOCUMENT:o.GOOD_DOCUMENT,h(t),p=!1},onFail:function(){if(!n||!e||e.paused||e.ended)return;let t={};t.state=o.NO_DOCUMENT,h(t),p=!1}})}(t,n.width,n.height)}}function $({image:e,cardType:t,isPortraitOrientation:i},a){n&&r||(n=document.createElement("canvas"),r=n.getContext("2d")),n.width=e.width,n.height=e.height;let o=r.createImageData(e.width,e.height);!function(e,t){for(let i=0;i{AcuantJavascriptWebSdk.getCvmlVersion({onSuccess:t=>{e(t)},onFail:()=>{e("unknown")}})})),s=JSON.stringify({cvml:{cropping:{iscropped:!0,dpi:e,idsize:2===t?"ID3":"ID1",elapsed:-1},sharpness:{normalized:i,elapsed:-1},moire:{normalized:n,raw:r,elapsed:-1},glare:{normalized:a,elapsed:-1},version:d},device:{version:te(),capturetype:o}});return AcuantJavascriptWebSdk.addMetadata(c,{imageDescription:s,dateTimeOriginal:(new Date).toUTCString()})}function te(){const e=navigator.userAgent;let t,i=e.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];return/trident/i.test(i[1])?(t=/\brv[ :]+(\d+)/g.exec(e)||[],"IE "+(t[1]||"")):"Chrome"===i[1]&&(t=e.match(/\b(OPR|Edge)\/(\d+)/),null!=t)?t.slice(1).join(" ").replace("OPR","Opera"):(i=i[2]?[i[1],i[2]]:[navigator.appName,navigator.appVersion,"-?"],null!=(t=e.match(/version\/(\d+)/i))&&i.splice(1,1,t[1]),i.join(" "))}function ie(){N()||navigator.maxTouchPoints&&navigator.maxTouchPoints>=2&&/MacIntel/.test(navigator.platform)?A("Camera capture failed due to unexpected sequence break. This usually indicates the camera closed or froze unexpectedly. In iOS 15+ this is intermittently occurs due to a GPU Highwater failure. Swap to manual capture until the user fully reloads the browser. Attempting to continue to use live capture can lead to further Highwater errors and can cause to OS to cut off the webpage.",AcuantJavascriptWebSdk.SEQUENCE_BREAK_CODE):A("Camera capture failed due to unexpected sequence break. This usually indicates the camera closed or froze unexpectedly. Swap to manual capture until the user fully reloads the browser.",AcuantJavascriptWebSdk.SEQUENCE_BREAK_CODE)}function ae(e){let t="";const i=new Uint8Array(e),a=i.byteLength;for(let e=0;e=e);)++r;if(16(a=224==(240&a)?(15&a)<<12|o<<6|i:(7&a)<<18|o<<12|i<<6|63&t[n++])?e+=String.fromCharCode(a):(a-=65536,e+=String.fromCharCode(55296|a>>10,56320|1023&a))}}else e+=String.fromCharCode(a)}return e}function T(t,n){return t?k(U,t,n):""}function S(t,n,r,e){if(!(0=i)i=65536+((1023&i)<<10)|1023&t.charCodeAt(++o);if(127>=i){if(r>=e)break;n[r++]=i}else{if(2047>=i){if(r+1>=e)break;n[r++]=192|i>>6}else{if(65535>=i){if(r+2>=e)break;n[r++]=224|i>>12}else{if(r+3>=e)break;n[r++]=240|i>>18,n[r++]=128|i>>12&63}n[r++]=128|i>>6&63}n[r++]=128|63&i}}return n[r]=0,r-a}function j(t){for(var n=0,r=0;r=e&&(e=65536+((1023&e)<<10)|1023&t.charCodeAt(++r)),127>=e?++n:n=2047>=e?n+2:65535>=e?n+3:n+4}return n}var R,C,U,W,E,P,Q,I,x,V="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0;function M(t,n){for(var r=t>>1,e=r+n/2;!(r>=e)&&E[r];)++r;if(32<(r<<=1)-t&&V)return V.decode(U.subarray(t,r));for(r="",e=0;!(e>=n/2);++e){var a=W[t+2*e>>1];if(0==a)break;r+=String.fromCharCode(a)}return r}function D(t,n,r){if(void 0===r&&(r=2147483647),2>r)return 0;var e=n;r=(r-=2)<2*t.length?r/2:t.length;for(var a=0;a>1]=t.charCodeAt(a),n+=2;return W[n>>1]=0,n-e}function F(t){return 2*t.length}function z(t,n){for(var r=0,e="";!(r>=n/4);){var a=P[t+4*r>>2];if(0==a)break;++r,65536<=a?(a-=65536,e+=String.fromCharCode(55296|a>>10,56320|1023&a)):e+=String.fromCharCode(a)}return e}function O(t,n,r){if(void 0===r&&(r=2147483647),4>r)return 0;var e=n;r=e+r-4;for(var a=0;a=o)o=65536+((1023&o)<<10)|1023&t.charCodeAt(++a);if(P[n>>2]=o,(n+=4)+4>r)break}return P[n>>2]=0,n-e}function q(t){for(var n=0,r=0;r=e&&++r,n+=4}return n}function B(){var t=g.buffer;R=t,r.HEAP8=C=new Int8Array(t),r.HEAP16=W=new Int16Array(t),r.HEAP32=P=new Int32Array(t),r.HEAPU8=U=new Uint8Array(t),r.HEAPU16=E=new Uint16Array(t),r.HEAPU32=Q=new Uint32Array(t),r.HEAPF32=I=new Float32Array(t),r.HEAPF64=x=new Float64Array(t)}var H,X=[],$=[],N=[];function Y(){var t=r.preRun.shift();X.unshift(t)}var Z,L,G,J=0,K=null,tt=null;function nt(t){throw r.onAbort&&r.onAbort(t),w(t),A=!0,t=new WebAssembly.RuntimeError("abort("+t+"). Build with -s ASSERTIONS=1 for more info."),a(t),t}function rt(){return Z.startsWith("data:application/octet-stream;base64,")}if(r.preloadedImages={},r.preloadedAudios={},Z="AcuantImageService.wasm",!rt()){var et=Z;Z=r.locateFile?r.locateFile(et,v):v+et}function at(){var t=Z;try{if(t==Z&&y)return new Uint8Array(y);if(c)return c(t);throw"both async and sync fetching of the wasm failed"}catch(t){nt(t)}}function ot(t){for(;0>2]=t},this.eb=function(){return P[this.Sa+4>>2]},this.Sb=function(t){P[this.Sa+8>>2]=t},this.Gb=function(){return P[this.Sa+8>>2]},this.Tb=function(){P[this.Sa>>2]=0},this.Ab=function(t){C[this.Sa+12>>0]=t?1:0},this.Fb=function(){return 0!=C[this.Sa+12>>0]},this.Bb=function(){C[this.Sa+13>>0]=0},this.Ib=function(){return 0!=C[this.Sa+13>>0]},this.Kb=function(t,n){this.Ub(t),this.Sb(n),this.Tb(),this.Ab(!1),this.Bb()},this.Cb=function(){P[this.Sa>>2]=P[this.Sa>>2]+1},this.Pb=function(){var t=P[this.Sa>>2];return P[this.Sa>>2]=t-1,1===t}}function ut(t){this.vb=function(){Cn(this.Sa),this.Sa=0},this.ob=function(t){P[this.Sa>>2]=t},this.cb=function(){return P[this.Sa>>2]},this.hb=function(t){P[this.Sa+4>>2]=t},this.jb=function(){return this.Sa+4},this.Eb=function(){return P[this.Sa+4>>2]},this.Hb=function(){if(Vn(this.kb().eb()))return P[this.cb()>>2];var t=this.Eb();return 0!==t?t:this.cb()},this.kb=function(){return new it(this.cb())},void 0===t?(this.Sa=Rn(8),this.hb(0)):this.Sa=t}var ft=[],ct=0;function st(t){return Cn(new it(t).Sa)}function lt(t,n){for(var r=0,e=t.length-1;0<=e;e--){var a=t[e];"."===a?t.splice(e,1):".."===a?(t.splice(e,1),r++):r&&(t.splice(e,1),r--)}if(n)for(;r;r--)t.unshift("..");return t}function ht(t){var n="/"===t.charAt(0),r="/"===t.substr(-1);return(t=lt(t.split("/").filter((function(t){return!!t})),!n).join("/"))||n||(t="."),t&&r&&(t+="/"),(n?"/":"")+t}function pt(t){var n=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(t).slice(1);return t=n[0],n=n[1],t||n?(n&&(n=n.substr(0,n.length-1)),t+n):"."}function dt(t){if("/"===t)return"/";var n=(t=(t=ht(t)).replace(/\/$/,"")).lastIndexOf("/");return-1===n?t:t.substr(n+1)}function vt(){for(var t="",n=!1,r=arguments.length-1;-1<=r&&!n;r--){if("string"!=typeof(n=0<=r?arguments[r]:"/"))throw new TypeError("Arguments to path.resolve must be strings");if(!n)return"";t=n+"/"+t,n="/"===n.charAt(0)}return(n?"/":"")+(t=lt(t.split("/").filter((function(t){return!!t})),!n).join("/"))||"."}var mt=[];function wt(t,n){mt[t]={input:[],output:[],ab:n},qt(t,yt)}var yt={open:function(t){var n=mt[t.node.rdev];if(!n)throw new Ct(43);t.tty=n,t.seekable=!1},close:function(t){t.tty.ab.flush(t.tty)},flush:function(t){t.tty.ab.flush(t.tty)},read:function(t,n,r,e){if(!t.tty||!t.tty.ab.wb)throw new Ct(60);for(var a=0,o=0;o=n||(n=Math.max(n,r*(1048576>r?2:1.125)>>>0),0!=r&&(n=Math.max(n,256)),r=t.Qa,t.Qa=new Uint8Array(n),0=t.node.Ua)return 0;if(8<(t=Math.min(t.node.Ua-a,e))&&o.subarray)n.set(o.subarray(a,a+t),r);else for(e=0;en)throw new Ct(28);return n},pb:function(t,n,r){At.sb(t.node,n+r),t.node.Ua=Math.max(t.node.Ua,n+r)},xb:function(t,n,r,e,a,o){if(0!==n)throw new Ct(28);if(32768!=(61440&t.node.mode))throw new Ct(43);if(t=t.node.Qa,2&o||t.buffer!==R){if((0>>0)%jt.length}function Qt(t,n){var r;if(r=(r=Mt(t,"x"))?r:t.Ra.lookup?0:2)throw new Ct(r,t);for(r=jt[Pt(t.id,n)];r;r=r.Nb){var e=r.name;if(r.parent.id===t.id&&e===n)return r}return t.Ra.lookup(t,n)}function It(t,n,r,e){return n=Pt((t=new kn(t,n,r,e)).parent.id,t.name),t.Nb=jt[n],jt[n]=t}var xt={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090};function Vt(t){var n=["r","w","rw"][3&t];return 512&t&&(n+="w"),n}function Mt(t,n){return Rt?0:!n.includes("r")||292&t.mode?n.includes("w")&&!(146&t.mode)||n.includes("x")&&!(73&t.mode)?2:0:2}function Dt(t,n){try{return Qt(t,n),20}catch(t){}return Mt(t,"wx")}function Ft(t,n){tn||((tn=function(){}).prototype={});var r,e=new tn;for(r in t)e[r]=t[r];return t=e,n=function(t){for(t=t||0;t<=4096;t++)if(!Tt[t])return t;throw new Ct(33)}(n),t.fd=n,Tt[n]=t}var zt,Ot={open:function(t){t.Ta=kt[t.node.rdev].Ta,t.Ta.open&&t.Ta.open(t)},$a:function(){throw new Ct(70)}};function qt(t,n){kt[t]={Ta:n}}function Bt(t,n){var r="/"===n,e=!n;if(r&&_t)throw new Ct(10);if(!r&&!e){var a=Wt(n,{ub:!1});if(n=a.path,(a=a.node).gb)throw new Ct(10);if(16384!=(61440&a.mode))throw new Ct(54)}n={type:t,$b:{},yb:n,Mb:[]},(t=t.Xa(n)).Xa=n,n.root=t,r?_t=t:a&&(a.gb=n,a.Xa&&a.Xa.Mb.push(n))}function Ht(t,n,r){var e=Wt(t,{parent:!0}).node;if(!(t=dt(t))||"."===t||".."===t)throw new Ct(28);var a=Dt(e,t);if(a)throw new Ct(a);if(!e.Ra.fb)throw new Ct(63);return e.Ra.fb(e,t,n,r)}function Xt(t){return Ht(t,16895,0)}function $t(t,n,r){void 0===r&&(r=n,n=438),Ht(t,8192|n,r)}function Nt(t,n){if(!vt(t))throw new Ct(44);var r=Wt(n,{parent:!0}).node;if(!r)throw new Ct(44);var e=Dt(r,n=dt(n));if(e)throw new Ct(e);if(!r.Ra.symlink)throw new Ct(63);r.Ra.symlink(r,n,t)}function Yt(t){if(!(t=Wt(t).node))throw new Ct(44);if(!t.Ra.readlink)throw new Ct(28);return vt(Et(t.parent),t.Ra.readlink(t))}function Zt(t,n,e,a){if(""===t)throw new Ct(44);if("string"==typeof n){var o=xt[n];if(void 0===o)throw Error("Unknown file open mode: "+n);n=o}if(e=64&n?4095&(void 0===e?438:e)|32768:0,"object"==typeof t)var i=t;else{t=ht(t);try{i=Wt(t,{tb:!(131072&n)}).node}catch(t){}}if(o=!1,64&n)if(i){if(128&n)throw new Ct(20)}else i=Ht(t,e,0),o=!0;if(!i)throw new Ct(44);if(8192==(61440&i.mode)&&(n&=-513),65536&n&&16384!=(61440&i.mode))throw new Ct(54);if(!o&&(e=i?40960==(61440&i.mode)?32:16384==(61440&i.mode)&&("r"!==Vt(n)||512&n)?31:Mt(i,Vt(n)):44))throw new Ct(e);if(512&n){if(!(e="string"==typeof(e=i)?Wt(e,{tb:!0}).node:e).Ra.Wa)throw new Ct(63);if(16384==(61440&e.mode))throw new Ct(31);if(32768!=(61440&e.mode))throw new Ct(28);if(o=Mt(e,"w"))throw new Ct(o);e.Ra.Wa(e,{size:0,timestamp:Date.now()})}return n&=-131713,(a=Ft({node:i,path:Et(i),flags:n,seekable:!0,position:0,Ta:i.Ta,Vb:[],error:!1},a)).Ta.open&&a.Ta.open(a),!r.logReadFiles||1&n||(nn||(nn={}),t in nn||(nn[t]=1)),a}function Lt(t,n,r){if(null===t.fd)throw new Ct(8);if(!t.seekable||!t.Ta.$a)throw new Ct(70);if(0!=r&&1!=r&&2!=r)throw new Ct(28);t.position=t.Ta.$a(t,n,r),t.Vb=[]}function Gt(){Ct||((Ct=function(t,n){this.node=n,this.Rb=function(t){this.Za=t},this.Rb(t),this.message="FS error"}).prototype=Error(),Ct.prototype.constructor=Ct,[44].forEach((function(t){Ut[t]=new Ct(t),Ut[t].stack=""})))}function Jt(t,n,r){t=ht("/dev/"+t);var e=function(t,n){var r=0;return t&&(r|=365),n&&(r|=146),r}(!!n,!!r);Kt||(Kt=64);var a=Kt++<<8|0;qt(a,{open:function(t){t.seekable=!1},close:function(){r&&r.buffer&&r.buffer.length&&r(10)},read:function(t,r,e,a){for(var o=0,i=0;i>2]}function on(t){if(!(t=Tt[t]))throw new Ct(8);return t}function un(t){switch(t){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+t)}}var fn=void 0;function cn(t){for(var n="";U[t];)n+=fn[U[t++]];return n}var sn={},ln={},hn={};function pn(t){var n=Error,r=function(t,n){if(void 0===t)t="_unknown";else{var r=(t=t.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);t=48<=r&&57>=r?"_"+t:t}return new Function("body","return function "+t+'() {\n "use strict"; return body.apply(this, arguments);\n};\n')(n)}(t,(function(n){this.name=t,this.message=n,void 0!==(n=Error(n).stack)&&(this.stack=this.toString()+"\n"+n.replace(/^Error(:[^\n]*)?\n/,""))}));return r.prototype=Object.create(n.prototype),r.prototype.constructor=r,r.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message},r}var dn=void 0;function vn(t){throw new dn(t)}function mn(t,n,r){if(r=r||{},!("argPackAdvance"in n))throw new TypeError("registerType registeredInstance requires argPackAdvance");var e=n.name;if(t||vn('type "'+e+'" must have a positive integer typeid pointer'),ln.hasOwnProperty(t)){if(r.Jb)return;vn("Cannot register type '"+e+"' twice")}ln[t]=n,delete hn[t],sn.hasOwnProperty(t)&&(n=sn[t],delete sn[t],n.forEach((function(t){t()})))}var wn=[],yn=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function bn(t){return this.fromWireType(Q[t>>2])}function gn(t){if(null===t)return"null";var n=typeof t;return"object"===n||"array"===n||"function"===n?t.toString():""+t}function An(t,n){switch(n){case 2:return function(t){return this.fromWireType(I[t>>2])};case 3:return function(t){return this.fromWireType(x[t>>3])};default:throw new TypeError("Unknown float type: "+t)}}function _n(t,n,r){switch(n){case 0:return r?function(t){return C[t]}:function(t){return U[t]};case 1:return r?function(t){return W[t>>1]}:function(t){return E[t>>1]};case 2:return r?function(t){return P[t>>2]}:function(t){return Q[t>>2]};default:throw new TypeError("Unknown integer type: "+t)}}function kn(t,n,r,e){t||(t=this),this.parent=t,this.Xa=t.Xa,this.gb=null,this.id=St++,this.name=n,this.mode=r,this.Ra={},this.Ta={},this.rdev=e}Object.defineProperties(kn.prototype,{read:{get:function(){return 365==(365&this.mode)},set:function(t){t?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146==(146&this.mode)},set:function(t){t?this.mode|=146:this.mode&=-147}}}),Gt(),jt=Array(4096),Bt(At,"/"),Xt("/tmp"),Xt("/home"),Xt("/home/web_user"),function(){Xt("/dev"),qt(259,{read:function(){return 0},write:function(t,n,r,e){return e}}),$t("/dev/null",259),wt(1280,bt),wt(1536,gt),$t("/dev/tty",1280),$t("/dev/tty1",1536);var t=function(){if("object"==typeof crypto&&"function"==typeof crypto.getRandomValues){var t=new Uint8Array(1);return function(){return crypto.getRandomValues(t),t[0]}}if(d)try{var n=require("crypto");return function(){return n.randomBytes(1)[0]}}catch(t){}return function(){nt("randomDevice")}}();Jt("random",t),Jt("urandom",t),Xt("/dev/shm"),Xt("/dev/shm/tmp")}(),function(){Xt("/proc");var t=Xt("/proc/self");Xt("/proc/self/fd"),Bt({Xa:function(){var n=It(t,"fd",16895,73);return n.Ra={lookup:function(t,n){var r=Tt[+n];if(!r)throw new Ct(8);return(t={parent:null,Xa:{yb:"fake"},Ra:{readlink:function(){return r.path}}}).parent=t}},n}},"/proc/self/fd")}();for(var Tn=Array(256),Sn=0;256>Sn;++Sn)Tn[Sn]=String.fromCharCode(Sn);fn=Tn,dn=r.BindingError=pn("BindingError"),r.InternalError=pn("InternalError"),r.count_emval_handles=function(){for(var t=0,n=5;na?-28:Zt(e.path,e.flags,0,a).fd;case 1:case 2:return 0;case 3:return e.flags;case 4:return a=an(),e.flags|=a,0;case 12:return a=an(),W[a+0>>1]=2,0;case 13:case 14:return 0;case 16:case 8:return-28;case 9:return P[Wn()>>2]=28,-1;default:return-28}}catch(t){return void 0!==rn&&t instanceof Ct||nt(t),-t.Za}},ma:function(t,n,r){en=r;try{var e=on(t);switch(n){case 21509:case 21505:return e.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return e.tty?0:-59;case 21519:if(!e.tty)return-59;var a=an();return P[a>>2]=0;case 21520:return e.tty?-28:-59;case 21531:if(t=a=an(),!e.Ta.Lb)throw new Ct(59);return e.Ta.Lb(e,n,t);case 21523:case 21524:return e.tty?0:-59;default:nt("bad ioctl syscall "+n)}}catch(t){return void 0!==rn&&t instanceof Ct||nt(t),-t.Za}},na:function(t,n,r){en=r;try{return Zt(T(t),n,r?an():0).fd}catch(t){return void 0!==rn&&t instanceof Ct||nt(t),-t.Za}},ha:function(){},pa:function(t,n,r,e,a){var o=un(r);mn(t,{name:n=cn(n),fromWireType:function(t){return!!t},toWireType:function(t,n){return n?e:a},argPackAdvance:8,readValueFromPointer:function(t){if(1===r)var e=C;else if(2===r)e=W;else{if(4!==r)throw new TypeError("Unknown boolean type size: "+n);e=P}return this.fromWireType(e[t>>o])},bb:null})},oa:function(t,n){mn(t,{name:n=cn(n),fromWireType:function(t){var n=yn[t].value;return 4>>u}}var f=n.includes("unsigned");mn(t,{name:n,fromWireType:o,toWireType:function(t,r){if("number"!=typeof r&&"boolean"!=typeof r)throw new TypeError('Cannot convert "'+gn(r)+'" to '+this.name);if(ra)throw new TypeError('Passing a number "'+gn(r)+'" from JS side to C/C++ side to an argument of type "'+n+'", which is outside the valid range ['+e+", "+a+"]!");return f?r>>>0:0|r},argPackAdvance:8,readValueFromPointer:_n(n,i,0!==e),bb:null})},r:function(t,n,r){function e(t){var n=Q;return new a(R,n[(t>>=2)+1],n[t])}var a=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][n];mn(t,{name:r=cn(r),fromWireType:e,argPackAdvance:8,readValueFromPointer:e},{Jb:!0})},T:function(t,n){var r="std::string"===(n=cn(n));mn(t,{name:n,fromWireType:function(t){var n=Q[t>>2];if(r)for(var e=t+4,a=0;a<=n;++a){var o=t+4+a;if(a==n||0==U[o]){if(e=T(e,o-e),void 0===i)var i=e;else i+=String.fromCharCode(0),i+=e;e=o+1}}else{for(i=Array(n),a=0;a>2]=a,r&&e)S(n,U,o+4,a+1);else if(e)for(e=0;e>2],o=i(),f=t+4,c=0;c<=a;++c){var s=t+4+c*n;c!=a&&0!=o[s>>u]||(f=e(f,s-f),void 0===r?r=f:(r+=String.fromCharCode(0),r+=f),f=s+n)}return Cn(t),r},toWireType:function(t,e){"string"!=typeof e&&vn("Cannot pass non-string to C++ string type "+r);var i=o(e),f=Rn(4+i+n);return Q[f>>2]=i>>u,a(e,f+4,i+n),null!==t&&t.push(Cn,f),f},argPackAdvance:8,readValueFromPointer:bn,bb:function(t){Cn(t)}})},qa:function(t,n){mn(t,{Zb:!0,name:n=cn(n),argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},ka:function(){nt()},ia:function(t,n,r){U.copyWithin(t,n,n+r)},ja:function(t){var n=U.length;if(2147483648<(t>>>=0))return!1;for(var r=1;4>=r;r*=2){var e=n*(1+.2/r);e=Math.min(e,t+100663296),0<(e=Math.max(t,e))%65536&&(e+=65536-e%65536);t:{try{g.grow(Math.min(2147483648,e)-R.byteLength+65535>>>16),B();var a=1;break t}catch(t){}a=void 0}if(a)return!0}return!1},R:function(t){try{var n=on(t);if(null===n.fd)throw new Ct(8);n.lb&&(n.lb=null);try{n.Ta.close&&n.Ta.close(n)}catch(t){throw t}finally{Tt[n.fd]=null}return n.fd=null,0}catch(t){return void 0!==rn&&t instanceof Ct||nt(t),t.Za}},la:function(t,n,r,e){try{t:{for(var a=on(t),o=t=0;o>2],u=a,f=P[n+8*o>>2],c=i,s=void 0,l=C;if(0>c||0>s)throw new Ct(28);if(null===u.fd)throw new Ct(8);if(1==(2097155&u.flags))throw new Ct(8);if(16384==(61440&u.node.mode))throw new Ct(31);if(!u.Ta.read)throw new Ct(28);var h=void 0!==s;if(h){if(!u.seekable)throw new Ct(70)}else s=u.position;var p=u.Ta.read(u,l,f,c,s);h||(u.position+=p);var d=p;if(0>d){var v=-1;break t}if(t+=d,d>2]=v,0}catch(t){return void 0!==rn&&t instanceof Ct||nt(t),t.Za}},ga:function(t,n,r,e,a){try{var o=on(t);return-9007199254740992>=(t=4294967296*r+(n>>>0))||9007199254740992<=t?-61:(Lt(o,t,e),G=[o.position>>>0,(L=o.position,1<=+Math.abs(L)?0>>0:~~+Math.ceil((L-+(~~L>>>0))/4294967296)>>>0:0)],P[a>>2]=G[0],P[a+4>>2]=G[1],o.lb&&0===t&&0===e&&(o.lb=null),0)}catch(t){return void 0!==rn&&t instanceof Ct||nt(t),t.Za}},P:function(t,n,r,e){try{t:{for(var a=on(t),o=t=0;o>2],f=P[n+(8*o+4)>>2],c=void 0,s=C;if(0>f||0>c)throw new Ct(28);if(null===i.fd)throw new Ct(8);if(0==(2097155&i.flags))throw new Ct(8);if(16384==(61440&i.node.mode))throw new Ct(31);if(!i.Ta.write)throw new Ct(28);i.seekable&&1024&i.flags&&Lt(i,0,2);var l=void 0!==c;if(l){if(!i.seekable)throw new Ct(70)}else c=i.position;var h=i.Ta.write(i,s,u,f,c,void 0);l||(i.position+=h);var p=h;if(0>p){var d=-1;break t}t+=p}d=t}return P[e>>2]=d,0}catch(t){return void 0!==rn&&t instanceof Ct||nt(t),t.Za}},b:function(){return b},N:function(t,n){var r=En();try{return H.get(t)(n)}catch(t){if(Pn(r),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},L:function(t,n,r){var e=En();try{return H.get(t)(n,r)}catch(t){if(Pn(e),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},ta:function(t,n,r,e){var a=En();try{return H.get(t)(n,r,e)}catch(t){if(Pn(a),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},Z:function(t,n,r,e,a,o){var i=En();try{return H.get(t)(n,r,e,a,o)}catch(t){if(Pn(i),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},sa:function(t,n,r,e,a){var o=En();try{return H.get(t)(n,r,e,a)}catch(t){if(Pn(o),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},$:function(t,n,r,e,a){var o=En();try{return H.get(t)(n,r,e,a)}catch(t){if(Pn(o),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},F:function(t,n,r,e,a,o,i,u){var f=En();try{return H.get(t)(n,r,e,a,o,i,u)}catch(t){if(Pn(f),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},m:function(t,n){var r=En();try{return H.get(t)(n)}catch(t){if(Pn(r),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},H:function(t,n,r){var e=En();try{return H.get(t)(n,r)}catch(t){if(Pn(e),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},O:function(t,n,r){var e=En();try{return H.get(t)(n,r)}catch(t){if(Pn(e),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},ba:function(t,n,r,e,a,o){var i=En();try{return H.get(t)(n,r,e,a,o)}catch(t){if(Pn(i),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},a:function(t,n,r){var e=En();try{return H.get(t)(n,r)}catch(t){if(Pn(e),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},C:function(t,n,r,e){var a=En();try{return H.get(t)(n,r,e)}catch(t){if(Pn(a),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},ua:function(t,n,r,e,a){var o=En();try{return H.get(t)(n,r,e,a)}catch(t){if(Pn(o),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},X:function(t,n,r,e,a,o){var i=En();try{return H.get(t)(n,r,e,a,o)}catch(t){if(Pn(i),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},ca:function(t,n,r,e,a){var o=En();try{return H.get(t)(n,r,e,a)}catch(t){if(Pn(o),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},j:function(t,n,r,e){var a=En();try{return H.get(t)(n,r,e)}catch(t){if(Pn(a),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},U:function(t,n,r,e,a,o){var i=En();try{return H.get(t)(n,r,e,a,o)}catch(t){if(Pn(i),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},i:function(t,n,r,e,a){var o=En();try{return H.get(t)(n,r,e,a)}catch(t){if(Pn(o),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},aa:function(t,n,r,e,a,o,i){var u=En();try{return H.get(t)(n,r,e,a,o,i)}catch(t){if(Pn(u),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},A:function(t,n,r,e,a,o,i){var u=En();try{return H.get(t)(n,r,e,a,o,i)}catch(t){if(Pn(u),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},u:function(t,n,r,e,a,o){var i=En();try{return H.get(t)(n,r,e,a,o)}catch(t){if(Pn(i),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},_:function(t,n,r,e,a,o,i,u,f,c){var s=En();try{return H.get(t)(n,r,e,a,o,i,u,f,c)}catch(t){if(Pn(s),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},v:function(t,n,r,e,a,o,i){var u=En();try{return H.get(t)(n,r,e,a,o,i)}catch(t){if(Pn(u),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},fa:function(t,n,r,e,a,o,i,u){var f=En();try{return H.get(t)(n,r,e,a,o,i,u)}catch(t){if(Pn(f),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},w:function(t,n,r,e,a,o,i,u){var f=En();try{return H.get(t)(n,r,e,a,o,i,u)}catch(t){if(Pn(f),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},y:function(t,n,r,e,a,o,i,u,f,c){var s=En();try{return H.get(t)(n,r,e,a,o,i,u,f,c)}catch(t){if(Pn(s),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},D:function(t,n,r,e,a,o,i,u,f,c,s,l,h){var p=En();try{return H.get(t)(n,r,e,a,o,i,u,f,c,s,l,h)}catch(t){if(Pn(p),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},I:function(t){var n=En();try{H.get(t)()}catch(t){if(Pn(n),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},g:function(t,n){var r=En();try{H.get(t)(n)}catch(t){if(Pn(r),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},da:function(t,n,r,e){var a=En();try{H.get(t)(n,r,e)}catch(t){if(Pn(a),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},V:function(t,n,r){var e=En();try{H.get(t)(n,r)}catch(t){if(Pn(e),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},wa:function(t,n,r,e){var a=En();try{H.get(t)(n,r,e)}catch(t){if(Pn(a),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},k:function(t,n,r){var e=En();try{H.get(t)(n,r)}catch(t){if(Pn(e),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},l:function(t,n,r,e){var a=En();try{H.get(t)(n,r,e)}catch(t){if(Pn(a),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},ra:function(t,n,r,e,a,o,i,u){var f=En();try{H.get(t)(n,r,e,a,o,i,u)}catch(t){if(Pn(f),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},B:function(t,n,r,e){var a=En();try{H.get(t)(n,r,e)}catch(t){if(Pn(a),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},Y:function(t,n,r,e,a,o){var i=En();try{H.get(t)(n,r,e,a,o)}catch(t){if(Pn(i),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},f:function(t,n,r,e){var a=En();try{H.get(t)(n,r,e)}catch(t){if(Pn(a),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},va:function(t,n,r,e,a,o){var i=En();try{H.get(t)(n,r,e,a,o)}catch(t){if(Pn(i),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},h:function(t,n,r,e,a){var o=En();try{H.get(t)(n,r,e,a)}catch(t){if(Pn(o),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},q:function(t,n,r,e,a,o){var i=En();try{H.get(t)(n,r,e,a,o)}catch(t){if(Pn(i),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},W:function(t,n,r,e,a,o,i,u,f,c){var s=En();try{H.get(t)(n,r,e,a,o,i,u,f,c)}catch(t){if(Pn(s),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},s:function(t,n,r,e,a,o,i){var u=En();try{H.get(t)(n,r,e,a,o,i)}catch(t){if(Pn(u),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},p:function(t,n,r,e,a,o,i,u){var f=En();try{H.get(t)(n,r,e,a,o,i,u)}catch(t){if(Pn(f),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},G:function(t,n,r,e,a,o,i,u,f,c){var s=En();try{H.get(t)(n,r,e,a,o,i,u,f,c)}catch(t){if(Pn(s),t!==t+0&&"longjmp"!==t)throw t;In(1,0)}},E:function(t){return t}};!function(){function t(t){r.asm=t.exports,g=r.asm.xa,B(),H=r.asm.Ea,$.unshift(r.asm.ya),J--,r.monitorRunDependencies&&r.monitorRunDependencies(J),0==J&&(null!==K&&(clearInterval(K),K=null),tt&&(t=tt,tt=null,t()))}function n(n){t(n.instance)}function e(t){return function(){if(!y&&(h||p)){if("function"==typeof fetch&&!Z.startsWith("file://"))return fetch(Z,{credentials:"same-origin"}).then((function(t){if(!t.ok)throw"failed to load wasm binary file at '"+Z+"'";return t.arrayBuffer()})).catch((function(){return at()}));if(f)return new Promise((function(t,n){f(Z,(function(n){t(new Uint8Array(n))}),n)}))}return Promise.resolve().then((function(){return at()}))}().then((function(t){return WebAssembly.instantiate(t,o)})).then((function(t){return t})).then(t,(function(t){w("failed to asynchronously prepare wasm: "+t),nt(t)}))}var o={a:jn};if(J++,r.monitorRunDependencies&&r.monitorRunDependencies(J),r.instantiateWasm)try{return r.instantiateWasm(o,t)}catch(t){return w("Module.instantiateWasm callback failed with error: "+t),!1}(y||"function"!=typeof WebAssembly.instantiateStreaming||rt()||Z.startsWith("file://")||"function"!=typeof fetch?e(n):fetch(Z,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,o).then(n,(function(t){return w("wasm streaming compile failed: "+t),w("falling back to ArrayBuffer instantiation"),e(n)}))}))).catch(a)}(),r.___wasm_call_ctors=function(){return(r.___wasm_call_ctors=r.asm.ya).apply(null,arguments)},r._acuantDetect=function(){return(r._acuantDetect=r.asm.za).apply(null,arguments)},r._acuantCrop=function(){return(r._acuantCrop=r.asm.Aa).apply(null,arguments)},r._acuantSign=function(){return(r._acuantSign=r.asm.Ba).apply(null,arguments)},r._acuantVerify=function(){return(r._acuantVerify=r.asm.Ca).apply(null,arguments)},r._getAcuantCVMLVersion=function(){return(r._getAcuantCVMLVersion=r.asm.Da).apply(null,arguments)};var Rn=r._malloc=function(){return(Rn=r._malloc=r.asm.Fa).apply(null,arguments)},Cn=r._free=function(){return(Cn=r._free=r.asm.Ga).apply(null,arguments)};r.___getTypeName=function(){return(r.___getTypeName=r.asm.Ha).apply(null,arguments)},r.___embind_register_native_and_builtin_types=function(){return(r.___embind_register_native_and_builtin_types=r.asm.Ia).apply(null,arguments)};var Un,Wn=r.___errno_location=function(){return(Wn=r.___errno_location=r.asm.Ja).apply(null,arguments)},En=r.stackSave=function(){return(En=r.stackSave=r.asm.Ka).apply(null,arguments)},Pn=r.stackRestore=function(){return(Pn=r.stackRestore=r.asm.La).apply(null,arguments)},Qn=r.stackAlloc=function(){return(Qn=r.stackAlloc=r.asm.Ma).apply(null,arguments)},In=r._setThrew=function(){return(In=r._setThrew=r.asm.Na).apply(null,arguments)},xn=r.___cxa_can_catch=function(){return(xn=r.___cxa_can_catch=r.asm.Oa).apply(null,arguments)},Vn=r.___cxa_is_pointer_type=function(){return(Vn=r.___cxa_is_pointer_type=r.asm.Pa).apply(null,arguments)};function Mn(){function t(){if(!Un&&(Un=!0,r.calledRun=!0,!A)){if(r.noFSInit||zt||(zt=!0,Gt(),r.stdin=r.stdin,r.stdout=r.stdout,r.stderr=r.stderr,r.stdin?Jt("stdin",r.stdin):Nt("/dev/tty","/dev/stdin"),r.stdout?Jt("stdout",null,r.stdout):Nt("/dev/tty","/dev/stdout"),r.stderr?Jt("stderr",null,r.stderr):Nt("/dev/tty1","/dev/stderr"),Zt("/dev/stdin",0),Zt("/dev/stdout",1),Zt("/dev/stderr",1)),Rt=!1,ot($),e(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),r.postRun)for("function"==typeof r.postRun&&(r.postRun=[r.postRun]);r.postRun.length;){var t=r.postRun.shift();N.unshift(t)}ot(N)}}if(!(0>0];case"i16":return W[t>>1];case"i32":case"i64":return P[t>>2];case"float":return I[t>>2];case"double":return x[t>>3];default:nt("invalid type for getValue: "+n)}return null},tt=function t(){Un||Mn(),Un||(tt=t)},r.run=Mn,r.preInit)for("function"==typeof r.preInit&&(r.preInit=[r.preInit]);0{function t(t,a,r,n,i){let s={func:"crop"};if(r>=0){const o=new ArrayBuffer(a);let l=new Uint8Array(o);l.set(e.HEAPU8.subarray(t,t+a),0),s.imgData=l,s.width=r,s.height=n,s.type=i}else switch(r){case-1:s.error="Runtime error.";break;case-2:s.error="Detect (for cropping) did not return OK";break;case-3:s.error="Crop did not return OK";break;default:s.error="Unknown Error Occured"}s&&s.imgData&&s.imgData.buffer?postMessage(s,[s.imgData.buffer]):postMessage(s)}function a(e,t,a,r,n,i,s,o,l){let c={func:"detect"};if(t>=0)c.type=e,c.x1=t,c.y1=a,c.x2=r,c.y2=n,c.x3=i,c.y3=s,c.x4=o,c.y4=l;else switch(t){case-1:c.error="Runtime error.";break;case-2:c.error="Detect did not return OK";break;default:c.error="Unknown Error Occured"}postMessage(c)}function r(t,a){let r={func:"sign"};if(t){const n=new ArrayBuffer(a);let i=new Uint8Array(n);i.set(e.HEAPU8.subarray(t,t+a),0),r.imgData=i}else switch(a){case-1:r.error="Failed to sign image: SIGN_PARSE_ERROR";break;case-2:r.error="Failed to sign image: SIGN_CANNOT_SIGN";break;case-3:r.error="Failed to sign image: SIGN_HASH_ERROR";break;default:r.error="Failed to sign image: UNEXPECTED"}r&&r.imgData&&r.imgData.buffer?postMessage(r,[r.imgData.buffer]):postMessage(r)}function n(e){postMessage({func:"verify",result:e})}function i(t){null!=t&&(e._free(t),t=null)}function s(t){let a=e._malloc(t.length*t.BYTES_PER_ELEMENT);return e.HEAPU8.set(t,a),a}onmessage=o=>{if(o&&o.data)if("crop"===o.data.func){let a=o.data.data;if(a.imgData&&a.width&&a.height){let r=s(a.imgData);const n=e.ccall("acuantCrop","number",["number","number","number"],[r,a.width,a.height]);let o=[];for(let t=0;t<5;t++)o[t]=e.getValue(n+4*t,"i32");t(o[0],o[1],o[2],o[3],o[4]),i(r)}else console.error("missing params"),t(-1,-1,-1,-1)}else if("detect"===o.data.func){let t=o.data.data;if(t.imgData&&t.width&&t.height){let r=s(t.imgData);const n=e.ccall("acuantDetect","number",["number","number","number"],[r,t.width,t.height]);let o=[];for(let t=0;t<9;t++)o[t]=e.getValue(n+4*t,"i32");a(o[0],o[1],o[2],o[3],o[4],o[5],o[6],o[7],o[8]),i(r)}else console.error("missing params"),a(-1,-1,-1,-1,-1,-1,-1,-1,-1)}else if("sign"===o.data.func){let t=o.data.data;if(t.imgData){let a=s(t.imgData);const n=e.ccall("acuantSign","number",["number","number"],[a,t.imgData.byteLength]);let o=[];for(let t=0;t<2;t++)o[t]=e.getValue(n+4*t,"i32");i(a),r(o[0],o[1])}else console.error("missing params"),r(null,-1)}else if("verify"==o.data.func){let t=o.data.data;if(t.imgData){let a=s(t.imgData);const r=e.ccall("acuantVerify","boolean",["number","number"],[a,t.imgData.byteLength]);i(a),n(r)}else console.log("missing params"),n(null)}else if("getCvmlVersion"===o.data.func){!function(e){postMessage({func:"getCvmlVersion",cvmlVersion:e})}(e.ccall("getAcuantCVMLVersion","string",[],[])||"")}else console.error("called with no func specified")},postMessage({imageWorker:"started"})})); \ No newline at end of file diff --git a/public/acuant/11.9.3/AcuantInitializerService.min.js b/public/acuant/11.9.3/AcuantInitializerService.min.js new file mode 100644 index 00000000000..70d1f50c0f8 --- /dev/null +++ b/public/acuant/11.9.3/AcuantInitializerService.min.js @@ -0,0 +1 @@ +var AcuantInitializerModule=function(){var e="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0;return"undefined"!=typeof __filename&&(e=e||__filename),function(t){var r,n,o=void 0!==(t=t||{})?t:{};o.ready=new Promise((function(e,t){r=e,n=t})),Object.getOwnPropertyDescriptor(o.ready,"_initialize")||(Object.defineProperty(o.ready,"_initialize",{configurable:!0,get:function(){je("You are getting _initialize on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_initialize",{configurable:!0,set:function(){je("You are setting _initialize on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_initializeWithToken")||(Object.defineProperty(o.ready,"_initializeWithToken",{configurable:!0,get:function(){je("You are getting _initializeWithToken on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_initializeWithToken",{configurable:!0,set:function(){je("You are setting _initializeWithToken on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_emscripten_stack_get_end")||(Object.defineProperty(o.ready,"_emscripten_stack_get_end",{configurable:!0,get:function(){je("You are getting _emscripten_stack_get_end on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_emscripten_stack_get_end",{configurable:!0,set:function(){je("You are setting _emscripten_stack_get_end on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_emscripten_stack_get_free")||(Object.defineProperty(o.ready,"_emscripten_stack_get_free",{configurable:!0,get:function(){je("You are getting _emscripten_stack_get_free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_emscripten_stack_get_free",{configurable:!0,set:function(){je("You are setting _emscripten_stack_get_free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_emscripten_stack_init")||(Object.defineProperty(o.ready,"_emscripten_stack_init",{configurable:!0,get:function(){je("You are getting _emscripten_stack_init on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_emscripten_stack_init",{configurable:!0,set:function(){je("You are setting _emscripten_stack_init on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_stackSave")||(Object.defineProperty(o.ready,"_stackSave",{configurable:!0,get:function(){je("You are getting _stackSave on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_stackSave",{configurable:!0,set:function(){je("You are setting _stackSave on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_stackRestore")||(Object.defineProperty(o.ready,"_stackRestore",{configurable:!0,get:function(){je("You are getting _stackRestore on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_stackRestore",{configurable:!0,set:function(){je("You are setting _stackRestore on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_stackAlloc")||(Object.defineProperty(o.ready,"_stackAlloc",{configurable:!0,get:function(){je("You are getting _stackAlloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_stackAlloc",{configurable:!0,set:function(){je("You are setting _stackAlloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"___wasm_call_ctors")||(Object.defineProperty(o.ready,"___wasm_call_ctors",{configurable:!0,get:function(){je("You are getting ___wasm_call_ctors on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"___wasm_call_ctors",{configurable:!0,set:function(){je("You are setting ___wasm_call_ctors on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_fflush")||(Object.defineProperty(o.ready,"_fflush",{configurable:!0,get:function(){je("You are getting _fflush on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_fflush",{configurable:!0,set:function(){je("You are setting _fflush on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"___errno_location")||(Object.defineProperty(o.ready,"___errno_location",{configurable:!0,get:function(){je("You are getting ___errno_location on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"___errno_location",{configurable:!0,set:function(){je("You are setting ___errno_location on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_malloc")||(Object.defineProperty(o.ready,"_malloc",{configurable:!0,get:function(){je("You are getting _malloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_malloc",{configurable:!0,set:function(){je("You are setting _malloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_free")||(Object.defineProperty(o.ready,"_free",{configurable:!0,get:function(){je("You are getting _free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_free",{configurable:!0,set:function(){je("You are setting _free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"___cxa_is_pointer_type")||(Object.defineProperty(o.ready,"___cxa_is_pointer_type",{configurable:!0,get:function(){je("You are getting ___cxa_is_pointer_type on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"___cxa_is_pointer_type",{configurable:!0,set:function(){je("You are setting ___cxa_is_pointer_type on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"___cxa_can_catch")||(Object.defineProperty(o.ready,"___cxa_can_catch",{configurable:!0,get:function(){je("You are getting ___cxa_can_catch on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"___cxa_can_catch",{configurable:!0,set:function(){je("You are setting ___cxa_can_catch on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_setThrew")||(Object.defineProperty(o.ready,"_setThrew",{configurable:!0,get:function(){je("You are getting _setThrew on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_setThrew",{configurable:!0,set:function(){je("You are setting _setThrew on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_getCreds")||(Object.defineProperty(o.ready,"_getCreds",{configurable:!0,get:function(){je("You are getting _getCreds on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_getCreds",{configurable:!0,set:function(){je("You are setting _getCreds on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_getOauthToken")||(Object.defineProperty(o.ready,"_getOauthToken",{configurable:!0,get:function(){je("You are getting _getOauthToken on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_getOauthToken",{configurable:!0,set:function(){je("You are setting _getOauthToken on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_getEndpoint")||(Object.defineProperty(o.ready,"_getEndpoint",{configurable:!0,get:function(){je("You are getting _getEndpoint on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_getEndpoint",{configurable:!0,set:function(){je("You are setting _getEndpoint on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_callback")||(Object.defineProperty(o.ready,"_callback",{configurable:!0,get:function(){je("You are getting _callback on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_callback",{configurable:!0,set:function(){je("You are setting _callback on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"_initialize_internal")||(Object.defineProperty(o.ready,"_initialize_internal",{configurable:!0,get:function(){je("You are getting _initialize_internal on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"_initialize_internal",{configurable:!0,set:function(){je("You are setting _initialize_internal on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"___getTypeName")||(Object.defineProperty(o.ready,"___getTypeName",{configurable:!0,get:function(){je("You are getting ___getTypeName on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"___getTypeName",{configurable:!0,set:function(){je("You are setting ___getTypeName on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"___embind_register_native_and_builtin_types")||(Object.defineProperty(o.ready,"___embind_register_native_and_builtin_types",{configurable:!0,get:function(){je("You are getting ___embind_register_native_and_builtin_types on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"___embind_register_native_and_builtin_types",{configurable:!0,set:function(){je("You are setting ___embind_register_native_and_builtin_types on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(o.ready,"onRuntimeInitialized")||(Object.defineProperty(o.ready,"onRuntimeInitialized",{configurable:!0,get:function(){je("You are getting onRuntimeInitialized on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(o.ready,"onRuntimeInitialized",{configurable:!0,set:function(){je("You are setting onRuntimeInitialized on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}));var i,a={};for(i in o)o.hasOwnProperty(i)&&(a[i]=o[i]);var s=[],c="object"==typeof window,d="function"==typeof importScripts,p="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,u=!c&&!p&&!d;if(o.ENVIRONMENT)throw new Error("Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)");var l,E,O,f,_,g="";function T(e){return o.locateFile?o.locateFile(e,g):g+e}if(p){if("object"!=typeof process||"function"!=typeof require)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");g=d?require("path").dirname(g)+"/":__dirname+"/",l=function(e,t){return f||(f=require("fs")),_||(_=require("path")),e=_.normalize(e),f.readFileSync(e,t?null:"utf8")},O=function(e){var t=l(e,!0);return t.buffer||(t=new Uint8Array(t)),x(t.buffer),t},E=function(e,t,r){f||(f=require("fs")),_||(_=require("path")),e=_.normalize(e),f.readFile(e,(function(e,n){e?r(e):t(n.buffer)}))},process.argv.length>1&&process.argv[1].replace(/\\/g,"/"),s=process.argv.slice(2),process.on("uncaughtException",(function(e){if(!(e instanceof Ur))throw e})),process.on("unhandledRejection",je),function(e,t){if(De())throw process.exitCode=e,t;process.exit(e)},o.inspect=function(){return"[Emscripten Module object]"}}else if(u){if("object"==typeof process&&"function"==typeof require||"object"==typeof window||"function"==typeof importScripts)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");"undefined"!=typeof read&&(l=function(e){return read(e)}),O=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(x("object"==typeof(t=read(e,"binary"))),t)},E=function(e,t,r){setTimeout((function(){t(O(e))}),0)},"undefined"!=typeof scriptArgs?s=scriptArgs:void 0!==arguments&&(s=arguments),"function"==typeof quit&&function(e){quit(e)},"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)}else{if(!c&&!d)throw new Error("environment detection error");if(d?g=self.location.href:"undefined"!=typeof document&&document.currentScript&&(g=document.currentScript.src),e&&(g=e),g=0!==g.indexOf("blob:")?g.substr(0,g.lastIndexOf("/")+1):"","object"!=typeof window&&"function"!=typeof importScripts)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");l=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},d&&(O=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),E=function(e,t,r){var n=new XMLHttpRequest;n.open("GET",e,!0),n.responseType="arraybuffer",n.onload=function(){200==n.status||0==n.status&&n.response?t(n.response):r()},n.onerror=r,n.send(null)},function(e){document.title=e}}o.print||console.log.bind(console);var h=o.printErr||console.warn.bind(console);for(i in a)a.hasOwnProperty(i)&&(o[i]=a[i]);a=null,o.arguments&&(s=o.arguments),Object.getOwnPropertyDescriptor(o,"arguments")||Object.defineProperty(o,"arguments",{configurable:!0,get:function(){je("Module.arguments has been replaced with plain arguments_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),o.thisProgram&&o.thisProgram,Object.getOwnPropertyDescriptor(o,"thisProgram")||Object.defineProperty(o,"thisProgram",{configurable:!0,get:function(){je("Module.thisProgram has been replaced with plain thisProgram (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),o.quit&&o.quit,Object.getOwnPropertyDescriptor(o,"quit")||Object.defineProperty(o,"quit",{configurable:!0,get:function(){je("Module.quit has been replaced with plain quit_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),x(void 0===o.memoryInitializerPrefixURL,"Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead"),x(void 0===o.pthreadMainPrefixURL,"Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead"),x(void 0===o.cdInitializerPrefixURL,"Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead"),x(void 0===o.filePackagePrefixURL,"Module.filePackagePrefixURL option was removed, use Module.locateFile instead"),x(void 0===o.read,"Module.read option was removed (modify read_ in JS)"),x(void 0===o.readAsync,"Module.readAsync option was removed (modify readAsync in JS)"),x(void 0===o.readBinary,"Module.readBinary option was removed (modify readBinary in JS)"),x(void 0===o.setWindowTitle,"Module.setWindowTitle option was removed (modify setWindowTitle in JS)"),x(void 0===o.TOTAL_MEMORY,"Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY"),Object.getOwnPropertyDescriptor(o,"read")||Object.defineProperty(o,"read",{configurable:!0,get:function(){je("Module.read has been replaced with plain read_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),Object.getOwnPropertyDescriptor(o,"readAsync")||Object.defineProperty(o,"readAsync",{configurable:!0,get:function(){je("Module.readAsync has been replaced with plain readAsync (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),Object.getOwnPropertyDescriptor(o,"readBinary")||Object.defineProperty(o,"readBinary",{configurable:!0,get:function(){je("Module.readBinary has been replaced with plain readBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),Object.getOwnPropertyDescriptor(o,"setWindowTitle")||Object.defineProperty(o,"setWindowTitle",{configurable:!0,get:function(){je("Module.setWindowTitle has been replaced with plain setWindowTitle (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}});x(!u,"shell environment detected but not enabled at build time. Add 'shell' to `-s ENVIRONMENT` to enable.");function D(e){D.shown||(D.shown={}),D.shown[e]||(D.shown[e]=1,h(e))}function w(e,t){if("function"==typeof WebAssembly.Function){for(var r={i:"i32",j:"i64",f:"f32",d:"f64"},n={parameters:[],results:"v"==t[0]?[]:[r[t[0]]]},o=1;o=n);)++o;if(o-t>16&&e.subarray&&k)return k.decode(e.subarray(t,o));for(var i="";t>10,56320|1023&d)}}else i+=String.fromCharCode((31&a)<<6|s)}else i+=String.fromCharCode(a)}return i}function Q(e,t){return e?X(Y,e,t):""}function C(e,t,r,n){if(!(n>0))return 0;for(var o=r,i=r+n-1,a=0;a=55296&&s<=57343)s=65536+((1023&s)<<10)|1023&e.charCodeAt(++a);if(s<=127){if(r>=i)break;t[r++]=s}else if(s<=2047){if(r+1>=i)break;t[r++]=192|s>>6,t[r++]=128|63&s}else if(s<=65535){if(r+2>=i)break;t[r++]=224|s>>12,t[r++]=128|s>>6&63,t[r++]=128|63&s}else{if(r+3>=i)break;s>1114111&&D("Invalid Unicode code point 0x"+s.toString(16)+" encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF)."),t[r++]=240|s>>18,t[r++]=128|s>>12&63,t[r++]=128|s>>6&63,t[r++]=128|63&s}}return t[r]=0,r-o}function L(e,t,r){return x("number"==typeof r,"stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),C(e,Y,t,r)}function W(e){for(var t=0,r=0;r=55296&&n<=57343&&(n=65536+((1023&n)<<10)|1023&e.charCodeAt(++r)),n<=127?++t:t+=n<=2047?2:n<=65535?3:4}return t}var G,z,Y,B,V,Z,q,K,J,$="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0;function ee(e,t){x(e%2==0,"Pointer passed to UTF16ToString must be aligned to two bytes!");for(var r=e,n=r>>1,o=n+t/2;!(n>=o)&&V[n];)++n;if((r=n<<1)-e>32&&$)return $.decode(Y.subarray(e,r));for(var i="",a=0;!(a>=t/2);++a){var s=B[e+2*a>>1];if(0==s)break;i+=String.fromCharCode(s)}return i}function te(e,t,r){if(x(t%2==0,"Pointer passed to stringToUTF16 must be aligned to two bytes!"),x("number"==typeof r,"stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),void 0===r&&(r=2147483647),r<2)return 0;for(var n=t,o=(r-=2)<2*e.length?r/2:e.length,i=0;i>1]=a,t+=2}return B[t>>1]=0,t-n}function re(e){return 2*e.length}function ne(e,t){x(e%4==0,"Pointer passed to UTF32ToString must be aligned to four bytes!");for(var r=0,n="";!(r>=t/4);){var o=Z[e+4*r>>2];if(0==o)break;if(++r,o>=65536){var i=o-65536;n+=String.fromCharCode(55296|i>>10,56320|1023&i)}else n+=String.fromCharCode(o)}return n}function oe(e,t,r){if(x(t%4==0,"Pointer passed to stringToUTF32 must be aligned to four bytes!"),x("number"==typeof r,"stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),void 0===r&&(r=2147483647),r<4)return 0;for(var n=t,o=n+r-4,i=0;i=55296&&a<=57343)a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i);if(Z[t>>2]=a,(t+=4)+4>o)break}return Z[t>>2]=0,t-n}function ie(e){for(var t=0,r=0;r=55296&&n<=57343&&++r,t+=4}return t}function ae(e,t){x(e.length>=0,"writeArrayToMemory array must have a length (should be an array or typed array)"),z.set(e,t)}function se(e,t){return e%t>0&&(e+=t-e%t),e}function ce(e){G=e,o.HEAP8=z=new Int8Array(e),o.HEAP16=B=new Int16Array(e),o.HEAP32=Z=new Int32Array(e),o.HEAPU8=Y=new Uint8Array(e),o.HEAPU16=V=new Uint16Array(e),o.HEAPU32=q=new Uint32Array(e),o.HEAPF32=K=new Float32Array(e),o.HEAPF64=J=new Float64Array(e)}var de=5242880;o.TOTAL_STACK&&x(de===o.TOTAL_STACK,"the stack size can no longer be determined at runtime");var pe,ue=o.INITIAL_MEMORY||16777216;function le(){var e=Pr();x(0==(3&e)),q[1+(e>>2)]=34821223,q[2+(e>>2)]=2310721022,Z[0]=1668509029}function Ee(){if(!U){var e=Pr(),t=q[1+(e>>2)],r=q[2+(e>>2)];34821223==t&&2310721022==r||je("Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x"+r.toString(16)+" "+t.toString(16)),1668509029!==Z[0]&&je("Runtime error: The application has corrupted its heap memory area (address zero)!")}}Object.getOwnPropertyDescriptor(o,"INITIAL_MEMORY")||Object.defineProperty(o,"INITIAL_MEMORY",{configurable:!0,get:function(){je("Module.INITIAL_MEMORY has been replaced with plain INITIAL_MEMORY (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),x(ue>=de,"INITIAL_MEMORY should be larger than TOTAL_STACK, was "+ue+"! (TOTAL_STACK="+de+")"),x("undefined"!=typeof Int32Array&&"undefined"!=typeof Float64Array&&void 0!==Int32Array.prototype.subarray&&void 0!==Int32Array.prototype.set,"JS engine does not provide full typed array support"),x(!o.wasmMemory,"Use of `wasmMemory` detected. Use -s IMPORTED_MEMORY to define wasmMemory externally"),x(16777216==ue,"Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically"),function(){var e=new Int16Array(1),t=new Int8Array(e.buffer);if(e[0]=25459,115!==t[0]||99!==t[1])throw"Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)"}();var Oe=[],fe=[],_e=[],ge=!1,Te=!1,he=0;function De(){return j||he>0}function we(){if(o.preRun)for("function"==typeof o.preRun&&(o.preRun=[o.preRun]);o.preRun.length;)Pe(o.preRun.shift());Ge(Oe)}function ye(){Ee(),x(!ge),ge=!0,Ge(fe)}function be(){if(Ee(),o.postRun)for("function"==typeof o.postRun&&(o.postRun=[o.postRun]);o.postRun.length;)Me(o.postRun.shift());Ge(_e)}function Pe(e){Oe.unshift(e)}function Re(e){fe.unshift(e)}function Me(e){_e.unshift(e)}x(Math.imul,"This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),x(Math.fround,"This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),x(Math.clz32,"This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),x(Math.trunc,"This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill");var me=0,Se=null,Ae=null,Fe={};function Ie(e){me++,o.monitorRunDependencies&&o.monitorRunDependencies(me),e?(x(!Fe[e]),Fe[e]=1,null===Se&&"undefined"!=typeof setInterval&&(Se=setInterval((function(){if(U)return clearInterval(Se),void(Se=null);var e=!1;for(var t in Fe)e||(e=!0,h("still waiting on run dependencies:")),h("dependency: "+t);e&&h("(end of list)")}),1e4))):h("warning: run dependency added without ID")}function ve(e){if(me--,o.monitorRunDependencies&&o.monitorRunDependencies(me),e?(x(Fe[e]),delete Fe[e]):h("warning: run dependency removed without ID"),0==me&&(null!==Se&&(clearInterval(Se),Se=null),Ae)){var t=Ae;Ae=null,t()}}function je(e){o.onAbort&&o.onAbort(e),h(e+=""),U=!0,1,e="abort("+e+") at "+Ve();var t=new WebAssembly.RuntimeError(e);throw n(t),t}o.preloadedImages={},o.preloadedAudios={};var Ue={error:function(){je("Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -s FORCE_FILESYSTEM=1")},init:function(){Ue.error()},createDataFile:function(){Ue.error()},createPreloadedFile:function(){Ue.error()},createLazyFile:function(){Ue.error()},open:function(){Ue.error()},mkdev:function(){Ue.error()},registerDevice:function(){Ue.error()},analyzePath:function(){Ue.error()},loadFilesFromDB:function(){Ue.error()},ErrnoError:function(){Ue.error()}};o.FS_createDataFile=Ue.createDataFile,o.FS_createPreloadedFile=Ue.createPreloadedFile;var xe,Ne="data:application/octet-stream;base64,";function He(e){return e.startsWith(Ne)}function ke(e){return e.startsWith("file://")}function Xe(e,t){return function(){var r=e,n=t;return t||(n=o.asm),x(ge,"native function `"+r+"` called before runtime initialization"),x(!Te,"native function `"+r+"` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)"),n[e]||x(n[e],"exported native function `"+r+"` not found"),n[e].apply(null,arguments)}}function Qe(e){try{if(e==xe&&S)return new Uint8Array(S);if(O)return O(e);throw"both async and sync fetching of the wasm failed"}catch(e){je(e)}}function Ce(){if(!S&&(c||d)){if("function"==typeof fetch&&!ke(xe))return fetch(xe,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+xe+"'";return e.arrayBuffer()})).catch((function(){return Qe(xe)}));if(E)return new Promise((function(e,t){E(xe,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return Qe(xe)}))}function Le(){var e={env:gr,wasi_snapshot_preview1:gr};function t(e,t){var r=e.exports;o.asm=r,x(v=o.asm.memory,"memory not found in wasm exports"),ce(v.buffer),x(pe=o.asm.__indirect_function_table,"table not found in wasm exports"),Re(o.asm.__wasm_call_ctors),ve("wasm-instantiate")}Ie("wasm-instantiate");var r=o;function i(e){x(o===r,"the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?"),r=null,t(e.instance)}function a(t){return Ce().then((function(t){return WebAssembly.instantiate(t,e)})).then((function(e){return e})).then(t,(function(e){h("failed to asynchronously prepare wasm: "+e),ke(xe)&&h("warning: Loading from a file URI ("+xe+") is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing"),je(e)}))}if(o.instantiateWasm)try{return o.instantiateWasm(e,t)}catch(e){return h("Module.instantiateWasm callback failed with error: "+e),!1}return(S||"function"!=typeof WebAssembly.instantiateStreaming||He(xe)||ke(xe)||"function"!=typeof fetch?a(i):fetch(xe,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,e).then(i,(function(e){return h("wasm streaming compile failed: "+e),h("falling back to ArrayBuffer instantiation"),a(i)}))}))).catch(n),{}}He(xe="AcuantInitializerService.wasm")||(xe=T(xe));var We={3924:function(){let e=function(e){try{return JSON.parse(e)}catch(e){return}},r=function(r){let n=(""+r).split(".");if(3==n.length){let r=e(atob(n[0])),o=e(atob(n[1])),i=n[2];if(r&&o&&i&&r.kid&&r.alg&&o.sub&&o.iss&&o.exp&&o.iat){let e=Math.floor((new Date).getTime()/1e3);"string"==typeof r.kid&&"string"==typeof r.alg&&"string"==typeof o.sub&&o.sub.length>0&&"string"==typeof o.iss&&"number"==typeof o.exp&&o.exp>e&&"number"==typeof o.iat?t.callback(1):t.callback(5)}else t.callback(4)}else t.callback(3)};const n=t.getCreds(),o=t.getOauthToken(),i=t.getEndpoint();if(o)r(o);else{let o=new XMLHttpRequest;o.open("POST",i+"/oauth/token",!0),o.setRequestHeader("Authorization","Basic "+n),o.setRequestHeader("Content-type","application/json");let a={grant_type:"client_credentials"};o.responseType="text",o.send(JSON.stringify(a)),o.onreadystatechange=function(){if(4===o.readyState)if(200===o.status||204===o.status){let n=e(o.responseText);n&&n.hasOwnProperty("access_token")?r(n.access_token):t.callback(2)}else t.callback(o.status)}}}};function Ge(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var r=t.func;"number"==typeof r?void 0===t.arg?pe.get(r)():pe.get(r)(t.arg):r(void 0===t.arg?null:t.arg)}else t(o)}}function ze(e){return D("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),e}function Ye(e){return e.replace(/\b_Z[\w\d_]+/g,(function(e){var t=ze(e);return e===t?e:t+" ["+e+"]"}))}function Be(){var e=new Error;if(!e.stack){try{throw new Error}catch(t){e=t}if(!e.stack)return"(no stack trace available)"}return e.stack.toString()}function Ve(){var e=Be();return o.extraStackTrace&&(e+="\n"+o.extraStackTrace()),Ye(e)}function Ze(e){return Tr(e+16)+16}function qe(e){this.excPtr=e,this.ptr=e-16,this.set_type=function(e){Z[this.ptr+4>>2]=e},this.get_type=function(){return Z[this.ptr+4>>2]},this.set_destructor=function(e){Z[this.ptr+8>>2]=e},this.get_destructor=function(){return Z[this.ptr+8>>2]},this.set_refcount=function(e){Z[this.ptr>>2]=e},this.set_caught=function(e){e=e?1:0,z[this.ptr+12>>0]=e},this.get_caught=function(){return 0!=z[this.ptr+12>>0]},this.set_rethrown=function(e){e=e?1:0,z[this.ptr+13>>0]=e},this.get_rethrown=function(){return 0!=z[this.ptr+13>>0]},this.init=function(e,t){this.set_type(e),this.set_destructor(t),this.set_refcount(0),this.set_caught(!1),this.set_rethrown(!1)},this.add_ref=function(){var e=Z[this.ptr>>2];Z[this.ptr>>2]=e+1},this.release_ref=function(){var e=Z[this.ptr>>2];return Z[this.ptr>>2]=e-1,x(e>0),1===e}}function Ke(e){this.free=function(){Mr(this.ptr),this.ptr=0},this.set_base_ptr=function(e){Z[this.ptr>>2]=e},this.get_base_ptr=function(){return Z[this.ptr>>2]},this.set_adjusted_ptr=function(e){Z[this.ptr+4>>2]=e},this.get_adjusted_ptr_addr=function(){return this.ptr+4},this.get_adjusted_ptr=function(){return Z[this.ptr+4>>2]},this.get_exception_ptr=function(){if(Sr(this.get_exception_info().get_type()))return Z[this.get_base_ptr()>>2];var e=this.get_adjusted_ptr();return 0!==e?e:this.get_base_ptr()},this.get_exception_info=function(){return new qe(this.get_base_ptr())},void 0===e?(this.ptr=Tr(8),this.set_adjusted_ptr(0)):this.ptr=e}var Je=[];function $e(e){e.add_ref()}function et(e){var t=new Ke(e),r=t.get_exception_info();return r.get_caught()||(r.set_caught(!0)),r.set_rethrown(!1),Je.push(t),$e(r),t.get_exception_ptr()}var tt=0;function rt(e){try{return Mr(new qe(e).ptr)}catch(e){h("exception during cxa_free_exception: "+e)}}function nt(e){if(e.release_ref()&&!e.get_rethrown()){var t=e.get_destructor();t&&pe.get(t)(e.excPtr),rt(e.excPtr)}}function ot(){Rr(0),x(Je.length>0);var e=Je.pop();nt(e.get_exception_info()),e.free(),tt=0}function it(e){var t=new Ke(e),r=t.get_base_ptr();throw tt||(tt=r),t.free(),r}function at(){var e=tt;if(!e)return F(0),0;var t=new qe(e),r=t.get_type(),n=new Ke;if(n.set_base_ptr(e),n.set_adjusted_ptr(e),!r)return F(0),0|n.ptr;for(var o=Array.prototype.slice.call(arguments),i=0;i=gt&&t<=Tt?"_"+e:e}function Dt(e,t){return e=ht(e),new Function("body","return function "+e+'() {\n "use strict"; return body.apply(this, arguments);\n};\n')(t)}function wt(e,t){var r=Dt(t,(function(e){this.name=t,this.message=e;var r=new Error(e).stack;void 0!==r&&(this.stack=this.toString()+"\n"+r.replace(/^Error(:[^\n]*)?\n/,""))}));return r.prototype=Object.create(e.prototype),r.prototype.constructor=r,r.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message},r}var yt=void 0;function bt(e){throw new yt(e)}var Pt=void 0;function Rt(e){throw new Pt(e)}function Mt(e,t,r){function n(t){var n=r(t);n.length!==e.length&&Rt("Mismatched type converter count");for(var o=0;o>i])},destructorFunction:null})}var At=[],Ft=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function It(e){e>4&&0==--Ft[e].refcount&&(Ft[e]=void 0,At.push(e))}function vt(){for(var e=0,t=5;t>2])}function Ht(e,t){mt(e,{name:t=Et(t),fromWireType:function(e){var t=Ft[e].value;return It(e),t},toWireType:function(e,t){return xt(t)},argPackAdvance:8,readValueFromPointer:Nt,destructorFunction:null})}function kt(e){if(null===e)return"null";var t=typeof e;return"object"===t||"array"===t||"function"===t?e.toString():""+e}function Xt(e,t){switch(t){case 2:return function(e){return this.fromWireType(K[e>>2])};case 3:return function(e){return this.fromWireType(J[e>>3])};default:throw new TypeError("Unknown float type: "+e)}}function Qt(e,t,r){var n=pt(r);mt(e,{name:t=Et(t),fromWireType:function(e){return e},toWireType:function(e,t){if("number"!=typeof t&&"boolean"!=typeof t)throw new TypeError('Cannot convert "'+kt(t)+'" to '+this.name);return t},argPackAdvance:8,readValueFromPointer:Xt(t,n),destructorFunction:null})}function Ct(e,t){if(!(e instanceof Function))throw new TypeError("new_ called with constructor type "+typeof e+" which is not a function");var r=Dt(e.name||"unknownFunctionName",(function(){}));r.prototype=e.prototype;var n=new r,o=e.apply(n,t);return o instanceof Object?o:n}function Lt(e){for(;e.length;){var t=e.pop();e.pop()(t)}}function Wt(e,t,r,n,o){var i=t.length;i<2&&bt("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var a=null!==t[1]&&null!==r,s=!1,c=1;c0?", ":"")+u),l+=(d?"var rv = ":"")+"invoker(fn"+(u.length>0?", ":"")+u+");\n",s)l+="runDestructors(destructors);\n";else for(c=a?1:2;c>2)+n]);return r}function Bt(e,t,r){o.hasOwnProperty(e)||Rt("Replacing nonexistant public symbol"),void 0!==o[e].overloadTable&&void 0!==r?o[e].overloadTable[r]=t:(o[e]=t,o[e].argCount=r)}function Vt(e,t,r){x("dynCall_"+e in o,"bad function pointer type - no table for sig '"+e+"'"),r&&r.length?x(r.length===e.substring(1).replace(/j/g,"--").length):x(1==e.length);var n=o["dynCall_"+e];return r&&r.length?n.apply(null,[t].concat(r)):n.call(null,t)}function Zt(e,t,r){return e.includes("j")?Vt(e,t,r):(x(pe.get(t),"missing table entry in dynCall: "+t),pe.get(t).apply(null,r))}function qt(e,t){x(e.includes("j"),"getDynCaller should only be called with i64 sigs");var r=[];return function(){r.length=arguments.length;for(var n=0;n>1]}:function(e){return V[e>>1]};case 2:return r?function(e){return Z[e>>2]}:function(e){return q[e>>2]};default:throw new TypeError("Unknown integer type: "+e)}}function nr(e,t,r,n,o){t=Et(t),-1===o&&(o=4294967295);var i=pt(r),a=function(e){return e};if(0===n){var s=32-8*r;a=function(e){return e<>>s}}var c=t.includes("unsigned");mt(e,{name:t,fromWireType:a,toWireType:function(e,r){if("number"!=typeof r&&"boolean"!=typeof r)throw new TypeError('Cannot convert "'+kt(r)+'" to '+this.name);if(ro)throw new TypeError('Passing a number "'+kt(r)+'" from JS side to C/C++ side to an argument of type "'+t+'", which is outside the valid range ['+n+", "+o+"]!");return c?r>>>0:0|r},argPackAdvance:8,readValueFromPointer:rr(t,i,0!==n),destructorFunction:null})}function or(e,t,r){var n=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][t];function o(e){var t=q,r=t[e>>=2],o=t[e+1];return new n(G,o,r)}mt(e,{name:r=Et(r),fromWireType:o,argPackAdvance:8,readValueFromPointer:o},{ignoreDuplicateRegistrations:!0})}function ir(e,t){var r="std::string"===(t=Et(t));mt(e,{name:t,fromWireType:function(e){var t,n=q[e>>2];if(r)for(var o=e+4,i=0;i<=n;++i){var a=e+4+i;if(i==n||0==Y[a]){var s=Q(o,a-o);void 0===t?t=s:(t+=String.fromCharCode(0),t+=s),o=a+1}}else{var c=new Array(n);for(i=0;i>2]=o,r&&n)L(t,i+4,o+1);else if(n)for(var a=0;a255&&(Mr(i),bt("String has UTF-16 code units that do not fit in 8 bits")),Y[i+4+a]=s}else for(a=0;a>2],a=i(),c=e+4,d=0;d<=o;++d){var p=e+4+d*t;if(d==o||0==a[p>>s]){var u=n(c,p-c);void 0===r?r=u:(r+=String.fromCharCode(0),r+=u),c=p+t}}return Mr(e),r},toWireType:function(e,n){"string"!=typeof n&&bt("Cannot pass non-string to C++ string type "+r);var i=a(n),c=Tr(4+i+t);return q[c>>2]=i>>s,o(n,c+4,i+t),null!==e&&e.push(Mr,c),c},argPackAdvance:8,readValueFromPointer:Nt,destructorFunction:function(e){Mr(e)}})}function sr(e,t){mt(e,{isVoid:!0,name:t=Et(t),argPackAdvance:0,fromWireType:function(){},toWireType:function(e,t){}})}function cr(){je()}var dr=[];function pr(e,t){var r;for(x(Array.isArray(dr)),x(t%16==0),dr.length=0,t>>=2;r=Y[e++];){x(100===r||102===r||105===r);var n=r<105;n&&1&t&&t++,dr.push(n?J[t++>>1]:Z[t]),++t}return dr}function ur(e,t,r){var n=pr(t,r);return We.hasOwnProperty(e)||je("No EM_ASM constant found at address "+e),We[e].apply(null,n)}function lr(e,t,r){Y.copyWithin(e,t,t+r)}function Er(e){try{return v.grow(e-G.byteLength+65535>>>16),ce(v.buffer),1}catch(t){h("emscripten_realloc_buffer: Attempted to grow heap from "+G.byteLength+" bytes to "+e+" bytes, but got error: "+t)}}function Or(e){var t=Y.length;x((e>>>=0)>t);var r=2147483648;if(e>r)return h("Cannot enlarge memory, asked to go up to "+e+" bytes, but the limit is "+"2147483648 bytes!"),!1;for(var n=1;n<=4;n*=2){var o=t*(1+.2/n);o=Math.min(o,e+100663296);var i=Math.min(r,se(Math.max(e,o),65536));if(Er(i))return!0}return h("Failed to grow the heap from "+t+" bytes to "+i+" bytes, not enough memory!"),!1}function fr(){return I()}ut(),yt=o.BindingError=wt(Error,"BindingError"),Pt=o.InternalError=wt(Error,"InternalError"),Ut(),Jt=o.UnboundTypeError=wt(Error,"UnboundTypeError");var _r,gr={__cxa_allocate_exception:Ze,__cxa_begin_catch:et,__cxa_end_catch:ot,__cxa_find_matching_catch_2:at,__cxa_find_matching_catch_3:st,__cxa_free_exception:rt,__cxa_throw:ct,__resumeException:it,_embind_register_bigint:dt,_embind_register_bool:St,_embind_register_emval:Ht,_embind_register_float:Qt,_embind_register_function:tr,_embind_register_integer:nr,_embind_register_memory_view:or,_embind_register_std_string:ir,_embind_register_std_wstring:ar,_embind_register_void:sr,abort:cr,emscripten_asm_const_int:ur,emscripten_memcpy_big:lr,emscripten_resize_heap:Or,getTempRet0:fr,invoke_ii:Ar,invoke_iii:Fr,invoke_v:jr,invoke_vii:Ir,invoke_viii:vr},Tr=(Le(),o.___wasm_call_ctors=Xe("__wasm_call_ctors"),o._getCreds=Xe("getCreds"),o._getOauthToken=Xe("getOauthToken"),o._getEndpoint=Xe("getEndpoint"),o._callback=Xe("callback"),o._initialize_internal=Xe("initialize_internal"),o._initialize=Xe("initialize"),o._initializeWithToken=Xe("initializeWithToken"),o._malloc=Xe("malloc")),hr=o.___getTypeName=Xe("__getTypeName"),Dr=(o.___embind_register_native_and_builtin_types=Xe("__embind_register_native_and_builtin_types"),o.___errno_location=Xe("__errno_location"),o._fflush=Xe("fflush"),o.stackSave=Xe("stackSave")),wr=o.stackRestore=Xe("stackRestore"),yr=o.stackAlloc=Xe("stackAlloc"),br=o._emscripten_stack_init=function(){return(br=o._emscripten_stack_init=o.asm.emscripten_stack_init).apply(null,arguments)},Pr=(o._emscripten_stack_get_free=function(){return(o._emscripten_stack_get_free=o.asm.emscripten_stack_get_free).apply(null,arguments)},o._emscripten_stack_get_end=function(){return(Pr=o._emscripten_stack_get_end=o.asm.emscripten_stack_get_end).apply(null,arguments)}),Rr=o._setThrew=Xe("setThrew"),Mr=o._free=Xe("free"),mr=o.___cxa_can_catch=Xe("__cxa_can_catch"),Sr=o.___cxa_is_pointer_type=Xe("__cxa_is_pointer_type");function Ar(e,t){var r=Dr();try{return pe.get(e)(t)}catch(e){if(wr(r),e!==e+0&&"longjmp"!==e)throw e;Rr(1,0)}}function Fr(e,t,r){var n=Dr();try{return pe.get(e)(t,r)}catch(e){if(wr(n),e!==e+0&&"longjmp"!==e)throw e;Rr(1,0)}}function Ir(e,t,r){var n=Dr();try{pe.get(e)(t,r)}catch(e){if(wr(n),e!==e+0&&"longjmp"!==e)throw e;Rr(1,0)}}function vr(e,t,r,n){var o=Dr();try{pe.get(e)(t,r,n)}catch(e){if(wr(o),e!==e+0&&"longjmp"!==e)throw e;Rr(1,0)}}function jr(e){var t=Dr();try{pe.get(e)()}catch(e){if(wr(t),e!==e+0&&"longjmp"!==e)throw e;Rr(1,0)}}function Ur(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}Object.getOwnPropertyDescriptor(o,"intArrayFromString")||(o.intArrayFromString=function(){je("'intArrayFromString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"intArrayToString")||(o.intArrayToString=function(){je("'intArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),o.ccall=H,Object.getOwnPropertyDescriptor(o,"cwrap")||(o.cwrap=function(){je("'cwrap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"setValue")||(o.setValue=function(){je("'setValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getValue")||(o.getValue=function(){je("'getValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"allocate")||(o.allocate=function(){je("'allocate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"UTF8ArrayToString")||(o.UTF8ArrayToString=function(){je("'UTF8ArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"UTF8ToString")||(o.UTF8ToString=function(){je("'UTF8ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"stringToUTF8Array")||(o.stringToUTF8Array=function(){je("'stringToUTF8Array' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"stringToUTF8")||(o.stringToUTF8=function(){je("'stringToUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"lengthBytesUTF8")||(o.lengthBytesUTF8=function(){je("'lengthBytesUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"stackTrace")||(o.stackTrace=function(){je("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"addOnPreRun")||(o.addOnPreRun=function(){je("'addOnPreRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"addOnInit")||(o.addOnInit=function(){je("'addOnInit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"addOnPreMain")||(o.addOnPreMain=function(){je("'addOnPreMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"addOnExit")||(o.addOnExit=function(){je("'addOnExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"addOnPostRun")||(o.addOnPostRun=function(){je("'addOnPostRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"writeStringToMemory")||(o.writeStringToMemory=function(){je("'writeStringToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"writeArrayToMemory")||(o.writeArrayToMemory=function(){je("'writeArrayToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"writeAsciiToMemory")||(o.writeAsciiToMemory=function(){je("'writeAsciiToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"addRunDependency")||(o.addRunDependency=function(){je("'addRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(o,"removeRunDependency")||(o.removeRunDependency=function(){je("'removeRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(o,"FS_createFolder")||(o.FS_createFolder=function(){je("'FS_createFolder' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"FS_createPath")||(o.FS_createPath=function(){je("'FS_createPath' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(o,"FS_createDataFile")||(o.FS_createDataFile=function(){je("'FS_createDataFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(o,"FS_createPreloadedFile")||(o.FS_createPreloadedFile=function(){je("'FS_createPreloadedFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(o,"FS_createLazyFile")||(o.FS_createLazyFile=function(){je("'FS_createLazyFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(o,"FS_createLink")||(o.FS_createLink=function(){je("'FS_createLink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"FS_createDevice")||(o.FS_createDevice=function(){je("'FS_createDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(o,"FS_unlink")||(o.FS_unlink=function(){je("'FS_unlink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(o,"getLEB")||(o.getLEB=function(){je("'getLEB' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getFunctionTables")||(o.getFunctionTables=function(){je("'getFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"alignFunctionTables")||(o.alignFunctionTables=function(){je("'alignFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerFunctions")||(o.registerFunctions=function(){je("'registerFunctions' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),o.addFunction=m,o.removeFunction=M,Object.getOwnPropertyDescriptor(o,"getFuncWrapper")||(o.getFuncWrapper=function(){je("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"prettyPrint")||(o.prettyPrint=function(){je("'prettyPrint' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"dynCall")||(o.dynCall=function(){je("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getCompilerSetting")||(o.getCompilerSetting=function(){je("'getCompilerSetting' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"print")||(o.print=function(){je("'print' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"printErr")||(o.printErr=function(){je("'printErr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getTempRet0")||(o.getTempRet0=function(){je("'getTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"setTempRet0")||(o.setTempRet0=function(){je("'setTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"callMain")||(o.callMain=function(){je("'callMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"abort")||(o.abort=function(){je("'abort' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"keepRuntimeAlive")||(o.keepRuntimeAlive=function(){je("'keepRuntimeAlive' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"zeroMemory")||(o.zeroMemory=function(){je("'zeroMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"stringToNewUTF8")||(o.stringToNewUTF8=function(){je("'stringToNewUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"setFileTime")||(o.setFileTime=function(){je("'setFileTime' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"emscripten_realloc_buffer")||(o.emscripten_realloc_buffer=function(){je("'emscripten_realloc_buffer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"ENV")||(o.ENV=function(){je("'ENV' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"ERRNO_CODES")||(o.ERRNO_CODES=function(){je("'ERRNO_CODES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"ERRNO_MESSAGES")||(o.ERRNO_MESSAGES=function(){je("'ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"setErrNo")||(o.setErrNo=function(){je("'setErrNo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"inetPton4")||(o.inetPton4=function(){je("'inetPton4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"inetNtop4")||(o.inetNtop4=function(){je("'inetNtop4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"inetPton6")||(o.inetPton6=function(){je("'inetPton6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"inetNtop6")||(o.inetNtop6=function(){je("'inetNtop6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"readSockaddr")||(o.readSockaddr=function(){je("'readSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"writeSockaddr")||(o.writeSockaddr=function(){je("'writeSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"DNS")||(o.DNS=function(){je("'DNS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getHostByName")||(o.getHostByName=function(){je("'getHostByName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"GAI_ERRNO_MESSAGES")||(o.GAI_ERRNO_MESSAGES=function(){je("'GAI_ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"Protocols")||(o.Protocols=function(){je("'Protocols' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"Sockets")||(o.Sockets=function(){je("'Sockets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getRandomDevice")||(o.getRandomDevice=function(){je("'getRandomDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"traverseStack")||(o.traverseStack=function(){je("'traverseStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"UNWIND_CACHE")||(o.UNWIND_CACHE=function(){je("'UNWIND_CACHE' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"withBuiltinMalloc")||(o.withBuiltinMalloc=function(){je("'withBuiltinMalloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"readAsmConstArgsArray")||(o.readAsmConstArgsArray=function(){je("'readAsmConstArgsArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"readAsmConstArgs")||(o.readAsmConstArgs=function(){je("'readAsmConstArgs' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"mainThreadEM_ASM")||(o.mainThreadEM_ASM=function(){je("'mainThreadEM_ASM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"jstoi_q")||(o.jstoi_q=function(){je("'jstoi_q' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"jstoi_s")||(o.jstoi_s=function(){je("'jstoi_s' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getExecutableName")||(o.getExecutableName=function(){je("'getExecutableName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"listenOnce")||(o.listenOnce=function(){je("'listenOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"autoResumeAudioContext")||(o.autoResumeAudioContext=function(){je("'autoResumeAudioContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"dynCallLegacy")||(o.dynCallLegacy=function(){je("'dynCallLegacy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getDynCaller")||(o.getDynCaller=function(){je("'getDynCaller' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"dynCall")||(o.dynCall=function(){je("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"callRuntimeCallbacks")||(o.callRuntimeCallbacks=function(){je("'callRuntimeCallbacks' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"handleException")||(o.handleException=function(){je("'handleException' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"runtimeKeepalivePush")||(o.runtimeKeepalivePush=function(){je("'runtimeKeepalivePush' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"runtimeKeepalivePop")||(o.runtimeKeepalivePop=function(){je("'runtimeKeepalivePop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"callUserCallback")||(o.callUserCallback=function(){je("'callUserCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"maybeExit")||(o.maybeExit=function(){je("'maybeExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"safeSetTimeout")||(o.safeSetTimeout=function(){je("'safeSetTimeout' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"asmjsMangle")||(o.asmjsMangle=function(){je("'asmjsMangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"asyncLoad")||(o.asyncLoad=function(){je("'asyncLoad' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"alignMemory")||(o.alignMemory=function(){je("'alignMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"mmapAlloc")||(o.mmapAlloc=function(){je("'mmapAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"reallyNegative")||(o.reallyNegative=function(){je("'reallyNegative' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"unSign")||(o.unSign=function(){je("'unSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"reSign")||(o.reSign=function(){je("'reSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"formatString")||(o.formatString=function(){je("'formatString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"PATH")||(o.PATH=function(){je("'PATH' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"PATH_FS")||(o.PATH_FS=function(){je("'PATH_FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"SYSCALLS")||(o.SYSCALLS=function(){je("'SYSCALLS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"syscallMmap2")||(o.syscallMmap2=function(){je("'syscallMmap2' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"syscallMunmap")||(o.syscallMunmap=function(){je("'syscallMunmap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getSocketFromFD")||(o.getSocketFromFD=function(){je("'getSocketFromFD' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getSocketAddress")||(o.getSocketAddress=function(){je("'getSocketAddress' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"JSEvents")||(o.JSEvents=function(){je("'JSEvents' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerKeyEventCallback")||(o.registerKeyEventCallback=function(){je("'registerKeyEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"specialHTMLTargets")||(o.specialHTMLTargets=function(){je("'specialHTMLTargets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"maybeCStringToJsString")||(o.maybeCStringToJsString=function(){je("'maybeCStringToJsString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"findEventTarget")||(o.findEventTarget=function(){je("'findEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"findCanvasEventTarget")||(o.findCanvasEventTarget=function(){je("'findCanvasEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getBoundingClientRect")||(o.getBoundingClientRect=function(){je("'getBoundingClientRect' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"fillMouseEventData")||(o.fillMouseEventData=function(){je("'fillMouseEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerMouseEventCallback")||(o.registerMouseEventCallback=function(){je("'registerMouseEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerWheelEventCallback")||(o.registerWheelEventCallback=function(){je("'registerWheelEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerUiEventCallback")||(o.registerUiEventCallback=function(){je("'registerUiEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerFocusEventCallback")||(o.registerFocusEventCallback=function(){je("'registerFocusEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"fillDeviceOrientationEventData")||(o.fillDeviceOrientationEventData=function(){je("'fillDeviceOrientationEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerDeviceOrientationEventCallback")||(o.registerDeviceOrientationEventCallback=function(){je("'registerDeviceOrientationEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"fillDeviceMotionEventData")||(o.fillDeviceMotionEventData=function(){je("'fillDeviceMotionEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerDeviceMotionEventCallback")||(o.registerDeviceMotionEventCallback=function(){je("'registerDeviceMotionEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"screenOrientation")||(o.screenOrientation=function(){je("'screenOrientation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"fillOrientationChangeEventData")||(o.fillOrientationChangeEventData=function(){je("'fillOrientationChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerOrientationChangeEventCallback")||(o.registerOrientationChangeEventCallback=function(){je("'registerOrientationChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"fillFullscreenChangeEventData")||(o.fillFullscreenChangeEventData=function(){je("'fillFullscreenChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerFullscreenChangeEventCallback")||(o.registerFullscreenChangeEventCallback=function(){je("'registerFullscreenChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerRestoreOldStyle")||(o.registerRestoreOldStyle=function(){je("'registerRestoreOldStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"hideEverythingExceptGivenElement")||(o.hideEverythingExceptGivenElement=function(){je("'hideEverythingExceptGivenElement' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"restoreHiddenElements")||(o.restoreHiddenElements=function(){je("'restoreHiddenElements' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"setLetterbox")||(o.setLetterbox=function(){je("'setLetterbox' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"currentFullscreenStrategy")||(o.currentFullscreenStrategy=function(){je("'currentFullscreenStrategy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"restoreOldWindowedStyle")||(o.restoreOldWindowedStyle=function(){je("'restoreOldWindowedStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"softFullscreenResizeWebGLRenderTarget")||(o.softFullscreenResizeWebGLRenderTarget=function(){je("'softFullscreenResizeWebGLRenderTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"doRequestFullscreen")||(o.doRequestFullscreen=function(){je("'doRequestFullscreen' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"fillPointerlockChangeEventData")||(o.fillPointerlockChangeEventData=function(){je("'fillPointerlockChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerPointerlockChangeEventCallback")||(o.registerPointerlockChangeEventCallback=function(){je("'registerPointerlockChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerPointerlockErrorEventCallback")||(o.registerPointerlockErrorEventCallback=function(){je("'registerPointerlockErrorEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"requestPointerLock")||(o.requestPointerLock=function(){je("'requestPointerLock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"fillVisibilityChangeEventData")||(o.fillVisibilityChangeEventData=function(){je("'fillVisibilityChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerVisibilityChangeEventCallback")||(o.registerVisibilityChangeEventCallback=function(){je("'registerVisibilityChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerTouchEventCallback")||(o.registerTouchEventCallback=function(){je("'registerTouchEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"fillGamepadEventData")||(o.fillGamepadEventData=function(){je("'fillGamepadEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerGamepadEventCallback")||(o.registerGamepadEventCallback=function(){je("'registerGamepadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerBeforeUnloadEventCallback")||(o.registerBeforeUnloadEventCallback=function(){je("'registerBeforeUnloadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"fillBatteryEventData")||(o.fillBatteryEventData=function(){je("'fillBatteryEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"battery")||(o.battery=function(){je("'battery' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerBatteryEventCallback")||(o.registerBatteryEventCallback=function(){je("'registerBatteryEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"setCanvasElementSize")||(o.setCanvasElementSize=function(){je("'setCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getCanvasElementSize")||(o.getCanvasElementSize=function(){je("'getCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"polyfillSetImmediate")||(o.polyfillSetImmediate=function(){je("'polyfillSetImmediate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"demangle")||(o.demangle=function(){je("'demangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"demangleAll")||(o.demangleAll=function(){je("'demangleAll' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"jsStackTrace")||(o.jsStackTrace=function(){je("'jsStackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"stackTrace")||(o.stackTrace=function(){je("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getEnvStrings")||(o.getEnvStrings=function(){je("'getEnvStrings' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"checkWasiClock")||(o.checkWasiClock=function(){je("'checkWasiClock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"flush_NO_FILESYSTEM")||(o.flush_NO_FILESYSTEM=function(){je("'flush_NO_FILESYSTEM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"writeI53ToI64")||(o.writeI53ToI64=function(){je("'writeI53ToI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"writeI53ToI64Clamped")||(o.writeI53ToI64Clamped=function(){je("'writeI53ToI64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"writeI53ToI64Signaling")||(o.writeI53ToI64Signaling=function(){je("'writeI53ToI64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"writeI53ToU64Clamped")||(o.writeI53ToU64Clamped=function(){je("'writeI53ToU64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"writeI53ToU64Signaling")||(o.writeI53ToU64Signaling=function(){je("'writeI53ToU64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"readI53FromI64")||(o.readI53FromI64=function(){je("'readI53FromI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"readI53FromU64")||(o.readI53FromU64=function(){je("'readI53FromU64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"convertI32PairToI53")||(o.convertI32PairToI53=function(){je("'convertI32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"convertU32PairToI53")||(o.convertU32PairToI53=function(){je("'convertU32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"uncaughtExceptionCount")||(o.uncaughtExceptionCount=function(){je("'uncaughtExceptionCount' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"exceptionLast")||(o.exceptionLast=function(){je("'exceptionLast' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"exceptionCaught")||(o.exceptionCaught=function(){je("'exceptionCaught' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"ExceptionInfo")||(o.ExceptionInfo=function(){je("'ExceptionInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"CatchInfo")||(o.CatchInfo=function(){je("'CatchInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"exception_addRef")||(o.exception_addRef=function(){je("'exception_addRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"exception_decRef")||(o.exception_decRef=function(){je("'exception_decRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"Browser")||(o.Browser=function(){je("'Browser' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"funcWrappers")||(o.funcWrappers=function(){je("'funcWrappers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getFuncWrapper")||(o.getFuncWrapper=function(){je("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"setMainLoop")||(o.setMainLoop=function(){je("'setMainLoop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"wget")||(o.wget=function(){je("'wget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"FS")||(o.FS=function(){je("'FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"MEMFS")||(o.MEMFS=function(){je("'MEMFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"TTY")||(o.TTY=function(){je("'TTY' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"PIPEFS")||(o.PIPEFS=function(){je("'PIPEFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"SOCKFS")||(o.SOCKFS=function(){je("'SOCKFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"_setNetworkCallback")||(o._setNetworkCallback=function(){je("'_setNetworkCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"tempFixedLengthArray")||(o.tempFixedLengthArray=function(){je("'tempFixedLengthArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"miniTempWebGLFloatBuffers")||(o.miniTempWebGLFloatBuffers=function(){je("'miniTempWebGLFloatBuffers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"heapObjectForWebGLType")||(o.heapObjectForWebGLType=function(){je("'heapObjectForWebGLType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"heapAccessShiftForWebGLHeap")||(o.heapAccessShiftForWebGLHeap=function(){je("'heapAccessShiftForWebGLHeap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"GL")||(o.GL=function(){je("'GL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"emscriptenWebGLGet")||(o.emscriptenWebGLGet=function(){je("'emscriptenWebGLGet' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"computeUnpackAlignedImageSize")||(o.computeUnpackAlignedImageSize=function(){je("'computeUnpackAlignedImageSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"emscriptenWebGLGetTexPixelData")||(o.emscriptenWebGLGetTexPixelData=function(){je("'emscriptenWebGLGetTexPixelData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"emscriptenWebGLGetUniform")||(o.emscriptenWebGLGetUniform=function(){je("'emscriptenWebGLGetUniform' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"webglGetUniformLocation")||(o.webglGetUniformLocation=function(){je("'webglGetUniformLocation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"webglPrepareUniformLocationsBeforeFirstUse")||(o.webglPrepareUniformLocationsBeforeFirstUse=function(){je("'webglPrepareUniformLocationsBeforeFirstUse' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"webglGetLeftBracePos")||(o.webglGetLeftBracePos=function(){je("'webglGetLeftBracePos' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"emscriptenWebGLGetVertexAttrib")||(o.emscriptenWebGLGetVertexAttrib=function(){je("'emscriptenWebGLGetVertexAttrib' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"writeGLArray")||(o.writeGLArray=function(){je("'writeGLArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"AL")||(o.AL=function(){je("'AL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"SDL_unicode")||(o.SDL_unicode=function(){je("'SDL_unicode' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"SDL_ttfContext")||(o.SDL_ttfContext=function(){je("'SDL_ttfContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"SDL_audio")||(o.SDL_audio=function(){je("'SDL_audio' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"SDL")||(o.SDL=function(){je("'SDL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"SDL_gfx")||(o.SDL_gfx=function(){je("'SDL_gfx' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"GLUT")||(o.GLUT=function(){je("'GLUT' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"EGL")||(o.EGL=function(){je("'EGL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"GLFW_Window")||(o.GLFW_Window=function(){je("'GLFW_Window' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"GLFW")||(o.GLFW=function(){je("'GLFW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"GLEW")||(o.GLEW=function(){je("'GLEW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"IDBStore")||(o.IDBStore=function(){je("'IDBStore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"runAndAbortIfError")||(o.runAndAbortIfError=function(){je("'runAndAbortIfError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"emval_handle_array")||(o.emval_handle_array=function(){je("'emval_handle_array' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"emval_free_list")||(o.emval_free_list=function(){je("'emval_free_list' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"emval_symbols")||(o.emval_symbols=function(){je("'emval_symbols' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"init_emval")||(o.init_emval=function(){je("'init_emval' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"count_emval_handles")||(o.count_emval_handles=function(){je("'count_emval_handles' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"get_first_emval")||(o.get_first_emval=function(){je("'get_first_emval' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getStringOrSymbol")||(o.getStringOrSymbol=function(){je("'getStringOrSymbol' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"requireHandle")||(o.requireHandle=function(){je("'requireHandle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"emval_newers")||(o.emval_newers=function(){je("'emval_newers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"craftEmvalAllocator")||(o.craftEmvalAllocator=function(){je("'craftEmvalAllocator' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"emval_get_global")||(o.emval_get_global=function(){je("'emval_get_global' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"emval_methodCallers")||(o.emval_methodCallers=function(){je("'emval_methodCallers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"InternalError")||(o.InternalError=function(){je("'InternalError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"BindingError")||(o.BindingError=function(){je("'BindingError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"UnboundTypeError")||(o.UnboundTypeError=function(){je("'UnboundTypeError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"PureVirtualError")||(o.PureVirtualError=function(){je("'PureVirtualError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"init_embind")||(o.init_embind=function(){je("'init_embind' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"throwInternalError")||(o.throwInternalError=function(){je("'throwInternalError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"throwBindingError")||(o.throwBindingError=function(){je("'throwBindingError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"throwUnboundTypeError")||(o.throwUnboundTypeError=function(){je("'throwUnboundTypeError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"ensureOverloadTable")||(o.ensureOverloadTable=function(){je("'ensureOverloadTable' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"exposePublicSymbol")||(o.exposePublicSymbol=function(){je("'exposePublicSymbol' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"replacePublicSymbol")||(o.replacePublicSymbol=function(){je("'replacePublicSymbol' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"extendError")||(o.extendError=function(){je("'extendError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"createNamedFunction")||(o.createNamedFunction=function(){je("'createNamedFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registeredInstances")||(o.registeredInstances=function(){je("'registeredInstances' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getBasestPointer")||(o.getBasestPointer=function(){je("'getBasestPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerInheritedInstance")||(o.registerInheritedInstance=function(){je("'registerInheritedInstance' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"unregisterInheritedInstance")||(o.unregisterInheritedInstance=function(){je("'unregisterInheritedInstance' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getInheritedInstance")||(o.getInheritedInstance=function(){je("'getInheritedInstance' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getInheritedInstanceCount")||(o.getInheritedInstanceCount=function(){je("'getInheritedInstanceCount' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getLiveInheritedInstances")||(o.getLiveInheritedInstances=function(){je("'getLiveInheritedInstances' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registeredTypes")||(o.registeredTypes=function(){je("'registeredTypes' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"awaitingDependencies")||(o.awaitingDependencies=function(){je("'awaitingDependencies' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"typeDependencies")||(o.typeDependencies=function(){je("'typeDependencies' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registeredPointers")||(o.registeredPointers=function(){je("'registeredPointers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"registerType")||(o.registerType=function(){je("'registerType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"whenDependentTypesAreResolved")||(o.whenDependentTypesAreResolved=function(){je("'whenDependentTypesAreResolved' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"embind_charCodes")||(o.embind_charCodes=function(){je("'embind_charCodes' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"embind_init_charCodes")||(o.embind_init_charCodes=function(){je("'embind_init_charCodes' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"readLatin1String")||(o.readLatin1String=function(){je("'readLatin1String' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getTypeName")||(o.getTypeName=function(){je("'getTypeName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"heap32VectorToArray")||(o.heap32VectorToArray=function(){je("'heap32VectorToArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"requireRegisteredType")||(o.requireRegisteredType=function(){je("'requireRegisteredType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"getShiftFromSize")||(o.getShiftFromSize=function(){je("'getShiftFromSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"integerReadValueFromPointer")||(o.integerReadValueFromPointer=function(){je("'integerReadValueFromPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"enumReadValueFromPointer")||(o.enumReadValueFromPointer=function(){je("'enumReadValueFromPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"floatReadValueFromPointer")||(o.floatReadValueFromPointer=function(){je("'floatReadValueFromPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"simpleReadValueFromPointer")||(o.simpleReadValueFromPointer=function(){je("'simpleReadValueFromPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"runDestructors")||(o.runDestructors=function(){je("'runDestructors' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"new_")||(o.new_=function(){je("'new_' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"craftInvokerFunction")||(o.craftInvokerFunction=function(){je("'craftInvokerFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"embind__requireFunction")||(o.embind__requireFunction=function(){je("'embind__requireFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"tupleRegistrations")||(o.tupleRegistrations=function(){je("'tupleRegistrations' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"structRegistrations")||(o.structRegistrations=function(){je("'structRegistrations' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"genericPointerToWireType")||(o.genericPointerToWireType=function(){je("'genericPointerToWireType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"constNoSmartPtrRawPointerToWireType")||(o.constNoSmartPtrRawPointerToWireType=function(){je("'constNoSmartPtrRawPointerToWireType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"nonConstNoSmartPtrRawPointerToWireType")||(o.nonConstNoSmartPtrRawPointerToWireType=function(){je("'nonConstNoSmartPtrRawPointerToWireType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"init_RegisteredPointer")||(o.init_RegisteredPointer=function(){je("'init_RegisteredPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"RegisteredPointer")||(o.RegisteredPointer=function(){je("'RegisteredPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"RegisteredPointer_getPointee")||(o.RegisteredPointer_getPointee=function(){je("'RegisteredPointer_getPointee' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"RegisteredPointer_destructor")||(o.RegisteredPointer_destructor=function(){je("'RegisteredPointer_destructor' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"RegisteredPointer_deleteObject")||(o.RegisteredPointer_deleteObject=function(){je("'RegisteredPointer_deleteObject' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"RegisteredPointer_fromWireType")||(o.RegisteredPointer_fromWireType=function(){je("'RegisteredPointer_fromWireType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"runDestructor")||(o.runDestructor=function(){je("'runDestructor' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"releaseClassHandle")||(o.releaseClassHandle=function(){je("'releaseClassHandle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"finalizationGroup")||(o.finalizationGroup=function(){je("'finalizationGroup' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"detachFinalizer_deps")||(o.detachFinalizer_deps=function(){je("'detachFinalizer_deps' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"detachFinalizer")||(o.detachFinalizer=function(){je("'detachFinalizer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"attachFinalizer")||(o.attachFinalizer=function(){je("'attachFinalizer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"makeClassHandle")||(o.makeClassHandle=function(){je("'makeClassHandle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"init_ClassHandle")||(o.init_ClassHandle=function(){je("'init_ClassHandle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"ClassHandle")||(o.ClassHandle=function(){je("'ClassHandle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"ClassHandle_isAliasOf")||(o.ClassHandle_isAliasOf=function(){je("'ClassHandle_isAliasOf' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"throwInstanceAlreadyDeleted")||(o.throwInstanceAlreadyDeleted=function(){je("'throwInstanceAlreadyDeleted' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"ClassHandle_clone")||(o.ClassHandle_clone=function(){je("'ClassHandle_clone' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"ClassHandle_delete")||(o.ClassHandle_delete=function(){je("'ClassHandle_delete' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"deletionQueue")||(o.deletionQueue=function(){je("'deletionQueue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"ClassHandle_isDeleted")||(o.ClassHandle_isDeleted=function(){je("'ClassHandle_isDeleted' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"ClassHandle_deleteLater")||(o.ClassHandle_deleteLater=function(){je("'ClassHandle_deleteLater' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"flushPendingDeletes")||(o.flushPendingDeletes=function(){je("'flushPendingDeletes' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"delayFunction")||(o.delayFunction=function(){je("'delayFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"setDelayFunction")||(o.setDelayFunction=function(){je("'setDelayFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"RegisteredClass")||(o.RegisteredClass=function(){je("'RegisteredClass' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"shallowCopyInternalPointer")||(o.shallowCopyInternalPointer=function(){je("'shallowCopyInternalPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"downcastPointer")||(o.downcastPointer=function(){je("'downcastPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"upcastPointer")||(o.upcastPointer=function(){je("'upcastPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"validateThis")||(o.validateThis=function(){je("'validateThis' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"char_0")||(o.char_0=function(){je("'char_0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"char_9")||(o.char_9=function(){je("'char_9' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"makeLegalFunctionName")||(o.makeLegalFunctionName=function(){je("'makeLegalFunctionName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"warnOnce")||(o.warnOnce=function(){je("'warnOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"stackSave")||(o.stackSave=function(){je("'stackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"stackRestore")||(o.stackRestore=function(){je("'stackRestore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"stackAlloc")||(o.stackAlloc=function(){je("'stackAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"AsciiToString")||(o.AsciiToString=function(){je("'AsciiToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"stringToAscii")||(o.stringToAscii=function(){je("'stringToAscii' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"UTF16ToString")||(o.UTF16ToString=function(){je("'UTF16ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"stringToUTF16")||(o.stringToUTF16=function(){je("'stringToUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"lengthBytesUTF16")||(o.lengthBytesUTF16=function(){je("'lengthBytesUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"UTF32ToString")||(o.UTF32ToString=function(){je("'UTF32ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"stringToUTF32")||(o.stringToUTF32=function(){je("'stringToUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"lengthBytesUTF32")||(o.lengthBytesUTF32=function(){je("'lengthBytesUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"allocateUTF8")||(o.allocateUTF8=function(){je("'allocateUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(o,"allocateUTF8OnStack")||(o.allocateUTF8OnStack=function(){je("'allocateUTF8OnStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),o.writeStackCookie=le,o.checkStackCookie=Ee,Object.getOwnPropertyDescriptor(o,"ALLOC_NORMAL")||Object.defineProperty(o,"ALLOC_NORMAL",{configurable:!0,get:function(){je("'ALLOC_NORMAL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}}),Object.getOwnPropertyDescriptor(o,"ALLOC_STACK")||Object.defineProperty(o,"ALLOC_STACK",{configurable:!0,get:function(){je("'ALLOC_STACK' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}});function xr(){br(),le()}function Nr(e){function t(){_r||(_r=!0,o.calledRun=!0,U||(ye(),r(o),o.onRuntimeInitialized&&o.onRuntimeInitialized(),x(!o._main,'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'),be()))}e=e||s,me>0||(xr(),we(),me>0||(o.setStatus?(o.setStatus("Running..."),setTimeout((function(){setTimeout((function(){o.setStatus("")}),1),t()}),1)):t(),Ee()))}if(Ae=function e(){_r||Nr(),_r||(Ae=e)},o.run=Nr,o.preInit)for("function"==typeof o.preInit&&(o.preInit=[o.preInit]);o.preInit.length>0;)o.preInit.pop()();return Nr(),t.ready}}();"object"==typeof exports&&"object"==typeof module?module.exports=AcuantInitializerModule:"function"==typeof define&&define.amd?define([],(function(){return AcuantInitializerModule})):"object"==typeof exports&&(exports.AcuantInitializerModule=AcuantInitializerModule); \ No newline at end of file diff --git a/public/acuant/11.9.3/AcuantInitializerService.wasm b/public/acuant/11.9.3/AcuantInitializerService.wasm new file mode 100644 index 00000000000..a11449fafd8 Binary files /dev/null and b/public/acuant/11.9.3/AcuantInitializerService.wasm differ diff --git a/public/acuant/11.9.3/AcuantInitializerWorker.min.js b/public/acuant/11.9.3/AcuantInitializerWorker.min.js new file mode 100644 index 00000000000..dd7f1fd9278 --- /dev/null +++ b/public/acuant/11.9.3/AcuantInitializerWorker.min.js @@ -0,0 +1 @@ +"use strict";importScripts("AcuantInitializerService.min.js"),AcuantInitializerModule().then((i=>{let e=i.addFunction(n,"vi");function n(i){postMessage({func:"initialize",status:i})}onmessage=t=>{if(t&&t.data)if("initialize"===t.data.func){let a=t.data.data;a.creds&&a.endpoint?i.ccall("initialize",null,["string","string","number"],[a.creds,a.endpoint,e]):(console.error("missing params"),n(6))}else if("initializeWithToken"===t.data.func){let a=t.data.data;a.token&&a.endpoint?i.ccall("initializeWithToken",null,["string","string","number"],[a.token,a.endpoint,e]):(console.error("missing params"),n(6))}else console.error("called with no func specified"),n(7)},postMessage({initializerWorker:"started"})})); \ No newline at end of file diff --git a/public/acuant/11.9.3/AcuantJavascriptWebSdk.min.js b/public/acuant/11.9.3/AcuantJavascriptWebSdk.min.js new file mode 100644 index 00000000000..59d36e77e39 --- /dev/null +++ b/public/acuant/11.9.3/AcuantJavascriptWebSdk.min.js @@ -0,0 +1 @@ +var AcuantConfig=function(){"use strict";return{acuantVersion:"11.9.3"}}();let config={};"undefined"!=typeof acuantConfig&&0!==Object.keys(acuantConfig).length&&acuantConfig.constructor===Object&&(config=acuantConfig),document.addEventListener("DOMContentLoaded",(function(){void 0===AcuantJavascriptWebSdk&&loadAcuantSdk(),document.removeEventListener("DOMContentLoaded",this)}));var AcuantJavascriptWebSdk=void 0;function loadAcuantSdk(){AcuantJavascriptWebSdk=function(e){let t={ACUANT_IMAGE_WORKER:"AcuantImageWorker",ACUANT_METRICS_WORKER:"AcuantMetricsWorker",SEQUENCE_BREAK_CODE:"sequence-break",START_FAIL_CODE:"start-fail",REPEAT_FAIL_CODE:"repeat-fail",HEIC_NOT_SUPPORTED_CODE:"heic-not-supported",BARCODE_READER_ID:"acuant-barcode-reader",singleWorkerModel:!1,startInitializer:function(n,a=0){if(!n)return void M("startInitializer did not have a user callback set");if(y)return;L=1==a,T(i,n);let r=null;e&&e.cdnPath&&e.cdnPath.initializerUrl?r=e.cdnPath.initializerUrl:e.path&&(r=e.path),y=new Worker(O(r,"AcuantInitializerWorker.min.js",a)),y.onmessage=w,function(){if(document.getElementById(t.BARCODE_READER_ID))return;const e=document.createElement("div");e.id=t.BARCODE_READER_ID,e.style.display="none",document.body.appendChild(e)}()},endInitializer:function(){y&&(y.terminate(),y.onmessage=null,g=!1,y=null)},startImageWorker:function(e){e?S?e():(T(a,e),I(L?1:0)):M("startImageWorker did not have a user callback set")},startMetricsWorker:function(e){e?R?e():(T(r,e),b(L?1:0)):M("startMetricsWorker did not have a user callback set")},endImageWorker:function(){S.terminate(),S.onmessage=null,P=!1,S=null},endMetricsWorker:function(){R.terminate(),R.onmessage=null,C=!1,R=null},start:function(e,t=!1){if(!e)return void M("start did not have a user callback set");const i=L?1:0;this.singleWorkerModel=t,T(n,e),this.singleWorkerModel?S||I(i):(S||I(i),R||b(i))},end:function(){S&&this.endImageWorker(),R&&this.endMetricsWorker()},startWorkers:function(e,t=[this.ACUANT_IMAGE_WORKER,this.ACUANT_METRICS_WORKER],i=0){e?(T(n,e),t.includes(this.ACUANT_IMAGE_WORKER)&&!S&&I(i),t.includes(this.ACUANT_METRICS_WORKER)&&!R&&b(i)):M("startWorkers did not have a user callback set")},endWorkers:function(e=[this.ACUANT_IMAGE_WORKER,this.ACUANT_METRICS_WORKER]){e.includes(this.ACUANT_IMAGE_WORKER)&&S&&(S.terminate(),S.onmessage=null,P=!1,S=null),e.includes(this.ACUANT_METRICS_WORKER)&&R&&(R.terminate(),R.onmessage=null,C=!1,R=null)},initialize:function(e,t,i,n=0){i?(T(o,i),y?B(y,"initialize",{creds:e,endpoint:t}):this.startInitializer((()=>{B(y,"initialize",{creds:e,endpoint:t})}),n)):M("initialize did not have a user callback set")},initializeWithToken:function(e,t,i,n=0){i?(T(o,i),y?B(y,"initializeWithToken",{token:e,endpoint:t}):this.startInitializer((()=>{B(y,"initializeWithToken",{token:e,endpoint:t})}),n)):M("initializeWithToken did not have a user callback set")},crop:function(e,t,i,n){h?n?P&&null!=e?(T(l,n),B(S,"crop",{imgData:e.data,width:t,height:i})):n.onFail():M("crop did not have a user callback set"):M("SDK was not initialized")},detect:function(e,t,i,n){h?n?P&&null!=e?(T(s,n),B(S,"detect",{imgData:e.data,width:t,height:i})):n.onFail():M("detect did not have a user callback set"):M("SDK was not initialized")},metrics:function(e,t,i,n){h?n?C&&null!=e?(T(m,n),B(R,"metrics",{imgData:e.data,width:t,height:i})):n.onFail():M("metrics did not have a user callback set"):M("SDK was not initialized")},moire:function(e,t,i,n){h?n?C&&null!=e?(T(c,n),B(R,"moire",{imgData:e.data,width:t,height:i})):n.onFail():M("moire did not have a user callback set"):M("SDK was not initialized")},sign:function(e,t){h?t?P&&e?(T(p,t),B(S,"sign",{imgData:e})):t.onFail():M("sign did not have a user callback set"):M("SDK was not initialized")},verify:function(e,t){h?t?P&&e?(T(u,t),B(S,"verify",{imgData:e})):t.onFail():M("verify did not have a user callback set"):M("SDK was not initialized")},getCvmlVersion:function(e){h?e?P?(T(d,e),B(S,d)):e.onFail():M("verify did not have a user callback set"):M("SDK was not initialized")},addMetadata:function(e,{make:t=navigator.platform,model:i=navigator.userAgent,software:n="Acuant JavascriptWeb SDK "+AcuantConfig.acuantVersion,imageDescription:a=null,dateTimeOriginal:r,userComment:o="=".repeat(100)}){if(!h)return void M("SDK was not initialized");let l={},s={};l[piexif.ImageIFD.Make]=t,l[piexif.ImageIFD.Model]=i,l[piexif.ImageIFD.Software]=n,a&&(l[piexif.ImageIFD.ImageDescription]=a),s[piexif.ExifIFD.DateTimeOriginal]=r,s[piexif.ExifIFD.UserComment]=o;let m={"0th":l,Exif:s},c=piexif.dump(m);return piexif.insert(c,e)},setUnexpectedErrorCallback:function(e){T(f,e)}};const i="initStart",n="workersStart",a="imageWorkerStart",r="metricsWorkerStart",o="init",l="crop",s="detect",m="metrics",c="moire",p="sign",u="verify",d="getCvmlVersion",f="unexpectedError";let h=!1,y=null,g=!1,S=null,P=!1,R=null,C=!1,A=0,k={},D={},L=!1;function I(t=0){let i=null;e&&e.cdnPath&&e.cdnPath.imageUrl?i=e.cdnPath.imageUrl:e.path&&(i=e.path),A++,S=new Worker(O(i,"AcuantImageWorker.min.js",t)),S.onmessage=E,S.onerror=function(){M("imageWorker has failed")}}function b(t=0){let i=null;e&&e.cdnPath&&e.cdnPath.metricsUrl?i=e.cdnPath.metricsUrl:e.path&&(i=e.path),A++,R=new Worker(O(i,"AcuantMetricsWorker.min.js",t)),R.onmessage=x,R.onerror=function(){M("metricsWorker has failed")}}function w(e){if(h=!1,e){let n=e.data;if(g)if(n&&"initialize"===n.func){let e=n.status,i=k[o];t.endInitializer(),i?1==e?(h=!0,i.onSuccess()):i.onFail(e,function(e){switch(e){case 401:return"Server returned a 401 (missing credentials).";case 403:return"Server returned a 403 (invalid credentials).";case 400:return"Server returned a 400.";case 2:return"Token Validation Failed (Recieved token, but token was null/corrupt).";case 3:return"Token Validation Failed (Recieved token, but token was missing part of body).";case 4:return"Token Validation Failed (Recieved token, but token body was missing fields).";case 5:return"Token Validation Failed (Recieved token, but token body failed validation).";case 6:return"At least one param was null/invalid.";case 7:return"Incorrectly formatted message to worker.";default:return"Unexpected error code."}}(e)):M("initialize did not have a user callback set")}else M("initworker sent message without correct function tagging");else{g=!0;let e=k[i];e&&e()}}else M("initworker sent message without anything in the body")}function E(e){if(e){let t=e.data;if(P)if(t&&"detect"===t.func){const e=k[s];e?t.type&&t.x1&&t.y1&&t.x2&&t.y2&&t.x3&&t.y3&&t.x4&&t.y4?function(e,t,i,n,a,r,o,l,s,m){if(m)if(-1==e)m.onFail();else{let c=function(e,t,i,n,a,r,o,l){let s={x:e,y:t},m={x:i,y:n},c={x:a,y:r},p={x:o,y:l},u=G(s,m),d=G(m,c),f=G(c,p),h=G(p,s),y=(u+f)/2,g=(d+h)/2;return y>g?{width:y,height:g}:{width:g,height:y}}(t,i,n,a,r,o,l,s),p=function(e,t){let i=!1,n=5,a=1.42,r=1.5887;if(2==t){let t=(100+n)/100*a;e>=(100-n)/100*a&&e<=t&&(i=!0)}else if(1==t){let t=(100+n)/100*r;e>=(100-n)/100*r&&e<=t&&(i=!0)}return i}(c.width/c.height,e),u=F(c.width,c.height,2==e),d=function(e){let t=[-1,-1,-1,-1];e&&4===e.length&&(v(t,e[0],e[2]),v(t,e[1],e[3]));return t}([{x:t,y:i},{x:n,y:a},{x:r,y:o},{x:l,y:s}]);m.onSuccess({type:e,dimensions:c,dpi:u,isCorrectAspectRatio:p,points:d})}}(t.type,t.x1,t.y1,t.x2,t.y2,t.x3,t.y3,t.x4,t.y4,e):e.onFail():M("detect did not have a user callback set")}else if(t&&"crop"===t.func){const e=k[l];e?t.imgData&&t.width&&t.height&&t.type?function(e,t,i,n,a){a&&(null!=e&&t>=0&&i>=0&&n>=0?(D={image:{data:e,width:t,height:i},cardType:n,dpi:F(t,i,2==n)},a.onSuccess(D)):a.onFail())}(t.imgData,t.width,t.height,t.type,e):t.error?e.onFail(t.error):e.onFail():M("crop did not have a user callback set")}else if(t&&"sign"===t.func){const e=k[p];e?t.imgData?function(e,t){t&&(e?t.onSuccess(e):t.onFail())}(t.imgData,e):t.error?e.onFail(t.error):e.onFail():M("sign did not have a user callback set")}else if(t&&"verify"===t.func){const e=k[u];e?t.result||!1===t.result?function(e,t){t&&(e||!1===e?t.onSuccess(e):t.onFail())}(t.result,e):e.onFail():M("verify did not have a user callback set")}else if(t&&t.func===d){let e=k[d];e?function(e,t){e?t.onSuccess(e):t.onFail()}(t.cvmlVersion,e):M("getCvmlVersion did not have a user callback set")}else M("imageworker sent message without correct function tagging");else P=!0,_()}else M("imageworker sent message without anything in the body")}function x(e){if(e){let t=e.data;if(C)if(t&&"metrics"===t.func){const e=k[m];e?t.sharpness&&t.glare?function(e,t,i){if(i)if(t>=0&&e>=0){let n=Math.floor(100*e),a=Math.floor(100*t);i.onSuccess(n,a)}else i.onFail()}(t.sharpness,t.glare,e):t.error?e.onFail(t.error):e.onFail():M("metrics did not have a user callback set")}else if("moire"===t.func){const e=k[c];e?t.moire&&t.moireraw?function(e,t,i){if(i)if(e>=0&&t>=0){let n=Math.floor(100*e),a=Math.floor(100*t);i.onSuccess(n,a)}else i.onFail()}(t.moire,t.moireraw,e):t.error?e.onFail(t.error):e.onFail():M("moire did not have a user callback set")}else M("metricsworker sent message without correct function tagging");else C=!0,_()}else M("metricsworker sent message without anything in the body")}function v(e,t,i){return t.xi.x&&t.y>i.y?(e[0]=i,e[2]=t):t.x>i.x&&t.yt?e:t,a=i?4.92:3.37;return Math.round(n/a)}function T(e,t){k[e]=t}function M(e){let t=k[f];t?e?t(e):t():console.error("Error: ",e)}function O(e,t,i){let n;return null!=e&&e.length>0&&0==i?(n="/"===e.charAt(e.length-1)?e:e+"/",n+=t):n=0!=i?e:t,n}function B(e,t,i,n=!1){let a={func:t,data:i};n&&i&&i.imgData&&i.imgData.buffer?e.postMessage(a,[a.data.imgData.buffer]):e.postMessage(a)}function _(){const e=k[n],t=k[a],i=k[r];--A,0==A&&(e?(T(n,null),e()):t?(T(a,null),t()):i&&(T(r,null),i()))}return t}(config),"function"==typeof onAcuantSdkLoaded&&onAcuantSdkLoaded()}!function(){"use strict";let e={};function t(e){return m(">"+p("B",e.length),e)}function i(e){return m(">"+p("H",e.length),e)}function n(e){return m(">"+p("L",e.length),e)}function a(e,a,r){let o,l,s,c,u="",d="";if("Byte"==a)o=e.length,o<=4?d=t(e)+p("\0",4-o):(d=m(">L",[r]),u=t(e));else if("Short"==a)o=e.length,o<=2?d=i(e)+p("\0\0",2-o):(d=m(">L",[r]),u=i(e));else if("Long"==a)o=e.length,o<=1?d=n(e):(d=m(">L",[r]),u=n(e));else if("Ascii"==a)l=e+"\0",o=l.length,o>4?(d=m(">L",[r]),u=l):d=l+p("\0",4-o);else if("Rational"==a){if("number"==typeof e[0])o=1,s=e[0],c=e[1],l=m(">L",[s])+m(">L",[c]);else{o=e.length,l="";for(var f=0;fL",[s])+m(">L",[c])}d=m(">L",[r]),u=l}else if("SRational"==a){if("number"==typeof e[0])o=1,s=e[0],c=e[1],l=m(">l",[s])+m(">l",[c]);else{o=e.length,l="";for(f=0;fl",[s])+m(">l",[c])}d=m(">L",[r]),u=l}else"Undefined"==a&&(o=e.length,o>4?(d=m(">L",[r]),u=e):d=e+p("\0",4-o));return[m(">L",[o]),d,u]}function r(e,t,i){let n,r=Object.keys(e).length,o=m(">H",[r]);n=["0th","1st"].indexOf(t)>-1?2+12*r+4:2+12*r;let l="",s="";for(var c in e){if("string"==typeof c&&(c=parseInt(c)),"0th"==t&&[34665,34853].indexOf(c)>-1)continue;if("Exif"==t&&40965==c)continue;if("1st"==t&&[513,514].indexOf(c)>-1)continue;let r=e[c],o=m(">H",[c]),p=f[t][c].type,u=m(">H",[d[p]]);"number"==typeof r&&(r=[r]);let h=a(r,p,8+n+i+s.length);l+=o+u+h[0]+h[1],s+=h[2]}return[o+l,s]}function o(e){let t,i;if("ÿØ"==e.slice(0,2))t=u(e),i=function(e){let t;for(let i=0;i-1)this.tiftag=e;else{if("Exif"!=e.slice(0,4))throw new Error("Given file is neither JPEG nor TIFF.");this.tiftag=e.slice(6)}}if(e.version="1.0.4",e.remove=function(e){let t=!1;if("ÿØ"==e.slice(0,2));else{if("data:image/jpeg;base64,"!=e.slice(0,23)&&"data:image/jpg;base64,"!=e.slice(0,22))throw new Error("Given data is not jpeg.");e=s(e.split(",")[1]),t=!0}let i=u(e).filter((function(e){return!("ÿá"==e.slice(0,2)&&"Exif\0\0"==e.slice(4,10))})).join("");return t&&(i="data:image/jpeg;base64,"+l(i)),i},e.insert=function(e,t){let i=!1;if("Exif\0\0"!=e.slice(0,6))throw new Error("Given data is not exif.");if("ÿØ"==t.slice(0,2));else{if("data:image/jpeg;base64,"!=t.slice(0,23)&&"data:image/jpg;base64,"!=t.slice(0,22))throw new Error("Given data is not jpeg.");t=s(t.split(",")[1]),i=!0}let n="ÿá"+m(">H",[e.length+2])+e,a=function(e,t){let i=!1,n=[];e.forEach((function(a,r){"ÿá"==a.slice(0,2)&&"Exif\0\0"==a.slice(4,10)&&(i?n.unshift(r):(e[r]=t,i=!0))})),n.forEach((function(t){e.splice(t,1)})),!i&&t&&(e=[e[0],t].concat(e.slice(1)));return e.join("")}(u(t),n);return i&&(a="data:image/jpeg;base64,"+l(a)),a},e.load=function(e){let t;if("string"!=typeof e)throw new Error("'load' gots invalid type argument.");if("ÿØ"==e.slice(0,2))t=e;else if("data:image/jpeg;base64,"==e.slice(0,23)||"data:image/jpg;base64,"==e.slice(0,22))t=s(e.split(",")[1]);else{if("Exif"!=e.slice(0,4))throw new Error("'load' gots invalid file data.");t=e.slice(6)}let i={"0th":{},Exif:{},GPS:{},Interop:{},"1st":{},thumbnail:null},n=new o(t);if(null===n.tiftag)return i;"II"==n.tiftag.slice(0,2)?n.endian_mark="<":n.endian_mark=">";let a=c(n.endian_mark+"L",n.tiftag.slice(4,8))[0];i["0th"]=n.get_ifd(a,"0th");let r=i["0th"].first_ifd_pointer;if(delete i["0th"].first_ifd_pointer,34665 in i["0th"]&&(a=i["0th"][34665],i.Exif=n.get_ifd(a,"Exif")),34853 in i["0th"]&&(a=i["0th"][34853],i.GPS=n.get_ifd(a,"GPS")),40965 in i.Exif&&(a=i.Exif[40965],i.Interop=n.get_ifd(a,"Interop")),"\0\0\0\0"!=r&&(a=c(n.endian_mark+"L",r)[0],i["1st"]=n.get_ifd(a,"1st"),513 in i["1st"]&&514 in i["1st"])){let e=i["1st"][513]+i["1st"][514],t=n.tiftag.slice(i["1st"][513],e);i.thumbnail=t}return i},e.dump=function(t){let i=(n=t,JSON.parse(JSON.stringify(n)));var n;let a,o,l,s,c,p=!1,f=!1,h=!1,y=!1;a="0th"in i?i["0th"]:{},"Exif"in i&&Object.keys(i.Exif).length||"Interop"in i&&Object.keys(i.Interop).length?(a[34665]=1,p=!0,o=i.Exif,"Interop"in i&&Object.keys(i.Interop).length?(o[40965]=1,h=!0,l=i.Interop):Object.keys(o).indexOf(e.ExifIFD.InteroperabilityTag.toString())>-1&&delete o[40965]):Object.keys(a).indexOf(e.ImageIFD.ExifTag.toString())>-1&&delete a[34665],"GPS"in i&&Object.keys(i.GPS).length?(a[e.ImageIFD.GPSTag]=1,f=!0,s=i.GPS):Object.keys(a).indexOf(e.ImageIFD.GPSTag.toString())>-1&&delete a[e.ImageIFD.GPSTag],"1st"in i&&"thumbnail"in i&&null!=i.thumbnail&&(y=!0,i["1st"][513]=1,i["1st"][514]=1,c=i["1st"]);let g,S,P,R,C,A=r(a,"0th",0),k=A[0].length+12*p+12*f+4+A[1].length,D="",L=0,I="",b=0,w="",E=0,x="";(p&&(g=r(o,"Exif",k),L=g[0].length+12*h+g[1].length),f&&(S=r(s,"GPS",k+L),I=S.join(""),b=I.length),h)&&(P=r(l,"Interop",k+L+b),w=P.join(""),E=w.length);if(y&&(R=r(c,"1st",k+L+b+E),C=function(e){let t=u(e);for(;"ÿà"<=t[1].slice(0,2)&&t[1].slice(0,2)<="ÿï";)t=[t[0]].concat(t.slice(2));return t.join("")}(i.thumbnail),C.length>64e3))throw new Error("Given thumbnail is too large. max 64kB");let v="",G="",F="",T="\0\0\0\0";if(p){var M=m(">L",[O=8+k]);v=m(">H",[34665])+m(">H",[d.Long])+m(">L",[1])+M}if(f){M=m(">L",[O=8+k+L]);G=m(">H",[34853])+m(">H",[d.Long])+m(">L",[1])+M}if(h){M=m(">L",[O=8+k+L+b]);F=m(">H",[40965])+m(">H",[d.Long])+m(">L",[1])+M}if(y){var O;T=m(">L",[O=8+k+L+b+E]);let e="\0\0\0\0"+m(">L",[O+R[0].length+24+4+R[1].length]),t="\0\0\0\0"+m(">L",[C.length]);x=R[0]+e+t+"\0\0\0\0"+R[1]+C}let B=A[0]+v+G+T+A[1];return p&&(D=g[0]+F+g[1]),"Exif\0\0MM\0*\0\0\0\b"+B+D+I+w+x},o.prototype={get_ifd:function(e,t){let i,n={},a=c(this.endian_mark+"H",this.tiftag.slice(e,e+2))[0],r=e+2;i=["0th","1st"].indexOf(t)>-1?"Image":t;for(let t=0;t4?(t=c(this.endian_mark+"L",r)[0],i=c(this.endian_mark+p("B",a),this.tiftag.slice(t,t+a))):i=c(this.endian_mark+p("B",a),r.slice(0,a));else if(2==n)a>4?(t=c(this.endian_mark+"L",r)[0],i=this.tiftag.slice(t,t+a-1)):i=r.slice(0,a-1);else if(3==n)a>2?(t=c(this.endian_mark+"L",r)[0],i=c(this.endian_mark+p("H",a),this.tiftag.slice(t,t+2*a))):i=c(this.endian_mark+p("H",a),r.slice(0,2*a));else if(4==n)a>1?(t=c(this.endian_mark+"L",r)[0],i=c(this.endian_mark+p("L",a),this.tiftag.slice(t,t+4*a))):i=c(this.endian_mark+p("L",a),r);else if(5==n)if(t=c(this.endian_mark+"L",r)[0],a>1){i=[];for(var o=0;o4?(t=c(this.endian_mark+"L",r)[0],i=this.tiftag.slice(t,t+a)):i=r.slice(0,a);else if(9==n)a>1?(t=c(this.endian_mark+"L",r)[0],i=c(this.endian_mark+p("l",a),this.tiftag.slice(t,t+4*a))):i=c(this.endian_mark+p("l",a),r);else{if(10!=n)throw new Error("Exif might be wrong. Got incorrect value type to decode. type:"+n);if(t=c(this.endian_mark+"L",r)[0],a>1){i=[];for(o=0;o>2,r=(3&t)<<4|i>>4,o=(15&i)<<2|n>>6,l=63&n,isNaN(i)?o=l=64:isNaN(n)&&(l=64),s=s+c.charAt(a)+c.charAt(r)+c.charAt(o)+c.charAt(l);return s};if("undefined"!=typeof window&&"function"==typeof window.atob)var s=window.atob;if(void 0===s)s=function(e){let t,i,n,a,r,o,l,s="",m=0,c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";for(e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");m>4,i=(15&r)<<4|o>>2,n=(3&o)<<6|l,s+=String.fromCharCode(t),64!=o&&(s+=String.fromCharCode(i)),64!=l&&(s+=String.fromCharCode(n));return s};function m(e,t){if(!(t instanceof Array))throw new Error("'pack' error. Got invalid type argument.");if(e.length-1!=t.length)throw new Error("'pack' error. "+(e.length-1)+" marks, "+t.length+" elements.");let i;if("<"==e[0])i=!0;else{if(">"!=e[0])throw new Error("");i=!1}let n="",a=1,r=null,o=null,l=null;for(;o=e[a];){if("b"==o.toLowerCase()){if(r=t[a-1],"b"==o&&r<0&&(r+=256),r>255||r<0)throw new Error("'pack' error.");l=String.fromCharCode(r)}else if("H"==o){if(r=t[a-1],r>65535||r<0)throw new Error("'pack' error.");l=String.fromCharCode(Math.floor(r%65536/256))+String.fromCharCode(r%256),i&&(l=l.split("").reverse().join(""))}else{if("l"!=o.toLowerCase())throw new Error("'pack' error.");if(r=t[a-1],"l"==o&&r<0&&(r+=4294967296),r>4294967295||r<0)throw new Error("'pack' error.");l=String.fromCharCode(Math.floor(r/16777216))+String.fromCharCode(Math.floor(r%16777216/65536))+String.fromCharCode(Math.floor(r%65536/256))+String.fromCharCode(r%256),i&&(l=l.split("").reverse().join(""))}n+=l,a+=1}return n}function c(e,t){if("string"!=typeof t)throw new Error("'unpack' error. Got invalid type argument.");let i,n=0;for(let t=1;t"!=e[0])throw new Error("'unpack' error.");i=!1}let a=[],r=0,o=1,l=null,s=null,m=null,c="";for(;s=e[o];){if("b"==s.toLowerCase())m=1,c=t.slice(r,r+m),l=c.charCodeAt(0),"b"==s&&l>=128&&(l-=256);else if("H"==s)m=2,c=t.slice(r,r+m),i&&(c=c.split("").reverse().join("")),l=256*c.charCodeAt(0)+c.charCodeAt(1);else{if("l"!=s.toLowerCase())throw new Error("'unpack' error. "+s);m=4,c=t.slice(r,r+m),i&&(c=c.split("").reverse().join("")),l=16777216*c.charCodeAt(0)+65536*c.charCodeAt(1)+256*c.charCodeAt(2)+c.charCodeAt(3),"l"==s&&l>=2147483648&&(l-=4294967296)}a.push(l),r+=m,o+=1}return a}function p(e,t){let i="";for(let n=0;nH",e.slice(t+2,t+4))[0]+2;i.push(e.slice(t,n)),t=n}if(t>=e.length)throw new Error("Wrong JPEG data.")}return i}var d={Byte:1,Ascii:2,Short:3,Long:4,Rational:5,Undefined:7,SLong:9,SRational:10},f={Image:{11:{name:"ProcessingSoftware",type:"Ascii"},254:{name:"NewSubfileType",type:"Long"},255:{name:"SubfileType",type:"Short"},256:{name:"ImageWidth",type:"Long"},257:{name:"ImageLength",type:"Long"},258:{name:"BitsPerSample",type:"Short"},259:{name:"Compression",type:"Short"},262:{name:"PhotometricInterpretation",type:"Short"},263:{name:"Threshholding",type:"Short"},264:{name:"CellWidth",type:"Short"},265:{name:"CellLength",type:"Short"},266:{name:"FillOrder",type:"Short"},269:{name:"DocumentName",type:"Ascii"},270:{name:"ImageDescription",type:"Ascii"},271:{name:"Make",type:"Ascii"},272:{name:"Model",type:"Ascii"},273:{name:"StripOffsets",type:"Long"},274:{name:"Orientation",type:"Short"},277:{name:"SamplesPerPixel",type:"Short"},278:{name:"RowsPerStrip",type:"Long"},279:{name:"StripByteCounts",type:"Long"},282:{name:"XResolution",type:"Rational"},283:{name:"YResolution",type:"Rational"},284:{name:"PlanarConfiguration",type:"Short"},290:{name:"GrayResponseUnit",type:"Short"},291:{name:"GrayResponseCurve",type:"Short"},292:{name:"T4Options",type:"Long"},293:{name:"T6Options",type:"Long"},296:{name:"ResolutionUnit",type:"Short"},301:{name:"TransferFunction",type:"Short"},305:{name:"Software",type:"Ascii"},306:{name:"DateTime",type:"Ascii"},315:{name:"Artist",type:"Ascii"},316:{name:"HostComputer",type:"Ascii"},317:{name:"Predictor",type:"Short"},318:{name:"WhitePoint",type:"Rational"},319:{name:"PrimaryChromaticities",type:"Rational"},320:{name:"ColorMap",type:"Short"},321:{name:"HalftoneHints",type:"Short"},322:{name:"TileWidth",type:"Short"},323:{name:"TileLength",type:"Short"},324:{name:"TileOffsets",type:"Short"},325:{name:"TileByteCounts",type:"Short"},330:{name:"SubIFDs",type:"Long"},332:{name:"InkSet",type:"Short"},333:{name:"InkNames",type:"Ascii"},334:{name:"NumberOfInks",type:"Short"},336:{name:"DotRange",type:"Byte"},337:{name:"TargetPrinter",type:"Ascii"},338:{name:"ExtraSamples",type:"Short"},339:{name:"SampleFormat",type:"Short"},340:{name:"SMinSampleValue",type:"Short"},341:{name:"SMaxSampleValue",type:"Short"},342:{name:"TransferRange",type:"Short"},343:{name:"ClipPath",type:"Byte"},344:{name:"XClipPathUnits",type:"Long"},345:{name:"YClipPathUnits",type:"Long"},346:{name:"Indexed",type:"Short"},347:{name:"JPEGTables",type:"Undefined"},351:{name:"OPIProxy",type:"Short"},512:{name:"JPEGProc",type:"Long"},513:{name:"JPEGInterchangeFormat",type:"Long"},514:{name:"JPEGInterchangeFormatLength",type:"Long"},515:{name:"JPEGRestartInterval",type:"Short"},517:{name:"JPEGLosslessPredictors",type:"Short"},518:{name:"JPEGPointTransforms",type:"Short"},519:{name:"JPEGQTables",type:"Long"},520:{name:"JPEGDCTables",type:"Long"},521:{name:"JPEGACTables",type:"Long"},529:{name:"YCbCrCoefficients",type:"Rational"},530:{name:"YCbCrSubSampling",type:"Short"},531:{name:"YCbCrPositioning",type:"Short"},532:{name:"ReferenceBlackWhite",type:"Rational"},700:{name:"XMLPacket",type:"Byte"},18246:{name:"Rating",type:"Short"},18249:{name:"RatingPercent",type:"Short"},32781:{name:"ImageID",type:"Ascii"},33421:{name:"CFARepeatPatternDim",type:"Short"},33422:{name:"CFAPattern",type:"Byte"},33423:{name:"BatteryLevel",type:"Rational"},33432:{name:"Copyright",type:"Ascii"},33434:{name:"ExposureTime",type:"Rational"},34377:{name:"ImageResources",type:"Byte"},34665:{name:"ExifTag",type:"Long"},34675:{name:"InterColorProfile",type:"Undefined"},34853:{name:"GPSTag",type:"Long"},34857:{name:"Interlace",type:"Short"},34858:{name:"TimeZoneOffset",type:"Long"},34859:{name:"SelfTimerMode",type:"Short"},37387:{name:"FlashEnergy",type:"Rational"},37388:{name:"SpatialFrequencyResponse",type:"Undefined"},37389:{name:"Noise",type:"Undefined"},37390:{name:"FocalPlaneXResolution",type:"Rational"},37391:{name:"FocalPlaneYResolution",type:"Rational"},37392:{name:"FocalPlaneResolutionUnit",type:"Short"},37393:{name:"ImageNumber",type:"Long"},37394:{name:"SecurityClassification",type:"Ascii"},37395:{name:"ImageHistory",type:"Ascii"},37397:{name:"ExposureIndex",type:"Rational"},37398:{name:"TIFFEPStandardID",type:"Byte"},37399:{name:"SensingMethod",type:"Short"},40091:{name:"XPTitle",type:"Byte"},40092:{name:"XPComment",type:"Byte"},40093:{name:"XPAuthor",type:"Byte"},40094:{name:"XPKeywords",type:"Byte"},40095:{name:"XPSubject",type:"Byte"},50341:{name:"PrintImageMatching",type:"Undefined"},50706:{name:"DNGVersion",type:"Byte"},50707:{name:"DNGBackwardVersion",type:"Byte"},50708:{name:"UniqueCameraModel",type:"Ascii"},50709:{name:"LocalizedCameraModel",type:"Byte"},50710:{name:"CFAPlaneColor",type:"Byte"},50711:{name:"CFALayout",type:"Short"},50712:{name:"LinearizationTable",type:"Short"},50713:{name:"BlackLevelRepeatDim",type:"Short"},50714:{name:"BlackLevel",type:"Rational"},50715:{name:"BlackLevelDeltaH",type:"SRational"},50716:{name:"BlackLevelDeltaV",type:"SRational"},50717:{name:"WhiteLevel",type:"Short"},50718:{name:"DefaultScale",type:"Rational"},50719:{name:"DefaultCropOrigin",type:"Short"},50720:{name:"DefaultCropSize",type:"Short"},50721:{name:"ColorMatrix1",type:"SRational"},50722:{name:"ColorMatrix2",type:"SRational"},50723:{name:"CameraCalibration1",type:"SRational"},50724:{name:"CameraCalibration2",type:"SRational"},50725:{name:"ReductionMatrix1",type:"SRational"},50726:{name:"ReductionMatrix2",type:"SRational"},50727:{name:"AnalogBalance",type:"Rational"},50728:{name:"AsShotNeutral",type:"Short"},50729:{name:"AsShotWhiteXY",type:"Rational"},50730:{name:"BaselineExposure",type:"SRational"},50731:{name:"BaselineNoise",type:"Rational"},50732:{name:"BaselineSharpness",type:"Rational"},50733:{name:"BayerGreenSplit",type:"Long"},50734:{name:"LinearResponseLimit",type:"Rational"},50735:{name:"CameraSerialNumber",type:"Ascii"},50736:{name:"LensInfo",type:"Rational"},50737:{name:"ChromaBlurRadius",type:"Rational"},50738:{name:"AntiAliasStrength",type:"Rational"},50739:{name:"ShadowScale",type:"SRational"},50740:{name:"DNGPrivateData",type:"Byte"},50741:{name:"MakerNoteSafety",type:"Short"},50778:{name:"CalibrationIlluminant1",type:"Short"},50779:{name:"CalibrationIlluminant2",type:"Short"},50780:{name:"BestQualityScale",type:"Rational"},50781:{name:"RawDataUniqueID",type:"Byte"},50827:{name:"OriginalRawFileName",type:"Byte"},50828:{name:"OriginalRawFileData",type:"Undefined"},50829:{name:"ActiveArea",type:"Short"},50830:{name:"MaskedAreas",type:"Short"},50831:{name:"AsShotICCProfile",type:"Undefined"},50832:{name:"AsShotPreProfileMatrix",type:"SRational"},50833:{name:"CurrentICCProfile",type:"Undefined"},50834:{name:"CurrentPreProfileMatrix",type:"SRational"},50879:{name:"ColorimetricReference",type:"Short"},50931:{name:"CameraCalibrationSignature",type:"Byte"},50932:{name:"ProfileCalibrationSignature",type:"Byte"},50934:{name:"AsShotProfileName",type:"Byte"},50935:{name:"NoiseReductionApplied",type:"Rational"},50936:{name:"ProfileName",type:"Byte"},50937:{name:"ProfileHueSatMapDims",type:"Long"},50938:{name:"ProfileHueSatMapData1",type:"Float"},50939:{name:"ProfileHueSatMapData2",type:"Float"},50940:{name:"ProfileToneCurve",type:"Float"},50941:{name:"ProfileEmbedPolicy",type:"Long"},50942:{name:"ProfileCopyright",type:"Byte"},50964:{name:"ForwardMatrix1",type:"SRational"},50965:{name:"ForwardMatrix2",type:"SRational"},50966:{name:"PreviewApplicationName",type:"Byte"},50967:{name:"PreviewApplicationVersion",type:"Byte"},50968:{name:"PreviewSettingsName",type:"Byte"},50969:{name:"PreviewSettingsDigest",type:"Byte"},50970:{name:"PreviewColorSpace",type:"Long"},50971:{name:"PreviewDateTime",type:"Ascii"},50972:{name:"RawImageDigest",type:"Undefined"},50973:{name:"OriginalRawFileDigest",type:"Undefined"},50974:{name:"SubTileBlockSize",type:"Long"},50975:{name:"RowInterleaveFactor",type:"Long"},50981:{name:"ProfileLookTableDims",type:"Long"},50982:{name:"ProfileLookTableData",type:"Float"},51008:{name:"OpcodeList1",type:"Undefined"},51009:{name:"OpcodeList2",type:"Undefined"},51022:{name:"OpcodeList3",type:"Undefined"}},Exif:{33434:{name:"ExposureTime",type:"Rational"},33437:{name:"FNumber",type:"Rational"},34850:{name:"ExposureProgram",type:"Short"},34852:{name:"SpectralSensitivity",type:"Ascii"},34855:{name:"ISOSpeedRatings",type:"Short"},34856:{name:"OECF",type:"Undefined"},34864:{name:"SensitivityType",type:"Short"},34865:{name:"StandardOutputSensitivity",type:"Long"},34866:{name:"RecommendedExposureIndex",type:"Long"},34867:{name:"ISOSpeed",type:"Long"},34868:{name:"ISOSpeedLatitudeyyy",type:"Long"},34869:{name:"ISOSpeedLatitudezzz",type:"Long"},36864:{name:"ExifVersion",type:"Undefined"},36867:{name:"DateTimeOriginal",type:"Ascii"},36868:{name:"DateTimeDigitized",type:"Ascii"},37121:{name:"ComponentsConfiguration",type:"Undefined"},37122:{name:"CompressedBitsPerPixel",type:"Rational"},37377:{name:"ShutterSpeedValue",type:"SRational"},37378:{name:"ApertureValue",type:"Rational"},37379:{name:"BrightnessValue",type:"SRational"},37380:{name:"ExposureBiasValue",type:"SRational"},37381:{name:"MaxApertureValue",type:"Rational"},37382:{name:"SubjectDistance",type:"Rational"},37383:{name:"MeteringMode",type:"Short"},37384:{name:"LightSource",type:"Short"},37385:{name:"Flash",type:"Short"},37386:{name:"FocalLength",type:"Rational"},37396:{name:"SubjectArea",type:"Short"},37500:{name:"MakerNote",type:"Undefined"},37510:{name:"UserComment",type:"Ascii"},37520:{name:"SubSecTime",type:"Ascii"},37521:{name:"SubSecTimeOriginal",type:"Ascii"},37522:{name:"SubSecTimeDigitized",type:"Ascii"},40960:{name:"FlashpixVersion",type:"Undefined"},40961:{name:"ColorSpace",type:"Short"},40962:{name:"PixelXDimension",type:"Long"},40963:{name:"PixelYDimension",type:"Long"},40964:{name:"RelatedSoundFile",type:"Ascii"},40965:{name:"InteroperabilityTag",type:"Long"},41483:{name:"FlashEnergy",type:"Rational"},41484:{name:"SpatialFrequencyResponse",type:"Undefined"},41486:{name:"FocalPlaneXResolution",type:"Rational"},41487:{name:"FocalPlaneYResolution",type:"Rational"},41488:{name:"FocalPlaneResolutionUnit",type:"Short"},41492:{name:"SubjectLocation",type:"Short"},41493:{name:"ExposureIndex",type:"Rational"},41495:{name:"SensingMethod",type:"Short"},41728:{name:"FileSource",type:"Undefined"},41729:{name:"SceneType",type:"Undefined"},41730:{name:"CFAPattern",type:"Undefined"},41985:{name:"CustomRendered",type:"Short"},41986:{name:"ExposureMode",type:"Short"},41987:{name:"WhiteBalance",type:"Short"},41988:{name:"DigitalZoomRatio",type:"Rational"},41989:{name:"FocalLengthIn35mmFilm",type:"Short"},41990:{name:"SceneCaptureType",type:"Short"},41991:{name:"GainControl",type:"Short"},41992:{name:"Contrast",type:"Short"},41993:{name:"Saturation",type:"Short"},41994:{name:"Sharpness",type:"Short"},41995:{name:"DeviceSettingDescription",type:"Undefined"},41996:{name:"SubjectDistanceRange",type:"Short"},42016:{name:"ImageUniqueID",type:"Ascii"},42032:{name:"CameraOwnerName",type:"Ascii"},42033:{name:"BodySerialNumber",type:"Ascii"},42034:{name:"LensSpecification",type:"Rational"},42035:{name:"LensMake",type:"Ascii"},42036:{name:"LensModel",type:"Ascii"},42037:{name:"LensSerialNumber",type:"Ascii"},42240:{name:"Gamma",type:"Rational"}},GPS:{0:{name:"GPSVersionID",type:"Byte"},1:{name:"GPSLatitudeRef",type:"Ascii"},2:{name:"GPSLatitude",type:"Rational"},3:{name:"GPSLongitudeRef",type:"Ascii"},4:{name:"GPSLongitude",type:"Rational"},5:{name:"GPSAltitudeRef",type:"Byte"},6:{name:"GPSAltitude",type:"Rational"},7:{name:"GPSTimeStamp",type:"Rational"},8:{name:"GPSSatellites",type:"Ascii"},9:{name:"GPSStatus",type:"Ascii"},10:{name:"GPSMeasureMode",type:"Ascii"},11:{name:"GPSDOP",type:"Rational"},12:{name:"GPSSpeedRef",type:"Ascii"},13:{name:"GPSSpeed",type:"Rational"},14:{name:"GPSTrackRef",type:"Ascii"},15:{name:"GPSTrack",type:"Rational"},16:{name:"GPSImgDirectionRef",type:"Ascii"},17:{name:"GPSImgDirection",type:"Rational"},18:{name:"GPSMapDatum",type:"Ascii"},19:{name:"GPSDestLatitudeRef",type:"Ascii"},20:{name:"GPSDestLatitude",type:"Rational"},21:{name:"GPSDestLongitudeRef",type:"Ascii"},22:{name:"GPSDestLongitude",type:"Rational"},23:{name:"GPSDestBearingRef",type:"Ascii"},24:{name:"GPSDestBearing",type:"Rational"},25:{name:"GPSDestDistanceRef",type:"Ascii"},26:{name:"GPSDestDistance",type:"Rational"},27:{name:"GPSProcessingMethod",type:"Undefined"},28:{name:"GPSAreaInformation",type:"Undefined"},29:{name:"GPSDateStamp",type:"Ascii"},30:{name:"GPSDifferential",type:"Short"},31:{name:"GPSHPositioningError",type:"Rational"}},Interop:{1:{name:"InteroperabilityIndex",type:"Ascii"}}};f["0th"]=f.Image,f["1st"]=f.Image,e.TAGS=f,e.ImageIFD={ProcessingSoftware:11,NewSubfileType:254,SubfileType:255,ImageWidth:256,ImageLength:257,BitsPerSample:258,Compression:259,PhotometricInterpretation:262,Threshholding:263,CellWidth:264,CellLength:265,FillOrder:266,DocumentName:269,ImageDescription:270,Make:271,Model:272,StripOffsets:273,Orientation:274,SamplesPerPixel:277,RowsPerStrip:278,StripByteCounts:279,XResolution:282,YResolution:283,PlanarConfiguration:284,GrayResponseUnit:290,GrayResponseCurve:291,T4Options:292,T6Options:293,ResolutionUnit:296,TransferFunction:301,Software:305,DateTime:306,Artist:315,HostComputer:316,Predictor:317,WhitePoint:318,PrimaryChromaticities:319,ColorMap:320,HalftoneHints:321,TileWidth:322,TileLength:323,TileOffsets:324,TileByteCounts:325,SubIFDs:330,InkSet:332,InkNames:333,NumberOfInks:334,DotRange:336,TargetPrinter:337,ExtraSamples:338,SampleFormat:339,SMinSampleValue:340,SMaxSampleValue:341,TransferRange:342,ClipPath:343,XClipPathUnits:344,YClipPathUnits:345,Indexed:346,JPEGTables:347,OPIProxy:351,JPEGProc:512,JPEGInterchangeFormat:513,JPEGInterchangeFormatLength:514,JPEGRestartInterval:515,JPEGLosslessPredictors:517,JPEGPointTransforms:518,JPEGQTables:519,JPEGDCTables:520,JPEGACTables:521,YCbCrCoefficients:529,YCbCrSubSampling:530,YCbCrPositioning:531,ReferenceBlackWhite:532,XMLPacket:700,Rating:18246,RatingPercent:18249,ImageID:32781,CFARepeatPatternDim:33421,CFAPattern:33422,BatteryLevel:33423,Copyright:33432,ExposureTime:33434,ImageResources:34377,ExifTag:34665,InterColorProfile:34675,GPSTag:34853,Interlace:34857,TimeZoneOffset:34858,SelfTimerMode:34859,FlashEnergy:37387,SpatialFrequencyResponse:37388,Noise:37389,FocalPlaneXResolution:37390,FocalPlaneYResolution:37391,FocalPlaneResolutionUnit:37392,ImageNumber:37393,SecurityClassification:37394,ImageHistory:37395,ExposureIndex:37397,TIFFEPStandardID:37398,SensingMethod:37399,XPTitle:40091,XPComment:40092,XPAuthor:40093,XPKeywords:40094,XPSubject:40095,PrintImageMatching:50341,DNGVersion:50706,DNGBackwardVersion:50707,UniqueCameraModel:50708,LocalizedCameraModel:50709,CFAPlaneColor:50710,CFALayout:50711,LinearizationTable:50712,BlackLevelRepeatDim:50713,BlackLevel:50714,BlackLevelDeltaH:50715,BlackLevelDeltaV:50716,WhiteLevel:50717,DefaultScale:50718,DefaultCropOrigin:50719,DefaultCropSize:50720,ColorMatrix1:50721,ColorMatrix2:50722,CameraCalibration1:50723,CameraCalibration2:50724,ReductionMatrix1:50725,ReductionMatrix2:50726,AnalogBalance:50727,AsShotNeutral:50728,AsShotWhiteXY:50729,BaselineExposure:50730,BaselineNoise:50731,BaselineSharpness:50732,BayerGreenSplit:50733,LinearResponseLimit:50734,CameraSerialNumber:50735,LensInfo:50736,ChromaBlurRadius:50737,AntiAliasStrength:50738,ShadowScale:50739,DNGPrivateData:50740,MakerNoteSafety:50741,CalibrationIlluminant1:50778,CalibrationIlluminant2:50779,BestQualityScale:50780,RawDataUniqueID:50781,OriginalRawFileName:50827,OriginalRawFileData:50828,ActiveArea:50829,MaskedAreas:50830,AsShotICCProfile:50831,AsShotPreProfileMatrix:50832,CurrentICCProfile:50833,CurrentPreProfileMatrix:50834,ColorimetricReference:50879,CameraCalibrationSignature:50931,ProfileCalibrationSignature:50932,AsShotProfileName:50934,NoiseReductionApplied:50935,ProfileName:50936,ProfileHueSatMapDims:50937,ProfileHueSatMapData1:50938,ProfileHueSatMapData2:50939,ProfileToneCurve:50940,ProfileEmbedPolicy:50941,ProfileCopyright:50942,ForwardMatrix1:50964,ForwardMatrix2:50965,PreviewApplicationName:50966,PreviewApplicationVersion:50967,PreviewSettingsName:50968,PreviewSettingsDigest:50969,PreviewColorSpace:50970,PreviewDateTime:50971,RawImageDigest:50972,OriginalRawFileDigest:50973,SubTileBlockSize:50974,RowInterleaveFactor:50975,ProfileLookTableDims:50981,ProfileLookTableData:50982,OpcodeList1:51008,OpcodeList2:51009,OpcodeList3:51022,NoiseProfile:51041},e.ExifIFD={ExposureTime:33434,FNumber:33437,ExposureProgram:34850,SpectralSensitivity:34852,ISOSpeedRatings:34855,OECF:34856,SensitivityType:34864,StandardOutputSensitivity:34865,RecommendedExposureIndex:34866,ISOSpeed:34867,ISOSpeedLatitudeyyy:34868,ISOSpeedLatitudezzz:34869,ExifVersion:36864,DateTimeOriginal:36867,DateTimeDigitized:36868,ComponentsConfiguration:37121,CompressedBitsPerPixel:37122,ShutterSpeedValue:37377,ApertureValue:37378,BrightnessValue:37379,ExposureBiasValue:37380,MaxApertureValue:37381,SubjectDistance:37382,MeteringMode:37383,LightSource:37384,Flash:37385,FocalLength:37386,SubjectArea:37396,MakerNote:37500,UserComment:37510,SubSecTime:37520,SubSecTimeOriginal:37521,SubSecTimeDigitized:37522,FlashpixVersion:40960,ColorSpace:40961,PixelXDimension:40962,PixelYDimension:40963,RelatedSoundFile:40964,InteroperabilityTag:40965,FlashEnergy:41483,SpatialFrequencyResponse:41484,FocalPlaneXResolution:41486,FocalPlaneYResolution:41487,FocalPlaneResolutionUnit:41488,SubjectLocation:41492,ExposureIndex:41493,SensingMethod:41495,FileSource:41728,SceneType:41729,CFAPattern:41730,CustomRendered:41985,ExposureMode:41986,WhiteBalance:41987,DigitalZoomRatio:41988,FocalLengthIn35mmFilm:41989,SceneCaptureType:41990,GainControl:41991,Contrast:41992,Saturation:41993,Sharpness:41994,DeviceSettingDescription:41995,SubjectDistanceRange:41996,ImageUniqueID:42016,CameraOwnerName:42032,BodySerialNumber:42033,LensSpecification:42034,LensMake:42035,LensModel:42036,LensSerialNumber:42037,Gamma:42240},e.GPSIFD={GPSVersionID:0,GPSLatitudeRef:1,GPSLatitude:2,GPSLongitudeRef:3,GPSLongitude:4,GPSAltitudeRef:5,GPSAltitude:6,GPSTimeStamp:7,GPSSatellites:8,GPSStatus:9,GPSMeasureMode:10,GPSDOP:11,GPSSpeedRef:12,GPSSpeed:13,GPSTrackRef:14,GPSTrack:15,GPSImgDirectionRef:16,GPSImgDirection:17,GPSMapDatum:18,GPSDestLatitudeRef:19,GPSDestLatitude:20,GPSDestLongitudeRef:21,GPSDestLongitude:22,GPSDestBearingRef:23,GPSDestBearing:24,GPSDestDistanceRef:25,GPSDestDistance:26,GPSProcessingMethod:27,GPSAreaInformation:28,GPSDateStamp:29,GPSDifferential:30,GPSHPositioningError:31},e.InteropIFD={InteroperabilityIndex:1},e.GPSHelper={degToDmsRational:function(e){let t=Math.abs(e),i=t%1*60,n=i%1*60;return[[Math.floor(t),1],[Math.floor(i),1],[Math.round(100*n),100]]},dmsRationalToDeg:function(e,t){let i="S"===t||"W"===t?-1:1;return(e[0][0]/e[0][1]+e[1][0]/e[1][1]/60+e[2][0]/e[2][1]/3600)*i}},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=e),exports.piexif=e):window.piexif=e}(); \ No newline at end of file diff --git a/public/acuant/11.9.3/AcuantMetricsService.min.js b/public/acuant/11.9.3/AcuantMetricsService.min.js new file mode 100644 index 00000000000..21c0e1dffdc --- /dev/null +++ b/public/acuant/11.9.3/AcuantMetricsService.min.js @@ -0,0 +1 @@ +var AcuantMetricsModule=function(){var e="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0;return"undefined"!=typeof __filename&&(e=e||__filename),function(t){var r,n,o;t=t||{},r||(r=void 0!==t?t:{}),r.ready=new Promise((function(e,t){n=e,o=t})),Object.getOwnPropertyDescriptor(r.ready,"_acuantMetrics")||(Object.defineProperty(r.ready,"_acuantMetrics",{configurable:!0,get:function(){Oe("You are getting _acuantMetrics on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_acuantMetrics",{configurable:!0,set:function(){Oe("You are setting _acuantMetrics on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"_acuantMoire")||(Object.defineProperty(r.ready,"_acuantMoire",{configurable:!0,get:function(){Oe("You are getting _acuantMoire on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_acuantMoire",{configurable:!0,set:function(){Oe("You are setting _acuantMoire on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"_emscripten_stack_get_end")||(Object.defineProperty(r.ready,"_emscripten_stack_get_end",{configurable:!0,get:function(){Oe("You are getting _emscripten_stack_get_end on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_emscripten_stack_get_end",{configurable:!0,set:function(){Oe("You are setting _emscripten_stack_get_end on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"_emscripten_stack_get_free")||(Object.defineProperty(r.ready,"_emscripten_stack_get_free",{configurable:!0,get:function(){Oe("You are getting _emscripten_stack_get_free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_emscripten_stack_get_free",{configurable:!0,set:function(){Oe("You are setting _emscripten_stack_get_free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"_emscripten_stack_init")||(Object.defineProperty(r.ready,"_emscripten_stack_init",{configurable:!0,get:function(){Oe("You are getting _emscripten_stack_init on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_emscripten_stack_init",{configurable:!0,set:function(){Oe("You are setting _emscripten_stack_init on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"_stackSave")||(Object.defineProperty(r.ready,"_stackSave",{configurable:!0,get:function(){Oe("You are getting _stackSave on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_stackSave",{configurable:!0,set:function(){Oe("You are setting _stackSave on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"_stackRestore")||(Object.defineProperty(r.ready,"_stackRestore",{configurable:!0,get:function(){Oe("You are getting _stackRestore on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_stackRestore",{configurable:!0,set:function(){Oe("You are setting _stackRestore on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"_stackAlloc")||(Object.defineProperty(r.ready,"_stackAlloc",{configurable:!0,get:function(){Oe("You are getting _stackAlloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_stackAlloc",{configurable:!0,set:function(){Oe("You are setting _stackAlloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"___wasm_call_ctors")||(Object.defineProperty(r.ready,"___wasm_call_ctors",{configurable:!0,get:function(){Oe("You are getting ___wasm_call_ctors on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"___wasm_call_ctors",{configurable:!0,set:function(){Oe("You are setting ___wasm_call_ctors on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"_fflush")||(Object.defineProperty(r.ready,"_fflush",{configurable:!0,get:function(){Oe("You are getting _fflush on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_fflush",{configurable:!0,set:function(){Oe("You are setting _fflush on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"___errno_location")||(Object.defineProperty(r.ready,"___errno_location",{configurable:!0,get:function(){Oe("You are getting ___errno_location on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"___errno_location",{configurable:!0,set:function(){Oe("You are setting ___errno_location on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"_malloc")||(Object.defineProperty(r.ready,"_malloc",{configurable:!0,get:function(){Oe("You are getting _malloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_malloc",{configurable:!0,set:function(){Oe("You are setting _malloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"_free")||(Object.defineProperty(r.ready,"_free",{configurable:!0,get:function(){Oe("You are getting _free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_free",{configurable:!0,set:function(){Oe("You are setting _free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"___cxa_is_pointer_type")||(Object.defineProperty(r.ready,"___cxa_is_pointer_type",{configurable:!0,get:function(){Oe("You are getting ___cxa_is_pointer_type on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"___cxa_is_pointer_type",{configurable:!0,set:function(){Oe("You are setting ___cxa_is_pointer_type on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"___cxa_can_catch")||(Object.defineProperty(r.ready,"___cxa_can_catch",{configurable:!0,get:function(){Oe("You are getting ___cxa_can_catch on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"___cxa_can_catch",{configurable:!0,set:function(){Oe("You are setting ___cxa_can_catch on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"_setThrew")||(Object.defineProperty(r.ready,"_setThrew",{configurable:!0,get:function(){Oe("You are getting _setThrew on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"_setThrew",{configurable:!0,set:function(){Oe("You are setting _setThrew on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"___getTypeName")||(Object.defineProperty(r.ready,"___getTypeName",{configurable:!0,get:function(){Oe("You are getting ___getTypeName on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"___getTypeName",{configurable:!0,set:function(){Oe("You are setting ___getTypeName on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"___embind_register_native_and_builtin_types")||(Object.defineProperty(r.ready,"___embind_register_native_and_builtin_types",{configurable:!0,get:function(){Oe("You are getting ___embind_register_native_and_builtin_types on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"___embind_register_native_and_builtin_types",{configurable:!0,set:function(){Oe("You are setting ___embind_register_native_and_builtin_types on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}})),Object.getOwnPropertyDescriptor(r.ready,"onRuntimeInitialized")||(Object.defineProperty(r.ready,"onRuntimeInitialized",{configurable:!0,get:function(){Oe("You are getting onRuntimeInitialized on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}),Object.defineProperty(r.ready,"onRuntimeInitialized",{configurable:!0,set:function(){Oe("You are setting onRuntimeInitialized on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js")}}));var i,a={};for(i in r)r.hasOwnProperty(i)&&(a[i]=r[i]);var s="./this.program",c="object"==typeof window,d="function"==typeof importScripts,u="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,p=!c&&!u&&!d;if(r.ENVIRONMENT)throw Error("Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)");var l,E,f,O,h,g="";if(u){if("object"!=typeof process||"function"!=typeof require)throw Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");g=d?require("path").dirname(g)+"/":__dirname+"/",l=function(e,t){return O||(O=require("fs")),h||(h=require("path")),e=h.normalize(e),O.readFileSync(e,t?null:"utf8")},f=function(e){return(e=l(e,!0)).buffer||(e=new Uint8Array(e)),R(e.buffer),e},E=function(e,t,r){O||(O=require("fs")),h||(h=require("path")),e=h.normalize(e),O.readFile(e,(function(e,n){e?r(e):t(n.buffer)}))},1=n);)++r;if(16o?n+=String.fromCharCode(o):(o-=65536,n+=String.fromCharCode(55296|o>>10,56320|1023&o))}}else n+=String.fromCharCode(o)}return n}function S(e,t){return e?v(N,e,t):""}function A(e,t,r,n){if(!(0=a)a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i);if(127>=a){if(r>=n)break;t[r++]=a}else{if(2047>=a){if(r+1>=n)break;t[r++]=192|a>>6}else{if(65535>=a){if(r+2>=n)break;t[r++]=224|a>>12}else{if(r+3>=n)break;1114111>18,t[r++]=128|a>>12&63}t[r++]=128|a>>6&63}t[r++]=128|63&a}}return t[r]=0,r-o}function F(e,t,r){R("number"==typeof r,"stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),A(e,N,t,r)}function I(e){for(var t=0,r=0;r=n&&(n=65536+((1023&n)<<10)|1023&e.charCodeAt(++r)),127>=n?++t:t=2047>=n?t+2:65535>=n?t+3:t+4}return t}var j,U,N,x,k,H,C,X,Q,L="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0;function W(e,t){R(0==e%2,"Pointer passed to UTF16ToString must be aligned to two bytes!");for(var r=e>>1,n=r+t/2;!(r>=n)&&k[r];)++r;if(32<(r<<=1)-e&&L)return L.decode(N.subarray(e,r));for(r="",n=0;!(n>=t/2);++n){var o=x[e+2*n>>1];if(0==o)break;r+=String.fromCharCode(o)}return r}function B(e,t,r){if(R(0==t%2,"Pointer passed to stringToUTF16 must be aligned to two bytes!"),R("number"==typeof r,"stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),void 0===r&&(r=2147483647),2>r)return 0;var n=t;r=(r-=2)<2*e.length?r/2:e.length;for(var o=0;o>1]=e.charCodeAt(o),t+=2;return x[t>>1]=0,t-n}function G(e){return 2*e.length}function Y(e,t){R(0==e%4,"Pointer passed to UTF32ToString must be aligned to four bytes!");for(var r=0,n="";!(r>=t/4);){var o=H[e+4*r>>2];if(0==o)break;++r,65536<=o?(o-=65536,n+=String.fromCharCode(55296|o>>10,56320|1023&o)):n+=String.fromCharCode(o)}return n}function V(e,t,r){if(R(0==t%4,"Pointer passed to stringToUTF32 must be aligned to four bytes!"),R("number"==typeof r,"stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),void 0===r&&(r=2147483647),4>r)return 0;var n=t;r=n+r-4;for(var o=0;o=i)i=65536+((1023&i)<<10)|1023&e.charCodeAt(++o);if(H[t>>2]=i,(t+=4)+4>r)break}return H[t>>2]=0,t-n}function z(e){for(var t=0,r=0;r=n&&++r,t+=4}return t}function Z(e,t){R(0<=e.length,"writeArrayToMemory array must have a length (should be an array or typed array)"),U.set(e,t)}function q(){var e=b.buffer;j=e,r.HEAP8=U=new Int8Array(e),r.HEAP16=x=new Int16Array(e),r.HEAP32=H=new Int32Array(e),r.HEAPU8=N=new Uint8Array(e),r.HEAPU16=k=new Uint16Array(e),r.HEAPU32=C=new Uint32Array(e),r.HEAPF32=X=new Float32Array(e),r.HEAPF64=Q=new Float64Array(e)}r.TOTAL_STACK&&R(5242880===r.TOTAL_STACK,"the stack size can no longer be determined at runtime");var K,J=r.INITIAL_MEMORY||16777216;function $(){var e=rr();R(0==(3&e)),C[1+(e>>2)]=34821223,C[2+(e>>2)]=2310721022,H[0]=1668509029}function ee(){if(!M){var e=rr(),t=C[1+(e>>2)];e=C[2+(e>>2)],34821223==t&&2310721022==e||Oe("Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x"+e.toString(16)+" "+t.toString(16)),1668509029!==H[0]&&Oe("Runtime error: The application has corrupted its heap memory area (address zero)!")}}Object.getOwnPropertyDescriptor(r,"INITIAL_MEMORY")||Object.defineProperty(r,"INITIAL_MEMORY",{configurable:!0,get:function(){Oe("Module.INITIAL_MEMORY has been replaced with plain INITIAL_MEMORY (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}}),R(5242880<=J,"INITIAL_MEMORY should be larger than TOTAL_STACK, was "+J+"! (TOTAL_STACK=5242880)"),R("undefined"!=typeof Int32Array&&"undefined"!=typeof Float64Array&&void 0!==Int32Array.prototype.subarray&&void 0!==Int32Array.prototype.set,"JS engine does not provide full typed array support"),R(!r.wasmMemory,"Use of `wasmMemory` detected. Use -s IMPORTED_MEMORY to define wasmMemory externally"),R(16777216==J,"Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically");var te=new Int16Array(1),re=new Int8Array(te.buffer);if(te[0]=25459,115!==re[0]||99!==re[1])throw"Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)";var ne=[],oe=[],ie=[],ae=!1;function se(){var e=r.preRun.shift();ne.unshift(e)}R(Math.imul,"This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),R(Math.fround,"This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),R(Math.clz32,"This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),R(Math.trunc,"This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill");var ce,de,ue,pe=0,le=null,Ee=null,fe={};function Oe(e){r.onAbort&&r.onAbort(e),T(e),M=!0,e="abort("+e+") at ";e:{var t=Error();if(!t.stack){try{throw Error()}catch(e){t=e}if(!t.stack){t="(no stack trace available)";break e}}t=t.stack.toString()}throw r.extraStackTrace&&(t+="\n"+r.extraStackTrace()),t=De(t),e=new WebAssembly.RuntimeError(e+t),o(e),e}function he(){return ce.startsWith("data:application/octet-stream;base64,")}function ge(e){return function(){var t=r.asm;return R(ae,"native function `"+e+"` called before runtime initialization"),R(!0,"native function `"+e+"` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)"),t[e]||R(t[e],"exported native function `"+e+"` not found"),t[e].apply(null,arguments)}}if(r.preloadedImages={},r.preloadedAudios={},ce="AcuantMetricsService.wasm",!he()){var _e=ce;ce=r.locateFile?r.locateFile(_e,g):g+_e}function Te(){var e=ce;try{if(e==ce&&y)return new Uint8Array(y);if(f)return f(e);throw"both async and sync fetching of the wasm failed"}catch(e){Oe(e)}}function we(e){for(;0>2]=e},this.C=function(){return H[this.g+4>>2]},this.Aa=function(e){H[this.g+8>>2]=e},this.pa=function(){return H[this.g+8>>2]},this.Ba=function(){H[this.g>>2]=0},this.Y=function(e){U[this.g+12>>0]=e?1:0},this.oa=function(){return 0!=U[this.g+12>>0]},this.Z=function(e){U[this.g+13>>0]=e?1:0},this.ha=function(){return 0!=U[this.g+13>>0]},this.sa=function(e,t){this.Ca(e),this.Aa(t),this.Ba(),this.Y(!1),this.Z(!1)},this.la=function(){H[this.g>>2]=H[this.g>>2]+1},this.xa=function(){var e=H[this.g>>2];return H[this.g>>2]=e-1,R(0>2]=e},this.J=function(){return H[this.g>>2]},this.F=function(e){H[this.g+4>>2]=e},this.I=function(){return this.g+4},this.na=function(){return H[this.g+4>>2]},this.qa=function(){if(ur(this.M().C()))return H[this.J()>>2];var e=this.na();return 0!==e?e:this.J()},this.M=function(){return new ye(this.J())},void 0===e?(this.g=er(8),this.F(0)):this.g=e}var be=[],Me=0,Re=0;function me(e){try{return tr(new ye(e).g)}catch(e){T("exception during cxa_free_exception: "+e)}}function ve(e,t){for(var r=0,n=e.length-1;0<=n;n--){var o=e[n];"."===o?e.splice(n,1):".."===o?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r;r--)e.unshift("..");return e}function Se(e){var t="/"===e.charAt(0),r="/"===e.substr(-1);return(e=ve(e.split("/").filter((function(e){return!!e})),!t).join("/"))||t||(e="."),e&&r&&(e+="/"),(t?"/":"")+e}function Ae(e){var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(e).slice(1);return e=t[0],t=t[1],e||t?(t&&(t=t.substr(0,t.length-1)),e+t):"."}function Fe(e){if("/"===e)return"/";var t=(e=(e=Se(e)).replace(/\/$/,"")).lastIndexOf("/");return-1===t?e:e.substr(t+1)}function Ie(){for(var e="",t=!1,r=arguments.length-1;-1<=r&&!t;r--){if("string"!=typeof(t=0<=r?arguments[r]:"/"))throw new TypeError("Arguments to path.resolve must be strings");if(!t)return"";e=t+"/"+e,t="/"===t.charAt(0)}return(t?"/":"")+(e=ve(e.split("/").filter((function(e){return!!e})),!t).join("/"))||"."}var je=[];function Ue(e,t){je[e]={input:[],output:[],D:t},st(e,Ne)}var Ne={open:function(e){var t=je[e.node.rdev];if(!t)throw new Ve(43);e.tty=t,e.seekable=!1},close:function(e){e.tty.D.flush(e.tty)},flush:function(e){e.tty.D.flush(e.tty)},read:function(e,t,r,n){if(!e.tty||!e.tty.D.ga)throw new Ve(60);for(var o=0,i=0;i=t||(t=Math.max(t,r*(1048576>r?2:1.125)>>>0),0!=r&&(t=Math.max(t,256)),r=e.h,e.h=new Uint8Array(t),0=e.node.l)return 0;if(R(0<=(e=Math.min(e.node.l-o,n))),8t)throw new Ve(28);return t},$:function(e,t,r){He.da(e.node,t+r),e.node.l=Math.max(e.node.l,t+r)},ia:function(e,t,r,n,o,i){if(0!==t)throw new Ve(28);if(32768!=(61440&e.node.mode))throw new Ve(43);if(e=e.node.h,2&i||e.buffer!==j){if((0>>0)%Ge.length}function Je(e,t){var r;if(r=(r=rt(e,"x"))?r:e.i.lookup?0:2)throw new Ve(r,e);for(r=Ge[Ke(e.id,t)];r;r=r.va){var n=r.name;if(r.parent.id===e.id&&n===t)return r}return e.i.lookup(e,t)}function $e(e,t,r,n){return R("object"==typeof e),t=Ke((e=new Zt(e,t,r,n)).parent.id,e.name),e.va=Ge[t],Ge[t]=e}var et={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090};function tt(e){var t=["r","w","rw"][3&e];return 512&e&&(t+="w"),t}function rt(e,t){return Ye?0:!t.includes("r")||292&e.mode?t.includes("w")&&!(146&e.mode)||t.includes("x")&&!(73&e.mode)?2:0:2}function nt(e,t){try{return Je(e,t),20}catch(e){}return rt(e,"wx")}function ot(e,t){Tt||((Tt=function(){}).prototype={});var r,n=new Tt;for(r in e)n[r]=e[r];return e=n,t=function(e){for(e=e||0;e<=4096;e++)if(!We[e])return e;throw new Ve(33)}(t),e.fd=t,We[t]=e}var it,at={open:function(e){e.j=Le[e.node.rdev].j,e.j.open&&e.j.open(e)},B:function(){throw new Ve(70)}};function st(e,t){Le[e]={j:t}}function ct(e,t){if("string"==typeof e)throw e;var r="/"===t,n=!t;if(r&&Qe)throw new Ve(10);if(!r&&!n){var o=Ze(t,{fa:!1});if(t=o.path,(o=o.node).O)throw new Ve(10);if(16384!=(61440&o.mode))throw new Ve(54)}t={type:e,Ma:{},ja:t,ua:[]},(e=e.u(t)).u=t,t.root=e,r?Qe=e:o&&(o.O=t,o.u&&o.u.ua.push(t))}function dt(e,t,r){var n=Ze(e,{parent:!0}).node;if(!(e=Fe(e))||"."===e||".."===e)throw new Ve(28);var o=nt(n,e);if(o)throw new Ve(o);if(!n.i.N)throw new Ve(63);return n.i.N(n,e,t,r)}function ut(e){return dt(e,16895,0)}function pt(e,t,r){void 0===r&&(r=t,t=438),dt(e,8192|t,r)}function lt(e,t){if(!Ie(e))throw new Ve(44);var r=Ze(t,{parent:!0}).node;if(!r)throw new Ve(44);var n=nt(r,t=Fe(t));if(n)throw new Ve(n);if(!r.i.symlink)throw new Ve(63);r.i.symlink(r,t,e)}function Et(e){if(!(e=Ze(e).node))throw new Ve(44);if(!e.i.readlink)throw new Ve(28);return Ie(qe(e.parent),e.i.readlink(e))}function ft(e,t,n,o){if(""===e)throw new Ve(44);if("string"==typeof t){var i=et[t];if(void 0===i)throw Error("Unknown file open mode: "+t);t=i}if(n=64&t?4095&(void 0===n?438:n)|32768:0,"object"==typeof e)var a=e;else{e=Se(e);try{a=Ze(e,{ea:!(131072&t)}).node}catch(e){}}if(i=!1,64&t)if(a){if(128&t)throw new Ve(20)}else a=dt(e,n,0),i=!0;if(!a)throw new Ve(44);if(8192==(61440&a.mode)&&(t&=-513),65536&t&&16384!=(61440&a.mode))throw new Ve(54);if(!i&&(n=a?40960==(61440&a.mode)?32:16384==(61440&a.mode)&&("r"!==tt(t)||512&t)?31:rt(a,tt(t)):44))throw new Ve(n);if(512&t){if(!(n="string"==typeof(n=a)?Ze(n,{ea:!0}).node:n).i.s)throw new Ve(63);if(16384==(61440&n.mode))throw new Ve(31);if(32768!=(61440&n.mode))throw new Ve(28);if(i=rt(n,"w"))throw new Ve(i);n.i.s(n,{size:0,timestamp:Date.now()})}return t&=-131713,(o=ot({node:a,path:qe(a),flags:t,seekable:!0,position:0,j:a.j,Ha:[],error:!1},o)).j.open&&o.j.open(o),!r.logReadFiles||1&t||(wt||(wt={}),e in wt||(wt[e]=1)),o}function Ot(e,t,r){if(null===e.fd)throw new Ve(8);if(!e.seekable||!e.j.B)throw new Ve(70);if(0!=r&&1!=r&&2!=r)throw new Ve(28);e.position=e.j.B(e,t,r),e.Ha=[]}function ht(){Ve||((Ve=function(e,t){this.node=t,this.za=function(e){for(var t in this.A=e,Xe)if(Xe[t]===e){this.code=t;break}},this.za(e),this.message=Ce[e],this.stack&&(Object.defineProperty(this,"stack",{value:Error().stack,writable:!0}),this.stack=De(this.stack))}).prototype=Error(),Ve.prototype.constructor=Ve,[44].forEach((function(e){ze[e]=new Ve(e),ze[e].stack=""})))}function gt(e,t,r){e=Se("/dev/"+e);var n=function(e,t){var r=0;return e&&(r|=365),t&&(r|=146),r}(!!t,!!r);_t||(_t=64);var o=_t++<<8|0;st(o,{open:function(e){e.seekable=!1},close:function(){r&&r.buffer&&r.buffer.length&&r(10)},read:function(e,r,n,o){for(var i=0,a=0;a>2]}function bt(e){if(!(e=We[e]))throw new Ve(8);return e}function Mt(e){switch(e){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+e)}}var Rt=void 0;function mt(e){for(var t="";N[e];)t+=Rt[N[e++]];return t}var vt={},St={},At={};function Ft(e){var t=Error,r=function(e,t){if(void 0===e)e="_unknown";else{var r=(e=e.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);e=48<=r&&57>=r?"_"+e:e}return new Function("body","return function "+e+'() {\n "use strict"; return body.apply(this, arguments);\n};\n')(t)}(e,(function(t){this.name=e,this.message=t,void 0!==(t=Error(t).stack)&&(this.stack=this.toString()+"\n"+t.replace(/^Error(:[^\n]*)?\n/,""))}));return r.prototype=Object.create(t.prototype),r.prototype.constructor=r,r.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message},r}var It=void 0;function jt(e){throw new It(e)}function Ut(e,t,r){if(r=r||{},!("argPackAdvance"in t))throw new TypeError("registerType registeredInstance requires argPackAdvance");var n=t.name;if(e||jt('type "'+n+'" must have a positive integer typeid pointer'),St.hasOwnProperty(e)){if(r.ra)return;jt("Cannot register type '"+n+"' twice")}St[e]=t,delete At[e],vt.hasOwnProperty(e)&&(t=vt[e],delete vt[e],t.forEach((function(e){e()})))}var Nt=[],xt=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function kt(e){return this.fromWireType(C[e>>2])}function Ht(e){if(null===e)return"null";var t=typeof e;return"object"===t||"array"===t||"function"===t?e.toString():""+e}function Ct(e,t){switch(t){case 2:return function(e){return this.fromWireType(X[e>>2])};case 3:return function(e){return this.fromWireType(Q[e>>3])};default:throw new TypeError("Unknown float type: "+e)}}function Xt(e,t,r){switch(t){case 0:return r?function(e){return U[e]}:function(e){return N[e]};case 1:return r?function(e){return x[e>>1]}:function(e){return k[e>>1]};case 2:return r?function(e){return H[e>>2]}:function(e){return C[e>>2]};default:throw new TypeError("Unknown integer type: "+e)}}var Qt,Lt={};function Wt(){if(!Qt){var e,t={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:s||"./this.program"};for(e in Lt)void 0===Lt[e]?delete t[e]:t[e]=Lt[e];var r=[];for(e in t)r.push(e+"="+t[e]);Qt=r}return Qt}function Bt(e){return 0==e%4&&(0!=e%100||0==e%400)}function Gt(e,t){for(var r=0,n=0;n<=t;r+=e[n++]);return r}var Yt=[31,29,31,30,31,30,31,31,30,31,30,31],Vt=[31,28,31,30,31,30,31,31,30,31,30,31];function zt(e,t){for(e=new Date(e.getTime());0n-e.getDate())){e.setDate(e.getDate()+t);break}t-=n-e.getDate()+1,e.setDate(1),11>r?e.setMonth(r+1):(e.setMonth(0),e.setFullYear(e.getFullYear()+1))}return e}function Zt(e,t,r,n){e||(e=this),this.parent=e,this.u=e.u,this.O=null,this.id=Be++,this.name=t,this.mode=r,this.i={},this.j={},this.rdev=n}Object.defineProperties(Zt.prototype,{read:{get:function(){return 365==(365&this.mode)},set:function(e){e?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146==(146&this.mode)},set:function(e){e?this.mode|=146:this.mode&=-147}}}),ht(),Ge=Array(4096),ct(He,"/"),ut("/tmp"),ut("/home"),ut("/home/web_user"),function(){ut("/dev"),st(259,{read:function(){return 0},write:function(e,t,r,n){return n}}),pt("/dev/null",259),Ue(1280,xe),Ue(1536,ke),pt("/dev/tty",1280),pt("/dev/tty1",1536);var e=function(){if("object"==typeof crypto&&"function"==typeof crypto.getRandomValues){var e=new Uint8Array(1);return function(){return crypto.getRandomValues(e),e[0]}}if(u)try{var t=require("crypto");return function(){return t.randomBytes(1)[0]}}catch(e){}return function(){Oe("no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };")}}();gt("random",e),gt("urandom",e),ut("/dev/shm"),ut("/dev/shm/tmp")}(),function(){ut("/proc");var e=ut("/proc/self");ut("/proc/self/fd"),ct({u:function(){var t=$e(e,"fd",16895,73);return t.i={lookup:function(e,t){var r=We[+t];if(!r)throw new Ve(8);return(e={parent:null,u:{ja:"fake"},i:{readlink:function(){return r.path}}}).parent=e}},t}},"/proc/self/fd")}(),Xe={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135};for(var qt=Array(256),Kt=0;256>Kt;++Kt)qt[Kt]=String.fromCharCode(Kt);function Jt(e,t){var r=Array(I(e)+1);return e=A(e,r,0,r.length),t&&(r.length=e),r}Rt=qt,It=r.BindingError=Ft("BindingError"),r.InternalError=Ft("InternalError"),r.count_emval_handles=function(){for(var e=0,t=5;to?-28:ft(n.path,n.flags,0,o).fd;case 1:case 2:return 0;case 3:return n.flags;case 4:return o=Pt(),n.flags|=o,0;case 12:return o=Pt(),x[o+0>>1]=2,0;case 13:case 14:return 0;case 16:case 8:return-28;case 9:return H[nr()>>2]=28,-1;default:return-28}}catch(e){return void 0!==Dt&&e instanceof Ve||Oe(e),-e.A}},__sys_ioctl:function(e,t,r){yt=r;try{var n=bt(e);switch(t){case 21509:case 21505:return n.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return n.tty?0:-59;case 21519:if(!n.tty)return-59;var o=Pt();return H[o>>2]=0;case 21520:return n.tty?-28:-59;case 21531:if(e=o=Pt(),!n.j.ta)throw new Ve(59);return n.j.ta(n,t,e);case 21523:case 21524:return n.tty?0:-59;default:Oe("bad ioctl syscall "+t)}}catch(e){return void 0!==Dt&&e instanceof Ve||Oe(e),-e.A}},__sys_open:function(e,t,r){yt=r;try{return ft(S(e),t,r?Pt():0).fd}catch(e){return void 0!==Dt&&e instanceof Ve||Oe(e),-e.A}},_embind_register_bigint:function(){},_embind_register_bool:function(e,t,r,n,o){var i=Mt(r);Ut(e,{name:t=mt(t),fromWireType:function(e){return!!e},toWireType:function(e,t){return t?n:o},argPackAdvance:8,readValueFromPointer:function(e){if(1===r)var n=U;else if(2===r)n=x;else{if(4!==r)throw new TypeError("Unknown boolean type size: "+t);n=H}return this.fromWireType(n[e>>i])},H:null})},_embind_register_emval:function(e,t){Ut(e,{name:t=mt(t),fromWireType:function(e){var t=xt[e].value;return 4>>s}}var c=t.includes("unsigned");Ut(e,{name:t,fromWireType:i,toWireType:function(e,r){if("number"!=typeof r&&"boolean"!=typeof r)throw new TypeError('Cannot convert "'+Ht(r)+'" to '+this.name);if(ro)throw new TypeError('Passing a number "'+Ht(r)+'" from JS side to C/C++ side to an argument of type "'+t+'", which is outside the valid range ['+n+", "+o+"]!");return c?r>>>0:0|r},argPackAdvance:8,readValueFromPointer:Xt(t,a,0!==n),H:null})},_embind_register_memory_view:function(e,t,r){function n(e){var t=C;return new o(j,t[(e>>=2)+1],t[e])}var o=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][t];Ut(e,{name:r=mt(r),fromWireType:n,argPackAdvance:8,readValueFromPointer:n},{ra:!0})},_embind_register_std_string:function(e,t){var r="std::string"===(t=mt(t));Ut(e,{name:t,fromWireType:function(e){var t=C[e>>2];if(r)for(var n=e+4,o=0;o<=t;++o){var i=e+4+o;if(o==t||0==N[i]){if(n=S(n,i-n),void 0===a)var a=n;else a+=String.fromCharCode(0),a+=n;n=i+1}}else{for(a=Array(t),o=0;o>2]=o,r&&n)F(t,i+4,o+1);else if(n)for(n=0;n>2],i=a(),c=e+4,d=0;d<=o;++d){var u=e+4+d*t;d!=o&&0!=i[u>>s]||(c=n(c,u-c),void 0===r?r=c:(r+=String.fromCharCode(0),r+=c),c=u+t)}return tr(e),r},toWireType:function(e,n){"string"!=typeof n&&jt("Cannot pass non-string to C++ string type "+r);var a=i(n),c=er(4+a+t);return C[c>>2]=a>>s,o(n,c+4,a+t),null!==e&&e.push(tr,c),c},argPackAdvance:8,readValueFromPointer:kt,H:function(e){tr(e)}})},_embind_register_void:function(e,t){Ut(e,{La:!0,name:t=mt(t),argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},abort:function(){Oe()},emscripten_memcpy_big:function(e,t,r){N.copyWithin(e,t,t+r)},emscripten_resize_heap:function(e){var t=N.length;if(R((e>>>=0)>t),2147483648=r;r*=2){var n=t*(1+.2/r);n=Math.min(n,e+100663296),0<(n=Math.max(e,n))%65536&&(n+=65536-n%65536);e:{var o=n=Math.min(2147483648,n);try{b.grow(o-j.byteLength+65535>>>16),q();var i=1;break e}catch(e){T("emscripten_realloc_buffer: Attempted to grow heap from "+j.byteLength+" bytes to "+o+" bytes, but got error: "+e)}i=void 0}if(i)return!0}return T("Failed to grow the heap from "+t+" bytes to "+n+" bytes, not enough memory!"),!1},environ_get:function(e,t){var r=0;return Wt().forEach((function(n,o){var i=t+r;for(o=H[e+4*o>>2]=i,i=0;i>0]=n.charCodeAt(i);U[o>>0]=0,r+=n.length+1})),0},environ_sizes_get:function(e,t){var r=Wt();H[e>>2]=r.length;var n=0;return r.forEach((function(e){n+=e.length+1})),H[t>>2]=n,0},fd_close:function(e){try{var t=bt(e);if(null===t.fd)throw new Ve(8);t.V&&(t.V=null);try{t.j.close&&t.j.close(t)}catch(e){throw e}finally{We[t.fd]=null}return t.fd=null,0}catch(e){return void 0!==Dt&&e instanceof Ve||Oe(e),e.A}},fd_read:function(e,t,r,n){try{e:{for(var o=bt(e),i=e=0;i>2],s=o,c=H[t+8*i>>2],d=a,u=void 0,p=U;if(0>d||0>u)throw new Ve(28);if(null===s.fd)throw new Ve(8);if(1==(2097155&s.flags))throw new Ve(8);if(16384==(61440&s.node.mode))throw new Ve(31);if(!s.j.read)throw new Ve(28);var l=void 0!==u;if(l){if(!s.seekable)throw new Ve(70)}else u=s.position;var E=s.j.read(s,p,c,d,u);l||(s.position+=E);var f=E;if(0>f){var O=-1;break e}if(e+=f,f>2]=O,0}catch(e){return void 0!==Dt&&e instanceof Ve||Oe(e),e.A}},fd_seek:function(e,t,r,n,o){try{var i=bt(e);return-9007199254740992>=(e=4294967296*r+(t>>>0))||9007199254740992<=e?-61:(Ot(i,e,n),ue=[i.position>>>0,(de=i.position,1<=+Math.abs(de)?0>>0:~~+Math.ceil((de-+(~~de>>>0))/4294967296)>>>0:0)],H[o>>2]=ue[0],H[o+4>>2]=ue[1],i.V&&0===e&&0===n&&(i.V=null),0)}catch(e){return void 0!==Dt&&e instanceof Ve||Oe(e),e.A}},fd_write:function(e,t,r,n){try{e:{for(var o=bt(e),i=e=0;i>2],c=H[t+(8*i+4)>>2],d=void 0,u=U;if(0>c||0>d)throw new Ve(28);if(null===a.fd)throw new Ve(8);if(0==(2097155&a.flags))throw new Ve(8);if(16384==(61440&a.node.mode))throw new Ve(31);if(!a.j.write)throw new Ve(28);a.seekable&&1024&a.flags&&Ot(a,0,2);var p=void 0!==d;if(p){if(!a.seekable)throw new Ve(70)}else d=a.position;var l=a.j.write(a,u,s,c,d,void 0);p||(a.position+=l);var E=l;if(0>E){var f=-1;break e}e+=E}f=e}return H[n>>2]=f,0}catch(e){return void 0!==Dt&&e instanceof Ve||Oe(e),e.A}},getTempRet0:function(){return P},invoke_ddd:function(e,t,r){var n=or();try{return K.get(e)(t,r)}catch(e){if(ir(n),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_diii:function(e,t,r,n){var o=or();try{return K.get(e)(t,r,n)}catch(e){if(ir(o),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_fii:function(e,t,r){var n=or();try{return K.get(e)(t,r)}catch(e){if(ir(n),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_fiii:function(e,t,r,n){var o=or();try{return K.get(e)(t,r,n)}catch(e){if(ir(o),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_fiiii:function(e,t,r,n,o){var i=or();try{return K.get(e)(t,r,n,o)}catch(e){if(ir(i),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_fiiiiiiiii:function(e,t,r,n,o,i,a,s,c,d){var u=or();try{return K.get(e)(t,r,n,o,i,a,s,c,d)}catch(e){if(ir(u),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_fiiiiiiiiii:function(e,t,r,n,o,i,a,s,c,d,u){var p=or();try{return K.get(e)(t,r,n,o,i,a,s,c,d,u)}catch(e){if(ir(p),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_fiiiiiiiiiiiiiiii:function(e,t,r,n,o,i,a,s,c,d,u,p,l,E,f,O,h){var g=or();try{return K.get(e)(t,r,n,o,i,a,s,c,d,u,p,l,E,f,O,h)}catch(e){if(ir(g),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_i:function(e){var t=or();try{return K.get(e)()}catch(e){if(ir(t),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_id:function(e,t){var r=or();try{return K.get(e)(t)}catch(e){if(ir(r),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_ii:function(e,t){var r=or();try{return K.get(e)(t)}catch(e){if(ir(r),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iif:function(e,t,r){var n=or();try{return K.get(e)(t,r)}catch(e){if(ir(n),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iii:function(e,t,r){var n=or();try{return K.get(e)(t,r)}catch(e){if(ir(n),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iiii:function(e,t,r,n){var o=or();try{return K.get(e)(t,r,n)}catch(e){if(ir(o),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iiiidi:function(e,t,r,n,o,i){var a=or();try{return K.get(e)(t,r,n,o,i)}catch(e){if(ir(a),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iiiii:function(e,t,r,n,o){var i=or();try{return K.get(e)(t,r,n,o)}catch(e){if(ir(i),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iiiiid:function(e,t,r,n,o,i){var a=or();try{return K.get(e)(t,r,n,o,i)}catch(e){if(ir(a),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iiiiii:function(e,t,r,n,o,i){var a=or();try{return K.get(e)(t,r,n,o,i)}catch(e){if(ir(a),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iiiiiii:function(e,t,r,n,o,i,a){var s=or();try{return K.get(e)(t,r,n,o,i,a)}catch(e){if(ir(s),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iiiiiiii:function(e,t,r,n,o,i,a,s){var c=or();try{return K.get(e)(t,r,n,o,i,a,s)}catch(e){if(ir(c),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iiiiiiiiiii:function(e,t,r,n,o,i,a,s,c,d,u){var p=or();try{return K.get(e)(t,r,n,o,i,a,s,c,d,u)}catch(e){if(ir(p),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iiiiiiiiiiii:function(e,t,r,n,o,i,a,s,c,d,u,p){var l=or();try{return K.get(e)(t,r,n,o,i,a,s,c,d,u,p)}catch(e){if(ir(l),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_iiiiiiiiiiiii:function(e,t,r,n,o,i,a,s,c,d,u,p,l){var E=or();try{return K.get(e)(t,r,n,o,i,a,s,c,d,u,p,l)}catch(e){if(ir(E),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_jiiii:function(e,t,r,n,o){var i=or();try{return lr(e,t,r,n,o)}catch(e){if(ir(i),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_v:function(e){var t=or();try{K.get(e)()}catch(e){if(ir(t),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_vi:function(e,t){var r=or();try{K.get(e)(t)}catch(e){if(ir(r),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_vid:function(e,t,r){var n=or();try{K.get(e)(t,r)}catch(e){if(ir(n),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_vii:function(e,t,r){var n=or();try{K.get(e)(t,r)}catch(e){if(ir(n),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_viid:function(e,t,r,n){var o=or();try{K.get(e)(t,r,n)}catch(e){if(ir(o),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_viif:function(e,t,r,n){var o=or();try{K.get(e)(t,r,n)}catch(e){if(ir(o),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_viii:function(e,t,r,n){var o=or();try{K.get(e)(t,r,n)}catch(e){if(ir(o),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_viiii:function(e,t,r,n,o){var i=or();try{K.get(e)(t,r,n,o)}catch(e){if(ir(i),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_viiiii:function(e,t,r,n,o,i){var a=or();try{K.get(e)(t,r,n,o,i)}catch(e){if(ir(a),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_viiiiii:function(e,t,r,n,o,i,a){var s=or();try{K.get(e)(t,r,n,o,i,a)}catch(e){if(ir(s),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_viiiiiii:function(e,t,r,n,o,i,a,s){var c=or();try{K.get(e)(t,r,n,o,i,a,s)}catch(e){if(ir(c),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_viiiiiiiii:function(e,t,r,n,o,i,a,s,c,d){var u=or();try{K.get(e)(t,r,n,o,i,a,s,c,d)}catch(e){if(ir(u),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_viiiiiiiiii:function(e,t,r,n,o,i,a,s,c,d,u){var p=or();try{K.get(e)(t,r,n,o,i,a,s,c,d,u)}catch(e){if(ir(p),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_viiiiiiiiiii:function(e,t,r,n,o,i,a,s,c,d,u,p){var l=or();try{K.get(e)(t,r,n,o,i,a,s,c,d,u,p)}catch(e){if(ir(l),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},invoke_viiiiiiiiiiiiiii:function(e,t,r,n,o,i,a,s,c,d,u,p,l,E,f,O){var h=or();try{K.get(e)(t,r,n,o,i,a,s,c,d,u,p,l,E,f,O)}catch(e){if(ir(h),e!==e+0&&"longjmp"!==e)throw e;cr(1,0)}},llvm_eh_typeid_for:function(e){return e},setTempRet0:function(e){P=e},strftime_l:function(e,t,r,n){return function(e,t,r,n){function o(e,t,r){for(e="number"==typeof e?e.toString():e||"";e.lengthe?-1:0=a(r,e)?0>=a(t,e)?e.getFullYear()+1:e.getFullYear():e.getFullYear()-1}var d=H[n+40>>2];for(var u in n={Fa:H[n>>2],Ea:H[n+4>>2],P:H[n+8>>2],L:H[n+12>>2],G:H[n+16>>2],m:H[n+20>>2],R:H[n+24>>2],S:H[n+28>>2],Na:H[n+32>>2],Da:H[n+36>>2],Ga:d?S(d):""},r=S(r),d={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"})r=r.replace(new RegExp(u,"g"),d[u]);var p="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),l="January February March April May June July August September October November December".split(" ");for(u in d={"%a":function(e){return p[e.R].substring(0,3)},"%A":function(e){return p[e.R]},"%b":function(e){return l[e.G].substring(0,3)},"%B":function(e){return l[e.G]},"%C":function(e){return i((e.m+1900)/100|0,2)},"%d":function(e){return i(e.L,2)},"%e":function(e){return o(e.L,2," ")},"%g":function(e){return c(e).toString().substring(2)},"%G":function(e){return c(e)},"%H":function(e){return i(e.P,2)},"%I":function(e){return 0==(e=e.P)?e=12:12e.P?"AM":"PM"},"%S":function(e){return i(e.Fa,2)},"%t":function(){return"\t"},"%u":function(e){return e.R||7},"%U":function(e){var t=new Date(e.m+1900,0,1),r=0===t.getDay()?t:zt(t,7-t.getDay());return 0>a(r,e=new Date(e.m+1900,e.G,e.L))?i(Math.ceil((31-r.getDate()+(Gt(Bt(e.getFullYear())?Yt:Vt,e.getMonth()-1)-31)+e.getDate())/7),2):0===a(r,t)?"01":"00"},"%V":function(e){var t=new Date(e.m+1901,0,4),r=s(new Date(e.m+1900,0,4));t=s(t);var n=zt(new Date(e.m+1900,0,1),e.S);return 0>a(n,r)?"53":0>=a(t,n)?"01":i(Math.ceil((r.getFullYear()a(r,e=new Date(e.m+1900,e.G,e.L))?i(Math.ceil((31-r.getDate()+(Gt(Bt(e.getFullYear())?Yt:Vt,e.getMonth()-1)-31)+e.getDate())/7),2):0===a(r,t)?"01":"00"},"%y":function(e){return(e.m+1900).toString().substring(2)},"%Y":function(e){return e.m+1900},"%z":function(e){var t=0<=(e=e.Da);return e=Math.abs(e)/60,(t?"+":"-")+String("0000"+(e/60*100+e%60)).slice(-4)},"%Z":function(e){return e.Ga},"%%":function(){return"%"}})r.includes(u)&&(r=r.replace(new RegExp(u,"g"),d[u](n)));return(u=Jt(r,!1)).length>t?0:(Z(u,e),u.length-1)}(e,t,r,n)}};!function(){function e(e){r.asm=e.exports,R(b=r.asm.memory,"memory not found in wasm exports"),q(),R(K=r.asm.__indirect_function_table,"table not found in wasm exports"),oe.unshift(r.asm.__wasm_call_ctors),pe--,r.monitorRunDependencies&&r.monitorRunDependencies(pe),R(fe["wasm-instantiate"]),delete fe["wasm-instantiate"],0==pe&&(null!==le&&(clearInterval(le),le=null),Ee&&(e=Ee,Ee=null,e()))}function t(t){R(r===a,"the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?"),a=null,e(t.instance)}function n(e){return function(){if(!y&&(c||d)){if("function"==typeof fetch&&!ce.startsWith("file://"))return fetch(ce,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+ce+"'";return e.arrayBuffer()})).catch((function(){return Te()}));if(E)return new Promise((function(e,t){E(ce,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return Te()}))}().then((function(e){return WebAssembly.instantiate(e,i)})).then((function(e){return e})).then(e,(function(e){T("failed to asynchronously prepare wasm: "+e),ce.startsWith("file://")&&T("warning: Loading from a file URI ("+ce+") is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing"),Oe(e)}))}var i={env:$t,wasi_snapshot_preview1:$t};pe++,r.monitorRunDependencies&&r.monitorRunDependencies(pe),R(!fe["wasm-instantiate"]),fe["wasm-instantiate"]=1,null===le&&"undefined"!=typeof setInterval&&(le=setInterval((function(){if(M)clearInterval(le),le=null;else{var e,t=!1;for(e in fe)t||(t=!0,T("still waiting on run dependencies:")),T("dependency: "+e);t&&T("(end of list)")}}),1e4));var a=r;if(r.instantiateWasm)try{return r.instantiateWasm(i,e)}catch(e){return T("Module.instantiateWasm callback failed with error: "+e),!1}(y||"function"!=typeof WebAssembly.instantiateStreaming||he()||ce.startsWith("file://")||"function"!=typeof fetch?n(t):fetch(ce,{credentials:"same-origin"}).then((function(e){return WebAssembly.instantiateStreaming(e,i).then(t,(function(e){return T("wasm streaming compile failed: "+e),T("falling back to ArrayBuffer instantiation"),n(t)}))}))).catch(o)}(),r.___wasm_call_ctors=ge("__wasm_call_ctors"),r._acuantMetrics=ge("acuantMetrics"),r._acuantMoire=ge("acuantMoire");var er=r._malloc=ge("malloc"),tr=r._free=ge("free");r._fflush=ge("fflush"),r.___getTypeName=ge("__getTypeName"),r.___embind_register_native_and_builtin_types=ge("__embind_register_native_and_builtin_types");var rr=r._emscripten_stack_get_end=function(){return(rr=r._emscripten_stack_get_end=r.asm.emscripten_stack_get_end).apply(null,arguments)},nr=r.___errno_location=ge("__errno_location"),or=r.stackSave=ge("stackSave"),ir=r.stackRestore=ge("stackRestore"),ar=r.stackAlloc=ge("stackAlloc"),sr=r._emscripten_stack_init=function(){return(sr=r._emscripten_stack_init=r.asm.emscripten_stack_init).apply(null,arguments)};r._emscripten_stack_get_free=function(){return(r._emscripten_stack_get_free=r.asm.emscripten_stack_get_free).apply(null,arguments)};var cr=r._setThrew=ge("setThrew"),dr=r.___cxa_can_catch=ge("__cxa_can_catch"),ur=r.___cxa_is_pointer_type=ge("__cxa_is_pointer_type");r.dynCall_jiji=ge("dynCall_jiji");var pr,lr=r.dynCall_jiiii=ge("dynCall_jiiii");function Er(){function e(){if(!pr&&(pr=!0,r.calledRun=!0,!M)){if(ee(),R(!ae),ae=!0,!r.noFSInit&&!it){R(!it,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)"),it=!0,ht(),r.stdin=r.stdin,r.stdout=r.stdout,r.stderr=r.stderr,r.stdin?gt("stdin",r.stdin):lt("/dev/tty","/dev/stdin"),r.stdout?gt("stdout",null,r.stdout):lt("/dev/tty","/dev/stdout"),r.stderr?gt("stderr",null,r.stderr):lt("/dev/tty1","/dev/stderr");var e=ft("/dev/stdin",0),t=ft("/dev/stdout",1),o=ft("/dev/stderr",1);R(0===e.fd,"invalid handle for stdin ("+e.fd+")"),R(1===t.fd,"invalid handle for stdout ("+t.fd+")"),R(2===o.fd,"invalid handle for stderr ("+o.fd+")")}if(Ye=!1,we(oe),n(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),R(!r._main,'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'),ee(),r.postRun)for("function"==typeof r.postRun&&(r.postRun=[r.postRun]);r.postRun.length;)e=r.postRun.shift(),ie.unshift(e);we(ie)}}if(!(0>0];case"i16":return x[e>>1];case"i32":case"i64":return H[e>>2];case"float":return X[e>>2];case"double":return Q[e>>3];default:Oe("invalid type for getValue: "+t)}return null},Object.getOwnPropertyDescriptor(r,"allocate")||(r.allocate=function(){Oe("'allocate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"UTF8ArrayToString")||(r.UTF8ArrayToString=function(){Oe("'UTF8ArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"UTF8ToString")||(r.UTF8ToString=function(){Oe("'UTF8ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"stringToUTF8Array")||(r.stringToUTF8Array=function(){Oe("'stringToUTF8Array' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"stringToUTF8")||(r.stringToUTF8=function(){Oe("'stringToUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"lengthBytesUTF8")||(r.lengthBytesUTF8=function(){Oe("'lengthBytesUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"stackTrace")||(r.stackTrace=function(){Oe("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"addOnPreRun")||(r.addOnPreRun=function(){Oe("'addOnPreRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"addOnInit")||(r.addOnInit=function(){Oe("'addOnInit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"addOnPreMain")||(r.addOnPreMain=function(){Oe("'addOnPreMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"addOnExit")||(r.addOnExit=function(){Oe("'addOnExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"addOnPostRun")||(r.addOnPostRun=function(){Oe("'addOnPostRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"writeStringToMemory")||(r.writeStringToMemory=function(){Oe("'writeStringToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"writeArrayToMemory")||(r.writeArrayToMemory=function(){Oe("'writeArrayToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"writeAsciiToMemory")||(r.writeAsciiToMemory=function(){Oe("'writeAsciiToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"addRunDependency")||(r.addRunDependency=function(){Oe("'addRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(r,"removeRunDependency")||(r.removeRunDependency=function(){Oe("'removeRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(r,"FS_createFolder")||(r.FS_createFolder=function(){Oe("'FS_createFolder' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"FS_createPath")||(r.FS_createPath=function(){Oe("'FS_createPath' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(r,"FS_createDataFile")||(r.FS_createDataFile=function(){Oe("'FS_createDataFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(r,"FS_createPreloadedFile")||(r.FS_createPreloadedFile=function(){Oe("'FS_createPreloadedFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(r,"FS_createLazyFile")||(r.FS_createLazyFile=function(){Oe("'FS_createLazyFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(r,"FS_createLink")||(r.FS_createLink=function(){Oe("'FS_createLink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"FS_createDevice")||(r.FS_createDevice=function(){Oe("'FS_createDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(r,"FS_unlink")||(r.FS_unlink=function(){Oe("'FS_unlink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you")}),Object.getOwnPropertyDescriptor(r,"getLEB")||(r.getLEB=function(){Oe("'getLEB' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getFunctionTables")||(r.getFunctionTables=function(){Oe("'getFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"alignFunctionTables")||(r.alignFunctionTables=function(){Oe("'alignFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerFunctions")||(r.registerFunctions=function(){Oe("'registerFunctions' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"addFunction")||(r.addFunction=function(){Oe("'addFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"removeFunction")||(r.removeFunction=function(){Oe("'removeFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getFuncWrapper")||(r.getFuncWrapper=function(){Oe("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"prettyPrint")||(r.prettyPrint=function(){Oe("'prettyPrint' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"dynCall")||(r.dynCall=function(){Oe("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getCompilerSetting")||(r.getCompilerSetting=function(){Oe("'getCompilerSetting' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"print")||(r.print=function(){Oe("'print' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"printErr")||(r.printErr=function(){Oe("'printErr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getTempRet0")||(r.getTempRet0=function(){Oe("'getTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"setTempRet0")||(r.setTempRet0=function(){Oe("'setTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"callMain")||(r.callMain=function(){Oe("'callMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"abort")||(r.abort=function(){Oe("'abort' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"keepRuntimeAlive")||(r.keepRuntimeAlive=function(){Oe("'keepRuntimeAlive' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"zeroMemory")||(r.zeroMemory=function(){Oe("'zeroMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"stringToNewUTF8")||(r.stringToNewUTF8=function(){Oe("'stringToNewUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"setFileTime")||(r.setFileTime=function(){Oe("'setFileTime' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"emscripten_realloc_buffer")||(r.emscripten_realloc_buffer=function(){Oe("'emscripten_realloc_buffer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"ENV")||(r.ENV=function(){Oe("'ENV' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"ERRNO_CODES")||(r.ERRNO_CODES=function(){Oe("'ERRNO_CODES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"ERRNO_MESSAGES")||(r.ERRNO_MESSAGES=function(){Oe("'ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"setErrNo")||(r.setErrNo=function(){Oe("'setErrNo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"inetPton4")||(r.inetPton4=function(){Oe("'inetPton4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"inetNtop4")||(r.inetNtop4=function(){Oe("'inetNtop4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"inetPton6")||(r.inetPton6=function(){Oe("'inetPton6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"inetNtop6")||(r.inetNtop6=function(){Oe("'inetNtop6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"readSockaddr")||(r.readSockaddr=function(){Oe("'readSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"writeSockaddr")||(r.writeSockaddr=function(){Oe("'writeSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"DNS")||(r.DNS=function(){Oe("'DNS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getHostByName")||(r.getHostByName=function(){Oe("'getHostByName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"GAI_ERRNO_MESSAGES")||(r.GAI_ERRNO_MESSAGES=function(){Oe("'GAI_ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"Protocols")||(r.Protocols=function(){Oe("'Protocols' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"Sockets")||(r.Sockets=function(){Oe("'Sockets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getRandomDevice")||(r.getRandomDevice=function(){Oe("'getRandomDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"traverseStack")||(r.traverseStack=function(){Oe("'traverseStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"UNWIND_CACHE")||(r.UNWIND_CACHE=function(){Oe("'UNWIND_CACHE' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"withBuiltinMalloc")||(r.withBuiltinMalloc=function(){Oe("'withBuiltinMalloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"readAsmConstArgsArray")||(r.readAsmConstArgsArray=function(){Oe("'readAsmConstArgsArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"readAsmConstArgs")||(r.readAsmConstArgs=function(){Oe("'readAsmConstArgs' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"mainThreadEM_ASM")||(r.mainThreadEM_ASM=function(){Oe("'mainThreadEM_ASM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"jstoi_q")||(r.jstoi_q=function(){Oe("'jstoi_q' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"jstoi_s")||(r.jstoi_s=function(){Oe("'jstoi_s' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getExecutableName")||(r.getExecutableName=function(){Oe("'getExecutableName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"listenOnce")||(r.listenOnce=function(){Oe("'listenOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"autoResumeAudioContext")||(r.autoResumeAudioContext=function(){Oe("'autoResumeAudioContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"dynCallLegacy")||(r.dynCallLegacy=function(){Oe("'dynCallLegacy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getDynCaller")||(r.getDynCaller=function(){Oe("'getDynCaller' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"dynCall")||(r.dynCall=function(){Oe("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"callRuntimeCallbacks")||(r.callRuntimeCallbacks=function(){Oe("'callRuntimeCallbacks' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"handleException")||(r.handleException=function(){Oe("'handleException' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"runtimeKeepalivePush")||(r.runtimeKeepalivePush=function(){Oe("'runtimeKeepalivePush' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"runtimeKeepalivePop")||(r.runtimeKeepalivePop=function(){Oe("'runtimeKeepalivePop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"callUserCallback")||(r.callUserCallback=function(){Oe("'callUserCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"maybeExit")||(r.maybeExit=function(){Oe("'maybeExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"safeSetTimeout")||(r.safeSetTimeout=function(){Oe("'safeSetTimeout' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"asmjsMangle")||(r.asmjsMangle=function(){Oe("'asmjsMangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"asyncLoad")||(r.asyncLoad=function(){Oe("'asyncLoad' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"alignMemory")||(r.alignMemory=function(){Oe("'alignMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"mmapAlloc")||(r.mmapAlloc=function(){Oe("'mmapAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"reallyNegative")||(r.reallyNegative=function(){Oe("'reallyNegative' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"unSign")||(r.unSign=function(){Oe("'unSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"reSign")||(r.reSign=function(){Oe("'reSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"formatString")||(r.formatString=function(){Oe("'formatString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"PATH")||(r.PATH=function(){Oe("'PATH' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"PATH_FS")||(r.PATH_FS=function(){Oe("'PATH_FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"SYSCALLS")||(r.SYSCALLS=function(){Oe("'SYSCALLS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"syscallMmap2")||(r.syscallMmap2=function(){Oe("'syscallMmap2' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"syscallMunmap")||(r.syscallMunmap=function(){Oe("'syscallMunmap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getSocketFromFD")||(r.getSocketFromFD=function(){Oe("'getSocketFromFD' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getSocketAddress")||(r.getSocketAddress=function(){Oe("'getSocketAddress' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"JSEvents")||(r.JSEvents=function(){Oe("'JSEvents' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerKeyEventCallback")||(r.registerKeyEventCallback=function(){Oe("'registerKeyEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"specialHTMLTargets")||(r.specialHTMLTargets=function(){Oe("'specialHTMLTargets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"maybeCStringToJsString")||(r.maybeCStringToJsString=function(){Oe("'maybeCStringToJsString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"findEventTarget")||(r.findEventTarget=function(){Oe("'findEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"findCanvasEventTarget")||(r.findCanvasEventTarget=function(){Oe("'findCanvasEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getBoundingClientRect")||(r.getBoundingClientRect=function(){Oe("'getBoundingClientRect' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"fillMouseEventData")||(r.fillMouseEventData=function(){Oe("'fillMouseEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerMouseEventCallback")||(r.registerMouseEventCallback=function(){Oe("'registerMouseEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerWheelEventCallback")||(r.registerWheelEventCallback=function(){Oe("'registerWheelEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerUiEventCallback")||(r.registerUiEventCallback=function(){Oe("'registerUiEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerFocusEventCallback")||(r.registerFocusEventCallback=function(){Oe("'registerFocusEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"fillDeviceOrientationEventData")||(r.fillDeviceOrientationEventData=function(){Oe("'fillDeviceOrientationEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerDeviceOrientationEventCallback")||(r.registerDeviceOrientationEventCallback=function(){Oe("'registerDeviceOrientationEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"fillDeviceMotionEventData")||(r.fillDeviceMotionEventData=function(){Oe("'fillDeviceMotionEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerDeviceMotionEventCallback")||(r.registerDeviceMotionEventCallback=function(){Oe("'registerDeviceMotionEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"screenOrientation")||(r.screenOrientation=function(){Oe("'screenOrientation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"fillOrientationChangeEventData")||(r.fillOrientationChangeEventData=function(){Oe("'fillOrientationChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerOrientationChangeEventCallback")||(r.registerOrientationChangeEventCallback=function(){Oe("'registerOrientationChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"fillFullscreenChangeEventData")||(r.fillFullscreenChangeEventData=function(){Oe("'fillFullscreenChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerFullscreenChangeEventCallback")||(r.registerFullscreenChangeEventCallback=function(){Oe("'registerFullscreenChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerRestoreOldStyle")||(r.registerRestoreOldStyle=function(){Oe("'registerRestoreOldStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"hideEverythingExceptGivenElement")||(r.hideEverythingExceptGivenElement=function(){Oe("'hideEverythingExceptGivenElement' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"restoreHiddenElements")||(r.restoreHiddenElements=function(){Oe("'restoreHiddenElements' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"setLetterbox")||(r.setLetterbox=function(){Oe("'setLetterbox' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"currentFullscreenStrategy")||(r.currentFullscreenStrategy=function(){Oe("'currentFullscreenStrategy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"restoreOldWindowedStyle")||(r.restoreOldWindowedStyle=function(){Oe("'restoreOldWindowedStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"softFullscreenResizeWebGLRenderTarget")||(r.softFullscreenResizeWebGLRenderTarget=function(){Oe("'softFullscreenResizeWebGLRenderTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"doRequestFullscreen")||(r.doRequestFullscreen=function(){Oe("'doRequestFullscreen' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"fillPointerlockChangeEventData")||(r.fillPointerlockChangeEventData=function(){Oe("'fillPointerlockChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerPointerlockChangeEventCallback")||(r.registerPointerlockChangeEventCallback=function(){Oe("'registerPointerlockChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerPointerlockErrorEventCallback")||(r.registerPointerlockErrorEventCallback=function(){Oe("'registerPointerlockErrorEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"requestPointerLock")||(r.requestPointerLock=function(){Oe("'requestPointerLock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"fillVisibilityChangeEventData")||(r.fillVisibilityChangeEventData=function(){Oe("'fillVisibilityChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerVisibilityChangeEventCallback")||(r.registerVisibilityChangeEventCallback=function(){Oe("'registerVisibilityChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerTouchEventCallback")||(r.registerTouchEventCallback=function(){Oe("'registerTouchEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"fillGamepadEventData")||(r.fillGamepadEventData=function(){Oe("'fillGamepadEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerGamepadEventCallback")||(r.registerGamepadEventCallback=function(){Oe("'registerGamepadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerBeforeUnloadEventCallback")||(r.registerBeforeUnloadEventCallback=function(){Oe("'registerBeforeUnloadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"fillBatteryEventData")||(r.fillBatteryEventData=function(){Oe("'fillBatteryEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"battery")||(r.battery=function(){Oe("'battery' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerBatteryEventCallback")||(r.registerBatteryEventCallback=function(){Oe("'registerBatteryEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"setCanvasElementSize")||(r.setCanvasElementSize=function(){Oe("'setCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getCanvasElementSize")||(r.getCanvasElementSize=function(){Oe("'getCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"polyfillSetImmediate")||(r.polyfillSetImmediate=function(){Oe("'polyfillSetImmediate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"demangle")||(r.demangle=function(){Oe("'demangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"demangleAll")||(r.demangleAll=function(){Oe("'demangleAll' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"jsStackTrace")||(r.jsStackTrace=function(){Oe("'jsStackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"stackTrace")||(r.stackTrace=function(){Oe("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getEnvStrings")||(r.getEnvStrings=function(){Oe("'getEnvStrings' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"checkWasiClock")||(r.checkWasiClock=function(){Oe("'checkWasiClock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"writeI53ToI64")||(r.writeI53ToI64=function(){Oe("'writeI53ToI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"writeI53ToI64Clamped")||(r.writeI53ToI64Clamped=function(){Oe("'writeI53ToI64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"writeI53ToI64Signaling")||(r.writeI53ToI64Signaling=function(){Oe("'writeI53ToI64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"writeI53ToU64Clamped")||(r.writeI53ToU64Clamped=function(){Oe("'writeI53ToU64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"writeI53ToU64Signaling")||(r.writeI53ToU64Signaling=function(){Oe("'writeI53ToU64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"readI53FromI64")||(r.readI53FromI64=function(){Oe("'readI53FromI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"readI53FromU64")||(r.readI53FromU64=function(){Oe("'readI53FromU64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"convertI32PairToI53")||(r.convertI32PairToI53=function(){Oe("'convertI32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"convertU32PairToI53")||(r.convertU32PairToI53=function(){Oe("'convertU32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"uncaughtExceptionCount")||(r.uncaughtExceptionCount=function(){Oe("'uncaughtExceptionCount' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"exceptionLast")||(r.exceptionLast=function(){Oe("'exceptionLast' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"exceptionCaught")||(r.exceptionCaught=function(){Oe("'exceptionCaught' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"ExceptionInfo")||(r.ExceptionInfo=function(){Oe("'ExceptionInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"CatchInfo")||(r.CatchInfo=function(){Oe("'CatchInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"exception_addRef")||(r.exception_addRef=function(){Oe("'exception_addRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"exception_decRef")||(r.exception_decRef=function(){Oe("'exception_decRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"Browser")||(r.Browser=function(){Oe("'Browser' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"funcWrappers")||(r.funcWrappers=function(){Oe("'funcWrappers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getFuncWrapper")||(r.getFuncWrapper=function(){Oe("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"setMainLoop")||(r.setMainLoop=function(){Oe("'setMainLoop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"wget")||(r.wget=function(){Oe("'wget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"FS")||(r.FS=function(){Oe("'FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"MEMFS")||(r.MEMFS=function(){Oe("'MEMFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"TTY")||(r.TTY=function(){Oe("'TTY' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"PIPEFS")||(r.PIPEFS=function(){Oe("'PIPEFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"SOCKFS")||(r.SOCKFS=function(){Oe("'SOCKFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"_setNetworkCallback")||(r._setNetworkCallback=function(){Oe("'_setNetworkCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"tempFixedLengthArray")||(r.tempFixedLengthArray=function(){Oe("'tempFixedLengthArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"miniTempWebGLFloatBuffers")||(r.miniTempWebGLFloatBuffers=function(){Oe("'miniTempWebGLFloatBuffers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"heapObjectForWebGLType")||(r.heapObjectForWebGLType=function(){Oe("'heapObjectForWebGLType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"heapAccessShiftForWebGLHeap")||(r.heapAccessShiftForWebGLHeap=function(){Oe("'heapAccessShiftForWebGLHeap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"GL")||(r.GL=function(){Oe("'GL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"emscriptenWebGLGet")||(r.emscriptenWebGLGet=function(){Oe("'emscriptenWebGLGet' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"computeUnpackAlignedImageSize")||(r.computeUnpackAlignedImageSize=function(){Oe("'computeUnpackAlignedImageSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"emscriptenWebGLGetTexPixelData")||(r.emscriptenWebGLGetTexPixelData=function(){Oe("'emscriptenWebGLGetTexPixelData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"emscriptenWebGLGetUniform")||(r.emscriptenWebGLGetUniform=function(){Oe("'emscriptenWebGLGetUniform' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"webglGetUniformLocation")||(r.webglGetUniformLocation=function(){Oe("'webglGetUniformLocation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"webglPrepareUniformLocationsBeforeFirstUse")||(r.webglPrepareUniformLocationsBeforeFirstUse=function(){Oe("'webglPrepareUniformLocationsBeforeFirstUse' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"webglGetLeftBracePos")||(r.webglGetLeftBracePos=function(){Oe("'webglGetLeftBracePos' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"emscriptenWebGLGetVertexAttrib")||(r.emscriptenWebGLGetVertexAttrib=function(){Oe("'emscriptenWebGLGetVertexAttrib' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"writeGLArray")||(r.writeGLArray=function(){Oe("'writeGLArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"AL")||(r.AL=function(){Oe("'AL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"SDL_unicode")||(r.SDL_unicode=function(){Oe("'SDL_unicode' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"SDL_ttfContext")||(r.SDL_ttfContext=function(){Oe("'SDL_ttfContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"SDL_audio")||(r.SDL_audio=function(){Oe("'SDL_audio' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"SDL")||(r.SDL=function(){Oe("'SDL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"SDL_gfx")||(r.SDL_gfx=function(){Oe("'SDL_gfx' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"GLUT")||(r.GLUT=function(){Oe("'GLUT' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"EGL")||(r.EGL=function(){Oe("'EGL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"GLFW_Window")||(r.GLFW_Window=function(){Oe("'GLFW_Window' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"GLFW")||(r.GLFW=function(){Oe("'GLFW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"GLEW")||(r.GLEW=function(){Oe("'GLEW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"IDBStore")||(r.IDBStore=function(){Oe("'IDBStore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"runAndAbortIfError")||(r.runAndAbortIfError=function(){Oe("'runAndAbortIfError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"emval_handle_array")||(r.emval_handle_array=function(){Oe("'emval_handle_array' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"emval_free_list")||(r.emval_free_list=function(){Oe("'emval_free_list' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"emval_symbols")||(r.emval_symbols=function(){Oe("'emval_symbols' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"init_emval")||(r.init_emval=function(){Oe("'init_emval' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"count_emval_handles")||(r.count_emval_handles=function(){Oe("'count_emval_handles' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"get_first_emval")||(r.get_first_emval=function(){Oe("'get_first_emval' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getStringOrSymbol")||(r.getStringOrSymbol=function(){Oe("'getStringOrSymbol' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"requireHandle")||(r.requireHandle=function(){Oe("'requireHandle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"emval_newers")||(r.emval_newers=function(){Oe("'emval_newers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"craftEmvalAllocator")||(r.craftEmvalAllocator=function(){Oe("'craftEmvalAllocator' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"emval_get_global")||(r.emval_get_global=function(){Oe("'emval_get_global' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"emval_methodCallers")||(r.emval_methodCallers=function(){Oe("'emval_methodCallers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"InternalError")||(r.InternalError=function(){Oe("'InternalError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"BindingError")||(r.BindingError=function(){Oe("'BindingError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"UnboundTypeError")||(r.UnboundTypeError=function(){Oe("'UnboundTypeError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"PureVirtualError")||(r.PureVirtualError=function(){Oe("'PureVirtualError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"init_embind")||(r.init_embind=function(){Oe("'init_embind' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"throwInternalError")||(r.throwInternalError=function(){Oe("'throwInternalError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"throwBindingError")||(r.throwBindingError=function(){Oe("'throwBindingError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"throwUnboundTypeError")||(r.throwUnboundTypeError=function(){Oe("'throwUnboundTypeError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"ensureOverloadTable")||(r.ensureOverloadTable=function(){Oe("'ensureOverloadTable' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"exposePublicSymbol")||(r.exposePublicSymbol=function(){Oe("'exposePublicSymbol' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"replacePublicSymbol")||(r.replacePublicSymbol=function(){Oe("'replacePublicSymbol' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"extendError")||(r.extendError=function(){Oe("'extendError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"createNamedFunction")||(r.createNamedFunction=function(){Oe("'createNamedFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registeredInstances")||(r.registeredInstances=function(){Oe("'registeredInstances' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getBasestPointer")||(r.getBasestPointer=function(){Oe("'getBasestPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerInheritedInstance")||(r.registerInheritedInstance=function(){Oe("'registerInheritedInstance' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"unregisterInheritedInstance")||(r.unregisterInheritedInstance=function(){Oe("'unregisterInheritedInstance' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getInheritedInstance")||(r.getInheritedInstance=function(){Oe("'getInheritedInstance' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getInheritedInstanceCount")||(r.getInheritedInstanceCount=function(){Oe("'getInheritedInstanceCount' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getLiveInheritedInstances")||(r.getLiveInheritedInstances=function(){Oe("'getLiveInheritedInstances' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registeredTypes")||(r.registeredTypes=function(){Oe("'registeredTypes' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"awaitingDependencies")||(r.awaitingDependencies=function(){Oe("'awaitingDependencies' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"typeDependencies")||(r.typeDependencies=function(){Oe("'typeDependencies' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registeredPointers")||(r.registeredPointers=function(){Oe("'registeredPointers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"registerType")||(r.registerType=function(){Oe("'registerType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"whenDependentTypesAreResolved")||(r.whenDependentTypesAreResolved=function(){Oe("'whenDependentTypesAreResolved' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"embind_charCodes")||(r.embind_charCodes=function(){Oe("'embind_charCodes' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"embind_init_charCodes")||(r.embind_init_charCodes=function(){Oe("'embind_init_charCodes' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"readLatin1String")||(r.readLatin1String=function(){Oe("'readLatin1String' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getTypeName")||(r.getTypeName=function(){Oe("'getTypeName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"heap32VectorToArray")||(r.heap32VectorToArray=function(){Oe("'heap32VectorToArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"requireRegisteredType")||(r.requireRegisteredType=function(){Oe("'requireRegisteredType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"getShiftFromSize")||(r.getShiftFromSize=function(){Oe("'getShiftFromSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"integerReadValueFromPointer")||(r.integerReadValueFromPointer=function(){Oe("'integerReadValueFromPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"enumReadValueFromPointer")||(r.enumReadValueFromPointer=function(){Oe("'enumReadValueFromPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"floatReadValueFromPointer")||(r.floatReadValueFromPointer=function(){Oe("'floatReadValueFromPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"simpleReadValueFromPointer")||(r.simpleReadValueFromPointer=function(){Oe("'simpleReadValueFromPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"runDestructors")||(r.runDestructors=function(){Oe("'runDestructors' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"new_")||(r.new_=function(){Oe("'new_' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"craftInvokerFunction")||(r.craftInvokerFunction=function(){Oe("'craftInvokerFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"embind__requireFunction")||(r.embind__requireFunction=function(){Oe("'embind__requireFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"tupleRegistrations")||(r.tupleRegistrations=function(){Oe("'tupleRegistrations' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"structRegistrations")||(r.structRegistrations=function(){Oe("'structRegistrations' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"genericPointerToWireType")||(r.genericPointerToWireType=function(){Oe("'genericPointerToWireType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"constNoSmartPtrRawPointerToWireType")||(r.constNoSmartPtrRawPointerToWireType=function(){Oe("'constNoSmartPtrRawPointerToWireType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"nonConstNoSmartPtrRawPointerToWireType")||(r.nonConstNoSmartPtrRawPointerToWireType=function(){Oe("'nonConstNoSmartPtrRawPointerToWireType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"init_RegisteredPointer")||(r.init_RegisteredPointer=function(){Oe("'init_RegisteredPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"RegisteredPointer")||(r.RegisteredPointer=function(){Oe("'RegisteredPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"RegisteredPointer_getPointee")||(r.RegisteredPointer_getPointee=function(){Oe("'RegisteredPointer_getPointee' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"RegisteredPointer_destructor")||(r.RegisteredPointer_destructor=function(){Oe("'RegisteredPointer_destructor' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"RegisteredPointer_deleteObject")||(r.RegisteredPointer_deleteObject=function(){Oe("'RegisteredPointer_deleteObject' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"RegisteredPointer_fromWireType")||(r.RegisteredPointer_fromWireType=function(){Oe("'RegisteredPointer_fromWireType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"runDestructor")||(r.runDestructor=function(){Oe("'runDestructor' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"releaseClassHandle")||(r.releaseClassHandle=function(){Oe("'releaseClassHandle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"finalizationGroup")||(r.finalizationGroup=function(){Oe("'finalizationGroup' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"detachFinalizer_deps")||(r.detachFinalizer_deps=function(){Oe("'detachFinalizer_deps' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"detachFinalizer")||(r.detachFinalizer=function(){Oe("'detachFinalizer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"attachFinalizer")||(r.attachFinalizer=function(){Oe("'attachFinalizer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"makeClassHandle")||(r.makeClassHandle=function(){Oe("'makeClassHandle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"init_ClassHandle")||(r.init_ClassHandle=function(){Oe("'init_ClassHandle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"ClassHandle")||(r.ClassHandle=function(){Oe("'ClassHandle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"ClassHandle_isAliasOf")||(r.ClassHandle_isAliasOf=function(){Oe("'ClassHandle_isAliasOf' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"throwInstanceAlreadyDeleted")||(r.throwInstanceAlreadyDeleted=function(){Oe("'throwInstanceAlreadyDeleted' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"ClassHandle_clone")||(r.ClassHandle_clone=function(){Oe("'ClassHandle_clone' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"ClassHandle_delete")||(r.ClassHandle_delete=function(){Oe("'ClassHandle_delete' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"deletionQueue")||(r.deletionQueue=function(){Oe("'deletionQueue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"ClassHandle_isDeleted")||(r.ClassHandle_isDeleted=function(){Oe("'ClassHandle_isDeleted' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"ClassHandle_deleteLater")||(r.ClassHandle_deleteLater=function(){Oe("'ClassHandle_deleteLater' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"flushPendingDeletes")||(r.flushPendingDeletes=function(){Oe("'flushPendingDeletes' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"delayFunction")||(r.delayFunction=function(){Oe("'delayFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"setDelayFunction")||(r.setDelayFunction=function(){Oe("'setDelayFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"RegisteredClass")||(r.RegisteredClass=function(){Oe("'RegisteredClass' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"shallowCopyInternalPointer")||(r.shallowCopyInternalPointer=function(){Oe("'shallowCopyInternalPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"downcastPointer")||(r.downcastPointer=function(){Oe("'downcastPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"upcastPointer")||(r.upcastPointer=function(){Oe("'upcastPointer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"validateThis")||(r.validateThis=function(){Oe("'validateThis' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"char_0")||(r.char_0=function(){Oe("'char_0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"char_9")||(r.char_9=function(){Oe("'char_9' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"makeLegalFunctionName")||(r.makeLegalFunctionName=function(){Oe("'makeLegalFunctionName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"warnOnce")||(r.warnOnce=function(){Oe("'warnOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"stackSave")||(r.stackSave=function(){Oe("'stackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"stackRestore")||(r.stackRestore=function(){Oe("'stackRestore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"stackAlloc")||(r.stackAlloc=function(){Oe("'stackAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"AsciiToString")||(r.AsciiToString=function(){Oe("'AsciiToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"stringToAscii")||(r.stringToAscii=function(){Oe("'stringToAscii' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"UTF16ToString")||(r.UTF16ToString=function(){Oe("'UTF16ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"stringToUTF16")||(r.stringToUTF16=function(){Oe("'stringToUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"lengthBytesUTF16")||(r.lengthBytesUTF16=function(){Oe("'lengthBytesUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"UTF32ToString")||(r.UTF32ToString=function(){Oe("'UTF32ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"stringToUTF32")||(r.stringToUTF32=function(){Oe("'stringToUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"lengthBytesUTF32")||(r.lengthBytesUTF32=function(){Oe("'lengthBytesUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"allocateUTF8")||(r.allocateUTF8=function(){Oe("'allocateUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),Object.getOwnPropertyDescriptor(r,"allocateUTF8OnStack")||(r.allocateUTF8OnStack=function(){Oe("'allocateUTF8OnStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}),r.writeStackCookie=$,r.checkStackCookie=ee,Object.getOwnPropertyDescriptor(r,"ALLOC_NORMAL")||Object.defineProperty(r,"ALLOC_NORMAL",{configurable:!0,get:function(){Oe("'ALLOC_NORMAL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}}),Object.getOwnPropertyDescriptor(r,"ALLOC_STACK")||Object.defineProperty(r,"ALLOC_STACK",{configurable:!0,get:function(){Oe("'ALLOC_STACK' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)")}}),Ee=function e(){pr||Er(),pr||(Ee=e)},r.run=Er,r.preInit)for("function"==typeof r.preInit&&(r.preInit=[r.preInit]);0{function r(e,r){let t={func:"metrics"};e>=0&&r>=0?(t.sharpness=e,t.glare=r):t.error=e<-.5&&e>-1.5?"Runtime error":e<-1.5&&e>-2.5?"Metrics did not return OK":"Unknown Error Occured",postMessage(t)}function t(e,r){let t={func:"moire"};e>=0&&r>=0?(t.moire=e,t.moireraw=r):t.error=e<-.5&&e>-1.5?"Runtime error":e<-1.5&&e>-2.5?"Moire did not return OK":"Unknown Error Occured",postMessage(t)}function n(r){null!=r&&(e._free(r),r=null)}function i(r){let t=e._malloc(r.length*r.BYTES_PER_ELEMENT);return e.HEAPU8.set(r,t),t}onmessage=a=>{if(a&&a.data)if("metrics"===a.data.func){let t=a.data.data;if(t.imgData&&t.width&&t.height){let a=i(t.imgData);const o=e.ccall("acuantMetrics","number",["number","number","number"],[a,t.width,t.height]);let s=[];for(let r=0;r<2;r++)s[r]=e.getValue(o+4*r,"float");n(a),r(s[0],s[1])}else console.error("missing params"),r(-1,-1)}else if("moire"===a.data.func){let r=a.data.data;if(r.imgData&&r.width&&r.height){let a=i(r.imgData);const o=e.ccall("acuantMoire","number",["number","number","number"],[a,r.width,r.height]);let s=[];for(let r=0;r<2;r++)s[r]=e.getValue(o+4*r,"float");n(a),t(s[0],s[1])}else console.error("missing params"),t(-1,-1)}else console.error("called with no func specified")},postMessage({metricsWorker:"started"})})); \ No newline at end of file diff --git a/public/acuant/11.9.3/AcuantPassiveLiveness.min.js b/public/acuant/11.9.3/AcuantPassiveLiveness.min.js new file mode 100644 index 00000000000..776876f0a45 --- /dev/null +++ b/public/acuant/11.9.3/AcuantPassiveLiveness.min.js @@ -0,0 +1,261 @@ +!function(e){function t(t){for(var n,a,s=t[0],i=t[1],o=0,l=[];oe(),raf:e=>requestAnimationFrame(e),ael:(e,t,n,r)=>e.addEventListener(t,n,r),rel:(e,t,n,r)=>e.removeEventListener(t,n,r),ce:(e,t)=>new CustomEvent(e,t)},l=e=>Promise.resolve(e),c=(()=>{try{return new CSSStyleSheet,"function"==typeof(new CSSStyleSheet).replace}catch(e){}return!1})(),h=(e,t,n,r)=>{n&&n.map(([n,r,a])=>{const s=e,i=p(t,a),o=d(n);u.ael(s,r,i,o),(t.$rmListeners$=t.$rmListeners$||[]).push(()=>u.rel(s,r,i,o))})},p=(e,t)=>n=>{try{256&e.$flags$?e.$lazyInstance$[t](n):(e.$queuedListeners$=e.$queuedListeners$||[]).push([t,n])}catch(e){ae(e)}},d=e=>0!=(2&e),f=new WeakMap,m=e=>{const t=e.$cmpMeta$,n=e.$hostElement$,r=t.$flags$,a=(t.$tagName$,()=>{}),s=((e,t,n,r)=>{let a=g(t),s=oe.get(a);if(e=11===e.nodeType?e:o,s)if("string"==typeof s){e=e.head||e;let t,n=f.get(e);n||f.set(e,n=new Set),n.has(a)||(t=o.createElement("style"),t.innerHTML=s,e.insertBefore(t,e.querySelector("link")),n&&n.add(a))}else e.adoptedStyleSheets.includes(s)||(e.adoptedStyleSheets=[...e.adoptedStyleSheets,s]);return a})(n.shadowRoot?n.shadowRoot:n.getRootNode(),t);10&r&&(n["s-sc"]=s,n.classList.add(s+"-h")),a()},g=(e,t)=>"sc-"+e.$tagName$,y={},b=e=>"object"===(e=typeof e)||"function"===e,v=(e,t,...n)=>{let r=null,a=!1,s=!1,i=[];const o=t=>{for(let n=0;ne[t]).join(" "))}if("function"==typeof e)return e(null===t?{}:t,i,k);const u=x(e,null);return u.$attrs$=t,i.length>0&&(u.$children$=i),u},x=(e,t)=>{const n={$flags$:0,$tag$:e,$text$:t,$elm$:null,$children$:null,$attrs$:null};return n},w={},k={forEach:(e,t)=>e.map(S).forEach(t),map:(e,t)=>e.map(S).map(t).map(I)},S=e=>({vattrs:e.$attrs$,vchildren:e.$children$,vkey:e.$key$,vname:e.$name$,vtag:e.$tag$,vtext:e.$text$}),I=e=>{if("function"==typeof e.vtag){const t=Object.assign({},e.vattrs);return e.vkey&&(t.key=e.vkey),e.vname&&(t.name=e.vname),v(e.vtag,t,...e.vchildren||[])}const t=x(e.vtag,e.vtext);return t.$attrs$=e.vattrs,t.$children$=e.vchildren,t.$key$=e.vkey,t.$name$=e.vname,t},A=(e,t,n,r,a,s)=>{if(n!==r){let o=re(e,t),l=t.toLowerCase();if("class"===t){const t=e.classList,a=N(n),s=N(r);t.remove(...a.filter(e=>e&&!s.includes(e))),t.add(...s.filter(e=>e&&!a.includes(e)))}else if("style"===t){for(const t in n)r&&null!=r[t]||(t.includes("-")?e.style.removeProperty(t):e.style[t]="");for(const t in r)n&&r[t]===n[t]||(t.includes("-")?e.style.setProperty(t,r[t]):e.style[t]=r[t])}else if("ref"===t)r&&r(e);else if(o||"o"!==t[0]||"n"!==t[1]){const i=b(r);if((o||i&&null!==r)&&!a)try{if(e.tagName.includes("-"))e[t]=r;else{let a=null==r?"":r;"list"===t?o=!1:null!=n&&e[t]==a||(e[t]=a)}}catch(e){}null==r||!1===r?!1===r&&""!==e.getAttribute(t)||e.removeAttribute(t):(!o||4&s||a)&&!i&&(r=!0===r?"":r,e.setAttribute(t,r))}else t="-"===t[2]?t.slice(3):re(i,l)?l.slice(2):l[2]+t.slice(3),n&&u.rel(e,t,n,!1),r&&u.ael(e,t,r,!1)}},E=/\s/,N=e=>e?e.split(E):[],C=(e,t,n,r)=>{const a=11===t.$elm$.nodeType&&t.$elm$.host?t.$elm$.host:t.$elm$,s=e&&e.$attrs$||y,i=t.$attrs$||y;for(r in s)r in i||A(a,r,s[r],void 0,n,t.$flags$);for(r in i)A(a,r,s[r],i[r],n,t.$flags$)},T=(e,t,n,a)=>{let s,i,u=t.$children$[n],l=0;if(null!==u.$text$)s=u.$elm$=o.createTextNode(u.$text$);else if(s=u.$elm$=o.createElement(u.$tag$),C(null,u,!1),null!=r&&s["s-si"]!==r&&s.classList.add(s["s-si"]=r),u.$children$)for(l=0;l{let o,u=e;for(u.shadowRoot&&u.tagName===a&&(u=u.shadowRoot);s<=i;++s)r[s]&&(o=T(null,n,s),o&&(r[s].$elm$=o,u.insertBefore(o,t)))},_=(e,t,n,r,a)=>{for(;t<=n;++t)(r=e[t])&&(a=r.$elm$,D(r),a.remove())},F=(e,t)=>e.$tag$===t.$tag$,M=(e,t)=>{const n=t.$elm$=e.$elm$,r=e.$children$,a=t.$children$,s=t.$text$;null===s?(C(e,t,!1),null!==r&&null!==a?((e,t,n,r)=>{let a,s=0,i=0,o=t.length-1,u=t[0],l=t[o],c=r.length-1,h=r[0],p=r[c];for(;s<=o&&i<=c;)null==u?u=t[++s]:null==l?l=t[--o]:null==h?h=r[++i]:null==p?p=r[--c]:F(u,h)?(M(u,h),u=t[++s],h=r[++i]):F(l,p)?(M(l,p),l=t[--o],p=r[--c]):F(u,p)?(M(u,p),e.insertBefore(u.$elm$,l.$elm$.nextSibling),u=t[++s],p=r[--c]):F(l,h)?(M(l,h),e.insertBefore(l.$elm$,u.$elm$),l=t[--o],h=r[++i]):(a=T(t&&t[i],n,i),h=r[++i],a&&u.$elm$.parentNode.insertBefore(a,u.$elm$));s>o?R(e,null==r[c+1]?null:r[c+1].$elm$,n,r,i,c):i>c&&_(t,s,o)})(n,r,t,a):null!==a?(null!==e.$text$&&(n.textContent=""),R(n,null,t,a,0,a.length-1)):null!==r&&_(r,0,r.length-1)):e.$text$!==s&&(n.data=s)},D=e=>{e.$attrs$&&e.$attrs$.ref&&e.$attrs$.ref(null),e.$children$&&e.$children$.map(D)},O=(e,t)=>{const n=e.$hostElement$,s=e.$vnode$||x(null,null),i=(o=t)&&o.$tag$===w?t:v(null,null,t);var o;a=n.tagName,i.$tag$=null,i.$flags$|=4,e.$vnode$=i,i.$elm$=s.$elm$=n.shadowRoot||n,r=n["s-sc"],M(s,i)},L=e=>ee(e).$hostElement$,P=(e,t,n)=>{const r=L(e);return{emit:e=>$(r,t,{bubbles:!!(4&n),composed:!!(2&n),cancelable:!!(1&n),detail:e})}},$=(e,t,n)=>{const r=u.ce(t,n);return e.dispatchEvent(r),r},B=(e,t)=>{t&&!e.$onRenderResolve$&&t["s-p"]&&t["s-p"].push(new Promise(t=>e.$onRenderResolve$=t))},z=(e,t)=>{if(e.$flags$|=16,4&e.$flags$)return void(e.$flags$|=512);B(e,e.$ancestorComponent$);return fe(()=>U(e,t))},U=(e,t)=>{const n=(e.$cmpMeta$.$tagName$,()=>{}),r=e.$lazyInstance$;let a;return t&&(e.$flags$|=256,e.$queuedListeners$&&(e.$queuedListeners$.map(([e,t])=>H(r,e,t)),e.$queuedListeners$=null),a=H(r,"componentWillLoad")),n(),q(a,()=>W(e,r,t))},W=async(e,t,n)=>{const r=e.$hostElement$,a=(e.$cmpMeta$.$tagName$,()=>{}),s=r["s-rc"];n&&m(e);const i=(e.$cmpMeta$.$tagName$,()=>{});V(e,t),s&&(s.map(e=>e()),r["s-rc"]=void 0),i(),a();{const t=r["s-p"],n=()=>j(e);0===t.length?n():(Promise.all(t).then(n),e.$flags$|=4,t.length=0)}},V=(e,t,n)=>{try{t=t.render(),e.$flags$&=-17,e.$flags$|=2,O(e,t)}catch(t){ae(t,e.$hostElement$)}return null},j=e=>{e.$cmpMeta$.$tagName$;const t=e.$hostElement$,n=()=>{},r=e.$lazyInstance$,a=e.$ancestorComponent$;64&e.$flags$?(H(r,"componentDidUpdate"),n()):(e.$flags$|=64,K(t),H(r,"componentDidLoad"),n(),e.$onReadyResolve$(t),a||G()),e.$onRenderResolve$&&(e.$onRenderResolve$(),e.$onRenderResolve$=void 0),512&e.$flags$&&de(()=>z(e,!1)),e.$flags$&=-517},G=e=>{K(o.documentElement),de(()=>$(i,"appload",{detail:{namespace:"fas-web-ui-component-camera"}}))},H=(e,t,n)=>{if(e&&e[t])try{return e[t](n)}catch(e){ae(e)}},q=(e,t)=>e&&e.then?e.then(t):t(),K=e=>e.classList.add("hydrated"),Y=(e,t,n,r)=>{const a=ee(e),s=a.$instanceValues$.get(t),i=a.$flags$,o=a.$lazyInstance$;var u,l;u=n,l=r.$members$[t][0],n=null==u||b(u)?u:4&l?"false"!==u&&(""===u||!!u):2&l?parseFloat(u):1&l?String(u):u,8&i&&void 0!==s||n===s||(a.$instanceValues$.set(t,n),o&&2==(18&i)&&z(a,!1))},X=(e,t,n)=>{if(t.$members$){const r=Object.entries(t.$members$),a=e.prototype;if(r.map(([e,[r]])=>{(31&r||2&n&&32&r)&&Object.defineProperty(a,e,{get(){return t=e,ee(this).$instanceValues$.get(t);var t},set(n){Y(this,e,n,t)},configurable:!0,enumerable:!0})}),1&n){const t=new Map;a.attributeChangedCallback=function(e,n,r){u.jmp(()=>{const n=t.get(e);if(this.hasOwnProperty(n))r=this[n],delete this[n];else if(a.hasOwnProperty(n)&&"number"==typeof this[n]&&this[n]==r)return;this[n]=(null!==r||"boolean"!=typeof this[n])&&r})},e.observedAttributes=r.filter(([e,t])=>15&t[0]).map(([e,n])=>{const r=n[1]||e;return t.set(r,e),r})}}return e},Q=async(e,t,n,r,a)=>{if(0==(32&t.$flags$)){{if(t.$flags$|=32,(a=ie(n)).then){const e=()=>{};a=await a,e()}a.isProxied||(X(a,n,2),a.isProxied=!0);const e=(n.$tagName$,()=>{});t.$flags$|=8;try{new a(t)}catch(e){ae(e)}t.$flags$&=-9,e()}if(a.style){let e=a.style;const t=g(n);if(!oe.has(t)){const r=(n.$tagName$,()=>{});((e,t,n)=>{let r=oe.get(e);c&&n?(r=r||new CSSStyleSheet,r.replace(t)):r=t,oe.set(e,r)})(t,e,!!(1&n.$flags$)),r()}}}const s=t.$ancestorComponent$,i=()=>z(t,!0);s&&s["s-rc"]?s["s-rc"].push(i):i()},Z=(e,t={})=>{const n=()=>{},r=[],a=t.exclude||[],s=i.customElements,l=o.head,c=l.querySelector("meta[charset]"),p=o.createElement("style"),d=[];let f,m=!0;Object.assign(u,t),u.$resourcesUrl$=new URL(t.resourcesUrl||"./",o.baseURI).href,e.map(e=>{e[1].map(t=>{const n={$flags$:t[0],$tagName$:t[1],$members$:t[2],$listeners$:t[3]};n.$members$=t[2],n.$listeners$=t[3];const i=n.$tagName$,o=class extends HTMLElement{constructor(e){super(e),ne(e=this,n),1&n.$flags$&&e.attachShadow({mode:"open"})}connectedCallback(){f&&(clearTimeout(f),f=null),m?d.push(this):u.jmp(()=>(e=>{if(0==(1&u.$flags$)){const t=ee(e),n=t.$cmpMeta$,r=(n.$tagName$,()=>{});if(1&t.$flags$)h(e,t,n.$listeners$);else{t.$flags$|=1;{let n=e;for(;n=n.parentNode||n.host;)if(n["s-p"]){B(t,t.$ancestorComponent$=n);break}}n.$members$&&Object.entries(n.$members$).map(([t,[n]])=>{if(31&n&&e.hasOwnProperty(t)){const n=e[t];delete e[t],e[t]=n}}),Q(0,t,n)}r()}})(this))}disconnectedCallback(){u.jmp(()=>(e=>{if(0==(1&u.$flags$)){const t=ee(e);t.$rmListeners$&&(t.$rmListeners$.map(e=>e()),t.$rmListeners$=void 0)}})(this))}componentOnReady(){return ee(this).$onReadyPromise$}};n.$lazyBundleId$=e[0],a.includes(i)||s.get(i)||(r.push(i),s.define(i,X(o,n,1)))})}),p.innerHTML=r+"{visibility:hidden}.hydrated{visibility:inherit}",p.setAttribute("data-styles",""),l.insertBefore(p,c?c.nextSibling:l.firstChild),m=!1,d.length?d.map(e=>e.connectedCallback()):u.jmp(()=>f=setTimeout(G,30)),n()},J=new WeakMap,ee=e=>J.get(e),te=(e,t)=>J.set(t.$lazyInstance$=e,t),ne=(e,t)=>{const n={$flags$:0,$hostElement$:e,$cmpMeta$:t,$instanceValues$:new Map};return n.$onReadyPromise$=new Promise(e=>n.$onReadyResolve$=e),e["s-p"]=[],e["s-rc"]=[],h(e,n,t.$listeners$),J.set(e,n)},re=(e,t)=>t in e,ae=(e,t)=>(0,console.error)(e,t),se=new Map,ie=(e,t,r)=>{const a=e.$tagName$.replace(/-/g,"_"),s=e.$lazyBundleId$,i=se.get(s);return i?i[a]:n(239)(`./${s}.entry.js`).then(e=>(se.set(s,e),e[a]),ae)},oe=new Map,ue=[],le=[],ce=(e,t)=>n=>{e.push(n),s||(s=!0,t&&4&u.$flags$?de(pe):u.raf(pe))},he=e=>{for(let t=0;t{he(ue),he(le),(s=ue.length>0)&&u.raf(pe)},de=e=>l().then(e),fe=ce(le,!0)},function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||function(){return this}()||Function("return this")()}).call(this,n(36))},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var r=n(53),a=Function.prototype,s=a.call,i=r&&a.bind.bind(s,s);e.exports=r?i:function(e){return function(){return s.apply(e,arguments)}}},function(e,t,n){var r=n(1),a=n(43).f,s=n(23),i=n(16),o=n(70),u=n(96),l=n(98);e.exports=function(e,t){var n,c,h,p,d,f=e.target,m=e.global,g=e.stat;if(n=m?r:g?r[f]||o(f,{}):(r[f]||{}).prototype)for(c in t){if(p=t[c],h=e.dontCallGetSet?(d=a(n,c))&&d.value:n[c],!l(m?c:f+(g?".":"#")+c,e.forced)&&void 0!==h){if(typeof p==typeof h)continue;u(p,h)}(e.sham||h&&h.sham)&&s(p,"sham",!0),i(n,c,p,e)}}},function(e,t,n){"use strict";var r,a,s,i=n(116),o=n(9),u=n(1),l=n(6),c=n(11),h=n(10),p=n(24),d=n(28),f=n(23),m=n(16),g=n(33),y=n(27),b=n(52),v=n(32),x=n(7),w=n(55),k=n(21),S=k.enforce,I=k.get,A=u.Int8Array,E=A&&A.prototype,N=u.Uint8ClampedArray,C=N&&N.prototype,T=A&&b(A),R=E&&b(E),_=Object.prototype,F=u.TypeError,M=x("toStringTag"),D=w("TYPED_ARRAY_TAG"),O=i&&!!v&&"Opera"!==p(u.opera),L=!1,P={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},$={BigInt64Array:8,BigUint64Array:8},B=function(e){var t=b(e);if(c(t)){var n=I(t);return n&&h(n,"TypedArrayConstructor")?n.TypedArrayConstructor:B(t)}},z=function(e){if(!c(e))return!1;var t=p(e);return h(P,t)||h($,t)};for(r in P)(s=(a=u[r])&&a.prototype)?S(s).TypedArrayConstructor=a:O=!1;for(r in $)(s=(a=u[r])&&a.prototype)&&(S(s).TypedArrayConstructor=a);if((!O||!l(T)||T===Function.prototype)&&(T=function(){throw F("Incorrect invocation")},O))for(r in P)u[r]&&v(u[r],T);if((!O||!R||R===_)&&(R=T.prototype,O))for(r in P)u[r]&&v(u[r].prototype,R);if(O&&b(C)!==R&&v(C,R),o&&!h(R,M))for(r in L=!0,g(R,M,{configurable:!0,get:function(){return c(this)?this[D]:void 0}}),P)u[r]&&f(u[r],D,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:O,TYPED_ARRAY_TAG:L&&D,aTypedArray:function(e){if(z(e))return e;throw F("Target is not a typed array")},aTypedArrayConstructor:function(e){if(l(e)&&(!v||y(T,e)))return e;throw F(d(e)+" is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n,r){if(o){if(n)for(var a in P){var s=u[a];if(s&&h(s.prototype,e))try{delete s.prototype[e]}catch(n){try{s.prototype[e]=t}catch(e){}}}R[e]&&!n||m(R,e,n?t:O&&E[e]||t,r)}},exportTypedArrayStaticMethod:function(e,t,n){var r,a;if(o){if(v){if(n)for(r in P)if((a=u[r])&&h(a,e))try{delete a[e]}catch(e){}if(T[e]&&!n)return;try{return m(T,e,n?t:O&&T[e]||t)}catch(e){}}for(r in P)!(a=u[r])||a[e]&&!n||m(a,e,t)}},getTypedArrayConstructor:B,isView:function(e){if(!c(e))return!1;var t=p(e);return"DataView"===t||h(P,t)||h($,t)},isTypedArray:z,TypedArray:T,TypedArrayPrototype:R}},function(e,t,n){var r=n(90),a=r.all;e.exports=r.IS_HTMLDDA?function(e){return"function"==typeof e||e===a}:function(e){return"function"==typeof e}},function(e,t,n){var r=n(1),a=n(37),s=n(10),i=n(55),o=n(38),u=n(89),l=r.Symbol,c=a("wks"),h=u?l.for||l:l&&l.withoutSetter||i;e.exports=function(e){return s(c,e)||(c[e]=o&&s(l,e)?l[e]:h("Symbol."+e)),c[e]}},function(e,t,n){var r=n(53),a=Function.prototype.call;e.exports=r?a.bind(a):function(){return a.apply(a,arguments)}},function(e,t,n){var r=n(2);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){var r=n(3),a=n(15),s=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return s(a(e),t)}},function(e,t,n){var r=n(6),a=n(90),s=a.all;e.exports=a.IS_HTMLDDA?function(e){return"object"==typeof e?null!==e:r(e)||e===s}:function(e){return"object"==typeof e?null!==e:r(e)}},function(e,t,n){var r=n(9),a=n(91),s=n(92),i=n(13),o=n(41),u=TypeError,l=Object.defineProperty,c=Object.getOwnPropertyDescriptor;t.f=r?s?function(e,t,n){if(i(e),t=o(t),i(n),"function"==typeof e&&"prototype"===t&&"value"in n&&"writable"in n&&!n.writable){var r=c(e,t);r&&r.writable&&(e[t]=n.value,n={configurable:"configurable"in n?n.configurable:r.configurable,enumerable:"enumerable"in n?n.enumerable:r.enumerable,writable:!1})}return l(e,t,n)}:l:function(e,t,n){if(i(e),t=o(t),i(n),a)try{return l(e,t,n)}catch(e){}if("get"in n||"set"in n)throw u("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(11),a=String,s=TypeError;e.exports=function(e){if(r(e))return e;throw s(a(e)+" is not an object")}},function(e,t,n){var r=n(40);e.exports=function(e){return r(e.length)}},function(e,t,n){var r=n(71),a=Object;e.exports=function(e){return a(r(e))}},function(e,t,n){var r=n(6),a=n(12),s=n(94),i=n(70);e.exports=function(e,t,n,o){o||(o={});var u=o.enumerable,l=void 0!==o.name?o.name:t;if(r(n)&&s(n,l,o),o.global)u?e[t]=n:i(t,n);else{try{o.unsafe?e[t]&&(u=!0):delete e[t]}catch(e){}u?e[t]=n:a.f(e,t,{value:n,enumerable:!1,configurable:!o.nonConfigurable,writable:!o.nonWritable})}return e}},function(e,t,n){var r=n(1),a=n(6),s=function(e){return a(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?s(r[e]):r[e]&&r[e][t]}},function(e,t,n){var r=n(46),a=n(3),s=n(74),i=n(15),o=n(14),u=n(161),l=a([].push),c=function(e){var t=1==e,n=2==e,a=3==e,c=4==e,h=6==e,p=7==e,d=5==e||h;return function(f,m,g,y){for(var b,v,x=i(f),w=s(x),k=r(m,g),S=o(w),I=0,A=y||u,E=t?A(f,S):n||p?A(f,0):void 0;S>I;I++)if((d||I in w)&&(v=k(b=w[I],I,x),e))if(t)E[I]=v;else if(v)switch(e){case 3:return!0;case 5:return b;case 6:return I;case 2:l(E,b)}else switch(e){case 4:return!1;case 7:l(E,b)}return h?-1:a||c?c:E}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterReject:c(7)}},function(e,t,n){var r=n(6),a=n(28),s=TypeError;e.exports=function(e){if(r(e))return e;throw s(a(e)+" is not a function")}},function(e,t){e.exports=!1},function(e,t,n){var r,a,s,i=n(132),o=n(1),u=n(11),l=n(23),c=n(10),h=n(69),p=n(59),d=n(60),f=o.TypeError,m=o.WeakMap;if(i||h.state){var g=h.state||(h.state=new m);g.get=g.get,g.has=g.has,g.set=g.set,r=function(e,t){if(g.has(e))throw f("Object already initialized");return t.facade=e,g.set(e,t),t},a=function(e){return g.get(e)||{}},s=function(e){return g.has(e)}}else{var y=p("state");d[y]=!0,r=function(e,t){if(c(e,y))throw f("Object already initialized");return t.facade=e,l(e,y,t),t},a=function(e){return c(e,y)?e[y]:{}},s=function(e){return c(e,y)}}e.exports={set:r,get:a,has:s,enforce:function(e){return s(e)?a(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!u(t)||(n=a(t)).type!==e)throw f("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){var r=n(74),a=n(71);e.exports=function(e){return r(a(e))}},function(e,t,n){var r=n(9),a=n(12),s=n(39);e.exports=r?function(e,t,n){return a.f(e,t,s(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(68),a=n(6),s=n(29),i=n(7)("toStringTag"),o=Object,u="Arguments"==s(function(){return arguments}());e.exports=r?s:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=o(e),i))?n:u?s(t):"Object"==(r=s(t))&&a(t.callee)?"Arguments":r}},function(e,t,n){var r=n(12).f,a=n(10),s=n(7)("toStringTag");e.exports=function(e,t,n){e&&!n&&(e=e.prototype),e&&!a(e,s)&&r(e,s,{configurable:!0,value:t})}},function(e,t){e.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},function(e,t,n){var r=n(3);e.exports=r({}.isPrototypeOf)},function(e,t){var n=String;e.exports=function(e){try{return n(e)}catch(e){return"Object"}}},function(e,t,n){var r=n(3),a=r({}.toString),s=r("".slice);e.exports=function(e){return s(a(e),8,-1)}},function(e,t,n){var r=n(31),a=Math.max,s=Math.min;e.exports=function(e,t){var n=r(e);return n<0?a(n+t,0):s(n,t)}},function(e,t,n){var r=n(137);e.exports=function(e){var t=+e;return t!=t||0===t?0:r(t)}},function(e,t,n){var r=n(138),a=n(13),s=n(139);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=r(Object.prototype,"__proto__","set"))(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return a(n),s(r),t?e(n,r):n.__proto__=r,n}}():void 0)},function(e,t,n){var r=n(94),a=n(12);e.exports=function(e,t,n){return n.get&&r(n.get,t,{getter:!0}),n.set&&r(n.set,t,{setter:!0}),a.f(e,t,n)}},function(e,t,n){var r=n(24),a=String;e.exports=function(e){if("Symbol"===r(e))throw TypeError("Cannot convert a Symbol value to a string");return a(e)}},function(e,t,n){var r,a=n(13),s=n(110),i=n(75),o=n(60),u=n(101),l=n(57),c=n(59),h=c("IE_PROTO"),p=function(){},d=function(e){return"