pub(crate) use anyhow::{anyhow, Result};
pub(crate) use async_trait::async_trait;
pub(crate) use chromiumoxide::Page;
pub(crate) use serde::{Deserialize, Serialize};
pub(crate) use std::time::{Duration, Instant};
pub(crate) use crate::captcha_detect::CaptchaInfo;
pub(crate) mod audio;
pub(crate) mod behavioral;
pub(crate) mod util;
pub(crate) mod vlm;
mod cache;
mod chain;
mod cloudflare_interstitial;
mod math_captcha;
pub mod oracle;
mod pattern;
pub mod token_oracle;
mod pow;
mod race;
mod slider;
mod third_party;
mod turnstile_interactive;
mod types;
mod wait_for_token;
pub use self::types::{CaptchaSolveResult, CaptchaSolver, CaptchaType, SolveConfig, SolveMethod};
pub use self::audio::AudioCaptchaSolver;
pub use self::behavioral::BehavioralCaptchaSolver;
pub use self::cache::{CacheStats, CachedToken, TokenCache};
pub use self::chain::{CaptchaSolverChain, ChainConfig};
pub use self::cloudflare_interstitial::CloudflareInterstitialSolver;
pub use self::math_captcha::MathCaptchaSolver;
pub use self::oracle::{classify, take_snapshot, OutcomeClassification, PageSnapshot};
pub use self::pattern::{CaptchaPattern, PatternStore};
pub use self::pow::PowCaptchaSolver;
pub use self::race::RacingSolver;
pub use self::slider::{SliderCaptchaSolver, SliderSelectors};
pub use self::third_party::{ThirdPartyCaptchaSolver, ThirdPartyService};
pub use self::turnstile_interactive::{
TurnstileInteractiveSolver, CHECKBOX_OFFSET_X, CHECKBOX_OFFSET_Y, TURNSTILE_IFRAME_SELECTOR,
};
pub use self::token_oracle::{
classify_response as classify_token_response, TokenEncoding, TokenValidator, ValidationVerdict,
ValidatorMethod,
};
pub use self::vlm::VlmCaptchaSolver;
pub use self::wait_for_token::WaitForTokenSolver;
pub(crate) use self::util::screenshot_b64;