@tagadapay/plugin-sdk 3.0.9 → 3.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/external-tracker.js +3802 -195
  2. package/dist/external-tracker.min.js +25 -2
  3. package/dist/external-tracker.min.js.map +4 -4
  4. package/dist/react/types.d.ts +2 -0
  5. package/dist/v2/core/client.d.ts +4 -0
  6. package/dist/v2/core/client.js +314 -123
  7. package/dist/v2/core/config/environment.js +6 -0
  8. package/dist/v2/core/funnelClient.d.ts +18 -1
  9. package/dist/v2/core/funnelClient.js +90 -17
  10. package/dist/v2/core/resources/checkout.d.ts +44 -1
  11. package/dist/v2/core/resources/checkout.js +48 -1
  12. package/dist/v2/core/resources/funnel.d.ts +44 -4
  13. package/dist/v2/core/resources/offers.d.ts +26 -0
  14. package/dist/v2/core/resources/offers.js +37 -0
  15. package/dist/v2/core/types.d.ts +3 -1
  16. package/dist/v2/core/utils/authHandoff.d.ts +60 -0
  17. package/dist/v2/core/utils/authHandoff.js +154 -0
  18. package/dist/v2/core/utils/deviceInfo.d.ts +20 -3
  19. package/dist/v2/core/utils/deviceInfo.js +62 -94
  20. package/dist/v2/core/utils/previewMode.d.ts +4 -0
  21. package/dist/v2/core/utils/previewMode.js +4 -0
  22. package/dist/v2/react/components/DebugDrawer.js +68 -46
  23. package/dist/v2/react/hooks/useCheckoutQuery.d.ts +0 -1
  24. package/dist/v2/react/hooks/useCheckoutQuery.js +12 -4
  25. package/dist/v2/react/hooks/useFunnelLegacy.js +39 -11
  26. package/dist/v2/react/hooks/usePreviewOffer.d.ts +3 -3
  27. package/dist/v2/react/hooks/usePreviewOffer.js +20 -15
  28. package/dist/v2/react/hooks/useTranslation.js +12 -4
  29. package/dist/v2/standalone/index.d.ts +2 -1
  30. package/dist/v2/standalone/index.js +2 -1
  31. package/package.json +3 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * TagadaPay External Tracker v3.0.9
2
+ * TagadaPay External Tracker v3.0.14
3
3
  * CDN Bundle - Standalone tracking for external pages (Debug Build)
4
4
  * @license MIT
5
5
  */
