Help
RSS
API
Feed
Maltego
Contact
Domain > www.relichunters.com
×
Welcome!
Right click nodes and scroll the mouse to navigate the graph.
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2023-07-18
2.17.196.137
(
ClassC
)
2025-01-08
162.241.2.122
(
ClassC
)
Port 443
HTTP/1.1 200 OKDate: Wed, 08 Jan 2025 15:15:39 GMTServer: ApacheLink: https://www.relichunters.com/wp-json/>; relhttps://api.w.org/, https://www.relichunters.com/wp-json/wp/v2/pages/70>; relalternate; titleJSON; typeapplication/json, https://www.relichunters.com/>; relshortlinkUpgrade: h2,h2cConnection: UpgradeVary: Accept-EncodingAccept-Ranges: noneTransfer-Encoding: chunkedContent-Type: text/html; charsetUTF-8 !DOCTYPE html>html langen-US>head> meta charsetUTF-8 /> link relshortcut icon hrefhttps://www.relichunters.com/wp-content/themes/cms/img/favicon.ico> meta http-equivX-UA-Compatible contentIEedge> meta nameviewport contentwidthdevice-width, initial-scale1, shrink-to-fitno> !-- monta o titulo da página --> title>Relic Hunters Legend | /title> script> var baseUrl https://www.relichunters.com/wp-content/themes/cms/; var homeUrl https://www.relichunters.com/; /script> script srchttps://cdn.jsdelivr.net/particles.js/2.0.0/particles.min.js>/script> !-- stats.js lib --> script srchttps://www.relichunters.com/wp-content/themes/cms/js/stats.min.js>/script> !-- Event snippet for Beta Sign Up conversion page In your html page, add the snippet and call gtag_report_conversion when someone clicks on the chosen link or button. --> script> /* function gtag_report_conversion(url) { var callback function () { if (typeof(url) ! undefined) { window.location url; } }; gtag(event, conversion, { send_to: AW-11027621174/B5CyCNKpiJYYELbKsIop, event_callback: callback }); return false; } */ /script> script typetext/javascript> !-- Wishlist conversion trackers --> /* document.addEventListener(readystatechange, event > { if (event.target.readystate interactive) { document.getElementById(wishlist-button).onclick function() { gtag_report_conversion(https://store.steampowered.com/app/633080/Relic_Hunters_Legend/); ttq.track(CompleteRegistration); fbq(track,CompleteRegistration); } } } ); */ /script> meta namerobots contentindex, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1 /> style>img:is(sizesauto i, sizes^auto, i) { contain-intrinsic-size: 3000px 1500px }/style> !-- This site is optimized with the Yoast SEO plugin v22.4 - https://yoast.com/wordpress/plugins/seo/ --> link relcanonical hrefhttps://www.relichunters.com/ /> meta propertyog:locale contenten_US /> meta propertyog:type contentwebsite /> meta propertyog:title contentHome - Relic Hunters Legend /> meta propertyog:url contenthttps://www.relichunters.com/ /> meta propertyog:site_name contentRelic Hunters Legend /> meta propertyarticle:modified_time content2023-04-13T02:23:24+00:00 /> meta nametwitter:card contentsummary_large_image /> script typeapplication/ld+json classyoast-schema-graph>{@context:https://schema.org,@graph:{@type:WebPage,@id:https://www.relichunters.com/,url:https://www.relichunters.com/,name:Home - Relic Hunters Legend,isPartOf:{@id:https://www.relichunters.com/#website},datePublished:2021-07-12T00:04:19+00:00,dateModified:2023-04-13T02:23:24+00:00,breadcrumb:{@id:https://www.relichunters.com/#breadcrumb},inLanguage:en-US,potentialAction:{@type:ReadAction,target:https://www.relichunters.com/}},{@type:BreadcrumbList,@id:https://www.relichunters.com/#breadcrumb,itemListElement:{@type:ListItem,position:1,name:Home}},{@type:WebSite,@id:https://www.relichunters.com/#website,url:https://www.relichunters.com/,name:Relic Hunters Legend,description:,potentialAction:{@type:SearchAction,target:{@type:EntryPoint,urlTemplate:https://www.relichunters.com/?s{search_term_string}},query-input:required namesearch_term_string},inLanguage:en-US}}/script> !-- / Yoast SEO plugin. -->link reldns-prefetch href//static.addtoany.com />link reldns-prefetch href//code.jquery.com />link reldns-prefetch href//cdnjs.cloudflare.com />link reldns-prefetch href//stackpath.bootstrapcdn.com />link reldns-prefetch href//cdn.jsdelivr.net />link reldns-prefetch href//maxcdn.bootstrapcdn.com />script typetext/javascript>/* !CDATA */window._wpemojiSettings {baseUrl:https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/,ext:.png,svgUrl:https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/svg\/,svgExt:.svg,source:{concatemoji:https:\/\/www.relichunters.com\/wp-includes\/js\/wp-emoji-release.min.js?ver6.7.1}};/*! This file is auto-generated */!function(i,n){var o,s,e;function c(e){try{var t{supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var tnew Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return ert})}function u(e,t,n){switch(t){caseflag:return n(e,\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f,\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f)?!1:!n(e,\ud83c\uddfa\ud83c\uddf3,\ud83c\uddfa\u200b\ud83c\uddf3)&&!n(e,\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f,\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f);caseemoji:return!n(e,\ud83d\udc26\u200d\u2b1b,\ud83d\udc26\u200b\u2b1b)}return!1}function f(e,t,n){var rundefined!typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement(canvas),ar.getContext(2d,{willReadFrequently:!0}),o(a.textBaselinetop,a.font600 32px Arial,{});return e.forEach(function(e){oet(a,e,n)}),o}function t(e){var ti.createElement(script);t.srce,t.defer!0,i.head.appendChild(t)}undefined!typeof Promise&&(owpEmojiSettingsSupports,sflag,emoji,n.supports{everything:!0,everythingExceptFlag:!0},enew Promise(function(e){i.addEventListener(DOMContentLoaded,e,{once:!0})}),new Promise(function(t){var nfunction(){try{var eJSON.parse(sessionStorage.getItem(o));if(objecttypeof e&&numbertypeof e.timestamp&&(new Date).valueOf()e.timestamp+604800&&objecttypeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if(undefined!typeof Worker&&undefined!typeof OffscreenCanvas&&undefined!typeof URL&&URL.createObjectURL&&undefined!typeof Blob)try{var epostMessage(+f.toString()+(+JSON.stringify(s),u.toString(),p.toString().join(,)+));,rnew Blob(e,{type:text/javascript}),anew Worker(URL.createObjectURL(r),{name:wpTestEmojiSupports});return void(a.onmessagefunction(e){c(ne.data),a.terminate(),t(n)})}catch(e){}c(nf(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supportstet,n.supports.everythingn.supports.everything&&n.supportst,flag!t&&(n.supports.everythingExceptFlagn.supports.everythingExceptFlag&&n.supportst);n.supports.everythingExceptFlagn.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady!1,n.readyCallbackfunction(){n.DOMReady!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(en.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings);/* > *//script>style idwp-emoji-styles-inline-css typetext/css> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; }/style>link relstylesheet idwp-block-library-css hrefhttps://www.relichunters.com/wp-includes/css/dist/block-library/style.min.css?ver6.7.1 typetext/css mediaall />style idclassic-theme-styles-inline-css typetext/css>/*! This file is auto-generated */.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}/style>style idglobal-styles-inline-css typetext/css>:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}/style>link relstylesheet idwp-pagenavi-css hrefhttps://www.relichunters.com/wp-content/plugins/wp-pagenavi/pagenavi-css.css?ver2.70 typetext/css mediaall />link relstylesheet idbootstrap-css hrefhttps://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css?ver6.7.1 typetext/css mediaall />link relstylesheet idfa-css hrefhttps://www.relichunters.com/wp-content/themes/cms/css/font-awesome.min.css?ver6.7.1 typetext/css mediaall />link relstylesheet idstyle-css hrefhttps://www.relichunters.com/wp-content/themes/cms/style.css?a90&ver6.7.1 typetext/css mediaall />link relstylesheet idowl-css hrefhttps://www.relichunters.com/wp-content/themes/cms/css/owl.carousel.min.css?ver6.7.1 typetext/css mediaall />link relstylesheet idowl_theme-css hrefhttps://www.relichunters.com/wp-content/themes/cms/css/owl.theme.default.min.css?ver6.7.1 typetext/css mediaall />link relstylesheet idslick-css hrefhttps://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css?ver6.7.1 typetext/css mediaall />link relstylesheet idslick2-css hrefhttps://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick-theme.css?ver6.7.1 typetext/css mediaall />link relstylesheet idanimate-css hrefhttps://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css?ver6.7.1 typetext/css mediaall />link relstylesheet idupw_theme_standard-css hrefhttps://www.relichunters.com/wp-content/plugins/ultimate-posts-widget/css/upw-theme-standard.min.css?ver6.7.1 typetext/css mediaall />link relstylesheet idaddtoany-css hrefhttps://www.relichunters.com/wp-content/plugins/add-to-any/addtoany.min.css?ver1.16 typetext/css mediaall />script typetext/javascript idaddtoany-core-js-before>/* !CDATA */window.a2a_configwindow.a2a_config||{};a2a_config.callbacks;a2a_config.overlays;a2a_config.templates{};/* > *//script>script typetext/javascript async srchttps://static.addtoany.com/menu/page.js idaddtoany-core-js>/script>script typetext/javascript srchttps://www.relichunters.com/wp-includes/js/jquery/jquery.min.js?ver3.7.1 idjquery-core-js>/script>script typetext/javascript srchttps://www.relichunters.com/wp-includes/js/jquery/jquery-migrate.min.js?ver3.4.1 idjquery-migrate-js>/script>script typetext/javascript async srchttps://www.relichunters.com/wp-content/plugins/add-to-any/addtoany.min.js?ver1.1 idaddtoany-jquery-js>/script>link relhttps://api.w.org/ hrefhttps://www.relichunters.com/wp-json/ />link relalternate titleJSON typeapplication/json hrefhttps://www.relichunters.com/wp-json/wp/v2/pages/70 />link relEditURI typeapplication/rsd+xml titleRSD hrefhttps://www.relichunters.com/xmlrpc.php?rsd />meta namegenerator contentWordPress 6.7.1 />link relshortlink hrefhttps://www.relichunters.com/ />link relalternate titleoEmbed (JSON) typeapplication/json+oembed hrefhttps://www.relichunters.com/wp-json/oembed/1.0/embed?urlhttps%3A%2F%2Fwww.relichunters.com%2F />link relalternate titleoEmbed (XML) typetext/xml+oembed hrefhttps://www.relichunters.com/wp-json/oembed/1.0/embed?urlhttps%3A%2F%2Fwww.relichunters.com%2F&formatxml />link relicon hrefhttps://www.relichunters.com/wp-content/uploads/2021/08/cropped-favicon-relic-32x32.png sizes32x32 />link relicon hrefhttps://www.relichunters.com/wp-content/uploads/2021/08/cropped-favicon-relic-192x192.png sizes192x192 />link relapple-touch-icon hrefhttps://www.relichunters.com/wp-content/uploads/2021/08/cropped-favicon-relic-180x180.png />meta namemsapplication-TileImage contenthttps://www.relichunters.com/wp-content/uploads/2021/08/cropped-favicon-relic-270x270.png /> /head>!-- Cookiebot -->script idCookiebot srchttps://consent.cookiebot.com/uc.js data-cbid3e7f5fd6-c8c4-42f3-8995-0b5eae80dd49 data-blockingmodeauto typetext/javascript>/script>!-- Google tag (gtag.js) -->script async srchttps://www.googletagmanager.com/gtag/js?idG-CD4BF78QG2>/script>script> window.dataLayer window.dataLayer || ; function gtag(){dataLayer.push(arguments);} gtag(js, new Date()); gtag(config, G-CD4BF78QG2);/script>!-- Google tag (gtag.js) -->script async srchttps://www.googletagmanager.com/gtag/js?idAW-11027621174>/script>script> window.dataLayer window.dataLayer || ; function gtag(){dataLayer.push(arguments);} gtag(js, new Date()); gtag(config, AW-11027621174);/script>!-- Meta Pixel Code -->script>!function(f,b,e,v,n,t,s){if(f.fbq)return;nf.fbqfunction(){n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbqn;n.pushn;n.loaded!0;n.version2.0;n.queue;tb.createElement(e);t.async!0;t.srcv;sb.getElementsByTagName(e)0;s.parentNode.insertBefore(t,s)}(window, document,script,https://connect.facebook.net/en_US/fbevents.js);fbq(init, 768972314477103);fbq(track, PageView);/script>noscript>img height1 width1 styledisplay:nonesrchttps://www.facebook.com/tr?id768972314477103&evPageView&noscript1/>/noscript>!-- End Meta Pixel Code -->script>!function (w, d, t) { w.TiktokAnalyticsObjectt;var ttqwtwt||;ttq.methodspage,track,identify,instances,debug,on,off,once,ready,alias,group,enableCookie,disableCookie,ttq.setAndDeferfunction(t,e){tefunction(){t.push(e.concat(Array.prototype.slice.call(arguments,0)))}};for(var i0;ittq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methodsi);ttq.instancefunction(t){for(var ettq._it||,n0;nttq.methods.length;n++)ttq.setAndDefer(e,ttq.methodsn);return e},ttq.loadfunction(e,n){var ihttps://analytics.tiktok.com/i18n/pixel/events.js;ttq._ittq._i||{},ttq._ie,ttq._ie._ui,ttq._tttq._t||{},ttq._te+new Date,ttq._ottq._o||{},ttq._oen||{};var odocument.createElement(script);o.typetext/javascript,o.async!0,o.srci+?sdkid+e+&lib+t;var adocument.getElementsByTagName(script)0;a.parentNode.insertBefore(o,a)}; ttq.load(CGM48TJC77U686OAFUAG); ttq.page();}(window, document, ttq);/script>body classhome page-template page-template-modelo-home page-template-modelo-home-php page page-id-70> script> var pageName home-2; /script> div idloading>/div> header idheader> div classcontainer p-0> div classd-flex justify-content-between align-items-center> a hrefhttps://www.relichunters.com> picture> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/logo-relic-hunters.png altHome - Relic Hunters Legend classlogo> /picture> /a> a hrefjavascript:; classclick-mobile d-lg-none d-flex flex-column justify-content-between align-items-end> div classline line1>/div> div classline line2>/div> div classline line3>/div> /a> div classwrap-menu> div classd-flex align-items-lg-center align-items-center flex-lg-row flex-column> nav idmenu> div classnavbar> ul idmenu-menu-1 classnav nav-pills>li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-122 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-122 dropdown>a titleGame hrefhttps://www.relichunters.com/game/ classdropdown-toggle aria-haspopuptrue classnav-link>Game span classcaret>/span>/a>ul rolemenu class dropdown-menu > li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-183 classmenu-item menu-item-type-custom menu-item-object-custom menu-item-183>a titleOVERVIEW hrefhttps://www.relichunters.com/game/#overview classnav-link>OVERVIEW/a>/li> li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-184 classmenu-item menu-item-type-custom menu-item-object-custom menu-item-184>a titleHUNTERS hrefhttps://www.relichunters.com/game/#hunters classnav-link>HUNTERS/a>/li> li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-185 classmenu-item menu-item-type-custom menu-item-object-custom menu-item-185>a titleSIGNS hrefhttps://www.relichunters.com/game/#signs classnav-link>SIGNS/a>/li> li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-187 classmenu-item menu-item-type-custom menu-item-object-custom menu-item-187>a titleITEMS hrefhttps://www.relichunters.com/game/#item classnav-link>ITEMS/a>/li> li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-188 classmenu-item menu-item-type-custom menu-item-object-custom menu-item-188>a titleWEAPONS hrefhttps://www.relichunters.com/game/#legendary-weapons classnav-link>WEAPONS/a>/li> li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-189 classmenu-item menu-item-type-custom menu-item-object-custom menu-item-189>a titleGAME MODES hrefhttps://www.relichunters.com/game/#game-mode classnav-link>GAME MODES/a>/li>/ul>/li>li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-144 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-144>a titleMedia hrefhttps://www.relichunters.com/media-2/ classnav-link>Media/a>/li>li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-180 classmenu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-180 dropdown>a titleCOMMUNITY classdropdown-toggle aria-haspopuptrue classnav-link>COMMUNITY span classcaret>/span>/a>ul rolemenu class dropdown-menu > li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-181 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-181>a titleFan Art hrefhttps://www.relichunters.com/secret-market/ classnav-link>Fan Art/a>/li> li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-182 classmenu-item menu-item-type-custom menu-item-object-custom menu-item-182>a titleDISCORD hrefhttp://discord.gg/relichunters classnav-link>DISCORD/a>/li>/ul>/li>li itemscopeitemscope itemtypehttps://www.schema.org/SiteNavigationElement idnav-item menu-item-136 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-136>a titleNews hrefhttps://www.relichunters.com/blog/ classnav-link>News/a>/li>/ul> /div> /nav> /div> div classd-flex-column d-lg-none> a hrefhttps://store.steampowered.com/app/633080/Relic_Hunters_Legend/ classbtn js_wishlist_button> PLAY NOW! /a> a hrefhttps://www.youtube.com/watch?vkjq_3tCqsSM classbtn> WATCH TRAILER /a> /div> /div> div classd-flex justify-content-center align-items-center> div classd-lg-flex d-none align-items-center> a hrefhttps://store.steampowered.com/app/633080/Relic_Hunters_Legend/ classbtn special js_wishlist_button> PLAY NOW! /a> a hrefhttps://www.youtube.com/watch?vkjq_3tCqsSM classbtn special> WATCH TRAILER /a> /div>!-- div classtranslate> div classtop d-flex align-items-center> img srchttps://www.relichunters.com/wp-content/themes/cms/img/ic-translate.svg altTranslate> span classarrow>/span> /div> div classoptions> a href> img srchttps://www.relichunters.com/wp-content/themes/cms/img/brasil.png altBrasil> /a> a href> img srchttps://www.relichunters.com/wp-content/themes/cms/img/usa.png altUSA> /a> /div> /div> --> /div> /div> /div> /header> div classmain> article idhome> section classpage-content> div idbanner classmain-banner> div classcontainer h-100 container-fixed> div classrow h-100> div classcol-12 h-100> div classd-flex flex-column align-items-center justify-content-center h-100> img classmain-image srchttps://www.relichunters.com/wp-content/themes/cms/img/relic-hunters-legenda.png altRelic Hunters Legend> div classbtns> div classd-flex align-items-center flex-md-row flex-column> a hrefhttps://store.steampowered.com/app/633080/Relic_Hunters_Legend/ classbtn js_wishlist_button> PLAY NOW! /a> a hrefhttps://www.youtube.com/watch?vkjq_3tCqsSM classbtn> WATCH TRAILER /a> /div> /div> /div> /div> /div> /div> div classwrap-carousel> div classowl-carousel> div classitem item-0> video srchttps://www.relichunters.com/wp-content/uploads/2022/04/bg_vid.mp4 autoplay loop muted altRelic Hunters Legend>/video> !--style> .item- { background-image: url(); } @media (max-width: 990px){ .item- { background-image: url(); } } /style>--> /div> /div> /div>/div> div idblock-adventure> div classtop> div classcontainer> div classjimmy-top>/div> div classflex-lg-row flex-column align-items-center> !--figure classfigure-top> img src/img/jimmy-home.png altJimmy> /figure>--> h2 styleline-height:0.2;>strong>Get ready for an awesome/strong>/h2>h2 styleline-height:0.2;>strong>looting and shooting/strong>/h2>h2 styleline-height:1;>Adventure!/h2> /div> /div> /div> div classmiddle> div classcontainer> div classmain-carousel> div classcarousel owl-carousel> div classitem> video srchttps://www.relichunters.com/wp-content/uploads/2023/04/Video-slider-next-gen-noaudio.mp4 altA Relic Hunter for every playstyle! posterhttps://www.relichunters.com/wp-content/uploads/2021/07/home-aventura-1.jpg muted idvideo-aventura>/video> !--figure> img src alt> /figure>--> div classwtext> span classtitle>A Relic Hunter for every playstyle! /span> !--div classtext>A Relic Hunter for every playstyle! /div>--> /div> /div> div classitem> video srchttps://www.relichunters.com/wp-content/uploads/2022/04/slider-friendship2.mp4 altA story of friendship, lost memories, and time travel! posterhttps://www.relichunters.com/wp-content/uploads/2021/07/home-aventura-2.jpg muted idvideo-aventura>/video> !--figure> img src alt> /figure>--> div classwtext> span classtitle>A story of friendship, lost memories, and time travel!/span> !--div classtext>A story of friendship, lost memories, and time travel!/div>--> /div> /div> div classitem> video srchttps://www.relichunters.com/wp-content/uploads/2021/08/Video-slider-RPG-System.mp4 altEasy to Learn, Fun to Master gameplay systems! posterhttps://www.relichunters.com/wp-content/uploads/2021/08/carousel-aventura.jpg muted idvideo-aventura>/video> !--figure> img src alt> /figure>--> div classwtext> span classtitle>Easy to Learn, Fun to Master gameplay systems!/span> !--div classtext>Easy to Learn, Fun to Master gameplay systems!/div>--> /div> /div> div classitem> video srchttps://www.relichunters.com/wp-content/uploads/2021/08/Video-slider-Online-for-up.mp4 altPlay Solo or online with up to 4 players! posterhttps://www.relichunters.com/wp-content/uploads/2021/07/home-aventura-3.jpg muted idvideo-aventura>/video> !--figure> img src alt> /figure>--> div classwtext> span classtitle>Play Solo or online with up to 4 players!/span> !--div classtext>Play Solo or online with up to 4 players!/div>--> /div> /div> /div> div classowl-nav> button typebutton rolepresentation classowl-prev> svg xmlnshttp://www.w3.org/2000/svg width24.729 height32.927 viewBox0 0 24.729 32.927>g idplay transformtranslate(-0.001)>g idGrupo_2 data-nameGrupo 2 transformtranslate(0.001)>path idCaminho_1 data-nameCaminho 1 dM63.342,13.406,81.632.885A4.465,4.465,0,0,1,84.035,0c1.368,0,2.214,1.1,2.214,2.935V30c0,1.835-.845,2.931-2.209,2.931a4.428,4.428,0,0,1-2.392-.887L63.348,19.52a3.754,3.754,0,0,1-1.828-3.057A3.741,3.741,0,0,1,63.342,13.406Z transformtranslate(-61.52) fill#fff>/path>/g>/g>/svg> /button> button typebutton rolepresentation classowl-next> svg xmlnshttp://www.w3.org/2000/svg width24.729 height32.927 viewBox0 0 24.729 32.927>g idplay transformtranslate(-0.001)>g idGrupo_2 data-nameGrupo 2 transformtranslate(0.001)>path idCaminho_1 data-nameCaminho 1 dM63.342,13.406,81.632.885A4.465,4.465,0,0,1,84.035,0c1.368,0,2.214,1.1,2.214,2.935V30c0,1.835-.845,2.931-2.209,2.931a4.428,4.428,0,0,1-2.392-.887L63.348,19.52a3.754,3.754,0,0,1-1.828-3.057A3.741,3.741,0,0,1,63.342,13.406Z transformtranslate(-61.52) fill#fff>/path>/g>/g>/svg> /button> /div> /div> div classthumb-carousel > div classowl-carousel> div classitem d-flex flex-column flex-lg-row align-items-center active> figure> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/home-aventura-1.jpg altA Relic Hunter for every playstyle! > /figure> div classwtext d-flex align-items-center> div classtext>A Relic Hunter for every playstyle! /div> /div> div classbar>span styletransition: all 7000ms linear data-time7000>/span>/div> /div> div classitem d-flex flex-column flex-lg-row align-items-center > figure> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/home-aventura-2.jpg altA story of friendship, lost memories, and time travel!> /figure> div classwtext d-flex align-items-center> div classtext>A story of friendship, lost memories, and time travel!/div> /div> div classbar>span styletransition: all 10000ms linear data-time10000>/span>/div> /div> div classitem d-flex flex-column flex-lg-row align-items-center > figure> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/carousel-aventura.jpg altEasy to Learn, Fun to Master gameplay systems!> /figure> div classwtext d-flex align-items-center> div classtext>Easy to Learn, Fun to Master gameplay systems!/div> /div> div classbar>span styletransition: all 7000ms linear data-time7000>/span>/div> /div> div classitem d-flex flex-column flex-lg-row align-items-center > figure> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/home-aventura-3.jpg altPlay Solo or online with up to 4 players!> /figure> div classwtext d-flex align-items-center> div classtext>Play Solo or online with up to 4 players!/div> /div> div classbar>span styletransition: all 7000ms linear data-time7000>/span>/div> /div> /div> /div> /div> /div>/div> div idrelic-hunters classrelic-hunters_ref> div classcontainer> div classrow> div classcol-12> h1>strong>THE/strong>br />RELIC HUNTERS/h1> div classtext> Play as Pinkyy, Jimmy, Raff, Ace, or the newest member, Seven, to help the Relic Hunters save the galaxy from the evil Duke Ducan! Customize your Hunter with a variety of personalization options, build a unique skill tree to compliment your playstyle, and eliminate those evil space ducks!br /> /div> /div> /div> div classcontent> div classrow align-items-start> div classcol-lg-6 col-12> div classthumbs> div classowl-carousel> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/biu-1.png altBiu> /div> span classtitle>Biu/span> div classbar>/div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/panzer-2.png altPanzer> /div> span classtitle>Panzer/span> div classbar>/div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/raff-1.png altRaff> /div> span classtitle>Raff/span> div classbar>/div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/ace-1.png altAce> /div> span classtitle>Ace/span> div classbar>/div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/jimmy-2.png altJimmy> /div> span classtitle>Jimmy/span> div classbar>/div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/pinkyy.png altPinkyy> /div> span classtitle>Pinkyy/span> div classbar>/div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/seven-1.png altSeven> /div> span classtitle>Seven/span> div classbar>/div> /div> /div> /div> div classd-lg-block d-none> div classdescription> div classowl-carousel> div classitem> div classwtitle> span classtitle>Biu/span> span classsubtitle>The Shapeshifting Scientist/span> /div> div classwtext> div classtext>p>Muscles AND brains. Allegedly Spaceheart’s Science officer, Biu really prefers working out over reading boring books about geology, archeology, topography, and other subjects he claims he’s already an expert in (he’s not). He is very keen on maintaining his “intellectual” persona, so he always keeps a book close to grab it and pretend to be …/p>/div> a hrefhttps://www.relichunters.com/personagem/biu/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Panzer/span> span classsubtitle>The Raging Mascot/span> /div> div classwtext> div classtext>p>Cute savagery. Panzer is Jimmy’s little sister, but she doesn’t seem to care much about this whole rebellion and relic hunting thing. Actually, we can’t really know for sure, since she talks little and growls a lot! Panzer behaves like a wild beast and she’s very aggressive and volatile. Panzer wears a Badger pajama, and …/p>/div> a hrefhttps://www.relichunters.com/personagem/panzer/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Raff/span> span classsubtitle>The Party Engineer/span> /div> div classwtext> div classtext>p>Raff is the Spaceheart’s chief engineer (only engineer, actually) with a passion for building and fixing things on, and off, the Spaceheart. Raff is also a talented DJ who enjoys working on her own gear listening to music on her headphones. Raff has definitely has some ‘tsundere’ tendencies when it comes to forging personal connections. …/p>/div> a hrefhttps://www.relichunters.com/personagem/raff/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Ace/span> span classsubtitle>The Rogue Donkey/span> /div> div classwtext> div classtext>p>Pilot of the Spaceheart and Pinkyy’s right hand, Ace is a big goof, flying the ship at top speeds and rounding tight corners just to watch his friends frantically buckle up their seatbelts. He also isn’t the tidiest guy; if you believe in spontaneous generation, you’ll think that Ace came from a pile of dirty …/p>/div> a hrefhttps://www.relichunters.com/personagem/ace/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Jimmy/span> span classsubtitle>The Crackshot Rebel/span> /div> div classwtext> div classtext>p>One man, one mission. Jimmy is resolutely focused on a single goal: overthrowing the oppressive regime of Duke Ducan. He is almost comically adherent to the action-hero archetype, always taking things seriously, and being mostly no-talk, all-action. He is an extremely capable fighter, with almost superhuman shooting skills. He is the most-wanted rebel in the …/p>/div> a hrefhttps://www.relichunters.com/personagem/jimmy/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Pinkyy/span> span classsubtitle>The Fearless Leader/span> /div> div classwtext> div classtext>p>The leader of the Relic Hunters: a free spirit and courage incarnate. Pinkyy never runs away from a fight, never leaves a friend behind, and never leaves food on her plate! Pinkyy’s goal in life is to become as powerful as her body and mind can handle and she is absolutely single-minded in her pursuit …/p>/div> a hrefhttps://www.relichunters.com/personagem/pinkyy/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Seven/span> span classsubtitle>The Mysterious Time Traveler/span> /div> div classwtext> div classtext>p>Everything about Seven is still a mystery for everyone… including themselves. Seven lost their memories and has now joined the Relic Hunters to remember their own story while uncovering the true past of the galaxy. Discover Seven’s purpose and the secrets behind their powers!/p>/div> a hrefhttps://www.relichunters.com/personagem/seven/ classbtn> FULL PROFILE /a> /div> /div> /div> /div> /div> /div> div classcol-lg-6 col-12> div classmain-carousel> div classowl-carousel> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/themes/cms/img/fundo_personagens.png altBiu classfundo> img srchttps://www.relichunters.com/wp-content/themes/cms/img/pontinhos_personagens.png altBiu classpontinhos> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/Biu.png altBiu classpersonagem> /div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/themes/cms/img/fundo_personagens.png altPanzer classfundo> img srchttps://www.relichunters.com/wp-content/themes/cms/img/pontinhos_personagens.png altPanzer classpontinhos> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/Panzer-1.png altPanzer classpersonagem> /div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/themes/cms/img/fundo_personagens.png altRaff classfundo> img srchttps://www.relichunters.com/wp-content/themes/cms/img/pontinhos_personagens.png altRaff classpontinhos> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/Raff.png altRaff classpersonagem> /div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/themes/cms/img/fundo_personagens.png altAce classfundo> img srchttps://www.relichunters.com/wp-content/themes/cms/img/pontinhos_personagens.png altAce classpontinhos> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/Ace.png altAce classpersonagem> /div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/themes/cms/img/fundo_personagens.png altJimmy classfundo> img srchttps://www.relichunters.com/wp-content/themes/cms/img/pontinhos_personagens.png altJimmy classpontinhos> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/Jimmy-1.png altJimmy classpersonagem> /div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/themes/cms/img/fundo_personagens.png altPinkyy classfundo> img srchttps://www.relichunters.com/wp-content/themes/cms/img/pontinhos_personagens.png altPinkyy classpontinhos> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/pinky.png altPinkyy classpersonagem> /div> /div> div classitem> div classimage-holder> img srchttps://www.relichunters.com/wp-content/themes/cms/img/fundo_personagens.png altSeven classfundo> img srchttps://www.relichunters.com/wp-content/themes/cms/img/pontinhos_personagens.png altSeven classpontinhos> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/seven.png altSeven classpersonagem> /div> /div> /div> /div> div classd-lg-none d-block> div classdescription> div classowl-carousel> div classitem> div classwtitle> span classtitle>Biu/span> span classsubtitle>The Shapeshifting Scientist/span> /div> div classwtext> div classtext>p>Muscles AND brains. Allegedly Spaceheart’s Science officer, Biu really prefers working out over reading boring books about geology, archeology, topography, and other subjects he claims he’s already an expert in (he’s not). He is very keen on maintaining his “intellectual” persona, so he always keeps a book close to grab it and pretend to be …/p>/div> a hrefhttps://www.relichunters.com/personagem/biu/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Panzer/span> span classsubtitle>The Raging Mascot/span> /div> div classwtext> div classtext>p>Cute savagery. Panzer is Jimmy’s little sister, but she doesn’t seem to care much about this whole rebellion and relic hunting thing. Actually, we can’t really know for sure, since she talks little and growls a lot! Panzer behaves like a wild beast and she’s very aggressive and volatile. Panzer wears a Badger pajama, and …/p>/div> a hrefhttps://www.relichunters.com/personagem/panzer/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Raff/span> span classsubtitle>The Party Engineer/span> /div> div classwtext> div classtext>p>Raff is the Spaceheart’s chief engineer (only engineer, actually) with a passion for building and fixing things on, and off, the Spaceheart. Raff is also a talented DJ who enjoys working on her own gear listening to music on her headphones. Raff has definitely has some ‘tsundere’ tendencies when it comes to forging personal connections. …/p>/div> a hrefhttps://www.relichunters.com/personagem/raff/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Ace/span> span classsubtitle>The Rogue Donkey/span> /div> div classwtext> div classtext>p>Pilot of the Spaceheart and Pinkyy’s right hand, Ace is a big goof, flying the ship at top speeds and rounding tight corners just to watch his friends frantically buckle up their seatbelts. He also isn’t the tidiest guy; if you believe in spontaneous generation, you’ll think that Ace came from a pile of dirty …/p>/div> a hrefhttps://www.relichunters.com/personagem/ace/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Jimmy/span> span classsubtitle>The Crackshot Rebel/span> /div> div classwtext> div classtext>p>One man, one mission. Jimmy is resolutely focused on a single goal: overthrowing the oppressive regime of Duke Ducan. He is almost comically adherent to the action-hero archetype, always taking things seriously, and being mostly no-talk, all-action. He is an extremely capable fighter, with almost superhuman shooting skills. He is the most-wanted rebel in the …/p>/div> a hrefhttps://www.relichunters.com/personagem/jimmy/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Pinkyy/span> span classsubtitle>The Fearless Leader/span> /div> div classwtext> div classtext>p>The leader of the Relic Hunters: a free spirit and courage incarnate. Pinkyy never runs away from a fight, never leaves a friend behind, and never leaves food on her plate! Pinkyy’s goal in life is to become as powerful as her body and mind can handle and she is absolutely single-minded in her pursuit …/p>/div> a hrefhttps://www.relichunters.com/personagem/pinkyy/ classbtn> FULL PROFILE /a> /div> /div> div classitem> div classwtitle> span classtitle>Seven/span> span classsubtitle>The Mysterious Time Traveler/span> /div> div classwtext> div classtext>p>Everything about Seven is still a mystery for everyone… including themselves. Seven lost their memories and has now joined the Relic Hunters to remember their own story while uncovering the true past of the galaxy. Discover Seven’s purpose and the secrets behind their powers!/p>/div> a hrefhttps://www.relichunters.com/personagem/seven/ classbtn> FULL PROFILE /a> /div> /div> /div> /div> /div> /div> /div> /div> div classcol-12> div classwbtns d-flex flex-lg-row flex-column justify-content-center align-items-center> a hrefhttp://www.roguesnail.com/press/sheet.php?prelic_hunters_legend classbtn btn-1> MORE ABOUT THE HUNTERS /a> a hrefhttps://store.steampowered.com/app/633080/Relic_Hunters_Legend/ classbtn btn-2 js_wishlist_button> PLAY NOW! /a> /div> /div> /div>/div> div idbanner-intermedium> div classcontainer> div classrow> div classcol-12> h2>There’s a Relic Hunter for everyone!/h2> /div> div classcol-lg-5 col-12>/div> div classcol-lg-7 col-12> div classside> p>Customize your chosen Hunter’s abilities and skills to enhance your personal playstyle!/p> video srchttps://www.relichunters.com/wp-content/uploads/2021/08/Video-intermediario.mp4 autoplay loop muted>/video> !--img src altPlay with your favorite Relic Hunter your own way>--> /div> /div> /div> /div> /div> div iditem> div idwcarousel_items> div classcontainer> h2>Collect parts to span classyellow>fuse and enhance/span>br />your equipment and weapons tobr />make them even span classpink>MORE better/span>!/h2> div classcarousel_main> div classowl-carousel> div classitem> div classd-flex align-items-center justify-content-center flex-lg-row flex-column> div classimage-holder>img srchttps://www.relichunters.com/wp-content/uploads/2021/07/alliance.jpg altAlliance>/div> div classwtext> div classtitle> Alliance /div> div classtext> p>strong>Type:/strong> Potionbr />strong>Tier:/strong> Legendary/p>p>strong>Description: /strong>br />Heals every Hunter in your party when you use it./p> /div> /div> /div> /div> div classitem> div classd-flex align-items-center justify-content-center flex-lg-row flex-column> div classimage-holder>img srchttps://www.relichunters.com/wp-content/uploads/2021/08/bullet_magnet.png altBullet Magnet>/div> div classwtext> div classtitle> Bullet Magnet /div> div classtext> p>strong>Type/strong>: span stylefont-weight: 400;>Light Shields/span>br />strong>Tier:/strong> Legendary/p>p>strong>Description:/strong>br />span stylefont-weight: 400;>Picking up Ammo gives you a damage buff for a few seconds./span>/p> /div> /div> /div> /div> div classitem> div classd-flex align-items-center justify-content-center flex-lg-row flex-column> div classimage-holder>img srchttps://www.relichunters.com/wp-content/uploads/2021/08/cardboard_gloves.png altStalker Gloves>/div> div classwtext> div classtitle> Stalker Gloves /div> div classtext> p>strong>Type/strong>: span stylefont-weight: 400;>Gloves/span>br />strong>Tier:/strong> Augmented/p>p>strong>Description:/strong>br />span stylefont-weight: 400;>Gain +5% damage each 10 seconds. This buff can stack up to 5 times. Taking any damage removes all stacks./span>/p> /div> /div> /div> /div> div classitem> div classd-flex align-items-center justify-content-center flex-lg-row flex-column> div classimage-holder>img srchttps://www.relichunters.com/wp-content/uploads/2021/08/jackeet_of_sandwichs.png altJacket of Sandwiches>/div> div classwtext> div classtitle> Jacket of Sandwiches /div> div classtext> p>span stylefont-weight: 400;>strong>Type:/strong> Light Clothes/span>br />strong>Tier:/strong> Legendary/p>p>strong>Description:/strong>br />Taking damage has a chance to spawn a Holo-Sandwich that will distract enemies near it./p> /div> /div> /div> /div> div classitem> div classd-flex align-items-center justify-content-center flex-lg-row flex-column> div classimage-holder>img srchttps://www.relichunters.com/wp-content/uploads/2021/08/Sash_placeholder.png altGuardians Sash>/div> div classwtext> div classtitle> Guardians Sash /div> div classtext> p>span stylefont-weight: 400;>strong>Type:/strong> Sash/span>br />strong>Tier:/strong> span stylefont-weight: 400;>Set Item/span>/p>p>strong>Description:/strong>br />span stylefont-weight: 400;>1-Piece: Increases Life /span>br />span stylefont-weight: 400;>2-Piece: Increases all Resistances/span>br />span stylefont-weight: 400;>3-Piece: Protects you from death and heals you for 20% of your total Life (this effect can only happen once every 5 minutes)/span>/p> /div> /div> /div> /div> /div> /div> div classcarousel_thumb> div classowl-carousel> a hrefjavascript:; classitem> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/alliance.jpg altAlliance> /a> a hrefjavascript:; classitem> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/bullet_magnet.png altBullet Magnet> /a> a hrefjavascript:; classitem> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/cardboard_gloves.png altStalker Gloves> /a> a hrefjavascript:; classitem> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/jackeet_of_sandwichs.png altJacket of Sandwiches> /a> a hrefjavascript:; classitem> img srchttps://www.relichunters.com/wp-content/uploads/2021/08/Sash_placeholder.png altGuardians Sash> /a> /div> /div> /div> /div> /div> div idgame-mode> div classcontainer> div classpanzer>/div> div classpinkyy>/div> div classrow> div classcol-12> h2>Skirmish, Scavenge, Defend,br />and Loot your way to strong>Victory/strong>!/h2> /div> /div> div classrow> div classcol-12 col-lg-5> aside classlist_mode> div classitem active> a hrefjavascript:; classtitle d-flex justify-content-between align-items-center> Skirmish span hrefjavascript:; classplus>/span> /a> div classwtext styledisplay: block;> div classtext> p>Move forward defeating all the enemies you encounter! Defeating enemies will fill your progress bar. After filling in the progress bar, enter the portal to go to the next round. Defeat the Champion in the final round to earn your rewards!/p> /div> /div> /div> div classitem > a hrefjavascript:; classtitle d-flex justify-content-between align-items-center> Scavenge span hrefjavascript:; classplus>/span> /a> div classwtext > div classtext> p>Capture the Excavation Points and don’t let the enemies control them. Standing inside the capture area will increase your progress bar – as long as there are no enemies contesting the area!/p> /div> /div> /div> div classitem > a hrefjavascript:; classtitle d-flex justify-content-between align-items-center> Payload span hrefjavascript:; classplus>/span> /a> div classwtext > div classtext> p>Capture the payload and guide it to the end of the level. Standing inside the capture area will make the Payload move (as long as there are no enemies contesting the area)./p> /div> /div> /div> div classitem > a hrefjavascript:; classtitle d-flex justify-content-between align-items-center> Defense span hrefjavascript:; classplus>/span> /a> div classwtext > div classtext> p>In Defense mode, you must protect your treasure chests from special enemies who will slowly move toward them! Special enemies are immune to damage unless you defeat all the regular enemies protecting them./p> /div> /div> /div> div classitem > a hrefjavascript:; classtitle d-flex justify-content-between align-items-center> Distraction span hrefjavascript:; classplus>/span> /a> div classwtext > div classtext> p>In Distraction mode, you need to keep the enemies alarmed by your presence while other Rebels complete their missions elsewhere! Fill up the Alert Meter by defeating enemies quickly. Be careful: A Special enemy will sometimes figure out your ruse and try to Call You Out to base. Defeat them before they do so! You get more rewards if you keep the Alert Meter high./p> /div> /div> /div> div classitem > a hrefjavascript:; classtitle d-flex justify-content-between align-items-center> Exploration span hrefjavascript:; classplus>/span> /a> div classwtext > div classtext> p>In exploration mode, you are free to explore the area as you please, defeating enemies and finding loot! Try to explore all the areas and find all chests. There are also dangerous Champion enemies lurking around, so be careful! You are free to leave the exploration areas anytime you want by interacting with the exit beacon./p> /div> /div> /div> div classitem > a hrefjavascript:; classtitle d-flex justify-content-between align-items-center> Delve span hrefjavascript:; classplus>/span> /a> div classwtext > div classtext> p>Welcome to Delve mode! You are free to explore this mini-Dungeon as you see fit, but this is a dangerous place! There are many Bosses you can defeat, and you may leave whenever you wish. But to challenge the final Boss, you will need to find a Boss Key. You have a limited number of lives. You will earn an extra Life for each Boss you defeat, and if you run out of lives the Mission is over./p> /div> /div> /div> /aside> /div> div classcol-12 col-lg-7> div classmain_carousel> div classowl-carousel data-plugin-options{items: 1, animateIn: flipInX}> div classitem> video srchttps://www.relichunters.com/wp-content/uploads/2023/04/Skirmish.mp4 altSkirmish autoplay loop muted>/video> !--img src alt>--> /div> div classitem> video srchttps://www.relichunters.com/wp-content/uploads/2023/04/Scavenge.mp4 altScavenge autoplay loop muted>/video> !--img src alt>--> /div> div classitem> video srchttps://www.relichunters.com/wp-content/uploads/2023/04/Payload.mp4 altPayload autoplay loop muted>/video> !--img src alt>--> /div> div classitem> video srchttps://www.relichunters.com/wp-content/uploads/2023/04/Defense.mp4 altDefense autoplay loop muted>/video> !--img src alt>--> /div> div classitem> video srchttps://www.relichunters.com/wp-content/uploads/2023/04/Distraction.mp4 altDistraction autoplay loop muted>/video> !--img src alt>--> /div> div classitem> video srchttps://www.relichunters.com/wp-content/uploads/2023/04/Exploration.mp4 altExploration autoplay loop muted>/video> !--img src alt>--> /div> div classitem> video srchttps://www.relichunters.com/wp-content/uploads/2023/04/Delve.mp4 altDelve autoplay loop muted>/video> !--img src alt>--> /div> /div> /div> /div> /div> /div> /div> div classwcontent-blog> div classwblog> div classcontainer> div classrow> div classcol-12> h2> BLOG strong> NEWS!/strong> /h2> /div> /div> div classwrap-blog> div classrow> div classcol-lg-4 col-12> div classitem> a hrefhttps://www.relichunters.com/blog/dev-blog-q1-2022/> div classpost> div classtitle>Dev Blog #Q1.2022/div> div classimg-holder> img srchttps://www.relichunters.com/wp-content/uploads/2022/04/DevQ1.jpg altDev Blog #Q1.2022> span classcategory>Updates/span> /div> /div> /a> /div> /div> div classcol-lg-4 col-12> div classitem> a hrefhttps://www.relichunters.com/blog/christmas-livestream-with-key-giveaway/> div classpost> div classtitle>Christmas Livestream with Key Giveaway/div> div classimg-holder> img srchttps://www.relichunters.com/wp-content/uploads/2022/04/Christmas.jpg altChristmas Livestream with Key Giveaway> span classcategory>NEWS/span> /div> /div> /a> /div> /div> div classcol-lg-4 col-12> div classitem> a hrefhttps://www.relichunters.com/blog/2021-recap-and-whats-next-for-relic-hunters-legend/> div classpost> div classtitle>2021 Recap and What’s next for Relic Hunters Legend/div> div classimg-holder> img srchttps://www.relichunters.com/wp-content/uploads/2022/04/Recap.jpg alt2021 Recap and What’s next for Relic Hunters Legend> span classcategory>NEWS/span> /div> /div> /a> /div> /div> /div> /div> a hrefhttps://www.relichunters.com/blog classbtn> VIEW ALL /a> /div> /div>/div> div idhunters-universe> div classtop> div classbiu>/div> h2>strong>Learn more about the/strong>br />Relic Hunters Universe!/h2> /div> div classcontent> div classcontainer> div classrow justify-content-center> div classcol-lg-3 col-12> div classitem> a hrefhttps://www.youtube.com/watch?vdFq3rzF9hHQ> div classimage-holder> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/animation.png altANIMATION> /div> div classtitle>ANIMATION/div> /a> /div> /div> div classcol-lg-3 col-12> div classitem> a hrefhttps://tapas.io/series/RelicHunters> div classimage-holder> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/comics.png altCOMICS> /div> div classtitle>COMICS/div> /a> /div> /div> div classcol-lg-3 col-12> div classitem> a hrefhttps://store.steampowered.com/app/382490/Relic_Hunters_Zero_Remix/> div classimage-holder> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/game.png altZERO:REMIX> /div> div classtitle>ZERO:REMIX/div> /a> /div> /div> div classcol-lg-3 col-12> div classitem> a hrefhttps://roguesnail.com/games/> div classimage-holder> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/discover.jpg altREBELS> /div> div classtitle>REBELS/div> /a> /div> /div> /div> /div> /div> /div> div idwishlist classd-flex align-items-center justify-content-center> a hrefhttps://store.steampowered.com/app/633080/Relic_Hunters_Legend/ classbtn-wishlist js_wishlist_button> PLAY NOW! /a> div classvideo-wishlist> video srchttps://www.relichunters.com/wp-content/uploads/2021/08/Site-Final-1.mp4 muted autoplay loop>/video> /div> /div> /section> /article> /div>!-- /.main --> footer idfooter> div classtop> div classcontainer> div classrow> div classcol-12> h2>strong>Stay up-to-date with the/strong>br />Relic Hunters’ adventures!/h2> div classtext> Sign up now to receive news, beta test announcements, exclusive content, and other updates on the Relic Hunters Universe. /div> /div> div classcol-12> div classwrap-form> script>(function() { window.mc4wp window.mc4wp || { listeners: , forms: { on: function(evt, cb) { window.mc4wp.listeners.push( { event : evt, callback: cb } ); } } }})();/script>!-- Mailchimp for WordPress v4.9.11 - https://wordpress.org/plugins/mailchimp-for-wp/ -->form idmc4wp-form-1 classmc4wp-form mc4wp-form-513 methodpost data-id513 data-nameRelic News >div classmc4wp-form-fields>p> label> input typeemail classemail-news nameEMAIL placeholderEnter your email address required /> /label> input typesubmit classbtn-news valueSubscribe />/p>/div>label styledisplay: none !important;>Leave this field empty if youre human: input typetext name_mc4wp_honeypot value tabindex-1 autocompleteoff />/label>input typehidden name_mc4wp_timestamp value1736349340 />input typehidden name_mc4wp_form_id value513 />input typehidden name_mc4wp_form_element_id valuemc4wp-form-1 />div classmc4wp-response>/div>/form>!-- / Mailchimp for WordPress Plugin --> /div> /div> div classcopyright-text> The Relic Hunters Legend newsletter is operated by Rogue Snail and is subject to Rogue Snails Privacy Policy. By signing up, you will receive news, promotional messages, and Relic Hunters Legend info from Rogue Snail. /div> /div> /div> /div> div classbottom> div classcontainer> div classrow>!-- div classcol-12> script idCookieDeclaration srchttps://consent.cookiebot.com/3e7f5fd6-c8c4-42f3-8995-0b5eae80dd49/cd.js typetext/javascript async>/script> /div>--> div classcol-12> div classtop-text>/div> div classsocial> div classd-flex justify-content-center align-items-center flex-wrap flex-lg-nowrap> a hrefhttps://www.facebook.com/RelicHuntersUniverse/ target_blank relnofollow titleVisit us on Facebook classd-flex align-items-center justify-content-center> figure> img srchttps://www.relichunters.com/wp-content/themes/cms/img/facebook-footer.svg altFacebook> /figure> /a> a hrefhttps://twitter.com/RelicHuntersU target_blank relnofollow titleVisit us on Twitter classd-flex align-items-center justify-content-center> figure> img srchttps://www.relichunters.com/wp-content/themes/cms/img/twitter-footer.svg altTwitter> /figure> /a> a hrefhttps://instagram.com/playrelichunters target_blank relnofollow titleVisit us on Instagram classd-flex align-items-center justify-content-center> figure> img srchttps://www.relichunters.com/wp-content/themes/cms/img/instagram-footer.svg altInstagram> /figure> /a> a hrefhttps://www.youtube.com/channel/UC493w4msxUdW7Eorjpuj6Mw target_blank relnofollow titleVisit us on YouTube classd-flex align-items-center justify-content-center> figure> img srchttps://www.relichunters.com/wp-content/themes/cms/img/youtube-footer.svg altYoutube> /figure> /a> a hrefhttps://www.twitch.tv/playrelichunters target_blank relnofollow titleVisit us on Twitch classd-flex align-items-center justify-content-center> figure> img srchttps://www.relichunters.com/wp-content/themes/cms/img/twitch-footer.svg altTwitch> /figure> /a> a hrefhttps://discord.com/invite/zpraCE8E9p target_blank relnofollow titleVisit us on Discord classd-flex align-items-center justify-content-center> figure> img srchttps://www.relichunters.com/wp-content/themes/cms/img/discord-footer.svg altDiscord> /figure> /a> /div> /div> /div> div classcol-12> div classd-flex flex-lg-row justify-content-center flex-column align-items-center> div classclassificacao> img srchttps://www.relichunters.com/wp-content/uploads/2023/05/ESRB-RP.png altESRB rated T for Violence and Suggestive Themes. In-Game Purchases.> /div> div classdiv> img srchttps://www.relichunters.com/wp-content/uploads/2021/07/logo-rogue.png altRogue Snail logo classlogo> div classcopyright-text> © 2022 Rogue Snail. All rights reserved. !-- © 2025 Rogue Snail. All rights reserved. -->!-- div> /div> --> /div> div classd-flex justify-content-lg-start justify-content-center align-items-center> a hrefhttps://www.gearboxpublishing.com/privacy/ classlink target_blank relnofollow> Privacy Notice /a> a hrefhttps://www.gearboxpublishing.com/terms/ classlink target_blank relnofollow> Terms of Service /a> a hrefhttps://www.relichunters.com/cookie-declaration/ classlink target_blank relnofollow> Cookie Declaration /a> /div> /div> /div> /div> /div> /div> /div> /footer> script>(function() {function maybePrefixUrlField () { const value this.value.trim() if (value ! && value.indexOf(http) ! 0) { this.value http:// + value }}const urlFields document.querySelectorAll(.mc4wp-form inputtypeurl)for (let j 0; j urlFields.length; j++) { urlFieldsj.addEventListener(blur, maybePrefixUrlField)}})();/script>script typetext/javascript srchttps://code.jquery.com/jquery-1.11.0.min.js?ver6.7.1 idjq-js>/script>script typetext/javascript srchttps://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js?ver6.7.1 idpopper-js>/script>script typetext/javascript srchttps://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js?ver6.7.1 idbootstrap-js>/script>script typetext/javascript srchttps://www.relichunters.com/wp-content/themes/cms/js/owl.carousel.min.js?ver6.7.1 idowl-js>/script>script typetext/javascript srchttps://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js?ver6.7.1 idslick-js>/script>script typetext/javascript idscripts-js-extra>/* !CDATA */var config {ajax_url:https:\/\/www.relichunters.com\/wp-admin\/admin-ajax.php,template_url:https:\/\/www.relichunters.com\/wp-content\/themes\/cms};/* > *//script>script typetext/javascript srchttps://www.relichunters.com/wp-content/themes/cms/js/scripts.js?ver6.7.1 idscripts-js>/script>script typetext/javascript srchttps://www.relichunters.com/wp-content/themes/cms/js/tools.js?q83&ver6.7.1 idtools-js>/script>script typetext/javascript defer srchttps://www.relichunters.com/wp-content/plugins/mailchimp-for-wp/assets/js/forms.js?ver4.9.11 idmc4wp-forms-api-js>/script> script>// jQuery(document).ready(function ($) {// // }); const wishlist_click_handler e > { if(google_tag_manager undefined) { return true; } e.preventDefault(); const url https://store.steampowered.com/app/633080/Relic_Hunters_Legend/; ttq.track(CompleteRegistration); // fbq(track, CompleteRegistration); - this is likely duplicated in GTM gtag(event, conversion, { send_to: AW-11027621174/B5CyCNKpiJYYELbKsIop, event_callback: () > { window.location url; } }); }; // const touchEvent ontouchstart in window ? touchstart : click; const touchEvent click; const els document.querySelectorAll(.js_wishlist_button); ...els.forEach(el > { el.addEventListener(click, wishlist_click_handler); }); /script>script>/** * AF Smart Script (Build 2.7.2) */function _iterableToArrayLimit(arr, i) { var _i null arr ? null : undefined ! typeof Symbol && arrSymbol.iterator || arr@@iterator; if (null ! _i) { var _s, _e, _x, _r, _arr , _n !0, _d !1; try { if (_x (_i _i.call(arr)).next, 0 i) { if (Object(_i) ! _i) return; _n !1; } else for (; !(_n (_s _x.call(_i)).done) && (_arr.push(_s.value), _arr.length ! i); _n !0); } catch (err) { _d !0, _e err; } finally { try { if (!_n && null ! _i.return && (_r _i.return(), Object(_r) ! _r)) return; } finally { if (_d) throw _e; } } return _arr; }}function ownKeys(object, enumerableOnly) { var keys Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols Object.getOwnPropertySymbols(object); enumerableOnly && (symbols symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys;}function _objectSpread2(target) { for (var i 1; i arguments.length; i++) { var source null ! argumentsi ? argumentsi : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, sourcekey); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target;}function _typeof(obj) { @babel/helpers - typeof; return _typeof function typeof Symbol && symbol typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && function typeof Symbol && obj.constructor Symbol && obj ! Symbol.prototype ? symbol : typeof obj; }, _typeof(obj);}function _defineProperty(obj, key, value) { key _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { objkey value; } return obj;}function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();}function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr;}function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o string) return _arrayLikeToArray(o, minLen); var n Object.prototype.toString.call(o).slice(8, -1); if (n Object && o.constructor) n o.constructor.name; if (n Map || n Set) return Array.from(o); if (n Arguments || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);}function _arrayLikeToArray(arr, len) { if (len null || len > arr.length) len arr.length; for (var i 0, arr2 new Array(len); i len; i++) arr2i arri; return arr2;}function _nonIterableRest() { throw new TypeError(Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a Symbol.iterator() method.);}function _toPrimitive(input, hint) { if (typeof input ! object || input null) return input; var prim inputSymbol.toPrimitive; if (prim ! undefined) { var res prim.call(input, hint || default); if (typeof res ! object) return res; throw new TypeError(@@toPrimitive must return a primitive value.); } return (hint string ? String : Number)(input);}function _toPropertyKey(arg) { var key _toPrimitive(arg, string); return typeof key symbol ? key : String(key);}var AF_URL_SCHEME (https:\\/\\/)((^\\.+).)(.*\\/)(.*);var VALID_AF_URL_PARTS_LENGTH 5;var GOOGLE_CLICK_ID gclid;var ASSOCIATED_AD_KEYWORD keyword;var AF_KEYWORDS af_keywords;var AF_CUSTOM_EXCLUDE_PARAMS_KEYS pid, c, af_channel, af_ad, af_adset, deep_link_value, af_sub1, af_sub2, af_sub3, af_sub4, af_sub5;var GCLID_EXCLUDE_PARAMS_KEYS pid, c, af_channel, af_ad, af_adset, deep_link_value;var LOCAL_STORAGE_VALUES { SS_WEB_REFERRER: ss_webReferrer};var isSkippedURL function isSkippedURL(_ref) { var url _ref.url, skipKeys _ref.skipKeys, errorMsg _ref.errorMsg; // search if this page referred and contains one of the given keys if (url) { var lowerURL url.toLowerCase(); if (lowerURL) { var skipKey skipKeys.find(function (key) { return lowerURL.includes(key.toLowerCase()); }); !!skipKey && console.debug(errorMsg, skipKey); return !!skipKey; } } return false;};var getGoogleClickIdParameters function getGoogleClickIdParameters(gciKey, currentURLParams) { var gciParam currentURLParamsGOOGLE_CLICK_ID; var result {}; if (gciParam) { console.debug(This user comes from Google AdWords); resultgciKey gciParam; var keywordParam currentURLParamsASSOCIATED_AD_KEYWORD; if (keywordParam) { console.debug(There is a keyword associated with the ad); resultAF_KEYWORDS keywordParam; } } else { console.debug(This user comes from SRN or custom network); } return result;};var stringifyParameters function stringifyParameters() { var parameters arguments.length > 0 && arguments0 ! undefined ? arguments0 : {}; var paramStr Object.keys(parameters).reduce(function (curr, key) { if (parameterskey) { curr + &.concat(key, ).concat(parameterskey); } return curr; }, ); console.debug(Generated OneLink parameters, paramStr); return paramStr;};var getParameterValue function getParameterValue(currentURLParams) { var config arguments.length > 1 && arguments1 ! undefined ? arguments1 : { keys: , overrideValues: {}, defaultValue: }; //exit when config object structure is not valid if (!(config ! null && config ! void 0 && config.keys && Array.isArray(config.keys) || config ! null && config ! void 0 && config.defaultValue)) { console.error(Parameter config structure is wrong, config); return null; } var _config$keys config.keys, keys _config$keys void 0 ? : _config$keys, _config$overrideValue config.overrideValues, overrideValues _config$overrideValue void 0 ? {} : _config$overrideValue, _config$defaultValue config.defaultValue, defaultValue _config$defaultValue void 0 ? : _config$defaultValue; var firstMatchedKey keys.find(function (key) { //set the first match of key which contains also a value return !!currentURLParamskey; }); if (firstMatchedKey) { var value currentURLParamsfirstMatchedKey; //in case the value exists: //check if it exists in the overrideValues object, when exists - replace it //otherwise return default value return overrideValuesvalue || value || defaultValue; } return defaultValue;};var isIOS function isIOS(useragent) { return /iphone|ipad|ipod/i.test(useragent && useragent.toLowerCase());};var isUACHSupported function isUACHSupported() { return (typeof navigator undefined ? undefined : _typeof(navigator)) object && userAgentData in navigator && getHighEntropyValues in navigator.userAgentData && !isIOS(navigator && navigator.userAgent);};var getQueryParamsAndSaveToLocalStorage function getQueryParamsAndSaveToLocalStorage(websiteUrl) { if (!websiteUrl) { console.debug(website doesnt exist + .concat(websiteUrl)); } try { var url new URL(websiteUrl); var urlParams new URLSearchParams(url.search); var queryParams Array.from(urlParams).reduce(function (acc, _ref2) { var _ref3 _slicedToArray(_ref2, 2), key _ref30, value _ref31; return _objectSpread2(_objectSpread2({}, acc), {}, _defineProperty({}, key, encodeURIComponent(value))); }, {}); var savedQueryParams JSON.parse(localStorage.getItem(ss_incoming_params) || ); var now new Date().getTime(); var twoHoursLater now + 2 * 60 * 60 * 1000; // Add 2 hours in milliseconds(product request) var dataToSave _objectSpread2(_objectSpread2({}, queryParams), {}, { af_ss_exp_at: twoHoursLater }); savedQueryParams.unshift(dataToSave); // we used unshift becuse the order matter localStorage.setItem(ss_incoming_params, JSON.stringify(savedQueryParams)); } catch (error) { console.debug(url isnt valid + .concat(error)); }};var isValidUrl function isValidUrl(urlString) { try { return Boolean(new URL(urlString)); } catch (e) { return false; }};var getCurrentUrl function getCurrentUrl() { return new URL(window.location.href);};var getReferrerUrl function getReferrerUrl() { var referrer document.referrer; return referrer ? new URL(referrer) : null;};var isSameOrigin function isSameOrigin(currentUrl, refUrl) { return currentUrl.origin refUrl.origin;};var saveWebReferrer function saveWebReferrer() { var currentUrl getCurrentUrl(); var refUrl getReferrerUrl(); if (refUrl && isSameOrigin(currentUrl, refUrl)) { console.warn(You navigate from the same website); return; } localStorage.setItem(LOCAL_STORAGE_VALUES.SS_WEB_REFERRER, JSON.stringify(document.referrer));};var removeExpiredLocalStorageItems function removeExpiredLocalStorageItems() { var currentTime arguments.length > 0 && arguments0 ! undefined ? arguments0 : Date.now(); var incomingParams JSON.parse(localStorage.getItem(ss_incoming_params) || ); localStorage.setItem(ss_incoming_params, JSON.stringify(incomingParams.filter(function (_ref4) { var af_ss_exp_at _ref4.af_ss_exp_at; return af_ss_exp_at > currentTime; })));};function aggregateValuesFromParameters() { var parameters arguments.length > 0 && arguments0 ! undefined ? arguments0 : ; var aggregateValues ; Object.values(parameters).forEach(function (value) { if (value && value.keys && Array.isArray(value.keys)) { value.keys.forEach(function (key) { return aggregateValues.push(key); }); } }); return aggregateValues;}function getCurrentURLParams(aggregateValues) { var currentURLParams {}; if (Object.keys(localStorage).includes(ss_incoming_params)) { var incomingParamsFromSS JSON.parse(localStoragess_incoming_params); currentURLParams incomingParamsFromSS.find(function (obj) { return aggregateValues.some(function (key) { return key in obj; }); }) || {}; } else { console.log(Key ss_incoming_params not found in localStorage.); } return currentURLParams;}var isOneLinkURLValid function isOneLinkURLValid(oneLinkURL) { var _ref5; var oneLinkURLParts (_ref5 oneLinkURL || ) null || _ref5 void 0 ? void 0 : _ref5.toString().match(AF_URL_SCHEME); if (!oneLinkURLParts || (oneLinkURLParts null || oneLinkURLParts void 0 ? void 0 : oneLinkURLParts.length) VALID_AF_URL_PARTS_LENGTH) { console.error(oneLinkURL is missing or not in the correct format, cant generate URL, oneLinkURL); return false; } return true;};var validatedMs function validatedMs() { var _mediaSource$keys; var mediaSource arguments.length > 0 && arguments0 ! undefined ? arguments0 : {}; if ((mediaSource null || mediaSource void 0 ? void 0 : (_mediaSource$keys mediaSource.keys) null || _mediaSource$keys void 0 ? void 0 : _mediaSource$keys.length) 0 && !(mediaSource ! null && mediaSource ! void 0 && mediaSource.defaultValue)) { console.error(mediaSource is missing (default value was not supplied), cant generate URL, mediaSource); return false; } return true;};var isSkipListsValid function isSkipListsValid(_ref6) { var _ref6$referrerSkipLis _ref6.referrerSkipList, referrerSkipList _ref6$referrerSkipLis void 0 ? : _ref6$referrerSkipLis, _ref6$urlSkipList _ref6.urlSkipList, urlSkipList _ref6$urlSkipList void 0 ? : _ref6$urlSkipList; if (isSkippedURL({ url: document.referrer, skipKeys: referrerSkipList, errorMsg: Generate url is skipped. HTTP referrer contains key: })) { return false; } if (isSkippedURL({ url: document.URL, skipKeys: urlSkipList, errorMsg: Generate url is skipped. URL contains string: })) { return false; } return true;};var extractCustomParams function extractCustomParams(_ref7) { var _ref7$afCustom _ref7.afCustom, afCustom _ref7$afCustom void 0 ? : _ref7$afCustom, _ref7$currentURLParam _ref7.currentURLParams, currentURLParams _ref7$currentURLParam void 0 ? {} : _ref7$currentURLParam, googleClickIdKey _ref7.googleClickIdKey; var afParams {}; if (Array.isArray(afCustom)) { afCustom.forEach(function (customParam) { if (customParam ! null && customParam ! void 0 && customParam.paramKey) { var isOverrideExistingKey AF_CUSTOM_EXCLUDE_PARAMS_KEYS.find(function (k) { return k (customParam null || customParam void 0 ? void 0 : customParam.paramKey); }); if ((customParam null || customParam void 0 ? void 0 : customParam.paramKey) googleClickIdKey || isOverrideExistingKey) { console.debug(Custom parameter ParamKey cant override Google-Click-Id or AF Parameters keys, customParam); } else { afParamscustomParam.paramKey getParameterValue(currentURLParams, customParam); } } }); } return afParams;};var validateAndMappedParams function validateAndMappedParams() { var params arguments.length > 0 && arguments0 ! undefined ? arguments0 : {}; var currentURLParams arguments.length > 1 && arguments1 ! undefined ? arguments1 : {}; var isDirectClick arguments.length > 2 && arguments2 ! undefined ? arguments2 : false; var mediaSource params.mediaSource, campaign params.campaign, channel params.channel, ad params.ad, adSet params.adSet, deepLinkValue params.deepLinkValue, afSub1 params.afSub1, afSub2 params.afSub2, afSub3 params.afSub3, afSub4 params.afSub4, afSub5 params.afSub5, afCustom params.afCustom, googleClickIdKey params.googleClickIdKey; var afParams {}; // Validates the URL and returns `true` if it should be skipped, `false` otherwise. if (mediaSource) { var pidValue getParameterValue(currentURLParams, mediaSource); if (!pidValue) { console.error(mediaSource was not found in the URL and default value was not supplied, cant generate URL, mediaSource); return null; } var pidParamKey isDirectClick ? af_media_source : pid; afParamspidParamKey pidValue; } if (campaign) { var campaignValue getParameterValue(currentURLParams, campaign); if (!campaignValue && isDirectClick) { console.error(campaign was not found in the URL and default value was not supplied, cant generate URL, campaign); return null; } if (isDirectClick) { afParamsaf_campaign campaignValue; afParamsaf_campaign_id campaignValue; } else { afParamsc campaignValue; } } if (channel) { afParamsaf_channel getParameterValue(currentURLParams, channel); } if (ad) { afParamsaf_ad getParameterValue(currentURLParams, ad); } if (adSet) { afParamsaf_adset getParameterValue(currentURLParams, adSet); } if (deepLinkValue) { afParamsdeep_link_value getParameterValue(currentURLParams, deepLinkValue); } var afSubs afSub1, afSub2, afSub3, afSub4, afSub5; afSubs.forEach(function (afSub, index) { if (afSub) { afParamsaf_sub.concat(index + 1) getParameterValue(currentURLParams, afSub); } }); if (googleClickIdKey) { if (GCLID_EXCLUDE_PARAMS_KEYS.find(function (k) { return k googleClickIdKey; })) { console.debug(Google Click Id ParamKey cant override AF Parameters keys, googleClickIdKey); } else { var googleParameters getGoogleClickIdParameters(googleClickIdKey, currentURLParams); Object.keys(googleParameters).forEach(function (gpk) { afParamsgpk googleParametersgpk; }); } } var customParams extractCustomParams({ afCustom: afCustom, currentURLParams: currentURLParams, googleClickIdKey: googleClickIdKey }); return _objectSpread2(_objectSpread2({}, afParams), customParams);};var isPlatformValid function isPlatformValid(platform) { if (!platform) { console.error(platform is missing , cant generate URL, platform); return false; } var platforms smartcast, tizen, roku, webos, vidaa, playstation, android, ios, steam, quest, battlenet, epic, switch, xbox, nativepc; if (!platforms.includes(platform.toLowerCase())) { console.error(platform need to be part of the known platforms supoorted); return false; } return true;};function getUserAgentData() { return new Promise(function (resolve) { if (isUACHSupported()) { navigator.userAgentData.getHighEntropyValues(model, platformVersion).then(function (clientHints) { resolve({ model: clientHints.model, platformVersion: clientHints.platformVersion }); })catch(function () { resolve(); }); } else { resolve(); } });}var createImpressionsLink function createImpressionsLink(finalURL) { if (!finalURL) { console.debug(ClickURL is not valid); return null; } return new Promise(function (resolve) { getUserAgentData().then(function (userAgentData) { var url new URL(finalURL); url.hostname impressions.onelink.me; if (userAgentData) { url.pathname /ch.concat(url.pathname); url.searchParams.append(af_ch_model, encodeURIComponent(userAgentData.model)); url.searchParams.append(af_ch_os_version, encodeURIComponent(userAgentData.platformVersion)); } resolve(url.href); })catch(function () { resolve(); }); });};function getHexColorAfterValidation(color) { var colorRegex /^#(A-Fa-f0-9{6}|A-Fa-f0-9{3})$/; return colorRegex.test(color) ? color : #000;}/** * EasyQRCodeJS * * Cross-browser QRCode generator for pure javascript. Support Canvas, SVG and Table drawing methods. Support Dot style, Logo, Background image, Colorful, Title etc. settings. Support Angular, Vue.js, React, Next.js, Svelte framework. Support binary(hex) data mode.(Running with DOM on client side) * * Version 4.4.10 * * @author inthinkcolor@gmail.com * * @see https://github.com/ushelp/EasyQRCodeJS * @see http://www.easyproject.cn/easyqrcodejs/tryit.html * @see https://github.com/ushelp/EasyQRCodeJS-NodeJS * * Copyright 2017 Ray, EasyProject * Released under the MIT license * * Support AMD, CMD, CommonJS/Node.js * */function QRCode() { // 自定义局部 undefined å˜é‡ var undefined$1; /** Node.js global 检测. */ var freeGlobal (typeof global undefined ? undefined : _typeof(global)) object && global && global.Object Object && global; /** `self` å˜é‡æ£€æµ‹. */ var freeSelf (typeof self undefined ? undefined : _typeof(self)) object && self && self.Object Object && self; /** 全局对象检测. */ var root freeGlobal || freeSelf || Function(return this)(); /** `exports` å˜é‡æ£€æµ‹. */ var freeExports (typeof exports undefined ? undefined : _typeof(exports)) object && exports && !exports.nodeType && exports; /** `module` å˜é‡æ£€æµ‹. */ var freeModule freeExports && (typeof module undefined ? undefined : _typeof(module)) object && module && !module.nodeType && module; var _QRCode root.QRCode; var QRCode; function QR8bitByte(data, binary, utf8WithoutBOM) { this.mode QRMode.MODE_8BIT_BYTE; this.data data; this.parsedData ; // Added to support UTF-8 Characters for (var i 0, l this.data.length; i l; i++) { var byteArray ; var code this.data.charCodeAt(i); if (binary) { byteArray0 code; } else { if (code > 0x10000) { byteArray0 0xf0 | (code & 0x1c0000) >>> 18; byteArray1 0x80 | (code & 0x3f000) >>> 12; byteArray2 0x80 | (code & 0xfc0) >>> 6; byteArray3 0x80 | code & 0x3f; } else if (code > 0x800) { byteArray0 0xe0 | (code & 0xf000) >>> 12; byteArray1 0x80 | (code & 0xfc0) >>> 6; byteArray2 0x80 | code & 0x3f; } else if (code > 0x80) { byteArray0 0xc0 | (code & 0x7c0) >>> 6; byteArray1 0x80 | code & 0x3f; } else { byteArray0 code; } } this.parsedData.push(byteArray); } this.parsedData Array.prototype.concat.apply(, this.parsedData); if (!utf8WithoutBOM && this.parsedData.length ! this.data.length) { this.parsedData.unshift(191); this.parsedData.unshift(187); this.parsedData.unshift(239); } } QR8bitByte.prototype { getLength: function getLength(buffer) { return this.parsedData.length; }, write: function write(buffer) { for (var i 0, l this.parsedData.length; i l; i++) { buffer.put(this.parsedDatai, 8); } } }; function QRCodeModel(typeNumber, errorCorrectLevel) { this.typeNumber typeNumber; this.errorCorrectLevel errorCorrectLevel; this.modules null; this.moduleCount 0; this.dataCache null; this.dataList ; } QRCodeModel.prototype { addData: function addData(data, binary, utf8WithoutBOM) { var newData new QR8bitByte(data, binary, utf8WithoutBOM); this.dataList.push(newData); this.dataCache null; }, isDark: function isDark(row, col) { if (row 0 || this.moduleCount row || col 0 || this.moduleCount col) { throw new Error(row + , + col); } return this.modulesrowcol0; }, getEye: function getEye(row, col) { if (row 0 || this.moduleCount row || col 0 || this.moduleCount col) { throw new Error(row + , + col); } var block this.modulesrowcol; // isDark(ture/false), EyeOuterOrInner(O/I), Position(TL/TR/BL/A) if (block1) { var type P + block1 + _ + block2; //PO_TL, PI_TL, PO_TR, PI_TR, PO_BL, PI_BL if (block2 A) { type A + block1; // AI, AO } return { isDark: block0, type: type }; } else { return null; } }, getModuleCount: function getModuleCount() { return this.moduleCount; }, make: function make() { this.makeImpl(false, this.getBestMaskPattern()); }, makeImpl: function makeImpl(test, maskPattern) { this.moduleCount this.typeNumber * 4 + 17; this.modules new Array(this.moduleCount); for (var row 0; row this.moduleCount; row++) { this.modulesrow new Array(this.moduleCount); for (var col 0; col this.moduleCount; col++) { this.modulesrowcol ; // isDark(ture/false), EyeOuterOrInner(O/I), Position(TL/TR/BL) } } this.setupPositionProbePattern(0, 0, TL); // TopLeft, TL this.setupPositionProbePattern(this.moduleCount - 7, 0, BL); // BotoomLeft, BL this.setupPositionProbePattern(0, this.moduleCount - 7, TR); // TopRight, TR this.setupPositionAdjustPattern(A); // Alignment, A this.setupTimingPattern(); this.setupTypeInfo(test, maskPattern); if (this.typeNumber > 7) { this.setupTypeNumber(test); } if (this.dataCache null) { this.dataCache QRCodeModel.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); } this.mapData(this.dataCache, maskPattern); }, setupPositionProbePattern: function setupPositionProbePattern(row, col, posName) { for (var r -1; r 7; r++) { if (row + r -1 || this.moduleCount row + r) continue; for (var c -1; c 7; c++) { if (col + c -1 || this.moduleCount col + c) continue; if (0 r && r 6 && (c 0 || c 6) || 0 c && c 6 && (r 0 || r 6) || 2 r && r 4 && 2 c && c 4) { this.modulesrow + rcol + c0 true; this.modulesrow + rcol + c2 posName; // Position if (r -0 || c -0 || r 6 || c 6) { this.modulesrow + rcol + c1 O; // Position Outer } else { this.modulesrow + rcol + c1 I; // Position Inner } } else { this.modulesrow + rcol + c0 false; } } } }, getBestMaskPattern: function getBestMaskPattern() { var minLostPoint 0; var pattern 0; for (var i 0; i 8; i++) { this.makeImpl(true, i); var lostPoint QRUtil.getLostPoint(this); if (i 0 || minLostPoint > lostPoint) { minLostPoint lostPoint; pattern i; } } return pattern; }, createMovieClip: function createMovieClip(target_mc, instance_name, depth) { var qr_mc target_mc.createEmptyMovieClip(instance_name, depth); var cs 1; this.make(); for (var row 0; row this.modules.length; row++) { var y row * cs; for (var col 0; col this.modulesrow.length; col++) { var x col * cs; var dark this.modulesrowcol0; if (dark) { qr_mc.beginFill(0, 100); qr_mc.moveTo(x, y); qr_mc.lineTo(x + cs, y); qr_mc.lineTo(x + cs, y + cs); qr_mc.lineTo(x, y + cs); qr_mc.endFill(); } } } return qr_mc; }, setupTimingPattern: function setupTimingPattern() { for (var r 8; r this.moduleCount - 8; r++) { if (this.modulesr60 ! null) { continue; } this.modulesr60 r % 2 0; } for (var c 8; c this.moduleCount - 8; c++) { if (this.modules6c0 ! null) { continue; } this.modules6c0 c % 2 0; } }, setupPositionAdjustPattern: function setupPositionAdjustPattern(posName) { var pos QRUtil.getPatternPosition(this.typeNumber); for (var i 0; i pos.length; i++) { for (var j 0; j pos.length; j++) { var row posi; var col posj; if (this.modulesrowcol0 ! null) { continue; } for (var r -2; r 2; r++) { for (var c -2; c 2; c++) { if (r -2 || r 2 || c -2 || c 2 || r 0 && c 0) { this.modulesrow + rcol + c0 true; this.modulesrow + rcol + c2 posName; // Position if (r -2 || c -2 || r 2 || c 2) { this.modulesrow + rcol + c1 O; // Position Outer } else { this.modulesrow + rcol + c1 I; // Position Inner } } else { this.modulesrow + rcol + c0 false; } } } } } }, setupTypeNumber: function setupTypeNumber(test) { var bits QRUtil.getBCHTypeNumber(this.typeNumber); for (var i 0; i 18; i++) { var mod !test && (bits >> i & 1) 1; this.modulesMath.floor(i / 3)i % 3 + this.moduleCount - 8 - 30 mod; } for (var i 0; i 18; i++) { var mod !test && (bits >> i & 1) 1; this.modulesi % 3 + this.moduleCount - 8 - 3Math.floor(i / 3)0 mod; } }, setupTypeInfo: function setupTypeInfo(test, maskPattern) { var data this.errorCorrectLevel 3 | maskPattern; var bits QRUtil.getBCHTypeInfo(data); for (var i 0; i 15; i++) { var mod !test && (bits >> i & 1) 1; if (i 6) { this.modulesi80 mod; } else if (i 8) { this.modulesi + 180 mod; } else { this.modulesthis.moduleCount - 15 + i80 mod; } } for (var i 0; i 15; i++) { var mod !test && (bits >> i & 1) 1; if (i 8) { this.modules8this.moduleCount - i - 10 mod; } else if (i 9) { this.modules815 - i - 1 + 10 mod; } else { this.modules815 - i - 10 mod; } } this.modulesthis.moduleCount - 880 !test; }, mapData: function mapData(data, maskPattern) { var inc -1; var row this.moduleCount - 1; var bitIndex 7; var byteIndex 0; for (var col this.moduleCount - 1; col > 0; col - 2) { if (col 6) col--; while (true) { for (var c 0; c 2; c++) { if (this.modulesrowcol - c0 null) { var dark false; if (byteIndex data.length) { dark (databyteIndex >>> bitIndex & 1) 1; } var mask QRUtil.getMask(maskPattern, row, col - c); if (mask) { dark !dark; } this.modulesrowcol - c0 dark; bitIndex--; if (bitIndex -1) { byteIndex++; bitIndex 7; } } } row + inc; if (row 0 || this.moduleCount row) { row - inc; inc -inc; break; } } } } }; QRCodeModel.PAD0 0xec; QRCodeModel.PAD1 0x11; QRCodeModel.createData function (typeNumber, errorCorrectLevel, dataList) { var rsBlocks QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); var buffer new QRBitBuffer(); for (var i 0; i dataList.length; i++) { var data dataListi; buffer.put(data.mode, 4); buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); data.write(buffer); } var totalDataCount 0; for (var i 0; i rsBlocks.length; i++) { totalDataCount + rsBlocksi.dataCount; } if (buffer.getLengthInBits() > totalDataCount * 8) { throw new Error(code length overflow. ( + buffer.getLengthInBits() + > + totalDataCount * 8 + )); } if (buffer.getLengthInBits() + 4 totalDataCount * 8) { buffer.put(0, 4); } while (buffer.getLengthInBits() % 8 ! 0) { buffer.putBit(false); } while (true) { if (buffer.getLengthInBits() > totalDataCount * 8) { break; } buffer.put(QRCodeModel.PAD0, 8); if (buffer.getLengthInBits() > totalDataCount * 8) { break; } buffer.put(QRCodeModel.PAD1, 8); } return QRCodeModel.createBytes(buffer, rsBlocks); }; QRCodeModel.createBytes function (buffer, rsBlocks) { var offset 0; var maxDcCount 0; var maxEcCount 0; var dcdata new Array(rsBlocks.length); var ecdata new Array(rsBlocks.length); for (var r 0; r rsBlocks.length; r++) { var dcCount rsBlocksr.dataCount; var ecCount rsBlocksr.totalCount - dcCount; maxDcCount Math.max(maxDcCount, dcCount); maxEcCount Math.max(maxEcCount, ecCount); dcdatar new Array(dcCount); for (var i 0; i dcdatar.length; i++) { dcdatari 0xff & buffer.bufferi + offset; } offset + dcCount; var rsPoly QRUtil.getErrorCorrectPolynomial(ecCount); var rawPoly new QRPolynomial(dcdatar, rsPoly.getLength() - 1); var modPoly rawPoly.mod(rsPoly); ecdatar new Array(rsPoly.getLength() - 1); for (var i 0; i ecdatar.length; i++) { var modIndex i + modPoly.getLength() - ecdatar.length; ecdatari modIndex > 0 ? modPoly.get(modIndex) : 0; } } var totalCodeCount 0; for (var i 0; i rsBlocks.length; i++) { totalCodeCount + rsBlocksi.totalCount; } var data new Array(totalCodeCount); var index 0; for (var i 0; i maxDcCount; i++) { for (var r 0; r rsBlocks.length; r++) { if (i dcdatar.length) { dataindex++ dcdatari; } } } for (var i 0; i maxEcCount; i++) { for (var r 0; r rsBlocks.length; r++) { if (i ecdatar.length) { dataindex++ ecdatari; } } } return data; }; var QRMode { MODE_NUMBER: 1 0, MODE_ALPHA_NUM: 1 1, MODE_8BIT_BYTE: 1 2, MODE_KANJI: 1 3 }; var QRErrorCorrectLevel { L: 1, M: 0, Q: 3, H: 2 }; var QRMaskPattern { PATTERN000: 0, PATTERN001: 1, PATTERN010: 2, PATTERN011: 3, PATTERN100: 4, PATTERN101: 5, PATTERN110: 6, PATTERN111: 7 }; var QRUtil { PATTERN_POSITION_TABLE: , 6, 18, 6, 22, 6, 26, 6, 30, 6, 34, 6, 22, 38, 6, 24, 42, 6, 26, 46, 6, 28, 50, 6, 30, 54, 6, 32, 58, 6, 34, 62, 6, 26, 46, 66, 6, 26, 48, 70, 6, 26, 50, 74, 6, 30, 54, 78, 6, 30, 56, 82, 6, 30, 58, 86, 6, 34, 62, 90, 6, 28, 50, 72, 94, 6, 26, 50, 74, 98, 6, 30, 54, 78, 102, 6, 28, 54, 80, 106, 6, 32, 58, 84, 110, 6, 30, 58, 86, 114, 6, 34, 62, 90, 118, 6, 26, 50, 74, 98, 122, 6, 30, 54, 78, 102, 126, 6, 26, 52, 78, 104, 130, 6, 30, 56, 82, 108, 134, 6, 34, 60, 86, 112, 138, 6, 30, 58, 86, 114, 142, 6, 34, 62, 90, 118, 146, 6, 30, 54, 78, 102, 126, 150, 6, 24, 50, 76, 102, 128, 154, 6, 28, 54, 80, 106, 132, 158, 6, 32, 58, 84, 110, 136, 162, 6, 26, 54, 82, 110, 138, 166, 6, 30, 58, 86, 114, 142, 170, G15: 1 10 | 1 8 | 1 5 | 1 4 | 1 2 | 1 1 | 1 0, G18: 1 12 | 1 11 | 1 10 | 1 9 | 1 8 | 1 5 | 1 2 | 1 0, G15_MASK: 1 14 | 1 12 | 1 10 | 1 4 | 1 1, getBCHTypeInfo: function getBCHTypeInfo(data) { var d data 10; while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) > 0) { d ^ QRUtil.G15 QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15); } return (data 10 | d) ^ QRUtil.G15_MASK; }, getBCHTypeNumber: function getBCHTypeNumber(data) { var d data 12; while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) > 0) { d ^ QRUtil.G18 QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18); } return data 12 | d; }, getBCHDigit: function getBCHDigit(data) { var digit 0; while (data ! 0) { digit++; data >>> 1; } return digit; }, getPatternPosition: function getPatternPosition(typeNumber) { return QRUtil.PATTERN_POSITION_TABLEtypeNumber - 1; }, getMask: function getMask(maskPattern, i, j) { switch (maskPattern) { case QRMaskPattern.PATTERN000: return (i + j) % 2 0; case QRMaskPattern.PATTERN001: return i % 2 0; case QRMaskPattern.PATTERN010: return j % 3 0; case QRMaskPattern.PATTERN011: return (i + j) % 3 0; case QRMaskPattern.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 0; case QRMaskPattern.PATTERN101: return i * j % 2 + i * j % 3 0; case QRMaskPattern.PATTERN110: return (i * j % 2 + i * j % 3) % 2 0; case QRMaskPattern.PATTERN111: return (i * j % 3 + (i + j) % 2) % 2 0; default: throw new Error(bad maskPattern: + maskPattern); } }, getErrorCorrectPolynomial: function getErrorCorrectPolynomial(errorCorrectLength) { var a new QRPolynomial(1, 0); for (var i 0; i errorCorrectLength; i++) { a a.multiply(new QRPolynomial(1, QRMath.gexp(i), 0)); } return a; }, getLengthInBits: function getLengthInBits(mode, type) { if (1 type && type 10) { switch (mode) { case QRMode.MODE_NUMBER: return 10; case QRMode.MODE_ALPHA_NUM: return 9; case QRMode.MODE_8BIT_BYTE: return 8; case QRMode.MODE_KANJI: return 8; default: throw new Error(mode: + mode); } } else if (type 27) { switch (mode) { case QRMode.MODE_NUMBER: return 12; case QRMode.MODE_ALPHA_NUM: return 11; case QRMode.MODE_8BIT_BYTE: return 16; case QRMode.MODE_KANJI: return 10; default: throw new Error(mode: + mode); } } else if (type 41) { switch (mode) { case QRMode.MODE_NUMBER: return 14; case QRMode.MODE_ALPHA_NUM: return 13; case QRMode.MODE_8BIT_BYTE: return 16; case QRMode.MODE_KANJI: return 12; default: throw new Error(mode: + mode); } } else { throw new Error(type: + type); } }, getLostPoint: function getLostPoint(qrCode) { var moduleCount qrCode.getModuleCount(); var lostPoint 0; for (var row 0; row moduleCount; row++) { for (var col 0; col moduleCount; col++) { var sameCount 0; var dark qrCode.isDark(row, col); for (var r -1; r 1; r++) { if (row + r 0 || moduleCount row + r) { continue; } for (var c -1; c 1; c++) { if (col + c 0 || moduleCount col + c) { continue; } if (r 0 && c 0) { continue; } if (dark qrCode.isDark(row + r, col + c)) { sameCount++; } } } if (sameCount > 5) { lostPoint + 3 + sameCount - 5; } } } for (var row 0; row moduleCount - 1; row++) { for (var col 0; col moduleCount - 1; col++) { var count 0; if (qrCode.isDark(row, col)) count++; if (qrCode.isDark(row + 1, col)) count++; if (qrCode.isDark(row, col + 1)) count++; if (qrCode.isDark(row + 1, col + 1)) count++; if (count 0 || count 4) { lostPoint + 3; } } } for (var row 0; row moduleCount; row++) { for (var col 0; col moduleCount - 6; col++) { if (qrCode.isDark(row, col) && !qrCode.isDark(row, col + 1) && qrCode.isDark(row, col + 2) && qrCode.isDark(row, col + 3) && qrCode.isDark(row, col + 4) && !qrCode.isDark(row, col + 5) && qrCode.isDark(row, col + 6)) { lostPoint + 40; } } } for (var col 0; col moduleCount; col++) { for (var row 0; row moduleCount - 6; row++) { if (qrCode.isDark(row, col) && !qrCode.isDark(row + 1, col) && qrCode.isDark(row + 2, col) && qrCode.isDark(row + 3, col) && qrCode.isDark(row + 4, col) && !qrCode.isDark(row + 5, col) && qrCode.isDark(row + 6, col)) { lostPoint + 40; } } } var darkCount 0; for (var col 0; col moduleCount; col++) { for (var row 0; row moduleCount; row++) { if (qrCode.isDark(row, col)) { darkCount++; } } } var ratio Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; lostPoint + ratio * 10; return lostPoint; } }; var QRMath { glog: function glog(n) { if (n 1) { throw new Error(glog( + n + )); } return QRMath.LOG_TABLEn; }, gexp: function gexp(n) { while (n 0) { n + 255; } while (n > 256) { n - 255; } return QRMath.EXP_TABLEn; }, EXP_TABLE: new Array(256), LOG_TABLE: new Array(256) }; for (var i 0; i 8; i++) { QRMath.EXP_TABLEi 1 i; } for (var i 8; i 256; i++) { QRMath.EXP_TABLEi QRMath.EXP_TABLEi - 4 ^ QRMath.EXP_TABLEi - 5 ^ QRMath.EXP_TABLEi - 6 ^ QRMath.EXP_TABLEi - 8; } for (var i 0; i 255; i++) { QRMath.LOG_TABLEQRMath.EXP_TABLEi i; } function QRPolynomial(num, shift) { if (num.length undefined$1) { throw new Error(num.length + / + shift); } var offset 0; while (offset num.length && numoffset 0) { offset++; } this.num new Array(num.length - offset + shift); for (var i 0; i num.length - offset; i++) { this.numi numi + offset; } } QRPolynomial.prototype { get: function get(index) { return this.numindex; }, getLength: function getLength() { return this.num.length; }, multiply: function multiply(e) { var num new Array(this.getLength() + e.getLength() - 1); for (var i 0; i this.getLength(); i++) { for (var j 0; j e.getLength(); j++) { numi + j ^ QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j))); } } return new QRPolynomial(num, 0); }, mod: function mod(e) { if (this.getLength() - e.getLength() 0) { return this; } var ratio QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)); var num new Array(this.getLength()); for (var i 0; i this.getLength(); i++) { numi this.get(i); } for (var i 0; i e.getLength(); i++) { numi ^ QRMath.gexp(QRMath.glog(e.get(i)) + ratio); } return new QRPolynomial(num, 0).mod(e); } }; function QRRSBlock(totalCount, dataCount) { this.totalCount totalCount; this.dataCount dataCount; } QRRSBlock.RS_BLOCK_TABLE 1, 26, 19, 1, 26, 16, 1, 26, 13, 1, 26, 9, 1, 44, 34, 1, 44, 28, 1, 44, 22, 1, 44, 16, 1, 70, 55, 1, 70, 44, 2, 35, 17, 2, 35, 13, 1, 100, 80, 2, 50, 32, 2, 50, 24, 4, 25, 9, 1, 134, 108, 2, 67, 43, 2, 33, 15, 2, 34, 16, 2, 33, 11, 2, 34, 12, 2, 86, 68, 4, 43, 27, 4, 43, 19, 4, 43, 15, 2, 98, 78, 4, 49, 31, 2, 32, 14, 4, 33, 15, 4, 39, 13, 1, 40, 14, 2, 121, 97, 2, 60, 38, 2, 61, 39, 4, 40, 18, 2, 41, 19, 4, 40, 14, 2, 41, 15, 2, 146, 116, 3, 58, 36, 2, 59, 37, 4, 36, 16, 4, 37, 17, 4, 36, 12, 4, 37, 13, 2, 86, 68, 2, 87, 69, 4, 69, 43, 1, 70, 44, 6, 43, 19, 2, 44, 20, 6, 43, 15, 2, 44, 16, 4, 101, 81, 1, 80, 50, 4, 81, 51, 4, 50, 22, 4, 51, 23, 3, 36, 12, 8, 37, 13, 2, 116, 92, 2, 117, 93, 6, 58, 36, 2, 59, 37, 4, 46, 20, 6, 47, 21, 7, 42, 14, 4, 43, 15, 4, 133, 107, 8, 59, 37, 1, 60, 38, 8, 44, 20, 4, 45, 21, 12, 33, 11, 4, 34, 12, 3, 145, 115, 1, 146, 116, 4, 64, 40, 5, 65, 41, 11, 36, 16, 5, 37, 17, 11, 36, 12, 5, 37, 13, 5, 109, 87, 1, 110, 88, 5, 65, 41, 5, 66, 42, 5, 54, 24, 7, 55, 25, 11, 36, 12, 7, 37, 13, 5, 122, 98, 1, 123, 99, 7, 73, 45, 3, 74, 46, 15, 43, 19, 2, 44, 20, 3, 45, 15, 13, 46, 16, 1, 135, 107, 5, 136, 108, 10, 74, 46, 1, 75, 47, 1, 50, 22, 15, 51, 23, 2, 42, 14, 17, 43, 15, 5, 150, 120, 1, 151, 121, 9, 69, 43, 4, 70, 44, 17, 50, 22, 1, 51, 23, 2, 42, 14, 19, 43, 15, 3, 141, 113, 4, 142, 114, 3, 70, 44, 11, 71, 45, 17, 47, 21, 4, 48, 22, 9, 39, 13, 16, 40, 14, 3, 135, 107, 5, 136, 108, 3, 67, 41, 13, 68, 42, 15, 54, 24, 5, 55, 25, 15, 43, 15, 10, 44, 16, 4, 144, 116, 4, 145, 117, 17, 68, 42, 17, 50, 22, 6, 51, 23, 19, 46, 16, 6, 47, 17, 2, 139, 111, 7, 140, 112, 17, 74, 46, 7, 54, 24, 16, 55, 25, 34, 37, 13, 4, 151, 121, 5, 152, 122, 4, 75, 47, 14, 76, 48, 11, 54, 24, 14, 55, 25, 16, 45, 15, 14, 46, 16, 6, 147, 117, 4, 148, 118, 6, 73, 45, 14, 74, 46, 11, 54, 24, 16, 55, 25, 30, 46, 16, 2, 47, 17, 8, 132, 106, 4, 133, 107, 8, 75, 47, 13, 76, 48, 7, 54, 24, 22, 55, 25, 22, 45, 15, 13, 46, 16, 10, 142, 114, 2, 143, 115, 19, 74, 46, 4, 75, 47, 28, 50, 22, 6, 51, 23, 33, 46, 16, 4, 47, 17, 8, 152, 122, 4, 153, 123, 22, 73, 45, 3, 74, 46, 8, 53, 23, 26, 54, 24, 12, 45, 15, 28, 46, 16, 3, 147, 117, 10, 148, 118, 3, 73, 45, 23, 74, 46, 4, 54, 24, 31, 55, 25, 11, 45, 15, 31, 46, 16, 7, 146, 116, 7, 147, 117, 21, 73, 45, 7, 74, 46, 1, 53, 23, 37, 54, 24, 19, 45, 15, 26, 46, 16, 5, 145, 115, 10, 146, 116, 19, 75, 47, 10, 76, 48, 15, 54, 24, 25, 55, 25, 23, 45, 15, 25, 46, 16, 13, 145, 115, 3, 146, 116, 2, 74, 46, 29, 75, 47, 42, 54, 24, 1, 55, 25, 23, 45, 15, 28, 46, 16, 17, 145, 115, 10, 74, 46, 23, 75, 47, 10, 54, 24, 35, 55, 25, 19, 45, 15, 35, 46, 16, 17, 145, 115, 1, 146, 116, 14, 74, 46, 21, 75, 47, 29, 54, 24, 19, 55, 25, 11, 45, 15, 46, 46, 16, 13, 145, 115, 6, 146, 116, 14, 74, 46, 23, 75, 47, 44, 54, 24, 7, 55, 25, 59, 46, 16, 1, 47, 17, 12, 151, 121, 7, 152, 122, 12, 75, 47, 26, 76, 48, 39, 54, 24, 14, 55, 25, 22, 45, 15, 41, 46, 16, 6, 151, 121, 14, 152, 122, 6, 75, 47, 34, 76, 48, 46, 54, 24, 10, 55, 25, 2, 45, 15, 64, 46, 16, 17, 152, 122, 4, 153, 123, 29, 74, 46, 14, 75, 47, 49, 54, 24, 10, 55, 25, 24, 45, 15, 46, 46, 16, 4, 152, 122, 18, 153, 123, 13, 74, 46, 32, 75, 47, 48, 54, 24, 14, 55, 25, 42, 45, 15, 32, 46, 16, 20, 147, 117, 4, 148, 118, 40, 75, 47, 7, 76, 48, 43, 54, 24, 22, 55, 25, 10, 45, 15, 67, 46, 16, 19, 148, 118, 6, 149, 119, 18, 75, 47, 31, 76, 48, 34, 54, 24, 34, 55, 25, 20, 45, 15, 61, 46, 16; QRRSBlock.getRSBlocks function (typeNumber, errorCorrectLevel) { var rsBlock QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); if (rsBlock undefined$1) { throw new Error(bad rs block @ typeNumber: + typeNumber + /errorCorrectLevel: + errorCorrectLevel); } var length rsBlock.length / 3; var list ; for (var i 0; i length; i++) { var count rsBlocki * 3 + 0; var totalCount rsBlocki * 3 + 1; var dataCount rsBlocki * 3 + 2; for (var j 0; j count; j++) { list.push(new QRRSBlock(totalCount, dataCount)); } } return list; }; QRRSBlock.getRsBlockTable function (typeNumber, errorCorrectLevel) { switch (errorCorrectLevel) { case QRErrorCorrectLevel.L: return QRRSBlock.RS_BLOCK_TABLE(typeNumber - 1) * 4 + 0; case QRErrorCorrectLevel.M: return QRRSBlock.RS_BLOCK_TABLE(typeNumber - 1) * 4 + 1; case QRErrorCorrectLevel.Q: return QRRSBlock.RS_BLOCK_TABLE(typeNumber - 1) * 4 + 2; case QRErrorCorrectLevel.H: return QRRSBlock.RS_BLOCK_TABLE(typeNumber - 1) * 4 + 3; default: return undefined$1; } }; function QRBitBuffer() { this.buffer ; this.length 0; } QRBitBuffer.prototype { get: function get(index) { var bufIndex Math.floor(index / 8); return (this.bufferbufIndex >>> 7 - index % 8 & 1) 1; }, put: function put(num, length) { for (var i 0; i length; i++) { this.putBit((num >>> length - i - 1 & 1) 1); } }, getLengthInBits: function getLengthInBits() { return this.length; }, putBit: function putBit(bit) { var bufIndex Math.floor(this.length / 8); if (this.buffer.length bufIndex) { this.buffer.push(0); } if (bit) { this.bufferbufIndex | 0x80 >>> this.length % 8; } this.length++; } }; var QRCodeLimitLength 17, 14, 11, 7, 32, 26, 20, 14, 53, 42, 32, 24, 78, 62, 46, 34, 106, 84, 60, 44, 134, 106, 74, 58, 154, 122, 86, 64, 192, 152, 108, 84, 230, 180, 130, 98, 271, 213, 151, 119, 321, 251, 177, 137, 367, 287, 203, 155, 425, 331, 241, 177, 458, 362, 258, 194, 520, 412, 292, 220, 586, 450, 322, 250, 644, 504, 364, 280, 718, 560, 394, 310, 792, 624, 442, 338, 858, 666, 482, 382, 929, 711, 509, 403, 1003, 779, 565, 439, 1091, 857, 611, 461, 1171, 911, 661, 511, 1273, 997, 715, 535, 1367, 1059, 751, 593, 1465, 1125, 805, 625, 1528, 1190, 868, 658, 1628, 1264, 908, 698, 1732, 1370, 982, 742, 1840, 1452, 1030, 790, 1952, 1538, 1112, 842, 2068, 1628, 1168, 898, 2188, 1722, 1228, 958, 2303, 1809, 1283, 983, 2431, 1911, 1351, 1051, 2563, 1989, 1423, 1093, 2699, 2099, 1499, 1139, 2809, 2213, 1579, 1219, 2953, 2331, 1663, 1273; function _isSupportCanvas() { return typeof CanvasRenderingContext2D ! undefined; } // android 2.x doesnt support Data-URI spec function _getAndroid() { var android false; var sAgent navigator.userAgent; if (/android/i.test(sAgent)) { // android android true; var aMat sAgent.toString().match(/android (0-9\.0-9)/i); if (aMat && aMat1) { android parseFloat(aMat1); } } return android; } // Drawing in DOM by using Table tag var Drawing !_isSupportCanvas() ? function () { var Drawing function Drawing(el, htOption) { this._el el; this._htOption htOption; }; /** * Draw the QRCode * * @param {QRCode} oQRCode */ Drawing.prototype.draw function (oQRCode) { var _htOption this._htOption; var _el this._el; var nCount oQRCode.getModuleCount(); var nWidth Math.round(_htOption.width / nCount); var nHeight Math.round((_htOption.height - _htOption.titleHeight) / nCount); if (nWidth 1) { nWidth 1; } if (nHeight 1) { nHeight 1; } this._htOption.width nWidth * nCount; this._htOption.height nHeight * nCount + _htOption.titleHeight; this._htOption.quietZone Math.round(this._htOption.quietZone); var aHTML ; var divStyle ; var drawWidth Math.round(nWidth * _htOption.dotScale); var drawHeight Math.round(nHeight * _htOption.dotScale); if (drawWidth 4) { drawWidth 4; drawHeight 4; } var nonRequiredColorDark _htOption.colorDark; var nonRequiredcolorLight _htOption.colorLight; if (_htOption.backgroundImage) { if (_htOption.autoColor) { _htOption.colorDark rgba(0, 0, 0, .6);filter:progid:DXImageTransform.Microsoft.Gradient(GradientType0, StartColorStr#99000000, EndColorStr#99000000);; _htOption.colorLight rgba(255, 255, 255, .7);filter:progid:DXImageTransform.Microsoft.Gradient(GradientType0, StartColorStr#B2FFFFFF, EndColorStr#B2FFFFFF);; // _htOption.colorDarkrgba(0, 0, 0, .6); // _htOption.colorLightrgba(255, 255, 255, .7); } else { _htOption.colorLight rgba(0,0,0,0); } var backgroundImageEle div styledisplay:inline-block; z-index:-10;position:absolute;>img src + _htOption.backgroundImage + widht + (_htOption.width + _htOption.quietZone * 2) + height + (_htOption.height + _htOption.quietZone * 2) + styleopacity: + _htOption.backgroundImageAlpha + ;filter:alpha(opacity + _htOption.backgroundImageAlpha * 100 + ); />/div>; aHTML.push(backgroundImageEle); } if (_htOption.quietZone) { divStyle display:inline-block; width: + (_htOption.width + _htOption.quietZone * 2) + px; height: + (_htOption.width + _htOption.quietZone * 2) + px;background: + _htOption.quietZoneColor + ; text-align:center;; } aHTML.push(div stylefont-size:0; + divStyle + >); aHTML.push(table stylefont-size:0;border:0;border-collapse:collapse; margin-top: + _htOption.quietZone + px; border0 cellspacing0 cellspadding0 aligncenter valignmiddle>); aHTML.push(tr height + _htOption.titleHeight + aligncenter>td styleborder:0;border-collapse:collapse;margin:0;padding:0 colspan + nCount + >); if (_htOption.title) { var c _htOption.titleColor; var f _htOption.titleFont; aHTML.push(div stylewidth:100%;margin-top: + _htOption.titleTop + px;color: + c + ;font: + f + ;background: + _htOption.titleBackgroundColor + > + _htOption.title + /div>); } if (_htOption.subTitle) { aHTML.push(div stylewidth:100%;margin-top: + (_htOption.subTitleTop - _htOption.titleTop) + px;color: + _htOption.subTitleColor + ; font: + _htOption.subTitleFont + > + _htOption.subTitle + /div>); } aHTML.push(/td>/tr>); for (var row 0; row nCount; row++) { aHTML.push(tr styleborder:0; padding:0; margin:0; height7>); for (var col 0; col nCount; col++) { var bIsDark oQRCode.isDark(row, col); var eye oQRCode.getEye(row, col); // { isDark: true/false, type: PO_TL, PI_TL, PO_TR, PI_TR, PO_BL, PI_BL }; if (eye) { // Is eye bIsDark eye.isDark; var type eye.type; // PX_XX, PX, colorDark, colorLight var eyeColorDark _htOptiontype || _htOptiontype.substring(0, 2) || nonRequiredColorDark; aHTML.push(td styleborder:0;border-collapse:collapse;padding:0;margin:0;width: + nWidth + px;height: + nHeight + px;> + span stylewidth: + nWidth + px;height: + nHeight + px;background-color: + (bIsDark ? eyeColorDark : nonRequiredcolorLight) + ;display:inline-block>/span>/td>); } else { // Timing Pattern var nowDarkColor _htOption.colorDark; if (row 6) { nowDarkColor _htOption.timing_H || _htOption.timing || nonRequiredColorDark; aHTML.push(td styleborder:0;border-collapse:collapse;padding:0;margin:0;width: + nWidth + px;height: + nHeight + px;background-color: + (bIsDark ? nowDarkColor : nonRequiredcolorLight) + ;>/td>); } else if (col 6) { nowDarkColor _htOption.timing_V || _htOption.timing || nonRequiredColorDark; aHTML.push(td styleborder:0;border-collapse:collapse;padding:0;margin:0;width: + nWidth + px;height: + nHeight + px;background-color: + (bIsDark ? nowDarkColor : nonRequiredcolorLight) + ;>/td>); } else { aHTML.push(td styleborder:0;border-collapse:collapse;padding:0;margin:0;width: + nWidth + px;height: + nHeight + px;> + div styledisplay:inline-block;width: + drawWidth + px;height: + drawHeight + px;background-color: + (bIsDark ? nowDarkColor : _htOption.colorLight) + ;>/div>/td>); } } } aHTML.push(/tr>); } aHTML.push(/table>); aHTML.push(/div>); if (_htOption.logo) { // Logo Image var img new Image(); if (_htOption.crossOrigin ! null) { img.crossOrigin _htOption.crossOrigin; } // img.crossOriginAnonymous; img.src _htOption.logo; var imgW _htOption.width / 3.5; var imgH _htOption.height / 3.5; if (imgW ! imgH) { imgW imgH; } if (_htOption.logoWidth) { imgW _htOption.logoWidth; } if (_htOption.logoHeight) { imgH _htOption.logoHeight; } var imgDivStyle position:relative; z-index:1;display:table-cell;top:- + ((_htOption.height - _htOption.titleHeight) / 2 + imgH / 2 + _htOption.quietZone) + px;text-align:center; width: + imgW + px; height: + imgH + px;line-height: + imgW + px; vertical-align: middle;; if (!_htOption.logoBackgroundTransparent) { imgDivStyle + background: + _htOption.logoBackgroundColor; } aHTML.push(div style + imgDivStyle + >img src + _htOption.logo + stylemax-width: + imgW + px; max-height: + imgH + px; /> div style display: none; width:1px;margin-left: -1px;>/div>/div>); } if (_htOption.onRenderingStart) { _htOption.onRenderingStart(_htOption); } _el.innerHTML aHTML.join(); // Fix the margin values as real size. var elTable _el.childNodes0; var nLeftMarginTable (_htOption.width - elTable.offsetWidth) / 2; var nTopMarginTable (_htOption.height - elTable.offsetHeight) / 2; if (nLeftMarginTable > 0 && nTopMarginTable > 0) { elTable.style.margin nTopMarginTable + px + nLeftMarginTable + px; } if (this._htOption.onRenderingEnd) { this._htOption.onRenderingEnd(this._htOption, null); } }; /** * Clear the QRCode */ Drawing.prototype.clear function () { this._el.innerHTML ; }; return Drawing; }() : function () { // Drawing in Canvas function _onMakeImage() { if (this._htOption.drawer svg) { var svgData this._oContext.getSerializedSvg(true); this.dataURL svgData; this._el.innerHTML svgData; } else { // canvas // this._elImage.crossOriginAnonymous; try { // if (this._htOption.crossOrigin ! null) { // this._elImage.crossOrigin this._htOption.crossOrigin; // } var dataURL this._elCanvas.toDataURL(image/png); // this._elImage.src dataURL; this.dataURL dataURL; // this._elImage.style.display inline; // this._elCanvas.style.display none; } catch (e) { console.error(e); } } if (this._htOption.onRenderingEnd) { if (!this.dataURL) { console.error(Can not get base64 data, please check: 1. Published the page and image to the server 2. The image request support CORS 3. Configured `crossOrigin:anonymous` option); } this._htOption.onRenderingEnd(this._htOption, this.dataURL); } } // Android 2.1 bug workaround // http://code.google.com/p/android/issues/detail?id5141 if (root._android && root._android 2.1) { var factor 1 / window.devicePixelRatio; var drawImage CanvasRenderingContext2D.prototype.drawImage; CanvasRenderingContext2D.prototype.drawImage function (image, sx, sy, sw, sh, dx, dy, dw, dh) { if (nodeName in image && /img/i.test(image.nodeName)) { for (var i arguments.length - 1; i > 1; i--) { argumentsi argumentsi * factor; } } else if (typeof dw undefined) { arguments1 * factor; arguments2 * factor; arguments3 * factor; arguments4 * factor; } drawImage.apply(this, arguments); }; } /** * Check whether the users browser supports Data URI or not * * @private * @param {Function} fSuccess Occurs if it supports Data URI * @param {Function} fFail Occurs if it doesnt support Data URI */ function _safeSetDataURI(fSuccess, fFail) { var self this; self._fFail fFail; self._fSuccess fSuccess; // Check it just once if (self._bSupportDataURI null) { var el document.createElement(img); var fOnError function fOnError() { self._bSupportDataURI false; if (self._fFail) { self._fFail.call(self); } }; var fOnSuccess function fOnSuccess() { self._bSupportDataURI true; if (self._fSuccess) { self._fSuccess.call(self); } }; el.onabort fOnError; el.onerror fOnError; el.onload fOnSuccess; el.src data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg; // the Image contains 1px data. return; } else if (self._bSupportDataURI true && self._fSuccess) { self._fSuccess.call(self); } else if (self._bSupportDataURI false && self._fFail) { self._fFail.call(self); } } /** * Drawing QRCode by using canvas * * @constructor * @param {HTMLElement} el * @param {Object} htOption QRCode Options */ var Drawing function Drawing(el, htOption) { this._bIsPainted false; this._android _getAndroid(); this._el el; this._htOption htOption; if (this._htOption.drawer svg) { this._oContext {}; this._elCanvas {}; } else { // canvas this._elCanvas document.createElement(canvas); this._el.appendChild(this._elCanvas); this._oContext this._elCanvas.getContext(2d); // this._elImage document.createElement(img); // this._elImage.alt Scan me!; // this._elImage.style.display none; // this._el.appendChild(this._elImage); } this._bSupportDataURI null; this.dataURL null; }; /** * Draw the QRCode * * @param {QRCode} oQRCode */ Drawing.prototype.draw function (oQRCode) { // var _elImage this._elImage; var _htOption this._htOption; if (!_htOption.title && !_htOption.subTitle) { _htOption.height - _htOption.titleHeight; _htOption.titleHeight 0; } var nCount oQRCode.getModuleCount(); var nWidth Math.round(_htOption.width / nCount); var nHeight Math.round((_htOption.height - _htOption.titleHeight) / nCount); if (nWidth 1) { nWidth 1; } if (nHeight 1) { nHeight 1; } _htOption.width nWidth * nCount; _htOption.height nHeight * nCount + _htOption.titleHeight; _htOption.quietZone Math.round(_htOption.quietZone); this._elCanvas.width _htOption.width + _htOption.quietZone * 2; this._elCanvas.height _htOption.height + _htOption.quietZone * 2; if (this._htOption.drawer ! canvas) { // _elImage.style.display none; // } else { this._oContext new C2S(this._elCanvas.width, this._elCanvas.height); } this.clear(); var _oContext this._oContext; _oContext.lineWidth 0; _oContext.fillStyle _htOption.colorLight; _oContext.fillRect(0, 0, this._elCanvas.width, this._elCanvas.height); var t this; function drawQuietZoneColor() { if (_htOption.quietZone > 0 && _htOption.quietZoneColor) { // top _oContext.lineWidth 0; _oContext.fillStyle _htOption.quietZoneColor; _oContext.fillRect(0, 0, t._elCanvas.width, _htOption.quietZone); // left _oContext.fillRect(0, _htOption.quietZone, _htOption.quietZone, t._elCanvas.height - _htOption.quietZone * 2); // right _oContext.fillRect(t._elCanvas.width - _htOption.quietZone, _htOption.quietZone, _htOption.quietZone, t._elCanvas.height - _htOption.quietZone * 2); // bottom _oContext.fillRect(0, t._elCanvas.height - _htOption.quietZone, t._elCanvas.width, _htOption.quietZone); } } if (_htOption.backgroundImage) { // Background Image var bgImg new Image(); bgImg.onload function () { _oContext.globalAlpha 1; _oContext.globalAlpha _htOption.backgroundImageAlpha; var imageSmoothingQuality _oContext.imageSmoothingQuality; var imageSmoothingEnabled _oContext.imageSmoothingEnabled; _oContext.imageSmoothingEnabled true; _oContext.imageSmoothingQuality high; _oContext.drawImage(bgImg, 0, _htOption.titleHeight, _htOption.width + _htOption.quietZone * 2, _htOption.height + _htOption.quietZone * 2 - _htOption.titleHeight); _oContext.imageSmoothingEnabled imageSmoothingEnabled; _oContext.imageSmoothingQuality imageSmoothingQuality; _oContext.globalAlpha 1; drawQrcode.call(t, oQRCode); }; // bgImg.crossOriginAnonymous; if (_htOption.crossOrigin ! null) { bgImg.crossOrigin _htOption.crossOrigin; } bgImg.originalSrc _htOption.backgroundImage; bgImg.src _htOption.backgroundImage; // DoSomething } else { drawQrcode.call(t, oQRCode); } function drawQrcode(oQRCode) { if (_htOption.onRenderingStart) { _htOption.onRenderingStart(_htOption); } for (var row 0; row nCount; row++) { for (var col 0; col nCount; col++) { var nLeft col * nWidth + _htOption.quietZone; var nTop row * nHeight + _htOption.quietZone; var bIsDark oQRCode.isDark(row, col); var eye oQRCode.getEye(row, col); // { isDark: true/false, type: PO_TL, PI_TL, PO_TR, PI_TR, PO_BL, PI_BL }; var nowDotScale _htOption.dotScale; _oContext.lineWidth 0; // Color handler var dColor; var lColor; if (eye) { dColor _htOptioneye.type || _htOptioneye.type.substring(0, 2) || _htOption.colorDark; lColor _htOption.colorLight; } else { if (_htOption.backgroundImage) { lColor rgba(0,0,0,0); if (row 6) { // dColor _htOption.timing_H || _htOption.timing || _htOption.colorDark; if (_htOption.autoColor) { dColor _htOption.timing_H || _htOption.timing || _htOption.autoColorDark; lColor _htOption.autoColorLight; } else { dColor _htOption.timing_H || _htOption.timing || _htOption.colorDark; } } else if (col 6) { // dColor _htOption.timing_V || _htOption.timing || _htOption.colorDark; if (_htOption.autoColor) { dColor _htOption.timing_V || _htOption.timing || _htOption.autoColorDark; lColor _htOption.autoColorLight; } else { dColor _htOption.timing_V || _htOption.timing || _htOption.colorDark; } } else { if (_htOption.autoColor) { dColor _htOption.autoColorDark; lColor _htOption.autoColorLight; } else { dColor _htOption.colorDark; } } } else { if (row 6) { dColor _htOption.timing_H || _htOption.timing || _htOption.colorDark; } else if (col 6) { dColor _htOption.timing_V || _htOption.timing || _htOption.colorDark; } else { dColor _htOption.colorDark; } lColor _htOption.colorLight; } } _oContext.strokeStyle bIsDark ? dColor : lColor; _oContext.fillStyle bIsDark ? dColor : lColor; if (eye) { if (eye.type AO) { nowDotScale _htOption.dotScaleAO; } else if (eye.type AI) { nowDotScale _htOption.dotScaleAI; } else { nowDotScale 1; } if (_htOption.backgroundImage && _htOption.autoColor) { dColor (eye.type AO ? _htOption.AI : _htOption.AO) || _htOption.autoColorDark; lColor _htOption.autoColorLight; } else { dColor (eye.type AO ? _htOption.AI : _htOption.AO) || dColor; } // Is eye bIsDark eye.isDark; _oContext.fillRect(nLeft + nWidth * (1 - nowDotScale) / 2, _htOption.titleHeight + nTop + nHeight * (1 - nowDotScale) / 2, nWidth * nowDotScale, nHeight * nowDotScale); } else { if (row 6) { // Timing Pattern nowDotScale _htOption.dotScaleTiming_H; _oContext.fillRect(nLeft + nWidth * (1 - nowDotScale) / 2, _htOption.titleHeight + nTop + nHeight * (1 - nowDotScale) / 2, nWidth * nowDotScale, nHeight * nowDotScale); } else if (col 6) { // Timing Pattern nowDotScale _htOption.dotScaleTiming_V; _oContext.fillRect(nLeft + nWidth * (1 - nowDotScale) / 2, _htOption.titleHeight + nTop + nHeight * (1 - nowDotScale) / 2, nWidth * nowDotScale, nHeight * nowDotScale); } else { if (_htOption.backgroundImage) { _oContext.fillRect(nLeft + nWidth * (1 - nowDotScale) / 2, _htOption.titleHeight + nTop + nHeight * (1 - nowDotScale) / 2, nWidth * nowDotScale, nHeight * nowDotScale); } else { _oContext.fillRect(nLeft + nWidth * (1 - nowDotScale) / 2, _htOption.titleHeight + nTop + nHeight * (1 - nowDotScale) / 2, nWidth * nowDotScale, nHeight * nowDotScale); } } } if (_htOption.dotScale ! 1 && !eye) { _oContext.strokeStyle _htOption.colorLight; } } } if (_htOption.title) { _oContext.fillStyle _htOption.titleBackgroundColor; _oContext.fillRect(0, 0, this._elCanvas.width, _htOption.titleHeight + _htOption.quietZone); _oContext.font _htOption.titleFont; _oContext.fillStyle _htOption.titleColor; _oContext.textAlign center; _oContext.fillText(_htOption.title, this._elCanvas.width / 2, +_htOption.quietZone + _htOption.titleTop); } if (_htOption.subTitle) { _oContext.font _htOption.subTitleFont; _oContext.fillStyle _htOption.subTitleColor; _oContext.fillText(_htOption.subTitle, this._elCanvas.width / 2, +_htOption.quietZone + _htOption.subTitleTop); } function generateLogoImg(img) { var imgContainerW Math.round(_htOption.width / 3.5); var imgContainerH Math.round(_htOption.height / 3.5); if (imgContainerW ! imgContainerH) { imgContainerW imgContainerH; } if (_htOption.logoMaxWidth) { imgContainerW Math.round(_htOption.logoMaxWidth); } else if (_htOption.logoWidth) { imgContainerW Math.round(_htOption.logoWidth); } if (_htOption.logoMaxHeight) { imgContainerH Math.round(_htOption.logoMaxHeight); } else if (_htOption.logoHeight) { imgContainerH Math.round(_htOption.logoHeight); } var nw; var nh; if (typeof img.naturalWidth undefined) { // IE 6/7/8 nw img.width; nh img.height; } else { // HTML5 browsers nw img.naturalWidth; nh img.naturalHeight; } if (_htOption.logoMaxWidth || _htOption.logoMaxHeight) { if (_htOption.logoMaxWidth && nw imgContainerW) { imgContainerW nw; } if (_htOption.logoMaxHeight && nh imgContainerH) { imgContainerH nh; } if (nw imgContainerW && nh imgContainerH) { imgContainerW nw; imgContainerH nh; } } var imgContainerX (_htOption.width + _htOption.quietZone * 2 - imgContainerW) / 2; var imgContainerY (_htOption.height + _htOption.titleHeight + _htOption.quietZone * 2 - imgContainerH) / 2; var imgScale Math.min(imgContainerW / nw, imgContainerH / nh); var imgW nw * imgScale; var imgH nh * imgScale; if (_htOption.logoMaxWidth || _htOption.logoMaxHeight) { imgContainerW imgW; imgContainerH imgH; imgContainerX (_htOption.width + _htOption.quietZone * 2 - imgContainerW) / 2; imgContainerY (_htOption.height + _htOption.titleHeight + _htOption.quietZone * 2 - imgContainerH) / 2; } // Did Not Use Transparent Logo Image if (!_htOption.logoBackgroundTransparent) { //if (!_htOption.logoBackgroundColor) { //_htOption.logoBackgroundColor #ffffff; //} _oContext.fillStyle _htOption.logoBackgroundColor; _oContext.fillRect(imgContainerX, imgContainerY, imgContainerW, imgContainerH); } var imageSmoothingQuality _oContext.imageSmoothingQuality; var imageSmoothingEnabled _oContext.imageSmoothingEnabled; _oContext.imageSmoothingEnabled true; _oContext.imageSmoothingQuality high; _oContext.drawImage(img, imgContainerX + (imgContainerW - imgW) / 2, imgContainerY + (imgContainerH - imgH) / 2, imgW, imgH); _oContext.imageSmoothingEnabled imageSmoothingEnabled; _oContext.imageSmoothingQuality imageSmoothingQuality; drawQuietZoneColor(); _this._bIsPainted true; _this.makeImage(); } if (_htOption.logo) { // Logo Image var img new Image(); var _this this; img.onload function () { generateLogoImg(img); }; img.onerror function (e) { console.error(e); }; // img.crossOriginAnonymous; if (_htOption.crossOrigin ! null) { img.crossOrigin _htOption.crossOrigin; } img.originalSrc _htOption.logo; img.src _htOption.logo; } else { drawQuietZoneColor(); this._bIsPainted true; this.makeImage(); } } }; /** * Make the image from Canvas if the browser supports Data URI. */ Drawing.prototype.makeImage function () { if (this._bIsPainted) { _safeSetDataURI.call(this, _onMakeImage); } }; /** * Return whether the QRCode is painted or not * * @return {Boolean} */ Drawing.prototype.isPainted function () { return this._bIsPainted; }; /** * Clear the QRCode */ Drawing.prototype.clear function () { this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height); this._bIsPainted false; }; Drawing.prototype.remove function () { this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height); this._bIsPainted false; this._el.innerHTML ; }; /** * @private * @param {Number} nNumber */ Drawing.prototype.round function (nNumber) { if (!nNumber) { return nNumber; } return Math.floor(nNumber * 1000) / 1000; }; return Drawing; }(); /** * Get the type by string length * * @private * @param {String} sText * @param {Number} nCorrectLevel * @return {Number} type */ function _getTypeNumber(sText, _htOption) { var nCorrectLevel _htOption.correctLevel; var nType 1; var length _getUTF8Length(sText); for (var i 0, len QRCodeLimitLength.length; i len; i++) { var nLimit 0; switch (nCorrectLevel) { case QRErrorCorrectLevel.L: nLimit QRCodeLimitLengthi0; break; case QRErrorCorrectLevel.M: nLimit QRCodeLimitLengthi1; break; case QRErrorCorrectLevel.Q: nLimit QRCodeLimitLengthi2; break; case QRErrorCorrectLevel.H: nLimit QRCodeLimitLengthi3; break; } if (length nLimit) { break; } else { nType++; } } if (nType > QRCodeLimitLength.length) { throw new Error(Too long data. the CorrectLevel. + M, L, H, QnCorrectLevel + limit length is + nLimit); } if (_htOption.version ! 0) { if (nType _htOption.version) { nType _htOption.version; _htOption.runVersion nType; } else { console.warn(QR Code version + _htOption.version + too small, run version use + nType); _htOption.runVersion nType; } } return nType; } function _getUTF8Length(sText) { var replacedText encodeURI(sText).toString().replace(/\%0-9a-fA-F{2}/g, a); return replacedText.length + (replacedText.length ! sText.length ? 3 : 0); } QRCode function QRCode(el, vOption) { this._htOption { width: 256, height: 256, typeNumber: 4, colorDark: #000000, colorLight: #ffffff, correctLevel: QRErrorCorrectLevel.H, dotScale: 1, // For body block, must be greater than 0, less than or equal to 1. default is 1 dotScaleTiming: 1, // Dafault for timing block , must be greater than 0, less than or equal to 1. default is 1 dotScaleTiming_H: undefined$1, // For horizontal timing block, must be greater than 0, less than or equal to 1. default is 1 dotScaleTiming_V: undefined$1, // For vertical timing block, must be greater than 0, less than or equal to 1. default is 1 dotScaleA: 1, // Dafault for alignment block, must be greater than 0, less than or equal to 1. default is 1 dotScaleAO: undefined$1, // For alignment outer block, must be greater than 0, less than or equal to 1. default is 1 dotScaleAI: undefined$1, // For alignment inner block, must be greater than 0, less than or equal to 1. default is 1 quietZone: 0, quietZoneColor: rgba(0,0,0,0), title: , titleFont: normal normal bold 16px Arial, titleColor: #000000, titleBackgroundColor: #ffffff, titleHeight: 0, // Title Height, Include subTitle titleTop: 30, // draws y coordinates. default is 30 subTitle: , subTitleFont: normal normal normal 14px Arial, subTitleColor: #4F4F4F, subTitleTop: 60, // draws y coordinates. default is 0 logo: undefined$1, logoWidth: undefined$1, logoHeight: undefined$1, logoMaxWidth: undefined$1, logoMaxHeight: undefined$1, logoBackgroundColor: #ffffff, logoBackgroundTransparent: false, // Posotion Pattern(Eye) Color PO: undefined$1, // Global Posotion Outer color. if not set, the defaut is `colorDark` PI: undefined$1, // Global Posotion Inner color. if not set, the defaut is `colorDark` PO_TL: undefined$1, // Posotion Outer - Top Left PI_TL: undefined$1, // Posotion Inner - Top Left PO_TR: undefined$1, // Posotion Outer - Top Right PI_TR: undefined$1, // Posotion Inner - Top Right PO_BL: undefined$1, // Posotion Outer - Bottom Left PI_BL: undefined$1, // Posotion Inner - Bottom Left // Alignment Color AO: undefined$1, // Alignment Outer. if not set, the defaut is `colorDark` AI: undefined$1, // Alignment Inner. if not set, the defaut is `colorDark` // Timing Pattern Color timing: undefined$1, // Global Timing color. if not set, the defaut is `colorDark` timing_H: undefined$1, // Horizontal timing color timing_V: undefined$1, // Vertical timing color // Backgroud Image backgroundImage: undefined$1, // Background Image backgroundImageAlpha: 1, // Background image transparency, value between 0 and 1. default is 1. autoColor: false, // Automatic color adjustment(for data block) autoColorDark: rgba(0, 0, 0, .6), // Automatic color: dark CSS color autoColorLight: rgba(255, 255, 255, .7), // Automatic color: light CSS color // Event Handler onRenderingStart: undefined$1, onRenderingEnd: undefined$1, // Versions version: 0, // The symbol versions of QR Code range from Version 1 to Version 40. default 0 means automatically choose the closest version based on the text length. // Tooltip tooltip: false, // Whether set the QRCode Text as the title attribute value of the image // Binary(hex) data mode binary: false, // Whether it is binary mode, default is text mode. // Drawing method drawer: canvas, // Drawing method: canvas, svg(Chrome, FF, IE9+) // CORS crossOrigin: null, // String which specifies the CORS setting to use when retrieving the image. null means that the crossOrigin attribute is not set. // UTF-8 without BOM utf8WithoutBOM: true }; if (typeof vOption string) { vOption { text: vOption }; } // Overwrites options if (vOption) { for (var i in vOption) { this._htOptioni vOptioni; } } if (this._htOption.version 0 || this._htOption.version > 40) { console.warn(QR Code version + this._htOption.version + is invalidate, reset to 0); this._htOption.version 0; } if (this._htOption.dotScale 0 || this._htOption.dotScale > 1) { console.warn(this._htOption.dotScale + , is invalidate, dotScale must greater than 0, less than or equal to 1, now reset to 1. ); this._htOption.dotScale 1; } if (this._htOption.dotScaleTiming 0 || this._htOption.dotScaleTiming > 1) { console.warn(this._htOption.dotScaleTiming + , is invalidate, dotScaleTiming must greater than 0, less than or equal to 1, now reset to 1. ); this._htOption.dotScaleTiming 1; } if (this._htOption.dotScaleTiming_H) { if (this._htOption.dotScaleTiming_H 0 || this._htOption.dotScaleTiming_H > 1) { console.warn(this._htOption.dotScaleTiming_H + , is invalidate, dotScaleTiming_H must greater than 0, less than or equal to 1, now reset to 1. ); this._htOption.dotScaleTiming_H 1; } } else { this._htOption.dotScaleTiming_H this._htOption.dotScaleTiming; } if (this._htOption.dotScaleTiming_V) { if (this._htOption.dotScaleTiming_V 0 || this._htOption.dotScaleTiming_V > 1) { console.warn(this._htOption.dotScaleTiming_V + , is invalidate, dotScaleTiming_V must greater than 0, less than or equal to 1, now reset to 1. ); this._htOption.dotScaleTiming_V 1; } } else { this._htOption.dotScaleTiming_V this._htOption.dotScaleTiming; } if (this._htOption.dotScaleA 0 || this._htOption.dotScaleA > 1) { console.warn(this._htOption.dotScaleA + , is invalidate, dotScaleA must greater than 0, less than or equal to 1, now reset to 1. ); this._htOption.dotScaleA 1; } if (this._htOption.dotScaleAO) { if (this._htOption.dotScaleAO 0 || this._htOption.dotScaleAO > 1) { console.warn(this._htOption.dotScaleAO + , is invalidate, dotScaleAO must greater than 0, less than or equal to 1, now reset to 1. ); this._htOption.dotScaleAO 1; } } else { this._htOption.dotScaleAO this._htOption.dotScaleA; } if (this._htOption.dotScaleAI) { if (this._htOption.dotScaleAI 0 || this._htOption.dotScaleAI > 1) { console.warn(this._htOption.dotScaleAI + , is invalidate, dotScaleAI must greater than 0, less than or equal to 1, now reset to 1. ); this._htOption.dotScaleAI 1; } } else { this._htOption.dotScaleAI this._htOption.dotScaleA; } if (this._htOption.backgroundImageAlpha 0 || this._htOption.backgroundImageAlpha > 1) { console.warn(this._htOption.backgroundImageAlpha + , is invalidate, backgroundImageAlpha must between 0 and 1, now reset to 1. ); this._htOption.backgroundImageAlpha 1; } this._htOption.height this._htOption.height + this._htOption.titleHeight; if (typeof el string) { el document.getElementById(el); } if (!this._htOption.drawer || this._htOption.drawer ! svg && this._htOption.drawer ! canvas) { this._htOption.drawer canvas; } this._android _getAndroid(); this._el el; this._oQRCode null; var _htOptionClone {}; for (var i in this._htOption) { _htOptionClonei this._htOptioni; } this._oDrawing new Drawing(this._el, _htOptionClone); if (this._htOption.text) { this.makeCode(this._htOption.text); } }; /** * Make the QRCode * * @param {String} sText link data */ QRCode.prototype.makeCode function (sText) { this._oQRCode new QRCodeModel(_getTypeNumber(sText, this._htOption), this._htOption.correctLevel); this._oQRCode.addData(sText, this._htOption.binary, this._htOption.utf8WithoutBOM); this._oQRCode.make(); if (this._htOption.tooltip) { this._el.title sText; } this._oDrawing.draw(this._oQRCode); // this.makeImage(); }; /** * Make the Image from Canvas element * - It occurs automatically * - Android below 3 doesnt support Data-URI spec. * * @private */ QRCode.prototype.makeImage function () { if (typeof this._oDrawing.makeImage function && (!this._android || this._android > 3)) { this._oDrawing.makeImage(); } }; /** * Clear the QRCode */ QRCode.prototype.clear function () { this._oDrawing.remove(); }; /** * Resize the QRCode */ QRCode.prototype.resize function (width, height) { this._oDrawing._htOption.width width; this._oDrawing._htOption.height height; this._oDrawing.draw(this._oQRCode); }; /** * No Conflict * @return QRCode object */ QRCode.prototype.noConflict function () { if (root.QRCode this) { root.QRCode _QRCode; } return QRCode; }; /** * @name QRCode.CorrectLevel */ QRCode.CorrectLevel QRErrorCorrectLevel; /*--------------------------------------------------------------------------*/ // Export QRCode // AMD & CMD Compatibility if (typeof define function && (define.amd || define.cmd)) { // 1. Define an anonymous module define(, function () { return QRCode; }); } // CommonJS Compatibility(include NodeJS) else if (freeModule) { // Node.js (freeModule.exports QRCode).QRCode QRCode; // Other CommonJS freeExports.QRCode QRCode; } else { // Export Global root.QRCode QRCode; }}var version 2.7.2;var formatVersion version.replace(/\./g, _); //replace . with _QRCode();removeExpiredLocalStorageItems();getQueryParamsAndSaveToLocalStorage(window.location.href);saveWebReferrer();(function () { var generateOneLinkURL function generateOneLinkURL() { var parameters arguments.length > 0 && arguments0 ! undefined ? arguments0 : { afParameters: {} }; var oneLinkURL parameters.oneLinkURL, _parameters$afParamet parameters.afParameters, _parameters$afParamet2 _parameters$afParamet void 0 ? {} : _parameters$afParamet, mediaSource _parameters$afParamet2.mediaSource, _parameters$referrerS parameters.referrerSkipList, referrerSkipList _parameters$referrerS void 0 ? : _parameters$referrerS, _parameters$urlSkipLi parameters.urlSkipList, urlSkipList _parameters$urlSkipLi void 0 ? : _parameters$urlSkipLi, webReferrer parameters.webReferrer; if (!isOneLinkURLValid(oneLinkURL)) return null; if (!isSkipListsValid({ referrerSkipList: referrerSkipList, urlSkipList: urlSkipList })) return null; if (!validatedMs(mediaSource)) return null; var aggregateValues aggregateValuesFromParameters(parameters.afParameters); var currentURLParams getCurrentURLParams(aggregateValues); var validParams validateAndMappedParams(parameters.afParameters, currentURLParams); if (!validParams) return null; var afParams _objectSpread2({ af_js_web: true, af_ss_ver: window.AF_SMART_SCRIPT.version }, validParams); var finalParams stringifyParameters(afParams).replace(&, ?); var finalURL oneLinkURL + finalParams; var webReferrerValue JSON.parse(localStorage.getItem(LOCAL_STORAGE_VALUES.SS_WEB_REFERRER)); if (webReferrer && webReferrerValue && isValidUrl(webReferrerValue)) { var webReferrerKeyValue &.concat(webReferrer, ).concat(webReferrerValue); finalURL .concat(finalURL).concat(webReferrerKeyValue); } console.debug(Generated OneLink URL, finalURL); window.AF_SMART_SCRIPT.displayQrCode function (htmlId) { var qrOptions arguments.length > 1 && arguments1 ! undefined ? arguments1 : {}; var _qrOptions$logo qrOptions.logo, logo _qrOptions$logo void 0 ? : _qrOptions$logo, _qrOptions$codeColor qrOptions.codeColor, codeColor _qrOptions$codeColor void 0 ? #000 : _qrOptions$codeColor; if (!finalURL) { console.debug(ClickURL is not valid); return null; } return new QRCode(document.getElementById(htmlId), { text: .concat(finalURL, &af_ss_qr).concat(qrOptions.logo || qrOptions.codeColor ? c : true, ), logo: logo, colorDark: getHexColorAfterValidation(codeColor), logoBackgroundTransparent: true, crossOrigin: anonymous, correctLevel: logo ? QRCode.CorrectLevel.Q : QRCode.CorrectLevel.L }); }; createImpressionsLink(finalURL).then(function (impressionsLinkURL) { if (impressionsLinkURL) { window.AF_SMART_SCRIPT.fireImpressionsLink function () { var img new Image(1, 1); img.style.display none; img.style.position absolute; img.style.left -1px; img.style.top -1px; img.src impressionsLinkURL; }; } }); return { clickURL: finalURL }; }; var generateDirectClickURL function generateDirectClickURL() { var _campaign$keys; var parameters arguments.length > 0 && arguments0 ! undefined ? arguments0 : { afParameters: {}, referrerSkipList: , urlSkipList: }; var _parameters$afParamet3 parameters.afParameters, afParameters _parameters$afParamet3 void 0 ? {} : _parameters$afParamet3, _parameters$referrerS2 parameters.referrerSkipList, referrerSkipList _parameters$referrerS2 void 0 ? : _parameters$referrerS2, _parameters$urlSkipLi2 parameters.urlSkipList, urlSkipList _parameters$urlSkipLi2 void 0 ? : _parameters$urlSkipLi2, platform parameters.platform, app_id parameters.app_id, redirectURL parameters.redirectURL; var mediaSource afParameters.mediaSource, campaign afParameters.campaign; if (!mediaSource) { console.error(mediaSource is missing , cant generate URL, mediaSource); return null; } if (!campaign) { console.error(campaign is missing , cant generate URL, campaign); return null; } if (!app_id) { console.error(app_id is missing , cant generate URL, app_id); return null; } if (!redirectURL) { console.error(redirectURL is missing , cant generate URL, redirectURL); return null; } var lowerCasePlatform platform null || platform void 0 ? void 0 : platform.toLowerCase(); if (!isPlatformValid(lowerCasePlatform)) return null; if (typeof app_id ! string) { console.error(app_id must be a string); return null; } if ((campaign null || campaign void 0 ? void 0 : (_campaign$keys campaign.keys) null || _campaign$keys void 0 ? void 0 : _campaign$keys.length) 0 && !(campaign ! null && campaign ! void 0 && campaign.defaultValue)) { console.error(campaign is missing (default value was not supplied), cant generate URL, mediaSource); return null; } if (!isSkipListsValid({ referrerSkipList: referrerSkipList, urlSkipList: urlSkipList })) return null; if (!validatedMs(mediaSource)) return null; var aggregateValues aggregateValuesFromParameters(parameters.afParameters); var currentURLParams getCurrentURLParams(aggregateValues); var validParams validateAndMappedParams(parameters.afParameters, currentURLParams, true); if (!validParams) return null; var afParams _objectSpread2({ af_js_web: true, af_ss_ver: window.AF_SMART_SCRIPT.version }, validParams); var finalParams stringifyParameters(afParams).replace(&, ?); var clickBaseUrl https://engagements.appsflyer.com/v1.0/c2s/click/app/.concat(lowerCasePlatform); if (ios, android.includes(lowerCasePlatform)) { clickBaseUrl https://app.appsflyer.com; } var finalURL .concat(clickBaseUrl, /).concat(app_id).concat(finalParams, &af_r).concat(encodeURIComponent(redirectURL)); if (ios, android.includes(lowerCasePlatform)) { finalURL finalURL.replace(af_media_source, pid).replace(af_campaign, c).replace(af_campaign_id, af_c_id); } console.debug(generate Direct Click URL, finalURL); delete window.AF_SMART_SCRIPT.displayQrCode; delete window.AF_SMART_SCRIPT.fireImpressionsLink; return { clickURL: finalURL }; }; window.AF_SMART_SCRIPT { generateOneLinkURL: generateOneLinkURL, generateDirectClickURL: generateDirectClickURL, version: formatVersion };})();/script>script>// IMPRESSION// Onelink template idvar oneLinkURL https://gearbox.onelink.me/ZiQm;// Define the mapping of incoming URL parameters to outgoing URL parametersvar mediaSource {keys:utm_source,defaultValue:landingpage};var channel {keys:utm_medium,defaultValue:landingpage};var campaign {keys:utm_campaign,defaultValue:Landingpage};var custom_ss_ui {paramKey:af_ss_ui,defaultValue:true}; var afParameters { mediaSource: mediaSource, channel: channel, campaign: campaign, custom_ss_ui: custom_ss_ui, afCustom: // !!! IMPORTANT !!! // The following param is mandatory for cross-platform impression. MUST BE ADDED { paramKey: af_xplatform, keys: , defaultValue: true }, ,};var result window.AF_SMART_SCRIPT.generateOneLinkURL({ oneLinkURL, afParameters,// referrerSkipList, // optional// urlSkipList // optional});if(result) { setTimeout(() > { window.AF_SMART_SCRIPT.fireImpressionsLink(); console.log(Impression fired); }, 1000);} else { console.log(onlink failed to generate url for the impression.);}// INSTALLATION LINKvar platforms { steam: { platformName: steam, appid: 633080, // --- DONT FORGET TO USE YOUR OWN appid redirectURL: https://store.steampowered.com/app/633080/Relic_Hunters_Legend/, // --- DONT FORGET TO USE YOUR OWN redirect URL (Encoded) }}// Remove af_xplatformtrue as installation link does not need this// Find index of custom parameter af_xplatformtrue to remove from afCustom arrayconst indexToRemove afParameters.afCustom.findIndex( (item) > item.paramKey af_xplatform);// Remove item from afCustom array at the found indexif (indexToRemove ! -1) { afParameters.afCustom.splice(indexToRemove, 1);}// Create installation link using generateDirectClickURL() and assign to hreffor (const platformKey in platforms) { let result_url No output from script; const platform platformsplatformKey; // generating direct click URL for the platform // READ MORE: https://dev.appsflyer.com/hc/docs/create-direct-click-url const result window.AF_SMART_SCRIPT.generateDirectClickURL({ afParameters: afParameters, platform: platform.platformName, app_id: platform.appid, redirectURL: platform.redirectURL, }); if (result) { result_url result.clickURL; console.log({result_url}); // update the href attribute for each store banner document.querySelectorAll(.js_wishlist_button).forEach(el > { el.href result_url; // Yup! Thats how were updating the url. Thank you! }) } else { console.log(onelink failed to generate url for the installation link.); }}/script> /body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]