Import Cobalt 22.lts.3.306369
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index ea42569..5bea38e 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -1766,22 +1766,31 @@
ResetResources();
+ // Suspend media module and update system window and resource provider.
+ if (media_module_) {
+ DCHECK(system_window_);
+ window_size_ = system_window_->GetWindowSize();
+#if SB_API_VERSION >= 13
+ // This needs to be done before destroying the renderer module as it
+ // may use the renderer module to release assets during the update.
+ media_module_->UpdateSystemWindowAndResourceProvider(NULL,
+ GetResourceProvider());
+#endif // SB_API_VERSION >= 13
+ }
+
if (renderer_module_) {
// Destroy the renderer module into so that it releases all its graphical
// resources.
DestroyRendererModule();
}
- if (media_module_) {
- DCHECK(system_window_);
- window_size_ = system_window_->GetWindowSize();
#if SB_API_VERSION >= 13
+ // Reset system window after renderer module destroyed.
+ if (media_module_) {
input_device_manager_.reset();
system_window_.reset();
- media_module_->UpdateSystemWindowAndResourceProvider(NULL,
- GetResourceProvider());
-#endif // SB_API_VERSION >= 13
}
+#endif // SB_API_VERSION >= 13
}
void BrowserModule::FreezeInternal(SbTimeMonotonic timestamp) {
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index bd615ed..74c5406 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-306081
\ No newline at end of file
+306369
\ No newline at end of file
diff --git a/src/cobalt/content/ssl/certs/002c0b4f.0 b/src/cobalt/content/ssl/certs/002c0b4f.0
new file mode 100644
index 0000000..559a390
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/002c0b4f.0
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA
+MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD
+VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy
+MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt
+c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ
+OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG
+vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud
+316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo
+0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE
+y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF
+zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE
++cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN
+I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs
+x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa
+ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC
+4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4
+7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg
+JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti
+2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk
+pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF
+FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt
+rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk
+ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5
+u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP
+4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6
+N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3
+vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/0c4c9b6c.0 b/src/cobalt/content/ssl/certs/0c4c9b6c.0
deleted file mode 100644
index 70b4ce4..0000000
--- a/src/cobalt/content/ssl/certs/0c4c9b6c.0
+++ /dev/null
@@ -1,41 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
-VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
-IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
-MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
-aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
-MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
-cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
-A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
-BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
-hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
-KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
-G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
-zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
-ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
-HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
-Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
-yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
-beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
-6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
-wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
-zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
-BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
-ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
-ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
-cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
-YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
-CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
-KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
-hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
-UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
-X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
-fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
-a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
-Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
-SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
-AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
-M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
-v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
-09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/116bf586.0 b/src/cobalt/content/ssl/certs/116bf586.0
deleted file mode 100644
index f9364c0..0000000
--- a/src/cobalt/content/ssl/certs/116bf586.0
+++ /dev/null
@@ -1,17 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
-MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
-KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
-MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
-BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
-NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
-BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
-MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
-So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
-tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
-CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
-qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
-rD6ogRLQy7rQkgu2npaqBA+K
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/128805a3.0 b/src/cobalt/content/ssl/certs/128805a3.0
deleted file mode 100644
index 013d461..0000000
--- a/src/cobalt/content/ssl/certs/128805a3.0
+++ /dev/null
@@ -1,24 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
-MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
-czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
-CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
-MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
-ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
-b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
-euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
-bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
-WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
-MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
-1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
-zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
-BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
-BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
-v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
-E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
-uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
-iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
-GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/2c543cd1.0 b/src/cobalt/content/ssl/certs/2c543cd1.0
deleted file mode 100644
index bcb2529..0000000
--- a/src/cobalt/content/ssl/certs/2c543cd1.0
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
-MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
-YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
-R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
-9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
-fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
-iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
-1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
-bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
-MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
-ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
-uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
-Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
-tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
-PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
-hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
-5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/2e4eed3c.0 b/src/cobalt/content/ssl/certs/2e4eed3c.0
deleted file mode 100644
index 998460f..0000000
--- a/src/cobalt/content/ssl/certs/2e4eed3c.0
+++ /dev/null
@@ -1,25 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
-qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
-Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
-MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
-BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
-NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
-LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
-A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
-W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
-3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
-6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
-Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
-NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
-r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
-DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
-YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
-xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
-/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
-LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
-jVaMaA==
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/2e5ac55d.0 b/src/cobalt/content/ssl/certs/2e5ac55d.0
deleted file mode 100644
index b2e43c9..0000000
--- a/src/cobalt/content/ssl/certs/2e5ac55d.0
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
-MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
-DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
-PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
-Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
-rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
-OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
-xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
-7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
-aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
-SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
-ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
-AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
-R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
-JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
-Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/3fb36b73.0 b/src/cobalt/content/ssl/certs/3fb36b73.0
new file mode 100644
index 0000000..59f8ce3
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/3fb36b73.0
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM
+BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG
+T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx
+CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD
+b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA
+iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH
+38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE
+HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz
+kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP
+szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq
+vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf
+nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG
+YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo
+0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a
+CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K
+AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I
+36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB
+Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN
+qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj
+cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm
++LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL
+hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe
+lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7
+p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8
+piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR
+LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX
+5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO
+dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul
+9XXeifdy
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/480720ec.0 b/src/cobalt/content/ssl/certs/480720ec.0
deleted file mode 100644
index 03c70c7..0000000
--- a/src/cobalt/content/ssl/certs/480720ec.0
+++ /dev/null
@@ -1,21 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
-MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
-R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
-MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
-Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
-AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
-ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
-7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
-kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
-mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
-KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
-6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
-4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
-oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
-UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
-AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/4a6481c9.0 b/src/cobalt/content/ssl/certs/4a6481c9.0
deleted file mode 100644
index 6f0f8db..0000000
--- a/src/cobalt/content/ssl/certs/4a6481c9.0
+++ /dev/null
@@ -1,22 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
-MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
-v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
-eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
-tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
-C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
-zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
-mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
-V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
-bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
-3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
-J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
-291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
-ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
-AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/5a4d6896.0 b/src/cobalt/content/ssl/certs/5a4d6896.0
deleted file mode 100644
index bc6a756..0000000
--- a/src/cobalt/content/ssl/certs/5a4d6896.0
+++ /dev/null
@@ -1,32 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX
-DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
-ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
-b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP
-cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW
-IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX
-xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy
-KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR
-9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az
-5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8
-6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7
-Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP
-bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt
-BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt
-XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF
-MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd
-INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
-U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp
-LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8
-Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp
-gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh
-/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw
-0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A
-fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq
-4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR
-1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/
-QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM
-94B7IWcnMFk=
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/5f618aec.0 b/src/cobalt/content/ssl/certs/5f618aec.0
new file mode 100644
index 0000000..573ec33
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/5f618aec.0
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV
+BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g
+Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ
+BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ
+R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF
+dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw
+vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ
+uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp
+n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs
+cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW
+xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P
+rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF
+DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx
+DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy
+LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C
+eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ
+d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq
+kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC
+b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl
+qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0
+OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c
+NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk
+ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO
+pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj
+03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk
+PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE
+1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX
+QRBdJ3NghVdJIgc=
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/6410666e.0 b/src/cobalt/content/ssl/certs/6410666e.0
deleted file mode 100644
index 51187d8..0000000
--- a/src/cobalt/content/ssl/certs/6410666e.0
+++ /dev/null
@@ -1,32 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
-MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
-PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
-AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
-IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
-gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
-yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
-F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
-jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
-ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
-VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
-YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
-EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
-Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
-DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
-MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
-UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
-TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
-qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
-ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
-JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
-hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
-EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
-nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
-udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
-ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
-LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
-pYYsfPQS
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/76cb8f92.0 b/src/cobalt/content/ssl/certs/76cb8f92.0
deleted file mode 100644
index edbeb27..0000000
--- a/src/cobalt/content/ssl/certs/76cb8f92.0
+++ /dev/null
@@ -1,22 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
-A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
-bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
-ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
-b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
-7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
-J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
-HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
-t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
-FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
-XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
-MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
-hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
-MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
-A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
-Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
-XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
-omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
-A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
-WL1WMRJOEcgh4LMRkWXbtKaIOM5V
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/7d0b38bd.0 b/src/cobalt/content/ssl/certs/7d0b38bd.0
deleted file mode 100644
index e19fdea..0000000
--- a/src/cobalt/content/ssl/certs/7d0b38bd.0
+++ /dev/null
@@ -1,21 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
-ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
-U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
-A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
-U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
-SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
-biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
-GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
-fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
-aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
-aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
-kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
-4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
-FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/8867006a.0 b/src/cobalt/content/ssl/certs/8867006a.0
deleted file mode 100644
index bed6cd0..0000000
--- a/src/cobalt/content/ssl/certs/8867006a.0
+++ /dev/null
@@ -1,31 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
-MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
-c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
-VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
-c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
-WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
-FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
-XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
-se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
-KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
-IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
-y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
-hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
-QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
-Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
-HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
-KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
-dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
-L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
-Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
-ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
-T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
-GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
-1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
-OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
-6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
-QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/8d89cda1.0 b/src/cobalt/content/ssl/certs/8d89cda1.0
new file mode 100644
index 0000000..e3be2a5
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/8d89cda1.0
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw
+CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD
+VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw
+MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV
+UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy
+b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR
+ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb
+hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3
+FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV
+L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB
+iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/9482e63a.0 b/src/cobalt/content/ssl/certs/9482e63a.0
new file mode 100644
index 0000000..81f8a2e
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/9482e63a.0
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw
+CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw
+JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT
+EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0
+WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT
+LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX
+BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE
+KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm
+Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8
+EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J
+UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn
+nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k=
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/9b5697b0.0 b/src/cobalt/content/ssl/certs/9b5697b0.0
new file mode 100644
index 0000000..8f308f5
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/9b5697b0.0
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD
+VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf
+BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3
+YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x
+NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G
+A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0
+d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF
+Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG
+SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN
+FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w
+DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw
+CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh
+DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/9f727ac7.0 b/src/cobalt/content/ssl/certs/9f727ac7.0
new file mode 100644
index 0000000..f440412
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/9f727ac7.0
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs
+MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg
+Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL
+MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
+YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv
+b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l
+mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE
+4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv
+a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M
+pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw
+Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b
+LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY
+AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB
+AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq
+E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr
+W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ
+CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU
+X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3
+f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja
+H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP
+JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P
+zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt
+jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0
+/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT
+BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79
+aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW
+xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU
+63ZTGI0RmLo=
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/ad088e1d.0 b/src/cobalt/content/ssl/certs/ad088e1d.0
deleted file mode 100644
index 6bc2888..0000000
--- a/src/cobalt/content/ssl/certs/ad088e1d.0
+++ /dev/null
@@ -1,31 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
-MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
-c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
-BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
-IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
-VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
-cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
-QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
-F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
-c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
-mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
-VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
-teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
-f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
-Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
-nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
-/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
-MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
-9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
-aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
-IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
-ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
-uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
-Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
-QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
-koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
-ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
-DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
-bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/b1b8a7f3.0 b/src/cobalt/content/ssl/certs/b1b8a7f3.0
deleted file mode 100644
index a695c21..0000000
--- a/src/cobalt/content/ssl/certs/b1b8a7f3.0
+++ /dev/null
@@ -1,24 +0,0 @@
------BEGIN CERTIFICATE-----
-MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
-ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
-aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
-ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
-NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
-A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
-VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
-SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
-VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
-w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
-mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
-4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
-4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
-DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
-EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
-SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
-ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
-vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
-hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
-Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
-/L7fCg0=
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/b204d74a.0 b/src/cobalt/content/ssl/certs/b204d74a.0
deleted file mode 100644
index 707ff08..0000000
--- a/src/cobalt/content/ssl/certs/b204d74a.0
+++ /dev/null
@@ -1,28 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
-ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
-ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
-U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
-nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
-t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
-SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
-BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
-rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
-NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
-BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
-BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
-MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
-p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
-5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
-WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
-4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
-hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/b433981b.0 b/src/cobalt/content/ssl/certs/b433981b.0
new file mode 100644
index 0000000..c371237
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/b433981b.0
@@ -0,0 +1,34 @@
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/b81b93f0.0 b/src/cobalt/content/ssl/certs/b81b93f0.0
new file mode 100644
index 0000000..8dde431
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/b81b93f0.0
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw
+CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw
+FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S
+Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5
+MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL
+DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS
+QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB
+BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH
+sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK
+Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu
+SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC
+MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy
+v+c=
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/ba89ed3b.0 b/src/cobalt/content/ssl/certs/ba89ed3b.0
deleted file mode 100644
index acfed9d..0000000
--- a/src/cobalt/content/ssl/certs/ba89ed3b.0
+++ /dev/null
@@ -1,25 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
-rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
-Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
-MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
-BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
-Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
-LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
-MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
-ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
-gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
-YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
-b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
-9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
-zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
-OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
-HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
-2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
-oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
-t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
-KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
-m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
-MdRAGmI0Nj81Aa6sY6A=
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/bf53fb88.0 b/src/cobalt/content/ssl/certs/bf53fb88.0
new file mode 100644
index 0000000..3bdfb23
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/bf53fb88.0
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl
+MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw
+NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
+IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG
+EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N
+aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ
+Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0
+ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1
+HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm
+gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ
+jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc
+aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG
+YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6
+W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K
+UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH
++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q
+W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC
+LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC
+gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6
+tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh
+SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2
+TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3
+pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR
+xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp
+GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9
+dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN
+AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB
+RA+GsCyRxj3qrg+E
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/c01cdfa2.0 b/src/cobalt/content/ssl/certs/c01cdfa2.0
deleted file mode 100644
index b5f1875..0000000
--- a/src/cobalt/content/ssl/certs/c01cdfa2.0
+++ /dev/null
@@ -1,28 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
-vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
-ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
-MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
-IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
-IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
-bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
-9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
-H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
-LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
-/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
-rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
-WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
-exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
-DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
-sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
-seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
-4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
-BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
-lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
-7M2CYfE45k+XmCpajQ==
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/c089bbbd.0 b/src/cobalt/content/ssl/certs/c089bbbd.0
deleted file mode 100644
index 447ee3d..0000000
--- a/src/cobalt/content/ssl/certs/c089bbbd.0
+++ /dev/null
@@ -1,16 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
-MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
-IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
-BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
-MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
-d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
-YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
-dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
-BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
-papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
-DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
-KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
-XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/c0ff1f52.0 b/src/cobalt/content/ssl/certs/c0ff1f52.0
deleted file mode 100644
index 6880364..0000000
--- a/src/cobalt/content/ssl/certs/c0ff1f52.0
+++ /dev/null
@@ -1,24 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
-cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
-LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
-aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
-VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
-aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
-IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
-N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
-KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
-kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
-CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
-Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
-imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
-2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
-DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
-/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
-F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
-TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/c47d9980.0 b/src/cobalt/content/ssl/certs/c47d9980.0
deleted file mode 100644
index 7d3a249..0000000
--- a/src/cobalt/content/ssl/certs/c47d9980.0
+++ /dev/null
@@ -1,42 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
-VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
-IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
-MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
-IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
-MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
-dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
-EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
-MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
-CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
-28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
-VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
-DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
-5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
-ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
-Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
-UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
-+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
-Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
-ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
-hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
-HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
-+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
-YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
-L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
-ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
-IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
-HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
-DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
-PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
-5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
-glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
-FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
-pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
-xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
-tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
-jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
-fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
-OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
-d0jQ
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/d853d49e.0 b/src/cobalt/content/ssl/certs/d853d49e.0
deleted file mode 100644
index fb804c9..0000000
--- a/src/cobalt/content/ssl/certs/d853d49e.0
+++ /dev/null
@@ -1,21 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
-MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
-ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
-MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
-MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
-AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
-iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
-vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
-0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
-OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
-BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
-FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
-GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
-zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
-1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
-f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
-jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
-ZetX2fNXlrtIzYE=
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/d887a5bb.0 b/src/cobalt/content/ssl/certs/d887a5bb.0
new file mode 100644
index 0000000..e1ddb42
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/d887a5bb.0
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE-----
+MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD
+VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf
+BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3
+YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x
+NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G
+A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0
+d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF
+Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB
+BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ
+j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF
+1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G
+A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3
+AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC
+MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu
+Sw==
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/def36a68.0 b/src/cobalt/content/ssl/certs/def36a68.0
deleted file mode 100644
index 014657f..0000000
--- a/src/cobalt/content/ssl/certs/def36a68.0
+++ /dev/null
@@ -1,33 +0,0 @@
------BEGIN CERTIFICATE-----
-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
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/e2799e36.0 b/src/cobalt/content/ssl/certs/e2799e36.0
deleted file mode 100644
index dc1f859..0000000
--- a/src/cobalt/content/ssl/certs/e2799e36.0
+++ /dev/null
@@ -1,24 +0,0 @@
------BEGIN CERTIFICATE-----
-MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
-mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
-MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
-eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
-BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
-MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
-BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
-+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
-hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
-5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
-JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
-DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
-huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
-HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
-AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
-zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
-kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
-AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
-SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
-spki4cErx5z481+oghLrGREt
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/e35234b1.0 b/src/cobalt/content/ssl/certs/e35234b1.0
new file mode 100644
index 0000000..fa7fa74
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/e35234b1.0
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6
+MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu
+MScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNV
+BAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwHhcNMTgwMzE2MTIxMDEzWhcNNDMw
+MzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEg
+U3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZ
+n0EGze2jusDbCSzBfN8pfktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/q
+p1x4EaTByIVcJdPTsuclzxFUl6s1wB52HO8AU5853BSlLCIls3Jy/I2z5T4IHhQq
+NwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2fJmItdUDmj0VDT06qKhF
+8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGtg/BKEiJ3
+HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGa
+mqi4NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi
+7VdNIuJGmj8PkTQkfVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSF
+ytKAQd8FqKPVhJBPC/PgP5sZ0jeJP/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0P
+qafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSYnjYJdmZm/Bo/6khUHL4wvYBQ
+v3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHKHRzQ+8S1h9E6
+Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1
+vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQAD
+ggIBAEii1QALLtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4
+WxmB82M+w85bj/UvXgF2Ez8sALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvo
+zMrnadyHncI013nR03e4qllY/p0m+jiGPp2Kh2RX5Rc64vmNueMzeMGQ2Ljdt4NR
+5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8CYyqOhNf6DR5UMEQ
+GfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA4kZf
+5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq
+0Uc9NneoWWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7D
+P78v3DSk+yshzWePS/Tj6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTM
+qJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmTOPQD8rv7gmsHINFSH5pkAnuYZttcTVoP
+0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZckbxJF0WddCajJFdr60qZf
+E2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/e868b802.0 b/src/cobalt/content/ssl/certs/e868b802.0
new file mode 100644
index 0000000..b6f59c2
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/e868b802.0
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV
+BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk
+LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv
+b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ
+BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg
+THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v
+IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv
+xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H
+Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB
+eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo
+jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ
++efcMQ==
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/ecccd8db.0 b/src/cobalt/content/ssl/certs/ecccd8db.0
new file mode 100644
index 0000000..42924b0
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/ecccd8db.0
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw
+CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh
+cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v
+dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG
+A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
+aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg
+Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7
+KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y
+STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD
+AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw
+SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN
+nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/f249de83.0 b/src/cobalt/content/ssl/certs/f249de83.0
new file mode 100644
index 0000000..85da765
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/f249de83.0
@@ -0,0 +1,34 @@
+-----BEGIN CERTIFICATE-----
+MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw
+CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x
+ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1
+c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx
+OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI
+SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI
+b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn
+swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu
+7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8
+1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW
+80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP
+JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l
+RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw
+hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10
+coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc
+BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n
+twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud
+DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W
+0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe
+uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q
+lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB
+aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE
+sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT
+MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe
+qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh
+VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8
+h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9
+EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK
+yeC2nOnOcXHebD8WpHk=
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/fa5da96b.0 b/src/cobalt/content/ssl/certs/fa5da96b.0
new file mode 100644
index 0000000..c80b4e8
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/fa5da96b.0
@@ -0,0 +1,32 @@
+-----BEGIN CERTIFICATE-----
+MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG
+A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw
+FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx
+MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u
+aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq
+hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b
+RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z
+YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3
+QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw
+yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+
+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ
+SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH
+r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0
+4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me
+dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw
+q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2
+nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu
+H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
+VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC
+XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd
+6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf
++I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi
+kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7
+wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB
+TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C
+MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn
+4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I
+aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy
+qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/fd64f3fc.0 b/src/cobalt/content/ssl/certs/fd64f3fc.0
new file mode 100644
index 0000000..58c5b54
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/fd64f3fc.0
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL
+BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg
+Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv
+b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG
+EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u
+IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ
+KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ
+n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd
+2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF
+VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ
+GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF
+li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU
+r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2
+eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb
+MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg
+jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB
+7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW
+5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE
+ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0
+90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z
+xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu
+QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4
+FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH
+22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP
+xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn
+dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5
+Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b
+nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ
+CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH
+u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj
+d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o=
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/feffd413.0 b/src/cobalt/content/ssl/certs/feffd413.0
new file mode 100644
index 0000000..d9e601c
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/feffd413.0
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx
+CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD
+ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw
+MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex
+HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq
+R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd
+yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
+DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ
+7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8
++RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A=
+-----END CERTIFICATE-----
diff --git a/src/cobalt/extension/platform_service.h b/src/cobalt/extension/platform_service.h
index 1d85cc9..4b66e86 100644
--- a/src/cobalt/extension/platform_service.h
+++ b/src/cobalt/extension/platform_service.h
@@ -42,7 +42,7 @@
// When a client receives a message from a service, the service will be passed
// in as the |context| here, with |data|, which has length |length|.
-typedef void (*ReceiveMessageCallback)(void* context, void* data,
+typedef void (*ReceiveMessageCallback)(void* context, const void* data,
uint64_t length);
typedef struct CobaltExtensionPlatformServiceApi {
diff --git a/src/cobalt/extension/updater_notification.h b/src/cobalt/extension/updater_notification.h
index ce301dc..906cafc 100644
--- a/src/cobalt/extension/updater_notification.h
+++ b/src/cobalt/extension/updater_notification.h
@@ -31,9 +31,15 @@
kCobaltExtensionUpdaterNotificationStateDownloading = 3,
kCobaltExtensionUpdaterNotificationStateDownloaded = 4,
kCobaltExtensionUpdaterNotificationStateInstalling = 5,
+#if SB_API_VERSION > 13
+ kCobaltExtensionUpdaterNotificationStateUpdated = 6,
+ kCobaltExtensionUpdaterNotificationStateUpToDate = 7,
+ kCobaltExtensionUpdaterNotificationStateUpdateFailed = 8,
+#else
kCobaltExtensionUpdaterNotificationStatekUpdated = 6,
kCobaltExtensionUpdaterNotificationStatekUpToDate = 7,
kCobaltExtensionUpdaterNotificationStatekUpdateFailed = 8,
+#endif
} CobaltExtensionUpdaterNotificationState;
typedef struct CobaltExtensionUpdaterNotificationApi {
diff --git a/src/cobalt/h5vcc/h5vcc_platform_service.cc b/src/cobalt/h5vcc/h5vcc_platform_service.cc
index 2ee9d73..f20b5ca 100644
--- a/src/cobalt/h5vcc/h5vcc_platform_service.cc
+++ b/src/cobalt/h5vcc/h5vcc_platform_service.cc
@@ -14,6 +14,9 @@
#include "cobalt/h5vcc/h5vcc_platform_service.h"
+#include <utility>
+#include <vector>
+
#include "cobalt/base/polymorphic_downcast.h"
#include "cobalt/dom/dom_settings.h"
#include "starboard/common/string.h"
@@ -129,17 +132,23 @@
}
// static
-void H5vccPlatformService::Receive(void* context, void* data, uint64_t length) {
+void H5vccPlatformService::Receive(void* context, const void* data,
+ uint64_t length) {
DCHECK(context) << "Platform should not call Receive with NULL context";
- static_cast<H5vccPlatformService*>(context)->ReceiveInternal(data, length);
+ // Make a copy of the data before potentially crossing thread boundaries,
+ // since we don't have any guarantee of the lifetime of the given data.
+ const uint8_t* input_data = static_cast<const uint8_t*>(data);
+ std::vector<uint8_t> internal_data(input_data, input_data + length);
+ static_cast<H5vccPlatformService*>(context)->ReceiveInternal(
+ std::move(internal_data));
}
-void H5vccPlatformService::ReceiveInternal(void* data, uint64_t length) {
+void H5vccPlatformService::ReceiveInternal(std::vector<uint8_t> data) {
// ReceiveInternal may be called by another thread.
if (!main_message_loop_->BelongsToCurrentThread()) {
main_message_loop_->PostTask(
FROM_HERE, base::Bind(&H5vccPlatformService::ReceiveInternal,
- weak_this_, data, length));
+ weak_this_, std::move(data)));
return;
}
DCHECK(main_message_loop_->BelongsToCurrentThread());
@@ -148,10 +157,11 @@
return;
}
script::Handle<script::ArrayBuffer> data_array_buffer;
- if (length) {
- data_array_buffer = script::ArrayBuffer::New(environment_, data, length);
- } else {
+ if (data.empty()) {
data_array_buffer = script::ArrayBuffer::New(environment_, 0);
+ } else {
+ data_array_buffer =
+ script::ArrayBuffer::New(environment_, data.data(), data.size());
}
const scoped_refptr<H5vccPlatformService>& service(this);
diff --git a/src/cobalt/h5vcc/h5vcc_platform_service.h b/src/cobalt/h5vcc/h5vcc_platform_service.h
index 1a86286..62ac3e1 100644
--- a/src/cobalt/h5vcc/h5vcc_platform_service.h
+++ b/src/cobalt/h5vcc/h5vcc_platform_service.h
@@ -17,6 +17,7 @@
#include <map>
#include <string>
+#include <vector>
#include "base/message_loop/message_loop.h"
#include "base/optional.h"
@@ -65,9 +66,9 @@
private:
static constexpr size_t kMaxNameLength = 1024;
- void ReceiveInternal(void* data, uint64_t length);
+ void ReceiveInternal(std::vector<uint8_t> data);
- static void Receive(void* context, void* data, uint64_t length);
+ static void Receive(void* context, const void* data, uint64_t length);
bool IsOpen();
diff --git a/src/cobalt/media/decoder_buffer_allocator.cc b/src/cobalt/media/decoder_buffer_allocator.cc
index 9515da1..76ba23c 100644
--- a/src/cobalt/media/decoder_buffer_allocator.cc
+++ b/src/cobalt/media/decoder_buffer_allocator.cc
@@ -60,13 +60,8 @@
// We cannot call SbMediaGetMaxBufferCapacity because |video_codec_| is not
// set yet. Use 0 (unbounded) until |video_codec_| is updated in
// UpdateVideoConfig().
- int max_capacity = 0;
- reuse_allocator_.reset(new nb::BidirectionalFitReuseAllocator(
- &fallback_allocator_, initial_capacity_, kSmallAllocationThreshold,
- allocation_unit_, max_capacity));
- DLOG(INFO) << "Allocated " << initial_capacity_
- << " bytes for media buffer pool as its initial buffer, with max"
- << " capacity set to " << max_capacity;
+ starboard::ScopedLock scoped_lock(mutex_);
+ CreateReuseAllocator(0);
}
DecoderBufferAllocator::~DecoderBufferAllocator() {
@@ -84,6 +79,36 @@
}
}
+void DecoderBufferAllocator::Suspend() {
+ if (!using_memory_pool_ || is_memory_pool_allocated_on_demand_) {
+ return;
+ }
+
+ TRACK_MEMORY_SCOPE("Media");
+
+ starboard::ScopedLock scoped_lock(mutex_);
+
+ if (reuse_allocator_ && reuse_allocator_->GetAllocated() == 0) {
+ DLOG(INFO) << "Freed " << reuse_allocator_->GetCapacity()
+ << " bytes of media buffer pool `on suspend`.";
+ reuse_allocator_.reset();
+ }
+}
+
+void DecoderBufferAllocator::Resume() {
+ if (!using_memory_pool_ || is_memory_pool_allocated_on_demand_) {
+ return;
+ }
+
+ TRACK_MEMORY_SCOPE("Media");
+
+ starboard::ScopedLock scoped_lock(mutex_);
+
+ if (!reuse_allocator_) {
+ CreateReuseAllocator(0);
+ }
+}
+
DecoderBuffer::Allocator::Allocations DecoderBufferAllocator::Allocate(
size_t size, size_t alignment, intptr_t context) {
TRACK_MEMORY_SCOPE("Media");
@@ -106,12 +131,7 @@
max_capacity = SbMediaGetMaxBufferCapacity(
video_codec_, resolution_width_, resolution_height_, bits_per_pixel_);
}
- reuse_allocator_.reset(new nb::BidirectionalFitReuseAllocator(
- &fallback_allocator_, initial_capacity_, kSmallAllocationThreshold,
- allocation_unit_, max_capacity));
- DLOG(INFO) << "Allocated " << initial_capacity_
- << " bytes for media buffer pool, with max capacity set to "
- << max_capacity;
+ CreateReuseAllocator(max_capacity);
}
void* p = reuse_allocator_->Allocate(size, alignment);
@@ -217,6 +237,17 @@
resolution_height_, bits_per_pixel_);
}
+void DecoderBufferAllocator::CreateReuseAllocator(int max_capacity) {
+ mutex_.DCheckAcquired();
+
+ reuse_allocator_.reset(new nb::BidirectionalFitReuseAllocator(
+ &fallback_allocator_, initial_capacity_, kSmallAllocationThreshold,
+ allocation_unit_, max_capacity));
+ DLOG(INFO) << "Allocated " << initial_capacity_
+ << " bytes for media buffer pool, with max capacity set to "
+ << max_capacity;
+}
+
bool DecoderBufferAllocator::UpdateAllocationRecord() const {
#if !defined(COBALT_BUILD_TYPE_GOLD)
// This code is not quite multi-thread safe but is safe enough for tracking
diff --git a/src/cobalt/media/decoder_buffer_allocator.h b/src/cobalt/media/decoder_buffer_allocator.h
index e78e6af..67e5352 100644
--- a/src/cobalt/media/decoder_buffer_allocator.h
+++ b/src/cobalt/media/decoder_buffer_allocator.h
@@ -37,6 +37,9 @@
DecoderBufferAllocator();
~DecoderBufferAllocator() override;
+ void Suspend();
+ void Resume();
+
Allocations Allocate(size_t size, size_t alignment,
intptr_t context) override;
void Free(Allocations allocations) override;
@@ -46,6 +49,8 @@
size_t GetMaximumMemoryCapacity() const override;
private:
+ void CreateReuseAllocator(int max_capacity);
+
// Update the Allocation record, and return false if allocation exceeds the
// max buffer capacity, or true otherwise.
bool UpdateAllocationRecord() const;
diff --git a/src/cobalt/media/media_module.cc b/src/cobalt/media/media_module.cc
index 3f6671d..8d4e195 100644
--- a/src/cobalt/media/media_module.cc
+++ b/src/cobalt/media/media_module.cc
@@ -203,6 +203,8 @@
}
}
+ decoder_buffer_allocator_.Suspend();
+
resource_provider_ = NULL;
}
@@ -216,6 +218,8 @@
window = system_window_->GetSbWindow();
}
+ decoder_buffer_allocator_.Resume();
+
for (Players::iterator iter = players_.begin(); iter != players_.end();
++iter) {
DCHECK(!iter->second);
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
index 6862a5e..8e670b6 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
@@ -80,8 +80,7 @@
manager_owned_mutex_(manager_owned_mutex),
is_fallback_family_(family_info.is_fallback_family),
language_(family_info.language),
- page_ranges_(family_info.page_ranges),
- is_character_map_generated_(!is_fallback_family_) {
+ page_ranges_(family_info.page_ranges) {
TRACE_EVENT0("cobalt::renderer",
"SkFontStyleSet_Cobalt::SkFontStyleSet_Cobalt()");
DCHECK(manager_owned_mutex_);
@@ -90,7 +89,6 @@
return;
}
- character_map_ = base::MakeRefCounted<font_character_map::CharacterMap>();
disable_character_map_ = family_info.disable_caching;
family_name_ = family_info.names[0];
@@ -232,7 +230,7 @@
SkFontStyleSetEntry_Cobalt* style = styles_[style_index].get();
// If the typeface doesn't already exist, then attempt to create it.
if (style->typeface == NULL) {
- CreateStreamProviderTypeface(style);
+ CreateStreamProviderTypeface(style, style_index);
// If the creation attempt failed and the typeface is still NULL, then
// remove the entry from the set's styles.
if (style->typeface == NULL) {
@@ -286,7 +284,8 @@
// The character map is lazily generated. Generate it now if it isn't already
// generated.
- if (!is_character_map_generated_) {
+ int style_index = GetClosestStyleIndex(style);
+ if (!character_maps_[style_index]) {
TRACE_EVENT0("cobalt::renderer",
"SkFontStyleSet_Cobalt::ContainsCharacter() and "
"!is_character_map_generated_");
@@ -294,7 +293,6 @@
// it will be removed from the set and, as long as font styles remain in the
// set, the logic will be attempted again.
while (styles_.count() > 0) {
- int style_index = GetClosestStyleIndex(style);
SkFontStyleSetEntry_Cobalt* closest_style = styles_[style_index].get();
SkFileMemoryChunkStreamProvider* stream_provider =
@@ -310,9 +308,11 @@
std::unique_ptr<SkFileMemoryChunkStream> stream(
stream_provider->OpenStream());
- if (GenerateStyleFaceInfo(closest_style, stream.get())) {
- if (CharacterMapContainsCharacter(character)) {
- CreateStreamProviderTypeface(closest_style, stream_provider);
+ if (GenerateStyleFaceInfo(closest_style, stream.get(), style_index)) {
+ if (CharacterMapContainsCharacter(character,
+ character_maps_[style_index])) {
+ CreateStreamProviderTypeface(closest_style, style_index,
+ stream_provider);
return true;
} else {
// If a typeface was not created, destroy the stream and purge any
@@ -329,27 +329,34 @@
styles_.pop_back();
}
- is_character_map_generated_ = true;
}
- return CharacterMapContainsCharacter(character);
+ DCHECK(character_maps_[style_index]);
+ return CharacterMapContainsCharacter(character, character_maps_[style_index]);
}
-bool SkFontStyleSet_Cobalt::CharacterMapContainsCharacter(SkUnichar character) {
- font_character_map::Character c = character_map_->Find(character);
+bool SkFontStyleSet_Cobalt::CharacterMapContainsCharacter(
+ SkUnichar character,
+ const scoped_refptr<font_character_map::CharacterMap>& map) {
+ font_character_map::Character c = map->Find(character);
return c.is_set && c.id > 0;
}
bool SkFontStyleSet_Cobalt::GenerateStyleFaceInfo(
- SkFontStyleSetEntry_Cobalt* style, SkStreamAsset* stream) {
+ SkFontStyleSetEntry_Cobalt* style, SkStreamAsset* stream, int style_index) {
if (style->is_face_info_generated) {
return true;
}
// Providing a pointer to the character map will cause it to be generated
// during ScanFont. Only provide it if it hasn't already been generated.
- font_character_map::CharacterMap* character_map =
- !is_character_map_generated_ ? character_map_.get() : NULL;
+
+ font_character_map::CharacterMap* character_map = NULL;
+ if (!character_maps_[style_index]) {
+ character_maps_[style_index] =
+ base::MakeRefCounted<font_character_map::CharacterMap>();
+ character_map = character_maps_[style_index].get();
+ }
if (!sk_freetype_cobalt::ScanFont(
stream, style->face_index, &style->face_name, &style->font_style,
@@ -358,7 +365,6 @@
}
style->is_face_info_generated = true;
- is_character_map_generated_ = true;
return true;
}
@@ -376,7 +382,7 @@
}
void SkFontStyleSet_Cobalt::CreateStreamProviderTypeface(
- SkFontStyleSetEntry_Cobalt* style_entry,
+ SkFontStyleSetEntry_Cobalt* style_entry, int style_index,
SkFileMemoryChunkStreamProvider* stream_provider /*=NULL*/) {
TRACE_EVENT0("cobalt::renderer",
"SkFontStyleSet_Cobalt::CreateStreamProviderTypeface()");
@@ -388,13 +394,13 @@
std::unique_ptr<SkFileMemoryChunkStream> stream(
stream_provider->OpenStream());
- if (GenerateStyleFaceInfo(style_entry, stream.get())) {
+ if (GenerateStyleFaceInfo(style_entry, stream.get(), style_index)) {
LOG(INFO) << "Scanned font from file: " << style_entry->face_name.c_str()
<< "(" << style_entry->font_style.weight() << ", "
<< style_entry->font_style.width() << ", "
<< style_entry->font_style.slant() << ")";
scoped_refptr<font_character_map::CharacterMap> map =
- disable_character_map_ ? NULL : character_map_;
+ disable_character_map_ ? NULL : character_maps_[style_index];
style_entry->typeface.reset(new SkTypeface_CobaltStreamProvider(
stream_provider, style_entry->face_index, style_entry->font_style,
style_entry->face_is_fixed_pitch, family_name_,
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
index 774a90f..d7ea193 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
@@ -113,14 +113,16 @@
bool ContainsTypeface(const SkTypeface* typeface);
bool ContainsCharacter(const SkFontStyle& style, SkUnichar character);
- bool CharacterMapContainsCharacter(SkUnichar character);
+ bool CharacterMapContainsCharacter(
+ SkUnichar character,
+ const scoped_refptr<font_character_map::CharacterMap>& map);
bool GenerateStyleFaceInfo(SkFontStyleSetEntry_Cobalt* style,
- SkStreamAsset* stream);
+ SkStreamAsset* stream, int style_index);
int GetClosestStyleIndex(const SkFontStyle& pattern);
void CreateStreamProviderTypeface(
- SkFontStyleSetEntry_Cobalt* style,
+ SkFontStyleSetEntry_Cobalt* style, int style_index,
SkFileMemoryChunkStreamProvider* stream_provider = NULL);
// Purge typefaces that are only referenced internally.
@@ -139,8 +141,10 @@
bool disable_character_map_;
// NOTE: The following characters require locking when being accessed.
- bool is_character_map_generated_;
- scoped_refptr<font_character_map::CharacterMap> character_map_;
+ // This map will store one map per style, and can be indexed with the
+ // style_index of each style.
+ std::unordered_map<int, scoped_refptr<font_character_map::CharacterMap>>
+ character_maps_;
SkTArray<sk_sp<SkFontStyleSetEntry_Cobalt>, true> styles_;
diff --git a/src/cobalt/site/docs/gen/cobalt/doc/deep_links.md b/src/cobalt/site/docs/gen/cobalt/doc/deep_links.md
new file mode 100644
index 0000000..c73491f
--- /dev/null
+++ b/src/cobalt/site/docs/gen/cobalt/doc/deep_links.md
@@ -0,0 +1,139 @@
+---
+layout: doc
+title: "Cobalt Deep Links"
+---
+# Cobalt Deep Links
+
+- [Cobalt Deep Links](#cobalt-deep-links)
+ - [Deep Links](#deep-links)
+ - [Web API](#web-api)
+ - [Platform (Starboard) API](#platform-starboard-api)
+ - [Behavior details](#behavior-details)
+## Deep Links
+
+For Cobalt, a deep link is a string that can be sent from the platform to an
+application running in Cobalt. Generally, it can be used as any string value
+signal, but typically deep links are used to specify a view, page, or content
+to be shown by the application. While these strings typically are URI formatted
+values, when deep link strings are received by Cobalt they are forwarded to the
+running application without separate validation or modification.
+
+Applications should interpret received deep links as superseding previous deep
+links. Deep links received by Cobalt in rapid succession are not guaranteed to
+all be delivered to the application. On a busy or slow device, intermediate
+deep links can be dropped before they are delivered to the application.
+
+The startup URL passed to Cobalt determines which application Cobalt will load.
+Web deep links intended as a signal to the application should not be sent to
+Cobalt as a startup URL because that would result in a different application
+being loaded. Since a deep link is a string that may originate from an
+untrusted source on the device, it should not be used directly to determine
+what application Cobalt will load.
+
+Deep links are made visible to applications by Cobalt with a Web API that is
+separate from the Location interface web API. Cobalt will never directly
+navigate as a result of a received deep link, even if the link matches the
+current application location, for example with a query or fragment identifier.
+Applications that wish to navigate as a result of incoming deep links should do
+so explicitly when they are received.
+
+## Web API
+
+The deep link Web API consists of two parts: The
+`h5vcc.runtime.initialDeepLink` property and `h5vcc.runtime.onDeepLink` event
+target.
+
+Applications can read the value of `initialDeepLink`, and/or they can use
+`h5vcc.runtime.onDeepLink.addListener(foo)` to register callback functions to
+be called when deep links are received.
+
+A deep link is considered 'consumed' when it is read from `initialDeepLink`, or
+when it is reported to a callback function registered to `onDeepLink`.
+
+The IDL for this Cobalt specific interface can be found in cobalt/h5vcc, and is
+repeated below.
+
+```
+interface H5vccRuntime {
+ readonly attribute DOMString initialDeepLink;
+ readonly attribute H5vccDeepLinkEventTarget onDeepLink;
+}
+interface H5vccDeepLinkEventTarget {
+ void addListener(H5vccDeepLinkEventCallback callback);
+};
+callback H5vccDeepLinkEventCallback = void(DOMString link);
+interface H5vcc {
+ readonly attribute H5vccRuntime runtime;
+}
+```
+
+## Platform (Starboard) API
+
+Deep links can be passed into Cobalt in two ways:
+ * As the 'Startup Link':
+ * When Cobalt is first started, a deep link can be passed in with the
+ initial event (either `kSbEventTypePreload` or `kSbEventTypeStart`). This
+ can be achieved by calling `Application::SetStartLink` or by using and
+ overload of `Application::Run` that has the 'link_data' parameter to start
+ Cobalt. The value passed in there is then passed into Cobalt via the
+ 'link' member of the SbEventStartData event parameter, constructed in
+ `Application::CreateInitialEvent`.
+ * As a 'Deep Link Event':
+ * At any time while Cobalt is running, it can be sent as the string value
+ passed with a kSbEventTypeLink event. The `Application::Link` method can
+ be called to inject such an event.
+
+On many platforms, the 'Startup Link' value can also be set with the `--link`
+command-line parameter (See `kLinkSwitch` in `Application::Run`).
+
+The `Application` class mentioned above can be found at
+`starboard/shared/starboard/application.cc`.
+
+## Behavior details
+
+Both the 'Startup Link' and 'Deep Link Event' values are treated the same by
+Cobalt: A 'Startup Link' is treated as a 'Deep Link Event' that was received
+immediately at startup. For the application, it is transparent whether a deep
+link was received as a 'Startup Link' or arrived from a 'Deep Link Event'. Deep
+link values of either type are made available as soon as they are known, with
+the same Web API interface.
+
+The most recently received deep link is remembered by Cobalt until it is
+consumed by the application. This includes deep links received by Cobalt while
+the application is still being fetched and loaded, including during page
+redirects or reloads, and after the application is loaded, if it has not
+consumed the deep link.
+
+Deep link values are considered consumed when the application either reads them
+from the `initialDeepLink` attribute or receives them in a callback to an
+`onDeepLink` listener. An application can use either or both reads of
+`initialDeepLink` or `onDeepLink` listeners to consume the most recently
+received deep link value.
+
+Calls to `onDeepLink` listeners are done as soon as deep links are available.
+Specifically, they can be called before `document.onreadystatechange`,
+`document.onload` & `window.onload` event handlers are called. As a result,
+deep link values can be consumed in synchronously loaded JavaScript that
+executes before the `document.onload` event.
+
+Until the first `onDeepLink` listener is added, the `initialDeepLink` property
+will return the most recently received deep link value. When an `onDeepLink`
+listener is added, the `initialDeepLink` value will no longer be updated, even
+when additional deep link events are received subsequently.
+
+An application can decide to never register an `onDeepLink` listener and poll
+the `initialDeepLink` value instead. This will then always return the value of
+the most recently received deep link.
+
+An application can decide to register an `onDeepLink` listener without reading
+the `initialDeepLink` value. Upon registering, the most recently received deep
+link, which may be the 'Startup Link' or from a 'Deep Link Event', will be
+reported to the listener.
+
+If a deep link value is consumed, it will not be made available again if the
+page is navigated (e.g. redirected or reloaded). When a deep link is consumed
+before a page redirect or reload, the deep link will not be repeated later.
+
+If a deep link value is not consumed, it will be made available again if the
+page is navigated (e.g. redirected or reloaded). A deep link will not be lost
+if a page redirect or reload is done without consuming it.
diff --git a/src/cobalt/site/docs/gen/cobalt/doc/memory_tuning.md b/src/cobalt/site/docs/gen/cobalt/doc/memory_tuning.md
index a053b40..44a94b6 100644
--- a/src/cobalt/site/docs/gen/cobalt/doc/memory_tuning.md
+++ b/src/cobalt/site/docs/gen/cobalt/doc/memory_tuning.md
@@ -11,12 +11,6 @@
the memory allocations that will be assigned to the various subsystems in
cobalt.
-As an example, at the cost of performance you can reduce CPU memory on your
-platform by 5MB and GPU memory usage on your platform by 10MB using these
-command line flags:
-
-`cobalt --reduce_cpu_memory_by=5MB --reduce_gpu_memory_by=10MB`
-
Some settings will be "fixed" while others will be "flexible" so that their
memory consumption will scale down for memory constrained platforms.
@@ -24,8 +18,7 @@
**IMPORTANT**
*Setting `--max_cobalt_cpu_usage` and `--max_cobalt_gpu_usage` on the
-command line is a beta feature. When reducing memory, please use
-`--reduce_cpu_memory_by` and `--reduce_gpu_memory_by`.*
+command line is a beta feature.*
### Memory Settings Table ###
@@ -33,33 +26,16 @@
~~~
AutoMem:
-
- SETTING NAME VALUE TYPE SOURCE
- ________________________________________________________________________________
-| | | | | |
-| image_cache_size_in_bytes | 33554432 | 32.0 MB | GPU | AutoSet |
-|______________________________________|_____________|__________|______|_________|
-| | | | | |
-| javascript_gc_threshold_in_bytes | 8388608 | 8.0 MB | CPU | Build |
-|______________________________________|_____________|__________|______|_________|
-| | | | | |
-| misc_cobalt_cpu_size_in_bytes | 124780544 | 119.0 MB | CPU | AutoSet |
-|______________________________________|_____________|__________|______|_________|
-| | | | | |
-| misc_cobalt_gpu_size_in_bytes | 25165824 | 24.0 MB | GPU | AutoSet |
-|______________________________________|_____________|__________|______|_________|
-| | | | | |
-| remote_typeface_cache_size_in_bytes | 4194304 | 4.0 MB | CPU | Build |
-|______________________________________|_____________|__________|______|_________|
-| | | | | |
-| skia_atlas_texture_dimensions | 4096x8192x2 | 64.0 MB | GPU | Build |
-|______________________________________|_____________|__________|______|_________|
-| | | | | |
-| skia_cache_size_in_bytes | 4194304 | 4.0 MB | GPU | Build |
-|______________________________________|_____________|__________|______|_________|
-| | | | | |
-| software_surface_cache_size_in_bytes | N/A | N/A | N/A | N/A |
-|______________________________________|_____________|__________|______|_________|
+ _______________________________________________________________________________
+|SETTING NAME |VALUE | |TYPE |SOURCE |
+| encoded_image_cache_size_in_bytes | 1048576 | 1.0 MB | CPU | Build |
+| image_cache_size_in_bytes | 10485760 | 10.0 MB | GPU | AutoSet |
+| offscreen_target_cache_size_in_bytes | 2097152 | 2.0 MB | GPU | AutoSet |
+| remote_typeface_cache_size_in_bytes | 4194304 | 4.0 MB | CPU | Build |
+| skia_atlas_texture_dimensions | 2048x2048x2 | 8.0 MB | GPU | AutoSet |
+| skia_cache_size_in_bytes | 4194304 | 4.0 MB | GPU | Build |
+| software_surface_cache_size_in_bytes | N/A | N/A | N/A | N/A |
+|______________________________________|_____________|_________|______|_________|
~~~
This table shows the breakdown of how much memory is being allocated to each
@@ -105,8 +81,6 @@
* `AutoSet (Constrained)`
* This value was AutoSet to a default value, but then was reduced in
response to `max_cobalt_cpu_usage` or `max_cobalt_gpu_usage being` set too low.
- This will also trigger in response to `reduce_cpu_memory_by` or
- `reduce_cpu_memory_by` being set. See "Memory Scaling" section below.
### Maximum Memory Table ###
@@ -187,18 +161,6 @@
**TOTAL** value. The memory settings will be scaled down until their consumption is
less than or equal the maximum allowed value **TOTAL**. See also **SETTINGS CONSUME**.
-Another way to scale down the memory size is by passing the flags
-`--reduce_cpu_memory_by=XX` and `--reduce_gpu_memory_by=XX` which will:
-1) Ignore the `--max_cobalt_cpu_usage` and `--max_cobalt_gpu_usage`.
-2) Use the current memory consumption of the settings and then reduce that by
- the amount.
-
-For example, if cobalt uses 160MB of CPU memory then passing in
-`--reduce_cpu_memory_by=10MB` to the command line will attempt to reduce the
-footprint of cobalt by 10MB to 150MB. Note that this reduction is an an attempt,
-and it's possible this attempt will fail if the memory reduction is too aggressive
-or if memory settings have been explicitly set via the build or command line.
-
*Forcing a Memory Setting to be flexible*
If a memory setting is set via a build setting, then it's possible to make it
@@ -269,16 +231,6 @@
* Note that `SbSystemGetTotalGPUMemory()` is optional. If no value exists
for `max_cobalt_gpu_usage` in build/commandline/starboard settings then no
GPU memory checking is performed.
- * `reduce_cpu_memory_by`
- * This setting will trigger CPU memory consumption to be reduced by the amount
- specified. *This overrides the memory scaling behavior of `max_cobalt_cpu_usage`*.
- But this will not affect memory checking of `max_cobalt_cpu_usage` otherwise.
- * Set via command line or else the platform gyp build file.
- * `reduce_cpu_memory_by`
- * This setting will trigger GPU memory consumption to be reduced by the amount
- specified. *This overrides the memory scaling behavior of `max_cobalt_gpu_usage`*.
- But this will not affect memory checking of `max_cobalt_gpu_usage` otherwise.
- * Set via command line or else the platform gyp build file.
#### Memory Setting API ####
@@ -286,10 +238,6 @@
* See documentation *Image cache capacity* in `performance_tuning.md` for what
this setting does.
* Set via command line, or else build system, or else automatically by Cobalt.
- * `javascript_gc_threshold_in_bytes`
- * See documentation *Garbage collection trigger threshold* in `performance_tuning.md`
- for what this setting does.
- * Set via command line, or else build system, or else automatically by Cobalt.
* `remote_typeface_cache_size_in_bytes`
* Determines the capacity of the remote typefaces cache which manages all typefaces
downloaded from a web page.
diff --git a/src/cobalt/updater/configurator.cc b/src/cobalt/updater/configurator.cc
index d26d9a4..4c3b6cf 100644
--- a/src/cobalt/updater/configurator.cc
+++ b/src/cobalt/updater/configurator.cc
@@ -29,14 +29,7 @@
// Default time constants.
const int kDelayOneMinute = 60;
const int kDelayOneHour = kDelayOneMinute * 60;
-
-#if defined(COBALT_BUILD_TYPE_DEBUG) || defined(COBALT_BUILD_TYPE_DEVEL)
-const char kDefaultUpdaterChannel[] = "dev";
-#elif defined(COBALT_BUILD_TYPE_QA)
-const char kDefaultUpdaterChannel[] = "qa";
-#elif defined(COBALT_BUILD_TYPE_GOLD)
const char kDefaultUpdaterChannel[] = "prod";
-#endif
std::string GetDeviceProperty(SbSystemPropertyId id) {
const size_t kSystemPropertyMaxLength = 1024;
diff --git a/src/cobalt/updater/updater_module.cc b/src/cobalt/updater/updater_module.cc
index 2cf09b5..e2e4001 100644
--- a/src/cobalt/updater/updater_module.cc
+++ b/src/cobalt/updater/updater_module.cc
@@ -67,12 +67,21 @@
return kCobaltExtensionUpdaterNotificationStateDownloaded;
case ComponentState::kUpdating:
return kCobaltExtensionUpdaterNotificationStateInstalling;
+#if SB_API_VERSION > 13
+ case ComponentState::kUpdated:
+ return kCobaltExtensionUpdaterNotificationStateUpdated;
+ case ComponentState::kUpToDate:
+ return kCobaltExtensionUpdaterNotificationStateUpToDate;
+ case ComponentState::kUpdateError:
+ return kCobaltExtensionUpdaterNotificationStateUpdateFailed;
+#else
case ComponentState::kUpdated:
return kCobaltExtensionUpdaterNotificationStatekUpdated;
case ComponentState::kUpToDate:
- return kCobaltExtensionUpdaterNotificationStatekUpdated;
+ return kCobaltExtensionUpdaterNotificationStatekUpToDate;
case ComponentState::kUpdateError:
return kCobaltExtensionUpdaterNotificationStatekUpdateFailed;
+#endif
default:
return kCobaltExtensionUpdaterNotificationStateNone;
}
diff --git a/src/components/update_client/component.cc b/src/components/update_client/component.cc
index d9158fc..8b4fa5d 100644
--- a/src/components/update_client/component.cc
+++ b/src/components/update_client/component.cc
@@ -333,6 +333,7 @@
#if defined(STARBOARD)
void Component::Cancel() {
DCHECK(thread_checker_.CalledOnValidThread());
+ is_cancelled_ = true;
state_->Cancel();
}
#endif
@@ -447,7 +448,16 @@
void Component::NotifyObservers(UpdateClient::Observer::Events event) const {
DCHECK(thread_checker_.CalledOnValidThread());
+
+#if defined(STARBOARD)
+ if (!is_cancelled_) {
+ update_context_.notify_observers_callback.Run(event, id_);
+ } else {
+ LOG(WARNING) << "Component::NotifyObservers: skip callback";
+ }
+#else
update_context_.notify_observers_callback.Run(event, id_);
+#endif
}
base::TimeDelta Component::GetUpdateDuration() const {
@@ -1023,7 +1033,6 @@
const auto& update_context = component.update_context_;
DCHECK(component.crx_component());
-
component.NotifyObservers(Events::COMPONENT_UPDATE_READY);
base::CreateSequencedTaskRunnerWithTraits(kTaskTraits)
@@ -1043,6 +1052,7 @@
component.crx_component()->crx_format_requirement,
base::BindOnce(&Component::StateUpdating::InstallComplete,
base::Unretained(this))));
+
}
void Component::StateUpdating::InstallComplete(ErrorCategory error_category,
diff --git a/src/components/update_client/component.h b/src/components/update_client/component.h
index 83b8a35..4944204 100644
--- a/src/components/update_client/component.h
+++ b/src/components/update_client/component.h
@@ -133,6 +133,9 @@
std::vector<base::Value> GetEvents() const;
private:
+#if defined(STARBOARD)
+ bool is_cancelled_ = false;
+#endif
friend class MockPingManagerImpl;
friend class UpdateCheckerTest;
diff --git a/src/components/update_client/update_engine.cc b/src/components/update_client/update_engine.cc
index 9e39a0f..2dbfb0f 100644
--- a/src/components/update_client/update_engine.cc
+++ b/src/components/update_client/update_engine.cc
@@ -200,6 +200,13 @@
return;
}
+#if defined(STARBOARD)
+ if (is_cancelled_) {
+ LOG(WARNING) << "UpdateEngine::ComponentCheckingForUpdatesStart cancelled";
+ return;
+ }
+#endif
+
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&UpdateEngine::DoUpdateCheck,
base::Unretained(this), update_context));
@@ -379,8 +386,16 @@
next_update_delay);
next_update_delay = base::TimeDelta();
- notify_observers_callback_.Run(
+#if defined(STARBOARD)
+ if (!is_cancelled_) {
+ notify_observers_callback_.Run(UpdateClient::Observer::Events::COMPONENT_WAIT, id);
+ } else {
+ LOG(WARNING) << "UpdateEngine::HandleComponent skip NotifyObservers";
+ }
+#else
+ notify_observers_callback_.Run(
UpdateClient::Observer::Events::COMPONENT_WAIT, id);
+#endif
return;
}
@@ -409,8 +424,18 @@
update_context->next_update_delay = component->GetUpdateDuration();
if (!component->events().empty()) {
+#if defined(STARBOARD)
+ if (!is_cancelled_) {
+ ping_manager_->SendPing(*component,
+ base::BindOnce([](int, const std::string&) {}));
+
+ } else {
+ LOG(WARNING) << "UpdateEngine::HandleComponentComplete skip SendPing";
+ }
+#else
ping_manager_->SendPing(*component,
base::BindOnce([](int, const std::string&) {}));
+#endif
}
queue.pop();
@@ -475,7 +500,7 @@
void UpdateEngine::Cancel(const std::string& update_context_session_id,
const std::vector<std::string>& crx_component_ids) {
LOG(INFO) << "UpdateEngine::Cancel";
-
+ is_cancelled_ = true;
if (ping_manager_.get()) {
ping_manager_->Cancel();
}
diff --git a/src/components/update_client/update_engine.h b/src/components/update_client/update_engine.h
index 1cd0ac9..1bf1cd7 100644
--- a/src/components/update_client/update_engine.h
+++ b/src/components/update_client/update_engine.h
@@ -134,6 +134,9 @@
// update protocol. See the comments for X-Retry-After header.
base::TimeTicks throttle_updates_until_;
+#if defined(STARBOARD)
+ bool is_cancelled_ = false;
+#endif
DISALLOW_COPY_AND_ASSIGN(UpdateEngine);
};
diff --git a/src/components/update_client/url_fetcher_downloader.cc b/src/components/update_client/url_fetcher_downloader.cc
index b5c13cc..4536da6 100644
--- a/src/components/update_client/url_fetcher_downloader.cc
+++ b/src/components/update_client/url_fetcher_downloader.cc
@@ -92,6 +92,11 @@
#if defined(STARBOARD)
void UrlFetcherDownloader::ConfirmSlot(const GURL& url) {
LOG(INFO) << "UrlFetcherDownloader::ConfirmSlot: url=" << url;
+ if (is_cancelled_) {
+ LOG(ERROR) << "UrlFetcherDownloader::ConfirmSlot: Download already cancelled";
+ ReportDownloadFailure(url);
+ return;
+ }
if (!cobalt_slot_management_.ConfirmSlot(download_dir_)) {
ReportDownloadFailure(url, CrxDownloaderError::SLOT_UNAVAILABLE);
return;
@@ -104,6 +109,11 @@
void UrlFetcherDownloader::SelectSlot(const GURL& url) {
LOG(INFO) << "UrlFetcherDownloader::SelectSlot: url=" << url;
+ if (is_cancelled_) {
+ LOG(ERROR) << "UrlFetcherDownloader::SelectSlot: Download already cancelled";
+ ReportDownloadFailure(url);
+ return;
+ }
if (!cobalt_slot_management_.SelectSlot(&download_dir_)) {
ReportDownloadFailure(url, CrxDownloaderError::SLOT_UNAVAILABLE);
return;
@@ -125,7 +135,11 @@
#if defined(STARBOARD)
LOG(INFO) << "UrlFetcherDownloader::DoStartDownload";
-
+ if (is_cancelled_) {
+ LOG(ERROR) << "UrlFetcherDownloader::DoStartDownload: Download already cancelled";
+ ReportDownloadFailure(url);
+ return;
+ }
const CobaltExtensionInstallationManagerApi* installation_api =
static_cast<const CobaltExtensionInstallationManagerApi*>(
SbSystemGetExtension(kCobaltExtensionInstallationManagerName));
@@ -155,6 +169,7 @@
void UrlFetcherDownloader::DoCancelDownload() {
LOG(INFO) << "UrlFetcherDownloader::DoCancelDownload";
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ is_cancelled_ = true;
if (network_fetcher_.get()) {
network_fetcher_->Cancel();
}
@@ -208,6 +223,11 @@
#if defined(STARBOARD)
LOG(INFO) << "UrlFetcherDownloader::StartURLFetch: url" << url
<< " download_dir=" << download_dir_;
+ if (is_cancelled_) {
+ LOG(ERROR) << "UrlFetcherDownloader::StartURLFetch: Download already cancelled";
+ ReportDownloadFailure(url);
+ return;
+ }
#endif
if (download_dir_.empty()) {
diff --git a/src/components/update_client/url_fetcher_downloader.h b/src/components/update_client/url_fetcher_downloader.h
index 3880efc..3adc4c2 100644
--- a/src/components/update_client/url_fetcher_downloader.h
+++ b/src/components/update_client/url_fetcher_downloader.h
@@ -82,6 +82,7 @@
#if defined(STARBOARD)
CobaltSlotManagement cobalt_slot_management_;
scoped_refptr<Configurator> config_;
+ bool is_cancelled_ = false;
#endif
DISALLOW_COPY_AND_ASSIGN(UrlFetcherDownloader);
diff --git a/src/starboard/android/apk/app/src/main/java/dev/cobalt/coat/MediaPlaybackService.java b/src/starboard/android/apk/app/src/main/java/dev/cobalt/coat/MediaPlaybackService.java
index 1b54143..e24faf6 100644
--- a/src/starboard/android/apk/app/src/main/java/dev/cobalt/coat/MediaPlaybackService.java
+++ b/src/starboard/android/apk/app/src/main/java/dev/cobalt/coat/MediaPlaybackService.java
@@ -40,13 +40,14 @@
@Override
public void onCreate() {
- super.onCreate();
- Log.i(TAG, "Creating a Media playback foreground service.");
if (getStarboardBridge() == null) {
Log.e(TAG, "StarboardBridge already destroyed.");
return;
}
+ Log.i(TAG, "Creating a Media playback foreground service.");
+ super.onCreate();
getStarboardBridge().onServiceStart(this);
+ createNotificationChannel();
}
@Override
@@ -69,13 +70,12 @@
Log.e(TAG, "StarboardBridge already destroyed.");
return;
}
+ Log.i(TAG, "Destroying the Media playback service.");
getStarboardBridge().onServiceDestroy(this);
super.onDestroy();
- Log.i(TAG, "Destroying the Media playback service.");
}
public void startService() {
- createChannel();
try {
startForeground(NOTIFICATION_ID, buildNotification());
} catch (IllegalStateException e) {
@@ -84,25 +84,15 @@
}
public void stopService() {
- // Do not remove notification here.
- stopForeground(false);
+ // Let service itself handle notification deletion.
+ stopForeground(true);
stopSelf();
- // Delete notification after foreground stopped.
- deleteChannel();
- hideNotification();
}
- private void hideNotification() {
- Log.i(TAG, "Hiding notification after stopped the service");
- NotificationManager notificationManager =
- (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
- notificationManager.cancel(NOTIFICATION_ID);
- }
-
- private void createChannel() {
+ private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= 26) {
try {
- createChannelInternalV26();
+ createNotificationChannelInternalV26();
} catch (RemoteException e) {
Log.e(TAG, "Failed to create Notification Channel.", e);
}
@@ -110,7 +100,7 @@
}
@RequiresApi(26)
- private void createChannelInternalV26() throws RemoteException {
+ private void createNotificationChannelInternalV26() throws RemoteException {
NotificationManager notificationManager =
(NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel =
@@ -122,19 +112,6 @@
notificationManager.createNotificationChannel(channel);
}
- public void deleteChannel() {
- if (Build.VERSION.SDK_INT >= 26) {
- deleteChannelInternalV26();
- }
- }
-
- @RequiresApi(26)
- private void deleteChannelInternalV26() {
- NotificationManager notificationManager =
- (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
- notificationManager.deleteNotificationChannel(NOTIFICATION_CHANNEL_ID);
- }
-
Notification buildNotification() {
NotificationCompat.Builder builder =
new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
diff --git a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java
index 4a95898..a310b15 100644
--- a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java
+++ b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java
@@ -232,16 +232,20 @@
wakeLock(playbackState == PLAYBACK_STATE_PLAYING);
audioFocus(playbackState == PLAYBACK_STATE_PLAYING);
- boolean activating = true;
- boolean deactivating = false;
+ boolean activating = playbackState != PLAYBACK_STATE_NONE;
+ boolean deactivating = playbackState == PLAYBACK_STATE_NONE;
if (mediaSession != null) {
- activating = playbackState != PLAYBACK_STATE_NONE && !mediaSession.isActive();
- deactivating = playbackState == PLAYBACK_STATE_NONE && mediaSession.isActive();
+ activating = activating && !mediaSession.isActive();
+ deactivating = deactivating && mediaSession.isActive();
}
if (activating) {
// Resuming or new playbacks land here.
setMediaSession();
}
+ if (mediaSession == null) {
+ Log.i(TAG, "MediaSession already released");
+ return;
+ }
mediaSession.setActive(playbackState != PLAYBACK_STATE_NONE);
if (lifecycleCallback != null) {
lifecycleCallback.onMediaSessionLifecycle(
diff --git a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoFrameReleaseTimeHelper.java b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoFrameReleaseTimeHelper.java
index 6afac46..622e92b 100644
--- a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoFrameReleaseTimeHelper.java
+++ b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoFrameReleaseTimeHelper.java
@@ -35,12 +35,10 @@
import android.view.Choreographer;
import android.view.Choreographer.FrameCallback;
import android.view.Display;
-import androidx.annotation.RequiresApi;
import dev.cobalt.util.DisplayUtil;
import dev.cobalt.util.UsedByNative;
/** Makes a best effort to adjust frame release timestamps for a smoother visual result. */
-@RequiresApi(16)
@SuppressWarnings("unused")
@UsedByNative
public final class VideoFrameReleaseTimeHelper {
diff --git a/src/starboard/android/shared/BUILD.gn b/src/starboard/android/shared/BUILD.gn
index 3cf4157..dd4f76a 100644
--- a/src/starboard/android/shared/BUILD.gn
+++ b/src/starboard/android/shared/BUILD.gn
@@ -223,7 +223,6 @@
"//starboard/shared/starboard/media/media_get_buffer_storage_type.cc",
"//starboard/shared/starboard/media/media_get_progressive_buffer_budget.cc",
"//starboard/shared/starboard/media/media_get_video_buffer_budget.cc",
- "//starboard/shared/starboard/media/media_is_buffer_pool_allocate_on_demand.cc",
"//starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc",
"//starboard/shared/starboard/media/mime_type.cc",
"//starboard/shared/starboard/media/mime_type.h",
@@ -360,6 +359,7 @@
"media_get_initial_buffer_capacity.cc",
"media_get_max_buffer_capacity.cc",
"media_is_audio_supported.cc",
+ "media_is_buffer_pool_allocate_on_demand.cc",
"media_is_video_supported.cc",
"microphone_impl.cc",
"network_status_impl.cc",
diff --git a/src/starboard/android/shared/audio_track_audio_sink_type.cc b/src/starboard/android/shared/audio_track_audio_sink_type.cc
index 57e9aed..6af4aa6 100644
--- a/src/starboard/android/shared/audio_track_audio_sink_type.cc
+++ b/src/starboard/android/shared/audio_track_audio_sink_type.cc
@@ -167,11 +167,7 @@
SB_LOG(INFO) << "AudioTrackAudioSink thread started.";
int accumulated_written_frames = 0;
- // TODO: |last_playback_head_changed_at| is also reset when a warning is
- // logged after the playback head position hasn't been updated for a
- // while. We should refine the name to make it better reflect its
- // usage.
- SbTime last_playback_head_changed_at = -1;
+ SbTime last_playback_head_event_at = -1;
SbTime playback_head_not_changed_duration = 0;
SbTime last_written_succeeded_at = -1;
@@ -197,21 +193,21 @@
playback_head_position - last_playback_head_position_;
SbTime now = SbTimeGetMonotonicNow();
- if (last_playback_head_changed_at == -1) {
- last_playback_head_changed_at = now;
+ if (last_playback_head_event_at == -1) {
+ last_playback_head_event_at = now;
}
if (last_playback_head_position_ == playback_head_position) {
- SbTime elapsed = now - last_playback_head_changed_at;
+ SbTime elapsed = now - last_playback_head_event_at;
if (elapsed > 5 * kSbTimeSecond) {
playback_head_not_changed_duration += elapsed;
- last_playback_head_changed_at = now;
+ last_playback_head_event_at = now;
SB_LOG(INFO) << "last playback head position is "
<< last_playback_head_position_
<< " and it hasn't been updated for " << elapsed
<< " microseconds.";
}
} else {
- last_playback_head_changed_at = now;
+ last_playback_head_event_at = now;
playback_head_not_changed_duration = 0;
}
@@ -243,7 +239,7 @@
bridge_.Pause();
} else if (!was_playing && is_playing) {
was_playing = true;
- last_playback_head_changed_at = -1;
+ last_playback_head_event_at = -1;
playback_head_not_changed_duration = 0;
last_written_succeeded_at = -1;
bridge_.Play();
diff --git a/src/starboard/android/shared/media_decoder.cc b/src/starboard/android/shared/media_decoder.cc
index d6c7f71..44095f7 100644
--- a/src/starboard/android/shared/media_decoder.cc
+++ b/src/starboard/android/shared/media_decoder.cc
@@ -170,6 +170,10 @@
SB_DCHECK(!error_cb_);
error_cb_ = error_cb;
+
+ if (error_occurred_) {
+ Schedule(std::bind(error_cb_, error_, error_message_));
+ }
}
void MediaDecoder::WriteInputBuffer(
@@ -445,7 +449,7 @@
" greater than |byte_buffer.capacity()| (%d).",
size, static_cast<int>(byte_buffer.capacity()));
SB_LOG(ERROR) << error_message;
- error_cb_(kSbPlayerErrorDecode, error_message);
+ ReportError(kSbPlayerErrorDecode, error_message);
return false;
}
byte_buffer.CopyInto(data, size);
@@ -512,13 +516,13 @@
drm_system_->OnInsufficientOutputProtection();
} else {
if (media_type_ == kSbMediaTypeAudio) {
- error_cb_(kSbPlayerErrorDecode,
- FormatString("%s failed with status %d (audio).", action_name,
- status));
+ ReportError(kSbPlayerErrorDecode,
+ FormatString("%s failed with status %d (audio).", action_name,
+ status));
} else {
- error_cb_(kSbPlayerErrorDecode,
- FormatString("%s failed with status %d (video).", action_name,
- status));
+ ReportError(kSbPlayerErrorDecode,
+ FormatString("%s failed with status %d (video).", action_name,
+ status));
}
}
@@ -532,6 +536,24 @@
}
}
+void MediaDecoder::ReportError(const SbPlayerError error,
+ const std::string error_message) {
+ if (!BelongsToCurrentThread()) {
+ Schedule(std::bind(&MediaDecoder::ReportError, this, error, error_message));
+ return;
+ }
+ if (error_occurred_) {
+ // Avoid to report error multiple times.
+ return;
+ }
+ error_occurred_ = true;
+ error_ = error;
+ error_message_ = error_message;
+ if (error_cb_) {
+ error_cb_(error_, error_message_);
+ }
+}
+
void MediaDecoder::OnMediaCodecError(bool is_recoverable,
bool is_transient,
const std::string& diagnostic_info) {
@@ -539,16 +561,17 @@
<< (is_recoverable ? "recoverable, " : "unrecoverable, ")
<< (is_transient ? "transient " : "intransient ")
<< " error with message: " << diagnostic_info;
-
+ // The callback may be called on a different thread and before |error_cb_| is
+ // initialized.
if (!is_transient) {
if (media_type_ == kSbMediaTypeAudio) {
- error_cb_(kSbPlayerErrorDecode,
- "OnMediaCodecError (audio): " + diagnostic_info +
- (is_recoverable ? ", recoverable " : ", unrecoverable "));
+ ReportError(kSbPlayerErrorDecode,
+ "OnMediaCodecError (audio): " + diagnostic_info +
+ (is_recoverable ? ", recoverable " : ", unrecoverable "));
} else {
- error_cb_(kSbPlayerErrorDecode,
- "OnMediaCodecError (video): " + diagnostic_info +
- (is_recoverable ? ", recoverable " : ", unrecoverable "));
+ ReportError(kSbPlayerErrorDecode,
+ "OnMediaCodecError (video): " + diagnostic_info +
+ (is_recoverable ? ", recoverable " : ", unrecoverable "));
}
}
}
diff --git a/src/starboard/android/shared/media_decoder.h b/src/starboard/android/shared/media_decoder.h
index 569036a..423d6ac 100644
--- a/src/starboard/android/shared/media_decoder.h
+++ b/src/starboard/android/shared/media_decoder.h
@@ -32,6 +32,7 @@
#include "starboard/shared/internal_only.h"
#include "starboard/shared/starboard/player/filter/common.h"
#include "starboard/shared/starboard/player/input_buffer_internal.h"
+#include "starboard/shared/starboard/player/job_queue.h"
#include "starboard/shared/starboard/thread_checker.h"
namespace starboard {
@@ -40,7 +41,9 @@
// TODO: Better encapsulation the MediaCodecBridge so the decoders no longer
// need to talk directly to the MediaCodecBridge.
-class MediaDecoder : private MediaCodecBridge::Handler {
+class MediaDecoder
+ : private MediaCodecBridge::Handler,
+ protected ::starboard::shared::starboard::player::JobQueue::JobOwner {
public:
typedef ::starboard::shared::starboard::player::filter::ErrorCB ErrorCB;
typedef ::starboard::shared::starboard::player::InputBuffer InputBuffer;
@@ -143,6 +146,7 @@
bool ProcessOneInputBuffer(std::deque<Event>* pending_tasks,
std::vector<int>* input_buffer_indices);
void HandleError(const char* action_name, jint status);
+ void ReportError(const SbPlayerError error, const std::string error_message);
// MediaCodecBridge::Handler methods
// Note that these methods are called from the default looper and is not on
@@ -169,6 +173,10 @@
ErrorCB error_cb_;
+ bool error_occurred_ = false;
+ SbPlayerError error_;
+ std::string error_message_;
+
atomic_bool stream_ended_;
atomic_bool destroying_;
diff --git a/src/starboard/android/shared/media_is_buffer_pool_allocate_on_demand.cc b/src/starboard/android/shared/media_is_buffer_pool_allocate_on_demand.cc
new file mode 100644
index 0000000..3fc0676
--- /dev/null
+++ b/src/starboard/android/shared/media_is_buffer_pool_allocate_on_demand.cc
@@ -0,0 +1,20 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/media.h"
+
+bool SbMediaIsBufferPoolAllocateOnDemand() {
+ // Minimize fragmentation by always having the media buffer pool allocated.
+ return false;
+}
diff --git a/src/starboard/android/shared/starboard_platform.gypi b/src/starboard/android/shared/starboard_platform.gypi
index e8579cb..95f0ba0 100644
--- a/src/starboard/android/shared/starboard_platform.gypi
+++ b/src/starboard/android/shared/starboard_platform.gypi
@@ -141,6 +141,7 @@
'media_get_initial_buffer_capacity.cc',
'media_get_max_buffer_capacity.cc',
'media_is_audio_supported.cc',
+ 'media_is_buffer_pool_allocate_on_demand.cc',
'media_is_video_supported.cc',
'network_status_impl.cc',
'microphone_impl.cc',
@@ -401,7 +402,6 @@
'<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_storage_type.cc',
'<(DEPTH)/starboard/shared/starboard/media/media_get_progressive_buffer_budget.cc',
'<(DEPTH)/starboard/shared/starboard/media/media_get_video_buffer_budget.cc',
- '<(DEPTH)/starboard/shared/starboard/media/media_is_buffer_pool_allocate_on_demand.cc',
'<(DEPTH)/starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc',
'<(DEPTH)/starboard/shared/starboard/media/mime_type.cc',
'<(DEPTH)/starboard/shared/starboard/media/mime_type.h',
diff --git a/src/starboard/evergreen/testing/shared/cycle_cobalt.sh b/src/starboard/evergreen/testing/shared/cycle_cobalt.sh
index 9b26cf7..40ed24c 100755
--- a/src/starboard/evergreen/testing/shared/cycle_cobalt.sh
+++ b/src/starboard/evergreen/testing/shared/cycle_cobalt.sh
@@ -78,7 +78,7 @@
URL="${1}"
LOG="${2}"
PAT="${3}"
- ARGS="${4}"
+ ARGS="--min_log_level=info ${4}"
start_cobalt "${URL}" "${LOG}" LOADER "${ARGS}"
diff --git a/src/starboard/evergreen/testing/tests/test.html b/src/starboard/evergreen/testing/tests/test.html
index c1772d2..e53f706 100644
--- a/src/starboard/evergreen/testing/tests/test.html
+++ b/src/starboard/evergreen/testing/tests/test.html
@@ -31,7 +31,7 @@
return;
}
- if (currentChannel == "qa") {
+ if (currentChannel == "prod") {
window.h5vcc.updater.setUpdaterChannel(targetChannel);
console.log("channel was changed to " + targetChannel);
return;
diff --git a/src/starboard/nplb/media_can_play_mime_and_key_system_test.cc b/src/starboard/nplb/media_can_play_mime_and_key_system_test.cc
index 4c7457c..3d5317c 100644
--- a/src/starboard/nplb/media_can_play_mime_and_key_system_test.cc
+++ b/src/starboard/nplb/media_can_play_mime_and_key_system_test.cc
@@ -15,7 +15,9 @@
#include "starboard/common/string.h"
#include "starboard/media.h"
#include "starboard/nplb/drm_helpers.h"
+#include "starboard/nplb/media_can_play_mime_and_key_system_test_helpers.h"
#include "starboard/nplb/performance_helpers.h"
+#include "starboard/time.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace starboard {
@@ -789,9 +791,35 @@
}
TEST(SbMediaCanPlayMimeAndKeySystem, ValidatePerformance) {
- TEST_PERF_FUNCWITHARGS_DEFAULT(
- SbMediaCanPlayMimeAndKeySystem,
- "video/webm; codecs=\"vp9\"; width=256; height=144; framerate=30", "");
+ auto test_sequential_function_calls =
+ [](const char** mime_params, int num_function_calls,
+ SbTimeMonotonic max_time_delta, const char* query_type) {
+ const SbTimeMonotonic time_start = SbTimeGetMonotonicNow();
+ for (int i = 0; i < num_function_calls; ++i) {
+ SbMediaCanPlayMimeAndKeySystem(mime_params[i], "");
+ }
+ const SbTimeMonotonic time_last = SbTimeGetMonotonicNow();
+ const SbTimeMonotonic time_delta = time_last - time_start;
+ const double time_per_call =
+ static_cast<double>(time_delta) / num_function_calls;
+
+ SB_LOG(INFO) << "SbMediaCanPlayMimeAndKeySystem - " << query_type
+ << " measured duration " << time_delta
+ << "us total across " << num_function_calls << " calls.";
+ SB_LOG(INFO) << " Measured duration " << time_per_call
+ << "us average per call.";
+ EXPECT_LE(time_delta, max_time_delta);
+ };
+
+ test_sequential_function_calls(kSdrQueryParams,
+ SB_ARRAY_SIZE_INT(kSdrQueryParams),
+ 10 * kSbTimeMillisecond, "SDR queries");
+ test_sequential_function_calls(kHdrQueryParams,
+ SB_ARRAY_SIZE_INT(kHdrQueryParams),
+ 20 * kSbTimeMillisecond, "HDR queries");
+ test_sequential_function_calls(kDrmQueryParams,
+ SB_ARRAY_SIZE_INT(kDrmQueryParams),
+ 50 * kSbTimeMillisecond, "DRM queries");
}
} // namespace
diff --git a/src/starboard/nplb/media_can_play_mime_and_key_system_test_helpers.h b/src/starboard/nplb/media_can_play_mime_and_key_system_test_helpers.h
new file mode 100644
index 0000000..544961b
--- /dev/null
+++ b/src/starboard/nplb/media_can_play_mime_and_key_system_test_helpers.h
@@ -0,0 +1,363 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_NPLB_MEDIA_CAN_PLAY_MIME_AND_KEY_SYSTEM_TEST_HELPERS_H_
+#define STARBOARD_NPLB_MEDIA_CAN_PLAY_MIME_AND_KEY_SYSTEM_TEST_HELPERS_H_
+
+namespace starboard {
+namespace nplb {
+
+// Query params from https://youtu.be/iXvy8ZeCs5M.
+static const char* kSdrQueryParams[] = {
+ "video/mp4; codecs=\"avc1.42001E\"",
+ "audio/mp4; codecs=\"mp4a.40.2\"",
+ "video/webm; codecs=\"vp09.02.51.10.01.09.16.09.00\"",
+ "video/webm; codecs=\"vp09.02.51.10.01.09.99.99.00\"",
+ "audio/webm; codecs=\"opus\"",
+ "audio/webm; codecs=\"opus\"; channels=2",
+ "audio/webm; codecs=\"opus\"; channels=99",
+ "video/mp4; codecs=av01.0.05M.08",
+ "video/webm; codecs=\"vp9\"",
+ "video/webm; codecs=\"vp9\"; width=640",
+ "video/webm; codecs=\"vp9\"; width=99999",
+ "video/webm; codecs=\"vp9\"",
+ "video/webm; codecs=\"vp9\"; height=360",
+ "video/webm; codecs=\"vp9\"; height=99999",
+ "video/webm; codecs=\"vp9\"",
+ "video/webm; codecs=\"vp9\"; framerate=30",
+ "video/webm; codecs=\"vp9\"; framerate=9999",
+ "video/webm; codecs=\"vp9\"; width=3840; height=2160; bitrate=2000000",
+ "video/webm; codecs=\"vp9\"; width=3840; height=2160; bitrate=20000000",
+ "video/webm; codecs=\"vp9\"",
+ "video/webm; codecs=\"vp9\"; bitrate=300000",
+ "video/webm; codecs=\"vp9\"; bitrate=2000000000",
+ "video/mp4; codecs=\"avc1.4d4015\"; width=426; height=240; framerate=24; "
+ "bitrate=233713",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=640; height=360; framerate=24; "
+ "bitrate=422012",
+ "audio/mp4; codecs=\"mp4a.40.2\"; channels=2",
+ "video/mp4; codecs=\"avc1.4d400c\"; width=256; height=144; framerate=24; "
+ "bitrate=110487",
+ "video/webm; codecs=\"vp9\"",
+ "video/webm; codecs=\"vp9\"; eotf=bt709",
+ "video/webm; codecs=\"vp9\"; eotf=catavision",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=426; "
+ "height=240; framerate=24; bitrate=191916; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=640; "
+ "height=360; framerate=24; bitrate=400973; eotf=bt709",
+ "audio/webm; codecs=\"opus\"; channels=2",
+ "audio/webm; codecs=\"opus\"; channels=2",
+ "video/mp4; codecs=\"av01.0.00M.08\"; width=256; height=144; framerate=24; "
+ "bitrate=76146; eotf=bt709",
+ "video/mp4; codecs=\"av01.0.00M.08\"; width=426; height=240; framerate=24; "
+ "bitrate=156234; eotf=bt709",
+ "video/mp4; codecs=\"av01.0.01M.08\"; width=640; height=360; framerate=24; "
+ "bitrate=302046; eotf=bt709",
+ "audio/webm; codecs=\"opus\"",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\""};
+
+// Query params from https://youtu.be/1La4QzGeaaQ.
+static const char* kHdrQueryParams[] = {
+ "video/webm; codecs=\"vp09.02.51.10.01.09.16.09.00\"",
+ "video/webm; codecs=\"vp09.02.51.10.01.09.99.99.00\"",
+ "audio/webm; codecs=\"opus\"",
+ "audio/webm; codecs=\"opus\"; channels=2",
+ "audio/webm; codecs=\"opus\"; channels=99",
+ "video/mp4; codecs=av01.0.05M.08",
+ "video/mp4; codecs=av99.0.05M.08",
+ "video/webm; codecs=\"vp9\"",
+ "video/webm; codecs=\"vp9\"; height=360",
+ "video/webm; codecs=\"vp9\"; height=99999",
+ "video/webm; codecs=\"vp9\"; width=3840; height=2160; bitrate=2000000",
+ "video/webm; codecs=\"vp9\"",
+ "video/webm; codecs=\"vp9\"; bitrate=300000",
+ "video/webm; codecs=\"vp9\"; bitrate=2000000000",
+ "video/webm; codecs=\"vp9\"",
+ "video/webm; codecs=\"vp9\"; width=640",
+ "video/webm; codecs=\"vp9\"; width=99999",
+ "video/webm; codecs=\"vp9\"",
+ "video/webm; codecs=\"vp9\"; framerate=30",
+ "video/webm; codecs=\"vp9\"; framerate=9999",
+ "video/mp4; codecs=\"avc1.4d4015\"; width=426; height=240; framerate=30; "
+ "bitrate=296736",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=640; height=360; framerate=30; "
+ "bitrate=700126",
+ "video/mp4; codecs=\"avc1.4d401f\"; width=854; height=480; framerate=30; "
+ "bitrate=1357113",
+ "video/mp4; codecs=\"avc1.4d401f\"; width=1280; height=720; framerate=30; "
+ "bitrate=2723992",
+ "audio/mp4; codecs=\"mp4a.40.2\"; channels=2",
+ "video/mp4; codecs=\"avc1.4d400c\"; width=256; height=144; framerate=30; "
+ "bitrate=123753",
+ "video/webm; codecs=\"vp9\"",
+ "video/webm; codecs=\"vp9\"; eotf=bt709",
+ "video/webm; codecs=\"vp9\"; eotf=catavision",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=426; "
+ "height=240; framerate=30; bitrate=202710; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=640; "
+ "height=360; framerate=30; bitrate=427339; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=854; "
+ "height=480; framerate=30; bitrate=782821; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1280; "
+ "height=720; framerate=30; bitrate=1542503; eotf=bt709",
+ "audio/webm; codecs=\"opus\"; channels=2",
+ "audio/webm; codecs=\"opus\"; channels=2",
+ "video/mp4; codecs=\"avc1.4d4020\"; width=1280; height=720; framerate=60; "
+ "bitrate=3488936",
+ "video/mp4; codecs=\"avc1.64002a\"; width=1920; height=1080; framerate=60; "
+ "bitrate=5833750",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1280; "
+ "height=720; framerate=60; bitrate=2676194; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1920; "
+ "height=1080; framerate=60; bitrate=4461346; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=2560; "
+ "height=1440; framerate=60; bitrate=13384663; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=3840; "
+ "height=2160; framerate=60; bitrate=26752474; eotf=bt709",
+ "video/webm; codecs=\"vp09.02.51.10.01.09.16.09.00\"; width=256; "
+ "height=144; framerate=60; bitrate=245561",
+ "video/webm; codecs=\"vp09.02.51.10.01.09.16.09.00\"; width=426; "
+ "height=240; framerate=60; bitrate=500223",
+ "video/webm; codecs=\"vp09.02.51.10.01.09.16.09.00\"; width=640; "
+ "height=360; framerate=60; bitrate=1064485",
+ "video/webm; codecs=\"vp09.02.51.10.01.09.16.09.00\"; width=854; "
+ "height=480; framerate=60; bitrate=1998847",
+ "video/webm; codecs=\"vp09.02.51.10.01.09.16.09.00\"; width=1280; "
+ "height=720; framerate=60; bitrate=4556353",
+ "video/webm; codecs=\"vp09.02.51.10.01.09.16.09.00\"; width=1920; "
+ "height=1080; framerate=60; bitrate=6946958",
+ "video/webm; codecs=\"vp09.02.51.10.01.09.16.09.00\"; width=2560; "
+ "height=1440; framerate=60; bitrate=16930005",
+ "video/webm; codecs=\"vp09.02.51.10.01.09.16.09.00\"; width=3840; "
+ "height=2160; framerate=60; bitrate=30184402",
+ "video/mp4; codecs=\"av01.0.00M.10.0.110.09.16.09.0\"; width=256; "
+ "height=144; framerate=30; bitrate=89195; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.00M.10.0.110.09.16.09.0\"; width=426; "
+ "height=240; framerate=30; bitrate=172861; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.01M.10.0.110.09.16.09.0\"; width=640; "
+ "height=360; framerate=30; bitrate=369517; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.04M.10.0.110.09.16.09.0\"; width=854; "
+ "height=480; framerate=30; bitrate=695606; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.08M.10.0.110.09.16.09.0\"; width=1280; "
+ "height=720; framerate=60; bitrate=2017563; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.09M.10.0.110.09.16.09.0\"; width=1920; "
+ "height=1080; framerate=60; bitrate=3755257; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.12M.10.0.110.09.16.09.0\"; width=2560; "
+ "height=1440; framerate=60; bitrate=8546165; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.13M.10.0.110.09.16.09.0\"; width=3840; "
+ "height=2160; framerate=60; bitrate=17537773; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.17M.10.0.110.09.16.09.0\"; width=7680; "
+ "height=4320; framerate=60; bitrate=37270368; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.00M.10.0.110.09.16.09.0\"; width=256; "
+ "height=144; framerate=60; bitrate=193907; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.01M.10.0.110.09.16.09.0\"; width=426; "
+ "height=240; framerate=60; bitrate=400353; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.04M.10.0.110.09.16.09.0\"; width=640; "
+ "height=360; framerate=60; bitrate=817812; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.05M.10.0.110.09.16.09.0\"; width=854; "
+ "height=480; framerate=60; bitrate=1558025; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.08M.10.0.110.09.16.09.0\"; width=1280; "
+ "height=720; framerate=60; bitrate=4167668; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.09M.10.0.110.09.16.09.0\"; width=1920; "
+ "height=1080; framerate=60; bitrate=6870811; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.12M.10.0.110.09.16.09.0\"; width=2560; "
+ "height=1440; framerate=60; bitrate=17316706; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.13M.10.0.110.09.16.09.0\"; width=3840; "
+ "height=2160; framerate=60; bitrate=31942925; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.17M.10.0.110.09.16.09.0\"; width=7680; "
+ "height=4320; framerate=60; bitrate=66038840; eotf=smpte2084",
+ "video/mp4; codecs=\"av01.0.17M.10.0.110.09.16.09.0\"; width=7680; "
+ "height=4320; framerate=60; bitrate=45923436; eotf=smpte2084",
+ "video/mp4; codecs=\"avc1.4d4015\"; width=426; height=240; framerate=24; "
+ "bitrate=160590",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=640; height=360; framerate=24; "
+ "bitrate=255156",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=854; height=480; framerate=24; "
+ "bitrate=490890",
+ "video/mp4; codecs=\"avc1.4d401f\"; width=1280; height=720; framerate=24; "
+ "bitrate=1000556",
+ "video/mp4; codecs=\"avc1.640028\"; width=1920; height=1080; framerate=24; "
+ "bitrate=1810004",
+ "audio/mp4; codecs=\"mp4a.40.2\"; channels=2",
+ "video/mp4; codecs=\"avc1.4d400c\"; width=256; height=144; framerate=24; "
+ "bitrate=82746",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=426; "
+ "height=240; framerate=24; bitrate=178701; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=640; "
+ "height=360; framerate=24; bitrate=371303; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=854; "
+ "height=480; framerate=24; bitrate=579918; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1280; "
+ "height=720; framerate=24; bitrate=999223; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1920; "
+ "height=1080; framerate=24; bitrate=1814623; eotf=bt709",
+ "audio/webm; codecs=\"opus\"; channels=2",
+ "audio/webm; codecs=\"opus\"; channels=2"};
+
+// Query params from https://youtu.be/1mSzHxMpji0.
+static const char* kDrmQueryParams[] = {
+ "video/mp4; codecs=\"avc1.4d4015\"; width=426; height=240; framerate=24; "
+ "bitrate=281854",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=640; height=360; framerate=24; "
+ "bitrate=637760",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=854; height=480; framerate=24; "
+ "bitrate=1164612",
+ "video/mp4; codecs=\"avc1.640028\"; width=1920; height=1080; framerate=24; "
+ "bitrate=4362827",
+ "audio/mp4; codecs=\"mp4a.40.2\"; channels=2",
+ "video/mp4; codecs=\"avc1.4d400c\"; width=256; height=144; framerate=24; "
+ "bitrate=138907",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=854; height=480; framerate=24; "
+ "bitrate=1746306",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=854; height=480; framerate=24; "
+ "bitrate=3473564",
+ "video/mp4; codecs=\"avc1.4d401f\"; width=1280; height=720; framerate=24; "
+ "bitrate=3481130",
+ "video/mp4; codecs=\"avc1.4d401f\"; width=1280; height=720; framerate=24; "
+ "bitrate=5789806",
+ "video/mp4; codecs=\"avc1.640028\"; width=1920; height=1080; framerate=24; "
+ "bitrate=5856175",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=854; "
+ "height=480; framerate=24; bitrate=2629046; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1280; "
+ "height=720; framerate=24; bitrate=1328071; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1920; "
+ "height=1080; framerate=24; bitrate=2375894; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=426; "
+ "height=240; framerate=24; bitrate=229634; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=640; "
+ "height=360; framerate=24; bitrate=324585; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=854; "
+ "height=480; framerate=24; bitrate=639196; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=854; "
+ "height=480; framerate=24; bitrate=1055128; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "audio/mp4; codecs=\"ec-3\"; channels=6",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1280; "
+ "height=720; framerate=24; bitrate=2111149; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1280; "
+ "height=720; framerate=24; bitrate=3709033; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1920; "
+ "height=1080; framerate=24; bitrate=3679792; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1920; "
+ "height=1080; framerate=24; bitrate=5524689; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "audio/mp4; codecs=\"ac-3\"; channels=6",
+ "video/mp4; codecs=\"avc1.4d4015\"; width=426; height=240; framerate=24; "
+ "bitrate=281854",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=640; height=360; framerate=24; "
+ "bitrate=637760",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=854; height=480; framerate=24; "
+ "bitrate=1164612",
+ "video/mp4; codecs=\"avc1.640028\"; width=1920; height=1080; framerate=24; "
+ "bitrate=4362827",
+ "audio/mp4; codecs=\"mp4a.40.2\"; channels=2",
+ "video/mp4; codecs=\"avc1.4d400c\"; width=256; height=144; framerate=24; "
+ "bitrate=138907",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=854; height=480; framerate=24; "
+ "bitrate=1746306",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=854; height=480; framerate=24; "
+ "bitrate=3473564",
+ "video/mp4; codecs=\"avc1.4d401f\"; width=1280; height=720; framerate=24; "
+ "bitrate=3481130",
+ "video/mp4; codecs=\"avc1.4d401f\"; width=1280; height=720; framerate=24; "
+ "bitrate=5789806",
+ "video/mp4; codecs=\"avc1.640028\"; width=1920; height=1080; framerate=24; "
+ "bitrate=5856175",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=854; "
+ "height=480; framerate=24; bitrate=2629046; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1280; "
+ "height=720; framerate=24; bitrate=1328071; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1920; "
+ "height=1080; framerate=24; bitrate=2375894; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=426; "
+ "height=240; framerate=24; bitrate=229634; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=640; "
+ "height=360; framerate=24; bitrate=324585; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=854; "
+ "height=480; framerate=24; bitrate=639196; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=854; "
+ "height=480; framerate=24; bitrate=1055128; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "audio/mp4; codecs=\"ec-3\"; channels=6",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1280; "
+ "height=720; framerate=24; bitrate=2111149; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1280; "
+ "height=720; framerate=24; bitrate=3709033; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1920; "
+ "height=1080; framerate=24; bitrate=3679792; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1920; "
+ "height=1080; framerate=24; bitrate=5524689; eotf=bt709; "
+ "cryptoblockformat=subsample",
+ "audio/mp4; codecs=\"ac-3\"; channels=6",
+ "video/mp4; codecs=\"avc1.4d4015\"; width=426; height=240; framerate=24; "
+ "bitrate=149590",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=640; height=360; framerate=24; "
+ "bitrate=261202",
+ "video/mp4; codecs=\"avc1.4d401e\"; width=854; height=480; framerate=24; "
+ "bitrate=368187",
+ "video/mp4; codecs=\"avc1.4d401f\"; width=1280; height=720; framerate=24; "
+ "bitrate=676316",
+ "video/mp4; codecs=\"avc1.640028\"; width=1920; height=1080; framerate=24; "
+ "bitrate=2691722",
+ "audio/mp4; codecs=\"mp4a.40.2\"; channels=2",
+ "video/mp4; codecs=\"avc1.4d400c\"; width=256; height=144; framerate=24; "
+ "bitrate=84646",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=426; "
+ "height=240; framerate=24; bitrate=192698; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=640; "
+ "height=360; framerate=24; bitrate=342403; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=854; "
+ "height=480; framerate=24; bitrate=514976; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1280; "
+ "height=720; framerate=24; bitrate=852689; eotf=bt709",
+ "video/webm; codecs=\"vp09.00.51.08.01.01.01.01.00\"; width=1920; "
+ "height=1080; framerate=24; bitrate=2389269; eotf=bt709",
+ "audio/webm; codecs=\"opus\"; channels=2",
+ "audio/webm; codecs=\"opus\"; channels=2",
+ "video/mp4; codecs=\"av01.0.00M.08\"; width=256; height=144; framerate=24; "
+ "bitrate=74957; eotf=bt709",
+ "video/mp4; codecs=\"av01.0.00M.08\"; width=426; height=240; framerate=24; "
+ "bitrate=148691; eotf=bt709",
+ "video/mp4; codecs=\"av01.0.01M.08\"; width=640; height=360; framerate=24; "
+ "bitrate=305616; eotf=bt709",
+ "video/mp4; codecs=\"av01.0.04M.08\"; width=854; height=480; framerate=24; "
+ "bitrate=577104; eotf=bt709",
+ "video/mp4; codecs=\"av01.0.05M.08\"; width=1280; height=720; "
+ "framerate=24; bitrate=989646; eotf=bt709",
+ "video/mp4; codecs=\"av01.0.08M.08\"; width=1920; height=1080; "
+ "framerate=24; bitrate=1766589; eotf=bt709"};
+
+} // namespace nplb
+} // namespace starboard
+
+#endif // STARBOARD_NPLB_MEDIA_CAN_PLAY_MIME_AND_KEY_SYSTEM_TEST_HELPERS_H_
diff --git a/src/starboard/nplb/nplb.gyp b/src/starboard/nplb/nplb.gyp
index b0f9f91..845e6c8 100644
--- a/src/starboard/nplb/nplb.gyp
+++ b/src/starboard/nplb/nplb.gyp
@@ -158,6 +158,7 @@
# files.
'media_buffer_test.cc',
'media_can_play_mime_and_key_system_test.cc',
+ 'media_can_play_mime_and_key_system_test_helpers.h',
'media_configuration_test.cc',
'memory_align_to_page_size_test.cc',
'memory_allocate_aligned_test.cc',
diff --git a/src/starboard/shared/starboard/player/player_worker.cc b/src/starboard/shared/starboard/player/player_worker.cc
index a17ab85..5ab9a8a 100644
--- a/src/starboard/shared/starboard/player/player_worker.cc
+++ b/src/starboard/shared/starboard/player/player_worker.cc
@@ -216,9 +216,13 @@
SB_DCHECK(job_queue_->BelongsToCurrentThread());
SB_DCHECK(player_state_ != kSbPlayerStateDestroyed);
- SB_DCHECK(!error_occurred_);
SB_DCHECK(ticket_ != ticket);
+ if (error_occurred_) {
+ SB_LOG(ERROR) << "Tried to seek after error occurred.";
+ return;
+ }
+
SB_DLOG(INFO) << "Try to seek to " << seek_to_time << " microseconds.";
if (write_pending_sample_job_token_.is_valid()) {
diff --git a/src/third_party/angle/src/common/platform.h b/src/third_party/angle/src/common/platform.h
index 7bb17b5..2dde125 100644
--- a/src/third_party/angle/src/common/platform.h
+++ b/src/third_party/angle/src/common/platform.h
@@ -129,4 +129,10 @@
# endif
#endif
+// Disable std::async usage uniformly across all Starboard builds for more
+// consistent behaviour and stability.
+#if defined(STARBOARD)
+# define ANGLE_STD_ASYNC_WORKERS 0
+#endif // defined(STARBOARD)
+
#endif // COMMON_PLATFORM_H_
diff --git a/src/third_party/crashpad/compat/linux/sys/mman.cc b/src/third_party/crashpad/compat/linux/sys/mman.cc
index 12aaa2c..044dbca 100644
--- a/src/third_party/crashpad/compat/linux/sys/mman.cc
+++ b/src/third_party/crashpad/compat/linux/sys/mman.cc
@@ -22,7 +22,7 @@
extern "C" {
-int memfd_create(const char* name, unsigned int flags) {
+int memfd_create(const char* name, unsigned int flags) __THROW {
using MemfdCreateType = int (*)(const char*, int);
static const MemfdCreateType next_memfd_create =
reinterpret_cast<MemfdCreateType>(dlsym(RTLD_NEXT, "memfd_create"));
diff --git a/src/third_party/crashpad/compat/linux/sys/mman.h b/src/third_party/crashpad/compat/linux/sys/mman.h
index 61c55d7..43155da 100644
--- a/src/third_party/crashpad/compat/linux/sys/mman.h
+++ b/src/third_party/crashpad/compat/linux/sys/mman.h
@@ -29,7 +29,7 @@
extern "C" {
#endif
-int memfd_create(const char* name, unsigned int flags);
+int memfd_create(const char* name, unsigned int flags) __THROW;
#ifdef __cplusplus
} // extern "C"