@@ -110,7 +110,9 @@ var TagadaTrackerBundle = (() => {
110
110
  endpoints: {
111
111
  checkout: {
112
112
  sessionInit: "/api/v1/checkout/session/init",
113
- sessionStatus: "/api/v1/checkout/session/status"
113
+ sessionInitAsync: "/api/v1/checkout/session/init-async",
114
+ sessionStatus: "/api/v1/checkout/session/status",
115
+ asyncStatus: "/api/public/v1/checkout/async-status"
114
116
  },
115
117
  customer: {
116
118
  profile: "/api/v1/customer/profile",
@@ -126,7 +128,9 @@ var TagadaTrackerBundle = (() => {
126
128
  endpoints: {
127
129
  checkout: {
128
130
  sessionInit: "/api/v1/checkout/session/init",
129
- sessionStatus: "/api/v1/checkout/session/status"
131
+ sessionInitAsync: "/api/v1/checkout/session/init-async",
132
+ sessionStatus: "/api/v1/checkout/session/status",
133
+ asyncStatus: "/api/public/v1/checkout/async-status"
130
134
  },
131
135
  customer: {
132
136
  profile: "/api/v1/customer/profile",
@@ -142,7 +146,9 @@ var TagadaTrackerBundle = (() => {
142
146
  endpoints: {
143
147
  checkout: {
144
148
  sessionInit: "/api/v1/checkout/session/init",
145
- sessionStatus: "/api/v1/checkout/session/status"
149
+ sessionInitAsync: "/api/v1/checkout/session/init-async",
150
+ sessionStatus: "/api/v1/checkout/session/status",
151
+ asyncStatus: "/api/public/v1/checkout/async-status"
146
152
  },
147
153
  customer: {
148
154
  profile: "/api/v1/customer/profile",
@@ -649,21 +655,26 @@ var TagadaTrackerBundle = (() => {
649
655
  }
650
656
  const injectedFunnelId = getAssignedFunnelId();
651
657
  const funnelVariantId = getAssignedFunnelVariant();
652
- const funnelStepId = getAssignedFunnelStep();
658
+ const injectedStepId = getAssignedFunnelStep();
653
659
  const sdkParams = getSDKParams();
654
- const finalFunnelId = injectedFunnelId || effectiveFunnelId;
660
+ const finalFunnelId = this.config.funnelId || injectedFunnelId || effectiveFunnelId;
661
+ const finalStepId = this.config.stepId || injectedStepId;
655
662
  if (this.config.debugMode) {
656
663
  console.log("\u{1F680} [FunnelClient] Auto-initializing...", {
657
664
  existingSessionId,
658
665
  effectiveFunnelId: finalFunnelId,
659
666
  funnelVariantId,
660
667
  // 🎯 Log variant ID for debugging
661
- funnelStepId,
668
+ funnelStepId: finalStepId,
662
669
  // 🎯 Log step ID for debugging
663
670
  draft: sdkParams.draft,
664
671
  // 🎯 Log draft mode
665
- funnelTracking: sdkParams.funnelTracking
672
+ funnelTracking: sdkParams.funnelTracking,
666
673
  // 🎯 Log tracking flag
674
+ source: {
675
+ funnelId: this.config.funnelId ? "config" : injectedFunnelId ? "injected" : effectiveFunnelId ? "url/prop" : "none",
676
+ stepId: this.config.stepId ? "config" : injectedStepId ? "injected" : "none"
677
+ }
667
678
  });
668
679
  }
669
680
  const response = await this.resource.initialize({
@@ -678,8 +689,8 @@ var TagadaTrackerBundle = (() => {
678
689
  currentUrl: typeof window !== "undefined" ? window.location.href : void 0,
679
690
  funnelVariantId,
680
691
  // 🎯 Pass A/B test variant ID to backend
681
- funnelStepId,
682
- // 🎯 Pass step ID to backend
692
+ funnelStepId: finalStepId,
693
+ // 🎯 Pass step ID to backend (with config override)
683
694
  draft: sdkParams.draft,
684
695
  // 🎯 Pass draft mode explicitly (more robust than URL parsing)
685
696
  funnelTracking: sdkParams.funnelTracking
@@ -745,30 +756,90 @@ var TagadaTrackerBundle = (() => {
745
756
  }
746
757
  /**
747
758
  * Navigate
759
+ * @param event - Navigation event/action
760
+ * @param options - Navigation options
761
+ * @param options.fireAndForget - If true, queues navigation to QStash and returns immediately without waiting for result
762
+ * @param options.customerTags - Customer tags to set (merged with existing customer tags)
763
+ * @param options.deviceId - Device ID for geo/device tag enrichment (optional, rarely needed)
748
764
  */
749
- async navigate(event) {
750
- var _a;
765
+ async navigate(event, options) {
766
+ var _a, _b, _c;
751
767
  if (!((_a = this.state.context) == null ? void 0 : _a.sessionId)) throw new Error("No active session");
752
768
  this.updateState({ isNavigating: true, isLoading: true });
753
769
  try {
770
+ let funnelVariantId = getAssignedFunnelVariant();
771
+ let funnelStepId = getAssignedFunnelStep();
772
+ const currentUrl = typeof window !== "undefined" ? window.location.href : void 0;
773
+ if (!funnelStepId && this.config.stepId) {
774
+ funnelStepId = this.config.stepId;
775
+ if (this.config.debugMode) {
776
+ console.log("\u{1F50D} [FunnelClient.navigate] Using stepId from config (no injection):", funnelStepId);
777
+ }
778
+ }
779
+ if (!funnelVariantId && this.config.variantId) {
780
+ funnelVariantId = this.config.variantId;
781
+ if (this.config.debugMode) {
782
+ console.log("\u{1F50D} [FunnelClient.navigate] Using variantId from config (no injection):", funnelVariantId);
783
+ }
784
+ }
785
+ if (this.config.debugMode) {
786
+ console.log("\u{1F50D} [FunnelClient.navigate] Sending to backend:", {
787
+ sessionId: this.state.context.sessionId,
788
+ currentUrl,
789
+ funnelStepId: funnelStepId || "(not found)",
790
+ funnelVariantId: funnelVariantId || "(not found)",
791
+ hasInjectedStepId: !!getAssignedFunnelStep(),
792
+ hasInjectedVariantId: !!getAssignedFunnelVariant(),
793
+ usedConfigFallback: !getAssignedFunnelStep() && !!this.config.stepId,
794
+ customerTags: (options == null ? void 0 : options.customerTags) || "(none)",
795
+ deviceId: (options == null ? void 0 : options.deviceId) || "(none)"
796
+ });
797
+ }
798
+ const fireAndForget = (options == null ? void 0 : options.fireAndForget) || false;
754
799
  const response = await this.resource.navigate({
755
800
  sessionId: this.state.context.sessionId,
756
- event
801
+ event,
802
+ currentUrl,
803
+ funnelStepId,
804
+ funnelVariantId,
805
+ fireAndForget,
806
+ customerTags: options == null ? void 0 : options.customerTags,
807
+ deviceId: options == null ? void 0 : options.deviceId
757
808
  });
758
- if (response.success && response.result) {
759
- await this.refreshSession();
809
+ if (!response.success || !response.result) {
810
+ throw new Error(response.error || "Navigation failed");
811
+ }
812
+ const result = response.result;
813
+ if (result.queued) {
760
814
  this.updateState({ isNavigating: false, isLoading: false });
761
- const result = response.result;
762
- const shouldAutoRedirect = this.config.autoRedirect !== false;
763
- if (shouldAutoRedirect && (result == null ? void 0 : result.url) && typeof window !== "undefined") {
815
+ if (result.sessionId && result.sessionId !== ((_b = this.state.context) == null ? void 0 : _b.sessionId)) {
764
816
  if (this.config.debugMode) {
765
- console.log("\u{1F680} [FunnelClient] Auto-redirecting to:", result.url);
817
+ console.log("\u{1F525} [FunnelClient] Session ID updated: ".concat((_c = this.state.context) == null ? void 0 : _c.sessionId, " \u2192 ").concat(result.sessionId));
818
+ }
819
+ if (this.state.context) {
820
+ this.state.context.sessionId = result.sessionId;
766
821
  }
767
- window.location.href = result.url;
822
+ }
823
+ if (this.config.debugMode) {
824
+ console.log("\u{1F525} [FunnelClient] Navigation queued (fire-and-forget mode)");
768
825
  }
769
826
  return result;
770
827
  }
771
- throw new Error(response.error || "Navigation failed");
828
+ const shouldAutoRedirect = this.config.autoRedirect !== false;
829
+ if (!shouldAutoRedirect) {
830
+ if (this.config.debugMode) {
831
+ console.log("\u{1F504} [FunnelClient] Refreshing session (no auto-redirect)");
832
+ }
833
+ await this.refreshSession();
834
+ }
835
+ this.updateState({ isNavigating: false, isLoading: false });
836
+ if (shouldAutoRedirect && (result == null ? void 0 : result.url) && typeof window !== "undefined") {
837
+ if (this.config.debugMode) {
838
+ console.log("\u{1F680} [FunnelClient] Auto-redirecting to:", result.url, "(skipped session refresh - next page will initialize)");
839
+ }
840
+ window.location.href = result.url;
841
+ }
842
+ return result;
772
843
  } catch (error) {
773
844
  const err = error instanceof Error ? error : new Error(String(error));
774
845
  this.updateState({ error: err, isNavigating: false, isLoading: false });
@@ -3638,70 +3709,3240 @@ var TagadaTrackerBundle = (() => {
3638
3709
  }
3639
3710
  };
3640
3711
 
3641
- // src/v2/core/utils/deviceInfo.ts
3642
- function getBrowserInfo() {
3643
- const userAgent = navigator.userAgent;
3644
- if (userAgent.includes("Chrome")) {
3645
- const match = /Chrome\/(\d+)/.exec(userAgent);
3646
- return { name: "Chrome", version: match ? match[1] : "unknown" };
3712
+ // ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/main/ua-parser.mjs
3713
+ var LIBVERSION = "2.0.6";
3714
+ var UA_MAX_LENGTH = 500;
3715
+ var USER_AGENT = "user-agent";
3716
+ var EMPTY = "";
3717
+ var UNKNOWN = "?";
3718
+ var TYPEOF = {
3719
+ FUNCTION: "function",
3720
+ OBJECT: "object",
3721
+ STRING: "string",
3722
+ UNDEFINED: "undefined"
3723
+ };
3724
+ var BROWSER = "browser";
3725
+ var CPU = "cpu";
3726
+ var DEVICE = "device";
3727
+ var ENGINE = "engine";
3728
+ var OS = "os";
3729
+ var RESULT = "result";
3730
+ var NAME = "name";
3731
+ var TYPE = "type";
3732
+ var VENDOR = "vendor";
3733
+ var VERSION3 = "version";
3734
+ var ARCHITECTURE = "architecture";
3735
+ var MAJOR = "major";
3736
+ var MODEL = "model";
3737
+ var CONSOLE = "console";
3738
+ var MOBILE = "mobile";
3739
+ var TABLET = "tablet";
3740
+ var SMARTTV = "smarttv";
3741
+ var WEARABLE = "wearable";
3742
+ var XR = "xr";
3743
+ var EMBEDDED = "embedded";
3744
+ var INAPP = "inapp";
3745
+ var BRANDS = "brands";
3746
+ var FORMFACTORS = "formFactors";
3747
+ var FULLVERLIST = "fullVersionList";
3748
+ var PLATFORM = "platform";
3749
+ var PLATFORMVER = "platformVersion";
3750
+ var BITNESS = "bitness";
3751
+ var CH = "sec-ch-ua";
3752
+ var CH_FULL_VER_LIST = CH + "-full-version-list";
3753
+ var CH_ARCH = CH + "-arch";
3754
+ var CH_BITNESS = CH + "-" + BITNESS;
3755
+ var CH_FORM_FACTORS = CH + "-form-factors";
3756
+ var CH_MOBILE = CH + "-" + MOBILE;
3757
+ var CH_MODEL = CH + "-" + MODEL;
3758
+ var CH_PLATFORM = CH + "-" + PLATFORM;
3759
+ var CH_PLATFORM_VER = CH_PLATFORM + "-version";
3760
+ var CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS];
3761
+ var AMAZON = "Amazon";
3762
+ var APPLE = "Apple";
3763
+ var ASUS = "ASUS";
3764
+ var BLACKBERRY = "BlackBerry";
3765
+ var GOOGLE = "Google";
3766
+ var HUAWEI = "Huawei";
3767
+ var LENOVO = "Lenovo";
3768
+ var HONOR = "Honor";
3769
+ var LG = "LG";
3770
+ var MICROSOFT = "Microsoft";
3771
+ var MOTOROLA = "Motorola";
3772
+ var NVIDIA = "Nvidia";
3773
+ var ONEPLUS = "OnePlus";
3774
+ var OPPO = "OPPO";
3775
+ var SAMSUNG = "Samsung";
3776
+ var SHARP = "Sharp";
3777
+ var SONY = "Sony";
3778
+ var XIAOMI = "Xiaomi";
3779
+ var ZEBRA = "Zebra";
3780
+ var CHROME = "Chrome";
3781
+ var CHROMIUM = "Chromium";
3782
+ var CHROMECAST = "Chromecast";
3783
+ var EDGE = "Edge";
3784
+ var FIREFOX = "Firefox";
3785
+ var OPERA = "Opera";
3786
+ var FACEBOOK = "Facebook";
3787
+ var SOGOU = "Sogou";
3788
+ var PREFIX_MOBILE = "Mobile ";
3789
+ var SUFFIX_BROWSER = " Browser";
3790
+ var WINDOWS = "Windows";
3791
+ var isWindow = typeof window !== TYPEOF.UNDEFINED;
3792
+ var NAVIGATOR = isWindow && window.navigator ? window.navigator : void 0;
3793
+ var NAVIGATOR_UADATA = NAVIGATOR && NAVIGATOR.userAgentData ? NAVIGATOR.userAgentData : void 0;
3794
+ var extend2 = function(defaultRgx, extensions) {
3795
+ var mergedRgx = {};
3796
+ var extraRgx = extensions;
3797
+ if (!isExtensions(extensions)) {
3798
+ extraRgx = {};
3799
+ for (var i in extensions) {
3800
+ for (var j in extensions[i]) {
3801
+ extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);
3802
+ }
3803
+ }
3647
3804
  }
3648
- if (userAgent.includes("Firefox")) {
3649
- const match = /Firefox\/(\d+)/.exec(userAgent);
3650
- return { name: "Firefox", version: match ? match[1] : "unknown" };
3805
+ for (var k in defaultRgx) {
3806
+ mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];
3651
3807
  }
3652
- if (userAgent.includes("Safari") && !userAgent.includes("Chrome")) {
3653
- const match = /Version\/(\d+)/.exec(userAgent);
3654
- return { name: "Safari", version: match ? match[1] : "unknown" };
3808
+ return mergedRgx;
3809
+ };
3810
+ var enumerize = function(arr) {
3811
+ var enums = {};
3812
+ for (var i = 0; i < arr.length; i++) {
3813
+ enums[arr[i].toUpperCase()] = arr[i];
3655
3814
  }
3656
- if (userAgent.includes("Edge")) {
3657
- const match = /Edge\/(\d+)/.exec(userAgent);
3658
- return { name: "Edge", version: match ? match[1] : "unknown" };
3815
+ return enums;
3816
+ };
3817
+ var has = function(str1, str2) {
3818
+ if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
3819
+ for (var i in str1) {
3820
+ if (lowerize(str2) == lowerize(str1[i])) return true;
3821
+ }
3822
+ return false;
3659
3823
  }
3660
- return { name: "unknown", version: "unknown" };
3661
- }
3662
- function getOSInfo() {
3663
- const userAgent = navigator.userAgent;
3664
- if (userAgent.includes("Windows")) {
3665
- if (userAgent.includes("Windows NT 10.0")) return { name: "Windows", version: "10" };
3666
- if (userAgent.includes("Windows NT 6.3")) return { name: "Windows", version: "8.1" };
3667
- if (userAgent.includes("Windows NT 6.2")) return { name: "Windows", version: "8" };
3668
- if (userAgent.includes("Windows NT 6.1")) return { name: "Windows", version: "7" };
3669
- return { name: "Windows", version: "unknown" };
3670
- }
3671
- if (userAgent.includes("Mac OS X")) {
3672
- const match = /Mac OS X (\d+[._]\d+)/.exec(userAgent);
3673
- return { name: "macOS", version: match ? match[1].replace("_", ".") : "unknown" };
3674
- }
3675
- if (userAgent.includes("iPhone") || userAgent.includes("iPad")) {
3676
- const match = /OS (\d+[._]\d+)/.exec(userAgent);
3677
- return { name: "iOS", version: match ? match[1].replace("_", ".") : "unknown" };
3678
- }
3679
- if (userAgent.includes("Android")) {
3680
- const match = /Android (\d+[.\d]*)/.exec(userAgent);
3681
- return { name: "Android", version: match ? match[1] : "unknown" };
3682
- }
3683
- if (userAgent.includes("Linux")) {
3684
- return { name: "Linux", version: "unknown" };
3685
- }
3686
- return { name: "unknown", version: "unknown" };
3687
- }
3688
- function getDeviceInfo() {
3689
- const userAgent = navigator.userAgent;
3690
- if (userAgent.includes("iPhone")) {
3691
- return { type: "mobile", model: "iPhone" };
3824
+ return isString2(str1) ? lowerize(str2) == lowerize(str1) : false;
3825
+ };
3826
+ var isExtensions = function(obj, deep) {
3827
+ for (var prop in obj) {
3828
+ return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
3692
3829
  }
3693
- if (userAgent.includes("iPad")) {
3694
- return { type: "tablet", model: "iPad" };
3830
+ };
3831
+ var isString2 = function(val) {
3832
+ return typeof val === TYPEOF.STRING;
3833
+ };
3834
+ var itemListToArray = function(header) {
3835
+ if (!header) return void 0;
3836
+ var arr = [];
3837
+ var tokens = strip(/\\?\"/g, header).split(",");
3838
+ for (var i = 0; i < tokens.length; i++) {
3839
+ if (tokens[i].indexOf(";") > -1) {
3840
+ var token = trim2(tokens[i]).split(";v=");
3841
+ arr[i] = { brand: token[0], version: token[1] };
3842
+ } else {
3843
+ arr[i] = trim2(tokens[i]);
3844
+ }
3695
3845
  }
3696
- if (userAgent.includes("Android")) {
3697
- if (userAgent.includes("Mobile")) {
3698
- return { type: "mobile", model: "Android" };
3846
+ return arr;
3847
+ };
3848
+ var lowerize = function(str) {
3849
+ return isString2(str) ? str.toLowerCase() : str;
3850
+ };
3851
+ var majorize = function(version) {
3852
+ return isString2(version) ? strip(/[^\d\.]/g, version).split(".")[0] : void 0;
3853
+ };
3854
+ var setProps = function(arr) {
3855
+ for (var i in arr) {
3856
+ if (!arr.hasOwnProperty(i)) continue;
3857
+ var propName = arr[i];
3858
+ if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {
3859
+ this[propName[0]] = propName[1];
3699
3860
  } else {
3700
- return { type: "tablet", model: "Android" };
3861
+ this[propName] = void 0;
3701
3862
  }
3702
3863
  }
3703
- return void 0;
3864
+ return this;
3865
+ };
3866
+ var strip = function(pattern, str) {
3867
+ return isString2(str) ? str.replace(pattern, EMPTY) : str;
3868
+ };
3869
+ var stripQuotes = function(str) {
3870
+ return strip(/\\?\"/g, str);
3871
+ };
3872
+ var trim2 = function(str, len) {
3873
+ str = strip(/^\s\s*/, String(str));
3874
+ return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
3875
+ };
3876
+ var rgxMapper = function(ua, arrays) {
3877
+ if (!ua || !arrays) return;
3878
+ var i = 0, j, k, p, q, matches, match;
3879
+ while (i < arrays.length && !matches) {
3880
+ var regex = arrays[i], props = arrays[i + 1];
3881
+ j = k = 0;
3882
+ while (j < regex.length && !matches) {
3883
+ if (!regex[j]) {
3884
+ break;
3885
+ }
3886
+ matches = regex[j++].exec(ua);
3887
+ if (!!matches) {
3888
+ for (p = 0; p < props.length; p++) {
3889
+ match = matches[++k];
3890
+ q = props[p];
3891
+ if (typeof q === TYPEOF.OBJECT && q.length > 0) {
3892
+ if (q.length === 2) {
3893
+ if (typeof q[1] == TYPEOF.FUNCTION) {
3894
+ this[q[0]] = q[1].call(this, match);
3895
+ } else {
3896
+ this[q[0]] = q[1];
3897
+ }
3898
+ } else if (q.length >= 3) {
3899
+ if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {
3900
+ if (q.length > 3) {
3901
+ this[q[0]] = match ? q[1].apply(this, q.slice(2)) : void 0;
3902
+ } else {
3903
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : void 0;
3904
+ }
3905
+ } else {
3906
+ if (q.length == 3) {
3907
+ this[q[0]] = match ? match.replace(q[1], q[2]) : void 0;
3908
+ } else if (q.length == 4) {
3909
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : void 0;
3910
+ } else if (q.length > 4) {
3911
+ this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : void 0;
3912
+ }
3913
+ }
3914
+ }
3915
+ } else {
3916
+ this[q] = match ? match : void 0;
3917
+ }
3918
+ }
3919
+ }
3920
+ }
3921
+ i += 2;
3922
+ }
3923
+ };
3924
+ var strMapper = function(str, map) {
3925
+ for (var i in map) {
3926
+ if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
3927
+ for (var j = 0; j < map[i].length; j++) {
3928
+ if (has(map[i][j], str)) {
3929
+ return i === UNKNOWN ? void 0 : i;
3930
+ }
3931
+ }
3932
+ } else if (has(map[i], str)) {
3933
+ return i === UNKNOWN ? void 0 : i;
3934
+ }
3935
+ }
3936
+ return map.hasOwnProperty("*") ? map["*"] : str;
3937
+ };
3938
+ var windowsVersionMap = {
3939
+ "ME": "4.90",
3940
+ "NT 3.51": "3.51",
3941
+ "NT 4.0": "4.0",
3942
+ "2000": ["5.0", "5.01"],
3943
+ "XP": ["5.1", "5.2"],
3944
+ "Vista": "6.0",
3945
+ "7": "6.1",
3946
+ "8": "6.2",
3947
+ "8.1": "6.3",
3948
+ "10": ["6.4", "10.0"],
3949
+ "NT": ""
3950
+ };
3951
+ var formFactorsMap = {
3952
+ "embedded": "Automotive",
3953
+ "mobile": "Mobile",
3954
+ "tablet": ["Tablet", "EInk"],
3955
+ "smarttv": "TV",
3956
+ "wearable": "Watch",
3957
+ "xr": ["VR", "XR"],
3958
+ "?": ["Desktop", "Unknown"],
3959
+ "*": void 0
3960
+ };
3961
+ var browserHintsMap = {
3962
+ "Chrome": "Google Chrome",
3963
+ "Edge": "Microsoft Edge",
3964
+ "Edge WebView2": "Microsoft Edge WebView2",
3965
+ "Chrome WebView": "Android WebView",
3966
+ "Chrome Headless": "HeadlessChrome",
3967
+ "Huawei Browser": "HuaweiBrowser",
3968
+ "MIUI Browser": "Miui Browser",
3969
+ "Opera Mobi": "OperaMobile",
3970
+ "Yandex": "YaBrowser"
3971
+ };
3972
+ var defaultRegexes = {
3973
+ browser: [
3974
+ [
3975
+ // Most common regardless engine
3976
+ /\b(?:crmo|crios)\/([\w\.]+)/i
3977
+ // Chrome for Android/iOS
3978
+ ],
3979
+ [VERSION3, [NAME, PREFIX_MOBILE + "Chrome"]],
3980
+ [
3981
+ /webview.+edge\/([\w\.]+)/i
3982
+ // Microsoft Edge
3983
+ ],
3984
+ [VERSION3, [NAME, EDGE + " WebView"]],
3985
+ [
3986
+ /edg(?:e|ios|a)?\/([\w\.]+)/i
3987
+ ],
3988
+ [VERSION3, [NAME, "Edge"]],
3989
+ [
3990
+ // Presto based
3991
+ /(opera mini)\/([-\w\.]+)/i,
3992
+ // Opera Mini
3993
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
3994
+ // Opera Mobi/Tablet
3995
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i
3996
+ // Opera
3997
+ ],
3998
+ [NAME, VERSION3],
3999
+ [
4000
+ /opios[\/ ]+([\w\.]+)/i
4001
+ // Opera mini on iphone >= 8.0
4002
+ ],
4003
+ [VERSION3, [NAME, OPERA + " Mini"]],
4004
+ [
4005
+ /\bop(?:rg)?x\/([\w\.]+)/i
4006
+ // Opera GX
4007
+ ],
4008
+ [VERSION3, [NAME, OPERA + " GX"]],
4009
+ [
4010
+ /\bopr\/([\w\.]+)/i
4011
+ // Opera Webkit
4012
+ ],
4013
+ [VERSION3, [NAME, OPERA]],
4014
+ [
4015
+ // Mixed
4016
+ /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i
4017
+ // Baidu
4018
+ ],
4019
+ [VERSION3, [NAME, "Baidu"]],
4020
+ [
4021
+ /\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i
4022
+ // Maxthon
4023
+ ],
4024
+ [VERSION3, [NAME, "Maxthon"]],
4025
+ [
4026
+ /(kindle)\/([\w\.]+)/i,
4027
+ // Kindle
4028
+ /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
4029
+ // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
4030
+ // Trident based
4031
+ /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,
4032
+ // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
4033
+ /(?:ms|\()(ie) ([\w\.]+)/i,
4034
+ // Internet Explorer
4035
+ // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon
4036
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i,
4037
+ // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
4038
+ /(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,
4039
+ // HeyTap/Ovi/115/Surf
4040
+ /(qwant)(?:ios|mobile)\/([\d\.]+)/i,
4041
+ // Qwant
4042
+ /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i
4043
+ // Ecosia/Weibo
4044
+ ],
4045
+ [NAME, VERSION3],
4046
+ [
4047
+ /quark(?:pc)?\/([-\w\.]+)/i
4048
+ // Quark
4049
+ ],
4050
+ [VERSION3, [NAME, "Quark"]],
4051
+ [
4052
+ /\bddg\/([\w\.]+)/i
4053
+ // DuckDuckGo
4054
+ ],
4055
+ [VERSION3, [NAME, "DuckDuckGo"]],
4056
+ [
4057
+ /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i
4058
+ // UCBrowser
4059
+ ],
4060
+ [VERSION3, [NAME, "UCBrowser"]],
4061
+ [
4062
+ /microm.+\bqbcore\/([\w\.]+)/i,
4063
+ // WeChat Desktop for Windows Built-in Browser
4064
+ /\bqbcore\/([\w\.]+).+microm/i,
4065
+ /micromessenger\/([\w\.]+)/i
4066
+ // WeChat
4067
+ ],
4068
+ [VERSION3, [NAME, "WeChat"]],
4069
+ [
4070
+ /konqueror\/([\w\.]+)/i
4071
+ // Konqueror
4072
+ ],
4073
+ [VERSION3, [NAME, "Konqueror"]],
4074
+ [
4075
+ /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i
4076
+ // IE11
4077
+ ],
4078
+ [VERSION3, [NAME, "IE"]],
4079
+ [
4080
+ /ya(?:search)?browser\/([\w\.]+)/i
4081
+ // Yandex
4082
+ ],
4083
+ [VERSION3, [NAME, "Yandex"]],
4084
+ [
4085
+ /slbrowser\/([\w\.]+)/i
4086
+ // Smart Lenovo Browser
4087
+ ],
4088
+ [VERSION3, [NAME, "Smart " + LENOVO + SUFFIX_BROWSER]],
4089
+ [
4090
+ /(avast|avg)\/([\w\.]+)/i
4091
+ // Avast/AVG Secure Browser
4092
+ ],
4093
+ [[NAME, /(.+)/, "$1 Secure" + SUFFIX_BROWSER], VERSION3],
4094
+ [
4095
+ /\bfocus\/([\w\.]+)/i
4096
+ // Firefox Focus
4097
+ ],
4098
+ [VERSION3, [NAME, FIREFOX + " Focus"]],
4099
+ [
4100
+ /\bopt\/([\w\.]+)/i
4101
+ // Opera Touch
4102
+ ],
4103
+ [VERSION3, [NAME, OPERA + " Touch"]],
4104
+ [
4105
+ /coc_coc\w+\/([\w\.]+)/i
4106
+ // Coc Coc Browser
4107
+ ],
4108
+ [VERSION3, [NAME, "Coc Coc"]],
4109
+ [
4110
+ /dolfin\/([\w\.]+)/i
4111
+ // Dolphin
4112
+ ],
4113
+ [VERSION3, [NAME, "Dolphin"]],
4114
+ [
4115
+ /coast\/([\w\.]+)/i
4116
+ // Opera Coast
4117
+ ],
4118
+ [VERSION3, [NAME, OPERA + " Coast"]],
4119
+ [
4120
+ /miuibrowser\/([\w\.]+)/i
4121
+ // MIUI Browser
4122
+ ],
4123
+ [VERSION3, [NAME, "MIUI" + SUFFIX_BROWSER]],
4124
+ [
4125
+ /fxios\/([\w\.-]+)/i
4126
+ // Firefox for iOS
4127
+ ],
4128
+ [VERSION3, [NAME, PREFIX_MOBILE + FIREFOX]],
4129
+ [
4130
+ /\bqihoobrowser\/?([\w\.]*)/i
4131
+ // 360
4132
+ ],
4133
+ [VERSION3, [NAME, "360"]],
4134
+ [
4135
+ /\b(qq)\/([\w\.]+)/i
4136
+ // QQ
4137
+ ],
4138
+ [[NAME, /(.+)/, "$1Browser"], VERSION3],
4139
+ [
4140
+ /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
4141
+ ],
4142
+ [[NAME, /(.+)/, "$1" + SUFFIX_BROWSER], VERSION3],
4143
+ [
4144
+ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
4145
+ /samsungbrowser\/([\w\.]+)/i
4146
+ // Samsung Internet
4147
+ ],
4148
+ [VERSION3, [NAME, SAMSUNG + " Internet"]],
4149
+ [
4150
+ /metasr[\/ ]?([\d\.]+)/i
4151
+ // Sogou Explorer
4152
+ ],
4153
+ [VERSION3, [NAME, SOGOU + " Explorer"]],
4154
+ [
4155
+ /(sogou)mo\w+\/([\d\.]+)/i
4156
+ // Sogou Mobile
4157
+ ],
4158
+ [[NAME, SOGOU + " Mobile"], VERSION3],
4159
+ [
4160
+ /(electron)\/([\w\.]+) safari/i,
4161
+ // Electron-based App
4162
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
4163
+ // Tesla
4164
+ /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i
4165
+ // QQ/2345
4166
+ ],
4167
+ [NAME, VERSION3],
4168
+ [
4169
+ /(lbbrowser|rekonq)/i
4170
+ // LieBao Browser/Rekonq
4171
+ ],
4172
+ [NAME],
4173
+ [
4174
+ /ome\/([\w\.]+) \w* ?(iron) saf/i,
4175
+ // Iron
4176
+ /ome\/([\w\.]+).+qihu (360)[es]e/i
4177
+ // 360
4178
+ ],
4179
+ [VERSION3, NAME],
4180
+ [
4181
+ // WebView
4182
+ /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i
4183
+ // Facebook App for iOS & Android
4184
+ ],
4185
+ [[NAME, FACEBOOK], VERSION3, [TYPE, INAPP]],
4186
+ [
4187
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
4188
+ // Kakao App
4189
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
4190
+ // Naver InApp
4191
+ /(daum)apps[\/ ]([\w\.]+)/i,
4192
+ // Daum App
4193
+ /safari (line)\/([\w\.]+)/i,
4194
+ // Line App for iOS
4195
+ /\b(line)\/([\w\.]+)\/iab/i,
4196
+ // Line App for Android
4197
+ /(alipay)client\/([\w\.]+)/i,
4198
+ // Alipay
4199
+ /(twitter)(?:and| f.+e\/([\w\.]+))/i,
4200
+ // Twitter
4201
+ /(bing)(?:web|sapphire)\/([\w\.]+)/i,
4202
+ // Bing
4203
+ /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i
4204
+ // Instagram/Snapchat/Klarna
4205
+ ],
4206
+ [NAME, VERSION3, [TYPE, INAPP]],
4207
+ [
4208
+ /\bgsa\/([\w\.]+) .*safari\//i
4209
+ // Google Search Appliance on iOS
4210
+ ],
4211
+ [VERSION3, [NAME, "GSA"], [TYPE, INAPP]],
4212
+ [
4213
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i
4214
+ // TikTok
4215
+ ],
4216
+ [VERSION3, [NAME, "TikTok"], [TYPE, INAPP]],
4217
+ [
4218
+ /\[(linkedin)app\]/i
4219
+ // LinkedIn App for iOS & Android
4220
+ ],
4221
+ [NAME, [TYPE, INAPP]],
4222
+ [
4223
+ /(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i
4224
+ // Zalo
4225
+ ],
4226
+ [[NAME, /(.+)/, "Zalo"], VERSION3, [TYPE, INAPP]],
4227
+ [
4228
+ /(chromium)[\/ ]([-\w\.]+)/i
4229
+ // Chromium
4230
+ ],
4231
+ [NAME, VERSION3],
4232
+ [
4233
+ /headlesschrome(?:\/([\w\.]+)| )/i
4234
+ // Chrome Headless
4235
+ ],
4236
+ [VERSION3, [NAME, CHROME + " Headless"]],
4237
+ [
4238
+ /wv\).+chrome\/([\w\.]+).+edgw\//i
4239
+ // Edge WebView2
4240
+ ],
4241
+ [VERSION3, [NAME, EDGE + " WebView2"]],
4242
+ [
4243
+ / wv\).+(chrome)\/([\w\.]+)/i
4244
+ // Chrome WebView
4245
+ ],
4246
+ [[NAME, CHROME + " WebView"], VERSION3],
4247
+ [
4248
+ /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i
4249
+ // Android Browser
4250
+ ],
4251
+ [VERSION3, [NAME, "Android" + SUFFIX_BROWSER]],
4252
+ [
4253
+ /chrome\/([\w\.]+) mobile/i
4254
+ // Chrome Mobile
4255
+ ],
4256
+ [VERSION3, [NAME, PREFIX_MOBILE + "Chrome"]],
4257
+ [
4258
+ /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i
4259
+ // Chrome/OmniWeb/Arora/Tizen/Nokia
4260
+ ],
4261
+ [NAME, VERSION3],
4262
+ [
4263
+ /version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i
4264
+ // Safari Mobile
4265
+ ],
4266
+ [VERSION3, [NAME, PREFIX_MOBILE + "Safari"]],
4267
+ [
4268
+ /iphone .*mobile(?:\/\w+ | ?)safari/i
4269
+ ],
4270
+ [[NAME, PREFIX_MOBILE + "Safari"]],
4271
+ [
4272
+ /version\/([\w\.\,]+) .*(safari)/i
4273
+ // Safari
4274
+ ],
4275
+ [VERSION3, NAME],
4276
+ [
4277
+ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i
4278
+ // Safari < 3.0
4279
+ ],
4280
+ [NAME, [VERSION3, "1"]],
4281
+ [
4282
+ /(webkit|khtml)\/([\w\.]+)/i
4283
+ ],
4284
+ [NAME, VERSION3],
4285
+ [
4286
+ // Gecko based
4287
+ /(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i
4288
+ // Firefox Mobile
4289
+ ],
4290
+ [[NAME, PREFIX_MOBILE + FIREFOX], VERSION3],
4291
+ [
4292
+ /(navigator|netscape\d?)\/([-\w\.]+)/i
4293
+ // Netscape
4294
+ ],
4295
+ [[NAME, "Netscape"], VERSION3],
4296
+ [
4297
+ /(wolvic|librewolf)\/([\w\.]+)/i
4298
+ // Wolvic/LibreWolf
4299
+ ],
4300
+ [NAME, VERSION3],
4301
+ [
4302
+ /mobile vr; rv:([\w\.]+)\).+firefox/i
4303
+ // Firefox Reality
4304
+ ],
4305
+ [VERSION3, [NAME, FIREFOX + " Reality"]],
4306
+ [
4307
+ /ekiohf.+(flow)\/([\w\.]+)/i,
4308
+ // Flow
4309
+ /(swiftfox)/i,
4310
+ // Swiftfox
4311
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
4312
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
4313
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
4314
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
4315
+ /(firefox)\/([\w\.]+)/i,
4316
+ // Other Firefox-based
4317
+ /(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,
4318
+ // Mozilla
4319
+ // Other
4320
+ /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
4321
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
4322
+ /\b(links) \(([\w\.]+)/i
4323
+ // Links
4324
+ ],
4325
+ [NAME, [VERSION3, /_/g, "."]],
4326
+ [
4327
+ /(cobalt)\/([\w\.]+)/i
4328
+ // Cobalt
4329
+ ],
4330
+ [NAME, [VERSION3, /[^\d\.]+./, EMPTY]]
4331
+ ],
4332
+ cpu: [
4333
+ [
4334
+ /\b((amd|x|x86[-_]?|wow|win)64)\b/i
4335
+ // AMD64 (x64)
4336
+ ],
4337
+ [[ARCHITECTURE, "amd64"]],
4338
+ [
4339
+ /(ia32(?=;))/i,
4340
+ // IA32 (quicktime)
4341
+ /\b((i[346]|x)86)(pc)?\b/i
4342
+ // IA32 (x86)
4343
+ ],
4344
+ [[ARCHITECTURE, "ia32"]],
4345
+ [
4346
+ /\b(aarch64|arm(v?[89]e?l?|_?64))\b/i
4347
+ // ARM64
4348
+ ],
4349
+ [[ARCHITECTURE, "arm64"]],
4350
+ [
4351
+ /\b(arm(v[67])?ht?n?[fl]p?)\b/i
4352
+ // ARMHF
4353
+ ],
4354
+ [[ARCHITECTURE, "armhf"]],
4355
+ [
4356
+ // PocketPC mistakenly identified as PowerPC
4357
+ /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
4358
+ ],
4359
+ [[ARCHITECTURE, "arm"]],
4360
+ [
4361
+ / sun4\w[;\)]/i
4362
+ // SPARC
4363
+ ],
4364
+ [[ARCHITECTURE, "sparc"]],
4365
+ [
4366
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
4367
+ /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
4368
+ /((ppc|powerpc)(64)?)( mac|;|\))/i,
4369
+ // PowerPC
4370
+ /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i
4371
+ // Alpha
4372
+ ],
4373
+ [[ARCHITECTURE, /ower/, EMPTY, lowerize]],
4374
+ [
4375
+ /mc680.0/i
4376
+ ],
4377
+ [[ARCHITECTURE, "68k"]],
4378
+ [
4379
+ /winnt.+\[axp/i
4380
+ ],
4381
+ [[ARCHITECTURE, "alpha"]]
4382
+ ],
4383
+ device: [
4384
+ [
4385
+ //////////////////////////
4386
+ // MOBILES & TABLETS
4387
+ /////////////////////////
4388
+ // Samsung
4389
+ /\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
4390
+ ],
4391
+ [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]],
4392
+ [
4393
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
4394
+ /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
4395
+ /sec-(sgh\w+)/i
4396
+ ],
4397
+ [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]],
4398
+ [
4399
+ // Apple
4400
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i
4401
+ // iPod/iPhone
4402
+ ],
4403
+ [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]],
4404
+ [
4405
+ /\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,
4406
+ // iPad
4407
+ /\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i
4408
+ ],
4409
+ [MODEL, [VENDOR, APPLE], [TYPE, TABLET]],
4410
+ [
4411
+ /(macintosh);/i
4412
+ ],
4413
+ [MODEL, [VENDOR, APPLE]],
4414
+ [
4415
+ // Sharp
4416
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
4417
+ ],
4418
+ [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]],
4419
+ [
4420
+ // Honor
4421
+ /\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
4422
+ ],
4423
+ [MODEL, [VENDOR, HONOR], [TYPE, TABLET]],
4424
+ [
4425
+ /honor([-\w ]+)[;\)]/i
4426
+ ],
4427
+ [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]],
4428
+ [
4429
+ // Huawei
4430
+ /\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i
4431
+ ],
4432
+ [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]],
4433
+ [
4434
+ /(?:huawei) ?([-\w ]+)[;\)]/i,
4435
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i
4436
+ ],
4437
+ [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]],
4438
+ [
4439
+ // Xiaomi
4440
+ /oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
4441
+ /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i
4442
+ // Mi Pad tablets
4443
+ ],
4444
+ [[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, TABLET]],
4445
+ [
4446
+ /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i,
4447
+ // Xiaomi POCO
4448
+ /\b; (\w+) build\/hm\1/i,
4449
+ // Xiaomi Hongmi 'numeric' models
4450
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
4451
+ // Xiaomi Hongmi
4452
+ /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,
4453
+ // Xiaomi Redmi
4454
+ /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i,
4455
+ // Xiaomi Redmi 'numeric' models
4456
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
4457
+ // Xiaomi Mi
4458
+ / ([\w ]+) miui\/v?\d/i
4459
+ ],
4460
+ [[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, MOBILE]],
4461
+ [
4462
+ // OnePlus
4463
+ /droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i,
4464
+ /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
4465
+ ],
4466
+ [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]],
4467
+ [
4468
+ // OPPO
4469
+ /; (\w+) bui.+ oppo/i,
4470
+ /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
4471
+ ],
4472
+ [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]],
4473
+ [
4474
+ /\b(opd2(\d{3}a?))(?: bui|\))/i
4475
+ ],
4476
+ [MODEL, [VENDOR, strMapper, { "OnePlus": ["203", "304", "403", "404", "413", "415"], "*": OPPO }], [TYPE, TABLET]],
4477
+ [
4478
+ // BLU
4479
+ /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i
4480
+ // Vivo series
4481
+ ],
4482
+ [MODEL, [VENDOR, "BLU"], [TYPE, MOBILE]],
4483
+ [
4484
+ // Vivo
4485
+ /; vivo (\w+)(?: bui|\))/i,
4486
+ /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
4487
+ ],
4488
+ [MODEL, [VENDOR, "Vivo"], [TYPE, MOBILE]],
4489
+ [
4490
+ // Realme
4491
+ /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
4492
+ ],
4493
+ [MODEL, [VENDOR, "Realme"], [TYPE, MOBILE]],
4494
+ [
4495
+ // Lenovo
4496
+ /(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,
4497
+ /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
4498
+ ],
4499
+ [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]],
4500
+ [
4501
+ /lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i
4502
+ ],
4503
+ [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]],
4504
+ [
4505
+ // Motorola
4506
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
4507
+ /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
4508
+ /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
4509
+ ],
4510
+ [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]],
4511
+ [
4512
+ /\b(mz60\d|xoom[2 ]{0,2}) build\//i
4513
+ ],
4514
+ [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]],
4515
+ [
4516
+ // LG
4517
+ /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
4518
+ ],
4519
+ [MODEL, [VENDOR, LG], [TYPE, TABLET]],
4520
+ [
4521
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
4522
+ /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
4523
+ /\blg-?([\d\w]+) bui/i
4524
+ ],
4525
+ [MODEL, [VENDOR, LG], [TYPE, MOBILE]],
4526
+ [
4527
+ // Nokia
4528
+ /(nokia) (t[12][01])/i
4529
+ ],
4530
+ [VENDOR, MODEL, [TYPE, TABLET]],
4531
+ [
4532
+ /(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
4533
+ /nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i
4534
+ ],
4535
+ [[MODEL, /_/g, " "], [TYPE, MOBILE], [VENDOR, "Nokia"]],
4536
+ [
4537
+ // Google
4538
+ /(pixel (c|tablet))\b/i
4539
+ // Google Pixel C/Tablet
4540
+ ],
4541
+ [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]],
4542
+ [
4543
+ // Google Pixel
4544
+ /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i
4545
+ ],
4546
+ [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]],
4547
+ [
4548
+ /(google) (pixelbook( go)?)/i
4549
+ ],
4550
+ [VENDOR, MODEL],
4551
+ [
4552
+ // Sony
4553
+ /droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
4554
+ ],
4555
+ [MODEL, [VENDOR, SONY], [TYPE, MOBILE]],
4556
+ [
4557
+ /sony tablet [ps]/i,
4558
+ /\b(?:sony)?sgp\w+(?: bui|\))/i
4559
+ ],
4560
+ [[MODEL, "Xperia Tablet"], [VENDOR, SONY], [TYPE, TABLET]],
4561
+ [
4562
+ // Amazon
4563
+ /(alexa)webm/i,
4564
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,
4565
+ // Kindle Fire without Silk / Echo Show
4566
+ /(kf[a-z]+)( bui|\)).+silk\//i
4567
+ // Kindle Fire HD
4568
+ ],
4569
+ [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]],
4570
+ [
4571
+ /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i
4572
+ // Fire Phone
4573
+ ],
4574
+ [[MODEL, /(.+)/g, "Fire Phone $1"], [VENDOR, AMAZON], [TYPE, MOBILE]],
4575
+ [
4576
+ // BlackBerry
4577
+ /(playbook);[-\w\),; ]+(rim)/i
4578
+ // BlackBerry PlayBook
4579
+ ],
4580
+ [MODEL, VENDOR, [TYPE, TABLET]],
4581
+ [
4582
+ /\b((?:bb[a-f]|st[hv])100-\d)/i,
4583
+ /(?:blackberry|\(bb10;) (\w+)/i
4584
+ ],
4585
+ [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]],
4586
+ [
4587
+ // Asus
4588
+ /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
4589
+ ],
4590
+ [MODEL, [VENDOR, ASUS], [TYPE, TABLET]],
4591
+ [
4592
+ / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
4593
+ ],
4594
+ [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]],
4595
+ [
4596
+ // HTC
4597
+ /(nexus 9)/i
4598
+ // HTC Nexus 9
4599
+ ],
4600
+ [MODEL, [VENDOR, "HTC"], [TYPE, TABLET]],
4601
+ [
4602
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
4603
+ // HTC
4604
+ // ZTE
4605
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
4606
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i
4607
+ // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
4608
+ ],
4609
+ [VENDOR, [MODEL, /_/g, " "], [TYPE, MOBILE]],
4610
+ [
4611
+ // TCL
4612
+ /tcl (xess p17aa)/i,
4613
+ /droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i
4614
+ ],
4615
+ [MODEL, [VENDOR, "TCL"], [TYPE, TABLET]],
4616
+ [
4617
+ /droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i
4618
+ ],
4619
+ [MODEL, [VENDOR, "TCL"], [TYPE, MOBILE]],
4620
+ [
4621
+ // itel
4622
+ /(itel) ((\w+))/i
4623
+ ],
4624
+ [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { "tablet": ["p10001l", "w7001"], "*": "mobile" }]],
4625
+ [
4626
+ // Acer
4627
+ /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
4628
+ ],
4629
+ [MODEL, [VENDOR, "Acer"], [TYPE, TABLET]],
4630
+ [
4631
+ // Meizu
4632
+ /droid.+; (m[1-5] note) bui/i,
4633
+ /\bmz-([-\w]{2,})/i
4634
+ ],
4635
+ [MODEL, [VENDOR, "Meizu"], [TYPE, MOBILE]],
4636
+ [
4637
+ // Ulefone
4638
+ /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
4639
+ ],
4640
+ [MODEL, [VENDOR, "Ulefone"], [TYPE, MOBILE]],
4641
+ [
4642
+ // Energizer
4643
+ /; (energy ?\w+)(?: bui|\))/i,
4644
+ /; energizer ([\w ]+)(?: bui|\))/i
4645
+ ],
4646
+ [MODEL, [VENDOR, "Energizer"], [TYPE, MOBILE]],
4647
+ [
4648
+ // Cat
4649
+ /; cat (b35);/i,
4650
+ /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
4651
+ ],
4652
+ [MODEL, [VENDOR, "Cat"], [TYPE, MOBILE]],
4653
+ [
4654
+ // Smartfren
4655
+ /((?:new )?andromax[\w- ]+)(?: bui|\))/i
4656
+ ],
4657
+ [MODEL, [VENDOR, "Smartfren"], [TYPE, MOBILE]],
4658
+ [
4659
+ // Nothing
4660
+ /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i
4661
+ ],
4662
+ [MODEL, [VENDOR, "Nothing"], [TYPE, MOBILE]],
4663
+ [
4664
+ // Archos
4665
+ /; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
4666
+ /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
4667
+ ],
4668
+ [MODEL, [VENDOR, "Archos"], [TYPE, TABLET]],
4669
+ [
4670
+ /archos ([\w ]+)( b|\))/i,
4671
+ /; (ac[3-6]\d\w{2,8})( b|\))/i
4672
+ ],
4673
+ [MODEL, [VENDOR, "Archos"], [TYPE, MOBILE]],
4674
+ [
4675
+ // HMD
4676
+ /; (n159v)/i
4677
+ ],
4678
+ [MODEL, [VENDOR, "HMD"], [TYPE, MOBILE]],
4679
+ [
4680
+ // MIXED
4681
+ /(imo) (tab \w+)/i,
4682
+ // IMO
4683
+ /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i
4684
+ // Infinix XPad / Tecno
4685
+ ],
4686
+ [VENDOR, MODEL, [TYPE, TABLET]],
4687
+ [
4688
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
4689
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
4690
+ // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
4691
+ /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
4692
+ /(hp) ([\w ]+\w)/i,
4693
+ // HP iPAQ
4694
+ /(microsoft); (lumia[\w ]+)/i,
4695
+ // Microsoft Lumia
4696
+ /(oppo) ?([\w ]+) bui/i,
4697
+ // OPPO
4698
+ /(hisense) ([ehv][\w ]+)\)/i,
4699
+ // Hisense
4700
+ /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i
4701
+ // Philips
4702
+ ],
4703
+ [VENDOR, MODEL, [TYPE, MOBILE]],
4704
+ [
4705
+ /(kobo)\s(ereader|touch)/i,
4706
+ // Kobo
4707
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i,
4708
+ // HP TouchPad
4709
+ /(kindle)\/([\w\.]+)/i
4710
+ // Kindle
4711
+ ],
4712
+ [VENDOR, MODEL, [TYPE, TABLET]],
4713
+ [
4714
+ /(surface duo)/i
4715
+ // Surface Duo
4716
+ ],
4717
+ [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]],
4718
+ [
4719
+ /droid [\d\.]+; (fp\du?)(?: b|\))/i
4720
+ // Fairphone
4721
+ ],
4722
+ [MODEL, [VENDOR, "Fairphone"], [TYPE, MOBILE]],
4723
+ [
4724
+ /((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i
4725
+ // Nvidia Tablets
4726
+ ],
4727
+ [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]],
4728
+ [
4729
+ /(sprint) (\w+)/i
4730
+ // Sprint Phones
4731
+ ],
4732
+ [VENDOR, MODEL, [TYPE, MOBILE]],
4733
+ [
4734
+ /(kin\.[onetw]{3})/i
4735
+ // Microsoft Kin
4736
+ ],
4737
+ [[MODEL, /\./g, " "], [VENDOR, MICROSOFT], [TYPE, MOBILE]],
4738
+ [
4739
+ /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i
4740
+ // Zebra
4741
+ ],
4742
+ [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]],
4743
+ [
4744
+ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
4745
+ ],
4746
+ [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]],
4747
+ [
4748
+ ///////////////////
4749
+ // SMARTTVS
4750
+ ///////////////////
4751
+ /(philips)[\w ]+tv/i,
4752
+ // Philips
4753
+ /smart-tv.+(samsung)/i
4754
+ // Samsung
4755
+ ],
4756
+ [VENDOR, [TYPE, SMARTTV]],
4757
+ [
4758
+ /hbbtv.+maple;(\d+)/i
4759
+ ],
4760
+ [[MODEL, /^/, "SmartTV"], [VENDOR, SAMSUNG], [TYPE, SMARTTV]],
4761
+ [
4762
+ /(vizio)(?: |.+model\/)(\w+-\w+)/i,
4763
+ // Vizio
4764
+ /tcast.+(lg)e?. ([-\w]+)/i
4765
+ // LG SmartTV
4766
+ ],
4767
+ [VENDOR, MODEL, [TYPE, SMARTTV]],
4768
+ [
4769
+ /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
4770
+ ],
4771
+ [[VENDOR, LG], [TYPE, SMARTTV]],
4772
+ [
4773
+ /(apple) ?tv/i
4774
+ // Apple TV
4775
+ ],
4776
+ [VENDOR, [MODEL, APPLE + " TV"], [TYPE, SMARTTV]],
4777
+ [
4778
+ /crkey.*devicetype\/chromecast/i
4779
+ // Google Chromecast Third Generation
4780
+ ],
4781
+ [[MODEL, CHROMECAST + " Third Generation"], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
4782
+ [
4783
+ /crkey.*devicetype\/([^/]*)/i
4784
+ // Google Chromecast with specific device type
4785
+ ],
4786
+ [[MODEL, /^/, "Chromecast "], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
4787
+ [
4788
+ /fuchsia.*crkey/i
4789
+ // Google Chromecast Nest Hub
4790
+ ],
4791
+ [[MODEL, CHROMECAST + " Nest Hub"], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
4792
+ [
4793
+ /crkey/i
4794
+ // Google Chromecast, Linux-based or unknown
4795
+ ],
4796
+ [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
4797
+ [
4798
+ /(portaltv)/i
4799
+ // Facebook Portal TV
4800
+ ],
4801
+ [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]],
4802
+ [
4803
+ /droid.+aft(\w+)( bui|\))/i
4804
+ // Fire TV
4805
+ ],
4806
+ [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]],
4807
+ [
4808
+ /(shield \w+ tv)/i
4809
+ // Nvidia Shield TV
4810
+ ],
4811
+ [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]],
4812
+ [
4813
+ /\(dtv[\);].+(aquos)/i,
4814
+ /(aquos-tv[\w ]+)\)/i
4815
+ // Sharp
4816
+ ],
4817
+ [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],
4818
+ [
4819
+ /(bravia[\w ]+)( bui|\))/i
4820
+ // Sony
4821
+ ],
4822
+ [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]],
4823
+ [
4824
+ /(mi(tv|box)-?\w+) bui/i
4825
+ // Xiaomi
4826
+ ],
4827
+ [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]],
4828
+ [
4829
+ /Hbbtv.*(technisat) (.*);/i
4830
+ // TechniSAT
4831
+ ],
4832
+ [VENDOR, MODEL, [TYPE, SMARTTV]],
4833
+ [
4834
+ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,
4835
+ // Roku
4836
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i
4837
+ // HbbTV devices
4838
+ ],
4839
+ [[VENDOR, /.+\/(\w+)/, "$1", strMapper, { "LG": "lge" }], [MODEL, trim2], [TYPE, SMARTTV]],
4840
+ [
4841
+ ///////////////////
4842
+ // CONSOLES
4843
+ ///////////////////
4844
+ /(playstation \w+)/i
4845
+ // Playstation
4846
+ ],
4847
+ [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]],
4848
+ [
4849
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i
4850
+ // Microsoft Xbox
4851
+ ],
4852
+ [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]],
4853
+ [
4854
+ /(ouya)/i,
4855
+ // Ouya
4856
+ /(nintendo) (\w+)/i,
4857
+ // Nintendo
4858
+ /(retroid) (pocket ([^\)]+))/i
4859
+ // Retroid Pocket
4860
+ ],
4861
+ [VENDOR, MODEL, [TYPE, CONSOLE]],
4862
+ [
4863
+ /droid.+; (shield)( bui|\))/i
4864
+ // Nvidia Portable
4865
+ ],
4866
+ [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]],
4867
+ [
4868
+ ///////////////////
4869
+ // WEARABLES
4870
+ ///////////////////
4871
+ /\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i
4872
+ // Samsung Galaxy Watch
4873
+ ],
4874
+ [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]],
4875
+ [
4876
+ /((pebble))app/i,
4877
+ // Pebble
4878
+ /(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i
4879
+ // Asus ZenWatch / LG Watch / Pixel Watch
4880
+ ],
4881
+ [VENDOR, MODEL, [TYPE, WEARABLE]],
4882
+ [
4883
+ /(ow(?:19|20)?we?[1-3]{1,3})/i
4884
+ // Oppo Watch
4885
+ ],
4886
+ [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]],
4887
+ [
4888
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i
4889
+ // Apple Watch
4890
+ ],
4891
+ [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]],
4892
+ [
4893
+ /(opwwe\d{3})/i
4894
+ // OnePlus Watch
4895
+ ],
4896
+ [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]],
4897
+ [
4898
+ /(moto 360)/i
4899
+ // Motorola 360
4900
+ ],
4901
+ [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]],
4902
+ [
4903
+ /(smartwatch 3)/i
4904
+ // Sony SmartWatch
4905
+ ],
4906
+ [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]],
4907
+ [
4908
+ /(g watch r)/i
4909
+ // LG G Watch R
4910
+ ],
4911
+ [MODEL, [VENDOR, LG], [TYPE, WEARABLE]],
4912
+ [
4913
+ /droid.+; (wt63?0{2,3})\)/i
4914
+ ],
4915
+ [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]],
4916
+ [
4917
+ ///////////////////
4918
+ // XR
4919
+ ///////////////////
4920
+ /droid.+; (glass) \d/i
4921
+ // Google Glass
4922
+ ],
4923
+ [MODEL, [VENDOR, GOOGLE], [TYPE, XR]],
4924
+ [
4925
+ /(pico) ([\w ]+) os\d/i
4926
+ // Pico
4927
+ ],
4928
+ [VENDOR, MODEL, [TYPE, XR]],
4929
+ [
4930
+ /(quest( \d| pro)?s?).+vr/i
4931
+ // Meta Quest
4932
+ ],
4933
+ [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]],
4934
+ [
4935
+ /mobile vr; rv.+firefox/i
4936
+ // Unidentifiable VR device using Firefox Reality / Wolvic
4937
+ ],
4938
+ [[TYPE, XR]],
4939
+ [
4940
+ ///////////////////
4941
+ // EMBEDDED
4942
+ ///////////////////
4943
+ /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i
4944
+ // Tesla
4945
+ ],
4946
+ [VENDOR, [TYPE, EMBEDDED]],
4947
+ [
4948
+ /(aeobc)\b/i
4949
+ // Echo Dot
4950
+ ],
4951
+ [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]],
4952
+ [
4953
+ /(homepod).+mac os/i
4954
+ // Apple HomePod
4955
+ ],
4956
+ [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]],
4957
+ [
4958
+ /windows iot/i
4959
+ // Unidentifiable embedded device using Windows IoT
4960
+ ],
4961
+ [[TYPE, EMBEDDED]],
4962
+ [
4963
+ ////////////////////
4964
+ // MIXED (GENERIC)
4965
+ ///////////////////
4966
+ /droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i
4967
+ // Unidentifiable SmartTV
4968
+ ],
4969
+ [MODEL, [TYPE, SMARTTV]],
4970
+ [
4971
+ /\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i
4972
+ ],
4973
+ [[TYPE, SMARTTV]],
4974
+ [
4975
+ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i
4976
+ ],
4977
+ [MODEL, [TYPE, strMapper, { "mobile": "Mobile", "xr": "VR", "*": TABLET }]],
4978
+ [
4979
+ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i
4980
+ // Unidentifiable Tablet
4981
+ ],
4982
+ [[TYPE, TABLET]],
4983
+ [
4984
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i
4985
+ // Unidentifiable Mobile
4986
+ ],
4987
+ [[TYPE, MOBILE]],
4988
+ [
4989
+ /droid .+?; ([\w\. -]+)( bui|\))/i
4990
+ // Generic Android Device
4991
+ ],
4992
+ [MODEL, [VENDOR, "Generic"]]
4993
+ ],
4994
+ engine: [
4995
+ [
4996
+ /windows.+ edge\/([\w\.]+)/i
4997
+ // EdgeHTML
4998
+ ],
4999
+ [VERSION3, [NAME, EDGE + "HTML"]],
5000
+ [
5001
+ /(arkweb)\/([\w\.]+)/i
5002
+ // ArkWeb
5003
+ ],
5004
+ [NAME, VERSION3],
5005
+ [
5006
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i
5007
+ // Blink
5008
+ ],
5009
+ [VERSION3, [NAME, "Blink"]],
5010
+ [
5011
+ /(presto)\/([\w\.]+)/i,
5012
+ // Presto
5013
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,
5014
+ // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
5015
+ /ekioh(flow)\/([\w\.]+)/i,
5016
+ // Flow
5017
+ /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,
5018
+ // KHTML/Tasman/Links
5019
+ /(icab)[\/ ]([23]\.[\d\.]+)/i,
5020
+ // iCab
5021
+ /\b(libweb)/i
5022
+ // LibWeb
5023
+ ],
5024
+ [NAME, VERSION3],
5025
+ [
5026
+ /ladybird\//i
5027
+ ],
5028
+ [[NAME, "LibWeb"]],
5029
+ [
5030
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i
5031
+ // Gecko
5032
+ ],
5033
+ [VERSION3, NAME]
5034
+ ],
5035
+ os: [
5036
+ [
5037
+ // Windows
5038
+ /(windows nt) (6\.[23]); arm/i
5039
+ // Windows RT
5040
+ ],
5041
+ [[NAME, /N/, "R"], [VERSION3, strMapper, windowsVersionMap]],
5042
+ [
5043
+ /(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,
5044
+ // Windows IoT/Mobile/Phone
5045
+ // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11
5046
+ /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i
5047
+ ],
5048
+ [NAME, VERSION3],
5049
+ [
5050
+ /windows nt ?([\d\.\)]*)(?!.+xbox)/i,
5051
+ /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i
5052
+ ],
5053
+ [[VERSION3, /(;|\))/g, "", strMapper, windowsVersionMap], [NAME, WINDOWS]],
5054
+ [
5055
+ /(windows ce)\/?([\d\.]*)/i
5056
+ // Windows CE
5057
+ ],
5058
+ [NAME, VERSION3],
5059
+ [
5060
+ // iOS/macOS
5061
+ /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,
5062
+ // iOS
5063
+ /(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\/ ]([\w\.]+)/i,
5064
+ /cfnetwork\/.+darwin/i
5065
+ ],
5066
+ [[VERSION3, /_/g, "."], [NAME, "iOS"]],
5067
+ [
5068
+ /(mac os x) ?([\w\. ]*)/i,
5069
+ /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i
5070
+ // Mac OS
5071
+ ],
5072
+ [[NAME, "macOS"], [VERSION3, /_/g, "."]],
5073
+ [
5074
+ // Google Chromecast
5075
+ /android ([\d\.]+).*crkey/i
5076
+ // Google Chromecast, Android-based
5077
+ ],
5078
+ [VERSION3, [NAME, CHROMECAST + " Android"]],
5079
+ [
5080
+ /fuchsia.*crkey\/([\d\.]+)/i
5081
+ // Google Chromecast, Fuchsia-based
5082
+ ],
5083
+ [VERSION3, [NAME, CHROMECAST + " Fuchsia"]],
5084
+ [
5085
+ /crkey\/([\d\.]+).*devicetype\/smartspeaker/i
5086
+ // Google Chromecast, Linux-based Smart Speaker
5087
+ ],
5088
+ [VERSION3, [NAME, CHROMECAST + " SmartSpeaker"]],
5089
+ [
5090
+ /linux.*crkey\/([\d\.]+)/i
5091
+ // Google Chromecast, Legacy Linux-based
5092
+ ],
5093
+ [VERSION3, [NAME, CHROMECAST + " Linux"]],
5094
+ [
5095
+ /crkey\/([\d\.]+)/i
5096
+ // Google Chromecast, unknown
5097
+ ],
5098
+ [VERSION3, [NAME, CHROMECAST]],
5099
+ [
5100
+ // Mobile OSes
5101
+ /droid ([\w\.]+)\b.+(android[- ]x86)/i
5102
+ // Android-x86
5103
+ ],
5104
+ [VERSION3, NAME],
5105
+ [
5106
+ /(ubuntu) ([\w\.]+) like android/i
5107
+ // Ubuntu Touch
5108
+ ],
5109
+ [[NAME, /(.+)/, "$1 Touch"], VERSION3],
5110
+ [
5111
+ /(harmonyos)[\/ ]?([\d\.]*)/i,
5112
+ // HarmonyOS
5113
+ // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
5114
+ /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i
5115
+ ],
5116
+ [NAME, VERSION3],
5117
+ [
5118
+ /\(bb(10);/i
5119
+ // BlackBerry 10
5120
+ ],
5121
+ [VERSION3, [NAME, BLACKBERRY]],
5122
+ [
5123
+ /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i
5124
+ // Symbian
5125
+ ],
5126
+ [VERSION3, [NAME, "Symbian"]],
5127
+ [
5128
+ /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i
5129
+ // Firefox OS
5130
+ ],
5131
+ [VERSION3, [NAME, FIREFOX + " OS"]],
5132
+ [
5133
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,
5134
+ // WebOS
5135
+ /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
5136
+ ],
5137
+ [VERSION3, [NAME, "webOS"]],
5138
+ [
5139
+ /web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
5140
+ // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
5141
+ ],
5142
+ [[VERSION3, strMapper, { "25": "120", "24": "108", "23": "94", "22": "87", "6": "79", "5": "68", "4": "53", "3": "38", "2": "538", "1": "537", "*": "TV" }], [NAME, "webOS"]],
5143
+ [
5144
+ /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i
5145
+ // watchOS
5146
+ ],
5147
+ [VERSION3, [NAME, "watchOS"]],
5148
+ [
5149
+ // Google ChromeOS
5150
+ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i
5151
+ // Chromium OS
5152
+ ],
5153
+ [[NAME, "Chrome OS"], VERSION3],
5154
+ [
5155
+ // Smart TVs
5156
+ /panasonic;(viera)/i,
5157
+ // Panasonic Viera
5158
+ /(netrange)mmh/i,
5159
+ // Netrange
5160
+ /(nettv)\/(\d+\.[\w\.]+)/i,
5161
+ // NetTV
5162
+ // Console
5163
+ /(nintendo|playstation) (\w+)/i,
5164
+ // Nintendo/Playstation
5165
+ /(xbox); +xbox ([^\);]+)/i,
5166
+ // Microsoft Xbox (360, One, X, S, Series X, Series S)
5167
+ /(pico) .+os([\w\.]+)/i,
5168
+ // Pico
5169
+ // Other
5170
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
5171
+ // Joli/Palm
5172
+ /linux.+(mint)[\/\(\) ]?([\w\.]*)/i,
5173
+ // Mint
5174
+ /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,
5175
+ // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch
5176
+ /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
5177
+ // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix
5178
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
5179
+ // Solaris
5180
+ /\b(aix)[; ]([1-9\.]{0,4})/i,
5181
+ // AIX
5182
+ /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,
5183
+ // Hurd/Linux/MorphOS
5184
+ /(gnu) ?([\w\.]*)/i,
5185
+ // GNU
5186
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
5187
+ // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
5188
+ /(haiku) ?(r\d)?/i
5189
+ // Haiku
5190
+ ],
5191
+ [NAME, VERSION3],
5192
+ [
5193
+ /(sunos) ?([\d\.]*)/i
5194
+ // Solaris
5195
+ ],
5196
+ [[NAME, "Solaris"], VERSION3],
5197
+ [
5198
+ /\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,
5199
+ // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS
5200
+ /(unix) ?([\w\.]*)/i
5201
+ // UNIX
5202
+ ],
5203
+ [NAME, VERSION3]
5204
+ ]
5205
+ };
5206
+ var defaultProps = function() {
5207
+ var props = { init: {}, isIgnore: {}, isIgnoreRgx: {}, toString: {} };
5208
+ setProps.call(props.init, [
5209
+ [BROWSER, [NAME, VERSION3, MAJOR, TYPE]],
5210
+ [CPU, [ARCHITECTURE]],
5211
+ [DEVICE, [TYPE, MODEL, VENDOR]],
5212
+ [ENGINE, [NAME, VERSION3]],
5213
+ [OS, [NAME, VERSION3]]
5214
+ ]);
5215
+ setProps.call(props.isIgnore, [
5216
+ [BROWSER, [VERSION3, MAJOR]],
5217
+ [ENGINE, [VERSION3]],
5218
+ [OS, [VERSION3]]
5219
+ ]);
5220
+ setProps.call(props.isIgnoreRgx, [
5221
+ [BROWSER, / ?browser$/i],
5222
+ [OS, / ?os$/i]
5223
+ ]);
5224
+ setProps.call(props.toString, [
5225
+ [BROWSER, [NAME, VERSION3]],
5226
+ [CPU, [ARCHITECTURE]],
5227
+ [DEVICE, [VENDOR, MODEL]],
5228
+ [ENGINE, [NAME, VERSION3]],
5229
+ [OS, [NAME, VERSION3]]
5230
+ ]);
5231
+ return props;
5232
+ }();
5233
+ var createIData = function(item, itemType) {
5234
+ var init_props = defaultProps.init[itemType], is_ignoreProps = defaultProps.isIgnore[itemType] || 0, is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0, toString_props = defaultProps.toString[itemType] || 0;
5235
+ function IData() {
5236
+ setProps.call(this, init_props);
5237
+ }
5238
+ IData.prototype.getItem = function() {
5239
+ return item;
5240
+ };
5241
+ IData.prototype.withClientHints = function() {
5242
+ if (!NAVIGATOR_UADATA) {
5243
+ return item.parseCH().get();
5244
+ }
5245
+ return NAVIGATOR_UADATA.getHighEntropyValues(CH_ALL_VALUES).then(function(res) {
5246
+ return item.setCH(new UACHData(res, false)).parseCH().get();
5247
+ });
5248
+ };
5249
+ IData.prototype.withFeatureCheck = function() {
5250
+ return item.detectFeature().get();
5251
+ };
5252
+ if (itemType != RESULT) {
5253
+ IData.prototype.is = function(strToCheck) {
5254
+ var is = false;
5255
+ for (var i in this) {
5256
+ if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {
5257
+ is = true;
5258
+ if (strToCheck != TYPEOF.UNDEFINED) break;
5259
+ } else if (strToCheck == TYPEOF.UNDEFINED && is) {
5260
+ is = !is;
5261
+ break;
5262
+ }
5263
+ }
5264
+ return is;
5265
+ };
5266
+ IData.prototype.toString = function() {
5267
+ var str = EMPTY;
5268
+ for (var i in toString_props) {
5269
+ if (typeof this[toString_props[i]] !== TYPEOF.UNDEFINED) {
5270
+ str += (str ? " " : EMPTY) + this[toString_props[i]];
5271
+ }
5272
+ }
5273
+ return str || TYPEOF.UNDEFINED;
5274
+ };
5275
+ }
5276
+ if (!NAVIGATOR_UADATA) {
5277
+ IData.prototype.then = function(cb) {
5278
+ var that = this;
5279
+ var IDataResolve = function() {
5280
+ for (var prop in that) {
5281
+ if (that.hasOwnProperty(prop)) {
5282
+ this[prop] = that[prop];
5283
+ }
5284
+ }
5285
+ };
5286
+ IDataResolve.prototype = {
5287
+ is: IData.prototype.is,
5288
+ toString: IData.prototype.toString
5289
+ };
5290
+ var resolveData = new IDataResolve();
5291
+ cb(resolveData);
5292
+ return resolveData;
5293
+ };
5294
+ }
5295
+ return new IData();
5296
+ };
5297
+ function UACHData(uach, isHttpUACH) {
5298
+ uach = uach || {};
5299
+ setProps.call(this, CH_ALL_VALUES);
5300
+ if (isHttpUACH) {
5301
+ setProps.call(this, [
5302
+ [BRANDS, itemListToArray(uach[CH])],
5303
+ [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
5304
+ [MOBILE, /\?1/.test(uach[CH_MOBILE])],
5305
+ [MODEL, stripQuotes(uach[CH_MODEL])],
5306
+ [PLATFORM, stripQuotes(uach[CH_PLATFORM])],
5307
+ [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
5308
+ [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
5309
+ [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
5310
+ [BITNESS, stripQuotes(uach[CH_BITNESS])]
5311
+ ]);
5312
+ } else {
5313
+ for (var prop in uach) {
5314
+ if (this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
5315
+ }
5316
+ }
5317
+ }
5318
+ function UAItem(itemType, ua, rgxMap, uaCH) {
5319
+ this.get = function(prop) {
5320
+ if (!prop) return this.data;
5321
+ return this.data.hasOwnProperty(prop) ? this.data[prop] : void 0;
5322
+ };
5323
+ this.set = function(prop, val) {
5324
+ this.data[prop] = val;
5325
+ return this;
5326
+ };
5327
+ this.setCH = function(ch) {
5328
+ this.uaCH = ch;
5329
+ return this;
5330
+ };
5331
+ this.detectFeature = function() {
5332
+ if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
5333
+ switch (this.itemType) {
5334
+ case BROWSER:
5335
+ if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {
5336
+ this.set(NAME, "Brave");
5337
+ }
5338
+ break;
5339
+ case DEVICE:
5340
+ if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
5341
+ this.set(TYPE, MOBILE);
5342
+ }
5343
+ if (this.get(MODEL) == "Macintosh" && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
5344
+ this.set(MODEL, "iPad").set(TYPE, TABLET);
5345
+ }
5346
+ break;
5347
+ case OS:
5348
+ if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
5349
+ this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
5350
+ }
5351
+ break;
5352
+ case RESULT:
5353
+ var data = this.data;
5354
+ var detect = function(itemType2) {
5355
+ return data[itemType2].getItem().detectFeature().get();
5356
+ };
5357
+ this.set(BROWSER, detect(BROWSER)).set(CPU, detect(CPU)).set(DEVICE, detect(DEVICE)).set(ENGINE, detect(ENGINE)).set(OS, detect(OS));
5358
+ }
5359
+ }
5360
+ return this;
5361
+ };
5362
+ this.parseUA = function() {
5363
+ if (this.itemType != RESULT) {
5364
+ rgxMapper.call(this.data, this.ua, this.rgxMap);
5365
+ }
5366
+ switch (this.itemType) {
5367
+ case BROWSER:
5368
+ this.set(MAJOR, majorize(this.get(VERSION3)));
5369
+ break;
5370
+ case OS:
5371
+ if (this.get(NAME) == "iOS" && this.get(VERSION3) == "18.6") {
5372
+ var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua);
5373
+ if (realVersion && parseInt(realVersion[1].substring(0, 2), 10) >= 26) {
5374
+ this.set(VERSION3, realVersion[1]);
5375
+ }
5376
+ }
5377
+ break;
5378
+ }
5379
+ return this;
5380
+ };
5381
+ this.parseCH = function() {
5382
+ var uaCH2 = this.uaCH, rgxMap2 = this.rgxMap;
5383
+ switch (this.itemType) {
5384
+ case BROWSER:
5385
+ case ENGINE:
5386
+ var brands = uaCH2[FULLVERLIST] || uaCH2[BRANDS], prevName;
5387
+ if (brands) {
5388
+ for (var i = 0; i < brands.length; i++) {
5389
+ var brandName = brands[i].brand || brands[i], brandVersion = brands[i].version;
5390
+ if (this.itemType == BROWSER && !/not.a.brand/i.test(brandName) && (!prevName || /Chrom/.test(prevName) && brandName != CHROMIUM || prevName == EDGE && /WebView2/.test(brandName))) {
5391
+ brandName = strMapper(brandName, browserHintsMap);
5392
+ prevName = this.get(NAME);
5393
+ if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
5394
+ this.set(NAME, brandName).set(VERSION3, brandVersion).set(MAJOR, majorize(brandVersion));
5395
+ }
5396
+ prevName = brandName;
5397
+ }
5398
+ if (this.itemType == ENGINE && brandName == CHROMIUM) {
5399
+ this.set(VERSION3, brandVersion);
5400
+ }
5401
+ }
5402
+ }
5403
+ break;
5404
+ case CPU:
5405
+ var archName = uaCH2[ARCHITECTURE];
5406
+ if (archName) {
5407
+ if (archName && uaCH2[BITNESS] == "64") archName += "64";
5408
+ rgxMapper.call(this.data, archName + ";", rgxMap2);
5409
+ }
5410
+ break;
5411
+ case DEVICE:
5412
+ if (uaCH2[MOBILE]) {
5413
+ this.set(TYPE, MOBILE);
5414
+ }
5415
+ if (uaCH2[MODEL]) {
5416
+ this.set(MODEL, uaCH2[MODEL]);
5417
+ if (!this.get(TYPE) || !this.get(VENDOR)) {
5418
+ var reParse = {};
5419
+ rgxMapper.call(reParse, "droid 9; " + uaCH2[MODEL] + ")", rgxMap2);
5420
+ if (!this.get(TYPE) && !!reParse.type) {
5421
+ this.set(TYPE, reParse.type);
5422
+ }
5423
+ if (!this.get(VENDOR) && !!reParse.vendor) {
5424
+ this.set(VENDOR, reParse.vendor);
5425
+ }
5426
+ }
5427
+ }
5428
+ if (uaCH2[FORMFACTORS]) {
5429
+ var ff;
5430
+ if (typeof uaCH2[FORMFACTORS] !== "string") {
5431
+ var idx = 0;
5432
+ while (!ff && idx < uaCH2[FORMFACTORS].length) {
5433
+ ff = strMapper(uaCH2[FORMFACTORS][idx++], formFactorsMap);
5434
+ }
5435
+ } else {
5436
+ ff = strMapper(uaCH2[FORMFACTORS], formFactorsMap);
5437
+ }
5438
+ this.set(TYPE, ff);
5439
+ }
5440
+ break;
5441
+ case OS:
5442
+ var osName = uaCH2[PLATFORM];
5443
+ if (osName) {
5444
+ var osVersion = uaCH2[PLATFORMVER];
5445
+ if (osName == WINDOWS) osVersion = parseInt(majorize(osVersion), 10) >= 13 ? "11" : "10";
5446
+ this.set(NAME, osName).set(VERSION3, osVersion);
5447
+ }
5448
+ if (this.get(NAME) == WINDOWS && uaCH2[MODEL] == "Xbox") {
5449
+ this.set(NAME, "Xbox").set(VERSION3, void 0);
5450
+ }
5451
+ break;
5452
+ case RESULT:
5453
+ var data = this.data;
5454
+ var parse = function(itemType2) {
5455
+ return data[itemType2].getItem().setCH(uaCH2).parseCH().get();
5456
+ };
5457
+ this.set(BROWSER, parse(BROWSER)).set(CPU, parse(CPU)).set(DEVICE, parse(DEVICE)).set(ENGINE, parse(ENGINE)).set(OS, parse(OS));
5458
+ }
5459
+ return this;
5460
+ };
5461
+ setProps.call(this, [
5462
+ ["itemType", itemType],
5463
+ ["ua", ua],
5464
+ ["uaCH", uaCH],
5465
+ ["rgxMap", rgxMap],
5466
+ ["data", createIData(this, itemType)]
5467
+ ]);
5468
+ return this;
5469
+ }
5470
+ function UAParser(ua, extensions, headers) {
5471
+ if (typeof ua === TYPEOF.OBJECT) {
5472
+ if (isExtensions(ua, true)) {
5473
+ if (typeof extensions === TYPEOF.OBJECT) {
5474
+ headers = extensions;
5475
+ }
5476
+ extensions = ua;
5477
+ } else {
5478
+ headers = ua;
5479
+ extensions = void 0;
5480
+ }
5481
+ ua = void 0;
5482
+ } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
5483
+ headers = extensions;
5484
+ extensions = void 0;
5485
+ }
5486
+ if (headers) {
5487
+ if (typeof headers.append === TYPEOF.FUNCTION) {
5488
+ var kv = {};
5489
+ headers.forEach(function(v, k) {
5490
+ kv[String(k).toLowerCase()] = v;
5491
+ });
5492
+ headers = kv;
5493
+ } else {
5494
+ var normalized = {};
5495
+ for (var header in headers) {
5496
+ if (headers.hasOwnProperty(header)) {
5497
+ normalized[String(header).toLowerCase()] = headers[header];
5498
+ }
5499
+ }
5500
+ headers = normalized;
5501
+ }
5502
+ }
5503
+ if (!(this instanceof UAParser)) {
5504
+ return new UAParser(ua, extensions, headers).getResult();
5505
+ }
5506
+ var userAgent = typeof ua === TYPEOF.STRING ? ua : (
5507
+ // Passed user-agent string
5508
+ headers && headers[USER_AGENT] ? headers[USER_AGENT] : (
5509
+ // User-Agent from passed headers
5510
+ NAVIGATOR && NAVIGATOR.userAgent ? NAVIGATOR.userAgent : (
5511
+ // navigator.userAgent
5512
+ EMPTY
5513
+ )
5514
+ )
5515
+ ), httpUACH = new UACHData(headers, true), regexMap = extensions ? extend2(defaultRegexes, extensions) : defaultRegexes, createItemFunc = function(itemType) {
5516
+ if (itemType == RESULT) {
5517
+ return function() {
5518
+ return new UAItem(itemType, userAgent, regexMap, httpUACH).set("ua", userAgent).set(BROWSER, this.getBrowser()).set(CPU, this.getCPU()).set(DEVICE, this.getDevice()).set(ENGINE, this.getEngine()).set(OS, this.getOS()).get();
5519
+ };
5520
+ } else {
5521
+ return function() {
5522
+ return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH).parseUA().get();
5523
+ };
5524
+ }
5525
+ };
5526
+ setProps.call(this, [
5527
+ ["getBrowser", createItemFunc(BROWSER)],
5528
+ ["getCPU", createItemFunc(CPU)],
5529
+ ["getDevice", createItemFunc(DEVICE)],
5530
+ ["getEngine", createItemFunc(ENGINE)],
5531
+ ["getOS", createItemFunc(OS)],
5532
+ ["getResult", createItemFunc(RESULT)],
5533
+ ["getUA", function() {
5534
+ return userAgent;
5535
+ }],
5536
+ ["setUA", function(ua2) {
5537
+ if (isString2(ua2)) userAgent = trim2(ua2, UA_MAX_LENGTH);
5538
+ return this;
5539
+ }]
5540
+ ]).setUA(userAgent);
5541
+ return this;
5542
+ }
5543
+ UAParser.VERSION = LIBVERSION;
5544
+ UAParser.BROWSER = enumerize([NAME, VERSION3, MAJOR, TYPE]);
5545
+ UAParser.CPU = enumerize([ARCHITECTURE]);
5546
+ UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
5547
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION3]);
5548
+
5549
+ // ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/enums/ua-parser-enums.mjs
5550
+ var BrowserName = Object.freeze({
5551
+ "115": "115",
5552
+ "2345": "2345",
5553
+ "360": "360",
5554
+ ALIPAY: "Alipay",
5555
+ AMAYA: "Amaya",
5556
+ ANDROID: "Android Browser",
5557
+ ARORA: "Arora",
5558
+ AVANT: "Avant",
5559
+ AVAST: "Avast Secure Browser",
5560
+ AVG: "AVG Secure Browser",
5561
+ BAIDU: "Baidu Browser",
5562
+ BASILISK: "Basilisk",
5563
+ BING: "Bing",
5564
+ BLAZER: "Blazer",
5565
+ BOLT: "Bolt",
5566
+ BOWSER: "Bowser",
5567
+ BRAVE: "Brave",
5568
+ CAMINO: "Camino",
5569
+ CHIMERA: "Chimera",
5570
+ CHROME: "Chrome",
5571
+ CHROME_HEADLESS: "Chrome Headless",
5572
+ CHROME_MOBILE: "Mobile Chrome",
5573
+ CHROME_WEBVIEW: "Chrome WebView",
5574
+ CHROMIUM: "Chromium",
5575
+ COBALT: "Cobalt",
5576
+ COC_COC: "Coc Coc",
5577
+ CONKEROR: "Conkeror",
5578
+ DAUM: "Daum",
5579
+ DILLO: "Dillo",
5580
+ DOLPHIN: "Dolphin",
5581
+ DOOBLE: "Dooble",
5582
+ DORIS: "Doris",
5583
+ DRAGON: "Dragon",
5584
+ DUCKDUCKGO: "DuckDuckGo",
5585
+ ECOSIA: "Ecosia",
5586
+ EDGE: "Edge",
5587
+ EDGE_WEBVIEW: "Edge WebView",
5588
+ EDGE_WEBVIEW2: "Edge WebView2",
5589
+ EPIPHANY: "Epiphany",
5590
+ FACEBOOK: "Facebook",
5591
+ FALKON: "Falkon",
5592
+ FIREBIRD: "Firebird",
5593
+ FIREFOX: "Firefox",
5594
+ FIREFOX_FOCUS: "Firefox Focus",
5595
+ FIREFOX_MOBILE: "Mobile Firefox",
5596
+ FIREFOX_REALITY: "Firefox Reality",
5597
+ FENNEC: "Fennec",
5598
+ FLOCK: "Flock",
5599
+ FLOW: "Flow",
5600
+ GO: "GoBrowser",
5601
+ GOOGLE_SEARCH: "GSA",
5602
+ HELIO: "Helio",
5603
+ HEYTAP: "HeyTap",
5604
+ HONOR: "Honor",
5605
+ HUAWEI: "Huawei Browser",
5606
+ ICAB: "iCab",
5607
+ ICE: "ICE Browser",
5608
+ ICEAPE: "IceApe",
5609
+ ICECAT: "IceCat",
5610
+ ICEDRAGON: "IceDragon",
5611
+ ICEWEASEL: "IceWeasel",
5612
+ IE: "IE",
5613
+ INSTAGRAM: "Instagram",
5614
+ IRIDIUM: "Iridium",
5615
+ IRON: "Iron",
5616
+ JASMINE: "Jasmine",
5617
+ KONQUEROR: "Konqueror",
5618
+ KAKAO: "KakaoTalk",
5619
+ KHTML: "KHTML",
5620
+ K_MELEON: "K-Meleon",
5621
+ KLAR: "Klar",
5622
+ KLARNA: "Klarna",
5623
+ KINDLE: "Kindle",
5624
+ LENOVO: "Smart Lenovo Browser",
5625
+ LADYBIRD: "Ladybird",
5626
+ LG: "LG Browser",
5627
+ LIBREWOLF: "LibreWolf",
5628
+ LIEBAO: "LBBROWSER",
5629
+ LINE: "Line",
5630
+ LINKEDIN: "LinkedIn",
5631
+ LINKS: "Links",
5632
+ LUNASCAPE: "Lunascape",
5633
+ LYNX: "Lynx",
5634
+ MAEMO: "Maemo Browser",
5635
+ MAXTHON: "Maxthon",
5636
+ MIDORI: "Midori",
5637
+ MINIMO: "Minimo",
5638
+ MIUI: "MIUI Browser",
5639
+ MOZILLA: "Mozilla",
5640
+ MOSAIC: "Mosaic",
5641
+ NAVER: "Naver",
5642
+ NETFRONT: "NetFront",
5643
+ NETSCAPE: "Netscape",
5644
+ NETSURF: "Netsurf",
5645
+ NOKIA: "Nokia Browser",
5646
+ OBIGO: "Obigo",
5647
+ OCULUS: "Oculus Browser",
5648
+ OMNIWEB: "OmniWeb",
5649
+ OPERA: "Opera",
5650
+ OPERA_COAST: "Opera Coast",
5651
+ OPERA_GX: "Opera GX",
5652
+ OPERA_MINI: "Opera Mini",
5653
+ OPERA_MOBI: "Opera Mobi",
5654
+ OPERA_TABLET: "Opera Tablet",
5655
+ OPERA_TOUCH: "Opera Touch",
5656
+ OTTER: "Otter",
5657
+ OVI: "OviBrowser",
5658
+ PALEMOON: "PaleMoon",
5659
+ PHANTOMJS: "PhantomJS",
5660
+ PHOENIX: "Phoenix",
5661
+ PICOBROWSER: "Pico Browser",
5662
+ POLARIS: "Polaris",
5663
+ PUFFIN: "Puffin",
5664
+ QQ: "QQBrowser",
5665
+ QQ_LITE: "QQBrowserLite",
5666
+ QUARK: "Quark",
5667
+ QUPZILLA: "QupZilla",
5668
+ QUTEBROWSER: "qutebrowser",
5669
+ QWANT: "Qwant",
5670
+ REKONQ: "rekonq",
5671
+ ROCKMELT: "Rockmelt",
5672
+ SAFARI: "Safari",
5673
+ SAFARI_MOBILE: "Mobile Safari",
5674
+ SAILFISH: "Sailfish Browser",
5675
+ SAMSUNG: "Samsung Internet",
5676
+ SEAMONKEY: "SeaMonkey",
5677
+ SILK: "Silk",
5678
+ SKYFIRE: "Skyfire",
5679
+ SLEIPNIR: "Sleipnir",
5680
+ SLIMBOAT: "SlimBoat",
5681
+ SLIMBROWSER: "SlimBrowser",
5682
+ SLIMJET: "Slimjet",
5683
+ SNAPCHAT: "Snapchat",
5684
+ SOGOU_EXPLORER: "Sogou Explorer",
5685
+ SOGOU_MOBILE: "Sogou Mobile",
5686
+ SURF: "Surf",
5687
+ SWIFTFOX: "Swiftfox",
5688
+ TESLA: "Tesla",
5689
+ TIKTOK: "TikTok",
5690
+ TIZEN: "Tizen Browser",
5691
+ TWITTER: "Twitter",
5692
+ UC: "UCBrowser",
5693
+ UP: "UP.Browser",
5694
+ VIVALDI: "Vivaldi",
5695
+ VIVO: "Vivo Browser",
5696
+ W3M: "w3m",
5697
+ WATERFOX: "Waterfox",
5698
+ WEBKIT: "WebKit",
5699
+ WECHAT: "WeChat",
5700
+ WEIBO: "Weibo",
5701
+ WHALE: "Whale",
5702
+ WOLVIC: "Wolvic",
5703
+ YANDEX: "Yandex",
5704
+ ZALO: "Zalo"
5705
+ // TODO : test!
5706
+ });
5707
+ var BrowserType = Object.freeze({
5708
+ CRAWLER: "crawler",
5709
+ CLI: "cli",
5710
+ EMAIL: "email",
5711
+ FETCHER: "fetcher",
5712
+ INAPP: "inapp",
5713
+ MEDIAPLAYER: "mediaplayer",
5714
+ LIBRARY: "library"
5715
+ });
5716
+ var CPUArch = Object.freeze({
5717
+ "68K": "68k",
5718
+ ALPHA: "alpha",
5719
+ ARM: "arm",
5720
+ ARM_64: "arm64",
5721
+ ARM_HF: "armhf",
5722
+ AVR: "avr",
5723
+ AVR_32: "avr32",
5724
+ IA64: "ia64",
5725
+ IRIX: "irix",
5726
+ IRIX_64: "irix64",
5727
+ MIPS: "mips",
5728
+ MIPS_64: "mips64",
5729
+ PA_RISC: "pa-risc",
5730
+ PPC: "ppc",
5731
+ SPARC: "sparc",
5732
+ SPARC_64: "sparc64",
5733
+ X86: "ia32",
5734
+ X86_64: "amd64"
5735
+ });
5736
+ var DeviceType = Object.freeze({
5737
+ CONSOLE: "console",
5738
+ DESKTOP: "desktop",
5739
+ EMBEDDED: "embedded",
5740
+ MOBILE: "mobile",
5741
+ SMARTTV: "smarttv",
5742
+ TABLET: "tablet",
5743
+ WEARABLE: "wearable",
5744
+ XR: "xr"
5745
+ });
5746
+ var DeviceVendor = Object.freeze({
5747
+ ACER: "Acer",
5748
+ ADVAN: "Advan",
5749
+ ALCATEL: "Alcatel",
5750
+ APPLE: "Apple",
5751
+ AMAZON: "Amazon",
5752
+ ARCHOS: "Archos",
5753
+ ASUS: "ASUS",
5754
+ ATT: "AT&T",
5755
+ BENQ: "BenQ",
5756
+ BLACKBERRY: "BlackBerry",
5757
+ BLU: "BLU",
5758
+ CAT: "Cat",
5759
+ DELL: "Dell",
5760
+ ENERGIZER: "Energizer",
5761
+ ESSENTIAL: "Essential",
5762
+ FACEBOOK: "Facebook",
5763
+ FAIRPHONE: "Fairphone",
5764
+ GEEKSPHONE: "GeeksPhone",
5765
+ GENERIC: "Generic",
5766
+ GOOGLE: "Google",
5767
+ HISENSE: "Hisense",
5768
+ HMD: "HMD",
5769
+ HP: "HP",
5770
+ HTC: "HTC",
5771
+ HUAWEI: "Huawei",
5772
+ IMO: "IMO",
5773
+ INFINIX: "Infinix",
5774
+ ITEL: "itel",
5775
+ JOLLA: "Jolla",
5776
+ KOBO: "Kobo",
5777
+ LAVA: "Lava",
5778
+ LENOVO: "Lenovo",
5779
+ LG: "LG",
5780
+ MEIZU: "Meizu",
5781
+ MICROMAX: "Micromax",
5782
+ MICROSOFT: "Microsoft",
5783
+ MOTOROLA: "Motorola",
5784
+ NEXIAN: "Nexian",
5785
+ NINTENDO: "Nintendo",
5786
+ NOKIA: "Nokia",
5787
+ NOTHING: "Nothing",
5788
+ NVIDIA: "Nvidia",
5789
+ ONEPLUS: "OnePlus",
5790
+ OPPO: "OPPO",
5791
+ OUYA: "Ouya",
5792
+ PALM: "Palm",
5793
+ PANASONIC: "Panasonic",
5794
+ PEBBLE: "Pebble",
5795
+ PHILIPS: "Philips",
5796
+ PICO: "Pico",
5797
+ POLYTRON: "Polytron",
5798
+ REALME: "Realme",
5799
+ RETROID: "Retroid",
5800
+ RIM: "RIM",
5801
+ ROKU: "Roku",
5802
+ SAMSUNG: "Samsung",
5803
+ SHARP: "Sharp",
5804
+ SIEMENS: "Siemens",
5805
+ SMARTFREN: "Smartfren",
5806
+ SONY: "Sony",
5807
+ SPRINT: "Sprint",
5808
+ TCL: "TCL",
5809
+ TECHNISAT: "TechniSAT",
5810
+ TECNO: "TECNO",
5811
+ TESLA: "Tesla",
5812
+ ULEFONE: "Ulefone",
5813
+ VIVO: "Vivo",
5814
+ VIZIO: "Vizio",
5815
+ VODAFONE: "Vodafone",
5816
+ WIKO: "Wiko",
5817
+ XBOX: "Xbox",
5818
+ XIAOMI: "Xiaomi",
5819
+ ZEBRA: "Zebra",
5820
+ ZTE: "ZTE"
5821
+ // TODO : test!
5822
+ });
5823
+ var EngineName = Object.freeze({
5824
+ AMAYA: "Amaya",
5825
+ ARKWEB: "ArkWeb",
5826
+ BLINK: "Blink",
5827
+ EDGEHTML: "EdgeHTML",
5828
+ FLOW: "Flow",
5829
+ GECKO: "Gecko",
5830
+ GOANNA: "Goanna",
5831
+ ICAB: "iCab",
5832
+ KHTML: "KHTML",
5833
+ LIBWEB: "LibWeb",
5834
+ LINKS: "Links",
5835
+ LYNX: "Lynx",
5836
+ NETFRONT: "NetFront",
5837
+ NETSURF: "NetSurf",
5838
+ PRESTO: "Presto",
5839
+ SERVO: "Servo",
5840
+ TASMAN: "Tasman",
5841
+ TRIDENT: "Trident",
5842
+ W3M: "w3m",
5843
+ WEBKIT: "WebKit"
5844
+ });
5845
+ var OSName = Object.freeze({
5846
+ AIX: "AIX",
5847
+ AMIGA_OS: "Amiga OS",
5848
+ ANDROID: "Android",
5849
+ ANDROID_X86: "Android-x86",
5850
+ ARCAOS: "ArcaOS",
5851
+ ARCH: "Arch",
5852
+ BADA: "Bada",
5853
+ BEOS: "BeOS",
5854
+ BLACKBERRY: "BlackBerry",
5855
+ CENTOS: "CentOS",
5856
+ CHROME_OS: "Chrome OS",
5857
+ CHROMECAST: "Chromecast",
5858
+ CHROMECAST_ANDROID: "Chromecast Android",
5859
+ CHROMECAST_FUCHSIA: "Chromecast Fuchsia",
5860
+ CHROMECAST_LINUX: "Chromecast Linux",
5861
+ CHROMECAST_SMARTSPEAKER: "Chromecast SmartSpeaker",
5862
+ CONTIKI: "Contiki",
5863
+ DEBIAN: "Debian",
5864
+ DEEPIN: "Deepin",
5865
+ DRAGONFLY: "DragonFly",
5866
+ ELEMENTARY_OS: "elementary OS",
5867
+ FEDORA: "Fedora",
5868
+ FIREFOX_OS: "Firefox OS",
5869
+ FREEBSD: "FreeBSD",
5870
+ FUCHSIA: "Fuchsia",
5871
+ GENTOO: "Gentoo",
5872
+ GHOSTBSD: "GhostBSD",
5873
+ GNU: "GNU",
5874
+ HAIKU: "Haiku",
5875
+ HARMONYOS: "HarmonyOS",
5876
+ HP_UX: "HP-UX",
5877
+ HURD: "Hurd",
5878
+ IOS: "iOS",
5879
+ JOLI: "Joli",
5880
+ KAIOS: "KaiOS",
5881
+ KNOPPIX: "Knoppix",
5882
+ KUBUNTU: "Kubuntu",
5883
+ LINPUS: "Linpus",
5884
+ LINSPIRE: "Linspire",
5885
+ LINUX: "Linux",
5886
+ MACOS: "macOS",
5887
+ MAEMO: "Maemo",
5888
+ MAGEIA: "Mageia",
5889
+ MANDRIVA: "Mandriva",
5890
+ MANJARO: "Manjaro",
5891
+ MEEGO: "MeeGo",
5892
+ MINIX: "Minix",
5893
+ MINT: "Mint",
5894
+ MORPH_OS: "Morph OS",
5895
+ NETBSD: "NetBSD",
5896
+ NETRANGE: "NetRange",
5897
+ NETTV: "NetTV",
5898
+ NINTENDO: "Nintendo",
5899
+ OPENHARMONY: "OpenHarmony",
5900
+ OPENBSD: "OpenBSD",
5901
+ OPENVMS: "OpenVMS",
5902
+ OS2: "OS/2",
5903
+ PALM: "Palm",
5904
+ PC_BSD: "PC-BSD",
5905
+ PCLINUXOS: "PCLinuxOS",
5906
+ PICO: "Pico",
5907
+ PLAN9: "Plan9",
5908
+ PLAYSTATION: "PlayStation",
5909
+ QNX: "QNX",
5910
+ RASPBIAN: "Raspbian",
5911
+ REDHAT: "RedHat",
5912
+ RIM_TABLET_OS: "RIM Tablet OS",
5913
+ RISC_OS: "RISC OS",
5914
+ SABAYON: "Sabayon",
5915
+ SAILFISH: "Sailfish",
5916
+ SERENITYOS: "SerenityOS",
5917
+ SERIES40: "Series40",
5918
+ SLACKWARE: "Slackware",
5919
+ SOLARIS: "Solaris",
5920
+ SUSE: "SUSE",
5921
+ SYMBIAN: "Symbian",
5922
+ TIZEN: "Tizen",
5923
+ UBUNTU: "Ubuntu",
5924
+ UBUNTU_TOUCH: "Ubuntu Touch",
5925
+ UNIX: "Unix",
5926
+ VECTORLINUX: "VectorLinux",
5927
+ WATCHOS: "watchOS",
5928
+ WEBOS: "WebOS",
5929
+ WINDOWS: "Windows",
5930
+ WINDOWS_CE: "Windows CE",
5931
+ WINDOWS_IOT: "Windows IoT",
5932
+ WINDOWS_MOBILE: "Windows Mobile",
5933
+ WINDOWS_PHONE: "Windows Phone",
5934
+ WINDOWS_RT: "Windows RT",
5935
+ XBOX: "Xbox",
5936
+ XUBUNTU: "Xubuntu",
5937
+ ZENWALK: "Zenwalk"
5938
+ // TODO : test!
5939
+ });
5940
+ var Extension = Object.freeze({
5941
+ BrowserName: {
5942
+ CLI: {
5943
+ CURL: "curl",
5944
+ ELINKS: "ELinks",
5945
+ HTTPIE: "HTTPie",
5946
+ LYNX: "Lynx",
5947
+ WGET: "Wget"
5948
+ },
5949
+ Crawler: {
5950
+ AHREFS_BOT: "AhrefsBot",
5951
+ AI2_BOT: "AI2Bot",
5952
+ AIHIT_BOT: "aiHitBot",
5953
+ ALGOLIA_CRAWLER: "Algolia Crawler",
5954
+ APPLE_BOT: "Applebot",
5955
+ APPLE_BOT_EXTENDED: "Applebot-Extended",
5956
+ ASK_TEOMA: "Teoma",
5957
+ AMAZON_BOT: "Amazonbot",
5958
+ AMAZON_CONTXBOT: "contxbot",
5959
+ ANTHROPIC_AI: "anthropic-ai",
5960
+ ANTHROPIC_CLAUDE_BOT: "ClaudeBot",
5961
+ ANTHROPIC_CLAUDE_SEARCHBOT: "Claude-SearchBot",
5962
+ ANTHROPIC_CLAUDE_WEB: "Claude-Web",
5963
+ ARCHIVEORG_BOT: "archive.org_bot",
5964
+ BAIDU_ADS: "Baidu-ADS",
5965
+ BAIDU_SPIDER: "Baiduspider",
5966
+ BAIDU_SPIDER_ADS: "Baiduspider-ads",
5967
+ BAIDU_SPIDER_CPRO: "Baiduspider-cpro",
5968
+ BAIDU_SPIDER_FAVO: "Baiduspider-favo",
5969
+ BAIDU_SPIDER_IMAGE: "Baiduspider-image",
5970
+ BAIDU_SPIDER_NEWS: "Baiduspider-news",
5971
+ BAIDU_SPIDER_RENDER: "Baiduspider-render",
5972
+ BAIDU_SPIDER_VIDEO: "Baiduspider-video",
5973
+ BLEX_BOT: "BLEXBot",
5974
+ BOTIFY: "botify",
5975
+ BRAVE_BOT: "Bravebot",
5976
+ BYTEDANCE_BYTESPIDER: "Bytespider",
5977
+ BYTEDANCE_TIKTOKSPIDER: "TikTokSpider",
5978
+ COMMON_CRAWL_CCBOT: "CCBot",
5979
+ COCCOC_BOT_WEB: "coccocbot-web",
5980
+ COCCOC_BOT_IMAGE: "coccocbot-image",
5981
+ COHERE_TRAINING_DATA_CRAWLER: "cohere-training-data-crawler",
5982
+ COTOYOGI: "Cotoyogi",
5983
+ COVEO_BOT: "Coveobot",
5984
+ CRITEO_BOT: "CriteoBot",
5985
+ DATAFORSEO_BOT: "DataForSeoBot",
5986
+ DAUM: "Daum",
5987
+ DAUM_DAUMOA: "Daumoa",
5988
+ DAUM_DAUMOA_IMAGE: "Daumoa-image",
5989
+ DEEPSEEK_BOT: "DeepSeekBot",
5990
+ DIFFBOT: "Diffbot",
5991
+ DUCKDUCKGO_BOT: "DuckDuckBot",
5992
+ DUCKDUCKGO_FAVICONS_BOT: "DuckDuckGo-Favicons-Bot",
5993
+ ELASTIC: "Elastic",
5994
+ ELASTIC_SWIFTYPE_BOT: "Swiftbot",
5995
+ EXALEAD_EXABOT: "Exabot",
5996
+ FIRECRAWL_AGENT: "FirecrawlAgent",
5997
+ FREESPOKE: "Freespoke",
5998
+ GOOGLE_ADSBOT: "AdsBot-Google",
5999
+ GOOGLE_ADSBOT_MOBILE: "Adsbot-Google-Mobile",
6000
+ GOOGLE_ADSENSE: "AdSense",
6001
+ GOOGLE_APIS: "APIs-Google",
6002
+ GOOGLE_BOT: "Googlebot",
6003
+ GOOGLE_BOT_IMAGE: "Googlebot-Image",
6004
+ GOOGLE_BOT_NEWS: "Googlebot-News",
6005
+ GOOGLE_BOT_VIDEO: "Googlebot-Video",
6006
+ GOOGLE_CLOUDVERTEXBOT: "Google-CloudVertexBot",
6007
+ GOOGLE_EXTENDED: "Google-Extended",
6008
+ GOOGLE_INSPECTIONTOOL: "Google-InspectionTool",
6009
+ GOOGLE_OTHER: "GoogleOther",
6010
+ GOOGLE_OTHER_IMAGE: "GoogleOther-Image",
6011
+ GOOGLE_OTHER_VIDEO: "GoogleOther-Video",
6012
+ GOOGLE_SAFETY: "Google-Safety",
6013
+ GOOGLE_STOREBOT: "Storebot-Google",
6014
+ HIVE_IMAGESIFTBOT: "ImagesiftBot",
6015
+ HUAWEI_PANGUBOT: "PanguBot",
6016
+ HUAWEI_PETALBOT: "PetalBot",
6017
+ HUGGINGFACE_BOT: "HuggingFace-Bot",
6018
+ HUNTER_VELENPUBLICWEBCRAWLER: "VelenPublicWebCrawler",
6019
+ IA_ARCHIVER: "ia_archiver",
6020
+ IASK_BOT: "iAskBot",
6021
+ KAGI_BOT: "Kagibot",
6022
+ KANGAROO_BOT: "Kangaroo Bot",
6023
+ LINE_SPIDER: "Linespider",
6024
+ LINKEDIN_BOT: "LinkedInBot",
6025
+ MAGPIE_CRAWLER: "magpie-crawler",
6026
+ MARGINALIA: "marginalia",
6027
+ META_EXTERNALAGENT: "meta-externalagent",
6028
+ META_FACEBOOKBOT: "FacebookBot",
6029
+ META_FACEBOOKCATALOG: "facebookcatalog",
6030
+ META_FACEBOOKEXTERNALHIT: "facebookexternalhit",
6031
+ MAJESTIC_MJ12BOT: "MJ12bot",
6032
+ MICROSOFT_BINGBOT: "Bingbot",
6033
+ MICROSOFT_MSNBOT: "msnbot",
6034
+ MICROSOFT_ADIDXBOT: "adidxbot",
6035
+ MOJEEK_BOT: "MojeekBot",
6036
+ MOZ_DOTBOT: "DotBot",
6037
+ ONCRAWL: "OnCrawl",
6038
+ ONESPOT_SCRAPERBOT: "Onespot-ScraperBot",
6039
+ OPENAI_GPTBOT: "GPTBot",
6040
+ OPENAI_SEARCH_BOT: "OAI-SearchBot",
6041
+ PERPLEXITY_BOT: "PerplexityBot",
6042
+ QIHOO_360_SPIDER: "360Spider",
6043
+ QWANT_BOT: "Qwantbot",
6044
+ QWANT_BOT_NEWS: "Qwantbot-news",
6045
+ REPLICATE_BOT: "Replicate-Bot",
6046
+ RUNPOD_BOT: "RunPod-Bot",
6047
+ SB_INTUITIONS_BOT: "SBIntuitionsBot",
6048
+ SEEKPORT_BOT: "SeekportBot",
6049
+ SEMRUSH_BOT: "SemrushBot",
6050
+ SEMRUSH_BOT_BACKLINK: "SemrushBot-BA",
6051
+ SEMRUSH_BOT_CONTENTSHAKE: "SemrushBot-OCOB",
6052
+ SEMRUSH_BOT_SEO_CHECKER: "SemrushBot-SI",
6053
+ SEZNAM_BOT: "SeznamBot",
6054
+ SITEIMPROVE: "Siteimprove",
6055
+ SOGOU_PIC_SPIDER: "Sogou Pic Spider",
6056
+ SOGOU_WEB_SPIDER: "Sogou web spider",
6057
+ STARTPAGE: "Startpage",
6058
+ SURLY_BOT: "SurdotlyBot",
6059
+ TIMPI_BOT: "Timpibot",
6060
+ TOGETHER_BOT: "Together-Bot",
6061
+ TURNITIN_BOT: "TurnitinBot",
6062
+ TWIN_AGENT: "TwinAgent",
6063
+ VERCEL_V0BOT: "v0bot",
6064
+ WEBZIO: "webzio",
6065
+ WEBZIO_EXTENDED: "Webzio-Extended",
6066
+ WEBZIO_OMGILI: "omgili",
6067
+ WEBZIO_OMGILI_BOT: "omgilibot",
6068
+ XAI_BOT: "xAI-Bot",
6069
+ YAHOO_JAPAN: "Y!J-BRW",
6070
+ YAHOO_SLURP: "Yahoo! Slurp",
6071
+ YANDEX_ACCESSIBILITY_BOT: "YandexAccessibilityBot",
6072
+ YANDEX_ADDITIONAL_BOT: "YandexAdditionalBot",
6073
+ YANDEX_ADNET: "YandexAdNet",
6074
+ YANDEX_BLOGS: "YandexBlogs",
6075
+ YANDEX_BOT: "YandexBot",
6076
+ YANDEX_BOT_MIRRORDETECTOR: "YandexBot MirrorDetector",
6077
+ YANDEX_COMBOT: "YandexComBot",
6078
+ YANDEX_FAVICONS: "YandexFavicons",
6079
+ YANDEX_IMAGE_RESIZER: "YandexImageResizer",
6080
+ YANDEX_IMAGES: "YandexImages",
6081
+ YANDEX_MARKET: "YandexMarket",
6082
+ YANDEX_MEDIA: "YandexMedia",
6083
+ YANDEX_METRIKA: "YandexMetrika",
6084
+ YANDEX_MOBILE_BOT: "YandexMobileBot",
6085
+ YANDEX_MOBILE_SCREENSHOT_BOT: "YandexMobileScreenShotBot",
6086
+ YANDEX_NEWS: "YandexNews",
6087
+ YANDEX_ONTODB: "YandexOntoDB",
6088
+ YANDEX_ONTODB_API: "YandexOntoDBAPI",
6089
+ YANDEX_PARTNER: "YandexPartner",
6090
+ YANDEX_RCA: "YandexRCA",
6091
+ YANDEX_RENDERRESOURCES_BOT: "YandexRenderResourcesBot",
6092
+ YANDEX_SCREENSHOT_BOT: "YandexScreenshotBot",
6093
+ YANDEX_SPRAV_BOT: "YandexSpravBot",
6094
+ YANDEX_TRACKER: "YandexTracker",
6095
+ YANDEX_VERTICALS: "YandexVerticals",
6096
+ YANDEX_VERTIS: "YandexVertis",
6097
+ YANDEX_VIDEO: "YandexVideo",
6098
+ YANDEX_VIDEO_PARSER: "YandexVideoParser",
6099
+ YANDEX_WEBMASTER: "YandexWebmaster",
6100
+ YEP_BOT: "YepBot",
6101
+ YETI: "Yeti",
6102
+ YISOU_SPIDER: "YisouSpider",
6103
+ YOU_BOT: "YouBot",
6104
+ ZHIPU_CHATGLM_SPIDER: "ChatGLM-Spider",
6105
+ ZUM_BOT: "ZumBot"
6106
+ },
6107
+ Email: {
6108
+ AIRMAIL: "Airmail",
6109
+ APPLE_MAIL: "Mail",
6110
+ BLUEMAIL: "BlueMail",
6111
+ DAUM_MAIL: "DaumMail",
6112
+ EVOLUTION: "Evolution",
6113
+ EM_CLIENT: "eM Client",
6114
+ FOXMAIL: "Foxmail",
6115
+ KMAIL: "KMail",
6116
+ KMAIL2: "kmail2",
6117
+ KONTACT: "Kontact",
6118
+ MICROSOFT_OUTLOOK: "Microsoft Outlook",
6119
+ MICROSOFT_OUTLOOK_MAC: "MacOutlook",
6120
+ NAVER_MAILAPP: "NaverMailApp",
6121
+ POLYMAIL: "Polymail",
6122
+ PROTON_MAIL: "ProtonMail",
6123
+ SPARK_MAIL: "SparkDesktop",
6124
+ SPARROW: "Sparrow",
6125
+ THUNDERBIRD: "Thunderbird",
6126
+ YAHOO_MAIL: "Yahoo",
6127
+ ZIMBRA: "Zimbra",
6128
+ ZOHO_MAIL: "ZohoMail-Desktop"
6129
+ },
6130
+ Fetcher: {
6131
+ AHREFS_SITEAUDIT: "AhrefsSiteAudit",
6132
+ ANTHROPIC_CLAUDE_USER: "Claude-User",
6133
+ ASANA: "Asana",
6134
+ BETTER_UPTIME_BOT: "Better Uptime Bot",
6135
+ BITLY_BOT: "bitlybot",
6136
+ BLUESKY: "Bluesky",
6137
+ BUFFER_LINKPREVIEWBOT: "BufferLinkPreviewBot",
6138
+ COHERE_AI: "Cohere-AI",
6139
+ DISCORD_BOT: "Discordbot",
6140
+ DUCKDUCKGO_ASSISTBOT: "DuckAssistBot",
6141
+ GOOGLE_CHROME_LIGHTHOUSE: "Chrome-Lighthouse",
6142
+ GOOGLE_FEEDFETCHER: "FeedFetcher-Google",
6143
+ GOOGLE_GEMINI_DEEP_RESEARCH: "Gemini-Deep-Research",
6144
+ GOOGLE_IMAGEPROXY: "GoogleImageProxy",
6145
+ GOOGLE_PAGERENDERER: "Google-PageRenderer",
6146
+ GOOGLE_READ_ALOUD: "Google-Read-Aloud",
6147
+ GOOGLE_PRODUCER: "GoogleProducer",
6148
+ GOOGLE_SITE_VERIFICATION: "Google-Site-Verification",
6149
+ HUBSPOT_PAGE_FETCHER: "HubSpot Page Fetcher",
6150
+ IFRAMELY: "Iframely",
6151
+ KAKAOTALK_SCRAP: "kakaotalk-scrap",
6152
+ KEYBASE_BOT: "KeybaseBot",
6153
+ META_EXTERNALFETCHER: "meta-externalfetcher",
6154
+ META_WHATSAPP: "WhatsApp",
6155
+ MICROSOFT_BINGPREVIEW: "BingPreview",
6156
+ MICROSOFT_PREVIEW: "MicrosoftPreview",
6157
+ MISTRALAI_USER: "MistralAI-User",
6158
+ NAVER_BLUENO: "Blueno",
6159
+ ONCRAWL_ROGERBOT: "rogerbot",
6160
+ OPENAI_CHATGPT_USER: "ChatGPT-User",
6161
+ PERPLEXITY_USER: "Perplexity-User",
6162
+ PINTEREST_BOT: "Pinterestbot",
6163
+ SEMRUSH_SITEAUDITBOT: "SiteAuditBot",
6164
+ SLACK_BOT: "Slackbot",
6165
+ SLACK_BOT_LINKEXPANDING: "Slackbot-LinkExpanding",
6166
+ SLACK_IMGPROXY: "Slack-ImgProxy",
6167
+ SNAP_URL_PREVIEW: "Snap URL Preview",
6168
+ SKYPE_URIPREVIEW: "SkypeUriPreview",
6169
+ TELEGRAM_BOT: "TelegramBot",
6170
+ UPTIMEROBOT: "UptimeRobot",
6171
+ VERCEL_FAVICON_BOT: "vercel-favicon-bot",
6172
+ VERCEL_SCREENSHOT_BOT: "vercel-screenshot-bot",
6173
+ VERCEL_BOT: "Vercelbot",
6174
+ VERCEL_FLAGS: "vercelflags",
6175
+ VERCEL_TRACING: "verceltracing",
6176
+ X_TWITTERBOT: "Twitterbot",
6177
+ YANDEX_CALENDAR: "YandexCalendar",
6178
+ YANDEX_DIRECT: "YandexDirect",
6179
+ YANDEX_DIRECTDYN: "YandexDirectDyn",
6180
+ YANDEX_DIRECTFETCHER: "YaDirectFetcher",
6181
+ YANDEX_FORDOMAIN: "YandexForDomain",
6182
+ YANDEX_PAGECHECKER: "YandexPagechecker",
6183
+ YANDEX_SEARCHSHOP: "YandexSearchShop",
6184
+ YANDEX_SITELINKS: "YandexSitelinks",
6185
+ YANDEX_USERPROXY: "YandexUserproxy",
6186
+ ZOOMINFO_BOT: "Zoombot"
6187
+ },
6188
+ InApp: {
6189
+ DISCORD: "Discord",
6190
+ EVERNOTE: "Evernote",
6191
+ FIGMA: "Figma",
6192
+ FLIPBOARD: "Flipboard",
6193
+ MATTERMOST: "Mattermost",
6194
+ TEAMS: "Teams",
6195
+ NOTION: "Notion",
6196
+ POSTMAN: "Postman",
6197
+ RAMBOX: "Rambox",
6198
+ ROCKETCHAT: "Rocket.Chat",
6199
+ SLACK: "Slack",
6200
+ TIKTOK_LITE: "TikTok Lite",
6201
+ VSCODE: "VS Code",
6202
+ YAHOO_JAPAN: "Yahoo! Japan"
6203
+ },
6204
+ Library: {
6205
+ ADOBE_AIR: "AdobeAIR",
6206
+ AIOHTTP: "aiohttp",
6207
+ APACHE_HTTPCLIENT: "Apache-HttpClient",
6208
+ AXIOS: "axios",
6209
+ GO_HTTP_CLIENT: "go-http-client",
6210
+ GOT: "got",
6211
+ GUZZLEHTTP: "GuzzleHttp",
6212
+ JAVA: "Java",
6213
+ JAVA_HTTPCLIENT: "Java-http-client",
6214
+ JSDOM: "jsdom",
6215
+ LIBWWW_PERL: "libwww-perl",
6216
+ LUA_RESTY_HTTP: "lua-resty-http",
6217
+ NEEDLE: "Needle",
6218
+ NUTCH: "Nutch",
6219
+ OKHTTP: "OkHttp",
6220
+ NODE_FETCH: "node-fetch",
6221
+ NODE_SUPERAGENT: "node-superagent",
6222
+ PHP_SOAP: "PHP-SOAP",
6223
+ POSTMAN_RUNTIME: "PostmanRuntime",
6224
+ PYTHON_HTTPX: "python-httpx",
6225
+ PYTHON_URLLIB: "python-urllib",
6226
+ PYTHON_URLLIB3: "python-urllib3",
6227
+ PYTHON_REQUESTS: "python-requests",
6228
+ SCRAPY: "Scrapy"
6229
+ }
6230
+ },
6231
+ DeviceVendor: {
6232
+ Vehicle: {
6233
+ BMW: "BMW",
6234
+ BYD: "BYD",
6235
+ JEEP: "Jeep",
6236
+ RIVIAN: "Rivian",
6237
+ TESLA: "Tesla",
6238
+ VOLVO: "Volvo"
6239
+ }
6240
+ }
6241
+ });
6242
+
6243
+ // ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/extensions/ua-parser-extensions.mjs
6244
+ var MODEL2 = "model";
6245
+ var NAME2 = "name";
6246
+ var TYPE2 = "type";
6247
+ var VENDOR2 = "vendor";
6248
+ var VERSION4 = "version";
6249
+ var MOBILE2 = "mobile";
6250
+ var TABLET2 = "tablet";
6251
+ var CRAWLER = "crawler";
6252
+ var CLI = "cli";
6253
+ var EMAIL = "email";
6254
+ var FETCHER = "fetcher";
6255
+ var INAPP2 = "inapp";
6256
+ var MEDIAPLAYER = "mediaplayer";
6257
+ var LIBRARY = "library";
6258
+ var CLIs = Object.freeze({
6259
+ browser: [
6260
+ // wget / curl / Lynx / ELinks / HTTPie
6261
+ [/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i],
6262
+ [NAME2, VERSION4, [TYPE2, CLI]]
6263
+ ]
6264
+ });
6265
+ var Crawlers = Object.freeze({
6266
+ browser: [
6267
+ [
6268
+ // AhrefsBot - https://ahrefs.com/robot
6269
+ // Amazonbot - https://developer.amazon.com/amazonbot
6270
+ // Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0
6271
+ // Bravebot - https://search.brave.com/help/brave-search-crawler
6272
+ // CCBot - https://commoncrawl.org/faq
6273
+ // contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C
6274
+ // Coveobot - https://connect.coveo.com/s/article/19648
6275
+ // CriteoBot - https://www.criteo.com/criteo-crawler/
6276
+ // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
6277
+ // DuckDuckBot - http://duckduckgo.com/duckduckbot.html
6278
+ // FacebookBot - https://developers.facebook.com/docs/sharing/bot/
6279
+ // GPTBot - https://platform.openai.com/docs/gptbot
6280
+ // iAskBot - https://iask.ai
6281
+ // Kagibot - https://kagi.com/bot
6282
+ // Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/
6283
+ // LinkedInBot - http://www.linkedin.com
6284
+ // MJ12bot - https://mj12bot.com/
6285
+ // MojeekBot - https://www.mojeek.com/bot.html
6286
+ // Onespot - https://www.onespot.com/identifying-traffic.html
6287
+ // OpenAI's SearchGPT - https://platform.openai.com/docs/bots
6288
+ // PerplexityBot - https://perplexity.ai/perplexitybot
6289
+ // SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/
6290
+ // SeznamBot - http://napoveda.seznam.cz/seznambot-intro
6291
+ // SurdotlyBot - http://sur.ly/bot.html
6292
+ // Swiftbot - https://swiftype.com/swiftbot
6293
+ // YepBot - https://yep.com/yepbot/
6294
+ /((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i,
6295
+ // Algolia Crawler
6296
+ /(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i,
6297
+ // Applebot - http://apple.com/go/applebot
6298
+ /(applebot(?:-extended)?)\/?([\w\.]*)/i,
6299
+ // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
6300
+ /(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i,
6301
+ // ClaudeBot (Anthropic)
6302
+ /(claude(?:bot|-searchbot|-web)|anthropic-ai)\/?([\w\.]*)/i,
6303
+ // Coc Coc Bot - https://help.coccoc.com/en/search-engine
6304
+ /(coccocbot-(?:image|web))\/([\w\.]+)/i,
6305
+ // Daum
6306
+ /(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,
6307
+ // Facebook / Meta
6308
+ // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
6309
+ /(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
6310
+ // Googlebot - http://www.google.com/bot.html
6311
+ /(google(?:bot|other|-inspectiontool)(?:-image|-video|-news)?|storebot-google)\/?([\w\.]*)/i,
6312
+ // Internet Archive (archive.org)
6313
+ /(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
6314
+ // OnCrawl
6315
+ /(oncrawl) mobile\/([\w\.]+)/i,
6316
+ // Qwantbot - https://help.qwant.com/bot
6317
+ /(qwantbot(?:-news)?)[-\w]*\/?([\w\.]*)/i,
6318
+ // SemrushBot - http://www.semrush.com/bot.html
6319
+ /((?:semrush|splitsignal)bot[-abcfimostw]*)\/?([\w\.-]*)/i,
6320
+ // Sogou Spider
6321
+ /(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,
6322
+ // Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955
6323
+ /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
6324
+ // Yandex Bots - https://yandex.com/bots
6325
+ /(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\/([\w\.]+)/i,
6326
+ // Yeti (Naver)
6327
+ /(yeti)\/([\w\.]+)/i,
6328
+ // aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot
6329
+ // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/
6330
+ // Freespoke - https://docs.freespoke.com/search/bot/
6331
+ /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i
6332
+ ],
6333
+ [NAME2, VERSION4, [TYPE2, CRAWLER]],
6334
+ [
6335
+ // YandexBot MirrorDetector
6336
+ /(yandexbot\/([\w\.]+); mirrordetector)/i
6337
+ ],
6338
+ [[NAME2, /\/.+;/ig, ""], VERSION4, [TYPE2, CRAWLER]],
6339
+ [
6340
+ // Google Bots
6341
+ /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
6342
+ // AI2Bot - https://allenai.org/crawler
6343
+ // DataForSeoBot - https://dataforseo.com/dataforseo-bot
6344
+ // Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
6345
+ // ImagesiftBot - https://imagesift.com/about
6346
+ // Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553
6347
+ // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
6348
+ // v0bot - https://vercel.com/docs/bot-management
6349
+ // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
6350
+ // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider
6351
+ /\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i
6352
+ ],
6353
+ [NAME2, [TYPE2, CRAWLER]]
6354
+ ]
6355
+ });
6356
+ var ExtraDevices = Object.freeze({
6357
+ device: [
6358
+ [
6359
+ /(nook)[\w ]+build\/(\w+)/i,
6360
+ // Nook
6361
+ /(dell) (strea[kpr\d ]*[\dko])/i,
6362
+ // Dell Streak
6363
+ /(le[- ]+pan)[- ]+(\w{1,9}) bui/i,
6364
+ // Le Pan Tablets
6365
+ /(trinity)[- ]*(t\d{3}) bui/i,
6366
+ // Trinity Tablets
6367
+ /(gigaset)[- ]+(q\w{1,9}) bui/i,
6368
+ // Gigaset Tablets
6369
+ /(vodafone) ([\w ]+)(?:\)| bui)/i
6370
+ // Vodafone
6371
+ ],
6372
+ [VENDOR2, MODEL2, [TYPE2, TABLET2]],
6373
+ [
6374
+ /(u304aa)/i
6375
+ // AT&T
6376
+ ],
6377
+ [MODEL2, [VENDOR2, "AT&T"], [TYPE2, MOBILE2]],
6378
+ [
6379
+ /\bsie-(\w*)/i
6380
+ // Siemens
6381
+ ],
6382
+ [MODEL2, [VENDOR2, "Siemens"], [TYPE2, MOBILE2]],
6383
+ [
6384
+ /\b(rct\w+) b/i
6385
+ // RCA Tablets
6386
+ ],
6387
+ [MODEL2, [VENDOR2, "RCA"], [TYPE2, TABLET2]],
6388
+ [
6389
+ /\b(venue[\d ]{2,7}) b/i
6390
+ // Dell Venue Tablets
6391
+ ],
6392
+ [MODEL2, [VENDOR2, "Dell"], [TYPE2, TABLET2]],
6393
+ [
6394
+ /\b(q(?:mv|ta)\w+) b/i
6395
+ // Verizon Tablet
6396
+ ],
6397
+ [MODEL2, [VENDOR2, "Verizon"], [TYPE2, TABLET2]],
6398
+ [
6399
+ /\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i
6400
+ // Barnes & Noble Tablet
6401
+ ],
6402
+ [MODEL2, [VENDOR2, "Barnes & Noble"], [TYPE2, TABLET2]],
6403
+ [
6404
+ /\b(tm\d{3}\w+) b/i
6405
+ ],
6406
+ [MODEL2, [VENDOR2, "NuVision"], [TYPE2, TABLET2]],
6407
+ [
6408
+ /\b(k88) b/i
6409
+ // ZTE K Series Tablet
6410
+ ],
6411
+ [MODEL2, [VENDOR2, "ZTE"], [TYPE2, TABLET2]],
6412
+ [
6413
+ /\b(nx\d{3}j) b/i
6414
+ // ZTE Nubia
6415
+ ],
6416
+ [MODEL2, [VENDOR2, "ZTE"], [TYPE2, MOBILE2]],
6417
+ [
6418
+ /\b(gen\d{3}) b.+49h/i
6419
+ // Swiss GEN Mobile
6420
+ ],
6421
+ [MODEL2, [VENDOR2, "Swiss"], [TYPE2, MOBILE2]],
6422
+ [
6423
+ /\b(zur\d{3}) b/i
6424
+ // Swiss ZUR Tablet
6425
+ ],
6426
+ [MODEL2, [VENDOR2, "Swiss"], [TYPE2, TABLET2]],
6427
+ [
6428
+ /^((zeki)?tb.*\b) b/i
6429
+ // Zeki Tablets
6430
+ ],
6431
+ [MODEL2, [VENDOR2, "Zeki"], [TYPE2, TABLET2]],
6432
+ [
6433
+ /\b([yr]\d{2}) b/i,
6434
+ /\b(?:dragon[- ]+touch |dt)(\w{5}) b/i
6435
+ // Dragon Touch Tablet
6436
+ ],
6437
+ [MODEL2, [VENDOR2, "Dragon Touch"], [TYPE2, TABLET2]],
6438
+ [
6439
+ /\b(ns-?\w{0,9}) b/i
6440
+ // Insignia Tablets
6441
+ ],
6442
+ [MODEL2, [VENDOR2, "Insignia"], [TYPE2, TABLET2]],
6443
+ [
6444
+ /\b((nxa|next)-?\w{0,9}) b/i
6445
+ // NextBook Tablets
6446
+ ],
6447
+ [MODEL2, [VENDOR2, "NextBook"], [TYPE2, TABLET2]],
6448
+ [
6449
+ /\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i
6450
+ // Voice Xtreme Phones
6451
+ ],
6452
+ [[VENDOR2, "Voice"], MODEL2, [TYPE2, MOBILE2]],
6453
+ [
6454
+ /\b(lvtel\-)?(v1[12]) b/i
6455
+ // LvTel Phones
6456
+ ],
6457
+ [[VENDOR2, "LvTel"], MODEL2, [TYPE2, MOBILE2]],
6458
+ [
6459
+ /\b(ph-1) /i
6460
+ // Essential PH-1
6461
+ ],
6462
+ [MODEL2, [VENDOR2, "Essential"], [TYPE2, MOBILE2]],
6463
+ [
6464
+ /\b(v(100md|700na|7011|917g).*\b) b/i
6465
+ // Envizen Tablets
6466
+ ],
6467
+ [MODEL2, [VENDOR2, "Envizen"], [TYPE2, TABLET2]],
6468
+ [
6469
+ /\b(trio[-\w\. ]+) b/i
6470
+ // MachSpeed Tablets
6471
+ ],
6472
+ [MODEL2, [VENDOR2, "MachSpeed"], [TYPE2, TABLET2]],
6473
+ [
6474
+ /\btu_(1491) b/i
6475
+ // Rotor Tablets
6476
+ ],
6477
+ [MODEL2, [VENDOR2, "Rotor"], [TYPE2, TABLET2]]
6478
+ ]
6479
+ });
6480
+ var Emails = Object.freeze({
6481
+ browser: [
6482
+ [
6483
+ // Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
6484
+ // Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
6485
+ // ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
6486
+ /((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,
6487
+ // Apple's Mail
6488
+ /(mail)\/([\w\.]+) cf/i
6489
+ ],
6490
+ [NAME2, VERSION4, [TYPE2, EMAIL]],
6491
+ [
6492
+ // Zimbra
6493
+ /zdesktop\/([\w\.]+)/i
6494
+ ],
6495
+ [VERSION4, [NAME2, "Zimbra"], [TYPE2, EMAIL]]
6496
+ ]
6497
+ });
6498
+ var Fetchers = Object.freeze({
6499
+ browser: [
6500
+ [
6501
+ // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
6502
+ // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
6503
+ // Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot
6504
+ // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
6505
+ // DuckAssistBot - https://duckduckgo.com/duckassistbot/
6506
+ // Google Site Verifier / Meta / Yahoo! Japan
6507
+ // Iframely - https://iframely.com/docs/about
6508
+ // Perplexity-User - https://docs.perplexity.ai/guides/bots
6509
+ // MistralAI-User - https://docs.mistral.ai/robots/
6510
+ // Yandex Bots - https://yandex.com/bots
6511
+ /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
6512
+ // Bluesky
6513
+ /(bluesky) cardyb\/([\w\.]+)/i,
6514
+ // Skype
6515
+ /(skypeuripreview) preview\/([\w\.]+)/i,
6516
+ // Slackbot - https://api.slack.com/robots
6517
+ /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
6518
+ // WhatsApp
6519
+ /(whatsapp)\/([\w\.]+)/i
6520
+ ],
6521
+ [NAME2, VERSION4, [TYPE2, FETCHER]],
6522
+ [
6523
+ // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots
6524
+ /((?:better uptime |keybase|telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
6525
+ ],
6526
+ [NAME2, [TYPE2, FETCHER]]
6527
+ ],
6528
+ os: [
6529
+ [/whatsapp\/[\d\.]+ (a|i)/i],
6530
+ [[NAME2, (os) => os == "A" ? "Android" : "iOS"]]
6531
+ ]
6532
+ });
6533
+ var InApps = Object.freeze({
6534
+ browser: [
6535
+ [
6536
+ // Discord/Figma/Flipboard/Mattermost/Notion/Postman/Rambox/Rocket.Chat/Slack/Teams
6537
+ /\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\/([\w\.]+).+(electron\/|; ios)/i,
6538
+ /(flipboard)\/([\w\.]+)/i
6539
+ ],
6540
+ [NAME2, VERSION4, [TYPE2, INAPP2]],
6541
+ [
6542
+ // Evernote/Teams on mobile
6543
+ /(evernote) win/i,
6544
+ /(teams)mobile-(ios|and)/i
6545
+ ],
6546
+ [NAME2, [TYPE2, INAPP2]],
6547
+ [
6548
+ // Slack
6549
+ /chatlyio\/([\d\.]+)/i
6550
+ ],
6551
+ [VERSION4, [NAME2, "Slack"], [TYPE2, INAPP2]],
6552
+ [
6553
+ // TikTok Lite
6554
+ /ultralite app_version\/([\w\.]+)/i
6555
+ ],
6556
+ [VERSION4, [NAME2, "TikTok Lite"], [TYPE2, INAPP2]],
6557
+ [
6558
+ // VS Code
6559
+ /\) code\/([\d\.]+).+electron\//i
6560
+ ],
6561
+ [VERSION4, [NAME2, "VS Code"], [TYPE2, INAPP2]],
6562
+ [
6563
+ // Yahoo! Japan
6564
+ /jp\.co\.yahoo\.(?:android\.yjtop|ipn\.appli)\/([\d\.]+)/i
6565
+ ],
6566
+ [VERSION4, [NAME2, "Yahoo! Japan"], [TYPE2, INAPP2]]
6567
+ ]
6568
+ });
6569
+ var MediaPlayers = Object.freeze({
6570
+ browser: [
6571
+ [
6572
+ /(apple(?:coremedia|tv))\/([\w\._]+)/i,
6573
+ // Generic Apple CoreMedia
6574
+ /(coremedia) v([\w\._]+)/i,
6575
+ // Ares/Nexplayer/OSSProxy
6576
+ /(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i,
6577
+ // Aqualung/Lyssna/BSPlayer/Clementine/MPD
6578
+ // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC
6579
+ // NSPlayer/PSP-InternetRadioPlayer/Videos
6580
+ // Nero Home/Nero Scout/Nokia
6581
+ // QuickTime/RealMedia/RadioApp/RadioClientApplication/
6582
+ // SoundTap/Totem/Stagefright/Streamium
6583
+ // XBMC/gvfs/Xine/XMMS/irapp
6584
+ /^(aqualung|audacious|audimusicstream|amarok|bass|bsplayer|core|gnomemplayer|gvfs|irapp|lyssna|music on console|nero (?:home|scout)|nokia\d+|nsplayer|psp-internetradioplayer|quicktime|rma|radioapp|radioclientapplication|soundtap|stagefright|streamium|totem|videos|xbmc|xine|xmms)\/([\w\.-]+)/i,
6585
+ /(lg player|nexplayer) ([\d\.]+)/i,
6586
+ /player\/(nexplayer|lg player) ([\w\.-]+)/i,
6587
+ // NexPlayer/LG Player
6588
+ /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i,
6589
+ // Gstreamer
6590
+ /(htc streaming player) [\w_]+ \/ ([\d\.]+)/i,
6591
+ // HTC Streaming Player
6592
+ /(lavf)([\d\.]+)/i,
6593
+ // Lavf (FFMPEG)
6594
+ // MPlayer SVN
6595
+ /(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,
6596
+ / (songbird)\/([\w\.-]+)/i,
6597
+ // Songbird/Philips-Songbird
6598
+ /(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i,
6599
+ // Winamp
6600
+ /(vlc)(?:\/| media player - version )([\w\.-]+)/i,
6601
+ // VLC Videolan
6602
+ /^(foobar2000|itunes|smp)\/([\d\.]+)/i,
6603
+ // Foobar2000/iTunes/SMP
6604
+ /com\.(riseupradioalarm)\/([\d\.]*)/i,
6605
+ // RiseUP Radio Alarm
6606
+ /(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i,
6607
+ // MPlayer
6608
+ // Windows Media Server
6609
+ /(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i
6610
+ ],
6611
+ [NAME2, VERSION4, [TYPE2, MEDIAPLAYER]],
6612
+ [
6613
+ /(flrp)\/([\w\.-]+)/i
6614
+ // Flip Player
6615
+ ],
6616
+ [[NAME2, "Flip Player"], VERSION4, [TYPE2, MEDIAPLAYER]],
6617
+ [
6618
+ // FStream/NativeHost/QuerySeekSpider
6619
+ // MPlayer (no other info)/Media Player Classic/Nero ShowTime
6620
+ // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
6621
+ // inlight radio / YourMuze
6622
+ /(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i
6623
+ ],
6624
+ [NAME2, [TYPE2, MEDIAPLAYER]],
6625
+ [
6626
+ /(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i
6627
+ // HTC One S / Windows Media Player
6628
+ ],
6629
+ [[NAME2, /[_-]/g, " "], VERSION4, [TYPE2, MEDIAPLAYER]],
6630
+ [
6631
+ /(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i
6632
+ // Rad.io
6633
+ ],
6634
+ [[NAME2, "rad.io"], VERSION4, [TYPE2, MEDIAPLAYER]]
6635
+ ]
6636
+ });
6637
+ var Libraries = Object.freeze({
6638
+ browser: [
6639
+ // Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent
6640
+ [
6641
+ /^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|scrapy)\/([\w\.]+)/i,
6642
+ /(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
6643
+ /(nutch)-([\w\.-]+)(\(|$)/i,
6644
+ /\((java)\/([\w\.]+)/i
6645
+ ],
6646
+ [NAME2, VERSION4, [TYPE2, LIBRARY]]
6647
+ ]
6648
+ });
6649
+ var Vehicles = Object.freeze({
6650
+ device: [
6651
+ [/aftlbt962e2/i],
6652
+ // BMW
6653
+ [[VENDOR2, "BMW"]],
6654
+ [/dilink.+(byd) auto/i],
6655
+ // BYD
6656
+ [VENDOR2],
6657
+ [/aftlft962x3/i],
6658
+ // Jeep
6659
+ [[VENDOR2, "Jeep"], [MODEL2, "Wagooner"]],
6660
+ [/(rivian) (r1t)/i],
6661
+ // Rivian
6662
+ [VENDOR2, MODEL2],
6663
+ [/vcc.+netfront/i],
6664
+ // Volvo
6665
+ [[VENDOR2, "Volvo"]]
6666
+ ]
6667
+ });
6668
+ var Bots = Object.freeze({
6669
+ browser: [
6670
+ ...CLIs.browser,
6671
+ ...Fetchers.browser,
6672
+ ...Crawlers.browser,
6673
+ ...Libraries.browser
6674
+ ],
6675
+ os: [
6676
+ ...Fetchers.os
6677
+ ]
6678
+ });
6679
+
6680
+ // ../../node_modules/.pnpm/detect-europe-js@0.1.2/node_modules/detect-europe-js/dist/esm/index.js
6681
+ var TIMEZONE = {
6682
+ ANDORRA: {
6683
+ ANDORRA: "Europe/Andorra"
6684
+ },
6685
+ AUSTRIA: {
6686
+ VIENNA: "Europe/Vienna"
6687
+ },
6688
+ BELGIUM: {
6689
+ BRUSSELS: "Europe/Brussels"
6690
+ },
6691
+ BULGARIA: {
6692
+ SOFIA: "Europe/Sofia"
6693
+ },
6694
+ CROATIA: {
6695
+ ZAGREB: "Europe/Zagreb"
6696
+ },
6697
+ CYPRUS: {
6698
+ NICOSIA_EUROPE: "Europe/Nicosia",
6699
+ NICOSIA_ASIA: "Asia/Nicosia",
6700
+ FAMAGUSTA: "Asia/Famagusta"
6701
+ },
6702
+ CZECHIA: {
6703
+ PRAGUE: "Europe/Prague"
6704
+ },
6705
+ DENMARK: {
6706
+ COPENHAGEN: "Europe/Copenhagen",
6707
+ FAROE: "Atlantic/Faroe"
6708
+ },
6709
+ ESTONIA: {
6710
+ TALLINN: "Europe/Tallinn"
6711
+ },
6712
+ FINLAND: {
6713
+ HELSINKI: "Europe/Helsinki",
6714
+ MARIEHAMN: "Europe/Mariehamn"
6715
+ },
6716
+ FRANCE: {
6717
+ PARIS: "Europe/Paris",
6718
+ CAYENNE: "America/Cayenne",
6719
+ GUADELOUPE: "America/Guadeloupe",
6720
+ MARIGOT: "America/Marigot",
6721
+ MARTINIQUE: "America/Martinique",
6722
+ MAYOTTE: "Indian/Mayotte",
6723
+ REUNION: "Indian/Reunion"
6724
+ },
6725
+ GERMANY: {
6726
+ BERLIN: "Europe/Berlin",
6727
+ BUSINGEN: "Europe/Busingen"
6728
+ },
6729
+ GREECE: {
6730
+ ATHENS: "Europe/Athens"
6731
+ },
6732
+ HUNGARY: {
6733
+ BUDAPEST: "Europe/Budapest"
6734
+ },
6735
+ ICELAND: {
6736
+ REYKJAVIK: "Atlantic/Reykjavik"
6737
+ },
6738
+ IRELAND: {
6739
+ DUBLIN: "Europe/Dublin"
6740
+ },
6741
+ ITALY: {
6742
+ ROME: "Europe/Rome"
6743
+ },
6744
+ LATVIA: {
6745
+ RIGA: "Europe/Riga"
6746
+ },
6747
+ LIECHTENSTEIN: {
6748
+ VADUZ: "Europe/Vaduz"
6749
+ },
6750
+ LITHUANIA: {
6751
+ VILNIUS: "Europe/Vilnius"
6752
+ },
6753
+ LUXEMBOURG: {
6754
+ LUXEMBOURG: "Europe/Luxembourg"
6755
+ },
6756
+ MALTA: {
6757
+ MALTA: "Europe/Malta"
6758
+ },
6759
+ MONACO: {
6760
+ MONACO: "Europe/Monaco"
6761
+ },
6762
+ NETHERLANDS: {
6763
+ AMSTERDAM: "Europe/Amsterdam",
6764
+ ARUBA: "America/Aruba",
6765
+ CURACAO: "America/Curacao",
6766
+ KRALENDIJK: "America/Kralendijk",
6767
+ LOWER_PRINCES: "America/Lower_Princes"
6768
+ },
6769
+ NORWAY: {
6770
+ OSLO: "Europe/Oslo",
6771
+ JAN_MAYEN: "Atlantic/Jan_Mayen",
6772
+ LONGYEARBYEN: "Arctic/Longyearbyen"
6773
+ },
6774
+ POLAND: {
6775
+ WARSAW: "Europe/Warsaw"
6776
+ },
6777
+ PORTUGAL: {
6778
+ LISBON: "Europe/Lisbon",
6779
+ AZORES: "Atlantic/Azores",
6780
+ MADEIRA: "Atlantic/Madeira"
6781
+ },
6782
+ ROMANIA: {
6783
+ BUCHAREST: "Europe/Bucharest"
6784
+ },
6785
+ SAN_MARINO: {
6786
+ SAN_MARINO: "Europe/San_Marino"
6787
+ },
6788
+ SLOVAKIA: {
6789
+ BRATISLAVA: "Europe/Bratislava"
6790
+ },
6791
+ SLOVENIA: {
6792
+ LJUBLJANA: "Europe/Ljubljana"
6793
+ },
6794
+ SPAIN: {
6795
+ MADRID: "Europe/Madrid",
6796
+ CANARY: "Atlantic/Canary",
6797
+ CEUTA: "Africa/Ceuta"
6798
+ },
6799
+ SWEDEN: {
6800
+ STOCKHOLM: "Europe/Stockholm"
6801
+ },
6802
+ SWITZERLAND: {
6803
+ ZURICH: "Europe/Zurich"
6804
+ },
6805
+ VATICAN: {
6806
+ VATICAN: "Europe/Vatican"
6807
+ }
6808
+ };
6809
+ var EU_TIMEZONE = [
6810
+ TIMEZONE.AUSTRIA.VIENNA,
6811
+ TIMEZONE.BELGIUM.BRUSSELS,
6812
+ TIMEZONE.BULGARIA.SOFIA,
6813
+ TIMEZONE.CROATIA.ZAGREB,
6814
+ TIMEZONE.CYPRUS.NICOSIA_EUROPE,
6815
+ TIMEZONE.CYPRUS.NICOSIA_ASIA,
6816
+ TIMEZONE.CYPRUS.FAMAGUSTA,
6817
+ TIMEZONE.CZECHIA.PRAGUE,
6818
+ TIMEZONE.DENMARK.COPENHAGEN,
6819
+ TIMEZONE.ESTONIA.TALLINN,
6820
+ TIMEZONE.FINLAND.HELSINKI,
6821
+ TIMEZONE.FINLAND.MARIEHAMN,
6822
+ TIMEZONE.FRANCE.PARIS,
6823
+ TIMEZONE.GERMANY.BERLIN,
6824
+ TIMEZONE.GREECE.ATHENS,
6825
+ TIMEZONE.HUNGARY.BUDAPEST,
6826
+ TIMEZONE.IRELAND.DUBLIN,
6827
+ TIMEZONE.ITALY.ROME,
6828
+ TIMEZONE.LATVIA.RIGA,
6829
+ TIMEZONE.LITHUANIA.VILNIUS,
6830
+ TIMEZONE.LUXEMBOURG.LUXEMBOURG,
6831
+ TIMEZONE.MALTA.MALTA,
6832
+ TIMEZONE.NETHERLANDS.AMSTERDAM,
6833
+ TIMEZONE.POLAND.WARSAW,
6834
+ TIMEZONE.PORTUGAL.LISBON,
6835
+ TIMEZONE.ROMANIA.BUCHAREST,
6836
+ TIMEZONE.SLOVAKIA.BRATISLAVA,
6837
+ TIMEZONE.SLOVENIA.LJUBLJANA,
6838
+ TIMEZONE.SPAIN.MADRID,
6839
+ TIMEZONE.SWEDEN.STOCKHOLM,
6840
+ TIMEZONE.FRANCE.CAYENNE,
6841
+ TIMEZONE.FRANCE.GUADELOUPE,
6842
+ TIMEZONE.FRANCE.MARIGOT,
6843
+ TIMEZONE.FRANCE.MARTINIQUE,
6844
+ TIMEZONE.FRANCE.MAYOTTE,
6845
+ TIMEZONE.FRANCE.REUNION,
6846
+ TIMEZONE.PORTUGAL.AZORES,
6847
+ TIMEZONE.PORTUGAL.MADEIRA,
6848
+ TIMEZONE.SPAIN.CANARY
6849
+ ];
6850
+ var EEA_EFTA_TIMEZONE = [
6851
+ TIMEZONE.ICELAND.REYKJAVIK,
6852
+ TIMEZONE.LIECHTENSTEIN.VADUZ,
6853
+ TIMEZONE.NORWAY.OSLO,
6854
+ TIMEZONE.NORWAY.JAN_MAYEN
6855
+ ];
6856
+ var EEA_TIMEZONE = [
6857
+ ...EU_TIMEZONE,
6858
+ ...EEA_EFTA_TIMEZONE
6859
+ ];
6860
+ var EFTA_TIMEZONE = [
6861
+ TIMEZONE.SWITZERLAND.ZURICH,
6862
+ ...EEA_EFTA_TIMEZONE
6863
+ ];
6864
+ var SCHENGEN_TIMEZONE = [
6865
+ TIMEZONE.AUSTRIA.VIENNA,
6866
+ TIMEZONE.BELGIUM.BRUSSELS,
6867
+ TIMEZONE.BULGARIA.SOFIA,
6868
+ TIMEZONE.CROATIA.ZAGREB,
6869
+ TIMEZONE.CZECHIA.PRAGUE,
6870
+ TIMEZONE.DENMARK.COPENHAGEN,
6871
+ TIMEZONE.ESTONIA.TALLINN,
6872
+ TIMEZONE.FINLAND.HELSINKI,
6873
+ TIMEZONE.FINLAND.MARIEHAMN,
6874
+ TIMEZONE.FRANCE.PARIS,
6875
+ TIMEZONE.GERMANY.BERLIN,
6876
+ TIMEZONE.GREECE.ATHENS,
6877
+ TIMEZONE.HUNGARY.BUDAPEST,
6878
+ TIMEZONE.ITALY.ROME,
6879
+ TIMEZONE.LATVIA.RIGA,
6880
+ TIMEZONE.LITHUANIA.VILNIUS,
6881
+ TIMEZONE.LUXEMBOURG.LUXEMBOURG,
6882
+ TIMEZONE.MALTA.MALTA,
6883
+ TIMEZONE.NETHERLANDS.AMSTERDAM,
6884
+ TIMEZONE.POLAND.WARSAW,
6885
+ TIMEZONE.PORTUGAL.LISBON,
6886
+ TIMEZONE.PORTUGAL.AZORES,
6887
+ TIMEZONE.PORTUGAL.MADEIRA,
6888
+ TIMEZONE.ROMANIA.BUCHAREST,
6889
+ TIMEZONE.SLOVAKIA.BRATISLAVA,
6890
+ TIMEZONE.SLOVENIA.LJUBLJANA,
6891
+ TIMEZONE.SPAIN.MADRID,
6892
+ TIMEZONE.SPAIN.CANARY,
6893
+ TIMEZONE.SWEDEN.STOCKHOLM,
6894
+ TIMEZONE.ANDORRA.ANDORRA,
6895
+ TIMEZONE.GERMANY.BUSINGEN,
6896
+ TIMEZONE.ICELAND.REYKJAVIK,
6897
+ TIMEZONE.LIECHTENSTEIN.VADUZ,
6898
+ TIMEZONE.MONACO.MONACO,
6899
+ TIMEZONE.NORWAY.OSLO,
6900
+ TIMEZONE.SAN_MARINO.SAN_MARINO,
6901
+ TIMEZONE.SPAIN.CEUTA,
6902
+ TIMEZONE.SWITZERLAND.ZURICH,
6903
+ TIMEZONE.VATICAN.VATICAN
6904
+ ];
6905
+
6906
+ // ../../node_modules/.pnpm/is-standalone-pwa@0.1.1/node_modules/is-standalone-pwa/dist/esm/index.js
6907
+ function isStandalonePWA() {
6908
+ var _a;
6909
+ return typeof window !== "undefined" && ((window === null || window === void 0 ? void 0 : window.matchMedia("(display-mode: standalone)").matches) || ((_a = window.navigator) === null || _a === void 0 ? void 0 : _a.standalone) || document.referrer.startsWith("android-app://") || (window === null || window === void 0 ? void 0 : window.Windows) || /trident.+(msapphost|webview)\//i.test(navigator.userAgent) || document.referrer.startsWith("app-info://platform/microsoft-store"));
3704
6910
  }
6911
+
6912
+ // ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/helpers/ua-parser-helpers.mjs
6913
+ var { Crawler } = Extension.BrowserName;
6914
+ var toResult = (value, head, ext) => typeof value === "string" ? UAParser(value, head, ext) : value;
6915
+ var isAppleSilicon = (resultOrUA) => {
6916
+ const res = toResult(resultOrUA);
6917
+ if (res.os.is(OSName.MACOS)) {
6918
+ if (res.cpu.is(CPUArch.ARM)) {
6919
+ return true;
6920
+ }
6921
+ if (typeof resultOrUA !== "string" && typeof window !== "undefined") {
6922
+ try {
6923
+ const canvas = document.createElement("canvas");
6924
+ const webgl = canvas.getContext("webgl2") || canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
6925
+ const debug = webgl.getExtension("WEBGL_debug_renderer_info");
6926
+ const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
6927
+ if (renderer.match(/apple m\d/i)) {
6928
+ return true;
6929
+ }
6930
+ } catch (e) {
6931
+ return false;
6932
+ }
6933
+ }
6934
+ }
6935
+ return false;
6936
+ };
6937
+ var isBot = (resultOrUA) => [
6938
+ BrowserType.CLI,
6939
+ BrowserType.CRAWLER,
6940
+ BrowserType.FETCHER,
6941
+ BrowserType.LIBRARY
6942
+ ].includes(toResult(resultOrUA, Bots).browser.type);
6943
+ var isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK);
6944
+
6945
+ // src/v2/core/utils/deviceInfo.ts
3705
6946
  function getScreenResolution() {
3706
6947
  return {
3707
6948
  width: window.screen.width,
@@ -3728,21 +6969,71 @@ var TagadaTrackerBundle = (() => {
3728
6969
  if (typeof window === "undefined") {
3729
6970
  return {
3730
6971
  userAgent: {
3731
- browser: { name: "unknown", version: "unknown" },
3732
- os: { name: "unknown", version: "unknown" }
6972
+ name: "",
6973
+ browser: { major: "", name: "", version: "" },
6974
+ os: { name: "", version: "" },
6975
+ device: void 0,
6976
+ engine: { name: "", version: "" },
6977
+ cpu: { architecture: "" }
3733
6978
  },
3734
6979
  screenResolution: { width: 0, height: 0 },
3735
- timeZone: "UTC"
6980
+ timeZone: "UTC",
6981
+ flags: {
6982
+ isBot: false,
6983
+ isChromeFamily: false,
6984
+ isStandalonePWA: false,
6985
+ isAppleSilicon: false
6986
+ }
6987
+ };
6988
+ }
6989
+ const parser = new UAParser();
6990
+ const result = parser.getResult();
6991
+ let flags;
6992
+ try {
6993
+ flags = {
6994
+ isBot: isBot(result),
6995
+ isChromeFamily: isChromeFamily(result),
6996
+ isStandalonePWA: isStandalonePWA(),
6997
+ isAppleSilicon: isAppleSilicon(result)
6998
+ };
6999
+ } catch (error) {
7000
+ console.error("Failed to compute device flags:", error);
7001
+ flags = {
7002
+ isBot: false,
7003
+ isChromeFamily: false,
7004
+ isStandalonePWA: false,
7005
+ isAppleSilicon: false
3736
7006
  };
3737
7007
  }
3738
7008
  return {
3739
7009
  userAgent: {
3740
- browser: getBrowserInfo(),
3741
- os: getOSInfo(),
3742
- device: getDeviceInfo()
7010
+ name: result.ua,
7011
+ browser: {
7012
+ major: result.browser.major || "",
7013
+ name: result.browser.name || "",
7014
+ version: result.browser.version || "",
7015
+ type: result.browser.type
7016
+ },
7017
+ os: {
7018
+ name: result.os.name || "",
7019
+ version: result.os.version || ""
7020
+ },
7021
+ device: result.device.model || result.device.type || result.device.vendor ? {
7022
+ model: result.device.model,
7023
+ type: result.device.type,
7024
+ vendor: result.device.vendor
7025
+ } : void 0,
7026
+ engine: {
7027
+ name: result.engine.name || "",
7028
+ version: result.engine.version || ""
7029
+ },
7030
+ cpu: {
7031
+ architecture: result.cpu.architecture || ""
7032
+ }
3743
7033
  },
3744
7034
  screenResolution: getScreenResolution(),
3745
- timeZone: getTimeZone()
7035
+ timeZone: getTimeZone(),
7036
+ flags
3746
7037
  };
3747
7038
  }
3748
7039
  function getUrlParams() {
@@ -4104,6 +7395,94 @@ var TagadaTrackerBundle = (() => {
4104
7395
  }
4105
7396
  }
4106
7397
 
7398
+ // src/v2/core/utils/authHandoff.ts
7399
+ var resolutionCache = /* @__PURE__ */ new Map();
7400
+ var resolvedCodes = /* @__PURE__ */ new Set();
7401
+ function getAuthCode() {
7402
+ if (typeof window === "undefined") return null;
7403
+ const urlParams = new URLSearchParams(window.location.search);
7404
+ return urlParams.get("authCode");
7405
+ }
7406
+ async function resolveAuthHandoff(authCode, storeId, apiBaseUrl, debugMode = false) {
7407
+ if (resolvedCodes.has(authCode)) {
7408
+ if (debugMode) {
7409
+ console.log("[AuthHandoff] Code already resolved, skipping duplicate request");
7410
+ }
7411
+ throw new Error("Auth code already resolved");
7412
+ }
7413
+ const inFlightResolution = resolutionCache.get(authCode);
7414
+ if (inFlightResolution) {
7415
+ if (debugMode) {
7416
+ console.log("[AuthHandoff] Resolution already in progress, waiting for existing request");
7417
+ }
7418
+ return inFlightResolution;
7419
+ }
7420
+ if (debugMode) {
7421
+ console.log("[AuthHandoff] Resolving authCode:", authCode.substring(0, 15) + "...");
7422
+ }
7423
+ const resolutionPromise = (async () => {
7424
+ try {
7425
+ const response = await fetch("".concat(apiBaseUrl, "/api/v1/cms/auth/resolve-handoff"), {
7426
+ method: "POST",
7427
+ headers: {
7428
+ "Content-Type": "application/json"
7429
+ },
7430
+ body: JSON.stringify({
7431
+ code: authCode,
7432
+ storeId
7433
+ })
7434
+ });
7435
+ if (!response.ok) {
7436
+ const errorData = await response.json().catch(() => ({ message: "Unknown error" }));
7437
+ throw new Error(errorData.message || "Failed to resolve auth handoff: ".concat(response.status));
7438
+ }
7439
+ const data = await response.json();
7440
+ if (debugMode) {
7441
+ console.log("[AuthHandoff] \u2705 Resolved successfully:", {
7442
+ customerId: data.customer.id,
7443
+ role: data.customer.role,
7444
+ hasContext: Object.keys(data.context).length > 0
7445
+ });
7446
+ }
7447
+ if (debugMode) {
7448
+ console.log("[AuthHandoff] Storing new token (overriding existing)");
7449
+ }
7450
+ setClientToken(data.token);
7451
+ cleanAuthCodeFromUrl(debugMode);
7452
+ resolvedCodes.add(authCode);
7453
+ return data;
7454
+ } catch (error) {
7455
+ console.error("[AuthHandoff] \u274C Failed to resolve:", error);
7456
+ throw error;
7457
+ } finally {
7458
+ resolutionCache.delete(authCode);
7459
+ }
7460
+ })();
7461
+ resolutionCache.set(authCode, resolutionPromise);
7462
+ return resolutionPromise;
7463
+ }
7464
+ function cleanAuthCodeFromUrl(debugMode = false) {
7465
+ if (typeof window === "undefined") return;
7466
+ const url = new URL(window.location.href);
7467
+ if (url.searchParams.has("authCode")) {
7468
+ url.searchParams.delete("authCode");
7469
+ window.history.replaceState({}, "", url.pathname + url.search + url.hash);
7470
+ if (debugMode) {
7471
+ console.log("[AuthHandoff] Cleaned authCode from URL");
7472
+ }
7473
+ }
7474
+ }
7475
+ function shouldResolveAuthCode() {
7476
+ const authCode = getAuthCode();
7477
+ if (!authCode || !authCode.startsWith("ah_")) {
7478
+ return false;
7479
+ }
7480
+ if (resolvedCodes.has(authCode)) {
7481
+ return false;
7482
+ }
7483
+ return true;
7484
+ }
7485
+
4107
7486
  // src/v2/core/client.ts
4108
7487
  var TagadaClient = class {
4109
7488
  constructor(config = {}) {
@@ -4119,13 +7498,17 @@ var TagadaTrackerBundle = (() => {
4119
7498
  this.lastSessionInitError = null;
4120
7499
  this.sessionInitRetryCount = 0;
4121
7500
  this.MAX_SESSION_INIT_RETRIES = 3;
4122
- var _a, _b;
7501
+ var _a, _b, _c, _d;
4123
7502
  this.config = config;
4124
7503
  this.instanceId = Math.random().toString(36).substr(2, 9);
4125
7504
  this.boundHandleStorageChange = this.handleStorageChange.bind(this);
4126
- if (this.config.debugMode) {
4127
- console.log("[TagadaClient ".concat(this.instanceId, "] Initializing..."));
4128
- }
7505
+ console.log("[TagadaClient ".concat(this.instanceId, "] Initializing..."));
7506
+ console.log("[TagadaClient ".concat(this.instanceId, "] Config:"), {
7507
+ debugMode: config.debugMode,
7508
+ hasRawPluginConfig: !!config.rawPluginConfig,
7509
+ rawPluginConfig: config.rawPluginConfig,
7510
+ features: config.features
7511
+ });
4129
7512
  const previewModeActive = handlePreviewMode(this.config.debugMode);
4130
7513
  if (previewModeActive && this.config.debugMode) {
4131
7514
  console.log("[TagadaClient ".concat(this.instanceId, "] Preview mode active - state cleared"));
@@ -4166,10 +7549,15 @@ var TagadaTrackerBundle = (() => {
4166
7549
  isInitialized: false,
4167
7550
  isSessionInitialized: false,
4168
7551
  pluginConfig: { basePath: "/", config: {} },
4169
- pluginConfigLoading: !config.rawPluginConfig,
7552
+ pluginConfigLoading: true,
7553
+ // Always true - loadPluginConfig will process rawPluginConfig
4170
7554
  debugMode: (_a = config.debugMode) != null ? _a : env !== "production",
4171
7555
  token: null
4172
7556
  };
7557
+ console.log("[TagadaClient ".concat(this.instanceId, "] Initial state:"), {
7558
+ pluginConfigLoading: this.state.pluginConfigLoading,
7559
+ hasRawPluginConfig: !!config.rawPluginConfig
7560
+ });
4173
7561
  this.apiClient = new ApiClient({
4174
7562
  baseURL: envConfig.apiConfig.baseUrl
4175
7563
  });
@@ -4182,7 +7570,10 @@ var TagadaTrackerBundle = (() => {
4182
7570
  debugMode: this.state.debugMode,
4183
7571
  pluginConfig: this.state.pluginConfig,
4184
7572
  environment: this.state.environment,
4185
- autoRedirect: funnelConfig.autoRedirect
7573
+ autoRedirect: funnelConfig.autoRedirect,
7574
+ // Pass funnelId and stepId from rawPluginConfig to enable config-based initialization
7575
+ funnelId: (_c = config.rawPluginConfig) == null ? void 0 : _c.funnelId,
7576
+ stepId: (_d = config.rawPluginConfig) == null ? void 0 : _d.stepId
4186
7577
  });
4187
7578
  }
4188
7579
  this.apiClient.setTokenProvider(this.waitForToken.bind(this));
@@ -4280,10 +7671,19 @@ var TagadaTrackerBundle = (() => {
4280
7671
  * Load plugin configuration
4281
7672
  */
4282
7673
  async initializePluginConfig() {
4283
- if (!this.state.pluginConfigLoading) return;
7674
+ console.log("[TagadaClient ".concat(this.instanceId, "] initializePluginConfig called"), {
7675
+ pluginConfigLoading: this.state.pluginConfigLoading,
7676
+ hasRawPluginConfig: !!this.config.rawPluginConfig
7677
+ });
7678
+ if (!this.state.pluginConfigLoading) {
7679
+ console.log("[TagadaClient ".concat(this.instanceId, "] Plugin config already loading or loaded, skipping..."));
7680
+ return;
7681
+ }
4284
7682
  try {
4285
7683
  const configVariant = this.config.localConfig || "default";
7684
+ console.log("[TagadaClient ".concat(this.instanceId, "] Loading plugin config with variant: ").concat(configVariant));
4286
7685
  const config = await loadPluginConfig(configVariant, this.config.rawPluginConfig);
7686
+ console.log("[TagadaClient ".concat(this.instanceId, "] Plugin config loaded:"), config);
4287
7687
  this.updateState({
4288
7688
  pluginConfig: config,
4289
7689
  pluginConfigLoading: false
@@ -4294,9 +7694,6 @@ var TagadaTrackerBundle = (() => {
4294
7694
  environment: this.state.environment
4295
7695
  });
4296
7696
  }
4297
- if (this.state.debugMode) {
4298
- console.log("[TagadaClient] Plugin config loaded:", config);
4299
- }
4300
7697
  } catch (error) {
4301
7698
  console.error("[TagadaClient] Failed to load plugin config:", error);
4302
7699
  this.updateState({
@@ -4309,15 +7706,63 @@ var TagadaTrackerBundle = (() => {
4309
7706
  * Initialize token and session
4310
7707
  */
4311
7708
  async initializeToken() {
7709
+ var _a;
7710
+ if (shouldResolveAuthCode()) {
7711
+ const storeId = this.state.pluginConfig.storeId;
7712
+ if (!storeId) {
7713
+ console.error("[TagadaClient] Cannot resolve authCode: storeId not found in config");
7714
+ return this.fallbackToNormalFlow();
7715
+ }
7716
+ console.log("[TagadaClient ".concat(this.instanceId, "] \u{1F510} Cross-domain auth detected, resolving..."));
7717
+ try {
7718
+ const authCode = new URLSearchParams(window.location.search).get("authCode");
7719
+ if (!authCode) {
7720
+ return this.fallbackToNormalFlow();
7721
+ }
7722
+ const handoffData = await resolveAuthHandoff(
7723
+ authCode,
7724
+ storeId,
7725
+ this.state.environment.apiConfig.baseUrl,
7726
+ this.state.debugMode
7727
+ );
7728
+ console.log("[TagadaClient ".concat(this.instanceId, "] \u2705 Auth handoff resolved:"), {
7729
+ customerId: handoffData.customer.id,
7730
+ role: handoffData.customer.role,
7731
+ hasContext: Object.keys(handoffData.context).length > 0
7732
+ });
7733
+ this.setToken(handoffData.token);
7734
+ const decodedSession = decodeJWTClient(handoffData.token);
7735
+ if (decodedSession) {
7736
+ this.updateState({ session: decodedSession });
7737
+ await this.initializeSession(decodedSession);
7738
+ if (((_a = handoffData.context) == null ? void 0 : _a.funnelSessionId) && this.funnel) {
7739
+ if (this.state.debugMode) {
7740
+ console.log("[TagadaClient ".concat(this.instanceId, "] Restoring funnel session from handoff context:"), handoffData.context.funnelSessionId);
7741
+ }
7742
+ }
7743
+ } else {
7744
+ console.error("[TagadaClient] Failed to decode token from handoff");
7745
+ this.updateState({ isInitialized: true, isLoading: false });
7746
+ }
7747
+ return;
7748
+ } catch (error) {
7749
+ console.error("[TagadaClient ".concat(this.instanceId, "] \u274C Auth handoff failed, falling back to normal flow:"), error);
7750
+ }
7751
+ }
7752
+ await this.fallbackToNormalFlow();
7753
+ }
7754
+ /**
7755
+ * Normal token initialization flow (no cross-domain handoff)
7756
+ */
7757
+ async fallbackToNormalFlow() {
4312
7758
  const existingToken = getClientToken();
4313
7759
  const urlParams = new URLSearchParams(typeof window !== "undefined" ? window.location.search : "");
4314
7760
  const queryToken = urlParams.get("token");
4315
- if (this.state.debugMode) {
4316
- console.log("[TagadaClient ".concat(this.instanceId, "] Initializing token..."), {
4317
- hasExistingToken: !!existingToken,
4318
- hasQueryToken: !!queryToken
4319
- });
4320
- }
7761
+ console.log("[TagadaClient ".concat(this.instanceId, "] Initializing token (normal flow)..."), {
7762
+ hasExistingToken: !!existingToken,
7763
+ hasQueryToken: !!queryToken,
7764
+ storeId: this.state.pluginConfig.storeId
7765
+ });
4321
7766
  let tokenToUse = null;
4322
7767
  let shouldPersist = false;
4323
7768
  if (queryToken) {
@@ -4344,12 +7789,14 @@ var TagadaTrackerBundle = (() => {
4344
7789
  }
4345
7790
  } else {
4346
7791
  const storeId = this.state.pluginConfig.storeId;
7792
+ console.log("[TagadaClient ".concat(this.instanceId, "] No existing token, creating anonymous token..."), {
7793
+ hasStoreId: !!storeId,
7794
+ storeId
7795
+ });
4347
7796
  if (storeId) {
4348
- if (this.state.debugMode) {
4349
- console.log("[TagadaClient ".concat(this.instanceId, "] Creating anonymous token for store:"), storeId);
4350
- }
4351
7797
  await this.createAnonymousToken(storeId);
4352
7798
  } else {
7799
+ console.warn("[TagadaClient ".concat(this.instanceId, "] No storeId in plugin config, skipping anonymous token creation"));
4353
7800
  this.updateState({ isInitialized: true, isLoading: false });
4354
7801
  }
4355
7802
  }
@@ -4423,7 +7870,7 @@ var TagadaTrackerBundle = (() => {
4423
7870
  * Initialize session
4424
7871
  */
4425
7872
  async initializeSession(sessionData) {
4426
- var _a, _b;
7873
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
4427
7874
  if (this.isInitializingSession) {
4428
7875
  if (this.state.debugMode) {
4429
7876
  console.log("[TagadaClient ".concat(this.instanceId, "] Session initialization already in progress, skipping"));
@@ -4460,14 +7907,24 @@ var TagadaTrackerBundle = (() => {
4460
7907
  osVersion: deviceInfo.userAgent.os.version,
4461
7908
  deviceType: (_a = deviceInfo.userAgent.device) == null ? void 0 : _a.type,
4462
7909
  deviceModel: (_b = deviceInfo.userAgent.device) == null ? void 0 : _b.model,
7910
+ deviceVendor: (_c = deviceInfo.userAgent.device) == null ? void 0 : _c.vendor,
7911
+ userAgent: deviceInfo.userAgent.name,
7912
+ engineName: deviceInfo.userAgent.engine.name,
7913
+ engineVersion: deviceInfo.userAgent.engine.version,
7914
+ cpuArchitecture: deviceInfo.userAgent.cpu.architecture,
7915
+ isBot: (_e = (_d = deviceInfo.flags) == null ? void 0 : _d.isBot) != null ? _e : false,
7916
+ isChromeFamily: (_g = (_f = deviceInfo.flags) == null ? void 0 : _f.isChromeFamily) != null ? _g : false,
7917
+ isStandalonePWA: (_i = (_h = deviceInfo.flags) == null ? void 0 : _h.isStandalonePWA) != null ? _i : false,
7918
+ isAppleSilicon: (_k = (_j = deviceInfo.flags) == null ? void 0 : _j.isAppleSilicon) != null ? _k : false,
4463
7919
  screenWidth: deviceInfo.screenResolution.width,
4464
7920
  screenHeight: deviceInfo.screenResolution.height,
4465
7921
  timeZone: deviceInfo.timeZone,
4466
- draft
7922
+ draft,
4467
7923
  // 🎯 Pass draft mode to session init
7924
+ fetchMessages: false
4468
7925
  };
4469
7926
  const response = await this.apiClient.post(
4470
- "/api/v1/cms/session/init",
7927
+ "/api/v1/cms/session/v2/init",
4471
7928
  sessionInitData
4472
7929
  );
4473
7930
  this.lastSessionInitError = null;
@@ -4503,13 +7960,15 @@ var TagadaTrackerBundle = (() => {
4503
7960
  });
4504
7961
  this.updateState({ store: storeConfig });
4505
7962
  }
4506
- const localeConfig = {
4507
- locale: response.locale,
4508
- language: response.locale.split("-")[0],
4509
- region: (_b = response.locale.split("-")[1]) != null ? _b : "US",
4510
- messages: (_c = response.messages) != null ? _c : {}
4511
- };
4512
- this.updateState({ locale: localeConfig });
7963
+ if (response.locale) {
7964
+ const localeConfig = {
7965
+ locale: response.locale,
7966
+ language: response.locale.split("-")[0],
7967
+ region: (_b = response.locale.split("-")[1]) != null ? _b : "US",
7968
+ messages: (_c = response.messages) != null ? _c : {}
7969
+ };
7970
+ this.updateState({ locale: localeConfig });
7971
+ }
4513
7972
  if (response.store) {
4514
7973
  const currencyConfig = {
4515
7974
  code: response.store.currency,
@@ -4634,99 +8093,224 @@ var TagadaTrackerBundle = (() => {
4634
8093
  * Used by config editor to highlight elements in preview without altering the element's style
4635
8094
  */
4636
8095
  applyStylesToElement(elementId, styles) {
4637
- var _a;
4638
8096
  if (typeof document === "undefined") return;
4639
- const element = document.querySelector('[editor-id~="'.concat(elementId, '"]'));
4640
- if (!element) {
4641
- if (this.state.debugMode) {
4642
- console.warn('[TagadaClient] Element with editor-id containing "'.concat(elementId, '" not found'));
4643
- }
4644
- return;
8097
+ const staticHighlightId = "tagada-editor-highlight";
8098
+ const existingHighlight = document.getElementById(staticHighlightId);
8099
+ if (existingHighlight) {
8100
+ existingHighlight.remove();
4645
8101
  }
4646
- const voidElements = /* @__PURE__ */ new Set([
4647
- "area",
4648
- "base",
4649
- "br",
4650
- "col",
4651
- "embed",
4652
- "hr",
4653
- "img",
4654
- "input",
4655
- "link",
4656
- "meta",
4657
- "param",
4658
- "source",
4659
- "track",
4660
- "wbr"
4661
- ]);
4662
- const isVoidElement = voidElements.has(element.tagName.toLowerCase());
4663
- let targetElement = element;
4664
- let wrapper = null;
4665
- if (isVoidElement) {
4666
- const parent = element.parentElement;
4667
- const existingWrapper = parent == null ? void 0 : parent.getAttribute("data-tagada-highlight-wrapper");
4668
- if (existingWrapper === "true") {
4669
- targetElement = parent;
4670
- } else {
4671
- wrapper = document.createElement("div");
4672
- wrapper.setAttribute("data-tagada-highlight-wrapper", "true");
4673
- const computedStyle2 = window.getComputedStyle(element);
4674
- const elementDisplay = computedStyle2.display;
4675
- if (elementDisplay === "inline") {
4676
- wrapper.style.display = "inline-block";
8102
+ const applyToElement = (element) => {
8103
+ var _a;
8104
+ const voidElements = /* @__PURE__ */ new Set([
8105
+ "area",
8106
+ "base",
8107
+ "br",
8108
+ "col",
8109
+ "embed",
8110
+ "hr",
8111
+ "img",
8112
+ "input",
8113
+ "link",
8114
+ "meta",
8115
+ "param",
8116
+ "source",
8117
+ "track",
8118
+ "wbr"
8119
+ ]);
8120
+ const isVoidElement = voidElements.has(element.tagName.toLowerCase());
8121
+ let targetElement = element;
8122
+ if (isVoidElement) {
8123
+ const parent = element.parentElement;
8124
+ const existingWrapper = parent == null ? void 0 : parent.getAttribute("data-tagada-highlight-wrapper");
8125
+ if (existingWrapper === "true" && parent instanceof HTMLElement) {
8126
+ targetElement = parent;
4677
8127
  } else {
4678
- wrapper.style.display = elementDisplay;
8128
+ const newWrapper = document.createElement("div");
8129
+ newWrapper.setAttribute("data-tagada-highlight-wrapper", "true");
8130
+ const computedStyle2 = window.getComputedStyle(element);
8131
+ const elementDisplay = computedStyle2.display;
8132
+ if (elementDisplay === "inline") {
8133
+ newWrapper.style.display = "inline-block";
8134
+ } else {
8135
+ newWrapper.style.display = elementDisplay;
8136
+ }
8137
+ newWrapper.style.position = "relative";
8138
+ if (elementDisplay === "inline" || elementDisplay.includes("inline")) {
8139
+ const verticalAlign = computedStyle2.verticalAlign;
8140
+ if (verticalAlign && verticalAlign !== "baseline") {
8141
+ newWrapper.style.verticalAlign = verticalAlign;
8142
+ }
8143
+ }
8144
+ const spacingProperties = [
8145
+ // Width and height
8146
+ "width",
8147
+ "height",
8148
+ "minWidth",
8149
+ "minHeight",
8150
+ "maxWidth",
8151
+ "maxHeight",
8152
+ // Flex properties
8153
+ "flex",
8154
+ "flexGrow",
8155
+ "flexShrink",
8156
+ "flexBasis",
8157
+ // Grid properties
8158
+ "gridColumn",
8159
+ "gridRow",
8160
+ "gridColumnStart",
8161
+ "gridColumnEnd",
8162
+ "gridRowStart",
8163
+ "gridRowEnd",
8164
+ "gridArea",
8165
+ // Alignment properties
8166
+ "alignSelf",
8167
+ "justifySelf",
8168
+ // Box sizing
8169
+ "boxSizing",
8170
+ // Gap (for grid/flex)
8171
+ "gap",
8172
+ "rowGap",
8173
+ "columnGap",
8174
+ // Order (for flex/grid)
8175
+ "order",
8176
+ // Aspect ratio
8177
+ "aspectRatio"
8178
+ ];
8179
+ spacingProperties.forEach((prop) => {
8180
+ const camelProp = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
8181
+ const value = computedStyle2.getPropertyValue(camelProp);
8182
+ if (value && value.trim() !== "") {
8183
+ if (prop === "flex" && value !== "none" && value !== "0 1 auto") {
8184
+ newWrapper.style.flex = value;
8185
+ } else if (prop === "boxSizing") {
8186
+ newWrapper.style.boxSizing = value;
8187
+ } else {
8188
+ newWrapper.style.setProperty(camelProp, value);
8189
+ }
8190
+ }
8191
+ });
8192
+ if (element.style) {
8193
+ const inlineSpacingProps = [
8194
+ "width",
8195
+ "height",
8196
+ "min-width",
8197
+ "min-height",
8198
+ "max-width",
8199
+ "max-height",
8200
+ "flex",
8201
+ "flex-grow",
8202
+ "flex-shrink",
8203
+ "flex-basis",
8204
+ "grid-column",
8205
+ "grid-row",
8206
+ "grid-column-start",
8207
+ "grid-column-end",
8208
+ "grid-row-start",
8209
+ "grid-row-end",
8210
+ "grid-area",
8211
+ "align-self",
8212
+ "justify-self",
8213
+ "box-sizing",
8214
+ "gap",
8215
+ "row-gap",
8216
+ "column-gap",
8217
+ "order",
8218
+ "aspect-ratio"
8219
+ ];
8220
+ inlineSpacingProps.forEach((prop) => {
8221
+ const inlineValue = element.style.getPropertyValue(prop);
8222
+ if (inlineValue) {
8223
+ newWrapper.style.setProperty(prop, inlineValue);
8224
+ }
8225
+ });
8226
+ }
8227
+ (_a = element.parentNode) == null ? void 0 : _a.insertBefore(newWrapper, element);
8228
+ newWrapper.appendChild(element);
8229
+ targetElement = newWrapper;
8230
+ }
8231
+ }
8232
+ const computedStyle = getComputedStyle(isVoidElement ? element : targetElement);
8233
+ if (targetElement.style.position === "static" || !targetElement.style.position) {
8234
+ targetElement.style.position = "relative";
8235
+ }
8236
+ const highlightDiv = document.createElement("div");
8237
+ highlightDiv.id = staticHighlightId;
8238
+ highlightDiv.style.position = "absolute";
8239
+ highlightDiv.style.inset = "0";
8240
+ highlightDiv.style.pointerEvents = "none";
8241
+ highlightDiv.style.zIndex = "9999";
8242
+ highlightDiv.style.boxSizing = "border-box";
8243
+ highlightDiv.style.background = "none";
8244
+ highlightDiv.style.border = "none";
8245
+ highlightDiv.style.outline = "none";
8246
+ highlightDiv.style.margin = "0";
8247
+ highlightDiv.style.padding = "0";
8248
+ const borderRadius = computedStyle.borderRadius;
8249
+ if (borderRadius) {
8250
+ highlightDiv.style.borderRadius = borderRadius;
8251
+ }
8252
+ targetElement.appendChild(highlightDiv);
8253
+ const stylesToApply = styles || { boxShadow: "0 0 0 2px rgb(239 68 68)" };
8254
+ Object.entries(stylesToApply).forEach(([property, value]) => {
8255
+ const camelProperty = property.includes("-") ? property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()) : property;
8256
+ if (property.includes("-")) {
8257
+ highlightDiv.style.setProperty(property, value);
8258
+ } else {
8259
+ highlightDiv.style[camelProperty] = value;
4679
8260
  }
4680
- wrapper.style.position = "relative";
4681
- if (elementDisplay === "inline" || elementDisplay.includes("inline")) {
4682
- const verticalAlign = computedStyle2.verticalAlign;
4683
- if (verticalAlign && verticalAlign !== "baseline") {
4684
- wrapper.style.verticalAlign = verticalAlign;
8261
+ });
8262
+ element.scrollIntoView({ behavior: "smooth", block: "center" });
8263
+ if (this.state.debugMode) {
8264
+ const appliedStyles = Object.entries(stylesToApply).map(([k, v]) => "".concat(k, ": ").concat(v)).join("; ");
8265
+ console.log("[TagadaClient] Applied styles to highlight div of element #".concat(elementId, ":"), appliedStyles);
8266
+ }
8267
+ };
8268
+ const maxAttempts = 5;
8269
+ const intervalMs = 1e3;
8270
+ let attempts = 0;
8271
+ const isElementHidden = (element) => {
8272
+ const style = window.getComputedStyle(element);
8273
+ return style.display === "none" || style.visibility === "hidden" || style.opacity === "0" || element.hidden || element.offsetWidth === 0 || element.offsetHeight === 0;
8274
+ };
8275
+ const findAndApply = () => {
8276
+ const elements = document.querySelectorAll('[editor-id~="'.concat(elementId, '"]'));
8277
+ if (elements.length === 0) {
8278
+ attempts += 1;
8279
+ if (attempts >= maxAttempts) {
8280
+ if (this.state.debugMode) {
8281
+ console.warn(
8282
+ '[TagadaClient] Element with editor-id containing "'.concat(elementId, '" not found after ').concat(maxAttempts, " attempts")
8283
+ );
4685
8284
  }
8285
+ return;
8286
+ }
8287
+ if (this.state.debugMode) {
8288
+ console.warn(
8289
+ '[TagadaClient] Element with editor-id containing "'.concat(elementId, '" not found (attempt ').concat(attempts, "/").concat(maxAttempts, "), retrying in ").concat(intervalMs / 1e3, "s")
8290
+ );
4686
8291
  }
4687
- (_a = element.parentNode) == null ? void 0 : _a.insertBefore(wrapper, element);
4688
- wrapper.appendChild(element);
4689
- targetElement = wrapper;
8292
+ setTimeout(findAndApply, intervalMs);
8293
+ return;
4690
8294
  }
4691
- }
4692
- const computedStyle = getComputedStyle(isVoidElement ? element : targetElement);
4693
- if (targetElement.style.position === "static" || !targetElement.style.position) {
4694
- targetElement.style.position = "relative";
4695
- }
4696
- const staticHighlightId = "tagada-editor-highlight";
4697
- const existingHighlight = document.getElementById(staticHighlightId);
4698
- if (existingHighlight) {
4699
- existingHighlight.remove();
4700
- }
4701
- const highlightDiv = document.createElement("div");
4702
- highlightDiv.id = staticHighlightId;
4703
- highlightDiv.style.position = "absolute";
4704
- highlightDiv.style.inset = "0";
4705
- highlightDiv.style.pointerEvents = "none";
4706
- highlightDiv.style.zIndex = "9999";
4707
- highlightDiv.style.boxSizing = "border-box";
4708
- highlightDiv.style.background = "none";
4709
- highlightDiv.style.border = "none";
4710
- highlightDiv.style.outline = "none";
4711
- const borderRadius = computedStyle.borderRadius;
4712
- if (borderRadius) {
4713
- highlightDiv.style.borderRadius = borderRadius;
4714
- }
4715
- targetElement.appendChild(highlightDiv);
4716
- const stylesToApply = styles || { boxShadow: "0 0 0 2px rgb(239 68 68)" };
4717
- Object.entries(stylesToApply).forEach(([property, value]) => {
4718
- const camelProperty = property.includes("-") ? property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()) : property;
4719
- if (property.includes("-")) {
4720
- highlightDiv.style.setProperty(property, value);
8295
+ let element = null;
8296
+ if (elements.length === 1) {
8297
+ element = elements[0];
4721
8298
  } else {
4722
- highlightDiv.style[camelProperty] = value;
8299
+ for (let i = 0; i < elements.length; i++) {
8300
+ if (!isElementHidden(elements[i])) {
8301
+ element = elements[i];
8302
+ break;
8303
+ }
8304
+ }
8305
+ if (!element) {
8306
+ element = elements[0];
8307
+ }
4723
8308
  }
4724
- });
4725
- element.scrollIntoView({ behavior: "smooth", block: "center" });
4726
- if (this.state.debugMode) {
4727
- const appliedStyles = Object.entries(stylesToApply).map(([k, v]) => "".concat(k, ": ").concat(v)).join("; ");
4728
- console.log("[TagadaClient] Applied styles to highlight div of element #".concat(elementId, ":"), appliedStyles);
4729
- }
8309
+ if (element) {
8310
+ applyToElement(element);
8311
+ }
8312
+ };
8313
+ findAndApply();
4730
8314
  }
4731
8315
  };
4732
8316
 
@@ -4941,6 +8525,29 @@ var TagadaTrackerBundle = (() => {
4941
8525
  }
4942
8526
  return __toCommonJS(external_tracker_exports);
4943
8527
  })();
8528
+ /*! Bundled license information:
8529
+
8530
+ detect-europe-js/dist/esm/index.js:
8531
+ (*! detectEurope.js v0.1.2
8532
+ Determine whether a user is from the European Union (EU) area
8533
+ https://github.com/faisalman/detect-europe-js
8534
+ Author: Faisal Salman <f@faisalman.com>
8535
+ MIT License *)
8536
+
8537
+ ua-is-frozen/dist/esm/index.js:
8538
+ (*! isFrozenUA
8539
+ A freeze-test for your user-agent string
8540
+ https://github.com/faisalman/ua-is-frozen
8541
+ Author: Faisal Salman <f@faisalman.com>
8542
+ MIT License *)
8543
+
8544
+ is-standalone-pwa/dist/esm/index.js:
8545
+ (*! isStandalonePWA 0.1.1
8546
+ Detect if PWA is running in standalone mode
8547
+ https://github.com/faisalman/is-standalone-pwa
8548
+ Author: Faisal Salman <f@faisalman.com>
8549
+ MIT License *)
8550
+ */
4944
8551
  // Expose TagadaTracker globally
4945
8552
  if (typeof window !== 'undefined' && TagadaTrackerBundle && TagadaTrackerBundle.TagadaTracker) {
4946
8553
  window.TagadaTracker = TagadaTrackerBundle.TagadaTracker;