Help
RSS
API
Feed
Maltego
Contact
Domain > ip-api.status.io
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2024-03-12
18.239.94.20
(
ClassC
)
2024-07-01
18.164.116.55
(
ClassC
)
2026-01-07
3.169.173.106
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyServer: CloudFrontDate: Wed, 07 Jan 2026 13:00:46 GMTContent-Type: text/htmlContent-Length: 167Connection: keep-aliveLocation: https://ip-api.status.io/X-Cache: Redirect from cloudfrontVia: 1.1 5ec2b95241693f962e2ff4afc726b38e.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P4X-Amz-Cf-Id: irdfwbdu0S3ajY8OAW1Ny8HVO_czNfvdAXlIaWY1yrbmFRPWW6wNFA html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>CloudFront/center>/body>/html>
Port 443
HTTP/1.1 200 OKContent-Type: text/html; charsetutf-8Content-Length: 118227Connection: keep-aliveDate: Wed, 07 Jan 2026 13:00:46 GMTAccept-Ranges: bytesaccess-control-allow-origin: *x-status-page-id: 5dd19a34d9b3eb0aa5d653abETag: W/1cdd3-LwAzTk/aSaWsLTjxkSTZbfaCemsx-response-time: 115.156msx-varnish: 4328939 6162802Vary: Accept-EncodingX-Cache: Miss from cloudfrontVia: 1.1 e765e4220a4552156eaeff06c1304e0c.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P4X-Amz-Cf-Id: EFf2R-AD07Y9M1BZrQxkX3qOJoooTxxxN5V9qNBPyOyInwblsr3J7gAge: 3418 !DOCTYPE html>html langen>head>meta charsetutf-8>meta http-equivX-UA-Compatible contentIEedge>meta nameviewport contentwidthdevice-width, initial-scale1>meta namedescription contentCurrent system status. View active incidents or upcoming maintenance. Subscribe to receive status notifications.>meta nameauthor content>meta http-equivrefresh content300>link relshortcut icon typeimage/x-icon href//image.status.io/NSsg0kPOE6Wy.ico>link relicon typeimage/x-icon href//image.status.io/NSsg0kPOE6Wy.ico>title>ip-api.com status/title>!-- Bootstrap-->link relstylesheet href//static.status.io/public/statuspage/css/bootstrap.min.css>!-- TimeLine-->link relstylesheet href//static.status.io/public/statuspage/plugins/timeliner/screen.min.css>link relstylesheet href//static.status.io/public/statuspage/plugins/timeliner/responsive.min.css>!-- Fonts-->link href//static.status.io/public/statuspage/fonts/font-awesome/css/font-awesome.min.css relstylesheet>!-- Page Style-->link relstylesheet href//static.status.io/public/statuspage/css/statuspage-default.css?v9>link relstylesheet href//static.status.io/public/statuspage/css/statuspage-200.css?v9>noscript>style>#statusio_metrics { display: none;}/style>/noscript>noscript>style>#section_locations { display: none;}/style>/noscript>style>.brand img { display: block !important; }.img { max-width: 100%; height: auto; vertical-align: middle; border: 0;}.navbar .brand { font-size: 20px; font-weight: 200; color: #555555; text-shadow: 0 1px 0 #ffffff;}.navbar .nav { position: relative; left: 0; display: block; float: left; margin: 0 10px 0 0;}.navbar .nav > li { float: left;}.nav > li > a:hover,.nav > li > a:focus { text-decoration: none; background: none; color: #2C3E50; background-color: #F2F3F4;}.top_bar .panel-body { height: 52px;}.event_inner_text { font-size: 14px;}.event_inner_title { font-size: 16px;}/style>!-- Custom Style-->style>:root { --body-background: #ffffff; --text-color: #363434; --links-color: #363434; --section-background: #ffffff; --border-color: #c9c9c9; --td-background: #ffffff; --td-text: #363434; --top-bar: #6f6f6f;}body { color: var(--text-color); background-color: var(--body-background); overflow-x: hidden;}a:link { color: var(--links-color); text-decoration: none; font-weight: 500;}a:visited { color: var(--links-color); text-decoration: none; font-weight: 500;}a:hover { color: var(--links-color); text-decoration: none; opacity: 0.75; font-weight: 600;}a:active { color: var(--links-color); text-decoration: none; font-weight: 500;}hr { border-top: 1px solid var(--border-color);}.top_bar { background-color: var(--top-bar);}.text { color: var(--text-color);}.section_border_0 { background-color: var(--td-background); border: 0px solid var(--section-background);}.section_border_1 { background-color: var(--section-background); border: 1px solid var(--border-color);}.status_td { color: var(--td-text); background-color: var(--td-background);}.external_service { color: var(--text-color);}a.external_service:link { color: var(--text-color); text-decoration: none;}a.external_service:visited { color: var(--text-color); text-decoration: none;}#statuspage_name { color: var(--text-color);}/* overrides */.no_top_border { border-top-width: 0px;}/style>!-- Custom CSS-->style>/style>!-- Component Uptime Chart Styles-->!-- These styles are designed to work with custom CSS. You can override any of these-->!-- by targeting the classes/IDs in your custom CSS. CSS variables are provided for-->!-- easy customization of colors and spacing.-->style>:root { /* Uptime Chart CSS Variables - Customize these in your custom CSS */ --uptime-chart-wrapper-padding: 10px 15px 10px 8px; --uptime-chart-wrapper-margin: 0; --uptime-chart-max-width: 850px; --uptime-chart-tooltip-bg: #000000; --uptime-chart-tooltip-text: #ffffff; --uptime-chart-tooltip-border-radius: 4px; --uptime-chart-tooltip-padding: 8px 12px; --uptime-chart-tooltip-z-index: 10000;}/* Chart wrapper - contains the entire chart component */.component-uptime-chart-wrapper { box-sizing: border-box; padding: var(--uptime-chart-wrapper-padding); margin: var(--uptime-chart-wrapper-margin); max-width: 100%; overflow: hidden;}/* Chart container - the div that holds the SVG */.component-uptime-chart-container,id^component_uptime_chart_ { min-height: 1rem; max-width: 100%; width: 100%; display: block; overflow: hidden; box-sizing: border-box; margin: 0; padding: 0; /* Prevent layout shift during rendering */ contain: layout style; position: relative;}/* Loading indicator */.component-uptime-chart-loading { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); display: flex; align-items: center; justify-content: center; gap: 8px; color: #666; font-size: 14px; z-index: 1;}.component-uptime-chart-loading.hidden { display: none;}.component-uptime-chart-loading-spinner { width: 11px; height: 11px; border: 2px solid #e0e0e0; border-top-color: #666; border-radius: 50%; animation: component-uptime-chart-spin 0.8s linear infinite;}@keyframes component-uptime-chart-spin { to { transform: rotate(360deg); }}/* Chart SVG element */.component-uptime-chart-container svg,id^component_uptime_chart_ svg { overflow: hidden; max-width: 100%; width: 100%; height: auto; display: block; margin: 0 auto; padding: 0; box-sizing: border-box;}/* Chart bars - styled dynamically via D3, but you can override colors */.component-uptime-chart-container svg .bar,id^component_uptime_chart_ svg .bar { /* Colors are set dynamically via D3 based on status */ /* Override with: .component-uptime-chart-container svg .bar { fill: your-color; } */ stroke: none !important; stroke-width: 0 !important; outline: none !important; border: none !important; shape-rendering: crispEdges;}/* Desktop: Limit max width for better readability */@media (min-width: 769px) { .component-uptime-chart-container svg, id^component_uptime_chart_ svg { max-width: var(--uptime-chart-max-width); }}/* Tablet: Adjust padding */@media (max-width: 768px) { .component-uptime-chart-wrapper { padding: 10px 10px 10px 8px; max-width: 100%; box-sizing: border-box; overflow: hidden; } .component-uptime-chart-container, id^component_uptime_chart_ { padding: 0; overflow: hidden; max-width: 100%; width: 100%; } .component-uptime-chart-container svg, id^component_uptime_chart_ svg { max-width: 100%; width: 100%; box-sizing: border-box; }}/* Mobile: Reduce padding further */@media (max-width: 480px) { .component-uptime-chart-wrapper { padding: 10px 5px 10px 8px; max-width: 100%; box-sizing: border-box; overflow: hidden; } .component-uptime-chart-container, id^component_uptime_chart_ { padding: 0; overflow: hidden; max-width: 100%; width: 100%; } .component-uptime-chart-container svg, id^component_uptime_chart_ svg { max-width: 100%; width: 100%; box-sizing: border-box; }}/* Tooltip - appears on hover over chart bars */.component_chart_tooltip { position: fixed; text-align: center; min-width: 200px; max-width: 300px; min-height: 50px; padding: var(--uptime-chart-tooltip-padding); font: 12px sans-serif; line-height: 1.6; background-color: var(--uptime-chart-tooltip-bg); color: var(--uptime-chart-tooltip-text); border: none; border-radius: var(--uptime-chart-tooltip-border-radius); pointer-events: auto; z-index: var(--uptime-chart-tooltip-z-index); word-wrap: break-word; white-space: normal;}.component_chart_tooltip a,.component_chart_tooltip span { display: inline-block; margin: 2px 0;}/* Tooltip arrow */.component_chart_tooltip:after { content: ; position: absolute; bottom: 100%; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-style: solid; border-color: transparent transparent var(--uptime-chart-tooltip-bg) transparent;}/style>!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->script src//static.status.io/public/statuspage/js/ie10-viewport-bug-workaround.min.js>/script>!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->!-- WARNING: Respond.js doesnt work if you view the page via file:// -->!--if lt IE 9script(srchttps://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js)script(srchttps://oss.maxcdn.com/respond/1.4.2/respond.min.js)-->!-- Clicky Analytics-->script>var clicky_site_ids clicky_site_ids || ;clicky_site_ids.push(100794436);/script>script async src//static.getclicky.com/js>/script>script srchttps://www.google.com/recaptcha/api.js?onloadCaptchaCallback&renderexplicit async defer>/script>/head>body>!-- Scripts-->script src//static.status.io/public/statuspage/js/jquery.min.js>/script>script src//static.status.io/public/statuspage/js/bootstrap.min.js>/script>script src//static.status.io/public/statuspage/js/Autolinker.min.js>/script>div classcontainer>!-- Header logo-->div classheader idstatusio_header>div classrow>div classcol-md-10 col-sm-10 col-xs-12>p>a hrefhttps://ip-api.com/>img idstatuspage_logo src//image.status.io/BBTpjel9SyN4.png altLogo>/a>/p>/div>div classcol-md-2 col-sm-2>div data-section-typesubscriberbutton data-section-nameSubscribe Button (Top) data-editabletrue styledisplay: inline-block; float: right;>ul classnav nav-pills pull-right>li classactive>button classbtn btn-default make_round hidden-xs idsubscribe_button data-togglemodal data-target#subscribeModal>SUBSCRIBE/button>button classbtn btn-default make_round visible-xs-block idsubscribe_button data-togglemodal data-target#subscribeModal stylemargin-bottom:20px;>SUBSCRIBE/button>/li>/ul>/div>/div>/div>/div>!-- Status bar is enabled-->div classpanel panel-default top_bar make_round idstatusio_status_bar data-section-typestatusbar data-section-nameStatus Bar data-editabletrue stylebackground:#00a445; border-bottom:0;>div classpanel-body stylevertical-align: middle;>div classrow>div classcol-md-8 col-sm-6 col-xs-12>strong idstatusbar_text>All Systems Operational/strong>/div>div classcol-md-4 col-sm-6 hidden-xs>p classpull-right white idupdated_ago>Updated a few seconds ago/p>/div>/div>/div>/div>div classpanel panel-default top_bar make_round visible-xs-block idstatusio_last_updated_bar_xs stylebackground:#00a445; border-bottom:0;>div classpanel-body stylevertical-align: middle;>div classrow>div classcol-xs-12>p classwhite idupdated_ago>Updated a few seconds ago/p>/div>/div>/div>/div>div classpage_section idstatusio_components data-section-typecomponents data-section-nameComponents data-editabletrue>!-- first component-->div classcomponent component_first status_td idcomponent_5dd19a34d9b3eb0aa5d653bb styleborder-top: 1px solid #c9c9c9; border-left: 1px solid #c9c9c9; border-right: 1px solid #c9c9c9; border-bottom: 1px solid #c9c9c9;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcomponent_name>i classfa fa-caret-right onclickcontainer_sub_display(5dd19a34d9b3eb0aa5d653bb) idcontainer_sub_display_button_5dd19a34d9b3eb0aa5d653bb>/i> Free API/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right component-status idstatus_text-5dd19a34d9b3eb0aa5d653bb stylecolor: #00a445;>Operational/p>/div>/div>div classrow>div classcol-md-12 col-sm-12 col-xs-12>br>/div>/div>div idcontainer_sub_display_5dd19a34d9b3eb0aa5d653bb styledisplay:none;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>Anycast Load Balancer/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-Ashburn/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-Seattle/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-Los Angeles/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-Dallas/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>UK-London/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>NL-Amsterdam/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>AU-Sydney/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>SG-Singapore/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>/div>/div>!-- middle component-->div classcomponent component_middle status_td idcomponent_5dd19cb78a5b610b8deb4cde styleborder-left: 1px solid #c9c9c9; border-right: 1px solid #c9c9c9; border-bottom: 1px solid #c9c9c9;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcomponent_name>i classfa fa-caret-right onclickcontainer_sub_display(5dd19cb78a5b610b8deb4cde) idcontainer_sub_display_button_5dd19cb78a5b610b8deb4cde>/i> Pro API/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right component-status idstatus_text-5dd19cb78a5b610b8deb4cde stylecolor: #00a445;>Operational/p>/div>/div>div classrow>div classcol-md-12 col-sm-12 col-xs-12>br>/div>/div>div idcontainer_sub_display_5dd19cb78a5b610b8deb4cde styledisplay:none;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-Ashburn/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-Seattle/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-Los Angeles/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-Dallas/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-Miami/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-New York/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-Santa Clara/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>US-Chicago/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>BR-São Paulo/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>UK-London/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>IT-Milan/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>DE-Frankfurt/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>NL-Amsterdam/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>FI-Helsinki/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>RO-Bucharest/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>IN-Mumbai/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>IN-Bangalore/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>IN-Pune/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>HK-Hong Kong/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>JP-Tokyo/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>AU-Sydney/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>SG-Singapore/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>ZA-Cape Town/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>/div>/div>!-- middle component-->div classcomponent component_middle status_td idcomponent_5dd1a827ba02860bc4733eb0 styleborder-left: 1px solid #c9c9c9; border-right: 1px solid #c9c9c9; border-bottom: 1px solid #c9c9c9;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcomponent_name>i classfa fa-caret-right onclickcontainer_sub_display(5dd1a827ba02860bc4733eb0) idcontainer_sub_display_button_5dd1a827ba02860bc4733eb0>/i> EDNS API/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right component-status idstatus_text-5dd1a827ba02860bc4733eb0 stylecolor: #00a445;>Operational/p>/div>/div>div classrow>div classcol-md-12 col-sm-12 col-xs-12>br>/div>/div>div idcontainer_sub_display_5dd1a827ba02860bc4733eb0 styledisplay:none;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>DE-Limburg/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>/div>/div>!-- middle component-->div classcomponent component_middle status_td idcomponent_5dd1a8568a5b610b8deb4ce4 styleborder-left: 1px solid #c9c9c9; border-right: 1px solid #c9c9c9; border-bottom: 1px solid #c9c9c9;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcomponent_name>i classfa fa-caret-right onclickcontainer_sub_display(5dd1a8568a5b610b8deb4ce4) idcontainer_sub_display_button_5dd1a8568a5b610b8deb4ce4>/i> Fingerprint API/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right component-status idstatus_text-5dd1a8568a5b610b8deb4ce4 stylecolor: #00a445;>Operational/p>/div>/div>div classrow>div classcol-md-12 col-sm-12 col-xs-12>br>/div>/div>div idcontainer_sub_display_5dd1a8568a5b610b8deb4ce4 styledisplay:none;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>FR-Roubaix/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>/div>/div>!-- middle component-->div classcomponent component_middle status_td idcomponent_5dd1a899d831620ae18f742d styleborder-left: 1px solid #c9c9c9; border-right: 1px solid #c9c9c9; border-bottom: 1px solid #c9c9c9;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcomponent_name>i classfa fa-caret-right onclickcontainer_sub_display(5dd1a899d831620ae18f742d) idcontainer_sub_display_button_5dd1a899d831620ae18f742d>/i> Map Cache/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right component-status idstatus_text-5dd1a899d831620ae18f742d stylecolor: #00a445;>Operational/p>/div>/div>div classrow>div classcol-md-12 col-sm-12 col-xs-12>br>/div>/div>div idcontainer_sub_display_5dd1a899d831620ae18f742d styledisplay:none;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>FR-Roubaix/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>/div>/div>!-- middle component-->div classcomponent component_middle status_td idcomponent_5dd19cc21699c20941bf0a24 styleborder-left: 1px solid #c9c9c9; border-right: 1px solid #c9c9c9; border-bottom: 1px solid #c9c9c9;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcomponent_name>i classfa fa-caret-right onclickcontainer_sub_display(5dd19cc21699c20941bf0a24) idcontainer_sub_display_button_5dd19cc21699c20941bf0a24>/i> Dashboard/Billing/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right component-status idstatus_text-5dd19cc21699c20941bf0a24 stylecolor: #00a445;>Operational/p>/div>/div>div classrow>div classcol-md-12 col-sm-12 col-xs-12>br>/div>/div>div idcontainer_sub_display_5dd19cc21699c20941bf0a24 styledisplay:none;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>FR-Roubaix/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>/div>/div>!-- last component-->div classcomponent component_last status_td idcomponent_5dd1a8df911f640b4cb18b8a styleborder-left: 1px solid #c9c9c9; border-right: 1px solid #c9c9c9; border-bottom: 1px solid #c9c9c9;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcomponent_name>i classfa fa-caret-right onclickcontainer_sub_display(5dd1a8df911f640b4cb18b8a) idcontainer_sub_display_button_5dd1a8df911f640b4cb18b8a>/i> DNS/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right component-status idstatus_text-5dd1a8df911f640b4cb18b8a stylecolor: #00a445;>Operational/p>/div>/div>div classrow>div classcol-md-12 col-sm-12 col-xs-12>br>/div>/div>div idcontainer_sub_display_5dd1a8df911f640b4cb18b8a styledisplay:none;>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>a/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>div classrow>div classcol-md-8 col-sm-8 col-xs-8>p classcontainer_name stylemargin-left:20px; opacity:0.9;>b/p>/div>div classcol-md-4 col-sm-4 col-xs-4>p classpull-right stylecolor:#00a445; margin-right:20px;opacity:0.9;>Operational/p>/div>/div>/div>/div>/div>!-- Metrics-->div classpage_section idstatusio_metrics data-section-typemetrics data-section-nameMetrics data-editabletrue>div classrow>div classcol-md-2 col-sm-2 col-xs-2>h3>Metrics/h3>/div>div classcol-md-10 col-sm-10 col-xs-10>ul classnav nav-pills pull-right roletablist>li classactive>a href#metric_today roletab data-toggletab>Today/a>/li>li>a href#metric_week roletab data-toggletab>Week/a>/li>li>a href#metric_month roletab data-toggletab>Month/a>/li>/ul>/div>/div>div classrow>div classcol-md-12>div classtab-content>div classtab-pane active idmetric_today>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Free API Requests Per Second/h4>/div>div classcol-md-4 pull-right text-right>h4>44290.00 RPS/h4>/div>/div>br>div id5dd2f0493a14910cf80f1d35-day stylerx: 0; ry: 0; height: 100px; margin: 0 auto;>/div>br>br>/div>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Free API Uptime/h4>/div>div classcol-md-4 pull-right text-right>h4>100.00%/h4>/div>/div>br>div id5dd1ab011699c20941bf0a36-day stylerx: 0; ry: 0; height: 100px; margin: 0 auto;>/div>br>br>/div>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Free API Global Latency (TTFB)/h4>/div>div classcol-md-4 pull-right text-right>h4>54.13ms/h4>/div>/div>br>div id5dd19b661699c20941bf0a22-day stylerx: 0; ry: 0; height: 100px; margin: 0 auto;>/div>br>br>/div>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Pro API Uptime/h4>/div>div classcol-md-4 pull-right text-right>h4>100.00%/h4>/div>/div>br>div id5dd1ab31ba02860bc4733eb2-day stylerx: 0; ry: 0; height: 100px; margin: 0 auto;>/div>br>br>/div>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Pro API Global Latency (TTFB)/h4>/div>div classcol-md-4 pull-right text-right>h4>43.13ms/h4>/div>/div>br>div id5dd1ab48d9b3eb0aa5d653c1-day stylerx: 0; ry: 0; height: 100px; margin: 0 auto;>/div>br>br>/div>/div>/div>div classtab-pane active idmetric_week>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Free API Requests Per Second/h4>/div>div classcol-md-4 pull-right text-right>h4>49318.00 RPS/h4>/div>/div>br>div id5dd2f0493a14910cf80f1d35-week styleheight: 100px; margin: 0 auto;>/div>br>br>/div>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Free API Uptime/h4>/div>div classcol-md-4 pull-right text-right>h4>99.99%/h4>/div>/div>br>div id5dd1ab011699c20941bf0a36-week styleheight: 100px; margin: 0 auto;>/div>br>br>/div>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Free API Global Latency (TTFB)/h4>/div>div classcol-md-4 pull-right text-right>h4>49.00ms/h4>/div>/div>br>div id5dd19b661699c20941bf0a22-week styleheight: 100px; margin: 0 auto;>/div>br>br>/div>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Pro API Uptime/h4>/div>div classcol-md-4 pull-right text-right>h4>100.00%/h4>/div>/div>br>div id5dd1ab31ba02860bc4733eb2-week styleheight: 100px; margin: 0 auto;>/div>br>br>/div>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Pro API Global Latency (TTFB)/h4>/div>div classcol-md-4 pull-right text-right>h4>36.71ms/h4>/div>/div>br>div id5dd1ab48d9b3eb0aa5d653c1-week styleheight: 100px; margin: 0 auto;>/div>br>br>/div>/div>/div>div classtab-pane active idmetric_month>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Free API Requests Per Second/h4>/div>div classcol-md-4 pull-right text-right>h4>45820.00 RPS/h4>/div>/div>br>div classmake_round id5dd2f0493a14910cf80f1d35-month styleheight: 100px; margin: 0 auto;>/div>br>/div>br>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Free API Uptime/h4>/div>div classcol-md-4 pull-right text-right>h4>99.97%/h4>/div>/div>br>div classmake_round id5dd1ab011699c20941bf0a36-month styleheight: 100px; margin: 0 auto;>/div>br>/div>br>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Free API Global Latency (TTFB)/h4>/div>div classcol-md-4 pull-right text-right>h4>55.87ms/h4>/div>/div>br>div classmake_round id5dd19b661699c20941bf0a22-month styleheight: 100px; margin: 0 auto;>/div>br>/div>br>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Pro API Uptime/h4>/div>div classcol-md-4 pull-right text-right>h4>99.98%/h4>/div>/div>br>div classmake_round id5dd1ab31ba02860bc4733eb2-month styleheight: 100px; margin: 0 auto;>/div>br>/div>br>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-8>h4 classmetric_name>Pro API Global Latency (TTFB)/h4>/div>div classcol-md-4 pull-right text-right>h4>33.60ms/h4>/div>/div>br>div classmake_round id5dd1ab48d9b3eb0aa5d653c1-month styleheight: 100px; margin: 0 auto;>/div>br>/div>br>/div>/div>/div>/div>/div>/div>div classpage_section idstatusio_stats_widget data-section-typestatswidget data-section-nameStats Widget data-editabletrue>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-sm-4 col-xs-12>p classdata-block widget-block>p stylefont-size: 60px; line-height: 1; display: block; text-align: center;>0/p>p styletext-align: center;>Upcoming Maintenances/p>/p>/div>div classcol-sm-4 col-xs-12>p classdata-block widget-block styletext-align: center;>p stylefont-size: 60px; line-height: 1; display: block; text-align: center;>0/p>p styletext-align: center;>Incidents Last 30 Days/p>/p>/div>div classcol-sm-4 col-xs-12>p classdata-block widget-block styletext-align: center;>p stylefont-size: 60px; line-height: 1; display: block; text-align: center;>0/p>p styletext-align: center;>Maintenances Last 30 Days/p>/p>/div>/div>/div>/div>/div>div classpage_section idstatusio_external_services data-section-typeexternalservices data-section-nameExternal Services data-editabletrue>div classrow>div classcol-md-4>h3>External Services/h3>/div>div classcol-md-8>/div>/div>div classpanel panel-default section_border_1 make_round>div classpanel-body>div classrow>div classcol-md-3 col-sm-4 col-xs-6>h4 classexternal_service_single text-center>span stylecolor:#00a445; data-toggletooltip data-placementtop title data-original-titleService Description: Payment Processing<br><br>Current Status: Operational>i classfa fa-check>span classexternal_service> a classexternal_service hrefhttps://www.paypal-status.com/product/production target_blank styleborder-bottom:none;text-decoration:none; titleStatus Page>Paypal/a>/span>/i>/span>/h4>/div>div classcol-md-3 col-sm-4 col-xs-6>h4 classexternal_service_single text-center>span stylecolor:#00a445; data-toggletooltip data-placementtop title data-original-titleService Description: Email Delivery<br><br>Current Status: Operational>i classfa fa-check>span classexternal_service> a classexternal_service hrefhttps://status.postmarkapp.com target_blank styleborder-bottom:none;text-decoration:none; titleStatus Page>Postmark/a>/span>/i>/span>/h4>/div>/div>/div>/div>/div>!-- Map-->div classpage_section idsection_main_history data-section-typehistory data-section-nameHistory data-editabletrue>div classrow stylemargin-bottom: -50px;>div classcol-md-4>h3>History/h3>/div>div classcol-md-8>/div>/div>!-- No history-->div classrow no_history>div classcol-md-12>h4 classtext-center>No incidents in the last 7 days/h4>/div>/div>/div>!-- Placeholder removed - inactive elements are not shown-->!-- Footer-->div classpage_section idsection_page_links data-section-typefooter data-section-nameFooter data-editabletrue>div classrow>div classcol-sm-9>div idbottom_menu>/div>/div>div classcol-sm-3>div idstatusio_branding>a classpull-right hrefhttps://status.io target_blank>Powered by Status.io/a>/div>/div>/div>/div>!-- Subscriber modal-->div classmodal fade idsubscribeModal tabindex-1 roledialog aria-labelledbysubscribeModalLabel aria-hiddentrue>div classmodal-dialog>div classmodal-content make_round modal-text>div classmodal-body>div classrow>div classcol-md-12>ul classnav nav-pills roletablist>li idtab_menu_email stylepadding-top:5px;>a titleEmail href#tab_email roletab data-toggletab>span>i classfa fa-envelope>/i>/span>/a>/li>li idtab_menu_rss stylepadding-top:5px;>a titleRSS href#tab_rss roletab data-toggletab>span>i classfa fa-rss>/i>/span>/a>/li>/ul>/div>/div>div classrow margin-top-40>div classcol-md-12>div classtab-content> div classtab-pane idtab_email>div classrow>div classcol-sm-12>h4 classtext-center idsubscribe_email_text_content>Subscribe to receive status updates by email/h4>/div>/div>br>div classrow margin-top-20>div classcol-md-3>/div>div classcol-md-6>input classform-control make_round idsubscribe_email_address typetext placeholderEmail namesubscribe_email_address autofocusautofocus>input classform-control typehidden placeholderEmail nameemail>/div>/div>div classrow idrecaptcha_block_email>div classcol-md-12 styletext-align:center;>br>br>div idrecaptcha_email styledisplay: inline-block>/div>br>/div>/div>div classrow subscribe-modal-footer>div classrow>div classcol-md-6>div classpull-left idresult_subscribe_email styletext-align:left;>/div>/div>div classcol-md-6>button classbtn btn-default make_round typebutton data-dismissmodal>Close/button>button classbtn btn-default make_round idsubscribe_button_email typebutton>Subscribe/button>button classbtn btn-default make_round idmanage_button_email typebutton styledisplay:none;>Manage Subscription/button>/div>/div>div classrow>div classcol-md-12 styletext-align:center;>br>small idmanage_subscription_email stylecursor:pointer;>Manage Existing Subscription/small>small iddont_manage_subscription_email styledisplay:none;cursor:pointer;>Create New Subscription/small>/div>/div>/div>/div>div classtab-pane idtab_rss>div classrow>div classcol-sm-12>h4 classtext-center>Subscribe to receive status updates via RSS/h4>/div>/div>br>div classrow margin-top-20>div classcol-md-2>/div>div classcol-md-8 text-center>a classbtn btn-lg btn-default make_round idsubscribe_link_rss hrefhttps://ip-api.status.io/pages/5dd19a34d9b3eb0aa5d653ab/rss target_blank stylecolor:#000; font-size: 20px;>RSS Feed/a>/div>/div>div classrow subscribe-modal-footer>div classcol-md-6>/div>div classcol-md-6>button classbtn btn-default make_round typebutton data-dismissmodal>Close/button>/div>/div>/div>/div>/div>/div>/div>/div>/div>/div>script>function container_sub_display(component_id) { var component_div; component_div document.getElementById(container_sub_display_+component_id); if (component_div.style.display none) { component_div.style.display block; $(#status_text-+component_id).hide(); $(#container_sub_display_button_+component_id).removeClass(fa-caret-right); $(#container_sub_display_button_+component_id).addClass(fa-caret-down); } else { component_div.style.display none; $(#status_text-+component_id).show(); $(#container_sub_display_button_+component_id).removeClass(fa-caret-down); $(#container_sub_display_button_+component_id).addClass(fa-caret-right); }}/script>/div>!-- Subscriber scripts-->script>$(document).ready(function(){ $(#tab_email).addClass(active); $(#tab_menu_email).addClass(active);});/script>script>$(#subscribe_button_email).click(function (event) { event.preventDefault(); var address $(#subscribe_email_address).val(); var email $(#email).val(); if (true true) { var recaptcha grecaptcha.getResponse(RecaptchaEmail); } else { var recaptcha ; } $.ajax({ url: /subscriber/add, type: POST, data: ({ statuspage_id: 5dd19a34d9b3eb0aa5d653ab, method: email, address: address, email: email, recaptcha: recaptcha }), success: function(data){ if (true true) { grecaptcha.reset(RecaptchaEmail); } var message_text data.status.message; $(#result_subscribe_email).html(div class\alert alert-success\ style\margin-top: 10px;\>+message_text+/div>); $(#result_subscribe_email).show(); setTimeout(function(){ $(#result_subscribe_email).fadeOut(slow, function () { $(#result_subscribe_email).hide(); }); }, 12000); } });})/script>script>$(#subscribe_button_sms).click(function (event) { event.preventDefault(); var address $(#subscribe_sms_country_code).val() + $(#subscribe_sms_number).val(); if (true true) { var recaptcha grecaptcha.getResponse(RecaptchaSms); } else { var recaptcha ; } $.ajax({ url: /subscriber/add, type: POST, data: ({ statuspage_id: 5dd19a34d9b3eb0aa5d653ab, method: sms, address: address, recaptcha: recaptcha }), success: function(data){ if (true true) { grecaptcha.reset(RecaptchaSms); } var message_text data.status.message; $(#result_subscribe_sms).html(div class\alert alert-success\ style\margin-top: 10px;\>+message_text+/div>); $(#result_subscribe_sms).show(); setTimeout(function(){ $(#result_subscribe_sms).fadeOut(slow, function () { $(#result_subscribe_sms).hide(); }); }, 15000); } });})/script>script>$(#subscribe_button_webhook).click(function (event) { event.preventDefault(); var address $(#subscribe_webhook_address).val(); var address_email $(#subscribe_webhook_address_email).val(); if (true true) { var recaptcha grecaptcha.getResponse(RecaptchaWebhook); } else { var recaptcha ; } $.ajax({ url: /subscriber/add, type: POST, data: ({ statuspage_id: 5dd19a34d9b3eb0aa5d653ab, method: webhook, address: address, address_email: address_email, recaptcha: recaptcha }), success: function(data){ if (true true) { grecaptcha.reset(RecaptchaWebhook); } var message_text data.status.message; $(#result_subscribe_webhook).html(div class\alert alert-success\ style\margin-top: 10px;\>+message_text+/div>); $(#result_subscribe_webhook).show(); setTimeout(function(){ $(#result_subscribe_webhook).fadeOut(slow, function () { $(#result_subscribe_webhook).hide(); }); }, 12000); } });})/script>script>$(#subscribe_button_msteams).click(function (event) { event.preventDefault(); var address $(#subscribe_msteams_address).val(); var address_email $(#subscribe_msteams_address_email).val(); if (true true) { var recaptcha grecaptcha.getResponse(RecaptchaMsteams); } else { var recaptcha ; } $.ajax({ url: /subscriber/add, type: POST, data: ({ statuspage_id: 5dd19a34d9b3eb0aa5d653ab, method: msteams, address: address, address_email: address_email, recaptcha: recaptcha }), success: function(data){ if (true true) { grecaptcha.reset(RecaptchaMsteams); } var message_text data.status.message; $(#result_subscribe_msteams).html(div class\alert alert-success\ style\margin-top: 10px;\>+message_text+/div>); $(#result_subscribe_msteams).show(); setTimeout(function(){ $(#result_subscribe_msteams).fadeOut(slow, function () { $(#result_subscribe_msteams).hide(); }); }, 12000); } });})/script>script>$(#subscribeModal).on(shown.bs.modal, function() { $(this).find(input:first).focus();}); /script>script>$(#manage_subscription_email).click(function (event) { event.preventDefault(); $(#recaptcha_block_email).hide(); $(#manage_subscription_email).hide(); $(#subscribe_button_email).hide(); $(#manage_button_email).show(); $(#subscribe_email_text_content).html(Enter the email address you subscribed with); $(#dont_manage_subscription_email).show();})/script>script>$(#dont_manage_subscription_email).click(function (event) { event.preventDefault(); $(#dont_manage_subscription_email).hide(); $(#recaptcha_block_email).show(); $(#subscribe_button_email).show(); $(#manage_button_email).hide(); $(#subscribe_email_text_content).html(Subscribe to receive status updates by email); $(#manage_subscription_email).show();})/script>script>$(#manage_button_email).click(function (event) { event.preventDefault(); var address $(#subscribe_email_address).val(); var email $(#email).val(); $.ajax({ url: /subscriber/email/request_manage_link, type: POST, data: ({ statuspage_id: 5dd19a34d9b3eb0aa5d653ab, method: email, address: address, email: email }), success: function(data){ var message_text data.status.message; $(#result_subscribe_email).html(div class\alert alert-success\ style\margin-top: 10px;\>+message_text+/div>); $(#result_subscribe_email).show(); setTimeout(function(){ $(#result_subscribe_email).fadeOut(slow, function () { $(#result_subscribe_email).hide(); }); }, 12000); } });})/script>script>$(#manage_subscription_webhook).click(function (event) { event.preventDefault(); $(#recaptcha_block_webhook).hide(); $(#manage_subscription_webhook).hide(); $(#subscribe_button_webhook).hide(); $(#manage_button_webhook).show(); $(#subscribe_webhook_text_content).html(Enter the webhook URL and email address you subscribed with); $(#dont_manage_subscription_webhook).show();})/script>script>$(#dont_manage_subscription_webhook).click(function (event) { event.preventDefault(); $(#dont_manage_subscription_webhook).hide(); $(#recaptcha_block_webhook).show(); $(#subscribe_button_webhook).show(); $(#manage_button_webhook).hide(); $(#subscribe_webhook_text_content).html(Subscribe to receive status updates by webhook); $(#manage_subscription_webhook).show();})/script>script>$(#manage_button_webhook).click(function (event) { event.preventDefault(); var address $(#subscribe_webhook_address).val(); var address_email $(#subscribe_webhook_address_email).val(); $.ajax({ url: /subscriber/webhook/request_manage_link, type: POST, data: ({ statuspage_id: 5dd19a34d9b3eb0aa5d653ab, method: webhook, address: address, address_email: address_email }), success: function(data){ var message_text data.status.message; $(#result_subscribe_webhook).html(div class\alert alert-success\ style\margin-top: 10px;\>+message_text+/div>); $(#result_subscribe_webhook).show(); setTimeout(function(){ $(#result_subscribe_webhook).fadeOut(slow, function () { $(#result_subscribe_webhook).hide(); }); }, 12000); } });})/script>script>$(#manage_subscription_msteams).click(function (event) { event.preventDefault(); $(#recaptcha_block_msteams).hide(); $(#manage_subscription_msteams).hide(); $(#subscribe_button_msteams).hide(); $(#manage_button_msteams).show(); $(#subscribe_msteams_text_content).html(Enter the Microsoft Teams Webhook and email address you subscribed with); $(#dont_manage_subscription_msteams).show();})/script>script>$(#dont_manage_subscription_msteams).click(function (event) { event.preventDefault(); $(#dont_manage_subscription_msteams).hide(); $(#recaptcha_block_msteams).show(); $(#subscribe_button_msteams).show(); $(#manage_button_msteams).hide(); $(#subscribe_msteams_text_content).html(Subscribe to receive status updates in Microsoft Teams); $(#manage_subscription_msteams).show();})/script>script>$(#manage_button_msteams).click(function (event) { event.preventDefault(); var address $(#subscribe_msteams_address).val(); var address_email $(#subscribe_msteams_address_email).val(); $.ajax({ url: /subscriber/msteams/request_manage_link, type: POST, data: ({ statuspage_id: 5dd19a34d9b3eb0aa5d653ab, method: msteams, address: address, address_email: address_email }), success: function(data){ var message_text data.status.message; $(#result_subscribe_msteams).html(div class\alert alert-success\ style\margin-top: 10px;\>+message_text+/div>); $(#result_subscribe_msteams).show(); setTimeout(function(){ $(#result_subscribe_msteams).fadeOut(slow, function () { $(#result_subscribe_msteams).hide(); }); }, 12000); } });})/script>script>$(#manage_subscription_slack).click(function (event) { event.preventDefault(); $(#manage_subscription_slack).hide(); $(#subscribe_link_slack).hide(); $(#slack_manage_channel_div).show(); $(#slack_manage_email_address_div).show(); $(#manage_button_slack).show(); $(#subscribe_slack_text_content).html(Enter the Slack channel and email address you subscribed with); $(#dont_manage_subscription_slack).show();})/script>script>$(#dont_manage_subscription_slack).click(function (event) { event.preventDefault(); $(#dont_manage_subscription_slack).hide(); $(#subscribe_link_slack).show(); $(#slack_manage_channel_div).hide(); $(#slack_manage_email_address_div).hide(); $(#manage_button_slack).hide(); $(#subscribe_slack_text_content).html(Receive status notifications in your Slack channel); $(#manage_subscription_slack).show();})/script>script>$(#manage_button_slack).click(function (event) { event.preventDefault(); var channel $(#manage_slack_channel).val(); var address_email $(#manage_slack_address_email).val(); $.ajax({ url: /subscriber/slack/request_manage_link, type: POST, data: ({ statuspage_id: 5dd19a34d9b3eb0aa5d653ab, channel: channel, address_email: address_email }), success: function(data){ var message_text data.status.message; $(#result_subscribe_slack).html(div class\alert alert-success\ style\margin-top: 10px;\>+message_text+/div>); $(#result_subscribe_slack).show(); setTimeout(function(){ $(#result_subscribe_slack).fadeOut(slow, function () { $(#result_subscribe_slack).hide(); }); }, 12000); } });})/script>script>$(#manage_subscription_sms).click(function (event) { event.preventDefault(); $(#recaptcha_block_sms).hide(); $(#manage_subscription_sms).hide(); $(#subscribe_button_sms).hide(); $(#manage_button_sms).show(); $(#subscribe_sms_text_content).html(Enter the number you subscribed with); $(#dont_manage_subscription_sms).show();})/script>script>$(#dont_manage_subscription_sms).click(function (event) { event.preventDefault(); $(#dont_manage_subscription_sms).hide(); $(#recaptcha_block_sms).show(); $(#subscribe_button_sms).show(); $(#manage_button_sms).hide(); $(#subscribe_sms_text_content).html(Subscribe to receive status updates by text message); $(#manage_subscription_sms).show();})/script>script>$(#manage_button_sms).click(function (event) { event.preventDefault(); var address $(#subscribe_sms_country_code).val() + $(#subscribe_sms_number).val(); var sms $(#sms).val(); $.ajax({ url: /subscriber/sms/request_manage_link, type: POST, data: ({ statuspage_id: 5dd19a34d9b3eb0aa5d653ab, method: sms, address: address }), success: function(data){ var message_text data.status.message; $(#result_subscribe_sms).html(div class\alert alert-success\ style\margin-top: 10px;\>+message_text+/div>); $(#result_subscribe_sms).show(); setTimeout(function(){ $(#result_subscribe_sms).fadeOut(slow, function () { $(#result_subscribe_sms).hide(); }); }, 12000); } });})/script>script>var RecaptchaEmail;var RecaptchaWebhook;var RecaptchaMsteams;var RecaptchaSms;var CaptchaCallback function() { try { RecaptchaEmail grecaptcha.render(recaptcha_email, {sitekey : 6LfUGdYUAAAAAMYgIMazWyflgU_RotcqxZM-fTOB}); } catch(err) {} try { RecaptchaWebhook grecaptcha.render(recaptcha_webhook, {sitekey : 6LfUGdYUAAAAAMYgIMazWyflgU_RotcqxZM-fTOB}); } catch(err) {} try { RecaptchaMsteams grecaptcha.render(recaptcha_msteams, {sitekey : 6LfUGdYUAAAAAMYgIMazWyflgU_RotcqxZM-fTOB}); } catch(err) {} try { RecaptchaSms grecaptcha.render(recaptcha_sms, {sitekey : 6LfUGdYUAAAAAMYgIMazWyflgU_RotcqxZM-fTOB}); } catch(err) {}};/script>script>$(document).ready(function(){ $(data-toggletooltip).tooltip({placement: top, html: true});});/script>!-- History timeline-->script src//static.status.io/public/statuspage/plugins/timeliner/timeliner.min.js>/script>script>$(document).ready(function(){ $.timeliner({ startState: open, expandAllText: Expand All, collapseAllText: Collapse All }); $.timeliner({ timelineContainer: #timelineContainer }); $(#expandAll).addClass(expanded).html(Collapse All);});/script>!-- Metric scripts-->script>$(document).ready(function(){ $(#metric_month).removeClass(active); $(#metric_week).removeClass(active);});/script>script>$(document).ready(function(){ $(.nav-pills a).click(function (e) { e.preventDefault(); $(this).tab(show); $(window).trigger(resize); })});/script>script src//static.status.io/public/statuspage/plugins/highcharts/highcharts.js?v3.0.10>/script>script src//static.status.io/public/statuspage/plugins/highcharts/modules/exporting.js?v3.0.10>/script>script>Highcharts.theme { colors: #363434, #7798BF, #55BF3B, #DF5353, #aaeeee, #ff0066, #eeaaee, #55BF3B, #DF5353, #7798BF, #aaeeee, chart: { backgroundColor: #ffffff, borderWidth: 0, borderRadius: 15, plotBackgroundColor: null, plotShadow: false, plotBorderWidth: 0, animation: true }, title: { style: { color: #FFF, font: 16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif } }, subtitle: { style: { color: #DDD, font: 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif } }, xAxis: { gridLineWidth: 0, lineColor: #999, tickColor: #999, labels: { style: { color: #999, fontWeight: bold } }, title: { style: { color: #AAA, font: bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif } } }, yAxis: { alternateGridColor: null, minorTickInterval: null, gridLineColor: rgba(255, 255, 255, .1), minorGridLineColor: rgba(255,255,255,0.07), lineWidth: 0, tickWidth: 0, labels: { style: { color: #999, fontWeight: bold } }, title: { style: { color: #AAA, font: bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif } } }, legend: { itemStyle: { color: #CCC }, itemHoverStyle: { color: #FFF }, itemHiddenStyle: { color: #333 } }, labels: { style: { color: #CCC } }, tooltip: { backgroundColor: { linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, stops: 0, rgba(96, 96, 96, .8), 1, rgba(16, 16, 16, .8) }, borderWidth: 0, style: { color: #FFF } }, plotOptions: { series: { shadow: true, animation: true }, line: { dataLabels: { color: #CCC }, marker: { lineColor: #333 } }, spline: { marker: { lineColor: #333 } }, scatter: { marker: { lineColor: #333 } }, candlestick: { lineColor: white } }, toolbar: { itemStyle: { color: #CCC } }, navigation: { buttonOptions: { symbolStroke: #DDDDDD, hoverSymbolStroke: #FFFFFF, theme: { fill: { linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, stops: 0.4, #606060, 0.6, #333333 }, stroke: #000000 } } }, // scroll charts rangeSelector: { buttonTheme: { fill: { linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, stops: 0.4, #888, 0.6, #555 }, stroke: #000000, style: { color: #CCC, fontWeight: bold }, states: { hover: { fill: { linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, stops: 0.4, #BBB, 0.6, #888 }, stroke: #000000, style: { color: white } }, select: { fill: { linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, stops: 0.1, #000, 0.3, #333 }, stroke: #000000, style: { color: yellow } } } }, inputStyle: { backgroundColor: #333, color: silver }, labelStyle: { color: silver } }, navigator: { handles: { backgroundColor: #666, borderColor: #AAA }, outlineColor: #CCC, maskFill: rgba(16, 16, 16, 0.5), series: { color: #7798BF, lineColor: #A6C7ED } }, scrollbar: { barBackgroundColor: { linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, stops: 0.4, #888, 0.6, #555 }, barBorderColor: #CCC, buttonArrowColor: #CCC, buttonBackgroundColor: { linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, stops: 0.4, #888, 0.6, #555 }, buttonBorderColor: #CCC, rifleColor: #FFF, trackBackgroundColor: { linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, stops: 0, #000, 1, #333 }, trackBorderColor: #666 }, // special colors for some of the demo examples legendBackgroundColor: rgba(48, 48, 48, 0.8), legendBackgroundColorSolid: rgb(70, 70, 70), dataLabelsColor: #444, textColor: #E0E0E0, maskColor: rgba(255,255,255,0.3)};// Apply the themevar highchartsOptions Highcharts.setOptions(Highcharts.theme);/script>script>$(function () { var point_start 1767704400000 $(#5dd2f0493a14910cf80f1d35-day).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, title: { text: null }, dateTimeLabelFormats : { hour: %I %p, minute: %I:%M %p } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 25000 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: RPS, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + RPS/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: point_start, pointInterval: 3600 * 1000, data: 51484,52525,51875,50217,48059,46117,44909,42894,42358,40521,39679,39240,38589,38987,40238,40477,40261,41171,42402,43856,44714,45484,47056,49859 } });});/script>script>$(function () { $(#5dd2f0493a14910cf80f1d35-week).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, min: 1767225600000, title: { text: null } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 25000 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: RPS, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + RPS/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: 1767225600000, pointInterval: 24 * 3600 * 1000, data: 49659,52033,52770,52405,50732,44860,42772 } });});/script>script>$(function () { $(#5dd2f0493a14910cf80f1d35-month).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, min: 1765238400000, title: { text: null } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 25000 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: RPS, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + RPS/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: 1765238400000, pointInterval: 24 * 3600 * 1000, data: 44642,45495,45288,45384,45456,45443,45900,46523,46870,44531,44263,44674,44412,44013,44075,43549,43270,43842,44221,43802,44596,44466,44658,49659,52033,52770,52405,50732,44860,42772 } });});/script>script>$(function () { var point_start 1767704400000 $(#5dd1ab011699c20941bf0a36-day).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, title: { text: null }, dateTimeLabelFormats : { hour: %I %p, minute: %I:%M %p } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 100 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: %, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + %/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: point_start, pointInterval: 3600 * 1000, data: 100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00 } });});/script>script>$(function () { $(#5dd1ab011699c20941bf0a36-week).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, min: 1767186000000, title: { text: null } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 100 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: %, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + %/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: 1767186000000, pointInterval: 24 * 3600 * 1000, data: 100.00,100.00,99.93,100.00,100.00,100.00,100.00 } });});/script>script>$(function () { $(#5dd1ab011699c20941bf0a36-month).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, min: 1765198800000, title: { text: null } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 100 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: %, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + %/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: 1765198800000, pointInterval: 24 * 3600 * 1000, data: 99.93,100.00,99.93,100.00,100.00,99.93,100.00,99.93,99.93,100.00,99.93,99.86,99.93,99.79,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,99.93,100.00,100.00,100.00,100.00 } });});/script>script>$(function () { var point_start 1767704400000 $(#5dd19b661699c20941bf0a22-day).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, title: { text: null }, dateTimeLabelFormats : { hour: %I %p, minute: %I:%M %p } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 150 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: ms, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + ms/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: point_start, pointInterval: 3600 * 1000, data: 60,53,48,56,47,53,59,44,52,44,141,46,53,50,50,38,53,58,55,51,52,45,53,38 } });});/script>script>$(function () { $(#5dd19b661699c20941bf0a22-week).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, min: 1767186000000, title: { text: null } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 150 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: ms, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + ms/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: 1767186000000, pointInterval: 24 * 3600 * 1000, data: 50,51,38,52,51,47,54 } });});/script>script>$(function () { $(#5dd19b661699c20941bf0a22-month).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, min: 1765198800000, title: { text: null } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 150 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: ms, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + ms/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: 1765198800000, pointInterval: 24 * 3600 * 1000, data: 63,52,43,52,50,60,51,72,69,49,68,92,79,69,52,50,49,50,49,52,63,48,51,50,51,38,52,51,47,54 } });});/script>script>$(function () { var point_start 1767704400000 $(#5dd1ab31ba02860bc4733eb2-day).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, title: { text: null }, dateTimeLabelFormats : { hour: %I %p, minute: %I:%M %p } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 100 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: %, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + %/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: point_start, pointInterval: 3600 * 1000, data: 100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00 } });});/script>script>$(function () { $(#5dd1ab31ba02860bc4733eb2-week).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, min: 1767186000000, title: { text: null } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 100 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: %, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + %/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: 1767186000000, pointInterval: 24 * 3600 * 1000, data: 100.00,100.00,100.00,100.00,100.00,100.00,100.00 } });});/script>script>$(function () { $(#5dd1ab31ba02860bc4733eb2-month).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, min: 1765198800000, title: { text: null } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 100 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: %, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + %/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: 1765198800000, pointInterval: 24 * 3600 * 1000, data: 99.86,99.93,100.00,100.00,99.93,99.93,100.00,100.00,99.93,100.00,100.00,100.00,99.93,99.93,99.93,99.93,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00,100.00 } });});/script>script>$(function () { var point_start 1767704400000 $(#5dd1ab48d9b3eb0aa5d653c1-day).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, title: { text: null }, dateTimeLabelFormats : { hour: %I %p, minute: %I:%M %p } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 150 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: ms, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + ms/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: point_start, pointInterval: 3600 * 1000, data: 26,54,90,70,17,30,29,36,34,31,36,27,18,28,28,33,53,37,109,37,74,56,59,23 } });});/script>script>$(function () { $(#5dd1ab48d9b3eb0aa5d653c1-week).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, min: 1767186000000, title: { text: null } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 150 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: ms, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + ms/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: 1767186000000, pointInterval: 24 * 3600 * 1000, data: 33,33,36,45,36,31,43 } });});/script>script>$(function () { $(#5dd1ab48d9b3eb0aa5d653c1-month).highcharts({ chart: { type: line, marginRight: 20, marginBottom: 25, animation: true }, credits: { enabled: false }, exporting: { enabled: false }, title: { text: , x: -20 //center }, subtitle: { text: , x: -20 }, xAxis: { type: datetime, minPadding: 0, maxPadding: 0, min: 1765198800000, title: { text: null } }, yAxis: { gridLineColor : #E6E6E6, gridLineWidth: .5, title: { text: }, plotLines: { value: 0, width: 1, color: #F0F0F0 }, min: 0, max: 150 }, tooltip: { enabled: true, followPointer: false, followTouchMove: false, snap: 5, shared: false, valueSuffix: ms, useHTML: true, formatter: function() { var serie this.series; var s ; s + b> + this.y + ms/b>; return s; } }, legend: { enabled: false }, plotOptions: { line: { enableMouseTracking: true, marker: { enabled: true, states: { hover: { enabled: true } } } } }, series: { name: Average, pointStart: 1765198800000, pointInterval: 24 * 3600 * 1000, data: 62,21,37,32,51,39,26,29,18,28,28,25,16,30,48,33,30,32,29,31,34,32,40,33,33,36,45,36,31,43 } });});/script>script>$(document).ready(function(){ var current_chart $(#5dd2f0493a14910cf80f1d35-day).highcharts(); current_chart.yAxis0.update({ min: null, max: null }); var current_chart $(#5dd2f0493a14910cf80f1d35-week).highcharts(); current_chart.yAxis0.update({ min: null, max: null }); var current_chart $(#5dd2f0493a14910cf80f1d35-month).highcharts(); current_chart.yAxis0.update({ min: null, max: null });});/script>script>$(document).ready(function(){ var current_chart $(#5dd1ab011699c20941bf0a36-day).highcharts(); current_chart.yAxis0.update({ min: null, max: null }); var current_chart $(#5dd1ab011699c20941bf0a36-week).highcharts(); current_chart.yAxis0.update({ min: null, max: null }); var current_chart $(#5dd1ab011699c20941bf0a36-month).highcharts(); current_chart.yAxis0.update({ min: null, max: null });});/script>script>$(document).ready(function(){ var current_chart $(#5dd19b661699c20941bf0a22-day).highcharts(); current_chart.yAxis0.update({ min: null, max: null }); var current_chart $(#5dd19b661699c20941bf0a22-week).highcharts(); current_chart.yAxis0.update({ min: null, max: null }); var current_chart $(#5dd19b661699c20941bf0a22-month).highcharts(); current_chart.yAxis0.update({ min: null, max: null });});/script>script>$(document).ready(function(){ var current_chart $(#5dd1ab31ba02860bc4733eb2-day).highcharts(); current_chart.yAxis0.update({ min: null, max: null }); var current_chart $(#5dd1ab31ba02860bc4733eb2-week).highcharts(); current_chart.yAxis0.update({ min: null, max: null }); var current_chart $(#5dd1ab31ba02860bc4733eb2-month).highcharts(); current_chart.yAxis0.update({ min: null, max: null });});/script>script>$(document).ready(function(){ var current_chart $(#5dd1ab48d9b3eb0aa5d653c1-day).highcharts(); current_chart.yAxis0.update({ min: null, max: null }); var current_chart $(#5dd1ab48d9b3eb0aa5d653c1-week).highcharts(); current_chart.yAxis0.update({ min: null, max: null }); var current_chart $(#5dd1ab48d9b3eb0aa5d653c1-month).highcharts(); current_chart.yAxis0.update({ min: null, max: null });});/script>!-- Preview mode - listen for postMessage updates-->script>(function() { // Check if were in preview mode by checking URL parameter var urlParams new URLSearchParams(window.location.search); var isPreviewMode urlParams.get(preview_mode) true; if (isPreviewMode) { console.log(✅ Preview mode enabled, listening for messages); // Add hover/click detection for sections var highlightedSection null; // Add hover styles var style document.createElement(style); style.textContent ` .page_sectiondata-editabletrue, #statusio_status_bardata-editabletrue, divdata-section-typesubscriberbuttondata-editabletrue, .statuspage_namedata-editabletrue, a.statuspage_namedata-editabletrue { position: relative; transition: all 0.2s ease; } .page_sectiondata-editabletrue:hover, #statusio_status_bardata-editabletrue:hover, divdata-section-typesubscriberbuttondata-editabletrue:hover, .statuspage_namedata-editabletrue:hover, a.statuspage_namedata-editabletrue:hover { outline: 2px solid #27ae60 !important; outline-offset: 2px; cursor: pointer; } .page_sectiondata-editabletrue.section-highlighted, #statusio_status_bardata-editabletrue.section-highlighted, divdata-section-typesubscriberbuttondata-editabletrue.section-highlighted, .statuspage_namedata-editabletrue.section-highlighted, a.statuspage_namedata-editabletrue.section-highlighted { outline: 3px solid #27ae60 !important; outline-offset: 3px; box-shadow: 0 0 0 4px rgba(39, 174, 96, 0.2); } .section-edit-indicator { position: absolute; top: 5px; right: 5px; background: #6c757d; color: white; padding: 4px 8px; border-radius: 4px; font-size: 11px; font-weight: 600; z-index: 1000; pointer-events: none; box-shadow: 0 2px 4px rgba(0,0,0,0.2); filter: grayscale(100%); display: flex; align-items: center; } .section-edit-indicator .elusive { font-size: 12px; line-height: 1; } /* Hide grey placeholders for disabled sections - dont show inactive elements */ .page_sectiondata-editabletruestyle*opacity: 0.3 { display: none !important; } `; document.head.appendChild(style); // Add hover/click handlers to editable sections var sectionInteractionSetup false; var sectionEventHandlers new Map(); // Store handlers to remove them later function setupSectionInteraction() { var sections document.querySelectorAll(.page_sectiondata-editabletrue, #statusio_status_bardata-editabletrue, divdata-section-typesubscriberbuttondata-editabletrue, .statuspage_namedata-editabletrue, a.statuspage_namedata-editabletrue); // Remove old event listeners if they exist sections.forEach(function(section) { var sectionId section.getAttribute(data-section-type) || section.id; if (sectionEventHandlers.has(sectionId)) { var handlers sectionEventHandlers.get(sectionId); section.removeEventListener(mouseenter, handlers.mouseenter); section.removeEventListener(mouseleave, handlers.mouseleave); section.removeEventListener(click, handlers.click); sectionEventHandlers.delete(sectionId); } }); sections.forEach(function(section) { var sectionType section.getAttribute(data-section-type); var sectionName section.getAttribute(data-section-name); var sectionId sectionType || section.id; // Create handler functions var mouseenterHandler function(e) { var sectionType this.getAttribute(data-section-type); var sectionName this.getAttribute(data-section-name); // Highlight this section this.classList.add(section-highlighted); highlightedSection this; // Show edit indicator var indicator document.createElement(div); indicator.className section-edit-indicator; indicator.innerHTML span stylefilter: grayscale(100%); display: inline-block; margin-right: 4px;>✏️/span>Edit; indicator.id edit-indicator- + sectionType; this.style.position relative; this.appendChild(indicator); // Notify parent if (window.parent && window.parent ! window) { window.parent.postMessage({ type: SECTION_HOVER, data: { sectionType: sectionType, sectionName: sectionName } }, *); } }; var mouseleaveHandler function(e) { this.classList.remove(section-highlighted); var indicator document.getElementById(edit-indicator- + this.getAttribute(data-section-type)); if (indicator) { indicator.remove(); } // Notify parent if (window.parent && window.parent ! window) { window.parent.postMessage({ type: SECTION_UNHOVER, data: {} }, *); } }; var clickHandler function(e) { e.preventDefault(); e.stopPropagation(); var sectionType this.getAttribute(data-section-type); var sectionName this.getAttribute(data-section-name); // Get section position relative to viewport var rect this.getBoundingClientRect(); var iframeRect window.frameElement ? window.frameElement.getBoundingClientRect() : { top: 0, left: 0 }; // Notify parent to show settings panel with position info if (window.parent && window.parent ! window) { window.parent.postMessage({ type: SECTION_CLICK, data: { sectionType: sectionType, sectionName: sectionName, position: { top: rect.top + iframeRect.top, left: rect.left + iframeRect.left, bottom: rect.bottom + iframeRect.top, right: rect.right + iframeRect.left, height: rect.height, width: rect.width } } }, *); } }; // Store handlers for later removal sectionEventHandlers.set(sectionId, { mouseenter: mouseenterHandler, mouseleave: mouseleaveHandler, click: clickHandler }); // Add event listeners section.addEventListener(mouseenter, mouseenterHandler); section.addEventListener(mouseleave, mouseleaveHandler); section.addEventListener(click, clickHandler); }); sectionInteractionSetup true; } // Setup interactions when DOM is ready if (document.readyState loading) { document.addEventListener(DOMContentLoaded, setupSectionInteraction); } else { setupSectionInteraction(); } // Also setup after a delay to catch dynamically loaded content setTimeout(setupSectionInteraction, 1000); // Listen for postMessage from parent window.addEventListener(message, function(event) { // Accept messages from any origin (since we control both) console.log(📨 Received message in preview:, event.data); if (event.data && event.data.type) { if (event.data.type REINIT_SECTIONS) { // Force re-initialization of section interaction console.log(🔄 Re-initializing section interaction); setTimeout(setupSectionInteraction, 100); } else if (event.data.type UPDATE_COLOR) { var property event.data.data.property; var value event.data.data.value; // Property is already in format like body-background, just add -- var cssVar -- + property; console.log(🎨 Updating CSS variable:, cssVar, to, value); // Update the CSS variable var root document.documentElement; root.style.setProperty(cssVar, value); // Verify it was set var computedValue getComputedStyle(root).getPropertyValue(cssVar); console.log(✅ CSS variable updated. Computed value:, computedValue); // Force a repaint void root.offsetHeight; } else if (event.data.type UPDATE_TEMPLATE) { console.log(🔄 Template update requested); // Template changes require page reload // The parent will handle reloading the iframe } } }); // Send ready signal to parent if (window.parent && window.parent ! window) { try { window.parent.postMessage({ type: PREVIEW_READY }, *); console.log(✅ Sent PREVIEW_READY to parent); } catch(e) { console.error(❌ Error sending ready signal:, e); } } }})();/script>!-- Component Uptime Chart Scripts-->script src//static.status.io/public/statuspage/js/lodash.js>/script>script src//static.status.io/public/statuspage/js/d3.js>/script>script>(function() { var statuspageId 5dd19a34d9b3eb0aa5d653ab; // Shared tooltip div for all charts - create once and reuse var tooltip_div null; var currentTooltipTimeout null; var currentContainer null; function getOrCreateTooltip() { // Check if tooltip already exists in DOM first var existingTooltip d3.select(body).select(.component_chart_tooltip); if (!existingTooltip.empty()) { tooltip_div existingTooltip; return tooltip_div; } // If we have a reference but its empty, clear it if (tooltip_div && tooltip_div.empty()) { tooltip_div null; } // Create new tooltip if needed if (!tooltip_div) { tooltip_div d3.select(body) .append(div) .attr(class, component_chart_tooltip) .style(opacity, 0) .style(display, none) .on(mouseover, function (e, d, i) { clearTimeout(currentTooltipTimeout); //cancel hide tooltip if (currentContainer) { d3.select(currentContainer) .transition() .duration(0) .attr(opacity, .6) } }) .on(mouseleave, function (e, d, i) { hideTooltip() }); } return tooltip_div; } function hideTooltip() { if (currentTooltipTimeout) { clearTimeout(currentTooltipTimeout); currentTooltipTimeout null; } // Get the tooltip - ensure we have a reference var tooltip tooltip_div; if (!tooltip || tooltip.empty()) { tooltip d3.select(body).select(.component_chart_tooltip); } if (!tooltip.empty()) { tooltip.transition() .duration(0) .style(opacity, 0) .style(display, none); } if (currentContainer) { d3.select(currentContainer) .transition() .duration(0) .attr(opacity, 1); currentContainer null; } } function renderChart(daysData, compId, spId, chartHeight, showMaintenance, chartContainer, showUptimePercentage, uptimePercentage) { // Ensure container is visible and has dimensions before rendering var containerNode chartContainer.node(); if (!containerNode) { return; } // Force a layout calculation to get accurate dimensions var containerRect containerNode.getBoundingClientRect(); var containerWidth containerRect.width; // If container has no width yet, wait a bit and try again if (containerWidth 0) { setTimeout(function() { renderChart(daysData, compId, spId, chartHeight, showMaintenance, chartContainer); }, 100); return; } // set the ranges var x d3.scaleBand() .range(0, 35) .padding(0.40); var y d3.scaleLinear() .range(35, 0); var svg chartContainer .append(svg) .attr(viewBox, 0 0 35 + chartHeight) .attr(preserveAspectRatio, xMidYMid meet) .style(max-width, 100%) .style(width, 100%) .style(background, transparent) .style(display, block); // Color mapping based on status function getStatusColor(status) { switch(status) { case 100: return #27AE60; // Green - Operational case 200: return #3498DB; // Blue - Maintenance case 300: return #F39C12; // Yellow - Degraded case 400: return #E67E22; // Orange - Partial Outage case 500: return #E74C3C; // Red - Major Outage case 600: return #C0392B; // Dark Red - Critical default: return #95A5A6; // Gray - Unknown } } function getStatusLabel(status) { switch(status) { case 100: return Operational; case 200: return Maintenance; case 300: return Degraded; case 400: return Partial outage; case 500: return Major outage; case 600: return Critical; default: return Unknown; } } function formatDate(dateString) { // Parse date string like 30 Oct 2025 and convert to October 30, 2025 var months January, February, March, April, May, June, July, August, September, October, November, December; var dateParts dateString.split( ); if (dateParts.length 3) { var day dateParts0; var month dateParts1; var year dateParts2; var monthIndex Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec.indexOf(month); if (monthIndex ! -1) { return monthsmonthIndex + + day + , + year; } } return dateString; // Return original if parsing fails } function formatDuration(duration) { // Duration is now formatted by the API as Xh Ym, Xh, or Ym // Just return it as-is since API handles the formatting if (!duration) return duration; // If its in the old format 0h, convert to 0m if (duration 0h) { return 0m; } return duration; } // Scale the range of the data in the domains x.domain(daysData.map(function(d, i) { return i; })); y.domain(0, 100); // append the rectangles for the bar chart svg.selectAll(.bar) .data(daysData) .enter().append(rect) .attr(class, bar) .attr(x, function(d, i) { return x(i); }) .attr(width, x.bandwidth()) .attr(y, 0) .attr(height, chartHeight) .attr(fill, function(d) { var status d.status || 100; return getStatusColor(status); }) .attr(stroke, none) .style(stroke, none) .style(stroke-width, 0) .on(mouseover, function (e, d, i) { // Clear any pending hide timeout if (currentTooltipTimeout) { clearTimeout(currentTooltipTimeout); currentTooltipTimeout null; } // Get or create the shared tooltip - ensure it exists var sharedTooltip getOrCreateTooltip(); if (sharedTooltip.empty()) { // If somehow empty, recreate it tooltip_div null; sharedTooltip getOrCreateTooltip(); } // Update current container reference currentContainer this; d3.select(this) .transition() .duration(0) .attr(opacity, 0.6) // Build tooltip content var formattedDate formatDate(d.date); var tooltipContent formattedDate + br/>; tooltipContent + hr stylemargin: 8px 0; border: none; border-top: 1px solid #555;/>; var hasContent false; if (d.incidents && d.incidents.length > 0) { hasContent true; d.incidents.forEach(function(incident) { var statusColor getStatusColor(incident.status); var formattedDuration formatDuration(incident.duration); if (incident.id && incident.name) { var incidentLink a href/pages/incident/ + spId + / + incident.id + target_blank stylecolor: + statusColor + ; text-decoration: underline;> + incident.name + /a>; tooltipContent + div stylemargin: 3px 0;> + incidentLink + ( + formattedDuration + )/div>; } else { tooltipContent + div stylemargin: 3px 0;>span stylecolor: + statusColor + ;> + formattedDuration + /span>/div>; } }); } if (showMaintenance && d.maintenances && d.maintenances.length > 0) { hasContent true; d.maintenances.forEach(function(maintenance) { var formattedDuration formatDuration(maintenance.duration); var maintenanceColor getStatusColor(200); // Maintenance status is 200 (blue) // Get maintenance id - check id, _id, or use the name as fallback var maintenanceId maintenance.id || maintenance._id || null; // Always create a link if we have a name and id if (maintenanceId && maintenance.name) { var maintenanceLink a href/pages/maintenance/ + spId + / + maintenanceId + target_blank stylecolor: + maintenanceColor + ; text-decoration: underline;> + maintenance.name + /a>; tooltipContent + div stylemargin: 3px 0;> + maintenanceLink + ( + formattedDuration + )/div>; } else if (maintenance.name) { // If we have a name but no id, still show it colored (shouldnt happen if API is correct) tooltipContent + div stylemargin: 3px 0;>span stylecolor: + maintenanceColor + ;> + maintenance.name + /span> ( + formattedDuration + )/div>; } else { // Fallback to generic maintenance text tooltipContent + div stylemargin: 3px 0;>span stylecolor: + maintenanceColor + ;>Maintenance: + formattedDuration + /span>/div>; } }); } if (!hasContent) { tooltipContent + span stylecolor: #27AE60;>Operational/span>; } sharedTooltip.html(tooltipContent); sharedTooltip.style(display, block); // Function to update tooltip position var updateTooltipPosition function() { // Get bar position - this is the anchor point let pos d3.select(this).node().getBoundingClientRect(); const { x, y, width, height } pos; // Force a reflow to ensure tooltip is rendered before measuring sharedTooltip.node().offsetHeight; // Recalculate tooltip dimensions after content is set and rendered const actualTooltipWidth sharedTooltip.node().getBoundingClientRect().width || 200; const actualTooltipHeight sharedTooltip.node().getBoundingClientRect().height || 50; // Start with tooltip centered on the bar const barCenterX x + (width / 2); let leftPos barCenterX - (actualTooltipWidth / 2); // Get viewport dimensions const viewportWidth window.innerWidth || document.documentElement.clientWidth; const viewportHeight window.innerHeight || document.documentElement.clientHeight; const padding 10; // Padding from viewport edges // Adjust horizontal position if tooltip would go off-screen // But try to keep it as close to bar center as possible if (leftPos padding) { // Tooltip would go off left edge - align to left edge leftPos padding; } else if (leftPos + actualTooltipWidth > viewportWidth - padding) { // Tooltip would go off right edge - align to right edge leftPos viewportWidth - actualTooltipWidth - padding; } // Calculate vertical position (above the bar) let topPos y + height + 5; // If tooltip would go off bottom, position it above the bar instead if (topPos + actualTooltipHeight > viewportHeight - padding) { topPos y - actualTooltipHeight - 10; // Ensure it doesnt go off the top if (topPos padding) { topPos padding; } } sharedTooltip .style(left, leftPos + px) .style(top, topPos + px) .style(transform, none) .style(opacity, .9); }.bind(this); // Update position immediately and also on mousemove for better tracking updateTooltipPosition(); // Also update on mousemove to handle cases when entering from the side d3.select(this).on(mousemove.tooltip, updateTooltipPosition); }) .on(mouseleave, function (e, d, i) { var barElement this; // Remove mousemove handler when leaving d3.select(barElement).on(mousemove.tooltip, null); d3.select(barElement) .transition() .duration(0) .attr(opacity, 1); // Only hide tooltip if were leaving the current container if (currentContainer barElement) { currentTooltipTimeout setTimeout(function() { hideTooltip(); }, 400); } }); // Add uptime percentage display below the chart if enabled if (showUptimePercentage ! false && uptimePercentage ! undefined) { // Get the wrapper element to append the uptime display var chartWrapper chartContainer.node().closest(.component-uptime-chart-wrapper); if (chartWrapper) { // Remove any existing uptime display var existingUptimeDisplay chartWrapper.querySelector(.component-uptime-percentage); if (existingUptimeDisplay) { existingUptimeDisplay.remove(); } // Create uptime percentage display element var uptimeDisplay document.createElement(div); uptimeDisplay.className component-uptime-percentage; uptimeDisplay.style.cssText margin-top: 12px; padding-top: 8px; border-top: 1px solid #e0e0e0; text-align: center;; // Create timeline container var timelineContainer document.createElement(div); timelineContainer.style.cssText display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;; // Left label: 90 days ago var leftLabel document.createElement(span); leftLabel.textContent 90 days ago; leftLabel.style.cssText font-size: 12px; color: #869198; font-family: sans-serif;; // Center: uptime percentage var uptimeText document.createElement(span); uptimeText.textContent uptimePercentage.toFixed(2) + % uptime; uptimeText.style.cssText font-size: 12px; color: #869198; font-family: sans-serif; font-weight: normal;; // Right label: Today var rightLabel document.createElement(span); rightLabel.textContent Today; rightLabel.style.cssText font-size: 12px; color: #869198; font-family: sans-serif;; // Append elements timelineContainer.appendChild(leftLabel); timelineContainer.appendChild(uptimeText); timelineContainer.appendChild(rightLabel); uptimeDisplay.appendChild(timelineContainer); // Append to wrapper (after the chart container) chartWrapper.appendChild(uptimeDisplay); } } } // Track which charts have been initialized to prevent double rendering var initializedCharts new Set(); function initCharts() { // Find all chart containers on the page var chartContainers document.querySelectorAll(id^component_uptime_chart_); if (chartContainers.length 0) { return; } // Process each chart container chartContainers.forEach(function(chartContainerElement) { var chartContainerId chartContainerElement.id; // Skip if already initialized if (initializedCharts.has(chartContainerId)) { return; } var componentId chartContainerId.replace(component_uptime_chart_, ); var chartContainer d3.select(# + chartContainerId); if (chartContainer.empty()) { return; } // Check if container has dimensions - if not, wait var containerRect chartContainerElement.getBoundingClientRect(); if (containerRect.width 0) { // Container not ready yet, will be caught by next init attempt return; } // Mark as initialized initializedCharts.add(chartContainerId); // Get chart height from data attribute or default var chartHeight 0.75; // default if (chartContainerElement.getAttribute(data-chart-height)) { chartHeight parseFloat(chartContainerElement.getAttribute(data-chart-height)) || 0.75; } // Get chart_show_maintenance setting var chartShowMaintenance true; // default if (chartContainerElement.getAttribute(data-chart-show-maintenance)) { chartShowMaintenance chartContainerElement.getAttribute(data-chart-show-maintenance) true; } // Get chart_show_uptime_percentage setting from wrapper var chartShowUptimePercentage true; // default var chartWrapper chartContainerElement.closest(.component-uptime-chart-wrapper); if (chartWrapper && chartWrapper.getAttribute(data-chart-show-uptime-percentage)) { chartShowUptimePercentage chartWrapper.getAttribute(data-chart-show-uptime-percentage) true; } // Show loading indicator var loadingIndicator document.createElement(div); loadingIndicator.className component-uptime-chart-loading; loadingIndicator.innerHTML div classcomponent-uptime-chart-loading-spinner>/div>span>Loading chart.../span>; chartContainerElement.appendChild(loadingIndicator); // Fetch uptime data var apiUrl /pages/ + statuspageId + /status_chart/component/ + componentId + /uptime; fetch(apiUrl) .then(function(response) { if (!response.ok) { throw new Error(Failed to load uptime data); } return response.json(); }) .then(function(data) { // Remove loading indicator if (loadingIndicator && loadingIndicator.parentNode) { loadingIndicator.parentNode.removeChild(loadingIndicator); } if (data && data.days && data.days.length > 0) { // Small delay to ensure layout is stable requestAnimationFrame(function() { requestAnimationFrame(function() { var uptimePercentage data.uptime_percentage ! undefined ? data.uptime_percentage : 100.0; renderChart(data.days, componentId, statuspageId, chartHeight, chartShowMaintenance, chartContainer, chartShowUptimePercentage, uptimePercentage); }); }); } }) .catch(function(error) { console.error(Error loading uptime data for component + componentId + :, error); // Remove loading indicator on error if (loadingIndicator && loadingIndicator.parentNode) { loadingIndicator.parentNode.removeChild(loadingIndicator); } // Remove from initialized set so it can retry initializedCharts.delete(chartContainerId); }); }); } // Wait for window load to ensure all resources (images, CSS) are loaded function startChartInitialization() { // Try initializing charts initCharts(); // If any charts werent ready, try again after a short delay setTimeout(function() { initCharts(); }, 200); } // Initialize charts when page is fully loaded if (document.readyState complete) { startChartInitialization(); } else { window.addEventListener(load, startChartInitialization); }})();/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
]