2932 lines
228 KiB
HTML
2932 lines
228 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-US" theme="light">
|
||
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<script>
|
||
// Initialize theme from localStorage or system preference
|
||
let theme = localStorage.getItem('theme') || (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
|
||
document.documentElement.setAttribute('theme', theme);
|
||
const metaTag = document.createElement('meta');
|
||
metaTag.setAttribute('name', 'awa-ver');
|
||
metaTag.content = theme;
|
||
document.head.appendChild(metaTag);
|
||
isDarkTheme = theme === 'dark';
|
||
</script>
|
||
<style id="devblogs-reveal">
|
||
/* The theme is already set synchronously on <html> above, so the legacy body-hide (visibility:hidden in the deferred theme stylesheet) is unnecessary and blocks the LCP paint; force the page visible immediately via an inline <style> — unlike a <script>, this is not gated on external stylesheet loads. */
|
||
html body { visibility: visible !important; opacity: 1 !important; }
|
||
</style>
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||
<meta name="awa-pageType" content="blog-front-page" />
|
||
<meta name="awa-product" content="Azure DevOps Service" />
|
||
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||
<title>Azure DevOps Service</title>
|
||
<meta name="mobile-web-app-capable" content="yes">
|
||
<meta name="color-scheme" content="dark light">
|
||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||
<meta name="apple-mobile-web-app-title" content="Azure DevOps Service - ">
|
||
<link rel="profile" href="http://gmpg.org/xfn/11">
|
||
<link rel="pingback" href="https://devblogs.microsoft.com/devopsservice/xmlrpc.php">
|
||
<!-- [Begin] JSLL SHIM (1DS) domain prefetch -->
|
||
<link rel="preconnect" href="//js.monitor.azure.com" crossorigin>
|
||
<link rel="preconnect" href="//browser.events.data.microsoft.com" crossorigin>
|
||
<!-- [END] JSLL SHIM (1DS) domain prefetch -->
|
||
<meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' />
|
||
<link rel="preload" as="image" href="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/People_Gui_Code_small.png" fetchpriority="high">
|
||
|
||
<!-- This site is optimized with the Yoast SEO Premium plugin v28.3 (Yoast SEO v28.3) - https://yoast.com/product/yoast-seo-premium-wordpress/ -->
|
||
<link rel="canonical" href="https://devblogs.microsoft.com/devopsservice/" />
|
||
<link rel="next" href="https://devblogs.microsoft.com/devopsservice/page/2/" />
|
||
<meta property="og:locale" content="en_US" />
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:title" content="Service Blog - Azure DevOps" />
|
||
<meta property="og:url" content="https://devblogs.microsoft.com/devopsservice/" />
|
||
<meta property="og:site_name" content="Azure DevOps Service" />
|
||
<meta property="og:image" content="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/devblog-debug_small-1.png" />
|
||
<meta property="og:image:width" content="235" />
|
||
<meta property="og:image:height" content="147" />
|
||
<meta property="og:image:type" content="image/png" />
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"CollectionPage","@id":"https:\/\/devblogs.microsoft.com\/devopsservice","url":"https:\/\/devblogs.microsoft.com\/devopsservice","name":"Azure DevOps Service","isPartOf":{"@id":"https:\/\/devblogs.microsoft.com\/devopsservice\/#website"},"inLanguage":"en-US"},{"@type":"WebSite","@id":"https:\/\/devblogs.microsoft.com\/devopsservice\/#website","url":"https:\/\/devblogs.microsoft.com\/devopsservice\/","name":"Azure DevOps Service","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devblogs.microsoft.com\/devopsservice\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}</script>
|
||
<!-- / Yoast SEO Premium plugin. -->
|
||
|
||
|
||
<style id="wp-img-auto-sizes-contain-inline-css">
|
||
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
|
||
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
|
||
</style>
|
||
<style id="wp-emoji-styles-inline-css">
|
||
|
||
img.wp-smiley, img.emoji {
|
||
display: inline !important;
|
||
border: none !important;
|
||
box-shadow: none !important;
|
||
height: 1em !important;
|
||
width: 1em !important;
|
||
margin: 0 0.07em !important;
|
||
vertical-align: -0.1em !important;
|
||
background: none !important;
|
||
padding: 0 !important;
|
||
}
|
||
/*# sourceURL=wp-emoji-styles-inline-css */
|
||
</style>
|
||
<style id="wp-block-library-inline-css">
|
||
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
|
||
|
||
/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */
|
||
</style>
|
||
|
||
<link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='mpp_gutenberg-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/plugins/metronet-profile-picture/dist/blocks.style.build.css?ver=2.6.4' media='all' />
|
||
<noscript><link rel='stylesheet' id='mpp_gutenberg-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/plugins/metronet-profile-picture/dist/blocks.style.build.css?ver=2.6.4' media='all' />
|
||
</noscript><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='devblogs-lightbox-css-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/plugins/devblogs-lightbox/assets/css/lightbox.min.css?ver=1770924660' media='all' />
|
||
<noscript><link rel='stylesheet' id='devblogs-lightbox-css-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/plugins/devblogs-lightbox/assets/css/lightbox.min.css?ver=1770924660' media='all' />
|
||
</noscript><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='newsletter-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/plugins/newsletter/style.css?ver=9.3.5' media='all' />
|
||
<noscript><link rel='stylesheet' id='newsletter-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/plugins/newsletter/style.css?ver=9.3.5' media='all' />
|
||
</noscript><link rel='stylesheet' id='newsletter-country-sync-css-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/plugins/newsletter-country-sync/css/newsletter-style.css?ver=1770924660' media='all' />
|
||
<link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='devblogs-evo-styles-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/themes/devblogs-evo/css/theme.min.css?ver=1.4.0.1788284719' media='all' />
|
||
<noscript><link rel='stylesheet' id='devblogs-evo-styles-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/themes/devblogs-evo/css/theme.min.css?ver=1.4.0.1788284719' media='all' />
|
||
</noscript><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='fabric-icons-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/plugins/fabric-icon-manager/assets/css/fabric-icons.css?ver=1699358813' media='all' />
|
||
<noscript><link rel='stylesheet' id='fabric-icons-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/plugins/fabric-icon-manager/assets/css/fabric-icons.css?ver=1699358813' media='all' />
|
||
</noscript><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='block-custom-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/plugins/devblogs-blocks/assets/block-custom.css' media='all' />
|
||
<noscript><link rel='stylesheet' id='block-custom-css' href='https://devblogs.microsoft.com/devopsservice/wp-content/plugins/devblogs-blocks/assets/block-custom.css' media='all' />
|
||
</noscript><script type="text/javascript">
|
||
window._nslDOMReady = (function () {
|
||
const executedCallbacks = new Set();
|
||
|
||
return function (callback) {
|
||
/**
|
||
* Third parties might dispatch DOMContentLoaded events, so we need to ensure that we only run our callback once!
|
||
*/
|
||
if (executedCallbacks.has(callback)) return;
|
||
|
||
const wrappedCallback = function () {
|
||
if (executedCallbacks.has(callback)) return;
|
||
executedCallbacks.add(callback);
|
||
callback();
|
||
};
|
||
|
||
if (document.readyState === "complete" || document.readyState === "interactive") {
|
||
wrappedCallback();
|
||
} else {
|
||
document.addEventListener("DOMContentLoaded", wrappedCallback);
|
||
}
|
||
};
|
||
})();
|
||
</script><script id="jquery-core-js" src="https://devblogs.microsoft.com/devopsservice/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
|
||
<link rel="https://api.w.org/" href="https://devblogs.microsoft.com/devopsservice/wp-json/" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://devblogs.microsoft.com/devopsservice/xmlrpc.php?rsd" />
|
||
<script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Dev Blogs","item":"https:\/\/devblogs.microsoft.com\/"},{"@type":"ListItem","position":2,"name":"Azure DevOps Service","item":"https:\/\/devblogs.microsoft.com\/devopsservice\/"}]}</script><meta name="generator" content="performance-lab 4.2.0; plugins: webp-uploads">
|
||
<meta name="generator" content="webp-uploads 2.7.1">
|
||
<style>#respond h3#reply-title{display:none;}</style><link rel="preload" as="style" href="https://devblogs.microsoft.com/devopsservice/wp-content/plugins/code-prettify/prettify/prettify.css" /><style type="text/css">div.nsl-container[data-align="left"] {
|
||
text-align: left;
|
||
}
|
||
|
||
div.nsl-container[data-align="center"] {
|
||
text-align: center;
|
||
}
|
||
|
||
div.nsl-container[data-align="right"] {
|
||
text-align: right;
|
||
}
|
||
|
||
|
||
div.nsl-container div.nsl-container-buttons a[data-plugin="nsl"] {
|
||
text-decoration: none;
|
||
box-shadow: none;
|
||
border: 0;
|
||
}
|
||
|
||
div.nsl-container .nsl-container-buttons {
|
||
display: flex;
|
||
padding: 5px 0;
|
||
}
|
||
|
||
div.nsl-container.nsl-container-block .nsl-container-buttons {
|
||
display: inline-grid;
|
||
grid-template-columns: minmax(145px, auto);
|
||
}
|
||
|
||
div.nsl-container-block-fullwidth .nsl-container-buttons {
|
||
flex-flow: column;
|
||
align-items: center;
|
||
}
|
||
|
||
div.nsl-container-block-fullwidth .nsl-container-buttons a,
|
||
div.nsl-container-block .nsl-container-buttons a {
|
||
flex: 1 1 auto;
|
||
display: block;
|
||
margin: 5px 0;
|
||
width: 100%;
|
||
}
|
||
|
||
div.nsl-container-inline {
|
||
margin: -5px;
|
||
text-align: left;
|
||
}
|
||
|
||
div.nsl-container-inline .nsl-container-buttons {
|
||
justify-content: center;
|
||
flex-wrap: wrap;
|
||
}
|
||
|
||
div.nsl-container-inline .nsl-container-buttons a {
|
||
margin: 5px;
|
||
display: inline-block;
|
||
}
|
||
|
||
div.nsl-container-grid .nsl-container-buttons {
|
||
flex-flow: row;
|
||
align-items: center;
|
||
flex-wrap: wrap;
|
||
}
|
||
|
||
div.nsl-container-grid .nsl-container-buttons a {
|
||
flex: 1 1 auto;
|
||
display: block;
|
||
margin: 5px;
|
||
max-width: 280px;
|
||
width: 100%;
|
||
}
|
||
|
||
@media only screen and (min-width: 650px) {
|
||
div.nsl-container-grid .nsl-container-buttons a {
|
||
width: auto;
|
||
}
|
||
}
|
||
|
||
div.nsl-container .nsl-button {
|
||
cursor: pointer;
|
||
vertical-align: top;
|
||
border-radius: 4px;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-default {
|
||
color: #fff;
|
||
display: flex;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-icon {
|
||
display: inline-block;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-svg-container {
|
||
flex: 0 0 auto;
|
||
padding: 8px;
|
||
display: flex;
|
||
align-items: center;
|
||
}
|
||
|
||
div.nsl-container svg {
|
||
height: 24px;
|
||
width: 24px;
|
||
vertical-align: top;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-default div.nsl-button-label-container {
|
||
margin: 0 24px 0 12px;
|
||
padding: 10px 0;
|
||
font-family: Helvetica, Arial, sans-serif;
|
||
font-size: 16px;
|
||
line-height: 20px;
|
||
letter-spacing: .25px;
|
||
overflow: hidden;
|
||
text-align: center;
|
||
text-overflow: clip;
|
||
white-space: nowrap;
|
||
flex: 1 1 auto;
|
||
-webkit-font-smoothing: antialiased;
|
||
-moz-osx-font-smoothing: grayscale;
|
||
text-transform: none;
|
||
display: inline-block;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-google[data-skin="light"] {
|
||
box-shadow: inset 0 0 0 1px #747775;
|
||
color: #1f1f1f;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-google[data-skin="dark"] {
|
||
box-shadow: inset 0 0 0 1px #8E918F;
|
||
color: #E3E3E3;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-google[data-skin="neutral"] {
|
||
color: #1F1F1F;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-google div.nsl-button-label-container {
|
||
font-family: "Roboto Medium", Roboto, Helvetica, Arial, sans-serif;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-apple .nsl-button-svg-container {
|
||
padding: 0 6px;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-apple .nsl-button-svg-container svg {
|
||
height: 40px;
|
||
width: auto;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-apple[data-skin="light"] {
|
||
color: #000;
|
||
box-shadow: 0 0 0 1px #000;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-facebook[data-skin="white"] {
|
||
color: #000;
|
||
box-shadow: inset 0 0 0 1px #000;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-facebook[data-skin="light"] {
|
||
color: #1877F2;
|
||
box-shadow: inset 0 0 0 1px #1877F2;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-spotify[data-skin="white"] {
|
||
color: #191414;
|
||
box-shadow: inset 0 0 0 1px #191414;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-apple div.nsl-button-label-container {
|
||
font-size: 17px;
|
||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||
}
|
||
|
||
div.nsl-container .nsl-button-slack div.nsl-button-label-container {
|
||
font-size: 17px;
|
||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||
}
|
||
|
||
div.nsl-container .nsl-button-slack[data-skin="light"] {
|
||
color: #000000;
|
||
box-shadow: inset 0 0 0 1px #DDDDDD;
|
||
}
|
||
|
||
div.nsl-container .nsl-button-tiktok[data-skin="light"] {
|
||
color: #161823;
|
||
box-shadow: 0 0 0 1px rgba(22, 24, 35, 0.12);
|
||
}
|
||
|
||
|
||
div.nsl-container .nsl-button-kakao {
|
||
color: rgba(0, 0, 0, 0.85);
|
||
}
|
||
|
||
.nsl-clear {
|
||
clear: both;
|
||
}
|
||
|
||
.nsl-container {
|
||
clear: both;
|
||
}
|
||
|
||
.nsl-disabled-provider .nsl-button {
|
||
filter: grayscale(1);
|
||
opacity: 0.8;
|
||
}
|
||
|
||
/*Button align start*/
|
||
|
||
div.nsl-container-inline[data-align="left"] .nsl-container-buttons {
|
||
justify-content: flex-start;
|
||
}
|
||
|
||
div.nsl-container-inline[data-align="center"] .nsl-container-buttons {
|
||
justify-content: center;
|
||
}
|
||
|
||
div.nsl-container-inline[data-align="right"] .nsl-container-buttons {
|
||
justify-content: flex-end;
|
||
}
|
||
|
||
|
||
div.nsl-container-grid[data-align="left"] .nsl-container-buttons {
|
||
justify-content: flex-start;
|
||
}
|
||
|
||
div.nsl-container-grid[data-align="center"] .nsl-container-buttons {
|
||
justify-content: center;
|
||
}
|
||
|
||
div.nsl-container-grid[data-align="right"] .nsl-container-buttons {
|
||
justify-content: flex-end;
|
||
}
|
||
|
||
div.nsl-container-grid[data-align="space-around"] .nsl-container-buttons {
|
||
justify-content: space-around;
|
||
}
|
||
|
||
div.nsl-container-grid[data-align="space-between"] .nsl-container-buttons {
|
||
justify-content: space-between;
|
||
}
|
||
|
||
/* Button align end*/
|
||
|
||
/* Redirect */
|
||
|
||
#nsl-redirect-overlay {
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: center;
|
||
align-items: center;
|
||
position: fixed;
|
||
z-index: 1000000;
|
||
left: 0;
|
||
top: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
backdrop-filter: blur(1px);
|
||
background-color: RGBA(0, 0, 0, .32);;
|
||
}
|
||
|
||
#nsl-redirect-overlay-container {
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: center;
|
||
align-items: center;
|
||
background-color: white;
|
||
padding: 30px;
|
||
border-radius: 10px;
|
||
}
|
||
|
||
#nsl-redirect-overlay-spinner {
|
||
content: '';
|
||
display: block;
|
||
margin: 20px;
|
||
border: 9px solid RGBA(0, 0, 0, .6);
|
||
border-top: 9px solid #fff;
|
||
border-radius: 50%;
|
||
box-shadow: inset 0 0 0 1px RGBA(0, 0, 0, .6), 0 0 0 1px RGBA(0, 0, 0, .6);
|
||
width: 40px;
|
||
height: 40px;
|
||
animation: nsl-loader-spin 2s linear infinite;
|
||
}
|
||
|
||
@keyframes nsl-loader-spin {
|
||
0% {
|
||
transform: rotate(0deg)
|
||
}
|
||
to {
|
||
transform: rotate(360deg)
|
||
}
|
||
}
|
||
|
||
#nsl-redirect-overlay-title {
|
||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
|
||
font-size: 18px;
|
||
font-weight: bold;
|
||
color: #3C434A;
|
||
}
|
||
|
||
#nsl-redirect-overlay-text {
|
||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
|
||
text-align: center;
|
||
font-size: 14px;
|
||
color: #3C434A;
|
||
}
|
||
|
||
/* Redirect END*/</style><style type="text/css">/* Notice fallback */
|
||
#nsl-notices-fallback {
|
||
position: fixed;
|
||
right: 10px;
|
||
top: 10px;
|
||
z-index: 10000;
|
||
}
|
||
|
||
.admin-bar #nsl-notices-fallback {
|
||
top: 42px;
|
||
}
|
||
|
||
#nsl-notices-fallback > div {
|
||
position: relative;
|
||
background: #fff;
|
||
border-left: 4px solid #fff;
|
||
box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
|
||
margin: 5px 15px 2px;
|
||
padding: 1px 20px;
|
||
}
|
||
|
||
#nsl-notices-fallback > div.error {
|
||
display: block;
|
||
border-left-color: #dc3232;
|
||
}
|
||
|
||
#nsl-notices-fallback > div.updated {
|
||
display: block;
|
||
border-left-color: #46b450;
|
||
}
|
||
|
||
#nsl-notices-fallback p {
|
||
margin: .5em 0;
|
||
padding: 2px;
|
||
}
|
||
|
||
#nsl-notices-fallback > div:after {
|
||
position: absolute;
|
||
right: 5px;
|
||
top: 5px;
|
||
content: '\00d7';
|
||
display: block;
|
||
height: 16px;
|
||
width: 16px;
|
||
line-height: 16px;
|
||
text-align: center;
|
||
font-size: 20px;
|
||
cursor: pointer;
|
||
}</style> <!-- Start JSLL SHIM(1DS) Tags -->
|
||
<script src="https://js.monitor.azure.com/scripts/c/ms.jsll-4.min.js" type="text/javascript" defer></script>
|
||
<script type="text/javascript">
|
||
var config = {
|
||
useDefaultContentName: true,
|
||
useShortNameForContentBlob: false,
|
||
// disablePageUnloadEvents: [0, 1, 2], // Try at top level for JSLL
|
||
autoCapture: {
|
||
pageView: true,
|
||
onLoad: true,
|
||
lineage: true,
|
||
click: true,
|
||
scroll: true,
|
||
resize: false,
|
||
jsError: true,
|
||
addin: true,
|
||
perf: true
|
||
},
|
||
disableUnloadBeacon: true, // Disable deprecated unload event listeners
|
||
urlCollectHash: true,
|
||
urlCollectQuery: true,
|
||
instrumentationKey: "31b03416b80d4fec81330cf396b8bf63-2db31b2d-ee29-4371-af87-871cba555f5a-7031",
|
||
coreData: {
|
||
appId: "MSDevBlogs",
|
||
},
|
||
// Initially set the GPC_DataSharingOptIn flag property in 1DS (One Data Source) to false
|
||
advancedConfig: {
|
||
propertyConfiguration: {
|
||
gpcDataSharingOptIn: false
|
||
}
|
||
},
|
||
callback: {
|
||
pageName: function () { return document.title },
|
||
contentUpdatePageTags: function () {
|
||
|
||
return {
|
||
metaTags: {
|
||
'ver': theme
|
||
},
|
||
}
|
||
},
|
||
pageActionContentTags: function () {
|
||
|
||
return {
|
||
metaTags: {
|
||
'ver': theme
|
||
},
|
||
}
|
||
},
|
||
pageActionPageTags: function () {
|
||
|
||
return {
|
||
"pageType": "blog-front-page",
|
||
metaTags: {
|
||
'ver': theme
|
||
},
|
||
}
|
||
},
|
||
pageViewPageTags: function () {
|
||
return {
|
||
"pageType": "blog-front-page",
|
||
}
|
||
},
|
||
}
|
||
};
|
||
// The JSLL script is now deferred, so it may not be ready while this inline script runs during parse; init immediately if available, otherwise on DOMContentLoaded (deferred scripts always execute before that event).
|
||
if (window.awa && typeof awa.init === 'function') {
|
||
awa.init(config);
|
||
} else {
|
||
document.addEventListener('DOMContentLoaded', function () { awa.init(config); });
|
||
}
|
||
|
||
// Suppress Microsoft JSLL v4 internal unload event deprecation warnings
|
||
// TODO: Remove when Microsoft updates JSLL to fix internal Application Insights Core JS deprecation
|
||
(function() {
|
||
const originalWarn = console.warn;
|
||
console.warn = function(...args) {
|
||
const message = args.join(' ');
|
||
// Suppress specific deprecation warning from Microsoft's Application Insights SDK
|
||
// Pattern specifically targets Microsoft SDK file path to avoid false positives
|
||
if (message.includes('EventHelpers.js') && message.includes('deprecated')) {
|
||
// Optionally log once for debugging (comment out for production)
|
||
// if (!window._jsllWarningSuppressed) {
|
||
// console.log('[Suppressed JSLL SDK deprecation warning]');
|
||
// window._jsllWarningSuppressed = true;
|
||
// }
|
||
return;
|
||
}
|
||
originalWarn.apply(console, args);
|
||
};
|
||
})();
|
||
</script>
|
||
<!-- END JSLL SHIM(1DS) Integration -->
|
||
<script>
|
||
/*! lazysizes - v4.1.3 | For lazy loading images */
|
||
!function (a, b) { var c = b(a, a.document); a.lazySizes = c, "object" == typeof module && module.exports && (module.exports = c) }(window, function (a, b) { "use strict"; if (b.getElementsByClassName) { var c, d, e = b.documentElement, f = a.Date, g = a.HTMLPictureElement, h = "addEventListener", i = "getAttribute", j = a[h], k = a.setTimeout, l = a.requestAnimationFrame || k, m = a.requestIdleCallback, n = /^picture$/i, o = ["load", "error", "lazyincluded", "_lazyloaded"], p = {}, q = Array.prototype.forEach, r = function (a, b) { return p[b] || (p[b] = new RegExp("(\\s|^)" + b + "(\\s|$)")), p[b].test(a[i]("class") || "") && p[b] }, s = function (a, b) { r(a, b) || a.setAttribute("class", (a[i]("class") || "").trim() + " " + b) }, t = function (a, b) { var c; (c = r(a, b)) && a.setAttribute("class", (a[i]("class") || "").replace(c, " ")) }, u = function (a, b, c) { var d = c ? h : "removeEventListener"; c && u(a, b), o.forEach(function (c) { a[d](c, b) }) }, v = function (a, d, e, f, g) { var h = b.createEvent("Event"); return e || (e = {}), e.instance = c, h.initEvent(d, !f, !g), h.detail = e, a.dispatchEvent(h), h }, w = function (b, c) { var e; !g && (e = a.picturefill || d.pf) ? (c && c.src && !b[i]("srcset") && b.setAttribute("srcset", c.src), e({ reevaluate: !0, elements: [b] })) : c && c.src && (b.src = c.src) }, x = function (a, b) { return (getComputedStyle(a, null) || {})[b] }, y = function (a, b, c) { for (c = c || a.offsetWidth; c < d.minSize && b && !a._lazysizesWidth;)c = b.offsetWidth, b = b.parentNode; return c }, z = function () { var a, c, d = [], e = [], f = d, g = function () { var b = f; for (f = d.length ? e : d, a = !0, c = !1; b.length;)b.shift()(); a = !1 }, h = function (d, e) { a && !e ? d.apply(this, arguments) : (f.push(d), c || (c = !0, (b.hidden ? k : l)(g))) }; return h._lsFlush = g, h }(), A = function (a, b) { return b ? function () { z(a) } : function () { var b = this, c = arguments; z(function () { a.apply(b, c) }) } }, B = function (a) { var b, c = 0, e = d.throttleDelay, g = d.ricTimeout, h = function () { b = !1, c = f.now(), a() }, i = m && g > 49 ? function () { m(h, { timeout: g }), g !== d.ricTimeout && (g = d.ricTimeout) } : A(function () { k(h) }, !0); return function (a) { var d; (a = a === !0) && (g = 33), b || (b = !0, d = e - (f.now() - c), 0 > d && (d = 0), a || 9 > d ? i() : k(i, d)) } }, C = function (a) { var b, c, d = 99, e = function () { b = null, a() }, g = function () { var a = f.now() - c; d > a ? k(g, d - a) : (m || e)(e) }; return function () { c = f.now(), b || (b = k(g, d)) } }; !function () { var b, c = { lazyClass: "lazyload", loadedClass: "lazyloaded", loadingClass: "lazyloading", preloadClass: "lazypreload", errorClass: "lazyerror", autosizesClass: "lazyautosizes", srcAttr: "data-src", srcsetAttr: "data-srcset", sizesAttr: "data-sizes", minSize: 40, customMedia: {}, init: !0, expFactor: 1.5, hFac: .8, loadMode: 2, loadHidden: !0, ricTimeout: 0, throttleDelay: 125 }; d = a.lazySizesConfig || a.lazysizesConfig || {}; for (b in c) b in d || (d[b] = c[b]); a.lazySizesConfig = d, k(function () { d.init && F() }) }(); var D = function () { var g, l, m, o, p, y, D, F, G, H, I, J, K, L, M = /^img$/i, N = /^iframe$/i, O = "onscroll" in a && !/(gle|ing)bot/.test(navigator.userAgent), P = 0, Q = 0, R = 0, S = -1, T = function (a) { R--, a && a.target && u(a.target, T), (!a || 0 > R || !a.target) && (R = 0) }, U = function (a, c) { var d, f = a, g = "hidden" == x(b.body, "visibility") || "hidden" != x(a.parentNode, "visibility") && "hidden" != x(a, "visibility"); for (F -= c, I += c, G -= c, H += c; g && (f = f.offsetParent) && f != b.body && f != e;)g = (x(f, "opacity") || 1) > 0, g && "visible" != x(f, "overflow") && (d = f.getBoundingClientRect(), g = H > d.left && G < d.right && I > d.top - 1 && F < d.bottom + 1); return g }, V = function () { var a, f, h, j, k, m, n, p, q, r = c.elements; if ((o = d.loadMode) && 8 > R && (a = r.length)) { f = 0, S++, null == K && ("expand" in d || (d.expand = e.clientHeight > 500 && e.clientWidth > 500 ? 500 : 370), J = d.expand, K = J * d.expFactor), K > Q && 1 > R && S > 2 && o > 2 && !b.hidden ? (Q = K, S = 0) : Q = o > 1 && S > 1 && 6 > R ? J : P; for (; a > f; f++)if (r[f] && !r[f]._lazyRace) if (O) if ((p = r[f][i]("data-expand")) && (m = 1 * p) || (m = Q), q !== m && (y = innerWidth + m * L, D = innerHeight + m, n = -1 * m, q = m), h = r[f].getBoundingClientRect(), (I = h.bottom) >= n && (F = h.top) <= D && (H = h.right) >= n * L && (G = h.left) <= y && (I || H || G || F) && (d.loadHidden || "hidden" != x(r[f], "visibility")) && (l && 3 > R && !p && (3 > o || 4 > S) || U(r[f], m))) { if (ba(r[f]), k = !0, R > 9) break } else !k && l && !j && 4 > R && 4 > S && o > 2 && (g[0] || d.preloadAfterLoad) && (g[0] || !p && (I || H || G || F || "auto" != r[f][i](d.sizesAttr))) && (j = g[0] || r[f]); else ba(r[f]); j && !k && ba(j) } }, W = B(V), X = function (a) { s(a.target, d.loadedClass), t(a.target, d.loadingClass), u(a.target, Z), v(a.target, "lazyloaded") }, Y = A(X), Z = function (a) { Y({ target: a.target }) }, $ = function (a, b) { try { a.contentWindow.location.replace(b) } catch (c) { a.src = b } }, _ = function (a) { var b, c = a[i](d.srcsetAttr); (b = d.customMedia[a[i]("data-media") || a[i]("media")]) && a.setAttribute("media", b), c && a.setAttribute("srcset", c) }, aa = A(function (a, b, c, e, f) { var g, h, j, l, o, p; (o = v(a, "lazybeforeunveil", b)).defaultPrevented || (e && (c ? s(a, d.autosizesClass) : a.setAttribute("sizes", e)), h = a[i](d.srcsetAttr), g = a[i](d.srcAttr), f && (j = a.parentNode, l = j && n.test(j.nodeName || "")), p = b.firesLoad || "src" in a && (h || g || l), o = { target: a }, p && (u(a, T, !0), clearTimeout(m), m = k(T, 2500), s(a, d.loadingClass), u(a, Z, !0)), l && q.call(j.getElementsByTagName("source"), _), h ? a.setAttribute("srcset", h) : g && !l && (N.test(a.nodeName) ? $(a, g) : a.src = g), f && (h || l) && w(a, { src: g })), a._lazyRace && delete a._lazyRace, t(a, d.lazyClass), z(function () { (!p || a.complete && a.naturalWidth > 1) && (p ? T(o) : R--, X(o)) }, !0) }), ba = function (a) { var b, c = M.test(a.nodeName), e = c && (a[i](d.sizesAttr) || a[i]("sizes")), f = "auto" == e; (!f && l || !c || !a[i]("src") && !a.srcset || a.complete || r(a, d.errorClass) || !r(a, d.lazyClass)) && (b = v(a, "lazyunveilread").detail, f && E.updateElem(a, !0, a.offsetWidth), a._lazyRace = !0, R++, aa(a, b, f, e, c)) }, ca = function () { if (!l) { if (f.now() - p < 999) return void k(ca, 999); var a = C(function () { d.loadMode = 3, W() }); l = !0, d.loadMode = 3, W(), j("scroll", function () { 3 == d.loadMode && (d.loadMode = 2), a() }, !0) } }; return { _: function () { p = f.now(), c.elements = b.getElementsByClassName(d.lazyClass), g = b.getElementsByClassName(d.lazyClass + " " + d.preloadClass), L = d.hFac, j("scroll", W, !0), j("resize", W, !0), a.MutationObserver ? new MutationObserver(W).observe(e, { childList: !0, subtree: !0, attributes: !0 }) : (e[h]("DOMNodeInserted", W, !0), e[h]("DOMAttrModified", W, !0), setInterval(W, 999)), j("hashchange", W, !0), ["focus", "mouseover", "click", "load", "transitionend", "animationend", "webkitAnimationEnd"].forEach(function (a) { b[h](a, W, !0) }), /d$|^c/.test(b.readyState) ? ca() : (j("load", ca), b[h]("DOMContentLoaded", W), k(ca, 2e4)), c.elements.length ? (V(), z._lsFlush()) : W() }, checkElems: W, unveil: ba } }(), E = function () { var a, c = A(function (a, b, c, d) { var e, f, g; if (a._lazysizesWidth = d, d += "px", a.setAttribute("sizes", d), n.test(b.nodeName || "")) for (e = b.getElementsByTagName("source"), f = 0, g = e.length; g > f; f++)e[f].setAttribute("sizes", d); c.detail.dataAttr || w(a, c.detail) }), e = function (a, b, d) { var e, f = a.parentNode; f && (d = y(a, f, d), e = v(a, "lazybeforesizes", { width: d, dataAttr: !!b }), e.defaultPrevented || (d = e.detail.width, d && d !== a._lazysizesWidth && c(a, f, e, d))) }, f = function () { var b, c = a.length; if (c) for (b = 0; c > b; b++)e(a[b]) }, g = C(f); return { _: function () { a = b.getElementsByClassName(d.autosizesClass), j("resize", g) }, checkElems: g, updateElem: e } }(), F = function () { F.i || (F.i = !0, E._(), D._()) }; return c = { cfg: d, autoSizer: E, loader: D, init: F, uP: w, aC: s, rC: t, hC: r, fire: v, gW: y, rAF: z } } });
|
||
</script>
|
||
<div id="sr-announcer" class="visually-hidden" role="status" aria-live="polite"></div>
|
||
<style id="global-styles-inline-css">
|
||
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:root { --wp--style--global--content-size: 840px;--wp--style--global--wide-size: 840px; }:where(body) { margin: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
|
||
/*# sourceURL=global-styles-inline-css */
|
||
</style>
|
||
|
||
</head>
|
||
|
||
<body class="home blog wp-theme-devblogs-evo">
|
||
<!-- Star cookies banner -->
|
||
<script src="https://wcpstatic.microsoft.com/mscc/lib/v2/wcp-consent.js" defer></script>
|
||
|
||
<div id="cookie-banner"></div>
|
||
|
||
<!-- end cookies banner -->
|
||
<!-- UHF header -->
|
||
<uhf-header locale="en-us" partnerId="DEV_Blogs" headerId="Dev_header-main" theme="light">
|
||
<a slot="skip-link" class="uhf-skip-link" href="#mainContent" data-m='{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "SkipToMain", "cN": "Skip to content_nonnav", "ecn": "Skip to content_nonnav", "ehn": "SkipToMain"}'>Skip to main content</a>
|
||
|
||
<uhf-brand slot="brand">
|
||
<a href="https://www.microsoft.com" class="uhf-microsoft-logo" slot="microsoft-logo" aria-label="Microsoft" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Anchor", "cN": "GlobalNav_Logo_cont", "ecn": "GlobalNav_Logo_cont", "ehn": "Anchor"}">
|
||
<img src="https://uhf.microsoft.com/images/microsoft/RE1Mu3b.png" alt="Microsoft" />
|
||
</a>
|
||
<a href="https://devblogs.microsoft.com" class="uhf-site-logo" slot="brand-logo" aria-label="Dev Blogs" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Anchor", "cN": "CatNav_Logo_cont", "ecn": "CatNav_Logo_cont", "ehn": "Anchor"}">
|
||
<span>Dev Blogs</span> </a>
|
||
</uhf-brand>
|
||
|
||
|
||
<uhf-contextual-nav
|
||
slot="contextual-nav"
|
||
overflowText="More"
|
||
brand="Dev Blogs"
|
||
homeUrl="https://devblogs.microsoft.com"
|
||
homeText="Home"
|
||
data-nav-label="Contextual menu"
|
||
theme=cat-theme-blue
|
||
>
|
||
|
||
|
||
<a class="uhf-nav-item uhf-nav-link" href="https://devblogs.microsoft.com/ai" id="AI" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "AI", "cN": "CatNav_AI_nav", "ecn": "CatNav_AI_nav", "ehn": "AI"}">AI</a>
|
||
|
||
|
||
|
||
<uhf-dropdown
|
||
text=".NET"
|
||
id="dot-net"
|
||
data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_nav", "ecn": "CatNav_.NET_nav", "ehn": ".NET"}"
|
||
>
|
||
|
||
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/dotnet/" id="all-dot-net-posts" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_All .NET posts_nav", "ecn": "CatNav_.NET_All .NET posts_nav", "ehn": ".NET"}">All .NET posts</a>
|
||
|
||
<uhf-flyout text="Frameworks" id="Frameworks" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Frameworks_nav", "ecn": "CatNav_.NET_Frameworks_nav", "ehn": ".NET"}">
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/dotnet/category/maui/" id="dot-net-maui" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Frameworks_.NET MAUI_nav", "ecn": "CatNav_.NET_Frameworks_.NET MAUI_nav", "ehn": ".NET"}">.NET MAUI</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/dotnet/category/dotnet-aspire/" id="asp-net-core" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Frameworks_ASP.NET Core_nav", "ecn": "CatNav_.NET_Frameworks_ASP.NET Core_nav", "ehn": ".NET"}">ASP.NET Core</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/dotnet/category/blazor/" id="Blazor" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Frameworks_Blazor_nav", "ecn": "CatNav_.NET_Frameworks_Blazor_nav", "ehn": ".NET"}">Blazor</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/dotnet/category/entity-framework/" id="entity-framework" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Frameworks_Entity Framework_nav", "ecn": "CatNav_.NET_Frameworks_Entity Framework_nav", "ehn": ".NET"}">Entity Framework</a>
|
||
</uhf-flyout>
|
||
<uhf-flyout text="Languages" id="Languages" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Languages_nav", "ecn": "CatNav_.NET_Languages_nav", "ehn": ".NET"}">
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/cppblog/" id="cpp" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Languages_C++_nav", "ecn": "CatNav_.NET_Languages_C++_nav", "ehn": ".NET"}">C++</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/dotnet/category/csharp/" id="C#" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Languages_C#_nav", "ecn": "CatNav_.NET_Languages_C#_nav", "ehn": ".NET"}">C#</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/dotnet/category/fsharp/" id="F#" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Languages_F#_nav", "ecn": "CatNav_.NET_Languages_F#_nav", "ehn": ".NET"}">F#</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/typescript/" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Languages_TypeScript_nav", "ecn": "CatNav_.NET_Languages_TypeScript_nav", "ehn": ".NET"}">TypeScript</a>
|
||
</uhf-flyout>
|
||
<uhf-flyout text="Tools" id="Tools" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Tools_nav", "ecn": "CatNav_.NET_Tools_nav", "ehn": ".NET"}">
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/dotnet/category/nuget/" id="NuGet" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Tools_NuGet_nav", "ecn": "CatNav_.NET_Tools_NuGet_nav", "ehn": ".NET"}">NuGet</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/dotnet/category/maintenance-and-updates/" id="Servicing" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_Tools_Servicing_nav", "ecn": "CatNav_.NET_Tools_Servicing_nav", "ehn": ".NET"}">Servicing</a>
|
||
</uhf-flyout> <a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/dotnet-ch/" id="dot-net-blog-in-chinese" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": ".NET", "cN": "CatNav_.NET_.NET Blog in Chinese_nav", "ecn": "CatNav_.NET_.NET Blog in Chinese_nav", "ehn": ".NET"}">.NET Blog in Chinese</a>
|
||
|
||
|
||
</uhf-dropdown>
|
||
|
||
|
||
<uhf-dropdown
|
||
text="Developer"
|
||
id="Developer"
|
||
data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_nav", "ecn": "CatNav_Developer_nav", "ehn": "Developer"}"
|
||
>
|
||
|
||
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://developer.microsoft.com/blog" id="microsoft-for-developers" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Microsoft for Developers_nav", "ecn": "CatNav_Developer_Microsoft for Developers_nav", "ehn": "Developer"}">Microsoft for Developers</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/agent-framework/" id="agent-framework" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Agent Framework_nav", "ecn": "CatNav_Developer_Agent Framework_nav", "ehn": "Developer"}">Agent Framework</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/develop-from-the-cloud/" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Develop from the cloud_nav", "ecn": "CatNav_Developer_Develop from the cloud_nav", "ehn": "Developer"}">Develop from the cloud</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/xcode/" id="Xcode" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Xcode_nav", "ecn": "CatNav_Developer_Xcode_nav", "ehn": "Developer"}">Xcode</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/ise/" id="ise-developer" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_ISE Developer_nav", "ecn": "CatNav_Developer_ISE Developer_nav", "ehn": "Developer"}">ISE Developer</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/typescript/" id="TypeScript" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_TypeScript_nav", "ecn": "CatNav_Developer_TypeScript_nav", "ehn": "Developer"}">TypeScript</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/powershell/" id="PowerShell" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_PowerShell_nav", "ecn": "CatNav_Developer_PowerShell_nav", "ehn": "Developer"}">PowerShell</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/python/" id="Python" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Python_nav", "ecn": "CatNav_Developer_Python_nav", "ehn": "Developer"}">Python</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/java/" id="java" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Java_nav", "ecn": "CatNav_Developer_Java_nav", "ehn": "Developer"}">Java</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/java-ch/" id="java-blog-in-chinese" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Java Blog in Chinese_nav", "ecn": "CatNav_Developer_Java Blog in Chinese_nav", "ehn": "Developer"}">Java Blog in Chinese</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/go/" id="go" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Go_nav", "ecn": "CatNav_Developer_Go_nav", "ehn": "Developer"}">Go</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://blogs.windows.com/msedgedev/" id="microsoft-edge-dev" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Microsoft Edge Dev_nav", "ecn": "CatNav_Developer_Microsoft Edge Dev_nav", "ehn": "Developer"}">Microsoft Edge Dev</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/microsoft365dev/" id="microsoft-365-developer" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Microsoft 365 Developer_nav", "ecn": "CatNav_Developer_Microsoft 365 Developer_nav", "ehn": "Developer"}">Microsoft 365 Developer</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/identity/" id="microsoft-entra-identity-developer" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Microsoft Entra Identity Developer_nav", "ecn": "CatNav_Developer_Microsoft Entra Identity Developer_nav", "ehn": "Developer"}">Microsoft Entra Identity Developer</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/entrapowershell/" id="microsoft-entra-powershell" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Developer", "cN": "CatNav_Developer_Microsoft Entra PowerShell_nav", "ecn": "CatNav_Developer_Microsoft Entra PowerShell_nav", "ehn": "Developer"}">Microsoft Entra PowerShell</a>
|
||
|
||
|
||
</uhf-dropdown>
|
||
|
||
|
||
<uhf-dropdown
|
||
text="Platform and Tools"
|
||
id="platform-development"
|
||
data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_nav", "ecn": "CatNav_Platform and Tools_nav", "ehn": "Platform and Tools"}"
|
||
>
|
||
|
||
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/visualstudio/" id="visual-studio" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Visual Studio_nav", "ecn": "CatNav_Platform and Tools_Visual Studio_nav", "ehn": "Platform and Tools"}">Visual Studio</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/vscode-blog" id="visual-studio-code" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Visual Studio Code_nav", "ecn": "CatNav_Platform and Tools_Visual Studio Code_nav", "ehn": "Platform and Tools"}">Visual Studio Code</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/aspire/" id="aspire" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Aspire_nav", "ecn": "CatNav_Platform and Tools_Aspire_nav", "ehn": "Platform and Tools"}">Aspire</a>
|
||
|
||
<uhf-flyout text="Azure" id="azure" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Azure_nav", "ecn": "CatNav_Platform and Tools_Azure_nav", "ehn": "Platform and Tools"}">
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/all-things-azure/" id="all-things-azure-1" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Azure_All things Azure_nav", "ecn": "CatNav_Platform and Tools_Azure_All things Azure_nav", "ehn": "Platform and Tools"}">All things Azure</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/azure-sdk/" id="azure-sdk" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Azure_Azure SDK_nav", "ecn": "CatNav_Platform and Tools_Azure_Azure SDK_nav", "ehn": "Platform and Tools"}">Azure SDK</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/azure-vm-runtime/" id="azure-vm-runtime" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Azure_Azure VM Runtime Team_nav", "ecn": "CatNav_Platform and Tools_Azure_Azure VM Runtime Team_nav", "ehn": "Platform and Tools"}">Azure VM Runtime Team</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://azure.microsoft.com/blog/" id="microsoft-azure" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Azure_Microsoft Azure_nav", "ecn": "CatNav_Platform and Tools_Azure_Microsoft Azure_nav", "ehn": "Platform and Tools"}">Microsoft Azure</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/cosmosdb/" id="azure-cosmos-db" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Azure_Azure Cosmos DB_nav", "ecn": "CatNav_Platform and Tools_Azure_Azure Cosmos DB_nav", "ehn": "Platform and Tools"}">Azure Cosmos DB</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/documentdb/" id="azure-document-db" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Azure_Azure DocumentDB_nav", "ecn": "CatNav_Platform and Tools_Azure_Azure DocumentDB_nav", "ehn": "Platform and Tools"}">Azure DocumentDB</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://cloudblogs.microsoft.com/sqlserver/?product=azure-data-studio" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Azure_Azure Data Studio_nav", "ecn": "CatNav_Platform and Tools_Azure_Azure Data Studio_nav", "ehn": "Platform and Tools"}">Azure Data Studio</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/azure-sql/" id="azure-sql" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Azure_Azure SQL_nav", "ecn": "CatNav_Platform and Tools_Azure_Azure SQL_nav", "ehn": "Platform and Tools"}">Azure SQL</a>
|
||
</uhf-flyout> <a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/devops/" id="devops" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_DevOps_nav", "ecn": "CatNav_Platform and Tools_DevOps_nav", "ehn": "Platform and Tools"}">DevOps</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/directx/" id="directx" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_DirectX_nav", "ecn": "CatNav_Platform and Tools_DirectX_nav", "ehn": "Platform and Tools"}">DirectX</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/foundry/" id="azure-aI-foundry" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Microsoft Foundry_nav", "ecn": "CatNav_Platform and Tools_Microsoft Foundry_nav", "ehn": "Platform and Tools"}">Microsoft Foundry</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/powerplatform/" id="power-platform" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Platform and Tools", "cN": "CatNav_Platform and Tools_Power Platform_nav", "ecn": "CatNav_Platform and Tools_Power Platform_nav", "ehn": "Platform and Tools"}">Power Platform</a>
|
||
|
||
|
||
</uhf-dropdown>
|
||
|
||
|
||
<uhf-dropdown
|
||
text="Data"
|
||
id="data-development"
|
||
data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Data", "cN": "CatNav_Data_nav", "ecn": "CatNav_Date_nav", "ehn": "Date"}"
|
||
>
|
||
|
||
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/odata/" id="OData" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Data", "cN": "CatNav_Data_OData_nav", "ecn": "CatNav_Date_OData_nav", "ehn": "Date"}">OData</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/udm/" id="udm" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Data", "cN": "CatNav_Data_Unified Data Model (IDEAs)_nav", "ecn": "CatNav_Date_Unified Data Model (IDEAs)_nav", "ehn": "Date"}">Unified Data Model (IDEAs)</a>
|
||
|
||
|
||
</uhf-dropdown>
|
||
|
||
|
||
<uhf-dropdown
|
||
text="Windows"
|
||
id="windows"
|
||
data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Windows", "cN": "CatNav_Windows_nav", "ecn": "CatNav_Windows_nav", "ehn": "Windows"}"
|
||
>
|
||
|
||
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/commandline/" id="windows-command-line" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Windows", "cN": "CatNav_Windows_Windows Command Line_nav", "ecn": "CatNav_Windows_Windows Command Line_nav", "ehn": "Windows"}">Windows Command Line</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/ifdef-windows/" id="pax-windows" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Windows", "cN": "CatNav_Windows_#ifdef Windows_nav", "ecn": "CatNav_Windows_#ifdef Windows_nav", "ehn": "Windows"}">#ifdef Windows</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/insidemsix/" id="inside-msix" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Windows", "cN": "CatNav_Windows_Inside MSIX_nav", "ecn": "CatNav_Windows_Inside MSIX_nav", "ehn": "Windows"}">Inside MSIX</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/windows-music-dev/" id="midi-music" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Windows", "cN": "CatNav_Windows_MIDI and music_nav", "ecn": "CatNav_Windows_MIDI and music_nav", "ehn": "Windows"}">MIDI and music</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/react-native/" id="react-native-for-windows" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Windows", "cN": "CatNav_Windows_React Native_nav", "ecn": "CatNav_Windows_React Native_nav", "ehn": "Windows"}">React Native</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://devblogs.microsoft.com/oldnewthing/" id="old-new-thing" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Windows", "cN": "CatNav_Windows_The Old New Thing_nav", "ecn": "CatNav_Windows_The Old New Thing_nav", "ehn": "Windows"}">The Old New Thing</a>
|
||
<a class="uhf-nav-item uhf-dropdown-link" href="https://blogs.windows.com/windowsdeveloper/" id="windows-developer" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalHeader", "hn": "Windows", "cN": "CatNav_Windows_Windows Developer_nav", "ecn": "CatNav_Windows_Windows Developer_nav", "ehn": "Windows"}">Windows Developer</a>
|
||
|
||
|
||
</uhf-dropdown></uhf-contextual-nav> <uhf-actions slot="actions">
|
||
|
||
|
||
<uhf-search
|
||
slot="search"
|
||
placeholder="Search"
|
||
search-label="Search"
|
||
cancel-label="Cancel"
|
||
searchUrl="/search"
|
||
autoSuggestUrl="https://www.microsoft.com/msstoreapiprod/api/autosuggest"
|
||
queryParameterName="query"
|
||
>
|
||
</uhf-search>
|
||
</uhf-actions>
|
||
</uhf-header><style>
|
||
uhf-header:not(:defined) {
|
||
display: block;
|
||
height: 54px;
|
||
}
|
||
|
||
uhf-brand:not(:defined),
|
||
uhf-contextual-nav:not(:defined),
|
||
uhf-actions:not(:defined),
|
||
uhf-global-nav:not(:defined),
|
||
uhf-search:not(:defined),
|
||
uhf-mecontrol:not(:defined),
|
||
uhf-cart:not(:defined),
|
||
uhf-dropdown:not(:defined),
|
||
uhf-popout:not(:defined) {
|
||
visibility: hidden;
|
||
}
|
||
</style>
|
||
<link rel="stylesheet" href="https://uhf.microsoft.com/statics/20260701.14.10/css/style-BpBYj3rT.css" /><script type="module" src="https://uhf.microsoft.com/statics/20260701.14.10/js/entry.js"></script>
|
||
<script src="https://wcpstatic.microsoft.com/mscc/lib/v2/wcp-consent.js"></script> <!--/ UHF header -->
|
||
<script>
|
||
let userConsentDetailsCallback = function () {
|
||
return siteConsent ? siteConsent.getConsent() : null
|
||
};
|
||
|
||
(function configureAwaConsent() {
|
||
function applyAwaConsentConfig() {
|
||
// JSLL is deferred, so awa may not exist yet while parsing <body>.
|
||
if (!window.awa || !window.awa.sku || !window.awa.sku.config) {
|
||
return false;
|
||
}
|
||
|
||
var awaObj = window.awa;
|
||
var spc =
|
||
awaObj.sku.config.extensionConfig &&
|
||
awaObj.sku.config.extensionConfig.SystemPropertiesCollector;
|
||
|
||
if (!spc || !spc.callback) {
|
||
return false;
|
||
}
|
||
|
||
spc.callback.userConsentDetails = userConsentDetailsCallback;
|
||
spc.userConsented = false;
|
||
return true;
|
||
}
|
||
|
||
if (!applyAwaConsentConfig()) {
|
||
// Deferred scripts execute before DOMContentLoaded, so this will run after JSLL creates `awa`.
|
||
document.addEventListener('DOMContentLoaded', applyAwaConsentConfig, { once: true });
|
||
}
|
||
})();
|
||
|
||
var is_post = '';
|
||
function changeAnalyticsCookies() {
|
||
//have Analytics consent
|
||
if (siteConsent.getConsentFor(WcpConsent.consentCategories.Analytics)) {
|
||
|
||
//set consent
|
||
var date = new Date();
|
||
date.setTime(date.getTime() + (180 * 24 * 60 * 60 * 1000));
|
||
expires = "; expires=" + date.toUTCString();
|
||
if (window.clarity) {
|
||
window.clarity('consent');
|
||
}
|
||
|
||
} else if (siteConsent.isConsentRequired === false) {
|
||
// Consent is not required
|
||
if (window.clarity) {
|
||
window.clarity('consent');
|
||
}
|
||
|
||
} else {
|
||
|
||
document.cookie = name + '=_gat; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
|
||
document.cookie = name + '=_gid; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
|
||
document.cookie = name + '=_ga; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
|
||
document.cookie = name + '=simaCookie; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
|
||
}
|
||
}
|
||
window.WcpConsent && WcpConsent.init("en-US", "cookie-banner", function (err, _siteConsent) {
|
||
if (!err) {
|
||
siteConsent = _siteConsent; //siteConsent is used to get the current consent
|
||
} else {
|
||
//console.log("Error initializing WcpConsent: "+ err);
|
||
}
|
||
}, onConsentChanged, WcpConsent.themes.light);
|
||
|
||
function onConsentChanged(categoryPreferences) {
|
||
changeAnalyticsCookies();
|
||
|
||
}
|
||
|
||
</script>
|
||
<main class="devblogs-main" id="main" role="main">
|
||
<div class="wrapper">
|
||
<div class="container-evo pt-24">
|
||
|
||
<div class="breadcrumbs-wrapper" data-bi-area="breadcrumb" data-bi-id="breadcrumb">
|
||
<nav aria-label="breadcrumb"><ul class="breadcrumb d-flex flex-wrap p-0 m-0" style="list-style-type: none;"><li><a href="https://devblogs.microsoft.com/">Dev Blogs</a><span class="breadcrumb-icon px-6"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" style="vertical-align: middle;"><path fill="none" stroke="currentColor" stroke-width="1" d="m9 5l7 7l-7 7"></path></svg></span></li><li><span class="ebc-current-readmore" aria-current="page">Azure DevOps Service</span></li></ul></nav> </div>
|
||
|
||
|
||
<!-- alert-banner-starts -->
|
||
<!-- alert-banner-ends -->
|
||
</div>
|
||
<style>
|
||
/* The image itself */
|
||
.thumbnail-container img {
|
||
height: auto;
|
||
max-height: 100%;
|
||
width: auto;
|
||
max-height: 301px;
|
||
}
|
||
|
||
@media (min-width: 900px) {
|
||
.pinned-wrap {
|
||
display: grid;
|
||
grid-template-columns: 1fr 1fr;
|
||
align-items: stretch;
|
||
}
|
||
}
|
||
</style>
|
||
<div class="container-evo mt-80">
|
||
<div class="mb-80" style="max-width: 976px;"><h1 class="mb-6">Azure DevOps Service</h1><p class="fs-16 mb-0"></p></div> <div class="container-sidebar-home mb-80">
|
||
<div>
|
||
<section class="mb-32" data-bi-area="featured_posts">
|
||
<div class="border-bottom mb-40">
|
||
<h2 class="fs-20 mb-16">Featured posts</h2>
|
||
</div>
|
||
<div class="feature-bg box p-24 rounded shadow mb-40 position-relative feature-border post-card" data-post-id="17995">
|
||
<div class="pinned-wrap d-flex flex-column flex-lg-row align-items-center gap-40">
|
||
<div class="d-flex align-items-center justify-content-center thumbnail-container"><img width="241" height="162" src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/People_Gui_Code_small.png" class="attachment-Full size-Full wp-post-image" alt="We’ve Moved! – Introducing Azure DevOps Service Status Portal" decoding="async" /></div> <div class="w-100 pinned-right d-flex justify-content-between flex-column">
|
||
<div>
|
||
<div class="d-flex justify-content-between mb-20">
|
||
<div class="d-flex gap-16">
|
||
<div class="d-flex align-items-center">
|
||
Nov 28, 2018 </div>
|
||
</div>
|
||
<div class="d-flex gap-16">
|
||
<div class="d-flex gap-4">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none"
|
||
xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4809 13.8424H15.4C16.2962 13.8424 17 13.1289 17 12.2766V5.56594C17 4.7136 16.2962 4.00012 15.4 4.00012H4.6C3.70383 4.00012 3 4.7136 3 5.56594V12.2766C3 13.1289 3.70383 13.8424 4.6 13.8424H6.19908L6.2 17.0001L6.20346 16.9999L6.20502 16.999L10.4809 13.8424ZM6.79895 17.8035C6.35668 18.1299 5.73 18.0407 5.39921 17.6043C5.26989 17.4336 5.2 17.2263 5.2 17.0134L5.19937 14.8424H4.6C3.16406 14.8424 2 13.6936 2 12.2766V5.56594C2 4.14888 3.16406 3.00012 4.6 3.00012H15.4C16.8359 3.00012 18 4.14888 18 5.56594V12.2766C18 13.6936 16.8359 14.8424 15.4 14.8424H10.81L6.79895 17.8035Z"
|
||
fill="#0F6CBD" />
|
||
</svg>
|
||
<div class="d-flex align-items-center neutral-color">
|
||
<span class="screen-reader-text">Post comments count</span>
|
||
0 </div>
|
||
</div>
|
||
<div class="d-flex gap-4">
|
||
<div class="d-flex align-items-center">
|
||
<svg width="20" height="21" viewBox="0 0 20 21" fill="none"
|
||
xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z"
|
||
fill="#242424" />
|
||
</svg>
|
||
</div>
|
||
<div class="d-flex align-items-center neutral-color">
|
||
<span class="screen-reader-text">Post likes count</span>
|
||
0 </div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<h3 class="fs-24 mb-20">
|
||
<a class="single-click" href="https://devblogs.microsoft.com/devopsservice/introducing-azure-devops-service-status-portal/"
|
||
data-bi-id="blog_home_page_featured_posts_card_singleclick"
|
||
data-bi-name="We’ve Moved! – Introducing Azure DevOps Service Status Portal">
|
||
We’ve Moved! – Introducing Azure DevOps Service Status Portal </a>
|
||
</h3>
|
||
<div class="d-flex gap-6 align-items-center">
|
||
<div class="avatar-parent">
|
||
<img src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/letter-avatar/6664ce0fbbd767ff96038a778b3841d3.svg" style="width: 20px; height: 20px;"
|
||
class="avatar-20 rounded-pill a" alt="">
|
||
</div>
|
||
<span class="fs-14">Azure DevOps SRE</span>
|
||
</div> <p class="mt-12">
|
||
Today, we’re happy to introduce Azure DevOps service status portal which helps with real time insights into active service events and provides further details o... </p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="mb-32" data-bi-area="latest_posts">
|
||
<div class="d-flex justify-content-between border-bottom mb-40">
|
||
<h2 class="fs-20 mb-16 pt-6" id="load-posts">Latest posts</h2>
|
||
<style>
|
||
/* Storing grid globle styles here for now*/
|
||
.masonry-card {
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.archive-posts.grid-view {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
|
||
}
|
||
|
||
/* Masonry thumbnail */
|
||
.masonry-thumbnail {
|
||
display: flex;
|
||
justify-content: center;
|
||
}
|
||
.grid-view .masonry-thumbnail {
|
||
align-items: center;
|
||
width: 100%;
|
||
min-height: 188px;
|
||
}
|
||
|
||
.grid-view .masonry-thumbnail img {
|
||
max-height: 164px;
|
||
width: auto;
|
||
}
|
||
|
||
.masonry-thumbnail {
|
||
background: var(--clr-card-image-bg);
|
||
border-radius: 8px;
|
||
padding: 12px;
|
||
}
|
||
|
||
/* Grid View */
|
||
.home.blog .archive-posts.grid-view .masonry-card {
|
||
display: block;
|
||
}
|
||
|
||
/* Single Column View */
|
||
.archive-posts.single-column {
|
||
display: block;
|
||
}
|
||
|
||
.archive-posts.single-column .masonry-card {
|
||
min-height: 311px;
|
||
margin-bottom: 24px;
|
||
}
|
||
|
||
@media (min-width: 1084px) {
|
||
.masonry-container {
|
||
gap: 40px;
|
||
}
|
||
|
||
.masonry-card {
|
||
padding: 24px;
|
||
}
|
||
|
||
.archive-posts.single-column .masonry-card {
|
||
margin-bottom: 40px;
|
||
}
|
||
|
||
}
|
||
|
||
@media (min-width: 900px) {
|
||
.card-body {
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: space-between;
|
||
flex-grow: 1;
|
||
}
|
||
|
||
.archive-posts.single-column .card-body {
|
||
width: 60%;
|
||
}
|
||
}
|
||
|
||
@media (max-width: 760px) {
|
||
.masonry-container {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
|
||
.single-column .masonry-card {
|
||
display: block;
|
||
}
|
||
|
||
.single-column .masonry-thumbnail {
|
||
margin-bottom: 16px;
|
||
}
|
||
}
|
||
|
||
.single-column .masonry-card {
|
||
flex-direction: row;
|
||
gap: 32px;
|
||
}
|
||
|
||
@media (min-width: 761px) {
|
||
.single-column .masonry-card .masonry-thumbnail {
|
||
flex-grow: 1;
|
||
align-items: center;
|
||
min-width: 240px;
|
||
max-width: 449px;
|
||
width: 40%;
|
||
}
|
||
}
|
||
|
||
.single-column .card-body .card-top>div {
|
||
margin-top: 0px;
|
||
}
|
||
|
||
/* Style the button */
|
||
.layout-toggle {
|
||
display: none;
|
||
}
|
||
|
||
@media (min-width: 760px) {
|
||
.layout-toggle {
|
||
display: flex;
|
||
gap: 12px;
|
||
height: 32px;
|
||
}
|
||
}
|
||
|
||
.layout-toggle button {
|
||
background-color: transparent;
|
||
border: none;
|
||
cursor: pointer;
|
||
padding: 0px;
|
||
}
|
||
|
||
.layout-toggle button svg path {
|
||
fill: var(--clr-landing-navbar);
|
||
}
|
||
|
||
.layout-toggle button.active svg rect {
|
||
fill: var(--clr-btn-toggle);
|
||
stroke: none;
|
||
}
|
||
|
||
.layout-toggle button:not(.active) svg rect {
|
||
fill: var(--clr-card-bg);
|
||
stroke: var(--clr-btn-greyscale-border);
|
||
}
|
||
|
||
.layout-toggle button.active svg path {
|
||
fill: white;
|
||
}
|
||
|
||
.layout-toggle button:not(.active):hover svg rect {
|
||
fill: var(--clr-btn-greyscale-hover-bg);
|
||
}
|
||
|
||
.layout-toggle button:focus {
|
||
border-radius: 4px;
|
||
}
|
||
|
||
.excerpt-title {
|
||
display: -webkit-box;
|
||
-webkit-line-clamp: 3;
|
||
/* Number of full lines */
|
||
-webkit-box-orient: vertical;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
}
|
||
|
||
.excerpt-body {
|
||
display: -webkit-box;
|
||
-webkit-line-clamp: 3;
|
||
/* Number of full lines */
|
||
-webkit-box-orient: vertical;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
}
|
||
</style>
|
||
<div class="layout-toggle">
|
||
<!-- Grid View Button -->
|
||
<button id="grid-view-btn" data-toggle="tooltip" title="Switch to Grid view" class="active" aria-pressed="true" data-bi-area="latest posts" data-bi-id="blog_home_page_latest_posts_grid_toggle">
|
||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<rect x="0.5" y="0.5" width="31" height="31" rx="3.5"></rect>
|
||
<path d="M12.75 17C13.9926 17 15 18.0074 15 19.25V22.75C15 23.9926 13.9926 25 12.75 25H9.25C8.00736 25 7 23.9926 7 22.75V19.25C7 18.0074 8.00736 17 9.25 17H12.75ZM22.75 17C23.9926 17 25 18.0074 25 19.25V22.75C25 23.9926 23.9926 25 22.75 25H19.25C18.0074 25 17 23.9926 17 22.75V19.25C17 18.0074 18.0074 17 19.25 17H22.75ZM12.75 18.5H9.25C8.83579 18.5 8.5 18.8358 8.5 19.25V22.75C8.5 23.1642 8.83579 23.5 9.25 23.5H12.75C13.1642 23.5 13.5 23.1642 13.5 22.75V19.25C13.5 18.8358 13.1642 18.5 12.75 18.5ZM22.75 18.5H19.25C18.8358 18.5 18.5 18.8358 18.5 19.25V22.75C18.5 23.1642 18.8358 23.5 19.25 23.5H22.75C23.1642 23.5 23.5 23.1642 23.5 22.75V19.25C23.5 18.8358 23.1642 18.5 22.75 18.5ZM12.75 7C13.9926 7 15 8.00736 15 9.25V12.75C15 13.9926 13.9926 15 12.75 15H9.25C8.00736 15 7 13.9926 7 12.75V9.25C7 8.00736 8.00736 7 9.25 7H12.75ZM22.75 7C23.9926 7 25 8.00736 25 9.25V12.75C25 13.9926 23.9926 15 22.75 15H19.25C18.0074 15 17 13.9926 17 12.75V9.25C17 8.00736 18.0074 7 19.25 7H22.75ZM12.75 8.5H9.25C8.83579 8.5 8.5 8.83579 8.5 9.25V12.75C8.5 13.1642 8.83579 13.5 9.25 13.5H12.75C13.1642 13.5 13.5 13.1642 13.5 12.75V9.25C13.5 8.83579 13.1642 8.5 12.75 8.5ZM22.75 8.5H19.25C18.8358 8.5 18.5 8.83579 18.5 9.25V12.75C18.5 13.1642 18.8358 13.5 19.25 13.5H22.75C23.1642 13.5 23.5 13.1642 23.5 12.75V9.25C23.5 8.83579 23.1642 8.5 22.75 8.5Z" fill="#3A96DD"></path>
|
||
</svg>
|
||
</button>
|
||
<!-- Column View Button -->
|
||
<button id="column-view-btn" data-toggle="tooltip" title="Switch to Column view" aria-pressed="false" data-bi-area="latest posts" data-bi-id="blog_home_page_latest_posts_column_toggle">
|
||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<rect x="0.5" y="0.5" width="31" height="31" rx="3.5" />
|
||
<path
|
||
d="M8.25 8C7.00736 8 6 9.00736 6 10.25V12.75C6 13.9926 7.00736 15 8.25 15H10.75C11.9926 15 13 13.9926 13 12.75V10.25C13 9.00736 11.9926 8 10.75 8H8.25ZM7.5 10.25C7.5 9.83579 7.83579 9.5 8.25 9.5H10.75C11.1642 9.5 11.5 9.83579 11.5 10.25V12.75C11.5 13.1642 11.1642 13.5 10.75 13.5H8.25C7.83579 13.5 7.5 13.1642 7.5 12.75V10.25ZM15.25 9C14.8358 9 14.5 9.33579 14.5 9.75C14.5 10.1642 14.8358 10.5 15.25 10.5H25.25C25.6642 10.5 26 10.1642 26 9.75C26 9.33579 25.6642 9 25.25 9H15.25ZM15.25 12C14.8358 12 14.5 12.3358 14.5 12.75C14.5 13.1642 14.8358 13.5 15.25 13.5H22.25C22.6642 13.5 23 13.1642 23 12.75C23 12.3358 22.6642 12 22.25 12H15.25ZM8.25 17C7.00736 17 6 18.0074 6 19.25V21.75C6 22.9926 7.00736 24 8.25 24H10.75C11.9926 24 13 22.9926 13 21.75V19.25C13 18.0074 11.9926 17 10.75 17H8.25ZM7.5 19.25C7.5 18.8358 7.83579 18.5 8.25 18.5H10.75C11.1642 18.5 11.5 18.8358 11.5 19.25V21.75C11.5 22.1642 11.1642 22.5 10.75 22.5H8.25C7.83579 22.5 7.5 22.1642 7.5 21.75V19.25ZM15.25 18C14.8358 18 14.5 18.3358 14.5 18.75C14.5 19.1642 14.8358 19.5 15.25 19.5H25.25C25.6642 19.5 26 19.1642 26 18.75C26 18.3358 25.6642 18 25.25 18H15.25ZM15.25 21C14.8358 21 14.5 21.3358 14.5 21.75C14.5 22.1642 14.8358 22.5 15.25 22.5H22.25C22.6642 22.5 23 22.1642 23 21.75C23 21.3358 22.6642 21 22.25 21H15.25Z"
|
||
fill="white" />
|
||
</svg>
|
||
</button>
|
||
</div>
|
||
<script>
|
||
document.addEventListener('DOMContentLoaded', function () {
|
||
// detect if we are on the landing page or a blog home page in PHP, but otherwise keep the logic in JS for clarity
|
||
const isMainSite = false;
|
||
// Single column layout view toggle
|
||
const wrappers = document.querySelectorAll('.archive-posts');
|
||
const paginateSelector = (isMainSite ? '.netsposts-paginate .next' : '#pload-more' );
|
||
const paginate = document.querySelector(paginateSelector);
|
||
const gridButton = document.getElementById('grid-view-btn');
|
||
const columnButton = document.getElementById('column-view-btn');
|
||
// observer to apply the updated layout attribute to newly added cards automatically after load more is clicked
|
||
const cardObserver = new MutationObserver((mutations, observer) => {
|
||
let newCards = false;
|
||
// check that at least one new card has been added
|
||
mutations.forEach(function(mutation) {
|
||
if (mutation.type === 'childList') { newCards = true; }
|
||
});
|
||
// run once if new cards have been added rather than once for each mutation
|
||
if (newCards) {
|
||
let chosenLayout = (gridButton.classList.contains('active') ? 'grid-view' : 'single-column');
|
||
updateLatestPostsTracking(chosenLayout);
|
||
}
|
||
});
|
||
|
||
cardObserver.observe(wrappers[0], {childList: true});
|
||
|
||
// Check for stored layout in localStorage
|
||
let storedLayout = localStorage.getItem('layout') || 'grid-view'; // Default is grid-view
|
||
|
||
// Apply the stored layout
|
||
wrappers.forEach(wrapper => {
|
||
wrapper.classList.add(storedLayout);
|
||
});
|
||
updateLatestPostsTracking(storedLayout);
|
||
|
||
// Function to update the layout state in localStorage
|
||
function updateLayoutState(layout) {
|
||
localStorage.setItem('layout', layout); // Store layout in localStorage
|
||
}
|
||
|
||
// function to update data bi attributes to reflect the current layout
|
||
function updateLatestPostsTracking(layout) {
|
||
let layoutString = '';
|
||
let cardLinkSelector = ( isMainSite ? 'netsposts-posttitle-link' : 'single-click' );
|
||
// make layout string compliant with tracking requirements
|
||
switch (layout) {
|
||
case 'grid-view':
|
||
layoutString = 'grid';
|
||
break;
|
||
case 'single-column':
|
||
layoutString = 'column';
|
||
break;
|
||
}
|
||
// update data attributes on all cards
|
||
wrappers.forEach(wrapper => {
|
||
// get current collection of cards in case new cards have been added
|
||
let cards = wrapper.getElementsByClassName(cardLinkSelector);
|
||
Array.from(cards).forEach(card => {
|
||
if (isMainSite) {
|
||
card.setAttribute('data-bi-id', 'landing_page_latest_posts_'+layoutString+'_card');
|
||
} else {
|
||
card.setAttribute('data-bi-id', 'blog_home_page_latest_posts_'+layoutString+'_card_singleclick');
|
||
}
|
||
})
|
||
});
|
||
if (paginate) {
|
||
// update data attributes on pagination
|
||
if (isMainSite) {
|
||
paginate.setAttribute('data-bi-id', 'landing_page_latest_posts_'+layoutString+'_load_more');
|
||
} else {
|
||
paginate.setAttribute('data-bi-id', 'blog_home_page_latest_posts_'+layoutString+'_load_more');
|
||
}
|
||
}
|
||
}
|
||
|
||
// Function to check screen size and apply the correct layout (but without removing single-column)
|
||
function checkScreenSize() {
|
||
// No need to remove single-column for smaller screens
|
||
storedLayout = localStorage.getItem('layout');
|
||
wrappers.forEach(wrapper => {
|
||
if (storedLayout === 'single-column') {
|
||
wrapper.classList.remove('grid-view');
|
||
wrapper.classList.add('single-column');
|
||
} else {
|
||
wrapper.classList.remove('single-column');
|
||
wrapper.classList.add('grid-view');
|
||
}
|
||
});
|
||
|
||
// Update button active state based on stored layout
|
||
if (storedLayout === 'single-column') {
|
||
columnButton.classList.add('active');
|
||
columnButton.setAttribute('aria-pressed', 'true');
|
||
gridButton.classList.remove('active');
|
||
gridButton.setAttribute('aria-pressed', 'false');
|
||
} else {
|
||
gridButton.classList.add('active');
|
||
gridButton.setAttribute('aria-pressed', 'true');
|
||
columnButton.classList.remove('active');
|
||
columnButton.setAttribute('aria-pressed', 'false');
|
||
}
|
||
}
|
||
|
||
// Run check on load and window resize
|
||
checkScreenSize();
|
||
window.addEventListener('resize', checkScreenSize);
|
||
|
||
// Set event listener for Grid View button
|
||
gridButton.addEventListener('click', function () {
|
||
wrappers.forEach(wrapper => {
|
||
wrapper.classList.remove('single-column');
|
||
wrapper.classList.add('grid-view');
|
||
});
|
||
// Update active button state
|
||
gridButton.classList.add('active');
|
||
columnButton.classList.remove('active');
|
||
|
||
gridButton.setAttribute('aria-pressed', 'true');
|
||
columnButton.setAttribute('aria-pressed', 'false');
|
||
|
||
updateLayoutState('grid-view'); // Save grid-view in localStorage
|
||
updateLatestPostsTracking('grid-view'); // update data bi attr
|
||
});
|
||
|
||
// Set event listener for Column View button
|
||
columnButton.addEventListener('click', function () {
|
||
wrappers.forEach(wrapper => {
|
||
wrapper.classList.remove('grid-view');
|
||
wrapper.classList.add('single-column');
|
||
});
|
||
// Update active button state
|
||
columnButton.classList.add('active');
|
||
gridButton.classList.remove('active');
|
||
|
||
columnButton.setAttribute('aria-pressed', 'true');
|
||
gridButton.setAttribute('aria-pressed', 'false');
|
||
|
||
updateLayoutState('single-column'); // Save single-column in localStorage
|
||
updateLatestPostsTracking('single-column'); // update data bi attr
|
||
});
|
||
});
|
||
</script> </div>
|
||
|
||
<div class="archive-posts masonry-container gap-24">
|
||
|
||
<div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1 post-card"
|
||
data-post-id="18116">
|
||
|
||
<div class="masonry-thumbnail">
|
||
<img class="post-thumbnail wp-image-18098 lazyload" width="235" height="147" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOsAAACTAQMAAABVtXw6AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAG0lEQVRYhe3BAQ0AAADCoPdPbQ43oAAAAAC4MRHNAAE8Mp6xAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/devblog-debug_small-1.png" alt="" />
|
||
</div>
|
||
|
||
<div class="card-body">
|
||
<div class="card-top">
|
||
|
||
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
|
||
<div>
|
||
Apr 30, 2019 </div>
|
||
|
||
<div class="d-flex gap-12">
|
||
|
||
|
||
<div class="d-flex gap-4 clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4809 13.8424H15.4C16.2962 13.8424 17 13.1289 17 12.2766V5.56594C17 4.7136 16.2962 4.00012 15.4 4.00012H4.6C3.70383 4.00012 3 4.7136 3 5.56594V12.2766C3 13.1289 3.70383 13.8424 4.6 13.8424H6.19908L6.2 17.0001L6.20346 16.9999L6.20502 16.999L10.4809 13.8424ZM6.79895 17.8035C6.35668 18.1299 5.73 18.0407 5.39921 17.6043C5.26989 17.4336 5.2 17.2263 5.2 17.0134L5.19937 14.8424H4.6C3.16406 14.8424 2 13.6936 2 12.2766V5.56594C2 4.14888 3.16406 3.00012 4.6 3.00012H15.4C16.8359 3.00012 18 4.14888 18 5.56594V12.2766C18 13.6936 16.8359 14.8424 15.4 14.8424H10.81L6.79895 17.8035Z"
|
||
fill="#0F6CBD" />
|
||
</svg>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post comments count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
<div class="d-flex gap-4">
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z"
|
||
fill="#242424" />
|
||
</svg>
|
||
</div>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post likes count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<h3 class="fs-24 fw-600 mb-16">
|
||
<a href="https://devblogs.microsoft.com/devopsservice/azure-devops-availability-issues-19-april-2019/"
|
||
class="single-click excerpt-title"
|
||
data-bi-id="blog_home_page_latest posts_grid_card"
|
||
data-bi-name="Azure DevOps Availability Issues – 19 April 2019">
|
||
Azure DevOps Availability Issues – 19 April 2019 </a>
|
||
</h3>
|
||
|
||
<div class="d-flex gap-6 align-items-center">
|
||
<div class="avatar-parent">
|
||
<img src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/letter-avatar/6664ce0fbbd767ff96038a778b3841d3.svg" style="width: 20px; height: 20px;"
|
||
class="avatar-20 rounded-pill a" alt="">
|
||
</div>
|
||
<span class="fs-14">Azure DevOps SRE</span>
|
||
</div>
|
||
<p class="excerpt-body mt-16 mb-24">
|
||
Please refer to this link from the Azure DevOps Status Portal for the details on this incident.
|
||
|
||
</p>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1 post-card"
|
||
data-post-id="17665">
|
||
|
||
<div class="masonry-thumbnail">
|
||
<img class="post-thumbnail wp-image-18098 lazyload" width="235" height="147" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOsAAACTAQMAAABVtXw6AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAG0lEQVRYhe3BAQ0AAADCoPdPbQ43oAAAAAC4MRHNAAE8Mp6xAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/devblog-debug_small-1.png" alt="" />
|
||
</div>
|
||
|
||
<div class="card-body">
|
||
<div class="card-top">
|
||
|
||
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
|
||
<div>
|
||
Oct 16, 2018 </div>
|
||
|
||
<div class="d-flex gap-12">
|
||
|
||
|
||
<div class="d-flex gap-4 clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4809 13.8424H15.4C16.2962 13.8424 17 13.1289 17 12.2766V5.56594C17 4.7136 16.2962 4.00012 15.4 4.00012H4.6C3.70383 4.00012 3 4.7136 3 5.56594V12.2766C3 13.1289 3.70383 13.8424 4.6 13.8424H6.19908L6.2 17.0001L6.20346 16.9999L6.20502 16.999L10.4809 13.8424ZM6.79895 17.8035C6.35668 18.1299 5.73 18.0407 5.39921 17.6043C5.26989 17.4336 5.2 17.2263 5.2 17.0134L5.19937 14.8424H4.6C3.16406 14.8424 2 13.6936 2 12.2766V5.56594C2 4.14888 3.16406 3.00012 4.6 3.00012H15.4C16.8359 3.00012 18 4.14888 18 5.56594V12.2766C18 13.6936 16.8359 14.8424 15.4 14.8424H10.81L6.79895 17.8035Z"
|
||
fill="#0F6CBD" />
|
||
</svg>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post comments count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
<div class="d-flex gap-4">
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z"
|
||
fill="#242424" />
|
||
</svg>
|
||
</div>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post likes count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<h3 class="fs-24 fw-600 mb-16">
|
||
<a href="https://devblogs.microsoft.com/devopsservice/postmortem-azure-devops-service-outages-in-october-2018/"
|
||
class="single-click excerpt-title"
|
||
data-bi-id="blog_home_page_latest posts_grid_card"
|
||
data-bi-name="Postmortem: Azure DevOps Service Outages in October 2018">
|
||
Postmortem: Azure DevOps Service Outages in October 2018 </a>
|
||
</h3>
|
||
|
||
<div class="d-flex gap-6 align-items-center">
|
||
<div class="avatar-parent">
|
||
<img src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/letter-avatar/6664ce0fbbd767ff96038a778b3841d3.svg" style="width: 20px; height: 20px;"
|
||
class="avatar-20 rounded-pill a" alt="">
|
||
</div>
|
||
<span class="fs-14">Azure DevOps SRE</span>
|
||
</div>
|
||
<p class="excerpt-body mt-16 mb-24">
|
||
Earlier this month, Azure DevOps experienced several significant service outages, for which we are deeply sorry. As with every significant live site incident, we have completed a detailed root cause analysis for these. Due to the proximity of these incidents and common underlying causes, we wanted to share the details with you to ensure that you know what happened and what we’re doing to prevent them from recurring.
|
||
October 3, 4 and 8 Incidents
|
||
The incident on Wednesday, 3 October 2018 started with a networking issue in the North Central US region. Since our authentication service, SPS, is in this region the issu... </p>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1 post-card"
|
||
data-post-id="17535">
|
||
|
||
<div class="masonry-thumbnail">
|
||
<img class="post-thumbnail wp-image-18098 lazyload" width="235" height="147" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOsAAACTAQMAAABVtXw6AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAG0lEQVRYhe3BAQ0AAADCoPdPbQ43oAAAAAC4MRHNAAE8Mp6xAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/devblog-debug_small-1.png" alt="" />
|
||
</div>
|
||
|
||
<div class="card-body">
|
||
<div class="card-top">
|
||
|
||
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
|
||
<div>
|
||
Sep 24, 2018 </div>
|
||
|
||
<div class="d-flex gap-12">
|
||
|
||
|
||
<div class="d-flex gap-4 clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4809 13.8424H15.4C16.2962 13.8424 17 13.1289 17 12.2766V5.56594C17 4.7136 16.2962 4.00012 15.4 4.00012H4.6C3.70383 4.00012 3 4.7136 3 5.56594V12.2766C3 13.1289 3.70383 13.8424 4.6 13.8424H6.19908L6.2 17.0001L6.20346 16.9999L6.20502 16.999L10.4809 13.8424ZM6.79895 17.8035C6.35668 18.1299 5.73 18.0407 5.39921 17.6043C5.26989 17.4336 5.2 17.2263 5.2 17.0134L5.19937 14.8424H4.6C3.16406 14.8424 2 13.6936 2 12.2766V5.56594C2 4.14888 3.16406 3.00012 4.6 3.00012H15.4C16.8359 3.00012 18 4.14888 18 5.56594V12.2766C18 13.6936 16.8359 14.8424 15.4 14.8424H10.81L6.79895 17.8035Z"
|
||
fill="#0F6CBD" />
|
||
</svg>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post comments count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
<div class="d-flex gap-4">
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z"
|
||
fill="#242424" />
|
||
</svg>
|
||
</div>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post likes count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<h3 class="fs-24 fw-600 mb-16">
|
||
<a href="https://devblogs.microsoft.com/devopsservice/postmortem-vs-marketplace-outage-4-september-2018/"
|
||
class="single-click excerpt-title"
|
||
data-bi-id="blog_home_page_latest posts_grid_card"
|
||
data-bi-name="Postmortem – VS Marketplace outage – 4 September 2018">
|
||
Postmortem – VS Marketplace outage – 4 September 2018 </a>
|
||
</h3>
|
||
|
||
<div class="d-flex gap-6 align-items-center">
|
||
<div class="avatar-parent">
|
||
<img src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/letter-avatar/6664ce0fbbd767ff96038a778b3841d3.svg" style="width: 20px; height: 20px;"
|
||
class="avatar-20 rounded-pill a" alt="">
|
||
</div>
|
||
<span class="fs-14">Azure DevOps SRE</span>
|
||
</div>
|
||
<p class="excerpt-body mt-16 mb-24">
|
||
On Tuesday, 4 September 2018, Visual Studio Marketplace suffered an extended outage affecting most of its customers. Marketplace hosts and serves extensions for the Visual Studio IDE, Visual Studio Code, and Azure DevOps. This was the first instance of the Marketplace service going down completely, and we sincerely apologize for the outage.
|
||
What happened and resultant customer impact
|
||
Azure resources that Marketplace depends on (largely Compute, Storage and SQL) were down during the incident in Azure South Central US and this took down the single instance Marketplace service completely from 2018-09-04 09:45 UTC to... </p>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1 post-card"
|
||
data-post-id="17485">
|
||
|
||
<div class="masonry-thumbnail">
|
||
<img class="post-thumbnail wp-image-18098 lazyload" width="235" height="147" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOsAAACTAQMAAABVtXw6AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAG0lEQVRYhe3BAQ0AAADCoPdPbQ43oAAAAAC4MRHNAAE8Mp6xAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/devblog-debug_small-1.png" alt="" />
|
||
</div>
|
||
|
||
<div class="card-body">
|
||
<div class="card-top">
|
||
|
||
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
|
||
<div>
|
||
Sep 10, 2018 </div>
|
||
|
||
<div class="d-flex gap-12">
|
||
|
||
|
||
<div class="d-flex gap-4 clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4809 13.8424H15.4C16.2962 13.8424 17 13.1289 17 12.2766V5.56594C17 4.7136 16.2962 4.00012 15.4 4.00012H4.6C3.70383 4.00012 3 4.7136 3 5.56594V12.2766C3 13.1289 3.70383 13.8424 4.6 13.8424H6.19908L6.2 17.0001L6.20346 16.9999L6.20502 16.999L10.4809 13.8424ZM6.79895 17.8035C6.35668 18.1299 5.73 18.0407 5.39921 17.6043C5.26989 17.4336 5.2 17.2263 5.2 17.0134L5.19937 14.8424H4.6C3.16406 14.8424 2 13.6936 2 12.2766V5.56594C2 4.14888 3.16406 3.00012 4.6 3.00012H15.4C16.8359 3.00012 18 4.14888 18 5.56594V12.2766C18 13.6936 16.8359 14.8424 15.4 14.8424H10.81L6.79895 17.8035Z"
|
||
fill="#0F6CBD" />
|
||
</svg>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post comments count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
<div class="d-flex gap-4">
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z"
|
||
fill="#242424" />
|
||
</svg>
|
||
</div>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post likes count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<h3 class="fs-24 fw-600 mb-16">
|
||
<a href="https://devblogs.microsoft.com/devopsservice/postmortem-vsts-4-september-2018/"
|
||
class="single-click excerpt-title"
|
||
data-bi-id="blog_home_page_latest posts_grid_card"
|
||
data-bi-name="Postmortem: VSTS 4 September 2018">
|
||
Postmortem: VSTS 4 September 2018 </a>
|
||
</h3>
|
||
|
||
<div class="d-flex gap-6 align-items-center">
|
||
<div class="avatar-parent">
|
||
<img src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/letter-avatar/6664ce0fbbd767ff96038a778b3841d3.svg" style="width: 20px; height: 20px;"
|
||
class="avatar-20 rounded-pill a" alt="">
|
||
</div>
|
||
<span class="fs-14">Azure DevOps SRE</span>
|
||
</div>
|
||
<p class="excerpt-body mt-16 mb-24">
|
||
Postmortem – VSTS Outage – 4 September 2018
|
||
On Tuesday, 4 September 2018, VSTS (now called Azure DevOps) suffered an extended outage affecting customers with organizations hosted in the South Central US region (one of the 10 regions globally hosting VSTS customers). The outage also impacted customers globally due to cross-service dependencies. It required more than 21 hours to recover all VSTS services in South Central US because the recovery of VSTS services was dependent upon Azure restoring the data center. After VSTS services were recovered, we had an additional incident which lasted 2 hours impacting Release... </p>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1 post-card"
|
||
data-post-id="16875">
|
||
|
||
<div class="masonry-thumbnail">
|
||
<img class="post-thumbnail wp-image-18098 lazyload" width="235" height="147" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOsAAACTAQMAAABVtXw6AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAG0lEQVRYhe3BAQ0AAADCoPdPbQ43oAAAAAC4MRHNAAE8Mp6xAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/devblog-debug_small-1.png" alt="" />
|
||
</div>
|
||
|
||
<div class="card-body">
|
||
<div class="card-top">
|
||
|
||
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
|
||
<div>
|
||
May 25, 2018 </div>
|
||
|
||
<div class="d-flex gap-12">
|
||
|
||
|
||
<div class="d-flex gap-4 clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4809 13.8424H15.4C16.2962 13.8424 17 13.1289 17 12.2766V5.56594C17 4.7136 16.2962 4.00012 15.4 4.00012H4.6C3.70383 4.00012 3 4.7136 3 5.56594V12.2766C3 13.1289 3.70383 13.8424 4.6 13.8424H6.19908L6.2 17.0001L6.20346 16.9999L6.20502 16.999L10.4809 13.8424ZM6.79895 17.8035C6.35668 18.1299 5.73 18.0407 5.39921 17.6043C5.26989 17.4336 5.2 17.2263 5.2 17.0134L5.19937 14.8424H4.6C3.16406 14.8424 2 13.6936 2 12.2766V5.56594C2 4.14888 3.16406 3.00012 4.6 3.00012H15.4C16.8359 3.00012 18 4.14888 18 5.56594V12.2766C18 13.6936 16.8359 14.8424 15.4 14.8424H10.81L6.79895 17.8035Z"
|
||
fill="#0F6CBD" />
|
||
</svg>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post comments count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
<div class="d-flex gap-4">
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z"
|
||
fill="#242424" />
|
||
</svg>
|
||
</div>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post likes count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<h3 class="fs-24 fw-600 mb-16">
|
||
<a href="https://devblogs.microsoft.com/devopsservice/postmortem-global-vsts-availability-issues-22-may-2018/"
|
||
class="single-click excerpt-title"
|
||
data-bi-id="blog_home_page_latest posts_grid_card"
|
||
data-bi-name="Postmortem: Global VSTS availability issues – 22 May 2018">
|
||
Postmortem: Global VSTS availability issues – 22 May 2018 </a>
|
||
</h3>
|
||
|
||
<div class="d-flex gap-6 align-items-center">
|
||
<div class="avatar-parent">
|
||
<img src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/letter-avatar/6664ce0fbbd767ff96038a778b3841d3.svg" style="width: 20px; height: 20px;"
|
||
class="avatar-20 rounded-pill a" alt="">
|
||
</div>
|
||
<span class="fs-14">Azure DevOps SRE</span>
|
||
</div>
|
||
<p class="excerpt-body mt-16 mb-24">
|
||
Customer Impact:
|
||
|
||
On 22 May 2018, Visual Studio Team Services (VSTS) experienced a major incident across multiple regions between 15:00 and 16:55 UTC. An event in a Western European scale unit of the Team Foundation Service (TFS), caused a chain reaction that sporadically took other TFS scale units offline in other regions. Based on our telemetry, we estimate a total of 20,800 users were impacted during the incident.
|
||
Impacted Users over time
|
||
|
||
Total request volume over time
|
||
|
||
|
||
|
||
What Happened:
|
||
|
||
First, some background on a few components in VSTS.
|
||
|
||
|
||
|
||
|
||
In the example:
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
So,... </p>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1 post-card"
|
||
data-post-id="16295">
|
||
|
||
<div class="masonry-thumbnail">
|
||
<img class="post-thumbnail wp-image-18098 lazyload" width="235" height="147" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOsAAACTAQMAAABVtXw6AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAG0lEQVRYhe3BAQ0AAADCoPdPbQ43oAAAAAC4MRHNAAE8Mp6xAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/devblog-debug_small-1.png" alt="" />
|
||
</div>
|
||
|
||
<div class="card-body">
|
||
<div class="card-top">
|
||
|
||
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
|
||
<div>
|
||
Feb 26, 2018 </div>
|
||
|
||
<div class="d-flex gap-12">
|
||
|
||
|
||
<div class="d-flex gap-4 clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4809 13.8424H15.4C16.2962 13.8424 17 13.1289 17 12.2766V5.56594C17 4.7136 16.2962 4.00012 15.4 4.00012H4.6C3.70383 4.00012 3 4.7136 3 5.56594V12.2766C3 13.1289 3.70383 13.8424 4.6 13.8424H6.19908L6.2 17.0001L6.20346 16.9999L6.20502 16.999L10.4809 13.8424ZM6.79895 17.8035C6.35668 18.1299 5.73 18.0407 5.39921 17.6043C5.26989 17.4336 5.2 17.2263 5.2 17.0134L5.19937 14.8424H4.6C3.16406 14.8424 2 13.6936 2 12.2766V5.56594C2 4.14888 3.16406 3.00012 4.6 3.00012H15.4C16.8359 3.00012 18 4.14888 18 5.56594V12.2766C18 13.6936 16.8359 14.8424 15.4 14.8424H10.81L6.79895 17.8035Z"
|
||
fill="#0F6CBD" />
|
||
</svg>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post comments count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
<div class="d-flex gap-4">
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z"
|
||
fill="#242424" />
|
||
</svg>
|
||
</div>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post likes count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<h3 class="fs-24 fw-600 mb-16">
|
||
<a href="https://devblogs.microsoft.com/devopsservice/updated-and-completed-postmortem-performance-issues-and-failures-in-vsts-west-europe-7-february-2018/"
|
||
class="single-click excerpt-title"
|
||
data-bi-id="blog_home_page_latest posts_grid_card"
|
||
data-bi-name="Updated and Completed Postmortem: Performance Issues and failures in VSTS West Europe – 7 February 2018">
|
||
Updated and Completed Postmortem: Performance Issues and failures in VSTS West Europe – 7 February 2018 </a>
|
||
</h3>
|
||
|
||
<div class="d-flex gap-6 align-items-center">
|
||
<div class="avatar-parent">
|
||
<img src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/letter-avatar/6664ce0fbbd767ff96038a778b3841d3.svg" style="width: 20px; height: 20px;"
|
||
class="avatar-20 rounded-pill a" alt="">
|
||
</div>
|
||
<span class="fs-14">Azure DevOps SRE</span>
|
||
</div>
|
||
<p class="excerpt-body mt-16 mb-24">
|
||
A week ago we posted an incomplete postmortem and are now following up with the completed version. If you want the full story of how we progressed through this incident, start by reading that. This postmortem will cover the full root cause analysis but it won’t rehash the first part of the investigation.
|
||
Customer Impact
|
||
On 7 February 2018 we had an incident which impacted users in our Western European scale unit. During this time, users experienced slow performance and 503 errors (service unavailable) when interacting with VSTS services. Close to 5,000 users were impacted at the peak of the incident. The incid... </p>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1 post-card"
|
||
data-post-id="15946">
|
||
|
||
<div class="masonry-thumbnail">
|
||
<img class="post-thumbnail wp-image-18098 lazyload" width="235" height="147" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOsAAACTAQMAAABVtXw6AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAG0lEQVRYhe3BAQ0AAADCoPdPbQ43oAAAAAC4MRHNAAE8Mp6xAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/devblog-debug_small-1.png" alt="" />
|
||
</div>
|
||
|
||
<div class="card-body">
|
||
<div class="card-top">
|
||
|
||
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
|
||
<div>
|
||
Feb 14, 2018 </div>
|
||
|
||
<div class="d-flex gap-12">
|
||
|
||
|
||
<div class="d-flex gap-4 clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4809 13.8424H15.4C16.2962 13.8424 17 13.1289 17 12.2766V5.56594C17 4.7136 16.2962 4.00012 15.4 4.00012H4.6C3.70383 4.00012 3 4.7136 3 5.56594V12.2766C3 13.1289 3.70383 13.8424 4.6 13.8424H6.19908L6.2 17.0001L6.20346 16.9999L6.20502 16.999L10.4809 13.8424ZM6.79895 17.8035C6.35668 18.1299 5.73 18.0407 5.39921 17.6043C5.26989 17.4336 5.2 17.2263 5.2 17.0134L5.19937 14.8424H4.6C3.16406 14.8424 2 13.6936 2 12.2766V5.56594C2 4.14888 3.16406 3.00012 4.6 3.00012H15.4C16.8359 3.00012 18 4.14888 18 5.56594V12.2766C18 13.6936 16.8359 14.8424 15.4 14.8424H10.81L6.79895 17.8035Z"
|
||
fill="#0F6CBD" />
|
||
</svg>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post comments count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
<div class="d-flex gap-4">
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z"
|
||
fill="#242424" />
|
||
</svg>
|
||
</div>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post likes count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<h3 class="fs-24 fw-600 mb-16">
|
||
<a href="https://devblogs.microsoft.com/devopsservice/postmortem-performance-issues-and-failures-in-vsts-west-europe-7-february-2018/"
|
||
class="single-click excerpt-title"
|
||
data-bi-id="blog_home_page_latest posts_grid_card"
|
||
data-bi-name="Preliminary Postmortem: Performance Issues and failures in VSTS West Europe – 7 February 2018">
|
||
Preliminary Postmortem: Performance Issues and failures in VSTS West Europe – 7 February 2018 </a>
|
||
</h3>
|
||
|
||
<div class="d-flex gap-6 align-items-center">
|
||
<div class="avatar-parent">
|
||
<img src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/letter-avatar/6664ce0fbbd767ff96038a778b3841d3.svg" style="width: 20px; height: 20px;"
|
||
class="avatar-20 rounded-pill a" alt="">
|
||
</div>
|
||
<span class="fs-14">Azure DevOps SRE</span>
|
||
</div>
|
||
<p class="excerpt-body mt-16 mb-24">
|
||
Edit February 26, 2018: We have just posted an updated and complete postmortem here: https://devblogs.microsoft.com/devopsservice/?p=16295
|
||
|
||
Customer Impact
|
||
On 7 February 2018 we had an incident which impacted users in our Western European scale unit. During this time, users experienced slow performance and 503 errors (service unavailable) when interacting with VSTS services. Close to 5,000 users were impacted at the peak of the incident. The incident lasted for two and a half hours on 7 February 2018 from 10:10 - 12:40 UTC.
|
||
|
||
|
||
What Happened
|
||
Our root cause analysis (RCA) has not gone well for this incident. ... </p>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1 post-card"
|
||
data-post-id="15765">
|
||
|
||
<div class="masonry-thumbnail">
|
||
<img class="post-thumbnail wp-image-18098 lazyload" width="235" height="147" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOsAAACTAQMAAABVtXw6AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAG0lEQVRYhe3BAQ0AAADCoPdPbQ43oAAAAAC4MRHNAAE8Mp6xAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/devblog-debug_small-1.png" alt="" />
|
||
</div>
|
||
|
||
<div class="card-body">
|
||
<div class="card-top">
|
||
|
||
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
|
||
<div>
|
||
Dec 27, 2017 </div>
|
||
|
||
<div class="d-flex gap-12">
|
||
|
||
|
||
<div class="d-flex gap-4 clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4809 13.8424H15.4C16.2962 13.8424 17 13.1289 17 12.2766V5.56594C17 4.7136 16.2962 4.00012 15.4 4.00012H4.6C3.70383 4.00012 3 4.7136 3 5.56594V12.2766C3 13.1289 3.70383 13.8424 4.6 13.8424H6.19908L6.2 17.0001L6.20346 16.9999L6.20502 16.999L10.4809 13.8424ZM6.79895 17.8035C6.35668 18.1299 5.73 18.0407 5.39921 17.6043C5.26989 17.4336 5.2 17.2263 5.2 17.0134L5.19937 14.8424H4.6C3.16406 14.8424 2 13.6936 2 12.2766V5.56594C2 4.14888 3.16406 3.00012 4.6 3.00012H15.4C16.8359 3.00012 18 4.14888 18 5.56594V12.2766C18 13.6936 16.8359 14.8424 15.4 14.8424H10.81L6.79895 17.8035Z"
|
||
fill="#0F6CBD" />
|
||
</svg>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post comments count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
<div class="d-flex gap-4">
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z"
|
||
fill="#242424" />
|
||
</svg>
|
||
</div>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post likes count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<h3 class="fs-24 fw-600 mb-16">
|
||
<a href="https://devblogs.microsoft.com/devopsservice/postmortem-intermittent-failures-for-visual-studio-team-services-on-14-dec-2017/"
|
||
class="single-click excerpt-title"
|
||
data-bi-id="blog_home_page_latest posts_grid_card"
|
||
data-bi-name="Postmortem – Intermittent Failures for Visual Studio Team Services on 14 Dec 2017">
|
||
Postmortem – Intermittent Failures for Visual Studio Team Services on 14 Dec 2017 </a>
|
||
</h3>
|
||
|
||
<div class="d-flex gap-6 align-items-center">
|
||
<div class="avatar-parent">
|
||
<img src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/letter-avatar/6664ce0fbbd767ff96038a778b3841d3.svg" style="width: 20px; height: 20px;"
|
||
class="avatar-20 rounded-pill a" alt="">
|
||
</div>
|
||
<span class="fs-14">Azure DevOps SRE</span>
|
||
</div>
|
||
<p class="excerpt-body mt-16 mb-24">
|
||
On 14 December 2017 we began to have a series of incidents with Visual Studio Team Services (VSTS) for several days that had a serious impact on the availability of our service for many customers (incident blogs #1 #2 #3). We apologize for the disruption these incidents had on you and your team. Below we describe the cause and the actions we are taking to address the issues which caused these incidents.
|
||
|
||
Customer Impact
|
||
|
||
The issues caused intermittent failures across multiple instances of the VSTS service within certain US and Brazilian data centers. During this time, we experienced failures within our applicati... </p>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="masonry-card box bg-white d-flex justify-content-between flex-column p-16 gap-20 rounded shadow position-relative border-1 post-card"
|
||
data-post-id="15725">
|
||
|
||
<div class="masonry-thumbnail">
|
||
<img class="post-thumbnail wp-image-18098 lazyload" width="235" height="147" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOsAAACTAQMAAABVtXw6AAAAA1BMVEXW1taWrGEgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAG0lEQVRYhe3BAQ0AAADCoPdPbQ43oAAAAAC4MRHNAAE8Mp6xAAAAAElFTkSuQmCC" data-src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/2019/02/devblog-debug_small-1.png" alt="" />
|
||
</div>
|
||
|
||
<div class="card-body">
|
||
<div class="card-top">
|
||
|
||
<div class="d-flex align-items-center justify-content-between gap-12 mt-16 mb-16">
|
||
<div>
|
||
Dec 19, 2017 </div>
|
||
|
||
<div class="d-flex gap-12">
|
||
|
||
|
||
<div class="d-flex gap-4 clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4809 13.8424H15.4C16.2962 13.8424 17 13.1289 17 12.2766V5.56594C17 4.7136 16.2962 4.00012 15.4 4.00012H4.6C3.70383 4.00012 3 4.7136 3 5.56594V12.2766C3 13.1289 3.70383 13.8424 4.6 13.8424H6.19908L6.2 17.0001L6.20346 16.9999L6.20502 16.999L10.4809 13.8424ZM6.79895 17.8035C6.35668 18.1299 5.73 18.0407 5.39921 17.6043C5.26989 17.4336 5.2 17.2263 5.2 17.0134L5.19937 14.8424H4.6C3.16406 14.8424 2 13.6936 2 12.2766V5.56594C2 4.14888 3.16406 3.00012 4.6 3.00012H15.4C16.8359 3.00012 18 4.14888 18 5.56594V12.2766C18 13.6936 16.8359 14.8424 15.4 14.8424H10.81L6.79895 17.8035Z"
|
||
fill="#0F6CBD" />
|
||
</svg>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post comments count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
<div class="d-flex gap-4">
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||
<path class="dark-theme"
|
||
d="M10.4965 17.3028L16.7408 10.9994C18.4252 9.28856 18.4199 6.52549 16.7239 4.81249C15.0611 3.13292 12.3961 3.0895 10.6978 4.69086C10.6612 4.72539 10.6251 4.76068 10.5894 4.79673L9.99299 5.40026L9.38843 4.78963C9.35529 4.75616 9.32175 4.72333 9.28783 4.69116C7.58595 3.07726 4.91654 3.10193 3.26122 4.7739C1.5729 6.4792 1.58114 9.25004 3.27679 10.9627L9.55368 17.3028C9.81404 17.5657 10.2362 17.5657 10.4965 17.3028ZM11.3 5.50029C12.5964 4.19135 14.7025 4.19204 16.0133 5.51604C17.3253 6.84123 17.3272 8.97734 16.0292 10.2968L16.0282 10.2978L10.0252 16.3577L3.98743 10.2592C2.67408 8.93263 2.67286 6.78953 3.97185 5.47746C5.26525 4.17106 7.36984 4.17208 8.6778 5.49319L9.63801 6.46306C9.8338 6.66082 10.1534 6.66067 10.349 6.46272L11.3 5.50029Z"
|
||
fill="#242424" />
|
||
</svg>
|
||
</div>
|
||
<div class="d-flex align-items-center clr-grey-61">
|
||
<span class="screen-reader-text">Post likes count</span>
|
||
0 </div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<h3 class="fs-24 fw-600 mb-16">
|
||
<a href="https://devblogs.microsoft.com/devopsservice/postmortem-availability-issues-with-visual-studio-team-services-on-6-dec-2017/"
|
||
class="single-click excerpt-title"
|
||
data-bi-id="blog_home_page_latest posts_grid_card"
|
||
data-bi-name="Postmortem – Availability issues with Visual Studio Team Services on 6 Dec 2017">
|
||
Postmortem – Availability issues with Visual Studio Team Services on 6 Dec 2017 </a>
|
||
</h3>
|
||
|
||
<div class="d-flex gap-6 align-items-center">
|
||
<div class="avatar-parent">
|
||
<img src="https://devblogs.microsoft.com/devopsservice/wp-content/uploads/sites/37/letter-avatar/6664ce0fbbd767ff96038a778b3841d3.svg" style="width: 20px; height: 20px;"
|
||
class="avatar-20 rounded-pill a" alt="">
|
||
</div>
|
||
<span class="fs-14">Azure DevOps SRE</span>
|
||
</div>
|
||
<p class="excerpt-body mt-16 mb-24">
|
||
On 6 December 2017 we had a global incident with Visual Studio Team Services (VSTS) that had a serious impact on the availability of our service (incident blog here). We apologize for the disruption. Below we describe the cause and the actions we are taking to address the issues.
|
||
|
||
Customer Impact
|
||
|
||
This was a global incident that caused performance issues and errors across multiple instances of VSTS, impacting many different scenarios. The incident occurred within Shared Platform Services (SPS), which contains identity, account, and commerce information for VSTS.
|
||
|
||
The incident started on 6 December at 8:45 UTC an... </p>
|
||
|
||
</div>
|
||
</div>
|
||
</div> </div>
|
||
</section>
|
||
<div class="fs-16 d-flex justify-content-center mt-40">
|
||
<a href="https://devblogs.microsoft.com/devopsservice/page/2/" class="read-more btn-secondary" id="pload-more" data-bi-area="latest_posts"
|
||
data-bi-id="blog_home_page_latest_posts_load_more" data-bi-name="Load more posts"
|
||
data-siteid="37">Load more posts</a>
|
||
</div>
|
||
|
||
<div id="loader-overlay" class="lp-loader" style="display:none;">
|
||
<div class="cv-spinner">
|
||
<span class="spinner"></span>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<aside class="p-12 bh-sidebar" data-bi-area="sidebar">
|
||
<!-- Sidebar CTA -->
|
||
<style>
|
||
.toggleWrapper:last-child {
|
||
border: none;
|
||
}
|
||
|
||
.toggleButton {
|
||
cursor: pointer;
|
||
border-radius: 4px;
|
||
}
|
||
</style>
|
||
|
||
<!-- trending topics -->
|
||
<div class="border-bottom mb-40">
|
||
<h2 class="fs-20 mb-16">Popular topics</h2>
|
||
<div class="d-flex flex-wrap gap-8 post-topics-list mb-40" data-bi-id="blog_home_page_sidebar_popular_topics">
|
||
|
||
<a class="d-flex align-items-center btn-outline-secondary fw-600 px-6" href="https://devblogs.microsoft.com/devopsservice/tag/postmortem/">postmortem</a> </div>
|
||
</div>
|
||
|
||
|
||
<!-- Links -->
|
||
<div class="mb-40 pb-24 border-bottom">
|
||
<!-- First section -->
|
||
<div class="border-bottom mb-16 toggleWrapper" data-bi-id="blog_home_page_sidebar_relevant_links"><button class="btn-no-styles w-100 d-flex justify-content-between px-8 mb-16 toggleButton" aria-expanded="false" aria-controls="leftContentOther"><h2 class="fs-20">Relevant Links</h2><div class="toggleIcon d-flex align-items-center"></div></button><div id="leftContentOther" class="toggleContent px-8 pb-12 mb-16 scroll-bar" style="display: none;"><span class="card-text listdisplay cs-content"><p><a href="http://devblogs.microsoft.com/devops" target="_blank" rel="noopener">Azure DevOps Blog</a></p>
|
||
<p><a href="https://azure.microsoft.com/en-us/services/devops/" target="_blank" rel="noopener">Azure DevOps Product Website</a></p>
|
||
<p><a href="https://visualstudio.com/" target="_blank" rel="noopener">Visual Studio Product Website</a></p>
|
||
<p><a href="https://visualstudio.microsoft.com/dev-essentials/" target="_blank" rel="noopener">Visual Studio Develop Center</a></p>
|
||
<p><a href="https://azure.microsoft.com/" target="_blank" rel="noopener">Microsoft Azure</a></p>
|
||
</span></div></div>
|
||
<!-- Second section -->
|
||
|
||
|
||
<!-- Third section -->
|
||
<div class="border-bottom mb-16 toggleWrapper" data-bi-id="blog_home_page_sidebar_archive"><button class="btn-no-styles w-100 d-flex justify-content-between px-8 mb-16 toggleButton" aria-expanded="false" aria-controls="rightContentArchive"><h2 class="fs-20">Archive</h2><div class="toggleIcon d-flex align-items-center"></div></button><div id="rightContentArchive" class="toggleContent px-8 pb-32 scroll-bar" style="display: none;"><span class="card-text listdisplay"><ul class="ftr-archives" role="list"><li><a href='https://devblogs.microsoft.com/devopsservice/2019/04/'>April 2019</a></li><li><a href='https://devblogs.microsoft.com/devopsservice/2018/11/'>November 2018</a></li><li><a href='https://devblogs.microsoft.com/devopsservice/2018/10/'>October 2018</a></li><li><a href='https://devblogs.microsoft.com/devopsservice/2018/09/'>September 2018</a></li><li><a href='https://devblogs.microsoft.com/devopsservice/2018/05/'>May 2018</a></li><li><a href='https://devblogs.microsoft.com/devopsservice/2018/02/'>February 2018</a></li><li><a href='https://devblogs.microsoft.com/devopsservice/2017/12/'>December 2017</a></li></ul></span></div></div>
|
||
<!-- Repeat the above structure for each toggle -->
|
||
</div>
|
||
|
||
<div class="mb-40">
|
||
<h2 class="fs-20 mb-16">Follow this blog</h2>
|
||
<div class="d-flex flex-wrap gap-20 mb-40" data-bi-hn="Follow this blog">
|
||
<a style="width: 24px; height: 24px; position: relative;" title="RSS Feed" data-bi-id="blog_home_page_sidebar_follow_this_blog" data-bi-name="Azure DevOps Service-rss-feed" aria-label="Subscribe to Our RSS Feed" target="_blank" href="https://devblogs.microsoft.com/devopsservice/feed/"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="dark-theme-rss">
|
||
<path class="dark-theme" d="M6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM6.75 7.5C6.34494 7.5 6 7.18276 6 6.7777V6.7233C6 6.33021 6.30507 6.00189 6.69816 6.00012L6.75 6C12.9632 6 18 11.0368 18 17.25L17.9999 17.3018C17.9981 17.6949 17.6698 18 17.2767 18H17.2223C16.8172 18 16.5 17.6551 16.5 17.25C16.5 11.8652 12.1348 7.5 6.75 7.5ZM13.294 18H13.2036C12.805 18 12.5 17.6486 12.5 17.25C12.5 14.0744 9.92564 11.5 6.75 11.5C6.35135 11.5 6 11.195 6 10.7964V10.706C6 10.3267 6.2871 10.0048 6.66639 10.0005C6.69422 10.0002 6.72209 10 6.75 10C10.7541 10 14 13.2459 14 17.25C14 17.2779 13.9998 17.3058 13.9995 17.3336C13.9952 17.7129 13.6733 18 13.294 18ZM7.5 18C6.67157 18 6 17.3284 6 16.5C6 15.6716 6.67157 15 7.5 15C8.32843 15 9 15.6716 9 16.5C9 17.3284 8.32843 18 7.5 18Z" fill="#DA3B01"/>
|
||
</svg></a> </div>
|
||
</div> </aside>
|
||
<script>
|
||
let lastUrl = window.location.pathname;
|
||
let isInitialPageSetup = false;
|
||
document.addEventListener('DOMContentLoaded', function () {
|
||
|
||
let currentPage = 1; // Initialize current page number
|
||
|
||
// Reference the "Load More" button
|
||
const loadMoreButton = document.getElementById('pload-more');
|
||
const loaderOverlay = document.getElementById('loader-overlay');
|
||
const masonryContainer = document.querySelector('.masonry-container');
|
||
|
||
// Hide Load More when this direct page is the final partial page.
|
||
const initialPosts = masonryContainer.querySelectorAll('.masonry-card'); // Adjust selector if needed
|
||
const postsPerPageInitial = 9;
|
||
|
||
if (initialPosts.length < postsPerPageInitial) {
|
||
loadMoreButton.style.display = 'none'; // Hide "Load More" button when no more pages exist
|
||
}
|
||
|
||
const site_url = devblogs_site_url.site_url;
|
||
|
||
function pageUrl(page) {
|
||
return page === 1 ? site_url + '/' : site_url + '/page/' + page + '/';
|
||
}
|
||
|
||
async function prependPage(page) {
|
||
const data = new FormData();
|
||
data.append('action', 'evo_pagination_load_more');
|
||
data.append('site_id', loadMoreButton.getAttribute('data-siteid'));
|
||
data.append('paged', page);
|
||
|
||
const response = await fetch(devblogs_ajax_evo.ajaxurl, {
|
||
method: 'POST',
|
||
body: data
|
||
});
|
||
const result = await response.json();
|
||
if (!result.html) {
|
||
return;
|
||
}
|
||
|
||
const tempDiv = document.createElement('div');
|
||
tempDiv.innerHTML = result.html;
|
||
const newItems = Array.from(tempDiv.children);
|
||
if (!newItems.length) {
|
||
return;
|
||
}
|
||
|
||
newItems.reverse().forEach((item, index) => {
|
||
if (index === newItems.length - 1) {
|
||
item.setAttribute('data-page', page);
|
||
item.setAttribute('data-url', pageUrl(page));
|
||
item.classList.add('alm-seo');
|
||
}
|
||
masonryContainer.insertBefore(item, masonryContainer.firstChild);
|
||
});
|
||
}
|
||
|
||
// A direct /page/N/ visit renders page N immediately. Preload earlier pages
|
||
// above it, then explicitly position the requested page at the viewport top.
|
||
// This avoids preserving an initial browser-restored position near the footer.
|
||
(async function loadPreviousPages() {
|
||
if (currentPage <= 1) {
|
||
return;
|
||
}
|
||
|
||
isInitialPageSetup = true;
|
||
if ('scrollRestoration' in history) {
|
||
history.scrollRestoration = 'manual';
|
||
}
|
||
|
||
for (let page = currentPage - 1; page >= 1; page--) {
|
||
await prependPage(page);
|
||
}
|
||
|
||
requestAnimationFrame(() => {
|
||
requestAnimationFrame(() => {
|
||
const requestedPageStart = masonryContainer.querySelector('[data-page="' + currentPage + '"]');
|
||
if (requestedPageStart) {
|
||
requestedPageStart.scrollIntoView({ block: 'start' });
|
||
}
|
||
isInitialPageSetup = false;
|
||
});
|
||
});
|
||
})().catch(error => {
|
||
isInitialPageSetup = false;
|
||
console.error('Error loading previous posts:', error);
|
||
});
|
||
|
||
// Add a click event listener for the "Load More" button
|
||
loadMoreButton.addEventListener('click', function (e) {
|
||
e.preventDefault(); // prevent full page load
|
||
currentPage++; // Increment page number
|
||
const currentBlogId = loadMoreButton.getAttribute('data-siteid');
|
||
loadMoreButton.style.display = 'none'; // Hide "Load More Posts" text
|
||
|
||
// Prepare data to send in the POST request
|
||
const data = new FormData();
|
||
data.append('action', 'evo_pagination_load_more');
|
||
data.append('site_id', currentBlogId);
|
||
data.append('paged', currentPage);
|
||
|
||
// Show the preloader
|
||
loaderOverlay.style.display = 'block';
|
||
|
||
// Perform the AJAX request using fetch API
|
||
fetch(devblogs_ajax_evo.ajaxurl, {
|
||
method: 'POST',
|
||
body: data
|
||
})
|
||
.then(response => response.json())
|
||
.then(res => {
|
||
// Append new items to the masonry container
|
||
const tempDiv = document.createElement('div');
|
||
tempDiv.innerHTML = res.html;
|
||
const newItems = tempDiv.children;
|
||
|
||
Array.from(newItems).forEach((item, index) => {
|
||
item.classList.add('hidden'); // Add the 'hidden' class initially
|
||
|
||
if (index === 0) {
|
||
item.setAttribute('data-page', currentPage); // You can change 'data-page' to any attribute you want
|
||
item.setAttribute('data-url', pageUrl(currentPage));
|
||
item.classList.add('alm-seo'); // Additional class for first item
|
||
}
|
||
|
||
masonryContainer.appendChild(item);
|
||
|
||
// Use CSS transition after appending the item
|
||
setTimeout(() => {
|
||
item.classList.remove('hidden'); // Trigger the CSS transition
|
||
}, 100);
|
||
});
|
||
|
||
// Show the masonry container after the items are added
|
||
masonryContainer.style.opacity = 1;
|
||
|
||
// **Re-initialize Gifffer after new items are added**
|
||
setTimeout(() => {
|
||
if (typeof Gifffer === 'function') {
|
||
Gifffer(); // Reinitialize Gifffer for new images
|
||
}
|
||
}, 300); // Delay to ensure new elements are in the DOM
|
||
|
||
// Show the "Load More Posts" button again only if there are more pages
|
||
if (currentPage < res.max) {
|
||
loadMoreButton.style.display = 'block'; // Show "Load More Posts" text
|
||
loadMoreButton.setAttribute('href', site_url + '/page/' + (currentPage + 1)+'/'); // Update href for next page
|
||
}
|
||
|
||
// Hide the preloader after 500ms
|
||
setTimeout(() => {
|
||
loaderOverlay.style.display = 'none';
|
||
}, 500);
|
||
var page_num = '';
|
||
var page_url = site_url+'/page/'+ currentPage+'/';
|
||
|
||
window.history.pushState("URL", "Title", page_url); // Add page
|
||
})
|
||
.catch(error => {
|
||
console.error('Error:', error);
|
||
// Show the "Load More Posts" button if an error occurs
|
||
loadMoreButton.style.display = 'block';
|
||
// Hide the preloader
|
||
loaderOverlay.style.display = 'none';
|
||
});
|
||
});
|
||
|
||
// A browser back/forward action must rebuild the post stream for its URL,
|
||
// rather than retaining cards that were appended for a later page.
|
||
window.addEventListener('popstate', function () {
|
||
window.location.reload();
|
||
});
|
||
});
|
||
|
||
document.addEventListener("scroll", () => {
|
||
if (isInitialPageSetup) {
|
||
return;
|
||
}
|
||
|
||
const items = document.querySelectorAll("[data-url]"); // Select elements with data-url
|
||
|
||
items.forEach(item => {
|
||
const rect = item.getBoundingClientRect();
|
||
if (rect.top >= 0 && rect.top <= window.innerHeight / 2) {
|
||
const newUrl = item.getAttribute("data-url");
|
||
if (newUrl && window.location.pathname !== newUrl) {
|
||
history.replaceState(null, "", newUrl); // Update the URL without reloading
|
||
}
|
||
}
|
||
});
|
||
});
|
||
|
||
document.addEventListener('DOMContentLoaded', function () {
|
||
const cards = document.querySelectorAll('.masonry-container > .masonry-card');
|
||
|
||
// The first card represents the server-rendered page, rather than always
|
||
// representing page 1. This prevents direct /page/N/ visits changing to /.
|
||
const firstCard = cards[0];
|
||
if (!firstCard) {
|
||
return;
|
||
}
|
||
const renderedPage = 1;
|
||
const renderedPageUrl = renderedPage === 1
|
||
? "https://devblogs.microsoft.com/devopsservice/"
|
||
: "https://devblogs.microsoft.com/devopsservice/page/" + renderedPage + "/";
|
||
firstCard.setAttribute('data-page', renderedPage);
|
||
firstCard.setAttribute('data-url', renderedPageUrl);
|
||
firstCard.classList.add('alm-seo');
|
||
});
|
||
|
||
|
||
</script>
|
||
</div><!-- .container-sidebar-home -->
|
||
</div>
|
||
</div><!-- end .wrapper -->
|
||
</main><!-- end #main -->
|
||
|
||
<!-- Add a hidden dark theme button to trigger the toggle function -->
|
||
<div style="display:none;">
|
||
<div class="login-section c-me d-flex align-items-center">
|
||
<a class="login-but d-flex align-items-center" data-bi-area="dev blogs header" data-bi-name="Sign in" href="https://devblogs.microsoft.com/devopsservice/wp-login.php?redirect_to=https%3A%2F%2Fdevblogs.microsoft.com%2Fdevopsservice%2F">Sign in</a>
|
||
</div>
|
||
</div><div id="theme-picker" data-bi-area="dev blogs header" data-bi-id="theme-picker" data-bi-name="Switch to dark theme" class="c-me theme-picker d-flex align-items-center" style="margin-right: 14px;">
|
||
<button id="theme-picker-button" style="height: 25px;" class="d-flex btn border-r-12"
|
||
aria-pressed="false" aria-label="Dark theme switch">
|
||
<span class="theme-text d-flex align-items-center"
|
||
style="overflow-x: visible; padding: 0px 8px; gap: 6px; font-family: 'Segoe UI', sans-serif; font-size: 13px;"></svg>Theme</span>
|
||
</button>
|
||
</div><script type="speculationrules">
|
||
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/devopsservice/*"},{"not":{"href_matches":["/devopsservice/wp-*.php","/devopsservice/wp-admin/*","/devopsservice/wp-content/uploads/sites/37/*","/devopsservice/wp-content/*","/devopsservice/wp-content/plugins/*","/devopsservice/wp-content/themes/devblogs-evo/*","/devopsservice/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
|
||
</script>
|
||
<script>
|
||
// Get iframe youtube video length
|
||
var iframes = jQuery('iframe[src^="https://www.youtube.com/embed/"], iframe[src^="//www.youtube.com/embed/"], iframe[src^="http://www.youtube.com/embed/"], iframe[src^="www.youtube.com/embed/"], iframe[src^="youtube.com/embed/"], iframe[src^="https://www.youtube.com/"]');
|
||
var i, len;
|
||
len = iframes.length;
|
||
|
||
// Country JSON data
|
||
function funJSONData(countryData) {
|
||
if (countryData.Country == 'CN') {
|
||
if (len > 0) {
|
||
for (var i = 0; i < len; ++i) {
|
||
var el = iframes[i];
|
||
el.parentNode.removeChild(el);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
jQuery(document).ready(function () {
|
||
// Remove youtube videos from page
|
||
});
|
||
</script>
|
||
<script id="commentsvote-js-extra">
|
||
var votecommentajax = {"ajaxurl":"https://devblogs.microsoft.com/devopsservice/wp-admin/admin-ajax.php"};
|
||
//# sourceURL=commentsvote-js-extra
|
||
</script>
|
||
<script id="commentsvote-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/plugins/devblogs-comments-evo/admin/js/commentsvote.js?ver=1.1"></script>
|
||
<script id="mpp_gutenberg_tabs-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/plugins/metronet-profile-picture/js/mpp-frontend.js?ver=2.6.4"></script>
|
||
<script id="devblogs-lightbox-js-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/plugins/devblogs-lightbox/assets/js/lightbox.min.js?ver=1770924660"></script>
|
||
<script id="newsletter-country-sync-js-js-extra">
|
||
var NCSData = {"blogName":"Azure DevOps Service"};
|
||
//# sourceURL=newsletter-country-sync-js-js-extra
|
||
</script>
|
||
<script id="newsletter-country-sync-js-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/plugins/newsletter-country-sync/js/newsletter-country-scripts.min.js?ver=1770158083"></script>
|
||
<script id="anchorific-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/plugins/shortcode-toc/assets/vendor/js/anchorific.js?ver=1.0.3"></script>
|
||
<script id="code-prettify-js-before">
|
||
var codePrettifyLoaderBaseUrl = "https:\/\/devblogs.microsoft.com\/devopsservice\/wp-content\/plugins\/code-prettify\/prettify";
|
||
//# sourceURL=code-prettify-js-before
|
||
</script>
|
||
<script id="code-prettify-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/plugins/code-prettify/prettify/run_prettify.js?ver=1.4.0"></script>
|
||
<script id="devblogs-evo-scripts-js-extra">
|
||
var devblogs_ajax2 = {"ajaxurl":"https://devblogs.microsoft.com/devopsservice/wp-admin/admin-ajax.php"};
|
||
var devblogs_ajax_evo = {"ajaxurl":"https://devblogs.microsoft.com/wp-admin/admin-ajax.php"};
|
||
var devblogs_site_url = {"site_url":"https://devblogs.microsoft.com/devopsservice"};
|
||
//# sourceURL=devblogs-evo-scripts-js-extra
|
||
</script>
|
||
<script id="devblogs-evo-scripts-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/themes/devblogs-evo/js/theme.min.js?ver=1.4.0.1763057732"></script>
|
||
<script id="custom-theme-js-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/themes/devblogs-evo/js/custom-theme.min.js?ver=1776792580"></script>
|
||
<script id="theme-picker-script-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/themes/devblogs-evo/js/theme-picker.min.js?ver=1784834880"></script>
|
||
<script id="dropdown-menu-script-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/themes/devblogs-evo/js/dropdown-menu.min.js?ver=1776961454"></script>
|
||
<script id="back-to-top-script-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/themes/devblogs-evo/js/back-to-top.min.js?ver=1737047887"></script>
|
||
<script id="accordion-toggle-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/themes/devblogs-evo/js/accordion-toggle.min.js?ver=1784230473"></script>
|
||
<script id="gifffer-js-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/themes/devblogs-evo/js/gifffer.min.js?ver=1.1"></script>
|
||
<script id="custom-jquery-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/themes/devblogs-evo/js/jquery-alias.js"></script>
|
||
<script id="newsletter-js-extra">
|
||
var newsletter_data = {"action_url":"https://devblogs.microsoft.com/devopsservice/wp-admin/admin-ajax.php"};
|
||
//# sourceURL=newsletter-js-extra
|
||
</script>
|
||
<script id="newsletter-js" src="https://devblogs.microsoft.com/devopsservice/wp-content/plugins/newsletter/main.js?ver=9.3.5"></script>
|
||
<script id="wp-emoji-settings" type="application/json">
|
||
{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://devblogs.microsoft.com/devopsservice/wp-includes/js/wp-emoji-release.min.js"}}
|
||
</script>
|
||
<script type="module">
|
||
/*! This file is auto-generated */
|
||
var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
|
||
//# sourceURL=https://devblogs.microsoft.com/devopsservice/wp-includes/js/wp-emoji-loader.min.js
|
||
</script>
|
||
<script type="text/javascript">(function (undefined) {let scriptOptions={"_localizedStrings":{"redirect_overlay_title":"Hold On","redirect_overlay_text":"You are being redirected to another page,<br>it may take a few seconds.","webview_notification_text":"The selected provider doesn't support embedded browsers!"},"_targetWindow":"prefer-popup","_redirectOverlay":"overlay-with-spinner-and-message","_unsupportedWebviewBehavior":""};
|
||
/**
|
||
* Used when Cross-Origin-Opener-Policy blocked the access to the opener. We can't have a reference of the opened windows, so we should attempt to refresh only the windows that has opened popups.
|
||
*/
|
||
window._nslHasOpenedPopup = false;
|
||
window._nslWebViewNoticeElement = null;
|
||
|
||
window.NSLPopup = function (url, title, w, h) {
|
||
|
||
/**
|
||
* Cross-Origin-Opener-Policy blocked the access to the opener
|
||
*/
|
||
if (typeof BroadcastChannel === "function") {
|
||
const _nslLoginBroadCastChannel = new BroadcastChannel('nsl_login_broadcast_channel');
|
||
_nslLoginBroadCastChannel.onmessage = (event) => {
|
||
if (window?._nslHasOpenedPopup && event.data?.action === 'redirect') {
|
||
window._nslHasOpenedPopup = false;
|
||
|
||
const url = event.data?.href;
|
||
_nslLoginBroadCastChannel.close();
|
||
if (typeof window.nslRedirect === 'function') {
|
||
window.nslRedirect(url);
|
||
} else {
|
||
window.opener.location = url;
|
||
}
|
||
}
|
||
};
|
||
}
|
||
|
||
const userAgent = navigator.userAgent,
|
||
mobile = function () {
|
||
return /\b(iPhone|iP[ao]d)/.test(userAgent) ||
|
||
/\b(iP[ao]d)/.test(userAgent) ||
|
||
/Android/i.test(userAgent) ||
|
||
/Mobile/i.test(userAgent);
|
||
},
|
||
screenX = window.screenX !== undefined ? window.screenX : window.screenLeft,
|
||
screenY = window.screenY !== undefined ? window.screenY : window.screenTop,
|
||
outerWidth = window.outerWidth !== undefined ? window.outerWidth : document.documentElement.clientWidth,
|
||
outerHeight = window.outerHeight !== undefined ? window.outerHeight : document.documentElement.clientHeight - 22,
|
||
targetWidth = mobile() ? null : w,
|
||
targetHeight = mobile() ? null : h,
|
||
left = parseInt(screenX + (outerWidth - targetWidth) / 2, 10),
|
||
right = parseInt(screenY + (outerHeight - targetHeight) / 2.5, 10),
|
||
features = [];
|
||
if (targetWidth !== null) {
|
||
features.push('width=' + targetWidth);
|
||
}
|
||
if (targetHeight !== null) {
|
||
features.push('height=' + targetHeight);
|
||
}
|
||
features.push('left=' + left);
|
||
features.push('top=' + right);
|
||
features.push('scrollbars=1');
|
||
|
||
const newWindow = window.open(url, title, features.join(','));
|
||
|
||
if (window.focus) {
|
||
newWindow.focus();
|
||
}
|
||
|
||
window._nslHasOpenedPopup = true;
|
||
|
||
return newWindow;
|
||
};
|
||
|
||
let isWebView = null;
|
||
|
||
function checkWebView() {
|
||
if (isWebView === null) {
|
||
function _detectOS(ua) {
|
||
if (/Android/.test(ua)) {
|
||
return "Android";
|
||
} else if (/iPhone|iPad|iPod/.test(ua)) {
|
||
return "iOS";
|
||
} else if (/Windows/.test(ua)) {
|
||
return "Windows";
|
||
} else if (/Mac OS X/.test(ua)) {
|
||
return "Mac";
|
||
} else if (/CrOS/.test(ua)) {
|
||
return "Chrome OS";
|
||
} else if (/Firefox/.test(ua)) {
|
||
return "Firefox OS";
|
||
}
|
||
return "";
|
||
}
|
||
|
||
function _detectBrowser(ua) {
|
||
let android = /Android/.test(ua);
|
||
|
||
if (/Opera Mini/.test(ua) || / OPR/.test(ua) || / OPT/.test(ua)) {
|
||
return "Opera";
|
||
} else if (/CriOS/.test(ua)) {
|
||
return "Chrome for iOS";
|
||
} else if (/Edge/.test(ua)) {
|
||
return "Edge";
|
||
} else if (android && /Silk\//.test(ua)) {
|
||
return "Silk";
|
||
} else if (/Chrome/.test(ua)) {
|
||
return "Chrome";
|
||
} else if (/Firefox/.test(ua)) {
|
||
return "Firefox";
|
||
} else if (android) {
|
||
return "AOSP";
|
||
} else if (/MSIE|Trident/.test(ua)) {
|
||
return "IE";
|
||
} else if (/Safari\//.test(ua)) {
|
||
return "Safari";
|
||
} else if (/AppleWebKit/.test(ua)) {
|
||
return "WebKit";
|
||
}
|
||
return "";
|
||
}
|
||
|
||
function _detectBrowserVersion(ua, browser) {
|
||
if (browser === "Opera") {
|
||
return /Opera Mini/.test(ua) ? _getVersion(ua, "Opera Mini/") :
|
||
/ OPR/.test(ua) ? _getVersion(ua, " OPR/") :
|
||
_getVersion(ua, " OPT/");
|
||
} else if (browser === "Chrome for iOS") {
|
||
return _getVersion(ua, "CriOS/");
|
||
} else if (browser === "Edge") {
|
||
return _getVersion(ua, "Edge/");
|
||
} else if (browser === "Chrome") {
|
||
return _getVersion(ua, "Chrome/");
|
||
} else if (browser === "Firefox") {
|
||
return _getVersion(ua, "Firefox/");
|
||
} else if (browser === "Silk") {
|
||
return _getVersion(ua, "Silk/");
|
||
} else if (browser === "AOSP") {
|
||
return _getVersion(ua, "Version/");
|
||
} else if (browser === "IE") {
|
||
return /IEMobile/.test(ua) ? _getVersion(ua, "IEMobile/") :
|
||
/MSIE/.test(ua) ? _getVersion(ua, "MSIE ")
|
||
:
|
||
_getVersion(ua, "rv:");
|
||
} else if (browser === "Safari") {
|
||
return _getVersion(ua, "Version/");
|
||
} else if (browser === "WebKit") {
|
||
return _getVersion(ua, "WebKit/");
|
||
}
|
||
return "0.0.0";
|
||
}
|
||
|
||
function _getVersion(ua, token) {
|
||
try {
|
||
return _normalizeSemverString(ua.split(token)[1].trim().split(/[^\w\.]/)[0]);
|
||
} catch (o_O) {
|
||
}
|
||
return "0.0.0";
|
||
}
|
||
|
||
function _normalizeSemverString(version) {
|
||
const ary = version.split(/[\._]/);
|
||
return (parseInt(ary[0], 10) || 0) + "." +
|
||
(parseInt(ary[1], 10) || 0) + "." +
|
||
(parseInt(ary[2], 10) || 0);
|
||
}
|
||
|
||
function _isWebView(ua, os, browser, version, options) {
|
||
switch (os + browser) {
|
||
case "iOSSafari":
|
||
return false;
|
||
case "iOSWebKit":
|
||
return _isWebView_iOS(options);
|
||
case "AndroidAOSP":
|
||
return false;
|
||
case "AndroidChrome":
|
||
return parseFloat(version) >= 42 ? /; wv/.test(ua) : /\d{2}\.0\.0/.test(version) ? true : _isWebView_Android(options);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
function _isWebView_iOS(options) {
|
||
const document = (window["document"] || {});
|
||
|
||
if ("WEB_VIEW" in options) {
|
||
return options["WEB_VIEW"];
|
||
}
|
||
return !("fullscreenEnabled" in document || "webkitFullscreenEnabled" in document || false);
|
||
}
|
||
|
||
function _isWebView_Android(options) {
|
||
if ("WEB_VIEW" in options) {
|
||
return options["WEB_VIEW"];
|
||
}
|
||
return !("requestFileSystem" in window || "webkitRequestFileSystem" in window || false);
|
||
}
|
||
|
||
const options = {},
|
||
nav = window.navigator || {},
|
||
ua = nav.userAgent || "",
|
||
os = _detectOS(ua),
|
||
browser = _detectBrowser(ua),
|
||
browserVersion = _detectBrowserVersion(ua, browser);
|
||
|
||
isWebView = _isWebView(ua, os, browser, browserVersion, options);
|
||
}
|
||
|
||
return isWebView;
|
||
}
|
||
|
||
function isAllowedWebViewForUserAgent(provider) {
|
||
const facebookAllowedWebViews = [
|
||
'Instagram',
|
||
'FBAV',
|
||
'FBAN'
|
||
];
|
||
let whitelist = [];
|
||
|
||
if (provider && provider === 'facebook') {
|
||
whitelist = facebookAllowedWebViews;
|
||
}
|
||
|
||
const nav = window.navigator || {},
|
||
ua = nav.userAgent || "";
|
||
|
||
if (whitelist.length && ua.match(new RegExp(whitelist.join('|')))) {
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
function disableButtonInWebView(providerButtonElement) {
|
||
if (providerButtonElement) {
|
||
providerButtonElement.classList.add('nsl-disabled-provider');
|
||
providerButtonElement.setAttribute('href', '#');
|
||
|
||
providerButtonElement.addEventListener('pointerdown', (e) => {
|
||
const closeNotice = function () {
|
||
if (window._nslWebViewNoticeElement) {
|
||
window._nslWebViewNoticeElement.remove();
|
||
window._nslWebViewNoticeElement = null;
|
||
}
|
||
};
|
||
|
||
closeNotice();
|
||
|
||
window._nslWebViewNoticeElement = document.createElement('div');
|
||
window._nslWebViewNoticeElement.id = "nsl-notices-fallback";
|
||
window._nslWebViewNoticeElement.role = 'alert';
|
||
window._nslWebViewNoticeElement.ariaLive = 'assertive';
|
||
window._nslWebViewNoticeElement.ariaAtomic = 'true';
|
||
|
||
window._nslWebViewNoticeElement.addEventListener('pointerdown', closeNotice);
|
||
|
||
window._nslWebViewNoticeElement.addEventListener('keydown', function (e) {
|
||
if (e.key === 'Enter') {
|
||
e.preventDefault();
|
||
closeNotice();
|
||
}
|
||
});
|
||
const webviewNoticeHTML = '<div class="error"><p>' + scriptOptions._localizedStrings.webview_notification_text + '</p></div>';
|
||
|
||
window._nslWebViewNoticeElement.insertAdjacentHTML("afterbegin", webviewNoticeHTML);
|
||
document.body.appendChild(window._nslWebViewNoticeElement);
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
window._nslDOMReady(function () {
|
||
|
||
window.nslRedirect = function (url) {
|
||
if (scriptOptions._redirectOverlay) {
|
||
const overlay = document.createElement('div');
|
||
overlay.id = "nsl-redirect-overlay";
|
||
let overlayHTML = '';
|
||
const overlayContainer = "<div id='nsl-redirect-overlay-container'>",
|
||
overlayContainerClose = "</div>",
|
||
overlaySpinner = "<div id='nsl-redirect-overlay-spinner'></div>",
|
||
overlayTitle = "<p id='nsl-redirect-overlay-title'>" + scriptOptions._localizedStrings.redirect_overlay_title + "</p>",
|
||
overlayText = "<p id='nsl-redirect-overlay-text'>" + scriptOptions._localizedStrings.redirect_overlay_text + "</p>";
|
||
|
||
switch (scriptOptions._redirectOverlay) {
|
||
case "overlay-only":
|
||
break;
|
||
case "overlay-with-spinner":
|
||
overlayHTML = overlayContainer + overlaySpinner + overlayContainerClose;
|
||
break;
|
||
default:
|
||
overlayHTML = overlayContainer + overlaySpinner + overlayTitle + overlayText + overlayContainerClose;
|
||
break;
|
||
}
|
||
|
||
overlay.insertAdjacentHTML("afterbegin", overlayHTML);
|
||
document.body.appendChild(overlay);
|
||
}
|
||
|
||
window.location = url;
|
||
};
|
||
|
||
let targetWindow = scriptOptions._targetWindow || 'prefer-popup',
|
||
lastPopup = false;
|
||
|
||
|
||
document.addEventListener('click', function (e) {
|
||
if (e.target) {
|
||
const buttonLinkElement = e.target.closest('a[data-plugin="nsl"][data-action="connect"]') || e.target.closest('a[data-plugin="nsl"][data-action="link"]');
|
||
if (buttonLinkElement) {
|
||
if (lastPopup && !lastPopup.closed) {
|
||
e.preventDefault();
|
||
lastPopup.focus();
|
||
} else {
|
||
|
||
let href = buttonLinkElement.href,
|
||
success = false;
|
||
if (href.indexOf('?') !== -1) {
|
||
href += '&';
|
||
} else {
|
||
href += '?';
|
||
}
|
||
|
||
const redirectTo = buttonLinkElement.dataset.redirect;
|
||
if (redirectTo === 'current') {
|
||
href += 'redirect=' + encodeURIComponent(window.location.href) + '&';
|
||
} else if (redirectTo && redirectTo !== '') {
|
||
href += 'redirect=' + encodeURIComponent(redirectTo) + '&';
|
||
}
|
||
|
||
if (targetWindow !== 'prefer-same-window' && checkWebView()) {
|
||
targetWindow = 'prefer-same-window';
|
||
}
|
||
|
||
if (targetWindow === 'prefer-popup') {
|
||
lastPopup = NSLPopup(href + 'display=popup', 'nsl-social-connect', buttonLinkElement.dataset.popupwidth, buttonLinkElement.dataset.popupheight);
|
||
if (lastPopup) {
|
||
success = true;
|
||
e.preventDefault();
|
||
}
|
||
} else if (targetWindow === 'prefer-new-tab') {
|
||
const newTab = window.open(href + 'display=popup', '_blank');
|
||
if (newTab) {
|
||
if (window.focus) {
|
||
newTab.focus();
|
||
}
|
||
success = true;
|
||
window._nslHasOpenedPopup = true;
|
||
e.preventDefault();
|
||
}
|
||
}
|
||
|
||
if (!success) {
|
||
window.location = href;
|
||
e.preventDefault();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
let buttonCountChanged = false;
|
||
|
||
const googleLoginButtons = document.querySelectorAll(' a[data-plugin="nsl"][data-provider="google"]');
|
||
if (googleLoginButtons.length && checkWebView()) {
|
||
googleLoginButtons.forEach(function (googleLoginButton) {
|
||
if (scriptOptions._unsupportedWebviewBehavior === 'disable-button') {
|
||
disableButtonInWebView(googleLoginButton);
|
||
} else {
|
||
googleLoginButton.remove();
|
||
buttonCountChanged = true;
|
||
}
|
||
});
|
||
}
|
||
|
||
const facebookLoginButtons = document.querySelectorAll(' a[data-plugin="nsl"][data-provider="facebook"]');
|
||
if (facebookLoginButtons.length && checkWebView() && /Android/.test(window.navigator.userAgent) && !isAllowedWebViewForUserAgent('facebook')) {
|
||
facebookLoginButtons.forEach(function (facebookLoginButton) {
|
||
if (scriptOptions._unsupportedWebviewBehavior === 'disable-button') {
|
||
disableButtonInWebView(facebookLoginButton);
|
||
} else {
|
||
facebookLoginButton.remove();
|
||
buttonCountChanged = true;
|
||
}
|
||
});
|
||
}
|
||
|
||
const separators = document.querySelectorAll('div.nsl-separator');
|
||
if (buttonCountChanged && separators.length) {
|
||
separators.forEach(function (separator) {
|
||
const separatorParentNode = separator.parentNode;
|
||
if (separatorParentNode) {
|
||
const separatorButtonContainer = separatorParentNode.querySelector('div.nsl-container-buttons');
|
||
if (separatorButtonContainer && !separatorButtonContainer.hasChildNodes()) {
|
||
separator.remove();
|
||
}
|
||
}
|
||
})
|
||
}
|
||
});})();</script> <!-- Model form for code insert -->
|
||
<div class="modal fade" id="codeModal" tabindex="-1" role="dialog" aria-labelledby="codeModalLabel" aria-hidden="true">
|
||
<div class="modal-dialog modal-dialog-centered" role="document">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<h5 class="modal-title" id="codeModalLabel">Code Block</h5>
|
||
<button type="button" class="close" onclick="myCodeCancelFunction()" data-dismiss="modal" aria-label="Close">
|
||
<span aria-hidden="true">×</span>
|
||
</button>
|
||
</div>
|
||
<form id="myForm" action="#">
|
||
<div class="modal-body">
|
||
<div class="form-group">
|
||
<label for="code-text">Paste your code snippet</label>
|
||
<textarea class="form-control" id="code-text" style="height: 150px;"></textarea>
|
||
</div>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button type="button" onclick="myCodeFunction()" class="btn btn-primary">Ok</button>
|
||
<button type="button" name="Cancel" onclick="myCodeCancelFunction()" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script type="text/javascript">
|
||
document.addEventListener("DOMContentLoaded", function () {
|
||
const skip = document.getElementById("uhfSkipToMain");
|
||
const mainContent = document.getElementById("main");
|
||
const announcer = document.getElementById("sr-announcer");
|
||
|
||
if (!skip || !mainContent) return;
|
||
|
||
skip.setAttribute("href", "#main");
|
||
|
||
skip.addEventListener("click", function (e) {
|
||
e.preventDefault();
|
||
mainContent.setAttribute("tabindex", "-1");
|
||
mainContent.focus();
|
||
mainContent.scrollIntoView({ behavior: "smooth" });
|
||
|
||
if (announcer) {
|
||
announcer.textContent = "Main content starts here";
|
||
}
|
||
});
|
||
});
|
||
</script>
|
||
|
||
|
||
<!-- UHF footer -->
|
||
<uhf-footer locale="en-us" partnerId="DEV_Blogs" footerId="DEV_BlogsFooter" theme="light">
|
||
<script id="uhf-footer-ccpa">
|
||
(function () {
|
||
function checkThirdPartyAdsOptOutCookie() {
|
||
try {
|
||
var match = document.cookie.match('(^|;)\\s*3PAdsOptOut\\s*=\\s*([^;]+)');
|
||
return (match ? match[2] : '') !== '1';
|
||
} catch (e) {
|
||
return true;
|
||
}
|
||
}
|
||
var globalPrivacyControlEnabled = navigator.globalPrivacyControl;
|
||
window.GPC_DataSharingOptIn = globalPrivacyControlEnabled ? false : checkThirdPartyAdsOptOutCookie();
|
||
if (typeof window.onGPCLoaded === 'function') {
|
||
window.onGPCLoaded();
|
||
}
|
||
})();
|
||
</script>
|
||
|
||
<uhf-footer-nav slot="uhf-footer-nav">
|
||
<div class="uhf-footer-nav-row">
|
||
<uhf-footer-nav-group class="uhf-footer-nav-group" heading="What's new" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_What's new_nav", "ecn": "FooterNav_Whats_New_nav", "ehn": "FooterNav"}">
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/surface/devices/surface-pro" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_What's new_Surface Pro_nav", "ecn": "FooterNav_Whats_New_Footer_WhatsNew_NewSurfacePro_nav", "ehn": "FooterNav"}">Surface Pro</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/surface/devices/surface-laptop" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_What's new_Surface Laptop_nav", "ecn": "FooterNav_Whats_New_Footer_WhatsNew_SurfaceLaptop_nav", "ehn": "FooterNav"}">Surface Laptop</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/surface/devices/surface-laptop-ultra?icid=DSM_Footer_WhatsNew_SurfaceLaptopUltra" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_What's new_Surface Laptop Ultra_nav", "ecn": "FooterNav_Whats_New_Footer_WhatsNew_Surface Laptop Ultra_nav", "ehn": "FooterNav"}">Surface Laptop Ultra</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/surface/devices/surface-rtx-spark-dev-box?icid=DSM_Footer_WhatsNew_SurfaceRTXSparkDevBox" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_What's new_Surface RTX Spark Dev Box_nav", "ecn": "FooterNav_Whats_New_footer_whatsnew_SurfaceRTXSparksDevBox_nav_nav", "ehn": "FooterNav"}">Surface RTX Spark Dev Box</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/microsoft-copilot/organizations?icid=DSM_Footer_CopilotOrganizations" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_What's new_Copilot for organizations_nav", "ecn": "FooterNav_Whats_New_Footer_WhatsNew_CopilotMicrosoft_nav", "ehn": "FooterNav"}">Copilot for organizations</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/microsoft-copilot/for-individuals?form=MY02PT&OCID=GE_web_Copilot_Free_868g3t5nj" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_What's new_Copilot for personal use_nav", "ecn": "FooterNav_Whats_New_Footer_WhatsNew_CopilotPersonal_nav", "ehn": "FooterNav"}">Copilot for personal use</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/microsoft-products-and-apps" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_What's new_Explore Microsoft products_nav", "ecn": "FooterNav_Whats_New_Footer_WhatsNew_ExploreMicrosoftProducts_nav", "ehn": "FooterNav"}">Explore Microsoft products</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/windows/apps-for-windows?icid=DSM_Footer_WhatsNew_Windows11apps" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_What's new_Windows 11 apps_nav", "ecn": "FooterNav_Whats_New_Footer_WhatsNew_Windows_11_apps_nav", "ehn": "FooterNav"}">Windows 11 apps</a>
|
||
</uhf-footer-nav-group>
|
||
<uhf-footer-nav-group class="uhf-footer-nav-group" heading="Microsoft Store" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Microsoft Store_nav", "ecn": "FooterNav_Store_and_Support_nav", "ehn": "FooterNav"}">
|
||
<a class="uhf-footer-link" href="https://account.microsoft.com/" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Microsoft Store_Account profile_nav", "ecn": "FooterNav_Store_and_Support_Footer_StoreandSupport_AccountProfile_nav", "ehn": "FooterNav"}">Account profile</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/download" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Microsoft Store_Download Center_nav", "ecn": "FooterNav_Store_and_Support_Footer_StoreandSupport_DownloadCenter_nav", "ehn": "FooterNav"}">Download Center</a>
|
||
<a class="uhf-footer-link" href="https://go.microsoft.com/fwlink/?linkid=2139749" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Microsoft Store_Microsoft Store support_nav", "ecn": "FooterNav_Store_and_Support_Footer_StoreandSupport_SalesAndSupport_nav", "ehn": "FooterNav"}">Microsoft Store support</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/store/b/returns" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Microsoft Store_Returns_nav", "ecn": "FooterNav_Store_and_Support_Footer_StoreandSupport_Returns_nav", "ehn": "FooterNav"}">Returns</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/store/b/order-tracking" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Microsoft Store_Order tracking_nav", "ecn": "FooterNav_Store_and_Support_Footer_StoreandSupport_OrderTracking_nav", "ehn": "FooterNav"}">Order tracking</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/store/b/certified-refurbished-products" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Microsoft Store_Certified Refurbished_nav", "ecn": "FooterNav_Store_and_Support_Footer_StoreandSupport_StoreLocations_nav", "ehn": "FooterNav"}">Certified Refurbished</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/store/b/why-microsoft-store?icid=footer_why-msft-store_7102020" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Microsoft Store_Microsoft Store Promise_nav", "ecn": "FooterNav_Store_and_Support_Footer_StoreandSupport_MicrosoftPromise_nav", "ehn": "FooterNav"}">Microsoft Store Promise</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/store/b/payment-financing-options?icid=footer_financing_vcc" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Microsoft Store_Flexible Payments_nav", "ecn": "FooterNav_Store_and_Support_Footer_StoreandSupport_Financing_nav", "ehn": "FooterNav"}">Flexible Payments</a>
|
||
</uhf-footer-nav-group>
|
||
<uhf-footer-nav-group class="uhf-footer-nav-group" heading="Education" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Education_nav", "ecn": "FooterNav_Education_nav", "ehn": "FooterNav"}">
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/education" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Education_Microsoft in education_nav", "ecn": "FooterNav_Education_Footer_Education_MicrosoftInEducation_nav", "ehn": "FooterNav"}">Microsoft in education</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/education/devices/overview" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Education_Devices for education_nav", "ecn": "FooterNav_Education_Footer_Education_DevicesforEducation_nav", "ehn": "FooterNav"}">Devices for education</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/education/products/teams" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Education_Microsoft Teams for Education_nav", "ecn": "FooterNav_Education_Footer_Education_MicrosoftTeamsforEducation_nav", "ehn": "FooterNav"}">Microsoft Teams for Education</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/education/products/microsoft-365" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Education_Microsoft 365 Education_nav", "ecn": "FooterNav_Education_Footer_Education_Microsoft365Education_nav", "ehn": "FooterNav"}">Microsoft 365 Education</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/education/how-to-buy" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Education_How to buy for your school_nav", "ecn": "FooterNav_Education_Footer_Howtobuyforyourschool_nav", "ehn": "FooterNav"}">How to buy for your school</a>
|
||
<a class="uhf-footer-link" href="https://education.microsoft.com/" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Education_Educator training and development_nav", "ecn": "FooterNav_Education_Footer_Education_EducatorTrainingDevelopment_nav", "ehn": "FooterNav"}">Educator training and development</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/store/b/education" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Education_Deals for students and parents_nav", "ecn": "FooterNav_Education_Footer_Education_DealsForStudentsandParents_nav", "ehn": "FooterNav"}">Deals for students and parents</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/education/ai-in-education" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Education_AI for education_nav", "ecn": "FooterNav_Education_Footer_Education_Azureforstudents_nav", "ehn": "FooterNav"}">AI for education</a>
|
||
</uhf-footer-nav-group>
|
||
</div>
|
||
<div class="uhf-footer-nav-row">
|
||
<uhf-footer-nav-group class="uhf-footer-nav-group" heading="Business" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Business_nav", "ecn": "FooterNav_Business_nav", "ehn": "FooterNav"}">
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/ai?icid=DSM_Footer_AI" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Business_Microsoft AI_nav", "ecn": "FooterNav_Business_Footer_Business_AI_nav", "ehn": "FooterNav"}">Microsoft AI</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/security" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Business_Microsoft Security_nav", "ecn": "FooterNav_Business_Footer_Business_Microsoft Security_nav", "ehn": "FooterNav"}">Microsoft Security</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/dynamics-365" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Business_Dynamics 365_nav", "ecn": "FooterNav_Business_Footer_Business_MicrosoftDynamics365_nav", "ehn": "FooterNav"}">Dynamics 365</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/microsoft-365/business" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Business_Microsoft 365_nav", "ecn": "FooterNav_Business_Footer_Business_M365_nav", "ehn": "FooterNav"}">Microsoft 365</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/power-platform" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Business_Microsoft Power Platform_nav", "ecn": "FooterNav_Business_Footer_DeveloperAndIT_Power Platform_nav", "ehn": "FooterNav"}">Microsoft Power Platform</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/microsoft-teams/group-chat-software" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Business_Microsoft Teams_nav", "ecn": "FooterNav_Business_Footer_Business_Microsoft365_nav", "ehn": "FooterNav"}">Microsoft Teams</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/microsoft-365-copilot?icid=DSM_Footer_Microsoft365Copilot" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Business_Microsoft 365 Copilot_nav", "ecn": "FooterNav_Business_Footer_CopilotMicrosoft365 _nav", "ehn": "FooterNav"}">Microsoft 365 Copilot</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/store/b/business?icid=CNavBusinessStore" id="Small-Business" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Business_Small Business_nav", "ecn": "FooterNav_Business_Footer_Business-SmallBusiness_nav", "ehn": "FooterNav"}">Small Business</a>
|
||
</uhf-footer-nav-group>
|
||
<uhf-footer-nav-group class="uhf-footer-nav-group" heading="Developer & IT" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Developer & IT_nav", "ecn": "FooterNav_Developer_nav", "ehn": "FooterNav"}">
|
||
<a class="uhf-footer-link" href="https://azure.microsoft.com/en-us/" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Developer & IT_Azure_nav", "ecn": "FooterNav_Developer_Footer_DeveloperAndIT_MicrosoftAzure_nav", "ehn": "FooterNav"}">Azure</a>
|
||
<a class="uhf-footer-link" href="https://developer.microsoft.com/en-us/" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Developer & IT_Microsoft Developer_nav", "ecn": "FooterNav_Developer_Footer_DeveloperAndIT_MicrosoftDeveloper_nav", "ehn": "FooterNav"}">Microsoft Developer</a>
|
||
<a class="uhf-footer-link" href="https://learn.microsoft.com/" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Developer & IT_Microsoft Learn_nav", "ecn": "FooterNav_Developer_Footer_DeveloperAndIT_MicrosoftLearn_nav", "ehn": "FooterNav"}">Microsoft Learn</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/software-development-companies/offers-benefits/isv-success?icid=DSM_Footer_SupportAIMarketplace&ocid=cmm3atxvn98" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Developer & IT_Support for AI marketplace apps_nav", "ecn": "FooterNav_Developer_Footer_DeveloperAndIT_SupportForAIMarketplaceApps_nav", "ehn": "FooterNav"}">Support for AI marketplace apps</a>
|
||
<a class="uhf-footer-link" href="https://techcommunity.microsoft.com/" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Developer & IT_Microsoft Tech Community_nav", "ecn": "FooterNav_Developer_Footer_DeveloperAndIT_MicrosoftTechCommunity_nav", "ehn": "FooterNav"}">Microsoft Tech Community</a>
|
||
<a class="uhf-footer-link" href="https://marketplace.microsoft.com?icid=DSM_Footer_Marketplace&ocid=cmm3atxvn98" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Developer & IT_Microsoft Marketplace_nav", "ecn": "FooterNav_Developer_Footer_DeveloperAndIT_Marketplace_nav", "ehn": "FooterNav"}">Microsoft Marketplace</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/software-development-companies?icid=DSM_Footer_SoftwareCompanies&ocid=cmm3atxvn98" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Developer & IT_Software companies_nav", "ecn": "FooterNav_Developer_Software companies_nav", "ehn": "FooterNav"}">Software companies</a>
|
||
<a class="uhf-footer-link" href="https://visualstudio.microsoft.com/" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Developer & IT_Visual Studio_nav", "ecn": "FooterNav_Developer_Footer_DeveloperAndIT_MicrosoftVisualStudio_nav", "ehn": "FooterNav"}">Visual Studio</a>
|
||
</uhf-footer-nav-group>
|
||
<uhf-footer-nav-group class="uhf-footer-nav-group" heading="Company" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Company_nav", "ecn": "FooterNav_Company_nav", "ehn": "FooterNav"}">
|
||
<a class="uhf-footer-link" href="https://careers.microsoft.com/" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Company_Careers_nav", "ecn": "FooterNav_Company_Footer_Company_Careers_nav", "ehn": "FooterNav"}">Careers</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/about" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Company_About Microsoft_nav", "ecn": "FooterNav_Company_Footer_Company_AboutMicrosoft_nav", "ehn": "FooterNav"}">About Microsoft</a>
|
||
<a class="uhf-footer-link" href="https://news.microsoft.com/source/?icid=DSM_Footer_Company_CompanyNews" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Company_Company news_nav", "ecn": "FooterNav_Company_Footer_Company_CompanyNews_nav", "ehn": "FooterNav"}">Company news</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/privacy?icid=DSM_Footer_Company_Privacy" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Company_Privacy at Microsoft_nav", "ecn": "FooterNav_Company_Footer_Company_PrivacyAtMicrosoft_nav", "ehn": "FooterNav"}">Privacy at Microsoft</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/investor/default.aspx" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Company_Investors_nav", "ecn": "FooterNav_Company_Footer_Company_Investors_nav", "ehn": "FooterNav"}">Investors</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/diversity/default?icid=DSM_Footer_Company_Diversity" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Company_Diversity and inclusion_nav", "ecn": "FooterNav_Company_Footer_Company_DiversityAndInclusion_nav", "ehn": "FooterNav"}">Diversity and inclusion</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/accessibility" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Company_Accessibility_nav", "ecn": "FooterNav_Company_Footer_Company_Accessibility_nav", "ehn": "FooterNav"}">Accessibility</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/corporate-responsibility/sustainability?icid=DSM_Footer_Sustainability" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "FooterNav", "cN": "FooterNav_Company_Sustainability_nav", "ecn": "FooterNav_Company_Footer_Company_Sustainability_nav", "ehn": "FooterNav"}">Sustainability</a>
|
||
</uhf-footer-nav-group>
|
||
</div>
|
||
</uhf-footer-nav>
|
||
<div slot="uhf-footer-california-privacy-link">
|
||
|
||
<a class="uhf-footer-link" href="https://aka.ms/yourcaliforniaprivacychoices" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_California Privacy_nav", "ecn": "LegalNav_CaliforniaPrivacy_nav", "ehn": "LegalNav"}">
|
||
<svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 14" xml:space="preserve" height="16" width="43">
|
||
<title>Your Privacy Choices Opt-Out Icon</title>
|
||
<path d="M7.4 12.8h6.8l3.1-11.6H7.4C4.2 1.2 1.6 3.8 1.6 7s2.6 5.8 5.8 5.8z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#fff"/>
|
||
<path d="M22.6 0H7.4c-3.9 0-7 3.1-7 7s3.1 7 7 7h15.2c3.9 0 7-3.1 7-7s-3.2-7-7-7zm-21 7c0-3.2 2.6-5.8 5.8-5.8h9.9l-3.1 11.6H7.4c-3.2 0-5.8-2.6-5.8-5.8z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#06f"/>
|
||
<path d="M24.6 4c.2.2.2.6 0 .8L22.5 7l2.2 2.2c.2.2.2.6 0 .8-.2.2-.6.2-.8 0l-2.2-2.2-2.2 2.2c-.2.2-.6.2-.8 0-.2-.2-.2-.6 0-.8L20.8 7l-2.2-2.2c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0l2.2 2.2L23.8 4c.2-.2.6-.2.8 0z" style="fill:#fff"/>
|
||
<path d="M12.7 4.1c.2.2.3.6.1.8L8.6 9.8c-.1.1-.2.2-.3.2-.2.1-.5.1-.7-.1L5.4 7.7c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0L8 8.6l3.8-4.5c.2-.2.6-.2.9 0z" style="fill:#06f"/>
|
||
</svg>
|
||
<span>Your Privacy Choices</span>
|
||
</a>
|
||
<noscript>
|
||
|
||
<a class="uhf-footer-link" href="https://aka.ms/yourcaliforniaprivacychoices" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_California Privacy_nav", "ecn": "LegalNav_CaliforniaPrivacy_nav", "ehn": "LegalNav"}">
|
||
<svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 14" xml:space="preserve" height="16" width="43">
|
||
<title>Your Privacy Choices Opt-Out Icon</title>
|
||
<path d="M7.4 12.8h6.8l3.1-11.6H7.4C4.2 1.2 1.6 3.8 1.6 7s2.6 5.8 5.8 5.8z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#fff"/>
|
||
<path d="M22.6 0H7.4c-3.9 0-7 3.1-7 7s3.1 7 7 7h15.2c3.9 0 7-3.1 7-7s-3.2-7-7-7zm-21 7c0-3.2 2.6-5.8 5.8-5.8h9.9l-3.1 11.6H7.4c-3.2 0-5.8-2.6-5.8-5.8z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#06f"/>
|
||
<path d="M24.6 4c.2.2.2.6 0 .8L22.5 7l2.2 2.2c.2.2.2.6 0 .8-.2.2-.6.2-.8 0l-2.2-2.2-2.2 2.2c-.2.2-.6.2-.8 0-.2-.2-.2-.6 0-.8L20.8 7l-2.2-2.2c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0l2.2 2.2L23.8 4c.2-.2.6-.2.8 0z" style="fill:#fff"/>
|
||
<path d="M12.7 4.1c.2.2.3.6.1.8L8.6 9.8c-.1.1-.2.2-.3.2-.2.1-.5.1-.7-.1L5.4 7.7c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0L8 8.6l3.8-4.5c.2-.2.6-.2.9 0z" style="fill:#06f"/>
|
||
</svg>
|
||
<span>Your Privacy Choices</span>
|
||
</a>
|
||
</noscript>
|
||
</div>
|
||
<a slot="uhf-footer-consumer-health-privacy-link" class="uhf-footer-link" href="https://go.microsoft.com/fwlink/?linkid=2259814" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_Consumer Health Privacy_nav", "ecn": "LegalNav_ConsumerHealthPrivacy_nav", "ehn": "LegalNav"}">Consumer Health Privacy</a>
|
||
|
||
<uhf-footer-menu slot="uhf-footer-menu" data-nav-label="Microsoft corporate links">
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/sitemap1.aspx" id="uhf-Footer_Sitemap" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_Sitemap_nav", "ecn": "LegalNav_Footer_Sitemap_nav", "ehn": "LegalNav"}">Sitemap</a>
|
||
<a class="uhf-footer-link" href="https://support.microsoft.com/contactus" id="uhf-Footer_ContactUs" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_Contact Microsoft_nav", "ecn": "LegalNav_Footer_ContactUs_nav", "ehn": "LegalNav"}">Contact Microsoft</a>
|
||
<a class="uhf-footer-link" href="https://go.microsoft.com/fwlink/?LinkId=521839" id="uhf-Footer_PrivacyandCookies" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_Privacy _nav", "ecn": "LegalNav_Footer_PrivacyandCookies_nav", "ehn": "LegalNav"}">Privacy </a>
|
||
<a class="uhf-footer-link" href="#" id="uhf-Footer_ManageCookies" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_Manage cookies_nav", "ecn": "LegalNav_Footer_ManageCookies_nav", "ehn": "LegalNav"}">Manage cookies</a>
|
||
<a class="uhf-footer-link" href="https://go.microsoft.com/fwlink/?LinkID=206977" id="uhf-Footer_TermsOfUse" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_Terms of use_nav", "ecn": "LegalNav_Footer_TermsOfUse_nav", "ehn": "LegalNav"}">Terms of use</a>
|
||
<a class="uhf-footer-link" href="https://go.microsoft.com/fwlink/?linkid=2196228" id="uhf-Footer_Trademarks" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_Trademarks_nav", "ecn": "LegalNav_Footer_Trademarks_nav", "ehn": "LegalNav"}">Trademarks</a>
|
||
<a class="uhf-footer-link" href="https://go.microsoft.com/fwlink/?linkid=2196227" id="uhf-Footer_SafetyAndEco" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_Safety & eco_nav", "ecn": "LegalNav_Footer_SafetyAndEco_nav", "ehn": "LegalNav"}">Safety & eco</a>
|
||
<a class="uhf-footer-link" href="https://www.microsoft.com/en-us/legal/compliance/recycling" id="uhf-Recycling" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_Recycling_nav", "ecn": "LegalNav_Recycling_nav", "ehn": "LegalNav"}">Recycling</a>
|
||
<a class="uhf-footer-link" href="https://choice.microsoft.com" id="uhf-Footer_AboutourAds" data-m="{"compnm": "UHF", "view": "UHF", "pa": "UniversalFooter", "hn": "LegalNav", "cN": "LegalNav_About our ads_nav", "ecn": "LegalNav_Footer_AboutourAds_nav", "ehn": "LegalNav"}">About our ads</a>
|
||
</uhf-footer-menu>
|
||
</uhf-footer><!--/ UHF footer -->
|
||
<!-- back to top button -->
|
||
<div class="back-comment-buttons" data-bi-area="sidebar">
|
||
<style>
|
||
.evo-right-sidebar {
|
||
position: fixed !important;
|
||
right: 10px;
|
||
bottom: 188px;
|
||
z-index: 9;
|
||
}
|
||
|
||
.evo-sidebar-button {
|
||
display: none;
|
||
visibility: hidden;
|
||
padding: 0;
|
||
z-index: 99999;
|
||
border-radius: 50%;
|
||
margin-bottom: 1rem;
|
||
}
|
||
|
||
.evo-sidebar-button:hover {
|
||
text-decoration: none;
|
||
}
|
||
|
||
.evo-sidebar-button.active {
|
||
display: flex;
|
||
visibility: visible;
|
||
}
|
||
|
||
.evo-sidebar-button-inner {
|
||
padding: 5px 8.5px;
|
||
border-radius: 50%;
|
||
background: var(--clr-card-bg);
|
||
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.14), 0px 0px 2px 0px rgba(0, 0, 0, 0.12);
|
||
color: var(--clr-landing-navbar);
|
||
}
|
||
|
||
.evo-sidebar-button-inner i,
|
||
.evo-sidebar-button-inner i::before {
|
||
color: var(--clr-landing-navbar);
|
||
}
|
||
</style>
|
||
|
||
<div class="evo-right-sidebar">
|
||
<a data-bi-id="click back to top of page" data-bi-name="Back to top" href="#page" title="Back to top" aria-label="click back to top of page" class="evo-sidebar-button back-to-top">
|
||
<span class="evo-sidebar-button-inner">
|
||
<svg width="30" height="30" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M39.5607 32.0607C38.9749 32.6464 38.0251 32.6464 37.4393 32.0607L24 18.6213L10.5607 32.0607C9.97487 32.6464 9.02513 32.6464 8.43934 32.0607C7.85355 31.4749 7.85355 30.5251 8.43934 29.9393L22.9393 15.4393C23.5251 14.8536 24.4749 14.8536 25.0607 15.4393L39.5607 29.9393C40.1464 30.5251 40.1464 31.4749 39.5607 32.0607Z" fill="currentColor"/>
|
||
</svg>
|
||
</span>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
<!-- back to top button -->
|
||
<!-- UHF search functionality query parameter append for all pages excluding landing page -->
|
||
<script type="text/javascript">
|
||
var serachHtml = '<input type="hidden" name="blog" value="/devopsservice/" data-m="{"cN":"HiddenInput_nav","id":"n2c1c9c3m1r1a1","sN":2,"aN":"c1c9c3m1r1a1"}" style="overflow-x: visible;">';
|
||
jQuery(".c-uhfh-actions #searchForm").append(serachHtml);
|
||
</script>
|
||
|
||
<!-- Add JSLL tracking to the mobile UHF logo trigger to match the desktop logo (Task 2440600) -->
|
||
<script type="text/javascript">
|
||
(function () {
|
||
// Desktop logo tracking to mirror onto the mobile trigger; falls back to the known UHF blob.
|
||
var FALLBACK_DATA_M = '{"compnm":"UHF","view":"UHF","pa":"UniversalHeader","hn":"Anchor","cN":"CatNav_Logo_cont","ecn":"CatNav_Logo_cont","ehn":"Anchor"}';
|
||
|
||
function applyMobileLogoTracking() {
|
||
var desktopLogo = document.querySelector('a.uhf-site-logo');
|
||
var dataM = (desktopLogo && desktopLogo.getAttribute('data-m')) || FALLBACK_DATA_M;
|
||
var ariaLabel = (desktopLogo && desktopLogo.getAttribute('aria-label')) || 'Dev Blogs';
|
||
|
||
var triggers = document.querySelectorAll('button.uhf-contextual-nav-trigger');
|
||
triggers.forEach(function (trigger) {
|
||
if (trigger.dataset.logoTracked) {
|
||
return;
|
||
}
|
||
// Only the brand/logo trigger (mirrors the "Dev Blogs" site logo).
|
||
if (!/Dev\s*Blogs/i.test(trigger.textContent)) {
|
||
return;
|
||
}
|
||
trigger.setAttribute('data-m', dataM);
|
||
if (!trigger.getAttribute('aria-label')) {
|
||
trigger.setAttribute('aria-label', ariaLabel);
|
||
}
|
||
trigger.dataset.logoTracked = '1';
|
||
});
|
||
}
|
||
|
||
document.addEventListener('DOMContentLoaded', applyMobileLogoTracking);
|
||
var uhf = document.querySelector('uhf-header') || document.body;
|
||
new MutationObserver(applyMobileLogoTracking).observe(uhf, { childList: true, subtree: true });
|
||
})();
|
||
</script>
|
||
|
||
</body>
|
||
|
||
</html> |