Import Cobalt 20.master.0.220639
diff --git a/src/base/logging.cc b/src/base/logging.cc
index 466868e..718d52a 100644
--- a/src/base/logging.cc
+++ b/src/base/logging.cc
@@ -558,6 +558,30 @@
#endif
}
+#if defined(OFFICIAL_BUILD)
+int GetMinLogLevel() {
+ return LOG_NUM_SEVERITIES;
+}
+
+bool ShouldCreateLogMessage(int /*severity*/) {
+ return false;
+}
+
+int GetVlogVerbosity() {
+ return LOG_INFO - GetMinLogLevel();
+}
+
+int GetVlogLevelHelper(const char* /*file*/, size_t /*N*/) {
+ return GetVlogVerbosity();
+}
+
+void SetLogItems(bool /*enable_process_id*/, bool /*enable_thread_id*/,
+ bool /*enable_timestamp*/, bool /*enable_tickcount*/) {}
+
+void SetLogPrefix(const char* /*prefix*/) {}
+
+#else // defined(OFFICIAL_BUILD)
+
int GetMinLogLevel() {
return g_min_log_level;
}
@@ -600,6 +624,7 @@
base::ContainsOnlyChars(prefix, "abcdefghijklmnopqrstuvwxyz"));
g_log_prefix = prefix;
}
+#endif // defined(OFFICIAL_BUILD)
void SetShowErrorDialogs(bool enable_dialogs) {
show_error_dialogs = enable_dialogs;
diff --git a/src/base/logging.h b/src/base/logging.h
index 1c0d669..da6384d 100644
--- a/src/base/logging.h
+++ b/src/base/logging.h
@@ -411,8 +411,13 @@
// As special cases, we can assume that LOG_IS_ON(FATAL) always holds. Also,
// LOG_IS_ON(DFATAL) always holds in debug mode. In particular, CHECK()s will
// always fire if they fail.
+
+#if defined(OFFICIAL_BUILD)
+#define LOG_IS_ON(severity) false
+#else // defined(OFFICIAL_BUILD)
#define LOG_IS_ON(severity) \
(::logging::ShouldCreateLogMessage(::logging::LOG_##severity))
+#endif // defined(OFFICIAL_BUILD)
// We can't do any caching tricks with VLOG_IS_ON() like the
// google-glog version since it requires GCC extensions. This means
diff --git a/src/base/message_loop/message_pump_io_starboard.cc b/src/base/message_loop/message_pump_io_starboard.cc
index cfe3955..767dd1b 100644
--- a/src/base/message_loop/message_pump_io_starboard.cc
+++ b/src/base/message_loop/message_pump_io_starboard.cc
@@ -145,10 +145,10 @@
}
// Set current interest mask and waiter for this event.
- bool result =
- SbSocketWaiterAdd(waiter_, socket, controller, OnSocketWaiterNotification,
- interests, persistent);
- DCHECK(result);
+ if (!SbSocketWaiterAdd(waiter_, socket, controller,
+ OnSocketWaiterNotification, interests, persistent)) {
+ return false;
+ }
controller->Init(socket, persistent);
controller->set_watcher(delegate);
diff --git a/src/base/test/main_hook.cc b/src/base/test/main_hook.cc
index b5cafca..0478d99 100644
--- a/src/base/test/main_hook.cc
+++ b/src/base/test/main_hook.cc
@@ -9,10 +9,6 @@
#include "base/command_line.h"
#endif
-#if defined(COBALT_BUILD_TYPE_GOLD)
-#error You cannot build unit tests in gold builds.
-#endif
-
#if defined(__LB_SHELL__) || defined(COBALT)
base::AtExitManager* platform_at_exit_manager_;
diff --git a/src/cobalt/CHANGELOG.md b/src/cobalt/CHANGELOG.md
index 45f312d..6bd4d82 100644
--- a/src/cobalt/CHANGELOG.md
+++ b/src/cobalt/CHANGELOG.md
@@ -49,7 +49,8 @@
- **Added support for Device Authentication URL signing.**
Cobalt will now add URL parameters signed with the device's secret key and
- certification scope to the initial URL.
+ certification scope to the initial URL. For more information, see
+ [doc/device_authentication.md](doc/device_authentication.md).
- **Updated Chromium net and base libraries from m25 to m70.**
diff --git a/src/cobalt/accessibility/accessibility.gyp b/src/cobalt/accessibility/accessibility.gyp
deleted file mode 100644
index cb497fd..0000000
--- a/src/cobalt/accessibility/accessibility.gyp
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2017 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 specif
-
-{
- 'targets': [
- {
- 'target_name': 'accessibility',
- 'type': 'static_library',
- 'sources': [
- 'internal/live_region.cc',
- 'internal/live_region.h',
- 'internal/text_alternative_helper.cc',
- 'internal/text_alternative_helper.h',
- 'screen_reader.cc',
- 'screen_reader.h',
- 'starboard_tts_engine.cc',
- 'starboard_tts_engine.h',
- 'text_alternative.cc',
- 'text_alternative.h',
- 'tts_engine.h',
- 'tts_logger.h',
- ],
- 'dependencies': [
- '<(DEPTH)/cobalt/base/base.gyp:base',
- '<(DEPTH)/cobalt/dom/dom.gyp:dom',
- ],
- },
- ]
-}
diff --git a/src/cobalt/accessibility/accessibility_test.gyp b/src/cobalt/accessibility/accessibility_test.gyp
deleted file mode 100644
index acede3d..0000000
--- a/src/cobalt/accessibility/accessibility_test.gyp
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2017 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 specif
-
-{
- 'targets': [
- {
- 'target_name': 'accessibility_test',
- 'type': '<(gtest_target_type)',
- 'sources': [
- 'screen_reader_tests.cc',
- 'internal/live_region_test.cc',
- 'internal/text_alternative_helper_test.cc',
- ],
- 'dependencies': [
- '<(DEPTH)/cobalt/accessibility/accessibility.gyp:accessibility',
- '<(DEPTH)/cobalt/base/base.gyp:base',
- '<(DEPTH)/cobalt/browser/browser.gyp:browser',
- '<(DEPTH)/cobalt/test/test.gyp:run_all_unittests',
- '<(DEPTH)/testing/gmock.gyp:gmock',
- '<(DEPTH)/testing/gtest.gyp:gtest',
- 'accessibility_test_data',
- ],
- },
- {
- 'target_name': 'accessibility_test_data',
- 'type': 'none',
- 'variables': {
- 'content_test_input_files': [
- '<(DEPTH)/cobalt/accessibility/testdata/',
- ],
- 'content_test_output_subdir': 'cobalt/accessibility/testdata/',
- },
- 'includes': ['<(DEPTH)/starboard/build/copy_test_data.gypi'],
- },
- {
- 'target_name': 'accessibility_test_deploy',
- 'type': 'none',
- 'dependencies': [
- 'accessibility_test',
- ],
- 'variables': {
- 'executable_name': 'accessibility_test',
- },
- 'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
- },
- ]
-}
diff --git a/src/cobalt/accessibility/internal/live_region.cc b/src/cobalt/accessibility/internal/live_region.cc
deleted file mode 100644
index 40407be..0000000
--- a/src/cobalt/accessibility/internal/live_region.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2017 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 "cobalt/accessibility/internal/live_region.h"
-
-#include <bitset>
-#include <memory>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string_split.h"
-#include "cobalt/base/tokens.h"
-#include "cobalt/dom/element.h"
-
-namespace cobalt {
-namespace accessibility {
-namespace internal {
-namespace {
-typedef std::bitset<8> RelevantMutationsBitset;
-
-// Default value for the aria-relevant property per the spec.
-// https://www.w3.org/TR/wai-aria/states_and_properties#aria-relevant
-const char kDefaultAriaRelevantValue[] = "additions text";
-
-bool HasValidLiveRegionProperty(const scoped_refptr<dom::Element>& element) {
- std::string aria_live_attribute =
- element->GetAttribute(base::Tokens::aria_live().c_str()).value_or("");
-
- return aria_live_attribute == base::Tokens::assertive() ||
- aria_live_attribute == base::Tokens::polite();
-}
-
-RelevantMutationsBitset GetRelevantMutations(
- const scoped_refptr<dom::Element>& element) {
- RelevantMutationsBitset bitset;
-
- std::string aria_relevant_attribute =
- element->GetAttribute(base::Tokens::aria_relevant().c_str())
- .value_or(kDefaultAriaRelevantValue);
- std::vector<std::string> tokens =
- base::SplitString(aria_relevant_attribute, base::kWhitespaceASCII,
- base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
- for (size_t i = 0; i < tokens.size(); ++i) {
- if (tokens[i] == base::Tokens::additions()) {
- bitset.set(LiveRegion::kMutationTypeAddition);
- } else if (tokens[i] == base::Tokens::removals()) {
- bitset.set(LiveRegion::kMutationTypeRemoval);
- } else if (tokens[i] == base::Tokens::text()) {
- bitset.set(LiveRegion::kMutationTypeText);
- } else if (tokens[i] == base::Tokens::all()) {
- bitset.set();
- } else {
- DLOG(WARNING) << "Unexpected value for aria-relevant attribute: "
- << tokens[i];
- }
- }
- return bitset;
-}
-} // namespace
-
-// static
-std::unique_ptr<LiveRegion> LiveRegion::GetLiveRegionForNode(
- const scoped_refptr<dom::Node>& node) {
- if (!node) {
- return std::unique_ptr<LiveRegion>(nullptr);
- }
- scoped_refptr<dom::Element> element = node->AsElement();
- if (element && HasValidLiveRegionProperty(element)) {
- return base::WrapUnique(new LiveRegion(element));
- }
- return GetLiveRegionForNode(node->parent_node());
-}
-
-bool LiveRegion::IsAssertive() const {
- base::Optional<std::string> aria_live_attribute =
- root_->GetAttribute(base::Tokens::aria_live().c_str());
- if (!aria_live_attribute) {
- NOTREACHED();
- return false;
- }
- return *aria_live_attribute == base::Tokens::assertive();
-}
-
-bool LiveRegion::IsMutationRelevant(MutationType mutation_type) const {
- RelevantMutationsBitset bitset = GetRelevantMutations(root_);
- return bitset.test(mutation_type);
-}
-
-bool LiveRegion::IsAtomic(const scoped_refptr<dom::Node>& node) const {
- // Stop searching if we go past the live region's root node. The default is
- // non-atomic.
- if (!node || node == root_->parent_node()) {
- return false;
- }
- if (node->IsElement()) {
- scoped_refptr<dom::Element> element = node->AsElement();
- // Search ancestors of the changed element to determine if this change is
- // atomic or not, per the algorithm described in the spec.
- // https://www.w3.org/TR/wai-aria/states_and_properties#aria-atomic
- base::Optional<std::string> aria_atomic_attribute =
- element->GetAttribute(base::Tokens::aria_atomic().c_str());
- if (aria_atomic_attribute) {
- if (*aria_atomic_attribute == base::Tokens::true_token()) {
- return true;
- } else if (*aria_atomic_attribute == base::Tokens::false_token()) {
- return false;
- } else {
- DLOG(WARNING) << "Unexpected token for aria-atomic: "
- << *aria_atomic_attribute;
- }
- }
- }
- return IsAtomic(node->parent_node());
-}
-
-} // namespace internal
-} // namespace accessibility
-} // namespace cobalt
diff --git a/src/cobalt/accessibility/internal/live_region.h b/src/cobalt/accessibility/internal/live_region.h
deleted file mode 100644
index 7a995ac..0000000
--- a/src/cobalt/accessibility/internal/live_region.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 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 COBALT_ACCESSIBILITY_INTERNAL_LIVE_REGION_H_
-#define COBALT_ACCESSIBILITY_INTERNAL_LIVE_REGION_H_
-
-#include <memory>
-#include <string>
-
-#include "cobalt/dom/node.h"
-
-namespace cobalt {
-namespace accessibility {
-namespace internal {
-// Collection of functions to support the implementation of wai-aria Live
-// Regions:
-// https://www.w3.org/TR/2010/WD-wai-aria-20100916/terms#def_liveregion
-class LiveRegion {
- public:
- // Types of mutation to the DOM subtree that might cause a live region to be
- // updated, corresponding to the possible values of aria-relevant as
- // described in:
- // https://www.w3.org/TR/2011/CR-wai-aria-20110118/states_and_properties#aria-relevant
- enum MutationType {
- kMutationTypeAddition = 1, // corresponds to "additions"
- kMutationTypeRemoval, // corresponds to "removals"
- kMutationTypeText, // corresponds to "text"
- };
-
- // Returns a LiveRegion instance describing the live region that this element
- // is a member of, or NULL if this element is not part of a live region.
- //
- // Searches the element's ancestors looking for the first element with a
- // valid aria-live attribute.
- static std::unique_ptr<LiveRegion> GetLiveRegionForNode(
- const scoped_refptr<dom::Node>& node);
-
- // Returns true if the value of aria-live is "assertive".
- // https://www.w3.org/TR/2011/CR-wai-aria-20110118/states_and_properties#aria-live
- bool IsAssertive() const;
-
- // Returns true if this live region should be updated in response to the
- // specified type of change, based on the value of this element's
- // aria-relevant property.
- // https://www.w3.org/TR/2011/CR-wai-aria-20110118/states_and_properties#aria-relevant
- bool IsMutationRelevant(MutationType mutation_type) const;
-
- // Returns true if changes to this node should result in an atomic update
- // to its live region, according to the value of the aria-atomic property set
- // on this node or its ancestors, up to and including the live region root.
- //
- // https://www.w3.org/TR/2011/CR-wai-aria-20110118/states_and_properties#aria-atomic
- bool IsAtomic(const scoped_refptr<dom::Node>& node) const;
-
- // Returns the root of the live region (i.e.) the element that has the
- // aria-live property set on it.
- const scoped_refptr<dom::Element>& root() { return root_; }
-
- private:
- explicit LiveRegion(const scoped_refptr<dom::Element>& root) : root_(root) {}
-
- // The root element of the live region. That is, the element with a valid
- // aria-live attribute.
- scoped_refptr<dom::Element> root_;
-};
-
-} // namespace internal
-} // namespace accessibility
-} // namespace cobalt
-
-#endif // COBALT_ACCESSIBILITY_INTERNAL_LIVE_REGION_H_
diff --git a/src/cobalt/accessibility/internal/live_region_test.cc b/src/cobalt/accessibility/internal/live_region_test.cc
deleted file mode 100644
index 35e8b7f..0000000
--- a/src/cobalt/accessibility/internal/live_region_test.cc
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright 2017 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 <memory>
-
-#include "base/memory/ref_counted.h"
-#include "cobalt/accessibility/internal/live_region.h"
-#include "cobalt/dom/element.h"
-#include "cobalt/test/empty_document.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace accessibility {
-namespace internal {
-class LiveRegionTest : public ::testing::Test {
- protected:
- dom::Document* document() { return empty_document_.document(); }
-
- scoped_refptr<dom::Element> CreateLiveRegion(const char* type) {
- scoped_refptr<dom::Element> live_region = document()->CreateElement("div");
- live_region->SetAttribute(base::Tokens::aria_live().c_str(), type);
- return live_region;
- }
-
- private:
- // For posting tasks by any triggered code.
- base::MessageLoop message_loop_;
- test::EmptyDocument empty_document_;
-};
-
-TEST_F(LiveRegionTest, GetLiveRegionRoot) {
- std::unique_ptr<LiveRegion> live_region;
-
- scoped_refptr<dom::Element> live_region_element =
- CreateLiveRegion(base::Tokens::polite().c_str());
- ASSERT_TRUE(live_region_element);
-
- // GetLiveRegionForNode with the live region root.
- live_region = LiveRegion::GetLiveRegionForNode(live_region_element);
- ASSERT_TRUE(live_region);
- EXPECT_EQ(live_region->root(), live_region_element);
-
- // GetLiveRegionForNode with a descendent node of a live region.
- scoped_refptr<dom::Element> child = document()->CreateElement("div");
- live_region_element->AppendChild(child);
- live_region = LiveRegion::GetLiveRegionForNode(child);
- ASSERT_TRUE(live_region);
- EXPECT_EQ(live_region->root(), live_region_element);
-
- // Element that is not in a live region.
- scoped_refptr<dom::Element> not_live = document()->CreateElement("div");
- live_region = LiveRegion::GetLiveRegionForNode(not_live);
- EXPECT_FALSE(live_region);
-}
-
-TEST_F(LiveRegionTest, NestedLiveRegion) {
- scoped_refptr<dom::Element> live_region_element =
- CreateLiveRegion(base::Tokens::polite().c_str());
- ASSERT_TRUE(live_region_element);
-
- scoped_refptr<dom::Element> nested_region_element =
- CreateLiveRegion(base::Tokens::polite().c_str());
- ASSERT_TRUE(nested_region_element);
- live_region_element->AppendChild(nested_region_element);
-
- // The closest ancestor live region is this element's live region.
- scoped_refptr<dom::Element> child = document()->CreateElement("div");
- nested_region_element->AppendChild(child);
- std::unique_ptr<LiveRegion> live_region =
- LiveRegion::GetLiveRegionForNode(child);
- ASSERT_TRUE(live_region);
- EXPECT_EQ(live_region->root(), nested_region_element);
-
- // Ignore live regions that are not active.
- nested_region_element->SetAttribute(base::Tokens::aria_live().c_str(),
- base::Tokens::off().c_str());
- live_region = LiveRegion::GetLiveRegionForNode(child);
- ASSERT_TRUE(live_region);
- EXPECT_EQ(live_region->root(), live_region_element);
-}
-
-TEST_F(LiveRegionTest, LiveRegionType) {
- std::unique_ptr<LiveRegion> live_region;
-
- // aria-live="polite"
- scoped_refptr<dom::Element> polite_element =
- CreateLiveRegion(base::Tokens::polite().c_str());
- ASSERT_TRUE(polite_element);
- live_region = LiveRegion::GetLiveRegionForNode(polite_element);
- ASSERT_TRUE(live_region);
- EXPECT_FALSE(live_region->IsAssertive());
-
- // aria-live="assertive"
- scoped_refptr<dom::Element> assertive_element =
- CreateLiveRegion(base::Tokens::assertive().c_str());
- ASSERT_TRUE(assertive_element);
- live_region = LiveRegion::GetLiveRegionForNode(assertive_element);
- ASSERT_TRUE(live_region);
- EXPECT_TRUE(live_region->IsAssertive());
-
- // aria-live="off"
- scoped_refptr<dom::Element> off_element =
- CreateLiveRegion(base::Tokens::off().c_str());
- ASSERT_TRUE(off_element);
- live_region = LiveRegion::GetLiveRegionForNode(off_element);
- EXPECT_FALSE(live_region);
-
- // aria-live=<invalid token>
- scoped_refptr<dom::Element> invalid_element = CreateLiveRegion("banana");
- ASSERT_TRUE(invalid_element);
- live_region = LiveRegion::GetLiveRegionForNode(invalid_element);
- EXPECT_FALSE(live_region);
-}
-
-TEST_F(LiveRegionTest, IsMutationRelevant) {
- scoped_refptr<dom::Element> live_region_element =
- CreateLiveRegion(base::Tokens::polite().c_str());
- ASSERT_TRUE(live_region_element);
-
- // GetLiveRegionForNode with the live region root.
- std::unique_ptr<LiveRegion> live_region =
- LiveRegion::GetLiveRegionForNode(live_region_element);
- ASSERT_TRUE(live_region);
- // Default is that additions and text are relevant.
- EXPECT_TRUE(
- live_region->IsMutationRelevant(LiveRegion::kMutationTypeAddition));
- EXPECT_TRUE(live_region->IsMutationRelevant(LiveRegion::kMutationTypeText));
- EXPECT_FALSE(
- live_region->IsMutationRelevant(LiveRegion::kMutationTypeRemoval));
-
- // Only removals are relevant.
- live_region_element->SetAttribute(base::Tokens::aria_relevant().c_str(),
- "removals");
- live_region = LiveRegion::GetLiveRegionForNode(live_region_element);
- ASSERT_TRUE(live_region);
- EXPECT_FALSE(
- live_region->IsMutationRelevant(LiveRegion::kMutationTypeAddition));
- EXPECT_FALSE(live_region->IsMutationRelevant(LiveRegion::kMutationTypeText));
- EXPECT_TRUE(
- live_region->IsMutationRelevant(LiveRegion::kMutationTypeRemoval));
-
- // Removals and additions are relevant.
- live_region_element->SetAttribute(base::Tokens::aria_relevant().c_str(),
- "removals additions");
- live_region = LiveRegion::GetLiveRegionForNode(live_region_element);
- ASSERT_TRUE(live_region);
- EXPECT_TRUE(
- live_region->IsMutationRelevant(LiveRegion::kMutationTypeAddition));
- EXPECT_FALSE(live_region->IsMutationRelevant(LiveRegion::kMutationTypeText));
- EXPECT_TRUE(
- live_region->IsMutationRelevant(LiveRegion::kMutationTypeRemoval));
-
- // An invalid token.
- live_region_element->SetAttribute(base::Tokens::aria_relevant().c_str(),
- "text dog additions");
- live_region = LiveRegion::GetLiveRegionForNode(live_region_element);
- ASSERT_TRUE(live_region);
- EXPECT_TRUE(
- live_region->IsMutationRelevant(LiveRegion::kMutationTypeAddition));
- EXPECT_TRUE(live_region->IsMutationRelevant(LiveRegion::kMutationTypeText));
- EXPECT_FALSE(
- live_region->IsMutationRelevant(LiveRegion::kMutationTypeRemoval));
-
- // "all" token.
- live_region_element->SetAttribute(base::Tokens::aria_relevant().c_str(),
- "all");
- live_region = LiveRegion::GetLiveRegionForNode(live_region_element);
- ASSERT_TRUE(live_region);
- EXPECT_TRUE(
- live_region->IsMutationRelevant(LiveRegion::kMutationTypeAddition));
- EXPECT_TRUE(live_region->IsMutationRelevant(LiveRegion::kMutationTypeText));
- EXPECT_TRUE(
- live_region->IsMutationRelevant(LiveRegion::kMutationTypeRemoval));
-}
-
-TEST_F(LiveRegionTest, IsAtomic) {
- std::unique_ptr<LiveRegion> live_region;
-
- scoped_refptr<dom::Element> live_region_element =
- CreateLiveRegion(base::Tokens::polite().c_str());
- ASSERT_TRUE(live_region_element);
-
- // Default is non-atomic.
- live_region = LiveRegion::GetLiveRegionForNode(live_region_element);
- ASSERT_TRUE(live_region);
- EXPECT_FALSE(live_region->IsAtomic(live_region_element));
-
- // aria-atomic=true
- live_region_element->SetAttribute(base::Tokens::aria_atomic().c_str(),
- "true");
- live_region = LiveRegion::GetLiveRegionForNode(live_region_element);
- ASSERT_TRUE(live_region);
- EXPECT_TRUE(live_region->IsAtomic(live_region_element));
-
- // aria-atomic=false
- live_region_element->SetAttribute(base::Tokens::aria_atomic().c_str(),
- "false");
- live_region = LiveRegion::GetLiveRegionForNode(live_region_element);
- ASSERT_TRUE(live_region);
- EXPECT_FALSE(live_region->IsAtomic(live_region_element));
-
- // Get the value of aria-atomic from ancestor elements.
- live_region_element->SetAttribute(base::Tokens::aria_atomic().c_str(),
- "true");
- scoped_refptr<dom::Element> child = document()->CreateElement("div");
- live_region_element->AppendChild(child);
- live_region = LiveRegion::GetLiveRegionForNode(live_region_element);
- ASSERT_TRUE(live_region);
- EXPECT_TRUE(live_region->IsAtomic(child));
- EXPECT_TRUE(live_region->IsAtomic(live_region_element));
-
- // Stop checking ancestors on the first aria-atomic attribute.
- live_region_element->SetAttribute(base::Tokens::aria_atomic().c_str(),
- "true");
- child->SetAttribute(base::Tokens::aria_atomic().c_str(), "false");
- live_region = LiveRegion::GetLiveRegionForNode(live_region_element);
- ASSERT_TRUE(live_region);
- EXPECT_FALSE(live_region->IsAtomic(child));
- EXPECT_TRUE(live_region->IsAtomic(live_region_element));
-}
-} // namespace internal
-} // namespace accessibility
-} // namespace cobalt
diff --git a/src/cobalt/accessibility/internal/text_alternative_helper.cc b/src/cobalt/accessibility/internal/text_alternative_helper.cc
deleted file mode 100644
index f0b543b..0000000
--- a/src/cobalt/accessibility/internal/text_alternative_helper.cc
+++ /dev/null
@@ -1,282 +0,0 @@
-// Copyright 2017 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 "cobalt/accessibility/internal/text_alternative_helper.h"
-
-#include <utility>
-
-#include "base/strings/string_split.h"
-#include "cobalt/dom/document.h"
-#include "cobalt/dom/html_element.h"
-#include "cobalt/dom/html_image_element.h"
-#include "cobalt/dom/node_list.h"
-
-namespace cobalt {
-namespace accessibility {
-namespace internal {
-namespace {
-// Helper class that inserts a base::Token into a base::hash_set during the
-// class's lifetime.
-class ScopedIdSetMember {
- public:
- // Adds |token| into |hash_set| for the duration of this class instance's
- // lifetime. If |token| is an empty string, it doesn't get added to the set.
- //
- // TextAlternativeHelper::visited_element_ids_ is used to keep track of a set
- // of element ids that have been visited during the current computation to
- // ensure that we do not follow any ID reference loops. When
- // AppendTextAlternative is called, the ID of that element is pushed into the
- // set using this helper class, so that the ID will be popped back out of the
- // set which allows us to re-visit that element in a non-recursive manner, if
- // necessary.
- ScopedIdSetMember(base::hash_set<base::Token>* hash_set,
- const base::Token& token)
- : hash_set_(hash_set) {
- // Ignore empty tokens.
- if (SbStringGetLength(token.c_str()) > 0) {
- DCHECK(hash_set_->find(token) == hash_set_->end());
- iterator_pair_ = hash_set_->insert(token);
- DCHECK(iterator_pair_.second);
- } else {
- // Ensure iterator_pair_ is initialized.
- iterator_pair_ = std::make_pair(hash_set_->end(), false);
- }
- }
- ~ScopedIdSetMember() {
- if (iterator_pair_.second) {
- hash_set_->erase(iterator_pair_.first);
- }
- }
-
- private:
- base::hash_set<base::Token>* hash_set_;
- std::pair<base::hash_set<base::Token>::iterator, bool> iterator_pair_;
-};
-
-// Look up an element whose id is |id| in the document that |element| is in.
-scoped_refptr<dom::Element> GetElementById(
- const scoped_refptr<dom::Element>& element, const std::string& id) {
- // TODO: If referenced elements tend to be close to the referencing element,
- // it may be more efficient to do a breadth-first search starting from
- // |element|.
- dom::Document* document = element->node_document();
- scoped_refptr<dom::Element> target_element = document->GetElementById(id);
- DLOG_IF(WARNING, !target_element)
- << "Could not find aria-labelledby target: " << id;
- return target_element;
-}
-} // namespace
-
-void TextAlternativeHelper::AppendTextAlternative(
- const scoped_refptr<dom::Node>& node) {
- DCHECK(node);
- // https://www.w3.org/TR/2014/REC-wai-aria-implementation-20140320/#mapping_additional_nd_te
- // 5.6.1.3. Text Alternative Computation
-
- if (node->IsText()) {
- // Rule 3D
- // Get the contents of the text node.
- if (node->text_content()) {
- AppendTextIfNonEmpty(*node->text_content());
- }
- return;
- }
-
- scoped_refptr<dom::Element> element = node->AsElement();
- if (!element) {
- // Since this is neither a Text or Element, ignore it.
- return;
- }
-
- if (visited_element_ids_.find(element->id()) != visited_element_ids_.end()) {
- DLOG(INFO) << "Skipping element to prevent reference loop: "
- << element->id();
- return;
- }
-
- ScopedIdSetMember scoped_id_set_member(&visited_element_ids_, element->id());
-
- // Rule 1
- // Skip hidden elements unless the author specifies to use them via an
- // aria-labelledby or aria-describedby being used in the current computation.
- if (!in_labelled_by_or_described_by_ && IsAriaHidden(element)) {
- return;
- }
-
- // Rule 2A (first bullet point)
- // The aria-labelledby attribute takes precedence as the element's text
- // alternative unless this computation is already occurring as the result of a
- // recursive aria-labelledby declaration.
- if (!in_labelled_by_or_described_by_) {
- if (TryAppendFromLabelledByOrDescribedBy(element,
- base::Tokens::aria_labelledby())) {
- return;
- }
- }
-
- // Rule 2A (second bullet point)
- // If aria-labelledby is empty or undefined, the aria-label attribute, which
- // defines an explicit text string, is used. However, if this computation is
- // already occurring as the result of a recursive text alternative computation
- // and the current element is an embedded control as defined in rule 2B,
- // ignore the aria-label attribute and skip directly to rule 2B.
- //
- // Note: Cobalt doesn't support the embedded controls defined in rule 2B, so
- // just get the alternative text from the label, if it exists.
- if (TryAppendFromLabel(element)) {
- return;
- }
-
- // Rule 2A (third bullet point)
- // If aria-labelledby and aria-label are both empty or undefined, and if the
- // element is not marked as presentational (role="presentation", check for the
- // presence of an equivalent host language attribute or element for
- // associating a label, and use those mechanisms to determine a text
- // alternative. For example, in HTML, the img element's alt attribute defines
- // a label string and the label element references the form element it labels.
- //
- // This implementation does not support the "role" attribute, so just get the
- // "alt" property, if this is an element that supports it
- if (TryAppendFromAltProperty(element)) {
- return;
- }
-
- // Rule 2B
- // Cobalt does not support the controls described in this step, so skip it.
-
- // Rule 2C
- // Otherwise, if the attributes checked in rules A and B didn't provide
- // results, text is collected from descendant content if the current element's
- // role allows "Name From: contents." The text alternatives for child nodes
- // will be concatenated, using this same set of rules. This same rule may
- // apply to a child, which means the computation becomes recursive and can
- // result in text being collected in all the nodes in this subtree, no matter
- // how deep they are. However, any given descendant subtree may instead
- // collect their part of the text alternative from the preferred markup
- // described in A and B above. These author-specified attributes are assumed
- // to provide the correct text alternative for the entire subtree. All in all,
- // the node rules are applied consistently as text alternatives are collected
- // from descendants, and each containing element in those descendants may or
- // may not allow their contents to be used. Each node in the subtree is
- // consulted only once. If text has been collected from a child node, and is
- // referenced by another IDREF in some descendant node, then that second, or
- // subsequent, reference is not followed. This is done to avoid infinite
- // loops.
- //
- // The "role" attribute is not supported, so ignore it. Recurse through
- // children and concatenate text alternatives.
- scoped_refptr<dom::NodeList> children = element->child_nodes();
- for (int i = 0; i < children->length(); ++i) {
- scoped_refptr<dom::Node> child = children->Item(i);
- AppendTextAlternative(child);
- }
-
- // 5.6.1.2. Description Compution
- // If aria-describedby is present, user agents MUST compute the accessible
- // description by concatenating the text alternatives for nodes referenced by
- // an aria-describedby attribute on the current node. The text alternatives
- // for the referenced nodes are computed using a number of methods.
- if (!in_labelled_by_or_described_by_) {
- TryAppendFromLabelledByOrDescribedBy(element,
- base::Tokens::aria_describedby());
- }
-}
-
-std::string TextAlternativeHelper::GetTextAlternative() {
- return base::JoinString(alternatives_, " ");
-}
-
-bool TextAlternativeHelper::IsAriaHidden(
- const scoped_refptr<dom::Element>& element) {
- if (!element) {
- return false;
- }
- base::Optional<std::string> aria_hidden_attribute =
- element->GetAttribute(base::Tokens::aria_hidden().c_str());
- if (aria_hidden_attribute.value_or("") == base::Tokens::true_token()) {
- return true;
- }
- return IsAriaHidden(element->parent_element());
-}
-
-bool TextAlternativeHelper::TryAppendFromLabelledByOrDescribedBy(
- const scoped_refptr<dom::Element>& element, const base::Token& token) {
- DCHECK(!in_labelled_by_or_described_by_);
- base::Optional<std::string> attributes = element->GetAttribute(token.c_str());
- // If aria-labelledby is empty or undefined, the aria-label attribute ... is
- // used (defined below).
- std::vector<std::string> ids =
- base::SplitString(attributes.value_or(""), base::kWhitespaceASCII,
- base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
- const size_t current_num_alternatives = alternatives_.size();
- if (!ids.empty()) {
- in_labelled_by_or_described_by_ = true;
- for (int i = 0; i < ids.size(); ++i) {
- if (visited_element_ids_.find(base::Token(ids[i])) !=
- visited_element_ids_.end()) {
- DLOG(WARNING) << "Skipping reference to ID: " << ids[i]
- << " to prevent reference loop.";
- continue;
- }
- scoped_refptr<dom::Element> target_element =
- GetElementById(element, ids[i]);
- if (!target_element) {
- DLOG(WARNING) << "Could not find " << token.c_str()
- << " target: " << ids[i];
- continue;
- }
- AppendTextAlternative(target_element);
- }
- in_labelled_by_or_described_by_ = false;
- }
- // Check if any of these recursive calls to AppendTextAlternative actually
- // ended up appending something.
- return current_num_alternatives != alternatives_.size();
-}
-
-bool TextAlternativeHelper::TryAppendFromLabel(
- const scoped_refptr<dom::Element>& element) {
- base::Optional<std::string> label_attribute =
- element->GetAttribute(base::Tokens::aria_label().c_str());
- return AppendTextIfNonEmpty(label_attribute.value_or(""));
-}
-
-bool TextAlternativeHelper::TryAppendFromAltProperty(
- const scoped_refptr<dom::Element>& element) {
- // https://www.w3.org/TR/REC-html40/struct/objects.html#h-13.8
- // The only element type that supports the "alt" attribute that Cobalt
- // implements is the <img> element.
- if (element->AsHTMLElement() &&
- element->AsHTMLElement()->AsHTMLImageElement()) {
- base::Optional<std::string> alt_attribute =
- element->GetAttribute(base::Tokens::alt().c_str());
- if (alt_attribute) {
- return AppendTextIfNonEmpty(*alt_attribute);
- }
- }
- return false;
-}
-
-bool TextAlternativeHelper::AppendTextIfNonEmpty(const std::string& text) {
- std::string trimmed;
- TrimWhitespaceASCII(text, base::TRIM_ALL, &trimmed);
- if (!trimmed.empty()) {
- alternatives_.push_back(trimmed);
- }
- return !trimmed.empty();
-}
-
-} // namespace internal
-} // namespace accessibility
-} // namespace cobalt
diff --git a/src/cobalt/accessibility/internal/text_alternative_helper.h b/src/cobalt/accessibility/internal/text_alternative_helper.h
deleted file mode 100644
index 760eef3..0000000
--- a/src/cobalt/accessibility/internal/text_alternative_helper.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2017 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 COBALT_ACCESSIBILITY_INTERNAL_TEXT_ALTERNATIVE_HELPER_H_
-#define COBALT_ACCESSIBILITY_INTERNAL_TEXT_ALTERNATIVE_HELPER_H_
-
-#include <string>
-#include <vector>
-
-#include "base/containers/hash_tables.h"
-#include "cobalt/base/token.h"
-#include "cobalt/dom/element.h"
-#include "cobalt/dom/node.h"
-
-namespace cobalt {
-namespace accessibility {
-namespace internal {
-
-// Helper class for implementing the WAI-ARIA Text Alternative computation
-// algorithm, made public for testing. This class should not be used directly.
-class TextAlternativeHelper {
- public:
- TextAlternativeHelper() : in_labelled_by_or_described_by_(false) {}
- void AppendTextAlternative(const scoped_refptr<dom::Node>& node);
-
- // Return the accumulated alternatives joined by a single space character.
- std::string GetTextAlternative();
-
- // Append the text alternative from a aria-labelledby or aria-describedby
- // property. Returns true if text alternative(s) were successfully appended.
- bool TryAppendFromLabelledByOrDescribedBy(
- const scoped_refptr<dom::Element>& element, const base::Token& token);
-
- // Append the text alternative from a aria-label property. Returns true
- // if the aria-label property exists and has a non-empty value.
- bool TryAppendFromLabel(const scoped_refptr<dom::Element>& element);
-
- // Append the text alternative from an element's "alt" property, for element
- // types that support the semantics of the alt property. The only such element
- // in Cobalt is <img> elements.
- // Returns true if |element| is an element that supports the semantics of the
- // "alt" property, and has a non-empty value for the "alt" property.
- bool TryAppendFromAltProperty(const scoped_refptr<dom::Element>& element);
-
- // Append |text| to the accumulation of text alternative strings if it is not
- // empty. Returns true if text is non-empty.
- bool AppendTextIfNonEmpty(const std::string& text);
-
- // Returns true iff this element or one of its ancestors has the "aria-hidden"
- // attribute set to "true".
- static bool IsAriaHidden(const scoped_refptr<dom::Element>& element);
-
- private:
- typedef base::hash_set<base::Token> TokenSet;
-
- bool in_labelled_by_or_described_by_;
- std::vector<std::string> alternatives_;
- TokenSet visited_element_ids_;
-};
-
-} // namespace internal
-} // namespace accessibility
-} // namespace cobalt
-
-#endif // COBALT_ACCESSIBILITY_INTERNAL_TEXT_ALTERNATIVE_HELPER_H_
diff --git a/src/cobalt/accessibility/internal/text_alternative_helper_test.cc b/src/cobalt/accessibility/internal/text_alternative_helper_test.cc
deleted file mode 100644
index 1be481f..0000000
--- a/src/cobalt/accessibility/internal/text_alternative_helper_test.cc
+++ /dev/null
@@ -1,339 +0,0 @@
-// Copyright 2017 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 "cobalt/accessibility/internal/text_alternative_helper.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/dom/html_image_element.h"
-#include "cobalt/dom/text.h"
-#include "cobalt/test/empty_document.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace accessibility {
-namespace internal {
-class TextAlternativeHelperTest : public ::testing::Test {
- protected:
- dom::Document* document() { return empty_document_.document(); }
-
- TextAlternativeHelper text_alternative_helper_;
- // For posting tasks by any triggered code.
- base::MessageLoop message_loop_;
- test::EmptyDocument empty_document_;
-};
-
-TEST_F(TextAlternativeHelperTest, ConcatenatesAlternatives) {
- EXPECT_TRUE(text_alternative_helper_.AppendTextIfNonEmpty("test"));
- EXPECT_TRUE(text_alternative_helper_.AppendTextIfNonEmpty("dog"));
- EXPECT_TRUE(text_alternative_helper_.AppendTextIfNonEmpty("cat"));
- EXPECT_STREQ("test dog cat",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, IgnoresEmptyStrings) {
- EXPECT_FALSE(text_alternative_helper_.AppendTextIfNonEmpty(""));
- EXPECT_STREQ("", text_alternative_helper_.GetTextAlternative().c_str());
- EXPECT_FALSE(text_alternative_helper_.AppendTextIfNonEmpty(" "));
- EXPECT_TRUE(text_alternative_helper_.GetTextAlternative().empty());
-}
-
-TEST_F(TextAlternativeHelperTest, TrimsAlternatives) {
- EXPECT_TRUE(text_alternative_helper_.AppendTextIfNonEmpty(" test "));
- EXPECT_TRUE(text_alternative_helper_.AppendTextIfNonEmpty("dog "));
- EXPECT_TRUE(text_alternative_helper_.AppendTextIfNonEmpty(" cat"));
- EXPECT_STREQ("test dog cat",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, HiddenOnlyIfAriaHiddenSet) {
- scoped_refptr<dom::Element> element = document()->CreateElement("div");
- // No aria-hidden attribute set.
- EXPECT_FALSE(TextAlternativeHelper::IsAriaHidden(element));
-
- // aria-hidden attribute set to false.
- element->SetAttribute(base::Tokens::aria_hidden().c_str(),
- base::Tokens::false_token().c_str());
- EXPECT_FALSE(TextAlternativeHelper::IsAriaHidden(element));
-
- // aria-hidden attribute set to true.
- element->SetAttribute(base::Tokens::aria_hidden().c_str(),
- base::Tokens::true_token().c_str());
- EXPECT_TRUE(TextAlternativeHelper::IsAriaHidden(element));
-
- // aria-hidden set to some arbitrary value.
- element->SetAttribute(base::Tokens::aria_hidden().c_str(), "banana");
- EXPECT_FALSE(TextAlternativeHelper::IsAriaHidden(element));
-}
-
-TEST_F(TextAlternativeHelperTest, GetTextAlternativeFromTextNode) {
- scoped_refptr<dom::Element> element = document()->CreateElement("div");
- element->AppendChild(document()->CreateTextNode("text node contents"));
- text_alternative_helper_.AppendTextAlternative(element);
- EXPECT_STREQ("text node contents",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, GetAltAttributeFromHTMLImage) {
- scoped_refptr<dom::Element> element =
- document()->CreateElement(dom::HTMLImageElement::kTagName);
- element->SetAttribute(base::Tokens::alt().c_str(), "image alt text");
- EXPECT_TRUE(text_alternative_helper_.TryAppendFromAltProperty(element));
- EXPECT_STREQ("image alt text",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, EmptyAltAttribute) {
- scoped_refptr<dom::Element> element =
- document()->CreateElement(dom::HTMLImageElement::kTagName);
- // No alt attribute.
- EXPECT_FALSE(text_alternative_helper_.TryAppendFromAltProperty(element));
- EXPECT_TRUE(text_alternative_helper_.GetTextAlternative().empty());
-
- // Empty alt attribute.
- element->SetAttribute(base::Tokens::alt().c_str(), "");
- EXPECT_FALSE(text_alternative_helper_.TryAppendFromAltProperty(element));
- EXPECT_TRUE(text_alternative_helper_.GetTextAlternative().empty());
-}
-
-TEST_F(TextAlternativeHelperTest, AltAttributeOnArbitraryElement) {
- scoped_refptr<dom::Element> element = document()->CreateElement("div");
- element->SetAttribute(base::Tokens::alt().c_str(), "alt text");
- EXPECT_FALSE(text_alternative_helper_.TryAppendFromAltProperty(element));
- EXPECT_TRUE(text_alternative_helper_.GetTextAlternative().empty());
-}
-
-TEST_F(TextAlternativeHelperTest, GetTextFromAriaLabel) {
- scoped_refptr<dom::Element> element = document()->CreateElement("div");
- element->SetAttribute(base::Tokens::aria_label().c_str(), "label text");
- EXPECT_TRUE(text_alternative_helper_.TryAppendFromLabel(element));
- EXPECT_STREQ("label text",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, IgnoreEmptyAriaLabel) {
- scoped_refptr<dom::Element> element = document()->CreateElement("test");
- element->SetAttribute(base::Tokens::aria_label().c_str(), " ");
- EXPECT_FALSE(text_alternative_helper_.TryAppendFromLabel(element));
- EXPECT_TRUE(text_alternative_helper_.GetTextAlternative().empty());
-}
-
-TEST_F(TextAlternativeHelperTest, GetTextFromAriaLabelledBy) {
- scoped_refptr<dom::Element> target_element = document()->CreateElement("div");
- target_element->AppendChild(document()->CreateTextNode("labelledby target"));
- target_element->set_id("target_element");
- document()->AppendChild(target_element);
-
- scoped_refptr<dom::Element> labelledby_element =
- document()->CreateElement("div");
- labelledby_element->SetAttribute(base::Tokens::aria_labelledby().c_str(),
- "target_element");
- document()->AppendChild(labelledby_element);
-
- EXPECT_TRUE(text_alternative_helper_.TryAppendFromLabelledByOrDescribedBy(
- labelledby_element, base::Tokens::aria_labelledby()));
- EXPECT_STREQ("labelledby target",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, InvalidLabelledByReference) {
- scoped_refptr<dom::Element> target_element = document()->CreateElement("div");
- target_element->AppendChild(document()->CreateTextNode("labelledby target"));
- target_element->set_id("target_element");
- document()->AppendChild(target_element);
-
- scoped_refptr<dom::Element> labelledby_element =
- document()->CreateElement("div");
- labelledby_element->SetAttribute(base::Tokens::aria_labelledby().c_str(),
- "bad_reference");
- document()->AppendChild(labelledby_element);
-
- EXPECT_FALSE(text_alternative_helper_.TryAppendFromLabelledByOrDescribedBy(
- labelledby_element, base::Tokens::aria_labelledby()));
- EXPECT_TRUE(text_alternative_helper_.GetTextAlternative().empty());
-}
-
-TEST_F(TextAlternativeHelperTest, MultipleLabelledByReferences) {
- scoped_refptr<dom::Element> target_element = document()->CreateElement("div");
- target_element->AppendChild(document()->CreateTextNode("target1"));
- target_element->set_id("target_element1");
- document()->AppendChild(target_element);
- target_element = document()->CreateElement("div");
- target_element->AppendChild(document()->CreateTextNode("target2"));
- target_element->set_id("target_element2");
- document()->AppendChild(target_element);
- target_element = document()->CreateElement("div");
- target_element->AppendChild(document()->CreateTextNode("target3"));
- target_element->set_id("target_element3");
- document()->AppendChild(target_element);
-
- scoped_refptr<dom::Element> labelledby_element =
- document()->CreateElement("div");
- labelledby_element->SetAttribute(
- base::Tokens::aria_labelledby().c_str(),
- "target_element1 target_element2 bad_reference target_element3");
- document()->AppendChild(labelledby_element);
-
- EXPECT_TRUE(text_alternative_helper_.TryAppendFromLabelledByOrDescribedBy(
- labelledby_element, base::Tokens::aria_labelledby()));
- EXPECT_STREQ("target1 target2 target3",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, LabelledByReferencesSelf) {
- scoped_refptr<dom::Element> target_element = document()->CreateElement("div");
- target_element->AppendChild(document()->CreateTextNode("other-text"));
- target_element->set_id("other_id");
- document()->AppendChild(target_element);
-
- scoped_refptr<dom::Element> labelledby_element =
- document()->CreateElement("div");
- labelledby_element->set_id("self_id");
- labelledby_element->SetAttribute(base::Tokens::aria_label().c_str(),
- "self-label");
- labelledby_element->SetAttribute(base::Tokens::aria_labelledby().c_str(),
- "other_id self_id");
- document()->AppendChild(labelledby_element);
-
- EXPECT_TRUE(text_alternative_helper_.TryAppendFromLabelledByOrDescribedBy(
- labelledby_element, base::Tokens::aria_labelledby()));
- EXPECT_STREQ("other-text self-label",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, NoRecursiveLabelledBy) {
- scoped_refptr<dom::Element> element = document()->CreateElement("div");
- element->SetAttribute(base::Tokens::aria_labelledby().c_str(),
- "first_labelled_by_id");
- document()->AppendChild(element);
-
- scoped_refptr<dom::Element> first_labelledby_element =
- document()->CreateElement("div");
- first_labelledby_element->AppendChild(
- document()->CreateTextNode("first-labelledby-text-contents"));
- first_labelledby_element->set_id("first_labelled_by_id");
- first_labelledby_element->SetAttribute(
- base::Tokens::aria_labelledby().c_str(), "second_labelled_by_id");
- document()->AppendChild(first_labelledby_element);
-
- scoped_refptr<dom::Element> second_labelledby_element =
- document()->CreateElement("div");
- second_labelledby_element->AppendChild(
- document()->CreateTextNode("second-labelledby-text-contents"));
- second_labelledby_element->set_id("second_labelled_by_id");
- document()->AppendChild(second_labelledby_element);
-
- // In the non-recursive case, we should follow the labelledby attribute.
- text_alternative_helper_.AppendTextAlternative(first_labelledby_element);
- EXPECT_STREQ("second-labelledby-text-contents",
- text_alternative_helper_.GetTextAlternative().c_str());
-
- // In the recursive case, we should not follow the second labelledby
- // attribute.
- text_alternative_helper_ = TextAlternativeHelper();
- text_alternative_helper_.AppendTextAlternative(element);
- EXPECT_STREQ("first-labelledby-text-contents",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, GetTextFromSubtree) {
- scoped_refptr<dom::Element> element = document()->CreateElement("div");
- document()->AppendChild(element);
-
- scoped_refptr<dom::Element> child = document()->CreateElement("div");
- child->AppendChild(document()->CreateTextNode("child1-text"));
- element->AppendChild(child);
-
- scoped_refptr<dom::Element> child_element = document()->CreateElement("div");
- element->AppendChild(child_element);
-
- child = document()->CreateElement("div");
- child->AppendChild(document()->CreateTextNode("child2-text"));
- child_element->AppendChild(child);
-
- child = document()->CreateElement("div");
- child->AppendChild(document()->CreateTextNode("child3-text"));
- child_element->AppendChild(child);
-
- text_alternative_helper_.AppendTextAlternative(element);
- EXPECT_STREQ("child1-text child2-text child3-text",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, DontFollowReferenceLoops) {
- scoped_refptr<dom::Element> element = document()->CreateElement("div");
- element->set_id("root_element_id");
- document()->AppendChild(element);
-
- scoped_refptr<dom::Element> child_element1 = document()->CreateElement("div");
- child_element1->SetAttribute(base::Tokens::aria_labelledby().c_str(),
- "root_element_id");
- element->AppendChild(child_element1);
-
- scoped_refptr<dom::Element> child_element2 = document()->CreateElement("div");
- child_element1->AppendChild(child_element2);
-
- child_element2->AppendChild(document()->CreateTextNode("child2-text"));
-
- text_alternative_helper_.AppendTextAlternative(element);
- EXPECT_STREQ("child2-text",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, GetTextFromAriaDescribedBy) {
- scoped_refptr<dom::Element> target_element = document()->CreateElement("div");
- target_element->AppendChild(document()->CreateTextNode("describedby target"));
- target_element->set_id("target_element");
- document()->AppendChild(target_element);
-
- scoped_refptr<dom::Element> describedby_element =
- document()->CreateElement("div");
- describedby_element->SetAttribute(base::Tokens::aria_describedby().c_str(),
- "target_element");
- document()->AppendChild(describedby_element);
-
- EXPECT_TRUE(text_alternative_helper_.TryAppendFromLabelledByOrDescribedBy(
- describedby_element, base::Tokens::aria_describedby()));
- EXPECT_STREQ("describedby target",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-TEST_F(TextAlternativeHelperTest, HasBothLabelledByAndDescribedBy) {
- // aria-describedby is ignored in this case.
- scoped_refptr<dom::Element> element = document()->CreateElement("div");
- document()->AppendChild(element);
-
- element->SetAttribute(base::Tokens::aria_labelledby().c_str(), "calendar");
- element->SetAttribute(base::Tokens::aria_describedby().c_str(), "info");
-
- scoped_refptr<dom::Element> labelledby_element =
- document()->CreateElement("div");
- labelledby_element->set_id("calendar");
- labelledby_element->AppendChild(document()->CreateTextNode("Calendar"));
- element->AppendChild(labelledby_element);
-
- scoped_refptr<dom::Element> describedby_element =
- document()->CreateElement("div");
- describedby_element->set_id("info");
- describedby_element->AppendChild(
- document()->CreateTextNode("Calendar content description."));
- element->AppendChild(describedby_element);
-
- text_alternative_helper_.AppendTextAlternative(element);
- EXPECT_STREQ("Calendar",
- text_alternative_helper_.GetTextAlternative().c_str());
-}
-
-} // namespace internal
-} // namespace accessibility
-} // namespace cobalt
diff --git a/src/cobalt/accessibility/screen_reader.cc b/src/cobalt/accessibility/screen_reader.cc
deleted file mode 100644
index 6e313b8..0000000
--- a/src/cobalt/accessibility/screen_reader.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2017 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 "cobalt/accessibility/screen_reader.h"
-
-#include <memory>
-#include <string>
-
-#include "base/strings/stringprintf.h"
-#include "cobalt/accessibility/internal/live_region.h"
-#include "cobalt/accessibility/text_alternative.h"
-#include "cobalt/dom/element.h"
-#include "cobalt/dom/html_body_element.h"
-#include "cobalt/dom/node_list.h"
-
-namespace cobalt {
-namespace accessibility {
-namespace {
-// When text is removed from a live region, add the word "Removed" to indicate
-// that the text has been removed.
-// TODO: Support other languages.
-const char kRemovedFormatString[] = "Removed. %s";
-} // namespace
-
-ScreenReader::ScreenReader(dom::Document* document, TTSEngine* tts_engine,
- dom::MutationObserverTaskManager* task_manager)
- : enabled_(true),
- document_(document),
- tts_engine_(tts_engine),
- focus_changed_(false) {
- DCHECK(document_ && tts_engine_);
- document_->AddObserver(this);
- live_region_observer_ = new dom::MutationObserver(
- base::Bind(&ScreenReader::MutationObserverCallback, AsWeakPtr()),
- task_manager);
-}
-
-ScreenReader::~ScreenReader() {
- live_region_observer_->Disconnect();
- document_->RemoveObserver(this);
-}
-
-void ScreenReader::set_enabled(bool value) { enabled_ = value; }
-
-void ScreenReader::OnLoad() {
- dom::MutationObserverInit init;
- init.set_subtree(true);
- // Track character data and node addition/removal for live regions.
- init.set_character_data(true);
- init.set_child_list(true);
-
- if (document_->body()) {
- live_region_observer_->Observe(document_->body(), init);
- }
-}
-
-void ScreenReader::OnFocusChanged() {
- if (focus_changed_) {
- return;
- }
- focus_changed_ = true;
- base::MessageLoop::current()->task_runner()->PostTask(
- FROM_HERE, base::Bind(&ScreenReader::FocusChangedCallback, AsWeakPtr()));
-}
-
-void ScreenReader::FocusChangedCallback() {
- focus_changed_ = false;
- if (!enabled_) {
- return;
- }
- scoped_refptr<dom::Element> element = document_->active_element();
- if (element) {
- std::string text_alternative = ComputeTextAlternative(element);
- tts_engine_->SpeakNow(text_alternative);
- }
-}
-
-// MutationObserver callback for tracking the creation and destruction of
-// live regions.
-void ScreenReader::MutationObserverCallback(
- const MutationRecordSequence& sequence,
- const scoped_refptr<dom::MutationObserver>& observer) {
- // TODO: Only check live regions if text-to-speech is enabled.
- if (!enabled_) {
- return;
- }
- DCHECK_EQ(observer, live_region_observer_);
- for (size_t i = 0; i < sequence.size(); ++i) {
- scoped_refptr<dom::MutationRecord> record = sequence.at(i);
-
- // Check if the target node is part of a live region.
- std::unique_ptr<internal::LiveRegion> live_region =
- internal::LiveRegion::GetLiveRegionForNode(record->target());
- if (!live_region) {
- continue;
- }
-
- const char* format_string = NULL;
- // Get a list of changed nodes, based on the type of change this was and
- // whether or not the live region cares about this type of change.
- scoped_refptr<dom::NodeList> changed_nodes;
- if (record->type() == base::Tokens::characterData() &&
- live_region->IsMutationRelevant(
- internal::LiveRegion::kMutationTypeText)) {
- changed_nodes = new dom::NodeList();
- changed_nodes->AppendNode(record->target());
- } else if (record->type() == base::Tokens::childList()) {
- if (record->added_nodes() &&
- live_region->IsMutationRelevant(
- internal::LiveRegion::kMutationTypeAddition)) {
- changed_nodes = record->added_nodes();
- }
- if (record->removed_nodes() &&
- live_region->IsMutationRelevant(
- internal::LiveRegion::kMutationTypeRemoval)) {
- changed_nodes = record->removed_nodes();
- format_string = kRemovedFormatString;
- }
- }
- // If we don't have changed nodes, that means that the change was not
- // relevant to this live region.
- if (!changed_nodes || (changed_nodes->length() <= 0)) {
- continue;
- }
-
- // Check if any of the changed nodes should update the live region
- // atomically.
- bool is_atomic = false;
- for (size_t i = 0; i < changed_nodes->length(); ++i) {
- if (live_region->IsAtomic(changed_nodes->Item(i))) {
- is_atomic = true;
- break;
- }
- }
-
- std::string text_alternative;
- if (is_atomic) {
- // If the live region updates atomically, then ignore changed_nodes
- // and just get the text alternative from the entire region.
- text_alternative = ComputeTextAlternative(live_region->root());
- } else {
- // Otherwise append all the text alternatives for each node.
- for (size_t i = 0; i < changed_nodes->length(); ++i) {
- text_alternative += ComputeTextAlternative(changed_nodes->Item(i));
- }
- }
-
- // If we still don't have a text_alternative to speak, continue to the next
- // mutation.
- if (text_alternative.empty()) {
- continue;
- }
-
- // Provide additional context through a format string, if necessary.
- if (format_string) {
- text_alternative =
- base::StringPrintf(format_string, text_alternative.c_str());
- }
-
- // Utter the text according to whether this live region is assertive or not.
- if (live_region->IsAssertive()) {
- tts_engine_->SpeakNow(text_alternative);
- } else {
- tts_engine_->Speak(text_alternative);
- }
- }
-}
-
-} // namespace accessibility
-} // namespace cobalt
diff --git a/src/cobalt/accessibility/screen_reader.h b/src/cobalt/accessibility/screen_reader.h
deleted file mode 100644
index 83eb183..0000000
--- a/src/cobalt/accessibility/screen_reader.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2017 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 COBALT_ACCESSIBILITY_SCREEN_READER_H_
-#define COBALT_ACCESSIBILITY_SCREEN_READER_H_
-
-#include <memory>
-
-#include "base/memory/weak_ptr.h"
-#include "cobalt/accessibility/tts_engine.h"
-#include "cobalt/dom/document.h"
-#include "cobalt/dom/mutation_observer.h"
-#include "cobalt/dom/mutation_observer_task_manager.h"
-
-namespace cobalt {
-namespace accessibility {
-// ScreenReader tracks changes in the state of the Document and provides speech
-// utterances to a TTSEngine. The main use cases covered are when the document's
-// focused element changes, usually in response to user input, or if there is
-// an asynchronous change to "live region" that should be communicated to the
-// user.
-class ScreenReader : public base::SupportsWeakPtr<ScreenReader>,
- public dom::DocumentObserver {
- public:
- ScreenReader(dom::Document* document, TTSEngine* tts_engine,
- dom::MutationObserverTaskManager* task_manager);
-
- void set_enabled(bool enabled);
- bool enabled() const { return enabled_; }
-
- protected:
- ~ScreenReader();
- // dom::DocumentObserver overrides.
- void OnLoad() override;
- void OnMutation() override {}
- void OnFocusChanged() override;
-
- private:
- typedef script::Sequence<scoped_refptr<dom::MutationRecord> >
- MutationRecordSequence;
- void FocusChangedCallback();
- // MutationObserver callback for tracking live regions.
- void MutationObserverCallback(
- const MutationRecordSequence& sequence,
- const scoped_refptr<dom::MutationObserver>& observer);
-
- bool enabled_;
- dom::Document* document_;
- TTSEngine* tts_engine_;
- scoped_refptr<dom::MutationObserver> live_region_observer_;
- bool focus_changed_;
-
- friend std::unique_ptr<ScreenReader>::deleter_type;
- DISALLOW_COPY_AND_ASSIGN(ScreenReader);
-};
-} // namespace accessibility
-} // namespace cobalt
-
-#endif // COBALT_ACCESSIBILITY_SCREEN_READER_H_
diff --git a/src/cobalt/accessibility/screen_reader_tests.cc b/src/cobalt/accessibility/screen_reader_tests.cc
deleted file mode 100644
index 238c096..0000000
--- a/src/cobalt/accessibility/screen_reader_tests.cc
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2017 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 <memory>
-#include <string>
-#include <vector>
-
-#include "base/base_paths.h"
-#include "base/files/file_enumerator.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/path_service.h"
-#include "cobalt/accessibility/screen_reader.h"
-#include "cobalt/accessibility/text_alternative.h"
-#include "cobalt/accessibility/tts_engine.h"
-#include "cobalt/browser/web_module.h"
-#include "cobalt/cssom/viewport_size.h"
-#include "cobalt/dom/element.h"
-#include "cobalt/dom/window.h"
-#include "cobalt/test/document_loader.h"
-#include "starboard/window.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using cobalt::cssom::ViewportSize;
-using testing::_;
-
-namespace cobalt {
-namespace accessibility {
-namespace {
-struct TestInfo {
- TestInfo(const std::string& html_file_name,
- const std::string& expected_result, bool screen_reader_enabled)
- : html_file_name(html_file_name),
- expected_result(expected_result),
- screen_reader_enabled(screen_reader_enabled) {}
- std::string html_file_name;
- std::string expected_result;
- bool screen_reader_enabled;
-};
-
-// Enumerate the *.html files in the accessibility_test directory and build
-// a list of input .html files and expected results.
-std::vector<TestInfo> EnumerateTests(bool screen_reader_enabled,
- const std::string& subdir) {
- std::vector<TestInfo> infos;
- base::FilePath root_directory;
- base::PathService::Get(base::DIR_TEST_DATA, &root_directory);
- root_directory = root_directory.Append("cobalt")
- .Append("accessibility")
- .Append("testdata")
- .Append(subdir);
- base::FileEnumerator enumerator(root_directory, false,
- base::FileEnumerator::FILES);
- for (base::FilePath html_file = enumerator.Next(); !html_file.empty();
- html_file = enumerator.Next()) {
- if (html_file.Extension() == ".html") {
- base::FilePath expected_results_file =
- html_file.ReplaceExtension(".expected");
- std::string results;
- if (!base::ReadFileToString(expected_results_file, &results)) {
- DLOG(WARNING) << "Failed to read results from file: "
- << expected_results_file.value();
- continue;
- }
- TrimWhitespaceASCII(results, base::TRIM_ALL, &results);
- infos.push_back(TestInfo(html_file.BaseName().value(), results,
- screen_reader_enabled));
- }
- }
- return infos;
-}
-
-class MockTTSEngine : public TTSEngine {
- public:
- MOCK_METHOD1(Speak, void(const std::string&));
- MOCK_METHOD1(SpeakNow, void(const std::string&));
-};
-
-class TextAlternativeTest : public ::testing::TestWithParam<TestInfo> {
- protected:
- // For posting tasks by any triggered code.
- test::DocumentLoader document_loader_;
-};
-
-class LiveRegionMutationTest : public ::testing::TestWithParam<TestInfo> {
- public:
- LiveRegionMutationTest()
- : quit_event_(base::WaitableEvent::ResetPolicy::MANUAL,
- base::WaitableEvent::InitialState::NOT_SIGNALED) {}
- void OnError(const GURL&, const std::string& error) {
- DLOG(ERROR) << error;
- Quit();
- }
- void Quit() {
- quit_event_.Signal();
- screen_reader_.reset();
- }
- void OnClose(base::TimeDelta close_time) {
- SB_UNREFERENCED_PARAMETER(close_time);
- Quit();
- }
-
- scoped_refptr<script::Wrappable> CreateWindowAttribute(
- const scoped_refptr<dom::Window>& window,
- dom::MutationObserverTaskManager* mutation_observer_task_manager,
- script::GlobalEnvironment* global_environment) {
- SB_UNREFERENCED_PARAMETER(global_environment);
- screen_reader_.reset(new accessibility::ScreenReader(
- window->document(), &tts_engine_, mutation_observer_task_manager));
- screen_reader_->set_enabled(GetParam().screen_reader_enabled);
- EXPECT_EQ(GetParam().screen_reader_enabled, screen_reader_->enabled());
-
- return NULL;
- }
-
- static void OnRenderTreeProducedStub(
- const browser::WebModule::LayoutResults&) {}
-
- protected:
- MockTTSEngine tts_engine_;
- base::WaitableEvent quit_event_;
- std::unique_ptr<accessibility::ScreenReader> screen_reader_;
-};
-} // namespace
-
-TEST_P(TextAlternativeTest, TextAlternativeTest) {
- GURL url(
- std::string("file:///cobalt/accessibility/testdata/text_alternative/" +
- GetParam().html_file_name));
- document_loader_.Load(url);
- ASSERT_TRUE(document_loader_.document());
- scoped_refptr<dom::Element> element =
- document_loader_.document()->GetElementById("element_to_test");
- ASSERT_TRUE(element);
- EXPECT_EQ(GetParam().expected_result, ComputeTextAlternative(element));
-}
-
-// This test broke because LiveRegionMutationTest::CreateWindowAttribute()
-// returns a NULL script::Wrappable, which the javascript engine will attempt
-// to dereference.
-TEST_P(LiveRegionMutationTest, DISABLED_LiveRegionMutationTest) {
- GURL url(std::string("file:///cobalt/accessibility/testdata/live_region/" +
- GetParam().html_file_name));
- const ViewportSize kDefaultViewportSize(1280, 720);
- const float kDefaultVideoPixelRatio = 1.0f;
- const float kRefreshRate = 60.0f;
-
- network::NetworkModule network_module((network::NetworkModule::Options()));
- render_tree::ResourceProviderStub resource_provider;
-
- // Use test runner mode to allow the content itself to dictate when it is
- // ready for layout should be performed. See cobalt/dom/test_runner.h.
- browser::WebModule::Options web_module_options;
- web_module_options.injected_window_attributes["test"] = base::Bind(
- &LiveRegionMutationTest::CreateWindowAttribute, base::Unretained(this));
-
- // Set expected result from mutation.
- std::string expected_speech = GetParam().expected_result;
- if (expected_speech.empty() || !GetParam().screen_reader_enabled) {
- EXPECT_CALL(tts_engine_, Speak(_)).Times(0);
- } else {
- EXPECT_CALL(tts_engine_, Speak(expected_speech));
- }
-
- // Create the webmodule and let it run.
- DLOG(INFO) << url.spec();
- browser::WebModule web_module(
- url, base::kApplicationStateStarted,
- base::Bind(&LiveRegionMutationTest::OnRenderTreeProducedStub),
- base::Bind(&LiveRegionMutationTest::OnError, base::Unretained(this)),
- base::Bind(&LiveRegionMutationTest::OnClose, base::Unretained(this)),
- base::Closure(), /* window_minimize_callback */
- NULL /* can_play_type_handler */, NULL /* web_media_player_factory */,
- &network_module, kDefaultViewportSize, kDefaultVideoPixelRatio,
- &resource_provider, kRefreshRate, web_module_options);
-
- // Wait for the test to quit.
- quit_event_.Wait();
-}
-
-INSTANTIATE_TEST_CASE_P(
- TextAlternativeTest, TextAlternativeTest,
- ::testing::ValuesIn(EnumerateTests(true, "text_alternative")));
-
-INSTANTIATE_TEST_CASE_P(LiveRegionMutationTestEnabled, LiveRegionMutationTest,
- ::testing::ValuesIn(EnumerateTests(true,
- "live_region")));
-
-INSTANTIATE_TEST_CASE_P(LiveRegionMutationTestDisabled, LiveRegionMutationTest,
- ::testing::ValuesIn(EnumerateTests(false,
- "live_region")));
-} // namespace accessibility
-} // namespace cobalt
diff --git a/src/cobalt/accessibility/starboard_tts_engine.cc b/src/cobalt/accessibility/starboard_tts_engine.cc
deleted file mode 100644
index c05afd4..0000000
--- a/src/cobalt/accessibility/starboard_tts_engine.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 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 "cobalt/accessibility/starboard_tts_engine.h"
-
-#include "starboard/speech_synthesis.h"
-
-#if SB_HAS(SPEECH_SYNTHESIS)
-
-namespace cobalt {
-namespace accessibility {
-
-void StarboardTTSEngine::SpeakNow(const std::string& text) {
- SbSpeechSynthesisCancel();
- Speak(text);
-}
-
-void StarboardTTSEngine::Speak(const std::string& text) {
- SbSpeechSynthesisSpeak(text.c_str());
-}
-
-} // namespace accessibility
-} // namespace cobalt
-
-#endif // SB_HAS(SPEECH_SYNTHESIS)
diff --git a/src/cobalt/accessibility/starboard_tts_engine.h b/src/cobalt/accessibility/starboard_tts_engine.h
deleted file mode 100644
index 7eb8c50..0000000
--- a/src/cobalt/accessibility/starboard_tts_engine.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 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 COBALT_ACCESSIBILITY_STARBOARD_TTS_ENGINE_H_
-#define COBALT_ACCESSIBILITY_STARBOARD_TTS_ENGINE_H_
-
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "cobalt/accessibility/tts_engine.h"
-
-namespace cobalt {
-namespace accessibility {
-
-// Implementation of TTSEngine using the Starboard Speech Synthesis API.
-class StarboardTTSEngine : public TTSEngine {
- public:
- void SpeakNow(const std::string& text) override;
- void Speak(const std::string& text) override;
- ~StarboardTTSEngine() override {}
-};
-} // namespace accessibility
-} // namespace cobalt
-
-#endif // COBALT_ACCESSIBILITY_STARBOARD_TTS_ENGINE_H_
diff --git a/src/cobalt/accessibility/testdata/live_region/add-child.expected b/src/cobalt/accessibility/testdata/live_region/add-child.expected
deleted file mode 100644
index 4706dc8..0000000
--- a/src/cobalt/accessibility/testdata/live_region/add-child.expected
+++ /dev/null
@@ -1 +0,0 @@
-New child text contents
diff --git a/src/cobalt/accessibility/testdata/live_region/add-child.html b/src/cobalt/accessibility/testdata/live_region/add-child.html
deleted file mode 100644
index c22f5d2..0000000
--- a/src/cobalt/accessibility/testdata/live_region/add-child.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<html>
-<head>
-<script>
-var doMutation = function() {
- var region = document.getElementById("to_mutate");
- var new_child = document.createElement("div");
- new_child.appendChild(document.createTextNode("New child text contents"));
- region.appendChild(new_child);
- window.setTimeout(function() { window.close(); } );
-}
-window.addEventListener("load", doMutation);
-</script>
-</head>
-<body>
-<div id="to_mutate" aria-live="polite" aria-relevant="additions" aria-atomic="false">
- Original contents.
-</div>
-</body>
-</html>
diff --git a/src/cobalt/accessibility/testdata/live_region/atomic-update.expected b/src/cobalt/accessibility/testdata/live_region/atomic-update.expected
deleted file mode 100644
index c4395db..0000000
--- a/src/cobalt/accessibility/testdata/live_region/atomic-update.expected
+++ /dev/null
@@ -1 +0,0 @@
-Original contents. New child text contents
diff --git a/src/cobalt/accessibility/testdata/live_region/atomic-update.html b/src/cobalt/accessibility/testdata/live_region/atomic-update.html
deleted file mode 100644
index 7e9a9cc..0000000
--- a/src/cobalt/accessibility/testdata/live_region/atomic-update.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<html>
-<head>
-<script>
-var doMutation = function() {
- var region = document.getElementById("to_mutate");
- var new_child = document.createElement("div");
- new_child.appendChild(document.createTextNode("New child text contents"));
- region.appendChild(new_child);
- window.setTimeout(function() { window.close(); } );
-}
-window.addEventListener("load", doMutation);
-</script>
-</head>
-<body>
-<div id="to_mutate" aria-live="polite" aria-relevant="additions" aria-atomic="true">
- Original contents.
-</div>
-</body>
-</html>
diff --git a/src/cobalt/accessibility/testdata/live_region/mutate-text-contents.expected b/src/cobalt/accessibility/testdata/live_region/mutate-text-contents.expected
deleted file mode 100644
index 8a1cd73..0000000
--- a/src/cobalt/accessibility/testdata/live_region/mutate-text-contents.expected
+++ /dev/null
@@ -1 +0,0 @@
-New text contents
diff --git a/src/cobalt/accessibility/testdata/live_region/mutate-text-contents.html b/src/cobalt/accessibility/testdata/live_region/mutate-text-contents.html
deleted file mode 100644
index 53e5afe..0000000
--- a/src/cobalt/accessibility/testdata/live_region/mutate-text-contents.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<html>
-<head>
-<script>
-var doMutation = function() {
- var region = document.getElementById("to_mutate");
- region.firstChild.textContent = "New text contents";
-
- window.setTimeout(function() { window.close(); } );
-}
-window.addEventListener("load", doMutation);
-</script>
-</head>
-<body>
-<div id="to_mutate" aria-live="polite" aria-relevant="text" aria-atomic="false">
- Original contents.
-</div>
-</body>
-</html>
diff --git a/src/cobalt/accessibility/testdata/live_region/non-relevant-mutations.expected b/src/cobalt/accessibility/testdata/live_region/non-relevant-mutations.expected
deleted file mode 100644
index e69de29..0000000
--- a/src/cobalt/accessibility/testdata/live_region/non-relevant-mutations.expected
+++ /dev/null
diff --git a/src/cobalt/accessibility/testdata/live_region/non-relevant-mutations.html b/src/cobalt/accessibility/testdata/live_region/non-relevant-mutations.html
deleted file mode 100644
index f315236..0000000
--- a/src/cobalt/accessibility/testdata/live_region/non-relevant-mutations.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<html>
-<head>
-<script>
-var doMutation = function() {
- var text_only_region = document.getElementById("text_only");
- var to_remove = document.getElementById("text_only_to_remove");
- text_only_region.removeChild(to_remove);
- text_only_region.appendChild(document.createTextNode("Irrelevant"))
-
- var additions_only_region = document.getElementById("additions_only");
- to_remove = document.getElementById("additions_only_to_remove");
- additions_only_region.removeChild(to_remove);
-
- var to_mutate = document.getElementById("additions_only_to_mutate");
- to_mutate.firstChild.textContent = "New Content";
-
- window.setTimeout(function() { window.close(); } );
-}
-window.addEventListener("load", doMutation);
-</script>
-</head>
-<body>
-<div id="text_only" aria-live="polite" aria-relevant="text" aria-atomic="false">
- Some contents
- <div id="text_only_to_remove">
- Contents to be removed
- </div>
-<div>
-<div id="additions_only" aria-live="polite" aria-relevant="additions" aria-atomic="false">
- Some contents
- <div id="additions_only_to_remove">
- Contents to be removed
- </div>
- <div id="additions_only_to_mutate">
- Old text contents
- </div>
-<div>
-</body>
-</html>
diff --git a/src/cobalt/accessibility/testdata/live_region/remove-child.expected b/src/cobalt/accessibility/testdata/live_region/remove-child.expected
deleted file mode 100644
index c08dfdb..0000000
--- a/src/cobalt/accessibility/testdata/live_region/remove-child.expected
+++ /dev/null
@@ -1 +0,0 @@
-Removed. Contents to be removed
diff --git a/src/cobalt/accessibility/testdata/live_region/remove-child.html b/src/cobalt/accessibility/testdata/live_region/remove-child.html
deleted file mode 100644
index 40727ec..0000000
--- a/src/cobalt/accessibility/testdata/live_region/remove-child.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<html>
-<head>
-<script>
-var doMutation = function() {
- var region = document.getElementById("to_mutate");
- var to_remove = document.getElementById("to_remove");
- region.removeChild(to_remove);
- window.setTimeout(function() { window.close(); } );
-}
-window.addEventListener("load", doMutation);
-</script>
-</head>
-<body>
-<div id="to_mutate" aria-live="polite" aria-relevant="removals" aria-atomic="false">
- Some contents
- <div id="to_remove">
- Contents to be removed
- </div>
-</div>
-</body>
-</html>
diff --git a/src/cobalt/accessibility/testdata/text_alternative/hidden-by-parent.expected b/src/cobalt/accessibility/testdata/text_alternative/hidden-by-parent.expected
deleted file mode 100644
index 8b13789..0000000
--- a/src/cobalt/accessibility/testdata/text_alternative/hidden-by-parent.expected
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/cobalt/accessibility/testdata/text_alternative/hidden-by-parent.html b/src/cobalt/accessibility/testdata/text_alternative/hidden-by-parent.html
deleted file mode 100644
index 7efd526..0000000
--- a/src/cobalt/accessibility/testdata/text_alternative/hidden-by-parent.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
- <div aria-hidden="true">
- <div id="element_to_test" >
- This text shouldn't be used.
- </div>
- </div>
-</html>
diff --git a/src/cobalt/accessibility/testdata/text_alternative/hidden-labelledby.expected b/src/cobalt/accessibility/testdata/text_alternative/hidden-labelledby.expected
deleted file mode 100644
index 78c1792..0000000
--- a/src/cobalt/accessibility/testdata/text_alternative/hidden-labelledby.expected
+++ /dev/null
@@ -1 +0,0 @@
-Hidden labelled by target.
diff --git a/src/cobalt/accessibility/testdata/text_alternative/hidden-labelledby.html b/src/cobalt/accessibility/testdata/text_alternative/hidden-labelledby.html
deleted file mode 100644
index 5294f75..0000000
--- a/src/cobalt/accessibility/testdata/text_alternative/hidden-labelledby.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<html>
- <div id="element_to_test" aria-labelledby="hidden_target"/>
- <div aria-hidden="true">
- <div id="hidden_target" >
- Hidden labelled by target.
- </div>
- </div>
-</html>
diff --git a/src/cobalt/accessibility/testdata/text_alternative/self-reference-labelledby.expected b/src/cobalt/accessibility/testdata/text_alternative/self-reference-labelledby.expected
deleted file mode 100644
index 32de814..0000000
--- a/src/cobalt/accessibility/testdata/text_alternative/self-reference-labelledby.expected
+++ /dev/null
@@ -1 +0,0 @@
-The aria label
diff --git a/src/cobalt/accessibility/testdata/text_alternative/self-reference-labelledby.html b/src/cobalt/accessibility/testdata/text_alternative/self-reference-labelledby.html
deleted file mode 100644
index 6225503..0000000
--- a/src/cobalt/accessibility/testdata/text_alternative/self-reference-labelledby.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<html>
- <div id="element_to_test" aria-label="The aria label" aria-labelledby="element_to_test">
- </div>
-</html>
diff --git a/src/cobalt/accessibility/testdata/text_alternative/text-content.expected b/src/cobalt/accessibility/testdata/text_alternative/text-content.expected
deleted file mode 100644
index 401745c..0000000
--- a/src/cobalt/accessibility/testdata/text_alternative/text-content.expected
+++ /dev/null
@@ -1 +0,0 @@
-Use text content
diff --git a/src/cobalt/accessibility/testdata/text_alternative/text-content.html b/src/cobalt/accessibility/testdata/text_alternative/text-content.html
deleted file mode 100644
index 000c8be..0000000
--- a/src/cobalt/accessibility/testdata/text_alternative/text-content.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
- <div id="element_to_test">
- Use text content
- </div>
-</html>
diff --git a/src/cobalt/accessibility/text_alternative.cc b/src/cobalt/accessibility/text_alternative.cc
deleted file mode 100644
index c06731d..0000000
--- a/src/cobalt/accessibility/text_alternative.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2017 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 "cobalt/accessibility/text_alternative.h"
-
-#include "cobalt/accessibility/internal/text_alternative_helper.h"
-#include "cobalt/dom/document.h"
-#include "cobalt/dom/element.h"
-#include "cobalt/dom/text.h"
-
-namespace cobalt {
-namespace accessibility {
-std::string ComputeTextAlternative(const scoped_refptr<dom::Node>& node) {
- // Update the computed styles first to ensure that any CSS that would modify
- // the text contents has been applied (such as :before and :after).
- if (node->node_document()) {
- node->node_document()->UpdateComputedStyles();
- }
- internal::TextAlternativeHelper helper;
- helper.AppendTextAlternative(node);
- return helper.GetTextAlternative();
-}
-} // namespace accessibility
-} // namespace cobalt
diff --git a/src/cobalt/accessibility/text_alternative.h b/src/cobalt/accessibility/text_alternative.h
deleted file mode 100644
index c274fce..0000000
--- a/src/cobalt/accessibility/text_alternative.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2017 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 COBALT_ACCESSIBILITY_TEXT_ALTERNATIVE_H_
-#define COBALT_ACCESSIBILITY_TEXT_ALTERNATIVE_H_
-
-#include <string>
-
-#include "cobalt/dom/node.h"
-
-namespace cobalt {
-namespace accessibility {
-
-// Compute the Text Alternative for the node per the wai-aria specification:
-// https://www.w3.org/TR/2014/REC-wai-aria-implementation-20140320/#mapping_additional_nd_te
-std::string ComputeTextAlternative(const scoped_refptr<dom::Node>& node);
-
-} // namespace accessibility
-} // namespace cobalt
-
-#endif // COBALT_ACCESSIBILITY_TEXT_ALTERNATIVE_H_
diff --git a/src/cobalt/accessibility/tts_engine.h b/src/cobalt/accessibility/tts_engine.h
deleted file mode 100644
index bba0aae..0000000
--- a/src/cobalt/accessibility/tts_engine.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 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 COBALT_ACCESSIBILITY_TTS_ENGINE_H_
-#define COBALT_ACCESSIBILITY_TTS_ENGINE_H_
-
-#include <string>
-
-namespace cobalt {
-namespace accessibility {
-// Interface for a TTS (text-to-speech) implementation.
-class TTSEngine {
- public:
- // Speaks the contents of |text|, pre-empting any utterances that are
- // currently in progress.
- virtual void SpeakNow(const std::string& text) = 0;
- // Queues the contents of |text| to be spoken after any in-progress utterances
- // are finished.
- virtual void Speak(const std::string& text) = 0;
- virtual ~TTSEngine() {}
-};
-} // namespace accessibility
-} // namespace cobalt
-
-#endif // COBALT_ACCESSIBILITY_TTS_ENGINE_H_
diff --git a/src/cobalt/accessibility/tts_logger.h b/src/cobalt/accessibility/tts_logger.h
deleted file mode 100644
index 25d2eed..0000000
--- a/src/cobalt/accessibility/tts_logger.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 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 COBALT_ACCESSIBILITY_TTS_LOGGER_H_
-#define COBALT_ACCESSIBILITY_TTS_LOGGER_H_
-
-#include <string>
-
-#include "base/logging.h"
-#include "cobalt/accessibility/tts_engine.h"
-
-namespace cobalt {
-namespace accessibility {
-// TTSEngine implementation that just logs the text.
-class TTSLogger : public TTSEngine {
- public:
- void SpeakNow(const std::string& text) override { LogText(text); }
- void Speak(const std::string& text) override { LogText(text); }
-
- private:
- void LogText(const std::string& text) {
- LOG(INFO) << "Text-to-speech: " << text;
- }
- virtual ~TTSLogger() {}
-};
-} // namespace accessibility
-} // namespace cobalt
-
-#endif // COBALT_ACCESSIBILITY_TTS_LOGGER_H_
diff --git a/src/cobalt/audio/audio_device.cc b/src/cobalt/audio/audio_device.cc
index 11ed4d2..8b7159d 100644
--- a/src/cobalt/audio/audio_device.cc
+++ b/src/cobalt/audio/audio_device.cc
@@ -12,6 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+#include <algorithm>
#include <memory>
#include "cobalt/audio/audio_device.h"
@@ -30,11 +31,7 @@
namespace {
const int kRenderBufferSizeFrames = 1024;
-// AudioDevice will keep writing silence frames at the end of playback until the
-// buffer is full to ensure the audible frames being played on platforms with
-// strict underflow control. A large |kFramesPerChannel| will increase the
-// silence between two sounds. So it shouldn't be set to a very large number.
-const int kFramesPerChannel = kRenderBufferSizeFrames * 8;
+const int kDefaultFramesPerChannel = 8 * kRenderBufferSizeFrames;
} // namespace
class AudioDevice::Impl {
@@ -64,6 +61,7 @@
int number_of_channels_;
SbMediaAudioSampleType output_sample_type_;
RenderCallback* render_callback_;
+ int frames_per_channel_;
// The |render_callback_| returns audio data in planar form. So we read it
// into |input_audio_bus_| and convert it into interleaved form and store in
@@ -90,11 +88,19 @@
: number_of_channels_(number_of_channels),
output_sample_type_(GetPreferredOutputStarboardSampleType()),
render_callback_(callback),
+#if SB_API_VERSION >= 11
+ frames_per_channel_(std::max(SbAudioSinkGetMinBufferSizeInFrames(
+ number_of_channels, output_sample_type_,
+ kStandardOutputSampleRate),
+ kDefaultFramesPerChannel)),
+#else // SB_API_VERSION >= 11
+ frames_per_channel_(kDefaultFramesPerChannel),
+#endif // SB_API_VERSION >= 11
input_audio_bus_(static_cast<size_t>(number_of_channels),
static_cast<size_t>(kRenderBufferSizeFrames),
GetPreferredOutputSampleType(), ShellAudioBus::kPlanar),
output_frame_buffer_(
- new uint8[kFramesPerChannel * number_of_channels_ *
+ new uint8[frames_per_channel_ * number_of_channels_ *
GetStarboardSampleTypeSize(output_sample_type_)]) {
DCHECK(number_of_channels_ == 1 || number_of_channels_ == 2)
<< "Invalid number of channels: " << number_of_channels_;
@@ -109,7 +115,7 @@
audio_sink_ = SbAudioSinkCreate(
number_of_channels_, kStandardOutputSampleRate, output_sample_type_,
kSbMediaAudioFrameStorageTypeInterleaved, frame_buffers_,
- kFramesPerChannel, &AudioDevice::Impl::UpdateSourceStatusFunc,
+ frames_per_channel_, &AudioDevice::Impl::UpdateSourceStatusFunc,
&AudioDevice::Impl::ConsumeFramesFunc, this);
DCHECK(SbAudioSinkIsValid(audio_sink_));
}
@@ -168,7 +174,7 @@
DCHECK_GE(frames_rendered_, frames_consumed_);
*frames_in_buffer = static_cast<int>(frames_rendered_ - frames_consumed_);
- if ((kFramesPerChannel - *frames_in_buffer) >= kRenderBufferSizeFrames) {
+ if ((frames_per_channel_ - *frames_in_buffer) >= kRenderBufferSizeFrames) {
// If there was silence last time we were called, then the buffer has
// already been zeroed out and we don't need to do it again.
if (!was_silence_last_update_) {
@@ -197,7 +203,7 @@
was_silence_last_update_ = silence;
}
- *offset_in_frames = frames_consumed_ % kFramesPerChannel;
+ *offset_in_frames = frames_consumed_ % frames_per_channel_;
}
void AudioDevice::Impl::ConsumeFrames(int frames_consumed) {
@@ -208,7 +214,7 @@
inline void AudioDevice::Impl::FillOutputAudioBusForType() {
// Determine the offset into the audio bus that represents the tail of
// buffered data.
- uint64 channel_offset = frames_rendered_ % kFramesPerChannel;
+ uint64 channel_offset = frames_rendered_ % frames_per_channel_;
OutputType* output_buffer =
reinterpret_cast<OutputType*>(output_frame_buffer_.get());
diff --git a/src/cobalt/base/wrap_main_starboard.h b/src/cobalt/base/wrap_main_starboard.h
index 4dfa576..7ff43f1 100644
--- a/src/cobalt/base/wrap_main_starboard.h
+++ b/src/cobalt/base/wrap_main_starboard.h
@@ -24,6 +24,9 @@
#include "starboard/client_porting/wrap_main/wrap_main.h"
#include "starboard/event.h"
#include "starboard/system.h"
+#if SB_IS(EVERGREEN)
+#include "third_party/musl/src/starboard/internal/hwcap_impl.h"
+#endif
namespace cobalt {
namespace wrap_main {
@@ -42,6 +45,9 @@
DCHECK(!g_started);
DCHECK(!g_at_exit);
g_at_exit = new base::AtExitManager();
+#if SB_IS(EVERGREEN)
+ init_musl_hwcap();
+#endif
InitCobalt(data->argument_count, data->argument_values, data->link);
DCHECK(!g_loop);
@@ -59,7 +65,9 @@
if (!g_started) {
DCHECK(!g_at_exit);
g_at_exit = new base::AtExitManager();
-
+#if SB_IS(EVERGREEN)
+ init_musl_hwcap();
+#endif
InitCobalt(data->argument_count, data->argument_values, data->link);
DCHECK(!g_loop);
diff --git a/src/cobalt/bindings/README.md b/src/cobalt/bindings/README.md
index d276dc4..bb956cc 100644
--- a/src/cobalt/bindings/README.md
+++ b/src/cobalt/bindings/README.md
@@ -151,7 +151,7 @@
# script/$engine
-Then, we designate a specific area of code to be our engine specific implementation of the interfaces established in script. We [commit to an engine at gyp time](https://cs.corp.google.com/cobalt/starboard/build/platform_configuration.py?type=cs&q=file:py+%27javascript_engine%27&sq=package:%5Ecobalt$&g=0#223), and then based on that, [select the appropriate set of files](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/script/engine.gyp?type=cs&q=file:cobalt+file:gyp+javascript_engine&sq=package:%5Ecobalt$&g=0#26). This is the only area of Cobalt code (except for bindings/*/$engine, which is essentially more of the same stuff) that is allowed to include engine specific headers (files in v8/ and third_party/mozjs-45/). Maintaining this abstraction has been useful throughout our multiple JavaScript engine migrations over the years.
+Then, we designate a specific area of code to be our engine specific implementation of the interfaces established in script. We commit to an engine at gyp time, and then based on that, [select the appropriate set of files](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/script/engine.gyp?type=cs&q=file:cobalt+file:gyp+javascript_engine&sq=package:%5Ecobalt$&g=0#26). This is the only area of Cobalt code (except for bindings/*/$engine, which is essentially more of the same stuff) that is allowed to include engine specific headers (files in v8/ and third_party/mozjs-45/). Maintaining this abstraction has been useful throughout our multiple JavaScript engine migrations over the years.
A large portion of script/$engine is filling in the types discussed in the previous section. So [V8cEngine](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/script/v8c/v8c_engine.h?q=V8cEngine&sq=package:%5Ecobalt$&dr=CSs#31) implements JavaScriptEngine by wrapping a v8::Isolate, and [V8cGlobalEnvironment](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/script/v8c/v8c_global_environment.h?type=cs&q=V8cGlobalEnvironment&sq=package:%5Ecobalt$&g=0#44) implements GlobalEnvironment by wrapping a v8::Context. Note that these files are actually quite a bit bigger than just being thin wrappers over the V8 types, as they have more work to do in addition to just implementing their script interfaces, such as [maintaining state necessary for bindings](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/script/v8c/v8c_global_environment.h?type=cs&q=V8cGlobalEnvironment&sq=package:%5Ecobalt$&g=0#175) (interface objects need to be owned somewhere), [serving as a bridge between the Isolate](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/script/v8c/v8c_global_environment.h?type=cs&q=V8cGlobalEnvironment&sq=package:%5Ecobalt$&g=0#49), and [dealing with garbage collection interaction](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/script/v8c/v8c_engine.h?q=V8cEngine&sq=package:%5Ecobalt$&dr=CSs#61) (the engine specific [script::Tracer](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/script/tracer.h?type=cs&q=script::Tracer&sq=package:%5Ecobalt$&g=0#54) is implemented near them).
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index 4ab000d..277a0e3 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -18,14 +18,10 @@
#include "cobalt/browser/application.h"
-#include <algorithm>
-#include <map>
#include <memory>
#include <string>
#include <vector>
-#include "base/base64.h"
-#include "base/base64url.h"
#include "base/command_line.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
@@ -57,6 +53,7 @@
#include "cobalt/base/version_compatibility.h"
#endif // defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
#include "cobalt/base/window_size_changed_event.h"
+#include "cobalt/browser/device_authentication.h"
#include "cobalt/browser/memory_settings/auto_mem_settings.h"
#include "cobalt/browser/memory_tracker/tool.h"
#include "cobalt/browser/switches.h"
@@ -68,8 +65,6 @@
#endif // defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
#include "cobalt/system_window/input_event.h"
#include "cobalt/trace_event/scoped_trace_to_file.h"
-#include "crypto/hmac.h"
-#include "net/base/escape.h"
#include "starboard/configuration.h"
#include "url/gurl.h"
@@ -159,56 +154,6 @@
}
#endif // ENABLE_WEBDRIVER
-#if SB_API_VERSION >= 11
-std::string NumberToFourByteString(size_t n) {
- std::string str;
- str += static_cast<char>(((n & 0xff000000) >> 24));
- str += static_cast<char>(((n & 0x00ff0000) >> 16));
- str += static_cast<char>(((n & 0x0000ff00) >> 8));
- str += static_cast<char>((n & 0x000000ff));
- return str;
-}
-
-std::string BuildMessageFragment(const std::string& key,
- const std::string& value) {
- std::string msg_fragment = NumberToFourByteString(key.length()) + key +
- NumberToFourByteString(value.length()) + value;
- return msg_fragment;
-}
-
-std::string ComputeSignature(const std::string& cert_scope,
- const std::string& start_time,
- const std::string& base_64_secret) {
- const size_t kSHA256DigestSize = 32;
-
- // Build signed_msg from cert_scope and start_time.
- std::string signed_msg = BuildMessageFragment("cert_scope", cert_scope);
- signed_msg += BuildMessageFragment("start_time", start_time);
-
- // Decode secret from base_64_secret.
- std::string secret;
- base::Base64Decode(base_64_secret, &secret);
-
- // Generate signature from signed_msg using HMAC-SHA256.
- unsigned char signature_hash[kSHA256DigestSize] = {0};
- crypto::HMAC hmac(crypto::HMAC::SHA256);
- if (!hmac.Init(secret)) {
- DLOG(ERROR) << "Unable to initialize HMAC-SHA256.";
- }
- if (!hmac.Sign(signed_msg, signature_hash, kSHA256DigestSize)) {
- DLOG(ERROR) << "Unable to sign HMAC-SHA256.";
- }
- std::string signature(signature_hash, signature_hash + kSHA256DigestSize);
-
- // Encode base_64_url_signature from signature.
- std::string base_64_url_signature;
- base::Base64UrlEncode(signature, base::Base64UrlEncodePolicy::OMIT_PADDING,
- &base_64_url_signature);
-
- return base_64_url_signature;
-}
-#endif // SB_API_VERSION >= 11
-
GURL GetInitialURL() {
GURL initial_url = GURL(kDefaultURL);
// Allow the user to override the default URL via a command line parameter.
@@ -224,59 +169,21 @@
}
#if SB_API_VERSION >= 11
- // Get cert_scope and base_64_secret
- const size_t kCertificationScopeLength = 1023;
- char cert_scope_property[kCertificationScopeLength + 1] = {0};
- bool result =
- SbSystemGetProperty(kSbSystemPropertyCertificationScope,
- cert_scope_property, kCertificationScopeLength);
- if (!result) {
- DLOG(ERROR) << "Unable to get kSbSystemPropertyCertificationScope";
- return initial_url;
- }
- std::string cert_scope(cert_scope_property);
-
- const size_t kBase64EncodedCertificationSecretLength = 1023;
- char base_64_secret_property[kBase64EncodedCertificationSecretLength + 1] = {
- 0};
- result = SbSystemGetProperty(
- kSbSystemPropertyBase64EncodedCertificationSecret,
- base_64_secret_property, kBase64EncodedCertificationSecretLength);
- if (!result) {
- DLOG(ERROR)
- << "Unable to get kSbSystemPropertyBase64EncodedCertificationSecret";
- return initial_url;
- }
- std::string base_64_secret(base_64_secret_property);
-
- // Get current unix time in seconds.
- std::string start_time =
- std::to_string(static_cast<int64>(base::Time::Now().ToDoubleT()));
-
- // Add signed_query to the initial_url.
- std::map<std::string, std::string> signed_query;
- signed_query["cert_scope"] = cert_scope;
- signed_query["start_time"] = start_time;
- signed_query["sig"] =
- ComputeSignature(cert_scope, start_time, base_64_secret);
-
+ // Append the device authentication query parameters based on the platform's
+ // certification secret to the initial URL.
std::string query = initial_url.query();
- std::map<std::string, std::string>::iterator it = signed_query.begin();
- while (it != signed_query.end()) {
- std::string key = it->first;
- std::string value = it->second;
-
- if (!query.empty()) query += "&";
- query += net::EscapeQueryParamValue(key, true);
- if (!value.empty()) {
- query += "=" + net::EscapeQueryParamValue(value, true);
- }
- it++;
+ std::string device_authentication_query_string =
+ GetDeviceAuthenticationSignedURLQueryString();
+ if (!query.empty() && !device_authentication_query_string.empty()) {
+ query += "&";
}
+ query += device_authentication_query_string;
- GURL::Replacements replacements;
- replacements.SetQueryStr(query);
- initial_url = initial_url.ReplaceComponents(replacements);
+ if (!query.empty()) {
+ GURL::Replacements replacements;
+ replacements.SetQueryStr(query);
+ initial_url = initial_url.ReplaceComponents(replacements);
+ }
#endif // SB_API_VERSION >= 11
return initial_url;
diff --git a/src/cobalt/browser/browser.gyp b/src/cobalt/browser/browser.gyp
index 7b04429..5ac69e0 100644
--- a/src/cobalt/browser/browser.gyp
+++ b/src/cobalt/browser/browser.gyp
@@ -28,6 +28,8 @@
'application.h',
'browser_module.cc',
'browser_module.h',
+ 'device_authentication.cc',
+ 'device_authentication.h',
'lifecycle_observer.h',
'memory_settings/auto_mem.cc',
'memory_settings/auto_mem.h',
@@ -126,7 +128,6 @@
],
'dependencies': [
'<@(cobalt_platform_dependencies)',
- '<(DEPTH)/cobalt/accessibility/accessibility.gyp:accessibility',
'<(DEPTH)/cobalt/account/account.gyp:account',
'<(DEPTH)/cobalt/audio/audio.gyp:audio',
'<(DEPTH)/cobalt/base/base.gyp:base',
@@ -219,6 +220,7 @@
'target_name': 'browser_test',
'type': '<(gtest_target_type)',
'sources': [
+ 'device_authentication_test.cc',
'storage_upgrade_handler_test.cc',
'memory_settings/auto_mem_test.cc',
'memory_settings/auto_mem_settings_test.cc',
diff --git a/src/cobalt/browser/browser_bindings_gen.gyp b/src/cobalt/browser/browser_bindings_gen.gyp
index 6a50f63..4d50786 100644
--- a/src/cobalt/browser/browser_bindings_gen.gyp
+++ b/src/cobalt/browser/browser_bindings_gen.gyp
@@ -52,7 +52,6 @@
'../dom/audio_track.idl',
'../dom/audio_track_list.idl',
'../dom/blob.idl',
- '../dom/c_val_key_list.idl',
'../dom/c_val_view.idl',
'../dom/camera_3d.idl',
'../dom/captions/system_caption_settings.idl',
@@ -175,7 +174,6 @@
'../h5vcc/h5vcc_runtime_event_target.idl',
'../h5vcc/h5vcc_settings.idl',
'../h5vcc/h5vcc_sso.idl',
- '../h5vcc/h5vcc_storage.idl',
'../h5vcc/h5vcc_system.idl',
'../h5vcc/h5vcc_trace_event.idl',
diff --git a/src/cobalt/browser/debug_console.cc b/src/cobalt/browser/debug_console.cc
index 27f4263..b769196 100644
--- a/src/cobalt/browser/debug_console.cc
+++ b/src/cobalt/browser/debug_console.cc
@@ -56,21 +56,6 @@
}
}
-// Convert from mode to string.
-std::string DebugConsoleModeIntToString(int mode) {
- switch (mode) {
- case debug::console::DebugHub::kDebugConsoleHud:
- return kDebugConsoleHudString;
- case debug::console::DebugHub::kDebugConsoleOn:
- return kDebugConsoleOnString;
- case debug::console::DebugHub::kDebugConsoleOff:
- return kDebugConsoleOffString;
- default:
- NOTREACHED();
- return kDebugConsoleOffString;
- }
-}
-
// Returns the debug console mode as specified by the command line.
// If unspecified by the command line, base::nullopt is returned.
base::Optional<int> GetDebugConsoleModeFromCommandLine() {
@@ -86,45 +71,6 @@
return base::nullopt;
}
-// Returns the path of the temporary file used to store debug console visibility
-// mode preferences.
-bool GetDebugConsoleModeStoragePath(base::FilePath* out_file_path) {
- DCHECK(out_file_path);
- if (base::PathService::Get(cobalt::paths::DIR_COBALT_DEBUG_OUT,
- out_file_path)) {
- *out_file_path = out_file_path->Append("last_debug_console_mode.txt");
- return true;
- } else {
- return false;
- }
-}
-
-// Saves the specified visibility mode preferences to disk so that they can
-// be restored in another session. Since this functionality is not critical,
-// we silently do nothing if there is a failure.
-void SaveModeToPreferences(int mode) {
- std::string mode_string = DebugConsoleModeIntToString(mode);
- base::FilePath preferences_file;
- if (GetDebugConsoleModeStoragePath(&preferences_file)) {
- base::WriteFile(preferences_file, mode_string.c_str(),
- static_cast<int>(mode_string.size()));
- }
-}
-
-// Load debug console visibility mode preferences from disk. Since this
-// functionality is not critical, we silently do nothing if there is a failure.
-base::Optional<int> LoadModeFromPreferences() {
- std::string saved_contents;
- base::FilePath preferences_file;
- if (GetDebugConsoleModeStoragePath(&preferences_file)) {
- if (base::ReadFileToString(preferences_file, &saved_contents)) {
- return DebugConsoleModeStringToInt(saved_contents);
- }
- }
-
- return base::nullopt;
-}
-
// Returns the debug console's initial visibility mode.
int GetInitialMode() {
// First check to see if the mode is explicitly set from the command line.
@@ -134,13 +80,7 @@
return *mode_from_command_line;
}
- // Now check to see if mode preferences have been saved to disk.
- base::Optional<int> mode_from_preferences = LoadModeFromPreferences();
- if (mode_from_preferences) {
- return *mode_from_preferences;
- }
-
- // If all else fails, default the debug console to off.
+ // By default the debug console is off.
return debug::console::DebugHub::kDebugConsoleOff;
}
@@ -239,23 +179,13 @@
#endif // SB_HAS(ON_SCREEN_KEYBOARD)
void DebugConsole::SetMode(int mode) {
- int mode_to_save;
- {
- base::AutoLock lock(mode_mutex_);
- mode_ = mode;
- mode_to_save = mode_;
- }
- SaveModeToPreferences(mode_to_save);
+ base::AutoLock lock(mode_mutex_);
+ mode_ = mode;
}
void DebugConsole::CycleMode() {
- int mode_to_save;
- {
- base::AutoLock lock(mode_mutex_);
- mode_ = (mode_ + 1) % debug::console::DebugHub::kDebugConsoleNumModes;
- mode_to_save = mode_;
- }
- SaveModeToPreferences(mode_to_save);
+ base::AutoLock lock(mode_mutex_);
+ mode_ = (mode_ + 1) % debug::console::DebugHub::kDebugConsoleNumModes;
}
int DebugConsole::GetMode() {
diff --git a/src/cobalt/browser/device_authentication.cc b/src/cobalt/browser/device_authentication.cc
new file mode 100644
index 0000000..7c8eeea
--- /dev/null
+++ b/src/cobalt/browser/device_authentication.cc
@@ -0,0 +1,200 @@
+// Copyright 2019 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 "cobalt/browser/device_authentication.h"
+
+#include <algorithm>
+#include <map>
+
+#include "base/base64.h"
+#include "base/base64url.h"
+#include "base/logging.h"
+#include "base/time/time.h"
+#include "crypto/hmac.h"
+#include "net/base/escape.h"
+#include "starboard/system.h"
+
+namespace cobalt {
+namespace browser {
+
+#if SB_API_VERSION >= 11
+
+namespace {
+
+constexpr size_t kSHA256DigestSize = 32;
+
+bool ComputeSignatureWithSystemPropertySecret(const std::string& message,
+ uint8_t* signature) {
+ const size_t kBase64EncodedCertificationSecretLength = 1023;
+ char base_64_secret_property[kBase64EncodedCertificationSecretLength + 1] = {
+ 0};
+ bool result = SbSystemGetProperty(
+ kSbSystemPropertyBase64EncodedCertificationSecret,
+ base_64_secret_property, kBase64EncodedCertificationSecretLength);
+ if (!result) {
+ return false;
+ }
+
+ ComputeHMACSHA256SignatureWithProvidedKey(message, base_64_secret_property,
+ signature, kSHA256DigestSize);
+ return true;
+}
+
+bool ComputeSignatureFromSignAPI(const std::string& message,
+ uint8_t* signature) {
+ return SbSystemSignWithCertificationSecretKey(
+ reinterpret_cast<const uint8_t*>(message.data()), message.size(),
+ signature, kSHA256DigestSize);
+}
+
+// Check to see if we can query the platform for the secret key. If so,
+// go ahead and use it to sign the message, otherwise try to use the
+// SbSystemSignWithCertificationSecretKey() method to sign the message. If
+// both methods fail, return an empty string.
+std::string ComputeBase64Signature(const std::string& message) {
+ uint8_t signature[kSHA256DigestSize];
+
+ if (ComputeSignatureFromSignAPI(message, signature)) {
+ DLOG(INFO) << "Using certification signature provided by "
+ << "SbSystemSignWithCertificationSecretKey().";
+ } else if (ComputeSignatureWithSystemPropertySecret(message, signature)) {
+ DLOG(INFO) << "Using certification key from SbSystemGetProperty().";
+ } else {
+ return std::string();
+ }
+
+ std::string base_64_url_signature;
+ base::Base64UrlEncode(std::string(signature, signature + kSHA256DigestSize),
+ base::Base64UrlEncodePolicy::OMIT_PADDING,
+ &base_64_url_signature);
+ return base_64_url_signature;
+}
+
+std::string NumberToFourByteString(size_t n) {
+ std::string str;
+ str += static_cast<char>(((n & 0xff000000) >> 24));
+ str += static_cast<char>(((n & 0x00ff0000) >> 16));
+ str += static_cast<char>(((n & 0x0000ff00) >> 8));
+ str += static_cast<char>((n & 0x000000ff));
+ return str;
+}
+
+// Used by ComputeMessage() to create a message component as a string.
+std::string BuildMessageFragment(const std::string& key,
+ const std::string& value) {
+ std::string msg_fragment = NumberToFourByteString(key.length()) + key +
+ NumberToFourByteString(value.length()) + value;
+ return msg_fragment;
+}
+
+// Returns the certification scope provided by the platform to use with device
+// authentication.
+std::string GetCertScopeFromPlatform() {
+ // Get cert_scope and base_64_secret
+ const size_t kCertificationScopeLength = 1023;
+ char cert_scope_property[kCertificationScopeLength + 1] = {0};
+ bool result =
+ SbSystemGetProperty(kSbSystemPropertyCertificationScope,
+ cert_scope_property, kCertificationScopeLength);
+ if (!result) {
+ DLOG(ERROR) << "Unable to get kSbSystemPropertyCertificationScope";
+ return std::string();
+ }
+
+ return cert_scope_property;
+}
+
+// Returns the start time provided by the platform for use with device
+// authentication.
+std::string GetStartTime() {
+ return std::to_string(static_cast<int64_t>(base::Time::Now().ToDoubleT()));
+}
+
+} // namespace
+
+std::string GetDeviceAuthenticationSignedURLQueryString() {
+ std::string cert_scope = GetCertScopeFromPlatform();
+ if (cert_scope.empty()) {
+ LOG(WARNING) << "Error retrieving certification scope required for "
+ << "device authentication.";
+ return std::string();
+ }
+ std::string start_time = GetStartTime();
+ CHECK(!start_time.empty());
+
+ std::string base64_signature =
+ ComputeBase64Signature(ComputeMessage(cert_scope, start_time));
+
+ return GetDeviceAuthenticationSignedURLQueryStringFromComponents(
+ cert_scope, start_time, base64_signature);
+}
+
+std::string GetDeviceAuthenticationSignedURLQueryStringFromComponents(
+ const std::string& cert_scope, const std::string& start_time,
+ const std::string& base64_signature) {
+ CHECK(!cert_scope.empty());
+ CHECK(!start_time.empty());
+
+ std::map<std::string, std::string> signed_query_components;
+ signed_query_components["cert_scope"] = cert_scope;
+ signed_query_components["start_time"] = start_time;
+ signed_query_components["sig"] = base64_signature;
+
+ std::string query;
+ for (const auto& query_component : signed_query_components) {
+ const std::string& key = query_component.first;
+ const std::string& value = query_component.second;
+
+ if (!query.empty()) query += "&";
+ query += net::EscapeQueryParamValue(key, true);
+ if (!value.empty()) {
+ query += "=" + net::EscapeQueryParamValue(value, true);
+ }
+ }
+
+ return query;
+}
+
+// Combine multiple message components into a string that will be used as the
+// message that we will sign.
+std::string ComputeMessage(const std::string& cert_scope,
+ const std::string& start_time) {
+ // Build message from cert_scope and start_time.
+ return BuildMessageFragment("cert_scope", cert_scope) +
+ BuildMessageFragment("start_time", start_time);
+}
+
+void ComputeHMACSHA256SignatureWithProvidedKey(const std::string& message,
+ const std::string& base64_key,
+ uint8_t* signature,
+ size_t signature_size_in_bytes) {
+ CHECK_GE(signature_size_in_bytes, 32U);
+
+ std::string key;
+ base::Base64Decode(base64_key, &key);
+
+ // Generate signature from message using HMAC-SHA256.
+ crypto::HMAC hmac(crypto::HMAC::SHA256);
+ if (!hmac.Init(key)) {
+ DLOG(ERROR) << "Unable to initialize HMAC-SHA256.";
+ }
+ if (!hmac.Sign(message, signature, signature_size_in_bytes)) {
+ DLOG(ERROR) << "Unable to sign HMAC-SHA256.";
+ }
+}
+
+#endif // SB_API_VERSION >= 11
+
+} // namespace browser
+} // namespace cobalt
diff --git a/src/cobalt/browser/device_authentication.h b/src/cobalt/browser/device_authentication.h
new file mode 100644
index 0000000..f3ca94b
--- /dev/null
+++ b/src/cobalt/browser/device_authentication.h
@@ -0,0 +1,60 @@
+// Copyright 2019 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 COBALT_BROWSER_DEVICE_AUTHENTICATION_H_
+#define COBALT_BROWSER_DEVICE_AUTHENTICATION_H_
+
+#include <string>
+
+#include "starboard/configuration.h"
+#include "starboard/types.h"
+
+namespace cobalt {
+namespace browser {
+
+#if SB_API_VERSION >= 11
+
+// Returns a base64 encoded SHA256 hash representing the device authentication
+// signature based on the device certification scope and the current time.
+std::string GetDeviceAuthenticationSignedURLQueryString();
+
+// The following methods are deterministic helper functions used in the
+// implementation of the public method above. They are declared here so that
+// they can be tested in (white box) unit tests.
+
+// Similar to the method above, but all platform queries are resolved to make
+// this a deterministic and testable function.
+std::string GetDeviceAuthenticationSignedURLQueryStringFromComponents(
+ const std::string& cert_scope, const std::string& start_time,
+ const std::string& base64_signature);
+
+// Given the certification parameters, computes a message to be used as input
+// to the signing process.
+std::string ComputeMessage(const std::string& cert_scope,
+ const std::string& start_time);
+
+// Given a message (arbitrary sequence of bytes) and a base64-encoded key
+// key, compute the HMAC-SHA256 signature and store it in the |signature_hash|
+// out parameter. Note that 32 bytes will be written to the output hash, it is
+// an error if |signature_hash_size_in_bytes| is less than 32.
+void ComputeHMACSHA256SignatureWithProvidedKey(
+ const std::string& message, const std::string& base64_key,
+ uint8_t* signature_hash, size_t signature_hash_size_in_bytes);
+
+#endif // SB_API_VERSION >= 11
+
+} // namespace browser
+} // namespace cobalt
+
+#endif // COBALT_BROWSER_DEVICE_AUTHENTICATION_H_
diff --git a/src/cobalt/browser/device_authentication_test.cc b/src/cobalt/browser/device_authentication_test.cc
new file mode 100644
index 0000000..a820d94
--- /dev/null
+++ b/src/cobalt/browser/device_authentication_test.cc
@@ -0,0 +1,146 @@
+// Copyright 2019 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 "cobalt/browser/device_authentication.h"
+
+#include "base/base64.h"
+#include "base/base64url.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cobalt {
+namespace browser {
+
+#if SB_API_VERSION >= 11
+
+constexpr size_t kSHA256DigestSize = 32;
+
+namespace {
+
+std::string ToBase64Message(const std::string& cert_scope,
+ const std::string& start_time) {
+ std::string base64_message;
+ CHECK(base::Base64Encode(browser::ComputeMessage(cert_scope, start_time),
+ &base64_message));
+ return base64_message;
+}
+
+std::string ComputeBase64URLSignatureFromBase64Message(
+ const std::string& base64_message, const std::string& base64_secret_key) {
+ uint8_t signature[kSHA256DigestSize];
+
+ std::string message;
+ CHECK(base::Base64Decode(base64_message, &message));
+ ComputeHMACSHA256SignatureWithProvidedKey(message, base64_secret_key,
+ signature, kSHA256DigestSize);
+
+ std::string base_64_url_signature;
+ base::Base64UrlEncode(std::string(signature, signature + kSHA256DigestSize),
+ base::Base64UrlEncodePolicy::OMIT_PADDING,
+ &base_64_url_signature);
+ return base_64_url_signature;
+}
+
+std::string CreateSignedURLQueryString(const std::string& cert_scope,
+ const std::string& start_time,
+ const std::string& base64_secret_key) {
+ return GetDeviceAuthenticationSignedURLQueryStringFromComponents(
+ cert_scope, start_time,
+ ComputeBase64URLSignatureFromBase64Message(
+ ToBase64Message(cert_scope, start_time), base64_secret_key));
+}
+
+} // namespace
+
+TEST(DeviceAuthenticationTest, ComputeMessageTest) {
+ EXPECT_EQ(
+ "AAAACmNlcnRfc2NvcGUAAAANbXktY2VydC1zY29wZQAAAApzdGFydF90aW1lAAAACjE1NjUx"
+ "NjE1NTY=",
+ ToBase64Message("my-cert-scope", "1565161556"));
+ EXPECT_EQ(
+ "AAAACmNlcnRfc2NvcGUAAAATbXktb3RoZXItY2VydC1zY29wZQAAAApzdGFydF90aW1lAAAA"
+ "CjE1NjUxNjMwNjU=",
+ ToBase64Message("my-other-cert-scope", "1565163065"));
+ EXPECT_EQ(
+ "AAAACmNlcnRfc2NvcGUAAAATbXktb3RoZXItY2VydC1zY29wZQAAAApzdGFydF90aW1lAAAA"
+ "CjE1NjUxNjMyNDU=",
+ ToBase64Message("my-other-cert-scope", "1565163245"));
+ EXPECT_EQ(
+ "AAAACmNlcnRfc2NvcGUAAAATbXktb3RoZXItY2VydC1zY29wZQAAAApzdGFydF90aW1lAAAA"
+ "CjI3OTAzMjY2Mzk=",
+ ToBase64Message("my-other-cert-scope", "2790326639"));
+ EXPECT_EQ(
+ "AAAACmNlcnRfc2NvcGUAAAAEeWFjcwAAAApzdGFydF90aW1lAAAACjEzNDAwMDAzMTI=",
+ ToBase64Message("yacs", "1340000312"));
+}
+
+TEST(DeviceAuthenticationTest, ComputeSignatureWithProvidedSecretTest) {
+ EXPECT_EQ("5duoLo5TELzyMQ6Fz-nmtLH3-nR4GrYfJ5RqTWU33LY",
+ ComputeBase64URLSignatureFromBase64Message(
+ "AAAACmNlcnRfc2NvcGUAAAANbXktY2VydC1zY29wZQAAAApzdGFydF90aW1lAA"
+ "AACjE1NjUxNjE1NTY=",
+ "abcdefghijklmnop1234567890abcdefghijklmnopqr"));
+ EXPECT_EQ("zrHJxDjsg60vF-fnGD9J7QaK2fw2QEZD7PIIfHMYmUg",
+ ComputeBase64URLSignatureFromBase64Message(
+ "AAAACmNlcnRfc2NvcGUAAAATbXktb3RoZXItY2VydC1zY29wZQAAAApzdGFydF"
+ "90aW1lAAAACjE1NjUxNjMwNjU=",
+ "abcdefghijklmnop1234567890abcdefghijklmnopqr"));
+ EXPECT_EQ("FnycnpFnmzgcNBIdJoymQvrS0_1uet_bmCtpuAmQR2s",
+ ComputeBase64URLSignatureFromBase64Message(
+ "AAAACmNlcnRfc2NvcGUAAAATbXktb3RoZXItY2VydC1zY29wZQAAAApzdGFydF"
+ "90aW1lAAAACjE1NjUxNjMyNDU=",
+ "abcdefghi5555nop1234567890abcdef5555klmn6666"));
+ EXPECT_EQ("N-nDY11_8HWFKEZPiQenQrC3SXuuPahs-er-n7Xh6ig",
+ ComputeBase64URLSignatureFromBase64Message(
+ "AAAACmNlcnRfc2NvcGUAAAATbXktb3RoZXItY2VydC1zY29wZQAAAApzdGFydF"
+ "90aW1lAAAACjI3OTAzMjY2Mzk=",
+ "abcdefghi5555nop1234567890abcdef5555klmn6666"));
+ EXPECT_EQ("dX0apAEsG2yWm9da6qTded4qd-mqgExeuJam99z-AHk",
+ ComputeBase64URLSignatureFromBase64Message(
+ "AAAACmNlcnRfc2NvcGUAAAAEeWFjcwAAAApzdGFydF90aW1lAAAACjEzNDAwMD"
+ "AzMTI=",
+ "11111111111111111111111111111111111111111111"));
+}
+
+// This is the main end-to-end test for device authentication.
+TEST(DeviceAuthenticationTest,
+ GetDeviceAuthenticationSignedURLQueryStringFromComponentsTest) {
+ EXPECT_EQ(
+ "cert_scope=my-cert-scope&sig=5duoLo5TELzyMQ6Fz-nmtLH3-"
+ "nR4GrYfJ5RqTWU33LY&start_time=1565161556",
+ CreateSignedURLQueryString(
+ "my-cert-scope", "1565161556",
+ "abcdefghijklmnop1234567890abcdefghijklmnopqr"));
+ EXPECT_EQ(
+ "cert_scope=my-other-cert-scope&sig="
+ "Lf2zunrdhjH8q3ehdUy0tneTtamWigcyTgQl7zxWgnQ&start_time=123456789",
+ CreateSignedURLQueryString(
+ "my-other-cert-scope", "123456789",
+ "abcdefghijklmnop1234567890abcdefghijklmnopqr"));
+ EXPECT_EQ(
+ "cert_scope=my-other-cert-scope&sig="
+ "c5YZB0Rtv8Nf8gLSbE052ZvCUEpouP28nUq77FEgg88&start_time=11111111",
+ CreateSignedURLQueryString(
+ "my-other-cert-scope", "11111111",
+ "11111111111111111111111111111111111111111111"));
+ EXPECT_EQ(
+ "cert_scope=yacs&sig=YKjLEzSl2_ub-05Ajaww0HOOPElxEPUc4SEiQnGAfaE&start_"
+ "time=11111111",
+ CreateSignedURLQueryString(
+ "yacs", "11111111", "11111111111111111111111111111111111111111111"));
+}
+
+#endif // SB_API_VERSION >= 11
+
+} // namespace browser
+} // namespace cobalt
diff --git a/src/cobalt/browser/trace_manager.h b/src/cobalt/browser/trace_manager.h
deleted file mode 100644
index b774f11..0000000
--- a/src/cobalt/browser/trace_manager.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2016 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 COBALT_BROWSER_TRACE_MANAGER_H_
-#define COBALT_BROWSER_TRACE_MANAGER_H_
-
-#include <map>
-#include <string>
-
-#include "base/threading/thread_checker.h"
-#include "cobalt/debug/console/command_manager.h"
-#include "cobalt/trace_event/event_parser.h"
-#include "cobalt/trace_event/scoped_trace_to_file.h"
-
-namespace cobalt {
-namespace browser {
-
-// Wrapper class which wraps all trace related stuff.
-class TraceManager {
- public:
- // Returns whether there's a trace that is active.
- static bool IsTracing();
-
- TraceManager();
-
- // Called by browser module when an input event is produced.
- void OnInputEventProduced();
-
- // Message handler callback for trace message from debug console.
- void OnTraceMessage(const std::string& message);
-
- // Message handler callback for input trace message from debug console.
- void OnInputTraceMessage(const std::string& message);
-
- // Called when receiving and finishing receiving parsed trace events.
- void OnReceiveTraceEvent(
- const scoped_refptr<trace_event::EventParser::ScopedEvent>& event);
- void OnFinishReceiveTraceEvent();
-
- private:
- typedef std::multimap<int64,
- scoped_refptr<trace_event::EventParser::ScopedEvent> >
- StartTimeToEventMap;
-
- // The message loop on which we'll do all our work.
- MessageLoop* const self_message_loop_;
-
- // Command handler object for trace command from the debug console.
- debug::console::ConsoleCommandManager::CommandHandler trace_command_handler_;
- // Command handler object for input trace command from the debug console.
- debug::console::ConsoleCommandManager::CommandHandler
- input_trace_command_handler_;
- // Whether input tracing is enabled.
- bool input_tracing_enabled_;
-
- THREAD_CHECKER(thread_checker_);
- // This object can be set to start a trace if a hotkey (like F3) is pressed.
- // While initialized, it means that a trace is on-going.
- scoped_ptr<trace_event::ScopedTraceToFile> trace_to_file_;
- // Record of a list of events we're interested in, ordered by starting time.
- StartTimeToEventMap start_time_to_event_map_;
-};
-
-} // namespace browser
-} // namespace cobalt
-
-#endif // COBALT_BROWSER_TRACE_MANAGER_H_
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index e1ba8b4..40bce3c 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -594,6 +594,7 @@
media_source_registry_.reset(new dom::MediaSource::Registry);
media_session_client_ = media_session::MediaSessionClient::Create();
+ media_session_client_->SetMediaPlayerFactory(data.web_media_player_factory);
system_caption_settings_ = new cobalt::dom::captions::SystemCaptionSettings();
@@ -1076,6 +1077,7 @@
void WebModule::Impl::SetWebMediaPlayerFactory(
media::WebMediaPlayerFactory* web_media_player_factory) {
window_->set_web_media_player_factory(web_media_player_factory);
+ media_session_client_->SetMediaPlayerFactory(web_media_player_factory);
}
void WebModule::Impl::SetApplicationState(base::ApplicationState state) {
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h
index 5e94dbb..7f8ad01 100644
--- a/src/cobalt/browser/web_module.h
+++ b/src/cobalt/browser/web_module.h
@@ -26,7 +26,6 @@
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread.h"
#include "base/threading/thread_checker.h"
-#include "cobalt/accessibility/tts_engine.h"
#include "cobalt/base/address_sanitizer.h"
#include "cobalt/base/source_location.h"
#include "cobalt/browser/lifecycle_observer.h"
diff --git a/src/cobalt/build/all.gyp b/src/cobalt/build/all.gyp
index a53c52f..002d625 100644
--- a/src/cobalt/build/all.gyp
+++ b/src/cobalt/build/all.gyp
@@ -31,7 +31,6 @@
'type': 'none',
'dependencies': [
'<(DEPTH)/base/base.gyp:base_unittests',
- '<(DEPTH)/cobalt/accessibility/accessibility_test.gyp:*',
'<(DEPTH)/cobalt/audio/audio.gyp:*',
'<(DEPTH)/cobalt/audio/audio_test.gyp:*',
'<(DEPTH)/cobalt/base/base.gyp:*',
@@ -98,6 +97,11 @@
'<(DEPTH)/starboard/starboard_all.gyp:starboard_all',
],
}],
+ ['target_arch in ["x86", "x64", "arm", "arm64"]', {
+ 'dependencies': [
+ '<(DEPTH)/starboard/elf_loader/elf_loader.gyp:elf_loader',
+ ],
+ }],
],
},
],
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index 80c1e89..45fb3e0 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-217501
\ No newline at end of file
+220639
\ No newline at end of file
diff --git a/src/cobalt/build/cobalt_archive.py b/src/cobalt/build/cobalt_archive.py
index 9e50fec..e91dfe7 100644
--- a/src/cobalt/build/cobalt_archive.py
+++ b/src/cobalt/build/cobalt_archive.py
@@ -80,7 +80,9 @@
include_black_box_tests=include_black_box_tests)
-def ExtractCobaltArchive(input_zip_path, output_directory_path, outstream=None):
+def ExtractCobaltArchive(input_zip_path,
+ output_directory_path,
+ outstream=None):
"""Returns True if the extract operation was successfull."""
archive = CobaltArchive(archive_zip_path=input_zip_path)
return archive.ExtractTo(output_dir=output_directory_path,
@@ -183,7 +185,7 @@
perms = _GetFilePermissions(file_path)
if (stat.S_IXUSR) & perms:
executable_files.append(archive_path)
- # TODO(niteris): Use and implement _FoldIdenticalFiles() to reduce
+ # TODO: Use and implement _FoldIdenticalFiles() to reduce
# duplicate files. This will help platforms like nxswitch which include
# a lot of duplicate files for the sdk.
try:
@@ -295,7 +297,8 @@
"""Finds necessary files and makes an archive."""
_MakeDirs(os.path.dirname(output_archive_path))
out_directory = paths.BuildOutputDirectory(platform_name, config)
- root_dir = os.path.abspath(os.path.join(out_directory, '..', '..'))
+ root_dir = os.path.abspath(
+ os.path.normpath(os.path.join(out_directory, '..', '..')))
flist = filelist.FileList()
inc_paths = _GetDeployPaths(platform_name, config)
logging.info('Adding binary files to bundle...')
@@ -427,7 +430,7 @@
if not config:
config = raw_input('config: ')
if not output_zip:
- output_zip = raw_input('output_zip: ')
+ output_zip = os.path.normpath(raw_input('output_zip: '))
if not output_zip.endswith('.zip'):
output_zip += '.zip'
start_time = time.time()
@@ -515,7 +518,7 @@
_MakeCobaltPlatformArchive(
platform=args.platform,
config=args.config,
- output_zip=args.out_path,
+ output_zip=os.path.normpath(args.out_path),
include_black_box_tests=args.include_black_box_tests)
sys.exit(0)
elif args.extract:
diff --git a/src/cobalt/build/cobalt_archive_content/__cobalt_archive/finalize_decompression/decompress.py b/src/cobalt/build/cobalt_archive_content/__cobalt_archive/finalize_decompression/decompress.py
index 8224154..3f34428 100644
--- a/src/cobalt/build/cobalt_archive_content/__cobalt_archive/finalize_decompression/decompress.py
+++ b/src/cobalt/build/cobalt_archive_content/__cobalt_archive/finalize_decompression/decompress.py
@@ -65,33 +65,32 @@
os.makedirs(path)
-def _ExtractSymlinks(cwd, symlink_dir_list):
+def _ExtractSymlinks(archive_root, symlink_dir_list):
"""Recreates symlinks on Windows and linux."""
- prev_cwd = os.getcwd()
- cwd = os.path.normpath(cwd)
+ archive_root = os.path.normpath(archive_root)
+ if _IS_WINDOWS:
+ archive_root = '\\\\?\\' + archive_root
+ for link_path, real_path in symlink_dir_list:
+ # link_path and real_path are assumed to be both relative paths.
+ real_path = os.path.normpath(real_path)
+ link_path = os.path.normpath(link_path)
+ target_path = os.path.relpath(real_path, os.path.dirname(link_path))
+ link_path = os.path.join(archive_root, link_path)
+ if not os.path.exists(os.path.dirname(link_path)):
+ _MakeDirs(os.path.dirname(link_path))
+ _CreateSymlink(target_path, link_path)
+ # Check that all the symlinks point to an existing directory.
all_ok = True
- try:
- os.chdir(cwd)
- for link_path, real_path in symlink_dir_list:
- link_path = os.path.abspath(link_path)
- real_path = os.path.abspath(real_path)
- if not os.path.exists(real_path):
- _MakeDirs(real_path)
- if not os.path.exists(os.path.dirname(link_path)):
- _MakeDirs(os.path.dirname(link_path))
- assert os.path.exists(real_path)
- real_path = os.path.relpath(real_path)
- _CreateSymlink(real_path, link_path)
- if not os.path.exists(real_path):
- logging.critical('Error target folder %s does not exist.',
- os.path.abspath(real_path))
- all_ok = False
- if not os.path.exists(link_path):
- logging.critical('Error link folder %s does not exist.',
- os.path.abspath(link_path))
- all_ok = False
- finally:
- os.chdir(prev_cwd)
+ cwd = os.getcwd()
+ for link_path, _ in symlink_dir_list:
+ link_path = os.path.join(archive_root, link_path)
+ try:
+ # This will raise an error if the link points to an invalid directory.
+ os.chdir(link_path)
+ except:
+ all_ok = False
+ finally:
+ os.chdir(cwd)
if not all_ok:
logging.critical('\n*******************************************'
'\nErrors happended during symlink extraction.'
diff --git a/src/cobalt/build/cobalt_archive_content/__cobalt_archive/run/readme.md b/src/cobalt/build/cobalt_archive_content/__cobalt_archive/run/readme.md
index 44ba4c9..df9ef75 100644
--- a/src/cobalt/build/cobalt_archive_content/__cobalt_archive/run/readme.md
+++ b/src/cobalt/build/cobalt_archive_content/__cobalt_archive/run/readme.md
@@ -12,8 +12,6 @@
therefore *stable* and any Cobalt archive can be run the same binaries/tests
using the same shell command.
-Please see go/cobalt-archive-doc
-
Example:
python __cobalt_archive/run/run_cobalt.py --device_id IP
diff --git a/src/cobalt/build/cobalt_archive_test.py b/src/cobalt/build/cobalt_archive_test.py
index 086a897..fe232e5 100644
--- a/src/cobalt/build/cobalt_archive_test.py
+++ b/src/cobalt/build/cobalt_archive_test.py
@@ -79,6 +79,7 @@
tf = filelist_test.TempFileSystem()
tf.Clear()
tf.Make()
+ flist.AddFile(tf.root_in_tmp, tf.test_txt)
flist.AddSymLink(tf.root_in_tmp, tf.sym_dir)
bundle_zip = os.path.join(tf.root_tmp, 'bundle.zip')
car = cobalt_archive.CobaltArchive(bundle_zip)
diff --git a/src/cobalt/build/cobalt_configuration.gypi b/src/cobalt/build/cobalt_configuration.gypi
index 76ffb6b..9feeca1 100644
--- a/src/cobalt/build/cobalt_configuration.gypi
+++ b/src/cobalt/build/cobalt_configuration.gypi
@@ -534,6 +534,7 @@
'COBALT_BUILD_TYPE_GOLD',
'COBALT_FORCE_CSP',
'COBALT_FORCE_HTTPS',
+ 'OFFICIAL_BUILD', # Chromium base relies on this.
'TRACING_DISABLED',
],
},
diff --git a/src/cobalt/build/cobalt_configuration.py b/src/cobalt/build/cobalt_configuration.py
index f377bff..eae97f9 100644
--- a/src/cobalt/build/cobalt_configuration.py
+++ b/src/cobalt/build/cobalt_configuration.py
@@ -120,7 +120,6 @@
def GetTestTargets(self):
return [
- 'accessibility_test',
'audio_test',
'base_test',
'base_unittests',
diff --git a/src/cobalt/content/icu/icudata.lst b/src/cobalt/content/icu/icudata.lst
deleted file mode 100644
index ae20b1e..0000000
--- a/src/cobalt/content/icu/icudata.lst
+++ /dev/null
@@ -1,230 +0,0 @@
-brkitr/char.brk
-brkitr/en.res
-brkitr/en_US.res
-brkitr/fi.res
-brkitr/ja.res
-brkitr/line.brk
-brkitr/line_fi.brk
-brkitr/res_index.res
-brkitr/root.res
-brkitr/sent.brk
-brkitr/thaidict.ctd
-brkitr/title.brk
-brkitr/word.brk
-brkitr/word_ja.brk
-cnvalias.icu
-coll/da.res
-coll/de.res
-coll/en.res
-coll/en_GB.res
-coll/en_US.res
-coll/es.res
-coll/fi.res
-coll/fr.res
-coll/invuca.icu
-coll/it.res
-coll/ja.res
-coll/ko.res
-coll/nb.res
-coll/nl.res
-coll/pl.res
-coll/pt.res
-coll/pt_BR.res
-coll/pt_PT.res
-coll/res_index.res
-coll/root.res
-coll/ru.res
-coll/sv.res
-coll/ucadata.icu
-coll/zh.res
-coll/zh_Hans.res
-coll/zh_Hans_CN.res
-coll/zh_Hant.res
-coll/zh_Hant_TW.res
-confusables.cfu
-curr/da.res
-curr/de.res
-curr/en.res
-curr/es.res
-curr/fi.res
-curr/fr.res
-curr/it.res
-curr/ja.res
-curr/ko.res
-curr/nb.res
-curr/nl.res
-curr/no.res
-curr/pl.res
-curr/pool.res
-curr/pt.res
-curr/pt_PT.res
-curr/root.res
-curr/ru.res
-curr/sv.res
-curr/zh.res
-curr/zh_CN.res
-curr/zh_Hans.res
-curr/zh_Hans_CN.res
-curr/zh_Hant.res
-curr/zh_Hant_TW.res
-curr/zh_TW.res
-da.res
-de.res
-en.res
-en_GB.res
-en_US.res
-es.res
-fi.res
-fr.res
-gb18030.cnv
-ibm-1089_P100-1995.cnv
-ibm-1373_P100-2002.cnv
-ibm-1383_P110-1999.cnv
-ibm-33722_P12A_P12A-2004_U2.cnv
-ibm-5354_P100-1998.cnv
-ibm-878_P100-1996.cnv
-ibm-9005_X110-2007.cnv
-ibm-943_P15A-2003.cnv
-ibm-9447_P100-2002.cnv
-ibm-970_P110_P110-2006_U2.cnv
-icustd.res
-icuver.res
-it.res
-ja.res
-keyTypeData.res
-ko.res
-lang/da.res
-lang/de.res
-lang/en.res
-lang/es.res
-lang/fi.res
-lang/fr.res
-lang/it.res
-lang/ja.res
-lang/ko.res
-lang/nb.res
-lang/nl.res
-lang/no.res
-lang/pl.res
-lang/pool.res
-lang/pt.res
-lang/pt_PT.res
-lang/root.res
-lang/ru.res
-lang/sv.res
-lang/zh.res
-lang/zh_CN.res
-lang/zh_Hans.res
-lang/zh_Hans_CN.res
-lang/zh_Hant.res
-lang/zh_Hant_TW.res
-lang/zh_TW.res
-likelySubtags.res
-metaZones.res
-nb.res
-nfc.nrm
-nfkc.nrm
-nfkc_cf.nrm
-nl.res
-no.res
-numberingSystems.res
-pl.res
-plurals.res
-pnames.icu
-pool.res
-pt.res
-pt_BR.res
-pt_PT.res
-rbnf/da.res
-rbnf/de.res
-rbnf/en.res
-rbnf/es.res
-rbnf/fi.res
-rbnf/fr.res
-rbnf/it.res
-rbnf/ja.res
-rbnf/ko.res
-rbnf/nb.res
-rbnf/nl.res
-rbnf/pl.res
-rbnf/pt.res
-rbnf/pt_PT.res
-rbnf/res_index.res
-rbnf/root.res
-rbnf/ru.res
-rbnf/sv.res
-rbnf/zh.res
-rbnf/zh_Hant.res
-region/da.res
-region/de.res
-region/en.res
-region/es.res
-region/fi.res
-region/fr.res
-region/it.res
-region/ja.res
-region/ko.res
-region/nb.res
-region/nl.res
-region/no.res
-region/pl.res
-region/pool.res
-region/pt.res
-region/pt_PT.res
-region/root.res
-region/ru.res
-region/sv.res
-region/zh.res
-region/zh_CN.res
-region/zh_Hans.res
-region/zh_Hans_CN.res
-region/zh_Hant.res
-region/zh_Hant_TW.res
-region/zh_TW.res
-res_index.res
-rfc3491.spp
-root.res
-ru.res
-supplementalData.res
-sv.res
-timezoneTypes.res
-unames.icu
-uts46.nrm
-windows-874-2000.cnv
-windows-950-2000.cnv
-windowsZones.res
-zh.res
-zh_CN.res
-zh_Hans.res
-zh_Hans_CN.res
-zh_Hant.res
-zh_Hant_TW.res
-zh_TW.res
-zone/da.res
-zone/de.res
-zone/en.res
-zone/en_GB.res
-zone/es.res
-zone/fi.res
-zone/fr.res
-zone/it.res
-zone/ja.res
-zone/ko.res
-zone/nb.res
-zone/nl.res
-zone/no.res
-zone/pl.res
-zone/pool.res
-zone/pt.res
-zone/pt_PT.res
-zone/root.res
-zone/ru.res
-zone/sv.res
-zone/zh.res
-zone/zh_CN.res
-zone/zh_Hans.res
-zone/zh_Hans_CN.res
-zone/zh_Hant.res
-zone/zh_Hant_TW.res
-zone/zh_TW.res
-zoneinfo64.res
diff --git a/src/cobalt/content/icu/icudata_linux.lst b/src/cobalt/content/icu/icudata_linux.lst
deleted file mode 100644
index ae20b1e..0000000
--- a/src/cobalt/content/icu/icudata_linux.lst
+++ /dev/null
@@ -1,230 +0,0 @@
-brkitr/char.brk
-brkitr/en.res
-brkitr/en_US.res
-brkitr/fi.res
-brkitr/ja.res
-brkitr/line.brk
-brkitr/line_fi.brk
-brkitr/res_index.res
-brkitr/root.res
-brkitr/sent.brk
-brkitr/thaidict.ctd
-brkitr/title.brk
-brkitr/word.brk
-brkitr/word_ja.brk
-cnvalias.icu
-coll/da.res
-coll/de.res
-coll/en.res
-coll/en_GB.res
-coll/en_US.res
-coll/es.res
-coll/fi.res
-coll/fr.res
-coll/invuca.icu
-coll/it.res
-coll/ja.res
-coll/ko.res
-coll/nb.res
-coll/nl.res
-coll/pl.res
-coll/pt.res
-coll/pt_BR.res
-coll/pt_PT.res
-coll/res_index.res
-coll/root.res
-coll/ru.res
-coll/sv.res
-coll/ucadata.icu
-coll/zh.res
-coll/zh_Hans.res
-coll/zh_Hans_CN.res
-coll/zh_Hant.res
-coll/zh_Hant_TW.res
-confusables.cfu
-curr/da.res
-curr/de.res
-curr/en.res
-curr/es.res
-curr/fi.res
-curr/fr.res
-curr/it.res
-curr/ja.res
-curr/ko.res
-curr/nb.res
-curr/nl.res
-curr/no.res
-curr/pl.res
-curr/pool.res
-curr/pt.res
-curr/pt_PT.res
-curr/root.res
-curr/ru.res
-curr/sv.res
-curr/zh.res
-curr/zh_CN.res
-curr/zh_Hans.res
-curr/zh_Hans_CN.res
-curr/zh_Hant.res
-curr/zh_Hant_TW.res
-curr/zh_TW.res
-da.res
-de.res
-en.res
-en_GB.res
-en_US.res
-es.res
-fi.res
-fr.res
-gb18030.cnv
-ibm-1089_P100-1995.cnv
-ibm-1373_P100-2002.cnv
-ibm-1383_P110-1999.cnv
-ibm-33722_P12A_P12A-2004_U2.cnv
-ibm-5354_P100-1998.cnv
-ibm-878_P100-1996.cnv
-ibm-9005_X110-2007.cnv
-ibm-943_P15A-2003.cnv
-ibm-9447_P100-2002.cnv
-ibm-970_P110_P110-2006_U2.cnv
-icustd.res
-icuver.res
-it.res
-ja.res
-keyTypeData.res
-ko.res
-lang/da.res
-lang/de.res
-lang/en.res
-lang/es.res
-lang/fi.res
-lang/fr.res
-lang/it.res
-lang/ja.res
-lang/ko.res
-lang/nb.res
-lang/nl.res
-lang/no.res
-lang/pl.res
-lang/pool.res
-lang/pt.res
-lang/pt_PT.res
-lang/root.res
-lang/ru.res
-lang/sv.res
-lang/zh.res
-lang/zh_CN.res
-lang/zh_Hans.res
-lang/zh_Hans_CN.res
-lang/zh_Hant.res
-lang/zh_Hant_TW.res
-lang/zh_TW.res
-likelySubtags.res
-metaZones.res
-nb.res
-nfc.nrm
-nfkc.nrm
-nfkc_cf.nrm
-nl.res
-no.res
-numberingSystems.res
-pl.res
-plurals.res
-pnames.icu
-pool.res
-pt.res
-pt_BR.res
-pt_PT.res
-rbnf/da.res
-rbnf/de.res
-rbnf/en.res
-rbnf/es.res
-rbnf/fi.res
-rbnf/fr.res
-rbnf/it.res
-rbnf/ja.res
-rbnf/ko.res
-rbnf/nb.res
-rbnf/nl.res
-rbnf/pl.res
-rbnf/pt.res
-rbnf/pt_PT.res
-rbnf/res_index.res
-rbnf/root.res
-rbnf/ru.res
-rbnf/sv.res
-rbnf/zh.res
-rbnf/zh_Hant.res
-region/da.res
-region/de.res
-region/en.res
-region/es.res
-region/fi.res
-region/fr.res
-region/it.res
-region/ja.res
-region/ko.res
-region/nb.res
-region/nl.res
-region/no.res
-region/pl.res
-region/pool.res
-region/pt.res
-region/pt_PT.res
-region/root.res
-region/ru.res
-region/sv.res
-region/zh.res
-region/zh_CN.res
-region/zh_Hans.res
-region/zh_Hans_CN.res
-region/zh_Hant.res
-region/zh_Hant_TW.res
-region/zh_TW.res
-res_index.res
-rfc3491.spp
-root.res
-ru.res
-supplementalData.res
-sv.res
-timezoneTypes.res
-unames.icu
-uts46.nrm
-windows-874-2000.cnv
-windows-950-2000.cnv
-windowsZones.res
-zh.res
-zh_CN.res
-zh_Hans.res
-zh_Hans_CN.res
-zh_Hant.res
-zh_Hant_TW.res
-zh_TW.res
-zone/da.res
-zone/de.res
-zone/en.res
-zone/en_GB.res
-zone/es.res
-zone/fi.res
-zone/fr.res
-zone/it.res
-zone/ja.res
-zone/ko.res
-zone/nb.res
-zone/nl.res
-zone/no.res
-zone/pl.res
-zone/pool.res
-zone/pt.res
-zone/pt_PT.res
-zone/root.res
-zone/ru.res
-zone/sv.res
-zone/zh.res
-zone/zh_CN.res
-zone/zh_Hans.res
-zone/zh_Hans_CN.res
-zone/zh_Hant.res
-zone/zh_Hant_TW.res
-zone/zh_TW.res
-zoneinfo64.res
diff --git a/src/cobalt/content/icu/icudt56b/af.res b/src/cobalt/content/icu/icudt56b/af.res
index b1d9054..284d6c5 100644
--- a/src/cobalt/content/icu/icudt56b/af.res
+++ b/src/cobalt/content/icu/icudt56b/af.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ak.res b/src/cobalt/content/icu/icudt56b/ak.res
index cceee96..27239e7 100644
--- a/src/cobalt/content/icu/icudt56b/ak.res
+++ b/src/cobalt/content/icu/icudt56b/ak.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/am.res b/src/cobalt/content/icu/icudt56b/am.res
index 0bd9037..81d2671 100644
--- a/src/cobalt/content/icu/icudt56b/am.res
+++ b/src/cobalt/content/icu/icudt56b/am.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/an.res b/src/cobalt/content/icu/icudt56b/an.res
index 3a6ec3e..f7fe9ba 100644
--- a/src/cobalt/content/icu/icudt56b/an.res
+++ b/src/cobalt/content/icu/icudt56b/an.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ar.res b/src/cobalt/content/icu/icudt56b/ar.res
index adf9eae..99cbf2a 100644
--- a/src/cobalt/content/icu/icudt56b/ar.res
+++ b/src/cobalt/content/icu/icudt56b/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ast.res b/src/cobalt/content/icu/icudt56b/ast.res
index 49ffb94..62b23e3 100644
--- a/src/cobalt/content/icu/icudt56b/ast.res
+++ b/src/cobalt/content/icu/icudt56b/ast.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/az.res b/src/cobalt/content/icu/icudt56b/az.res
index 1154cd7..900086d 100644
--- a/src/cobalt/content/icu/icudt56b/az.res
+++ b/src/cobalt/content/icu/icudt56b/az.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/be.res b/src/cobalt/content/icu/icudt56b/be.res
index b1d5c70..9717219 100644
--- a/src/cobalt/content/icu/icudt56b/be.res
+++ b/src/cobalt/content/icu/icudt56b/be.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/bem.res b/src/cobalt/content/icu/icudt56b/bem.res
index bf4be4b..34efeb9 100644
--- a/src/cobalt/content/icu/icudt56b/bem.res
+++ b/src/cobalt/content/icu/icudt56b/bem.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/bg.res b/src/cobalt/content/icu/icudt56b/bg.res
index 9278fe9..f15f52e 100644
--- a/src/cobalt/content/icu/icudt56b/bg.res
+++ b/src/cobalt/content/icu/icudt56b/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/bn.res b/src/cobalt/content/icu/icudt56b/bn.res
index 76a84b8..d002c6d 100644
--- a/src/cobalt/content/icu/icudt56b/bn.res
+++ b/src/cobalt/content/icu/icudt56b/bn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/br.res b/src/cobalt/content/icu/icudt56b/br.res
index 49cf07d..9fd2d85 100644
--- a/src/cobalt/content/icu/icudt56b/br.res
+++ b/src/cobalt/content/icu/icudt56b/br.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/bs.res b/src/cobalt/content/icu/icudt56b/bs.res
index 6244431..beca030 100644
--- a/src/cobalt/content/icu/icudt56b/bs.res
+++ b/src/cobalt/content/icu/icudt56b/bs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ca.res b/src/cobalt/content/icu/icudt56b/ca.res
index 77bf740..cd9c556 100644
--- a/src/cobalt/content/icu/icudt56b/ca.res
+++ b/src/cobalt/content/icu/icudt56b/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ckb.res b/src/cobalt/content/icu/icudt56b/ckb.res
index 7faa641..309e301 100644
--- a/src/cobalt/content/icu/icudt56b/ckb.res
+++ b/src/cobalt/content/icu/icudt56b/ckb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/ar.res b/src/cobalt/content/icu/icudt56b/coll/ar.res
index 8bd55fd..2535ac9 100644
--- a/src/cobalt/content/icu/icudt56b/coll/ar.res
+++ b/src/cobalt/content/icu/icudt56b/coll/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/bg.res b/src/cobalt/content/icu/icudt56b/coll/bg.res
index 869c575..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/bg.res
+++ b/src/cobalt/content/icu/icudt56b/coll/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/bn.res b/src/cobalt/content/icu/icudt56b/coll/bn.res
index b4d18d5..17f10ff 100644
--- a/src/cobalt/content/icu/icudt56b/coll/bn.res
+++ b/src/cobalt/content/icu/icudt56b/coll/bn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/ca.res b/src/cobalt/content/icu/icudt56b/coll/ca.res
index 55c6cf7..21c7b5c 100644
--- a/src/cobalt/content/icu/icudt56b/coll/ca.res
+++ b/src/cobalt/content/icu/icudt56b/coll/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/cs.res b/src/cobalt/content/icu/icudt56b/coll/cs.res
index 96090e9..30dd56e 100644
--- a/src/cobalt/content/icu/icudt56b/coll/cs.res
+++ b/src/cobalt/content/icu/icudt56b/coll/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/da.res b/src/cobalt/content/icu/icudt56b/coll/da.res
index 6d6a1e6..30dd56e 100644
--- a/src/cobalt/content/icu/icudt56b/coll/da.res
+++ b/src/cobalt/content/icu/icudt56b/coll/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/de.res b/src/cobalt/content/icu/icudt56b/coll/de.res
index 6cbffd1..0af8d4a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/de.res
+++ b/src/cobalt/content/icu/icudt56b/coll/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/de_AT.res b/src/cobalt/content/icu/icudt56b/coll/de_AT.res
index e157e2d..032fc75 100644
--- a/src/cobalt/content/icu/icudt56b/coll/de_AT.res
+++ b/src/cobalt/content/icu/icudt56b/coll/de_AT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/el.res b/src/cobalt/content/icu/icudt56b/coll/el.res
index a6d79ba..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/el.res
+++ b/src/cobalt/content/icu/icudt56b/coll/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/es.res b/src/cobalt/content/icu/icudt56b/coll/es.res
index 3e4f4cd..41f43af 100644
--- a/src/cobalt/content/icu/icudt56b/coll/es.res
+++ b/src/cobalt/content/icu/icudt56b/coll/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/et.res b/src/cobalt/content/icu/icudt56b/coll/et.res
index 5b86126..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/et.res
+++ b/src/cobalt/content/icu/icudt56b/coll/et.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/fa.res b/src/cobalt/content/icu/icudt56b/coll/fa.res
index 7deab50..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/fa.res
+++ b/src/cobalt/content/icu/icudt56b/coll/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/fi.res b/src/cobalt/content/icu/icudt56b/coll/fi.res
index 49a7a34..41f43af 100644
--- a/src/cobalt/content/icu/icudt56b/coll/fi.res
+++ b/src/cobalt/content/icu/icudt56b/coll/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/fil.res b/src/cobalt/content/icu/icudt56b/coll/fil.res
index e1f7ec5..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/fil.res
+++ b/src/cobalt/content/icu/icudt56b/coll/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/fr_CA.res b/src/cobalt/content/icu/icudt56b/coll/fr_CA.res
index 82e6d81..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/fr_CA.res
+++ b/src/cobalt/content/icu/icudt56b/coll/fr_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/gu.res b/src/cobalt/content/icu/icudt56b/coll/gu.res
index 49bb592..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/gu.res
+++ b/src/cobalt/content/icu/icudt56b/coll/gu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/he.res b/src/cobalt/content/icu/icudt56b/coll/he.res
index c74874f..30dd56e 100644
--- a/src/cobalt/content/icu/icudt56b/coll/he.res
+++ b/src/cobalt/content/icu/icudt56b/coll/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/hi.res b/src/cobalt/content/icu/icudt56b/coll/hi.res
index 67f3464..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/hi.res
+++ b/src/cobalt/content/icu/icudt56b/coll/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/hr.res b/src/cobalt/content/icu/icudt56b/coll/hr.res
index 157fc6e..30dd56e 100644
--- a/src/cobalt/content/icu/icudt56b/coll/hr.res
+++ b/src/cobalt/content/icu/icudt56b/coll/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/hu.res b/src/cobalt/content/icu/icudt56b/coll/hu.res
index 6f1d185..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/hu.res
+++ b/src/cobalt/content/icu/icudt56b/coll/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/ja.res b/src/cobalt/content/icu/icudt56b/coll/ja.res
index f713c01..07694e1 100644
--- a/src/cobalt/content/icu/icudt56b/coll/ja.res
+++ b/src/cobalt/content/icu/icudt56b/coll/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/kn.res b/src/cobalt/content/icu/icudt56b/coll/kn.res
index 998784d..17f10ff 100644
--- a/src/cobalt/content/icu/icudt56b/coll/kn.res
+++ b/src/cobalt/content/icu/icudt56b/coll/kn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/ko.res b/src/cobalt/content/icu/icudt56b/coll/ko.res
index c3bbcb6..4d0bb22 100644
--- a/src/cobalt/content/icu/icudt56b/coll/ko.res
+++ b/src/cobalt/content/icu/icudt56b/coll/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/lt.res b/src/cobalt/content/icu/icudt56b/coll/lt.res
index ac6e4f8..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/lt.res
+++ b/src/cobalt/content/icu/icudt56b/coll/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/lv.res b/src/cobalt/content/icu/icudt56b/coll/lv.res
index 5827c9a..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/lv.res
+++ b/src/cobalt/content/icu/icudt56b/coll/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/ml.res b/src/cobalt/content/icu/icudt56b/coll/ml.res
index 98a0b6b..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/ml.res
+++ b/src/cobalt/content/icu/icudt56b/coll/ml.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/mr.res b/src/cobalt/content/icu/icudt56b/coll/mr.res
index 3538c54..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/mr.res
+++ b/src/cobalt/content/icu/icudt56b/coll/mr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/nb.res b/src/cobalt/content/icu/icudt56b/coll/nb.res
index f567163..30dd56e 100644
--- a/src/cobalt/content/icu/icudt56b/coll/nb.res
+++ b/src/cobalt/content/icu/icudt56b/coll/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/nn.res b/src/cobalt/content/icu/icudt56b/coll/nn.res
index f567163..30dd56e 100644
--- a/src/cobalt/content/icu/icudt56b/coll/nn.res
+++ b/src/cobalt/content/icu/icudt56b/coll/nn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/pl.res b/src/cobalt/content/icu/icudt56b/coll/pl.res
index fabe651..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/pl.res
+++ b/src/cobalt/content/icu/icudt56b/coll/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/ro.res b/src/cobalt/content/icu/icudt56b/coll/ro.res
index 1e28918..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/ro.res
+++ b/src/cobalt/content/icu/icudt56b/coll/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/root.res b/src/cobalt/content/icu/icudt56b/coll/root.res
index b3749b7..47912c6 100644
--- a/src/cobalt/content/icu/icudt56b/coll/root.res
+++ b/src/cobalt/content/icu/icudt56b/coll/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/ru.res b/src/cobalt/content/icu/icudt56b/coll/ru.res
index 869c575..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/ru.res
+++ b/src/cobalt/content/icu/icudt56b/coll/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/sk.res b/src/cobalt/content/icu/icudt56b/coll/sk.res
index 05a3caa..30dd56e 100644
--- a/src/cobalt/content/icu/icudt56b/coll/sk.res
+++ b/src/cobalt/content/icu/icudt56b/coll/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/sl.res b/src/cobalt/content/icu/icudt56b/coll/sl.res
index 52c6055..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/sl.res
+++ b/src/cobalt/content/icu/icudt56b/coll/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/sr.res b/src/cobalt/content/icu/icudt56b/coll/sr.res
index 36536db..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/sr.res
+++ b/src/cobalt/content/icu/icudt56b/coll/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/sr_Latn.res b/src/cobalt/content/icu/icudt56b/coll/sr_Latn.res
index 157fc6e..30dd56e 100644
--- a/src/cobalt/content/icu/icudt56b/coll/sr_Latn.res
+++ b/src/cobalt/content/icu/icudt56b/coll/sr_Latn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/sv.res b/src/cobalt/content/icu/icudt56b/coll/sv.res
index 92d6887..90c4801 100644
--- a/src/cobalt/content/icu/icudt56b/coll/sv.res
+++ b/src/cobalt/content/icu/icudt56b/coll/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/ta.res b/src/cobalt/content/icu/icudt56b/coll/ta.res
index c7c7bc5..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/ta.res
+++ b/src/cobalt/content/icu/icudt56b/coll/ta.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/te.res b/src/cobalt/content/icu/icudt56b/coll/te.res
index c046b2a..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/te.res
+++ b/src/cobalt/content/icu/icudt56b/coll/te.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/th.res b/src/cobalt/content/icu/icudt56b/coll/th.res
index 454ddb0..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/th.res
+++ b/src/cobalt/content/icu/icudt56b/coll/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/tr.res b/src/cobalt/content/icu/icudt56b/coll/tr.res
index f38e549..30dd56e 100644
--- a/src/cobalt/content/icu/icudt56b/coll/tr.res
+++ b/src/cobalt/content/icu/icudt56b/coll/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/uk.res b/src/cobalt/content/icu/icudt56b/coll/uk.res
index 6503052..c317e0a 100644
--- a/src/cobalt/content/icu/icudt56b/coll/uk.res
+++ b/src/cobalt/content/icu/icudt56b/coll/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/vi.res b/src/cobalt/content/icu/icudt56b/coll/vi.res
index 6a66847..17f10ff 100644
--- a/src/cobalt/content/icu/icudt56b/coll/vi.res
+++ b/src/cobalt/content/icu/icudt56b/coll/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/coll/zh.res b/src/cobalt/content/icu/icudt56b/coll/zh.res
index ebdecdf..ac8e0eb 100644
--- a/src/cobalt/content/icu/icudt56b/coll/zh.res
+++ b/src/cobalt/content/icu/icudt56b/coll/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/cs.res b/src/cobalt/content/icu/icudt56b/cs.res
index 4a98bce..5d830fd 100644
--- a/src/cobalt/content/icu/icudt56b/cs.res
+++ b/src/cobalt/content/icu/icudt56b/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/am.res b/src/cobalt/content/icu/icudt56b/curr/am.res
index 38e80e7..d03272b 100644
--- a/src/cobalt/content/icu/icudt56b/curr/am.res
+++ b/src/cobalt/content/icu/icudt56b/curr/am.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/ar.res b/src/cobalt/content/icu/icudt56b/curr/ar.res
index fb21df4..98164d9 100644
--- a/src/cobalt/content/icu/icudt56b/curr/ar.res
+++ b/src/cobalt/content/icu/icudt56b/curr/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/bg.res b/src/cobalt/content/icu/icudt56b/curr/bg.res
index 1b9fde0..4342e4b 100644
--- a/src/cobalt/content/icu/icudt56b/curr/bg.res
+++ b/src/cobalt/content/icu/icudt56b/curr/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/ca.res b/src/cobalt/content/icu/icudt56b/curr/ca.res
index 51c117a..0586b88 100644
--- a/src/cobalt/content/icu/icudt56b/curr/ca.res
+++ b/src/cobalt/content/icu/icudt56b/curr/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/cs.res b/src/cobalt/content/icu/icudt56b/curr/cs.res
index fb87c8b..8c7b25b 100644
--- a/src/cobalt/content/icu/icudt56b/curr/cs.res
+++ b/src/cobalt/content/icu/icudt56b/curr/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/da.res b/src/cobalt/content/icu/icudt56b/curr/da.res
index 4150d3e..5e1633e 100644
--- a/src/cobalt/content/icu/icudt56b/curr/da.res
+++ b/src/cobalt/content/icu/icudt56b/curr/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/de.res b/src/cobalt/content/icu/icudt56b/curr/de.res
index 18ab163..ea5ac0d 100644
--- a/src/cobalt/content/icu/icudt56b/curr/de.res
+++ b/src/cobalt/content/icu/icudt56b/curr/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/de_CH.res b/src/cobalt/content/icu/icudt56b/curr/de_CH.res
index f3ae405..3b58f47 100644
--- a/src/cobalt/content/icu/icudt56b/curr/de_CH.res
+++ b/src/cobalt/content/icu/icudt56b/curr/de_CH.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/el.res b/src/cobalt/content/icu/icudt56b/curr/el.res
index 97e80e0..65496d2 100644
--- a/src/cobalt/content/icu/icudt56b/curr/el.res
+++ b/src/cobalt/content/icu/icudt56b/curr/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/en.res b/src/cobalt/content/icu/icudt56b/curr/en.res
index d7ed88f..f56ebfd 100644
--- a/src/cobalt/content/icu/icudt56b/curr/en.res
+++ b/src/cobalt/content/icu/icudt56b/curr/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/en_001.res b/src/cobalt/content/icu/icudt56b/curr/en_001.res
index 291eb3c..eff5ebd 100644
--- a/src/cobalt/content/icu/icudt56b/curr/en_001.res
+++ b/src/cobalt/content/icu/icudt56b/curr/en_001.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/en_150.res b/src/cobalt/content/icu/icudt56b/curr/en_150.res
index cec5a7c..aca0bbd 100644
--- a/src/cobalt/content/icu/icudt56b/curr/en_150.res
+++ b/src/cobalt/content/icu/icudt56b/curr/en_150.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/en_AU.res b/src/cobalt/content/icu/icudt56b/curr/en_AU.res
index b3caf09..e641c63 100644
--- a/src/cobalt/content/icu/icudt56b/curr/en_AU.res
+++ b/src/cobalt/content/icu/icudt56b/curr/en_AU.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/en_CA.res b/src/cobalt/content/icu/icudt56b/curr/en_CA.res
index f4cd95b..d9f5a75 100644
--- a/src/cobalt/content/icu/icudt56b/curr/en_CA.res
+++ b/src/cobalt/content/icu/icudt56b/curr/en_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/en_GB.res b/src/cobalt/content/icu/icudt56b/curr/en_GB.res
index 9f0e72a..8ba46c9 100644
--- a/src/cobalt/content/icu/icudt56b/curr/en_GB.res
+++ b/src/cobalt/content/icu/icudt56b/curr/en_GB.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/en_IN.res b/src/cobalt/content/icu/icudt56b/curr/en_IN.res
index a6ed044..29c193d 100644
--- a/src/cobalt/content/icu/icudt56b/curr/en_IN.res
+++ b/src/cobalt/content/icu/icudt56b/curr/en_IN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/en_NZ.res b/src/cobalt/content/icu/icudt56b/curr/en_NZ.res
index ba6d617..86fa398 100644
--- a/src/cobalt/content/icu/icudt56b/curr/en_NZ.res
+++ b/src/cobalt/content/icu/icudt56b/curr/en_NZ.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/en_ZA.res b/src/cobalt/content/icu/icudt56b/curr/en_ZA.res
index c182fea..1180613 100644
--- a/src/cobalt/content/icu/icudt56b/curr/en_ZA.res
+++ b/src/cobalt/content/icu/icudt56b/curr/en_ZA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/es.res b/src/cobalt/content/icu/icudt56b/curr/es.res
index 7a95655..381198a 100644
--- a/src/cobalt/content/icu/icudt56b/curr/es.res
+++ b/src/cobalt/content/icu/icudt56b/curr/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/es_419.res b/src/cobalt/content/icu/icudt56b/curr/es_419.res
index 7f4d660..9dc0fab 100644
--- a/src/cobalt/content/icu/icudt56b/curr/es_419.res
+++ b/src/cobalt/content/icu/icudt56b/curr/es_419.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/es_AR.res b/src/cobalt/content/icu/icudt56b/curr/es_AR.res
index debc621..16f648e 100644
--- a/src/cobalt/content/icu/icudt56b/curr/es_AR.res
+++ b/src/cobalt/content/icu/icudt56b/curr/es_AR.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/es_MX.res b/src/cobalt/content/icu/icudt56b/curr/es_MX.res
index 5be672f..51f4c08 100644
--- a/src/cobalt/content/icu/icudt56b/curr/es_MX.res
+++ b/src/cobalt/content/icu/icudt56b/curr/es_MX.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/es_US.res b/src/cobalt/content/icu/icudt56b/curr/es_US.res
index ac708dc..3968033 100644
--- a/src/cobalt/content/icu/icudt56b/curr/es_US.res
+++ b/src/cobalt/content/icu/icudt56b/curr/es_US.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/fa.res b/src/cobalt/content/icu/icudt56b/curr/fa.res
index 776ac57..af94bfe 100644
--- a/src/cobalt/content/icu/icudt56b/curr/fa.res
+++ b/src/cobalt/content/icu/icudt56b/curr/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/fi.res b/src/cobalt/content/icu/icudt56b/curr/fi.res
index 0a4deea..3b8a6bf 100644
--- a/src/cobalt/content/icu/icudt56b/curr/fi.res
+++ b/src/cobalt/content/icu/icudt56b/curr/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/fil.res b/src/cobalt/content/icu/icudt56b/curr/fil.res
index 5b7dfb5..51309f4 100644
--- a/src/cobalt/content/icu/icudt56b/curr/fil.res
+++ b/src/cobalt/content/icu/icudt56b/curr/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/fr.res b/src/cobalt/content/icu/icudt56b/curr/fr.res
index 0db2683..97ef8fa 100644
--- a/src/cobalt/content/icu/icudt56b/curr/fr.res
+++ b/src/cobalt/content/icu/icudt56b/curr/fr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/fr_CA.res b/src/cobalt/content/icu/icudt56b/curr/fr_CA.res
index 44e1b23..42c1269 100644
--- a/src/cobalt/content/icu/icudt56b/curr/fr_CA.res
+++ b/src/cobalt/content/icu/icudt56b/curr/fr_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/he.res b/src/cobalt/content/icu/icudt56b/curr/he.res
index f0539b4..9f4899e 100644
--- a/src/cobalt/content/icu/icudt56b/curr/he.res
+++ b/src/cobalt/content/icu/icudt56b/curr/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/hi.res b/src/cobalt/content/icu/icudt56b/curr/hi.res
index 5522f67..6daffbb 100644
--- a/src/cobalt/content/icu/icudt56b/curr/hi.res
+++ b/src/cobalt/content/icu/icudt56b/curr/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/hr.res b/src/cobalt/content/icu/icudt56b/curr/hr.res
index dbbf434..bd52f65 100644
--- a/src/cobalt/content/icu/icudt56b/curr/hr.res
+++ b/src/cobalt/content/icu/icudt56b/curr/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/hu.res b/src/cobalt/content/icu/icudt56b/curr/hu.res
index 8e4dc16..ebc0000 100644
--- a/src/cobalt/content/icu/icudt56b/curr/hu.res
+++ b/src/cobalt/content/icu/icudt56b/curr/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/id.res b/src/cobalt/content/icu/icudt56b/curr/id.res
index 4e32144..7955ab5 100644
--- a/src/cobalt/content/icu/icudt56b/curr/id.res
+++ b/src/cobalt/content/icu/icudt56b/curr/id.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/in.res b/src/cobalt/content/icu/icudt56b/curr/in.res
index 50826b6..12a327a 100644
--- a/src/cobalt/content/icu/icudt56b/curr/in.res
+++ b/src/cobalt/content/icu/icudt56b/curr/in.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/it.res b/src/cobalt/content/icu/icudt56b/curr/it.res
index 8e8c66b..f5fd979 100644
--- a/src/cobalt/content/icu/icudt56b/curr/it.res
+++ b/src/cobalt/content/icu/icudt56b/curr/it.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/iw.res b/src/cobalt/content/icu/icudt56b/curr/iw.res
index bd7ea47..e1db668 100644
--- a/src/cobalt/content/icu/icudt56b/curr/iw.res
+++ b/src/cobalt/content/icu/icudt56b/curr/iw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/ja.res b/src/cobalt/content/icu/icudt56b/curr/ja.res
index f0c7c85..aaf9db9 100644
--- a/src/cobalt/content/icu/icudt56b/curr/ja.res
+++ b/src/cobalt/content/icu/icudt56b/curr/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/ko.res b/src/cobalt/content/icu/icudt56b/curr/ko.res
index e67daf0..80bec29 100644
--- a/src/cobalt/content/icu/icudt56b/curr/ko.res
+++ b/src/cobalt/content/icu/icudt56b/curr/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/lt.res b/src/cobalt/content/icu/icudt56b/curr/lt.res
index 53354e7..3f89f8e 100644
--- a/src/cobalt/content/icu/icudt56b/curr/lt.res
+++ b/src/cobalt/content/icu/icudt56b/curr/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/lv.res b/src/cobalt/content/icu/icudt56b/curr/lv.res
index 7dee64c..f1119e4 100644
--- a/src/cobalt/content/icu/icudt56b/curr/lv.res
+++ b/src/cobalt/content/icu/icudt56b/curr/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/nb.res b/src/cobalt/content/icu/icudt56b/curr/nb.res
index 04ac59c..8ac97dc 100644
--- a/src/cobalt/content/icu/icudt56b/curr/nb.res
+++ b/src/cobalt/content/icu/icudt56b/curr/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/nl.res b/src/cobalt/content/icu/icudt56b/curr/nl.res
index ea0bd1d..9d5d453 100644
--- a/src/cobalt/content/icu/icudt56b/curr/nl.res
+++ b/src/cobalt/content/icu/icudt56b/curr/nl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/no.res b/src/cobalt/content/icu/icudt56b/curr/no.res
index 3d7fe4c..6772320 100644
--- a/src/cobalt/content/icu/icudt56b/curr/no.res
+++ b/src/cobalt/content/icu/icudt56b/curr/no.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/pl.res b/src/cobalt/content/icu/icudt56b/curr/pl.res
index 220049f..2c6ea20 100644
--- a/src/cobalt/content/icu/icudt56b/curr/pl.res
+++ b/src/cobalt/content/icu/icudt56b/curr/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/pool.res b/src/cobalt/content/icu/icudt56b/curr/pool.res
index 7d84f6c..7a0f86d 100644
--- a/src/cobalt/content/icu/icudt56b/curr/pool.res
+++ b/src/cobalt/content/icu/icudt56b/curr/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/pt.res b/src/cobalt/content/icu/icudt56b/curr/pt.res
index d4a9a4d..14659a9 100644
--- a/src/cobalt/content/icu/icudt56b/curr/pt.res
+++ b/src/cobalt/content/icu/icudt56b/curr/pt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/pt_PT.res b/src/cobalt/content/icu/icudt56b/curr/pt_PT.res
index 70ff325..d469d8f 100644
--- a/src/cobalt/content/icu/icudt56b/curr/pt_PT.res
+++ b/src/cobalt/content/icu/icudt56b/curr/pt_PT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/ro.res b/src/cobalt/content/icu/icudt56b/curr/ro.res
index 3916026..d3a5d1e 100644
--- a/src/cobalt/content/icu/icudt56b/curr/ro.res
+++ b/src/cobalt/content/icu/icudt56b/curr/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/root.res b/src/cobalt/content/icu/icudt56b/curr/root.res
index 1c39d46..1161352 100644
--- a/src/cobalt/content/icu/icudt56b/curr/root.res
+++ b/src/cobalt/content/icu/icudt56b/curr/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/ru.res b/src/cobalt/content/icu/icudt56b/curr/ru.res
index 0eb467b..80681bb 100644
--- a/src/cobalt/content/icu/icudt56b/curr/ru.res
+++ b/src/cobalt/content/icu/icudt56b/curr/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/sk.res b/src/cobalt/content/icu/icudt56b/curr/sk.res
index e09c767..7b3ff60 100644
--- a/src/cobalt/content/icu/icudt56b/curr/sk.res
+++ b/src/cobalt/content/icu/icudt56b/curr/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/sl.res b/src/cobalt/content/icu/icudt56b/curr/sl.res
index fadcb69..62dac74 100644
--- a/src/cobalt/content/icu/icudt56b/curr/sl.res
+++ b/src/cobalt/content/icu/icudt56b/curr/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/sr.res b/src/cobalt/content/icu/icudt56b/curr/sr.res
index 3d7500e..bd0f5f9 100644
--- a/src/cobalt/content/icu/icudt56b/curr/sr.res
+++ b/src/cobalt/content/icu/icudt56b/curr/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/supplementalData.res b/src/cobalt/content/icu/icudt56b/curr/supplementalData.res
index 6f8b6fb..40ea0ed 100644
--- a/src/cobalt/content/icu/icudt56b/curr/supplementalData.res
+++ b/src/cobalt/content/icu/icudt56b/curr/supplementalData.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/sv.res b/src/cobalt/content/icu/icudt56b/curr/sv.res
index 7f80b65..a408a3d 100644
--- a/src/cobalt/content/icu/icudt56b/curr/sv.res
+++ b/src/cobalt/content/icu/icudt56b/curr/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/sw.res b/src/cobalt/content/icu/icudt56b/curr/sw.res
index 6a8395e..54865e7 100644
--- a/src/cobalt/content/icu/icudt56b/curr/sw.res
+++ b/src/cobalt/content/icu/icudt56b/curr/sw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/th.res b/src/cobalt/content/icu/icudt56b/curr/th.res
index af7f775..53ada41 100644
--- a/src/cobalt/content/icu/icudt56b/curr/th.res
+++ b/src/cobalt/content/icu/icudt56b/curr/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/tl.res b/src/cobalt/content/icu/icudt56b/curr/tl.res
index 4c27952..d6dc867 100644
--- a/src/cobalt/content/icu/icudt56b/curr/tl.res
+++ b/src/cobalt/content/icu/icudt56b/curr/tl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/tr.res b/src/cobalt/content/icu/icudt56b/curr/tr.res
index 486b255..4a5350f 100644
--- a/src/cobalt/content/icu/icudt56b/curr/tr.res
+++ b/src/cobalt/content/icu/icudt56b/curr/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/uk.res b/src/cobalt/content/icu/icudt56b/curr/uk.res
index 7ff314f..d5614a7 100644
--- a/src/cobalt/content/icu/icudt56b/curr/uk.res
+++ b/src/cobalt/content/icu/icudt56b/curr/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/vi.res b/src/cobalt/content/icu/icudt56b/curr/vi.res
index f0bd3b4..05268ae 100644
--- a/src/cobalt/content/icu/icudt56b/curr/vi.res
+++ b/src/cobalt/content/icu/icudt56b/curr/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/zh.res b/src/cobalt/content/icu/icudt56b/curr/zh.res
index a5e638b..2408d07 100644
--- a/src/cobalt/content/icu/icudt56b/curr/zh.res
+++ b/src/cobalt/content/icu/icudt56b/curr/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/zh_CN.res b/src/cobalt/content/icu/icudt56b/curr/zh_CN.res
index 2509851..27d3f68 100644
--- a/src/cobalt/content/icu/icudt56b/curr/zh_CN.res
+++ b/src/cobalt/content/icu/icudt56b/curr/zh_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/zh_HK.res b/src/cobalt/content/icu/icudt56b/curr/zh_HK.res
index f28f2ae..a73cf4b 100644
--- a/src/cobalt/content/icu/icudt56b/curr/zh_HK.res
+++ b/src/cobalt/content/icu/icudt56b/curr/zh_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/zh_Hans.res b/src/cobalt/content/icu/icudt56b/curr/zh_Hans.res
index 4a3ea50..8e70ff1 100644
--- a/src/cobalt/content/icu/icudt56b/curr/zh_Hans.res
+++ b/src/cobalt/content/icu/icudt56b/curr/zh_Hans.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/zh_Hans_CN.res b/src/cobalt/content/icu/icudt56b/curr/zh_Hans_CN.res
index 2e50d66..f4a45c8 100644
--- a/src/cobalt/content/icu/icudt56b/curr/zh_Hans_CN.res
+++ b/src/cobalt/content/icu/icudt56b/curr/zh_Hans_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/zh_Hans_SG.res b/src/cobalt/content/icu/icudt56b/curr/zh_Hans_SG.res
index 557c60c..6d3a2fc 100644
--- a/src/cobalt/content/icu/icudt56b/curr/zh_Hans_SG.res
+++ b/src/cobalt/content/icu/icudt56b/curr/zh_Hans_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/zh_Hant.res b/src/cobalt/content/icu/icudt56b/curr/zh_Hant.res
index 9e2be04..c548a56 100644
--- a/src/cobalt/content/icu/icudt56b/curr/zh_Hant.res
+++ b/src/cobalt/content/icu/icudt56b/curr/zh_Hant.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/zh_Hant_HK.res b/src/cobalt/content/icu/icudt56b/curr/zh_Hant_HK.res
index c5d17b5..e2400f9 100644
--- a/src/cobalt/content/icu/icudt56b/curr/zh_Hant_HK.res
+++ b/src/cobalt/content/icu/icudt56b/curr/zh_Hant_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/zh_Hant_TW.res b/src/cobalt/content/icu/icudt56b/curr/zh_Hant_TW.res
index 2e50d66..f4a45c8 100644
--- a/src/cobalt/content/icu/icudt56b/curr/zh_Hant_TW.res
+++ b/src/cobalt/content/icu/icudt56b/curr/zh_Hant_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/zh_SG.res b/src/cobalt/content/icu/icudt56b/curr/zh_SG.res
index 99a36d3..b14dc1b 100644
--- a/src/cobalt/content/icu/icudt56b/curr/zh_SG.res
+++ b/src/cobalt/content/icu/icudt56b/curr/zh_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/curr/zh_TW.res b/src/cobalt/content/icu/icudt56b/curr/zh_TW.res
index 9f762c8..f2809d3 100644
--- a/src/cobalt/content/icu/icudt56b/curr/zh_TW.res
+++ b/src/cobalt/content/icu/icudt56b/curr/zh_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/cy.res b/src/cobalt/content/icu/icudt56b/cy.res
index 1d9f4f8..c95f86c 100644
--- a/src/cobalt/content/icu/icudt56b/cy.res
+++ b/src/cobalt/content/icu/icudt56b/cy.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/da.res b/src/cobalt/content/icu/icudt56b/da.res
index b395a15..a3de9c7 100644
--- a/src/cobalt/content/icu/icudt56b/da.res
+++ b/src/cobalt/content/icu/icudt56b/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/de.res b/src/cobalt/content/icu/icudt56b/de.res
index 1d8c9c0..e7fe508 100644
--- a/src/cobalt/content/icu/icudt56b/de.res
+++ b/src/cobalt/content/icu/icudt56b/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/de_AT.res b/src/cobalt/content/icu/icudt56b/de_AT.res
index 5774578..c92705d 100644
--- a/src/cobalt/content/icu/icudt56b/de_AT.res
+++ b/src/cobalt/content/icu/icudt56b/de_AT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/de_CH.res b/src/cobalt/content/icu/icudt56b/de_CH.res
index df893d0..469e876 100644
--- a/src/cobalt/content/icu/icudt56b/de_CH.res
+++ b/src/cobalt/content/icu/icudt56b/de_CH.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ee.res b/src/cobalt/content/icu/icudt56b/ee.res
index 9eac1a6..4e2f32e 100644
--- a/src/cobalt/content/icu/icudt56b/ee.res
+++ b/src/cobalt/content/icu/icudt56b/ee.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/el.res b/src/cobalt/content/icu/icudt56b/el.res
index 00123ec..b9153f6 100644
--- a/src/cobalt/content/icu/icudt56b/el.res
+++ b/src/cobalt/content/icu/icudt56b/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/en.res b/src/cobalt/content/icu/icudt56b/en.res
index 76a284b..68d6647 100644
--- a/src/cobalt/content/icu/icudt56b/en.res
+++ b/src/cobalt/content/icu/icudt56b/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/en_001.res b/src/cobalt/content/icu/icudt56b/en_001.res
index bffa753..4873c68 100644
--- a/src/cobalt/content/icu/icudt56b/en_001.res
+++ b/src/cobalt/content/icu/icudt56b/en_001.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/en_150.res b/src/cobalt/content/icu/icudt56b/en_150.res
index 1c3c688..0ee0565 100644
--- a/src/cobalt/content/icu/icudt56b/en_150.res
+++ b/src/cobalt/content/icu/icudt56b/en_150.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/en_AU.res b/src/cobalt/content/icu/icudt56b/en_AU.res
index d91db86..46f72cc 100644
--- a/src/cobalt/content/icu/icudt56b/en_AU.res
+++ b/src/cobalt/content/icu/icudt56b/en_AU.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/en_CA.res b/src/cobalt/content/icu/icudt56b/en_CA.res
index f399bd6..3f627db 100644
--- a/src/cobalt/content/icu/icudt56b/en_CA.res
+++ b/src/cobalt/content/icu/icudt56b/en_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/en_GB.res b/src/cobalt/content/icu/icudt56b/en_GB.res
index 8a06e8c..b24b84e 100644
--- a/src/cobalt/content/icu/icudt56b/en_GB.res
+++ b/src/cobalt/content/icu/icudt56b/en_GB.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/en_IN.res b/src/cobalt/content/icu/icudt56b/en_IN.res
index 89b03dc..f26ad6d 100644
--- a/src/cobalt/content/icu/icudt56b/en_IN.res
+++ b/src/cobalt/content/icu/icudt56b/en_IN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/en_NZ.res b/src/cobalt/content/icu/icudt56b/en_NZ.res
index bf1edbf..cfeff38 100644
--- a/src/cobalt/content/icu/icudt56b/en_NZ.res
+++ b/src/cobalt/content/icu/icudt56b/en_NZ.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/en_US.res b/src/cobalt/content/icu/icudt56b/en_US.res
index 0c29168..7a2eb6d 100644
--- a/src/cobalt/content/icu/icudt56b/en_US.res
+++ b/src/cobalt/content/icu/icudt56b/en_US.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/en_ZA.res b/src/cobalt/content/icu/icudt56b/en_ZA.res
index 93a8bfd..1cab436 100644
--- a/src/cobalt/content/icu/icudt56b/en_ZA.res
+++ b/src/cobalt/content/icu/icudt56b/en_ZA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/eo.res b/src/cobalt/content/icu/icudt56b/eo.res
index 2e26830..d519476 100644
--- a/src/cobalt/content/icu/icudt56b/eo.res
+++ b/src/cobalt/content/icu/icudt56b/eo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/es.res b/src/cobalt/content/icu/icudt56b/es.res
index a444148..bc143fd 100644
--- a/src/cobalt/content/icu/icudt56b/es.res
+++ b/src/cobalt/content/icu/icudt56b/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/es_419.res b/src/cobalt/content/icu/icudt56b/es_419.res
index b38d6ab..efa69dc 100644
--- a/src/cobalt/content/icu/icudt56b/es_419.res
+++ b/src/cobalt/content/icu/icudt56b/es_419.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/es_AR.res b/src/cobalt/content/icu/icudt56b/es_AR.res
index 36da772..b69693b 100644
--- a/src/cobalt/content/icu/icudt56b/es_AR.res
+++ b/src/cobalt/content/icu/icudt56b/es_AR.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/es_ES.res b/src/cobalt/content/icu/icudt56b/es_ES.res
index 0c29168..7a2eb6d 100644
--- a/src/cobalt/content/icu/icudt56b/es_ES.res
+++ b/src/cobalt/content/icu/icudt56b/es_ES.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/es_MX.res b/src/cobalt/content/icu/icudt56b/es_MX.res
index 6013a38..15f03cc 100644
--- a/src/cobalt/content/icu/icudt56b/es_MX.res
+++ b/src/cobalt/content/icu/icudt56b/es_MX.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/es_US.res b/src/cobalt/content/icu/icudt56b/es_US.res
index a525677..29ef112 100644
--- a/src/cobalt/content/icu/icudt56b/es_US.res
+++ b/src/cobalt/content/icu/icudt56b/es_US.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/et.res b/src/cobalt/content/icu/icudt56b/et.res
index 3fc0978..3c26d48 100644
--- a/src/cobalt/content/icu/icudt56b/et.res
+++ b/src/cobalt/content/icu/icudt56b/et.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/eu.res b/src/cobalt/content/icu/icudt56b/eu.res
index 21cb93e..657c9e7 100644
--- a/src/cobalt/content/icu/icudt56b/eu.res
+++ b/src/cobalt/content/icu/icudt56b/eu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/fa.res b/src/cobalt/content/icu/icudt56b/fa.res
index 0080495..42b2153 100644
--- a/src/cobalt/content/icu/icudt56b/fa.res
+++ b/src/cobalt/content/icu/icudt56b/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/fi.res b/src/cobalt/content/icu/icudt56b/fi.res
index 2448243..bb939bd 100644
--- a/src/cobalt/content/icu/icudt56b/fi.res
+++ b/src/cobalt/content/icu/icudt56b/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/fil.res b/src/cobalt/content/icu/icudt56b/fil.res
index 74e424d..e20dbae 100644
--- a/src/cobalt/content/icu/icudt56b/fil.res
+++ b/src/cobalt/content/icu/icudt56b/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/fo.res b/src/cobalt/content/icu/icudt56b/fo.res
index bef3ad7..577b4be 100644
--- a/src/cobalt/content/icu/icudt56b/fo.res
+++ b/src/cobalt/content/icu/icudt56b/fo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/fr.res b/src/cobalt/content/icu/icudt56b/fr.res
index dd3447d..098feaf 100644
--- a/src/cobalt/content/icu/icudt56b/fr.res
+++ b/src/cobalt/content/icu/icudt56b/fr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/fr_CA.res b/src/cobalt/content/icu/icudt56b/fr_CA.res
index 5521151..8108be1 100644
--- a/src/cobalt/content/icu/icudt56b/fr_CA.res
+++ b/src/cobalt/content/icu/icudt56b/fr_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/fr_CH.res b/src/cobalt/content/icu/icudt56b/fr_CH.res
index 752e262..79b462a 100644
--- a/src/cobalt/content/icu/icudt56b/fr_CH.res
+++ b/src/cobalt/content/icu/icudt56b/fr_CH.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ga.res b/src/cobalt/content/icu/icudt56b/ga.res
index 88d5ab5..3398f22 100644
--- a/src/cobalt/content/icu/icudt56b/ga.res
+++ b/src/cobalt/content/icu/icudt56b/ga.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/gl.res b/src/cobalt/content/icu/icudt56b/gl.res
index 72c9a1c..d3d96da 100644
--- a/src/cobalt/content/icu/icudt56b/gl.res
+++ b/src/cobalt/content/icu/icudt56b/gl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/gu.res b/src/cobalt/content/icu/icudt56b/gu.res
index 85d3ce9..628c409 100644
--- a/src/cobalt/content/icu/icudt56b/gu.res
+++ b/src/cobalt/content/icu/icudt56b/gu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ha.res b/src/cobalt/content/icu/icudt56b/ha.res
index 43e404f..1093733 100644
--- a/src/cobalt/content/icu/icudt56b/ha.res
+++ b/src/cobalt/content/icu/icudt56b/ha.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/haw.res b/src/cobalt/content/icu/icudt56b/haw.res
index 60ead40..1e1c2bb 100644
--- a/src/cobalt/content/icu/icudt56b/haw.res
+++ b/src/cobalt/content/icu/icudt56b/haw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/he.res b/src/cobalt/content/icu/icudt56b/he.res
index ebbeb7c..aa5b464 100644
--- a/src/cobalt/content/icu/icudt56b/he.res
+++ b/src/cobalt/content/icu/icudt56b/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/hi.res b/src/cobalt/content/icu/icudt56b/hi.res
index dc70299..0e341e9 100644
--- a/src/cobalt/content/icu/icudt56b/hi.res
+++ b/src/cobalt/content/icu/icudt56b/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/hr.res b/src/cobalt/content/icu/icudt56b/hr.res
index 6bceb0c..1fce684 100644
--- a/src/cobalt/content/icu/icudt56b/hr.res
+++ b/src/cobalt/content/icu/icudt56b/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/hu.res b/src/cobalt/content/icu/icudt56b/hu.res
index d482a63..d8bf7d3 100644
--- a/src/cobalt/content/icu/icudt56b/hu.res
+++ b/src/cobalt/content/icu/icudt56b/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/hy.res b/src/cobalt/content/icu/icudt56b/hy.res
index e9ebdb6..ab5be83 100644
--- a/src/cobalt/content/icu/icudt56b/hy.res
+++ b/src/cobalt/content/icu/icudt56b/hy.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/id.res b/src/cobalt/content/icu/icudt56b/id.res
index bd5605a..8b9fb6f 100644
--- a/src/cobalt/content/icu/icudt56b/id.res
+++ b/src/cobalt/content/icu/icudt56b/id.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ig.res b/src/cobalt/content/icu/icudt56b/ig.res
index 85f26f5..1abde9f 100644
--- a/src/cobalt/content/icu/icudt56b/ig.res
+++ b/src/cobalt/content/icu/icudt56b/ig.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/in.res b/src/cobalt/content/icu/icudt56b/in.res
index 66a82ba..9296700 100644
--- a/src/cobalt/content/icu/icudt56b/in.res
+++ b/src/cobalt/content/icu/icudt56b/in.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/is.res b/src/cobalt/content/icu/icudt56b/is.res
index 8043dda..b9d912a 100644
--- a/src/cobalt/content/icu/icudt56b/is.res
+++ b/src/cobalt/content/icu/icudt56b/is.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/it.res b/src/cobalt/content/icu/icudt56b/it.res
index aee6ca0..018008b 100644
--- a/src/cobalt/content/icu/icudt56b/it.res
+++ b/src/cobalt/content/icu/icudt56b/it.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/it_CH.res b/src/cobalt/content/icu/icudt56b/it_CH.res
index d046860..2548487 100644
--- a/src/cobalt/content/icu/icudt56b/it_CH.res
+++ b/src/cobalt/content/icu/icudt56b/it_CH.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/iw.res b/src/cobalt/content/icu/icudt56b/iw.res
index 733b115..0ba8df0 100644
--- a/src/cobalt/content/icu/icudt56b/iw.res
+++ b/src/cobalt/content/icu/icudt56b/iw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ja.res b/src/cobalt/content/icu/icudt56b/ja.res
index 17e8ac1..dfb8869 100644
--- a/src/cobalt/content/icu/icudt56b/ja.res
+++ b/src/cobalt/content/icu/icudt56b/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ka.res b/src/cobalt/content/icu/icudt56b/ka.res
index fc8fda6..32dbaea 100644
--- a/src/cobalt/content/icu/icudt56b/ka.res
+++ b/src/cobalt/content/icu/icudt56b/ka.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/kk.res b/src/cobalt/content/icu/icudt56b/kk.res
index 3e1d3ca..a57f103 100644
--- a/src/cobalt/content/icu/icudt56b/kk.res
+++ b/src/cobalt/content/icu/icudt56b/kk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/km.res b/src/cobalt/content/icu/icudt56b/km.res
index 6ca2adb..30c2c9d 100644
--- a/src/cobalt/content/icu/icudt56b/km.res
+++ b/src/cobalt/content/icu/icudt56b/km.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/kn.res b/src/cobalt/content/icu/icudt56b/kn.res
index 757acd5..d383b3e 100644
--- a/src/cobalt/content/icu/icudt56b/kn.res
+++ b/src/cobalt/content/icu/icudt56b/kn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ko.res b/src/cobalt/content/icu/icudt56b/ko.res
index 576014a..5e00efb 100644
--- a/src/cobalt/content/icu/icudt56b/ko.res
+++ b/src/cobalt/content/icu/icudt56b/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ku.res b/src/cobalt/content/icu/icudt56b/ku.res
index 532151e..435f098 100644
--- a/src/cobalt/content/icu/icudt56b/ku.res
+++ b/src/cobalt/content/icu/icudt56b/ku.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ky.res b/src/cobalt/content/icu/icudt56b/ky.res
index 4b7da68..5e6b81a 100644
--- a/src/cobalt/content/icu/icudt56b/ky.res
+++ b/src/cobalt/content/icu/icudt56b/ky.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/af.res b/src/cobalt/content/icu/icudt56b/lang/af.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/af.res
+++ b/src/cobalt/content/icu/icudt56b/lang/af.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ak.res b/src/cobalt/content/icu/icudt56b/lang/ak.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ak.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ak.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/am.res b/src/cobalt/content/icu/icudt56b/lang/am.res
index 5191444..bed926c 100644
--- a/src/cobalt/content/icu/icudt56b/lang/am.res
+++ b/src/cobalt/content/icu/icudt56b/lang/am.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/an.res b/src/cobalt/content/icu/icudt56b/lang/an.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/an.res
+++ b/src/cobalt/content/icu/icudt56b/lang/an.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ar.res b/src/cobalt/content/icu/icudt56b/lang/ar.res
index eea00ff..988eb5d 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ar.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ast.res b/src/cobalt/content/icu/icudt56b/lang/ast.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ast.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ast.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/az.res b/src/cobalt/content/icu/icudt56b/lang/az.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/az.res
+++ b/src/cobalt/content/icu/icudt56b/lang/az.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/be.res b/src/cobalt/content/icu/icudt56b/lang/be.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/be.res
+++ b/src/cobalt/content/icu/icudt56b/lang/be.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/bem.res b/src/cobalt/content/icu/icudt56b/lang/bem.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/bem.res
+++ b/src/cobalt/content/icu/icudt56b/lang/bem.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/bg.res b/src/cobalt/content/icu/icudt56b/lang/bg.res
index f8ba03f..b5d1160 100644
--- a/src/cobalt/content/icu/icudt56b/lang/bg.res
+++ b/src/cobalt/content/icu/icudt56b/lang/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/bn.res b/src/cobalt/content/icu/icudt56b/lang/bn.res
index fdc9cdb..b4c023e 100644
--- a/src/cobalt/content/icu/icudt56b/lang/bn.res
+++ b/src/cobalt/content/icu/icudt56b/lang/bn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/br.res b/src/cobalt/content/icu/icudt56b/lang/br.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/br.res
+++ b/src/cobalt/content/icu/icudt56b/lang/br.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/bs.res b/src/cobalt/content/icu/icudt56b/lang/bs.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/bs.res
+++ b/src/cobalt/content/icu/icudt56b/lang/bs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ca.res b/src/cobalt/content/icu/icudt56b/lang/ca.res
index c05c095..6012fbf 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ca.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ckb.res b/src/cobalt/content/icu/icudt56b/lang/ckb.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ckb.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ckb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/cs.res b/src/cobalt/content/icu/icudt56b/lang/cs.res
index 5fdcad3..1da035b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/cs.res
+++ b/src/cobalt/content/icu/icudt56b/lang/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/cy.res b/src/cobalt/content/icu/icudt56b/lang/cy.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/cy.res
+++ b/src/cobalt/content/icu/icudt56b/lang/cy.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/da.res b/src/cobalt/content/icu/icudt56b/lang/da.res
index d3125da..81df9f3 100644
--- a/src/cobalt/content/icu/icudt56b/lang/da.res
+++ b/src/cobalt/content/icu/icudt56b/lang/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/de.res b/src/cobalt/content/icu/icudt56b/lang/de.res
index 97792db..34c8d12 100644
--- a/src/cobalt/content/icu/icudt56b/lang/de.res
+++ b/src/cobalt/content/icu/icudt56b/lang/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ee.res b/src/cobalt/content/icu/icudt56b/lang/ee.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ee.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ee.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/el.res b/src/cobalt/content/icu/icudt56b/lang/el.res
index b851f9a..a5a08c5 100644
--- a/src/cobalt/content/icu/icudt56b/lang/el.res
+++ b/src/cobalt/content/icu/icudt56b/lang/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/en.res b/src/cobalt/content/icu/icudt56b/lang/en.res
index 747e6f3..d429522 100644
--- a/src/cobalt/content/icu/icudt56b/lang/en.res
+++ b/src/cobalt/content/icu/icudt56b/lang/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/en_GB.res b/src/cobalt/content/icu/icudt56b/lang/en_GB.res
index cb1670b..0a55f56 100644
--- a/src/cobalt/content/icu/icudt56b/lang/en_GB.res
+++ b/src/cobalt/content/icu/icudt56b/lang/en_GB.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/eo.res b/src/cobalt/content/icu/icudt56b/lang/eo.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/eo.res
+++ b/src/cobalt/content/icu/icudt56b/lang/eo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/es.res b/src/cobalt/content/icu/icudt56b/lang/es.res
index 7eedb98..ee3ae99 100644
--- a/src/cobalt/content/icu/icudt56b/lang/es.res
+++ b/src/cobalt/content/icu/icudt56b/lang/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/es_419.res b/src/cobalt/content/icu/icudt56b/lang/es_419.res
index 107cc66..6447346 100644
--- a/src/cobalt/content/icu/icudt56b/lang/es_419.res
+++ b/src/cobalt/content/icu/icudt56b/lang/es_419.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/et.res b/src/cobalt/content/icu/icudt56b/lang/et.res
index 0b0146b..d588e70 100644
--- a/src/cobalt/content/icu/icudt56b/lang/et.res
+++ b/src/cobalt/content/icu/icudt56b/lang/et.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/eu.res b/src/cobalt/content/icu/icudt56b/lang/eu.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/eu.res
+++ b/src/cobalt/content/icu/icudt56b/lang/eu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/fa.res b/src/cobalt/content/icu/icudt56b/lang/fa.res
index 59d9442..3fd2782 100644
--- a/src/cobalt/content/icu/icudt56b/lang/fa.res
+++ b/src/cobalt/content/icu/icudt56b/lang/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/fi.res b/src/cobalt/content/icu/icudt56b/lang/fi.res
index 1ada0a1..4f10019 100644
--- a/src/cobalt/content/icu/icudt56b/lang/fi.res
+++ b/src/cobalt/content/icu/icudt56b/lang/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/fil.res b/src/cobalt/content/icu/icudt56b/lang/fil.res
index 62740af..1f994f7 100644
--- a/src/cobalt/content/icu/icudt56b/lang/fil.res
+++ b/src/cobalt/content/icu/icudt56b/lang/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/fo.res b/src/cobalt/content/icu/icudt56b/lang/fo.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/fo.res
+++ b/src/cobalt/content/icu/icudt56b/lang/fo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/fr.res b/src/cobalt/content/icu/icudt56b/lang/fr.res
index 57fcb6e..3a15959 100644
--- a/src/cobalt/content/icu/icudt56b/lang/fr.res
+++ b/src/cobalt/content/icu/icudt56b/lang/fr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ga.res b/src/cobalt/content/icu/icudt56b/lang/ga.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ga.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ga.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/gl.res b/src/cobalt/content/icu/icudt56b/lang/gl.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/gl.res
+++ b/src/cobalt/content/icu/icudt56b/lang/gl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/gu.res b/src/cobalt/content/icu/icudt56b/lang/gu.res
index b8f8fce..1fd7b89 100644
--- a/src/cobalt/content/icu/icudt56b/lang/gu.res
+++ b/src/cobalt/content/icu/icudt56b/lang/gu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ha.res b/src/cobalt/content/icu/icudt56b/lang/ha.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ha.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ha.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/haw.res b/src/cobalt/content/icu/icudt56b/lang/haw.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/haw.res
+++ b/src/cobalt/content/icu/icudt56b/lang/haw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/he.res b/src/cobalt/content/icu/icudt56b/lang/he.res
index a61e424..2fd4b4d 100644
--- a/src/cobalt/content/icu/icudt56b/lang/he.res
+++ b/src/cobalt/content/icu/icudt56b/lang/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/hi.res b/src/cobalt/content/icu/icudt56b/lang/hi.res
index 57c4718..0fb4fc6 100644
--- a/src/cobalt/content/icu/icudt56b/lang/hi.res
+++ b/src/cobalt/content/icu/icudt56b/lang/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/hr.res b/src/cobalt/content/icu/icudt56b/lang/hr.res
index 3eb40c6..dd724b5 100644
--- a/src/cobalt/content/icu/icudt56b/lang/hr.res
+++ b/src/cobalt/content/icu/icudt56b/lang/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/hu.res b/src/cobalt/content/icu/icudt56b/lang/hu.res
index 4185bcd..dbe5b44 100644
--- a/src/cobalt/content/icu/icudt56b/lang/hu.res
+++ b/src/cobalt/content/icu/icudt56b/lang/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/hy.res b/src/cobalt/content/icu/icudt56b/lang/hy.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/hy.res
+++ b/src/cobalt/content/icu/icudt56b/lang/hy.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/id.res b/src/cobalt/content/icu/icudt56b/lang/id.res
index cb760e1..9747eec 100644
--- a/src/cobalt/content/icu/icudt56b/lang/id.res
+++ b/src/cobalt/content/icu/icudt56b/lang/id.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ig.res b/src/cobalt/content/icu/icudt56b/lang/ig.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ig.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ig.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/in.res b/src/cobalt/content/icu/icudt56b/lang/in.res
index b2c35ef..da98b73 100644
--- a/src/cobalt/content/icu/icudt56b/lang/in.res
+++ b/src/cobalt/content/icu/icudt56b/lang/in.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/is.res b/src/cobalt/content/icu/icudt56b/lang/is.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/is.res
+++ b/src/cobalt/content/icu/icudt56b/lang/is.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/it.res b/src/cobalt/content/icu/icudt56b/lang/it.res
index d4b0ffc..370955f 100644
--- a/src/cobalt/content/icu/icudt56b/lang/it.res
+++ b/src/cobalt/content/icu/icudt56b/lang/it.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/iw.res b/src/cobalt/content/icu/icudt56b/lang/iw.res
index 247bf06..d111f93 100644
--- a/src/cobalt/content/icu/icudt56b/lang/iw.res
+++ b/src/cobalt/content/icu/icudt56b/lang/iw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ja.res b/src/cobalt/content/icu/icudt56b/lang/ja.res
index 674dbb7..2190b76 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ja.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ka.res b/src/cobalt/content/icu/icudt56b/lang/ka.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ka.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ka.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/kk.res b/src/cobalt/content/icu/icudt56b/lang/kk.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/kk.res
+++ b/src/cobalt/content/icu/icudt56b/lang/kk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/km.res b/src/cobalt/content/icu/icudt56b/lang/km.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/km.res
+++ b/src/cobalt/content/icu/icudt56b/lang/km.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/kn.res b/src/cobalt/content/icu/icudt56b/lang/kn.res
index 381a80b..0608b45 100644
--- a/src/cobalt/content/icu/icudt56b/lang/kn.res
+++ b/src/cobalt/content/icu/icudt56b/lang/kn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ko.res b/src/cobalt/content/icu/icudt56b/lang/ko.res
index f89b341..9bb7b3c 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ko.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ku.res b/src/cobalt/content/icu/icudt56b/lang/ku.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ku.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ku.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ky.res b/src/cobalt/content/icu/icudt56b/lang/ky.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ky.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ky.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/lg.res b/src/cobalt/content/icu/icudt56b/lang/lg.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/lg.res
+++ b/src/cobalt/content/icu/icudt56b/lang/lg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ln.res b/src/cobalt/content/icu/icudt56b/lang/ln.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ln.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ln.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/lo.res b/src/cobalt/content/icu/icudt56b/lang/lo.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/lo.res
+++ b/src/cobalt/content/icu/icudt56b/lang/lo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/lt.res b/src/cobalt/content/icu/icudt56b/lang/lt.res
index 471b004..bca1349 100644
--- a/src/cobalt/content/icu/icudt56b/lang/lt.res
+++ b/src/cobalt/content/icu/icudt56b/lang/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/lv.res b/src/cobalt/content/icu/icudt56b/lang/lv.res
index 993c698..d0700b9 100644
--- a/src/cobalt/content/icu/icudt56b/lang/lv.res
+++ b/src/cobalt/content/icu/icudt56b/lang/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/mfe.res b/src/cobalt/content/icu/icudt56b/lang/mfe.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/mfe.res
+++ b/src/cobalt/content/icu/icudt56b/lang/mfe.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/mg.res b/src/cobalt/content/icu/icudt56b/lang/mg.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/mg.res
+++ b/src/cobalt/content/icu/icudt56b/lang/mg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/mk.res b/src/cobalt/content/icu/icudt56b/lang/mk.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/mk.res
+++ b/src/cobalt/content/icu/icudt56b/lang/mk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ml.res b/src/cobalt/content/icu/icudt56b/lang/ml.res
index c40ffa5..0c1c6b5 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ml.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ml.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/mn.res b/src/cobalt/content/icu/icudt56b/lang/mn.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/mn.res
+++ b/src/cobalt/content/icu/icudt56b/lang/mn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/mo.res b/src/cobalt/content/icu/icudt56b/lang/mo.res
index ee0ea49..ed7653e 100644
--- a/src/cobalt/content/icu/icudt56b/lang/mo.res
+++ b/src/cobalt/content/icu/icudt56b/lang/mo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/mr.res b/src/cobalt/content/icu/icudt56b/lang/mr.res
index 2c1943c..27d225f 100644
--- a/src/cobalt/content/icu/icudt56b/lang/mr.res
+++ b/src/cobalt/content/icu/icudt56b/lang/mr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ms.res b/src/cobalt/content/icu/icudt56b/lang/ms.res
index c40316d..21cc141 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ms.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ms.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/mt.res b/src/cobalt/content/icu/icudt56b/lang/mt.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/mt.res
+++ b/src/cobalt/content/icu/icudt56b/lang/mt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/my.res b/src/cobalt/content/icu/icudt56b/lang/my.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/my.res
+++ b/src/cobalt/content/icu/icudt56b/lang/my.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/nb.res b/src/cobalt/content/icu/icudt56b/lang/nb.res
index 5112e25..2878212 100644
--- a/src/cobalt/content/icu/icudt56b/lang/nb.res
+++ b/src/cobalt/content/icu/icudt56b/lang/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ne.res b/src/cobalt/content/icu/icudt56b/lang/ne.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ne.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ne.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/nl.res b/src/cobalt/content/icu/icudt56b/lang/nl.res
index 751ba02..1459803 100644
--- a/src/cobalt/content/icu/icudt56b/lang/nl.res
+++ b/src/cobalt/content/icu/icudt56b/lang/nl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/nn.res b/src/cobalt/content/icu/icudt56b/lang/nn.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/nn.res
+++ b/src/cobalt/content/icu/icudt56b/lang/nn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/no.res b/src/cobalt/content/icu/icudt56b/lang/no.res
index a0258b7..7975dbd 100644
--- a/src/cobalt/content/icu/icudt56b/lang/no.res
+++ b/src/cobalt/content/icu/icudt56b/lang/no.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/nyn.res b/src/cobalt/content/icu/icudt56b/lang/nyn.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/nyn.res
+++ b/src/cobalt/content/icu/icudt56b/lang/nyn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/om.res b/src/cobalt/content/icu/icudt56b/lang/om.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/om.res
+++ b/src/cobalt/content/icu/icudt56b/lang/om.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/or.res b/src/cobalt/content/icu/icudt56b/lang/or.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/or.res
+++ b/src/cobalt/content/icu/icudt56b/lang/or.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/pa.res b/src/cobalt/content/icu/icudt56b/lang/pa.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/pa.res
+++ b/src/cobalt/content/icu/icudt56b/lang/pa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/pl.res b/src/cobalt/content/icu/icudt56b/lang/pl.res
index d67c390..2652e03 100644
--- a/src/cobalt/content/icu/icudt56b/lang/pl.res
+++ b/src/cobalt/content/icu/icudt56b/lang/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/pool.res b/src/cobalt/content/icu/icudt56b/lang/pool.res
index 76166a1..7fd7f96 100644
--- a/src/cobalt/content/icu/icudt56b/lang/pool.res
+++ b/src/cobalt/content/icu/icudt56b/lang/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ps.res b/src/cobalt/content/icu/icudt56b/lang/ps.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ps.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ps.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/pt.res b/src/cobalt/content/icu/icudt56b/lang/pt.res
index 0ae2863..cbc0145 100644
--- a/src/cobalt/content/icu/icudt56b/lang/pt.res
+++ b/src/cobalt/content/icu/icudt56b/lang/pt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/pt_PT.res b/src/cobalt/content/icu/icudt56b/lang/pt_PT.res
index 90433ce..453e716 100644
--- a/src/cobalt/content/icu/icudt56b/lang/pt_PT.res
+++ b/src/cobalt/content/icu/icudt56b/lang/pt_PT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/rm.res b/src/cobalt/content/icu/icudt56b/lang/rm.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/rm.res
+++ b/src/cobalt/content/icu/icudt56b/lang/rm.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/rn.res b/src/cobalt/content/icu/icudt56b/lang/rn.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/rn.res
+++ b/src/cobalt/content/icu/icudt56b/lang/rn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ro.res b/src/cobalt/content/icu/icudt56b/lang/ro.res
index e9aa6fa..05034d8 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ro.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ro_MD.res b/src/cobalt/content/icu/icudt56b/lang/ro_MD.res
index 78ed83b..6b0be86 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ro_MD.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ro_MD.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/root.res b/src/cobalt/content/icu/icudt56b/lang/root.res
index dc0042b..b13f41b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/root.res
+++ b/src/cobalt/content/icu/icudt56b/lang/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ru.res b/src/cobalt/content/icu/icudt56b/lang/ru.res
index 1ecc96f..9d3e7dc 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ru.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/rw.res b/src/cobalt/content/icu/icudt56b/lang/rw.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/rw.res
+++ b/src/cobalt/content/icu/icudt56b/lang/rw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/sh.res b/src/cobalt/content/icu/icudt56b/lang/sh.res
index bd2f9e8..64eb35f 100644
--- a/src/cobalt/content/icu/icudt56b/lang/sh.res
+++ b/src/cobalt/content/icu/icudt56b/lang/sh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/si.res b/src/cobalt/content/icu/icudt56b/lang/si.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/si.res
+++ b/src/cobalt/content/icu/icudt56b/lang/si.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/sk.res b/src/cobalt/content/icu/icudt56b/lang/sk.res
index 15be576..6e91d73 100644
--- a/src/cobalt/content/icu/icudt56b/lang/sk.res
+++ b/src/cobalt/content/icu/icudt56b/lang/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/sl.res b/src/cobalt/content/icu/icudt56b/lang/sl.res
index 8c364c2..8e79881 100644
--- a/src/cobalt/content/icu/icudt56b/lang/sl.res
+++ b/src/cobalt/content/icu/icudt56b/lang/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/sn.res b/src/cobalt/content/icu/icudt56b/lang/sn.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/sn.res
+++ b/src/cobalt/content/icu/icudt56b/lang/sn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/so.res b/src/cobalt/content/icu/icudt56b/lang/so.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/so.res
+++ b/src/cobalt/content/icu/icudt56b/lang/so.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/sq.res b/src/cobalt/content/icu/icudt56b/lang/sq.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/sq.res
+++ b/src/cobalt/content/icu/icudt56b/lang/sq.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/sr.res b/src/cobalt/content/icu/icudt56b/lang/sr.res
index 6d3aa9d..dc9b003 100644
--- a/src/cobalt/content/icu/icudt56b/lang/sr.res
+++ b/src/cobalt/content/icu/icudt56b/lang/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/sr_Latn.res b/src/cobalt/content/icu/icudt56b/lang/sr_Latn.res
index 0dced64..01ac57f 100644
--- a/src/cobalt/content/icu/icudt56b/lang/sr_Latn.res
+++ b/src/cobalt/content/icu/icudt56b/lang/sr_Latn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/sv.res b/src/cobalt/content/icu/icudt56b/lang/sv.res
index ee2aa38..d7bb8bf 100644
--- a/src/cobalt/content/icu/icudt56b/lang/sv.res
+++ b/src/cobalt/content/icu/icudt56b/lang/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/sw.res b/src/cobalt/content/icu/icudt56b/lang/sw.res
index e64c5da..d33af54 100644
--- a/src/cobalt/content/icu/icudt56b/lang/sw.res
+++ b/src/cobalt/content/icu/icudt56b/lang/sw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ta.res b/src/cobalt/content/icu/icudt56b/lang/ta.res
index dd6d2fa..c58fff5 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ta.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ta.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/te.res b/src/cobalt/content/icu/icudt56b/lang/te.res
index 4dbcb83..a0334d2 100644
--- a/src/cobalt/content/icu/icudt56b/lang/te.res
+++ b/src/cobalt/content/icu/icudt56b/lang/te.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/tg.res b/src/cobalt/content/icu/icudt56b/lang/tg.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/tg.res
+++ b/src/cobalt/content/icu/icudt56b/lang/tg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/th.res b/src/cobalt/content/icu/icudt56b/lang/th.res
index 8de2e9b..369e86e 100644
--- a/src/cobalt/content/icu/icudt56b/lang/th.res
+++ b/src/cobalt/content/icu/icudt56b/lang/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ti.res b/src/cobalt/content/icu/icudt56b/lang/ti.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ti.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ti.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/tl.res b/src/cobalt/content/icu/icudt56b/lang/tl.res
index 13882f7..cb41750 100644
--- a/src/cobalt/content/icu/icudt56b/lang/tl.res
+++ b/src/cobalt/content/icu/icudt56b/lang/tl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/to.res b/src/cobalt/content/icu/icudt56b/lang/to.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/to.res
+++ b/src/cobalt/content/icu/icudt56b/lang/to.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/tr.res b/src/cobalt/content/icu/icudt56b/lang/tr.res
index f11ddd9..a7d7c37 100644
--- a/src/cobalt/content/icu/icudt56b/lang/tr.res
+++ b/src/cobalt/content/icu/icudt56b/lang/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/uk.res b/src/cobalt/content/icu/icudt56b/lang/uk.res
index 5d353fd..baa2048 100644
--- a/src/cobalt/content/icu/icudt56b/lang/uk.res
+++ b/src/cobalt/content/icu/icudt56b/lang/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/ur.res b/src/cobalt/content/icu/icudt56b/lang/ur.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/ur.res
+++ b/src/cobalt/content/icu/icudt56b/lang/ur.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/uz.res b/src/cobalt/content/icu/icudt56b/lang/uz.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/uz.res
+++ b/src/cobalt/content/icu/icudt56b/lang/uz.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/vi.res b/src/cobalt/content/icu/icudt56b/lang/vi.res
index 12b8b24..46117dd 100644
--- a/src/cobalt/content/icu/icudt56b/lang/vi.res
+++ b/src/cobalt/content/icu/icudt56b/lang/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/wa.res b/src/cobalt/content/icu/icudt56b/lang/wa.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/wa.res
+++ b/src/cobalt/content/icu/icudt56b/lang/wa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/yo.res b/src/cobalt/content/icu/icudt56b/lang/yo.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/yo.res
+++ b/src/cobalt/content/icu/icudt56b/lang/yo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zh.res b/src/cobalt/content/icu/icudt56b/lang/zh.res
index 0efbae2..ed8ec1a 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zh.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zh_CN.res b/src/cobalt/content/icu/icudt56b/lang/zh_CN.res
index bcba38b..5e3c9fa 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zh_CN.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zh_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zh_HK.res b/src/cobalt/content/icu/icudt56b/lang/zh_HK.res
index 6808174..1de3637 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zh_HK.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zh_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zh_Hans.res b/src/cobalt/content/icu/icudt56b/lang/zh_Hans.res
index b72028d..02c942c 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zh_Hans.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zh_Hans.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zh_Hans_CN.res b/src/cobalt/content/icu/icudt56b/lang/zh_Hans_CN.res
index 78ed83b..6b0be86 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zh_Hans_CN.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zh_Hans_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zh_Hans_SG.res b/src/cobalt/content/icu/icudt56b/lang/zh_Hans_SG.res
index 78ed83b..6b0be86 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zh_Hans_SG.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zh_Hans_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zh_Hant.res b/src/cobalt/content/icu/icudt56b/lang/zh_Hant.res
index 62daeab..bbdf8d3 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zh_Hant.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zh_Hant.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zh_Hant_HK.res b/src/cobalt/content/icu/icudt56b/lang/zh_Hant_HK.res
index cac443a..e3b3eba 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zh_Hant_HK.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zh_Hant_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zh_Hant_TW.res b/src/cobalt/content/icu/icudt56b/lang/zh_Hant_TW.res
index 78ed83b..6b0be86 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zh_Hant_TW.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zh_Hant_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zh_SG.res b/src/cobalt/content/icu/icudt56b/lang/zh_SG.res
index f08cca6..bcdacc7 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zh_SG.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zh_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zh_TW.res b/src/cobalt/content/icu/icudt56b/lang/zh_TW.res
index 60f9f5f..1b66f29 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zh_TW.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zh_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lang/zu.res b/src/cobalt/content/icu/icudt56b/lang/zu.res
index c6c8d20..6d3ad7b 100644
--- a/src/cobalt/content/icu/icudt56b/lang/zu.res
+++ b/src/cobalt/content/icu/icudt56b/lang/zu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lg.res b/src/cobalt/content/icu/icudt56b/lg.res
index f920156..badaef3 100644
--- a/src/cobalt/content/icu/icudt56b/lg.res
+++ b/src/cobalt/content/icu/icudt56b/lg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ln.res b/src/cobalt/content/icu/icudt56b/ln.res
index 1ff9d2e..b94dedf 100644
--- a/src/cobalt/content/icu/icudt56b/ln.res
+++ b/src/cobalt/content/icu/icudt56b/ln.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lo.res b/src/cobalt/content/icu/icudt56b/lo.res
index 61577ec..5b4f7f8 100644
--- a/src/cobalt/content/icu/icudt56b/lo.res
+++ b/src/cobalt/content/icu/icudt56b/lo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lt.res b/src/cobalt/content/icu/icudt56b/lt.res
index ddd87c1..ec9ce5a 100644
--- a/src/cobalt/content/icu/icudt56b/lt.res
+++ b/src/cobalt/content/icu/icudt56b/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/lv.res b/src/cobalt/content/icu/icudt56b/lv.res
index b775599..55a6542 100644
--- a/src/cobalt/content/icu/icudt56b/lv.res
+++ b/src/cobalt/content/icu/icudt56b/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/mfe.res b/src/cobalt/content/icu/icudt56b/mfe.res
index 2d4dbb2..8a199ea 100644
--- a/src/cobalt/content/icu/icudt56b/mfe.res
+++ b/src/cobalt/content/icu/icudt56b/mfe.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/mg.res b/src/cobalt/content/icu/icudt56b/mg.res
index ff7da77..018ea5b 100644
--- a/src/cobalt/content/icu/icudt56b/mg.res
+++ b/src/cobalt/content/icu/icudt56b/mg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/mk.res b/src/cobalt/content/icu/icudt56b/mk.res
index ca66c66..cc3a879 100644
--- a/src/cobalt/content/icu/icudt56b/mk.res
+++ b/src/cobalt/content/icu/icudt56b/mk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ml.res b/src/cobalt/content/icu/icudt56b/ml.res
index a2ed6e3..23a1971 100644
--- a/src/cobalt/content/icu/icudt56b/ml.res
+++ b/src/cobalt/content/icu/icudt56b/ml.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/mn.res b/src/cobalt/content/icu/icudt56b/mn.res
index 95aaecb..55b8d55 100644
--- a/src/cobalt/content/icu/icudt56b/mn.res
+++ b/src/cobalt/content/icu/icudt56b/mn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/mo.res b/src/cobalt/content/icu/icudt56b/mo.res
index 05eef9b..b252a1b 100644
--- a/src/cobalt/content/icu/icudt56b/mo.res
+++ b/src/cobalt/content/icu/icudt56b/mo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/mr.res b/src/cobalt/content/icu/icudt56b/mr.res
index 0c8f196..3de81ed 100644
--- a/src/cobalt/content/icu/icudt56b/mr.res
+++ b/src/cobalt/content/icu/icudt56b/mr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ms.res b/src/cobalt/content/icu/icudt56b/ms.res
index 21d82f1..4be9461 100644
--- a/src/cobalt/content/icu/icudt56b/ms.res
+++ b/src/cobalt/content/icu/icudt56b/ms.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/mt.res b/src/cobalt/content/icu/icudt56b/mt.res
index 771e308..62d55a5 100644
--- a/src/cobalt/content/icu/icudt56b/mt.res
+++ b/src/cobalt/content/icu/icudt56b/mt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/my.res b/src/cobalt/content/icu/icudt56b/my.res
index ca6a009..04fdbd2 100644
--- a/src/cobalt/content/icu/icudt56b/my.res
+++ b/src/cobalt/content/icu/icudt56b/my.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/nb.res b/src/cobalt/content/icu/icudt56b/nb.res
index 0c70a62..7eec666 100644
--- a/src/cobalt/content/icu/icudt56b/nb.res
+++ b/src/cobalt/content/icu/icudt56b/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ne.res b/src/cobalt/content/icu/icudt56b/ne.res
index 0d3bca6..f4c368a 100644
--- a/src/cobalt/content/icu/icudt56b/ne.res
+++ b/src/cobalt/content/icu/icudt56b/ne.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/nl.res b/src/cobalt/content/icu/icudt56b/nl.res
index 15379de..ac4b49f 100644
--- a/src/cobalt/content/icu/icudt56b/nl.res
+++ b/src/cobalt/content/icu/icudt56b/nl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/nn.res b/src/cobalt/content/icu/icudt56b/nn.res
index 93298fe..c26183a 100644
--- a/src/cobalt/content/icu/icudt56b/nn.res
+++ b/src/cobalt/content/icu/icudt56b/nn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/no.res b/src/cobalt/content/icu/icudt56b/no.res
index 2daac08..b78bedc 100644
--- a/src/cobalt/content/icu/icudt56b/no.res
+++ b/src/cobalt/content/icu/icudt56b/no.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/nyn.res b/src/cobalt/content/icu/icudt56b/nyn.res
index 57679e5..9d2db5b 100644
--- a/src/cobalt/content/icu/icudt56b/nyn.res
+++ b/src/cobalt/content/icu/icudt56b/nyn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/om.res b/src/cobalt/content/icu/icudt56b/om.res
index 57679e5..9d2db5b 100644
--- a/src/cobalt/content/icu/icudt56b/om.res
+++ b/src/cobalt/content/icu/icudt56b/om.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/or.res b/src/cobalt/content/icu/icudt56b/or.res
index 8d998f5..2b190ce 100644
--- a/src/cobalt/content/icu/icudt56b/or.res
+++ b/src/cobalt/content/icu/icudt56b/or.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/pa.res b/src/cobalt/content/icu/icudt56b/pa.res
index 274aa23..cb80517 100644
--- a/src/cobalt/content/icu/icudt56b/pa.res
+++ b/src/cobalt/content/icu/icudt56b/pa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/pl.res b/src/cobalt/content/icu/icudt56b/pl.res
index 92e128d..f5a0776 100644
--- a/src/cobalt/content/icu/icudt56b/pl.res
+++ b/src/cobalt/content/icu/icudt56b/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/pool.res b/src/cobalt/content/icu/icudt56b/pool.res
index cc6b653..91f6ad9 100644
--- a/src/cobalt/content/icu/icudt56b/pool.res
+++ b/src/cobalt/content/icu/icudt56b/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ps.res b/src/cobalt/content/icu/icudt56b/ps.res
index bb14e4e..1281bb4 100644
--- a/src/cobalt/content/icu/icudt56b/ps.res
+++ b/src/cobalt/content/icu/icudt56b/ps.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/pt.res b/src/cobalt/content/icu/icudt56b/pt.res
index a8cd770..cb7b5c1 100644
--- a/src/cobalt/content/icu/icudt56b/pt.res
+++ b/src/cobalt/content/icu/icudt56b/pt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/pt_BR.res b/src/cobalt/content/icu/icudt56b/pt_BR.res
index 0c29168..7a2eb6d 100644
--- a/src/cobalt/content/icu/icudt56b/pt_BR.res
+++ b/src/cobalt/content/icu/icudt56b/pt_BR.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/pt_PT.res b/src/cobalt/content/icu/icudt56b/pt_PT.res
index 3eab096..dfc2456 100644
--- a/src/cobalt/content/icu/icudt56b/pt_PT.res
+++ b/src/cobalt/content/icu/icudt56b/pt_PT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/region/en.res b/src/cobalt/content/icu/icudt56b/region/en.res
index 45c6423..c5c145b 100644
--- a/src/cobalt/content/icu/icudt56b/region/en.res
+++ b/src/cobalt/content/icu/icudt56b/region/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/region/pool.res b/src/cobalt/content/icu/icudt56b/region/pool.res
index 194ef79..d6bfffb 100644
--- a/src/cobalt/content/icu/icudt56b/region/pool.res
+++ b/src/cobalt/content/icu/icudt56b/region/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/region/root.res b/src/cobalt/content/icu/icudt56b/region/root.res
index d61b851..0121ec9 100644
--- a/src/cobalt/content/icu/icudt56b/region/root.res
+++ b/src/cobalt/content/icu/icudt56b/region/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/rm.res b/src/cobalt/content/icu/icudt56b/rm.res
index 2ac0eb9..cfdff81 100644
--- a/src/cobalt/content/icu/icudt56b/rm.res
+++ b/src/cobalt/content/icu/icudt56b/rm.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/rn.res b/src/cobalt/content/icu/icudt56b/rn.res
index 57679e5..9d2db5b 100644
--- a/src/cobalt/content/icu/icudt56b/rn.res
+++ b/src/cobalt/content/icu/icudt56b/rn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ro.res b/src/cobalt/content/icu/icudt56b/ro.res
index 4658315..87ddc8d 100644
--- a/src/cobalt/content/icu/icudt56b/ro.res
+++ b/src/cobalt/content/icu/icudt56b/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ro_MD.res b/src/cobalt/content/icu/icudt56b/ro_MD.res
index 7c08d1e..67a02a2 100644
--- a/src/cobalt/content/icu/icudt56b/ro_MD.res
+++ b/src/cobalt/content/icu/icudt56b/ro_MD.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/root.res b/src/cobalt/content/icu/icudt56b/root.res
index 27050be..4fce667 100644
--- a/src/cobalt/content/icu/icudt56b/root.res
+++ b/src/cobalt/content/icu/icudt56b/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ru.res b/src/cobalt/content/icu/icudt56b/ru.res
index 1d470e3..e6c012c 100644
--- a/src/cobalt/content/icu/icudt56b/ru.res
+++ b/src/cobalt/content/icu/icudt56b/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/rw.res b/src/cobalt/content/icu/icudt56b/rw.res
index 57679e5..9d2db5b 100644
--- a/src/cobalt/content/icu/icudt56b/rw.res
+++ b/src/cobalt/content/icu/icudt56b/rw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/sh.res b/src/cobalt/content/icu/icudt56b/sh.res
index 2a2fa54..6458c97 100644
--- a/src/cobalt/content/icu/icudt56b/sh.res
+++ b/src/cobalt/content/icu/icudt56b/sh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/si.res b/src/cobalt/content/icu/icudt56b/si.res
index 6be2069..1f0112e 100644
--- a/src/cobalt/content/icu/icudt56b/si.res
+++ b/src/cobalt/content/icu/icudt56b/si.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/sk.res b/src/cobalt/content/icu/icudt56b/sk.res
index 4e9233c..e48c0fc 100644
--- a/src/cobalt/content/icu/icudt56b/sk.res
+++ b/src/cobalt/content/icu/icudt56b/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/sl.res b/src/cobalt/content/icu/icudt56b/sl.res
index 4d4af72..c2a1d58 100644
--- a/src/cobalt/content/icu/icudt56b/sl.res
+++ b/src/cobalt/content/icu/icudt56b/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/sn.res b/src/cobalt/content/icu/icudt56b/sn.res
index cd8e90d..d2a0d61 100644
--- a/src/cobalt/content/icu/icudt56b/sn.res
+++ b/src/cobalt/content/icu/icudt56b/sn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/so.res b/src/cobalt/content/icu/icudt56b/so.res
index 57679e5..9d2db5b 100644
--- a/src/cobalt/content/icu/icudt56b/so.res
+++ b/src/cobalt/content/icu/icudt56b/so.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/sq.res b/src/cobalt/content/icu/icudt56b/sq.res
index 6785b37..c91d21f 100644
--- a/src/cobalt/content/icu/icudt56b/sq.res
+++ b/src/cobalt/content/icu/icudt56b/sq.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/sr.res b/src/cobalt/content/icu/icudt56b/sr.res
index 0fffd77..f1f0d0e 100644
--- a/src/cobalt/content/icu/icudt56b/sr.res
+++ b/src/cobalt/content/icu/icudt56b/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/sr_Latn.res b/src/cobalt/content/icu/icudt56b/sr_Latn.res
index d12c6fc..09e6464 100644
--- a/src/cobalt/content/icu/icudt56b/sr_Latn.res
+++ b/src/cobalt/content/icu/icudt56b/sr_Latn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/sv.res b/src/cobalt/content/icu/icudt56b/sv.res
index bb2f295..9ebcee8 100644
--- a/src/cobalt/content/icu/icudt56b/sv.res
+++ b/src/cobalt/content/icu/icudt56b/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/sw.res b/src/cobalt/content/icu/icudt56b/sw.res
index 06acb42..4f419de 100644
--- a/src/cobalt/content/icu/icudt56b/sw.res
+++ b/src/cobalt/content/icu/icudt56b/sw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ta.res b/src/cobalt/content/icu/icudt56b/ta.res
index 79165d4..f8c41f3 100644
--- a/src/cobalt/content/icu/icudt56b/ta.res
+++ b/src/cobalt/content/icu/icudt56b/ta.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/te.res b/src/cobalt/content/icu/icudt56b/te.res
index c636277..e9b4bd5 100644
--- a/src/cobalt/content/icu/icudt56b/te.res
+++ b/src/cobalt/content/icu/icudt56b/te.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/tg.res b/src/cobalt/content/icu/icudt56b/tg.res
index fb5ac7e..6587279 100644
--- a/src/cobalt/content/icu/icudt56b/tg.res
+++ b/src/cobalt/content/icu/icudt56b/tg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/th.res b/src/cobalt/content/icu/icudt56b/th.res
index 0585745..21c5770 100644
--- a/src/cobalt/content/icu/icudt56b/th.res
+++ b/src/cobalt/content/icu/icudt56b/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ti.res b/src/cobalt/content/icu/icudt56b/ti.res
index 88d1885..b1be538 100644
--- a/src/cobalt/content/icu/icudt56b/ti.res
+++ b/src/cobalt/content/icu/icudt56b/ti.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/tl.res b/src/cobalt/content/icu/icudt56b/tl.res
index 181b960..2a31e1a 100644
--- a/src/cobalt/content/icu/icudt56b/tl.res
+++ b/src/cobalt/content/icu/icudt56b/tl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/to.res b/src/cobalt/content/icu/icudt56b/to.res
index 1d1a083..59f438b 100644
--- a/src/cobalt/content/icu/icudt56b/to.res
+++ b/src/cobalt/content/icu/icudt56b/to.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/tr.res b/src/cobalt/content/icu/icudt56b/tr.res
index 278e42d..4a6298f 100644
--- a/src/cobalt/content/icu/icudt56b/tr.res
+++ b/src/cobalt/content/icu/icudt56b/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/translit/root.res b/src/cobalt/content/icu/icudt56b/translit/root.res
index 4c17313..66fc787 100644
--- a/src/cobalt/content/icu/icudt56b/translit/root.res
+++ b/src/cobalt/content/icu/icudt56b/translit/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/uk.res b/src/cobalt/content/icu/icudt56b/uk.res
index 200454c..fb8f492 100644
--- a/src/cobalt/content/icu/icudt56b/uk.res
+++ b/src/cobalt/content/icu/icudt56b/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/am.res b/src/cobalt/content/icu/icudt56b/unit/am.res
index 292e986..a35df3b 100644
--- a/src/cobalt/content/icu/icudt56b/unit/am.res
+++ b/src/cobalt/content/icu/icudt56b/unit/am.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/ar.res b/src/cobalt/content/icu/icudt56b/unit/ar.res
index f98995f..bebd1a9 100644
--- a/src/cobalt/content/icu/icudt56b/unit/ar.res
+++ b/src/cobalt/content/icu/icudt56b/unit/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/bg.res b/src/cobalt/content/icu/icudt56b/unit/bg.res
index 1aca03a..602c66a 100644
--- a/src/cobalt/content/icu/icudt56b/unit/bg.res
+++ b/src/cobalt/content/icu/icudt56b/unit/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/bn.res b/src/cobalt/content/icu/icudt56b/unit/bn.res
index 7f04950..1f919d9 100644
--- a/src/cobalt/content/icu/icudt56b/unit/bn.res
+++ b/src/cobalt/content/icu/icudt56b/unit/bn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/ca.res b/src/cobalt/content/icu/icudt56b/unit/ca.res
index 5f9e7d4..5845e5a 100644
--- a/src/cobalt/content/icu/icudt56b/unit/ca.res
+++ b/src/cobalt/content/icu/icudt56b/unit/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/cs.res b/src/cobalt/content/icu/icudt56b/unit/cs.res
index 36876e6..e2d5bac 100644
--- a/src/cobalt/content/icu/icudt56b/unit/cs.res
+++ b/src/cobalt/content/icu/icudt56b/unit/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/da.res b/src/cobalt/content/icu/icudt56b/unit/da.res
index d9e774a..b0cb39c 100644
--- a/src/cobalt/content/icu/icudt56b/unit/da.res
+++ b/src/cobalt/content/icu/icudt56b/unit/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/de.res b/src/cobalt/content/icu/icudt56b/unit/de.res
index 28220da..c73d64f 100644
--- a/src/cobalt/content/icu/icudt56b/unit/de.res
+++ b/src/cobalt/content/icu/icudt56b/unit/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/de_CH.res b/src/cobalt/content/icu/icudt56b/unit/de_CH.res
index 65ad3f2..00504ca 100644
--- a/src/cobalt/content/icu/icudt56b/unit/de_CH.res
+++ b/src/cobalt/content/icu/icudt56b/unit/de_CH.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/el.res b/src/cobalt/content/icu/icudt56b/unit/el.res
index 2e844d8..a1382e5 100644
--- a/src/cobalt/content/icu/icudt56b/unit/el.res
+++ b/src/cobalt/content/icu/icudt56b/unit/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/en.res b/src/cobalt/content/icu/icudt56b/unit/en.res
index 3aae76a..01b89ae 100644
--- a/src/cobalt/content/icu/icudt56b/unit/en.res
+++ b/src/cobalt/content/icu/icudt56b/unit/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/en_001.res b/src/cobalt/content/icu/icudt56b/unit/en_001.res
index 47d0e3b..a38707e 100644
--- a/src/cobalt/content/icu/icudt56b/unit/en_001.res
+++ b/src/cobalt/content/icu/icudt56b/unit/en_001.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/en_150.res b/src/cobalt/content/icu/icudt56b/unit/en_150.res
index 56c4fc5..7df0c61 100644
--- a/src/cobalt/content/icu/icudt56b/unit/en_150.res
+++ b/src/cobalt/content/icu/icudt56b/unit/en_150.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/en_AU.res b/src/cobalt/content/icu/icudt56b/unit/en_AU.res
index e299a73..2ac5f74 100644
--- a/src/cobalt/content/icu/icudt56b/unit/en_AU.res
+++ b/src/cobalt/content/icu/icudt56b/unit/en_AU.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/en_CA.res b/src/cobalt/content/icu/icudt56b/unit/en_CA.res
index 2312cfa..23a8c4d 100644
--- a/src/cobalt/content/icu/icudt56b/unit/en_CA.res
+++ b/src/cobalt/content/icu/icudt56b/unit/en_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/en_GB.res b/src/cobalt/content/icu/icudt56b/unit/en_GB.res
index 12c6ad4..f4e4529 100644
--- a/src/cobalt/content/icu/icudt56b/unit/en_GB.res
+++ b/src/cobalt/content/icu/icudt56b/unit/en_GB.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/en_IN.res b/src/cobalt/content/icu/icudt56b/unit/en_IN.res
index 635ae39..24311e6 100644
--- a/src/cobalt/content/icu/icudt56b/unit/en_IN.res
+++ b/src/cobalt/content/icu/icudt56b/unit/en_IN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/en_NZ.res b/src/cobalt/content/icu/icudt56b/unit/en_NZ.res
index 635ae39..24311e6 100644
--- a/src/cobalt/content/icu/icudt56b/unit/en_NZ.res
+++ b/src/cobalt/content/icu/icudt56b/unit/en_NZ.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/en_ZA.res b/src/cobalt/content/icu/icudt56b/unit/en_ZA.res
index 635ae39..24311e6 100644
--- a/src/cobalt/content/icu/icudt56b/unit/en_ZA.res
+++ b/src/cobalt/content/icu/icudt56b/unit/en_ZA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/es.res b/src/cobalt/content/icu/icudt56b/unit/es.res
index ffe1f08..38489a7 100644
--- a/src/cobalt/content/icu/icudt56b/unit/es.res
+++ b/src/cobalt/content/icu/icudt56b/unit/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/es_419.res b/src/cobalt/content/icu/icudt56b/unit/es_419.res
index 472b17a..7dd5938 100644
--- a/src/cobalt/content/icu/icudt56b/unit/es_419.res
+++ b/src/cobalt/content/icu/icudt56b/unit/es_419.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/es_AR.res b/src/cobalt/content/icu/icudt56b/unit/es_AR.res
index 2321a20..45044ae 100644
--- a/src/cobalt/content/icu/icudt56b/unit/es_AR.res
+++ b/src/cobalt/content/icu/icudt56b/unit/es_AR.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/es_MX.res b/src/cobalt/content/icu/icudt56b/unit/es_MX.res
index 1063a34..e52962f 100644
--- a/src/cobalt/content/icu/icudt56b/unit/es_MX.res
+++ b/src/cobalt/content/icu/icudt56b/unit/es_MX.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/es_US.res b/src/cobalt/content/icu/icudt56b/unit/es_US.res
index 4d5b4c7..00f7bc4 100644
--- a/src/cobalt/content/icu/icudt56b/unit/es_US.res
+++ b/src/cobalt/content/icu/icudt56b/unit/es_US.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/et.res b/src/cobalt/content/icu/icudt56b/unit/et.res
index 4c4e707..07fc2e8 100644
--- a/src/cobalt/content/icu/icudt56b/unit/et.res
+++ b/src/cobalt/content/icu/icudt56b/unit/et.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/fa.res b/src/cobalt/content/icu/icudt56b/unit/fa.res
index 7c9d93f..fbf7d22 100644
--- a/src/cobalt/content/icu/icudt56b/unit/fa.res
+++ b/src/cobalt/content/icu/icudt56b/unit/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/fi.res b/src/cobalt/content/icu/icudt56b/unit/fi.res
index a6f4ffd..dd44aa6 100644
--- a/src/cobalt/content/icu/icudt56b/unit/fi.res
+++ b/src/cobalt/content/icu/icudt56b/unit/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/fil.res b/src/cobalt/content/icu/icudt56b/unit/fil.res
index d37e0c9..592bf13 100644
--- a/src/cobalt/content/icu/icudt56b/unit/fil.res
+++ b/src/cobalt/content/icu/icudt56b/unit/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/fr.res b/src/cobalt/content/icu/icudt56b/unit/fr.res
index ecd764f..0c34090 100644
--- a/src/cobalt/content/icu/icudt56b/unit/fr.res
+++ b/src/cobalt/content/icu/icudt56b/unit/fr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/fr_CA.res b/src/cobalt/content/icu/icudt56b/unit/fr_CA.res
index 6898c10..6d6aaba 100644
--- a/src/cobalt/content/icu/icudt56b/unit/fr_CA.res
+++ b/src/cobalt/content/icu/icudt56b/unit/fr_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/gu.res b/src/cobalt/content/icu/icudt56b/unit/gu.res
index 7ee2a4f..938e994 100644
--- a/src/cobalt/content/icu/icudt56b/unit/gu.res
+++ b/src/cobalt/content/icu/icudt56b/unit/gu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/he.res b/src/cobalt/content/icu/icudt56b/unit/he.res
index ed32c30..b3f6b97 100644
--- a/src/cobalt/content/icu/icudt56b/unit/he.res
+++ b/src/cobalt/content/icu/icudt56b/unit/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/hi.res b/src/cobalt/content/icu/icudt56b/unit/hi.res
index 61a2fc7..7e48b52 100644
--- a/src/cobalt/content/icu/icudt56b/unit/hi.res
+++ b/src/cobalt/content/icu/icudt56b/unit/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/hr.res b/src/cobalt/content/icu/icudt56b/unit/hr.res
index 6d4ddca..9297739 100644
--- a/src/cobalt/content/icu/icudt56b/unit/hr.res
+++ b/src/cobalt/content/icu/icudt56b/unit/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/hu.res b/src/cobalt/content/icu/icudt56b/unit/hu.res
index eb21500..b790aed 100644
--- a/src/cobalt/content/icu/icudt56b/unit/hu.res
+++ b/src/cobalt/content/icu/icudt56b/unit/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/id.res b/src/cobalt/content/icu/icudt56b/unit/id.res
index e0f4875..0ecd0cd 100644
--- a/src/cobalt/content/icu/icudt56b/unit/id.res
+++ b/src/cobalt/content/icu/icudt56b/unit/id.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/in.res b/src/cobalt/content/icu/icudt56b/unit/in.res
index 073173b..01466da 100644
--- a/src/cobalt/content/icu/icudt56b/unit/in.res
+++ b/src/cobalt/content/icu/icudt56b/unit/in.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/it.res b/src/cobalt/content/icu/icudt56b/unit/it.res
index 116fa09..f2108bc 100644
--- a/src/cobalt/content/icu/icudt56b/unit/it.res
+++ b/src/cobalt/content/icu/icudt56b/unit/it.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/iw.res b/src/cobalt/content/icu/icudt56b/unit/iw.res
index 05e68f4..abb599a 100644
--- a/src/cobalt/content/icu/icudt56b/unit/iw.res
+++ b/src/cobalt/content/icu/icudt56b/unit/iw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/ja.res b/src/cobalt/content/icu/icudt56b/unit/ja.res
index 2c04119..9156dab 100644
--- a/src/cobalt/content/icu/icudt56b/unit/ja.res
+++ b/src/cobalt/content/icu/icudt56b/unit/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/kn.res b/src/cobalt/content/icu/icudt56b/unit/kn.res
index 4fc040c..540568c 100644
--- a/src/cobalt/content/icu/icudt56b/unit/kn.res
+++ b/src/cobalt/content/icu/icudt56b/unit/kn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/ko.res b/src/cobalt/content/icu/icudt56b/unit/ko.res
index 4457504..9d6aaaa 100644
--- a/src/cobalt/content/icu/icudt56b/unit/ko.res
+++ b/src/cobalt/content/icu/icudt56b/unit/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/lt.res b/src/cobalt/content/icu/icudt56b/unit/lt.res
index f55c0f3..e18752d 100644
--- a/src/cobalt/content/icu/icudt56b/unit/lt.res
+++ b/src/cobalt/content/icu/icudt56b/unit/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/lv.res b/src/cobalt/content/icu/icudt56b/unit/lv.res
index f151d02..04b478e 100644
--- a/src/cobalt/content/icu/icudt56b/unit/lv.res
+++ b/src/cobalt/content/icu/icudt56b/unit/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/ml.res b/src/cobalt/content/icu/icudt56b/unit/ml.res
index d4eb433..94fa297 100644
--- a/src/cobalt/content/icu/icudt56b/unit/ml.res
+++ b/src/cobalt/content/icu/icudt56b/unit/ml.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/mr.res b/src/cobalt/content/icu/icudt56b/unit/mr.res
index 16a7673..357e525 100644
--- a/src/cobalt/content/icu/icudt56b/unit/mr.res
+++ b/src/cobalt/content/icu/icudt56b/unit/mr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/ms.res b/src/cobalt/content/icu/icudt56b/unit/ms.res
index 7d2e715..a6fc007 100644
--- a/src/cobalt/content/icu/icudt56b/unit/ms.res
+++ b/src/cobalt/content/icu/icudt56b/unit/ms.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/nb.res b/src/cobalt/content/icu/icudt56b/unit/nb.res
index 455bf04..010b278 100644
--- a/src/cobalt/content/icu/icudt56b/unit/nb.res
+++ b/src/cobalt/content/icu/icudt56b/unit/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/nl.res b/src/cobalt/content/icu/icudt56b/unit/nl.res
index fa5887b..dc27465 100644
--- a/src/cobalt/content/icu/icudt56b/unit/nl.res
+++ b/src/cobalt/content/icu/icudt56b/unit/nl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/no.res b/src/cobalt/content/icu/icudt56b/unit/no.res
index b73c692..3d8e984 100644
--- a/src/cobalt/content/icu/icudt56b/unit/no.res
+++ b/src/cobalt/content/icu/icudt56b/unit/no.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/pl.res b/src/cobalt/content/icu/icudt56b/unit/pl.res
index b0a8755..2e25fac 100644
--- a/src/cobalt/content/icu/icudt56b/unit/pl.res
+++ b/src/cobalt/content/icu/icudt56b/unit/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/pool.res b/src/cobalt/content/icu/icudt56b/unit/pool.res
index f11a0e0..c65cd54 100644
--- a/src/cobalt/content/icu/icudt56b/unit/pool.res
+++ b/src/cobalt/content/icu/icudt56b/unit/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/pt.res b/src/cobalt/content/icu/icudt56b/unit/pt.res
index d125bac..73168a1 100644
--- a/src/cobalt/content/icu/icudt56b/unit/pt.res
+++ b/src/cobalt/content/icu/icudt56b/unit/pt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/pt_PT.res b/src/cobalt/content/icu/icudt56b/unit/pt_PT.res
index 88c2270..276dd06 100644
--- a/src/cobalt/content/icu/icudt56b/unit/pt_PT.res
+++ b/src/cobalt/content/icu/icudt56b/unit/pt_PT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/ro.res b/src/cobalt/content/icu/icudt56b/unit/ro.res
index c83ed06..2a06311 100644
--- a/src/cobalt/content/icu/icudt56b/unit/ro.res
+++ b/src/cobalt/content/icu/icudt56b/unit/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/root.res b/src/cobalt/content/icu/icudt56b/unit/root.res
index a29b95d..615d7e5 100644
--- a/src/cobalt/content/icu/icudt56b/unit/root.res
+++ b/src/cobalt/content/icu/icudt56b/unit/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/ru.res b/src/cobalt/content/icu/icudt56b/unit/ru.res
index 7725656..fbece9b 100644
--- a/src/cobalt/content/icu/icudt56b/unit/ru.res
+++ b/src/cobalt/content/icu/icudt56b/unit/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/sh.res b/src/cobalt/content/icu/icudt56b/unit/sh.res
index d473968..96c0714 100644
--- a/src/cobalt/content/icu/icudt56b/unit/sh.res
+++ b/src/cobalt/content/icu/icudt56b/unit/sh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/sk.res b/src/cobalt/content/icu/icudt56b/unit/sk.res
index c810d56..f3b61f8 100644
--- a/src/cobalt/content/icu/icudt56b/unit/sk.res
+++ b/src/cobalt/content/icu/icudt56b/unit/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/sl.res b/src/cobalt/content/icu/icudt56b/unit/sl.res
index da21626..0d6f0f0 100644
--- a/src/cobalt/content/icu/icudt56b/unit/sl.res
+++ b/src/cobalt/content/icu/icudt56b/unit/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/sr.res b/src/cobalt/content/icu/icudt56b/unit/sr.res
index 99cb318..f0053ba 100644
--- a/src/cobalt/content/icu/icudt56b/unit/sr.res
+++ b/src/cobalt/content/icu/icudt56b/unit/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/sr_Latn.res b/src/cobalt/content/icu/icudt56b/unit/sr_Latn.res
index e14deae..6dfbf33 100644
--- a/src/cobalt/content/icu/icudt56b/unit/sr_Latn.res
+++ b/src/cobalt/content/icu/icudt56b/unit/sr_Latn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/sv.res b/src/cobalt/content/icu/icudt56b/unit/sv.res
index 5e08842..33a4ca0 100644
--- a/src/cobalt/content/icu/icudt56b/unit/sv.res
+++ b/src/cobalt/content/icu/icudt56b/unit/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/sw.res b/src/cobalt/content/icu/icudt56b/unit/sw.res
index 0b20c40..fa27a7e 100644
--- a/src/cobalt/content/icu/icudt56b/unit/sw.res
+++ b/src/cobalt/content/icu/icudt56b/unit/sw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/ta.res b/src/cobalt/content/icu/icudt56b/unit/ta.res
index dd9f4ab..13041a5 100644
--- a/src/cobalt/content/icu/icudt56b/unit/ta.res
+++ b/src/cobalt/content/icu/icudt56b/unit/ta.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/te.res b/src/cobalt/content/icu/icudt56b/unit/te.res
index 3082396..18e64af 100644
--- a/src/cobalt/content/icu/icudt56b/unit/te.res
+++ b/src/cobalt/content/icu/icudt56b/unit/te.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/th.res b/src/cobalt/content/icu/icudt56b/unit/th.res
index 9971f89..76ea951 100644
--- a/src/cobalt/content/icu/icudt56b/unit/th.res
+++ b/src/cobalt/content/icu/icudt56b/unit/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/tl.res b/src/cobalt/content/icu/icudt56b/unit/tl.res
index c1010d7..60f64fd 100644
--- a/src/cobalt/content/icu/icudt56b/unit/tl.res
+++ b/src/cobalt/content/icu/icudt56b/unit/tl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/tr.res b/src/cobalt/content/icu/icudt56b/unit/tr.res
index ca7aadd..73eb0fc 100644
--- a/src/cobalt/content/icu/icudt56b/unit/tr.res
+++ b/src/cobalt/content/icu/icudt56b/unit/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/uk.res b/src/cobalt/content/icu/icudt56b/unit/uk.res
index 58ff16c..3077a54 100644
--- a/src/cobalt/content/icu/icudt56b/unit/uk.res
+++ b/src/cobalt/content/icu/icudt56b/unit/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/vi.res b/src/cobalt/content/icu/icudt56b/unit/vi.res
index f19d427..856d66a 100644
--- a/src/cobalt/content/icu/icudt56b/unit/vi.res
+++ b/src/cobalt/content/icu/icudt56b/unit/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/zh.res b/src/cobalt/content/icu/icudt56b/unit/zh.res
index d5f901c..6daa4c1 100644
--- a/src/cobalt/content/icu/icudt56b/unit/zh.res
+++ b/src/cobalt/content/icu/icudt56b/unit/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/zh_CN.res b/src/cobalt/content/icu/icudt56b/unit/zh_CN.res
index 8f439af..45cf266 100644
--- a/src/cobalt/content/icu/icudt56b/unit/zh_CN.res
+++ b/src/cobalt/content/icu/icudt56b/unit/zh_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/zh_HK.res b/src/cobalt/content/icu/icudt56b/unit/zh_HK.res
index a07da20..4d0916c 100644
--- a/src/cobalt/content/icu/icudt56b/unit/zh_HK.res
+++ b/src/cobalt/content/icu/icudt56b/unit/zh_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/zh_Hans.res b/src/cobalt/content/icu/icudt56b/unit/zh_Hans.res
index 66c86b9..85fc330 100644
--- a/src/cobalt/content/icu/icudt56b/unit/zh_Hans.res
+++ b/src/cobalt/content/icu/icudt56b/unit/zh_Hans.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/zh_Hans_CN.res b/src/cobalt/content/icu/icudt56b/unit/zh_Hans_CN.res
index 1786abd..bdef4bf 100644
--- a/src/cobalt/content/icu/icudt56b/unit/zh_Hans_CN.res
+++ b/src/cobalt/content/icu/icudt56b/unit/zh_Hans_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/zh_Hans_SG.res b/src/cobalt/content/icu/icudt56b/unit/zh_Hans_SG.res
index ca6dcb9..78d7de5 100644
--- a/src/cobalt/content/icu/icudt56b/unit/zh_Hans_SG.res
+++ b/src/cobalt/content/icu/icudt56b/unit/zh_Hans_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/zh_Hant.res b/src/cobalt/content/icu/icudt56b/unit/zh_Hant.res
index d9e19d1..f8405e6 100644
--- a/src/cobalt/content/icu/icudt56b/unit/zh_Hant.res
+++ b/src/cobalt/content/icu/icudt56b/unit/zh_Hant.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/zh_Hant_HK.res b/src/cobalt/content/icu/icudt56b/unit/zh_Hant_HK.res
index 725f53d..9b1162d 100644
--- a/src/cobalt/content/icu/icudt56b/unit/zh_Hant_HK.res
+++ b/src/cobalt/content/icu/icudt56b/unit/zh_Hant_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/zh_Hant_TW.res b/src/cobalt/content/icu/icudt56b/unit/zh_Hant_TW.res
index 1786abd..bdef4bf 100644
--- a/src/cobalt/content/icu/icudt56b/unit/zh_Hant_TW.res
+++ b/src/cobalt/content/icu/icudt56b/unit/zh_Hant_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/zh_SG.res b/src/cobalt/content/icu/icudt56b/unit/zh_SG.res
index e87b215..3cd5b1b 100644
--- a/src/cobalt/content/icu/icudt56b/unit/zh_SG.res
+++ b/src/cobalt/content/icu/icudt56b/unit/zh_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/unit/zh_TW.res b/src/cobalt/content/icu/icudt56b/unit/zh_TW.res
index 1c39fca..1aac47e 100644
--- a/src/cobalt/content/icu/icudt56b/unit/zh_TW.res
+++ b/src/cobalt/content/icu/icudt56b/unit/zh_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/ur.res b/src/cobalt/content/icu/icudt56b/ur.res
index b89e41a..dee9ed1 100644
--- a/src/cobalt/content/icu/icudt56b/ur.res
+++ b/src/cobalt/content/icu/icudt56b/ur.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/uz.res b/src/cobalt/content/icu/icudt56b/uz.res
index 95f2baa..25206c7 100644
--- a/src/cobalt/content/icu/icudt56b/uz.res
+++ b/src/cobalt/content/icu/icudt56b/uz.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/vi.res b/src/cobalt/content/icu/icudt56b/vi.res
index 28dd7cc..0f73fb7 100644
--- a/src/cobalt/content/icu/icudt56b/vi.res
+++ b/src/cobalt/content/icu/icudt56b/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/wa.res b/src/cobalt/content/icu/icudt56b/wa.res
index 35aa148..e9311b4 100644
--- a/src/cobalt/content/icu/icudt56b/wa.res
+++ b/src/cobalt/content/icu/icudt56b/wa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/yo.res b/src/cobalt/content/icu/icudt56b/yo.res
index 622dd60..070063d 100644
--- a/src/cobalt/content/icu/icudt56b/yo.res
+++ b/src/cobalt/content/icu/icudt56b/yo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zh.res b/src/cobalt/content/icu/icudt56b/zh.res
index 3f8f599..7d2ecf2 100644
--- a/src/cobalt/content/icu/icudt56b/zh.res
+++ b/src/cobalt/content/icu/icudt56b/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zh_CN.res b/src/cobalt/content/icu/icudt56b/zh_CN.res
index d366b9e..1b8f7db 100644
--- a/src/cobalt/content/icu/icudt56b/zh_CN.res
+++ b/src/cobalt/content/icu/icudt56b/zh_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zh_HK.res b/src/cobalt/content/icu/icudt56b/zh_HK.res
index 7432644..9e8894a 100644
--- a/src/cobalt/content/icu/icudt56b/zh_HK.res
+++ b/src/cobalt/content/icu/icudt56b/zh_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zh_Hans.res b/src/cobalt/content/icu/icudt56b/zh_Hans.res
index 0c29168..7a2eb6d 100644
--- a/src/cobalt/content/icu/icudt56b/zh_Hans.res
+++ b/src/cobalt/content/icu/icudt56b/zh_Hans.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zh_Hans_CN.res b/src/cobalt/content/icu/icudt56b/zh_Hans_CN.res
index 0c29168..7a2eb6d 100644
--- a/src/cobalt/content/icu/icudt56b/zh_Hans_CN.res
+++ b/src/cobalt/content/icu/icudt56b/zh_Hans_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zh_Hans_SG.res b/src/cobalt/content/icu/icudt56b/zh_Hans_SG.res
index 2d2d350..6e1a433 100644
--- a/src/cobalt/content/icu/icudt56b/zh_Hans_SG.res
+++ b/src/cobalt/content/icu/icudt56b/zh_Hans_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zh_Hant.res b/src/cobalt/content/icu/icudt56b/zh_Hant.res
index 7d655fa..0bfaa77 100644
--- a/src/cobalt/content/icu/icudt56b/zh_Hant.res
+++ b/src/cobalt/content/icu/icudt56b/zh_Hant.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zh_Hant_HK.res b/src/cobalt/content/icu/icudt56b/zh_Hant_HK.res
index f4f8ce4..a0b017d 100644
--- a/src/cobalt/content/icu/icudt56b/zh_Hant_HK.res
+++ b/src/cobalt/content/icu/icudt56b/zh_Hant_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zh_Hant_TW.res b/src/cobalt/content/icu/icudt56b/zh_Hant_TW.res
index 0c29168..7a2eb6d 100644
--- a/src/cobalt/content/icu/icudt56b/zh_Hant_TW.res
+++ b/src/cobalt/content/icu/icudt56b/zh_Hant_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zh_SG.res b/src/cobalt/content/icu/icudt56b/zh_SG.res
index 720eed1..a0b68a9 100644
--- a/src/cobalt/content/icu/icudt56b/zh_SG.res
+++ b/src/cobalt/content/icu/icudt56b/zh_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zh_TW.res b/src/cobalt/content/icu/icudt56b/zh_TW.res
index f7a32b9..0dff169 100644
--- a/src/cobalt/content/icu/icudt56b/zh_TW.res
+++ b/src/cobalt/content/icu/icudt56b/zh_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/am.res b/src/cobalt/content/icu/icudt56b/zone/am.res
index ecdf5a6..8d19975 100644
--- a/src/cobalt/content/icu/icudt56b/zone/am.res
+++ b/src/cobalt/content/icu/icudt56b/zone/am.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/ar.res b/src/cobalt/content/icu/icudt56b/zone/ar.res
index 90bf7d1..d71faf3 100644
--- a/src/cobalt/content/icu/icudt56b/zone/ar.res
+++ b/src/cobalt/content/icu/icudt56b/zone/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/bg.res b/src/cobalt/content/icu/icudt56b/zone/bg.res
index 1e3b8b7..226554b 100644
--- a/src/cobalt/content/icu/icudt56b/zone/bg.res
+++ b/src/cobalt/content/icu/icudt56b/zone/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/bn.res b/src/cobalt/content/icu/icudt56b/zone/bn.res
index 1bfd7d3..83c397b 100644
--- a/src/cobalt/content/icu/icudt56b/zone/bn.res
+++ b/src/cobalt/content/icu/icudt56b/zone/bn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/ca.res b/src/cobalt/content/icu/icudt56b/zone/ca.res
index 60a5a33..2fb72fb 100644
--- a/src/cobalt/content/icu/icudt56b/zone/ca.res
+++ b/src/cobalt/content/icu/icudt56b/zone/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/cs.res b/src/cobalt/content/icu/icudt56b/zone/cs.res
index bcd686e..905fdde 100644
--- a/src/cobalt/content/icu/icudt56b/zone/cs.res
+++ b/src/cobalt/content/icu/icudt56b/zone/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/da.res b/src/cobalt/content/icu/icudt56b/zone/da.res
index 47df657..9080b79 100644
--- a/src/cobalt/content/icu/icudt56b/zone/da.res
+++ b/src/cobalt/content/icu/icudt56b/zone/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/de.res b/src/cobalt/content/icu/icudt56b/zone/de.res
index e9a0bcd..913e3f2 100644
--- a/src/cobalt/content/icu/icudt56b/zone/de.res
+++ b/src/cobalt/content/icu/icudt56b/zone/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/el.res b/src/cobalt/content/icu/icudt56b/zone/el.res
index 16e754a..76d3839 100644
--- a/src/cobalt/content/icu/icudt56b/zone/el.res
+++ b/src/cobalt/content/icu/icudt56b/zone/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/en.res b/src/cobalt/content/icu/icudt56b/zone/en.res
index 54e5bd2..c5af6cc 100644
--- a/src/cobalt/content/icu/icudt56b/zone/en.res
+++ b/src/cobalt/content/icu/icudt56b/zone/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/en_001.res b/src/cobalt/content/icu/icudt56b/zone/en_001.res
index 8a5dc2f..d57ca5b 100644
--- a/src/cobalt/content/icu/icudt56b/zone/en_001.res
+++ b/src/cobalt/content/icu/icudt56b/zone/en_001.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/en_150.res b/src/cobalt/content/icu/icudt56b/zone/en_150.res
index ddebb42..ba3ce45 100644
--- a/src/cobalt/content/icu/icudt56b/zone/en_150.res
+++ b/src/cobalt/content/icu/icudt56b/zone/en_150.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/en_AU.res b/src/cobalt/content/icu/icudt56b/zone/en_AU.res
index a8735c5..23645e7 100644
--- a/src/cobalt/content/icu/icudt56b/zone/en_AU.res
+++ b/src/cobalt/content/icu/icudt56b/zone/en_AU.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/en_CA.res b/src/cobalt/content/icu/icudt56b/zone/en_CA.res
index 4e338d4..1bac93c 100644
--- a/src/cobalt/content/icu/icudt56b/zone/en_CA.res
+++ b/src/cobalt/content/icu/icudt56b/zone/en_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/en_GB.res b/src/cobalt/content/icu/icudt56b/zone/en_GB.res
index 264b11d..2754391 100644
--- a/src/cobalt/content/icu/icudt56b/zone/en_GB.res
+++ b/src/cobalt/content/icu/icudt56b/zone/en_GB.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/en_IN.res b/src/cobalt/content/icu/icudt56b/zone/en_IN.res
index 70a1809..05a0947 100644
--- a/src/cobalt/content/icu/icudt56b/zone/en_IN.res
+++ b/src/cobalt/content/icu/icudt56b/zone/en_IN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/en_NZ.res b/src/cobalt/content/icu/icudt56b/zone/en_NZ.res
index b1e0e1f..05cc670 100644
--- a/src/cobalt/content/icu/icudt56b/zone/en_NZ.res
+++ b/src/cobalt/content/icu/icudt56b/zone/en_NZ.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/en_ZA.res b/src/cobalt/content/icu/icudt56b/zone/en_ZA.res
index 3b9c2d9..c2c2087 100644
--- a/src/cobalt/content/icu/icudt56b/zone/en_ZA.res
+++ b/src/cobalt/content/icu/icudt56b/zone/en_ZA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/es.res b/src/cobalt/content/icu/icudt56b/zone/es.res
index 0b7f828..21642cd 100644
--- a/src/cobalt/content/icu/icudt56b/zone/es.res
+++ b/src/cobalt/content/icu/icudt56b/zone/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/es_419.res b/src/cobalt/content/icu/icudt56b/zone/es_419.res
index 6a92ba0..90121e1 100644
--- a/src/cobalt/content/icu/icudt56b/zone/es_419.res
+++ b/src/cobalt/content/icu/icudt56b/zone/es_419.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/es_AR.res b/src/cobalt/content/icu/icudt56b/zone/es_AR.res
index 487b16f..b824e1a 100644
--- a/src/cobalt/content/icu/icudt56b/zone/es_AR.res
+++ b/src/cobalt/content/icu/icudt56b/zone/es_AR.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/es_MX.res b/src/cobalt/content/icu/icudt56b/zone/es_MX.res
index 6fbc5cc..229f469 100644
--- a/src/cobalt/content/icu/icudt56b/zone/es_MX.res
+++ b/src/cobalt/content/icu/icudt56b/zone/es_MX.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/es_US.res b/src/cobalt/content/icu/icudt56b/zone/es_US.res
index 6008b97..3e42ce2 100644
--- a/src/cobalt/content/icu/icudt56b/zone/es_US.res
+++ b/src/cobalt/content/icu/icudt56b/zone/es_US.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/et.res b/src/cobalt/content/icu/icudt56b/zone/et.res
index 4e38bb0..6882e8c 100644
--- a/src/cobalt/content/icu/icudt56b/zone/et.res
+++ b/src/cobalt/content/icu/icudt56b/zone/et.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/fa.res b/src/cobalt/content/icu/icudt56b/zone/fa.res
index d6d73bf..335ea68 100644
--- a/src/cobalt/content/icu/icudt56b/zone/fa.res
+++ b/src/cobalt/content/icu/icudt56b/zone/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/fi.res b/src/cobalt/content/icu/icudt56b/zone/fi.res
index e5e130f..652f440 100644
--- a/src/cobalt/content/icu/icudt56b/zone/fi.res
+++ b/src/cobalt/content/icu/icudt56b/zone/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/fil.res b/src/cobalt/content/icu/icudt56b/zone/fil.res
index 53bebf4..411f4c4 100644
--- a/src/cobalt/content/icu/icudt56b/zone/fil.res
+++ b/src/cobalt/content/icu/icudt56b/zone/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/fr.res b/src/cobalt/content/icu/icudt56b/zone/fr.res
index 8a69d68..5ffd2c7 100644
--- a/src/cobalt/content/icu/icudt56b/zone/fr.res
+++ b/src/cobalt/content/icu/icudt56b/zone/fr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/fr_CA.res b/src/cobalt/content/icu/icudt56b/zone/fr_CA.res
index fadc1ad..2a97cb4 100644
--- a/src/cobalt/content/icu/icudt56b/zone/fr_CA.res
+++ b/src/cobalt/content/icu/icudt56b/zone/fr_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/gu.res b/src/cobalt/content/icu/icudt56b/zone/gu.res
index a2e1968..6363c38 100644
--- a/src/cobalt/content/icu/icudt56b/zone/gu.res
+++ b/src/cobalt/content/icu/icudt56b/zone/gu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/he.res b/src/cobalt/content/icu/icudt56b/zone/he.res
index 5c0a02b..eb383e7 100644
--- a/src/cobalt/content/icu/icudt56b/zone/he.res
+++ b/src/cobalt/content/icu/icudt56b/zone/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/hi.res b/src/cobalt/content/icu/icudt56b/zone/hi.res
index 6a382f2..d79080b 100644
--- a/src/cobalt/content/icu/icudt56b/zone/hi.res
+++ b/src/cobalt/content/icu/icudt56b/zone/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/hr.res b/src/cobalt/content/icu/icudt56b/zone/hr.res
index d6178cf..31121f4 100644
--- a/src/cobalt/content/icu/icudt56b/zone/hr.res
+++ b/src/cobalt/content/icu/icudt56b/zone/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/hu.res b/src/cobalt/content/icu/icudt56b/zone/hu.res
index 5e20524..d18a8e9 100644
--- a/src/cobalt/content/icu/icudt56b/zone/hu.res
+++ b/src/cobalt/content/icu/icudt56b/zone/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/id.res b/src/cobalt/content/icu/icudt56b/zone/id.res
index daea9ba..56dddb4 100644
--- a/src/cobalt/content/icu/icudt56b/zone/id.res
+++ b/src/cobalt/content/icu/icudt56b/zone/id.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/in.res b/src/cobalt/content/icu/icudt56b/zone/in.res
index 688b635..b0f0504 100644
--- a/src/cobalt/content/icu/icudt56b/zone/in.res
+++ b/src/cobalt/content/icu/icudt56b/zone/in.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/it.res b/src/cobalt/content/icu/icudt56b/zone/it.res
index 6a2499d..804ab13 100644
--- a/src/cobalt/content/icu/icudt56b/zone/it.res
+++ b/src/cobalt/content/icu/icudt56b/zone/it.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/iw.res b/src/cobalt/content/icu/icudt56b/zone/iw.res
index 2302404..de6dc2a 100644
--- a/src/cobalt/content/icu/icudt56b/zone/iw.res
+++ b/src/cobalt/content/icu/icudt56b/zone/iw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/ja.res b/src/cobalt/content/icu/icudt56b/zone/ja.res
index 009c899..3ef3a97 100644
--- a/src/cobalt/content/icu/icudt56b/zone/ja.res
+++ b/src/cobalt/content/icu/icudt56b/zone/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/kn.res b/src/cobalt/content/icu/icudt56b/zone/kn.res
index 5ceecc8..78f7c1c 100644
--- a/src/cobalt/content/icu/icudt56b/zone/kn.res
+++ b/src/cobalt/content/icu/icudt56b/zone/kn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/ko.res b/src/cobalt/content/icu/icudt56b/zone/ko.res
index 9815828..92140a3 100644
--- a/src/cobalt/content/icu/icudt56b/zone/ko.res
+++ b/src/cobalt/content/icu/icudt56b/zone/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/lt.res b/src/cobalt/content/icu/icudt56b/zone/lt.res
index 59156b4..d35f2b8 100644
--- a/src/cobalt/content/icu/icudt56b/zone/lt.res
+++ b/src/cobalt/content/icu/icudt56b/zone/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/lv.res b/src/cobalt/content/icu/icudt56b/zone/lv.res
index bc23fa3..c80f5e8 100644
--- a/src/cobalt/content/icu/icudt56b/zone/lv.res
+++ b/src/cobalt/content/icu/icudt56b/zone/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/ml.res b/src/cobalt/content/icu/icudt56b/zone/ml.res
index 2b45bfc..5e1fa15 100644
--- a/src/cobalt/content/icu/icudt56b/zone/ml.res
+++ b/src/cobalt/content/icu/icudt56b/zone/ml.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/mr.res b/src/cobalt/content/icu/icudt56b/zone/mr.res
index e15dff2..d01a7f4 100644
--- a/src/cobalt/content/icu/icudt56b/zone/mr.res
+++ b/src/cobalt/content/icu/icudt56b/zone/mr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/ms.res b/src/cobalt/content/icu/icudt56b/zone/ms.res
index 3d455e4..df8f19f 100644
--- a/src/cobalt/content/icu/icudt56b/zone/ms.res
+++ b/src/cobalt/content/icu/icudt56b/zone/ms.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/nb.res b/src/cobalt/content/icu/icudt56b/zone/nb.res
index 89aeb11..ef6dfde 100644
--- a/src/cobalt/content/icu/icudt56b/zone/nb.res
+++ b/src/cobalt/content/icu/icudt56b/zone/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/nl.res b/src/cobalt/content/icu/icudt56b/zone/nl.res
index a331fb4..965756c 100644
--- a/src/cobalt/content/icu/icudt56b/zone/nl.res
+++ b/src/cobalt/content/icu/icudt56b/zone/nl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/no.res b/src/cobalt/content/icu/icudt56b/zone/no.res
index 1d2ff18..449c0c1 100644
--- a/src/cobalt/content/icu/icudt56b/zone/no.res
+++ b/src/cobalt/content/icu/icudt56b/zone/no.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/pl.res b/src/cobalt/content/icu/icudt56b/zone/pl.res
index 10bc3fc..dea3693 100644
--- a/src/cobalt/content/icu/icudt56b/zone/pl.res
+++ b/src/cobalt/content/icu/icudt56b/zone/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/pool.res b/src/cobalt/content/icu/icudt56b/zone/pool.res
index 8738534..0e00d90 100644
--- a/src/cobalt/content/icu/icudt56b/zone/pool.res
+++ b/src/cobalt/content/icu/icudt56b/zone/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/pt.res b/src/cobalt/content/icu/icudt56b/zone/pt.res
index f443cd0..79dbf18 100644
--- a/src/cobalt/content/icu/icudt56b/zone/pt.res
+++ b/src/cobalt/content/icu/icudt56b/zone/pt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/pt_PT.res b/src/cobalt/content/icu/icudt56b/zone/pt_PT.res
index 83f2189..7d596ea 100644
--- a/src/cobalt/content/icu/icudt56b/zone/pt_PT.res
+++ b/src/cobalt/content/icu/icudt56b/zone/pt_PT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/ro.res b/src/cobalt/content/icu/icudt56b/zone/ro.res
index 8a56e8f..69a591e 100644
--- a/src/cobalt/content/icu/icudt56b/zone/ro.res
+++ b/src/cobalt/content/icu/icudt56b/zone/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/root.res b/src/cobalt/content/icu/icudt56b/zone/root.res
index 2f519c3..23983bb 100644
--- a/src/cobalt/content/icu/icudt56b/zone/root.res
+++ b/src/cobalt/content/icu/icudt56b/zone/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/ru.res b/src/cobalt/content/icu/icudt56b/zone/ru.res
index e2c9787..2931c15 100644
--- a/src/cobalt/content/icu/icudt56b/zone/ru.res
+++ b/src/cobalt/content/icu/icudt56b/zone/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/sk.res b/src/cobalt/content/icu/icudt56b/zone/sk.res
index 26d150c..9efb8af 100644
--- a/src/cobalt/content/icu/icudt56b/zone/sk.res
+++ b/src/cobalt/content/icu/icudt56b/zone/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/sl.res b/src/cobalt/content/icu/icudt56b/zone/sl.res
index f808cf0..28abb1f 100644
--- a/src/cobalt/content/icu/icudt56b/zone/sl.res
+++ b/src/cobalt/content/icu/icudt56b/zone/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/sr.res b/src/cobalt/content/icu/icudt56b/zone/sr.res
index 6420fc2..d8a33b1 100644
--- a/src/cobalt/content/icu/icudt56b/zone/sr.res
+++ b/src/cobalt/content/icu/icudt56b/zone/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/sv.res b/src/cobalt/content/icu/icudt56b/zone/sv.res
index ba29b46..ad8ded4 100644
--- a/src/cobalt/content/icu/icudt56b/zone/sv.res
+++ b/src/cobalt/content/icu/icudt56b/zone/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/sw.res b/src/cobalt/content/icu/icudt56b/zone/sw.res
index b9dd514..b050d1b 100644
--- a/src/cobalt/content/icu/icudt56b/zone/sw.res
+++ b/src/cobalt/content/icu/icudt56b/zone/sw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/ta.res b/src/cobalt/content/icu/icudt56b/zone/ta.res
index a2133b6..78be1b5 100644
--- a/src/cobalt/content/icu/icudt56b/zone/ta.res
+++ b/src/cobalt/content/icu/icudt56b/zone/ta.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/te.res b/src/cobalt/content/icu/icudt56b/zone/te.res
index e98f297..339dba7 100644
--- a/src/cobalt/content/icu/icudt56b/zone/te.res
+++ b/src/cobalt/content/icu/icudt56b/zone/te.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/th.res b/src/cobalt/content/icu/icudt56b/zone/th.res
index 280414c..72fc122 100644
--- a/src/cobalt/content/icu/icudt56b/zone/th.res
+++ b/src/cobalt/content/icu/icudt56b/zone/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/tr.res b/src/cobalt/content/icu/icudt56b/zone/tr.res
index 75e59ef..abc50c8 100644
--- a/src/cobalt/content/icu/icudt56b/zone/tr.res
+++ b/src/cobalt/content/icu/icudt56b/zone/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/tzdbNames.res b/src/cobalt/content/icu/icudt56b/zone/tzdbNames.res
index ec5b930..8b8fcad 100644
--- a/src/cobalt/content/icu/icudt56b/zone/tzdbNames.res
+++ b/src/cobalt/content/icu/icudt56b/zone/tzdbNames.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/uk.res b/src/cobalt/content/icu/icudt56b/zone/uk.res
index a71b8e1..ce3f5b3 100644
--- a/src/cobalt/content/icu/icudt56b/zone/uk.res
+++ b/src/cobalt/content/icu/icudt56b/zone/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/vi.res b/src/cobalt/content/icu/icudt56b/zone/vi.res
index d22c37a..25807e2 100644
--- a/src/cobalt/content/icu/icudt56b/zone/vi.res
+++ b/src/cobalt/content/icu/icudt56b/zone/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/zh.res b/src/cobalt/content/icu/icudt56b/zone/zh.res
index a2553cb..7a99c76 100644
--- a/src/cobalt/content/icu/icudt56b/zone/zh.res
+++ b/src/cobalt/content/icu/icudt56b/zone/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/zh_CN.res b/src/cobalt/content/icu/icudt56b/zone/zh_CN.res
index 300fdf6..ec46635 100644
--- a/src/cobalt/content/icu/icudt56b/zone/zh_CN.res
+++ b/src/cobalt/content/icu/icudt56b/zone/zh_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/zh_HK.res b/src/cobalt/content/icu/icudt56b/zone/zh_HK.res
index 4016633..fe81e04 100644
--- a/src/cobalt/content/icu/icudt56b/zone/zh_HK.res
+++ b/src/cobalt/content/icu/icudt56b/zone/zh_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/zh_Hans.res b/src/cobalt/content/icu/icudt56b/zone/zh_Hans.res
index 587229d..b48bd9c 100644
--- a/src/cobalt/content/icu/icudt56b/zone/zh_Hans.res
+++ b/src/cobalt/content/icu/icudt56b/zone/zh_Hans.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/zh_Hans_CN.res b/src/cobalt/content/icu/icudt56b/zone/zh_Hans_CN.res
index 2f1a4b5..3e5b7e0 100644
--- a/src/cobalt/content/icu/icudt56b/zone/zh_Hans_CN.res
+++ b/src/cobalt/content/icu/icudt56b/zone/zh_Hans_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/zh_Hans_SG.res b/src/cobalt/content/icu/icudt56b/zone/zh_Hans_SG.res
index 3b199b9..73b46ba 100644
--- a/src/cobalt/content/icu/icudt56b/zone/zh_Hans_SG.res
+++ b/src/cobalt/content/icu/icudt56b/zone/zh_Hans_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/zh_Hant.res b/src/cobalt/content/icu/icudt56b/zone/zh_Hant.res
index 2bb3aa3..80e2d84 100644
--- a/src/cobalt/content/icu/icudt56b/zone/zh_Hant.res
+++ b/src/cobalt/content/icu/icudt56b/zone/zh_Hant.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/zh_Hant_HK.res b/src/cobalt/content/icu/icudt56b/zone/zh_Hant_HK.res
index 9bc0748..c32662a 100644
--- a/src/cobalt/content/icu/icudt56b/zone/zh_Hant_HK.res
+++ b/src/cobalt/content/icu/icudt56b/zone/zh_Hant_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/zh_Hant_TW.res b/src/cobalt/content/icu/icudt56b/zone/zh_Hant_TW.res
index 2f1a4b5..3e5b7e0 100644
--- a/src/cobalt/content/icu/icudt56b/zone/zh_Hant_TW.res
+++ b/src/cobalt/content/icu/icudt56b/zone/zh_Hant_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/zh_SG.res b/src/cobalt/content/icu/icudt56b/zone/zh_SG.res
index 3d32d68..9a6d40e 100644
--- a/src/cobalt/content/icu/icudt56b/zone/zh_SG.res
+++ b/src/cobalt/content/icu/icudt56b/zone/zh_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zone/zh_TW.res b/src/cobalt/content/icu/icudt56b/zone/zh_TW.res
index b7bc97e..403b5a8 100644
--- a/src/cobalt/content/icu/icudt56b/zone/zh_TW.res
+++ b/src/cobalt/content/icu/icudt56b/zone/zh_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56b/zu.res b/src/cobalt/content/icu/icudt56b/zu.res
index ce67f86..15cdcff 100644
--- a/src/cobalt/content/icu/icudt56b/zu.res
+++ b/src/cobalt/content/icu/icudt56b/zu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/af.res b/src/cobalt/content/icu/icudt56l/af.res
index c10dff1..7d0f080 100644
--- a/src/cobalt/content/icu/icudt56l/af.res
+++ b/src/cobalt/content/icu/icudt56l/af.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ak.res b/src/cobalt/content/icu/icudt56l/ak.res
index 38c65e8..a2f7b87 100644
--- a/src/cobalt/content/icu/icudt56l/ak.res
+++ b/src/cobalt/content/icu/icudt56l/ak.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/am.res b/src/cobalt/content/icu/icudt56l/am.res
index 5057758..74dc8d2 100644
--- a/src/cobalt/content/icu/icudt56l/am.res
+++ b/src/cobalt/content/icu/icudt56l/am.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/an.res b/src/cobalt/content/icu/icudt56l/an.res
index d25cfda..6faff72 100644
--- a/src/cobalt/content/icu/icudt56l/an.res
+++ b/src/cobalt/content/icu/icudt56l/an.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ar.res b/src/cobalt/content/icu/icudt56l/ar.res
index 9ef2045..474e7927 100644
--- a/src/cobalt/content/icu/icudt56l/ar.res
+++ b/src/cobalt/content/icu/icudt56l/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ast.res b/src/cobalt/content/icu/icudt56l/ast.res
index ee47109..5812754 100644
--- a/src/cobalt/content/icu/icudt56l/ast.res
+++ b/src/cobalt/content/icu/icudt56l/ast.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/az.res b/src/cobalt/content/icu/icudt56l/az.res
index e1470c0..259dcba 100644
--- a/src/cobalt/content/icu/icudt56l/az.res
+++ b/src/cobalt/content/icu/icudt56l/az.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/be.res b/src/cobalt/content/icu/icudt56l/be.res
index b70175a..4f3efa9 100644
--- a/src/cobalt/content/icu/icudt56l/be.res
+++ b/src/cobalt/content/icu/icudt56l/be.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/bem.res b/src/cobalt/content/icu/icudt56l/bem.res
index db42942..f2c0f8a 100644
--- a/src/cobalt/content/icu/icudt56l/bem.res
+++ b/src/cobalt/content/icu/icudt56l/bem.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/bg.res b/src/cobalt/content/icu/icudt56l/bg.res
index 2a45166..460af4f 100644
--- a/src/cobalt/content/icu/icudt56l/bg.res
+++ b/src/cobalt/content/icu/icudt56l/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/bn.res b/src/cobalt/content/icu/icudt56l/bn.res
index e1deb82..c1988d5 100644
--- a/src/cobalt/content/icu/icudt56l/bn.res
+++ b/src/cobalt/content/icu/icudt56l/bn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/br.res b/src/cobalt/content/icu/icudt56l/br.res
index b3fd0fa..4928119 100644
--- a/src/cobalt/content/icu/icudt56l/br.res
+++ b/src/cobalt/content/icu/icudt56l/br.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/bs.res b/src/cobalt/content/icu/icudt56l/bs.res
index e7f1481..4cb47ea 100644
--- a/src/cobalt/content/icu/icudt56l/bs.res
+++ b/src/cobalt/content/icu/icudt56l/bs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ca.res b/src/cobalt/content/icu/icudt56l/ca.res
index 3ef57e3..2b42ab7 100644
--- a/src/cobalt/content/icu/icudt56l/ca.res
+++ b/src/cobalt/content/icu/icudt56l/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ckb.res b/src/cobalt/content/icu/icudt56l/ckb.res
index 3074461..190b2bd 100644
--- a/src/cobalt/content/icu/icudt56l/ckb.res
+++ b/src/cobalt/content/icu/icudt56l/ckb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/ar.res b/src/cobalt/content/icu/icudt56l/coll/ar.res
index e2f94ca..860e431 100644
--- a/src/cobalt/content/icu/icudt56l/coll/ar.res
+++ b/src/cobalt/content/icu/icudt56l/coll/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/bg.res b/src/cobalt/content/icu/icudt56l/coll/bg.res
index 671f9b1..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/bg.res
+++ b/src/cobalt/content/icu/icudt56l/coll/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/bn.res b/src/cobalt/content/icu/icudt56l/coll/bn.res
index c2d025b..1466600 100644
--- a/src/cobalt/content/icu/icudt56l/coll/bn.res
+++ b/src/cobalt/content/icu/icudt56l/coll/bn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/ca.res b/src/cobalt/content/icu/icudt56l/coll/ca.res
index 94e09da..8f9c047 100644
--- a/src/cobalt/content/icu/icudt56l/coll/ca.res
+++ b/src/cobalt/content/icu/icudt56l/coll/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/cs.res b/src/cobalt/content/icu/icudt56l/coll/cs.res
index af17fc9..6b71925 100644
--- a/src/cobalt/content/icu/icudt56l/coll/cs.res
+++ b/src/cobalt/content/icu/icudt56l/coll/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/da.res b/src/cobalt/content/icu/icudt56l/coll/da.res
index eec8a2f..6b71925 100644
--- a/src/cobalt/content/icu/icudt56l/coll/da.res
+++ b/src/cobalt/content/icu/icudt56l/coll/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/de.res b/src/cobalt/content/icu/icudt56l/coll/de.res
index 42d0fed..28c8794 100644
--- a/src/cobalt/content/icu/icudt56l/coll/de.res
+++ b/src/cobalt/content/icu/icudt56l/coll/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/de_AT.res b/src/cobalt/content/icu/icudt56l/coll/de_AT.res
index 8a598af..8bcbf4c 100644
--- a/src/cobalt/content/icu/icudt56l/coll/de_AT.res
+++ b/src/cobalt/content/icu/icudt56l/coll/de_AT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/el.res b/src/cobalt/content/icu/icudt56l/coll/el.res
index 4190b25..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/el.res
+++ b/src/cobalt/content/icu/icudt56l/coll/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/es.res b/src/cobalt/content/icu/icudt56l/coll/es.res
index 0924aa2..be6fa50 100644
--- a/src/cobalt/content/icu/icudt56l/coll/es.res
+++ b/src/cobalt/content/icu/icudt56l/coll/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/et.res b/src/cobalt/content/icu/icudt56l/coll/et.res
index 435d204..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/et.res
+++ b/src/cobalt/content/icu/icudt56l/coll/et.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/fa.res b/src/cobalt/content/icu/icudt56l/coll/fa.res
index 77d20bf..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/fa.res
+++ b/src/cobalt/content/icu/icudt56l/coll/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/fi.res b/src/cobalt/content/icu/icudt56l/coll/fi.res
index d4545cb..be6fa50 100644
--- a/src/cobalt/content/icu/icudt56l/coll/fi.res
+++ b/src/cobalt/content/icu/icudt56l/coll/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/fil.res b/src/cobalt/content/icu/icudt56l/coll/fil.res
index 9bbe4fa..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/fil.res
+++ b/src/cobalt/content/icu/icudt56l/coll/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/fr_CA.res b/src/cobalt/content/icu/icudt56l/coll/fr_CA.res
index faf3f21..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/fr_CA.res
+++ b/src/cobalt/content/icu/icudt56l/coll/fr_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/gu.res b/src/cobalt/content/icu/icudt56l/coll/gu.res
index e131aac..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/gu.res
+++ b/src/cobalt/content/icu/icudt56l/coll/gu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/he.res b/src/cobalt/content/icu/icudt56l/coll/he.res
index 270a0d6..6b71925 100644
--- a/src/cobalt/content/icu/icudt56l/coll/he.res
+++ b/src/cobalt/content/icu/icudt56l/coll/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/hi.res b/src/cobalt/content/icu/icudt56l/coll/hi.res
index 1ab090a..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/hi.res
+++ b/src/cobalt/content/icu/icudt56l/coll/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/hr.res b/src/cobalt/content/icu/icudt56l/coll/hr.res
index 360d336..6b71925 100644
--- a/src/cobalt/content/icu/icudt56l/coll/hr.res
+++ b/src/cobalt/content/icu/icudt56l/coll/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/hu.res b/src/cobalt/content/icu/icudt56l/coll/hu.res
index 8de940f..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/hu.res
+++ b/src/cobalt/content/icu/icudt56l/coll/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/ja.res b/src/cobalt/content/icu/icudt56l/coll/ja.res
index 531a1f3..698d0e6 100644
--- a/src/cobalt/content/icu/icudt56l/coll/ja.res
+++ b/src/cobalt/content/icu/icudt56l/coll/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/kn.res b/src/cobalt/content/icu/icudt56l/coll/kn.res
index 8fd0fd6..1466600 100644
--- a/src/cobalt/content/icu/icudt56l/coll/kn.res
+++ b/src/cobalt/content/icu/icudt56l/coll/kn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/ko.res b/src/cobalt/content/icu/icudt56l/coll/ko.res
index 8f87327..4587fa1 100644
--- a/src/cobalt/content/icu/icudt56l/coll/ko.res
+++ b/src/cobalt/content/icu/icudt56l/coll/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/lt.res b/src/cobalt/content/icu/icudt56l/coll/lt.res
index df61039..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/lt.res
+++ b/src/cobalt/content/icu/icudt56l/coll/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/lv.res b/src/cobalt/content/icu/icudt56l/coll/lv.res
index 13c655e..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/lv.res
+++ b/src/cobalt/content/icu/icudt56l/coll/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/ml.res b/src/cobalt/content/icu/icudt56l/coll/ml.res
index 26e09f3..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/ml.res
+++ b/src/cobalt/content/icu/icudt56l/coll/ml.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/mr.res b/src/cobalt/content/icu/icudt56l/coll/mr.res
index f4d2cc1..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/mr.res
+++ b/src/cobalt/content/icu/icudt56l/coll/mr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/nb.res b/src/cobalt/content/icu/icudt56l/coll/nb.res
index fdc51f7..6b71925 100644
--- a/src/cobalt/content/icu/icudt56l/coll/nb.res
+++ b/src/cobalt/content/icu/icudt56l/coll/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/nn.res b/src/cobalt/content/icu/icudt56l/coll/nn.res
index fdc51f7..6b71925 100644
--- a/src/cobalt/content/icu/icudt56l/coll/nn.res
+++ b/src/cobalt/content/icu/icudt56l/coll/nn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/pl.res b/src/cobalt/content/icu/icudt56l/coll/pl.res
index 4858e5a..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/pl.res
+++ b/src/cobalt/content/icu/icudt56l/coll/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/ro.res b/src/cobalt/content/icu/icudt56l/coll/ro.res
index 1ea81ae..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/ro.res
+++ b/src/cobalt/content/icu/icudt56l/coll/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/root.res b/src/cobalt/content/icu/icudt56l/coll/root.res
index b01bb24..98ee81b 100644
--- a/src/cobalt/content/icu/icudt56l/coll/root.res
+++ b/src/cobalt/content/icu/icudt56l/coll/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/ru.res b/src/cobalt/content/icu/icudt56l/coll/ru.res
index 671f9b1..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/ru.res
+++ b/src/cobalt/content/icu/icudt56l/coll/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/sk.res b/src/cobalt/content/icu/icudt56l/coll/sk.res
index 082406d..6b71925 100644
--- a/src/cobalt/content/icu/icudt56l/coll/sk.res
+++ b/src/cobalt/content/icu/icudt56l/coll/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/sl.res b/src/cobalt/content/icu/icudt56l/coll/sl.res
index 6f173e1..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/sl.res
+++ b/src/cobalt/content/icu/icudt56l/coll/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/sr.res b/src/cobalt/content/icu/icudt56l/coll/sr.res
index 4c166cc..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/sr.res
+++ b/src/cobalt/content/icu/icudt56l/coll/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/sr_Latn.res b/src/cobalt/content/icu/icudt56l/coll/sr_Latn.res
index 360d336..6b71925 100644
--- a/src/cobalt/content/icu/icudt56l/coll/sr_Latn.res
+++ b/src/cobalt/content/icu/icudt56l/coll/sr_Latn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/sv.res b/src/cobalt/content/icu/icudt56l/coll/sv.res
index 97305c2..b4f08b9 100644
--- a/src/cobalt/content/icu/icudt56l/coll/sv.res
+++ b/src/cobalt/content/icu/icudt56l/coll/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/ta.res b/src/cobalt/content/icu/icudt56l/coll/ta.res
index 95b6947..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/ta.res
+++ b/src/cobalt/content/icu/icudt56l/coll/ta.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/te.res b/src/cobalt/content/icu/icudt56l/coll/te.res
index 93e0bd8..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/te.res
+++ b/src/cobalt/content/icu/icudt56l/coll/te.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/th.res b/src/cobalt/content/icu/icudt56l/coll/th.res
index de60121..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/th.res
+++ b/src/cobalt/content/icu/icudt56l/coll/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/tr.res b/src/cobalt/content/icu/icudt56l/coll/tr.res
index c51837b..6b71925 100644
--- a/src/cobalt/content/icu/icudt56l/coll/tr.res
+++ b/src/cobalt/content/icu/icudt56l/coll/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/uk.res b/src/cobalt/content/icu/icudt56l/coll/uk.res
index 90239f6..610281e 100644
--- a/src/cobalt/content/icu/icudt56l/coll/uk.res
+++ b/src/cobalt/content/icu/icudt56l/coll/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/vi.res b/src/cobalt/content/icu/icudt56l/coll/vi.res
index 906ef33..1466600 100644
--- a/src/cobalt/content/icu/icudt56l/coll/vi.res
+++ b/src/cobalt/content/icu/icudt56l/coll/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/coll/zh.res b/src/cobalt/content/icu/icudt56l/coll/zh.res
index 14d076c..cf84785 100644
--- a/src/cobalt/content/icu/icudt56l/coll/zh.res
+++ b/src/cobalt/content/icu/icudt56l/coll/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/cs.res b/src/cobalt/content/icu/icudt56l/cs.res
index 09ea881..b643760 100644
--- a/src/cobalt/content/icu/icudt56l/cs.res
+++ b/src/cobalt/content/icu/icudt56l/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/am.res b/src/cobalt/content/icu/icudt56l/curr/am.res
index d29ad5d..c699256 100644
--- a/src/cobalt/content/icu/icudt56l/curr/am.res
+++ b/src/cobalt/content/icu/icudt56l/curr/am.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/ar.res b/src/cobalt/content/icu/icudt56l/curr/ar.res
index 77a62e9..824ff84 100644
--- a/src/cobalt/content/icu/icudt56l/curr/ar.res
+++ b/src/cobalt/content/icu/icudt56l/curr/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/bg.res b/src/cobalt/content/icu/icudt56l/curr/bg.res
index 52f8374..2c0a02a 100644
--- a/src/cobalt/content/icu/icudt56l/curr/bg.res
+++ b/src/cobalt/content/icu/icudt56l/curr/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/ca.res b/src/cobalt/content/icu/icudt56l/curr/ca.res
index 24b4a8f..c2837c3 100644
--- a/src/cobalt/content/icu/icudt56l/curr/ca.res
+++ b/src/cobalt/content/icu/icudt56l/curr/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/cs.res b/src/cobalt/content/icu/icudt56l/curr/cs.res
index 81651e2..109596a 100644
--- a/src/cobalt/content/icu/icudt56l/curr/cs.res
+++ b/src/cobalt/content/icu/icudt56l/curr/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/da.res b/src/cobalt/content/icu/icudt56l/curr/da.res
index d7aa6cb..9a6bf36 100644
--- a/src/cobalt/content/icu/icudt56l/curr/da.res
+++ b/src/cobalt/content/icu/icudt56l/curr/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/de.res b/src/cobalt/content/icu/icudt56l/curr/de.res
index f9e3149..6e731e7 100644
--- a/src/cobalt/content/icu/icudt56l/curr/de.res
+++ b/src/cobalt/content/icu/icudt56l/curr/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/de_CH.res b/src/cobalt/content/icu/icudt56l/curr/de_CH.res
index 48a1a39..72cf49b 100644
--- a/src/cobalt/content/icu/icudt56l/curr/de_CH.res
+++ b/src/cobalt/content/icu/icudt56l/curr/de_CH.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/el.res b/src/cobalt/content/icu/icudt56l/curr/el.res
index 18963be..203dc21 100644
--- a/src/cobalt/content/icu/icudt56l/curr/el.res
+++ b/src/cobalt/content/icu/icudt56l/curr/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/en.res b/src/cobalt/content/icu/icudt56l/curr/en.res
index 811bdc6..b78dd5c 100644
--- a/src/cobalt/content/icu/icudt56l/curr/en.res
+++ b/src/cobalt/content/icu/icudt56l/curr/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/en_001.res b/src/cobalt/content/icu/icudt56l/curr/en_001.res
index a11d32a..7c956d8 100644
--- a/src/cobalt/content/icu/icudt56l/curr/en_001.res
+++ b/src/cobalt/content/icu/icudt56l/curr/en_001.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/en_150.res b/src/cobalt/content/icu/icudt56l/curr/en_150.res
index 652676e..18f73dd 100644
--- a/src/cobalt/content/icu/icudt56l/curr/en_150.res
+++ b/src/cobalt/content/icu/icudt56l/curr/en_150.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/en_AU.res b/src/cobalt/content/icu/icudt56l/curr/en_AU.res
index 62e8a60..8f30277 100644
--- a/src/cobalt/content/icu/icudt56l/curr/en_AU.res
+++ b/src/cobalt/content/icu/icudt56l/curr/en_AU.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/en_CA.res b/src/cobalt/content/icu/icudt56l/curr/en_CA.res
index fce360b..97b6a41 100644
--- a/src/cobalt/content/icu/icudt56l/curr/en_CA.res
+++ b/src/cobalt/content/icu/icudt56l/curr/en_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/en_GB.res b/src/cobalt/content/icu/icudt56l/curr/en_GB.res
index 73c4d73..5da4594 100644
--- a/src/cobalt/content/icu/icudt56l/curr/en_GB.res
+++ b/src/cobalt/content/icu/icudt56l/curr/en_GB.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/en_IN.res b/src/cobalt/content/icu/icudt56l/curr/en_IN.res
index 3cb138e..5ffbeed 100644
--- a/src/cobalt/content/icu/icudt56l/curr/en_IN.res
+++ b/src/cobalt/content/icu/icudt56l/curr/en_IN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/en_NZ.res b/src/cobalt/content/icu/icudt56l/curr/en_NZ.res
index f18ccaf..2362d04 100644
--- a/src/cobalt/content/icu/icudt56l/curr/en_NZ.res
+++ b/src/cobalt/content/icu/icudt56l/curr/en_NZ.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/en_ZA.res b/src/cobalt/content/icu/icudt56l/curr/en_ZA.res
index 16c361d..ba034a5 100644
--- a/src/cobalt/content/icu/icudt56l/curr/en_ZA.res
+++ b/src/cobalt/content/icu/icudt56l/curr/en_ZA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/es.res b/src/cobalt/content/icu/icudt56l/curr/es.res
index c0c5157..95b9e65 100644
--- a/src/cobalt/content/icu/icudt56l/curr/es.res
+++ b/src/cobalt/content/icu/icudt56l/curr/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/es_419.res b/src/cobalt/content/icu/icudt56l/curr/es_419.res
index 253e199..07aa4f5 100644
--- a/src/cobalt/content/icu/icudt56l/curr/es_419.res
+++ b/src/cobalt/content/icu/icudt56l/curr/es_419.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/es_AR.res b/src/cobalt/content/icu/icudt56l/curr/es_AR.res
index 00b8496..1be6445 100644
--- a/src/cobalt/content/icu/icudt56l/curr/es_AR.res
+++ b/src/cobalt/content/icu/icudt56l/curr/es_AR.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/es_MX.res b/src/cobalt/content/icu/icudt56l/curr/es_MX.res
index ef02555..d24b22b 100644
--- a/src/cobalt/content/icu/icudt56l/curr/es_MX.res
+++ b/src/cobalt/content/icu/icudt56l/curr/es_MX.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/es_US.res b/src/cobalt/content/icu/icudt56l/curr/es_US.res
index ab00ff3..b259afe 100644
--- a/src/cobalt/content/icu/icudt56l/curr/es_US.res
+++ b/src/cobalt/content/icu/icudt56l/curr/es_US.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/fa.res b/src/cobalt/content/icu/icudt56l/curr/fa.res
index 591bc05..116109a 100644
--- a/src/cobalt/content/icu/icudt56l/curr/fa.res
+++ b/src/cobalt/content/icu/icudt56l/curr/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/fi.res b/src/cobalt/content/icu/icudt56l/curr/fi.res
index 3b60b68..084bbe8 100644
--- a/src/cobalt/content/icu/icudt56l/curr/fi.res
+++ b/src/cobalt/content/icu/icudt56l/curr/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/fil.res b/src/cobalt/content/icu/icudt56l/curr/fil.res
index 230aeb6..aebff6b 100644
--- a/src/cobalt/content/icu/icudt56l/curr/fil.res
+++ b/src/cobalt/content/icu/icudt56l/curr/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/fr.res b/src/cobalt/content/icu/icudt56l/curr/fr.res
index 1f97b3e..44ee62f 100644
--- a/src/cobalt/content/icu/icudt56l/curr/fr.res
+++ b/src/cobalt/content/icu/icudt56l/curr/fr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/fr_CA.res b/src/cobalt/content/icu/icudt56l/curr/fr_CA.res
index 4799514..fb00495 100644
--- a/src/cobalt/content/icu/icudt56l/curr/fr_CA.res
+++ b/src/cobalt/content/icu/icudt56l/curr/fr_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/he.res b/src/cobalt/content/icu/icudt56l/curr/he.res
index 64fdace..724a6ab 100644
--- a/src/cobalt/content/icu/icudt56l/curr/he.res
+++ b/src/cobalt/content/icu/icudt56l/curr/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/hi.res b/src/cobalt/content/icu/icudt56l/curr/hi.res
index 7534109..c526cee 100644
--- a/src/cobalt/content/icu/icudt56l/curr/hi.res
+++ b/src/cobalt/content/icu/icudt56l/curr/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/hr.res b/src/cobalt/content/icu/icudt56l/curr/hr.res
index acc0983..2e47654 100644
--- a/src/cobalt/content/icu/icudt56l/curr/hr.res
+++ b/src/cobalt/content/icu/icudt56l/curr/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/hu.res b/src/cobalt/content/icu/icudt56l/curr/hu.res
index 1d83f9b..690eb17 100644
--- a/src/cobalt/content/icu/icudt56l/curr/hu.res
+++ b/src/cobalt/content/icu/icudt56l/curr/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/id.res b/src/cobalt/content/icu/icudt56l/curr/id.res
index f5046d5..9c68843 100644
--- a/src/cobalt/content/icu/icudt56l/curr/id.res
+++ b/src/cobalt/content/icu/icudt56l/curr/id.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/in.res b/src/cobalt/content/icu/icudt56l/curr/in.res
index 0606cd4..dfcbe33 100644
--- a/src/cobalt/content/icu/icudt56l/curr/in.res
+++ b/src/cobalt/content/icu/icudt56l/curr/in.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/it.res b/src/cobalt/content/icu/icudt56l/curr/it.res
index d3fd8df..5c9a53c 100644
--- a/src/cobalt/content/icu/icudt56l/curr/it.res
+++ b/src/cobalt/content/icu/icudt56l/curr/it.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/iw.res b/src/cobalt/content/icu/icudt56l/curr/iw.res
index 67f7066..dff9e6c 100644
--- a/src/cobalt/content/icu/icudt56l/curr/iw.res
+++ b/src/cobalt/content/icu/icudt56l/curr/iw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/ja.res b/src/cobalt/content/icu/icudt56l/curr/ja.res
index 2b6fc92..4bd7641 100644
--- a/src/cobalt/content/icu/icudt56l/curr/ja.res
+++ b/src/cobalt/content/icu/icudt56l/curr/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/ko.res b/src/cobalt/content/icu/icudt56l/curr/ko.res
index 8866594..06b3fa6 100644
--- a/src/cobalt/content/icu/icudt56l/curr/ko.res
+++ b/src/cobalt/content/icu/icudt56l/curr/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/lt.res b/src/cobalt/content/icu/icudt56l/curr/lt.res
index 32a614c..056b778 100644
--- a/src/cobalt/content/icu/icudt56l/curr/lt.res
+++ b/src/cobalt/content/icu/icudt56l/curr/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/lv.res b/src/cobalt/content/icu/icudt56l/curr/lv.res
index f1619e1..c6f2d7f 100644
--- a/src/cobalt/content/icu/icudt56l/curr/lv.res
+++ b/src/cobalt/content/icu/icudt56l/curr/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/nb.res b/src/cobalt/content/icu/icudt56l/curr/nb.res
index af3df3b..cbd603d 100644
--- a/src/cobalt/content/icu/icudt56l/curr/nb.res
+++ b/src/cobalt/content/icu/icudt56l/curr/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/nl.res b/src/cobalt/content/icu/icudt56l/curr/nl.res
index 26191f0..f53d29e 100644
--- a/src/cobalt/content/icu/icudt56l/curr/nl.res
+++ b/src/cobalt/content/icu/icudt56l/curr/nl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/no.res b/src/cobalt/content/icu/icudt56l/curr/no.res
index f74cd4c..7c0017a 100644
--- a/src/cobalt/content/icu/icudt56l/curr/no.res
+++ b/src/cobalt/content/icu/icudt56l/curr/no.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/pl.res b/src/cobalt/content/icu/icudt56l/curr/pl.res
index d4d6422..c8db80d 100644
--- a/src/cobalt/content/icu/icudt56l/curr/pl.res
+++ b/src/cobalt/content/icu/icudt56l/curr/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/pool.res b/src/cobalt/content/icu/icudt56l/curr/pool.res
index 7dd8d59..8c07f44 100644
--- a/src/cobalt/content/icu/icudt56l/curr/pool.res
+++ b/src/cobalt/content/icu/icudt56l/curr/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/pt.res b/src/cobalt/content/icu/icudt56l/curr/pt.res
index a029c17..6920e2b 100644
--- a/src/cobalt/content/icu/icudt56l/curr/pt.res
+++ b/src/cobalt/content/icu/icudt56l/curr/pt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/pt_PT.res b/src/cobalt/content/icu/icudt56l/curr/pt_PT.res
index f467c2e..43913fd 100644
--- a/src/cobalt/content/icu/icudt56l/curr/pt_PT.res
+++ b/src/cobalt/content/icu/icudt56l/curr/pt_PT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/ro.res b/src/cobalt/content/icu/icudt56l/curr/ro.res
index c005b60..1020d3d 100644
--- a/src/cobalt/content/icu/icudt56l/curr/ro.res
+++ b/src/cobalt/content/icu/icudt56l/curr/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/root.res b/src/cobalt/content/icu/icudt56l/curr/root.res
index 5a84b17..e5be485 100644
--- a/src/cobalt/content/icu/icudt56l/curr/root.res
+++ b/src/cobalt/content/icu/icudt56l/curr/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/ru.res b/src/cobalt/content/icu/icudt56l/curr/ru.res
index 9e799d5..6abb401 100644
--- a/src/cobalt/content/icu/icudt56l/curr/ru.res
+++ b/src/cobalt/content/icu/icudt56l/curr/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/sk.res b/src/cobalt/content/icu/icudt56l/curr/sk.res
index b0714a2..a742fcd 100644
--- a/src/cobalt/content/icu/icudt56l/curr/sk.res
+++ b/src/cobalt/content/icu/icudt56l/curr/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/sl.res b/src/cobalt/content/icu/icudt56l/curr/sl.res
index 5e78acd..5a2f0e6 100644
--- a/src/cobalt/content/icu/icudt56l/curr/sl.res
+++ b/src/cobalt/content/icu/icudt56l/curr/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/sr.res b/src/cobalt/content/icu/icudt56l/curr/sr.res
index 59c3cf6..1e9de53 100644
--- a/src/cobalt/content/icu/icudt56l/curr/sr.res
+++ b/src/cobalt/content/icu/icudt56l/curr/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/supplementalData.res b/src/cobalt/content/icu/icudt56l/curr/supplementalData.res
index c63d565..cd49222 100644
--- a/src/cobalt/content/icu/icudt56l/curr/supplementalData.res
+++ b/src/cobalt/content/icu/icudt56l/curr/supplementalData.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/sv.res b/src/cobalt/content/icu/icudt56l/curr/sv.res
index 93792b1..f12ee83 100644
--- a/src/cobalt/content/icu/icudt56l/curr/sv.res
+++ b/src/cobalt/content/icu/icudt56l/curr/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/sw.res b/src/cobalt/content/icu/icudt56l/curr/sw.res
index af1859f..6f34fc4 100644
--- a/src/cobalt/content/icu/icudt56l/curr/sw.res
+++ b/src/cobalt/content/icu/icudt56l/curr/sw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/th.res b/src/cobalt/content/icu/icudt56l/curr/th.res
index 527ed97..7044e5f 100644
--- a/src/cobalt/content/icu/icudt56l/curr/th.res
+++ b/src/cobalt/content/icu/icudt56l/curr/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/tl.res b/src/cobalt/content/icu/icudt56l/curr/tl.res
index 557adc4..652cad3 100644
--- a/src/cobalt/content/icu/icudt56l/curr/tl.res
+++ b/src/cobalt/content/icu/icudt56l/curr/tl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/tr.res b/src/cobalt/content/icu/icudt56l/curr/tr.res
index d89a965..ee3bc4d 100644
--- a/src/cobalt/content/icu/icudt56l/curr/tr.res
+++ b/src/cobalt/content/icu/icudt56l/curr/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/uk.res b/src/cobalt/content/icu/icudt56l/curr/uk.res
index e36e052..f733288 100644
--- a/src/cobalt/content/icu/icudt56l/curr/uk.res
+++ b/src/cobalt/content/icu/icudt56l/curr/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/vi.res b/src/cobalt/content/icu/icudt56l/curr/vi.res
index 067b5da..6d7281f 100644
--- a/src/cobalt/content/icu/icudt56l/curr/vi.res
+++ b/src/cobalt/content/icu/icudt56l/curr/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/zh.res b/src/cobalt/content/icu/icudt56l/curr/zh.res
index bc544da..248cb79 100644
--- a/src/cobalt/content/icu/icudt56l/curr/zh.res
+++ b/src/cobalt/content/icu/icudt56l/curr/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/zh_CN.res b/src/cobalt/content/icu/icudt56l/curr/zh_CN.res
index f94bafe..d44eba3 100644
--- a/src/cobalt/content/icu/icudt56l/curr/zh_CN.res
+++ b/src/cobalt/content/icu/icudt56l/curr/zh_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/zh_HK.res b/src/cobalt/content/icu/icudt56l/curr/zh_HK.res
index a72da46..84900e7 100644
--- a/src/cobalt/content/icu/icudt56l/curr/zh_HK.res
+++ b/src/cobalt/content/icu/icudt56l/curr/zh_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/zh_Hans.res b/src/cobalt/content/icu/icudt56l/curr/zh_Hans.res
index 3452716..9c3ad5f 100644
--- a/src/cobalt/content/icu/icudt56l/curr/zh_Hans.res
+++ b/src/cobalt/content/icu/icudt56l/curr/zh_Hans.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/zh_Hans_CN.res b/src/cobalt/content/icu/icudt56l/curr/zh_Hans_CN.res
index c704cfa..39648f2 100644
--- a/src/cobalt/content/icu/icudt56l/curr/zh_Hans_CN.res
+++ b/src/cobalt/content/icu/icudt56l/curr/zh_Hans_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/zh_Hans_SG.res b/src/cobalt/content/icu/icudt56l/curr/zh_Hans_SG.res
index d46a443..3a8c484 100644
--- a/src/cobalt/content/icu/icudt56l/curr/zh_Hans_SG.res
+++ b/src/cobalt/content/icu/icudt56l/curr/zh_Hans_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/zh_Hant.res b/src/cobalt/content/icu/icudt56l/curr/zh_Hant.res
index 99b5b2b..ceb21a0 100644
--- a/src/cobalt/content/icu/icudt56l/curr/zh_Hant.res
+++ b/src/cobalt/content/icu/icudt56l/curr/zh_Hant.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/zh_Hant_HK.res b/src/cobalt/content/icu/icudt56l/curr/zh_Hant_HK.res
index 95843d1..abfef87 100644
--- a/src/cobalt/content/icu/icudt56l/curr/zh_Hant_HK.res
+++ b/src/cobalt/content/icu/icudt56l/curr/zh_Hant_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/zh_Hant_TW.res b/src/cobalt/content/icu/icudt56l/curr/zh_Hant_TW.res
index c704cfa..39648f2 100644
--- a/src/cobalt/content/icu/icudt56l/curr/zh_Hant_TW.res
+++ b/src/cobalt/content/icu/icudt56l/curr/zh_Hant_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/zh_SG.res b/src/cobalt/content/icu/icudt56l/curr/zh_SG.res
index ffb8395..6ddf438 100644
--- a/src/cobalt/content/icu/icudt56l/curr/zh_SG.res
+++ b/src/cobalt/content/icu/icudt56l/curr/zh_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/curr/zh_TW.res b/src/cobalt/content/icu/icudt56l/curr/zh_TW.res
index 41f37d1..0d3071f 100644
--- a/src/cobalt/content/icu/icudt56l/curr/zh_TW.res
+++ b/src/cobalt/content/icu/icudt56l/curr/zh_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/cy.res b/src/cobalt/content/icu/icudt56l/cy.res
index f9a9812..31bfcb9 100644
--- a/src/cobalt/content/icu/icudt56l/cy.res
+++ b/src/cobalt/content/icu/icudt56l/cy.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/da.res b/src/cobalt/content/icu/icudt56l/da.res
index 6a7c227..c960bd0 100644
--- a/src/cobalt/content/icu/icudt56l/da.res
+++ b/src/cobalt/content/icu/icudt56l/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/de.res b/src/cobalt/content/icu/icudt56l/de.res
index 7512b61..bc5b990 100644
--- a/src/cobalt/content/icu/icudt56l/de.res
+++ b/src/cobalt/content/icu/icudt56l/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/de_AT.res b/src/cobalt/content/icu/icudt56l/de_AT.res
index c5c25df..9ad59a5 100644
--- a/src/cobalt/content/icu/icudt56l/de_AT.res
+++ b/src/cobalt/content/icu/icudt56l/de_AT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/de_CH.res b/src/cobalt/content/icu/icudt56l/de_CH.res
index e29448a..d867489 100644
--- a/src/cobalt/content/icu/icudt56l/de_CH.res
+++ b/src/cobalt/content/icu/icudt56l/de_CH.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ee.res b/src/cobalt/content/icu/icudt56l/ee.res
index 1ff9820..0841690 100644
--- a/src/cobalt/content/icu/icudt56l/ee.res
+++ b/src/cobalt/content/icu/icudt56l/ee.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/el.res b/src/cobalt/content/icu/icudt56l/el.res
index 24b221d..5c8708e 100644
--- a/src/cobalt/content/icu/icudt56l/el.res
+++ b/src/cobalt/content/icu/icudt56l/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/en.res b/src/cobalt/content/icu/icudt56l/en.res
index 4d29085..f4e06bc 100644
--- a/src/cobalt/content/icu/icudt56l/en.res
+++ b/src/cobalt/content/icu/icudt56l/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/en_001.res b/src/cobalt/content/icu/icudt56l/en_001.res
index abc68ca..c9f3b89 100644
--- a/src/cobalt/content/icu/icudt56l/en_001.res
+++ b/src/cobalt/content/icu/icudt56l/en_001.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/en_150.res b/src/cobalt/content/icu/icudt56l/en_150.res
index 4dc79df..c454e67 100644
--- a/src/cobalt/content/icu/icudt56l/en_150.res
+++ b/src/cobalt/content/icu/icudt56l/en_150.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/en_AU.res b/src/cobalt/content/icu/icudt56l/en_AU.res
index 83a901e..99b8d95 100644
--- a/src/cobalt/content/icu/icudt56l/en_AU.res
+++ b/src/cobalt/content/icu/icudt56l/en_AU.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/en_CA.res b/src/cobalt/content/icu/icudt56l/en_CA.res
index bc52baa..ec846ff 100644
--- a/src/cobalt/content/icu/icudt56l/en_CA.res
+++ b/src/cobalt/content/icu/icudt56l/en_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/en_GB.res b/src/cobalt/content/icu/icudt56l/en_GB.res
index 4bbb5cc..0afa7b6 100644
--- a/src/cobalt/content/icu/icudt56l/en_GB.res
+++ b/src/cobalt/content/icu/icudt56l/en_GB.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/en_IN.res b/src/cobalt/content/icu/icudt56l/en_IN.res
index 05e2ca0..230aff9 100644
--- a/src/cobalt/content/icu/icudt56l/en_IN.res
+++ b/src/cobalt/content/icu/icudt56l/en_IN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/en_NZ.res b/src/cobalt/content/icu/icudt56l/en_NZ.res
index cece412..b66ed27 100644
--- a/src/cobalt/content/icu/icudt56l/en_NZ.res
+++ b/src/cobalt/content/icu/icudt56l/en_NZ.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/en_US.res b/src/cobalt/content/icu/icudt56l/en_US.res
index 008e4b7..d0ddba1 100644
--- a/src/cobalt/content/icu/icudt56l/en_US.res
+++ b/src/cobalt/content/icu/icudt56l/en_US.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/en_ZA.res b/src/cobalt/content/icu/icudt56l/en_ZA.res
index 885ee5c..3e75979 100644
--- a/src/cobalt/content/icu/icudt56l/en_ZA.res
+++ b/src/cobalt/content/icu/icudt56l/en_ZA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/eo.res b/src/cobalt/content/icu/icudt56l/eo.res
index 396eb3a..3ef0851 100644
--- a/src/cobalt/content/icu/icudt56l/eo.res
+++ b/src/cobalt/content/icu/icudt56l/eo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/es.res b/src/cobalt/content/icu/icudt56l/es.res
index 76bbc8d..3fd059f 100644
--- a/src/cobalt/content/icu/icudt56l/es.res
+++ b/src/cobalt/content/icu/icudt56l/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/es_419.res b/src/cobalt/content/icu/icudt56l/es_419.res
index b880024..4cd3949 100644
--- a/src/cobalt/content/icu/icudt56l/es_419.res
+++ b/src/cobalt/content/icu/icudt56l/es_419.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/es_AR.res b/src/cobalt/content/icu/icudt56l/es_AR.res
index 7ec0cc5..8a7e563 100644
--- a/src/cobalt/content/icu/icudt56l/es_AR.res
+++ b/src/cobalt/content/icu/icudt56l/es_AR.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/es_ES.res b/src/cobalt/content/icu/icudt56l/es_ES.res
index 008e4b7..d0ddba1 100644
--- a/src/cobalt/content/icu/icudt56l/es_ES.res
+++ b/src/cobalt/content/icu/icudt56l/es_ES.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/es_MX.res b/src/cobalt/content/icu/icudt56l/es_MX.res
index c15d05f..326f91c 100644
--- a/src/cobalt/content/icu/icudt56l/es_MX.res
+++ b/src/cobalt/content/icu/icudt56l/es_MX.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/es_US.res b/src/cobalt/content/icu/icudt56l/es_US.res
index c21fa87..196c802 100644
--- a/src/cobalt/content/icu/icudt56l/es_US.res
+++ b/src/cobalt/content/icu/icudt56l/es_US.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/et.res b/src/cobalt/content/icu/icudt56l/et.res
index 1d58d37..0587d8a 100644
--- a/src/cobalt/content/icu/icudt56l/et.res
+++ b/src/cobalt/content/icu/icudt56l/et.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/eu.res b/src/cobalt/content/icu/icudt56l/eu.res
index 4aacb51..a8bbdb0 100644
--- a/src/cobalt/content/icu/icudt56l/eu.res
+++ b/src/cobalt/content/icu/icudt56l/eu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/fa.res b/src/cobalt/content/icu/icudt56l/fa.res
index ce1ed39..987ef94 100644
--- a/src/cobalt/content/icu/icudt56l/fa.res
+++ b/src/cobalt/content/icu/icudt56l/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/fi.res b/src/cobalt/content/icu/icudt56l/fi.res
index 0de1572..b46d9ef 100644
--- a/src/cobalt/content/icu/icudt56l/fi.res
+++ b/src/cobalt/content/icu/icudt56l/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/fil.res b/src/cobalt/content/icu/icudt56l/fil.res
index 497fddc..831e5c4 100644
--- a/src/cobalt/content/icu/icudt56l/fil.res
+++ b/src/cobalt/content/icu/icudt56l/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/fo.res b/src/cobalt/content/icu/icudt56l/fo.res
index ed636b7..f9055888 100644
--- a/src/cobalt/content/icu/icudt56l/fo.res
+++ b/src/cobalt/content/icu/icudt56l/fo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/fr.res b/src/cobalt/content/icu/icudt56l/fr.res
index fa0a350..b24d618 100644
--- a/src/cobalt/content/icu/icudt56l/fr.res
+++ b/src/cobalt/content/icu/icudt56l/fr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/fr_CA.res b/src/cobalt/content/icu/icudt56l/fr_CA.res
index 4d95890..6bfbab5 100644
--- a/src/cobalt/content/icu/icudt56l/fr_CA.res
+++ b/src/cobalt/content/icu/icudt56l/fr_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/fr_CH.res b/src/cobalt/content/icu/icudt56l/fr_CH.res
index 660f7cc..ca578e2 100644
--- a/src/cobalt/content/icu/icudt56l/fr_CH.res
+++ b/src/cobalt/content/icu/icudt56l/fr_CH.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ga.res b/src/cobalt/content/icu/icudt56l/ga.res
index 557d401..7ab9307 100644
--- a/src/cobalt/content/icu/icudt56l/ga.res
+++ b/src/cobalt/content/icu/icudt56l/ga.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/gl.res b/src/cobalt/content/icu/icudt56l/gl.res
index 382bdcd..1576f90 100644
--- a/src/cobalt/content/icu/icudt56l/gl.res
+++ b/src/cobalt/content/icu/icudt56l/gl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/gu.res b/src/cobalt/content/icu/icudt56l/gu.res
index 4f4387c..1c5e5a6 100644
--- a/src/cobalt/content/icu/icudt56l/gu.res
+++ b/src/cobalt/content/icu/icudt56l/gu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ha.res b/src/cobalt/content/icu/icudt56l/ha.res
index 56fa9c8..a41f4f9 100644
--- a/src/cobalt/content/icu/icudt56l/ha.res
+++ b/src/cobalt/content/icu/icudt56l/ha.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/haw.res b/src/cobalt/content/icu/icudt56l/haw.res
index e22d856..46c4980 100644
--- a/src/cobalt/content/icu/icudt56l/haw.res
+++ b/src/cobalt/content/icu/icudt56l/haw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/he.res b/src/cobalt/content/icu/icudt56l/he.res
index 1437887..874b972 100644
--- a/src/cobalt/content/icu/icudt56l/he.res
+++ b/src/cobalt/content/icu/icudt56l/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/hi.res b/src/cobalt/content/icu/icudt56l/hi.res
index 6807120..17db902 100644
--- a/src/cobalt/content/icu/icudt56l/hi.res
+++ b/src/cobalt/content/icu/icudt56l/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/hr.res b/src/cobalt/content/icu/icudt56l/hr.res
index 510a817..201c027 100644
--- a/src/cobalt/content/icu/icudt56l/hr.res
+++ b/src/cobalt/content/icu/icudt56l/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/hu.res b/src/cobalt/content/icu/icudt56l/hu.res
index 1cad64f..e7b7c6b 100644
--- a/src/cobalt/content/icu/icudt56l/hu.res
+++ b/src/cobalt/content/icu/icudt56l/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/hy.res b/src/cobalt/content/icu/icudt56l/hy.res
index 788c808..31f2a03 100644
--- a/src/cobalt/content/icu/icudt56l/hy.res
+++ b/src/cobalt/content/icu/icudt56l/hy.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/id.res b/src/cobalt/content/icu/icudt56l/id.res
index 113e603..42d1501 100644
--- a/src/cobalt/content/icu/icudt56l/id.res
+++ b/src/cobalt/content/icu/icudt56l/id.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ig.res b/src/cobalt/content/icu/icudt56l/ig.res
index c16c2cb..4fe2b94 100644
--- a/src/cobalt/content/icu/icudt56l/ig.res
+++ b/src/cobalt/content/icu/icudt56l/ig.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/in.res b/src/cobalt/content/icu/icudt56l/in.res
index 37f737c..5717187 100644
--- a/src/cobalt/content/icu/icudt56l/in.res
+++ b/src/cobalt/content/icu/icudt56l/in.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/is.res b/src/cobalt/content/icu/icudt56l/is.res
index dc12018..7b55953 100644
--- a/src/cobalt/content/icu/icudt56l/is.res
+++ b/src/cobalt/content/icu/icudt56l/is.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/it.res b/src/cobalt/content/icu/icudt56l/it.res
index 017858b..d162675 100644
--- a/src/cobalt/content/icu/icudt56l/it.res
+++ b/src/cobalt/content/icu/icudt56l/it.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/it_CH.res b/src/cobalt/content/icu/icudt56l/it_CH.res
index 9a534b2..652ab6e 100644
--- a/src/cobalt/content/icu/icudt56l/it_CH.res
+++ b/src/cobalt/content/icu/icudt56l/it_CH.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/iw.res b/src/cobalt/content/icu/icudt56l/iw.res
index 0335003..dde8495 100644
--- a/src/cobalt/content/icu/icudt56l/iw.res
+++ b/src/cobalt/content/icu/icudt56l/iw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ja.res b/src/cobalt/content/icu/icudt56l/ja.res
index 1a946b0..21807a9 100644
--- a/src/cobalt/content/icu/icudt56l/ja.res
+++ b/src/cobalt/content/icu/icudt56l/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ka.res b/src/cobalt/content/icu/icudt56l/ka.res
index 0ba4979..adcb7d3 100644
--- a/src/cobalt/content/icu/icudt56l/ka.res
+++ b/src/cobalt/content/icu/icudt56l/ka.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/kk.res b/src/cobalt/content/icu/icudt56l/kk.res
index 4c0e93d..96c9f9b 100644
--- a/src/cobalt/content/icu/icudt56l/kk.res
+++ b/src/cobalt/content/icu/icudt56l/kk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/km.res b/src/cobalt/content/icu/icudt56l/km.res
index 12beb53..2f736a4 100644
--- a/src/cobalt/content/icu/icudt56l/km.res
+++ b/src/cobalt/content/icu/icudt56l/km.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/kn.res b/src/cobalt/content/icu/icudt56l/kn.res
index 8aaa260..2902bd7 100644
--- a/src/cobalt/content/icu/icudt56l/kn.res
+++ b/src/cobalt/content/icu/icudt56l/kn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ko.res b/src/cobalt/content/icu/icudt56l/ko.res
index 19c8aa3..36fa41b 100644
--- a/src/cobalt/content/icu/icudt56l/ko.res
+++ b/src/cobalt/content/icu/icudt56l/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ku.res b/src/cobalt/content/icu/icudt56l/ku.res
index 81e0774..655b5a5 100644
--- a/src/cobalt/content/icu/icudt56l/ku.res
+++ b/src/cobalt/content/icu/icudt56l/ku.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ky.res b/src/cobalt/content/icu/icudt56l/ky.res
index 17bd776..1f4ab15 100644
--- a/src/cobalt/content/icu/icudt56l/ky.res
+++ b/src/cobalt/content/icu/icudt56l/ky.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/af.res b/src/cobalt/content/icu/icudt56l/lang/af.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/af.res
+++ b/src/cobalt/content/icu/icudt56l/lang/af.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ak.res b/src/cobalt/content/icu/icudt56l/lang/ak.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ak.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ak.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/am.res b/src/cobalt/content/icu/icudt56l/lang/am.res
index 1b34433..3d35959 100644
--- a/src/cobalt/content/icu/icudt56l/lang/am.res
+++ b/src/cobalt/content/icu/icudt56l/lang/am.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/an.res b/src/cobalt/content/icu/icudt56l/lang/an.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/an.res
+++ b/src/cobalt/content/icu/icudt56l/lang/an.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ar.res b/src/cobalt/content/icu/icudt56l/lang/ar.res
index bb13917..1ab5683 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ar.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ast.res b/src/cobalt/content/icu/icudt56l/lang/ast.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ast.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ast.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/az.res b/src/cobalt/content/icu/icudt56l/lang/az.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/az.res
+++ b/src/cobalt/content/icu/icudt56l/lang/az.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/be.res b/src/cobalt/content/icu/icudt56l/lang/be.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/be.res
+++ b/src/cobalt/content/icu/icudt56l/lang/be.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/bem.res b/src/cobalt/content/icu/icudt56l/lang/bem.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/bem.res
+++ b/src/cobalt/content/icu/icudt56l/lang/bem.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/bg.res b/src/cobalt/content/icu/icudt56l/lang/bg.res
index c728981..1a5be32 100644
--- a/src/cobalt/content/icu/icudt56l/lang/bg.res
+++ b/src/cobalt/content/icu/icudt56l/lang/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/bn.res b/src/cobalt/content/icu/icudt56l/lang/bn.res
index 5c67430..4988bb9 100644
--- a/src/cobalt/content/icu/icudt56l/lang/bn.res
+++ b/src/cobalt/content/icu/icudt56l/lang/bn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/br.res b/src/cobalt/content/icu/icudt56l/lang/br.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/br.res
+++ b/src/cobalt/content/icu/icudt56l/lang/br.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/bs.res b/src/cobalt/content/icu/icudt56l/lang/bs.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/bs.res
+++ b/src/cobalt/content/icu/icudt56l/lang/bs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ca.res b/src/cobalt/content/icu/icudt56l/lang/ca.res
index 09afb78..6fbca5d 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ca.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ckb.res b/src/cobalt/content/icu/icudt56l/lang/ckb.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ckb.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ckb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/cs.res b/src/cobalt/content/icu/icudt56l/lang/cs.res
index df5b7a0..28ecabe 100644
--- a/src/cobalt/content/icu/icudt56l/lang/cs.res
+++ b/src/cobalt/content/icu/icudt56l/lang/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/cy.res b/src/cobalt/content/icu/icudt56l/lang/cy.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/cy.res
+++ b/src/cobalt/content/icu/icudt56l/lang/cy.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/da.res b/src/cobalt/content/icu/icudt56l/lang/da.res
index 93d9594..99a4dcd 100644
--- a/src/cobalt/content/icu/icudt56l/lang/da.res
+++ b/src/cobalt/content/icu/icudt56l/lang/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/de.res b/src/cobalt/content/icu/icudt56l/lang/de.res
index f698129..c1c8d5f 100644
--- a/src/cobalt/content/icu/icudt56l/lang/de.res
+++ b/src/cobalt/content/icu/icudt56l/lang/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ee.res b/src/cobalt/content/icu/icudt56l/lang/ee.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ee.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ee.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/el.res b/src/cobalt/content/icu/icudt56l/lang/el.res
index feeb860..049baa1 100644
--- a/src/cobalt/content/icu/icudt56l/lang/el.res
+++ b/src/cobalt/content/icu/icudt56l/lang/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/en.res b/src/cobalt/content/icu/icudt56l/lang/en.res
index 63397b9..f90c97f 100644
--- a/src/cobalt/content/icu/icudt56l/lang/en.res
+++ b/src/cobalt/content/icu/icudt56l/lang/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/en_GB.res b/src/cobalt/content/icu/icudt56l/lang/en_GB.res
index e85d11d..01ae348 100644
--- a/src/cobalt/content/icu/icudt56l/lang/en_GB.res
+++ b/src/cobalt/content/icu/icudt56l/lang/en_GB.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/eo.res b/src/cobalt/content/icu/icudt56l/lang/eo.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/eo.res
+++ b/src/cobalt/content/icu/icudt56l/lang/eo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/es.res b/src/cobalt/content/icu/icudt56l/lang/es.res
index f87be3d..e7db31e 100644
--- a/src/cobalt/content/icu/icudt56l/lang/es.res
+++ b/src/cobalt/content/icu/icudt56l/lang/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/es_419.res b/src/cobalt/content/icu/icudt56l/lang/es_419.res
index 2e8777e..837f6a0 100644
--- a/src/cobalt/content/icu/icudt56l/lang/es_419.res
+++ b/src/cobalt/content/icu/icudt56l/lang/es_419.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/et.res b/src/cobalt/content/icu/icudt56l/lang/et.res
index 494de43..327d8b5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/et.res
+++ b/src/cobalt/content/icu/icudt56l/lang/et.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/eu.res b/src/cobalt/content/icu/icudt56l/lang/eu.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/eu.res
+++ b/src/cobalt/content/icu/icudt56l/lang/eu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/fa.res b/src/cobalt/content/icu/icudt56l/lang/fa.res
index 56784ac..dc3a53a 100644
--- a/src/cobalt/content/icu/icudt56l/lang/fa.res
+++ b/src/cobalt/content/icu/icudt56l/lang/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/fi.res b/src/cobalt/content/icu/icudt56l/lang/fi.res
index d57330d..1360e3d 100644
--- a/src/cobalt/content/icu/icudt56l/lang/fi.res
+++ b/src/cobalt/content/icu/icudt56l/lang/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/fil.res b/src/cobalt/content/icu/icudt56l/lang/fil.res
index 307050b..7100f70 100644
--- a/src/cobalt/content/icu/icudt56l/lang/fil.res
+++ b/src/cobalt/content/icu/icudt56l/lang/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/fo.res b/src/cobalt/content/icu/icudt56l/lang/fo.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/fo.res
+++ b/src/cobalt/content/icu/icudt56l/lang/fo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/fr.res b/src/cobalt/content/icu/icudt56l/lang/fr.res
index 9c998d0..57b9b8c 100644
--- a/src/cobalt/content/icu/icudt56l/lang/fr.res
+++ b/src/cobalt/content/icu/icudt56l/lang/fr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ga.res b/src/cobalt/content/icu/icudt56l/lang/ga.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ga.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ga.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/gl.res b/src/cobalt/content/icu/icudt56l/lang/gl.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/gl.res
+++ b/src/cobalt/content/icu/icudt56l/lang/gl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/gu.res b/src/cobalt/content/icu/icudt56l/lang/gu.res
index deb1e55..38b7e18 100644
--- a/src/cobalt/content/icu/icudt56l/lang/gu.res
+++ b/src/cobalt/content/icu/icudt56l/lang/gu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ha.res b/src/cobalt/content/icu/icudt56l/lang/ha.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ha.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ha.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/haw.res b/src/cobalt/content/icu/icudt56l/lang/haw.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/haw.res
+++ b/src/cobalt/content/icu/icudt56l/lang/haw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/he.res b/src/cobalt/content/icu/icudt56l/lang/he.res
index 6c31aa3..b11652b 100644
--- a/src/cobalt/content/icu/icudt56l/lang/he.res
+++ b/src/cobalt/content/icu/icudt56l/lang/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/hi.res b/src/cobalt/content/icu/icudt56l/lang/hi.res
index 51a73d7..3e30df6 100644
--- a/src/cobalt/content/icu/icudt56l/lang/hi.res
+++ b/src/cobalt/content/icu/icudt56l/lang/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/hr.res b/src/cobalt/content/icu/icudt56l/lang/hr.res
index 92cd698..6cae61d 100644
--- a/src/cobalt/content/icu/icudt56l/lang/hr.res
+++ b/src/cobalt/content/icu/icudt56l/lang/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/hu.res b/src/cobalt/content/icu/icudt56l/lang/hu.res
index 2d8d2f0..9cf7fd8 100644
--- a/src/cobalt/content/icu/icudt56l/lang/hu.res
+++ b/src/cobalt/content/icu/icudt56l/lang/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/hy.res b/src/cobalt/content/icu/icudt56l/lang/hy.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/hy.res
+++ b/src/cobalt/content/icu/icudt56l/lang/hy.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/id.res b/src/cobalt/content/icu/icudt56l/lang/id.res
index 6c93af1..1b3af59 100644
--- a/src/cobalt/content/icu/icudt56l/lang/id.res
+++ b/src/cobalt/content/icu/icudt56l/lang/id.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ig.res b/src/cobalt/content/icu/icudt56l/lang/ig.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ig.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ig.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/in.res b/src/cobalt/content/icu/icudt56l/lang/in.res
index 919f78c..9a6ec30 100644
--- a/src/cobalt/content/icu/icudt56l/lang/in.res
+++ b/src/cobalt/content/icu/icudt56l/lang/in.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/is.res b/src/cobalt/content/icu/icudt56l/lang/is.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/is.res
+++ b/src/cobalt/content/icu/icudt56l/lang/is.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/it.res b/src/cobalt/content/icu/icudt56l/lang/it.res
index 83be75d..55cc520 100644
--- a/src/cobalt/content/icu/icudt56l/lang/it.res
+++ b/src/cobalt/content/icu/icudt56l/lang/it.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/iw.res b/src/cobalt/content/icu/icudt56l/lang/iw.res
index 5f83c12..2c0cbe7 100644
--- a/src/cobalt/content/icu/icudt56l/lang/iw.res
+++ b/src/cobalt/content/icu/icudt56l/lang/iw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ja.res b/src/cobalt/content/icu/icudt56l/lang/ja.res
index c60a5b8..0aa7d29 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ja.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ka.res b/src/cobalt/content/icu/icudt56l/lang/ka.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ka.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ka.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/kk.res b/src/cobalt/content/icu/icudt56l/lang/kk.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/kk.res
+++ b/src/cobalt/content/icu/icudt56l/lang/kk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/km.res b/src/cobalt/content/icu/icudt56l/lang/km.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/km.res
+++ b/src/cobalt/content/icu/icudt56l/lang/km.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/kn.res b/src/cobalt/content/icu/icudt56l/lang/kn.res
index 96df004..209967c 100644
--- a/src/cobalt/content/icu/icudt56l/lang/kn.res
+++ b/src/cobalt/content/icu/icudt56l/lang/kn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ko.res b/src/cobalt/content/icu/icudt56l/lang/ko.res
index 3dd51a4..b1841e6 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ko.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ku.res b/src/cobalt/content/icu/icudt56l/lang/ku.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ku.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ku.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ky.res b/src/cobalt/content/icu/icudt56l/lang/ky.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ky.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ky.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/lg.res b/src/cobalt/content/icu/icudt56l/lang/lg.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/lg.res
+++ b/src/cobalt/content/icu/icudt56l/lang/lg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ln.res b/src/cobalt/content/icu/icudt56l/lang/ln.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ln.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ln.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/lo.res b/src/cobalt/content/icu/icudt56l/lang/lo.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/lo.res
+++ b/src/cobalt/content/icu/icudt56l/lang/lo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/lt.res b/src/cobalt/content/icu/icudt56l/lang/lt.res
index a717030..aa6b48a 100644
--- a/src/cobalt/content/icu/icudt56l/lang/lt.res
+++ b/src/cobalt/content/icu/icudt56l/lang/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/lv.res b/src/cobalt/content/icu/icudt56l/lang/lv.res
index e2947f6..408d5f2 100644
--- a/src/cobalt/content/icu/icudt56l/lang/lv.res
+++ b/src/cobalt/content/icu/icudt56l/lang/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/mfe.res b/src/cobalt/content/icu/icudt56l/lang/mfe.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/mfe.res
+++ b/src/cobalt/content/icu/icudt56l/lang/mfe.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/mg.res b/src/cobalt/content/icu/icudt56l/lang/mg.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/mg.res
+++ b/src/cobalt/content/icu/icudt56l/lang/mg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/mk.res b/src/cobalt/content/icu/icudt56l/lang/mk.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/mk.res
+++ b/src/cobalt/content/icu/icudt56l/lang/mk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ml.res b/src/cobalt/content/icu/icudt56l/lang/ml.res
index 09b2da6..5e71641 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ml.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ml.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/mn.res b/src/cobalt/content/icu/icudt56l/lang/mn.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/mn.res
+++ b/src/cobalt/content/icu/icudt56l/lang/mn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/mo.res b/src/cobalt/content/icu/icudt56l/lang/mo.res
index 74d43b4..d16ea71 100644
--- a/src/cobalt/content/icu/icudt56l/lang/mo.res
+++ b/src/cobalt/content/icu/icudt56l/lang/mo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/mr.res b/src/cobalt/content/icu/icudt56l/lang/mr.res
index 2ad6158..553e75f 100644
--- a/src/cobalt/content/icu/icudt56l/lang/mr.res
+++ b/src/cobalt/content/icu/icudt56l/lang/mr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ms.res b/src/cobalt/content/icu/icudt56l/lang/ms.res
index 3b5c982..50e9141 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ms.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ms.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/mt.res b/src/cobalt/content/icu/icudt56l/lang/mt.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/mt.res
+++ b/src/cobalt/content/icu/icudt56l/lang/mt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/my.res b/src/cobalt/content/icu/icudt56l/lang/my.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/my.res
+++ b/src/cobalt/content/icu/icudt56l/lang/my.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/nb.res b/src/cobalt/content/icu/icudt56l/lang/nb.res
index e24ee82..adc7586 100644
--- a/src/cobalt/content/icu/icudt56l/lang/nb.res
+++ b/src/cobalt/content/icu/icudt56l/lang/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ne.res b/src/cobalt/content/icu/icudt56l/lang/ne.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ne.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ne.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/nl.res b/src/cobalt/content/icu/icudt56l/lang/nl.res
index 72fef2d..6343007 100644
--- a/src/cobalt/content/icu/icudt56l/lang/nl.res
+++ b/src/cobalt/content/icu/icudt56l/lang/nl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/nn.res b/src/cobalt/content/icu/icudt56l/lang/nn.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/nn.res
+++ b/src/cobalt/content/icu/icudt56l/lang/nn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/no.res b/src/cobalt/content/icu/icudt56l/lang/no.res
index 35438a1..eec6664 100644
--- a/src/cobalt/content/icu/icudt56l/lang/no.res
+++ b/src/cobalt/content/icu/icudt56l/lang/no.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/nyn.res b/src/cobalt/content/icu/icudt56l/lang/nyn.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/nyn.res
+++ b/src/cobalt/content/icu/icudt56l/lang/nyn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/om.res b/src/cobalt/content/icu/icudt56l/lang/om.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/om.res
+++ b/src/cobalt/content/icu/icudt56l/lang/om.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/or.res b/src/cobalt/content/icu/icudt56l/lang/or.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/or.res
+++ b/src/cobalt/content/icu/icudt56l/lang/or.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/pa.res b/src/cobalt/content/icu/icudt56l/lang/pa.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/pa.res
+++ b/src/cobalt/content/icu/icudt56l/lang/pa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/pl.res b/src/cobalt/content/icu/icudt56l/lang/pl.res
index f686dc3..997b62f 100644
--- a/src/cobalt/content/icu/icudt56l/lang/pl.res
+++ b/src/cobalt/content/icu/icudt56l/lang/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/pool.res b/src/cobalt/content/icu/icudt56l/lang/pool.res
index 097c8c2..dde2560 100644
--- a/src/cobalt/content/icu/icudt56l/lang/pool.res
+++ b/src/cobalt/content/icu/icudt56l/lang/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ps.res b/src/cobalt/content/icu/icudt56l/lang/ps.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ps.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ps.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/pt.res b/src/cobalt/content/icu/icudt56l/lang/pt.res
index 083238f..16f172a 100644
--- a/src/cobalt/content/icu/icudt56l/lang/pt.res
+++ b/src/cobalt/content/icu/icudt56l/lang/pt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/pt_PT.res b/src/cobalt/content/icu/icudt56l/lang/pt_PT.res
index d99c30e..5ed28c4 100644
--- a/src/cobalt/content/icu/icudt56l/lang/pt_PT.res
+++ b/src/cobalt/content/icu/icudt56l/lang/pt_PT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/rm.res b/src/cobalt/content/icu/icudt56l/lang/rm.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/rm.res
+++ b/src/cobalt/content/icu/icudt56l/lang/rm.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/rn.res b/src/cobalt/content/icu/icudt56l/lang/rn.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/rn.res
+++ b/src/cobalt/content/icu/icudt56l/lang/rn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ro.res b/src/cobalt/content/icu/icudt56l/lang/ro.res
index 7d60a43..d8b5672 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ro.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ro_MD.res b/src/cobalt/content/icu/icudt56l/lang/ro_MD.res
index 9fb8d50..e911239 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ro_MD.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ro_MD.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/root.res b/src/cobalt/content/icu/icudt56l/lang/root.res
index 1f511a2..65785f7 100644
--- a/src/cobalt/content/icu/icudt56l/lang/root.res
+++ b/src/cobalt/content/icu/icudt56l/lang/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ru.res b/src/cobalt/content/icu/icudt56l/lang/ru.res
index e533727..1638295 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ru.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/rw.res b/src/cobalt/content/icu/icudt56l/lang/rw.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/rw.res
+++ b/src/cobalt/content/icu/icudt56l/lang/rw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/sh.res b/src/cobalt/content/icu/icudt56l/lang/sh.res
index c500249..e3daa0d 100644
--- a/src/cobalt/content/icu/icudt56l/lang/sh.res
+++ b/src/cobalt/content/icu/icudt56l/lang/sh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/si.res b/src/cobalt/content/icu/icudt56l/lang/si.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/si.res
+++ b/src/cobalt/content/icu/icudt56l/lang/si.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/sk.res b/src/cobalt/content/icu/icudt56l/lang/sk.res
index b211109..f1c888c 100644
--- a/src/cobalt/content/icu/icudt56l/lang/sk.res
+++ b/src/cobalt/content/icu/icudt56l/lang/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/sl.res b/src/cobalt/content/icu/icudt56l/lang/sl.res
index 0af3682..b06ac68 100644
--- a/src/cobalt/content/icu/icudt56l/lang/sl.res
+++ b/src/cobalt/content/icu/icudt56l/lang/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/sn.res b/src/cobalt/content/icu/icudt56l/lang/sn.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/sn.res
+++ b/src/cobalt/content/icu/icudt56l/lang/sn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/so.res b/src/cobalt/content/icu/icudt56l/lang/so.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/so.res
+++ b/src/cobalt/content/icu/icudt56l/lang/so.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/sq.res b/src/cobalt/content/icu/icudt56l/lang/sq.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/sq.res
+++ b/src/cobalt/content/icu/icudt56l/lang/sq.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/sr.res b/src/cobalt/content/icu/icudt56l/lang/sr.res
index d3e4fc2..4243fe1 100644
--- a/src/cobalt/content/icu/icudt56l/lang/sr.res
+++ b/src/cobalt/content/icu/icudt56l/lang/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/sr_Latn.res b/src/cobalt/content/icu/icudt56l/lang/sr_Latn.res
index 4ed265a..9e0bea3 100644
--- a/src/cobalt/content/icu/icudt56l/lang/sr_Latn.res
+++ b/src/cobalt/content/icu/icudt56l/lang/sr_Latn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/sv.res b/src/cobalt/content/icu/icudt56l/lang/sv.res
index 7af73bb..b89e78f 100644
--- a/src/cobalt/content/icu/icudt56l/lang/sv.res
+++ b/src/cobalt/content/icu/icudt56l/lang/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/sw.res b/src/cobalt/content/icu/icudt56l/lang/sw.res
index e084dd3..d339f7d 100644
--- a/src/cobalt/content/icu/icudt56l/lang/sw.res
+++ b/src/cobalt/content/icu/icudt56l/lang/sw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ta.res b/src/cobalt/content/icu/icudt56l/lang/ta.res
index 34e8d23..24614ec 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ta.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ta.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/te.res b/src/cobalt/content/icu/icudt56l/lang/te.res
index db1ac43..1d32c96 100644
--- a/src/cobalt/content/icu/icudt56l/lang/te.res
+++ b/src/cobalt/content/icu/icudt56l/lang/te.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/tg.res b/src/cobalt/content/icu/icudt56l/lang/tg.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/tg.res
+++ b/src/cobalt/content/icu/icudt56l/lang/tg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/th.res b/src/cobalt/content/icu/icudt56l/lang/th.res
index e67284e..effbecc 100644
--- a/src/cobalt/content/icu/icudt56l/lang/th.res
+++ b/src/cobalt/content/icu/icudt56l/lang/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ti.res b/src/cobalt/content/icu/icudt56l/lang/ti.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ti.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ti.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/tl.res b/src/cobalt/content/icu/icudt56l/lang/tl.res
index ea58c63..cdcff68 100644
--- a/src/cobalt/content/icu/icudt56l/lang/tl.res
+++ b/src/cobalt/content/icu/icudt56l/lang/tl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/to.res b/src/cobalt/content/icu/icudt56l/lang/to.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/to.res
+++ b/src/cobalt/content/icu/icudt56l/lang/to.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/tr.res b/src/cobalt/content/icu/icudt56l/lang/tr.res
index 0f21256..d077ac8 100644
--- a/src/cobalt/content/icu/icudt56l/lang/tr.res
+++ b/src/cobalt/content/icu/icudt56l/lang/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/uk.res b/src/cobalt/content/icu/icudt56l/lang/uk.res
index 35551bf..b099afd 100644
--- a/src/cobalt/content/icu/icudt56l/lang/uk.res
+++ b/src/cobalt/content/icu/icudt56l/lang/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/ur.res b/src/cobalt/content/icu/icudt56l/lang/ur.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/ur.res
+++ b/src/cobalt/content/icu/icudt56l/lang/ur.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/uz.res b/src/cobalt/content/icu/icudt56l/lang/uz.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/uz.res
+++ b/src/cobalt/content/icu/icudt56l/lang/uz.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/vi.res b/src/cobalt/content/icu/icudt56l/lang/vi.res
index 980e02c..98aa90d 100644
--- a/src/cobalt/content/icu/icudt56l/lang/vi.res
+++ b/src/cobalt/content/icu/icudt56l/lang/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/wa.res b/src/cobalt/content/icu/icudt56l/lang/wa.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/wa.res
+++ b/src/cobalt/content/icu/icudt56l/lang/wa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/yo.res b/src/cobalt/content/icu/icudt56l/lang/yo.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/yo.res
+++ b/src/cobalt/content/icu/icudt56l/lang/yo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zh.res b/src/cobalt/content/icu/icudt56l/lang/zh.res
index f58391f..9dbab21 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zh.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zh_CN.res b/src/cobalt/content/icu/icudt56l/lang/zh_CN.res
index a7ccb03..d65558b 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zh_CN.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zh_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zh_HK.res b/src/cobalt/content/icu/icudt56l/lang/zh_HK.res
index 7991f52..bc307bb 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zh_HK.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zh_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zh_Hans.res b/src/cobalt/content/icu/icudt56l/lang/zh_Hans.res
index 2b89ea3..15f949b 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zh_Hans.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zh_Hans.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zh_Hans_CN.res b/src/cobalt/content/icu/icudt56l/lang/zh_Hans_CN.res
index 9fb8d50..e911239 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zh_Hans_CN.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zh_Hans_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zh_Hans_SG.res b/src/cobalt/content/icu/icudt56l/lang/zh_Hans_SG.res
index 9fb8d50..e911239 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zh_Hans_SG.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zh_Hans_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zh_Hant.res b/src/cobalt/content/icu/icudt56l/lang/zh_Hant.res
index 0865fa5..eb74632 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zh_Hant.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zh_Hant.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zh_Hant_HK.res b/src/cobalt/content/icu/icudt56l/lang/zh_Hant_HK.res
index 11c1f97..0a152c4 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zh_Hant_HK.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zh_Hant_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zh_Hant_TW.res b/src/cobalt/content/icu/icudt56l/lang/zh_Hant_TW.res
index 9fb8d50..e911239 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zh_Hant_TW.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zh_Hant_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zh_SG.res b/src/cobalt/content/icu/icudt56l/lang/zh_SG.res
index 85200e4..e40ce2c 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zh_SG.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zh_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zh_TW.res b/src/cobalt/content/icu/icudt56l/lang/zh_TW.res
index 430004b..6436069 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zh_TW.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zh_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lang/zu.res b/src/cobalt/content/icu/icudt56l/lang/zu.res
index 8f4230f..1f0a3e5 100644
--- a/src/cobalt/content/icu/icudt56l/lang/zu.res
+++ b/src/cobalt/content/icu/icudt56l/lang/zu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lg.res b/src/cobalt/content/icu/icudt56l/lg.res
index 57facdd..f70868d 100644
--- a/src/cobalt/content/icu/icudt56l/lg.res
+++ b/src/cobalt/content/icu/icudt56l/lg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ln.res b/src/cobalt/content/icu/icudt56l/ln.res
index 2778284..7f49c5e 100644
--- a/src/cobalt/content/icu/icudt56l/ln.res
+++ b/src/cobalt/content/icu/icudt56l/ln.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lo.res b/src/cobalt/content/icu/icudt56l/lo.res
index 6157798..282f73f 100644
--- a/src/cobalt/content/icu/icudt56l/lo.res
+++ b/src/cobalt/content/icu/icudt56l/lo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lt.res b/src/cobalt/content/icu/icudt56l/lt.res
index 00a663c..c3ab11b 100644
--- a/src/cobalt/content/icu/icudt56l/lt.res
+++ b/src/cobalt/content/icu/icudt56l/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/lv.res b/src/cobalt/content/icu/icudt56l/lv.res
index 1534810..a18464d 100644
--- a/src/cobalt/content/icu/icudt56l/lv.res
+++ b/src/cobalt/content/icu/icudt56l/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/mfe.res b/src/cobalt/content/icu/icudt56l/mfe.res
index 9ad9a6c..b01f52f 100644
--- a/src/cobalt/content/icu/icudt56l/mfe.res
+++ b/src/cobalt/content/icu/icudt56l/mfe.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/mg.res b/src/cobalt/content/icu/icudt56l/mg.res
index 320a39b..a716314 100644
--- a/src/cobalt/content/icu/icudt56l/mg.res
+++ b/src/cobalt/content/icu/icudt56l/mg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/mk.res b/src/cobalt/content/icu/icudt56l/mk.res
index dc18591..16d876e 100644
--- a/src/cobalt/content/icu/icudt56l/mk.res
+++ b/src/cobalt/content/icu/icudt56l/mk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ml.res b/src/cobalt/content/icu/icudt56l/ml.res
index 955c7c1..412ba51 100644
--- a/src/cobalt/content/icu/icudt56l/ml.res
+++ b/src/cobalt/content/icu/icudt56l/ml.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/mn.res b/src/cobalt/content/icu/icudt56l/mn.res
index 62734c8..4eaf0c0 100644
--- a/src/cobalt/content/icu/icudt56l/mn.res
+++ b/src/cobalt/content/icu/icudt56l/mn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/mo.res b/src/cobalt/content/icu/icudt56l/mo.res
index 7bf1b78..52a5358 100644
--- a/src/cobalt/content/icu/icudt56l/mo.res
+++ b/src/cobalt/content/icu/icudt56l/mo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/mr.res b/src/cobalt/content/icu/icudt56l/mr.res
index 62c9810..b512a48 100644
--- a/src/cobalt/content/icu/icudt56l/mr.res
+++ b/src/cobalt/content/icu/icudt56l/mr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ms.res b/src/cobalt/content/icu/icudt56l/ms.res
index 4487127..f079f3b 100644
--- a/src/cobalt/content/icu/icudt56l/ms.res
+++ b/src/cobalt/content/icu/icudt56l/ms.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/mt.res b/src/cobalt/content/icu/icudt56l/mt.res
index 8321dec..fbbcb37 100644
--- a/src/cobalt/content/icu/icudt56l/mt.res
+++ b/src/cobalt/content/icu/icudt56l/mt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/my.res b/src/cobalt/content/icu/icudt56l/my.res
index 0bffba5..a940752 100644
--- a/src/cobalt/content/icu/icudt56l/my.res
+++ b/src/cobalt/content/icu/icudt56l/my.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/nb.res b/src/cobalt/content/icu/icudt56l/nb.res
index 0f11d46..1e41d8a 100644
--- a/src/cobalt/content/icu/icudt56l/nb.res
+++ b/src/cobalt/content/icu/icudt56l/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ne.res b/src/cobalt/content/icu/icudt56l/ne.res
index dbc62bc..ca97326 100644
--- a/src/cobalt/content/icu/icudt56l/ne.res
+++ b/src/cobalt/content/icu/icudt56l/ne.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/nl.res b/src/cobalt/content/icu/icudt56l/nl.res
index 48ae733..f473748 100644
--- a/src/cobalt/content/icu/icudt56l/nl.res
+++ b/src/cobalt/content/icu/icudt56l/nl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/nn.res b/src/cobalt/content/icu/icudt56l/nn.res
index 5c5db79..9ca09d0 100644
--- a/src/cobalt/content/icu/icudt56l/nn.res
+++ b/src/cobalt/content/icu/icudt56l/nn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/no.res b/src/cobalt/content/icu/icudt56l/no.res
index 652e722..95b72f1 100644
--- a/src/cobalt/content/icu/icudt56l/no.res
+++ b/src/cobalt/content/icu/icudt56l/no.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/nyn.res b/src/cobalt/content/icu/icudt56l/nyn.res
index dd92b68..14c4a68 100644
--- a/src/cobalt/content/icu/icudt56l/nyn.res
+++ b/src/cobalt/content/icu/icudt56l/nyn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/om.res b/src/cobalt/content/icu/icudt56l/om.res
index dd92b68..14c4a68 100644
--- a/src/cobalt/content/icu/icudt56l/om.res
+++ b/src/cobalt/content/icu/icudt56l/om.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/or.res b/src/cobalt/content/icu/icudt56l/or.res
index 8708b9e..f2cca67 100644
--- a/src/cobalt/content/icu/icudt56l/or.res
+++ b/src/cobalt/content/icu/icudt56l/or.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/pa.res b/src/cobalt/content/icu/icudt56l/pa.res
index 7a310e0..b1453eb 100644
--- a/src/cobalt/content/icu/icudt56l/pa.res
+++ b/src/cobalt/content/icu/icudt56l/pa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/pl.res b/src/cobalt/content/icu/icudt56l/pl.res
index 2cd9f01..a25c258 100644
--- a/src/cobalt/content/icu/icudt56l/pl.res
+++ b/src/cobalt/content/icu/icudt56l/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/pool.res b/src/cobalt/content/icu/icudt56l/pool.res
index 923a6cb..654a03b 100644
--- a/src/cobalt/content/icu/icudt56l/pool.res
+++ b/src/cobalt/content/icu/icudt56l/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ps.res b/src/cobalt/content/icu/icudt56l/ps.res
index 7f814f8..b715fc2 100644
--- a/src/cobalt/content/icu/icudt56l/ps.res
+++ b/src/cobalt/content/icu/icudt56l/ps.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/pt.res b/src/cobalt/content/icu/icudt56l/pt.res
index 6abcb75..0055dd7 100644
--- a/src/cobalt/content/icu/icudt56l/pt.res
+++ b/src/cobalt/content/icu/icudt56l/pt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/pt_BR.res b/src/cobalt/content/icu/icudt56l/pt_BR.res
index 008e4b7..d0ddba1 100644
--- a/src/cobalt/content/icu/icudt56l/pt_BR.res
+++ b/src/cobalt/content/icu/icudt56l/pt_BR.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/pt_PT.res b/src/cobalt/content/icu/icudt56l/pt_PT.res
index 76ca66f..f1a5807 100644
--- a/src/cobalt/content/icu/icudt56l/pt_PT.res
+++ b/src/cobalt/content/icu/icudt56l/pt_PT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/region/en.res b/src/cobalt/content/icu/icudt56l/region/en.res
index 967b2a3..bc9a049 100644
--- a/src/cobalt/content/icu/icudt56l/region/en.res
+++ b/src/cobalt/content/icu/icudt56l/region/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/region/pool.res b/src/cobalt/content/icu/icudt56l/region/pool.res
index 0beeb3a..c8b3a66 100644
--- a/src/cobalt/content/icu/icudt56l/region/pool.res
+++ b/src/cobalt/content/icu/icudt56l/region/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/region/root.res b/src/cobalt/content/icu/icudt56l/region/root.res
index 72cad82..f7ec23c 100644
--- a/src/cobalt/content/icu/icudt56l/region/root.res
+++ b/src/cobalt/content/icu/icudt56l/region/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/rm.res b/src/cobalt/content/icu/icudt56l/rm.res
index 8d81b3b..9f468cc 100644
--- a/src/cobalt/content/icu/icudt56l/rm.res
+++ b/src/cobalt/content/icu/icudt56l/rm.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/rn.res b/src/cobalt/content/icu/icudt56l/rn.res
index dd92b68..14c4a68 100644
--- a/src/cobalt/content/icu/icudt56l/rn.res
+++ b/src/cobalt/content/icu/icudt56l/rn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ro.res b/src/cobalt/content/icu/icudt56l/ro.res
index df484c6..64953d1 100644
--- a/src/cobalt/content/icu/icudt56l/ro.res
+++ b/src/cobalt/content/icu/icudt56l/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ro_MD.res b/src/cobalt/content/icu/icudt56l/ro_MD.res
index 8f32770..8a95d37 100644
--- a/src/cobalt/content/icu/icudt56l/ro_MD.res
+++ b/src/cobalt/content/icu/icudt56l/ro_MD.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/root.res b/src/cobalt/content/icu/icudt56l/root.res
index f9dd09b..749557c 100644
--- a/src/cobalt/content/icu/icudt56l/root.res
+++ b/src/cobalt/content/icu/icudt56l/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ru.res b/src/cobalt/content/icu/icudt56l/ru.res
index f92eea0..4797943 100644
--- a/src/cobalt/content/icu/icudt56l/ru.res
+++ b/src/cobalt/content/icu/icudt56l/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/rw.res b/src/cobalt/content/icu/icudt56l/rw.res
index dd92b68..14c4a68 100644
--- a/src/cobalt/content/icu/icudt56l/rw.res
+++ b/src/cobalt/content/icu/icudt56l/rw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/sh.res b/src/cobalt/content/icu/icudt56l/sh.res
index d4f746c..064761b 100644
--- a/src/cobalt/content/icu/icudt56l/sh.res
+++ b/src/cobalt/content/icu/icudt56l/sh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/si.res b/src/cobalt/content/icu/icudt56l/si.res
index 1e448b7..854a983 100644
--- a/src/cobalt/content/icu/icudt56l/si.res
+++ b/src/cobalt/content/icu/icudt56l/si.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/sk.res b/src/cobalt/content/icu/icudt56l/sk.res
index 77824af..26b057b 100644
--- a/src/cobalt/content/icu/icudt56l/sk.res
+++ b/src/cobalt/content/icu/icudt56l/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/sl.res b/src/cobalt/content/icu/icudt56l/sl.res
index cdd325e..d1fa5b1 100644
--- a/src/cobalt/content/icu/icudt56l/sl.res
+++ b/src/cobalt/content/icu/icudt56l/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/sn.res b/src/cobalt/content/icu/icudt56l/sn.res
index b6e4440..9876284 100644
--- a/src/cobalt/content/icu/icudt56l/sn.res
+++ b/src/cobalt/content/icu/icudt56l/sn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/so.res b/src/cobalt/content/icu/icudt56l/so.res
index dd92b68..14c4a68 100644
--- a/src/cobalt/content/icu/icudt56l/so.res
+++ b/src/cobalt/content/icu/icudt56l/so.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/sq.res b/src/cobalt/content/icu/icudt56l/sq.res
index 37804c4..2f60b9e 100644
--- a/src/cobalt/content/icu/icudt56l/sq.res
+++ b/src/cobalt/content/icu/icudt56l/sq.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/sr.res b/src/cobalt/content/icu/icudt56l/sr.res
index 4ca52cb..d44d4b0 100644
--- a/src/cobalt/content/icu/icudt56l/sr.res
+++ b/src/cobalt/content/icu/icudt56l/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/sr_Latn.res b/src/cobalt/content/icu/icudt56l/sr_Latn.res
index 0d22fb6..00a544f 100644
--- a/src/cobalt/content/icu/icudt56l/sr_Latn.res
+++ b/src/cobalt/content/icu/icudt56l/sr_Latn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/sv.res b/src/cobalt/content/icu/icudt56l/sv.res
index 35911a5..d152a55 100644
--- a/src/cobalt/content/icu/icudt56l/sv.res
+++ b/src/cobalt/content/icu/icudt56l/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/sw.res b/src/cobalt/content/icu/icudt56l/sw.res
index f822726..e3fe8e8 100644
--- a/src/cobalt/content/icu/icudt56l/sw.res
+++ b/src/cobalt/content/icu/icudt56l/sw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ta.res b/src/cobalt/content/icu/icudt56l/ta.res
index 44e85af..533e622 100644
--- a/src/cobalt/content/icu/icudt56l/ta.res
+++ b/src/cobalt/content/icu/icudt56l/ta.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/te.res b/src/cobalt/content/icu/icudt56l/te.res
index 2042605..5a9230b 100644
--- a/src/cobalt/content/icu/icudt56l/te.res
+++ b/src/cobalt/content/icu/icudt56l/te.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/tg.res b/src/cobalt/content/icu/icudt56l/tg.res
index 0211bfe..f567bf3 100644
--- a/src/cobalt/content/icu/icudt56l/tg.res
+++ b/src/cobalt/content/icu/icudt56l/tg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/th.res b/src/cobalt/content/icu/icudt56l/th.res
index dc226b5..5cab461 100644
--- a/src/cobalt/content/icu/icudt56l/th.res
+++ b/src/cobalt/content/icu/icudt56l/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ti.res b/src/cobalt/content/icu/icudt56l/ti.res
index 397d15f..5199c3d 100644
--- a/src/cobalt/content/icu/icudt56l/ti.res
+++ b/src/cobalt/content/icu/icudt56l/ti.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/tl.res b/src/cobalt/content/icu/icudt56l/tl.res
index c65b0a3..d6944ac 100644
--- a/src/cobalt/content/icu/icudt56l/tl.res
+++ b/src/cobalt/content/icu/icudt56l/tl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/to.res b/src/cobalt/content/icu/icudt56l/to.res
index db95267..ab19db3 100644
--- a/src/cobalt/content/icu/icudt56l/to.res
+++ b/src/cobalt/content/icu/icudt56l/to.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/tr.res b/src/cobalt/content/icu/icudt56l/tr.res
index 4c2a4ed..037b9f0 100644
--- a/src/cobalt/content/icu/icudt56l/tr.res
+++ b/src/cobalt/content/icu/icudt56l/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/translit/root.res b/src/cobalt/content/icu/icudt56l/translit/root.res
index 0686735..ec75cab 100644
--- a/src/cobalt/content/icu/icudt56l/translit/root.res
+++ b/src/cobalt/content/icu/icudt56l/translit/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/uk.res b/src/cobalt/content/icu/icudt56l/uk.res
index 0c87ee3..c408f0d 100644
--- a/src/cobalt/content/icu/icudt56l/uk.res
+++ b/src/cobalt/content/icu/icudt56l/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/am.res b/src/cobalt/content/icu/icudt56l/unit/am.res
index dbf8c3e..6fc7821 100644
--- a/src/cobalt/content/icu/icudt56l/unit/am.res
+++ b/src/cobalt/content/icu/icudt56l/unit/am.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/ar.res b/src/cobalt/content/icu/icudt56l/unit/ar.res
index 9b12292..e2aac94 100644
--- a/src/cobalt/content/icu/icudt56l/unit/ar.res
+++ b/src/cobalt/content/icu/icudt56l/unit/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/bg.res b/src/cobalt/content/icu/icudt56l/unit/bg.res
index 6e2c48e..a1c9cda 100644
--- a/src/cobalt/content/icu/icudt56l/unit/bg.res
+++ b/src/cobalt/content/icu/icudt56l/unit/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/bn.res b/src/cobalt/content/icu/icudt56l/unit/bn.res
index 892495e..a212216 100644
--- a/src/cobalt/content/icu/icudt56l/unit/bn.res
+++ b/src/cobalt/content/icu/icudt56l/unit/bn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/ca.res b/src/cobalt/content/icu/icudt56l/unit/ca.res
index d95bf24..e842067 100644
--- a/src/cobalt/content/icu/icudt56l/unit/ca.res
+++ b/src/cobalt/content/icu/icudt56l/unit/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/cs.res b/src/cobalt/content/icu/icudt56l/unit/cs.res
index 1fe2bd2..64f2993 100644
--- a/src/cobalt/content/icu/icudt56l/unit/cs.res
+++ b/src/cobalt/content/icu/icudt56l/unit/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/da.res b/src/cobalt/content/icu/icudt56l/unit/da.res
index ab70915..ed1b59f 100644
--- a/src/cobalt/content/icu/icudt56l/unit/da.res
+++ b/src/cobalt/content/icu/icudt56l/unit/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/de.res b/src/cobalt/content/icu/icudt56l/unit/de.res
index d9e899a..8208373 100644
--- a/src/cobalt/content/icu/icudt56l/unit/de.res
+++ b/src/cobalt/content/icu/icudt56l/unit/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/de_CH.res b/src/cobalt/content/icu/icudt56l/unit/de_CH.res
index ce92e01..6eea893 100644
--- a/src/cobalt/content/icu/icudt56l/unit/de_CH.res
+++ b/src/cobalt/content/icu/icudt56l/unit/de_CH.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/el.res b/src/cobalt/content/icu/icudt56l/unit/el.res
index cef1fc9..6dd02a8 100644
--- a/src/cobalt/content/icu/icudt56l/unit/el.res
+++ b/src/cobalt/content/icu/icudt56l/unit/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/en.res b/src/cobalt/content/icu/icudt56l/unit/en.res
index c0e9641..dd313d6 100644
--- a/src/cobalt/content/icu/icudt56l/unit/en.res
+++ b/src/cobalt/content/icu/icudt56l/unit/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/en_001.res b/src/cobalt/content/icu/icudt56l/unit/en_001.res
index 0aaea4c..4e099c3 100644
--- a/src/cobalt/content/icu/icudt56l/unit/en_001.res
+++ b/src/cobalt/content/icu/icudt56l/unit/en_001.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/en_150.res b/src/cobalt/content/icu/icudt56l/unit/en_150.res
index 7311a35..c7f45f2 100644
--- a/src/cobalt/content/icu/icudt56l/unit/en_150.res
+++ b/src/cobalt/content/icu/icudt56l/unit/en_150.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/en_AU.res b/src/cobalt/content/icu/icudt56l/unit/en_AU.res
index 6861b55..48a18cf 100644
--- a/src/cobalt/content/icu/icudt56l/unit/en_AU.res
+++ b/src/cobalt/content/icu/icudt56l/unit/en_AU.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/en_CA.res b/src/cobalt/content/icu/icudt56l/unit/en_CA.res
index a992b66..dd233bc 100644
--- a/src/cobalt/content/icu/icudt56l/unit/en_CA.res
+++ b/src/cobalt/content/icu/icudt56l/unit/en_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/en_GB.res b/src/cobalt/content/icu/icudt56l/unit/en_GB.res
index a251b48..7e38b76 100644
--- a/src/cobalt/content/icu/icudt56l/unit/en_GB.res
+++ b/src/cobalt/content/icu/icudt56l/unit/en_GB.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/en_IN.res b/src/cobalt/content/icu/icudt56l/unit/en_IN.res
index 403d14d..9bdaf65 100644
--- a/src/cobalt/content/icu/icudt56l/unit/en_IN.res
+++ b/src/cobalt/content/icu/icudt56l/unit/en_IN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/en_NZ.res b/src/cobalt/content/icu/icudt56l/unit/en_NZ.res
index 403d14d..9bdaf65 100644
--- a/src/cobalt/content/icu/icudt56l/unit/en_NZ.res
+++ b/src/cobalt/content/icu/icudt56l/unit/en_NZ.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/en_ZA.res b/src/cobalt/content/icu/icudt56l/unit/en_ZA.res
index 403d14d..9bdaf65 100644
--- a/src/cobalt/content/icu/icudt56l/unit/en_ZA.res
+++ b/src/cobalt/content/icu/icudt56l/unit/en_ZA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/es.res b/src/cobalt/content/icu/icudt56l/unit/es.res
index 0e05256..3e9e9d4 100644
--- a/src/cobalt/content/icu/icudt56l/unit/es.res
+++ b/src/cobalt/content/icu/icudt56l/unit/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/es_419.res b/src/cobalt/content/icu/icudt56l/unit/es_419.res
index f5550ca..b91698d 100644
--- a/src/cobalt/content/icu/icudt56l/unit/es_419.res
+++ b/src/cobalt/content/icu/icudt56l/unit/es_419.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/es_AR.res b/src/cobalt/content/icu/icudt56l/unit/es_AR.res
index b45c868..7513b45 100644
--- a/src/cobalt/content/icu/icudt56l/unit/es_AR.res
+++ b/src/cobalt/content/icu/icudt56l/unit/es_AR.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/es_MX.res b/src/cobalt/content/icu/icudt56l/unit/es_MX.res
index 427e5f5..711b319 100644
--- a/src/cobalt/content/icu/icudt56l/unit/es_MX.res
+++ b/src/cobalt/content/icu/icudt56l/unit/es_MX.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/es_US.res b/src/cobalt/content/icu/icudt56l/unit/es_US.res
index 9b8944a..1562007 100644
--- a/src/cobalt/content/icu/icudt56l/unit/es_US.res
+++ b/src/cobalt/content/icu/icudt56l/unit/es_US.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/et.res b/src/cobalt/content/icu/icudt56l/unit/et.res
index d237538..e054a78 100644
--- a/src/cobalt/content/icu/icudt56l/unit/et.res
+++ b/src/cobalt/content/icu/icudt56l/unit/et.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/fa.res b/src/cobalt/content/icu/icudt56l/unit/fa.res
index b701d58..e2682bc 100644
--- a/src/cobalt/content/icu/icudt56l/unit/fa.res
+++ b/src/cobalt/content/icu/icudt56l/unit/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/fi.res b/src/cobalt/content/icu/icudt56l/unit/fi.res
index dbf5230..80bc2a6 100644
--- a/src/cobalt/content/icu/icudt56l/unit/fi.res
+++ b/src/cobalt/content/icu/icudt56l/unit/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/fil.res b/src/cobalt/content/icu/icudt56l/unit/fil.res
index bf058da..9e033a5 100644
--- a/src/cobalt/content/icu/icudt56l/unit/fil.res
+++ b/src/cobalt/content/icu/icudt56l/unit/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/fr.res b/src/cobalt/content/icu/icudt56l/unit/fr.res
index ab42c66..a55f106 100644
--- a/src/cobalt/content/icu/icudt56l/unit/fr.res
+++ b/src/cobalt/content/icu/icudt56l/unit/fr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/fr_CA.res b/src/cobalt/content/icu/icudt56l/unit/fr_CA.res
index 02360e7..8beacd0 100644
--- a/src/cobalt/content/icu/icudt56l/unit/fr_CA.res
+++ b/src/cobalt/content/icu/icudt56l/unit/fr_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/gu.res b/src/cobalt/content/icu/icudt56l/unit/gu.res
index 509ed57..b01ba42 100644
--- a/src/cobalt/content/icu/icudt56l/unit/gu.res
+++ b/src/cobalt/content/icu/icudt56l/unit/gu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/he.res b/src/cobalt/content/icu/icudt56l/unit/he.res
index 954f991..ba86247 100644
--- a/src/cobalt/content/icu/icudt56l/unit/he.res
+++ b/src/cobalt/content/icu/icudt56l/unit/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/hi.res b/src/cobalt/content/icu/icudt56l/unit/hi.res
index 27421d8..68994f8 100644
--- a/src/cobalt/content/icu/icudt56l/unit/hi.res
+++ b/src/cobalt/content/icu/icudt56l/unit/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/hr.res b/src/cobalt/content/icu/icudt56l/unit/hr.res
index d40e0f1..4e9add2 100644
--- a/src/cobalt/content/icu/icudt56l/unit/hr.res
+++ b/src/cobalt/content/icu/icudt56l/unit/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/hu.res b/src/cobalt/content/icu/icudt56l/unit/hu.res
index 06bcb33..30d1204 100644
--- a/src/cobalt/content/icu/icudt56l/unit/hu.res
+++ b/src/cobalt/content/icu/icudt56l/unit/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/id.res b/src/cobalt/content/icu/icudt56l/unit/id.res
index a2ffa76..a6fe7d5 100644
--- a/src/cobalt/content/icu/icudt56l/unit/id.res
+++ b/src/cobalt/content/icu/icudt56l/unit/id.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/in.res b/src/cobalt/content/icu/icudt56l/unit/in.res
index 33be5ef..72942a4 100644
--- a/src/cobalt/content/icu/icudt56l/unit/in.res
+++ b/src/cobalt/content/icu/icudt56l/unit/in.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/it.res b/src/cobalt/content/icu/icudt56l/unit/it.res
index dd8e132..f5122ea 100644
--- a/src/cobalt/content/icu/icudt56l/unit/it.res
+++ b/src/cobalt/content/icu/icudt56l/unit/it.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/iw.res b/src/cobalt/content/icu/icudt56l/unit/iw.res
index 821b606..2481a96 100644
--- a/src/cobalt/content/icu/icudt56l/unit/iw.res
+++ b/src/cobalt/content/icu/icudt56l/unit/iw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/ja.res b/src/cobalt/content/icu/icudt56l/unit/ja.res
index 49099c7..679330e 100644
--- a/src/cobalt/content/icu/icudt56l/unit/ja.res
+++ b/src/cobalt/content/icu/icudt56l/unit/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/kn.res b/src/cobalt/content/icu/icudt56l/unit/kn.res
index 2397b74..8f7162a 100644
--- a/src/cobalt/content/icu/icudt56l/unit/kn.res
+++ b/src/cobalt/content/icu/icudt56l/unit/kn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/ko.res b/src/cobalt/content/icu/icudt56l/unit/ko.res
index 160f5b2..ddaf257 100644
--- a/src/cobalt/content/icu/icudt56l/unit/ko.res
+++ b/src/cobalt/content/icu/icudt56l/unit/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/lt.res b/src/cobalt/content/icu/icudt56l/unit/lt.res
index f1ae385..cb132b9 100644
--- a/src/cobalt/content/icu/icudt56l/unit/lt.res
+++ b/src/cobalt/content/icu/icudt56l/unit/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/lv.res b/src/cobalt/content/icu/icudt56l/unit/lv.res
index a9b3785..a454b77 100644
--- a/src/cobalt/content/icu/icudt56l/unit/lv.res
+++ b/src/cobalt/content/icu/icudt56l/unit/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/ml.res b/src/cobalt/content/icu/icudt56l/unit/ml.res
index 0e78247..68a34cc 100644
--- a/src/cobalt/content/icu/icudt56l/unit/ml.res
+++ b/src/cobalt/content/icu/icudt56l/unit/ml.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/mr.res b/src/cobalt/content/icu/icudt56l/unit/mr.res
index 934d2cd..6f1059b 100644
--- a/src/cobalt/content/icu/icudt56l/unit/mr.res
+++ b/src/cobalt/content/icu/icudt56l/unit/mr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/ms.res b/src/cobalt/content/icu/icudt56l/unit/ms.res
index 2709c71..f337393 100644
--- a/src/cobalt/content/icu/icudt56l/unit/ms.res
+++ b/src/cobalt/content/icu/icudt56l/unit/ms.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/nb.res b/src/cobalt/content/icu/icudt56l/unit/nb.res
index e30a45c..2889a2b 100644
--- a/src/cobalt/content/icu/icudt56l/unit/nb.res
+++ b/src/cobalt/content/icu/icudt56l/unit/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/nl.res b/src/cobalt/content/icu/icudt56l/unit/nl.res
index 5550071..f24a3f7 100644
--- a/src/cobalt/content/icu/icudt56l/unit/nl.res
+++ b/src/cobalt/content/icu/icudt56l/unit/nl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/no.res b/src/cobalt/content/icu/icudt56l/unit/no.res
index e266b67..63bb003 100644
--- a/src/cobalt/content/icu/icudt56l/unit/no.res
+++ b/src/cobalt/content/icu/icudt56l/unit/no.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/pl.res b/src/cobalt/content/icu/icudt56l/unit/pl.res
index f54580b..4559eca 100644
--- a/src/cobalt/content/icu/icudt56l/unit/pl.res
+++ b/src/cobalt/content/icu/icudt56l/unit/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/pool.res b/src/cobalt/content/icu/icudt56l/unit/pool.res
index fa4b9be..e5caab3 100644
--- a/src/cobalt/content/icu/icudt56l/unit/pool.res
+++ b/src/cobalt/content/icu/icudt56l/unit/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/pt.res b/src/cobalt/content/icu/icudt56l/unit/pt.res
index d237e93..ed56d01 100644
--- a/src/cobalt/content/icu/icudt56l/unit/pt.res
+++ b/src/cobalt/content/icu/icudt56l/unit/pt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/pt_PT.res b/src/cobalt/content/icu/icudt56l/unit/pt_PT.res
index eea915f..4e786a7 100644
--- a/src/cobalt/content/icu/icudt56l/unit/pt_PT.res
+++ b/src/cobalt/content/icu/icudt56l/unit/pt_PT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/ro.res b/src/cobalt/content/icu/icudt56l/unit/ro.res
index d5d1e80..efe4f07 100644
--- a/src/cobalt/content/icu/icudt56l/unit/ro.res
+++ b/src/cobalt/content/icu/icudt56l/unit/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/root.res b/src/cobalt/content/icu/icudt56l/unit/root.res
index d05cba2..b873601 100644
--- a/src/cobalt/content/icu/icudt56l/unit/root.res
+++ b/src/cobalt/content/icu/icudt56l/unit/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/ru.res b/src/cobalt/content/icu/icudt56l/unit/ru.res
index a215804..43a5ccd 100644
--- a/src/cobalt/content/icu/icudt56l/unit/ru.res
+++ b/src/cobalt/content/icu/icudt56l/unit/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/sh.res b/src/cobalt/content/icu/icudt56l/unit/sh.res
index eca4610..be1e011 100644
--- a/src/cobalt/content/icu/icudt56l/unit/sh.res
+++ b/src/cobalt/content/icu/icudt56l/unit/sh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/sk.res b/src/cobalt/content/icu/icudt56l/unit/sk.res
index e89c411..7e7ce75 100644
--- a/src/cobalt/content/icu/icudt56l/unit/sk.res
+++ b/src/cobalt/content/icu/icudt56l/unit/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/sl.res b/src/cobalt/content/icu/icudt56l/unit/sl.res
index 60cf2c2..9f4baaa 100644
--- a/src/cobalt/content/icu/icudt56l/unit/sl.res
+++ b/src/cobalt/content/icu/icudt56l/unit/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/sr.res b/src/cobalt/content/icu/icudt56l/unit/sr.res
index 0bc5ded..0844cb6 100644
--- a/src/cobalt/content/icu/icudt56l/unit/sr.res
+++ b/src/cobalt/content/icu/icudt56l/unit/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/sr_Latn.res b/src/cobalt/content/icu/icudt56l/unit/sr_Latn.res
index cf10bd7..cc14079 100644
--- a/src/cobalt/content/icu/icudt56l/unit/sr_Latn.res
+++ b/src/cobalt/content/icu/icudt56l/unit/sr_Latn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/sv.res b/src/cobalt/content/icu/icudt56l/unit/sv.res
index 0bdb977..1eb9f6e 100644
--- a/src/cobalt/content/icu/icudt56l/unit/sv.res
+++ b/src/cobalt/content/icu/icudt56l/unit/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/sw.res b/src/cobalt/content/icu/icudt56l/unit/sw.res
index ad7d258..329130b 100644
--- a/src/cobalt/content/icu/icudt56l/unit/sw.res
+++ b/src/cobalt/content/icu/icudt56l/unit/sw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/ta.res b/src/cobalt/content/icu/icudt56l/unit/ta.res
index 2560e71..391bc60 100644
--- a/src/cobalt/content/icu/icudt56l/unit/ta.res
+++ b/src/cobalt/content/icu/icudt56l/unit/ta.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/te.res b/src/cobalt/content/icu/icudt56l/unit/te.res
index 895a706..69b2219 100644
--- a/src/cobalt/content/icu/icudt56l/unit/te.res
+++ b/src/cobalt/content/icu/icudt56l/unit/te.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/th.res b/src/cobalt/content/icu/icudt56l/unit/th.res
index 0412ef9..bafea5b 100644
--- a/src/cobalt/content/icu/icudt56l/unit/th.res
+++ b/src/cobalt/content/icu/icudt56l/unit/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/tl.res b/src/cobalt/content/icu/icudt56l/unit/tl.res
index 200a065..10ce65b 100644
--- a/src/cobalt/content/icu/icudt56l/unit/tl.res
+++ b/src/cobalt/content/icu/icudt56l/unit/tl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/tr.res b/src/cobalt/content/icu/icudt56l/unit/tr.res
index bafbe4f..0b1ae28 100644
--- a/src/cobalt/content/icu/icudt56l/unit/tr.res
+++ b/src/cobalt/content/icu/icudt56l/unit/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/uk.res b/src/cobalt/content/icu/icudt56l/unit/uk.res
index 6bdacc9..bf04599 100644
--- a/src/cobalt/content/icu/icudt56l/unit/uk.res
+++ b/src/cobalt/content/icu/icudt56l/unit/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/vi.res b/src/cobalt/content/icu/icudt56l/unit/vi.res
index 62b342c..0b084c6 100644
--- a/src/cobalt/content/icu/icudt56l/unit/vi.res
+++ b/src/cobalt/content/icu/icudt56l/unit/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/zh.res b/src/cobalt/content/icu/icudt56l/unit/zh.res
index fb82379..0aca7fd 100644
--- a/src/cobalt/content/icu/icudt56l/unit/zh.res
+++ b/src/cobalt/content/icu/icudt56l/unit/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/zh_CN.res b/src/cobalt/content/icu/icudt56l/unit/zh_CN.res
index 2143911..c2a8662 100644
--- a/src/cobalt/content/icu/icudt56l/unit/zh_CN.res
+++ b/src/cobalt/content/icu/icudt56l/unit/zh_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/zh_HK.res b/src/cobalt/content/icu/icudt56l/unit/zh_HK.res
index 3ecb9af..afeade2 100644
--- a/src/cobalt/content/icu/icudt56l/unit/zh_HK.res
+++ b/src/cobalt/content/icu/icudt56l/unit/zh_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/zh_Hans.res b/src/cobalt/content/icu/icudt56l/unit/zh_Hans.res
index 390df10..5f8b9d8 100644
--- a/src/cobalt/content/icu/icudt56l/unit/zh_Hans.res
+++ b/src/cobalt/content/icu/icudt56l/unit/zh_Hans.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/zh_Hans_CN.res b/src/cobalt/content/icu/icudt56l/unit/zh_Hans_CN.res
index 52171e6..0e5fcc0 100644
--- a/src/cobalt/content/icu/icudt56l/unit/zh_Hans_CN.res
+++ b/src/cobalt/content/icu/icudt56l/unit/zh_Hans_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/zh_Hans_SG.res b/src/cobalt/content/icu/icudt56l/unit/zh_Hans_SG.res
index 60ebd39..893561a 100644
--- a/src/cobalt/content/icu/icudt56l/unit/zh_Hans_SG.res
+++ b/src/cobalt/content/icu/icudt56l/unit/zh_Hans_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/zh_Hant.res b/src/cobalt/content/icu/icudt56l/unit/zh_Hant.res
index b38fda6..6480979 100644
--- a/src/cobalt/content/icu/icudt56l/unit/zh_Hant.res
+++ b/src/cobalt/content/icu/icudt56l/unit/zh_Hant.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/zh_Hant_HK.res b/src/cobalt/content/icu/icudt56l/unit/zh_Hant_HK.res
index 28757bc..885024c 100644
--- a/src/cobalt/content/icu/icudt56l/unit/zh_Hant_HK.res
+++ b/src/cobalt/content/icu/icudt56l/unit/zh_Hant_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/zh_Hant_TW.res b/src/cobalt/content/icu/icudt56l/unit/zh_Hant_TW.res
index 52171e6..0e5fcc0 100644
--- a/src/cobalt/content/icu/icudt56l/unit/zh_Hant_TW.res
+++ b/src/cobalt/content/icu/icudt56l/unit/zh_Hant_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/zh_SG.res b/src/cobalt/content/icu/icudt56l/unit/zh_SG.res
index 591fed6..6c93f05 100644
--- a/src/cobalt/content/icu/icudt56l/unit/zh_SG.res
+++ b/src/cobalt/content/icu/icudt56l/unit/zh_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/unit/zh_TW.res b/src/cobalt/content/icu/icudt56l/unit/zh_TW.res
index 9cfe4de..67a1f01 100644
--- a/src/cobalt/content/icu/icudt56l/unit/zh_TW.res
+++ b/src/cobalt/content/icu/icudt56l/unit/zh_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/ur.res b/src/cobalt/content/icu/icudt56l/ur.res
index 8ce943b..9b26777 100644
--- a/src/cobalt/content/icu/icudt56l/ur.res
+++ b/src/cobalt/content/icu/icudt56l/ur.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/uz.res b/src/cobalt/content/icu/icudt56l/uz.res
index c48eb7c..fcc6e35 100644
--- a/src/cobalt/content/icu/icudt56l/uz.res
+++ b/src/cobalt/content/icu/icudt56l/uz.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/vi.res b/src/cobalt/content/icu/icudt56l/vi.res
index fa0bc69..bd29812 100644
--- a/src/cobalt/content/icu/icudt56l/vi.res
+++ b/src/cobalt/content/icu/icudt56l/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/wa.res b/src/cobalt/content/icu/icudt56l/wa.res
index b33131e..9823bb0 100644
--- a/src/cobalt/content/icu/icudt56l/wa.res
+++ b/src/cobalt/content/icu/icudt56l/wa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/yo.res b/src/cobalt/content/icu/icudt56l/yo.res
index 9d6fcf8..ba09dca 100644
--- a/src/cobalt/content/icu/icudt56l/yo.res
+++ b/src/cobalt/content/icu/icudt56l/yo.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zh.res b/src/cobalt/content/icu/icudt56l/zh.res
index 8693ef0..1754876 100644
--- a/src/cobalt/content/icu/icudt56l/zh.res
+++ b/src/cobalt/content/icu/icudt56l/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zh_CN.res b/src/cobalt/content/icu/icudt56l/zh_CN.res
index 6413b61..306efe4 100644
--- a/src/cobalt/content/icu/icudt56l/zh_CN.res
+++ b/src/cobalt/content/icu/icudt56l/zh_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zh_HK.res b/src/cobalt/content/icu/icudt56l/zh_HK.res
index 90ec33d..d30e69d 100644
--- a/src/cobalt/content/icu/icudt56l/zh_HK.res
+++ b/src/cobalt/content/icu/icudt56l/zh_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zh_Hans.res b/src/cobalt/content/icu/icudt56l/zh_Hans.res
index 008e4b7..d0ddba1 100644
--- a/src/cobalt/content/icu/icudt56l/zh_Hans.res
+++ b/src/cobalt/content/icu/icudt56l/zh_Hans.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zh_Hans_CN.res b/src/cobalt/content/icu/icudt56l/zh_Hans_CN.res
index 008e4b7..d0ddba1 100644
--- a/src/cobalt/content/icu/icudt56l/zh_Hans_CN.res
+++ b/src/cobalt/content/icu/icudt56l/zh_Hans_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zh_Hans_SG.res b/src/cobalt/content/icu/icudt56l/zh_Hans_SG.res
index 7d56843..5290c33 100644
--- a/src/cobalt/content/icu/icudt56l/zh_Hans_SG.res
+++ b/src/cobalt/content/icu/icudt56l/zh_Hans_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zh_Hant.res b/src/cobalt/content/icu/icudt56l/zh_Hant.res
index fa6cf1d..6fb1f94 100644
--- a/src/cobalt/content/icu/icudt56l/zh_Hant.res
+++ b/src/cobalt/content/icu/icudt56l/zh_Hant.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zh_Hant_HK.res b/src/cobalt/content/icu/icudt56l/zh_Hant_HK.res
index c824509..25384c6 100644
--- a/src/cobalt/content/icu/icudt56l/zh_Hant_HK.res
+++ b/src/cobalt/content/icu/icudt56l/zh_Hant_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zh_Hant_TW.res b/src/cobalt/content/icu/icudt56l/zh_Hant_TW.res
index 008e4b7..d0ddba1 100644
--- a/src/cobalt/content/icu/icudt56l/zh_Hant_TW.res
+++ b/src/cobalt/content/icu/icudt56l/zh_Hant_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zh_SG.res b/src/cobalt/content/icu/icudt56l/zh_SG.res
index b4a5fc2..f80c73c 100644
--- a/src/cobalt/content/icu/icudt56l/zh_SG.res
+++ b/src/cobalt/content/icu/icudt56l/zh_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zh_TW.res b/src/cobalt/content/icu/icudt56l/zh_TW.res
index 5b8785d..dd21dc5 100644
--- a/src/cobalt/content/icu/icudt56l/zh_TW.res
+++ b/src/cobalt/content/icu/icudt56l/zh_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/am.res b/src/cobalt/content/icu/icudt56l/zone/am.res
index 0ca203b..a615640 100644
--- a/src/cobalt/content/icu/icudt56l/zone/am.res
+++ b/src/cobalt/content/icu/icudt56l/zone/am.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/ar.res b/src/cobalt/content/icu/icudt56l/zone/ar.res
index 83694eb..24ab72f 100644
--- a/src/cobalt/content/icu/icudt56l/zone/ar.res
+++ b/src/cobalt/content/icu/icudt56l/zone/ar.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/bg.res b/src/cobalt/content/icu/icudt56l/zone/bg.res
index 9b8d165..4d07990 100644
--- a/src/cobalt/content/icu/icudt56l/zone/bg.res
+++ b/src/cobalt/content/icu/icudt56l/zone/bg.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/bn.res b/src/cobalt/content/icu/icudt56l/zone/bn.res
index d6a7c89..24a512e 100644
--- a/src/cobalt/content/icu/icudt56l/zone/bn.res
+++ b/src/cobalt/content/icu/icudt56l/zone/bn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/ca.res b/src/cobalt/content/icu/icudt56l/zone/ca.res
index fd8e6e8..475907e 100644
--- a/src/cobalt/content/icu/icudt56l/zone/ca.res
+++ b/src/cobalt/content/icu/icudt56l/zone/ca.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/cs.res b/src/cobalt/content/icu/icudt56l/zone/cs.res
index 57351b4..a177731 100644
--- a/src/cobalt/content/icu/icudt56l/zone/cs.res
+++ b/src/cobalt/content/icu/icudt56l/zone/cs.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/da.res b/src/cobalt/content/icu/icudt56l/zone/da.res
index 85deb82..00595e7 100644
--- a/src/cobalt/content/icu/icudt56l/zone/da.res
+++ b/src/cobalt/content/icu/icudt56l/zone/da.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/de.res b/src/cobalt/content/icu/icudt56l/zone/de.res
index 80b998d..1fe2466 100644
--- a/src/cobalt/content/icu/icudt56l/zone/de.res
+++ b/src/cobalt/content/icu/icudt56l/zone/de.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/el.res b/src/cobalt/content/icu/icudt56l/zone/el.res
index 10dcfc0..8211aa7 100644
--- a/src/cobalt/content/icu/icudt56l/zone/el.res
+++ b/src/cobalt/content/icu/icudt56l/zone/el.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/en.res b/src/cobalt/content/icu/icudt56l/zone/en.res
index cefa19c..16fd7d5 100644
--- a/src/cobalt/content/icu/icudt56l/zone/en.res
+++ b/src/cobalt/content/icu/icudt56l/zone/en.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/en_001.res b/src/cobalt/content/icu/icudt56l/zone/en_001.res
index 8dc348a..b630c21 100644
--- a/src/cobalt/content/icu/icudt56l/zone/en_001.res
+++ b/src/cobalt/content/icu/icudt56l/zone/en_001.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/en_150.res b/src/cobalt/content/icu/icudt56l/zone/en_150.res
index fc046d3..58ea37f 100644
--- a/src/cobalt/content/icu/icudt56l/zone/en_150.res
+++ b/src/cobalt/content/icu/icudt56l/zone/en_150.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/en_AU.res b/src/cobalt/content/icu/icudt56l/zone/en_AU.res
index 603245e..b44fc79 100644
--- a/src/cobalt/content/icu/icudt56l/zone/en_AU.res
+++ b/src/cobalt/content/icu/icudt56l/zone/en_AU.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/en_CA.res b/src/cobalt/content/icu/icudt56l/zone/en_CA.res
index a0ccf7c..92a64b5 100644
--- a/src/cobalt/content/icu/icudt56l/zone/en_CA.res
+++ b/src/cobalt/content/icu/icudt56l/zone/en_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/en_GB.res b/src/cobalt/content/icu/icudt56l/zone/en_GB.res
index b2340ce..62b5cd5 100644
--- a/src/cobalt/content/icu/icudt56l/zone/en_GB.res
+++ b/src/cobalt/content/icu/icudt56l/zone/en_GB.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/en_IN.res b/src/cobalt/content/icu/icudt56l/zone/en_IN.res
index 4dae4de..8c37488 100644
--- a/src/cobalt/content/icu/icudt56l/zone/en_IN.res
+++ b/src/cobalt/content/icu/icudt56l/zone/en_IN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/en_NZ.res b/src/cobalt/content/icu/icudt56l/zone/en_NZ.res
index 2cee9fe..472c851 100644
--- a/src/cobalt/content/icu/icudt56l/zone/en_NZ.res
+++ b/src/cobalt/content/icu/icudt56l/zone/en_NZ.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/en_ZA.res b/src/cobalt/content/icu/icudt56l/zone/en_ZA.res
index 0de2632..6061649 100644
--- a/src/cobalt/content/icu/icudt56l/zone/en_ZA.res
+++ b/src/cobalt/content/icu/icudt56l/zone/en_ZA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/es.res b/src/cobalt/content/icu/icudt56l/zone/es.res
index a678c63..d0e1844 100644
--- a/src/cobalt/content/icu/icudt56l/zone/es.res
+++ b/src/cobalt/content/icu/icudt56l/zone/es.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/es_419.res b/src/cobalt/content/icu/icudt56l/zone/es_419.res
index a2ce67b..5361981 100644
--- a/src/cobalt/content/icu/icudt56l/zone/es_419.res
+++ b/src/cobalt/content/icu/icudt56l/zone/es_419.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/es_AR.res b/src/cobalt/content/icu/icudt56l/zone/es_AR.res
index 4ee9778..565e293 100644
--- a/src/cobalt/content/icu/icudt56l/zone/es_AR.res
+++ b/src/cobalt/content/icu/icudt56l/zone/es_AR.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/es_MX.res b/src/cobalt/content/icu/icudt56l/zone/es_MX.res
index 800004b..ba6a4f6 100644
--- a/src/cobalt/content/icu/icudt56l/zone/es_MX.res
+++ b/src/cobalt/content/icu/icudt56l/zone/es_MX.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/es_US.res b/src/cobalt/content/icu/icudt56l/zone/es_US.res
index de33554..53d28ff 100644
--- a/src/cobalt/content/icu/icudt56l/zone/es_US.res
+++ b/src/cobalt/content/icu/icudt56l/zone/es_US.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/et.res b/src/cobalt/content/icu/icudt56l/zone/et.res
index 9a5a38b..ef24a3b 100644
--- a/src/cobalt/content/icu/icudt56l/zone/et.res
+++ b/src/cobalt/content/icu/icudt56l/zone/et.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/fa.res b/src/cobalt/content/icu/icudt56l/zone/fa.res
index 0c46d63..5714cb5 100644
--- a/src/cobalt/content/icu/icudt56l/zone/fa.res
+++ b/src/cobalt/content/icu/icudt56l/zone/fa.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/fi.res b/src/cobalt/content/icu/icudt56l/zone/fi.res
index 18e01f3..6a5e620 100644
--- a/src/cobalt/content/icu/icudt56l/zone/fi.res
+++ b/src/cobalt/content/icu/icudt56l/zone/fi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/fil.res b/src/cobalt/content/icu/icudt56l/zone/fil.res
index e9c8898..e129a7d 100644
--- a/src/cobalt/content/icu/icudt56l/zone/fil.res
+++ b/src/cobalt/content/icu/icudt56l/zone/fil.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/fr.res b/src/cobalt/content/icu/icudt56l/zone/fr.res
index 7b11d57..6478e5c 100644
--- a/src/cobalt/content/icu/icudt56l/zone/fr.res
+++ b/src/cobalt/content/icu/icudt56l/zone/fr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/fr_CA.res b/src/cobalt/content/icu/icudt56l/zone/fr_CA.res
index 4581455..bfc2acd 100644
--- a/src/cobalt/content/icu/icudt56l/zone/fr_CA.res
+++ b/src/cobalt/content/icu/icudt56l/zone/fr_CA.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/gu.res b/src/cobalt/content/icu/icudt56l/zone/gu.res
index 837e497..4b74231 100644
--- a/src/cobalt/content/icu/icudt56l/zone/gu.res
+++ b/src/cobalt/content/icu/icudt56l/zone/gu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/he.res b/src/cobalt/content/icu/icudt56l/zone/he.res
index eea5121..c237cdf 100644
--- a/src/cobalt/content/icu/icudt56l/zone/he.res
+++ b/src/cobalt/content/icu/icudt56l/zone/he.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/hi.res b/src/cobalt/content/icu/icudt56l/zone/hi.res
index 890d0d6e..8da58fd 100644
--- a/src/cobalt/content/icu/icudt56l/zone/hi.res
+++ b/src/cobalt/content/icu/icudt56l/zone/hi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/hr.res b/src/cobalt/content/icu/icudt56l/zone/hr.res
index 422cc73..4b68b94 100644
--- a/src/cobalt/content/icu/icudt56l/zone/hr.res
+++ b/src/cobalt/content/icu/icudt56l/zone/hr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/hu.res b/src/cobalt/content/icu/icudt56l/zone/hu.res
index bcf5a18..8b91cf2 100644
--- a/src/cobalt/content/icu/icudt56l/zone/hu.res
+++ b/src/cobalt/content/icu/icudt56l/zone/hu.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/id.res b/src/cobalt/content/icu/icudt56l/zone/id.res
index e59ebcc..6b944c0 100644
--- a/src/cobalt/content/icu/icudt56l/zone/id.res
+++ b/src/cobalt/content/icu/icudt56l/zone/id.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/in.res b/src/cobalt/content/icu/icudt56l/zone/in.res
index 6c9d80f..8ba67ac 100644
--- a/src/cobalt/content/icu/icudt56l/zone/in.res
+++ b/src/cobalt/content/icu/icudt56l/zone/in.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/it.res b/src/cobalt/content/icu/icudt56l/zone/it.res
index 3243f92..d8d1e1f 100644
--- a/src/cobalt/content/icu/icudt56l/zone/it.res
+++ b/src/cobalt/content/icu/icudt56l/zone/it.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/iw.res b/src/cobalt/content/icu/icudt56l/zone/iw.res
index 26c3f5d..3a64c91 100644
--- a/src/cobalt/content/icu/icudt56l/zone/iw.res
+++ b/src/cobalt/content/icu/icudt56l/zone/iw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/ja.res b/src/cobalt/content/icu/icudt56l/zone/ja.res
index 81e07bf..ca870bb 100644
--- a/src/cobalt/content/icu/icudt56l/zone/ja.res
+++ b/src/cobalt/content/icu/icudt56l/zone/ja.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/kn.res b/src/cobalt/content/icu/icudt56l/zone/kn.res
index e1a67d9..0aa5fd5 100644
--- a/src/cobalt/content/icu/icudt56l/zone/kn.res
+++ b/src/cobalt/content/icu/icudt56l/zone/kn.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/ko.res b/src/cobalt/content/icu/icudt56l/zone/ko.res
index 2a13eef..e91d1f2 100644
--- a/src/cobalt/content/icu/icudt56l/zone/ko.res
+++ b/src/cobalt/content/icu/icudt56l/zone/ko.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/lt.res b/src/cobalt/content/icu/icudt56l/zone/lt.res
index c951cdf..c1fb729 100644
--- a/src/cobalt/content/icu/icudt56l/zone/lt.res
+++ b/src/cobalt/content/icu/icudt56l/zone/lt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/lv.res b/src/cobalt/content/icu/icudt56l/zone/lv.res
index fbc0d3a..8187c0a 100644
--- a/src/cobalt/content/icu/icudt56l/zone/lv.res
+++ b/src/cobalt/content/icu/icudt56l/zone/lv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/ml.res b/src/cobalt/content/icu/icudt56l/zone/ml.res
index 0bbb558..5e517c5 100644
--- a/src/cobalt/content/icu/icudt56l/zone/ml.res
+++ b/src/cobalt/content/icu/icudt56l/zone/ml.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/mr.res b/src/cobalt/content/icu/icudt56l/zone/mr.res
index c427585..f065500 100644
--- a/src/cobalt/content/icu/icudt56l/zone/mr.res
+++ b/src/cobalt/content/icu/icudt56l/zone/mr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/ms.res b/src/cobalt/content/icu/icudt56l/zone/ms.res
index 74c35f0..0681ef9c 100644
--- a/src/cobalt/content/icu/icudt56l/zone/ms.res
+++ b/src/cobalt/content/icu/icudt56l/zone/ms.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/nb.res b/src/cobalt/content/icu/icudt56l/zone/nb.res
index 8964a4c..fb69575 100644
--- a/src/cobalt/content/icu/icudt56l/zone/nb.res
+++ b/src/cobalt/content/icu/icudt56l/zone/nb.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/nl.res b/src/cobalt/content/icu/icudt56l/zone/nl.res
index e4fd809..a0817f6 100644
--- a/src/cobalt/content/icu/icudt56l/zone/nl.res
+++ b/src/cobalt/content/icu/icudt56l/zone/nl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/no.res b/src/cobalt/content/icu/icudt56l/zone/no.res
index d674a96..707257a 100644
--- a/src/cobalt/content/icu/icudt56l/zone/no.res
+++ b/src/cobalt/content/icu/icudt56l/zone/no.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/pl.res b/src/cobalt/content/icu/icudt56l/zone/pl.res
index 6b54d59..643202a 100644
--- a/src/cobalt/content/icu/icudt56l/zone/pl.res
+++ b/src/cobalt/content/icu/icudt56l/zone/pl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/pool.res b/src/cobalt/content/icu/icudt56l/zone/pool.res
index 20ff031..6be0d1a 100644
--- a/src/cobalt/content/icu/icudt56l/zone/pool.res
+++ b/src/cobalt/content/icu/icudt56l/zone/pool.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/pt.res b/src/cobalt/content/icu/icudt56l/zone/pt.res
index 5cc633e..c582c3c 100644
--- a/src/cobalt/content/icu/icudt56l/zone/pt.res
+++ b/src/cobalt/content/icu/icudt56l/zone/pt.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/pt_PT.res b/src/cobalt/content/icu/icudt56l/zone/pt_PT.res
index f935c23..c27e411 100644
--- a/src/cobalt/content/icu/icudt56l/zone/pt_PT.res
+++ b/src/cobalt/content/icu/icudt56l/zone/pt_PT.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/ro.res b/src/cobalt/content/icu/icudt56l/zone/ro.res
index 793b79d..602535c 100644
--- a/src/cobalt/content/icu/icudt56l/zone/ro.res
+++ b/src/cobalt/content/icu/icudt56l/zone/ro.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/root.res b/src/cobalt/content/icu/icudt56l/zone/root.res
index 4b5d6a5..ccf6129 100644
--- a/src/cobalt/content/icu/icudt56l/zone/root.res
+++ b/src/cobalt/content/icu/icudt56l/zone/root.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/ru.res b/src/cobalt/content/icu/icudt56l/zone/ru.res
index c1f7cc5..7640ffe 100644
--- a/src/cobalt/content/icu/icudt56l/zone/ru.res
+++ b/src/cobalt/content/icu/icudt56l/zone/ru.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/sk.res b/src/cobalt/content/icu/icudt56l/zone/sk.res
index 960272e..265d646 100644
--- a/src/cobalt/content/icu/icudt56l/zone/sk.res
+++ b/src/cobalt/content/icu/icudt56l/zone/sk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/sl.res b/src/cobalt/content/icu/icudt56l/zone/sl.res
index 2b9d73b..f8b0996 100644
--- a/src/cobalt/content/icu/icudt56l/zone/sl.res
+++ b/src/cobalt/content/icu/icudt56l/zone/sl.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/sr.res b/src/cobalt/content/icu/icudt56l/zone/sr.res
index 04aafaf..1caa8c6 100644
--- a/src/cobalt/content/icu/icudt56l/zone/sr.res
+++ b/src/cobalt/content/icu/icudt56l/zone/sr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/sv.res b/src/cobalt/content/icu/icudt56l/zone/sv.res
index 6acfde0..ffc1ca7 100644
--- a/src/cobalt/content/icu/icudt56l/zone/sv.res
+++ b/src/cobalt/content/icu/icudt56l/zone/sv.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/sw.res b/src/cobalt/content/icu/icudt56l/zone/sw.res
index d29d17f..90e7f83 100644
--- a/src/cobalt/content/icu/icudt56l/zone/sw.res
+++ b/src/cobalt/content/icu/icudt56l/zone/sw.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/ta.res b/src/cobalt/content/icu/icudt56l/zone/ta.res
index 3dabd4b..14e7724 100644
--- a/src/cobalt/content/icu/icudt56l/zone/ta.res
+++ b/src/cobalt/content/icu/icudt56l/zone/ta.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/te.res b/src/cobalt/content/icu/icudt56l/zone/te.res
index 6964555..b31f348 100644
--- a/src/cobalt/content/icu/icudt56l/zone/te.res
+++ b/src/cobalt/content/icu/icudt56l/zone/te.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/th.res b/src/cobalt/content/icu/icudt56l/zone/th.res
index dc1cd79..7be82bf 100644
--- a/src/cobalt/content/icu/icudt56l/zone/th.res
+++ b/src/cobalt/content/icu/icudt56l/zone/th.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/tr.res b/src/cobalt/content/icu/icudt56l/zone/tr.res
index e9f0f1e..7672569 100644
--- a/src/cobalt/content/icu/icudt56l/zone/tr.res
+++ b/src/cobalt/content/icu/icudt56l/zone/tr.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/tzdbNames.res b/src/cobalt/content/icu/icudt56l/zone/tzdbNames.res
index 1e36cea..463ab0f 100644
--- a/src/cobalt/content/icu/icudt56l/zone/tzdbNames.res
+++ b/src/cobalt/content/icu/icudt56l/zone/tzdbNames.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/uk.res b/src/cobalt/content/icu/icudt56l/zone/uk.res
index e51f2e4..ca07a8f 100644
--- a/src/cobalt/content/icu/icudt56l/zone/uk.res
+++ b/src/cobalt/content/icu/icudt56l/zone/uk.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/vi.res b/src/cobalt/content/icu/icudt56l/zone/vi.res
index e1147c7..21162bc 100644
--- a/src/cobalt/content/icu/icudt56l/zone/vi.res
+++ b/src/cobalt/content/icu/icudt56l/zone/vi.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/zh.res b/src/cobalt/content/icu/icudt56l/zone/zh.res
index 1d14841..9a55369 100644
--- a/src/cobalt/content/icu/icudt56l/zone/zh.res
+++ b/src/cobalt/content/icu/icudt56l/zone/zh.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/zh_CN.res b/src/cobalt/content/icu/icudt56l/zone/zh_CN.res
index 73058b5..20d5db9 100644
--- a/src/cobalt/content/icu/icudt56l/zone/zh_CN.res
+++ b/src/cobalt/content/icu/icudt56l/zone/zh_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/zh_HK.res b/src/cobalt/content/icu/icudt56l/zone/zh_HK.res
index 22b133b..7da02f8 100644
--- a/src/cobalt/content/icu/icudt56l/zone/zh_HK.res
+++ b/src/cobalt/content/icu/icudt56l/zone/zh_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/zh_Hans.res b/src/cobalt/content/icu/icudt56l/zone/zh_Hans.res
index 750bf38..0b2c050 100644
--- a/src/cobalt/content/icu/icudt56l/zone/zh_Hans.res
+++ b/src/cobalt/content/icu/icudt56l/zone/zh_Hans.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/zh_Hans_CN.res b/src/cobalt/content/icu/icudt56l/zone/zh_Hans_CN.res
index c48febe..1de3818 100644
--- a/src/cobalt/content/icu/icudt56l/zone/zh_Hans_CN.res
+++ b/src/cobalt/content/icu/icudt56l/zone/zh_Hans_CN.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/zh_Hans_SG.res b/src/cobalt/content/icu/icudt56l/zone/zh_Hans_SG.res
index 2d2abc8..c9a5bb5 100644
--- a/src/cobalt/content/icu/icudt56l/zone/zh_Hans_SG.res
+++ b/src/cobalt/content/icu/icudt56l/zone/zh_Hans_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/zh_Hant.res b/src/cobalt/content/icu/icudt56l/zone/zh_Hant.res
index adfd75b..07262fa 100644
--- a/src/cobalt/content/icu/icudt56l/zone/zh_Hant.res
+++ b/src/cobalt/content/icu/icudt56l/zone/zh_Hant.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/zh_Hant_HK.res b/src/cobalt/content/icu/icudt56l/zone/zh_Hant_HK.res
index 49d0732..14edaca 100644
--- a/src/cobalt/content/icu/icudt56l/zone/zh_Hant_HK.res
+++ b/src/cobalt/content/icu/icudt56l/zone/zh_Hant_HK.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/zh_Hant_TW.res b/src/cobalt/content/icu/icudt56l/zone/zh_Hant_TW.res
index c48febe..1de3818 100644
--- a/src/cobalt/content/icu/icudt56l/zone/zh_Hant_TW.res
+++ b/src/cobalt/content/icu/icudt56l/zone/zh_Hant_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/zh_SG.res b/src/cobalt/content/icu/icudt56l/zone/zh_SG.res
index a92d327..bc7f82f 100644
--- a/src/cobalt/content/icu/icudt56l/zone/zh_SG.res
+++ b/src/cobalt/content/icu/icudt56l/zone/zh_SG.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zone/zh_TW.res b/src/cobalt/content/icu/icudt56l/zone/zh_TW.res
index 001b973..6f12dcb 100644
--- a/src/cobalt/content/icu/icudt56l/zone/zh_TW.res
+++ b/src/cobalt/content/icu/icudt56l/zone/zh_TW.res
Binary files differ
diff --git a/src/cobalt/content/icu/icudt56l/zu.res b/src/cobalt/content/icu/icudt56l/zu.res
index ea22475..1b918d8 100644
--- a/src/cobalt/content/icu/icudt56l/zu.res
+++ b/src/cobalt/content/icu/icudt56l/zu.res
Binary files differ
diff --git a/src/cobalt/css_parser/grammar.y b/src/cobalt/css_parser/grammar.y
index 52f988e..63f869d 100644
--- a/src/cobalt/css_parser/grammar.y
+++ b/src/cobalt/css_parser/grammar.y
@@ -4304,8 +4304,12 @@
// Specifies the minimum content height of boxes.
// https://www.w3.org/TR/CSS21/visudet.html#propdef-min-height
+// https://www.w3.org/TR/css-sizing-3/#min-size-properties
min_height_property_value:
- positive_length_percent_property_value
+ kAutoToken maybe_whitespace {
+ $$ = AddRef(cssom::KeywordValue::GetAuto().get());
+ }
+ | positive_length_percent_property_value
| common_values
;
@@ -5736,8 +5740,12 @@
// Specifies the minimum content width of boxes.
// https://www.w3.org/TR/CSS2/visudet.html#propdef-min-width
+// https://www.w3.org/TR/css-sizing-3/#min-size-properties
min_width_property_value:
- positive_length_percent_property_value
+ kAutoToken maybe_whitespace {
+ $$ = AddRef(cssom::KeywordValue::GetAuto().get());
+ }
+ | positive_length_percent_property_value
| common_values
;
diff --git a/src/cobalt/css_parser/parser_test.cc b/src/cobalt/css_parser/parser_test.cc
index db63e85..fa1511c 100644
--- a/src/cobalt/css_parser/parser_test.cc
+++ b/src/cobalt/css_parser/parser_test.cc
@@ -6346,6 +6346,20 @@
EXPECT_EQ(cssom::kPixelsUnit, min_height->unit());
}
+TEST_F(ParserTest, ParsesMinHeightAuto) {
+ // 'auto' is also the initial value for min-height in CSS3. It is set to a
+ // length value first, to ensure that the property does not have the initial
+ // value for the test.
+ // https://www.w3.org/TR/css-sizing-3/#min-size-properties
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList("min-height: 100px; min-height: auto;",
+ source_location_);
+
+ ASSERT_TRUE(style->IsDeclared(cssom::kMinHeightProperty));
+ EXPECT_EQ(cssom::KeywordValue::GetAuto(),
+ style->GetPropertyValue(cssom::kMinHeightProperty));
+}
+
TEST_F(ParserTest, ParsesMinWidth) {
scoped_refptr<cssom::CSSDeclaredStyleData> style =
parser_.ParseStyleDeclarationList("min-width: 100px;", source_location_);
@@ -6359,6 +6373,20 @@
EXPECT_EQ(cssom::kPixelsUnit, min_width->unit());
}
+TEST_F(ParserTest, ParsesMinWidthAuto) {
+ // 'auto' is also the initial value for min-width in CSS3. It is set to a
+ // length value first, to ensure that the property does not have the initial
+ // value for the test.
+ // https://www.w3.org/TR/css-sizing-3/#min-size-properties
+ scoped_refptr<cssom::CSSDeclaredStyleData> style =
+ parser_.ParseStyleDeclarationList("min-width: 100px; min-width: auto;",
+ source_location_);
+
+ ASSERT_TRUE(style->IsDeclared(cssom::kMinWidthProperty));
+ EXPECT_EQ(cssom::KeywordValue::GetAuto(),
+ style->GetPropertyValue(cssom::kMinWidthProperty));
+}
+
TEST_F(ParserTest, ParsesOpacity) {
scoped_refptr<cssom::CSSDeclaredStyleData> style =
parser_.ParseStyleDeclarationList("opacity: 0.5;", source_location_);
diff --git a/src/cobalt/cssom/property_definitions.cc b/src/cobalt/cssom/property_definitions.cc
index f140fde..72d36ac 100644
--- a/src/cobalt/cssom/property_definitions.cc
+++ b/src/cobalt/cssom/property_definitions.cc
@@ -570,18 +570,18 @@
kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());
// https://www.w3.org/TR/CSS2/visudet.html#propdef-min-height
+ // https://www.w3.org/TR/css-sizing-3/#min-size-properties
SetPropertyDefinition(kMinHeightProperty, "min-height", kInheritedNo,
kAnimatableNo, kImpactsChildComputedStyleNo,
kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
- kImpactsBoxCrossReferencesNo,
- new LengthValue(0, kPixelsUnit));
+ kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());
// https://www.w3.org/TR/CSS2/visudet.html#propdef-min-width
+ // https://www.w3.org/TR/css-sizing-3/#min-size-properties
SetPropertyDefinition(kMinWidthProperty, "min-width", kInheritedNo,
kAnimatableNo, kImpactsChildComputedStyleNo,
kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
- kImpactsBoxCrossReferencesNo,
- new LengthValue(0, kPixelsUnit));
+ kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());
// https://www.w3.org/TR/css3-color/#opacity
SetPropertyDefinition(kOpacityProperty, "opacity", kInheritedNo,
diff --git a/src/cobalt/debug/backend/content/css_agent.js b/src/cobalt/debug/backend/content/css_agent.js
index 7745a6c..e7747b6 100644
--- a/src/cobalt/debug/backend/content/css_agent.js
+++ b/src/cobalt/debug/backend/content/css_agent.js
@@ -131,13 +131,5 @@
this.matchedCSSRules = _matchedRules(node);
}
-// Polyfill Element.matches()
-// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches
-Element.prototype.matches = Element.prototype.matches || function(s) {
- var matches = document.querySelectorAll(s), i = matches.length;
- while (--i >= 0 && matches.item(i) != this) {}
- return i > -1;
-};
-
// TODO: Pass debugBackend from C++ instead of getting it from the window.
})(window.debugBackend);
diff --git a/src/cobalt/debug/backend/content/runtime_agent.js b/src/cobalt/debug/backend/content/runtime_agent.js
new file mode 100644
index 0000000..f426e65
--- /dev/null
+++ b/src/cobalt/debug/backend/content/runtime_agent.js
@@ -0,0 +1,473 @@
+// Copyright 2016 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.
+
+// This implementation of the "Runtime" Devtools protocol domain is only used
+// for mozjs. When using V8, we use the built-in inspector backend which
+// implements this for us.
+
+(function(debugBackend) {
+
+// Attach methods to handle commands in the 'Runtime' devtools domain.
+// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime
+var commands = debugBackend.Runtime = {};
+
+// Calls a function on a previously accessed RemoteObject with an argument list
+// and returns a new RemoteObject. Used extensively by devtools for
+// auto-completion. The new RemoteObject uses the same |objectGroup| as the
+// original object.
+// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-callFunctionOn
+commands.callFunctionOn = function(params) {
+ var result = {};
+ var value = null;
+ try {
+ eval('var f = ' + params.functionDeclaration);
+ var objectEntry = _objectStore[params.objectId];
+ var thisArg = objectEntry.object;
+ var objectGroup = objectEntry.objectGroup;
+ value = f.apply(thisArg, params.arguments);
+ result.wasThrown = false;
+ } catch(e) {
+ value = e;
+ result.exceptionDetails = e;
+ result.wasThrown = true;
+ }
+
+ result.result =
+ new devtools.RemoteObject(value, objectGroup, params.returnByValue);
+ return JSON.stringify(result);
+}
+
+// Evaluates a string and returns a RemoteObject.
+// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-evaluate
+commands.evaluate = function(params) {
+ var result = {};
+ var value = null;
+ try {
+ if (params.includeCommandLineAPI) {
+ _addCommandLineAPI();
+ }
+
+ // Use |eval| indirectly, to cause evaluation at global scope.
+ // This is so subsequent calls can access variables declared here, etc.
+ var geval = eval;
+ value = geval(params.expression);
+
+ // Store the last result if we're doing a "real" evaluation, not an
+ // auto-complete. Seems a little special case-y, but this is taken from
+ // Chrome's implementation, and looks like the only way to differentiate.
+ if (params.objectGroup == 'console') {
+ _lastResult = value;
+ }
+
+ result.wasThrown = false;
+ } catch(e) {
+ value = e;
+ result.exceptionDetails = e;
+ result.wasThrown = true;
+ }
+
+ // Create the RemoteObject corresponding to the result.
+ result.result =
+ new devtools.RemoteObject(value, params.objectGroup, params.returnByValue);
+
+ // Add the preview, if requested.
+ if (params.generatePreview) {
+ var preview = _generatePreview(value);
+ if (preview) {
+ result.result.preview = preview;
+ }
+ }
+
+ if (params.includeCommandLineAPI) {
+ _removeCommandLineAPI();
+ }
+
+ return JSON.stringify(result);
+}
+
+// Returns all let, const and class variables from global scope.
+// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-globalLexicalScopeNames
+commands.globalLexicalScopeNames = function(params) {
+ var result = [];
+ // TODO: Get the globals.
+ return JSON.stringify(result);
+}
+
+// Returns the properties of a previously accessed object as an array of
+// PropertyDescriptor objects.
+// The parameters specifify several options:
+// * ownProperties - only include immediate properties, not the prototype chain.
+// * accessorPropertiesOnly - only include accessor properties.
+// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-getProperties
+commands.getProperties = function(params) {
+ var result = {};
+ var properties = [];
+ try {
+ var objectEntry = _objectStore[params.objectId];
+ var object = objectEntry.object;
+ var objectGroup = objectEntry.objectGroup;
+ _addProperties(object, objectGroup, !params.ownProperties, properties);
+
+ if (params.accessorPropertiesOnly) {
+ properties = properties.filter(function(element, index, array) {
+ return (element.get || element.set);
+ });
+ }
+ result.wasThrown = false;
+ } catch(e) {
+ value = e;
+ result.exceptionDetails = e;
+ result.wasThrown = true;
+ }
+
+ result.result = properties;
+ return JSON.stringify(result);
+}
+
+// Releases our reference to a previously accessed object.
+// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-releaseObject
+commands.releaseObject = function(params) {
+ delete _objectStore[params.objectId];
+}
+
+// Releases our references to a group of previously accessed objects.
+// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-releaseObjectGroup
+commands.releaseObjectGroup = function(params) {
+ for (var objectId in _objectStore) {
+ var objectEntry = _objectStore[objectId];
+ if (objectEntry && objectEntry.objectGroup == params.objectGroup) {
+ delete _objectStore[objectId];
+ }
+ }
+}
+
+// Adds the properties of |object| to the |result| array as new
+// PropertyDescriptor objects. Some properties may be objects themselves,
+// in which case new RemoteObjects are created using the specified
+// |objectGroup|, which should be that of |object|.
+// If |includePrototype| is set, the function will be called recursively on
+// the prototype chain of the object.
+var _addProperties = function(object, objectGroup, includePrototype, result) {
+ var properties = Object.getOwnPropertyNames(object);
+ var foundProto = false;
+ for (var i = 0; i < properties.length; i++) {
+ var key = properties[i];
+ foundProto = foundProto || (key == '__proto__');
+
+ // If we can't find the property, and its name corresponds to a number,
+ // try it as an array index (integer instead of string).
+ if (object[key] == null) {
+ if (!isNaN(key)) {
+ key = parseInt(key);
+ } else {
+ continue;
+ }
+ }
+
+ var propertyDescriptor =
+ new devtools.PropertyDescriptor(object, objectGroup, key);
+ result.push(propertyDescriptor);
+ }
+
+ var proto = null;
+ try {
+ proto = Object.getPrototypeOf(object);
+ } catch (e) {}
+
+ if (includePrototype) {
+ // Recursively add the properties from the prototype chain.
+ if (proto) {
+ _addProperties(proto, objectGroup, includePrototype, result);
+ }
+ } else if (proto && !foundProto) {
+ // |getOwnPropertyNames| may not include the object prototype,
+ // so if that's the case, add it now. It's a deprecated name, but devtools
+ // still uses it.
+ var propertyDescriptor =
+ new devtools.PropertyDescriptor(object, objectGroup, '__proto__');
+ result.push(propertyDescriptor);
+ }
+}
+
+// Gets an object from the internal object store.
+var _getObject = function(objectId) {
+ return _objectStore[objectId].object;
+}
+
+// Adds an object to the internal object store and returns a unique id that can
+// be used to access it again.
+var _addObject = function(object, objectGroup) {
+ // If we've already added this object, then use the same objectId.
+ for (var objectId in _objectStore) {
+ var objectEntry = _objectStore[objectId];
+ if (objectEntry.object === object &&
+ objectEntry.objectGroup == objectGroup) {
+ return objectId;
+ }
+ }
+
+ var objectId = _nextObjectId.toString();
+ _nextObjectId += 1;
+ _objectStore[objectId] = {};
+ _objectStore[objectId].object = object;
+ _objectStore[objectId].objectGroup = objectGroup;
+ return objectId;
+}
+
+// Generates an object preview, which may be requested for the evaluate
+// command.
+var _generatePreview = function(object) {
+ if (!object || (typeof object != 'object')) {
+ return null;
+ } else {
+ return new devtools.ObjectPreview(object);
+ }
+}
+
+// Returns the subtype of an object, or null if the specified value is not an
+// object.
+var _getSubtype = function(object) {
+ if (typeof object == 'object') {
+ if (object instanceof Array) {
+ return 'array';
+ } else if (object instanceof Date) {
+ return 'date';
+ } else if (object instanceof Error) {
+ return 'error';
+ } else if (object instanceof Node) {
+ return 'node';
+ } else if (object instanceof RegExp) {
+ return 'regexp';
+ }
+ }
+ return null;
+}
+
+// Tries to get the classname of an object by following the prototype chain
+// and looking for a constructor.
+var _getClassName = function(object) {
+ try {
+ for (var obj = object; obj && !this.className;
+ obj = Object.getPrototypeOf(obj)) {
+ if (obj.constructor) {
+ return obj.constructor.name;
+ }
+ }
+ } catch(e) {}
+
+ return null;
+}
+
+// Namespace for constructors of types defined in the Devtools protocol.
+var devtools = {};
+
+// Creates a RemoteObject, which is the type used to return many values to
+// devtools. If |value| is an object, then is it inserted into |_objectStore|
+// and the |objectId| key used to access it is included in the RemoteObject. If
+// |value| is not an object, or |returnByValue| is true, then |value| is
+// directly included in the RemoteObject.
+devtools.RemoteObject = function(value, objectGroup, returnByValue) {
+ this.type = typeof value;
+
+ if (value == null) {
+ this.subtype == 'null';
+ this.value = null;
+ return;
+ }
+
+ if (this.type == 'object') {
+ this.objectId = _addObject(value, objectGroup);
+ this.subtype = _getSubtype(value);
+ this.className = _getClassName(value);
+ }
+
+ // Fill in the description field. Devtools will only display arrays correctly
+ // if their description follows a particular format. For other values, try to
+ // use the generic string conversion, and fall back to the className if that
+ // fails.
+ if (this.subtype == 'array') {
+ this.description = 'Array[' + value.length + ']';
+ } else {
+ try {
+ this.description = value.toString();
+ } catch(e) {
+ this.description = this.className;
+ }
+ }
+
+ if (returnByValue || this.type != 'object') {
+ this.value = value;
+ }
+}
+
+// Creates a PropertyDescriptor for |property| of |object|, which is the type
+// used to return object properties to devtools. Some properties may be objects,
+// in which case new RemoteObjects are created and inserted into |_objectStore|
+// using the specified |objectGroup|, which should be that of |object|.
+devtools.PropertyDescriptor = function(object, objectGroup, property) {
+ this.name = property.toString();
+ var descriptor = Object.getOwnPropertyDescriptor(object, property);
+ // Some Cobalt objects don't seem to support |getOwnPropertyDescriptor|,
+ // so we handle that case in the else clause below.
+ if (descriptor) {
+ this.configurable = descriptor.configurable;
+ this.enumerable = descriptor.enumerable;
+ if (descriptor.get) {
+ this.get = new devtools.RemoteObject(descriptor.get, objectGroup, false);
+ }
+ if (descriptor.set) {
+ this.set = new devtools.RemoteObject(descriptor.set, objectGroup, false);
+ }
+ if (descriptor.value != null) {
+ this.value =
+ new devtools.RemoteObject(descriptor.value, objectGroup, false);
+ }
+ this.writable = descriptor.writable;
+ } else if (object[property] != null) {
+ this.configurable = false;
+ this.enumerable = object.propertyIsEnumerable(property);
+ if (object.__lookupGetter__(property)) {
+ this.get = object.__lookupGetter__(property);
+ }
+ if (object.__lookupSetter__(property)) {
+ this.set = object.__lookupSetter__(property);
+ }
+ this.value =
+ new devtools.RemoteObject(object[property], objectGroup, false);
+ }
+}
+
+// Creates an ObjectPreview, the type to represent a preview of an object,
+// which may be requested by devtools in the evaluate command.
+devtools.ObjectPreview = function(value) {
+ this.type = typeof value;
+ this.subtype = _getSubtype(value);
+ this.lossless = true;
+ this.overflow = false;
+ this.properties = [];
+
+ // Use the className as the preview description. This matches Chrome.
+ this.description = _getClassName(value);
+
+ // If we have an array-like object, add the array items, or append the
+ // length to the description if there's too many.
+ if (value.length != null) {
+ var MAX_ARRAY_ITEMS = 99;
+ if (value.length <= MAX_ARRAY_ITEMS) {
+ for (var i = 0; i < value.length; i++) {
+ var property = new devtools.PropertyPreview(i, value[i]);
+ this.properties.push(property);
+ if (typeof value[i] == 'object') {
+ this.lossless = false;
+ }
+ }
+ } else {
+ this.description += '[' + value.length + ']';
+ this.lossless = false;
+ this.overflow = true;
+ }
+ return;
+ }
+
+ // Add object properties, up to a maximum.
+ var MAX_PROPERTIES = 5;
+ var numProperties = 0;
+ for (var name in value) {
+ if (value[name] != null) {
+ if (++numProperties > MAX_PROPERTIES) {
+ this.lossless = false;
+ this.overflow = true;
+ break;
+ }
+ if (typeof property == 'object') {
+ this.lossless = false;
+ }
+ var property = new devtools.PropertyPreview(name, value[name]);
+ this.properties.push(property);
+ }
+ }
+}
+
+// Creates a PropertyPreview, the type to represent a preview of a single
+// object property.
+devtools.PropertyPreview = function(name, value) {
+ this.name = name.toString();
+ this.type = typeof value;
+
+ try {
+ this.value = value.toString();
+ } catch(e) {}
+
+ if (this.type == 'object') {
+ this.subtype = _getSubtype(value);
+ }
+}
+
+// The object store used to reference objects by internally generated id.
+var _objectStore = {};
+var _nextObjectId = 0;
+
+// The last evaluated result.
+var _lastResult = null;
+
+// Values in the global scope that have been overridden by corresponding
+// members of the Command Line API for the duration of an evaluation. We use
+// this to restore the original values after the evaluation.
+var _globalOverrides = {};
+
+// Command Line API implementation.
+// This is a set of convenience variables/functions that are not present in
+// the global scope by default, but can be specified as available to the
+// Runtime.evaluate function by the includeCommandLineAPI parameter.
+// https://developers.google.com/web/tools/chrome-devtools/console/utilities
+var _commandLineAPI = {};
+
+_commandLineAPI.$_ = _lastResult;
+
+_commandLineAPI.$ = document.querySelector.bind(document);
+
+_commandLineAPI.$$ = document.querySelectorAll.bind(document);
+
+_commandLineAPI.keys = Object.keys;
+
+_commandLineAPI.values = function(object) {
+ var keys = Object.keys(object);
+ var result = [];
+ for (var i = 0; i < keys.length; i++) {
+ result.push(object[keys[i]]);
+ }
+ return result;
+}
+
+var _addCommandLineAPI = function() {
+ _commandLineAPI.$_ = _lastResult;
+ for (var property in _commandLineAPI) {
+ if (_commandLineAPI.hasOwnProperty(property)) {
+ _globalOverrides[property] = window[property];
+ window[property] = _commandLineAPI[property];
+ }
+ }
+}
+
+var _removeCommandLineAPI = function() {
+ for (var property in _globalOverrides) {
+ if (_globalOverrides.hasOwnProperty(property)) {
+ window[property] = _globalOverrides[property];
+ delete _globalOverrides[property];
+ }
+ }
+}
+
+// TODO: Pass debugBackend from C++ instead of getting it from the window.
+})(window.debugBackend);
diff --git a/src/cobalt/debug/backend/debug_module.cc b/src/cobalt/debug/backend/debug_module.cc
index 1b82307..e1849a9 100644
--- a/src/cobalt/debug/backend/debug_module.cc
+++ b/src/cobalt/debug/backend/debug_module.cc
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include <memory>
-
#include "cobalt/debug/backend/debug_module.h"
+#include <memory>
+
#include "cobalt/debug/backend/render_layer.h"
namespace cobalt {
@@ -24,6 +24,7 @@
namespace {
constexpr char kScriptDebuggerAgent[] = "ScriptDebuggerAgent";
+constexpr char kRuntimeAgent[] = "RuntimeAgent";
constexpr char kConsoleAgent[] = "ConsoleAgent";
constexpr char kLogAgent[] = "LogAgent";
constexpr char kDomAgent[] = "DomAgent";
@@ -154,6 +155,10 @@
// directly handle one or more protocol domains.
script_debugger_agent_.reset(
new ScriptDebuggerAgent(debug_dispatcher_.get(), script_debugger_.get()));
+ if (!script_debugger_agent_->IsSupportedDomain("Runtime")) {
+ runtime_agent_.reset(
+ new RuntimeAgent(debug_dispatcher_.get(), data.window));
+ }
console_agent_.reset(new ConsoleAgent(debug_dispatcher_.get(), data.console));
log_agent_.reset(new LogAgent(debug_dispatcher_.get()));
dom_agent_.reset(
@@ -183,6 +188,9 @@
: data.debugger_state->agents_state.get();
script_debugger_agent_->Thaw(
RemoveAgentState(kScriptDebuggerAgent, agents_state));
+ if (runtime_agent_) {
+ runtime_agent_->Thaw(RemoveAgentState(kRuntimeAgent, agents_state));
+ }
console_agent_->Thaw(RemoveAgentState(kConsoleAgent, agents_state));
log_agent_->Thaw(RemoveAgentState(kLogAgent, agents_state));
dom_agent_->Thaw(RemoveAgentState(kDomAgent, agents_state));
@@ -207,6 +215,9 @@
base::DictionaryValue* agents_state = debugger_state->agents_state.get();
StoreAgentState(agents_state, kScriptDebuggerAgent,
script_debugger_agent_->Freeze());
+ if (runtime_agent_) {
+ StoreAgentState(agents_state, kRuntimeAgent, runtime_agent_->Freeze());
+ }
StoreAgentState(agents_state, kConsoleAgent, console_agent_->Freeze());
StoreAgentState(agents_state, kLogAgent, log_agent_->Freeze());
StoreAgentState(agents_state, kDomAgent, dom_agent_->Freeze());
diff --git a/src/cobalt/debug/backend/debug_module.h b/src/cobalt/debug/backend/debug_module.h
index 6abfa5c..ccf942c 100644
--- a/src/cobalt/debug/backend/debug_module.h
+++ b/src/cobalt/debug/backend/debug_module.h
@@ -29,6 +29,7 @@
#include "cobalt/debug/backend/log_agent.h"
#include "cobalt/debug/backend/page_agent.h"
#include "cobalt/debug/backend/render_overlay.h"
+#include "cobalt/debug/backend/runtime_agent.h"
#include "cobalt/debug/backend/script_debugger_agent.h"
#include "cobalt/debug/backend/tracing_agent.h"
#include "cobalt/debug/json_object.h"
@@ -140,6 +141,7 @@
std::unique_ptr<DOMAgent> dom_agent_;
scoped_refptr<CSSAgent> css_agent_;
std::unique_ptr<PageAgent> page_agent_;
+ std::unique_ptr<RuntimeAgent> runtime_agent_;
std::unique_ptr<ScriptDebuggerAgent> script_debugger_agent_;
std::unique_ptr<TracingAgent> tracing_agent_;
};
diff --git a/src/cobalt/debug/backend/runtime_agent.cc b/src/cobalt/debug/backend/runtime_agent.cc
new file mode 100644
index 0000000..70c7acb
--- /dev/null
+++ b/src/cobalt/debug/backend/runtime_agent.cc
@@ -0,0 +1,90 @@
+// Copyright 2016 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 "cobalt/debug/backend/runtime_agent.h"
+
+#include <string>
+
+#include "base/bind.h"
+
+namespace cobalt {
+namespace debug {
+namespace backend {
+
+namespace {
+// Definitions from the set specified here:
+// https://chromedevtools.github.io/devtools-protocol/tot/Runtime
+constexpr char kInspectorDomain[] = "Runtime";
+
+// File to load JavaScript runtime implementation from.
+constexpr char kScriptFile[] = "runtime_agent.js";
+} // namespace
+
+RuntimeAgent::RuntimeAgent(DebugDispatcher* dispatcher, dom::Window* window)
+ : dispatcher_(dispatcher),
+ window_(window),
+ ALLOW_THIS_IN_INITIALIZER_LIST(commands_(this, kInspectorDomain)) {
+ DCHECK(dispatcher_);
+ if (!dispatcher_->RunScriptFile(kScriptFile)) {
+ DLOG(WARNING) << "Cannot execute Runtime initialization script.";
+ }
+
+ commands_["enable"] = &RuntimeAgent::Enable;
+ commands_["disable"] = &RuntimeAgent::Disable;
+ commands_["compileScript"] = &RuntimeAgent::CompileScript;
+}
+
+void RuntimeAgent::Thaw(JSONObject agent_state) {
+ dispatcher_->AddDomain(kInspectorDomain, commands_.Bind());
+ script_loaded_ = dispatcher_->RunScriptFile(kScriptFile);
+ DLOG_IF(ERROR, !script_loaded_) << "Failed to load " << kScriptFile;
+}
+
+JSONObject RuntimeAgent::Freeze() {
+ dispatcher_->RemoveDomain(kInspectorDomain);
+ return JSONObject();
+}
+
+void RuntimeAgent::Enable(const Command& command) {
+ if (!script_loaded_) {
+ command.SendErrorResponse(Command::kInternalError,
+ "Cannot create Runtime inspector.");
+ return;
+ }
+
+ // Send an executionContextCreated event.
+ // https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#event-executionContextCreated
+ JSONObject params(new base::DictionaryValue());
+ params->SetInteger("context.id", 1);
+ params->SetString("context.origin", window_->location()->origin());
+ params->SetString("context.name", "Cobalt");
+ params->SetBoolean("context.auxData.isDefault", true);
+ dispatcher_->SendEvent(
+ std::string(kInspectorDomain) + ".executionContextCreated", params);
+
+ command.SendResponse();
+}
+
+void RuntimeAgent::Disable(const Command& command) { command.SendResponse(); }
+
+void RuntimeAgent::CompileScript(const Command& command) {
+ // TODO: Parse the JS without eval-ing it... This is to support:
+ // a) Multi-line input from the devtools console
+ // b) https://developers.google.com/web/tools/chrome-devtools/snippets
+ command.SendResponse();
+}
+
+} // namespace backend
+} // namespace debug
+} // namespace cobalt
diff --git a/src/cobalt/debug/backend/runtime_agent.h b/src/cobalt/debug/backend/runtime_agent.h
new file mode 100644
index 0000000..3be3f37
--- /dev/null
+++ b/src/cobalt/debug/backend/runtime_agent.h
@@ -0,0 +1,58 @@
+// Copyright 2016 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 COBALT_DEBUG_BACKEND_RUNTIME_AGENT_H_
+#define COBALT_DEBUG_BACKEND_RUNTIME_AGENT_H_
+
+#include "cobalt/debug/backend/command_map.h"
+#include "cobalt/debug/backend/debug_dispatcher.h"
+#include "cobalt/debug/command.h"
+#include "cobalt/debug/json_object.h"
+#include "cobalt/dom/window.h"
+
+namespace cobalt {
+namespace debug {
+namespace backend {
+
+// Implements a small part of the the "Runtime" inspector protocol domain with
+// just enough to support console input. When using the V8 JavaScript engine,
+// this class is not needed since the V8 inspector implements the Runtime domain
+// for us.
+class RuntimeAgent {
+ public:
+ RuntimeAgent(DebugDispatcher* dispatcher, dom::Window* window);
+
+ void Thaw(JSONObject agent_state);
+ JSONObject Freeze();
+
+ private:
+ void CompileScript(const Command& command);
+ void Disable(const Command& command);
+ void Enable(const Command& command);
+
+ DebugDispatcher* dispatcher_;
+ dom::Window* window_;
+
+ // Map of member functions implementing commands.
+ CommandMap<RuntimeAgent> commands_;
+
+ // Whether we successfully loaded the agent's JavaScript implementation.
+ bool script_loaded_ = false;
+};
+
+} // namespace backend
+} // namespace debug
+} // namespace cobalt
+
+#endif // COBALT_DEBUG_BACKEND_RUNTIME_AGENT_H_
diff --git a/src/cobalt/debug/debug.gyp b/src/cobalt/debug/debug.gyp
index c4d50ff..a59acd7 100644
--- a/src/cobalt/debug/debug.gyp
+++ b/src/cobalt/debug/debug.gyp
@@ -44,6 +44,8 @@
'backend/render_layer.h',
'backend/render_overlay.cc',
'backend/render_overlay.h',
+ 'backend/runtime_agent.cc',
+ 'backend/runtime_agent.h',
'backend/script_debugger_agent.cc',
'backend/script_debugger_agent.h',
'backend/tracing_agent.cc',
diff --git a/src/cobalt/doc/device_authentication.md b/src/cobalt/doc/device_authentication.md
new file mode 100644
index 0000000..d121237
--- /dev/null
+++ b/src/cobalt/doc/device_authentication.md
@@ -0,0 +1,47 @@
+# Device Authentication
+
+Starting in Cobalt 20, initial URL requests will now have query parameters
+appended to them signed by the platform's secret key, provided to them during
+the certification process. The key must be stored in secure storage on the
+device.
+
+## Message
+
+When constructing the URL for the initial browse request, according to the
+logic in
+[cobalt/browser/device_authentication.cc](../browser/device_authentication.cc),
+it will fetch from the platform a "certification scope" string provided to
+the device during certification. The certification scope will be queried
+by a call to `SbSystemGetProperty(kSbSystemPropertyCertificationScope, ...)`,
+which the platform is expected to implement. Along with the current system
+time, this forms the message that must be signed by the device's secret key.
+
+## Signing
+
+The message defined above must be signed with the HMAC-SHA256 algorithm. The
+resulting digest (encoded as base64), alongside the unencrypted message
+contents, will be appended to the initial URL.
+
+Two choices exists for how platforms can expose the secret key to Cobalt.
+Cobalt will first attempt to have the platform sign the message, and if that
+functionality is not implemented Cobalt will query the platform for the secret
+key and sign the message itself. If neither choice is implemented, then Cobalt
+will log a warning and not append anything to the URL.
+
+### Platform signing
+
+Cobalt will first attempt to use the `SbSystemSignWithCertificationSecretKey()`
+function to sign the message using the secret key. This method is preferred
+since it enables implementations where the key exists only in secure hardware
+and never enters the system's main memory. A reference implementation, which
+depends on BoringSSL exists at
+[starboard/linux/x64x11/internal/system_sign_with_certification_secret_key.cc](../../starboard/linux/x64x11/internal/system_sign_with_certification_secret_key.cc).
+
+### Cobalt signing
+
+If the function `SbSystemSignWithCertificationSecretKey()` is unimplemented (e.g. it returns `false`, as is done in
+[starboard/shared/stub/system_sign_with_certification_secret_key.cc](../../starboard/shared/stub/system_sign_with_certification_secret_key.cc)),
+then Cobalt will instead attempt to retrieve the secret key from the system by
+a call to
+`SbSystemGetProperty(kSbSystemPropertyBase64EncodedCertificationSecret, ...)`,
+and use it to produce the HMAC-SHA256 digest of the message itself.
diff --git a/src/cobalt/doc/performance_tuning.md b/src/cobalt/doc/performance_tuning.md
index 5a7abab..e6d9994 100644
--- a/src/cobalt/doc/performance_tuning.md
+++ b/src/cobalt/doc/performance_tuning.md
@@ -408,11 +408,12 @@
1. The command line option, "--timed_trace=XX" will instruct Cobalt to trace
upon startup, for XX seconds (e.g. "--timed_trace=25"). When completed,
the output will be written to the file `timed_trace.json`.
-2. Using the debug console (hit CTRL+O on a keyboard once or twice), type in the
- command "d.trace()" and hit enter. Cobalt will begin a trace. After
- some time has passed (and presumably you have performed some actions), you
- can open the debug console again and type "d.trace()" again to end the trace.
- The trace output will be written to the file `triggered_trace.json`.
+2. Using the debug console (hit CTRL+O on a keyboard once or twice), type in
+ the command "h5vcc.traceEvent.start()" and hit enter. Cobalt will begin a
+ trace. After some time has passed (and presumably you have performed some
+ actions), you can open the debug console again and type
+ "h5vcc.traceEvent.stop()" again to end the trace.
+ The trace output will be written to the file `h5vcc_trace_event.json`.
The directory the output files will be placed within is the directory that the
Starboard function `SbSystemGetPath()` returns with a `path_id` of
diff --git a/src/cobalt/doc/web_debugging.md b/src/cobalt/doc/web_debugging.md
new file mode 100644
index 0000000..ca1d90d
--- /dev/null
+++ b/src/cobalt/doc/web_debugging.md
@@ -0,0 +1,176 @@
+# Cobalt Web Debugging
+
+## Overview
+
+Cobalt includes the [Chrome
+DevTools](https://developers.google.com/web/tools/chrome-devtools/) frontend for
+debugging web apps. It's available in the **20.lts.1+** and newer branches of
+Cobalt.
+
+Cobalt only supports a subset of what DevTools can do, but we make a point of
+hiding UI elements that don't work so everything you see in the UI should work.
+As we get more implemented in the backend the respective UI will be enabled in
+the frontend.
+
+The following panels are supported:
+
+* **Elements** - view the DOM tree and CSS styles
+* **Console** - JavaScript "command line" and logging output
+* **Sources** - interactive JavaScript debugging
+* **Performance** - profile JavaScript execution
+
+> Cobalt DevTools relies heavily on V8 for its backend implementation. When
+> Cobalt is built with MozJs only basic Elements and Console functionality is
+> supported, but the UI remains the same as when building with V8 and some
+> things don't work.
+
+## Using DevTools
+
+The DevTools frontend is loaded in Chrome from a small HTTP server built into
+**non-gold** Cobalt. Even though it looks mostly the same as Chrome's inspector
+(it's built from the same source code), Cobalt's DevTools is a separate app,
+and Cobalt is *not* a remote target that you can debug with Chrome's built-in
+debugger.
+
+After building and running Cobalt as usual, use Chrome on your desktop to load
+the start page from port 9222 on the target device where Cobalt is running.
+Click through to the only inspectable page shown on the start page.
+
+> If you have trouble connecting:
+> * Ensure you have an IP route from your desktop to the target device that
+> allows traffic on the debugging port (default 9222).
+> * If both IPv4 andIPv6 networks are available, the debug server will prefer to
+> bind to the IPv4 network interface.
+> * If you are running Cobalt locally on your desktop, then use your actual IP
+> address (not localhost nor 127.0.0.1).
+
+If you're not sure what IP address to use, look in the terminal log output for a
+message telling you the URL of Cobalt's DevTools (which you may be able to open
+with a ctrl-click in many terminal programs):
+
+```
+---------------------------------
+ Connect to the web debugger at:
+ http://192.168.1.1:9222
+---------------------------------
+```
+
+### Wait for web debugger
+
+If you're debugging the initial page as it's loading you need use the
+`--wait_for_web_debugger` switch to tell Cobalt to wait until you attach
+DevTools before actually loading the initial URL:
+
+```
+out/linux-x64x11_devel/cobalt --wait_for_web_debugger --url="http://test.example.com"
+```
+
+When this switch is specified, Cobalt will appear to hang with just a black
+window until you load DevTools. In the terminal log output you'll see that
+Cobalt is waiting with message like:
+
+```
+-------------------------------------
+ Waiting for web debugger to connect
+-------------------------------------
+```
+
+If you're debugging a page in a series of redirects, you can specify a number to
+make Cobalt wait before loading the Nth page. If no number is specified with the
+switch, the default value is 1 to wait before the initial page load. For
+example:
+
+```
+out/linux-x64x11_devel/cobalt --wait_for_web_debugger=2 --url="http://test.example.com"
+```
+
+## Panels
+
+### Elements
+
+The Elements panel displays the DOM as a tree with expandable nodes to dig into
+it. The right side bar shows the CSS styles affecting the selected node in the
+DOM. The *Styles* tab shows matching rules, inherited rules, and inline style.
+The *Computed* tab shows the computed style for the selected node. The box model
+properties are shown graphically in both the *Styles* and *Computed* tabs.
+
+> Cobalt currently only supports a read-only view of the DOM and CSS.
+
+Chrome docs:
+
+* https://developers.google.com/web/tools/chrome-devtools/dom/
+* https://developers.google.com/web/tools/chrome-devtools/css/
+
+### Console
+
+Cobalt has two consoles:
+* Overlay console in Cobalt itself (shown with ctrl-O or F1).
+* Remote console shown in a connected DevTools session.
+
+Both console UIs show messages logged from JavaScript (with `console.log()`,
+etc.), and have a command line to evaluate arbitrary JavaScript in the context
+of the page being debugged.
+
+The overlay console also shows non-JavaScript logging from Cobalt itself, which
+is mostly interesting to Cobalt developers rather than web app developers.
+
+The console in DevTools is a richer UI that can show evaluated objects with an
+expander so you can dig in to their properties. Logging from JavaScript with
+`console.log()` can show objects and exceptions as well, in contrast to the
+text-only messages shown in the console overlay.
+
+> There may be some things (e.g. timers) that still need to be hooked up to the
+> V8 backend, so please file a bug if something isn't working as expected.
+
+> When built with MozJs instead of V8, the functionality of the console is
+> limited to showing only text log messages.
+
+Chrome docs:
+
+* https://developers.google.com/web/tools/chrome-devtools/console/
+
+### Sources
+
+Source-level JavaScript debugging can be done on the Sources panel. You can
+inspect sources, set breakpoints, see call stacks and scoped variables, add
+watch expressions, and all that good stuff.
+
+> Source debugging only works when Cobalt is built with V8.
+
+Chrome docs:
+
+* https://developers.google.com/web/tools/chrome-devtools/javascript/
+
+### Performance
+
+The Performance panel allows you to record a profile of sampled call stacks
+while Cobalt is running your JavaScript code. The recorded profile is displayed
+in a flame chart showing the relationship and timing of function calls.
+
+> Performance profiling only works when Cobalt is built with V8, and the
+> platform implements the `SbThreadSampler` Starboard API.
+
+> The profiler can't currently identify which is the main thread, but you can
+> easily see it as the one with the most events.
+
+Chrome docs:
+
+* https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/
+
+## Tips
+
+* Don't open Cobalt's console overlay before attaching the remote DevTools as
+ that can cause the latter not to work.
+
+* You can make Cobalt reload the current page by pressing F5 in the Cobalt
+ window, or ctrl-R in the remote DevTools. This may be useful for debugging
+ startup code in the web app. It may also help in case some source file is
+ not appearing in the DevTools Sources panel.
+
+* The DevTools frontend remembers your breakpoints, so if you need to restart
+ Cobalt completely you can just kill it with ctrl-C in the terminal where you
+ launched it and re-run it. Then click the *Reconnect DevTools* button shown
+ in the DevTools UI or refresh the page to reload the DevTools UI.
+
+* You can use the `--remote_debugging_port` command line switch to specify a
+ remote debugging port other than the default 9222.
diff --git a/src/cobalt/dom/c_val_key_list.cc b/src/cobalt/dom/c_val_key_list.cc
deleted file mode 100644
index 859f662..0000000
--- a/src/cobalt/dom/c_val_key_list.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2016 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 "cobalt/dom/c_val_key_list.h"
-
-#include <algorithm>
-#include <iterator>
-
-namespace cobalt {
-namespace dom {
-
-CValKeyList::CValKeyList() {}
-
-base::Optional<std::string> CValKeyList::Item(uint32 item) {
- if (item < keys_.size()) {
- return keys_[item];
- }
- return base::nullopt;
-}
-
-uint32 CValKeyList::length() { return static_cast<uint32>(keys_.size()); }
-
-int32 CValKeyList::IndexOf(const std::string& key) {
- auto iter = std::find(keys_.begin(), keys_.end(), key);
- return iter == keys_.end()
- ? -1
- : static_cast<int32>(std::distance(keys_.begin(), iter));
-}
-
-void CValKeyList::AppendKey(const std::string& key) { keys_.push_back(key); }
-
-} // namespace dom
-} // namespace cobalt
diff --git a/src/cobalt/dom/c_val_key_list.h b/src/cobalt/dom/c_val_key_list.h
deleted file mode 100644
index 1eb3cbb..0000000
--- a/src/cobalt/dom/c_val_key_list.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 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 COBALT_DOM_C_VAL_KEY_LIST_H_
-#define COBALT_DOM_C_VAL_KEY_LIST_H_
-
-#include <string>
-#include <vector>
-
-#include "base/optional.h"
-#include "cobalt/script/wrappable.h"
-
-namespace cobalt {
-namespace dom {
-
-class CValKeyList : public script::Wrappable {
- public:
- CValKeyList();
-
- base::Optional<std::string> Item(uint32 item);
- uint32 length();
- int32 IndexOf(const std::string& key);
-
- void AppendKey(const std::string& key);
-
- DEFINE_WRAPPABLE_TYPE(CValKeyList);
-
- private:
- std::vector<std::string> keys_;
-
- DISALLOW_COPY_AND_ASSIGN(CValKeyList);
-};
-
-} // namespace dom
-} // namespace cobalt
-
-#endif // COBALT_DOM_C_VAL_KEY_LIST_H_
diff --git a/src/cobalt/dom/c_val_view.cc b/src/cobalt/dom/c_val_view.cc
index 577eecf..37c08c1 100644
--- a/src/cobalt/dom/c_val_view.cc
+++ b/src/cobalt/dom/c_val_view.cc
@@ -14,23 +14,21 @@
#include "cobalt/dom/c_val_view.h"
-#include <set>
+#include <algorithm>
#include "cobalt/base/c_val.h"
+#include "cobalt/base/polymorphic_downcast.h"
+#include "cobalt/dom/dom_settings.h"
namespace cobalt {
namespace dom {
CValView::CValView() {}
-scoped_refptr<CValKeyList> CValView::Keys() {
- scoped_refptr<CValKeyList> key_list(new CValKeyList);
- typedef std::set<std::string> CValKeySet;
- CValKeySet key_set = base::CValManager::GetInstance()->GetOrderedCValNames();
- for (CValKeySet::iterator key_iter = key_set.begin();
- key_iter != key_set.end(); ++key_iter) {
- key_list->AppendKey(*key_iter);
- }
+script::Sequence<std::string> CValView::Keys() {
+ auto key_set = base::CValManager::GetInstance()->GetOrderedCValNames();
+ script::Sequence<std::string> key_list;
+ std::copy(key_set.begin(), key_set.end(), std::back_inserter(key_list));
return key_list;
}
diff --git a/src/cobalt/dom/c_val_view.h b/src/cobalt/dom/c_val_view.h
index cb1565b..50905ee 100644
--- a/src/cobalt/dom/c_val_view.h
+++ b/src/cobalt/dom/c_val_view.h
@@ -19,8 +19,8 @@
#include "base/memory/ref_counted.h"
#include "base/optional.h"
-#include "cobalt/dom/c_val_key_list.h"
#include "cobalt/script/wrappable.h"
+#include "cobalt/script/sequence.h"
namespace cobalt {
namespace dom {
@@ -29,7 +29,7 @@
public:
CValView();
- scoped_refptr<CValKeyList> Keys();
+ script::Sequence<std::string> Keys();
base::Optional<std::string> GetValue(const std::string& name);
std::string GetPrettyValue(const std::string& name);
diff --git a/src/cobalt/dom/c_val_view.idl b/src/cobalt/dom/c_val_view.idl
index dddb584..7dbcbc2 100644
--- a/src/cobalt/dom/c_val_view.idl
+++ b/src/cobalt/dom/c_val_view.idl
@@ -14,7 +14,7 @@
// This is a non-standard API, used to access Cobalt's CVal system.
interface CValView {
- [NewObject] CValKeyList keys();
+ [NewObject] sequence<DOMString> keys();
DOMString? getValue(DOMString name);
DOMString getPrettyValue(DOMString name);
};
diff --git a/src/cobalt/dom/document.cc b/src/cobalt/dom/document.cc
index 09f158f..f14bfa4 100644
--- a/src/cobalt/dom/document.cc
+++ b/src/cobalt/dom/document.cc
@@ -927,7 +927,7 @@
scoped_refptr<HTMLHtmlElement> current_html = html();
if (current_html) {
- current_html->ClearRuleMatchingStateOnElementAndDescendants();
+ current_html->ClearRuleMatchingStateOnElementAndSiblingsAndDescendants();
}
is_selector_tree_dirty_ = false;
diff --git a/src/cobalt/dom/dom.gyp b/src/cobalt/dom/dom.gyp
index f20646d..569d9eb 100644
--- a/src/cobalt/dom/dom.gyp
+++ b/src/cobalt/dom/dom.gyp
@@ -39,8 +39,6 @@
'blob_property_bag.h',
'buffer_source.cc',
'buffer_source.h',
- 'c_val_key_list.cc',
- 'c_val_key_list.h',
'c_val_view.cc',
'c_val_view.h',
'camera_3d.cc',
diff --git a/src/cobalt/dom/element.cc b/src/cobalt/dom/element.cc
index 04aff96..2c576e1 100644
--- a/src/cobalt/dom/element.cc
+++ b/src/cobalt/dom/element.cc
@@ -32,8 +32,10 @@
#include "cobalt/dom/html_element_context.h"
#include "cobalt/dom/mutation_reporter.h"
#include "cobalt/dom/named_node_map.h"
+#include "cobalt/dom/node.h"
#include "cobalt/dom/parser.h"
#include "cobalt/dom/pointer_state.h"
+#include "cobalt/dom/rule_matching.h"
#include "cobalt/dom/serializer.h"
#include "cobalt/dom/text.h"
#include "cobalt/math/rect_f.h"
@@ -106,6 +108,36 @@
return HasAttribute(name);
}
+bool Element::Matches(const std::string& selectors,
+ script::ExceptionState* exception_state) {
+ TRACK_MEMORY_SCOPE("DOM");
+ // Referenced from:
+ // https://dom.spec.whatwg.org/#dom-element-matches
+
+ // 1. Let s be the result of parse a selector from selectors.
+ cssom::CSSParser* css_parser =
+ this->node_document()->html_element_context()->css_parser();
+ scoped_refptr<cssom::CSSRule> css_rule =
+ css_parser->ParseRule(selectors + " {}", this->GetInlineSourceLocation());
+
+ // 2. If s is failure, throw a "SyntaxError" DOMException.
+ if (!css_rule) {
+ DOMException::Raise(dom::DOMException::kSyntaxErr, exception_state);
+ return false;
+ }
+ scoped_refptr<cssom::CSSStyleRule> css_style_rule =
+ css_rule->AsCSSStyleRule();
+ if (!css_style_rule) {
+ DOMException::Raise(dom::DOMException::kSyntaxErr, exception_state);
+ return false;
+ }
+
+ // 3. Return true if the result of match a selector against an element,
+ // using s, element, and :scope element context object, returns success,
+ // and false otherwise.
+ return MatchRuleAndElement(css_style_rule, this);
+}
+
scoped_refptr<NamedNodeMap> Element::attributes() {
TRACK_MEMORY_SCOPE("DOM");
scoped_refptr<NamedNodeMap> named_node_map = named_node_map_.get();
diff --git a/src/cobalt/dom/element.h b/src/cobalt/dom/element.h
index d37f9bc..a0c50e2 100644
--- a/src/cobalt/dom/element.h
+++ b/src/cobalt/dom/element.h
@@ -99,6 +99,7 @@
const std::string& name) const;
bool HasAttributeNS(const std::string& namespace_uri,
const std::string& name) const;
+ bool Matches(const std::string& selectors,script::ExceptionState* exception_state);
scoped_refptr<HTMLCollection> GetElementsByTagName(
const std::string& local_name) const;
diff --git a/src/cobalt/dom/element.idl b/src/cobalt/dom/element.idl
index f6a0ca4..af71ed6 100644
--- a/src/cobalt/dom/element.idl
+++ b/src/cobalt/dom/element.idl
@@ -29,6 +29,7 @@
boolean hasAttribute(DOMString name);
boolean hasAttributeNS(DOMString namespace_uri, DOMString localName);
DOMString? getAttributeNS(DOMString namespace_uri, DOMString name);
+ [RaisesException] boolean matches(DOMString selectors);
HTMLCollection getElementsByTagName(DOMString localName);
HTMLCollection getElementsByClassName(DOMString classNames);
};
diff --git a/src/cobalt/dom/element_intersection_observer_module.cc b/src/cobalt/dom/element_intersection_observer_module.cc
index 01fb8a3..d7ce51b 100644
--- a/src/cobalt/dom/element_intersection_observer_module.cc
+++ b/src/cobalt/dom/element_intersection_observer_module.cc
@@ -14,6 +14,8 @@
#include "cobalt/dom/element_intersection_observer_module.h"
+#include <algorithm>
+
#include "cobalt/dom/document.h"
#include "cobalt/dom/dom_rect_read_only.h"
#include "cobalt/dom/element.h"
@@ -29,11 +31,10 @@
void ElementIntersectionObserverModule::RegisterIntersectionObserverForRoot(
IntersectionObserver* observer) {
- for (auto it = root_registered_intersection_observers_.begin();
- it != root_registered_intersection_observers_.end(); ++it) {
- if (*it == observer) {
- return;
- }
+ auto it = std::find(root_registered_intersection_observers_.begin(),
+ root_registered_intersection_observers_.end(), observer);
+ if (it != root_registered_intersection_observers_.end()) {
+ return;
}
root_registered_intersection_observers_.push_back(
base::WrapRefCounted(observer));
@@ -50,13 +51,12 @@
void ElementIntersectionObserverModule::UnregisterIntersectionObserverForRoot(
IntersectionObserver* observer) {
- for (auto it = root_registered_intersection_observers_.begin();
- it != root_registered_intersection_observers_.end(); ++it) {
- if (*it == observer) {
- root_registered_intersection_observers_.erase(it);
- InvalidateLayoutBoxesForElement();
- return;
- }
+ auto it = std::find(root_registered_intersection_observers_.begin(),
+ root_registered_intersection_observers_.end(), observer);
+ if (it != root_registered_intersection_observers_.end()) {
+ root_registered_intersection_observers_.erase(it);
+ InvalidateLayoutBoxesForElement();
+ return;
}
NOTREACHED()
<< "Did not find an intersection observer to unregister for the root.";
@@ -64,11 +64,11 @@
void ElementIntersectionObserverModule::RegisterIntersectionObserverForTarget(
IntersectionObserver* observer) {
- for (auto it = target_registered_intersection_observers_.begin();
- it != target_registered_intersection_observers_.end(); ++it) {
- if (*it == observer) {
- return;
- }
+ auto it =
+ std::find(target_registered_intersection_observers_.begin(),
+ target_registered_intersection_observers_.end(), observer);
+ if (it != target_registered_intersection_observers_.end()) {
+ return;
}
target_registered_intersection_observers_.push_back(
base::WrapRefCounted(observer));
@@ -79,14 +79,14 @@
void ElementIntersectionObserverModule::UnregisterIntersectionObserverForTarget(
IntersectionObserver* observer) {
- for (auto it = target_registered_intersection_observers_.begin();
- it != target_registered_intersection_observers_.end(); ++it) {
- if (*it == observer) {
- target_registered_intersection_observers_.erase(it);
- RemoveLayoutTargetForObserver(observer);
- InvalidateLayoutBoxesForElement();
- return;
- }
+ auto it =
+ std::find(target_registered_intersection_observers_.begin(),
+ target_registered_intersection_observers_.end(), observer);
+ if (it != target_registered_intersection_observers_.end()) {
+ target_registered_intersection_observers_.erase(it);
+ RemoveLayoutTargetForObserver(observer);
+ InvalidateLayoutBoxesForElement();
+ return;
}
NOTREACHED()
<< "Did not find an intersection observer to unregister for the target.";
diff --git a/src/cobalt/dom/eme/media_key_session.cc b/src/cobalt/dom/eme/media_key_session.cc
index f20e528..8cf2253 100644
--- a/src/cobalt/dom/eme/media_key_session.cc
+++ b/src/cobalt/dom/eme/media_key_session.cc
@@ -41,10 +41,8 @@
: ALLOW_THIS_IN_INITIALIZER_LIST(event_queue_(this)),
drm_system_(drm_system),
drm_system_session_(drm_system->CreateSession(
-#if SB_HAS(DRM_KEY_STATUSES)
base::Bind(&MediaKeySession::OnSessionUpdateKeyStatuses,
base::AsWeakPtr(this))
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_HAS(DRM_SESSION_CLOSED)
,
base::Bind(&MediaKeySession::OnSessionClosed,
diff --git a/src/cobalt/dom/html_element.cc b/src/cobalt/dom/html_element.cc
index 636ef72..c52faae8 100644
--- a/src/cobalt/dom/html_element.cc
+++ b/src/cobalt/dom/html_element.cc
@@ -910,6 +910,24 @@
}
}
+void HTMLElement::ClearRuleMatchingStateOnElementAndSiblingsAndDescendants() {
+ HTMLElement::ClearRuleMatchingStateOnElementAndDescendants();
+ for (Element* element = previous_element_sibling(); element;
+ element = element->previous_element_sibling()) {
+ HTMLElement* html_element = element->AsHTMLElement();
+ if (html_element) {
+ html_element->ClearRuleMatchingStateOnElementAndDescendants();
+ }
+ }
+ for (Element* element = next_element_sibling(); element;
+ element = element->next_element_sibling()) {
+ HTMLElement* html_element = element->AsHTMLElement();
+ if (html_element) {
+ html_element->ClearRuleMatchingStateOnElementAndDescendants();
+ }
+ }
+}
+
void HTMLElement::InvalidateMatchingRulesRecursively() {
InvalidateMatchingRulesRecursivelyInternal(true /*is_initial_element*/);
}
@@ -1327,6 +1345,13 @@
// Set the focus item for the UI navigation system.
if (ui_nav_item_ && !ui_nav_item_->IsContainer()) {
+ // Only navigation items attached to the root container are interactable.
+ // If the item is not registered with a container, then force a layout to
+ // connect items to their containers and eventually to the root container.
+ if (!ui_nav_item_->GetContainerItem()) {
+ // UI navigation items are updated as part of generating the render tree.
+ node_document()->DoSynchronousLayoutAndGetRenderTree();
+ }
ui_nav_item_->Focus();
}
}
diff --git a/src/cobalt/dom/html_element.h b/src/cobalt/dom/html_element.h
index abb2f2e..5cf5a48 100644
--- a/src/cobalt/dom/html_element.h
+++ b/src/cobalt/dom/html_element.h
@@ -233,6 +233,7 @@
void ClearRuleMatchingStateOnElementAndAncestors(
bool invalidate_tree_matching_rules);
void ClearRuleMatchingStateOnElementAndDescendants();
+ void ClearRuleMatchingStateOnElementAndSiblingsAndDescendants();
// Returns the cached matching rules of this element.
cssom::RulesWithCascadePrecedence* matching_rules() {
diff --git a/src/cobalt/dom/rule_matching.cc b/src/cobalt/dom/rule_matching.cc
index b38802c..c58f6e6 100644
--- a/src/cobalt/dom/rule_matching.cc
+++ b/src/cobalt/dom/rule_matching.cc
@@ -356,18 +356,6 @@
return selector_matcher.element();
}
-bool MatchRuleAndElement(cssom::CSSStyleRule* rule, Element* element) {
- for (cssom::Selectors::const_iterator selector_iterator =
- rule->selectors().begin();
- selector_iterator != rule->selectors().end(); ++selector_iterator) {
- DCHECK(*selector_iterator);
- if (MatchSelectorAndElement(selector_iterator->get(), element, true)) {
- return true;
- }
- }
- return false;
-}
-
void GatherCandidateNodesFromSelectorNodesMap(
cssom::SimpleSelectorType simple_selector_type,
cssom::CombinatorType combinator_type,
@@ -960,6 +948,18 @@
return NULL;
}
+bool MatchRuleAndElement(cssom::CSSStyleRule* rule, Element* element) {
+ for (cssom::Selectors::const_iterator selector_iterator =
+ rule->selectors().begin();
+ selector_iterator != rule->selectors().end(); ++selector_iterator) {
+ DCHECK(*selector_iterator);
+ if (MatchSelectorAndElement(selector_iterator->get(), element, true)) {
+ return true;
+ }
+ }
+ return false;
+}
+
scoped_refptr<NodeList> QuerySelectorAll(Node* node,
const std::string& selectors,
cssom::CSSParser* css_parser) {
diff --git a/src/cobalt/dom/rule_matching.h b/src/cobalt/dom/rule_matching.h
index 4b53a6b..b473c27 100644
--- a/src/cobalt/dom/rule_matching.h
+++ b/src/cobalt/dom/rule_matching.h
@@ -19,6 +19,7 @@
#include "base/memory/ref_counted.h"
#include "cobalt/cssom/css_parser.h"
+#include "cobalt/cssom/css_style_rule.h"
namespace cobalt {
namespace dom {
@@ -48,6 +49,9 @@
const std::string& selectors,
cssom::CSSParser* css_parser);
+// Returns true if any of the selectors in the rule matches the given element.
+bool MatchRuleAndElement(cssom::CSSStyleRule* rule, Element* element);
+
} // namespace dom
} // namespace cobalt
diff --git a/src/cobalt/dom/rule_matching_test.cc b/src/cobalt/dom/rule_matching_test.cc
index 84a5a88..18531c3 100644
--- a/src/cobalt/dom/rule_matching_test.cc
+++ b/src/cobalt/dom/rule_matching_test.cc
@@ -35,12 +35,17 @@
#include "cobalt/dom/testing/stub_window.h"
#include "cobalt/dom_parser/parser.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "cobalt/script/script_exception.h"
+#include "cobalt/script/testing/mock_exception_state.h"
using cobalt::cssom::ViewportSize;
namespace cobalt {
namespace dom {
+using script::testing::MockExceptionState;
+using ::testing::StrictMock;
+
class RuleMatchingTest : public ::testing::Test {
protected:
RuleMatchingTest()
@@ -776,6 +781,13 @@
EXPECT_EQ(0, node_list->length());
}
+TEST_F(RuleMatchingTest, ElementMatches) {
+ scoped_refptr<Element> root = new Element(document_, base::Token("root"));
+ StrictMock<MockExceptionState> exception_state;
+ EXPECT_TRUE(root->Matches("root", &exception_state));
+ EXPECT_FALSE(root->Matches("r", &exception_state));
+}
+
TEST_F(RuleMatchingTest, StyleElementRemoval) {
head_->set_inner_html("<style>* {}</style>");
body_->set_inner_html("<div/>");
diff --git a/src/cobalt/h5vcc/h5vcc.cc b/src/cobalt/h5vcc/h5vcc.cc
index 701d785..5ba9959 100644
--- a/src/cobalt/h5vcc/h5vcc.cc
+++ b/src/cobalt/h5vcc/h5vcc.cc
@@ -33,7 +33,6 @@
#if defined(COBALT_ENABLE_SSO)
sso_ = new H5vccSso();
#endif
- storage_ = new H5vccStorage(settings.network_module);
system_ = new H5vccSystem();
trace_event_ = new H5vccTraceEvent();
}
@@ -47,7 +46,6 @@
tracer->Trace(runtime_);
tracer->Trace(settings_);
tracer->Trace(sso_);
- tracer->Trace(storage_);
tracer->Trace(system_);
tracer->Trace(trace_event_);
}
diff --git a/src/cobalt/h5vcc/h5vcc.gyp b/src/cobalt/h5vcc/h5vcc.gyp
index 18a74fe..3378152 100644
--- a/src/cobalt/h5vcc/h5vcc.gyp
+++ b/src/cobalt/h5vcc/h5vcc.gyp
@@ -48,8 +48,6 @@
'h5vcc_runtime_event_target.h',
'h5vcc_settings.cc',
'h5vcc_settings.h',
- 'h5vcc_storage.cc',
- 'h5vcc_storage.h',
'h5vcc_system.cc',
'h5vcc_system.h',
'h5vcc_trace_event.cc',
diff --git a/src/cobalt/h5vcc/h5vcc.h b/src/cobalt/h5vcc/h5vcc.h
index d87120f..210f29e 100644
--- a/src/cobalt/h5vcc/h5vcc.h
+++ b/src/cobalt/h5vcc/h5vcc.h
@@ -28,7 +28,6 @@
#include "cobalt/h5vcc/h5vcc_runtime.h"
#include "cobalt/h5vcc/h5vcc_settings.h"
#include "cobalt/h5vcc/h5vcc_sso.h"
-#include "cobalt/h5vcc/h5vcc_storage.h"
#include "cobalt/h5vcc/h5vcc_system.h"
#include "cobalt/h5vcc/h5vcc_trace_event.h"
#include "cobalt/script/wrappable.h"
@@ -69,7 +68,6 @@
#if defined(COBALT_ENABLE_SSO)
const scoped_refptr<H5vccSso>& sso() const { return sso_; }
#endif
- const scoped_refptr<H5vccStorage>& storage() const { return storage_; }
const scoped_refptr<H5vccSystem>& system() const { return system_; }
const scoped_refptr<H5vccTraceEvent>& trace_event() const {
return trace_event_;
@@ -87,7 +85,6 @@
scoped_refptr<H5vccRuntime> runtime_;
scoped_refptr<H5vccSettings> settings_;
scoped_refptr<H5vccSso> sso_;
- scoped_refptr<H5vccStorage> storage_;
scoped_refptr<H5vccSystem> system_;
scoped_refptr<H5vccTraceEvent> trace_event_;
diff --git a/src/cobalt/h5vcc/h5vcc.idl b/src/cobalt/h5vcc/h5vcc.idl
index 5155763..ed7818d 100644
--- a/src/cobalt/h5vcc/h5vcc.idl
+++ b/src/cobalt/h5vcc/h5vcc.idl
@@ -18,9 +18,9 @@
// APIs which allow clients to call non-standard native functions that we
// expose.
//
-// For example we provide a h5vcc.storage.ClearCookies(), which can empty the
-// cookie jar in response to the user's request. Other H5vcc modules expose
-// audio capabilities about the platform, or run an in-app DIAL server.
+// For example we provide a h5vcc.accessibility.textToSpeech, which tells
+// whether the platform supports text-to-speech capability. Other H5vcc
+// modules can run an in-app DIAL server or expose availables CVals.
//
// The H5vcc node should just be a collection of readonly sub-nodes.
// This is created by the BrowserModule and passed directly to the Window
@@ -37,7 +37,6 @@
readonly attribute H5vccSettings settings;
[Conditional=COBALT_ENABLE_SSO]
readonly attribute H5vccSso sso;
- readonly attribute H5vccStorage storage;
readonly attribute H5vccSystem system;
readonly attribute H5vccTraceEvent traceEvent;
};
diff --git a/src/cobalt/h5vcc/h5vcc_accessibility.cc b/src/cobalt/h5vcc/h5vcc_accessibility.cc
index 9c4a8ba..29fbc3d 100644
--- a/src/cobalt/h5vcc/h5vcc_accessibility.cc
+++ b/src/cobalt/h5vcc/h5vcc_accessibility.cc
@@ -16,9 +16,6 @@
#include "base/command_line.h"
#include "base/message_loop/message_loop.h"
-#include "cobalt/accessibility/starboard_tts_engine.h"
-#include "cobalt/accessibility/tts_engine.h"
-#include "cobalt/accessibility/tts_logger.h"
#include "cobalt/base/accessibility_settings_changed_event.h"
#include "cobalt/browser/switches.h"
#include "starboard/accessibility.h"
@@ -40,20 +37,6 @@
return false;
}
-#if SB_HAS(SPEECH_SYNTHESIS)
-bool IsTextToSpeechEnabled() {
- // Check if the tts feature is enabled in Starboard.
- SbAccessibilityTextToSpeechSettings tts_settings = {0};
- // Check platform settings.
- if (SbAccessibilityGetTextToSpeechSettings(&tts_settings)) {
- return tts_settings.has_text_to_speech_setting &&
- tts_settings.is_text_to_speech_enabled;
- }
-
- return false;
-}
-#endif // SB_HAS(SPEECH_SYNTHESIS)
-
} // namespace
H5vccAccessibility::H5vccAccessibility(
@@ -67,26 +50,6 @@
event_dispatcher_->AddEventCallback(
base::AccessibilitySettingsChangedEvent::TypeId(),
on_application_event_callback_);
- if (ShouldForceTextToSpeech()) {
-#if SB_HAS(SPEECH_SYNTHESIS)
- // Create a StarboardTTSEngine if the platform has speech synthesis.
- tts_engine_.reset(new accessibility::StarboardTTSEngine());
-#else
- tts_engine_.reset(new accessibility::TTSLogger());
-#endif
- }
-
-#if SB_HAS(SPEECH_SYNTHESIS)
- if (!tts_engine_ && IsTextToSpeechEnabled()) {
- // Create a StarboardTTSEngine if TTS is enabled.
- tts_engine_.reset(new accessibility::StarboardTTSEngine());
- }
-#endif
-
- if (tts_engine_) {
- screen_reader_.reset(new accessibility::ScreenReader(
- window->document(), tts_engine_.get(), mutation_observer_task_manager));
- }
}
H5vccAccessibility::~H5vccAccessibility() {
@@ -95,16 +58,12 @@
on_application_event_callback_);
}
-bool H5vccAccessibility::built_in_screen_reader() const {
- return screen_reader_ && screen_reader_->enabled();
-}
+bool H5vccAccessibility::built_in_screen_reader() const { return false; }
void H5vccAccessibility::set_built_in_screen_reader(bool value) {
- if (!screen_reader_) {
+ if (value) {
LOG(WARNING) << "h5vcc.accessibility.builtInScreenReader: not available";
- return;
}
- screen_reader_->set_enabled(value);
}
bool H5vccAccessibility::high_contrast_text() const {
diff --git a/src/cobalt/h5vcc/h5vcc_accessibility.h b/src/cobalt/h5vcc/h5vcc_accessibility.h
index a3cc95f..f3b5c45 100644
--- a/src/cobalt/h5vcc/h5vcc_accessibility.h
+++ b/src/cobalt/h5vcc/h5vcc_accessibility.h
@@ -18,8 +18,6 @@
#include <memory>
#include "base/message_loop/message_loop.h"
-#include "cobalt/accessibility/screen_reader.h"
-#include "cobalt/accessibility/tts_engine.h"
#include "cobalt/base/event_dispatcher.h"
#include "cobalt/dom/window.h"
#include "cobalt/script/callback_function.h"
@@ -65,8 +63,6 @@
base::EventDispatcher* event_dispatcher_;
std::unique_ptr<H5vccAccessibilityCallbackReference>
high_contrast_text_listener_;
- std::unique_ptr<accessibility::TTSEngine> tts_engine_;
- std::unique_ptr<accessibility::ScreenReader> screen_reader_;
DISALLOW_COPY_AND_ASSIGN(H5vccAccessibility);
};
diff --git a/src/cobalt/h5vcc/h5vcc_storage.cc b/src/cobalt/h5vcc/h5vcc_storage.cc
deleted file mode 100644
index 8bc8c5d..0000000
--- a/src/cobalt/h5vcc/h5vcc_storage.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2015 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 "cobalt/h5vcc/h5vcc_storage.h"
-
-#include "cobalt/storage/storage_manager.h"
-#include "net/url_request/url_request_context.h"
-
-namespace cobalt {
-namespace h5vcc {
-
-H5vccStorage::H5vccStorage(network::NetworkModule* network_module)
- : network_module_(network_module) {}
-
-void H5vccStorage::ClearCookies() {
- net::CookieStore* cookie_store =
- network_module_->url_request_context()->cookie_store();
- auto* cookie_monster = static_cast<net::CookieMonster*>(cookie_store);
- network_module_->task_runner()->PostBlockingTask(
- FROM_HERE,
- base::Bind(&net::CookieMonster::DeleteAllMatchingInfoAsync,
- base::Unretained(cookie_monster), net::CookieDeletionInfo(),
- base::Passed(net::CookieStore::DeleteCallback())));
-}
-
-void H5vccStorage::Flush(const base::Optional<bool>& sync) {
- if (sync.value_or(false) == true) {
- DLOG(WARNING) << "Synchronous flush is not supported.";
- }
-
- network_module_->storage_manager()->FlushNow(base::Closure());
-}
-
-bool H5vccStorage::GetCookiesEnabled() {
- return network_module_->network_delegate()->cookies_enabled();
-}
-
-void H5vccStorage::SetCookiesEnabled(bool enabled) {
- network_module_->network_delegate()->set_cookies_enabled(enabled);
-}
-
-} // namespace h5vcc
-} // namespace cobalt
diff --git a/src/cobalt/h5vcc/h5vcc_storage.h b/src/cobalt/h5vcc/h5vcc_storage.h
deleted file mode 100644
index 613f024..0000000
--- a/src/cobalt/h5vcc/h5vcc_storage.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2015 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 COBALT_H5VCC_H5VCC_STORAGE_H_
-#define COBALT_H5VCC_H5VCC_STORAGE_H_
-
-#include "base/optional.h"
-#include "cobalt/network/network_module.h"
-#include "cobalt/script/wrappable.h"
-
-namespace cobalt {
-namespace h5vcc {
-
-class H5vccStorage : public script::Wrappable {
- public:
- explicit H5vccStorage(network::NetworkModule* network_module);
- void ClearCookies();
- void Flush(const base::Optional<bool>& sync);
- bool GetCookiesEnabled();
- void SetCookiesEnabled(bool enabled);
-
- DEFINE_WRAPPABLE_TYPE(H5vccStorage);
-
- private:
- network::NetworkModule* network_module_;
-
- DISALLOW_COPY_AND_ASSIGN(H5vccStorage);
-};
-
-} // namespace h5vcc
-} // namespace cobalt
-
-#endif // COBALT_H5VCC_H5VCC_STORAGE_H_
diff --git a/src/cobalt/h5vcc/h5vcc_storage.idl b/src/cobalt/h5vcc/h5vcc_storage.idl
deleted file mode 100644
index 7a30dec..0000000
--- a/src/cobalt/h5vcc/h5vcc_storage.idl
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2015 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.
-
-interface H5vccStorage {
- void clearCookies();
- // We don't support synchronous flush, this is legacy.
- void flush(optional boolean sync = false);
- boolean getCookiesEnabled();
- void setCookiesEnabled(boolean value);
-};
diff --git a/src/cobalt/layout/block_container_box.cc b/src/cobalt/layout/block_container_box.cc
index c3076e4..006baff 100644
--- a/src/cobalt/layout/block_container_box.cc
+++ b/src/cobalt/layout/block_container_box.cc
@@ -207,15 +207,15 @@
// computed value for 'width'.
// https://www.w3.org/TR/CSS21/visudet.html#min-max-widths
bool min_width_depends_on_containing_block;
- base::Optional<LayoutUnit> min_width =
- GetUsedMinWidth(computed_style(), layout_params.containing_block_size,
- &min_width_depends_on_containing_block);
- if (width() < min_width.value()) {
- UpdateContentWidthAndMargins(layout_params.containing_block_size.width(),
- layout_params.shrink_to_fit_width_forced,
- min_width_depends_on_containing_block,
- maybe_left, maybe_right, maybe_margin_left,
- maybe_margin_right, min_width, maybe_height);
+ base::Optional<LayoutUnit> maybe_min_width = GetUsedMinWidthIfNotAuto(
+ computed_style(), layout_params.containing_block_size,
+ &min_width_depends_on_containing_block);
+ if (maybe_min_width && (width() < maybe_min_width.value_or(LayoutUnit()))) {
+ UpdateContentWidthAndMargins(
+ layout_params.containing_block_size.width(),
+ layout_params.shrink_to_fit_width_forced,
+ min_width_depends_on_containing_block, maybe_left, maybe_right,
+ maybe_margin_left, maybe_margin_right, maybe_min_width, maybe_height);
}
}
@@ -239,9 +239,9 @@
// applied again, but this time using the value of 'min-height' as the
// computed value for 'height'.
// https://www.w3.org/TR/CSS21/visudet.html#min-max-heights
- base::Optional<LayoutUnit> min_height =
- GetUsedMinHeight(computed_style(), layout_params.containing_block_size);
- if (height() < min_height.value()) {
+ base::Optional<LayoutUnit> min_height = GetUsedMinHeightIfNotAuto(
+ computed_style(), layout_params.containing_block_size);
+ if (min_height && (height() < min_height.value())) {
UpdateContentHeightAndMargins(layout_params.containing_block_size,
maybe_top, maybe_bottom, maybe_margin_top,
maybe_margin_bottom, min_height);
diff --git a/src/cobalt/layout/box_intersection_observer_module.cc b/src/cobalt/layout/box_intersection_observer_module.cc
index d09d3b6..124d36c 100644
--- a/src/cobalt/layout/box_intersection_observer_module.cc
+++ b/src/cobalt/layout/box_intersection_observer_module.cc
@@ -14,6 +14,7 @@
#include "cobalt/layout/box_intersection_observer_module.h"
+#include "base/trace_event/trace_event.h"
#include "cobalt/layout/box.h"
namespace cobalt {
@@ -45,6 +46,9 @@
}
void BoxIntersectionObserverModule::UpdateIntersectionObservations() {
+ TRACE_EVENT0(
+ "cobalt::layout",
+ "BoxIntersectionObserverModule::UpdateIntersectionObservations()");
ContainerBox* container_box = box_->AsContainerBox();
if (!container_box) {
return;
diff --git a/src/cobalt/layout/flex_container_box.cc b/src/cobalt/layout/flex_container_box.cc
index 73067f4..b62921d 100644
--- a/src/cobalt/layout/flex_container_box.cc
+++ b/src/cobalt/layout/flex_container_box.cc
@@ -15,6 +15,7 @@
#include "cobalt/layout/flex_container_box.h"
#include <algorithm>
+#include <vector>
#include "cobalt/cssom/computed_style.h"
#include "cobalt/cssom/keyword_value.h"
@@ -54,12 +55,12 @@
computed_style(), layout_params.containing_block_size,
&height_depends_on_containing_block);
- LayoutUnit min_width = GetUsedMinWidth(
+ base::Optional<LayoutUnit> min_width = GetUsedMinWidthIfNotAuto(
computed_style(), layout_params.containing_block_size, NULL);
base::Optional<LayoutUnit> max_width = GetUsedMaxWidthIfNotNone(
computed_style(), layout_params.containing_block_size, NULL);
- LayoutUnit min_height =
- GetUsedMinHeight(computed_style(), layout_params.containing_block_size);
+ base::Optional<LayoutUnit> min_height = GetUsedMinHeightIfNotAuto(
+ computed_style(), layout_params.containing_block_size);
base::Optional<LayoutUnit> max_height = GetUsedMaxHeightIfNotNone(
computed_style(), layout_params.containing_block_size);
@@ -147,20 +148,20 @@
}
if (main_space) {
- if (max_main_space_ && main_space.value() > max_main_space_.value()) {
+ if (max_main_space_ && *main_space > *max_main_space_) {
main_space = max_main_space_;
}
- if (main_space.value() < min_main_space_) {
+ if (min_main_space_ && *main_space < *min_main_space_) {
main_space = min_main_space_;
}
}
if (cross_space) {
- if (max_cross_space_ && cross_space_.value() > max_cross_space_.value()) {
+ if (max_cross_space_ && *cross_space_ > *max_cross_space_) {
cross_space = max_cross_space_;
}
- if (cross_space.value() < min_cross_space_) {
- cross_space = min_cross_space_;
+ if (min_cross_space_ && *cross_space < *min_cross_space_) {
+ cross_space = *min_cross_space_;
}
}
@@ -168,85 +169,6 @@
cross_space_ = cross_space;
}
-LayoutUnit FlexContainerBox::DetermineFlexBaseSize(
- Box* item, const LayoutParams& layout_params,
- bool container_shrink_to_fit_width_forced) {
- // Absolutely positioned boxes are not flex items.
- DCHECK(!item->IsAbsolutelyPositioned());
-
- // All flex items are block container boxes.
- DCHECK(item->AsBlockContainerBox());
-
- bool main_direction_is_horizontal = MainDirectionIsHorizontal();
-
- // Algorithm for determine the flex base size and hypothetical main size of
- // each item.
- // https://www.w3.org/TR/css-flexbox-1/#algo-main-item
-
- // A. If the item has a definite used flex basis, that's the flex base size.
- bool flex_basis_depends_on_available_space;
- base::Optional<LayoutUnit> flex_basis = GetUsedFlexBasisIfNotContent(
- item->computed_style(), main_direction_is_horizontal,
- layout_params.containing_block_size,
- &flex_basis_depends_on_available_space);
- bool flex_basis_is_definite =
- flex_basis && (!flex_basis_depends_on_available_space || main_space_);
- if (flex_basis_is_definite) {
- return flex_basis.value();
- }
-
- // B. If the flex item has an intrinsic aspect ratio, a used flex basis of
- // content, and a definite cross size, then the flex base size is
- // calculated from its inner cross size and the flex item's intrinsic
- // aspect ratio.
- // Sizing from intrinsic ratio is not supported.
-
- bool flex_basis_is_content_or_depends_on_available_space =
- !flex_basis || flex_basis_depends_on_available_space;
- // C. If the used flex basis is content or depends on its available space, and
- // the flex container is being sized under a min-content or max-content
- // constraint, size the item under that constraint. The flex base size is
- // the item's resulting main size.
- if (flex_basis_is_content_or_depends_on_available_space &&
- container_shrink_to_fit_width_forced) {
- LayoutParams child_layout_params(layout_params);
- child_layout_params.shrink_to_fit_width_forced = true;
- item->UpdateSize(child_layout_params);
- return main_direction_is_horizontal ? item->width() : item->height();
- }
-
- // D. Otherwise, if the used flex basis is content or depends on its available
- // space, the available main size is infinite, and the flex item's inline
- // axis is parallel to the main axis, lay the item out using the rules for
- // a box in an orthogonal flow. The flex base size is the item's
- // max-content main size.
- //
- if (flex_basis_is_content_or_depends_on_available_space &&
- main_direction_is_horizontal && !main_space_) {
- // Calculate the max-content main size.
- LayoutParams child_layout_params(layout_params);
- child_layout_params.shrink_to_fit_width_forced = true;
- item->UpdateSize(child_layout_params);
- return item->width();
- }
-
- // E. Otherwise, size the item into the available space using its used flex
- // basis in place of its main size, treating a value of content as
- // max-content. If a cross size is needed to determine the main size (e.g.
- // when the flex item's main size is in its block axis) and the flex item's
- // cross size is auto and not definite, in this calculation use fit-content
- // as the flex item's cross size. The flex base size is the item's
- // resulting main size.
- // TODO: handle 'if (!main_direction_is_horizontal)' and auto
- // height, see above.
- LayoutParams child_layout_params(layout_params);
- if (!flex_basis) {
- child_layout_params.shrink_to_fit_width_forced = true;
- }
- item->UpdateSize(child_layout_params);
- return main_direction_is_horizontal ? item->width() : item->height();
-}
-
// From |Box|.
void FlexContainerBox::UpdateContentSizeAndMargins(
const LayoutParams& layout_params) {
@@ -281,51 +203,24 @@
LayoutParams child_layout_params;
child_layout_params.containing_block_size = available_space;
- // TODO: Verify if this is correct, including the call to |UpdateRect| below.
- // Not setting this appears to result in incorrect hypothetical main size.
- child_layout_params.shrink_to_fit_width_forced = true;
-
FlexFormattingContext flex_formatting_context(
child_layout_params, main_direction_is_horizontal, DirectionIsReversed());
+ std::vector<std::unique_ptr<FlexItem>> items;
+ items.reserve(child_boxes().size());
+
for (Boxes::const_iterator child_box_iterator = child_boxes().begin();
child_box_iterator != child_boxes().end(); ++child_box_iterator) {
Box* child_box = *child_box_iterator;
- if (child_box->IsAbsolutelyPositioned()) {
- flex_formatting_context.EstimateStaticPosition(child_box);
- } else {
+ if (!child_box->IsAbsolutelyPositioned()) {
flex_formatting_context.UpdateRect(child_box);
- FlexFormattingContext::ItemParameters parameters;
- parameters.flex_base_size =
- DetermineFlexBaseSize(child_box, child_layout_params,
- layout_params.shrink_to_fit_width_forced);
- // The hypothetical main size is the item's flex base size clamped
- // according to its used min and max main sizes.
- if (main_direction_is_horizontal) {
- LayoutUnit min_width =
- GetUsedMinWidth(child_box->computed_style(), available_space, NULL);
- parameters.hypothetical_main_size =
- std::max(min_width, parameters.flex_base_size);
- base::Optional<LayoutUnit> max_width = GetUsedMaxWidthIfNotNone(
- child_box->computed_style(), available_space, NULL);
- if (max_width) {
- parameters.hypothetical_main_size =
- std::min(max_width.value(), parameters.hypothetical_main_size);
- }
- } else {
- LayoutUnit min_height =
- GetUsedMinHeight(child_box->computed_style(), available_space);
- parameters.hypothetical_main_size =
- std::max(min_height, parameters.flex_base_size);
- base::Optional<LayoutUnit> max_height = GetUsedMaxHeightIfNotNone(
- child_box->computed_style(), available_space);
- if (max_height) {
- parameters.hypothetical_main_size =
- std::min(max_height.value(), parameters.hypothetical_main_size);
- }
- }
- flex_formatting_context.SetItemParameters(child_box, parameters);
+ auto item = FlexItem::Create(child_box, main_direction_is_horizontal);
+ item->DetermineFlexBaseSize(child_layout_params, main_space_,
+ layout_params.shrink_to_fit_width_forced);
+ item->DetermineHypotheticalMainSize(
+ child_layout_params.containing_block_size);
+ items.emplace_back(std::move(item));
}
}
@@ -371,11 +266,11 @@
}
LayoutUnit main_size = flex_formatting_context.main_size();
- if (max_main_space_ && main_size > max_main_space_.value()) {
- main_size = max_main_space_.value();
+ if (max_main_space_ && main_size > *max_main_space_) {
+ main_size = *max_main_space_;
}
- if (main_size < min_main_space_) {
- main_size = min_main_space_;
+ if (min_main_space_ && main_size < *min_main_space_) {
+ main_size = *min_main_space_;
}
flex_formatting_context.set_main_size(main_size);
@@ -384,16 +279,14 @@
} else {
set_height(main_size);
}
+ flex_formatting_context.SetContainerMainSize(main_size);
// Main Size Determination:
// 5. Collect flex items into flex lines.
flex_formatting_context.set_multi_line(ContainerIsMultiLine());
- for (Boxes::const_iterator child_box_iterator = child_boxes().begin();
- child_box_iterator != child_boxes().end(); ++child_box_iterator) {
- Box* child_box = *child_box_iterator;
- if (!child_box->IsAbsolutelyPositioned()) {
- flex_formatting_context.CollectItemIntoLine(child_box);
- }
+ for (auto& item : items) {
+ DCHECK(!item->box()->IsAbsolutelyPositioned());
+ flex_formatting_context.CollectItemIntoLine(std::move(item));
}
// Perform remaining steps of the layout of the items.
@@ -407,17 +300,6 @@
set_width(flex_formatting_context.cross_size());
}
- // Layout positioned child boxes.
-
- // TODO: Check if this should be content box instead of padding box.
- // https://www.w3.org/TR/css-flexbox-1/#abspos-items
- LayoutParams absolute_child_layout_params;
- absolute_child_layout_params.containing_block_size.set_width(
- GetPaddingBoxWidth());
- absolute_child_layout_params.containing_block_size.set_height(
- GetPaddingBoxHeight());
- UpdateRectOfPositionedChildBoxes(layout_params, absolute_child_layout_params);
-
base::Optional<LayoutUnit> maybe_margin_left = GetUsedMarginLeftIfNotAuto(
computed_style(), layout_params.containing_block_size);
base::Optional<LayoutUnit> maybe_margin_right = GetUsedMarginRightIfNotAuto(
@@ -433,7 +315,11 @@
set_margin_top(maybe_margin_top.value_or(LayoutUnit()));
set_margin_bottom(maybe_margin_bottom.value_or(LayoutUnit()));
- baseline_ = flex_formatting_context.GetBaseline();
+ if (child_boxes().empty()) {
+ baseline_ = GetBorderBoxHeight();
+ } else {
+ baseline_ = flex_formatting_context.GetBaseline();
+ }
}
WrapResult FlexContainerBox::TryWrapAt(
@@ -481,8 +367,6 @@
}
LayoutUnit FlexContainerBox::GetBaselineOffsetFromTopMarginEdge() const {
- // TODO: Complete implementation of flex container baselines.
- // https://www.w3.org/TR/css-flexbox-1/#flex-baselines
return GetContentBoxOffsetFromMarginBox().y() + baseline_;
}
@@ -500,12 +384,8 @@
TextBox* text_box = child_box->AsTextBox();
switch (child_box->GetLevel()) {
case kBlockLevel:
- if (!child_box->IsAbsolutelyPositioned()) {
- PushBackDirectChild(child_box);
- break;
- }
- // Fall through if child is out-of-flow.
-
+ PushBackDirectChild(child_box);
+ break;
case kInlineLevel:
if (text_box && !text_box->HasNonCollapsibleText()) {
// Text boxes with only white space are not rendered, just as if
diff --git a/src/cobalt/layout/flex_container_box.h b/src/cobalt/layout/flex_container_box.h
index 0c4be6c..5c5007b 100644
--- a/src/cobalt/layout/flex_container_box.h
+++ b/src/cobalt/layout/flex_container_box.h
@@ -88,10 +88,10 @@
base::Optional<LayoutUnit> main_space_;
base::Optional<LayoutUnit> cross_space_;
- LayoutUnit min_main_space_;
+ base::Optional<LayoutUnit> min_main_space_;
base::Optional<LayoutUnit> max_main_space_;
- LayoutUnit min_cross_space_;
+ base::Optional<LayoutUnit> min_cross_space_;
base::Optional<LayoutUnit> max_cross_space_;
LayoutUnit baseline_;
diff --git a/src/cobalt/layout/flex_formatting_context.cc b/src/cobalt/layout/flex_formatting_context.cc
index be295e6..b106ffe 100644
--- a/src/cobalt/layout/flex_formatting_context.cc
+++ b/src/cobalt/layout/flex_formatting_context.cc
@@ -35,7 +35,11 @@
void FlexFormattingContext::UpdateRect(Box* child_box) {
DCHECK(!child_box->IsAbsolutelyPositioned());
- child_box->UpdateSize(layout_params_);
+ {
+ LayoutParams child_layout_params(layout_params_);
+ child_layout_params.shrink_to_fit_width_forced = true;
+ child_box->UpdateSize(child_layout_params);
+ }
// Shrink-to-fit doesn't exists anymore by itself in CSS3. It is called the
// fit-content size, which is derived from the 'min-content' and 'max-content'
@@ -51,13 +55,8 @@
set_auto_height(child_box->height());
}
-void FlexFormattingContext::EstimateStaticPosition(Box* child_box) {
- DCHECK(child_box->IsAbsolutelyPositioned());
- child_box->UpdateSize(layout_params_);
- // TODO set static position? Also, memoize because there may be multiple...
-}
-
-void FlexFormattingContext::CollectItemIntoLine(Box* item) {
+void FlexFormattingContext::CollectItemIntoLine(
+ std::unique_ptr<FlexItem>&& item) {
// Collect flex items into flex lines:
// https://www.w3.org/TR/css-flexbox-1/#algo-line-break
if (lines_.empty()) {
@@ -65,31 +64,21 @@
main_direction_is_horizontal_,
direction_is_reversed_, main_size_));
}
- ItemParameters parameters = GetItemParameters(item);
- if (multi_line_) {
- if (lines_.back()->TryAddItem(item, parameters.flex_base_size,
- parameters.hypothetical_main_size)) {
- return;
- } else {
- lines_.emplace_back(new FlexLine(layout_params_,
- main_direction_is_horizontal_,
- direction_is_reversed_, main_size_));
- }
+ if (multi_line_ && !lines_.back()->CanAddItem(*item)) {
+ lines_.emplace_back(new FlexLine(layout_params_,
+ main_direction_is_horizontal_,
+ direction_is_reversed_, main_size_));
}
- lines_.back()->AddItem(item, parameters.flex_base_size,
- parameters.hypothetical_main_size);
+ lines_.back()->AddItem(std::move(item));
}
void FlexFormattingContext::ResolveFlexibleLengthsAndCrossSizes(
- const base::Optional<LayoutUnit>& cross_space, LayoutUnit min_cross_space,
+ const base::Optional<LayoutUnit>& cross_space,
+ const base::Optional<LayoutUnit>& min_cross_space,
const base::Optional<LayoutUnit>& max_cross_space,
const scoped_refptr<cssom::PropertyValue>& align_content) {
- if (lines_.empty()) {
- return;
- }
-
// Algorithm for Flex Layout:
// https://www.w3.org/TR/css-flexbox-1/#layout-algorithm
@@ -118,8 +107,8 @@
// https://www.w3.org/TR/css-flexbox-1/#change-201403-clamp-single-line
if (!multi_line_) {
LayoutUnit line_cross_size = lines_.front()->cross_size();
- if (line_cross_size < min_cross_space) {
- lines_.front()->set_cross_size(min_cross_space);
+ if (min_cross_space && line_cross_size < *min_cross_space) {
+ lines_.front()->set_cross_size(*min_cross_space);
} else if (max_cross_space && line_cross_size > *max_cross_space) {
lines_.front()->set_cross_size(*max_cross_space);
}
@@ -142,12 +131,16 @@
cross_size_ = total_cross_size;
}
// Clamped by the used min and max cross sizes of the flex container.
- if (cross_size_ < min_cross_space) {
- cross_size_ = min_cross_space;
+ if (min_cross_space && cross_size_ < *min_cross_space) {
+ cross_size_ = *min_cross_space;
} else if (max_cross_space && cross_size_ > *max_cross_space) {
cross_size_ = *max_cross_space;
}
+ if (lines_.empty()) {
+ return;
+ }
+
LayoutUnit leftover_cross_size = cross_size_ - total_cross_size;
// 9. Handle 'align-content: stretch'.
if (align_content == cssom::KeywordValue::GetStretch()) {
@@ -213,12 +206,9 @@
NOTIMPLEMENTED() << "Column flex boxes not yet implemented.";
}
- // TODO: Complete implementation of flex container baselines.
- // https://www.w3.org/TR/css-flexbox-1/#flex-baselines
-
- LayoutUnit baseline = LayoutUnit();
+ LayoutUnit baseline = cross_size_;
if (!lines_.empty()) {
- if (direction_is_reversed_) {
+ if (direction_is_reversed_ && !main_direction_is_horizontal_) {
baseline = lines_.back()->GetBaseline();
} else {
baseline = lines_.front()->GetBaseline();
diff --git a/src/cobalt/layout/flex_formatting_context.h b/src/cobalt/layout/flex_formatting_context.h
index 3217380..9df264e 100644
--- a/src/cobalt/layout/flex_formatting_context.h
+++ b/src/cobalt/layout/flex_formatting_context.h
@@ -28,11 +28,6 @@
class FlexFormattingContext : public FormattingContext {
public:
- struct ItemParameters {
- LayoutUnit flex_base_size;
- LayoutUnit hypothetical_main_size;
- };
-
FlexFormattingContext(const LayoutParams& layout_params,
bool main_direction_is_horizontal,
bool direction_is_reversed);
@@ -42,16 +37,13 @@
// the internal state in the preparation for the next child.
void UpdateRect(Box* child_box);
- // Estimates the static position of the given child box. In CSS 2.1 the static
- // position is only defined for absolutely positioned boxes.
- void EstimateStaticPosition(Box* child_box);
-
// Collects the flex item into a flex line.
- void CollectItemIntoLine(Box* item);
+ void CollectItemIntoLine(std::unique_ptr<FlexItem>&& item);
// layout flex items and determine cross size.
void ResolveFlexibleLengthsAndCrossSizes(
- const base::Optional<LayoutUnit>& cross_space, LayoutUnit min_cross_space,
+ const base::Optional<LayoutUnit>& cross_space,
+ const base::Optional<LayoutUnit>& min_cross_space,
const base::Optional<LayoutUnit>& max_cross_space,
const scoped_refptr<cssom::PropertyValue>& align_content);
@@ -65,20 +57,12 @@
return layout_params_.containing_block_size;
}
- const ItemParameters& GetItemParameters(Box* item) {
- return item_parameters_.find(item)->second;
- }
-
- void SetItemParameters(Box* item, const ItemParameters& parameters) {
- item_parameters_.insert(std::make_pair(item, parameters));
- }
-
- LayoutUnit GetFlexBaseSize(Box* item) {
- return GetItemParameters(item).flex_base_size;
- }
-
- LayoutUnit GetHypotheticalMainSize(Box* item) {
- return GetItemParameters(item).hypothetical_main_size;
+ void SetContainerMainSize(LayoutUnit size) {
+ if (main_direction_is_horizontal_) {
+ layout_params_.containing_block_size.set_width(size);
+ } else {
+ layout_params_.containing_block_size.set_height(size);
+ }
}
void set_multi_line(bool val) { multi_line_ = val; }
@@ -86,7 +70,7 @@
LayoutUnit GetBaseline();
private:
- const LayoutParams layout_params_;
+ LayoutParams layout_params_;
const bool main_direction_is_horizontal_;
const bool direction_is_reversed_;
bool multi_line_ = false;
@@ -94,7 +78,6 @@
LayoutUnit main_size_;
LayoutUnit cross_size_;
- base::hash_map<Box*, ItemParameters> item_parameters_;
std::vector<std::unique_ptr<FlexLine>> lines_;
DISALLOW_COPY_AND_ASSIGN(FlexFormattingContext);
diff --git a/src/cobalt/layout/flex_item.cc b/src/cobalt/layout/flex_item.cc
index e49cf0b..45370f9 100644
--- a/src/cobalt/layout/flex_item.cc
+++ b/src/cobalt/layout/flex_item.cc
@@ -14,9 +14,13 @@
#include "cobalt/layout/flex_item.h"
+#include <algorithm>
+
+#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "cobalt/cssom/css_computed_style_data.h"
#include "cobalt/cssom/number_value.h"
+#include "cobalt/layout/box.h"
#include "cobalt/layout/container_box.h"
#include "cobalt/layout/used_style.h"
@@ -28,69 +32,79 @@
// flex containers.
class MainAxisHorizontalFlexItem : public FlexItem {
public:
- MainAxisHorizontalFlexItem(Box* box, LayoutUnit flex_base_size,
- LayoutUnit hypothetical_main_size)
- : FlexItem(box, flex_base_size, hypothetical_main_size) {}
-
+ explicit MainAxisHorizontalFlexItem(Box* box) : FlexItem(box, true) {}
~MainAxisHorizontalFlexItem() override {}
- LayoutUnit GetContentToMarginMainAxis() override;
- LayoutUnit GetContentToMarginCrossAxis() override;
- LayoutUnit GetUsedMinMainAxisSize(
- const SizeLayoutUnit& containing_block_size) override;
- LayoutUnit GetUsedMinCrossAxisSize(
- const SizeLayoutUnit& containing_block_size) override;
+ LayoutUnit GetContentToMarginMainAxis() const override;
+ LayoutUnit GetContentToMarginCrossAxis() const override;
+ base::Optional<LayoutUnit> GetUsedMainAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const override;
+ base::Optional<LayoutUnit> GetUsedMinMainAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const override;
+ base::Optional<LayoutUnit> GetUsedMinCrossAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const override;
base::Optional<LayoutUnit> GetUsedMaxMainAxisSizeIfNotNone(
- const SizeLayoutUnit& containing_block_size) override;
+ const SizeLayoutUnit& containing_block_size) const override;
base::Optional<LayoutUnit> GetUsedMaxCrossAxisSizeIfNotNone(
- const SizeLayoutUnit& containing_block_size) override;
+ const SizeLayoutUnit& containing_block_size) const override;
void DetermineHypotheticalCrossSize(
const LayoutParams& layout_params) override;
- LayoutUnit GetMarginBoxMainSize() override;
- LayoutUnit GetMarginBoxCrossSize() override;
- bool CrossSizeIsAuto() override;
- bool MarginMainStartIsAuto() override;
- bool MarginMainEndIsAuto() override;
- bool MarginCrossStartIsAuto() override;
- bool MarginCrossEndIsAuto() override;
+ LayoutUnit GetContentBoxMainSize() const override;
+ LayoutUnit GetMarginBoxMainSize() const override;
+ LayoutUnit GetMarginBoxCrossSize() const override;
+
+ bool CrossSizeIsAuto() const override;
+ bool MarginMainStartIsAuto() const override;
+ bool MarginMainEndIsAuto() const override;
+ bool MarginCrossStartIsAuto() const override;
+ bool MarginCrossEndIsAuto() const override;
void SetCrossSize(LayoutUnit cross_size) override;
void SetMainAxisStart(LayoutUnit position) override;
void SetCrossAxisStart(LayoutUnit position) override;
};
-LayoutUnit MainAxisHorizontalFlexItem::GetContentToMarginMainAxis() {
+LayoutUnit MainAxisHorizontalFlexItem::GetContentToMarginMainAxis() const {
return box()->GetContentToMarginHorizontal();
}
-LayoutUnit MainAxisHorizontalFlexItem::GetContentToMarginCrossAxis() {
+LayoutUnit MainAxisHorizontalFlexItem::GetContentToMarginCrossAxis() const {
return box()->GetContentToMarginVertical();
}
-LayoutUnit MainAxisHorizontalFlexItem::GetUsedMinMainAxisSize(
- const SizeLayoutUnit& containing_block_size) {
- return GetUsedMinWidth(box()->computed_style(), containing_block_size, NULL);
+base::Optional<LayoutUnit>
+MainAxisHorizontalFlexItem::GetUsedMainAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const {
+ return GetUsedWidthIfNotAuto(computed_style(), containing_block_size, NULL);
}
-LayoutUnit MainAxisHorizontalFlexItem::GetUsedMinCrossAxisSize(
- const SizeLayoutUnit& containing_block_size) {
- return GetUsedMinHeight(box()->computed_style(), containing_block_size);
+base::Optional<LayoutUnit>
+MainAxisHorizontalFlexItem::GetUsedMinMainAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const {
+ base::Optional<LayoutUnit> maybe_used_min_space =
+ GetUsedMinWidthIfNotAuto(computed_style(), containing_block_size, NULL);
+ return maybe_used_min_space;
+}
+
+base::Optional<LayoutUnit>
+MainAxisHorizontalFlexItem::GetUsedMinCrossAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const {
+ return GetUsedMinHeightIfNotAuto(computed_style(), containing_block_size);
}
base::Optional<LayoutUnit>
MainAxisHorizontalFlexItem::GetUsedMaxMainAxisSizeIfNotNone(
- const SizeLayoutUnit& containing_block_size) {
- return GetUsedMaxWidthIfNotNone(box()->computed_style(),
- containing_block_size, NULL);
+ const SizeLayoutUnit& containing_block_size) const {
+ return GetUsedMaxWidthIfNotNone(computed_style(), containing_block_size,
+ NULL);
}
base::Optional<LayoutUnit>
MainAxisHorizontalFlexItem::GetUsedMaxCrossAxisSizeIfNotNone(
- const SizeLayoutUnit& containing_block_size) {
- return GetUsedMaxHeightIfNotNone(box()->computed_style(),
- containing_block_size);
+ const SizeLayoutUnit& containing_block_size) const {
+ return GetUsedMaxHeightIfNotNone(computed_style(), containing_block_size);
}
void MainAxisHorizontalFlexItem::DetermineHypotheticalCrossSize(
@@ -109,36 +123,36 @@
box()->UpdateSize(child_layout_params);
}
-LayoutUnit MainAxisHorizontalFlexItem::GetMarginBoxMainSize() {
+LayoutUnit MainAxisHorizontalFlexItem::GetContentBoxMainSize() const {
+ return box()->width();
+}
+
+LayoutUnit MainAxisHorizontalFlexItem::GetMarginBoxMainSize() const {
return box()->GetMarginBoxWidth();
}
-LayoutUnit MainAxisHorizontalFlexItem::GetMarginBoxCrossSize() {
+LayoutUnit MainAxisHorizontalFlexItem::GetMarginBoxCrossSize() const {
return box()->GetMarginBoxHeight();
}
-bool MainAxisHorizontalFlexItem::CrossSizeIsAuto() {
- return box()->computed_style()->height() == cssom::KeywordValue::GetAuto();
+bool MainAxisHorizontalFlexItem::CrossSizeIsAuto() const {
+ return computed_style()->height() == cssom::KeywordValue::GetAuto();
}
-bool MainAxisHorizontalFlexItem::MarginMainStartIsAuto() {
- return box()->computed_style()->margin_left() ==
- cssom::KeywordValue::GetAuto();
+bool MainAxisHorizontalFlexItem::MarginMainStartIsAuto() const {
+ return computed_style()->margin_left() == cssom::KeywordValue::GetAuto();
}
-bool MainAxisHorizontalFlexItem::MarginMainEndIsAuto() {
- return box()->computed_style()->margin_right() ==
- cssom::KeywordValue::GetAuto();
+bool MainAxisHorizontalFlexItem::MarginMainEndIsAuto() const {
+ return computed_style()->margin_right() == cssom::KeywordValue::GetAuto();
}
-bool MainAxisHorizontalFlexItem::MarginCrossStartIsAuto() {
- return box()->computed_style()->margin_top() ==
- cssom::KeywordValue::GetAuto();
+bool MainAxisHorizontalFlexItem::MarginCrossStartIsAuto() const {
+ return computed_style()->margin_top() == cssom::KeywordValue::GetAuto();
}
-bool MainAxisHorizontalFlexItem::MarginCrossEndIsAuto() {
- return box()->computed_style()->margin_bottom() ==
- cssom::KeywordValue::GetAuto();
+bool MainAxisHorizontalFlexItem::MarginCrossEndIsAuto() const {
+ return computed_style()->margin_bottom() == cssom::KeywordValue::GetAuto();
}
void MainAxisHorizontalFlexItem::SetCrossSize(LayoutUnit cross_size) {
@@ -158,70 +172,79 @@
// flex containers.
class MainAxisVerticalFlexItem : public FlexItem {
public:
- MainAxisVerticalFlexItem(Box* box, LayoutUnit flex_base_size,
- LayoutUnit hypothetical_main_size)
- : FlexItem(box, flex_base_size, hypothetical_main_size) {}
-
+ explicit MainAxisVerticalFlexItem(Box* box) : FlexItem(box, false) {}
~MainAxisVerticalFlexItem() override {}
- LayoutUnit GetContentToMarginMainAxis() override;
- LayoutUnit GetContentToMarginCrossAxis() override;
+ LayoutUnit GetContentToMarginMainAxis() const override;
+ LayoutUnit GetContentToMarginCrossAxis() const override;
- LayoutUnit GetUsedMinMainAxisSize(
- const SizeLayoutUnit& containing_block_size) override;
- LayoutUnit GetUsedMinCrossAxisSize(
- const SizeLayoutUnit& containing_block_size) override;
+ base::Optional<LayoutUnit> GetUsedMainAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const override;
+ base::Optional<LayoutUnit> GetUsedMinMainAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const override;
+ base::Optional<LayoutUnit> GetUsedMinCrossAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const override;
base::Optional<LayoutUnit> GetUsedMaxMainAxisSizeIfNotNone(
- const SizeLayoutUnit& containing_block_size) override;
+ const SizeLayoutUnit& containing_block_size) const override;
base::Optional<LayoutUnit> GetUsedMaxCrossAxisSizeIfNotNone(
- const SizeLayoutUnit& containing_block_size) override;
+ const SizeLayoutUnit& containing_block_size) const override;
void DetermineHypotheticalCrossSize(
const LayoutParams& layout_params) override;
- LayoutUnit GetMarginBoxMainSize() override;
- LayoutUnit GetMarginBoxCrossSize() override;
- bool CrossSizeIsAuto() override;
- bool MarginMainStartIsAuto() override;
- bool MarginMainEndIsAuto() override;
- bool MarginCrossStartIsAuto() override;
- bool MarginCrossEndIsAuto() override;
+ LayoutUnit GetContentBoxMainSize() const override;
+ LayoutUnit GetMarginBoxMainSize() const override;
+ LayoutUnit GetMarginBoxCrossSize() const override;
+
+ bool CrossSizeIsAuto() const override;
+ bool MarginMainStartIsAuto() const override;
+ bool MarginMainEndIsAuto() const override;
+ bool MarginCrossStartIsAuto() const override;
+ bool MarginCrossEndIsAuto() const override;
void SetCrossSize(LayoutUnit cross_size) override;
void SetMainAxisStart(LayoutUnit position) override;
void SetCrossAxisStart(LayoutUnit position) override;
};
-LayoutUnit MainAxisVerticalFlexItem::GetContentToMarginMainAxis() {
+LayoutUnit MainAxisVerticalFlexItem::GetContentToMarginMainAxis() const {
return box()->GetContentToMarginVertical();
}
-LayoutUnit MainAxisVerticalFlexItem::GetContentToMarginCrossAxis() {
+LayoutUnit MainAxisVerticalFlexItem::GetContentToMarginCrossAxis() const {
return box()->GetContentToMarginHorizontal();
}
-LayoutUnit MainAxisVerticalFlexItem::GetUsedMinMainAxisSize(
- const SizeLayoutUnit& containing_block_size) {
- return GetUsedMinHeight(box()->computed_style(), containing_block_size);
+base::Optional<LayoutUnit>
+MainAxisVerticalFlexItem::GetUsedMainAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const {
+ return GetUsedHeightIfNotAuto(computed_style(), containing_block_size, NULL);
}
-LayoutUnit MainAxisVerticalFlexItem::GetUsedMinCrossAxisSize(
- const SizeLayoutUnit& containing_block_size) {
- return GetUsedMinWidth(box()->computed_style(), containing_block_size, NULL);
+base::Optional<LayoutUnit>
+MainAxisVerticalFlexItem::GetUsedMinMainAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const {
+ return GetUsedMinHeightIfNotAuto(computed_style(), containing_block_size);
+}
+
+base::Optional<LayoutUnit>
+MainAxisVerticalFlexItem::GetUsedMinCrossAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const {
+ return GetUsedMinWidthIfNotAuto(computed_style(), containing_block_size,
+ NULL);
}
base::Optional<LayoutUnit>
MainAxisVerticalFlexItem::GetUsedMaxMainAxisSizeIfNotNone(
- const SizeLayoutUnit& containing_block_size) {
- return GetUsedMaxHeightIfNotNone(box()->computed_style(),
- containing_block_size);
+ const SizeLayoutUnit& containing_block_size) const {
+ return GetUsedMaxHeightIfNotNone(computed_style(), containing_block_size);
}
base::Optional<LayoutUnit>
MainAxisVerticalFlexItem::GetUsedMaxCrossAxisSizeIfNotNone(
- const SizeLayoutUnit& containing_block_size) {
- return GetUsedMaxWidthIfNotNone(box()->computed_style(),
- containing_block_size, NULL);
+ const SizeLayoutUnit& containing_block_size) const {
+ return GetUsedMaxWidthIfNotNone(computed_style(), containing_block_size,
+ NULL);
}
void MainAxisVerticalFlexItem::DetermineHypotheticalCrossSize(
@@ -235,36 +258,36 @@
box()->set_height(target_main_size());
}
-LayoutUnit MainAxisVerticalFlexItem::GetMarginBoxMainSize() {
+LayoutUnit MainAxisVerticalFlexItem::GetContentBoxMainSize() const {
+ return box()->height();
+}
+
+LayoutUnit MainAxisVerticalFlexItem::GetMarginBoxMainSize() const {
return box()->GetMarginBoxHeight();
}
-LayoutUnit MainAxisVerticalFlexItem::GetMarginBoxCrossSize() {
+LayoutUnit MainAxisVerticalFlexItem::GetMarginBoxCrossSize() const {
return box()->GetMarginBoxWidth();
}
-bool MainAxisVerticalFlexItem::CrossSizeIsAuto() {
- return box()->computed_style()->width() == cssom::KeywordValue::GetAuto();
+bool MainAxisVerticalFlexItem::CrossSizeIsAuto() const {
+ return computed_style()->width() == cssom::KeywordValue::GetAuto();
}
-bool MainAxisVerticalFlexItem::MarginMainStartIsAuto() {
- return box()->computed_style()->margin_top() ==
- cssom::KeywordValue::GetAuto();
+bool MainAxisVerticalFlexItem::MarginMainStartIsAuto() const {
+ return computed_style()->margin_top() == cssom::KeywordValue::GetAuto();
}
-bool MainAxisVerticalFlexItem::MarginMainEndIsAuto() {
- return box()->computed_style()->margin_bottom() ==
- cssom::KeywordValue::GetAuto();
+bool MainAxisVerticalFlexItem::MarginMainEndIsAuto() const {
+ return computed_style()->margin_bottom() == cssom::KeywordValue::GetAuto();
}
-bool MainAxisVerticalFlexItem::MarginCrossStartIsAuto() {
- return box()->computed_style()->margin_left() ==
- cssom::KeywordValue::GetAuto();
+bool MainAxisVerticalFlexItem::MarginCrossStartIsAuto() const {
+ return computed_style()->margin_left() == cssom::KeywordValue::GetAuto();
}
-bool MainAxisVerticalFlexItem::MarginCrossEndIsAuto() {
- return box()->computed_style()->margin_right() ==
- cssom::KeywordValue::GetAuto();
+bool MainAxisVerticalFlexItem::MarginCrossEndIsAuto() const {
+ return computed_style()->margin_right() == cssom::KeywordValue::GetAuto();
}
void MainAxisVerticalFlexItem::SetCrossSize(LayoutUnit cross_size) {
@@ -279,21 +302,15 @@
box()->set_left(position);
}
-FlexItem::FlexItem(Box* box, LayoutUnit flex_base_size,
- LayoutUnit hypothetical_main_size)
- : box_(box),
- flex_base_size_(flex_base_size),
- hypothetical_main_size_(hypothetical_main_size) {}
+FlexItem::FlexItem(Box* box, bool main_direction_is_horizontal)
+ : box_(box), main_direction_is_horizontal_(main_direction_is_horizontal) {}
-std::unique_ptr<FlexItem> FlexItem::Create(bool main_direction_is_horizontal,
- Box* box, LayoutUnit flex_base_size,
- LayoutUnit hypothetical_main_size) {
+std::unique_ptr<FlexItem> FlexItem::Create(Box* box,
+ bool main_direction_is_horizontal) {
if (main_direction_is_horizontal) {
- return base::WrapUnique(new MainAxisHorizontalFlexItem(
- box, flex_base_size, hypothetical_main_size));
+ return base::WrapUnique(new MainAxisHorizontalFlexItem(box));
} else {
- return base::WrapUnique(new MainAxisVerticalFlexItem(
- box, flex_base_size, hypothetical_main_size));
+ return base::WrapUnique(new MainAxisVerticalFlexItem(box));
}
}
@@ -309,8 +326,7 @@
const scoped_refptr<cobalt::cssom::PropertyValue>&
FlexItem::GetUsedAlignSelfPropertyValue() {
DCHECK(box()->parent());
- return GetUsedAlignSelf(box()->computed_style(),
- box()->parent()->computed_style());
+ return GetUsedAlignSelf(computed_style(), box()->parent()->computed_style());
}
const scoped_refptr<cobalt::cssom::PropertyValue>&
@@ -319,6 +335,150 @@
return box()->parent()->computed_style()->justify_content();
}
+bool FlexItem::OverflowIsVisible() const {
+ return computed_style()->overflow() == cssom::KeywordValue::GetVisible();
+}
+
+void FlexItem::DetermineFlexBaseSize(
+ const LayoutParams& layout_params,
+ const base::Optional<LayoutUnit>& main_space,
+ bool container_shrink_to_fit_width_forced) {
+ // Absolutely positioned boxes are not flex items.
+ DCHECK(!box()->IsAbsolutelyPositioned());
+
+ // All flex items are block container boxes.
+ DCHECK(box()->AsBlockContainerBox());
+
+ // Algorithm for determine the flex base size and hypothetical main size of
+ // each item.
+ // https://www.w3.org/TR/css-flexbox-1/#algo-main-item
+
+ // A. If the item has a definite used flex basis, that's the flex base size.
+ bool flex_basis_depends_on_available_space;
+ base::Optional<LayoutUnit> flex_basis = GetUsedFlexBasisIfNotContent(
+ computed_style(), main_direction_is_horizontal_,
+ layout_params.containing_block_size,
+ &flex_basis_depends_on_available_space);
+ bool flex_basis_is_definite =
+ flex_basis && (!flex_basis_depends_on_available_space || main_space);
+ if (flex_basis_is_definite) {
+ flex_base_size_ = *flex_basis;
+ return;
+ }
+
+ // B. If the flex item has an intrinsic aspect ratio, a used flex basis of
+ // content, and a definite cross size, then the flex base size is
+ // calculated from its inner cross size and the flex item's intrinsic
+ // aspect ratio.
+ // Sizing from intrinsic ratio is not supported.
+
+ bool flex_basis_is_content_or_depends_on_available_space =
+ !flex_basis || flex_basis_depends_on_available_space;
+ // C. If the used flex basis is content or depends on its available space, and
+ // the flex container is being sized under a min-content or max-content
+ // constraint, size the item under that constraint. The flex base size is
+ // the item's resulting main size.
+ if (flex_basis_is_content_or_depends_on_available_space &&
+ container_shrink_to_fit_width_forced) {
+ flex_base_size_ =
+ main_direction_is_horizontal_ ? box()->width() : box()->height();
+ return;
+ }
+
+ // D. Otherwise, if the used flex basis is content or depends on its available
+ // space, the available main size is infinite, and the flex item's inline
+ // axis is parallel to the main axis, lay the item out using the rules for
+ // a box in an orthogonal flow. The flex base size is the item's
+ // max-content main size.
+ if (flex_basis_is_content_or_depends_on_available_space &&
+ main_direction_is_horizontal_ && !main_space) {
+ flex_base_size_ = box()->width();
+ return;
+ }
+
+ // E. Otherwise, size the item into the available space using its used flex
+ // basis in place of its main size, treating a value of content as
+ // max-content. If a cross size is needed to determine the main size (e.g.
+ // when the flex item's main size is in its block axis) and the flex item's
+ // cross size is auto and not definite, in this calculation use fit-content
+ // as the flex item's cross size. The flex base size is the item's
+ // resulting main size.
+ // TODO: handle 'if (!main_direction_is_horizontal)' and auto
+ // height, see above.
+ flex_base_size_ =
+ main_direction_is_horizontal_ ? box()->width() : box()->height();
+}
+
+void FlexItem::DetermineHypotheticalMainSize(
+ const SizeLayoutUnit& available_space) {
+ // The hypothetical main size is the item's flex base size clamped
+ // according to its used min and max main sizes.
+ base::Optional<LayoutUnit> maybe_min_main_size =
+ GetUsedMinMainAxisSizeIfNotAuto(available_space);
+ LayoutUnit main_size =
+ std::max(maybe_min_main_size.value_or(LayoutUnit()), flex_base_size());
+ base::Optional<LayoutUnit> maybe_max_main_size =
+ GetUsedMaxMainAxisSizeIfNotNone(available_space);
+ if (maybe_max_main_size) {
+ main_size = std::min(*maybe_max_main_size, main_size);
+ }
+ hypothetical_main_size_ = main_size;
+}
+
+base::Optional<LayoutUnit> FlexItem::GetContentBasedMinimumSize(
+ const SizeLayoutUnit& containing_block_size) const {
+ // Automatic Minimum Size of Flex Items.
+ // https://www.w3.org/TR/css-flexbox-1/#min-size-auto
+
+ // If the item's computed main size property is definite, then the specified
+ // size suggestion is that size (clamped by its max main size property if
+ // it's definite). It is otherwise undefined.
+ // https://www.w3.org/TR/css-flexbox-1/#specified-size-suggestion
+ base::Optional<LayoutUnit> specified_min_size_suggestion =
+ GetUsedMinMainAxisSizeIfNotAuto(containing_block_size);
+
+ base::Optional<LayoutUnit> specified_size_suggestion =
+ GetUsedMainAxisSizeIfNotAuto(containing_block_size);
+ if (specified_size_suggestion.has_value()) {
+ return specified_min_size_suggestion;
+ }
+
+ base::Optional<LayoutUnit> maybe_max_main_size =
+ GetUsedMaxMainAxisSizeIfNotNone(containing_block_size);
+ if (specified_min_size_suggestion.has_value() &&
+ maybe_max_main_size.has_value()) {
+ specified_min_size_suggestion =
+ std::min(*maybe_max_main_size, *specified_min_size_suggestion);
+ }
+
+ // The content size suggestion is the min-content size in the main axis,
+ // clamped by the max main size property if that is definite.
+ // https://www.w3.org/TR/css-flexbox-1/#content-size-suggestion
+ base::Optional<LayoutUnit> content_size_suggestion;
+ if (OverflowIsVisible()) {
+ content_size_suggestion = GetContentBoxMainSize();
+ if (maybe_max_main_size.has_value()) {
+ content_size_suggestion =
+ std::min(*maybe_max_main_size, *content_size_suggestion);
+ }
+ }
+
+ if (!specified_min_size_suggestion.has_value()) {
+ // If the box has neither a specified size suggestion nor an aspect ratio,
+ // its content-based minimum size is the content size suggestion.
+ return content_size_suggestion;
+ } else {
+ if (content_size_suggestion.has_value()) {
+ // In general, the content-based minimum size of a flex item is the
+ // smaller of its content size suggestion and its specified size
+ // suggestion.
+ specified_min_size_suggestion =
+ std::min(*content_size_suggestion, *specified_min_size_suggestion);
+ return specified_min_size_suggestion;
+ }
+ }
+ return specified_min_size_suggestion;
+}
} // namespace layout
} // namespace cobalt
diff --git a/src/cobalt/layout/flex_item.h b/src/cobalt/layout/flex_item.h
index 8f12150..91d16bf 100644
--- a/src/cobalt/layout/flex_item.h
+++ b/src/cobalt/layout/flex_item.h
@@ -18,6 +18,7 @@
#include <vector>
#include "base/logging.h"
+#include "base/optional.h"
#include "cobalt/layout/box.h"
#include "cobalt/layout/layout_unit.h"
@@ -28,22 +29,23 @@
class FlexItem {
public:
// Disallow Copy and Assign.
- FlexItem(const FlexItem&) = delete;
+ explicit FlexItem(const FlexItem&) = delete;
FlexItem& operator=(const FlexItem&) = delete;
-
- // Default move constructor to make the class emplace constructible.
- FlexItem(FlexItem&& that) = default;
+ explicit FlexItem(FlexItem&& that) = delete;
virtual ~FlexItem() = default;
- FlexItem(Box* box, LayoutUnit flex_base_size,
- LayoutUnit hypothetical_main_size);
+ FlexItem(Box* box, bool main_direction_is_horizontal);
- static std::unique_ptr<FlexItem> Create(bool main_direction_is_horizontal_,
- Box* box, LayoutUnit flex_base_size,
- LayoutUnit hypothetical_main_size);
+ static std::unique_ptr<FlexItem> Create(Box* box,
+ bool main_direction_is_horizontal);
Box* box() const { return box_; }
+ const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style()
+ const {
+ return box()->computed_style();
+ }
+
LayoutUnit flex_base_size() const { return flex_base_size_; }
LayoutUnit hypothetical_main_size() const { return hypothetical_main_size_; }
@@ -76,57 +78,79 @@
const scoped_refptr<cobalt::cssom::PropertyValue>&
GetUsedJustifyContentPropertyValue();
+ // Determine the flex base size.
+ // https://www.w3.org/TR/css-flexbox-1/#flex-base-size
+ void DetermineFlexBaseSize(const LayoutParams& layout_params,
+ const base::Optional<LayoutUnit>& main_space,
+ bool container_shrink_to_fit_width_forced);
+
+ // Determine the hypothetical main size.
+ // https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size
+ void DetermineHypotheticalMainSize(const SizeLayoutUnit& available_space);
+
+ base::Optional<LayoutUnit> GetContentBasedMinimumSize(
+ const SizeLayoutUnit& containing_block_size) const;
+
// Return the size difference between the content and margin box on the main
// axis.
- virtual LayoutUnit GetContentToMarginMainAxis() = 0;
+ virtual LayoutUnit GetContentToMarginMainAxis() const = 0;
// Return the size difference between the content and margin box on the cross
// axis.
- virtual LayoutUnit GetContentToMarginCrossAxis() = 0;
+ virtual LayoutUnit GetContentToMarginCrossAxis() const = 0;
+
+ // Return the used style for the size in the main axis.
+ virtual base::Optional<LayoutUnit> GetUsedMainAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const = 0;
// Return the used style for the min size in the main axis.
- virtual LayoutUnit GetUsedMinMainAxisSize(
- const SizeLayoutUnit& containing_block_size) = 0;
+ virtual base::Optional<LayoutUnit> GetUsedMinMainAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const = 0;
// Return the used style for the min size in the cross axis.
- virtual LayoutUnit GetUsedMinCrossAxisSize(
- const SizeLayoutUnit& containing_block_size) = 0;
+ virtual base::Optional<LayoutUnit> GetUsedMinCrossAxisSizeIfNotAuto(
+ const SizeLayoutUnit& containing_block_size) const = 0;
// Return the used style for the max size in the main axis.
virtual base::Optional<LayoutUnit> GetUsedMaxMainAxisSizeIfNotNone(
- const SizeLayoutUnit& containing_block_size) = 0;
+ const SizeLayoutUnit& containing_block_size) const = 0;
// Return the used style for the max size in the cross axis.
virtual base::Optional<LayoutUnit> GetUsedMaxCrossAxisSizeIfNotNone(
- const SizeLayoutUnit& containing_block_size) = 0;
+ const SizeLayoutUnit& containing_block_size) const = 0;
// Determine the hypothetical cross size.
- // https://www.w3.org/TR/css-flexbox-1/#algo-cross-item
+ // https://www.w3.org/TR/css-flexbox-1/#algo-cross-item
virtual void DetermineHypotheticalCrossSize(
const LayoutParams& layout_params) = 0;
- virtual LayoutUnit GetMarginBoxMainSize() = 0;
- virtual LayoutUnit GetMarginBoxCrossSize() = 0;
+ virtual LayoutUnit GetContentBoxMainSize() const = 0;
+ virtual LayoutUnit GetMarginBoxMainSize() const = 0;
+ virtual LayoutUnit GetMarginBoxCrossSize() const = 0;
// Return true if the computed cross axis size is auto.
- virtual bool CrossSizeIsAuto() = 0;
+ virtual bool CrossSizeIsAuto() const = 0;
// Return true if the margin at the main axis start is auto.
- virtual bool MarginMainStartIsAuto() = 0;
+ virtual bool MarginMainStartIsAuto() const = 0;
// Return true if the margin at the main axis end is auto.
- virtual bool MarginMainEndIsAuto() = 0;
+ virtual bool MarginMainEndIsAuto() const = 0;
// Return true if the margin at the cross axis start is auto.
- virtual bool MarginCrossStartIsAuto() = 0;
+ virtual bool MarginCrossStartIsAuto() const = 0;
// Return true if the margin at the cross axis end is auto.
- virtual bool MarginCrossEndIsAuto() = 0;
+ virtual bool MarginCrossEndIsAuto() const = 0;
virtual void SetCrossSize(LayoutUnit cross_size) = 0;
virtual void SetMainAxisStart(LayoutUnit position) = 0;
virtual void SetCrossAxisStart(LayoutUnit position) = 0;
private:
+ // Return true if the overflow is visible
+ bool OverflowIsVisible() const;
+
Box* const box_ = nullptr;
- const LayoutUnit flex_base_size_ = LayoutUnit();
- const LayoutUnit hypothetical_main_size_ = LayoutUnit();
+ const bool main_direction_is_horizontal_;
+ LayoutUnit flex_base_size_ = LayoutUnit();
+ LayoutUnit hypothetical_main_size_ = LayoutUnit();
LayoutUnit target_main_size_ = LayoutUnit();
LayoutUnit flex_space_ = LayoutUnit();
@@ -136,6 +160,19 @@
bool min_violation_ = false;
};
+#ifdef COBALT_BOX_DUMP_ENABLED
+
+inline std::ostream& operator<<(std::ostream& stream, const FlexItem& item) {
+ stream << "flex_base_size= " << item.flex_base_size()
+ << " hypothetical_main_size = " << item.hypothetical_main_size()
+ << " target_main_size = " << item.target_main_size()
+ << " flex_space =" << item.flex_space() << " box " << *item.box()
+ << " flex_factor = " << item.flex_factor();
+ return stream;
+}
+
+#endif // COBALT_BOX_DUMP_ENABLED
+
} // namespace layout
} // namespace cobalt
diff --git a/src/cobalt/layout/flex_line.cc b/src/cobalt/layout/flex_line.cc
index 87d2f12..124099a 100644
--- a/src/cobalt/layout/flex_line.cc
+++ b/src/cobalt/layout/flex_line.cc
@@ -35,35 +35,22 @@
items_outer_main_size_ = LayoutUnit(0);
}
-bool FlexLine::TryAddItem(Box* box, LayoutUnit flex_base_size,
- LayoutUnit hypothetical_main_size) {
- auto item = FlexItem::Create(main_direction_is_horizontal_, box,
- flex_base_size, hypothetical_main_size);
-
+bool FlexLine::CanAddItem(const FlexItem& item) const {
LayoutUnit outer_main_size =
- hypothetical_main_size + item->GetContentToMarginMainAxis();
-
+ item.hypothetical_main_size() + item.GetContentToMarginMainAxis();
LayoutUnit next_main_size = items_outer_main_size_ + outer_main_size;
-
if (!items_.empty() && next_main_size > main_size_) {
return false;
}
-
- items_outer_main_size_ = next_main_size;
- items_.emplace_back(item.release());
return true;
}
-void FlexLine::AddItem(Box* box, LayoutUnit flex_base_size,
- LayoutUnit hypothetical_main_size) {
- auto item = FlexItem::Create(main_direction_is_horizontal_, box,
- flex_base_size, hypothetical_main_size);
-
+void FlexLine::AddItem(std::unique_ptr<FlexItem>&& item) {
LayoutUnit outer_main_size =
- hypothetical_main_size + item->GetContentToMarginMainAxis();
+ item->hypothetical_main_size() + item->GetContentToMarginMainAxis();
items_outer_main_size_ += outer_main_size;
- items_.emplace_back(item.release());
+ items_.emplace_back(std::move(item));
}
void FlexLine::ResolveFlexibleLengthsAndCrossSize() {
@@ -91,13 +78,22 @@
// greater than its hypothetical main size.
// - if using the flex shrink factor: any item that has a flex base size
// smaller than its hypothetical main size.
+ LayoutUnit hypothetical_main_size = item->hypothetical_main_size();
+
if (0 == item->flex_factor() ||
(flex_factor_grow_ &&
- (item->flex_base_size() > item->hypothetical_main_size())) ||
+ (item->flex_base_size() > hypothetical_main_size)) ||
(!flex_factor_grow_ &&
- (item->flex_base_size() < item->hypothetical_main_size()))) {
+ (item->flex_base_size() < hypothetical_main_size))) {
// Freeze, setting its target main size to its hypothetical main size.
- item->set_target_main_size(item->hypothetical_main_size());
+ base::Optional<LayoutUnit> content_based_minimum_size =
+ item->GetContentBasedMinimumSize(
+ layout_params_.containing_block_size);
+ if (content_based_minimum_size.has_value()) {
+ hypothetical_main_size =
+ std::max(hypothetical_main_size, *content_based_minimum_size);
+ }
+ item->set_target_main_size(hypothetical_main_size);
// 3. Calculate initial free space.
// For frozen items, use their outer target main size;
@@ -149,7 +145,10 @@
initial_free_space * unfrozen_flex_factor_sum;
// If the magnitude of this value is less than the magnitude of the
// remaining free space, use this as the remaining free space.
- if (free_space_magnitude < remaining_free_space) {
+ if ((free_space_magnitude >= LayoutUnit() &&
+ free_space_magnitude < remaining_free_space) ||
+ (free_space_magnitude < LayoutUnit() &&
+ free_space_magnitude > remaining_free_space)) {
remaining_free_space = free_space_magnitude;
}
}
@@ -190,15 +189,22 @@
LayoutUnit unclamped_size = LayoutUnit();
LayoutUnit clamped_size = LayoutUnit();
for (auto& item : flexible_items) {
- LayoutUnit used_min_space =
- item->GetUsedMinMainAxisSize(layout_params_.containing_block_size);
+ base::Optional<LayoutUnit> maybe_used_min_space;
+ if (flex_factor_grow_) {
+ maybe_used_min_space = item->GetUsedMinMainAxisSizeIfNotAuto(
+ layout_params_.containing_block_size);
+ } else {
+ maybe_used_min_space = item->GetContentBasedMinimumSize(
+ layout_params_.containing_block_size);
+ }
base::Optional<LayoutUnit> used_max_space =
item->GetUsedMaxMainAxisSizeIfNotNone(
layout_params_.containing_block_size);
unclamped_size += item->target_main_size();
- if (item->target_main_size() < used_min_space) {
- item->set_target_main_size(used_min_space);
+ if (maybe_used_min_space &&
+ (item->target_main_size() < *maybe_used_min_space)) {
+ item->set_target_main_size(*maybe_used_min_space);
item->set_min_violation(true);
} else if (used_max_space && item->target_main_size() > *used_max_space) {
item->set_target_main_size(*used_max_space);
@@ -262,7 +268,6 @@
// Algorithm for Calculate the cross size of each flex line.
// https://www.w3.org/TR/css-flexbox-1/#algo-cross-line
- LayoutUnit max_baseline_to_top = LayoutUnit();
LayoutUnit max_baseline_to_bottom = LayoutUnit();
LayoutUnit max_hypothetical_cross_size = LayoutUnit();
for (auto& item : items_) {
@@ -277,15 +282,13 @@
// hypothetical outer cross-start edge,
LayoutUnit baseline_to_top =
item->box()->GetBaselineOffsetFromTopMarginEdge();
- if (baseline_to_top > max_baseline_to_top) {
- max_baseline_to_top = baseline_to_top;
- }
+ max_baseline_to_top_ = std::max(
+ max_baseline_to_top_.value_or(LayoutUnit()), baseline_to_top);
// and the largest of the distances between each item's baseline and its
// hypothetical outer cross-end edge,
LayoutUnit baseline_to_bottom = item->box()->height() - baseline_to_top;
- if (baseline_to_bottom > max_baseline_to_bottom) {
- max_baseline_to_bottom = baseline_to_bottom;
- }
+ max_baseline_to_bottom =
+ std::max(max_baseline_to_bottom, baseline_to_bottom);
} else {
// 2. Among all the items not collected by the previous step, find the
// largest outer hypothetical cross size.
@@ -297,7 +300,7 @@
}
// ... and sum these two values.
LayoutUnit max_baseline_cross_size =
- max_baseline_to_top + max_baseline_to_bottom;
+ max_baseline_to_top_.value_or(LayoutUnit()) + max_baseline_to_bottom;
// 3. The used cross-size of the flex line is the largest of the numbers
// found in the previous two steps and zero.
@@ -307,40 +310,34 @@
void FlexLine::DetermineUsedCrossSizes(LayoutUnit container_cross_size) {
// 11. Determine the used cross size of each flex item->
// https://www.w3.org/TR/css-flexbox-1/#algo-stretch
- if (main_direction_is_horizontal_) {
- SizeLayoutUnit containing_block_size(LayoutUnit(), container_cross_size);
- for (auto& item : items_) {
- // If a flex item has align-self: stretch,
- // its computed cross size property is auto,
- // and neither of its cross-axis margins are auto,
- if (item->GetUsedAlignSelfPropertyValue() ==
- cssom::KeywordValue::GetStretch() &&
- item->CrossSizeIsAuto() && !item->MarginCrossStartIsAuto() &&
- !item->MarginCrossEndIsAuto()) {
- // The used outer cross size is the used cross size of its flex line,
- // clamped according to the item's used min and max cross sizes.
- LayoutUnit cross_size =
- cross_size_ - item->GetContentToMarginCrossAxis();
- LayoutUnit min_cross_size =
- item->GetUsedMinMainAxisSize(containing_block_size);
- if (min_cross_size > cross_size) {
- cross_size = min_cross_size;
- }
- base::Optional<LayoutUnit> max_cross_size =
- item->GetUsedMaxCrossAxisSizeIfNotNone(containing_block_size);
- if (max_cross_size && *max_cross_size < cross_size) {
- cross_size = *max_cross_size;
- }
- item->SetCrossSize(cross_size);
-
- // TODO: If the flex item has align-self: stretch, redo layout for its
- // contents, treating this used size as its definite cross size so that
- // percentage-sized children can be resolved.
+ SizeLayoutUnit containing_block_size(LayoutUnit(), container_cross_size);
+ for (auto& item : items_) {
+ // If a flex item has align-self: stretch,
+ // its computed cross size property is auto,
+ // and neither of its cross-axis margins are auto,
+ if (item->GetUsedAlignSelfPropertyValue() ==
+ cssom::KeywordValue::GetStretch() &&
+ item->CrossSizeIsAuto() && !item->MarginCrossStartIsAuto() &&
+ !item->MarginCrossEndIsAuto()) {
+ // The used outer cross size is the used cross size of its flex line,
+ // clamped according to the item's used min and max cross sizes.
+ LayoutUnit cross_size = cross_size_ - item->GetContentToMarginCrossAxis();
+ base::Optional<LayoutUnit> min_cross_size =
+ item->GetUsedMinCrossAxisSizeIfNotAuto(containing_block_size);
+ if (min_cross_size && (*min_cross_size > cross_size)) {
+ cross_size = *min_cross_size;
}
+ base::Optional<LayoutUnit> max_cross_size =
+ item->GetUsedMaxCrossAxisSizeIfNotNone(containing_block_size);
+ if (max_cross_size && *max_cross_size < cross_size) {
+ cross_size = *max_cross_size;
+ }
+ item->SetCrossSize(cross_size);
+
+ // TODO: If the flex item has align-self: stretch, redo layout for its
+ // contents, treating this used size as its definite cross size so that
+ // percentage-sized children can be resolved.
}
- } else {
- // TODO: implement this for column flex containers.
- NOTIMPLEMENTED() << "Column flex boxes not yet implemented.";
}
}
@@ -358,12 +355,6 @@
// 12. Distribute any remaining free space.
// https://www.w3.org/TR/css-flexbox-1/#algo-main-align
- // TODO implement for row-reverse, column, and column-reverse.
- if (!main_direction_is_horizontal_) {
- // TODO: implement this for column flex containers.
- NOTIMPLEMENTED() << "Column flex boxes not yet implemented.";
- }
-
// If the remaining free space is positive and at least one main-axis margin
// on this line is auto, distribute the free space equally among these
// margins.
@@ -377,8 +368,8 @@
auto_margins[margin_idx++] = auto_main_end;
auto_margin_count += (auto_main_start ? 1 : 0) + (auto_main_end ? 1 : 0);
}
+ LayoutUnit leftover_free_space = main_size_ - items_outer_main_size_;
if (auto_margin_count > 0) {
- LayoutUnit leftover_free_space = main_size_ - items_outer_main_size_;
LayoutUnit free_space_between = leftover_free_space / auto_margin_count;
margin_idx = 0;
@@ -400,9 +391,16 @@
const scoped_refptr<cobalt::cssom::PropertyValue>& justify_content =
items_.front()->GetUsedJustifyContentPropertyValue();
- if (justify_content == cssom::KeywordValue::GetFlexStart()) {
+ bool leftover_free_space_is_negative = leftover_free_space < LayoutUnit();
+
+ if (justify_content == cssom::KeywordValue::GetFlexStart() ||
+ (leftover_free_space_is_negative &&
+ justify_content == cssom::KeywordValue::GetSpaceBetween())) {
// Flex items are packed toward the start of the line.
// https://www.w3.org/TR/css-flexbox-1/#valdef-justify-content-flex-start
+ // If the leftover free-space is negative, space-between is identical to
+ // flex-start.
+ // https://www.w3.org/TR/css-flexbox-1/#valdef-justify-content-space-between
LayoutUnit pos = LayoutUnit();
for (auto& item : items_) {
LayoutUnit main_size = item->GetMarginBoxMainSize();
@@ -420,10 +418,15 @@
pos -= main_size;
SetMainAxisPosition(pos, item.get());
}
- } else if (justify_content == cssom::KeywordValue::GetCenter()) {
+ } else if (justify_content == cssom::KeywordValue::GetCenter() ||
+ (leftover_free_space_is_negative &&
+ justify_content == cssom::KeywordValue::GetSpaceAround())) {
// Flex items are packed toward the center of the line.
// https://www.w3.org/TR/css-flexbox-1/#valdef-justify-content-center
- LayoutUnit pos = (main_size_ - items_outer_main_size_) / 2;
+ // If the leftover free-space is negative, space-around is identical to
+ // center.
+ // https://www.w3.org/TR/css-flexbox-1/#valdef-justify-content-space-around
+ LayoutUnit pos = leftover_free_space / 2;
for (auto& item : items_) {
LayoutUnit main_size = item->GetMarginBoxMainSize();
SetMainAxisPosition(pos, item.get());
@@ -432,7 +435,6 @@
} else if (justify_content == cssom::KeywordValue::GetSpaceBetween()) {
// Flex items are evenly distributed in the line.
// https://www.w3.org/TR/css-flexbox-1/#valdef-justify-content-space-between
- LayoutUnit leftover_free_space = main_size_ - items_outer_main_size_;
LayoutUnit free_space_between =
(items_.size() < 2)
? LayoutUnit()
@@ -447,7 +449,6 @@
// Flex items are evenly distributed in the line, with half-size spaces on
// either end.
// https://www.w3.org/TR/css-flexbox-1/#valdef-justify-content-space-around
- LayoutUnit leftover_free_space = main_size_ - items_outer_main_size_;
LayoutUnit free_space_between =
leftover_free_space / static_cast<int>(items_.size());
LayoutUnit free_space_before = free_space_between / 2;
@@ -465,11 +466,6 @@
}
void FlexLine::DoCrossAxisAlignment(LayoutUnit line_cross_axis_start) {
- if (!main_direction_is_horizontal_) {
- NOTIMPLEMENTED() << "Column flex boxes not yet implemented.";
- }
-
- line_cross_axis_start_ = line_cross_axis_start;
// Algorithm for cross axis alignment:
// https://www.w3.org/TR/css-flexbox-1/#cross-alignment
// 13. Resolve cross-axis auto margins.
@@ -494,6 +490,11 @@
} else if (align_self == cssom::KeywordValue::GetCenter()) {
cross_axis_start = (cross_size_ - cross_size) / 2;
} else if (align_self == cssom::KeywordValue::GetBaseline()) {
+ if (main_direction_is_horizontal_ && max_baseline_to_top_.has_value()) {
+ LayoutUnit baseline_to_top =
+ item->box()->GetBaselineOffsetFromTopMarginEdge();
+ cross_axis_start = *max_baseline_to_top_ - baseline_to_top;
+ }
} else {
DCHECK((align_self == cssom::KeywordValue::GetFlexStart()) ||
(align_self == cssom::KeywordValue::GetStretch()));
@@ -504,14 +505,15 @@
}
LayoutUnit FlexLine::GetBaseline() {
- // TODO: Complete implementation of flex container baselines.
- // https://www.w3.org/TR/css-flexbox-1/#flex-baselines
-
- LayoutUnit baseline = LayoutUnit();
- if (!items_.empty()) {
- baseline = items_.front()->box()->GetBaselineOffsetFromTopMarginEdge();
+ if (max_baseline_to_top_.has_value()) {
+ return *max_baseline_to_top_;
}
- return line_cross_axis_start_ + baseline;
+ LayoutUnit baseline = cross_size_;
+ if (!items_.empty()) {
+ Box* box = items_.front()->box();
+ baseline = box->top() + box->GetBaselineOffsetFromTopMarginEdge();
+ }
+ return baseline;
}
} // namespace layout
diff --git a/src/cobalt/layout/flex_line.h b/src/cobalt/layout/flex_line.h
index 4d4a9ee..1cca9e5 100644
--- a/src/cobalt/layout/flex_line.h
+++ b/src/cobalt/layout/flex_line.h
@@ -15,9 +15,11 @@
#ifndef COBALT_LAYOUT_FLEX_LINE_H_
#define COBALT_LAYOUT_FLEX_LINE_H_
+#include <memory>
#include <vector>
#include "base/logging.h"
+#include "base/optional.h"
#include "cobalt/layout/box.h"
#include "cobalt/layout/flex_item.h"
#include "cobalt/layout/layout_unit.h"
@@ -34,14 +36,12 @@
FlexLine(const LayoutParams& layout_params, bool main_direction_is_horizontal,
bool direction_is_reversed, LayoutUnit main_size);
- // Attempt to add the item to the line. Returns true if the box was
- // added to the line.
- bool TryAddItem(Box* box, LayoutUnit flex_base_size,
- LayoutUnit hypothetical_main_size);
+ // Return whether the item to can be added to the line. Returns false if the
+ // item does not fit.
+ bool CanAddItem(const FlexItem& item) const;
// Add the item to the line.
- void AddItem(Box* box, LayoutUnit flex_base_size,
- LayoutUnit hypothetical_main_size);
+ void AddItem(std::unique_ptr<FlexItem>&& item);
void ResolveFlexibleLengthsAndCrossSize();
void CalculateCrossSize();
@@ -68,10 +68,10 @@
bool flex_factor_grow_;
LayoutUnit items_outer_main_size_;
- LayoutUnit line_cross_axis_start_;
std::vector<std::unique_ptr<FlexItem>> items_;
LayoutUnit cross_size_;
+ base::Optional<LayoutUnit> max_baseline_to_top_;
};
} // namespace layout
diff --git a/src/cobalt/layout/intersection_observer_target.cc b/src/cobalt/layout/intersection_observer_target.cc
index 19fd041..24741e2 100644
--- a/src/cobalt/layout/intersection_observer_target.cc
+++ b/src/cobalt/layout/intersection_observer_target.cc
@@ -17,6 +17,7 @@
#include <algorithm>
#include <vector>
+#include "base/trace_event/trace_event.h"
#include "cobalt/cssom/computed_style_utils.h"
#include "cobalt/cssom/keyword_value.h"
#include "cobalt/layout/box.h"
@@ -29,6 +30,9 @@
void IntersectionObserverTarget::UpdateIntersectionObservationsForTarget(
ContainerBox* target_box) {
+ TRACE_EVENT0(
+ "cobalt::layout",
+ "IntersectionObserverTarget::UpdateIntersectionObservationsForTarget()");
// Walk up the containing block chain looking for the box referencing the
// IntersectionObserverRoot corresponding to this IntersectionObserverTarget.
// Skip further processing for the target if it is not a descendant of the
@@ -64,16 +68,14 @@
// Let intersectionArea be intersectionRect's area.
float intersection_area = intersection_rect.size().GetArea();
- // Let isIntersecting be true if targetRect and rootBounds intersect or are
- // edge-adjacent, even if the intersection has zero area (because rootBounds
- // or targetRect have zero area); otherwise, let isIntersecting be false.
- bool is_intersecting =
- intersection_rect.width() != 0 || intersection_rect.height() != 0;
-
// If targetArea is non-zero, let intersectionRatio be intersectionArea
// divided by targetArea. Otherwise, let intersectionRatio be 1 if
- // isIntersecting is true, or 0 if isIntersecting is false.
- float intersection_ratio = is_intersecting ? 1.0f : 0.0f;
+ // targetRect and rootBounds are edge-adjacent (in the case that targetRect or
+ // rootbounds have zero area), and 0 otherwise.
+ float intersection_ratio =
+ (intersection_rect.width() != 0 || intersection_rect.height() != 0)
+ ? 1.0f
+ : 0.0f;
if (target_area != 0) {
intersection_ratio = intersection_area / target_area;
}
@@ -92,6 +94,9 @@
}
}
+ // Set isIntersecting to true if |threshold_index| > 0, and false otherwise.
+ bool is_intersecting = threshold_index > 0;
+
// If thresholdIndex does not equal previousThresholdIndex or if
// isIntersecting does not equal previousIsIntersecting, queue an
// IntersectionObserverEntry, passing in observer, time, rootBounds,
diff --git a/src/cobalt/layout/replaced_box.cc b/src/cobalt/layout/replaced_box.cc
index b5b3dac..3d2a447 100644
--- a/src/cobalt/layout/replaced_box.cc
+++ b/src/cobalt/layout/replaced_box.cc
@@ -449,12 +449,16 @@
base::Optional<LayoutUnit> maybe_max_width = GetUsedMaxWidthIfNotNone(
computed_style(), layout_params.containing_block_size, NULL);
- LayoutUnit min_width = GetUsedMinWidth(
- computed_style(), layout_params.containing_block_size, NULL);
+ LayoutUnit min_width =
+ GetUsedMinWidthIfNotAuto(computed_style(),
+ layout_params.containing_block_size, NULL)
+ .value_or(LayoutUnit());
base::Optional<LayoutUnit> maybe_max_height = GetUsedMaxHeightIfNotNone(
computed_style(), layout_params.containing_block_size);
LayoutUnit min_height =
- GetUsedMinHeight(computed_style(), layout_params.containing_block_size);
+ GetUsedMinHeightIfNotAuto(computed_style(),
+ layout_params.containing_block_size)
+ .value_or(LayoutUnit());
// The values w and h stand for the results of the width and height
// computations ignoring the 'min-width', 'min-height', 'max-width' and
diff --git a/src/cobalt/layout/used_style.cc b/src/cobalt/layout/used_style.cc
index 7a811f7..76ce1cc 100644
--- a/src/cobalt/layout/used_style.cc
+++ b/src/cobalt/layout/used_style.cc
@@ -1475,6 +1475,93 @@
}
};
+class UsedMinLengthProvider : public UsedLengthValueProvider {
+ public:
+ explicit UsedMinLengthProvider(LayoutUnit percentage_base)
+ : UsedLengthValueProvider(percentage_base) {}
+
+ void VisitKeyword(cssom::KeywordValue* keyword) override {
+ switch (keyword->value()) {
+ case cssom::KeywordValue::kAuto:
+ depends_on_containing_block_ = false;
+ // Leave |used_length_| in disengaged state to indicate that "auto"
+ // was the value.
+ break;
+
+ case cssom::KeywordValue::kAbsolute:
+ case cssom::KeywordValue::kAlternate:
+ case cssom::KeywordValue::kAlternateReverse:
+ case cssom::KeywordValue::kBackwards:
+ case cssom::KeywordValue::kBaseline:
+ case cssom::KeywordValue::kBlock:
+ case cssom::KeywordValue::kBoth:
+ case cssom::KeywordValue::kBottom:
+ case cssom::KeywordValue::kBreakWord:
+ case cssom::KeywordValue::kCenter:
+ case cssom::KeywordValue::kClip:
+ case cssom::KeywordValue::kCollapse:
+ case cssom::KeywordValue::kColumn:
+ case cssom::KeywordValue::kColumnReverse:
+ case cssom::KeywordValue::kContain:
+ case cssom::KeywordValue::kContent:
+ case cssom::KeywordValue::kCover:
+ case cssom::KeywordValue::kCurrentColor:
+ case cssom::KeywordValue::kCursive:
+ case cssom::KeywordValue::kEllipsis:
+ case cssom::KeywordValue::kEnd:
+ case cssom::KeywordValue::kEquirectangular:
+ case cssom::KeywordValue::kFantasy:
+ case cssom::KeywordValue::kFixed:
+ case cssom::KeywordValue::kFlex:
+ case cssom::KeywordValue::kFlexEnd:
+ case cssom::KeywordValue::kFlexStart:
+ case cssom::KeywordValue::kForwards:
+ case cssom::KeywordValue::kHidden:
+ case cssom::KeywordValue::kInfinite:
+ case cssom::KeywordValue::kInherit:
+ case cssom::KeywordValue::kInitial:
+ case cssom::KeywordValue::kInline:
+ case cssom::KeywordValue::kInlineBlock:
+ case cssom::KeywordValue::kInlineFlex:
+ case cssom::KeywordValue::kLeft:
+ case cssom::KeywordValue::kLineThrough:
+ case cssom::KeywordValue::kMiddle:
+ case cssom::KeywordValue::kMonoscopic:
+ case cssom::KeywordValue::kMonospace:
+ case cssom::KeywordValue::kNone:
+ case cssom::KeywordValue::kNoRepeat:
+ case cssom::KeywordValue::kNormal:
+ case cssom::KeywordValue::kNowrap:
+ case cssom::KeywordValue::kPre:
+ case cssom::KeywordValue::kPreLine:
+ case cssom::KeywordValue::kPreWrap:
+ case cssom::KeywordValue::kRelative:
+ case cssom::KeywordValue::kRepeat:
+ case cssom::KeywordValue::kReverse:
+ case cssom::KeywordValue::kRight:
+ case cssom::KeywordValue::kRow:
+ case cssom::KeywordValue::kRowReverse:
+ case cssom::KeywordValue::kSansSerif:
+ case cssom::KeywordValue::kScroll:
+ case cssom::KeywordValue::kSerif:
+ case cssom::KeywordValue::kSolid:
+ case cssom::KeywordValue::kSpaceAround:
+ case cssom::KeywordValue::kSpaceBetween:
+ case cssom::KeywordValue::kStart:
+ case cssom::KeywordValue::kStatic:
+ case cssom::KeywordValue::kStereoscopicLeftRight:
+ case cssom::KeywordValue::kStereoscopicTopBottom:
+ case cssom::KeywordValue::kStretch:
+ case cssom::KeywordValue::kTop:
+ case cssom::KeywordValue::kUppercase:
+ case cssom::KeywordValue::kVisible:
+ case cssom::KeywordValue::kWrap:
+ case cssom::KeywordValue::kWrapReverse:
+ NOTREACHED();
+ }
+ }
+};
+
class UsedFlexBasisProvider : public UsedLengthValueProvider {
public:
explicit UsedFlexBasisProvider(LayoutUnit percentage_base)
@@ -1485,6 +1572,7 @@
void VisitKeyword(cssom::KeywordValue* keyword) override {
switch (keyword->value()) {
case cssom::KeywordValue::kAuto: {
+ depends_on_containing_block_ = false;
flex_basis_is_auto_ = true;
// Leave |used_length_| in disengaged state to indicate that "auto"
// was the value.
@@ -1691,29 +1779,29 @@
return used_length_provider.used_length();
}
-LayoutUnit GetUsedMinHeight(
+base::Optional<LayoutUnit> GetUsedMinHeightIfNotAuto(
const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style,
const SizeLayoutUnit& containing_block_size) {
// Percentages: refer to height of containing block.
// https://www.w3.org/TR/CSS21/visudet.html#propdef-max-height
- UsedLengthValueProvider used_length_provider(containing_block_size.height());
+ UsedMinLengthProvider used_length_provider(containing_block_size.height());
computed_style->min_height()->Accept(&used_length_provider);
- return *used_length_provider.used_length();
+ return used_length_provider.used_length();
}
-LayoutUnit GetUsedMinWidth(
+base::Optional<LayoutUnit> GetUsedMinWidthIfNotAuto(
const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style,
const SizeLayoutUnit& containing_block_size,
bool* width_depends_on_containing_block) {
// Percentages: refer to width of containing block.
// https://www.w3.org/TR/CSS21/visudet.html#propdef-min-width
- UsedLengthValueProvider used_length_provider(containing_block_size.width());
+ UsedMinLengthProvider used_length_provider(containing_block_size.width());
computed_style->min_width()->Accept(&used_length_provider);
if (width_depends_on_containing_block != NULL) {
*width_depends_on_containing_block =
used_length_provider.depends_on_containing_block();
}
- return *used_length_provider.used_length();
+ return used_length_provider.used_length();
}
base::Optional<LayoutUnit> GetUsedHeightIfNotAuto(
diff --git a/src/cobalt/layout/used_style.h b/src/cobalt/layout/used_style.h
index 6aede9f..f2a859a 100644
--- a/src/cobalt/layout/used_style.h
+++ b/src/cobalt/layout/used_style.h
@@ -395,10 +395,10 @@
const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style,
const SizeLayoutUnit& containing_block_size,
bool* width_depends_on_containing_block);
-LayoutUnit GetUsedMinHeight(
+base::Optional<LayoutUnit> GetUsedMinHeightIfNotAuto(
const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style,
const SizeLayoutUnit& containing_block_size);
-LayoutUnit GetUsedMinWidth(
+base::Optional<LayoutUnit> GetUsedMinWidthIfNotAuto(
const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style,
const SizeLayoutUnit& containing_block_size,
bool* width_depends_on_containing_block);
diff --git a/src/cobalt/layout/used_style_test.cc b/src/cobalt/layout/used_style_test.cc
index 267fea5..f19fa22 100644
--- a/src/cobalt/layout/used_style_test.cc
+++ b/src/cobalt/layout/used_style_test.cc
@@ -526,7 +526,7 @@
EXPECT_EQ(*used_width, LayoutUnit(25.0f));
}
-TEST(UsedStyleTest, UsedMaxHeightNoneDependsOnContainingBlock) {
+TEST(UsedStyleTest, UsedMaxHeightNone) {
scoped_refptr<cssom::MutableCSSComputedStyleData> computed_style(
new cssom::MutableCSSComputedStyleData());
computed_style->set_max_height(cssom::KeywordValue::GetNone());
@@ -598,14 +598,25 @@
EXPECT_EQ(*used_max_width, LayoutUnit(25.0f));
}
+TEST(UsedStyleTest, UsedMinHeightAuto) {
+ scoped_refptr<cssom::MutableCSSComputedStyleData> computed_style(
+ new cssom::MutableCSSComputedStyleData());
+ computed_style->set_min_height(cssom::KeywordValue::GetAuto());
+ SizeLayoutUnit containing_block_size(LayoutUnit(200.0f), LayoutUnit(400.0f));
+ auto used_min_height =
+ GetUsedMinHeightIfNotAuto(computed_style, containing_block_size);
+ EXPECT_FALSE(used_min_height);
+}
+
TEST(UsedStyleTest, UsedMinHeightPercentDependsOnContainingBlockHeight) {
scoped_refptr<cssom::MutableCSSComputedStyleData> computed_style(
new cssom::MutableCSSComputedStyleData());
computed_style->set_min_height(new cssom::PercentageValue(0.25f));
SizeLayoutUnit containing_block_size(LayoutUnit(200.0f), LayoutUnit(400.0f));
auto used_min_height =
- GetUsedMinHeight(computed_style, containing_block_size);
- EXPECT_EQ(used_min_height, LayoutUnit(100.0f));
+ GetUsedMinHeightIfNotAuto(computed_style, containing_block_size);
+ EXPECT_TRUE(used_min_height);
+ EXPECT_EQ(*used_min_height, LayoutUnit(100.0f));
}
TEST(UsedStyleTest, UsedMinHeightLengthValue) {
@@ -615,8 +626,21 @@
new cssom::LengthValue(25.0f, cssom::kPixelsUnit));
SizeLayoutUnit containing_block_size(LayoutUnit(200.0f), LayoutUnit(400.0f));
auto used_min_height =
- GetUsedMinHeight(computed_style, containing_block_size);
- EXPECT_EQ(used_min_height, LayoutUnit(25.0f));
+ GetUsedMinHeightIfNotAuto(computed_style, containing_block_size);
+ EXPECT_TRUE(used_min_height);
+ EXPECT_EQ(*used_min_height, LayoutUnit(25.0f));
+}
+
+TEST(UsedStyleTest, UsedMinWidthAutoDoesNotDependOnContainingBlockWidth) {
+ scoped_refptr<cssom::MutableCSSComputedStyleData> computed_style(
+ new cssom::MutableCSSComputedStyleData());
+ computed_style->set_min_width(cssom::KeywordValue::GetAuto());
+ SizeLayoutUnit containing_block_size(LayoutUnit(200.0f), LayoutUnit(400.0f));
+ bool depends_on_containing_block = false;
+ auto used_min_width = GetUsedMinWidthIfNotAuto(
+ computed_style, containing_block_size, &depends_on_containing_block);
+ EXPECT_FALSE(depends_on_containing_block);
+ EXPECT_FALSE(used_min_width);
}
TEST(UsedStyleTest, UsedMinWidthPercentDependsOnContainingBlockWidth) {
@@ -625,10 +649,11 @@
computed_style->set_min_width(new cssom::PercentageValue(0.25f));
SizeLayoutUnit containing_block_size(LayoutUnit(200.0f), LayoutUnit(400.0f));
bool depends_on_containing_block = false;
- auto used_min_width = GetUsedMinWidth(computed_style, containing_block_size,
- &depends_on_containing_block);
+ auto used_min_width = GetUsedMinWidthIfNotAuto(
+ computed_style, containing_block_size, &depends_on_containing_block);
EXPECT_TRUE(depends_on_containing_block);
- EXPECT_EQ(used_min_width, LayoutUnit(50.0f));
+ EXPECT_TRUE(used_min_width);
+ EXPECT_EQ(*used_min_width, LayoutUnit(50.0f));
}
TEST(UsedStyleTest, UsedMinWidthLengthValue) {
@@ -638,10 +663,11 @@
new cssom::LengthValue(25.0f, cssom::kPixelsUnit));
SizeLayoutUnit containing_block_size(LayoutUnit(200.0f), LayoutUnit(400.0f));
bool depends_on_containing_block = false;
- auto used_min_width = GetUsedMinWidth(computed_style, containing_block_size,
- &depends_on_containing_block);
+ auto used_min_width = GetUsedMinWidthIfNotAuto(
+ computed_style, containing_block_size, &depends_on_containing_block);
EXPECT_FALSE(depends_on_containing_block);
- EXPECT_EQ(used_min_width, LayoutUnit(25.0f));
+ EXPECT_TRUE(used_min_width);
+ EXPECT_EQ(*used_min_width, LayoutUnit(25.0f));
}
TEST(UsedStyleTest, UsedHeightAutoDependsOnContainingBlock) {
diff --git a/src/cobalt/layout_tests/layout_benchmarks.cc b/src/cobalt/layout_tests/layout_benchmarks.cc
deleted file mode 100644
index c8fbb43..0000000
--- a/src/cobalt/layout_tests/layout_benchmarks.cc
+++ /dev/null
@@ -1,332 +0,0 @@
-// Copyright 2015 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 <memory>
-
-#include "base/strings/string_util.h"
-#include "base/synchronization/waitable_event.h"
-#include "cobalt/base/event_dispatcher.h"
-#include "cobalt/cssom/viewport_size.h"
-#include "cobalt/dom/benchmark_stat_names.h"
-#include "cobalt/layout/benchmark_stat_names.h"
-#include "cobalt/layout_tests/layout_snapshot.h"
-#include "cobalt/layout_tests/test_parser.h"
-#include "cobalt/math/size.h"
-#include "cobalt/renderer/pipeline.h"
-#include "cobalt/renderer/renderer_module.h"
-#include "cobalt/renderer/submission.h"
-#include "cobalt/system_window/system_window.h"
-#include "cobalt/trace_event/benchmark.h"
-#include "url/gurl.h"
-
-using cobalt::cssom::ViewportSize;
-
-namespace cobalt {
-namespace layout_tests {
-
-namespace {
-const int kViewportWidth = 1920;
-const int kViewportHeight = 1080;
-
-const ViewportSize kViewSize(kViewportWidth, kViewportHeight);
-
-// The RendererBenchmarkRunner sets up an environment where we can control
-// the number of benchmark samples we acquire from the renderer by counting
-// each time the renderer submit complete callback is made. It also manages
-// the skipping of the first frame to avoid the first frame outlier.
-class RendererBenchmarkRunner {
- public:
- RendererBenchmarkRunner()
- : done_gathering_samples_(
- base::WaitableEvent::ResetPolicy::MANUAL,
- base::WaitableEvent::InitialState::NOT_SIGNALED),
- system_window_(new system_window::SystemWindow(
- &event_dispatcher_, kViewSize.width_height())) {
- // Since we'd like to measure the renderer, we force it to rasterize each
- // frame despite the fact that the render tree may not be changing.
- renderer::RendererModule::Options renderer_options;
- renderer_options.submit_even_if_render_tree_is_unchanged = true;
- renderer_module_.emplace(system_window_.get(), renderer_options);
- }
-
- // Return the resource provider from the internal renderer so that it can
- // be used during layout.
- render_tree::ResourceProvider* GetResourceProvider() {
- return renderer_module_->pipeline()->GetResourceProvider();
- }
-
- // Run the renderer benchmarks and perform the measurements.
- void RunBenchmarks(const browser::WebModule::LayoutResults& layout_results,
- int samples_to_gather) {
- // Initialize our per-RunBenchmarks() state.
- samples_to_gather_ = samples_to_gather;
- done_gathering_samples_.Reset();
-
- renderer::Submission submission_with_callback(layout_results.render_tree,
- layout_results.layout_time);
- submission_with_callback.on_rasterized_callbacks.emplace_back(base::Bind(
- &RendererBenchmarkRunner::OnSubmitComplete, base::Unretained(this)));
-
- renderer_module_->pipeline()->Submit(submission_with_callback);
-
- done_gathering_samples_.Wait();
-
- renderer_module_->pipeline()->Clear();
- }
-
- private:
- // Called whenever the renderer completes a frame submission. This allows us
- // to count how many frames have been submitted so we know when to stop (via
- // the signaling of the done_gathering_samples_ event).
- void OnSubmitComplete() {
- --samples_to_gather_;
-
- // We wait for samples_to_gather + 1 submits to complete because we actually
- // want samples_to_gather, but we skipped the first submit.
- if (samples_to_gather_ <= 0) {
- done_gathering_samples_.Signal();
- }
- }
-
- int samples_to_gather_;
- base::WaitableEvent done_gathering_samples_;
- base::EventDispatcher event_dispatcher_;
-
- std::unique_ptr<system_window::SystemWindow> system_window_;
- base::Optional<renderer::RendererModule> renderer_module_;
-};
-
-} // namespace
-
-class LayoutBenchmark : public trace_event::Benchmark {
- public:
- explicit LayoutBenchmark(const TestInfo& test_info);
- ~LayoutBenchmark() override {}
-
- void Experiment() override;
- void AnalyzeTraceEvent(
- const scoped_refptr<trace_event::EventParser::ScopedEvent>& event)
- override;
- std::vector<trace_event::Benchmark::Result> CompileResults() override;
-
- private:
- typedef base::hash_map<std::string, double> IntermediateResultsMap;
- typedef base::hash_map<std::string, std::vector<double> >
- FinalResultsSampleMap;
-
- void OnIterationComplete();
- static std::string FilePathToBenchmarkName(const base::FilePath& filepath);
-
- TestInfo test_info_;
-
- // During each iteration, we accumulate intermediate results by *adding*
- // task times together. Only when the iteration is complete do we consider
- // our result a sample.
- IntermediateResultsMap intermediate_results_;
-
- // A list of accumulated intermediate results. The vectors in this map are
- // pushed to at the end of each iteration.
- FinalResultsSampleMap layout_samples_;
- FinalResultsSampleMap renderer_samples_;
-
- // Is this our first iteration?
- bool first_iteration_;
-
- // We setup the renderer benchmark runner first so that we can gain access
- // to the resource provider and so that we can also benchmark the rendering
- // of the layed out web pages.
- RendererBenchmarkRunner renderer_benchmark_runner_;
-};
-
-LayoutBenchmark::LayoutBenchmark(const TestInfo& test_info)
- : test_info_(test_info), first_iteration_(true) {
- // Setup the name's benchmark based on the test entry file path.
- set_name(FilePathToBenchmarkName(test_info_.base_file_path));
- set_num_iterations(10, base::Bind(&LayoutBenchmark::OnIterationComplete,
- base::Unretained(this)));
-
- // Define the set of event names that we would like to watch for by
- // initializing their map entries to the default constructed values (e.g.
- // std::vector<double>()).
- layout_samples_[layout::kBenchmarkStatLayout];
- layout_samples_[dom::kBenchmarkStatUpdateSelectorTree];
- layout_samples_[dom::kBenchmarkStatUpdateComputedStyles];
- layout_samples_[layout::kBenchmarkStatBoxGeneration];
- layout_samples_[layout::kBenchmarkStatUpdateCrossReferences];
- layout_samples_[layout::kBenchmarkStatUpdateUsedSizes];
- layout_samples_[layout::kBenchmarkStatRenderAndAnimate];
- renderer_samples_["AnimateNode::Apply()"];
- renderer_samples_["VisitRenderTree"];
- renderer_samples_["Skia Flush"];
-}
-
-std::string LayoutBenchmark::FilePathToBenchmarkName(
- const base::FilePath& filepath) {
- std::vector<base::FilePath::StringType> components;
- filepath.GetComponents(&components);
-
- // Don't include the "benchmarks" directory as part of the benchmark name.
- components.erase(components.begin());
-
- return base::JoinString(components, "/");
-}
-
-void LayoutBenchmark::Experiment() {
- base::MessageLoop message_loop(base::MessageLoop::TYPE_DEFAULT);
-
- // We prepare a layout_results variable where we place the results from each
- // layout. We will then use the final layout_results as input to the renderer
- // benchmark.
- base::Optional<browser::WebModule::LayoutResults> layout_results;
-
- ViewportSize viewport_size =
- test_info_.viewport_size ? *test_info_.viewport_size : kViewSize;
-
- // Set up a WebModule, load the URL and trigger layout to get layout benchmark
- // results.
- layout_results =
- SnapshotURL(test_info_.url, viewport_size,
- renderer_benchmark_runner_.GetResourceProvider(),
- dom::ScreenshotManager::ProvideScreenshotFunctionCallback());
-
- // Finally run the renderer benchmarks to acquire performance data on
- // rendering.
- renderer_benchmark_runner_.RunBenchmarks(*layout_results, 60);
-}
-
-namespace {
-
-// Return true if the event has an ancestor with the specified named event.
-bool HasAncestorEvent(
- const scoped_refptr<trace_event::EventParser::ScopedEvent>& event,
- const std::string& ancestor_event_string) {
- scoped_refptr<trace_event::EventParser::ScopedEvent> ancestor_event =
- event->parent();
- while (ancestor_event) {
- if (ancestor_event->name() == ancestor_event_string) {
- break;
- }
- ancestor_event = ancestor_event->parent();
- }
-
- return ancestor_event.get() != NULL;
-}
-
-} // namespace
-
-void LayoutBenchmark::AnalyzeTraceEvent(
- const scoped_refptr<trace_event::EventParser::ScopedEvent>& event) {
- // Check if this is a layout sample.
- if (event->name() == layout::kBenchmarkStatNonMeasuredLayout) {
- // If this is a layout that should not be measured, use that as a signal
- // that we are measuring partial layout, and clear out all measured data
- // so far and start fresh for the eventual measured layout.
- intermediate_results_.clear();
- return;
- }
-
- FinalResultsSampleMap::iterator found_layout =
- layout_samples_.find(event->name());
- if (found_layout != layout_samples_.end() &&
- !HasAncestorEvent(event, layout::kBenchmarkStatNonMeasuredLayout)) {
- if (!base::ContainsKey(intermediate_results_, found_layout->first)) {
- intermediate_results_[found_layout->first] = 0;
- }
-
- double event_duration = event->in_scope_duration()->InSecondsF();
- intermediate_results_[found_layout->first] += event_duration;
-
- if (event->name() != layout::kBenchmarkStatLayout &&
- !HasAncestorEvent(event, layout::kBenchmarkStatLayout)) {
- // If the event (which we have specifically requested to include in
- // the benchmark results) does not fall under the scope of the official
- // layout event, artificially increase the tracked layout time to include
- // it. This way events can occur at any time, and the scoped layout
- // event still gives us a way to measure unaccounted for time that we
- // know is devoted to layout.
- intermediate_results_[layout::kBenchmarkStatLayout] += event_duration;
- }
- }
-
- FinalResultsSampleMap::iterator found_renderer =
- renderer_samples_.find(event->name());
- if (found_renderer != renderer_samples_.end()) {
- found_renderer->second.push_back(event->in_scope_duration()->InSecondsF());
- }
-}
-
-void LayoutBenchmark::OnIterationComplete() {
- // Skip recording the results of the first iteration, since a few things
- // may have been lazily initialized and we'd like to avoid recording that.
- if (first_iteration_) {
- for (FinalResultsSampleMap::iterator iter = renderer_samples_.begin();
- iter != renderer_samples_.end(); ++iter) {
- iter->second.clear();
- }
- } else {
- // Save our finalized intermediate results into our finalized results, and
- // then clear out our intermediate results for the next iteration.
- for (FinalResultsSampleMap::iterator iter = layout_samples_.begin();
- iter != layout_samples_.end(); ++iter) {
- if (base::ContainsKey(intermediate_results_, iter->first)) {
- iter->second.push_back(intermediate_results_[iter->first]);
- }
- }
- }
-
- first_iteration_ = false;
- intermediate_results_.clear();
-}
-
-std::vector<trace_event::Benchmark::Result> LayoutBenchmark::CompileResults() {
- std::vector<trace_event::Benchmark::Result> results;
- for (FinalResultsSampleMap::iterator iter = layout_samples_.begin();
- iter != layout_samples_.end(); ++iter) {
- results.push_back(trace_event::Benchmark::Result(
- iter->first + " in-scope duration in seconds", iter->second));
- }
- for (FinalResultsSampleMap::iterator iter = renderer_samples_.begin();
- iter != renderer_samples_.end(); ++iter) {
- results.push_back(trace_event::Benchmark::Result(
- iter->first + " in-scope duration in seconds", iter->second));
- }
- return results;
-}
-
-class LayoutBenchmarkCreator : public trace_event::BenchmarkCreator {
- public:
- std::vector<CreateBenchmarkFunction> GetBenchmarkCreators() override {
- std::vector<CreateBenchmarkFunction> benchmarks;
-
- std::vector<TestInfo> benchmark_infos = EnumerateLayoutTests("benchmarks");
- for (std::vector<TestInfo>::const_iterator iter = benchmark_infos.begin();
- iter != benchmark_infos.end(); ++iter) {
- benchmarks.push_back(
- base::Bind(&LayoutBenchmarkCreator::CreateLayoutBenchmark, *iter));
- }
-
- return benchmarks;
- }
-
- private:
- static std::unique_ptr<trace_event::Benchmark> CreateLayoutBenchmark(
- const TestInfo& test_info) {
- return std::unique_ptr<trace_event::Benchmark>(
- new LayoutBenchmark(test_info));
- }
-};
-LayoutBenchmarkCreator g_benchmark_creator;
-
-} // namespace layout_tests
-} // namespace cobalt
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/-9-kyTW8ZkZNDHQJ6FgpwQ/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/-9-kyTW8ZkZNDHQJ6FgpwQ/1.jpg
deleted file mode 100644
index fc5fc1c..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/-9-kyTW8ZkZNDHQJ6FgpwQ/1.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/4R8DWoMoI7CAwX8_LjQHig/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/4R8DWoMoI7CAwX8_LjQHig/1.jpg
deleted file mode 100644
index 0b1dda7..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/4R8DWoMoI7CAwX8_LjQHig/1.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/Egdi0XIXXZ-qJOFPf4JSKw/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/Egdi0XIXXZ-qJOFPf4JSKw/1.jpg
deleted file mode 100644
index 5abfe0e..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/Egdi0XIXXZ-qJOFPf4JSKw/1.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/F0pVplsI8R5kcAqgtoRqoA/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/F0pVplsI8R5kcAqgtoRqoA/1.jpg
deleted file mode 100644
index 429bdae..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/F0pVplsI8R5kcAqgtoRqoA/1.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/OpNcN46UbXVtpKMrmU4Abg/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/OpNcN46UbXVtpKMrmU4Abg/1.jpg
deleted file mode 100644
index 861caa9..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/OpNcN46UbXVtpKMrmU4Abg/1.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/YfdidRxbB8Qhf0Nx7ioOYw/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/YfdidRxbB8Qhf0Nx7ioOYw/1.jpg
deleted file mode 100644
index 75357d6..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/YfdidRxbB8Qhf0Nx7ioOYw/1.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/i-g4cjqGV7jvU8aeSuj0jQ/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/i-g4cjqGV7jvU8aeSuj0jQ/1.jpg
deleted file mode 100644
index e8b0b20..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/i-g4cjqGV7jvU8aeSuj0jQ/1.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/xAgnFbkxldX6YUEvdcNjnA/1.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/xAgnFbkxldX6YUEvdcNjnA/1.jpg
deleted file mode 100644
index 40edb65..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/i/xAgnFbkxldX6YUEvdcNjnA/1.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/0vEKItRNIb0/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/0vEKItRNIb0/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/0vEKItRNIb0/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/1dXVzBU5p-Q/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/1dXVzBU5p-Q/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/1dXVzBU5p-Q/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/2A07xMhKC6g/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/2A07xMhKC6g/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/2A07xMhKC6g/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/59_zMJRhFM0/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/59_zMJRhFM0/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/59_zMJRhFM0/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/8VstEBbwhnc/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/8VstEBbwhnc/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/8VstEBbwhnc/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/D-YPnDvTCmI/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/D-YPnDvTCmI/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/D-YPnDvTCmI/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/F50yjSws9gQ/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/F50yjSws9gQ/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/F50yjSws9gQ/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/GwzBLYGRj6c/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/GwzBLYGRj6c/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/GwzBLYGRj6c/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/LZoilVdo7Hw/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/LZoilVdo7Hw/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/LZoilVdo7Hw/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/M9WlASe5ThU/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/M9WlASe5ThU/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/M9WlASe5ThU/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/MODTYlzxY9U/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/MODTYlzxY9U/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/MODTYlzxY9U/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/RL7grUEo960/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/RL7grUEo960/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/RL7grUEo960/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/XilhAJZ2qxs/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/XilhAJZ2qxs/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/XilhAJZ2qxs/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/Z31LDqbhN8U/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/Z31LDqbhN8U/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/Z31LDqbhN8U/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/_TWbD3MKfMI/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/_TWbD3MKfMI/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/_TWbD3MKfMI/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/eOOyxSMI0aE/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/eOOyxSMI0aE/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/eOOyxSMI0aE/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/q14aPbvbvl8/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/q14aPbvbvl8/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/q14aPbvbvl8/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/qkKRkfZYhlE/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/qkKRkfZYhlE/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/qkKRkfZYhlE/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/qrZcKwcVwk8/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/qrZcKwcVwk8/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/qrZcKwcVwk8/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/rs-Ou-gjReQ/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/rs-Ou-gjReQ/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/rs-Ou-gjReQ/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/rtzlT78OEks/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/rtzlT78OEks/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/rtzlT78OEks/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/spC883rn6zk/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/spC883rn6zk/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/spC883rn6zk/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/tCehxI5a1y0/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/tCehxI5a1y0/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/tCehxI5a1y0/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/tnfPNYpi8rc/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/tnfPNYpi8rc/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/tnfPNYpi8rc/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/vvFHyFW_jFc/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/vvFHyFW_jFc/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/vvFHyFW_jFc/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/wNRUzu4fTgw/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/wNRUzu4fTgw/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/wNRUzu4fTgw/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/x5ZxRObLLzE/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/x5ZxRObLLzE/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/x5ZxRObLLzE/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/zzmrTdAtEu4/hqdefault.jpg b/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/zzmrTdAtEu4/hqdefault.jpg
deleted file mode 100644
index e686f50..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/i.ytimg.com/vi/zzmrTdAtEu4/hqdefault.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/layout_tests.txt b/src/cobalt/layout_tests/testdata/benchmarks/layout_tests.txt
deleted file mode 100644
index c86c38e..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/layout_tests.txt
+++ /dev/null
@@ -1 +0,0 @@
-youtube-2015-q3-initial-layout:1920x1080
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/CutiveMono-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/CutiveMono-Regular.woff
deleted file mode 100644
index 6ab1ca1..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/CutiveMono-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/DancingScript-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/DancingScript-Regular.woff
deleted file mode 100644
index 71b2e76..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/DancingScript-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/Handlee-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/Handlee-Regular.woff
deleted file mode 100644
index c8f2418..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/Handlee-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/MarcellusSC-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/MarcellusSC-Regular.woff
deleted file mode 100644
index 1740d4f..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/MarcellusSC-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/PTM55FT.woff b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/PTM55FT.woff
deleted file mode 100644
index e7e96d1..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/PTM55FT.woff
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/PT_Sans-Caption-Web-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/PT_Sans-Caption-Web-Regular.woff
deleted file mode 100644
index c0e6a2f..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/PT_Sans-Caption-Web-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/PT_Serif-Caption-Web-Regular.woff b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/PT_Serif-Caption-Web-Regular.woff
deleted file mode 100644
index f5599f7..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/fonts/PT_Serif-Caption-Web-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/app-prod.css b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/app-prod.css
deleted file mode 100644
index c78c202..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/app-prod.css
+++ /dev/null
@@ -1 +0,0 @@
-.icon-cast_off:before{content:"\00e675"}.icon-cast_on:before{content:"\00e676"}.icon-mr_meh_android:before{content:"\00e677"}.icon-settings-signin-android:before{content:"\00e678"}.icon-settings-signout-android:before{content:"\00e679"}.icon-roku-back:before{content:"\00e674"}.icon-hats-happy:before{content:"\00e66f"}.icon-hats-neutral:before{content:"\00e670"}.icon-hats-sad:before{content:"\00e671"}.icon-hats-very-happy:before{content:"\00e672"}.icon-hats-very-sad:before{content:"\00e673"}.icon-search-keyboard:before{content:"\00e66e"}.icon-multiaudio:before{content:"\00e62d"}.icon-settings-check:before{content:"\00e66d"}.icon-settings-uncheck:before{content:"\00e659"}.icon-popular:before{content:"\00e66c"}.icon-airplane:before{content:"\00e600"}.icon-back:before{content:"\00e601"}.icon-check:before{content:"\00e602"}.icon-chevron-single:before{content:"\00e603"}.icon-delete:before{content:"\00e604"}.icon-desktop-arrowkeys:before{content:"\00e605"}.icon-desktop-delete:before{content:"\00e606"}.icon-desktop-esc:before{content:"\00e607"}.icon-desktop-g:before{content:"\00e608"}.icon-desktop-s:before{content:"\00e609"}.icon-dislike:before{content:"\00e60a"}.icon-double-chevron-right:before{content:"\00e60b"}.icon-edit:before{content:"\00e60c"}.icon-education:before{content:"\00e60d"}.icon-ellipsis:before{content:"\00e60e"}.icon-entertainment:before{content:"\00e60f"}.icon-exit:before{content:"\00e610"}.icon-film:before{content:"\00e611"}.icon-flag:before{content:"\00e612"}.icon-gaming:before{content:"\00e613"}.icon-guide-history:before{content:"\00e614"}.icon-guide-my-subs:before{content:"\00e615"}.icon-guide-purchases:before{content:"\00e616"}.icon-guide-social:before{content:"\00e617"}.icon-guide-what-to-watch:before{content:"\00e618"}.icon-home:before{content:"\00e619"}.icon-hourglass:before{content:"\00e61a"}.icon-key-delete:before{content:"\00e61b"}.icon-key-globe:before{content:"\00e61c"}.icon-key-space-sm:before{content:"\00e61d"}.icon-key-space:before{content:"\00e61e"}.icon-like:before{content:"\00e61f"}.icon-lips:before{content:"\00e620"}.icon-logo-lozenge:before{content:"\00e621"}.icon-lol:before{content:"\00e622"}.icon-lozenge:before{content:"\00e623"}.icon-mix:before{content:"\00e624"}.icon-music:before{content:"\00e625"}.icon-news:before{content:"\00e626"}.icon-people:before{content:"\00e627"}.icon-pets:before{content:"\00e628"}.icon-player-3d:before{content:"\00e629"}.icon-player-annotations:before{content:"\00e62a"}.icon-player-closedcaptions:before{content:"\00e62b"}.icon-player-ff:before{content:"\00e62c"}.icon-player-HD-circle:before{content:"\00e651"}.icon-player-HD:before{content:"\00e62e"}.icon-player-info:before{content:"\00e62f"}.icon-player-instantreplay:before{content:"\00e630"}.icon-player-less:before{content:"\00e631"}.icon-player-more:before{content:"\00e632"}.icon-player-mute:before{content:"\00e633"}.icon-player-next:before{content:"\00e634"}.icon-player-pause:before{content:"\00e635"}.icon-player-play:before{content:"\00e636"}.icon-player-prev:before{content:"\00e637"}.icon-player-replay:before{content:"\00e638"}.icon-player-rew:before{content:"\00e639"}.icon-player-settings:before{content:"\00e63a"}.icon-player-share:before{content:"\00e63b"}.icon-player-size-fullscreen:before{content:"\00e63c"}.icon-player-size-medium:before{content:"\00e63d"}.icon-player-size-minimize:before{content:"\00e63e"}.icon-player-stop:before{content:"\00e63f"}.icon-player-subtitles:before{content:"\00e640"}.icon-player-volume-45:before{content:"\00e641"}.icon-player-volume-48:before{content:"\00e642"}.icon-playlist:before{content:"\00e643"}.icon-playstation-circle:before{content:"\00e644"}.icon-playstation-square:before{content:"\00e645"}.icon-playstation-triangle:before{content:"\00e646"}.icon-playstation-x:before{content:"\00e647"}.icon-privacy-link:before{content:"\00e648"}.icon-privacy-locked:before{content:"\00e649"}.icon-privacy-public:before{content:"\00e64a"}.icon-related:before{content:"\00e64b"}.icon-remoteque:before{content:"\00e64c"}.icon-reward:before{content:"\00e64d"}.icon-rocket:before{content:"\00e64e"}.icon-search-clear:before{content:"\00e64f"}.icon-search:before{content:"\00e650"}.icon-settings-clear-cookies:before{content:"\00e652"}.icon-settings-clear-history:before{content:"\00e653"}.icon-settings-feedback:before{content:"\00e654"}.icon-settings-help:before{content:"\00e655"}.icon-settings-pair:before{content:"\00e656"}.icon-settings-phone:before{content:"\00e657"}.icon-settings-term:before{content:"\00e658"}.icon-speechbubble:before{content:"\00e65a"}.icon-sports:before{content:"\00e65b"}.icon-star:before{content:"\00e65c"}.icon-trash:before{content:"\00e65d"}.icon-trends:before{content:"\00e65e"}.icon-tv-dpad:before{content:"\00e65f"}.icon-upload-arrow:before{content:"\00e660"}.icon-upload:before{content:"\00e661"}.icon-watch-later:before{content:"\00e662"}.icon-wii-1:before{content:"\00e663"}.icon-wii-2:before{content:"\00e664"}.icon-wii-A:before{content:"\00e665"}.icon-wii-B:before{content:"\00e666"}.icon-wii-minus:before{content:"\00e667"}.icon-wii-plus:before{content:"\00e668"}.icon-wii-x:before{content:"\00e669"}.icon-wii-y:before{content:"\00e66a"}.icon-youtube-logo:before{content:"\00e66b"}.icon-youtube-unlimited-logo:before{content:"\00e67a"}@font-face{font-family:'Cutive Mono';src:url('/s/tv/fonts/CutiveMono-Regular.woff') format('woff')}@font-face{font-family:'PT Mono';src:url('/s/tv/fonts/PTM55FT.woff') format('woff')}@font-face{font-family:'PT Serif Caption';src:url('/s/tv/fonts/PT_Serif-Caption-Web-Regular.woff') format('woff')}@font-face{font-family:'PT Sans Caption';src:url('/s/tv/fonts/PT_Sans-Caption-Web-Regular.woff') format('woff')}@font-face{font-family:'Handlee';src:url('/s/tv/fonts/Handlee-Regular.woff') format('woff')}@font-face{font-family:'Dancing Script';src:url('/s/tv/fonts/DancingScript-Regular.woff') format('woff')}@font-face{font-family:'Marcellus SC';src:url('/s/tv/fonts/MarcellusSC-Regular.woff') format('woff')}body,html{font-size:100%;height:100%;margin:auto;overflow:hidden;padding:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}input{font:inherit;margin:0;padding:0}body{background-color:#1c1a1a}p,ul,li{border:0;margin:0;outline:none;padding:0}ul{list-style:none}.focused,:focus{outline:0 solid}.hidden{display:none!important}.invisible{visibility:hidden}ul.list li{display:inline}ul.list.vertical li{display:block}.device-plugin{height:0;margin:0;position:absolute;visibility:hidden;width:0}#loader{}#leanback{height:100%}#app-markup{background-size:100% 100%;height:100%}#background{background-size:100% 100%;bottom:0;left:0;position:absolute;overflow:hidden;right:0;top:0}.limited-memory.sets-ui #app-markup{background-color:#283337}#app-markup.watch-state{background-color:#000!important}.wiiu #app-markup.watch-state{background-image:none!important}#playstation-buttons{display:none;position:absolute}#spinner{position:absolute;top:17.17em;width:100%}.browse-state .loading-indicator{display:none}.browse-state .fallback-loading-indicator{display:block}.opera #spinner{top:20em}.loading-indicator{height:5.33em;margin:0 auto;position:relative;width:5.33em}.dot{background-color:#cbcbcb;border-radius:50%;height:1.17em;position:absolute;width:1.17em}@-webkit-keyframes fade1{0%,100%{opacity:0}50%{opacity:1}}@-webkit-keyframes fade2{0%,100%{opacity:.25}37.5%{opacity:1}87.5%{opacity:0}}@-webkit-keyframes fade3{0%,100%{opacity:.5}25%{opacity:1}75%{opacity:0}}@-webkit-keyframes fade4{0%,100%{opacity:.75}12.5%{opacity:1}62.5%{opacity:0}}@-webkit-keyframes fade5{0%,100%{opacity:1}50%{opacity:0}}@-webkit-keyframes fade6{0%,100%{opacity:.75}37.5%{opacity:0}87.5%{opacity:1}}@-webkit-keyframes fade7{0%,100%{opacity:.5}25%{opacity:0}75%{opacity:1}}@-webkit-keyframes fade8{0%,100%{opacity:.25}12.5%{opacity:0}62.5%{opacity:1}}@-o-keyframes fade1{0%,100%{opacity:0}50%{opacity:1}}@-o-keyframes fade2{0%,100%{opacity:.25}37.5%{opacity:1}87.5%{opacity:0}}@-o-keyframes fade3{0%,100%{opacity:.5}25%{opacity:1}75%{opacity:0}}@-o-keyframes fade4{0%,100%{opacity:.75}12.5%{opacity:1}62.5%{opacity:0}}@-o-keyframes fade5{0%,100%{opacity:1}50%{opacity:0}}@-o-keyframes fade6{0%,100%{opacity:.75}37.5%{opacity:0}87.5%{opacity:1}}@-o-keyframes fade7{0%,100%{opacity:.5}25%{opacity:0}75%{opacity:1}}@-o-keyframes fade8{0%,100%{opacity:.25}12.5%{opacity:0}62.5%{opacity:1}}@keyframes fade1{0%,100%{opacity:0}50%{opacity:1}}@keyframes fade2{0%,100%{opacity:.25}37.5%{opacity:1}87.5%{opacity:0}}@keyframes fade3{0%,100%{opacity:.5}25%{opacity:1}75%{opacity:0}}@keyframes fade4{0%,100%{opacity:.75}12.5%{opacity:1}62.5%{opacity:0}}@keyframes fade5{0%,100%{opacity:1}50%{opacity:0}}@keyframes fade6{0%,100%{opacity:.75}37.5%{opacity:0}87.5%{opacity:1}}@keyframes fade7{0%,100%{opacity:.5}25%{opacity:0}75%{opacity:1}}@keyframes fade8{0%,100%{opacity:.25}12.5%{opacity:0}62.5%{opacity:1}}#dot1{-o-animation:fade8 .72s infinite ease;-webkit-animation:fade8 .72s infinite ease;animation:fade8 .72s infinite ease;left:0;top:2.09em}#dot2{-o-animation:fade7 .72s infinite ease;-webkit-animation:fade7 .72s infinite ease;animation:fade7 .72s infinite ease;left:.61em;top:.61em}#dot3{-o-animation:fade6 .72s infinite ease;-webkit-animation:fade6 .72s infinite ease;animation:fade6 .72s infinite ease;left:2.09em;top:0}#dot4{-o-animation:fade5 .72s infinite ease;-webkit-animation:fade5 .72s infinite ease;animation:fade5 .72s infinite ease;right:.61em;top:.61em}#dot5{-o-animation:fade4 .72s infinite ease;-webkit-animation:fade4 .72s infinite ease;animation:fade4 .72s infinite ease;right:0;top:2.09em}#dot6{-o-animation:fade3 .72s infinite ease;-webkit-animation:fade3 .72s infinite ease;animation:fade3 .72s infinite ease;bottom:.61em;right:.61em}#dot7{-o-animation:fade2 .72s infinite ease;-webkit-animation:fade2 .72s infinite ease;animation:fade2 .72s infinite ease;bottom:0;left:2.09em}#dot8{-o-animation:fade1 .72s infinite ease;-webkit-animation:fade1 .72s infinite ease;animation:fade1 .72s infinite ease;bottom:.61em;left:.61em}.spinner.transitions .dot{-o-animation:initial!important;-webkit-animation:initial!important;animation:initial!important;background:url(img/circle.png) no-repeat center;background-size:100%}.spinner.transitions.spin .loading-indicator{transition:transform 25s linear;transform:rotate(-7200deg)}.transitions #dot1{opacity:1}.transitions #dot2{opacity:0.875}.transitions #dot3{opacity:0.75}.transitions #dot4{opacity:0.625}.transitions #dot5{opacity:0.5}.transitions #dot6{opacity:0.375}.transitions #dot7{opacity:0.25}.transitions #dot8{opacity:0.125}.fallback-loading-indicator{color:#f1f1f1;display:none;font-size:1.8em;margin:2px auto 0 auto;text-align:center}.scrollbar{background-color:rgba(255,255,255,.1);height:100%;position:absolute;top:0;width:.1em}.scrollbar .handle{background-color:#f1f1f1;position:absolute;width:.1em}.application-message{color:#f1f1f1;font-size:1.8em;position:absolute;text-align:center;text-shadow:#000 .04em .04em;top:50%;width:100%}.debug-watermark{background-color:rgba(235,49,3,0.7);color:#0e0202;display:none;font-size:100%;left:0;padding:1em;position:absolute;bottom:0;width:70%}.debug-watermark.visible{display:block}.debug-console{background:rgba(0,0,0,.9);color:#fff;height:95%;overflow:scroll;padding:1em;position:absolute;right:0;top:0;width:40em;z-index:1}#player-controls .button,#player-controls .toggle-button{font-family:'youtube-icons';speak:none}.fps{position:absolute;right:0;bottom:0;text-align:center;padding-top:0.3em;width:5em;height:1.7em;background-color:#0f0;z-index:100}#html5-player-messages{display:none}#button-list>.icon-player-more:before{content:"\00e632"}.icon-player-play.toggle-selected:before{content:"\00e635"}#loader{z-index:1000}.sliding-highlighter,.pivot-sliding-highlighter{background:white;box-shadow:0 0 60px rgba(153,153,153,.3);display:none;height:26em;position:absolute;width:24em}#settings-items .sliding-highlighter{height:26.2em;width:24.2em}.horizontal-list.focused .sliding-highlighter,.video-uploads.focused .sliding-highlighter,#settings-items.focused .sliding-highlighter{display:block}.video-uploads .sliding-highlighter{height:20em;width:18em}.carousel .item:hover{background-color:#5a5a5a;cursor:pointer}.feed-title.preview{color:#f1f1f1;font-size:1.3em;height:1.3em;opacity:.7;padding-bottom:.6em;padding-left:1.9em}.feed-title .unread-count{background-color:rgba(187,0,0,.9);font-size:.6em;margin-left:.5em;padding:.05em .3em;position:relative;top:-0.265em}.prev-feed{height:3.6em;left:4%;position:absolute;top:5%}.next-feed{height:2em;left:4%;position:absolute;top:84%}.tile{background-color:#000;color:#666;height:26em;list-style:none;overflow:hidden;position:absolute;width:24em}.tile-focus-target{height:0;width:0}.tile-top{background-color:#000;height:50%;width:100%}.channel-top{height:62%;margin:5.25% 16%;width:68%}.channel-top .video-thumb,.tile-top .video-thumb{background-color:#252525;background-position:center;background-repeat:no-repeat;background-size:100%;height:100%}.browse-header-avatar.preloaded,.tile-top .video-thumb.preloaded{background:no-repeat center;background-color:#252525;background-image:url('img/icon-playbutton.png');background-size:auto}.auto-play-tile{overflow:visible}.post-play-title{font-size:1.4em;overflow:hidden;position:absolute;text-overflow:ellipsis;text-shadow:#000 .08em .08em;top:-1.8em;width:15.5em}.auto-play-tile .video-tile{top:0}.auto-play-tile .default-title,.auto-play-tile .next-up-title{color:#cccccc}.post-play-countdown{display:none}.countdown-active .post-play-countdown{color:#fff;display:block;font-size:5em;position:relative;text-align:center;text-shadow:#000 .06em .06em;top:14%}.playlist-tile.focused,.playlist-tile.focused:hover,.auto-play-tile.focused .video-tile,.auto-play-tile.focused:hover .video-tile,.recent-search-tile.focused,.recent-search-tile.focused:hover,.video-tile.focused,.video-tile.focused:hover{background-color:#f1f1f1}.item .overlay{display:none}.playlist-tile .overlay,.video-tile .overlay{background:#000;display:block;height:53%;margin-left:56%;margin-top:-57.5%;opacity:.8;width:45%}.playlist-tile.focused .overlay,.video-tile.focused .overlay{color:#f1f1f1}.playlist-tile .overlay strong{font-size:1.75em;font-weight:normal}.playlist-tile .overlay .count,.video-tile .overlay .count{font-size:1.5em;line-height:1.2em;padding-top:1.7em;text-align:center}.playlist-tile .overlay .icon,.video-tile .overlay .icon{font-family:'youtube-icons';font-size:3em;height:50%;overflow:hidden;padding:.2em;text-align:center}.tile-bottom{height:50%;padding:.25em 0 0 1em;width:23em}.channel-bottom{height:25%;margin-top:2.65em;width:100%}.channel-bottom .title,.tile-bottom .title{color:#999;font-size:1.7em;height:2.45em;line-height:1.25em;margin:.6em .6em 0 0;overflow:hidden;text-align:left;white-space:normal}.channel-bottom .title{height:1.2em;margin:0;padding:0 .6em;text-align:center;text-overflow:ellipsis;white-space:nowrap}.tile.selected.focused .tile-bottom{color:#222}.tile.selected.focused .channel-bottom .details,.tile.selected.focused .tile-bottom .details{color:#999}.tile.selected.focused .channel-bottom .title,.tile.selected.focused .tile-bottom .title{color:#444}.channel-tile .channel-top .decoration{margin-top:-19%;text-align:right;width:97%}.video-tile .tile-top .decoration{margin-top:-2em;text-align:right;width:97.3%}.channel-top .badge,.tile-top .badge,.tile-top .duration{background:rgba(0,0,0,.7);border-radius:0.1em;color:#fff;display:inline-block;font-size:1.4em;padding:0em .1em}.tile-top .badge,.tile-top .duration{text-transform:uppercase}.tile-top .live-badge{background-color:rgba(230,33,23,.8);border:0;color:#fff}.playlist-tile:hover,.video-tile:hover{background-color:#222}.channel-tile .details,.playlist-tile .details,.recent-search-tile .details,.video-tile .details{color:#999;font-size:1.3em;font-weight:300;height:40%;overflow:hidden;padding:0;white-space:normal;word-break:break-all}.channel-tile .details{text-align:center}.playlist-tile .details,.recent-search-tile .details,.video-tile .details{margin:.7em 0em 0em}.custom-playlist-image-tile .tile-top .video-thumb{background-position-x:0%;background-repeat:no-repeat;background-size:56.25%}.playlist-tile.focused .details,.recent-search-tile.focused .details,.video-tile.focused .details{color:#666}.playlist-tile .details .by,.recent-search-tile .results,.video-tile .details .by{height:1.4em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.playlist-tile .details .views,.video-tile .details .views{display:inline-block;padding-right:1.5em}.playlist-tile .details .views:empty,.video-tile .details .views:empty{display:none}.action-tile{border:2px rgba(255,255,255,0.1) solid;color:#fff;height:26em;overflow:visible}.action-tile.focused,.channel-tile.focused{background-color:#fff;color:#222}.action-tile .content{height:26em;white-space:normal}.video-tile .live-start-time{display:inline-block;vertical-align:middle}.tile-top .count-overlay{background:rgba(0,0,0,0.75);font-size:1.4em;height:100%;position:absolute;right:0;text-align:center;top:0;width:30%}.tile-top .count-overlay .video-count{display:block;font-size:2.2em;font-weight:bold;line-height:.8em;margin-top:1.6em}.action-tile .title{font-size:2.4em;height:24%;overflow:hidden;padding-top:0.5em;text-align:center;text-overflow:ellipsis;text-transform:uppercase;white-space:normal}.action-tile .long-title{font-size:2em;text-align:center;white-space:normal}.action-tile .description,.action-tile .remote-pair-text,.action-tile .remote-reset-help{color:#fff;font-size:1.4em;opacity:0;padding:0.5em;text-align:center;white-space:normal}.action-tile.focused .description,.action-tile.focused .remote-pair-text,.action-tile.focused .remote-reset-help,.action-tile.focused .sign-out-username{opacity:1}.action-tile .sign-out-username{font-size:1.7em;margin:1em auto;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap;width:80%}.action-tile .remote-count{font-size:.4em;position:absolute;top:40%;width:100%}.action-tile .remote-standing{display:inline-block;font-size:1.4em;margin:.2em auto;padding:.8em .4em .1em}.action-tile .remote-reset-help{height:2.7em}.action-tile .status{font-size:2em;text-align:center}.row-playing{display:none}.action-tile .large-action-icon{font-family:'youtube-icons';font-size:11em;margin-top:0;text-align:center;width:100%}.action-tile .sign-out-user-icon{background-size:cover;border-radius:20em;height:9em;margin:0 auto;width:9em}.action-tile .search-tile .description{font-size:1.4em;margin-top:2em;position:inherit;text-align:center}.large-action-icon.icon-guide-history{font-size:8em;margin-top:0.2em}.toggle-tile .icon{margin-top:0}.toggle-tile .content .title{height:12%;white-space:nowrap}.toggle-tile .label{font-size:1.8em;max-height:13%;text-align:center;width:100%}.selected .icon-search,.tile.selected .icon-search-clear{color:#222}.exp-densityBrowse .horizontal-list>.content{font-size:100%}.exp-densityBrowse .horizontal-list .no-content-message{display:none}.exp-densityBrowse .horizontal-list .pivot-sliding-highlighter{background:transparent;border:.5em #fff solid;box-shadow:.083em .083em .75em .167em #000 inset;height:7.5em;margin-left:-.4em;margin-top:-.4em;pointer-events:none;width:13.8em}.exp-densityBrowse .horizontal-list.focused .pivot-sliding-highlighter{display:block}.exp-densityBrowse .horizontal-list.focused.channel-selected .pivot-sliding-highlighter{border-radius:50%;height:7.5em;-moz-transform:translateX(3.2em);-o-transform:translateX(3.2em);-webkit-transform:translateX(3.2em);transform:translateX(3.2em);width:7.5em}.exp-densityBrowse .browse-sets .action-tile,.exp-densityBrowse .horizontal-list .channel-tile,.exp-densityBrowse .horizontal-list .video-tile{height:14em;width:14em}.exp-densityBrowse .shelf .horizontal-list .channel-tile,.exp-densityBrowse .shelf .horizontal-list .video-tile,.exp-densityBrowse .shelf .horizontal-list .channel-tile.selected,.exp-densityBrowse .shelf .horizontal-list .video-tile.selected{opacity:.5}.exp-densityBrowse .shelf.selected .horizontal-list .channel-tile,.exp-densityBrowse .shelf.selected .horizontal-list .video-tile,.exp-densityBrowse .horizontal-list .channel-tile,.exp-densityBrowse .horizontal-list .video-tile{opacity:.7}.exp-densityBrowse .shelf.selected .horizontal-list .channel-tile.selected,.exp-densityBrowse .shelf.selected .horizontal-list .video-tile.selected,.exp-densityBrowse .horizontal-list .channel-tile.selected,.exp-densityBrowse .horizontal-list .video-tile.selected,.exp-densityBrowse .horizontal-list .auto-play-tile.selected .video-tile,.limited-animation .exp-densityBrowse .shelf .horizontal-list .channel-tile,.limited-animation .exp-densityBrowse .shelf .horizontal-list .video-tile,.limited-animation .exp-densityBrowse .shelf .horizontal-list .channel-tile.selected,.limited-animation .exp-densityBrowse .shelf .horizontal-list .video-tile.selected,.limited-animation .exp-densityBrowse .shelf.selected .horizontal-list .channel-tile,.limited-animation .exp-densityBrowse .shelf.selected .horizontal-list .video-tile,.limited-animation .exp-densityBrowse .horizontal-list .channel-tile,.limited-animation .exp-densityBrowse .horizontal-list .video-tile{opacity:1}.exp-densityBrowse .horizontal-list .tile-top{height:7.83em}.exp-densityBrowse .channel-top .badge,.exp-densityBrowse .tile-top .badge{font-size:1em;padding:.2em}.exp-densityBrowse .horizontal-list .tile-bottom,.exp-densityBrowse .horizontal-list .channel-bottom{height:4.25em;margin-top:.83em;padding:0;width:100%}.exp-densityBrowse .shelf .horizontal-list .tile-bottom,.exp-densityBrowse .shelf .horizontal-list .channel-bottom{display:none}.exp-densityBrowse .shelf.selected .horizontal-list .tile-bottom,.exp-densityBrowse .shelf.selected .horizontal-list .channel-bottom{display:block}.exp-densityBrowse .browse-sets .action-tile .description,.exp-densityBrowse .horizontal-list .tile-bottom .title,.exp-densityBrowse .horizontal-list .channel-bottom .title{font-size:1.16em;height:initial;line-height:1.25em;margin:0;max-height:2.5em;text-overflow:ellipsis}.exp-densityBrowse .horizontal-list .channel-bottom .title{white-space:normal}.exp-densityBrowse .horizontal-list .video-tile .details{color:#cdcdcd;font-size:.83em;height:initial;margin:.4em 0}.exp-densityBrowse .horizontal-list .video-tile .tile-top .decoration{display:none;line-height:1em;margin-top:0;-moz-transform:translateY(-100%);-o-transform:translateY(-100%);-webkit-transform:translateY(-100%);transform:translateY(-100%);width:100%}.exp-densityBrowse #search .tile-top .decoration,.exp-densityBrowse #post-play-list .tile-top .decoration,.exp-densityBrowse .shelf.selected .horizontal-list .tile-top .decoration{display:block}.exp-densityBrowse .horizontal-list .video-tile .tile-top .badge{border-radius:0}.exp-densityBrowse .horizontal-list .video-tile .tile-top .duration{background:rgba(0,0,0,.5);font-size:1em;font-weight:bold;padding:.5em}.exp-densityBrowse .horizontal-list .channel-bottom .details{display:none}.exp-densityBrowse .horizontal-list .video-tile .details .views,.exp-densityBrowse .horizontal-list .video-tile .details .age{display:inline-block}.exp-densityBrowse .horizontal-list .video-tile .details .views{padding-right:.5em}.sets-ui .exp-densityBrowse .horizontal-list .channel-tile.selected .channel-bottom>.title,.sets-ui .exp-densityBrowse .horizontal-list .auto-play-tile.selected .tile-bottom>.title,.sets-ui .exp-densityBrowse .horizontal-list .video-tile.selected .tile-bottom>.title{color:#fff}.exp-densityBrowse .video-tile .overlay{height:7.83em;margin-left:60%;margin-top:-7.83em;width:40%}.exp-densityBrowse .video-tile .overlay .count{font-size:1em;line-height:1em;padding-top:1.5em}.exp-densityBrowse .video-tile .overlay .icon{font-size:2em;padding:0}.exp-densityBrowse .horizontal-list .channel-top{height:7.83em;margin:0 auto;width:7.83em}.exp-densityBrowse .horizontal-list .channel-top .video-thumb{border-radius:50%}.exp-densityBrowse .browse-sets .shelf>.title{font-size:1em;margin-bottom:.9em;margin-top:0}.exp-densityBrowse .browse-sets .shelf>.title .main{font-size:1.5em}.exp-densityBrowse .browse-sets .shelf>.title .annotation{font-size:1em}.exp-densityBrowse .browse-sets .shelf>.title{color:#cdcdcd}.engaged.exp-densityBrowse .channel-tile .voice-command,.engaged.exp-densityBrowse .video-tile .voice-command{font-size:1em;line-height:1em;margin-top:-2em}.limited-animation.sets-ui .exp-densityBrowse .video-tile:hover:not(.focused),.limited-animation.sets-ui .exp-densityBrowse .channel-tile:hover:not(.focused),.sets-ui .exp-densityBrowse .carousel .item:hover,.sets-ui .exp-densityBrowse .carousel .auto-play-tile:hover,.sets-ui .exp-densityBrowse .carousel .channel-tile:hover{background-color:inherit!important;opacity:1}.exp-densityBrowse .browse-sets .action-tile{border:none}.exp-densityBrowse .browse-sets .action-tile .content{height:7.83em;margin-bottom:.83em}.exp-densityBrowse .browse-sets .action-tile .title{display:none}.exp-densityBrowse .browse-sets .action-tile .large-action-icon{background-color:#232323;color:#fff;font-size:6em;height:1.3em;line-height:1.3em}.exp-densityBrowse .browse-sets .action-tile .description{opacity:inherit;padding:0}.exp-densityBrowse .auto-play-tile{height:14em;width:14em}.exp-densityBrowse .post-play-countdown{top:7%}.limited-animation .exp-densityBrowse .browse-content .list{margin-left:-7.5em;width:inherit}.limited-animation .exp-densityBrowse .browse-content .shelf>.title{margin-left:7.5em}.limited-animation .exp-densityBrowse .browse-content .list .shelf:nth-child(1){margin-bottom:6.5em}.limited-animation .exp-densityBrowse .browse-content .list .shelf{margin-bottom:-.1em}.limited-animation.sets-ui .exp-densityBrowse .channel-tile:not(.focused),.limited-animation.sets-ui .exp-densityBrowse .video-tile:not(.focused){background-color:inherit}.limited-animation .exp-densityBrowse .channel-tile.focused,.limited-animation .exp-densityBrowse .video-tile.focused{background-color:inherit}.limited-animation .exp-densityBrowse .video-tile{margin-right:.5em}.limited-animation .exp-densityBrowse .video-tile .overlay{height:7.03em;margin-left:8em;margin-top:-7.43em;width:5.6em}.limited-animation .exp-densityBrowse .video-tile .tile-top{background:inherit;height:7.03em;padding:.4em;width:13.2em}.limited-animation .exp-densityBrowse .channel-tile{margin-right:.5em}.limited-animation .exp-densityBrowse .channel-tile .channel-top{height:6.83em;padding:.4em;width:6.83em}.limited-animation .exp-densityBrowse .video-tile.focused .tile-top{background:#fff}.limited-animation .exp-densityBrowse .channel-tile.focused .channel-top{background:#fff;border-radius:50%}.limited-animation .exp-densityBrowse .search .placeholder-tile,.limited-animation .exp-densityBrowse .browse-content .list .placeholder-tile{height:14em;margin-right:.5em;width:14em}#dialog.remote-reset-dialog>.title{font-size:3em;padding-bottom:.5em}#dialog.remote-reset-dialog .buttons{bottom:.5em;position:absolute}#dialog.remote-reset-dialog{left:0;position:absolute;white-space:normal}.remote-reset-dialog #dialog-view{color:#aaa;font-size:1.8em;padding-top:0.5em}.connection-instructions{padding-top:.5em;font-size:2em}.text-dialog .connection-instructions{font-size:1.3em}.browse-sets-state .login-dialog{margin-top:5em}#search .pairing .pairing-content>*,#dialog .pairing .pairing-content>*{display:inline-block}#search .pairing .pairing-content .step2,#dialog .pairing .pairing-content .step2{display:block}#search .dial-upsell .connection-steps .no-dial-connect-step1,#search .manual-connect .connection-steps .with-dial-connect-step1{display:none}.connection-instructions .step1,.connection-instructions .step2,.qr-code .scan,.pairing .connected-header,.remote-reset-dialog .connected-header{color:#aaa;font-size:.7em}.connection-instructions .pair-url,.connection-instructions .pair-code{color:#f1f1f1}.connection-instructions .step2{margin-top:2em}.pairing .qr-code,.pairing .connected-list{display:inline-block;margin-left:1em;vertical-align:top}.pairing .dial-upsell{color:#aaa;display:inline-block;font-size:95%;overflow:hidden;padding-left:2em;padding-top:0.8em;text-align:initial;vertical-align:top;white-space:normal;width:16em}.pairing .cast-icon{background:url(img/cast_disconnected_blue.png) no-repeat center;background-size:contain;display:inline-block;height:1em;margin:.1em .3em;vertical-align:middle;width:1em}.pairing .qr-code .scan{margin-bottom:.5em;white-space:normal;width:5em}.pairing .qr-code img{height:5.1em;width:5.1em}.pairing .icon-settings-pair,.login-dialog .icon-settings-pair{background-image:none;display:inline-block;font:5em 'youtube-icons';height:1em;margin-top:.1em;width:1.4em}.remote-reset-dialog .connected-header,.pairing .connected-header{margin-bottom:.3em}.remote-reset-dialog .devices,.pairing .devices{list-style:none;font-size:1.5em;color:#f1f1f1}.remote-reset-dialog .devices>div,.pairing .devices>div{display:block;height:1.5em;line-height:1.5em;overflow:hidden;padding-left:1.5em;text-overflow:ellipsis;white-space:nowrap;width:11.5em}.remote-reset-dialog .devices .connected:before{background-position:0 100%}.remote-reset-dialog .devices .connected{color:#f1f1f1}#search{bottom:0;color:#f1f1f1;left:0;overflow:hidden;position:absolute;right:0;text-align:center;top:0}.watch-state #search{left:0}#search>.controls{left:8em;margin-right:18em;position:absolute;right:2.5em;text-align:left;top:2.5em}#search-text-box{background-color:#e1e1e1;font-size:1.6em;height:100%;margin:0 auto;overflow:hidden;position:relative}#search-text-box>.icon-search{display:none}#search-input{background:none;border:none;color:#111;height:100%;padding-left:.5em;width:100%}#search-input:disabled{color:#111}#search-query{color:#111;height:100%;overflow:hidden;padding-left:.5em;padding-top:.3em;position:absolute;text-overflow:ellipsis;white-space:pre;width:95%}#search-suggestions{font-size:1.2em;position:relative;display:inline-block;left:0;width:100%}.search-state #spinner{top:26em}#suggest-list{overflow:hidden}#suggest-list>div{border-radius:1px;color:#e1e1e1;display:inline-block;padding:.2em .5em}#search-keyboard{font-size:1em;text-align:left;width:65%}#search-suggestions,#search-keyboard,#letter-suggest{white-space:nowrap}#search-keyboard,#letter-suggest{z-index:1}#keyboard-grid{display:inline-block;font-size:1.6em;margin:0 auto;overflow:hidden;text-align:left}#keyboard-grid,#keyboard-spacebar{color:#a3a3a3}#keyboard-grid .button{border-radius:1px;display:inline-block;margin:.3em .6em .3em 0;padding:0 .1em;text-align:center;text-transform:uppercase;width:1em;vertical-align:top}#keyboard-grid .list{text-align:left;text-shadow:none}#search-keyboard #keyboard-grid .icon-key-delete.button{font-family:'youtube-icons';font-size:.7em;line-height:1.2em;margin-left:2.25em;padding:.25em;width:2.25em}#keyboard-spacebar{border-radius:1px;display:inline-block;font-family:'youtube-icons';font-size:1.44em;margin:.1em 7em 0 2.1em;padding:.1em;text-align:left}#search-keyboard #keyboard-grid .clear-query-tile.button{font-size:.7em;margin-left:2.25em;padding:.25em;text-transform:uppercase;width:auto}#keyboard-grid .icon-key-globe{font-family:'youtube-icons';margin:.25em 0 .25em 1.6em;padding:.1em;width:1.2em}#search-keyboard .button.focused{background-color:#e1e1e1;color:#212121}#letter-suggest{font-size:1.6em;position:fixed;text-align:center;width:1.2em}.letter-suggest-visible #keyboard-grid .list.selected .button.selected:not(.focused){background-color:rgba(153,153,153,.85);color:#000;text-shadow:none}#keyboard-grid .button.numbers-toggle-tile{font-size:.75em;padding:.22em;margin:.25em 0 0 2.1em;width:auto}#search .pairing .icon-settings-pair{display:none}#search .search-message{display:inline-block;margin-left:2em;margin-top:1.5em;vertical-align:top;white-space:normal;width:50%}#search .search-pairing{background-color:rgba(0,0,0,.3);bottom:0;display:inline-block;left:5em;padding:2em 2.5em 4em;position:absolute;text-align:left;text-shadow:-1px 1px 2px black;width:100%}.limited-animation #search .search-pairing{background-color:#000}#search .search-pairing .search-img{background-image:url(img/pair_promo.png);background-size:cover;display:inline-block;height:11em;width:11em}#search .search-pairing .title{font-size:1.9em}#search .search-pairing .connection-instructions{font-size:1.6em}#search .search-pairing .dial-upsell-content{color:#aaa}#search .search-pairing .manual-connect-content .connection-steps{padding:0}#search .search-pairing .manual-connect-content .connection-steps .pair-code,#search .search-pairing .manual-connect-content .connection-steps .pair-url{display:block}#search .search-pairing .manual-connect-content .connection-steps .step2{margin-top:1em}#search .search-pairing .manual-connect-content .connection-steps .label,#search .search-pairing .manual-connect .dial-upsell-content,#search .search-pairing .dial-upsell .manual-connect-content{display:none}#search .pairing .no-dial-connect-step1,#search .pairing .no-dial-connect-step2{display:inline-block}#search .pairing .no-dial-connect-step2{margin-left:2em}#search .pairing .connection-steps{text-align:left}#search .pairing .connected-list,#search .pairing .qr-code-wrapper{display:none}#search.hide-input .search-pairing{margin-top:8em}#letter-suggest div{background-color:rgba(153,153,153,.85);color:rgba(0,0,0,.8);height:1.4em;text-shadow:none}#letter-suggest .focused{color:#f1f1f1}#transliteration-container{display:none}#search-keyboard.transliterable #transliteration-container{display:block}#transliteration .list{font-size:2em;height:1.2em;margin:0 auto;overflow:hidden;padding:.2em 0;text-align:center;width:77%}#transliteration .list>div{display:inline;padding:0 .5em;position:relative}#suggest-list>div.focused,#transliteration .list .focused{background-color:#fefefe;color:#212121}#transliteration .button:hover{background-color:rgba(153,153,153,.4)}#transliteration .button:hover,#search-keyboard .button:hover{cursor:pointer}#search .horizontal-list>.content{text-align:left}.limited-animation.sets-ui #search .horizontal-list>.content{margin-left:-21.8em;width:126em}#search .horizontal-list{left:7.5em;height:inherit;position:absolute;right:0;top:38%;-o-transform:translateY(7.5em);-webkit-transform:translateY(7.5em);transform:translateY(7.5em);-o-transition:opacity .25s -o-transform .25s;-webkit-transition:opacity .25s,-webkit-transform .25s;transition:opacity .25s,transform .25s;width:initial}#search.input-collapsed .horizontal-list{-o-transform:none!important;-webkit-transform:none!important;transform:none!important}#search-keyboard{-o-transition:opacity .25s -o-transform .25s;-webkit-transition:opacity .25s,-webkit-transform .25s;transition:opacity .25s,transform .25s;transform-origin:top}#search-keyboard.hidden{display:block!important;opacity:0;-o-transform:scaleY(.5);-webkit-transform:scaleY(.5);transform:scaleY(.5)}#search #search-text-entry{height:2.4em}#search #search-suggestions,#search #search-text-entry{background-color:rgba(0,0,0,0);padding-top:.25em;-o-transform-origin:top;-webkit-transform-origin:top;transform-origin:top;-o-transition:opacity .25s -o-transform .25s;-webkit-transition:opacity .25s,-webkit-transform .25s;transition:opacity .25s,transform .25s}.limited-animation #search .horizontal-list,.limited-animation #search #search-suggestions,.limited-animation #search #search-text-entry,.limited-animation #search #search-keyboard{-o-transition:none;-webkit-transition:none;transition:none}#search-text-entry{padding-bottom:.4em}#search-text-entry,#text-box-background{height:3em}#keyboard-icon{display:none;font-family:'youtube-icons';font-size:1.2em;padding-bottom:.4em;text-align:center;vertical-align:bottom;width:2em}.input-collapsed #keyboard-icon{display:inline-block}#search-text-entry .suggestions-container{white-space:nowrap;overflow:hidden;height:2.4em}.exp-densityBrowse #search .horizontal-list{font-size:100%;height:14em;top:35%;-moz-transform:translateY(8em);-o-transform:translateY(8em);-webkit-transform:translateY(8em);transform:translateY(8em)}.limited-animation .exp-densityBrowse #search .horizontal-list .list{margin-left:-14em}.exp-densityBrowse #search .horizontal-list .video-tile{height:14em}.exp-densityBrowse #search .horizontal-list .video-tile .details .views,.exp-densityBrowse #search .horizontal-list .video-tile .details .age{display:inline-block}.exp-densityBrowse #search .horizontal-list .video-tile .details .views{padding-right:.5em}.limited-animation.sets-ui .exp-densityBrowse #search .horizontal-list>.content{margin-left:0;width:inherit}#player{height:100%;width:100%}.watch-state #watch{display:block}.wiiu #watch{background-color:#000;height:100%}#player-facade{height:100%;position:absolute;width:100%}#player-video{height:100%}#watch,.dialog-focused .standard-caption-window,#caption-window-99,.countdowntimer,.ytp-cued-icon,.ytp-fallback,.html5-context-menu,.html5-dialog-holder,.html5-endscreen,.html5-info-bar,.html5-modal-panel,.html5-player-chrome,.html5-show-video-info-template,.html5-storyboard,.html5-text-button,.html5-video-player .hid,.html5-ypc-module,.player-actions-container,.video-ad-status-bar,.video-annotations,.html5-watermark,.video-fallback-content,.video-ads,.title-card.hidden{display:none}.html5-video-player{overflow:visible}.html5-video-info-panel{background-color:rgba(0,0,0,.7);color:#f1f1f1;display:none;margin:20%;position:absolute;top:0;z-index:1}.html5-video-info-panel-close{display:none}.html5-video-info-panel-content>div>div{display:inline-block;font-weight:bold;padding:0 .5em;text-align:right;width:10em}.ad-video{width:100%;height:100%}.ad-showing .video-ads{display:block;overflow:hidden}.ad-interrupting.tag-pool-enabled .html5-main-video{position:absolute;left:-1px;top:-1px;overflow:hidden;width:1px!important;height:1px!important}.html5-video-player .video-stream{position:absolute;top:0;left:0;display:block}.opera .video-stream{height:720px;width:1280px}.advertisement-info,.skip-ad-button{position:absolute;top:9.5em}.advertisement-info{left:12.5%;text-align:left;width:30%;overflow:hidden}.advertisement-info-top{height:3em}.advertisement-avatar{width:3em;height:3em;display:inline-block;margin-right:.4em;background-position:right center;background-repeat:no-repeat;background-size:contain}.advertisement-info-details{display:inline-block;vertical-align:top;width:79%}.advertisement-title,.advertisement-advertiser,.third-party{color:#fff;text-shadow:2px 1px #000;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.third-party{position:absolute;bottom:0}.advertisement-title{font-size:1.4em;line-height:1em;height:1.1em}.advertisement-advertiser{font-size:1.1em;line-height:1.3em;height:1.4em}.advertisement-info .ad-badge{background-color:#e6bc27;padding:1px 5px;text-shadow:none;border-radius:.15em;font-size:.9em;text-transform:capitalize}.skip-ad-button{right:12.5%;border-radius:.15em;background-color:rgba(0,0,0,.4);padding:.6em}.canskip.mdx-skip.skip-ad-button{height:4.0em;width:18em}.canskip.mdx-skip .skip-button-text{font-size:1.1em;height:3em;left:2.0em;line-height:1.5em;position:absolute;top:.7em;width:75%}#transport-controls.ad-active .player-controls #button-list div.skip-ad-button .label,.skip-ad-button .label{font-size:1.1em;padding:0 1.4em;height:2.5em;line-height:2.5em;border-radius:.12em;cursor:pointer;background-color:rgba(0,0,0,0);color:#e1e1e1}.skip-ad-button.canskip.mdx-skip .label{height:3.7em}#transport-controls.ad-active .player-controls #button-list div.skip-ad-button.canskip:hover .label,.skip-ad-button.canskip:hover .label{background-color:#fff;color:#212121;border-radius:.12em}#transport-controls.ad-active .player-controls #button-list div.skip-ad-button.canskip.focused .label,.skip-ad-button.canskip.focused .label{background-color:#e1e1e1;color:#212121;border-radius:.12em}.skip-ad-button .skip-symbol{display:none;font-family:'youtube-icons'}.skip-ad-button.canskip .skip-symbol.icon-player-next{display:inline;font-size:1.3em;margin-left:.5em;vertical-align:middle}.exp-newMdxSkipButtonCast .canskip.mdx-skip.skip-ad-button .skip-symbol.icon-cast_on{display:inline;font-size:2.5em;position:absolute;right:.7em;text-align:right;top:.5em;width:25%}.exp-newMdxSkipButtonPair .canskip.mdx-skip.skip-ad-button .skip-symbol.icon-settings-pair{display:inline;font-size:4em;position:absolute;right:.4em;text-align:right;top:.3em;width:25%}.canskip.mdx-skip.skip-ad-button .skip-symbol.icon-player-next{display:none}#player-controls{text-align:center}#bottom-half{bottom:0;height:50%;position:absolute;width:100%}#transport-controls{background:-o-linear-gradient(rgba(0,0,0,0),rgba(0,0,0,1));background:-webkit-linear-gradient(rgba(0,0,0,0),rgba(0,0,0,1));background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,1));bottom:0;height:100%;position:absolute;-o-transition:-o-transform .25s,opacity .25s;-webkit-transition:-webkit-transform .25s,opacity .25s;transition:transform .25s,opacity .25s;width:100%}#transport-controls.hidden{display:block!important;opacity:0}.limited-animation #transport-controls.hidden{display:none!important}#transport-controls,#transport-controls.focused{display:block}.player-controls-widget{border:0;margin-top:8.4em}.fresh-transport-controls.seeking-forward .seeking-icon.icon-player-rew:before{content:"\00e62c"}.seeking-icon{bottom:3em;color:#fff;display:none;position:absolute;left:0;margin:0 auto;right:0}.seeking-icon span{display:none}.fresh-watch.watch-seeking .seeking-icon{display:block}.fresh-watch .title-card{background:-webkit-linear-gradient(top,rgba(0,0,0,.75),transparent);background:-o-linear-gradient(top,rgba(0,0,0,.75),transparent);background:linear-gradient(to bottom,rgba(0,0,0,.75),transparent);height:35.9%}#transport-controls.fresh-transport-controls{background:-webkit-linear-gradient(bottom,#000,transparent);background:-o-linear-gradient(bottom,#000,transparent);background:linear-gradient(to top,#000,transparent)}.fresh-watch .player-video-title{color:rgba(255,255,255,1);font-size:1.936em}.fresh-watch .player-meta .player-video-details{color:rgba(255,255,255,0.7);font-size:1.455em}.fresh-watch .pivot-shelf-list{margin-top:14.5em;padding-left:3.871em}#fresh-rows-container{border:0;color:#fff;margin-top:7.7em}.fresh-transport-controls .storyboards{position:absolute}.fresh-transport-controls .more-row,.fresh-transport-controls .main-row{margin-left:5%;width:95%}.fresh-transport-controls .button span,.fresh-transport-controls .toggle-button span{display:none;font-family:'roboto-regular';color:rgba(255,255,255,1)}.lang-case-sensitive .fresh-transport-controls span:first-letter{text-transform:uppercase}.fresh-transport-controls .button.disabled:hover,.fresh-transport-controls .toggle-button.disabled:hover{background-color:transparent}.fresh-transport-controls .button.disabled,.fresh-transport-controls .toggle-button.disabled{opacity:.45}.fresh-transport-controls .button.focused,.fresh-transport-controls .toggle-button.focused,.fresh-transport-controls .button:hover,.fresh-transport-controls .toggle-button:hover{background-color:rgba(255,255,255,.5);color:#fff}.fresh-transport-controls .button,.fresh-transport-controls .toggle-button,.seeking-icon{border-radius:4px;font-family:'youtube-icons';font-size:1.4em;height:1em;padding:.55em;speak:none;text-align:center;width:1em}.fresh-transport-controls .button,.fresh-transport-controls .toggle-button{color:rgba(255,255,255,.7);cursor:pointer;display:inline-block;position:relative}.fresh-transport-controls #transport-more-button:before{display:inline-block;left:19%;position:absolute;top:-9%}.fresh-transport-controls #transport-more-button{font-size:2em;height:.7em;margin-right:1.452em;padding:.385em;width:.7em}.fresh-transport-controls #transport-more-button span{color:#fff;display:inline-block;font-size:.485em;left:4.5em;position:absolute;text-align:left;top:1em;width:15em}.fresh-transport-controls #transport-more-button.top-row-active span{display:none}.fresh-transport-controls #transport-more-options-list{display:inline-block}.fresh-transport-controls .progress-bar{display:inline-block;height:3em;left:0;padding:0;position:relative;top:0;width:76.55%}.fresh-transport-controls.live-playback #play-pause-button{margin-right:1em}.fresh-transport-controls.live-playback .progress-bar{width:77.55%}.fresh-transport-controls.live-playback .live-indicator{display:inline-block;left:0;margin-left:1em;position:relative;top:0}.fresh-transport-controls #player-time-elapsed,.fresh-transport-controls .player-time-total{color:rgba(255,255,255,1);display:inline-block;font-size:1.3em;position:relative;text-align:center;top:0;width:8%}.fresh-transport-controls .more-row{margin-bottom:5px}.fresh-transport-controls .more-row .button,.fresh-transport-controls .more-row .toggle-button{margin-right:2.075em;vertical-align:top}.fresh-transport-controls .icon-like.toggle-selected,.fresh-transport-controls .icon-dislike.toggle-selected,.fresh-transport-controls .icon-player-closedcaptions.toggle-selected{color:#2793e6}.fresh-transport-controls .icon-logo-lozenge.toggle-selected{color:#f00}.fresh-transport-controls .more-row .button span,.fresh-transport-controls .more-row .toggle-button span{font-size:.692em;left:-3.45em;position:relative;top:-4.4em;width:8.3em}.fresh-transport-controls .more-row .button.focused span,.fresh-transport-controls .more-row .toggle-button.focused span,.fresh-transport-controls .more-row .button:hover span,.fresh-transport-controls .more-row .toggle-button:hover span{display:inline-block}.fresh-transport-controls .progress-bar .progress-bar-line div{height:.242em}.fresh-transport-controls .progress-bar .progress-bar-line .progress-bar-background{background-color:rgba(255,255,255,0.45)}.fresh-transport-controls .progress-bar .progress-bar-line .progress-bar-loaded{background-color:#fff}.fresh-transport-controls .progress-bar .progress-bar-line .progress-bar-played{background-color:#df2323}.fresh-transport-controls .progress-bar.ad-active .progress-bar-played{background-color:#e7bd00}.ypc-playback .fresh-transport-controls .progress-bar-line .progress-bar-played{background-color:#2793e6}.fresh-watch .ad-point-separator,.fresh-transport-controls .progress-bar .progress-bar-disc,.fresh-transport-controls.ad-active #player-time-elapsed,.fresh-transport-controls.ad-active .player-time-total{display:none}.fresh-transport-controls.ad-active .progress-bar{padding-left:1em;width:88%}.fresh-transport-controls.ad-active .more-row,.fresh-watch.watch-seeking .more-row{visibility:hidden}.fresh-watch .skip-ad-button,.fresh-watch .advertisement-info{top:6.7em}.fresh-watch .advertisement-info{left:5%}.fresh-watch .advertisement-info .advertisement-info-top{height:3.065em;position:relative}.fresh-watch .skip-ad-button{border-radius:4px;background-color:rgba(0,0,0,.5);padding:0;right:6%;z-index:1}.fresh-watch .skip-ad-button .label{color:#fff;font-size:1.13em;height:2.57em;line-height:2.57em;padding:0 1.3em}.fresh-watch .skip-ad-button .skip-symbol{font-size:1.1em}.fresh-watch .skip-ad-button.canskip:hover,.fresh-watch .skip-ad-button.canskip.focused{background-color:rgba(255,255,255,.5)}.fresh-watch .skip-ad-button.canskip:hover .label,.fresh-watch .skip-ad-button.canskip.focused .label{background:none;color:#fff}.fresh-watch .advertisement-info{color:#fff}.fresh-watch .advertisement-info .advertisement-advertiser{font-size:100%;height:1.4em;line-height:1.3em}.fresh-watch .advertisement-info .advertisement-advertiser>span{vertical-align:bottom}.fresh-watch .advertisement-info .advertisement-advertiser,.fresh-watch .advertisement-info .advertisement-title,.fresh-watch .advertisement-info .third-party{overflow:hidden;text-shadow:none;text-overflow:ellipsis;white-space:nowrap}.fresh-watch .advertisement-info .third-party{bottom:0;position:absolute;vertical-align:top;width:79%}.fresh-watch .advertisement-info .third-party>span{vertical-align:middle}.fresh-watch .advertisement-info .advertisement-title{font-size:1.35em;font-weight:bold;line-height:1em;height:1.1em;padding-bottom:1%;text-shadow:none}.fresh-watch .advertisement-info .ad-badge{background-color:#e7bd00;border-radius:.15em;font-size:.85em;font-weight:bold;padding:1px 7px;text-shadow:none;text-transform:capitalize}.fresh-watch .advertisement-info .remaining-duration,.fresh-watch .advertisement-info .ad-by{font-size:1.13em}.fresh-watch .advertisement-info .remaining-duration{padding:0 2%}.fresh-watch .advertisement-info .advertisement-avatar{background-repeat:no-repeat;background-size:contain;border-radius:50%;display:inline-block;height:3.065em;margin-right:1.4em;width:3.065em}.title-card{background:-o-linear-gradient(top,rgba(0,0,0,.9),rgba(0,0,0,.8),transparent);background:-webkit-linear-gradient(top,rgba(0,0,0,.9),rgba(0,0,0,.8),transparent);background:linear-gradient(to bottom,rgba(0,0,0,.9),rgba(0,0,0,.8),transparent);display:block;height:25%;position:absolute;top:0;-o-transition:-o-transform .25s,opacity .25s;-webkit-transition:-webkit-transform .25s,opacity .25s;transition:transform .25s,opacity .25s;width:100%}.ypc-playback .title-card{height:30%}.title-card.hidden{display:block!important;opacity:0}.limited-animation .title-card.hidden{display:none!important}.title-card .badges span{border:1px solid #ddd;border-radius:2px;display:inline-block;font-size:.9em;margin-left:1em;padding:0 .5em 0;text-transform:uppercase;vertical-align:middle}.title-card .badges span.live-badge{color:#fff;border:0;background-color:rgba(230,33,23,.8);margin-left:0}.selected-title .views{margin-top:-.6em}.player-meta{color:#f1f1f1;margin:2.6em 0 0 3.5em;white-space:nowrap;width:90%}.player-meta .user-details{position:absolute;right:5%}.player-meta .user-details>div{display:inline-block;vertical-align:top}.player-meta .user-details .avatar{background-size:cover;height:4em;width:4em}.player-meta .user-details .message{font-size:80%;margin:.2em 1em 0 1.1em;max-width:50%;overflow:hidden;text-overflow:ellipsis}.player-meta .player-video-text{display:inline-block;padding-left:1.5em;width:90%}.player-meta .player-video-details{font-size:1.5em;white-space:initial}.player-meta .player-video-details>div{margin:.2em 1em 0 0;vertical-align:top}.player-meta .player-video-details .username{max-width:45%;overflow:hidden;text-overflow:ellipsis}.player-meta .player-video-details .set-context{max-width:45%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.player-meta .player-video-details .set-context,.player-meta .player-video-details .set-context-position,.player-meta .player-video-details .uploaded-date,.player-meta .player-video-details .view-count,.player-meta .player-video-details .badges,.player-meta .player-video-details .username{display:inline-block}.player-video-avatar{background-size:contain;border-radius:50%;display:inline-block;height:5.5em;vertical-align:top;width:5.5em}.player-video-title{font-size:2.4em;margin:-.1em 0 0 0;overflow:hidden;text-overflow:ellipsis}.quality-status{display:none;padding-top:.2em}.title-tray-inflated .quality-status{display:inline-block}.quality-status-hd-badge{background:#f1f1f1;border-radius:2px;color:#414141;font-size:.6em;font-weight:bold;padding:.125em .5em}.ypc-preview{display:none}.ypc-playback .ypc-preview{display:block}.player-controls #button-list .focused,.player-controls #button-list div:hover{-webkit-border-radius:.05em;color:#000}.player-controls #button-list .focused{background-color:#fff}.player-controls #button-list div:hover{background-color:#9d9495}.player-controls #button-list .button,.player-controls #button-list .toggle-button{display:inline-block;font-size:1.4em;height:1.3em;margin:1em 1em;padding-bottom:.4em;padding-top:.8em;top:0;width:2.3em}.player-controls #button-list .button span,.player-controls #button-list .toggle-button span{font-family:'roboto-regular';font-size:.7em;left:-10%;margin:.5em 0 0;width:120%;height:120%}.player-controls #button-list .button.spacer{visibility:hidden;cursor:auto}#transport-controls.focused .player-controls #button-list div{color:#fff}#transport-controls.focused .player-controls #button-list .focused{color:#222}.player-controls #button-list div{color:#aaa;cursor:pointer;vertical-align:middle}#transport-controls.ad-active .player-controls #button-list div.disabled{visibility:hidden}#transport-controls.ad-active .player-controls #button-list div.skip-ad-button.disabled{visibility:visible;opacity:1}.player-controls #button-list div.disabled:hover{background-color:transparent;color:#fff}.player-controls #button-list div.focused{opacity:1}.player-controls #button-list div.disabled{opacity:.2}.player-controls #button-list .icon-player-closedcaptions.toggle-selected,.player-controls #button-list .icon-like.toggle-selected,.player-controls #button-list .icon-dislike.toggle-selected{color:#2793e6!important}.player-controls #button-list .icon-logo-lozenge.toggle-selected{color:#f00!important}#transport-controls .player-controls #button-list div.icon-player-more,#transport-controls .player-controls #button-list div.icon-player-less{color:#858585}.player-controls .toggle-button span,.player-controls .button span,.player-controls .toggle-button.disabled span,.player-controls .button.disabled span{display:none;margin-top:1em;color:#fff;font-size:.75em;padding:0;position:relative;text-align:center;top:1em;width:100%}.lang-case-sensitive .player-controls .button span:first-letter,.lang-case-sensitive .player-controls .toggle-button span:first-letter{text-transform:uppercase}#transport-controls.focused,.player-controls .toggle-button.focused span,.player-controls div:hover.toggle-button span,.player-controls .button.focused span,.player-controls div:hover.button span{display:block}.player-seekbar{position:relative}.progress-bar{height:4em;left:11%;position:absolute;top:-9em;width:75%;padding:0 1.5%}.progress-bar .progress-bar-playhead,.progress-bar .progress-bar-line{top:2.5em}.progress-bar .progress-bar-line{position:relative;width:100%}.progress-bar .progress-bar-line div{height:2px;position:absolute}.progress-bar .progress-bar-playhead{height:2px;position:relative;width:100%}.progress-bar .progress-bar-line .progress-bar-background{width:100%;background-color:#5b5b5b}.progress-bar .progress-bar-line .progress-bar-played{background-color:#e32c29}.progress-bar .progress-bar-line .progress-bar-loaded{background-color:#999}.ypc-playback .progress-bar-line .progress-bar-played{background-color:#2793e6}.progress-bar .progress-bar-disc{background-color:#ccc;border-radius:50%;height:.6em;margin:-.25em 0 0 -.25em;position:absolute;width:.6em}.progress-bar .cue-range-markers{height:100%;position:absolute;width:100%}.progress-bar-disc{pointer-events:none}.ad-active .progress-bar .cue-range-markers{visibility:hidden}.progress-bar .cue-range-markers .cue-range-marker{background-color:rgba(255,255,255,0);height:2px;margin:0 0 0 -.1em;position:absolute;width:.2em}.progress-bar .cue-range-markers .ad-marker{background-color:#e6bc27}.progress-bar.ad-active .progress-bar-played{background-color:#d6cb23}#player-time-elapsed,.player-time-total,.live-indicator{color:rgba(255,255,255,.75);font-size:1.2em;position:absolute;top:-6em;width:12%}.limited-graphics #player-time-elapsed,.limited-graphics .player-time-total{color:#fff}#player-time-elapsed{left:0;text-align:right}.player-time-total,.live-indicator{right:0;text-align:left}#transport-controls.ad-active #player-time-elapsed,#transport-controls.ad-active .player-time-total{display:none}.live-indicator{display:none;font-size:1.3em;position:absolute;top:-5.6em;width:11.7%}.live-playback .live-indicator{display:block}.live-playback .player-time-total,.live-playback .elapsed-time,.fresh-transport-controls.live-playback .player-time-total,.fresh-transport-controls.live-playback #player-time-elapsed{display:none}.live-playback .progress-bar-disc{background-color:#e62117}#watch .loading-indicator{top:30%}#transport-spacer:hover{background:none}.html5-video-controls{position:absolute;width:100%;height:0;bottom:2em;-moz-transition:all .6s ease;-ms-transition:all .6s ease;-o-transition:all .6s ease;-webkit-transition:all .6s ease}.ytp-player-content{position:absolute;bottom:0;height:0;left:0;right:0}.html5-video-content{position:absolute}.caption-window{position:absolute;pointer-events:none}.standard-caption-window{position:absolute;white-space:normal;width:80%}.caption-window-transform{display:inline-block;line-height:1.32em}.html5-video-player .captions-text{position:relative}.html5-video-player .caption-row{padding-bottom:5px;padding-top:5px}.anchor-point-1{-moz-transform:translate(-50%,0);-ms-transform:translate(-50%,0);-o-transform:translate(-50%,0);-webkit-transform:translate(-50%,0);transform:translate(-50%,0)}.anchor-point-2{-moz-transform:translate(-100%,0);-ms-transform:translate(-100%,0);-o-transform:translate(-100%,0);-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}.anchor-point-3{-moz-transform:translate(0,-50%);-ms-transform:translate(0,-50%);-o-transform:translate(0,-50%);-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.anchor-point-4{-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.anchor-point-5{-moz-transform:translate(-100%,-50%);-ms-transform:translate(-100%,-50%);-o-transform:translate(-100%,-50%);-webkit-transform:translate(-100%,-50%);transform:translate(-100%,-50%)}.anchor-point-6{-moz-transform:translate(0,-100%);-ms-transform:translate(0,-100%);-o-transform:translate(0,-100%);-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}.anchor-point-7{-moz-transform:translate(-50%,-100%);-ms-transform:translate(-50%,-100%);-o-transform:translate(-50%,-100%);-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.anchor-point-8{-moz-transform:translate(-100%,-100%);-ms-transform:translate(-100%,-100%);-o-transform:translate(-100%,-100%);-webkit-transform:translate(-100%,-100%);transform:translate(-100%,-100%)}.anchor-point-0,.anchor-point-1,.anchor-point-2{padding-top:3em}.watch.transport-showing .anchor-point-0,.watch.transport-showing .anchor-point-1,.watch.transport-showing .anchor-point-2{padding-top:9em}.anchor-point-0,.anchor-point-3,.anchor-point-6{padding-left:3em}.anchor-point-2,.anchor-point-5,.anchor-point-8{padding-right:3em}.anchor-point-6,.anchor-point-7,.anchor-point-8,.eureka .watch.transport-showing .anchor-point-6,.eureka .watch.transport-showing .anchor-point-7,.eureka .watch.transport-showing .anchor-point-8{padding-bottom:3em}.watch.transport-showing .anchor-point-6,.watch.transport-showing .anchor-point-7,.watch.transport-showing .anchor-point-8{padding-bottom:15em}.watch.pivot-focused .anchor-point-6{padding-bottom:17.5em}.watch.pivot-focused .anchor-point-7,.watch.pivot-focused .anchor-point-8{padding-bottom:16em}.watch .ytp-fresca-module,.search-focused .watch.message .ytp-fresca-module{display:none}.watch.message .ytp-fresca-module{background-color:rgba(0,0,0,.5);color:#fff;display:block;font-size:2em;padding-left:1.5em;position:absolute;top:30%;width:100%}.watch.message .ytp-fresca-show-countdown{padding-bottom:1.3em}.ytp-fresca-countdown{font-size:1.4em}.pivot-shelf-list{margin-top:12.5em;padding-left:7em;-o-transition:-o-transform .25s,opacity .25s;-webkit-transition:-webkit-transform .25s,opacity .25s;transition:transform .25s,opacity .25s;-webkit-transform:translateZ(0);-o-transform:translateY(10em);-webkit-transform:translateY(10em);transform:translateY(10em)}.pivot-shelf-list.hidden{display:block!important;opacity:0}.limited-animation .pivot-shelf-list.hidden,.forced-limited-animation.pivot-shelf-list.hidden{display:none!important}.pivot-shelf-list.animate-in{-o-transform:translateY(0);-webkit-transform:translateY(0);transform:translateY(0)}.pivot-shelf-list>.carousel{opacity:.5;-o-transition:opacity .25s;-webkit-transition:opacity .25s;transition:opacity .25s}.limited-memory .pivot-shelf-list{opacity:1}.pivot-shelf-list .title-container{color:#fff}.pivot-shelf .tile-title .author,.pivot-shelf .tile-title .view{color:#e1e1e1}.pivot-shelf-list.focused,.post-play .pivot-shelf-list{background:-o-linear-gradient(rgba(0,0,0,0),rgba(0,0,0,1));background:-webkit-linear-gradient(rgba(0,0,0,0),rgba(0,0,0,1));background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,1));height:17.5em;margin-top:2.5em;padding-top:10em;-o-transform:translateY(-7.5em);-webkit-transform:translateY(-7.5em);transform:translateY(-7.5em)}.post-play .pivot-shelf{opacity:.5}.post-play .pivot-shelf-list.focused .pivot-shelf,.pivot-shelf-list.focused>.carousel{opacity:1}.pivot-shelf-list .focused.list{height:0}.pivot-shelf-list .no-content-message{display:none}.pivot-shelf-list.forced-limited-animation,.limited-animation .pivot-shelf-list,.limited-animation .pivot-shelf-list>.carousel{-o-transition:none;-webkit-transition:none;transition:none}.pivot-shelf-list.forced-limited-animation .placeholder-tile,.limited-animation .pivot-shelf-list .placeholder-tile{height:7.83em;width:14em}#pivot-post-play .pivot-video-tile,#pivot-post-play .placeholder-tile{height:10.625em;width:18.5em}#pivot-post-play .tile-top{height:10.625em}.limited-animation #pivot-post-play .tile-top,#pivot-post-play.forced-limited-animation .tile-top{height:9.825em;width:17.7em}.pivot-video-tile,.pivot-channel-tile{height:7.83em;width:14em}.forced-limited-animation .pivot-video-tile,.forced-limited-animation .pivot-auto-play-tile,.forced-limited-animation .pivot-channel-tile,.pivot-shelf-list.forced-limited-animation .placeholder-tile,#pivot-post-play.forced-limited-animation .placeholder-tile,.limited-animation .pivot-video-tile,.limited-animation .pivot-auto-play-tile,.limited-animation .pivot-channel-tile,.limited-animation #pivot-post-play .placeholder-tile,.limited-animation .pivot-shelf-list .placeholder-tile{background:none;display:inline-block;margin-right:.5em;position:relative;vertical-align:bottom}.forced-limited-animation .pivot-channel-tile,.limited-animation .pivot-channel-tile{border-radius:100%;width:10.625em}.forced-limited-animation .pivot-video-tile.focused,.forced-limited-animation .pivot-auto-play-tile.focused .pivot-video-tile,.limited-animation .pivot-video-tile.focused,.limited-animation .pivot-auto-play-tile.focused .pivot-video-tile{background-color:#fff}.pivot-video-tile .tile-top{height:7.83em}.forced-limited-animation .pivot-video-tile .tile-top,.limited-animation .pivot-video-tile .tile-top{background-color:inherit;height:7.03em;padding:.4em;width:13.2em}.forced-limited-animation .pivot-video-tile.focused .tile-top,.limited-animation .pivot-video-tile.focused .tile-top{background-color:#fff}.pivot-video-tile .tile-overlay{background-color:rgba(0,0,0,.5);color:#fff;display:none;height:100%;margin-top:-7.83em;text-align:center;width:100%}.forced-limited-animation .pivot-video-tile .tile-overlay,.limited-animation .pivot-video-tile .tile-overlay{margin-top:-7.03em}#pivot-post-play .pivot-video-tile .tile-overlay{margin-top:-10.625em}.limited-animation #pivot-post-play .pivot-video-tile .tile-overlay,#pivot-post-play.forced-limited-animation .pivot-video-tile .tile-overlay{margin-top:-9.875em}.pivot-video-tile.has-overlay .tile-overlay{display:block}#pivot-post-play .pivot-video-tile.has-overlay .tile-overlay{opacity:0}#pivot-post-play.focused .pivot-video-tile.has-overlay .tile-overlay{opacity:1}.post-play .pivot-shelf-list .pivot-video-tile.has-overlay .label{display:none}.post-play .pivot-shelf-list .pivot-video-tile.has-overlay .icon-player-play{font-size:4em}.post-play .pivot-shelf-list .pivot-video-tile.has-overlay .icon-player-play:before{content:"\00e638"}.pivot-video-tile .tile-overlay .icon{font-family:'youtube-icons';font-size:3em;padding-top:.5em}.pivot-video-tile .tile-overlay .label{font-size:1.2em}#pivot-post-play .pivot-video-tile .tile-overlay{color:#e1e1e1}#pivot-post-play .pivot-video-tile .tile-overlay .icon{font-size:4.5em;padding-bottom:.15em;padding-top:.4em}#pivot-post-play .pivot-video-tile .tile-overlay .label,#pivot-post-play .pivot-video-tile .tile-overlay .icon{opacity:0;-o-transition:opacity .25s;-webkit-transition:opacity .25s;transition:opacity .25s}#pivot-post-play.focused .pivot-video-tile .tile-overlay .label,#pivot-post-play.focused .pivot-video-tile .tile-overlay .icon{opacity:1}.limited-animation #pivot-post-play .pivot-video-tile .tile-overlay .label,.limited-animation #pivot-post-play .pivot-video-tile .tile-overlay .icon,#pivot-post-play.forced-limited-animation .pivot-video-tile .tile-overlay .label,#pivot-post-play.forced-limited-animation .pivot-video-tile .tile-overlay .icon{-o-transition:none;-webkit-transition:none;transition:none}.pivot-video-tile .video-thumb{background-position:center;background-repeat:no-repeat;background-size:100%;height:100%;width:100%}.pivot-video-tile .decoration{margin-top:-2.1em;text-align:right}.pivot-video-tile .duration{background-color:rgba(0,0,0,.7);font-size:1em;font-weight:bold;padding:.5em}.pivot-auto-play-tile{background:none;height:10.625em;overflow:visible;width:18.5em}.forced-limited-animation .pivot-auto-play-tile,.limited-animation .pivot-auto-play-tile{height:10.625em;width:18.5em}.pivot-auto-play-tile .post-play-countdown{display:block;font-size:1.8em;margin-left:10.8em;opacity:0;pointer-events:none;position:absolute;text-align:left;text-shadow:none;top:0;width:17.5em}.pivot-auto-play-tile.countdown-active .post-play-countdown{opacity:1;pointer-events:inherit}.pivot-auto-play-tile .details,.pivot-auto-play-tile .title{color:#fff;opacity:0;pointer-events:none}.pivot-auto-play-tile.focused .details,.pivot-auto-play-tile.focused .title{opacity:1;pointer-events:inherit}.pivot-auto-play-tile .title{font-size:1.4em;margin-left:14em;max-height:2.5em;overflow:hidden;position:absolute;top:2.2em;width:20em}.pivot-auto-play-tile .details{font-size:1.1em;margin-left:17.8em;position:absolute;top:6em;width:37em}.pivot-auto-play-tile .details,.pivot-auto-play-tile .title,.pivot-auto-play-tile .post-play-countdown{-o-transition:opacity .25s;-webkit-transition:opacity .25s;transition:opacity .25s}.limited-animation .pivot-auto-play-tile .details,.limited-animation .pivot-auto-play-tile .title,.limited-animation .pivot-auto-play-tile .post-play-countdown{-o-transition:opacity none;-webkit-transition:none;transition:none}#pivot-post-play .pivot-auto-play-tile .pivot-video-tile{padding-left:0;padding-top:0}#pivot-post-play #post-play-list .no-content-message{display:none}.forced-limited-animation .pivot-horizontal-list,.limited-animation .pivot-horizontal-list{margin-left:-15em}.pivot-horizontal-list.focused .pivot-sliding-highlighter,.post-play #post-play-list.focused .pivot-sliding-highlighter{display:block}.pivot-horizontal-list .pivot-sliding-highlighter,.post-play .pivot-sliding-highlighter{background:transparent;border:.5em #fff solid;box-shadow:.083em .083em .75em .167em #000 inset;height:7.5em;margin-left:-.4em;margin-top:-.4em;pointer-events:none;width:13.8em}.pivot-shelf{position:absolute;width:0}.forced-limited-animation .pivot-shelf,.limited-animation .pivot-shelf{opacity:.5;position:relative}.forced-limited-animation .pivot-shelf.focused,.limited-animation .pivot-shelf.focused{opacity:1}.limited-memory.limited-animation .pivot-shelf{opacity:1}.pivot-shelf .title-container{margin-bottom:1em;visibility:hidden;white-space:nowrap}.pivot-shelf .title-container .icon{font-family:'youtube-icons';vertical-align:middle}.pivot-shelf .tile-title span{display:inline-block;overflow:hidden;text-overflow:ellipsis}.pivot-shelf.focused .title-container{visibility:visible}.pivot-shelf .tile-title,.pivot-shelf .shelf-title{margin-bottom:.3em}.pivot-shelf .tile-title{height:1.7em}.pivot-shelf .tile-title .title{font-size:1.3em;max-width:30em}.pivot-shelf .tile-title .author,.pivot-shelf .tile-title .view{margin-left:.3em;max-width:20em}.pivot-shelf .tile-title .author,.pivot-sliding-highlighter .select{display:none}.pivot-shelf.has-author .tile-title .author{display:inline-block}.forced-limited-animation .pivot-horizontal-list .list,.limited-animation .pivot-horizontal-list .list{width:98em}.forced-limited-animation .postplay-horizontal-list .list,.limited-animation .postplay-horizontal-list .list{margin-left:-13.4em;width:98em}.forced-limited-animation .pivot-channel-tile.focused .tile-top,.limited-animation .pivot-channel-tile.focused .tile-top{background-color:#fff}.forced-limited-animation .pivot-channel-tile .tile-top,.limited-animation .pivot-channel-tile .tile-top{height:6.83em;padding:.4em;width:6.83em}.pivot-channel-tile .tile-top{background:none;border-radius:50%;height:7.83em;margin:0 auto;overflow:hidden;width:7.83em}.pivot-channel-tile .tile-top .video-thumb{background-color:rgba(0,0,0,0)}.pivot-channel-tile .video-thumb{border-radius:50%}.pivot-shelf .pivot-horizontal-list.channel-selected .pivot-sliding-highlighter{border-radius:50%;height:7.5em;margin-left:-.3em;margin-top:-.3em;-moz-transform:translateX(3.2em);-o-transform:translateX(3.2em);-webkit-transform:translateX(3.2em);transform:translateX(3.2em);width:7.5em}.pivot-shelf.channel-selected .shelf-title{visibility:hidden}.pivot-footer{height:9em}.pivot-button-list{padding-top:4em}.pivot-button-list .icon-button{display:inline-block;padding:.5em 1em}.pivot-button-list .icon-button .icon{font-family:'youtube-icons';margin-right:.3em}.pivot-footer.focused .pivot-button-list .icon-button.selected{background-color:#fff}.pivot-button-list .icon-button span{color:#fff;font-size:1.5em}.pivot-footer.focused .pivot-button-list .icon-button.selected span{color:#000}#pivot-post-play{padding-left:6em;padding-top:10em}.limited-animation #pivot-post-play,#pivot-post-play.forced-limited-animation{padding-left:0}#pivot-post-play #post-play-list{font-size:1.1em;margin-left:.1em}.forced-limited-animation .pivot-auto-play-tile,.limited-animation .pivot-auto-play-tile{padding-left:0;vertical-align:bottom}#pivot-post-play.forced-limited-animation .pivot-video-tile,.limited-animation #pivot-post-play .pivot-video-tile{vertical-align:bottom}.forced-limited-animation .pivot-auto-play-tile .pivot-video-tile,.limited-animation .pivot-auto-play-tile .pivot-video-tile{display:block;position:absolute}#pivot-post-play .pivot-sliding-highlighter{border-width:.5em;height:9.9em;margin-top:0;width:18.4em}.limited-animation.sets-ui .exp-densityBrowse .auto-play-tile:not(.focused) .video-tile,.limited-animation .exp-densityBrowse .auto-play-tile.focused .video-tile,.limited-animation .exp-densityBrowse .auto-play-tile{background-color:inherit}.limited-animation .exp-densityBrowse .auto-play-tile.focused .tile-top{background:#fff}.limited-animation .exp-densityBrowse .auto-play-tile .post-play-countdown{top:-2.67em}.loki-video-source{color:#fff;font-size:1.5em;left:5.0em;position:absolute;top:2.6em}.loki-title-card{background:-o-linear-gradient(bottom,rgba(0,0,0,.9) 0%,rgba(0,0,0,.6) 80%,transparent 100%);background:-webkit-linear-gradient(bottom,rgba(0,0,0,.9) 0%,rgba(0,0,0,.6) 80%,transparent 100%);background:linear-gradient(to top,rgba(0,0,0,.9) 0%,rgba(0,0,0,.6) 80%,transparent 100%);bottom:0;display:block;height:25%;position:absolute;width:100%}.loki-title-card .loki-metadata{color:#f1f1f1;height:100%;margin-bottom:2.6em;margin-left:8.0em;overflow:hidden;white-space:nowrap;width:100%}.loki-metadata #loki-progress-bar{display:block;height:2.0em;left:8.0em;padding:0;position:absolute;top:-4.0em;width:80%}#loki-progress-bar .progress-bar-playhead{display:none}.loki-metadata .loki-video-avatar{background-size:contain;display:inline-block;height:8.0em;width:8.0em}.loki-metadata .loki-video-text{display:inline-block;height:100%;margin:0 5.0em 0 3.5em;width:80%}.loki-video-text .loki-video-title{font-size:2.4em;margin-top:-.1em;overflow:hidden;text-overflow:ellipsis;width:80%}.loki-video-text .loki-channel-name{font-size:1.5em;margin-top:.4em;overflow:hidden;text-overflow:ellipsis;width:80%}.loki-video-text .loki-video-description{line-height:1.4em;margin-top:.4em;max-height:4.2em;overflow:hidden;white-space:normal;width:80%}.toaster{color:#aaa;font-size:133%;position:absolute;top:0;width:100%}.toaster .list{margin-top:.8em;position:absolute;width:100%}.toaster .toast{min-height:3.5em;overflow:hidden;position:relative;text-align:center;width:100%;-moz-transition:all .6s ease;-ms-transition:all .6s ease;-o-transition:all .6s ease;-webkit-transition:all .6s ease}.toaster .toast-container{background-color:rgba(27,25,26,0.8);border:1px solid black;display:inline-block;margin:.2em 0 1em;max-width:60%;opacity:1;padding:.5em 1em .6em;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;-webkit-transition:all .3s ease}.toaster .toast.toast-removing .toast-container{opacity:0}.toaster .toast-container>div{display:inline-block;vertical-align:middle}.toaster .toast-icon{background-position:center;background-repeat:no-repeat;background-size:1.1em 1.1em;height:1.2em;width:1.2em}.device-toast .toast-container{padding:0.7em}.toaster .device-toast .toast-msg{background-position:center left;background-repeat:no-repeat;background-size:1.1em 1.1em;padding-left:0.8em}.toaster .avatar{height:2.6em;width:2.6em}.toaster .avatar>div{background-position:center;background-size:cover;height:inherit;width:inherit}.toaster .video-image>div{background-position:center;background-size:cover;height:100%;width:100%}.toast .update-playlist-toast{bottom:0;max-width:14em;padding:0.8em;position:fixed;right:0;text-align:left}.update-playlist-toast .overlay{background:#000;height:55%;margin-left:56%;margin-top:-55%;opacity:.8;width:44%}.update-playlist-toast .video-count{font-size:2.3em;font-weight:normal;line-height:1.2em;padding-top:0.8em;text-align:center}.update-playlist-toast .icon-playlist{font-family:'youtube-icons';font-size:2.2em;height:50%;overflow:hidden;padding:.2em;text-align:center}.update-playlist-toast .avatar{padding:0.3em}.update-playlist-toast .contrast-container{background-color:rgba(0,0,0,0.8);padding:0.4em}.update-playlist-toast .tile-top{height:7.7em;width:14em}.update-playlist-toast .toast-msg{font-size:85%;padding-left:0.6em}.update-playlist-toast .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:13.2em}.update-playlist-toast .toast-msg.avatar{height:2.1em;width:10em;overflow:hidden}.update-playlist-toast .toast-msg.truncate{white-space:normal}.update-playlist-toast .toast-msg.no-user-avatar{font-size:85%;margin-left:-2.2em}.update-playlist-toast .wrapper>div{display:inline-block;vertical-align:middle}.toaster .toast-icon{background-image:url(img/dial-sprite.png);background-size:100%;max-width:100%}.toast-icon.avatar{background-image:none}.toaster .android-phone-connected{background-position:0 0%}.toaster .android-phone-disconnected{background-position:0 10.14%}.toaster .android-tablet-connected{background-position:0 20.29%}.toaster .android-tablet-disconnected{background-position:0 30.43%}.toaster .ios-phone-connected{background-position:0 40.58%}.toaster .ios-phone-disconnected{background-position:0 50.72%}.toaster .ios-tablet-connected{background-position:0 60.87%}.toaster .ios-tablet-disconnected{background-position:0 71.0%}.toaster .laptop-connected{background-position:0 81.16%}.toaster .laptop-disconnected{background-position:0 91.3%}.toaster .remote-connected{background-position:0 100%;background-size:233.33%}.toaster .remote-disconnected{background-position:0 100%;background-size:233.33%}.toaster .toast-progress{border:1px solid #aaa;width:10em}.toaster .toast-progress .progress{background-color:#666;height:1em}.toaster .volume-muted{background-image:url(img/volume_mute_pressed.png)}.toaster .volume-low{background-image:url(img/volume_0_pressed.png)}.toaster .volume-mid{background-image:url(img/volume_1_pressed.png)}.toaster .volume-high{background-image:url(img/volume_2_pressed.png)}.toaster .volume-toast .toast-msg{text-align:right;width:1.2em}.toaster .volume-toast .toast-container{-moz-transition-delay:.3s;-ms-transition-delay:.3s;-o-transition-delay:.3s;-webkit-transition-delay:.3s}.toaster .volume-toast.toast-removing .toast-container{-moz-transition-delay:0s;-ms-transition-delay:0s;-o-transition-delay:0s;-webkit-transition-delay:0s}.unlimited-welcome-toast .toast-container{box-shadow:0em 0em .6em .02em #000;height:6.5em;margin:0em;padding-right:1em;padding:0;position:fixed;right:0;text-align:left;top:0;width:24.5em;transform:translateX(0);opacity:1;-moz-transition:all .6s ease;-ms-transition:all .6s ease;-o-transition:all .6s ease;-webkit-transition:all .6s ease}.unlimited-welcome-toast.toast-displaying .toast-container{opacity:0;transform:translateX(18em)}.limited-animation .unlimited-welcome-toast .toast-container{opacity:1;-o-transition:none;-webkit-transition:none;transition:none;transform:none}.unlimited-toast-messages{position:absolute;padding-top:2.1em;padding-left:1.3em;width:12em}.unlimited-toast-msg-top{color:#ddd;line-height:1.0em}.unlimited-toast-msg-bottom{padding-top:0.5em;font-size:0.7em}.unlimited-toast-background{background-size:100%;background-position:left;background-repeat:no-repeat;height:100%;width:9em}.unlimited-toast-logo{background-size:100%;background-repeat:no-repeat;height:100%}#dialog{color:#fff;display:none;height:100%;left:0;position:absolute;top:0;width:100%}#error-markup #dialog{display:block}#dialog.focused{display:block}#dialog-wrapper{background-color:#000;height:30em;margin-top:11.1em;padding:1.3em 6em;position:relative}#dialog.browse-sets #dialog-wrapper{background-color:rgba(32,32,32,.5);height:100%;margin-top:0;padding:1.3em 10%}#dialog .dialog-contents{background:no-repeat 90% 30%}#dialog.browse-sets .dialog-contents .icon-simple-dialog{color:#fff}#dialog .dialog-contents .dialog-large-icon{display:none}#dialog.browse-sets .dialog-contents .dialog-large-icon{display:inline-block;font-family:'youtube-icons';font-size:10em;height:2.5em;line-height:2.5em;text-align:center;width:35%}#dialog.browse-sets .icon-simple-dialog .icon-dialog-content .extra-info{color:rgba(255,255,255,.75);display:block;font-family:monospace;font-size:1.5em;line-height:1.4em;padding-top:.8em}#dialog.browse-sets .icon-simple-dialog .icon-dialog-content .label{display:block;font-size:1.8em;line-height:1.1em;padding-top:6.45em}#dialog .dialog-contents .header .title{font-size:2.5em}#dialog.browse-sets.browse-sets-titled-dialog .dialog-contents .header{border-bottom:1px solid rgba(255,255,255,.2);height:3.4em;margin:0 1.5em}#dialog.browse-sets.browse-sets-titled-dialog .dialog-contents .header .title{color:rgba(255,255,255,.5);display:block;font-size:1.3em;font-weight:300;height:3em;line-height:3em}#dialog.browse-sets .buttons{font-size:1.8em;margin-right:2%;margin-top:.8em;text-align:right}#dialog.browse-sets .connection-steps{padding:0}#dialog.browse-sets.exit .dialog-contents .header .title{display:block;padding:1em 6.5em 3em 6.5em}#dialog.browse-sets .dialog-contents{background-color:#000;height:80%;margin-top:5%}#dialog.browse-sets.closed-captions .dialog-contents{height:75%}#dialog.browse-sets .dialog-cancel-button{text-align:center}.video-overview .dialog-contents{font-size:2em}#dialog.qr-dialog .dialog-contents{color:#ccc;font-size:1.1em;overflow:hidden;padding-top:4em}#dialog.qr-dialog .dialog-contents .header .title{color:#fff;font-size:2em}#dialog .box{padding-top:1.5em}#dialog.qr-dialog a{color:#fff;display:block;font-size:1.5em}#dialog.qr-dialog .qr{height:7em;margin:.2em 0;width:7em;background-size:100%}#dialog.qr-dialog .dialog-icon{display:block;background-size:12em}#dialog.help .dialog-icon{background-image:url(img/icon-help.png)}#dialog.feedback .dialog-icon{background-image:url(img/icon-feedback.png)}#dialog.system-error .dialog-icon{font-family:'youtube-icons';font-size:10em;margin-right:0;padding-right:.5em;padding-top:.5em;text-align:right;width:2em}#dialog.system-error .dialog-icon:before{content:"\00e656"}#dialog.qr-dialog.browse-sets .dialog-icon{display:none}#dialog .text-dialog{bottom:1.5em;left:0;padding:2em 20em 0 6em;position:absolute;white-space:normal}#dialog.text-dialog .dialog-contents .header .title{font-size:3em;padding-bottom:.5em}.text-dialog #dialog-view{color:#aaa;padding-bottom:1em;width:90%}.text-dialog #dialog-view .dialog-contents{font-size:1.8em}#dialog.browse-sets .icon-dialog-content{display:inline-block;height:25em;vertical-align:top;width:60%}#dialog-view .url{color:#fff;font-size:1.25em;padding-bottom:.8em}#dialog-view .flag-claim .url{padding-bottom:.5em}#dialog-view .reset-help{display:block;width:25em}#dialog.browse-sets .tos-dialog .icon-dialog-content{padding-top:9em}#dialog.browse-sets .tos-dialog .icon-dialog-content .subtitle{color:#aaa}#dialog.browse-sets .tos-dialog .icon-dialog-content .url{font-size:2em}#dialog.browse-sets.qr-dialog .dialog-contents{padding-top:0}#dialog.browse-sets.qr-dialog .icon-dialog-content .link{margin-top:5em;padding-top:0}#dialog.browse-sets.qr-dialog .icon-dialog-content .qr-code-wrapper{margin-top:2em}#dialog.browse-sets.qr-dialog .icon-dialog-content .qr-code-wrapper .qr{border:.2em rgba(255,255,255,.1) solid;padding:.5em}#dialog .signed-out-dialog{font-size:1.8em}.connection-error,.connection-steps{display:inline-block;font-weight:300;padding:0 1em 1em 2em;white-space:normal}.connection-error{vertical-align:top}.connection-error div{margin-bottom:1em}#dialog .login-dialog .activation-code{font-size:1.3em;letter-spacing:.1em;line-height:1.3em}#dialog .sets-login-dialog .body-text{display:inline-block;height:25em;vertical-align:top;width:50%}#dialog .sets-login-dialog .body-text .connection-instructions{font-size:1.9em;margin-top:3.5em}#dialog .sets-login-dialog .standard-message,#dialog .sets-login-dialog .like-dislike-message,#dialog .sets-login-dialog .subscribe-message,#dialog .sets-login-dialog .upload-message,#dialog .sets-login-dialog .player-message{display:none}#dialog.standard-login .sets-login-dialog .standard-message,#dialog.like-dislike-login .sets-login-dialog .like-dislike-message,#dialog.subscribe-login .sets-login-dialog .subscribe-message,#dialog.upload-login .sets-login-dialog .upload-message,#dialog.player-login .sets-login-dialog .player-message{display:block}#dialog .pairing .qr-code-wrapper{display:inline-block;vertical-align:top}#dialog .manual-connect-content .connection-steps{padding:0}#dialog .manual-connect-content .connection-steps .label{color:#aaa;font-size:.7em;margin-top:1em}#dialog .manual-connect-content .connection-steps .step1,#dialog .manual-connect-content .connection-steps .step2{margin-top:.7em}#dialog .manual-connect-content .connection-steps .pair-url,#dialog .manual-connect-content .connection-steps .pair-code{margin-left:.3em}#dialog.browse-sets .manual-connect-content .connection-steps .label{font-size:1.3em}#dialog.browse-sets .manual-connect-content .connection-steps .step1,#dialog.browse-sets .manual-connect-content .connection-steps .step2{display:inline-block;font-size:1.3em}#dialog.browse-sets .manual-connect-content .connection-steps .pair-url,#dialog.browse-sets .manual-connect-content .connection-steps .pair-code{display:inline-block;font-size:1.3em;margin-left:.3em}#dialog.browse-sets .pairing .connection-instructions{font-size:1em;padding-top:10em}#dialog .manual-connect .dial-upsell-content{display:none}#dialog .dial-upsell .manual-connect-content .connection-steps .no-dial-connect-step1,#dialog .manual-connect .manual-connect-content .connection-steps .with-dial-connect-step1{display:none}#dialog .manual-connect .manual-connect-content .connection-steps{font-size:1.5em}#dialog .manual-connect .manual-connect-content .connection-steps .label{display:none}#dialog.browse-sets .dial-upsell .dial-upsell-content{font-size:1.8em;white-space:normal;width:80%}#dialog.browse-sets .dial-upsell .dial-upsell-content .cast-icon{height:1.3em;margin:0;width:1.5em}#dialog.browse-sets .dial-upsell .manual-connect-content{color:#aaa;font-size:1.4em;line-height:1em}#dialog.browse-sets .remote-reset-dialog .connected-list .connected-header{color:#fff;font-size:1.5em;margin-top:6em}#dialog.browse-sets .remote-reset-dialog .connected-list .devices{display:inline-block;font-size:1em}#dialog.browse-sets .remote-reset-dialog .connected-list .devices>div{display:inline-block;font-size:1em;padding-left:0;padding-right:1.5em;width:10em}#dialog.browse-sets .remote-reset-dialog .reset-help{font-size:1.5em;margin-top:1em}#dialog .logout-authenticated-info{padding:2.5em 0}#dialog .login-user-icon{background-size:cover;display:inline-block;height:4em;margin:2em 2em 0 0;width:4em}#dialog.browse-sets .login-user-icon{margin:0 15%;border-radius:20em}#dialog .login-user-info{display:inline-block;margin-left:1.7em;margin-top:-.8em;font-size:2em;font-weight:300;width:82%}#dialog .login-user-info h3{font-size:2.2em;font-weight:normal;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#dialog.browse-sets .logout-authenticated-info{padding:0}#dialog.browse-sets .login-user-info{height:13em;margin:0;width:100%}#dialog.browse-sets .login-user-info .display-name,#dialog.browse-sets .login-user-info .platform-container{display:none}#dialog.browse-sets .login-user-info .signed-in-message{display:inline-block;width:50%}#dialog.browse-sets .login-user-info .signed-in-label strong{color:#fff;display:block;font-size:2.5em;overflow:hidden;text-overflow:ellipsis}#dialog.browse-sets .login-user-info .signed-in-label{color:#aaa;font-size:.5em;margin-top:10em}#dialog.browse-sets .login-user-info .sign-out-label{margin-top:1em}#dialog .spinner{height:10em;width:10em}#dialog .spinner .loading-indicator{background-size:contain;height:100%;width:100%}#dialog .buttons{font-size:3em;font-weight:300;padding-top:.3em}#dialog .buttons>div{background-color:#333;color:#000;cursor:pointer;display:inline-block;min-width:2.4em;padding:0 .3em;text-align:center}#dialog.browse-sets .buttons .button{background-color:#000;color:rgba(255,255,255,.5);min-width:3em;padding:.2em .8em}#dialog.browse-sets .buttons .focused,#dialog.browse-sets .buttons .button.focused:hover{background-color:#f1f1f1;color:#666}#dialog .buttons .button:hover,#dialog.browse-sets .buttons .button:hover{background-color:#666}#dialog .buttons div{margin-left:.5em}#dialog .buttons .focused,#dialog .buttons .focused:hover{background-color:#f1f1f1;color:#666}#dialog .ps4-logout-dialog .logout-prompt{font-size:1.7em}#dialog .logout-prompt{margin-top:6em}.scrolling-text{font-size:1.3em;height:15em;margin-right:1.1em;margin-top:1em;overflow:hidden}.scrolling-text h4{margin:0;padding:0}.scrolling-text>div{overflow:hidden;padding-bottom:1em}.flag-list-container{margin-top:.5em}.flag-list .button{color:#868686;cursor:pointer;display:inline-block;font-size:1.8em;padding:.4em;vertical-align:top}.flag-list .button{width:12em}.flag-list .button:hover{background-color:#444}.flag-list .button.focused,.flag-list .button.focused:hover{background-color:#fff;color:#676767}#flag-widget{font-weight:300}.flag-video{color:#676767;font-size:1.8em;font-weight:300;padding-top:1em;width:47%}.flag-video .url{color:#fff;display:block;font-size:1.6em;padding-top:.5em}.flag-example{background:url(img/flag.png) no-repeat 0 0;background-size:contain;display:inline-block;height:57%;position:absolute;right:18%;top:9%;width:23%}.flag-claim .metadata{display:block;font-size:1em;font-weight:500;padding-top:.2em;white-space:normal}.flag-claim .url{color:#868686;display:block;font-weight:300}.flag-claim{color:#676767;font-size:1.6em;font-weight:300;margin:1em 0 0 2em;white-space:nowrap}.flag-claim .copyright-infringment{display:inline-block;white-space:normal;width:50%}.flag-claim .privacy-invasion{display:inline-block;margin-left:4%;vertical-align:top;white-space:normal;width:40%}.flag-claim .email{color:#868686}.flag-claim .subtitle{font-size:1.2em;font-weight:500}.player-error-dialog.player-error{color:#aaa;font-size:1.8em;padding:1em 0 8em 0em}#dialog .scrollbar{height:70%;margin-top:5em;right:5em}#dialog .scrollbar .handle{height:5em}.paid-channel-info{font-size:1.4em;padding-top:1em}.paid-channel-info .channel-url{font-weight:bold}.status-dialog #dialog-wrapper{background-color:rgba(0,0,0,.5)}.status-dialog .icon{background:url(img/pairing-promo-combo.png) center center no-repeat;background-size:contain;display:inline-block;height:11em;vertical-align:middle;width:25%}.status-dialog .info{display:inline-block;padding-left:.5em;vertical-align:middle;width:70%}.status-dialog .message{color:#ccc;font-size:2em}.status-dialog #dialog-view{padding-top:7em}.dialog-focused #legend{bottom:12%;display:block}#legend.legend-for-dialog-closed-captions{bottom:6%}#dialog.confirm-cookies .dialog-contents .header .title{font-size:3em}#dialog.confirm-cookies #dialog-view{color:#aaa;font-size:1.8em;height:8em;padding-top:.9em}.single-pane-selector{padding-bottom:1em;padding-top:1em;white-space:nowrap}.single-pane-selector .list{display:inline-block;margin-right:.5em;padding-left:.5em;padding-right:.5em;vertical-align:top;width:94%}.single-pane-selector .button .label{width:90%}.single-pane-selector .check-button.previously-selected .icon-check{display:inline-block}.split-pane-selector{border-bottom:.1em solid rgba(255,255,255,.2);padding-bottom:1em;padding-top:1em;white-space:nowrap}.check-button .icon-check{display:none;font-family:youtube-icons}.single-pane-selector .labeled-value,.split-pane-selector .labeled-value{color:#868686;font-size:1.4em;height:2.8em;line-height:1.5em;overflow:hidden;padding:0 1em;white-space:normal}.single-pane-selector .labeled-value .value,.split-pane-selector .labeled-value .value{color:#666;display:block;font-size:.7em;line-height:1.4em}.single-pane-selector .button,.split-pane-selector .button{color:#868686;cursor:pointer;font-size:1.4em;height:2.8em;line-height:2.8em;overflow:hidden;padding:0 .4em;white-space:normal}.single-pane-selector .button .label,.split-pane-selector .button .label{display:inline-block;line-height:1.3em;vertical-align:middle}.single-pane-selector .subtitled-button,.split-pane-selector .subtitled-button{line-height:1.5em}.single-pane-selector .button.no-model,.split-pane-selector .button.no-model{visibility:hidden}.split-pane-selector .list{display:inline-block;vertical-align:top;width:47%}.split-pane-selector .list:first-child{border-right:.1em solid rgba(255,255,255,.2);margin-right:.5em;padding-right:.5em}.single-pane-selector .button:hover,.single-pane-selector .list:not(.focused) .button.selected,.split-pane-selector .button:hover,.split-pane-selector .list:not(.focused) .button.selected{background-color:#444;color:#fff}.single-pane-selector .button.focused,.single-pane-selector .button.focused:hover,.split-pane-selector .button.focused,.split-pane-selector .button.focused:hover{background-color:#fff;color:black}.single-pane-selector .subtitled-button span.subtitle,.split-pane-selector .subtitled-button span.subtitle{color:#666;display:block;font-size:.7em;line-height:1.4em}.color-button .preview{border-width:2px;border-color:#000;border-style:solid;color:#868686;display:inline-block;height:1em;margin:0 .2em .2em .2em;vertical-align:middle;width:1em}.color-button .preview.rounded{border-radius:50%}.preview.black{background-color:#000;border-width:1px;border-color:#fff;border-style:solid}.preview.red{background-color:#f00}.preview.magenta{background-color:#f0f}.preview.blue{background-color:#00f}.preview.cyan{background-color:#0ff}.preview.green{background-color:#0f0}.preview.yellow{background-color:#ff0}.preview.white{background-color:#fff}.debug-dialog{font-size:.9em}.debug-dialog span.label{font-weight:bold}#dialog.browse-sets .video-upload-dialog-contents{display:inline-block;font-size:1.6em;margin:1em 3% 0 3%;text-align:left;vertical-align:top;width:55%}#dialog.browse-sets .modify-video .video-upload-dialog-contents{margin-top:2em;text-align:center}.video-upload-status .video-url{color:#2793e6}.delete-video{padding-bottom:6em}.modify-video .list .button{background-position:50% 20%;background-repeat:no-repeat;background-size:60% 60%;color:#848484;display:inline-block;height:8em;margin-right:1em;text-align:center;width:8em}.modify-video .list .button.focused{background-color:#fff;color:#282828}.modify-video .list .button span{display:block;font-size:1.2em;margin:4.6em .5em .5em .5em;overflow:hidden;white-space:nowrap}.modify-video .modify-edit-button{background-image:url('img/edit_tile_light.png')}.modify-video .modify-edit-button.focused{background-image:url('img/edit_tile_dark.png')}.modify-video .modify-delete-button{background-image:url('img/trash_tile_light.png')}.modify-video .modify-delete-button.focused{background-image:url('img/trash_tile_dark.png')}.delete-video-dialog .video-tile .details,.modify-video .video-tile .details{margin-top:-.1em}.browse-sets #modify-list .button{height:7.5em;margin-right:.9em;width:7.5em}.browse-sets #modify-list .button span{font-size:1.1em;margin-top:5.2em}.delete-video-dialog{margin-bottom:14em}.browse-sets .delete-video-dialog{margin-bottom:1em}.video-processing,.video-upload-error{font-size:1.5em}.video-upload-error .error-container{color:#aaa;margin-top:1em}#dialog .buttons .upload-terms,#dialog .buttons .upload-terms:hover{background-color:#000;color:#555;display:block;font-size:.6em;margin-left:1.5em;text-align:left}.upload-progress{margin-bottom:1em;width:100%}.upload-progress-value{text-align:left;width:100%}.upload-progress span{margin-left:-1em;position:relative;width:4em}.upload-progress .upload-progress-bar{background-color:#aaa;width:100%}.upload-progress .upload-progress-bar .completed{background-color:#2793e6;height:1em}.privacy-button{background:.4em 50% no-repeat;background-size:1.5em;cursor:pointer;position:relative}.privacy-button .checkbox{background-position:100%;background-size:2em;height:2em;left:85%;position:absolute;top:0;width:2em}.privacy-button.checked .checkbox{background-image:url(img/icon-privacy-check-light.png)}.privacy-button.focused.checked .checkbox{background-image:url(img/icon-privacy-check-dark.png)}.privacy-button .label .name{background-position:0 .5em;background-size:2em;line-height:1.5em;text-indent:1.8em}.privacy-button .description{font-size:.6em;line-height:.8em;padding-left:2.9em}.privacy-button .name{font-size:1em;line-height:1.2em;padding-left:1.7em}.private-state,.video-tile .private{background-image:url(img/icon-privacy-private-light.png)}.private-state.focused{background-image:url(img/icon-privacy-private-dark.png)}.public-state,.video-tile .public{background-image:url(img/icon-privacy-public-light.png)}.public-state.focused{background-image:url(img/icon-privacy-public-dark.png)}.unlisted-state,.video-tile .unlisted{background-image:url(img/icon-privacy-unlisted-light.png)}.unlisted-state.focused{background-image:url(img/icon-privacy-unlisted-dark.png)}.video-tile .private,.video-tile .public,.video-tile .unlisted{background-position:left;background-repeat:no-repeat;background-size:1.5em;min-height:1.5em;min-width:1.5em;padding-left:1.5em}.video-privacy .button,.video-overview .button{display:inline-block;height:2em;line-height:2em;margin:.1em 0;overflow:hidden;padding:.1em .5em;vertical-align:top;white-space:nowrap;width:65%}.video-privacy .button{width:85%}.video-overview .button:first-child{width:20%}.video-privacy .button.focused,.video-privacy .button:not(.disabled):hover,.video-overview .button.focused,.video-overview .button:not(.disabled):hover{background-color:#fff;color:#676767}#dialog.browse-sets .video-privacy .button:nth-child(2){width:11em}#dialog.browse-sets .video-uploads{margin:3em 1em 2em}#dialog.browse-sets .video-uploads .carousel{overflow:hidden}#dialog.browse-sets .video-uploads .carousel .video-tile .details{text-align:left}.video-overview .title-button{line-height:1em;white-space:normal}#dialog.browse-sets .video-overview .title-button .label{display:inline-block;line-height:2em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:95%}.video-overview .channel-button{background-position:.35em 50%;background-repeat:no-repeat;background-size:1.5em;line-height:2em;overflow:hidden;text-indent:1.8em;text-overflow:ellipsis}.video-uploads .carousel{height:20em;position:relative;white-space:nowrap}.video-tile-container{display:inline-block;margin-top:1.7em;text-align:right;width:35%}.video-tile-container .video-tile{border:.1em rgba(255,255,255,.2) solid;display:inline-block;height:22em;position:static;text-align:left;width:20em}.video-tile-container .video-tile .tile-top{height:51%}.video-tile-container .video-tile .tile-bottom .details{height:inherit}.video-uploads .carousel .video-tile{height:20em;width:18em}.video-uploads .video-tile .decoration{top:7em}.video-tile-container .video-tile .tile-bottom,.video-uploads .video-tile .tile-bottom{width:initial}.dialog.closed-captions #dialog-wrapper{margin-top:5em}#dialog.closed-captions-language-only #dialog-wrapper{padding:1.6em 26%}#dialog.closed-captions-language-only #options-list{display:none}#legend.legend-for-dialog-closedCaptionsDialog{bottom:24%}#dialog.closed-captions-language-only~#legend{right:29%}.simple-dialog{margin:3em;font-size:1.6em}.lang-ja_JP .connection-instructions .step1,.lang-ja_JP .connection-instructions .step2,.lang-ko_KR .connection-instructions .step1,.lang-ko_KR .connection-instructions .step2,.lang-zh_CN .connection-instructions .step1,.lang-zh_CN .connection-instructions .step2,.lang-zh_HK .connection-instructions .step1,.lang-zh_HK .connection-instructions .step2,.lang-zh_TW .connection-instructions .step1,.lang-zh_TW .connection-instructions .step2{font-size:.8em}.lang-de_DE .action-tile .content .title,.lang-el_GR .action-tile .content .title,.lang-es_ES .action-tile .content .title,.lang-es_MX .action-tile .content .title,.lang-fr_FR .action-tile .content .title,.lang-fr_CA .action-tile .content .title,.lang-ko_KR .action-tile .content .title,.lang-nl_NL .action-tile .content .title,.lang-pl_PL .action-tile .content .title,.lang-pt_BR .action-tile .content .title,.lang-pt_PT .action-tile .content .title,.lang-ru_RU .action-tile .content .title,.lang-uk_UA .action-tile .content .title{font-size:2em}.lang-it_IT .action-tile .content .title{font-size:1.8em}.lang-es_ES .action-tile .improve-yt-tile .title,.lang-fr_CA .action-tile .history-tile .title,.lang-fr_FR .action-tile .history-tile .title,.lang-de_DE .action-tile .terms-tile .title,.lang-fr_CA .action-tile .terms-tile .title,.lang-fr_FR .action-tile .terms-tile .title{font-size:1.7em}.lang-es_ES .action-tile .videoinfo-tile .title,.lang-es_MX .action-tile .videoinfo-tile .title,.lang-fr_CA .action-tile .videoinfo-tile .title,.lang-fr_FR .action-tile .videoinfo-tile .title,.lang-pt_BR .action-tile .videoinfo-tile .title{font-size:1.5em;white-space:normal}.lang-de_DE .action-tile .videoinfo-tile .title{font-size:1.45em;padding-left:.5em;padding-right:.5em;white-space:normal}.lang-es_ES .action-tile .videoinfo-tile .label,.lang-es_MX .action-tile .videoinfo-tile .label,.lang-fr_CA .action-tile .videoinfo-tile .label,.lang-fr_FR .action-tile .videoinfo-tile .label,.lang-pt_BR .action-tile .videoinfo-tile .label{padding-top:.6em}.lang-de_DE .action-tile .videoinfo-tile .label{font-size:1.6em;padding-top:.7em}.lang-ja_JP .action-tile .terms-tile .title{font-size:2em}.lang-ja_JP #transliteration .list{font-size:1.2em}.lang-ja_JP #keyboard-grid{font-size:1.5em}.lang-ja_JP #keyboard-spacebar{margin-left:5.5em}.lang-zh_CN #search .horizontal-list,.lang-zh_HK #search .horizontal-list,.lang-zh_TW #search .horizontal-list,.lang-ja_JP #search .horizontal-list{-o-transform:translateY(9.5em);-webkit-transform:translateY(9.5em);transform:translateY(9.5em)}.lang-ko_KR #search .horizontal-list{-o-transform:translateY(10.5em);-webkit-transform:translateY(10.5em);transform:translateY(10.5em)}.lang-ko_KR #search-keyboard{font-size:1.82em}.lang-ko_KR #letter-suggest .button{width:1em}.lang-ko_KR #keyboard-grid,.lang-ru_RU #keyboard-grid,.lang-uk_UA #keyboard-grid{margin-top:0.3em}.lang-ko_KR #keyboard-grid.lang-ko .numbers-toggle-tile.button,.lang-ru_RU #keyboard-grid.lang-ru .numbers-toggle-tile.button,.lang-uk_UA #keyboard-grid.lang-ua .numbers-toggle-tile.button{font-size:0.75em}.lang-ko_KR #keyboard-grid .button,.lang-ru_RU #keyboard-grid .button,.lang-uk_UA #keyboard-grid .button{height:1.2em;line-height:1.1em;margin-top:0.6em}.lang-ko_KR #letter-suggest .button,.lang-ru_RU #letter-suggest .button,.lang-uk_UA #letter-suggest .button{height:1.2em;line-height:1.1em;width:1.2em}.lang-ko_KR .search-state #spinner,.lang-ru_RU .search-state #spinner,.lang-uk_UA .search-state #spinner,.lang-ja_JP .search-state #spinner{top:25em}.lang-ko_KR .search-state .application-message,.lang-ru_RU .search-state .application-message,.lang-uk_UA .search-state .application-message,.lang-ja_JP .search-state .application-message{top:55%}.lang-ru_RU #keyboard-grid.lang-ru .button,.lang-uk_UA #keyboard-grid.lang-ua .button,.lang-ko_KR #keyboard-grid,.lang-ko_KR #letter-suggest,.lang-ko_KR #keyboard-spacebar{font-size:1em}.lang-ru_RU #keyboard-spacebar,.lang-uk_UA #keyboard-spacebar{margin-left:4.2em}.lang-de_DE .countdown-ad-callout .time-left-label,.lang-de_DE .countdown-ad-callout .skip-time-label{font-size:1.1em}.lang-cs_CZ .action-tile .description,.lang-de_DE .action-tile .description,.lang-hi_IN .action-tile .description,.lang-pl_PL .action-tile .description,.lang-pt_BR .action-tile .description,.lang-pt_PT .action-tile .description,.lang-ru_RU .action-tile .description,.lang-uk_UA .action-tile .description{font-size:1.3em}.lang-de_DE .guide-button.footer .guide-button-title{width:27.81em}.lang-de_DE .guide-user-name{width:13.5em}.lang-nl_NL .guide-button.disabled .guide-button-title,.lang-de_DE .guide-button.disabled .guide-button-title,.lang-fr_FR .guide-button.disabled .guide-button-title,.lang-pt_PT .guide-button.disabled .guide-button-title{width:13em}.lang-tr_TR #search #keyboard-grid .button.clear-query-tile,.lang-tr_TR .action-tile .title,.lang-tr_TR .guide-button-icon,.lang-tr_TR #keyboard-grid .button,.lang-tr_TR .tile-top .badge,.lang-tr_TR .tile-top .duration,.lang-tr_TR .title-card .badges span .lang-tr_TR.lang-case-sensitive .player-controls .button span:first-letter,.lang-tr_TR.lang-case-sensitive .player-controls .toggle-button span:first-letter,.lang-tr_TR.lang-case-sensitive .snap-controls .speakable span:first-letter,.lang-tr_TR.lang-case-sensitive .voice-command:first-letter{text-transform:none}.voice-command{display:none}.lang-case-sensitive .voice-command:first-letter{text-transform:uppercase}.engaged .voice-command{background-color:rgba(22,22,22,.7);color:#5dc21e;display:block;font-size:1em}.engaged .horizontal-list .carousel .voice-command{display:none}.engaged .horizontal-list.focused .carousel .voice-command{display:block}.engaged .pivot-video-tile .voice-command,.engaged .pivot-channel-tile .voice-command{display:none}.engaged .pivot-video-tile.speakable .voice-command,.engaged .pivot-channel-tile.speakable .voice-command{display:block}.engaged .video-tile .voice-command,.engaged .pivot-video-tile .voice-command,.engaged .pivot-channel-tile .voice-command,.engaged .playlist-tile .voice-command,.engaged .channel-tile .voice-command{bottom:50%;font-size:1.5em;margin-top:-2.17em;padding:.5em .9em;opacity:0.999}.engaged .video-tile.disabled .voice-command,.engaged .pivot-video-tile.disabled .voice-command,.engaged .pivot-channel-tile.disabled .voice-command{display:none}.engagement-indicator{bottom:0.8em;display:none;font-size:1.5em;left:1.8em;position:absolute;width:16em}.engaged .engagement-indicator{background-color:transparent;color:#5dc21e;display:block}.engagement-indicator .icon{background:no-repeat center;display:inline-block;height:2em;vertical-align:middle;width:2em}.engagement-indicator .stop-listening{padding:.5em}.engagement-indicator .stop-listening .icon{background-image:url('img/icon-xboxone-engaged.png')}.engagement-indicator .text{text-align:center}.engagement-indicator .title{display:inline-block;font-size:0.9em}.browse-sets-state.engaged .engagement-indicator,.browse-state.engaged .engagement-indicator,.post-play-state.engaged .engagement-indicator,.post-play-state.engaged .engagement-indicator,.settings-state.engaged .engagement-indicator,.search-state.engaged .engagement-indicator{display:block}.watch-state.engaged .engagement-indicator{display:block;height:3em;left:0;margin-left:auto;margin-right:auto;right:0;text-align:center;top:20%}.watch-focused .engagement-indicator .stop-listening{background-color:rgba(22,22,22,.7)}.sliding-highlighter .select,.engaged .legend-item,.engaged #dialog .speakable.button,.engaged .context-menu .speakable.button,.engaged .speakable.action-tile .title,.engaged .modify-video .speakable,.engaged .modify-video .speakable.focused{color:#5dc21e}.voice-footer{background-color:rgba(22,22,22,.7);bottom:0;color:#5dc21e;font-size:1.5em;height:3em;padding:1em 0 0.6em 0;position:absolute;text-align:center;width:100%}.voice-footer .list{font-size:0.65em;margin:auto;margin-top:-1.3em;padding-top:1em;width:29em}.voice-footer .component{display:inline-block;padding-right:1em}.engaged .voice-footer{color:#5dc21e}.engaged .voice-footer li{display:inline;padding:0 2%}.engaged .player-controls .button span,.engaged .player-controls .toggle-button span{color:#5dc21e;display:block}.engaged .player-controls .button.disabled span,.engaged .player-controls .toggle-button.disabled span{display:none}.engaged #transport-controls.ad-active .player-controls #button-list div.skip-ad-button.canskip .label,.engaged .skip-ad-button.canskip .label{color:#5dc21e}.engaged .player-controls-widget{margin-top:7.4em}.engaged .player-controls .voice-command.transport{top:1em}.legend{bottom:5.5%;color:#f1f1f1;position:absolute;right:5.5%;text-shadow:2px 2px 4px #000;display:none;background:-webkit-radial-gradient(ellipse closest-side,rgba(0,0,0,0.2) 25%,rgba(0,0,0,0.1) 60%,rgba(0,0,0,0));background:-o-radial-gradient(ellipse closest-side,rgba(0,0,0,0.2) 25%,rgba(0,0,0,0.1) 60%,rgba(0,0,0,0));background:-moz-radial-gradient(ellipse closest-side,rgba(0,0,0,0.2) 25%,rgba(0,0,0,0.1) 60%,rgba(0,0,0,0));background:radial-gradient(ellipse closest-side,rgba(0,0,0,0.2) 25%,rgba(0,0,0,0.1) 60%,rgba(0,0,0,0))}.limited-memory .legend{background:none}.legend-item{cursor:pointer;display:none;margin:0 0 0 .5em}.legend-item span{vertical-align:middle}.legend-item .icon{background-size:100%;display:block;height:2.5em;margin:auto;max-width:100%;text-align:center;width:2.5em}.legend-item.more>.icon.icon-player-more{background-size:0}.legend-item.more>.icon:before{font-family:'youtube-icons';color:#fff;font-size:1.9em;margin:auto;position:relative;top:.2em}.legend-item .title{display:block;font-size:1.1em;margin-top:0;text-align:center;text-transform:none}#legend.back .back,#legend.close-guide .close-guide,#legend.delete .delete,#legend.exit .exit,#legend.guide .guide,#legend.search .search,#legend.space .space,#legend.home .home,#legend.modify .modify,#legend.more .more,.reversed-keys #legend.back .reversed-back{display:inline-block}.reversed-keys #legend.back .back{display:none}.desktop .legend,.game-console .legend,.tv .legend{display:inline-block}.wiiu .legend{font-size:1.2em}.desktop .legend-item .icon{background-image:url(img/legend-sprite-desktop.png)}.game-console.sony .legend-item .icon{background-image:url(img/legend-sprite-ps3.png)}.roku #legend .legend-item .icon{background-image:url(img/legend-sprite-roku.png)}.skip-ad-callout .icon,.tv .legend-item .icon{background-image:url(img/legend-sprite-tv.png)}.wiiu .legend-item .icon{background-image:url(img/legend-sprite-wiiu.png)}.wiiu #user-info-background{-webkit-transform:translateZ(0)}.wiiu #search .horizontal-list{top:30%;-webkit-transform:none;transform:none}.wiiu .search-state #spinner{top:20em}.xboxone .legend-item .icon{background-image:url(img/legend-sprite-xboxone.png)}.xbox360 .legend-item .icon{background-image:url(img/legend-sprite-xbox360.png)}.desktop .legend-item.back .icon,.desktop .legend-item.exit .icon{background-position:0 47.4%;background-size:240%}.desktop .legend-item.search .icon{background-position:0 100%;background-size:240%}.desktop .legend-item.close-guide .icon,.desktop .legend-item.guide .icon,.desktop .legend-item.home .icon,.desktop .legend-item.space .icon{background-position:0 73.7%;background-size:240%}.desktop .skip-ad-callout .icon{background-position:31% 67.5%;background-size:520%;width:6.6em}.game-console.sony .legend-item .icon,.tv .legend-item .icon,.wiiu .legend-item .icon{background-repeat:no-repeat;height:1.5em;position:relative;bottom:.5em;width:1.5em}.game-console.sony .legend-item.more>.icon:before,.tv .legend-item.more>.icon:before,.wiiu .legend-item.more>.icon:before{top:initial}.game-console.microsoft .legend-item{margin-left:1.4em}.game-console.microsoft .legend-item.back .icon,.game-console.microsoft .legend-item.exit .icon,.game-console.microsoft .legend-item.reversed-back .icon{background-position:0 27.5%}.game-console.microsoft .legend-item.search .icon,.game-console.microsoft .legend-item.space .icon{background-position:0 82%}.game-console.microsoft .legend-item.close-guide .icon,.game-console.microsoft .legend-item.delete .icon,.game-console.microsoft .legend-item.guide .icon,.game-console.microsoft .legend-item.home .icon,.game-console.microsoft .legend-item.modify .icon{background-position:0 54.9%}.roku #legend .legend-item.back .icon,.roku #legend .legend-item.exit .icon{background-position:0 105%}.game-console.sony .legend-item.back .icon,.game-console.sony .legend-item.exit .icon{background-position:0 0%}.game-console.sony .legend-item.reversed-back .icon{background-position:0 100%}.game-console.sony .legend-item.search .icon,.game-console.sony .legend-item.space .icon{background-position:0 87.5%}.game-console.sony .legend-item.close-guide .icon,.game-console.sony .legend-item.delete .icon,.game-console.sony .legend-item.guide .icon,.game-console.sony .legend-item.home .icon{background-position:0 75%}.game-console.sony #dialog .logout-authenticated-info,.game-console.microsoft #dialog .logout-authenticated-info{padding-top:0}.game-console.sony .action-tile .platform-container,.game-console.microsoft .action-tile .platform-container{margin:1em;text-align:center}.game-console.sony .login-user-info .platform-user-name,.game-console.sony .platform-user-name,.game-console.microsoft .login-user-info .platform-user-name,.game-console.microsoft .platform-user-name{vertical-align:middle}.game-console.sony .login-user-info .platform-user-icon,.game-console.sony .platform-user-icon,.game-console.microsoft .platform-user-icon,.game-console.microsoft .login-user-info .platform-user-icon{background-size:cover;display:inline-block;height:3em;vertical-align:middle;width:3em}.game-console.sony #dialog .login-user-info .platform-container>div,.game-console.microsoft #dialog .login-user-info .platform-container>div{font-size:1em}.wiiu .advertisement-callout,.wiiu .advertisement-info,.wiiu #leanback-player-container,.wiiu .skip-ad-button,.wiiu .title-card,.wiiu #watch,.wiiu .toaster{-h5vcc-target-screen:screen-all}.wiiu .pivot-shelf-list{opacity:1}.wiiu .legend-item.back .icon,.wiiu .legend-item.exit .icon{background-position:0 33.3%}.wiiu .legend-item.search .icon{background-position:0 100%}.wiiu .legend-item.close-guide .icon,.wiiu .legend-item.delete .icon,.wiiu .legend-item.guide .icon,.wiiu .legend-item.home .icon{background-position:0 66.7%}.wiiu .qr-code-wrapper{display:none}.wiiu #search .search-pairing{display:none}.wiiu #search-suggestions{font-size:1.6em;height:1.6em}.wiiu .search-state .application-message{top:35%}.tv .legend-item.guide .icon,.tv .legend-item.close-guide .icon,.tv .skip-ad-callout .icon{background-position:0 100%}.lg .legend-item.back,.lg .legend-item.exit{cursor:pointer}.tv .legend-item.back .icon,.tv .legend-item.exit .icon{background-position:0% 0%}.lg .legend-item.back .icon,.lg .legend-item.exit .icon{opacity:0.8}.lg .legend-item.back:hover .icon,.lg .legend-item.exit:hover .icon{opacity:1}body.samsung{background-color:transparent!important}body.lg{background-color:transparent!important;background-image:url(tv:)!important}body.limited-memory{background-color:#111}.limited-memory .bg,.eureka .bg{background-image:none;background-color:#2e2e2e}.limited-animation .loading-indicator,.opera .loading-indicator,.lg .loading-indicator{display:none}.limited-animation .fallback-loading-indicator,.opera .fallback-loading-indicator,.lg .fallback-loading-indicator{display:block}.limited-animation .video-tile .video-thumb{opacity:1}.limited-memory .video-tile .video-thumb{background-size:cover}.limited-memory .video-tile .video-thumb.preloaded{background-size:auto}.roku.limited-memory .video-tile .video-thumb{background-size:100%;opacity:1}.limited-animation.playlist-tile .count-overlay{background-color:#000}.search .placeholder-tile,.settings .placeholder-tile,.limited-animation .browse-content .list .placeholder-tile{height:24em;width:20.75em}.guide .placeholder-tile{width:100%;height:2em}.limited-animation .action-tile,.limited-animation .channel-tile,.limited-animation .playlist-tile,.limited-animation .auto-play-tile,.limited-animation .recent-search-tile,.limited-animation .video-tile,.limited-animation .browse-content .list .placeholder-tile,.search .placeholder-tile,.settings .placeholder-tile,.shelf .placeholder-tile{display:inline-block;margin-right:1.1em;position:relative;vertical-align:top}.limited-animation .shelves{margin-top:2.5%}.limited-animation .playlist-tile .overlay,.limited-animation .video-tile .overlay,.limited-memory .playlist-tile .overlay,.limited-memory .video-tile .overlay{opacity:1}.limited-memory .auto-play-tile .video-tile{margin:0}.limited-animation .auto-play-tile .post-play-countdown{top:-4em}.limited-animation .hide-background.video-tile .video-thumb{background-image:url(img/icon-playbutton.png)!important;background-repeat:no-repeat;opacity:1}.limited-animation .action-tile.focused .content{text-shadow:none}.limited-animation .post-play-countdown{text-shadow:none}.limited-animation #keyboard-grid .button.disabled,.limited-animation #keyboard-grid .button.focused,.limited-animation #letter-suggest .button{background-color:rgba(153,153,153,1)}.limited-animation #search #text-box-background,.limited-animation #search #search-text-entry{background-color:#000}.limited-animation #search-keyboard,.limited-animation #letter-suggest{text-shadow:none}.limited-animation #search-keyboard .disabled,.limited-animation #letter-suggest .button{color:#000;text-shadow:none}.limited-animation #letter-suggest .button.focused,.limited-animation #search-keyboard .button.focused{background-color:#e1e1e1;color:#212121}.limited-animation #transliteration .list .button{border-right-color:#f1f1f1}.limited-animation #transliteration .list .button.focused{background-color:rgba(153,153,153,1)}.limited-animation .toaster .toast-container{background-color:rgba(27,25,26,1)}.limited-animation .title-card,.limited-memory.limited-animation.sets-ui .title-card{background:#000;height:20%}.opera .focused,.opera :focus{outline:invert none medium}.eureka #browse-sets,.eureka #dialog .buttons,.eureka .legend,.eureka #transport-controls{display:none}#eureka-player-controls-container{display:none;position:absolute;top:17em;width:100%}.eureka #eureka-player-controls-container{display:block}.eureka .loading #eureka-player-controls-container{opacity:0}#eureka-player-controls{background-size:100%;border-radius:1em;height:11.5em;margin:0 auto;overflow:hidden;width:11.5em}.eureka #eureka-player-controls{opacity:0}@-webkit-keyframes showAndShrinkPause{from{-webkit-transform:scale(1.5);opacity:0}to{opacity:.7}}@-webkit-keyframes hideAndGrowPlay{from{opacity:.7}to{-webkit-transform:scale(1.5);opacity:0}}.eureka #watch.play #eureka-player-controls{background-image:url(img/player-play.png);-webkit-animation:hideAndGrowPlay linear 0.25s 0s 1 normal none}.eureka #watch.pause #eureka-player-controls{background-image:url(img/player-pause.png);-webkit-animation:showAndShrinkPause linear 0.25s 0s 1 normal none;opacity:.7}.xboxone .action-tile,.xboxone .legend-item.back,.xboxone .legend-item.delete,.xboxone .legend-item.exit,.xboxone .legend-item.home,.xboxone .legend-item.modify,.xboxone .legend-item.reversed-back,.xboxone .legend-item.search,.xboxone .player-controls div,.xboxone .auto-play-tile,.xboxone .video-stream,.xboxone .video-tile,.xboxone #browse-search-bar,.xboxone #guide.focused .guide-button,.xboxone #player-controls .item,.xboxone #snap-buttons>div{-h5vcc-gesturable:gesture-clickable}.xboxone #browse-sets{-h5vcc-gesturable:gesture-scroll-both}.xboxone #guide.focused .carousel{-h5vcc-gesturable:gesture-scroll-vertical}.xboxone .settings-shelf{-h5vcc-gesturable:gesture-scroll-horizontal}.xboxone #transliteration .button:hover,.xboxone #keyboard-grid .button:hover{background:none;cursor:default}.search-hint{display:none}.xboxone .search-hint,.xbox360 .search-hint{color:#6b6b6b;display:block;font-size:1.4em;line-height:2em}.context-menu-defocuser{background-color:rgba(0,0,0,0.5);height:100%;left:0;position:absolute;top:0;width:100%}.context-menu-list{background-color:#000;height:initial;left:50%;padding-top:2.5em;position:relative;top:50%;-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:30%}.context-menu-list .button{-h5vcc-gesturable:gesture-clickable;border:#000 solid;border-width:0.5em 1em 0.5em 1em;color:#e1e1e1;cursor:pointer;font-family:roboto-regular;font-size:1.5em;height:auto;line-height:2.5em;margin:0;text-align:left;text-indent:1em;transition-duration:200ms;transition-property:background-color,color;transition-timing-function:cubic-bezier(0.4,0,0.2,1);-webkit-transition-duration:200ms;-webkit-transition-property:background-color,color;-webkit-transition-timing-function:cubic-bezier(0.4,0,0.2,1)}.context-menu-list .button:before{font-family:youtube-icons;padding-right:1em}.context-menu-list .button.icon-platform-switch-users{background:#1f1f1f url() no-repeat;background-position:0.5em center;background-size:2em 2em;border:solid #1f1f1f;border-width:2em 1em 2em 1em;height:initial;line-height:initial;margin-top:1em;padding:0.5em 0 0.5em 3em;text-indent:0}.context-menu-list .button.focused{background-color:#e1e1e1;color:#000}.call-to-cast{display:none}.call-to-cast.focused{bottom:0;display:block;left:0;position:absolute;right:0;top:0}.call-to-cast-text{color:#f1f1f1;font-weight:normal;text-shadow:#000 .06em .06em;width:38%}h2.call-to-cast-text{font-size:3.2em;margin-bottom:0.3em;margin-top:0;padding-top:1.5em}h3.call-to-cast-text{font-size:1.7em}.call-to-cast .end-screen{background-position:center center;background-repeat:no-repeat;background-size:cover;display:none;height:100%}.call-to-cast .end-screen.active{display:block}.call-to-cast .end-screen .call-to-cast-text{color:#fff;width:40%}.call-to-cast .end-screen .call-to-cast-text em{color:#0090ff;font-style:normal}.call-to-cast .end-screen h2.call-to-cast-text{margin-bottom:0.5em;padding-top:2em}.call-to-cast .end-screen h3.call-to-cast-text{line-height:1.5em}.call-to-cast .end-screen.left .call-to-cast-text{margin-left:5%}.call-to-cast .end-screen.right .call-to-cast-text{margin-left:50%}.call-to-cast .end-screen .yt-logo,.call-to-cast .end-screen .yt-kids-logo{background-image:url(img/call-to-cast-yt-logo.png);background-repeat:no-repeat;background-size:contain;bottom:8%;height:13.88%;position:fixed;width:100%}.call-to-cast .end-screen.left .yt-logo,.call-to-cast .end-screen.left .yt-kids-logo{background-position:left center;left:4%}.call-to-cast .end-screen.right .yt-logo,.call-to-cast .end-screen.right .yt-kids-logo{background-position:right center;right:4%}.call-to-cast .end-screen .yt-kids-logo{background-image:url(img/yt-kids-logo.png);height:20%}.call-to-cast .end-screen.multi-user{background-image:url(img/call-to-cast-end-screen-multi-user.jpg)}.call-to-cast .end-screen.yt-mix{background-image:url(img/call-to-cast-end-screen-yt-mix.jpg)}.call-to-cast .end-screen.tv-queue{background-image:url(img/call-to-cast-end-screen-tv-queue.jpg)}.call-to-cast .end-screen.kids-promo{background-image:url(img/call-to-cast-end-screen-kids-promo.jpg)}.call-to-cast .end-screen.kids-mother-goose{background-image:url(img/call-to-cast-end-screen-kids-mother-goose.jpg)}.call-to-cast .end-screen.kids-rainbow{background-image:url(img/call-to-cast-end-screen-kids-rainbow.jpg)}.call-to-cast .end-screen.kids-sesame{background-image:url(img/call-to-cast-end-screen-kids-sesame.jpg)}.call-to-cast .end-screen.kids-talking-tom{background-image:url(img/call-to-cast-end-screen-kids-talking-tom.jpg)}.call-to-cast .end-screen.kids-wonderquest{background-image:url(img/call-to-cast-end-screen-kids-wonderquest.jpg)}.call-to-cast .THEME-cl.end-screen.kids-promo h2.call-to-cast-text{width:80%}.call-to-cast .THEME-k.end-screen h3.call-to-cast-text{font-size:3em;line-height:1.4em;margin-top:0;padding-top:10%;padding-left:5%;width:45%}.call-to-cast .end-screen.gaming-heart{background-image:url(img/call-to-cast-end-screen-gaming-heart.jpg)}.call-to-cast .THEME-g.end-screen h3.call-to-cast-text{font-size:2.2em;padding-top:0%;width:100%}.call-to-cast .end-screen.loki{background-image:url(img/call-to-cast-end-screen-loki.jpg)}.call-to-cast .THEME-up.end-screen h3.call-to-cast-text{font-size:2.2em;margin-left:0%;padding-top:17em;text-align:center;width:100%}.call-to-cast .THEME-m.end-screen h2.call-to-cast-text{font-size:2.2em;margin-bottom:0;text-align:center;width:100%}.call-to-cast .THEME-m.end-screen h3.call-to-cast-text{margin-top:0;text-align:center;width:100%}.call-to-cast .THEME-m.end-screen.music-ready{background-image:url(img/call-to-cast-music.jpg)}.call-to-cast .THEME-m.end-screen.music-ready .call-to-cast-logo{background:url(img/yt-music-logo.png) no-repeat center bottom;height:60%}.call-to-cast .THEME-m.end-screen.music-ready h2.call-to-cast-text{padding-top:10%}.call-to-cast .THEME-m.end-screen.music-party{background-image:url(img/call-to-cast-music.jpg);height:100%}.call-to-cast .THEME-m.end-screen.music-party .call-to-cast-logo{background:url(img/call-to-cast-music-party-logo.png) no-repeat center bottom;height:55%}.call-to-cast .THEME-m.end-screen.music-party .footer{background:url(img/yt-music-logo-small.png) no-repeat center top;height:10%}.snap-controls{height:90%;padding:.5em;position:relative}.snapped.blurred #snap-buttons,.snapped.blurred #unsupported-mode,.snapped.blurred #ad-callout,.snapped.blurred .logo-container,.snapped.blurred .title-card,.snapped.blurred .up-next{opacity:.25!important}.snapped #dialog,.snapped #guide,.snapped #search,.snapped #settings,.snapped #title-tray,.snapped #transport-controls,.snapped .ad-showing .video-ads,.snapped .advertisement-info,.snapped .application-message,.snapped .browse,.snapped .browse-sets,.snapped .caption-window,.snapped .countdown-ad-callout,.snapped .html5-video-info-panel,.snapped .legend,.snapped .player-video-avatar,.snapped .quality-status,.snapped .skip-ad-button,.snapped .skip-ad-callout,.snapped .toaster,.snapped.blurred.browse-sets-state .title-card,.snapped.blurred.search-state .title-card,.snapped.blurred.settings-state .title-card,.snapped.dialog-focused #snap-progress-bar,.snapped.dialog-focused #watch{display:none!important}.snapped .advertisement-tooltip{color:#a0a0a0;font-size:.4em;left:0;top:0}.snapped .advertisement-tooltip .remaining_duration{color:#717171}.snapped #ad-callout{left:5%;top:18%}.snapped .debug-watermark{font-size:.2em;width:100%}#app-markup.snapped{background-color:#231f20}.snapped #background{display:none}.snapped{font-size:2em}.snapped.watch-state .logo-container{opacity:inherit}.snapped .icon-youtube-logo:before{content:''}.snap-controls .logo-container{background:url(img/yt-logo-fullcolor.png) no-repeat center top;display:inherit;height:2.5em;left:0;position:absolute;right:0;top:5%}.snapped .ad-video,.snapped .ad-created .video-stream{height:270px!important;width:480px!important}.snapped .video-stream,.snapped .html5-video-content{-webkit-transform:scale(.9)!important;max-height:5.6em;top:4.4em!important}.snapped .html5-video-controls{top:9.8em!important}.snapped .player-video-title{color:#a0a0a0;font-size:.7em;line-height:1.1em;margin:0;max-height:2.2em;white-space:normal;width:12em}.snapped .player-meta{left:0;margin:0;position:inherit;top:0}.snapped .player-meta .player-video-text{padding-left:0}.snapped .player-meta .player-video-details{color:#717171;font-size:.5em;line-height:1.1em}.snapped .player-meta .player-video-details>div{margin-left:0}.snapped .player-video-details .uploaded-date,.snapped .player-video-details .set-context,.snapped .player-video-details .view-count{font-size:.9em;margin-top:0}.watch-state.snapped #snap-progress-bar{display:block}#snap-progress-bar{background-position:top left;display:none;height:.1em;left:0;margin-top:9.25em;padding:0;position:relative;top:0;width:100%}#snap-progress-bar .progress-bar-disc,#snap-progress-bar .progress-bar-playhead{display:none}#snap-progress-bar div{height:5px;top:0}.snapped .title-card{background:none;border:none;height:initial;padding-top:.3em;position:inherit}#unsupported-mode{color:#fff;font-size:.9em;line-height:1.2em;padding:80% 1em 0;width:8em}.snap-controls .mute{background-image:url(img/icon-mute.png)}.snap-controls .mute.toggle-selected{background-image:url(img/icon-unmute.png)}.snap-controls .fullscreen{background-image:url(img/icon-fullscreen.png)}.snapped .loading-indicator{height:5em;width:5em}.snapped #spinner{top:19%;-o-transform:scale(.5);-webkit-transform:scale(.5);transform:scale(.5)}.engaged.snapped .engagement-indicator{display:inline-block;font-size:.6em!important;left:0;margin-left:auto;margin-right:auto;position:absolute;right:0;text-align:center;top:4.2em!important}.engaged.snapped .engagement-indicator .stop-listening{background:transparent}.snap-controls #snap-buttons{bottom:0;position:absolute}.snap-controls #snap-buttons .focused,.snap-controls #snap-buttons :hover{-webkit-border-radius:.15em;background-color:#fff;color:#000}.snap-controls #snap-buttons .button,.snap-controls #snap-buttons .toggle-button{display:inline-block;font-size:.8em;height:1em;margin-left:.5em;padding:1em;position:relative;text-align:center;top:0;width:1em}.snap-controls #snap-buttons div{color:#fff;cursor:pointer;vertical-align:middle}.snap-controls #snap-buttons div.disabled:hover{background-color:transparent;color:#fff}.snap-controls #snap-buttons div.focused{opacity:1}.snap-controls #snap-buttons div.disabled{opacity:.2}.snap-controls .speakable span,.snap-controls .disabled span{display:none}.engaged .snap-controls .speakable:not(.disabled) span{color:#5dc21e;display:block;font-size:.6em;left:0;overflow:hidden;pointer-events:none;position:absolute;text-align:center;top:-1.5em;width:100%;word-break:break-all}.lang-case-sensitive .snap-controls .speakable span:first-letter{text-transform:uppercase}.snap-controls .icon-player-play{font-family:'youtube-icons'}.snap-controls .icon-mute,.snap-controls .icon-fullscreen{background-position:center center;background-repeat:no-repeat;background-size:3em}.snap-controls .icon-mute,.snap-controls .icon-mute.disabled{background-image:url(img/button-unmute-active.png)}.snap-controls .icon-mute.focused,.snap-controls .icon-mute:hover:not(.disabled){background-image:url(img/button-unmute-onhover-active.png)}.snap-controls .icon-mute.toggle-selected{background-image:url(img/button-mute-active.png)}.snap-controls .icon-mute.toggle-selected.focused,.snap-controls .icon-mute.toggle-selected:hover{background-image:url(img/button-mute-onhover-active.png)}.snap-controls .icon-fullscreen{background-image:url(img/button-fullscreen-active.png)}.snap-controls .icon-fullscreen.focused,.snap-controls .icon-fullscreen:hover{background-image:url(img/button-fullscreen-onhover-active.png)}.up-next{height:3em;padding-top:1em}.up-next div{color:#a0a0a0;font-size:.6em}.up-next .video-title{height:1.2em;line-height:1.2em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.up-next .video-thumb{background:no-repeat center/100%;display:inline-block;height:100%;margin-top:.2em;max-height:2.5em;vertical-align:top;width:5em}#browse-sets{background-color:#222;height:100%;left:0;overflow:hidden;position:absolute;right:0}#browse-sets.no-background,.limited-memory #browse-sets{background-color:rgba(0,0,0,0)}#browse-search-bar{background-color:rgba(153,153,153,.2);cursor:pointer;height:3em;left:8em;margin-right:18em;position:absolute;right:2.5em;top:2.5em}.limited-animation #browse-search-bar{background-color:#4f575a}#browse-search-bar.focused,#browse-search-bar:hover{background:#fff}#browse-search-bar .icon{color:rgba(255,255,255,.4);display:block;font-family:'youtube-icons';font-size:1.8em;margin:0;padding:.35em 0 0 .5em;text-align:left}.limited-animation #browse-search-bar .icon{color:#e1e1e1}.youtube-logo-top{height:3.4em;position:absolute;right:9.5em;top:2.3em;width:8.4em;font-family:'youtube-icons'}#browse-sets.has-header-content .youtube-logo-top{display:none}.youtube-logo:before{color:rgba(153,153,153,.5);display:block;font-size:3.4em}.youtube-unlimited-logo:before{color:rgba(153,153,153,.5);display:none;font-size:3.4em;position:relative;right:.5em}.unlimited .youtube-logo:before{display:none}.unlimited .youtube-unlimited-logo:before{display:block}.limited-animation .youtube-unlimited-logo:before,.limited-animation .youtube-logo:before{color:#4f575a}#browse-search-bar.focused .icon,#browse-search-bar:hover .icon{color:#444}#platform-user-icon{background-position:center;background-repeat:no-repeat;background-size:contain;height:4em;position:absolute;right:3em;top:2em;width:4em}#browse-header{background-position:0 -8em;background-size:cover;height:60%;position:relative}.limited-memory.limited-animation #browse-header{background-position:6em 0;background-repeat:no-repeat;background-size:contain}.no-background #browse-header{background-image:none!important}.browse-sets #browse-header.collapsed{-o-transform:translateY(-27%);-webkit-transform:translateY(-27%);transform:translateY(-27%)}.limited-memory .browse-sets #browse-header.collapsed{top:-7em;-o-transform:none;-webkit-transform:none;transform:none}#browse-header .title{color:#e1e1e1;display:inline-block;font-size:2.25em;margin-bottom:-.23em;overflow:hidden;text-overflow:ellipsis;-o-transform-origin:left;-webkit-transform-origin:left;transform-origin:left;white-space:nowrap;width:23.7em}#browse-header.one-button .title{width:18.7em}#browse-header.two-buttons .title{width:14em}#browse-header.collapsed .title{overflow:visible;-o-transform:scale(.8,.8) translateY(-5em) translateX(-1.5em);-webkit-transform:scale(.8,.8) translateY(-5em) translateX(-1.5em);transform:scale(.8,.8) translateY(-5em) translateX(-1.5em)}.browse-header-gradient{background:-o-linear-gradient(top,rgba(34,34,34,0) 0%,rgba(34,34,34,0) 15%,rgba(34,34,34,1) 100%);background:-webkit-linear-gradient(top,rgba(34,34,34,0) 0%,rgba(34,34,34,0) 15%,rgba(34,34,34,1) 100%);background:linear-gradient(to bottom,rgba(34,34,34,0) 0%,rgba(34,34,34,0) 15%,rgba(34,34,34,1) 100%);height:100%;width:100%}.limited-memory .browse-header-gradient{display:none}.no-background .browse-header-gradient{visibility:hidden}.browse-header-metadata{left:8em;position:absolute;-o-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}.limited-memory.limited-animation .browse-header-metadata{top:11.6em}.limited-memory.limited-animation #browse-header.collapsed .browse-header-metadata{font-size:inherit;left:8em;top:11em}.limited-memory.limited-animation #browse-header.collapsed .browse-header-metadata .browse-header-avatar{height:4em;margin-right:1em;width:4em}.browse-header-avatar{background-size:contain;display:inline-block;height:5em;margin-right:1.3em;-o-transform-origin:left;-webkit-transform-origin:left;transform-origin:left;width:5em}#browse-header.collapsed .browse-header-avatar{-o-transform:scale(.61,.61) translateY(-13.5em);-webkit-transform:scale(.61,.61) translateY(-13.5em);transform:scale(.61,.61) translateY(-13.5em)}#browse-header.collapsed .browse-header-button-bar{-o-transform:translateY(-6.25em);-webkit-transform:translateY(-6.25em);transform:translateY(-6.25em);opacity:0}.browse-header-button-bar{background:rgba(0,0,0,.4);border-radius:.15em;font-size:1.1em;height:2.4em;margin-bottom:-.59em;padding:.59em;position:absolute;right:3.5em}.limited-animation .browse-header-button-bar{background:#1f2426}.limited-memory.limited-animation .browse-header-button-bar{top:13em}.browse-header-button-bar,.browse-header-metadata{bottom:3.9em}.browse-header-button-bar .button{border-radius:.12em;color:#e1e1e1;cursor:default;display:inline-block;height:2.4em;min-width:8.2em;overflow:hidden;padding-right:1em;white-space:nowrap}.browse-header-button-bar .button span{line-height:2.4em;vertical-align:middle}.browse-header-button-bar .button.focused,.browse-header-button-bar .button.focused:hover{background:#e1e1e1;color:#212121}.browse-header-button-bar .button:hover{background-color:#666}.browse-header-button-bar .button .icon{display:inline-block;font-family:'youtube-icons';height:2.4em;margin:0 1em 0 1em}.browse-header-subscribe .icon:before{font-size:2em}.browse-header-subscribe.toggle-selected .icon:before{content:"\00e602";font-size:1em}.browse-header-subscribe.toggle-selected.focused{color:#ce292d}.browse-header-subscribe.disabled{background-color:rgba(0,0,0,0)}.browse-content{height:80%;left:8em;position:absolute;top:14.5%;width:100%}.browse-sets.collapsed .browse-content{-o-transform:translateY(44%);-webkit-transform:translateY(44%);transform:translateY(44%)}.limited-memory .browse-sets.collapsed .browse-content{top:20em;-o-transform:none;-webkit-transform:none;transform:none}#browse-header,.browse-header-avatar,.browse-header-button-bar,.browse-content,#browse-header .title{-o-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0);-o-transition:-o-transform .25s;-webkit-transition:-webkit-transform .25s;transition:-webkit-transform .25s}.browse-header-button-bar{-o-transition:opacity .25s -o-transform .25s;-webkit-transition:opacity .25s,-webkit-transform .25s;transition:opacity .25s,transform .25s}.limited-animation #browse-header,.limited-animation .browse-header-avatar,.limited-animation #browse-header.collapsed .browse-header-avatar,.limited-animation .browse-content,.limited-animation .browse-header-button-bar,.limited-animation #browse-header .title,.limited-animation .browse-content .shelves,.limited-animation .browse-header-metadata,.limited-animation .shelf #content-container,.limited-animation .shelves>.title,.limited-animation .shelf>.title,.limited-animation .horizontal-list>.content,.limited-animation .horizontal-list,.limited-animation .shelves .carousel{-o-transition:all 0;-webkit-transition:none;transition:none;-o-transform:none;-webkit-transform:none;transform:none}.limited-animation #browse-header.collapsed .browse-header-metadata{font-size:.6em;left:13.25em;top:17.75em}.limited-animation #browse-header.collapsed .browse-header-metadata .title{font-size:3em}.limited-memory #browse-header.collapsed .browse-header-metadata .title{font-size:1.8em}.limited-animation .browse-content .list{margin-left:-9.5em;width:126em}.limited-animation .browse-content .shelf>.title{margin-left:6em}.limited-animation.sets-ui .action-tile:not(.focused),.limited-animation.sets-ui .auto-play-tile:not(.focused) .video-tile,.limited-animation.sets-ui .channel-tile:not(.focused),.limited-animation.sets-ui .playlist-tile:not(.focused),.limited-animation.sets-ui .recent-search-tile:not(.focused),.limited-animation.sets-ui .video-tile:not(.focused),.roku.limited-animation.sets-ui .action-tile:hover:not(.focused),.roku.limited-animation.sets-ui .auto-play-tile:hover:not(.focused) .video-tile,.roku.limited-animation.sets-ui .channel-tile:hover:not(.focused),.roku.limited-animation.sets-ui .playlist-tile:hover:not(.focused),.roku.limited-animation.sets-ui .video-tile:hover:not(.focused){background-color:#212121}.limited-animation.sets-ui .action-tile:hover:not(.focused),.limited-animation.sets-ui .auto-play-tile:hover:not(.focused) .video-tile,.limited-animation.sets-ui .channel-tile:hover:not(.focused),.limited-animation.sets-ui .playlist-tile:hover:not(.focused),.limited-animation.sets-ui .recent-search-tile:hover:not(.focused),.limited-animation.sets-ui .video-tile:hover:not(.focused){background-color:#414141}.browse-content .shelves{margin-left:0em;-o-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}.browse-content .shelves>.no-content-message,.browse-content .horizontal-list>.no-content-message{margin-left:-8em}.shelves>.no-content-message,.horizontal-list>.no-content-message{display:none;position:absolute;top:8em;width:100%}.shelves.no-content>.no-content-message,.horizontal-list.no-content>.no-content-message{display:block}.shelves>.no-content-message .text,.horizontal-list>.no-content-message .text{color:#f1f1f1;font-size:1.8em;text-align:center;text-shadow:#000 .04em .04em}.shelf{width:100%}.limited-animation .shelf{margin-bottom:1.8em}.carousel .shelf{position:absolute}.shelf #content-container{-o-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}.shelves>.title,.shelf>.title{color:#999;font-size:1.6em;margin-bottom:1.0em;margin-top:.2em;-o-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0);white-space:nowrap}.shelves>.title,.shelf.selected>.title{color:#fff}.shelf>.title .annotation{color:#777;font-size:70%;margin-left:.5em}.shelf.selected>.title .annotation{color:#ddd}.horizontal-list.no-model,.shelf.no-model,.survey-shelf.no-model{display:none}.shelf>.icon{display:none}.horizontal-list>.content{font-size:79%;height:26em;opacity:1;-o-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}.horizontal-list.focused>.content{opacity:1}.horizontal-list,.shelves .carousel,.browse-header-metadata{-o-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}.shelf0to0{opacity:1;-webkit-transform:translateY(0%) scale(1);-o-transform:translateY(0%) scale(1)}@-webkit-keyframes shelf0to1-anim{from{-webkit-transform:translateY(0%)}to{-webkit-transform:translateY(100%)}}@-o-keyframes shelf0to1-anim{from{-o-transform:translateY(0%)}to{-o-transform:translateY(100%)}}.shelf0to1{-webkit-animation:shelf0to1-anim 200ms forwards;-o-animation:shelf0to1-anim 200ms forwards}@-webkit-keyframes shelf0to2-anim{from{opacity:1;-webkit-transform:translateX(0%) translateY(0%) scale(1.0)}100%{opacity:0;-webkit-transform:translateX(-2%) translateY(-11%) scale(0.75)}}@-o-keyframes shelf0to2-anim{from{opacity:1;-o-transform:translateX(0%) translateY(0%) scale(1.0)}100%{opacity:0;-o-transform:translateX(-2%) translateY(-11%) scale(0.75)}}.shelf0to2{-webkit-animation:shelf0to2-anim 200ms forwards;-o-animation:shelf0to2-anim 200ms forwards}@-webkit-keyframes shelf1to0-anim{from{-webkit-transform:translateX(0%) translateY(100%)}to{-webkit-transform:translateX(0%) translateY(0%)}}@-o-keyframes shelf1to0-anim{from{-o-transform:translateX(0%) translateY(100%)}to{-o-transform:translateX(0%) translateY(0%)}}.shelf1to0{-webkit-animation:shelf1to0-anim 200ms forwards;-o-animation:shelf1to0-anim 200ms forwards}.shelf1to1{opacity:1;-webkit-transform:translateX(0%) translateY(100%) scale(1);-o-transform:translateX(0%) translateY(100%) scale(1)}@-webkit-keyframes shelf1to2-anim{from{-webkit-transform:translateX(0%) translateY(100%)}99%{-webkit-transform:translateX(0%) translateY(200%)}100%{opacity:0;-webkit-transform:translateX(-2%) translateY(-11%) scale(0.75)}}@-o-keyframes shelf1to2-anim{from{-o-transform:translateX(0%) translateY(100%)}99%{-o-transform:translateX(0%) translateY(200%)}100%{opacity:0;-o-transform:translateX(-2%) translateY(-11%) scale(0.75)}}.shelf1to2{-webkit-animation:shelf1to2-anim 200ms forwards;-o-animation:shelf1to2-anim 200ms forwards}@-webkit-keyframes shelf2to0-anim{from{opacity:0;-webkit-transform:translateX(-2%) translateY(-11%) scale(0.75)}to{opacity:1;-webkit-transform:translateX(0%) translateY(0%) scale(1.0)}}@-o-keyframes shelf2to0-anim{from{opacity:0;-o-transform:translateX(-2%) translateY(-11%) scale(0.75)}to{opacity:1;-o-transform:translateX(0%) translateY(0%) scale(1.0)}}.shelf2to0{-webkit-animation:shelf2to0-anim 200ms forwards;-o-animation:shelf2to0-anim 200ms forwards}@-webkit-keyframes shelf2to1-anim{from{opacity:1;-webkit-transform:translateX(0%) translateY(200%)}to{opacity:1;-webkit-transform:translateX(0%) translateY(100%)}}@-o-keyframes shelf2to1-anim{from{opacity:1;-o-transform:translateX(0%) translateY(200%)}to{opacity:1;-o-transform:translateX(0%) translateY(100%)}}.shelf2to1{-webkit-animation:shelf2to1-anim 200ms forwards;-o-animation:shelf2to1-anim 200ms forwards}.shelf2to2{opacity:0;-webkit-transform:translateX(-2%) translateY(-11%) scale(0.75);-o-transform:translateX(-2%) translateY(-11%) scale(0.75)}.limited-memory .shelves .list .video-tile:nth-child(1) .video-thumb,.limited-memory .shelves .list .channel-tile:nth-child(1) .video-thumb,.limited-memory.sets-ui #search .horizontal-list .list .video-tile:nth-child(1) .video-thumb,.limited-memory.sets-ui #search .horizontal-list .list .channel-tile:nth-child(1) .video-thumb,.limited-memory.sets-ui #browse .list .video-tile:nth-child(1) .video-thumb,.limited-memory.sets-ui #browse .list .channel-tile:nth-child(1) .video-thumb,.limited-memory.sets-ui #browse .list .video-tile:last-child .video-thumb,.limited-memory.sets-ui #browse .list .channel-tile:last-child .video-thumb{background:none!important}.survey-shelf{position:absolute}.survey-shelf>.title{color:#fff;display:inline-block;font-size:1.6em;margin-bottom:1.0em;margin-top:0.2em}.survey-shelf .action-tile .content>.title{display:none}.survey-shelf .horizontal-list>.content{font-size:79%;height:26em}.survey-shelf .description{color:#fff;visibility:visible}.survey-shelf .button{display:inline-block;margin-bottom:1em;margin-left:2em}.survey-shelf .sliding-highlighter{height:8em;width:8em}.survey-shelf .action-tile,.exp-densityBrowse .survey-shelf .action-tile{border:0;height:8em;width:8em}.survey-shelf .action-tile .content{height:8em;width:8em}.survey-shelf .action-tile .description{color:#777;font-size:1.2em;margin-top:-1.3em;opacity:1;white-space:nowrap}.exp-densityBrowse .survey-shelf.focused .action-tile .description{display:block}.exp-densityBrowse .survey-shelf .action-tile .description{display:none}.survey-shelf .action-tile .large-action-icon,.exp-densityBrowse .survey-shelf .action-tile .large-action-icon{background-color:transparent;font-size:5em;margin-top:.26em;padding-right:.2em}.survey-shelf .action-tile.selected .large-action-icon,.exp-densityBrowse .survey-shelf .action-tile.selected .large-action-icon{color:#fff}.survey-shelf .action-tile.focused .large-action-icon,.exp-densityBrowse .survey-shelf .action-tile.focused .large-action-icon{color:#222}.survey-shelf .button.focused{background-color:#fff;border-radius:.1em;color:#222;padding:.2em}.survey-shelf .button{color:#777}.limited-animation .survey-shelf{margin-bottom:5em;position:relative}.limited-animation .survey-shelf>.title{margin-left:6em}.limited-animation .exp-densityBrowse .survey-shelf>.title{margin-left:5em}.limited-animation .survey-shelf .horizontal-list{margin-left:17.5em}.limited-animation .exp-densityBrowse .survey-shelf .horizontal-list{margin-left:13.5em}.limited-animation .exp-densityBrowse .survey-shelf .action-tile .large-action-icon{margin-top:.12em}.limited-animation .exp-densityBrowse .survey-shelf .action-tile .description{display:block}#guide{box-shadow:.1em 0 1em 0em black;height:100%;left:0;overflow:hidden;position:absolute;-o-transform:translateX(-23em);-webkit-transform:translateX(-23em) translateZ(0);transform:translateX(-23em) translateZ(0);-o-transition:-o-transform 400ms cubic-bezier(0.4,0.0,0.2,1);-webkit-transition:-webkit-transform 400ms cubic-bezier(0.4,0.0,0.2,1);transition:transform 400ms cubic-bezier(0.4,0.0,0.2,1);width:28em}.limited-memory.limited-animation #guide{box-shadow:none;-o-transform:none;-webkit-transform:none;transform:none}.limited-memory #guide.focused{border-right:none}#guide.focused{-o-transform:translateX(0);-webkit-transform:translateX(0);transform:translateX(0)}#guide:hover{background-color:rgba(255,255,255,.2)}.limited-animation #guide:hover{background:none}.limited-animation #guide,.limited-animation #guide #user-info-background,.limited-animation .guide-carousel-background{-o-transition:none;-webkit-transition:none;transition:none}.guide-carousel-background{background-color:rgba(0,0,0,.2);height:100%;left:0em;position:absolute;top:0em;width:100%;-o-transition:background-color 400ms;-webkit-transition:background-color 400ms;transition:background-color 400ms}.limited-animation .guide-carousel-background,.limited-animation #guide #user-info-background{background-color:#1f2426}.limited-animation #guide:hover .guide-carousel-background,.limited-animation #guide:hover #user-info-background{background-color:#384145}.limited-animation.limited-memory .guide-carousel-background,.limited-animation.limited-memory #guide #user-info-background{background-color:#df2323}.limited-memory .guide-carousel-background,.limited-memory #guide #user-info-background,#guide .list{display:none}.limited-memory #guide.focused .guide-carousel-background,.limited-memory #guide.focused.logged-in #user-info-background,#guide.focused .list{display:block}.logged-in .guide-carousel-background{top:8.5em}#guide.focused .guide-carousel-background,#guide.focused:hover .guide-carousel-background{background-color:#df2323}.collapsed-guide,#guide.focused .collapsed-guide{display:none}.collapsed-guide-icons{color:#85888a;font-size:1.6em;left:15em;opacity:1;position:absolute;top:7.5em}.collapsed-guide-icon{font-family:'youtube-icons';margin-top:1em;margin-bottom:1em;text-align:center;width:2em}#guide .collapsed-guide-icons{-o-transition:opacity 150ms 450ms;-webkit-transition:opacity 150ms 450ms;transition:opacity 150ms 450ms}.limited-memory .collapsed-guide-icons{left:1em}.limited-animation #guide .collapsed-guide-icons{-o-transition:none;-webkit-transition:none;transition:none}#guide.focused .collapsed-guide-icons{opacity:0;-o-transition:none;-webkit-transition:none;transition:none}#guide .collapsed-guide-icon.icon-guide-my-subs{display:none}#guide.logged-in .collapsed-guide-icon.icon-guide-my-subs{display:block}#guide.logged-in .collapsed-guide-icon.icon-popular{display:none}.collapsed-guide-icon.icon-music{font-size:.925em;padding-left:.0375em}.limited-memory .collapsed-guide{background-color:#1f2426;border-right:.2em solid #111;display:block;height:100%;left:0;width:6em}#error-message{display:none}#guide.error.focused #error-message{color:#fff;display:block;font-size:2em;padding:2em;position:absolute;text-align:center;top:12em}#guide .sliding-highlighter{display:none;width:100%;height:4.2em;opacity:0}#guide.focused .sliding-highlighter{opacity:1}#guide.focused .sliding-highlighter{display:block}#guide.focused #user-info-background{visibility:visible}#guide #user-info-background{background-color:rgba(0,0,0,.2);-o-transition:background-color 400ms;-webkit-transition:background-color 400ms;transition:background-color 400ms}#guide.focused #user-info-background,#guide.focused:hover #user-info-background{background-color:#931717}.logged-in #user-info-background{display:block}#guide.focused .guide-user-text{visibility:visible}#guide .carousel,#guide .list,#guide .sliding-highlighter{color:#fff;margin-top:2em}#guide.logged-in .carousel,#guide.logged-in .list,#guide.logged-in .sliding-highlighter{margin-top:1em}#guide .carousel.hidden{display:block!important;visibility:hidden}#guide .list{position:relative}.carousel .guide-button{position:absolute}.list .guide-button{margin-bottom:.1em}.guide-button{font-size:1.6em;height:1.83em;overflow:hidden;padding:.5em .27em .3em 2.9em;white-space:nowrap}.guide-button:hover{background:#900;cursor:pointer;padding-right:1.78em}.guide-button.selected:hover{background:transparent}.guide-button.disabled:hover{background:transparent;cursor:inherit;padding-right:inherit}.guide-button.disabled{padding-left:2.1em;text-transform:uppercase}.guide-button.disabled.footer{text-transform:none}.guide-button-icon{color:#ef9191;display:inline-block;font-family:'youtube-icons';font-size:1.2em;margin-top:.2em;text-align:center;width:1.8em}.guide-button.disabled .guide-button-icon{display:none}.guide-user-text,.guide-button-title{color:#fbdada;display:inline-block;line-height:1.7em;overflow:hidden;padding-left:.5em;text-overflow:ellipsis;vertical-align:top}.guide-button.disabled .guide-button-title{color:#ef9191}.guide-user-text{visibility:hidden;margin-left:-0.4em;position:relative;top:30%;text-overflow:ellipsis;width:9.5em}.guide-button-title{width:11em}.engaged .guide-button-title{width:8em}.guide-button.footer .guide-button-title{font-size:75%;padding-top:.8em;width:21.15em}.guide-button-icon .image,#guide-user-avatar{background:no-repeat center;background-size:100%;height:1em;width:1em}.guide-button-icon .image{background-color:#fff;box-shadow:0 0 0 1px #ef9191;margin:0 .4em 0 .4em}.guide-button.focused .guide-button-icon .image{box-shadow:none}.guide-button .image{display:none}.guide-button.has-image .image{display:block}#guide-user-avatar{border-radius:50%;box-shadow:0 0 0 .05em rgba(239,145,145,.4),0 0 .05em #ef9191;display:inline-block;font-size:2.31em;margin:.2em .2em .2em .4em}#guide-user-avatar,.guide-user-text,.guide-button-icon,.guide-button-title{-o-transition:color 50ms;-webkit-transition:color 50ms;transition:color 50ms;transition-delay:25ms}.no-transition .guide-button .guide-button-icon,.no-transition .guide-button .guide-button-title,.limited-animation .guide-button .guide-button-icon,.limited-animation .guide-button .guide-button-title,.limited-animation #guide-user-avatar,.limited-animation .guide-user-text{-o-transition:none;-webkit-transition:none;transition:none}.guide-button.focused .guide-button-icon,.guide-button.focused .guide-button-title{color:#df2323}.limited-animation .guide-button.focused{background-color:#fff}.user-info-container{height:2.6em;padding:1.1em 0em 0em 1.8em;font-size:1.6em;white-space:nowrap}#user-info-background{display:none;height:8.53em;position:relative;width:inherit;z-index:1}.sliding-highlighter .select{background-color:rgba(0,0,0,0.8);display:none;height:2.9em;min-width:3.5em;padding:1.3em 0.6em 0em 0.6em;position:absolute;right:0;text-align:center}.engaged .guide .sliding-highlighter .select{display:block}.unlimited .guide-user-text{line-height:1.0em}.guide-user-unlimited{font-size:0.8em;color:#a88;text-transform:uppercase}#settings{height:100%;overflow:visible;position:absolute;right:0;left:4.5em}.settings-shelf{height:24em;margin-left:3.5em;margin-top:1em;position:absolute;top:19%;width:100%}.settings-title{color:#fff;font-size:1.2em;line-height:3em;white-space:nowrap}.limited-animation .settings .content .list{width:130em}.limited-animation #settings-items{margin-left:-17em}.settings-horizontal-list>.content{font-size:79%}.settings-horizontal-list>.no-content-message{display:none}.pointer-overlay{display:block}.pointer-overlay .nav-arrow{background-image:url(img/motion-control-sprite.png);background-repeat:no-repeat;background-size:100%;cursor:pointer;display:none;height:5em;opacity:.5;position:absolute;width:5em}.pointer-overlay.enabled .nav-arrow{display:block}.pointer-overlay .nav-arrow:hover{opacity:1}.pointer-overlay .up-arrow{background-position:0 100%;left:45%;top:18%}.pointer-overlay .down-arrow{background-position:0 0%;bottom:11%;left:45%}.pointer-overlay .left-arrow{background-position:0 33.3%;top:50%;left:5%}.settings-focused .pointer-overlay .left-arrow,.browse-sets-state .pointer-overlay .left-arrow,.search-state .pointer-overlay .left-arrow{left:7%}.pointer-overlay .right-arrow{background-position:0 66.7%;top:50%;right:5%}#search.input-open+.pointer-overlay .up-arrow,.post-play-state .pointer-overlay .up-arrow,.post-play-state .pointer-overlay .down-arrow{display:none}.watch-state .pointer-overlay .down-arrow{bottom:2%}.search-state.guide-focused .pointer-overlay .up-arrow{top:20%}@media screen and (aspect-ratio:5/4){#dialog.browse-sets #dialog-wrapper{padding:1.3em 2em}.flag-list-container.flag-options-dialog{font-size:.875em}}@media screen and (max-aspect-ratio:4/3){.player-controls #button-list{font-size:.875em}#transport-controls.ad-active .player-controls-widget .player-controls #button-list{font-size:1em}.fresh-transport-controls .progress-bar{width:70%}.fresh-transport-controls #player-time-elapsed,.fresh-transport-controls .player-time-total{font-size:1.1em;width:10%}}@media screen and (aspect-ratio:4/3){#browse-header .title{width:18.3em}#browse-header.one-button .title{width:13.2em}#browse-header.two-buttons .title{width:8.5em}.sets-ui .flag-list.grid{font-size:0.8em}.flag-claim{font-size:1.4em}#search .search-pairing{font-size:0.7em}.sets-ui .debug-dialog{font-size:0.8em}.voice-footer .list{padding-top:0;width:16em}}@media screen and (min-width:3840px){.player-controls{top:21px}}@media screen and (min-width:1919px){.opera .video-stream{height:1080px;width:1920px}.watch-video-tile,.watch-list .button{padding:10px}}@media screen and (min-width:640px) and (max-width:1024px) and (max-height:576px){.countdown-ad-callout{font-size:1.3em;right:10%}.opera .video-stream{height:576px;width:1024px}#keyboard-grid .button{width:.7em}#dialog-wrapper{padding-left:4em;padding-right:4em}.pairing{-moz-transform-origin:0 50%;-ms-transform-origin:0 50%;-o-transform-origin:0 50%;-webkit-transform-origin:0 50%;-moz-transform:scale(.7);-ms-transform:scale(.7);-o-transform:scale(.7);-webkit-transform:scale(.7)}.browse-sets #browse-header.collapsed{-o-transform:translateY(-19%);-webkit-transform:translateY(-19%);transform:translateY(-19%)}}@media screen and (max-width:720px) and (max-height:480px){.countdown-ad-callout{font-size:.9em;right:5%}.skip-ad-callout{right:3%}.opera .video-stream{height:480px;width:720}#search .pairing .alternatives{margin:0 0 0 1em}#keyboard-grid .button{width:.8em}#search .pairing .search-message .title{margin-top:0.7em}#dialog-view .pairing{font-size:0.8em;margin-top:2em}.watch-list .list{margin-left:-4em}}@media screen and (max-width:640px) and (max-height:480px){.opera .video-stream{height:480px;width:640px}#keyboard-grid .button{width:.7em}#dialog-view .reset-help{display:block;width:27em}.watch-video-tile,.watch-list .button{padding:4px}.browse-header-metadata{bottom:3.9em}.browse-sets #browse-header.collapsed{-o-transform:translateY(-27%);-webkit-transform:translateY(-27%);transform:translateY(-27%)}.voice-footer .list{font-size:.6em;margin-left:35%;padding-top:-3em;width:35%}.engaged .engagement-indicator{display:inline-block;font-size:1.3em;height:3em;margin-bottom:1.5em}.engaged .engagement-indicator .title{display:inline-block}.engagement-indicator .stop-listening .icon{display:inline-block;height:3em;left:0px;top:0px;width:15%}}@media screen and (min-height:1080px) and (max-width:1440px){.video-tile-container{-moz-transform:scale(.7);-ms-transform:scale(.7);-o-transform:scale(.7);-webkit-transform:scale(.7);transform:scale(.7);-moz-transform-origin:top right;-ms-transform-origin:top right;-o-transform-origin:top right;-webkit-transform-origin:top right;transform-origin:top right}.player-controls #button-list .button,.player-controls #button-list .toggle-button{margin-right:.2em;margin-left:.2em}.fresh-transport-controls .progress-bar{width:59%}.fresh-transport-controls #player-time-elapsed,.fresh-transport-controls .player-time-total{font-size:1em;width:14%}.fresh-transport-controls .button,.fresh-transport-controls .toggle-button{font-size:1.1em}.fresh-transport-controls #transport-more-button{font-size:1.7em}#dialog-wrapper{padding:1.3em 3em}.dialog-contents{font-size:95%}#dialog-wrapper .connection-steps{padding:0}#dialog-wrapper .pairing .qr-code,#dialog-wrapper .pairing .connected-list{margin:.2em}.context-menu-list{left:30%;right:30%}.voice-footer .list{font-size:0.65em;padding-left:22em;padding-right:18em;padding-top:1.3em}}.sets-ui .carousel .item,.sets-ui .carousel .channel-tile,.sets-ui .carousel .auto-play-tile{background-color:inherit!important}.sets-ui .carousel .item:hover,.sets-ui .carousel .channel-tile:hover,.sets-ui .carousel .auto-play-tile:hover{background-color:rgba(255,255,255,.1)!important}.sets-ui .tile .channel-bottom>.title,.sets-ui .tile .tile-bottom>.title{color:#e1e1e1}.sets-ui .tile .channel-bottom>.details,.sets-ui .tile .tile-bottom>.details{color:#646464}.sets-ui .tile.focused.selected .channel-bottom>.title,.sets-ui .tile.focused.selected .tile-bottom>.title{color:#212121}.sets-ui .tile.focused.selected .channel-bottom>.details,.sets-ui .tile.focused.selected .tile-bottom>.details{color:#8d8d8d}.sets-ui #transport-controls .player-controls #button-list div.icon-player-more,.sets-ui #transport-controls .player-controls #button-list div.icon-player-less{color:#fff}.sets-ui #transport-controls .player-controls #button-list div.icon-player-more.focused,.sets-ui #transport-controls .player-controls #button-list div.icon-player-less.focused{color:#222}.sets-ui .settings-title{font-size:1.5em}.sets-ui .action-tile .title{font-size:2.4em;margin-left:.1em;margin-right:.1em}.sets-ui .flag-list.grid{margin:3.25em}.sets-ui .flag-list .list{text-align:left}.sets-ui .flag-list .button{width:14em;text-align:center}.sets-ui .flag-example{top:20%}.sets-ui .flag-video{margin-left:2em;text-align:left}.sets-ui .flag-claim .privacy-invasion{margin:auto;width:50%}.sets-ui .authentication-error-dialog,.sets-ui .delete-video-error,.sets-ui .missing-channel-error,.sets-ui .server-unavailable,.sets-ui .network-error-dialog{margin-top:1em}.sets-ui .eureka-authorization-dialog .icon,.sets-ui .eureka-player-error-dialog .icon{margin-left:3em}.sets-ui .eureka-authorization-dialog .info,.sets-ui .eureka-player-error-dialog .info{width:50%}.sets-ui .debug-dialog{padding:0 1em;text-align:left}.sets-ui .text-dialog #dialog-view{width:auto}.sets-ui #dialog .platform-container{font-size:.6em;margin-bottom:.5em}.sets-ui .paid-channel-dialog{margin:1em}.sets-ui #dialog .connection-instructions .icon-settings-pair{display:none}.sets-ui .closed-captions-dialog{text-align:left;padding-left:1em}.sets-ui .delete-video-error,.sets-ui .paid-scope-dialog,.sets-ui .video-edit-error,.sets-ui .video-processing,.sets-ui .video-upload-error{margin:3em;font-size:1.6em}.limited-animation .auto-play-tile.focused .video-tile{background-color:#f1f1f1}.limited-animation.sets-ui .title-card{background:-o-linear-gradient(top,rgba(0,0,0,0.9),rgba(0,0,0,0.8),transparent);background:-webkit-linear-gradient(top,rgba(0,0,0,0.9),rgba(0,0,0,0.8),transparent);background:linear-gradient(to bottom,rgba(0,0,0,0.9),rgba(0,0,0,0.8),transparent)}.limited-animation.sets-ui #search #text-box-background,.limited-animation.sets-ui #search #search-text-entry{background-color:rgba(0,0,0,0)}.sets-ui .scrolling-text{text-align:left;padding-left:1em;height:20em}.sets-ui #dialog .scrollbar{right:11em}.sets-ui #dialog-view .reset-help{width:20em}.sets-ui #dialog.remote-reset-dialog .buttons{position:inherit}.sets-ui #dialog.remote-reset-dialog .reset-help{height:11em;padding-left:1em;text-align:left}.sets-ui #dialog.remote-reset-dialog .connected-list{margin-right:2em}.sets-ui .dialog-focused #legend{bottom:17%;right:16%}.exp-densityFiveTiles .horizontal-list>.content{font-size:59%}.exp-densityFiveTiles .shelf>.title{font-size:1.5em;margin-bottom:.75em;margin-top:0}.exp-densityFiveTiles .channel-bottom .title,.exp-densityFiveTiles .tile-bottom .title{font-size:1.75em}.exp-densityFiveTiles .tile-bottom .details{font-size:1.5em;height:50%;margin:.2em 1em 0 0}.exp-densityFiveTiles .channel-top .video-thumb{border-radius:50%}.limited-animation .exp-densityFiveTiles .browse-content .list{margin-left:-8em;width:155em}.exp-densityFourTiles .horizontal-list>.content{font-size:67%}.exp-densityFourTiles .shelf>.title{font-size:1.5em;margin-bottom:.75em;margin-top:0}.exp-densityFourTiles .channel-bottom .title,.exp-densityFourTiles .tile-bottom .title{font-size:1.75em}.exp-densityFourTiles .tile-bottom .details{font-size:1.5em;height:50%;margin:.2em 1em 0 0}.limited-animation .exp-densityFourTiles .browse-content .list{margin-left:-8.5em;width:155em}.exp-densityFourTiles .channel-top .video-thumb{border-radius:50%}.exp-densityHideMetadata .shelf .horizontal-list .tile-bottom,.exp-densityHideMetadata .shelf .horizontal-list .channel-bottom{display:none}.exp-densityHideMetadata .shelf.selected .horizontal-list .tile-bottom,.exp-densityHideMetadata .shelf.selected .horizontal-list .channel-bottom{display:block}.exp-densityHideMetadata .horizontal-list .video-tile .tile-top .decoration{display:none}.exp-densityHideMetadata #search .tile-top .decoration,.exp-densityHideMetadata #post-play-list .tile-top .decoration,.exp-densityHideMetadata .shelf.selected .horizontal-list .tile-top .decoration{display:block}.exp-densityHideMetadata .shelf:not(.selected) .channel-tile .video-thumb{height:70%;width:70%}.sets-ui .exp-densityHideMetadata .shelf:not(.selected) .carousel .item:hover,.sets-ui .exp-densityHideMetadata .shelf:not(.selected) .carousel .channel-tile:hover{background-color:inherit!important}.limited-animation .exp-densityHideMetadata .browse-content .list .shelf:nth-child(1){margin-bottom:9.5em}.limited-animation.sets-ui .exp-densityHideMetadata .channel-tile:not(.focused),.limited-animation.sets-ui .exp-densityHideMetadata .video-tile:not(.focused){background-color:inherit}.roku.limited-animation.sets-ui .exp-densityHideMetadata .channel-tile:hover:not(.focused),.roku.limited-animation.sets-ui .exp-densityHideMetadata .video-tile:hover:not(.focused){background-color:inherit}
\ No newline at end of file
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-active.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-active.png
deleted file mode 100644
index 14a8c41..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-active.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-onhover-active.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-onhover-active.png
deleted file mode 100644
index 79b4fbb..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-onhover-active.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-active.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-active.png
deleted file mode 100644
index 1022073..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-active.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-onhover-active.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-onhover-active.png
deleted file mode 100644
index a1cb606..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-onhover-active.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-active.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-active.png
deleted file mode 100644
index 6e017dc..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-active.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-onhover-active.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-onhover-active.png
deleted file mode 100644
index 2efdf75..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-onhover-active.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-gaming-heart.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-gaming-heart.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-gaming-heart.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-mother-goose.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-mother-goose.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-mother-goose.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-promo.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-promo.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-promo.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-rainbow.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-rainbow.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-rainbow.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-sesame.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-sesame.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-sesame.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-talking-tom.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-talking-tom.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-talking-tom.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-wonderquest.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-wonderquest.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-wonderquest.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-loki.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-loki.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-loki.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-multi-user.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-multi-user.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-multi-user.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-tv-queue.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-tv-queue.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-tv-queue.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-yt-mix.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-yt-mix.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-yt-mix.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music-party-logo.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music-party-logo.png
deleted file mode 100644
index bae7f19..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music-party-logo.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music.jpg
deleted file mode 100644
index 4cf9844..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-yt-logo.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-yt-logo.png
deleted file mode 100644
index fdd416d..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-yt-logo.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/cast_disconnected_blue.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/cast_disconnected_blue.png
deleted file mode 100644
index da20b33..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/cast_disconnected_blue.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/circle.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/circle.png
deleted file mode 100644
index 9222c60..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/circle.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/default_bg.jpg b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/default_bg.jpg
deleted file mode 100644
index a55be3c..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/default_bg.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/dial-sprite.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/dial-sprite.png
deleted file mode 100644
index 6c86373..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/dial-sprite.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_dark.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_dark.png
deleted file mode 100644
index fbafd90..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_dark.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_light.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_light.png
deleted file mode 100644
index 1bbade8..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_light.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/flag.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/flag.png
deleted file mode 100644
index 0f17309..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/flag.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-aaa-engaged.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-aaa-engaged.png
deleted file mode 100644
index 35a3db2..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-aaa-engaged.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-feedback.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-feedback.png
deleted file mode 100644
index 426b4b3..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-feedback.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-fullscreen.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-fullscreen.png
deleted file mode 100644
index c708e76..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-fullscreen.png
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang=en>
- <meta charset=utf-8>
- <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
- <title>Error 404 (Not Found)!!1</title>
- <style>
- *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
- </style>
- <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
- <p><b>404.</b> <ins>That’s an error.</ins>
- <p>The requested URL <code>/s/tv/html5/f0d770f4/img/icon-fullscreen.png</code> was not found on this server. <ins>That’s all we know.</ins>
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-help.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-help.png
deleted file mode 100644
index 21839e2..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-help.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-mute.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-mute.png
deleted file mode 100644
index 999078d..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-mute.png
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang=en>
- <meta charset=utf-8>
- <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
- <title>Error 404 (Not Found)!!1</title>
- <style>
- *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
- </style>
- <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
- <p><b>404.</b> <ins>That’s an error.</ins>
- <p>The requested URL <code>/s/tv/html5/f0d770f4/img/icon-mute.png</code> was not found on this server. <ins>That’s all we know.</ins>
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-playbutton.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-playbutton.png
deleted file mode 100644
index 8ac546c..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-playbutton.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-dark.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-dark.png
deleted file mode 100644
index e6f1240..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-dark.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-light.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-light.png
deleted file mode 100644
index b39bd87..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-light.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-dark.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-dark.png
deleted file mode 100644
index 2a16694..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-dark.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-light.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-light.png
deleted file mode 100644
index c7b3d38..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-light.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-dark.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-dark.png
deleted file mode 100644
index 87b0492..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-dark.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-light.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-light.png
deleted file mode 100644
index 42faaa1..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-light.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-dark.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-dark.png
deleted file mode 100644
index 248782d..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-dark.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-light.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-light.png
deleted file mode 100644
index 9f37410..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-light.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-unmute.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-unmute.png
deleted file mode 100644
index 70da26b..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icon-unmute.png
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang=en>
- <meta charset=utf-8>
- <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
- <title>Error 404 (Not Found)!!1</title>
- <style>
- *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
- </style>
- <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
- <p><b>404.</b> <ins>That’s an error.</ins>
- <p>The requested URL <code>/s/tv/html5/f0d770f4/img/icon-unmute.png</code> was not found on this server. <ins>That’s all we know.</ins>
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icons.ttf b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icons.ttf
deleted file mode 100644
index 929a78f..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/icons.ttf
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-bbb.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-bbb.png
deleted file mode 100644
index ea9e5b8..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-bbb.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ccc.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ccc.png
deleted file mode 100644
index 7727e8c..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ccc.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ddd.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ddd.png
deleted file mode 100644
index f6b0382..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ddd.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-desktop.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-desktop.png
deleted file mode 100644
index 99979f0..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-desktop.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-eee.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-eee.png
deleted file mode 100644
index 1d2930b..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-eee.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-fff.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-fff.png
deleted file mode 100644
index 056ccf9..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-fff.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ggg.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ggg.png
deleted file mode 100644
index 8d846cb..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ggg.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/motion-control-sprite.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/motion-control-sprite.png
deleted file mode 100644
index 0ecee6d..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/motion-control-sprite.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/pair_promo.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/pair_promo.png
deleted file mode 100644
index 7bbb8ba..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/pair_promo.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/pairing-promo-combo.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/pairing-promo-combo.png
deleted file mode 100644
index 7442d55..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/pairing-promo-combo.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/player-pause.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/player-pause.png
deleted file mode 100644
index afab54d..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/player-pause.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/player-play.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/player-play.png
deleted file mode 100644
index bdd2471..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/player-play.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_dark.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_dark.png
deleted file mode 100644
index 495f00f..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_dark.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_light.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_light.png
deleted file mode 100644
index 049ef34..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_light.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_0_pressed.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_0_pressed.png
deleted file mode 100644
index 7abd5c6..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_0_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_1_pressed.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_1_pressed.png
deleted file mode 100644
index d283c5a..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_1_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_2_pressed.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_2_pressed.png
deleted file mode 100644
index 8eb2ac0..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_2_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_mute_pressed.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_mute_pressed.png
deleted file mode 100644
index b867b7f..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/volume_mute_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-kids-logo.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-kids-logo.png
deleted file mode 100644
index 2de9041..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-kids-logo.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-logo-fullcolor.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-logo-fullcolor.png
deleted file mode 100644
index 1fa0d1a..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-logo-fullcolor.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo-small.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo-small.png
deleted file mode 100644
index e73e0fc..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo-small.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo.png b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo.png
deleted file mode 100644
index 8e60577..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/misc/fonts/Roboto-Regular-20140804.ttf b/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/misc/fonts/Roboto-Regular-20140804.ttf
deleted file mode 100644
index 0e58508..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/www.youtube.com/s/tv/html5/misc/fonts/Roboto-Regular-20140804.ttf
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3-initial-layout.html b/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3-initial-layout.html
deleted file mode 100644
index 5d33c44..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/youtube-2015-q3-initial-layout.html
+++ /dev/null
@@ -1,1751 +0,0 @@
-<html xmlns:yt="http://youtube.com"><head><meta charset="utf-8">
-
-
- <title>YouTube TV</title>
-
- <style>#loader { height: 100%; left: 0px; position: absolute; top: 0px; width: 100%; z-index: 0; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmwAAAEsCAYAAAB+Je/UAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAABVsSURBVFjD7dntcavAGYDRWwIlUIJKoARKoASVQAcqgRIogRJUAiVQArETPKN4LFsfC7sL5505kx9JrvXF7sPyb57nfwAApMuHAAAg2AAAEGwAAIINAADBBgCAYAMAEGwAAAg2AADBBgCAYAMAQLABAAg2AAAEGwAAgg0AQLABACDYAAAEGwAAgg0AAMEGACDYAAAQbAAAgg0AAMEGAIBgAwAQbAAACDYAAAQbAIBgAwBAsAEACDYAAAQbAACCDQBAsAEAINgAAAQbAACCDQAAwQYAINgAABBsAAAINgAAwQYAgGADABBsAAAINgAABBsAgGADAECwAQAINgAABBsAAIINAECwAQAg2AAAEGwAAIINAADBBgAg2AB4Qfmh+kX9oX3A5cPwgmne70wvfibtg+o/vrvS7xvBBrCd0w+b8U8beHcnAMbZmP+f8c5vpbvz2/r++zu5LhFswF59bXbNt83w+6ZpTI7z20lhLfQEG0BKipsTsF6AGfNr4PU3J3iF9UOwAaz9yPLy4WoPNuatuS7XkpM4wQYQRLmcDIz2WGNWmXG5xpy8CTaAl0Kts5cas+l0y7VnDRJsAL8qhJox0efixE2wAdxz/jDZK41JYj6vxdq6JNgAbk/VBvujMUlO77RNsAGcnKoZk/yMy7VqzRJswAE19kFjsnpE2li3BBsg1owx6Y9oE2yAWDPGiDYEGyDWjDGiTbAB3FXZ44zZ1Zysa4IN2Jfiw2R/M2ZXMy7XtjVOsAE70dvbjNnl9NY3wQbsQ21PM2bXU1nnBBuQv9F+ZszuH41a6wQbkLHGXmbMIaax3gk2wOmaMcYpG4INcLpmjHHKJtiA47nav4w51AzWPcEG5KWydxlzyCmtf4INyEdn3zLmkHOx/gk2IB+TfcuYQ85k/RNsQB5qe5Yxh57aOijYAI9DjTFpT2cdFGyAx6HGmLTHY1HBlrUhoC2Om9uAr9f373GoMeZYc7IeCrZcXTM7bg51SnL13R/KJdDvpt258WCPx3xWx5vWeijYcnUOeCGMK7/WU8DXevbduzF5YY5w4n6UqXxWhxxPVwRbtsrAF0OZSVw6Fj+OIuDvRrAJNsGW/1gXBZvHoiufXPWZnASSltpCL0IEmwn43SPYdvFYtF/xdU6BXuPFd34oF8EmQgSbuZnWuijYPBb9X1St8RpPAV9j7Ts/lJAbq89KsAm2/GewLgo2C/V6x81t4kFJukKOdUCwCbb8xz4g2LLWJH7cHGpx7HzXh3IKvNALNsEm2PYxpfVRsOWqCHghXBM+JWl814dSCzYRItjMRk+CEGyb6QNeDEXA11Ul+rpIXyvYRIhgMxs9CUKwZflYtE5w0x18x4fTCTYRItiMYBNsHoven0uCm8jZd3w4oTdVn5dgE2z7GDfwgs1j0WXGBCOy9P0ezlWwiRDBZgSbYPNYdP1AqhMLSPISegSbYBNs+5jJ+ijY9mAKdEE0AV7LJcFHtAg2wSbYBFv+Y40UbNnrAl0MfUKPtCrf6+FUFngRItjML1NYJwVb7kI9hnz3yLlw9I1gE2yCzST6G0Cw7eqx6CmBcOx8n248As0QUMjICmWyWQs2vwEE2zEfi7ZvvIZLoNdQ+z4PqU18swj1Po1gM6/N2Top2JxO/P+JxKuvYQz0Ggrfp2ATbEawmYAHCgi2pIQKplf+dhnob/e+R6fEgs0INiPYBNuexXwk2TjyZucbqmATbCbuDNZJwbYXp0AXxSXi6UjpexRsgs0INiPYBJvHon/PNaO/y35Mgs0INiPYBJvHouuddJURT/bYj9RHsAk2s5/rEMG2m8eizRN/swn0N0++P8Em2IxgM4JNsHks+vh0T/y9PsDfm3xvh1YeaKMwgs0INsHGf7UbB9S0cSCyP5VgM4LNeBIj2JxWrHdhhHoEW/veBJtgM4LNrPw7QLAl5xrgwjg/8HfOgS7CYsXPolgu8nYx/KBf/rvGgiDYBJtgM4JNsLGVECHVP/B3+o3+zrM+T/4uH8Y3X1ezckx+19wJyme8+sjgEuBvv/q+W8FmEgu26eZGrvqmWa6Xawaf27C81p/ex5fzzc3sJNgEG3k+Fv3r74S4uJsVgifkfL7HbvlM1/7e2ogL2rDB70WwhZnul833Ed2bv693pB5sn/+7+smbwy6h3+m0BNo7n1eIG961prW/CzaPRZ9fJEM9xgoRQqeNHnm0K5+4CTbBtsWm1Ub8HFINtuHNv1FFPp0aA9/8fqnntB4nCzbB5rHonbmsvMleE4mcZxfG0yzYBJtg20OwTctaGeK7LebtH5NOK4XaT08vUnhcKtgEm8eiLwTVEPni+1wc+4iPHdZYJI8abP2c/gi2/QXbdYWbr2LDsOlXPvFPac0VbILNY9EHplhx4znN+dzJ/jSho+2owZbSIxfBdoxgG1aMnWrn4RLzRLy3rws2j0Wfi5IQC9KYeaytEW2CTbAJtvWDrdtg7e0yulF89RFpjBns64LNY9H7060UFl2CC2GszUSwCTbBtk2wdRutvWs9Gk0h1mJGm2ATbB6LPnkSFuKEq450YrjGTIEerwg2wSbY1gu264qPQbe4uWzn9PaXi2ATbKT1WLT8ducYYwM8Jb6hh1hIjhps05z+CLa8g+2ycayFXrP6HR8KCDbBRsDHouebf6+OtPjkcApTz4ItVsQINsGWojGhE/w195itbrpGe7pg81j08cAKcQTePPn6q0w29XEWbIJNsAm2sI9FmwzeZ5vhtYhg2+Vj0Snw8fezd4vDnM/Us2ATbIJNsP1Pc5ATpWLDUzZ7umDzWPSBBbMI8O9cn3ztpzmv6WfBJtgEm2AL83TgnNF7vWR2LSLYdvtYtF1Oj+aNF6DQi0C3vIZqeT9toFPD2ykFm2ATbFkE22n5t9vlP8sV/saWTyP+OgWrllO/5uYmPKWDAcEm2AjwWPS6xM67c3rydY8BT75+W5zqgEf6jWATbIIt2WArls/g3toyBA636Y01K1SUDn/cxIZ6v9eMrkUE264fi44B/v8x7tj6Jxa2acO/J9gEm2DbNtjqB9ex6YWby9DXVhPgbzcPrmmh3u85o2sRwbbrx6LvzuWFxebdmZ489j8H+puC7TGVYBNsGwXbs+/7GjnY3j31Kp+8AX12rbx30yvYBBsBXCJvevWTrzfEI9jzC59TiMewp1mwCTbBlkqwvbr2NZHW3XGOE4pdIr9xwSbYDu8UccN75dQpxIlgMccJ23oWbIJNsKUSbK/+vocIJ3uf00dc64tIn7VgE2yscHo0b7QAvTvDHC9s21mwCTbBlnuwhQiYNsJ3/M5NZzOn/STHPi7YDqOLtOE9uwiUkTe2GIEq2ASbYEsv2KoIn3fM9/vuY9GzYBNshFFH2vCevUsNsZHXc7xj/WEWbIJNsO0h2NoIa24V8Xd2ffNvV5lciwi2LGw9wxwnLKs5XrCNgk2wCTbB9uJv/J2/V0b+vQs2wUZA/cab3TlSvJRvfEaXCAuLYBNsgi29YBvmvIKtSuD3LtgEG4GcN97syjlOvMTa1ASbYBNsgi3nYKtmwSbYSEK54UY3zvkEk2ATbIJNsMUOthiBKNgEGwkbN9roLgcOtkKwCTbBJtgOGGxjBtcigi0bl402umo+brBVs2ATbIJNsB0v2IYMrkUEWzbqDTa5KbNHkoJNsAk2wSbYBJtgIzlrTyfYBJtgE2yCTbAJNsFGuhfV5zSCTbAJNsEm2ASbYBNsxI+S36YQbIJNsAk2wSbYBJtgI/6FfW/6BIJJsAk2wSbYBJtgQ7DtwlpzFmyCTbAJNsEm2ASbYCOMtS6sUrAJNsEm2ATb5sF2Wv6Nd5wEm2AjPe0KF9Q1kdcl2ASbYBNsRwu2PR8ECDbBdmhrbJgXwSbYBJtgE2yCTbAJNsIpVrigTrNgE2yCTbAJNsEm2AQbQV0DXkxTQo9qBZtgE2yCTbAJNgTbbnQBL6ZOsAk2wSbYBJtgE2yCjfDOAS+mWrAJNsEm2ASbYBNsgo3wQm6a1SzYBJtgE2yCTbAJNsGGYBNsgk2wCTbBJtgQbIJNsAk2wSbYBJtgE2yCDcEm2ASbYBNsgk2wCTbBhmATbIJNsAk2wSbYEGyCTbAJNsEm2ASbYBNsgg3BJtgEm2ATbIJNsAk2wYZgE2wRg+3fnMcINsGWS7DlchMk2AQbgk2wCTbBJtgEm2BDsAk2wSbYBJtgE2yCTbAJNgSbYBNsgk2wCTbBJtgEG4JNsAk2wSbYBJtgE2w+BMEm2ASbYBNsgk2wCTbBhmATbIJNsAk2wXaUYLvarwWbYBNsgi3e5z0JNsEm2ATbBp8Ngk2wCTbBFmkzFWyCTbAJNgSbYBNsgk2wCTbBJtgEm2BDsAk2wSbYBJtgE2yCTbAh2ASbYBNsgk2wbRhFa13Tvf1asAk2wSbY4n3evWATbIJNsG3w20ewCTbBJtgif9aCTbAJNsGGYBNsgk2wCTbBJtgEm2ATbAi2PQZbIdgEm2ATbIJNsAk2BFvawZbDqV4KwXYWbIJNsAm2DfcXBJtgE2yCLfLvT7AJttyDbdpBsF0Fm2BDsD0zpzf+fifYBJtgE2yRTrxyD7a1RrAJNsGW4AVVRX4t7wbMKNgEm2DbRbBdMgu2046DrbRfCzbBts9gayIe6Q+zYHtUIdgEW8LB1kZYy6qIv7M+4WCzXws2wZZgsJUBXssl4oLTZRRsVQKLqWBLP9gu8zGDrY7web/7fq8Rf1+CTbBxsGALcdFfX/y7daRNNUawfZ5uTYJNsD1wLRUHDbYywuf97nd8ifRkYs3rebJXCzbSDbYQj+leWWy7AH+3ntMPtiLAo99QUTMKtmSDbQoQLbkG2xjgPb9yXfcR1/R3v+vTStfgYK8WbKQbbCHC6dnHOKFOnMo5TrDVG3++oaJmmNOePQXb+clYOyXw/t9dV/qIjwdfua5DhOIrN0Ehoqhe6RoUbIKNhIOtCfSantlwLgH+3rThwv5KoBZvbGCCLf9gOz3xOz4FXmtirSvFCzcoU6DHwK/+tssI63qI9btd6RrsZ3u1YCPZYCsDvabrgwtvE3lhCbHQjQ9s1teVFtTYp6mCLdzpy3WFWPuXwLryzDVWB/qbrwZbs/FNbxP5/W7xu0ewCbaVgu3VY/17IVP/cvd9CfgZNHPcO9PuzntsAz3uXSNq2jnt2VuwVXd+C9PKG2MqN4LdHydrdQJrWKgTpfqP1zAFjLVixWtQsAk2Eg+2S+CLflwWwnb5t9e4GywS+B7G5f21Gz5uFGzbBNsQMFzaG02gR4CpB9vt+282+AxirCX31pf2mzrwe21WvAbP9mrBRtrBVs55TZ/I95Bb1NSCbfNgiyGlYNvCu+tXbpFyXfEarGZ7tWAj6WD7t+EJUez3f+Rgq3b83gTbcYPt3RuR8aD7iGATbGQabLmEzPXN91kcONhOgu3hmQRbNtoA33eTyXtd+8a6mO3Vgo3kgy2XU7YqkQ0916gRbNu/nmd0gi3KujVlECtNRtcggk2wrbywlsvCler0gd7nNcJr7wJtLIJtu/e4dcBcIn/H777fNsK6WgS+RlPdP4oN1uacT5UFG4cLtq3u4l6ZMeAdcLfxax8CngTkGKu5Bts50ulJrsE2RIiec+DfYKqPRocN1ykEm2DL6M6/S2wj/7zzOyW8yP8215vQTCHYhjndSS3YtoqPJpFT1CrQb2vLaBtX+B2m9mh4q/VYsAk2Mgy21KIt9F1vueFj0CJwLO0txlMOtinSdZZ7sG0VbWs9DQh9g5jLzWU726cFG1kGWyqb+1qPKNZ+NNitdLr17vtuBVsSv7/il+trD8G2drQVS1iteapfH+RkTbAJNnYQbDGjbVr5fdYrvvbzio8jU37fewy2cYXfXvnHDcNegu2nU+ZQ+h1HTLHh+0v5UbBgQ7C9+Ohh2nDhuC6b2trvq19hcz89uaFtHTUnwRbktPSdR1zTyp9DSsH2dT2HfMS49U3ksNF69LVPjJGuv3K2Tws2sg+2r1OBte/6pl9Op9a6kw31aPTywElCCsH2b053/iX8/s4Brp9ho88htWC7Pa0q3rxeu4i/z27FqNliff1r7bVPCzZ2Emy372ONk6l3F/N3NoF3QuqZu+9Ugm2Y05yUg21efvfPbtinFyJjr8H2da03L1zrMU+efgq3OuDTixSux94eLdj4/zuoNpAykfdzfmOxGQMvfCEWzkdP26blRK184W+8+92HeK/tbEJs2MUvcdEGPL3d40w3n2P5y+d4TijUfnoP/fJdVw+sB+XNb6NP7L2EWlsQbGRygngbJN0Sc8O34HhkYYsdol/v47K8/q9F+bycmOT+XdV6IfgJ8eBj8DnezHV5L7lEe8ynNoIN4JfHwMYY8zXWRcEGJMrjOmPMvJwEWhMFG5Coi33KGPMxZ+uhYAPSVdmnjDEfc7IeCjYgbZO9yphDz2gdFGxA+jr7lTGHnot1ULAB6avtV8YcejwOFWxAJjwWNeaYM1r/BBvgsagxJu3xOFSwARk52beMOeSU1j/BBuRlsHcZc6gZrHuCDchPY/8y5lBTWfcEG5Cn0R5mzCFmtN4JNsApmzEm7Wmsd4INcMpmjEl3BuucYAPyV9nPjNn1VNY5wQbsQ29PM2aXc7G+CTZgPwqPRo3Z3VyXa9saJ9iAHTnZ34zZzUzLNW1tE2zADjX2OWN2MbX1TLABos0Yk+401jHBBog2Y4xYQ7ABiag+TPY/Y7KYz2v1ZN0SbMAxlR+u9kJjkp7rcq1aswQbcHCtPdGYJOfyobBGCTaA29O2wf5oTBIzfqisS4IN4J5KuBkTbablxNupmmADeDjcOvunMUINwQak73MDaT709lRjgs91ub6EmmADCBpv9YeLx6bGvDyfNz/nD6U1RbABbOW0RFy7PEL9DLnRnmzMf0/PhuUGp1muFWuGYANI8kSuWk4T2puTuS+TPd1kMtO3326//Ka/NMtvvXLdCzaAvStvNr0vzbeN8Uv/bQMVguZrxju/i/7Ob6n+4XdXuB4RbADpheFPznc2+HuGF007iqLf9E98ln99N4IKwQYAgGADABBsAAAINgAAwQYAgGADAECwAQAINgAABBsAAIINAECwAQAg2AAABBsAAIINAADBBgAg2AAAEGwAAIINAADBBgCAYAMAEGwAAAg2AAAEGwCAYAMAQLABAAg2AAAEGwAAgg0AQLABACDYAAAEmw8BAECwAQAg2AAABBsAAIINAADBBgAg2AAAEGwAAIINAADBBgCAYAMAEGwAAAg2AAB8CAAAgg0AAMEGACDYAAAQbAAACDYAAMEGAIBgAwAQbAAACDYAAAQbAIBgAwBAsAEA8OE/SZR9m3dtGpgAAAAASUVORK5CYII=); background-color: rgb(230, 45, 39); background-size: 60%; background-position: 50% 50%; background-repeat: no-repeat; }</style><style>.icon-cast_off::before { content: ""; }
-.icon-cast_on::before { content: ""; }
-.icon-mr_meh_android::before { content: ""; }
-.icon-settings-signin-android::before { content: ""; }
-.icon-settings-signout-android::before { content: ""; }
-.icon-rockandroll-back::before { content: ""; }
-.icon-hats-happy::before { content: ""; }
-.icon-hats-neutral::before { content: ""; }
-.icon-hats-sad::before { content: ""; }
-.icon-hats-very-happy::before { content: ""; }
-.icon-hats-very-sad::before { content: ""; }
-.icon-search-keyboard::before { content: ""; }
-.icon-multiaudio::before { content: ""; }
-.icon-settings-check::before { content: ""; }
-.icon-settings-uncheck::before { content: ""; }
-.icon-popular::before { content: ""; }
-.icon-airplane::before { content: ""; }
-.icon-back::before { content: ""; }
-.icon-check::before { content: ""; }
-.icon-chevron-single::before { content: ""; }
-.icon-delete::before { content: ""; }
-.icon-desktop-arrowkeys::before { content: ""; }
-.icon-desktop-delete::before { content: ""; }
-.icon-desktop-esc::before { content: ""; }
-.icon-desktop-g::before { content: ""; }
-.icon-desktop-s::before { content: ""; }
-.icon-dislike::before { content: ""; }
-.icon-double-chevron-right::before { content: ""; }
-.icon-edit::before { content: ""; }
-.icon-education::before { content: ""; }
-.icon-ellipsis::before { content: ""; }
-.icon-entertainment::before { content: ""; }
-.icon-exit::before { content: ""; }
-.icon-film::before { content: ""; }
-.icon-flag::before { content: ""; }
-.icon-gaming::before { content: ""; }
-.icon-guide-history::before { content: ""; }
-.icon-guide-my-subs::before { content: ""; }
-.icon-guide-purchases::before { content: ""; }
-.icon-guide-social::before { content: ""; }
-.icon-guide-what-to-watch::before { content: ""; }
-.icon-home::before { content: ""; }
-.icon-hourglass::before { content: ""; }
-.icon-key-delete::before { content: ""; }
-.icon-key-globe::before { content: ""; }
-.icon-key-space-sm::before { content: ""; }
-.icon-key-space::before { content: ""; }
-.icon-like::before { content: ""; }
-.icon-lips::before { content: ""; }
-.icon-logo-lozenge::before { content: ""; }
-.icon-lol::before { content: ""; }
-.icon-lozenge::before { content: ""; }
-.icon-mix::before { content: ""; }
-.icon-music::before { content: ""; }
-.icon-news::before { content: ""; }
-.icon-people::before { content: ""; }
-.icon-pets::before { content: ""; }
-.icon-player-3d::before { content: ""; }
-.icon-player-annotations::before { content: ""; }
-.icon-player-closedcaptions::before { content: ""; }
-.icon-player-ff::before { content: ""; }
-.icon-player-HD-circle::before { content: ""; }
-.icon-player-HD::before { content: ""; }
-.icon-player-info::before { content: ""; }
-.icon-player-instantreplay::before { content: ""; }
-.icon-player-less::before { content: ""; }
-.icon-player-more::before { content: ""; }
-.icon-player-mute::before { content: ""; }
-.icon-player-next::before { content: ""; }
-.icon-player-pause::before { content: ""; }
-.icon-player-play::before { content: ""; }
-.icon-player-prev::before { content: ""; }
-.icon-player-replay::before { content: ""; }
-.icon-player-rew::before { content: ""; }
-.icon-player-settings::before { content: ""; }
-.icon-player-share::before { content: ""; }
-.icon-player-size-fullscreen::before { content: ""; }
-.icon-player-size-medium::before { content: ""; }
-.icon-player-size-minimize::before { content: ""; }
-.icon-player-stop::before { content: ""; }
-.icon-player-subtitles::before { content: ""; }
-.icon-player-volume-45::before { content: ""; }
-.icon-player-volume-48::before { content: ""; }
-.icon-playlist::before { content: ""; }
-.icon-playstation-circle::before { content: ""; }
-.icon-playstation-square::before { content: ""; }
-.icon-playstation-triangle::before { content: ""; }
-.icon-playstation-x::before { content: ""; }
-.icon-privacy-link::before { content: ""; }
-.icon-privacy-locked::before { content: ""; }
-.icon-privacy-public::before { content: ""; }
-.icon-related::before { content: ""; }
-.icon-remoteque::before { content: ""; }
-.icon-reward::before { content: ""; }
-.icon-rocket::before { content: ""; }
-.icon-search-clear::before { content: ""; }
-.icon-search::before { content: ""; }
-.icon-settings-clear-cookies::before { content: ""; }
-.icon-settings-clear-history::before { content: ""; }
-.icon-settings-feedback::before { content: ""; }
-.icon-settings-help::before { content: ""; }
-.icon-settings-pair::before { content: ""; }
-.icon-settings-phone::before { content: ""; }
-.icon-settings-term::before { content: ""; }
-.icon-speechbubble::before { content: ""; }
-.icon-sports::before { content: ""; }
-.icon-star::before { content: ""; }
-.icon-trash::before { content: ""; }
-.icon-trends::before { content: ""; }
-.icon-tv-dpad::before { content: ""; }
-.icon-upload-arrow::before { content: ""; }
-.icon-upload::before { content: ""; }
-.icon-watch-later::before { content: ""; }
-.icon-wii-1::before { content: ""; }
-.icon-wii-2::before { content: ""; }
-.icon-wii-A::before { content: ""; }
-.icon-wii-B::before { content: ""; }
-.icon-wii-minus::before { content: ""; }
-.icon-wii-plus::before { content: ""; }
-.icon-wii-x::before { content: ""; }
-.icon-wii-y::before { content: ""; }
-.icon-youtube-logo::before { content: ""; }
-.icon-youtube-unlimited-logo::before { content: ""; }
-@font-face { font-family: 'Cutive Mono'; src: url(www.youtube.com/s/tv/fonts/CutiveMono-Regular.woff) format(woff); }
-@font-face { font-family: 'PT Mono'; src: url(www.youtube.com/s/tv/fonts/PTM55FT.woff) format(woff); }
-@font-face { font-family: 'PT Serif Caption'; src: url(www.youtube.com/s/tv/fonts/PT_Serif-Caption-Web-Regular.woff) format(woff); }
-@font-face { font-family: 'PT Sans Caption'; src: url(www.youtube.com/s/tv/fonts/PT_Sans-Caption-Web-Regular.woff) format(woff); }
-@font-face { font-family: Handlee; src: url(www.youtube.com/s/tv/fonts/Handlee-Regular.woff) format(woff); }
-@font-face { font-family: 'Dancing Script'; src: url(www.youtube.com/s/tv/fonts/DancingScript-Regular.woff) format(woff); }
-@font-face { font-family: 'Marcellus SC'; src: url(www.youtube.com/s/tv/fonts/MarcellusSC-Regular.woff) format(woff); }
-body, html { font-size: 100%; height: 100%; margin: auto; overflow: hidden; padding: 0px; -webkit-user-select: none; }
-input { font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; margin: 0px; padding: 0px; }
-body { background-color: rgb(28, 26, 26); }
-p, ul, li { border: 0px; margin: 0px; outline: none; padding: 0px; }
-ul { list-style: none; }
-.focused, :focus { outline: solid 0px; }
-.hidden { display: none !important; }
-.invisible { visibility: hidden; }
-ul.list li { display: inline; }
-ul.list.vertical li { display: block; }
-.device-plugin { height: 0px; margin: 0px; position: absolute; visibility: hidden; width: 0px; }
-#loader { }
-#leanback { height: 100%; }
-#app-markup { height: 100%; background-size: 100% 100%; }
-#background { bottom: 0px; left: 0px; position: absolute; overflow: hidden; right: 0px; top: 0px; background-size: 100% 100%; }
-.limited-memory.sets-ui #app-markup { background-color: rgb(40, 51, 55); }
-#app-markup.watch-state { background-color: rgb(0, 0, 0) !important; }
-.veryvibrant #app-markup.watch-state { background-image: none !important; }
-#playstation-buttons { display: none; position: absolute; }
-#spinner { position: absolute; top: 17.17em; width: 100%; }
-.browse-state .loading-indicator { display: none; }
-.browse-state .fallback-loading-indicator { display: block; }
-.opera #spinner { top: 20em; }
-.loading-indicator { height: 5.33em; margin: 0px auto; position: relative; width: 5.33em; }
-.dot { border-radius: 50%; height: 1.17em; position: absolute; width: 1.17em; background-color: rgb(203, 203, 203); }
-@-webkit-keyframes fade1 {
- 0%,100% { opacity: 0; }
- 50% { opacity: 1; }
-}
-@-webkit-keyframes fade2 {
- 0%,100% { opacity: 0.25; }
- 37.5% { opacity: 1; }
- 87.5% { opacity: 0; }
-}
-@-webkit-keyframes fade3 {
- 0%,100% { opacity: 0.5; }
- 25% { opacity: 1; }
- 75% { opacity: 0; }
-}
-@-webkit-keyframes fade4 {
- 0%,100% { opacity: 0.75; }
- 12.5% { opacity: 1; }
- 62.5% { opacity: 0; }
-}
-@-webkit-keyframes fade5 {
- 0%,100% { opacity: 1; }
- 50% { opacity: 0; }
-}
-@-webkit-keyframes fade6 {
- 0%,100% { opacity: 0.75; }
- 37.5% { opacity: 0; }
- 87.5% { opacity: 1; }
-}
-@-webkit-keyframes fade7 {
- 0%,100% { opacity: 0.5; }
- 25% { opacity: 0; }
- 75% { opacity: 1; }
-}
-@-webkit-keyframes fade8 {
- 0%,100% { opacity: 0.25; }
- 12.5% { opacity: 0; }
- 62.5% { opacity: 1; }
-}
-@keyframes fade1 {
- 0%,100% { opacity: 0; }
- 50% { opacity: 1; }
-}
-@keyframes fade2 {
- 0%,100% { opacity: 0.25; }
- 37.5% { opacity: 1; }
- 87.5% { opacity: 0; }
-}
-@keyframes fade3 {
- 0%,100% { opacity: 0.5; }
- 25% { opacity: 1; }
- 75% { opacity: 0; }
-}
-@keyframes fade4 {
- 0%,100% { opacity: 0.75; }
- 12.5% { opacity: 1; }
- 62.5% { opacity: 0; }
-}
-@keyframes fade5 {
- 0%,100% { opacity: 1; }
- 50% { opacity: 0; }
-}
-@keyframes fade6 {
- 0%,100% { opacity: 0.75; }
- 37.5% { opacity: 0; }
- 87.5% { opacity: 1; }
-}
-@keyframes fade7 {
- 0%,100% { opacity: 0.5; }
- 25% { opacity: 0; }
- 75% { opacity: 1; }
-}
-@keyframes fade8 {
- 0%,100% { opacity: 0.25; }
- 12.5% { opacity: 0; }
- 62.5% { opacity: 1; }
-}
-#dot1 { animation: fade8 0.72s ease infinite; left: 0px; top: 2.09em; }
-#dot2 { animation: fade7 0.72s ease infinite; left: 0.61em; top: 0.61em; }
-#dot3 { animation: fade6 0.72s ease infinite; left: 2.09em; top: 0px; }
-#dot4 { animation: fade5 0.72s ease infinite; right: 0.61em; top: 0.61em; }
-#dot5 { animation: fade4 0.72s ease infinite; right: 0px; top: 2.09em; }
-#dot6 { animation: fade3 0.72s ease infinite; bottom: 0.61em; right: 0.61em; }
-#dot7 { animation: fade2 0.72s ease infinite; bottom: 0px; left: 2.09em; }
-#dot8 { animation: fade1 0.72s ease infinite; bottom: 0.61em; left: 0.61em; }
-.spinner.transitions .dot { animation: initial !important; background: url(www.youtube.com/s/tv/html5/f0d770f4/img/circle.png) 50% 50% / 100% no-repeat; }
-.spinner.transitions.spin .loading-indicator { transition: transform 25s linear; transform: rotate(-7200deg); }
-.transitions #dot1 { opacity: 1; }
-.transitions #dot2 { opacity: 0.875; }
-.transitions #dot3 { opacity: 0.75; }
-.transitions #dot4 { opacity: 0.625; }
-.transitions #dot5 { opacity: 0.5; }
-.transitions #dot6 { opacity: 0.375; }
-.transitions #dot7 { opacity: 0.25; }
-.transitions #dot8 { opacity: 0.125; }
-.fallback-loading-indicator { color: rgb(241, 241, 241); display: none; font-size: 1.8em; margin: 2px auto 0px; text-align: center; }
-.scrollbar { height: 100%; position: absolute; top: 0px; width: 0.1em; background-color: rgba(255, 255, 255, 0.0980392); }
-.scrollbar .handle { position: absolute; width: 0.1em; background-color: rgb(241, 241, 241); }
-.application-message { color: rgb(241, 241, 241); font-size: 1.8em; position: absolute; text-align: center; text-shadow: rgb(0, 0, 0) 0.04em 0.04em; top: 50%; width: 100%; }
-.debug-watermark { color: rgb(14, 2, 2); display: none; font-size: 100%; left: 0px; padding: 1em; position: absolute; bottom: 0px; width: 70%; background-color: rgba(235, 49, 3, 0.701961); }
-.debug-watermark.visible { display: block; }
-.debug-console { color: rgb(255, 255, 255); height: 95%; overflow: scroll; padding: 1em; position: absolute; right: 0px; top: 0px; width: 40em; z-index: 1; background: rgba(0, 0, 0, 0.901961); }
-#player-controls .button, #player-controls .toggle-button { font-family: youtube-icons; speak: none; }
-.fps { position: absolute; right: 0px; bottom: 0px; text-align: center; padding-top: 0.3em; width: 5em; height: 1.7em; z-index: 100; background-color: rgb(0, 255, 0); }
-#html5-player-messages { display: none; }
-#button-list > .icon-player-more::before { content: ""; }
-.icon-player-play.toggle-selected::before { content: ""; }
-#loader { z-index: 1000; }
-.sliding-highlighter, .pivot-sliding-highlighter { box-shadow: rgba(153, 153, 153, 0.298039) 0px 0px 60px; display: none; height: 26em; position: absolute; width: 24em; background: white; }
-#settings-items .sliding-highlighter { height: 26.2em; width: 24.2em; }
-.horizontal-list.focused .sliding-highlighter, .video-uploads.focused .sliding-highlighter, #settings-items.focused .sliding-highlighter { display: block; }
-.video-uploads .sliding-highlighter { height: 20em; width: 18em; }
-.carousel .item:hover { cursor: pointer; background-color: rgb(90, 90, 90); }
-.feed-title.preview { color: rgb(241, 241, 241); font-size: 1.3em; height: 1.3em; opacity: 0.7; padding-bottom: 0.6em; padding-left: 1.9em; }
-.feed-title .unread-count { font-size: 0.6em; margin-left: 0.5em; padding: 0.05em 0.3em; position: relative; top: -0.265em; background-color: rgba(187, 0, 0, 0.901961); }
-.prev-feed { height: 3.6em; left: 4%; position: absolute; top: 5%; }
-.next-feed { height: 2em; left: 4%; position: absolute; top: 84%; }
-.tile { color: rgb(102, 102, 102); height: 26em; list-style: none; overflow: hidden; position: absolute; width: 24em; background-color: rgb(0, 0, 0); }
-.tile-focus-target { height: 0px; width: 0px; }
-.tile-top { height: 50%; width: 100%; background-color: rgb(0, 0, 0); }
-.channel-top { height: 62%; margin: 5.25% 16%; width: 68%; }
-.channel-top .video-thumb, .tile-top .video-thumb { height: 100%; background-color: rgb(37, 37, 37); background-size: 100%; background-position: 50% 50%; background-repeat: no-repeat; }
-.browse-header-avatar.preloaded, .tile-top .video-thumb.preloaded { background: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-playbutton.png) 50% 50% / auto no-repeat rgb(37, 37, 37); }
-.auto-play-tile { overflow: visible; }
-.post-play-title { font-size: 1.4em; overflow: hidden; position: absolute; text-overflow: ellipsis; text-shadow: rgb(0, 0, 0) 0.08em 0.08em; top: -1.8em; width: 15.5em; }
-.auto-play-tile .video-tile { top: 0px; }
-.auto-play-tile .default-title, .auto-play-tile .next-up-title { color: rgb(204, 204, 204); }
-.post-play-countdown { display: none; }
-.countdown-active .post-play-countdown { color: rgb(255, 255, 255); display: block; font-size: 5em; position: relative; text-align: center; text-shadow: rgb(0, 0, 0) 0.06em 0.06em; top: 14%; }
-.playlist-tile.focused, .playlist-tile.focused:hover, .auto-play-tile.focused .video-tile, .auto-play-tile.focused:hover .video-tile, .recent-search-tile.focused, .recent-search-tile.focused:hover, .video-tile.focused, .video-tile.focused:hover { background-color: rgb(241, 241, 241); }
-.item .overlay { display: none; }
-.playlist-tile .overlay, .video-tile .overlay { display: block; height: 53%; margin-left: 56%; margin-top: -57.5%; opacity: 0.8; width: 45%; background: rgb(0, 0, 0); }
-.playlist-tile.focused .overlay, .video-tile.focused .overlay { color: rgb(241, 241, 241); }
-.playlist-tile .overlay strong { font-size: 1.75em; font-weight: normal; }
-.playlist-tile .overlay .count, .video-tile .overlay .count { font-size: 1.5em; line-height: 1.2em; padding-top: 1.7em; text-align: center; }
-.playlist-tile .overlay .icon, .video-tile .overlay .icon { font-family: youtube-icons; font-size: 3em; height: 50%; overflow: hidden; padding: 0.2em; text-align: center; }
-.tile-bottom { height: 50%; padding: 0.25em 0px 0px 1em; width: 23em; }
-.channel-bottom { height: 25%; margin-top: 2.65em; width: 100%; }
-.channel-bottom .title, .tile-bottom .title { color: rgb(153, 153, 153); font-size: 1.7em; height: 2.45em; line-height: 1.25em; margin: 0.6em 0.6em 0px 0px; overflow: hidden; text-align: left; white-space: normal; }
-.channel-bottom .title { height: 1.2em; margin: 0px; padding: 0px 0.6em; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
-.tile.selected.focused .tile-bottom { color: rgb(34, 34, 34); }
-.tile.selected.focused .channel-bottom .details, .tile.selected.focused .tile-bottom .details { color: rgb(153, 153, 153); }
-.tile.selected.focused .channel-bottom .title, .tile.selected.focused .tile-bottom .title { color: rgb(68, 68, 68); }
-.channel-tile .channel-top .decoration { margin-top: -19%; text-align: right; width: 97%; }
-.video-tile .tile-top .decoration { margin-top: -2em; text-align: right; width: 97.3%; }
-.channel-top .badge, .tile-top .badge, .tile-top .duration { border-radius: 0.1em; color: rgb(255, 255, 255); display: inline-block; font-size: 1.4em; padding: 0em 0.1em; background: rgba(0, 0, 0, 0.701961); }
-.tile-top .badge, .tile-top .duration { text-transform: uppercase; }
-.tile-top .live-badge { border: 0px; color: rgb(255, 255, 255); background-color: rgba(230, 33, 23, 0.8); }
-.playlist-tile:hover, .video-tile:hover { background-color: rgb(34, 34, 34); }
-.channel-tile .details, .playlist-tile .details, .recent-search-tile .details, .video-tile .details { color: rgb(153, 153, 153); font-size: 1.3em; font-weight: 300; height: 40%; overflow: hidden; padding: 0px; white-space: normal; word-break: break-all; }
-.channel-tile .details { text-align: center; }
-.playlist-tile .details, .recent-search-tile .details, .video-tile .details { margin: 0.7em 0em 0em; }
-.custom-playlist-image-tile .tile-top .video-thumb { background-size: 56.25%; background-position-x: 0%; background-repeat: no-repeat; }
-.playlist-tile.focused .details, .recent-search-tile.focused .details, .video-tile.focused .details { color: rgb(102, 102, 102); }
-.playlist-tile .details .by, .recent-search-tile .results, .video-tile .details .by { height: 1.4em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
-.playlist-tile .details .views, .video-tile .details .views { display: inline-block; padding-right: 1.5em; }
-.playlist-tile .details .views:empty, .video-tile .details .views:empty { display: none; }
-.action-tile { border: 2px solid rgba(255, 255, 255, 0.0980392); color: rgb(255, 255, 255); height: 26em; overflow: visible; }
-.action-tile.focused, .channel-tile.focused { color: rgb(34, 34, 34); background-color: rgb(255, 255, 255); }
-.action-tile .content { height: 26em; white-space: normal; }
-.video-tile .live-start-time { display: inline-block; vertical-align: middle; }
-.tile-top .count-overlay { font-size: 1.4em; height: 100%; position: absolute; right: 0px; text-align: center; top: 0px; width: 30%; background: rgba(0, 0, 0, 0.74902); }
-.tile-top .count-overlay .video-count { display: block; font-size: 2.2em; font-weight: bold; line-height: 0.8em; margin-top: 1.6em; }
-.action-tile .title { font-size: 2.4em; height: 24%; overflow: hidden; padding-top: 0.5em; text-align: center; text-overflow: ellipsis; text-transform: uppercase; white-space: normal; }
-.action-tile .long-title { font-size: 2em; text-align: center; white-space: normal; }
-.action-tile .description, .action-tile .remote-pair-text, .action-tile .remote-reset-help { color: rgb(255, 255, 255); font-size: 1.4em; opacity: 0; padding: 0.5em; text-align: center; white-space: normal; }
-.action-tile.focused .description, .action-tile.focused .remote-pair-text, .action-tile.focused .remote-reset-help, .action-tile.focused .sign-out-username { opacity: 1; }
-.action-tile .sign-out-username { font-size: 1.7em; margin: 1em auto; overflow: hidden; text-align: center; text-overflow: ellipsis; white-space: nowrap; width: 80%; }
-.action-tile .remote-count { font-size: 0.4em; position: absolute; top: 40%; width: 100%; }
-.action-tile .remote-standing { display: inline-block; font-size: 1.4em; margin: 0.2em auto; padding: 0.8em 0.4em 0.1em; }
-.action-tile .remote-reset-help { height: 2.7em; }
-.action-tile .status { font-size: 2em; text-align: center; }
-.row-playing { display: none; }
-.action-tile .large-action-icon { font-family: youtube-icons; font-size: 11em; margin-top: 0px; text-align: center; width: 100%; }
-.action-tile .sign-out-user-icon { border-radius: 20em; height: 9em; margin: 0px auto; width: 9em; background-size: cover; }
-.action-tile .search-tile .description { font-size: 1.4em; margin-top: 2em; position: inherit; text-align: center; }
-.large-action-icon.icon-guide-history { font-size: 8em; margin-top: 0.2em; }
-.toggle-tile .icon { margin-top: 0px; }
-.toggle-tile .content .title { height: 12%; white-space: nowrap; }
-.toggle-tile .label { font-size: 1.8em; max-height: 13%; text-align: center; width: 100%; }
-.selected .icon-search, .tile.selected .icon-search-clear { color: rgb(34, 34, 34); }
-.exp-densityBrowse .horizontal-list > .content { font-size: 100%; }
-.exp-densityBrowse .horizontal-list .no-content-message { display: none; }
-.exp-densityBrowse .horizontal-list .pivot-sliding-highlighter { border: 0.5em solid rgb(255, 255, 255); box-shadow: rgb(0, 0, 0) 0.083em 0.083em 0.75em 0.167em inset; height: 7.5em; margin-left: -0.4em; margin-top: -0.4em; pointer-events: none; width: 13.8em; background: transparent; }
-.exp-densityBrowse .horizontal-list.focused .pivot-sliding-highlighter { display: block; }
-.exp-densityBrowse .horizontal-list.focused.channel-selected .pivot-sliding-highlighter { border-radius: 50%; height: 7.5em; transform: translateX(3.2em); width: 7.5em; }
-.exp-densityBrowse .browse-sets .action-tile, .exp-densityBrowse .horizontal-list .channel-tile, .exp-densityBrowse .horizontal-list .video-tile { height: 14em; width: 14em; }
-.exp-densityBrowse .shelf .horizontal-list .channel-tile, .exp-densityBrowse .shelf .horizontal-list .video-tile, .exp-densityBrowse .shelf .horizontal-list .channel-tile.selected, .exp-densityBrowse .shelf .horizontal-list .video-tile.selected { opacity: 0.5; }
-.exp-densityBrowse .shelf.selected .horizontal-list .channel-tile, .exp-densityBrowse .shelf.selected .horizontal-list .video-tile, .exp-densityBrowse .horizontal-list .channel-tile, .exp-densityBrowse .horizontal-list .video-tile { opacity: 0.7; }
-.exp-densityBrowse .shelf.selected .horizontal-list .channel-tile.selected, .exp-densityBrowse .shelf.selected .horizontal-list .video-tile.selected, .exp-densityBrowse .horizontal-list .channel-tile.selected, .exp-densityBrowse .horizontal-list .video-tile.selected, .exp-densityBrowse .horizontal-list .auto-play-tile.selected .video-tile, .limited-animation .exp-densityBrowse .shelf .horizontal-list .channel-tile, .limited-animation .exp-densityBrowse .shelf .horizontal-list .video-tile, .limited-animation .exp-densityBrowse .shelf .horizontal-list .channel-tile.selected, .limited-animation .exp-densityBrowse .shelf .horizontal-list .video-tile.selected, .limited-animation .exp-densityBrowse .shelf.selected .horizontal-list .channel-tile, .limited-animation .exp-densityBrowse .shelf.selected .horizontal-list .video-tile, .limited-animation .exp-densityBrowse .horizontal-list .channel-tile, .limited-animation .exp-densityBrowse .horizontal-list .video-tile { opacity: 1; }
-.exp-densityBrowse .horizontal-list .tile-top { height: 7.83em; }
-.exp-densityBrowse .channel-top .badge, .exp-densityBrowse .tile-top .badge { font-size: 1em; padding: 0.2em; }
-.exp-densityBrowse .horizontal-list .tile-bottom, .exp-densityBrowse .horizontal-list .channel-bottom { height: 4.25em; margin-top: 0.83em; padding: 0px; width: 100%; }
-.exp-densityBrowse .shelf .horizontal-list .tile-bottom, .exp-densityBrowse .shelf .horizontal-list .channel-bottom { display: none; }
-.exp-densityBrowse .shelf.selected .horizontal-list .tile-bottom, .exp-densityBrowse .shelf.selected .horizontal-list .channel-bottom { display: block; }
-.exp-densityBrowse .browse-sets .action-tile .description, .exp-densityBrowse .horizontal-list .tile-bottom .title, .exp-densityBrowse .horizontal-list .channel-bottom .title { font-size: 1.16em; height: initial; line-height: 1.25em; margin: 0px; max-height: 2.5em; text-overflow: ellipsis; }
-.exp-densityBrowse .horizontal-list .channel-bottom .title { white-space: normal; }
-.exp-densityBrowse .horizontal-list .video-tile .details { color: rgb(205, 205, 205); font-size: 0.83em; height: initial; margin: 0.4em 0px; }
-.exp-densityBrowse .horizontal-list .video-tile .tile-top .decoration { display: none; line-height: 1em; margin-top: 0px; transform: translateY(-100%); width: 100%; }
-.exp-densityBrowse #search .tile-top .decoration, .exp-densityBrowse #post-play-list .tile-top .decoration, .exp-densityBrowse .shelf.selected .horizontal-list .tile-top .decoration { display: block; }
-.exp-densityBrowse .horizontal-list .video-tile .tile-top .badge { border-radius: 0px; }
-.exp-densityBrowse .horizontal-list .video-tile .tile-top .duration { font-size: 1em; font-weight: bold; padding: 0.5em; background: rgba(0, 0, 0, 0.498039); }
-.exp-densityBrowse .horizontal-list .channel-bottom .details { display: none; }
-.exp-densityBrowse .horizontal-list .video-tile .details .views, .exp-densityBrowse .horizontal-list .video-tile .details .age { display: inline-block; }
-.exp-densityBrowse .horizontal-list .video-tile .details .views { padding-right: 0.5em; }
-.sets-ui .exp-densityBrowse .horizontal-list .channel-tile.selected .channel-bottom > .title, .sets-ui .exp-densityBrowse .horizontal-list .auto-play-tile.selected .tile-bottom > .title, .sets-ui .exp-densityBrowse .horizontal-list .video-tile.selected .tile-bottom > .title { color: rgb(255, 255, 255); }
-.exp-densityBrowse .video-tile .overlay { height: 7.83em; margin-left: 60%; margin-top: -7.83em; width: 40%; }
-.exp-densityBrowse .video-tile .overlay .count { font-size: 1em; line-height: 1em; padding-top: 1.5em; }
-.exp-densityBrowse .video-tile .overlay .icon { font-size: 2em; padding: 0px; }
-.exp-densityBrowse .horizontal-list .channel-top { height: 7.83em; margin: 0px auto; width: 7.83em; }
-.exp-densityBrowse .horizontal-list .channel-top .video-thumb { border-radius: 50%; }
-.exp-densityBrowse .browse-sets .shelf > .title { font-size: 1em; margin-bottom: 0.9em; margin-top: 0px; }
-.exp-densityBrowse .browse-sets .shelf > .title .main { font-size: 1.5em; }
-.exp-densityBrowse .browse-sets .shelf > .title .annotation { font-size: 1em; }
-.exp-densityBrowse .browse-sets .shelf > .title { color: rgb(205, 205, 205); }
-.engaged.exp-densityBrowse .channel-tile .voice-command, .engaged.exp-densityBrowse .video-tile .voice-command { font-size: 1em; line-height: 1em; margin-top: -2em; }
-.limited-animation.sets-ui .exp-densityBrowse .video-tile:hover:not(.focused), .limited-animation.sets-ui .exp-densityBrowse .channel-tile:hover:not(.focused), .sets-ui .exp-densityBrowse .carousel .item:hover, .sets-ui .exp-densityBrowse .carousel .auto-play-tile:hover, .sets-ui .exp-densityBrowse .carousel .channel-tile:hover { opacity: 1; background-color: inherit !important; }
-.exp-densityBrowse .browse-sets .action-tile { border: none; }
-.exp-densityBrowse .browse-sets .action-tile .content { height: 7.83em; margin-bottom: 0.83em; }
-.exp-densityBrowse .browse-sets .action-tile .title { display: none; }
-.exp-densityBrowse .browse-sets .action-tile .large-action-icon { color: rgb(255, 255, 255); font-size: 6em; height: 1.3em; line-height: 1.3em; background-color: rgb(35, 35, 35); }
-.exp-densityBrowse .browse-sets .action-tile .description { opacity: inherit; padding: 0px; }
-.exp-densityBrowse .auto-play-tile { height: 14em; width: 14em; }
-.exp-densityBrowse .post-play-countdown { top: 7%; }
-.limited-animation .exp-densityBrowse .browse-content .list { margin-left: -7.5em; width: inherit; }
-.limited-animation .exp-densityBrowse .browse-content .shelf > .title { margin-left: 7.5em; }
-.limited-animation .exp-densityBrowse .browse-content .list .shelf:nth-child(1) { margin-bottom: 6.5em; }
-.limited-animation .exp-densityBrowse .browse-content .list .shelf { margin-bottom: -0.1em; }
-.limited-animation.sets-ui .exp-densityBrowse .channel-tile:not(.focused), .limited-animation.sets-ui .exp-densityBrowse .video-tile:not(.focused) { background-color: inherit; }
-.limited-animation .exp-densityBrowse .channel-tile.focused, .limited-animation .exp-densityBrowse .video-tile.focused { background-color: inherit; }
-.limited-animation .exp-densityBrowse .video-tile { margin-right: 0.5em; }
-.limited-animation .exp-densityBrowse .video-tile .overlay { height: 7.03em; margin-left: 8em; margin-top: -7.43em; width: 5.6em; }
-.limited-animation .exp-densityBrowse .video-tile .tile-top { height: 7.03em; padding: 0.4em; width: 13.2em; background: inherit; }
-.limited-animation .exp-densityBrowse .channel-tile { margin-right: 0.5em; }
-.limited-animation .exp-densityBrowse .channel-tile .channel-top { height: 6.83em; padding: 0.4em; width: 6.83em; }
-.limited-animation .exp-densityBrowse .video-tile.focused .tile-top { background: rgb(255, 255, 255); }
-.limited-animation .exp-densityBrowse .channel-tile.focused .channel-top { border-radius: 50%; background: rgb(255, 255, 255); }
-.limited-animation .exp-densityBrowse .search .placeholder-tile, .limited-animation .exp-densityBrowse .browse-content .list .placeholder-tile { height: 14em; margin-right: 0.5em; width: 14em; }
-#dialog.remote-reset-dialog > .title { font-size: 3em; padding-bottom: 0.5em; }
-#dialog.remote-reset-dialog .buttons { bottom: 0.5em; position: absolute; }
-#dialog.remote-reset-dialog { left: 0px; position: absolute; white-space: normal; }
-.remote-reset-dialog #dialog-view { color: rgb(170, 170, 170); font-size: 1.8em; padding-top: 0.5em; }
-.connection-instructions { padding-top: 0.5em; font-size: 2em; }
-.text-dialog .connection-instructions { font-size: 1.3em; }
-.browse-sets-state .login-dialog { margin-top: 5em; }
-#search .pairing .pairing-content > *, #dialog .pairing .pairing-content > * { display: inline-block; }
-#search .pairing .pairing-content .step2, #dialog .pairing .pairing-content .step2 { display: block; }
-#search .dial-upsell .connection-steps .no-dial-connect-step1, #search .manual-connect .connection-steps .with-dial-connect-step1 { display: none; }
-.connection-instructions .step1, .connection-instructions .step2, .qr-code .scan, .pairing .connected-header, .remote-reset-dialog .connected-header { color: rgb(170, 170, 170); font-size: 0.7em; }
-.connection-instructions .pair-url, .connection-instructions .pair-code { color: rgb(241, 241, 241); }
-.connection-instructions .step2 { margin-top: 2em; }
-.pairing .qr-code, .pairing .connected-list { display: inline-block; margin-left: 1em; vertical-align: top; }
-.pairing .dial-upsell { color: rgb(170, 170, 170); display: inline-block; font-size: 95%; overflow: hidden; padding-left: 2em; padding-top: 0.8em; text-align: initial; vertical-align: top; white-space: normal; width: 16em; }
-.pairing .cast-icon { display: inline-block; height: 1em; margin: 0.1em 0.3em; vertical-align: middle; width: 1em; background: url(www.youtube.com/s/tv/html5/f0d770f4/img/cast_disconnected_blue.png) 50% 50% / contain no-repeat; }
-.pairing .qr-code .scan { margin-bottom: 0.5em; white-space: normal; width: 5em; }
-.pairing .qr-code img { height: 5.1em; width: 5.1em; }
-.pairing .icon-settings-pair, .login-dialog .icon-settings-pair { display: inline-block; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 5em; line-height: normal; font-family: youtube-icons; height: 1em; margin-top: 0.1em; width: 1.4em; background-image: none; }
-.remote-reset-dialog .connected-header, .pairing .connected-header { margin-bottom: 0.3em; }
-.remote-reset-dialog .devices, .pairing .devices { list-style: none; font-size: 1.5em; color: rgb(241, 241, 241); }
-.remote-reset-dialog .devices > div, .pairing .devices > div { display: block; height: 1.5em; line-height: 1.5em; overflow: hidden; padding-left: 1.5em; text-overflow: ellipsis; white-space: nowrap; width: 11.5em; }
-.remote-reset-dialog .devices .connected::before { background-position: 0px 100%; }
-.remote-reset-dialog .devices .connected { color: rgb(241, 241, 241); }
-#search { bottom: 0px; color: rgb(241, 241, 241); left: 0px; overflow: hidden; position: absolute; right: 0px; text-align: center; top: 0px; }
-.watch-state #search { left: 0px; }
-#search > .controls { left: 8em; margin-right: 18em; position: absolute; right: 2.5em; text-align: left; top: 2.5em; }
-#search-text-box { font-size: 1.6em; height: 100%; margin: 0px auto; overflow: hidden; position: relative; background-color: rgb(225, 225, 225); }
-#search-text-box > .icon-search { display: none; }
-#search-input { border: none; color: rgb(17, 17, 17); height: 100%; padding-left: 0.5em; width: 100%; background: none; }
-#search-input:disabled { color: rgb(17, 17, 17); }
-#search-query { color: rgb(17, 17, 17); height: 100%; overflow: hidden; padding-left: 0.5em; padding-top: 0.3em; position: absolute; text-overflow: ellipsis; white-space: pre; width: 95%; }
-#search-suggestions { font-size: 1.2em; position: relative; display: inline-block; left: 0px; width: 100%; }
-.search-state #spinner { top: 26em; }
-#suggest-list { overflow: hidden; }
-#suggest-list > div { border-radius: 1px; color: rgb(225, 225, 225); display: inline-block; padding: 0.2em 0.5em; }
-#search-keyboard { font-size: 1em; text-align: left; width: 65%; }
-#search-suggestions, #search-keyboard, #letter-suggest { white-space: nowrap; }
-#search-keyboard, #letter-suggest { z-index: 1; }
-#keyboard-grid { display: inline-block; font-size: 1.6em; margin: 0px auto; overflow: hidden; text-align: left; }
-#keyboard-grid, #keyboard-spacebar { color: rgb(163, 163, 163); }
-#keyboard-grid .button { border-radius: 1px; display: inline-block; margin: 0.3em 0.6em 0.3em 0px; padding: 0px 0.1em; text-align: center; text-transform: uppercase; width: 1em; vertical-align: top; }
-#keyboard-grid .list { text-align: left; text-shadow: none; }
-#search-keyboard #keyboard-grid .icon-key-delete.button { font-family: youtube-icons; font-size: 0.7em; line-height: 1.2em; margin-left: 2.25em; padding: 0.25em; width: 2.25em; }
-#keyboard-spacebar { border-radius: 1px; display: inline-block; font-family: youtube-icons; font-size: 1.44em; margin: 0.1em 7em 0px 2.1em; padding: 0.1em; text-align: left; }
-#search-keyboard #keyboard-grid .clear-query-tile.button { font-size: 0.7em; margin-left: 2.25em; padding: 0.25em; text-transform: uppercase; width: auto; }
-#keyboard-grid .icon-key-globe { font-family: youtube-icons; margin: 0.25em 0px 0.25em 1.6em; padding: 0.1em; width: 1.2em; }
-#search-keyboard .button.focused { color: rgb(33, 33, 33); background-color: rgb(225, 225, 225); }
-#letter-suggest { font-size: 1.6em; position: fixed; text-align: center; width: 1.2em; }
-.letter-suggest-visible #keyboard-grid .list.selected .button.selected:not(.focused) { color: rgb(0, 0, 0); text-shadow: none; background-color: rgba(153, 153, 153, 0.85098); }
-#keyboard-grid .button.numbers-toggle-tile { font-size: 0.75em; padding: 0.22em; margin: 0.25em 0px 0px 2.1em; width: auto; }
-#search .pairing .icon-settings-pair { display: none; }
-#search .search-message { display: inline-block; margin-left: 2em; margin-top: 1.5em; vertical-align: top; white-space: normal; width: 50%; }
-#search .search-pairing { bottom: 0px; display: inline-block; left: 5em; padding: 2em 2.5em 4em; position: absolute; text-align: left; text-shadow: black -1px 1px 2px; width: 100%; background-color: rgba(0, 0, 0, 0.298039); }
-.limited-animation #search .search-pairing { background-color: rgb(0, 0, 0); }
-#search .search-pairing .search-img { display: inline-block; height: 11em; width: 11em; background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/pair_promo.png); background-size: cover; }
-#search .search-pairing .title { font-size: 1.9em; }
-#search .search-pairing .connection-instructions { font-size: 1.6em; }
-#search .search-pairing .dial-upsell-content { color: rgb(170, 170, 170); }
-#search .search-pairing .manual-connect-content .connection-steps { padding: 0px; }
-#search .search-pairing .manual-connect-content .connection-steps .pair-code, #search .search-pairing .manual-connect-content .connection-steps .pair-url { display: block; }
-#search .search-pairing .manual-connect-content .connection-steps .step2 { margin-top: 1em; }
-#search .search-pairing .manual-connect-content .connection-steps .label, #search .search-pairing .manual-connect .dial-upsell-content, #search .search-pairing .dial-upsell .manual-connect-content { display: none; }
-#search .pairing .no-dial-connect-step1, #search .pairing .no-dial-connect-step2 { display: inline-block; }
-#search .pairing .no-dial-connect-step2 { margin-left: 2em; }
-#search .pairing .connection-steps { text-align: left; }
-#search .pairing .connected-list, #search .pairing .qr-code-wrapper { display: none; }
-#search.hide-input .search-pairing { margin-top: 8em; }
-#letter-suggest div { color: rgba(0, 0, 0, 0.8); height: 1.4em; text-shadow: none; background-color: rgba(153, 153, 153, 0.85098); }
-#letter-suggest .focused { color: rgb(241, 241, 241); }
-#transliteration-container { display: none; }
-#search-keyboard.transliterable #transliteration-container { display: block; }
-#transliteration .list { font-size: 2em; height: 1.2em; margin: 0px auto; overflow: hidden; padding: 0.2em 0px; text-align: center; width: 77%; }
-#transliteration .list > div { display: inline; padding: 0px 0.5em; position: relative; }
-#suggest-list > div.focused, #transliteration .list .focused { color: rgb(33, 33, 33); background-color: rgb(254, 254, 254); }
-#transliteration .button:hover { background-color: rgba(153, 153, 153, 0.4); }
-#transliteration .button:hover, #search-keyboard .button:hover { cursor: pointer; }
-#search .horizontal-list > .content { text-align: left; }
-.limited-animation.sets-ui #search .horizontal-list > .content { margin-left: -21.8em; width: 126em; }
-#search .horizontal-list { left: 7.5em; height: inherit; position: absolute; right: 0px; top: 38%; transform: translateY(7.5em); transition: opacity 0.25s, transform 0.25s; width: initial; }
-#search.input-collapsed .horizontal-list { transform: none !important; }
-#search-keyboard { transition: opacity 0.25s, transform 0.25s; transform-origin: 50% top 0px; }
-#search-keyboard.hidden { opacity: 0; transform: scaleY(0.5); display: block !important; }
-#search #search-text-entry { height: 2.4em; }
-#search #search-suggestions, #search #search-text-entry { padding-top: 0.25em; transform-origin: 50% top 0px; transition: opacity 0.25s, transform 0.25s; background-color: rgba(0, 0, 0, 0); }
-.limited-animation #search .horizontal-list, .limited-animation #search #search-suggestions, .limited-animation #search #search-text-entry, .limited-animation #search #search-keyboard { transition: none; }
-#search-text-entry { padding-bottom: 0.4em; }
-#search-text-entry, #text-box-background { height: 3em; }
-#keyboard-icon { display: none; font-family: youtube-icons; font-size: 1.2em; padding-bottom: 0.4em; text-align: center; vertical-align: bottom; width: 2em; }
-.input-collapsed #keyboard-icon { display: inline-block; }
-#search-text-entry .suggestions-container { white-space: nowrap; overflow: hidden; height: 2.4em; }
-.exp-densityBrowse #search .horizontal-list { font-size: 100%; height: 14em; top: 35%; transform: translateY(8em); }
-.limited-animation .exp-densityBrowse #search .horizontal-list .list { margin-left: -14em; }
-.exp-densityBrowse #search .horizontal-list .video-tile { height: 14em; }
-.exp-densityBrowse #search .horizontal-list .video-tile .details .views, .exp-densityBrowse #search .horizontal-list .video-tile .details .age { display: inline-block; }
-.exp-densityBrowse #search .horizontal-list .video-tile .details .views { padding-right: 0.5em; }
-.limited-animation.sets-ui .exp-densityBrowse #search .horizontal-list > .content { margin-left: 0px; width: inherit; }
-#player { height: 100%; width: 100%; }
-.watch-state #watch { display: block; }
-.veryvibrant #watch { height: 100%; background-color: rgb(0, 0, 0); }
-#player-facade { height: 100%; position: absolute; width: 100%; }
-#player-video { height: 100%; }
-#watch, .dialog-focused .standard-caption-window, #caption-window-99, .countdowntimer, .ytp-cued-icon, .ytp-fallback, .html5-context-menu, .html5-dialog-holder, .html5-endscreen, .html5-info-bar, .html5-modal-panel, .html5-player-chrome, .html5-show-video-info-template, .html5-storyboard, .html5-text-button, .html5-video-player .hid, .html5-ypc-module, .player-actions-container, .video-ad-status-bar, .video-annotations, .html5-watermark, .video-fallback-content, .video-ads, .title-card.hidden { display: none; }
-.html5-video-player { overflow: visible; }
-.html5-video-info-panel { color: rgb(241, 241, 241); display: none; margin: 20%; position: absolute; top: 0px; z-index: 1; background-color: rgba(0, 0, 0, 0.701961); }
-.html5-video-info-panel-close { display: none; }
-.html5-video-info-panel-content > div > div { display: inline-block; font-weight: bold; padding: 0px 0.5em; text-align: right; width: 10em; }
-.ad-video { width: 100%; height: 100%; }
-.ad-showing .video-ads { display: block; overflow: hidden; }
-.ad-interrupting.tag-pool-enabled .html5-main-video { position: absolute; left: -1px; top: -1px; overflow: hidden; width: 1px !important; height: 1px !important; }
-.html5-video-player .video-stream { position: absolute; top: 0px; left: 0px; display: block; }
-.opera .video-stream { height: 720px; width: 1280px; }
-.advertisement-info, .skip-ad-button { position: absolute; top: 9.5em; }
-.advertisement-info { left: 12.5%; text-align: left; width: 30%; overflow: hidden; }
-.advertisement-info-top { height: 3em; }
-.advertisement-avatar { width: 3em; height: 3em; display: inline-block; margin-right: 0.4em; background-size: contain; background-position: 100% 50%; background-repeat: no-repeat; }
-.advertisement-info-details { display: inline-block; vertical-align: top; width: 79%; }
-.advertisement-title, .advertisement-advertiser, .third-party { color: rgb(255, 255, 255); text-shadow: rgb(0, 0, 0) 2px 1px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
-.third-party { position: absolute; bottom: 0px; }
-.advertisement-title { font-size: 1.4em; line-height: 1em; height: 1.1em; }
-.advertisement-advertiser { font-size: 1.1em; line-height: 1.3em; height: 1.4em; }
-.advertisement-info .ad-badge { padding: 1px 5px; text-shadow: none; border-radius: 0.15em; font-size: 0.9em; text-transform: capitalize; background-color: rgb(230, 188, 39); }
-.skip-ad-button { right: 12.5%; border-radius: 0.15em; padding: 0.6em; background-color: rgba(0, 0, 0, 0.4); }
-.canskip.mdx-skip.skip-ad-button { height: 4em; width: 18em; }
-.canskip.mdx-skip .skip-button-text { font-size: 1.1em; height: 3em; left: 2em; line-height: 1.5em; position: absolute; top: 0.7em; width: 75%; }
-#transport-controls.ad-active .player-controls #button-list div.skip-ad-button .label, .skip-ad-button .label { font-size: 1.1em; padding: 0px 1.4em; height: 2.5em; line-height: 2.5em; border-radius: 0.12em; cursor: pointer; color: rgb(225, 225, 225); background-color: rgba(0, 0, 0, 0); }
-.skip-ad-button.canskip.mdx-skip .label { height: 3.7em; }
-#transport-controls.ad-active .player-controls #button-list div.skip-ad-button.canskip:hover .label, .skip-ad-button.canskip:hover .label { color: rgb(33, 33, 33); border-radius: 0.12em; background-color: rgb(255, 255, 255); }
-#transport-controls.ad-active .player-controls #button-list div.skip-ad-button.canskip.focused .label, .skip-ad-button.canskip.focused .label { color: rgb(33, 33, 33); border-radius: 0.12em; background-color: rgb(225, 225, 225); }
-.skip-ad-button .skip-symbol { display: none; font-family: youtube-icons; }
-.skip-ad-button.canskip .skip-symbol.icon-player-next { display: inline; font-size: 1.3em; margin-left: 0.5em; vertical-align: middle; }
-.exp-newMdxSkipButtonCast .canskip.mdx-skip.skip-ad-button .skip-symbol.icon-cast_on { display: inline; font-size: 2.5em; position: absolute; right: 0.7em; text-align: right; top: 0.5em; width: 25%; }
-.exp-newMdxSkipButtonPair .canskip.mdx-skip.skip-ad-button .skip-symbol.icon-settings-pair { display: inline; font-size: 4em; position: absolute; right: 0.4em; text-align: right; top: 0.3em; width: 25%; }
-.canskip.mdx-skip.skip-ad-button .skip-symbol.icon-player-next { display: none; }
-#player-controls { text-align: center; }
-#bottom-half { bottom: 0px; height: 50%; position: absolute; width: 100%; }
-#transport-controls { bottom: 0px; height: 100%; position: absolute; transition: transform 0.25s, opacity 0.25s; width: 100%; background: linear-gradient(rgba(0, 0, 0, 0), rgb(0, 0, 0)); }
-#transport-controls.hidden { opacity: 0; display: block !important; }
-.limited-animation #transport-controls.hidden { display: none !important; }
-#transport-controls, #transport-controls.focused { display: block; }
-.player-controls-widget { border: 0px; margin-top: 8.4em; }
-.fresh-transport-controls.seeking-forward .seeking-icon.icon-player-rew::before { content: ""; }
-.seeking-icon { bottom: 3em; color: rgb(255, 255, 255); display: none; position: absolute; left: 0px; margin: 0px auto; right: 0px; }
-.seeking-icon span { display: none; }
-.fresh-watch.watch-seeking .seeking-icon { display: block; }
-.fresh-watch .title-card { height: 35.9%; background: linear-gradient(rgba(0, 0, 0, 0.74902), transparent); }
-#transport-controls.fresh-transport-controls { background: linear-gradient(to top, rgb(0, 0, 0), transparent); }
-.fresh-watch .player-video-title { color: rgb(255, 255, 255); font-size: 1.936em; }
-.fresh-watch .player-meta .player-video-details { color: rgba(255, 255, 255, 0.701961); font-size: 1.455em; }
-.fresh-watch .pivot-shelf-list { margin-top: 14.5em; padding-left: 3.871em; }
-#fresh-rows-container { border: 0px; color: rgb(255, 255, 255); margin-top: 7.7em; }
-.fresh-transport-controls .storyboards { position: absolute; }
-.fresh-transport-controls .more-row, .fresh-transport-controls .main-row { margin-left: 5%; width: 95%; }
-.fresh-transport-controls .button span, .fresh-transport-controls .toggle-button span { display: none; font-family: roboto-regular; color: rgb(255, 255, 255); }
-.lang-case-sensitive .fresh-transport-controls span::first-letter { text-transform: uppercase; }
-.fresh-transport-controls .button.disabled:hover, .fresh-transport-controls .toggle-button.disabled:hover { background-color: transparent; }
-.fresh-transport-controls .button.disabled, .fresh-transport-controls .toggle-button.disabled { opacity: 0.45; }
-.fresh-transport-controls .button.focused, .fresh-transport-controls .toggle-button.focused, .fresh-transport-controls .button:hover, .fresh-transport-controls .toggle-button:hover { color: rgb(255, 255, 255); background-color: rgba(255, 255, 255, 0.498039); }
-.fresh-transport-controls .button, .fresh-transport-controls .toggle-button, .seeking-icon { border-radius: 4px; font-family: youtube-icons; font-size: 1.4em; height: 1em; padding: 0.55em; speak: none; text-align: center; width: 1em; }
-.fresh-transport-controls .button, .fresh-transport-controls .toggle-button { color: rgba(255, 255, 255, 0.701961); cursor: pointer; display: inline-block; position: relative; }
-.fresh-transport-controls #transport-more-button::before { display: inline-block; left: 19%; position: absolute; top: -9%; }
-.fresh-transport-controls #transport-more-button { font-size: 2em; height: 0.7em; margin-right: 1.452em; padding: 0.385em; width: 0.7em; }
-.fresh-transport-controls #transport-more-button span { color: rgb(255, 255, 255); display: inline-block; font-size: 0.485em; left: 4.5em; position: absolute; text-align: left; top: 1em; width: 15em; }
-.fresh-transport-controls #transport-more-button.top-row-active span { display: none; }
-.fresh-transport-controls #transport-more-options-list { display: inline-block; }
-.fresh-transport-controls .progress-bar { display: inline-block; height: 3em; left: 0px; padding: 0px; position: relative; top: 0px; width: 76.55%; }
-.fresh-transport-controls.live-playback #play-pause-button { margin-right: 1em; }
-.fresh-transport-controls.live-playback .progress-bar { width: 77.55%; }
-.fresh-transport-controls.live-playback .live-indicator { display: inline-block; left: 0px; margin-left: 1em; position: relative; top: 0px; }
-.fresh-transport-controls #player-time-elapsed, .fresh-transport-controls .player-time-total { color: rgb(255, 255, 255); display: inline-block; font-size: 1.3em; position: relative; text-align: center; top: 0px; width: 8%; }
-.fresh-transport-controls .more-row { margin-bottom: 5px; }
-.fresh-transport-controls .more-row .button, .fresh-transport-controls .more-row .toggle-button { margin-right: 2.075em; vertical-align: top; }
-.fresh-transport-controls .icon-like.toggle-selected, .fresh-transport-controls .icon-dislike.toggle-selected, .fresh-transport-controls .icon-player-closedcaptions.toggle-selected { color: rgb(39, 147, 230); }
-.fresh-transport-controls .icon-logo-lozenge.toggle-selected { color: rgb(255, 0, 0); }
-.fresh-transport-controls .more-row .button span, .fresh-transport-controls .more-row .toggle-button span { font-size: 0.692em; left: -3.45em; position: relative; top: -4.4em; width: 8.3em; }
-.fresh-transport-controls .more-row .button.focused span, .fresh-transport-controls .more-row .toggle-button.focused span, .fresh-transport-controls .more-row .button:hover span, .fresh-transport-controls .more-row .toggle-button:hover span { display: inline-block; }
-.fresh-transport-controls .progress-bar .progress-bar-line div { height: 0.242em; }
-.fresh-transport-controls .progress-bar .progress-bar-line .progress-bar-background { background-color: rgba(255, 255, 255, 0.45098); }
-.fresh-transport-controls .progress-bar .progress-bar-line .progress-bar-loaded { background-color: rgb(255, 255, 255); }
-.fresh-transport-controls .progress-bar .progress-bar-line .progress-bar-played { background-color: rgb(223, 35, 35); }
-.fresh-transport-controls .progress-bar.ad-active .progress-bar-played { background-color: rgb(231, 189, 0); }
-.ypc-playback .fresh-transport-controls .progress-bar-line .progress-bar-played { background-color: rgb(39, 147, 230); }
-.fresh-watch .ad-point-separator, .fresh-transport-controls .progress-bar .progress-bar-disc, .fresh-transport-controls.ad-active #player-time-elapsed, .fresh-transport-controls.ad-active .player-time-total { display: none; }
-.fresh-transport-controls.ad-active .progress-bar { padding-left: 1em; width: 88%; }
-.fresh-transport-controls.ad-active .more-row, .fresh-watch.watch-seeking .more-row { visibility: hidden; }
-.fresh-watch .skip-ad-button, .fresh-watch .advertisement-info { top: 6.7em; }
-.fresh-watch .advertisement-info { left: 5%; }
-.fresh-watch .advertisement-info .advertisement-info-top { height: 3.065em; position: relative; }
-.fresh-watch .skip-ad-button { border-radius: 4px; padding: 0px; right: 6%; z-index: 1; background-color: rgba(0, 0, 0, 0.498039); }
-.fresh-watch .skip-ad-button .label { color: rgb(255, 255, 255); font-size: 1.13em; height: 2.57em; line-height: 2.57em; padding: 0px 1.3em; }
-.fresh-watch .skip-ad-button .skip-symbol { font-size: 1.1em; }
-.fresh-watch .skip-ad-button.canskip:hover, .fresh-watch .skip-ad-button.canskip.focused { background-color: rgba(255, 255, 255, 0.498039); }
-.fresh-watch .skip-ad-button.canskip:hover .label, .fresh-watch .skip-ad-button.canskip.focused .label { color: rgb(255, 255, 255); background: none; }
-.fresh-watch .advertisement-info { color: rgb(255, 255, 255); }
-.fresh-watch .advertisement-info .advertisement-advertiser { font-size: 100%; height: 1.4em; line-height: 1.3em; }
-.fresh-watch .advertisement-info .advertisement-advertiser > span { vertical-align: bottom; }
-.fresh-watch .advertisement-info .advertisement-advertiser, .fresh-watch .advertisement-info .advertisement-title, .fresh-watch .advertisement-info .third-party { overflow: hidden; text-shadow: none; text-overflow: ellipsis; white-space: nowrap; }
-.fresh-watch .advertisement-info .third-party { bottom: 0px; position: absolute; vertical-align: top; width: 79%; }
-.fresh-watch .advertisement-info .third-party > span { vertical-align: middle; }
-.fresh-watch .advertisement-info .advertisement-title { font-size: 1.35em; font-weight: bold; line-height: 1em; height: 1.1em; padding-bottom: 1%; text-shadow: none; }
-.fresh-watch .advertisement-info .ad-badge { border-radius: 0.15em; font-size: 0.85em; font-weight: bold; padding: 1px 7px; text-shadow: none; text-transform: capitalize; background-color: rgb(231, 189, 0); }
-.fresh-watch .advertisement-info .remaining-duration, .fresh-watch .advertisement-info .ad-by { font-size: 1.13em; }
-.fresh-watch .advertisement-info .remaining-duration { padding: 0px 2%; }
-.fresh-watch .advertisement-info .advertisement-avatar { border-radius: 50%; display: inline-block; height: 3.065em; margin-right: 1.4em; width: 3.065em; background-size: contain; background-repeat: no-repeat; }
-.title-card { display: block; height: 25%; position: absolute; top: 0px; transition: transform 0.25s, opacity 0.25s; width: 100%; background: linear-gradient(rgba(0, 0, 0, 0.901961), rgba(0, 0, 0, 0.8), transparent); }
-.ypc-playback .title-card { height: 30%; }
-.title-card.hidden { opacity: 0; display: block !important; }
-.limited-animation .title-card.hidden { display: none !important; }
-.title-card .badges span { border: 1px solid rgb(221, 221, 221); border-radius: 2px; display: inline-block; font-size: 0.9em; margin-left: 1em; padding: 0px 0.5em; text-transform: uppercase; vertical-align: middle; }
-.title-card .badges span.live-badge { color: rgb(255, 255, 255); border: 0px; margin-left: 0px; background-color: rgba(230, 33, 23, 0.8); }
-.selected-title .views { margin-top: -0.6em; }
-.player-meta { color: rgb(241, 241, 241); margin: 2.6em 0px 0px 3.5em; white-space: nowrap; width: 90%; }
-.player-meta .user-details { position: absolute; right: 5%; }
-.player-meta .user-details > div { display: inline-block; vertical-align: top; }
-.player-meta .user-details .avatar { height: 4em; width: 4em; background-size: cover; }
-.player-meta .user-details .message { font-size: 80%; margin: 0.2em 1em 0px 1.1em; max-width: 50%; overflow: hidden; text-overflow: ellipsis; }
-.player-meta .player-video-text { display: inline-block; padding-left: 1.5em; width: 90%; }
-.player-meta .player-video-details { font-size: 1.5em; white-space: initial; }
-.player-meta .player-video-details > div { margin: 0.2em 1em 0px 0px; vertical-align: top; }
-.player-meta .player-video-details .username { max-width: 45%; overflow: hidden; text-overflow: ellipsis; }
-.player-meta .player-video-details .set-context { max-width: 45%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
-.player-meta .player-video-details .set-context, .player-meta .player-video-details .set-context-position, .player-meta .player-video-details .uploaded-date, .player-meta .player-video-details .view-count, .player-meta .player-video-details .badges, .player-meta .player-video-details .username { display: inline-block; }
-.player-video-avatar { border-radius: 50%; display: inline-block; height: 5.5em; vertical-align: top; width: 5.5em; background-size: contain; }
-.player-video-title { font-size: 2.4em; margin: -0.1em 0px 0px; overflow: hidden; text-overflow: ellipsis; }
-.quality-status { display: none; padding-top: 0.2em; }
-.title-tray-inflated .quality-status { display: inline-block; }
-.quality-status-hd-badge { border-radius: 2px; color: rgb(65, 65, 65); font-size: 0.6em; font-weight: bold; padding: 0.125em 0.5em; background: rgb(241, 241, 241); }
-.ypc-preview { display: none; }
-.ypc-playback .ypc-preview { display: block; }
-.player-controls #button-list .focused, .player-controls #button-list div:hover { border-radius: 0.05em; color: rgb(0, 0, 0); }
-.player-controls #button-list .focused { background-color: rgb(255, 255, 255); }
-.player-controls #button-list div:hover { background-color: rgb(157, 148, 149); }
-.player-controls #button-list .button, .player-controls #button-list .toggle-button { display: inline-block; font-size: 1.4em; height: 1.3em; margin: 1em; padding-bottom: 0.4em; padding-top: 0.8em; top: 0px; width: 2.3em; }
-.player-controls #button-list .button span, .player-controls #button-list .toggle-button span { font-family: roboto-regular; font-size: 0.7em; left: -10%; margin: 0.5em 0px 0px; width: 120%; height: 120%; }
-.player-controls #button-list .button.spacer { visibility: hidden; cursor: auto; }
-#transport-controls.focused .player-controls #button-list div { color: rgb(255, 255, 255); }
-#transport-controls.focused .player-controls #button-list .focused { color: rgb(34, 34, 34); }
-.player-controls #button-list div { color: rgb(170, 170, 170); cursor: pointer; vertical-align: middle; }
-#transport-controls.ad-active .player-controls #button-list div.disabled { visibility: hidden; }
-#transport-controls.ad-active .player-controls #button-list div.skip-ad-button.disabled { visibility: visible; opacity: 1; }
-.player-controls #button-list div.disabled:hover { color: rgb(255, 255, 255); background-color: transparent; }
-.player-controls #button-list div.focused { opacity: 1; }
-.player-controls #button-list div.disabled { opacity: 0.2; }
-.player-controls #button-list .icon-player-closedcaptions.toggle-selected, .player-controls #button-list .icon-like.toggle-selected, .player-controls #button-list .icon-dislike.toggle-selected { color: rgb(39, 147, 230) !important; }
-.player-controls #button-list .icon-logo-lozenge.toggle-selected { color: rgb(255, 0, 0) !important; }
-#transport-controls .player-controls #button-list div.icon-player-more, #transport-controls .player-controls #button-list div.icon-player-less { color: rgb(133, 133, 133); }
-.player-controls .toggle-button span, .player-controls .button span, .player-controls .toggle-button.disabled span, .player-controls .button.disabled span { display: none; margin-top: 1em; color: rgb(255, 255, 255); font-size: 0.75em; padding: 0px; position: relative; text-align: center; top: 1em; width: 100%; }
-.lang-case-sensitive .player-controls .button span::first-letter, .lang-case-sensitive .player-controls .toggle-button span::first-letter { text-transform: uppercase; }
-#transport-controls.focused, .player-controls .toggle-button.focused span, .player-controls div:hover.toggle-button span, .player-controls .button.focused span, .player-controls div:hover.button span { display: block; }
-.player-seekbar { position: relative; }
-.progress-bar { height: 4em; left: 11%; position: absolute; top: -9em; width: 75%; padding: 0px 1.5%; }
-.progress-bar .progress-bar-playhead, .progress-bar .progress-bar-line { top: 2.5em; }
-.progress-bar .progress-bar-line { position: relative; width: 100%; }
-.progress-bar .progress-bar-line div { height: 2px; position: absolute; }
-.progress-bar .progress-bar-playhead { height: 2px; position: relative; width: 100%; }
-.progress-bar .progress-bar-line .progress-bar-background { width: 100%; background-color: rgb(91, 91, 91); }
-.progress-bar .progress-bar-line .progress-bar-played { background-color: rgb(227, 44, 41); }
-.progress-bar .progress-bar-line .progress-bar-loaded { background-color: rgb(153, 153, 153); }
-.ypc-playback .progress-bar-line .progress-bar-played { background-color: rgb(39, 147, 230); }
-.progress-bar .progress-bar-disc { border-radius: 50%; height: 0.6em; margin: -0.25em 0px 0px -0.25em; position: absolute; width: 0.6em; background-color: rgb(204, 204, 204); }
-.progress-bar .cue-range-markers { height: 100%; position: absolute; width: 100%; }
-.progress-bar-disc { pointer-events: none; }
-.ad-active .progress-bar .cue-range-markers { visibility: hidden; }
-.progress-bar .cue-range-markers .cue-range-marker { height: 2px; margin: 0px 0px 0px -0.1em; position: absolute; width: 0.2em; background-color: rgba(255, 255, 255, 0); }
-.progress-bar .cue-range-markers .ad-marker { background-color: rgb(230, 188, 39); }
-.progress-bar.ad-active .progress-bar-played { background-color: rgb(214, 203, 35); }
-#player-time-elapsed, .player-time-total, .live-indicator { color: rgba(255, 255, 255, 0.74902); font-size: 1.2em; position: absolute; top: -6em; width: 12%; }
-.limited-graphics #player-time-elapsed, .limited-graphics .player-time-total { color: rgb(255, 255, 255); }
-#player-time-elapsed { left: 0px; text-align: right; }
-.player-time-total, .live-indicator { right: 0px; text-align: left; }
-#transport-controls.ad-active #player-time-elapsed, #transport-controls.ad-active .player-time-total { display: none; }
-.live-indicator { display: none; font-size: 1.3em; position: absolute; top: -5.6em; width: 11.7%; }
-.live-playback .live-indicator { display: block; }
-.live-playback .player-time-total, .live-playback .elapsed-time, .fresh-transport-controls.live-playback .player-time-total, .fresh-transport-controls.live-playback #player-time-elapsed { display: none; }
-.live-playback .progress-bar-disc { background-color: rgb(230, 33, 23); }
-#watch .loading-indicator { top: 30%; }
-#transport-spacer:hover { background: none; }
-.html5-video-controls { position: absolute; width: 100%; height: 0px; bottom: 2em; transition: all 0.6s ease; }
-.ytp-player-content { position: absolute; bottom: 0px; height: 0px; left: 0px; right: 0px; }
-.html5-video-content { position: absolute; }
-.caption-window { position: absolute; pointer-events: none; }
-.standard-caption-window { position: absolute; white-space: normal; width: 80%; }
-.caption-window-transform { display: inline-block; line-height: 1.32em; }
-.html5-video-player .captions-text { position: relative; }
-.html5-video-player .caption-row { padding-bottom: 5px; padding-top: 5px; }
-.anchor-point-1 { transform: translate(-50%, 0px); }
-.anchor-point-2 { transform: translate(-100%, 0px); }
-.anchor-point-3 { transform: translate(0px, -50%); }
-.anchor-point-4 { transform: translate(-50%, -50%); }
-.anchor-point-5 { transform: translate(-100%, -50%); }
-.anchor-point-6 { transform: translate(0px, -100%); }
-.anchor-point-7 { transform: translate(-50%, -100%); }
-.anchor-point-8 { transform: translate(-100%, -100%); }
-.anchor-point-0, .anchor-point-1, .anchor-point-2 { padding-top: 3em; }
-.watch.transport-showing .anchor-point-0, .watch.transport-showing .anchor-point-1, .watch.transport-showing .anchor-point-2 { padding-top: 9em; }
-.anchor-point-0, .anchor-point-3, .anchor-point-6 { padding-left: 3em; }
-.anchor-point-2, .anchor-point-5, .anchor-point-8 { padding-right: 3em; }
-.anchor-point-6, .anchor-point-7, .anchor-point-8, .eureka .watch.transport-showing .anchor-point-6, .eureka .watch.transport-showing .anchor-point-7, .eureka .watch.transport-showing .anchor-point-8 { padding-bottom: 3em; }
-.watch.transport-showing .anchor-point-6, .watch.transport-showing .anchor-point-7, .watch.transport-showing .anchor-point-8 { padding-bottom: 15em; }
-.watch.pivot-focused .anchor-point-6 { padding-bottom: 17.5em; }
-.watch.pivot-focused .anchor-point-7, .watch.pivot-focused .anchor-point-8 { padding-bottom: 16em; }
-.watch .ytp-fresca-module, .search-focused .watch.message .ytp-fresca-module { display: none; }
-.watch.message .ytp-fresca-module { color: rgb(255, 255, 255); display: block; font-size: 2em; padding-left: 1.5em; position: absolute; top: 30%; width: 100%; background-color: rgba(0, 0, 0, 0.498039); }
-.watch.message .ytp-fresca-show-countdown { padding-bottom: 1.3em; }
-.ytp-fresca-countdown { font-size: 1.4em; }
-.pivot-shelf-list { margin-top: 12.5em; padding-left: 7em; transition: transform 0.25s, opacity 0.25s; transform: translateY(10em); }
-.pivot-shelf-list.hidden { opacity: 0; display: block !important; }
-.limited-animation .pivot-shelf-list.hidden, .forced-limited-animation.pivot-shelf-list.hidden { display: none !important; }
-.pivot-shelf-list.animate-in { transform: translateY(0px); }
-.pivot-shelf-list > .carousel { opacity: 0.5; transition: opacity 0.25s; }
-.limited-memory .pivot-shelf-list { opacity: 1; }
-.pivot-shelf-list .title-container { color: rgb(255, 255, 255); }
-.pivot-shelf .tile-title .author, .pivot-shelf .tile-title .view { color: rgb(225, 225, 225); }
-.pivot-shelf-list.focused, .post-play .pivot-shelf-list { height: 17.5em; margin-top: 2.5em; padding-top: 10em; transform: translateY(-7.5em); background: linear-gradient(rgba(0, 0, 0, 0), rgb(0, 0, 0)); }
-.post-play .pivot-shelf { opacity: 0.5; }
-.post-play .pivot-shelf-list.focused .pivot-shelf, .pivot-shelf-list.focused > .carousel { opacity: 1; }
-.pivot-shelf-list .focused.list { height: 0px; }
-.pivot-shelf-list .no-content-message { display: none; }
-.pivot-shelf-list.forced-limited-animation, .limited-animation .pivot-shelf-list, .limited-animation .pivot-shelf-list > .carousel { transition: none; }
-.pivot-shelf-list.forced-limited-animation .placeholder-tile, .limited-animation .pivot-shelf-list .placeholder-tile { height: 7.83em; width: 14em; }
-#pivot-post-play .pivot-video-tile, #pivot-post-play .placeholder-tile { height: 10.625em; width: 18.5em; }
-#pivot-post-play .tile-top { height: 10.625em; }
-.limited-animation #pivot-post-play .tile-top, #pivot-post-play.forced-limited-animation .tile-top { height: 9.825em; width: 17.7em; }
-.pivo`t-video-tile, .pivot-channel-tile { height: 7.83em; width: 14em; }
-.forced-limited-animation .pivot-video-tile, .forced-limited-animation .pivot-auto-play-tile, .forced-limited-animation .pivot-channel-tile, .pivot-shelf-list.forced-limited-animation .placeholder-tile, #pivot-post-play.forced-limited-animation .placeholder-tile, .limited-animation .pivot-video-tile, .limited-animation .pivot-auto-play-tile, .limited-animation .pivot-channel-tile, .limited-animation #pivot-post-play .placeholder-tile, .limited-animation .pivot-shelf-list .placeholder-tile { display: inline-block; margin-right: 0.5em; position: relative; vertical-align: bottom; background: none; }
-.forced-limited-animation .pivot-channel-tile, .limited-animation .pivot-channel-tile { border-radius: 100%; width: 10.625em; }
-.forced-limited-animation .pivot-video-tile.focused, .forced-limited-animation .pivot-auto-play-tile.focused .pivot-video-tile, .limited-animation .pivot-video-tile.focused, .limited-animation .pivot-auto-play-tile.focused .pivot-video-tile { background-color: rgb(255, 255, 255); }
-.pivot-video-tile .tile-top { height: 7.83em; }
-.forced-limited-animation .pivot-video-tile .tile-top, .limited-animation .pivot-video-tile .tile-top { height: 7.03em; padding: 0.4em; width: 13.2em; background-color: inherit; }
-.forced-limited-animation .pivot-video-tile.focused .tile-top, .limited-animation .pivot-video-tile.focused .tile-top { background-color: rgb(255, 255, 255); }
-.pivot-video-tile .tile-overlay { color: rgb(255, 255, 255); display: none; height: 100%; margin-top: -7.83em; text-align: center; width: 100%; background-color: rgba(0, 0, 0, 0.498039); }
-.forced-limited-animation .pivot-video-tile .tile-overlay, .limited-animation .pivot-video-tile .tile-overlay { margin-top: -7.03em; }
-#pivot-post-play .pivot-video-tile .tile-overlay { margin-top: -10.625em; }
-.limited-animation #pivot-post-play .pivot-video-tile .tile-overlay, #pivot-post-play.forced-limited-animation .pivot-video-tile .tile-overlay { margin-top: -9.875em; }
-.pivot-video-tile.has-overlay .tile-overlay { display: block; }
-#pivot-post-play .pivot-video-tile.has-overlay .tile-overlay { opacity: 0; }
-#pivot-post-play.focused .pivot-video-tile.has-overlay .tile-overlay { opacity: 1; }
-.post-play .pivot-shelf-list .pivot-video-tile.has-overlay .label { display: none; }
-.post-play .pivot-shelf-list .pivot-video-tile.has-overlay .icon-player-play { font-size: 4em; }
-.post-play .pivot-shelf-list .pivot-video-tile.has-overlay .icon-player-play::before { content: ""; }
-.pivot-video-tile .tile-overlay .icon { font-family: youtube-icons; font-size: 3em; padding-top: 0.5em; }
-.pivot-video-tile .tile-overlay .label { font-size: 1.2em; }
-#pivot-post-play .pivot-video-tile .tile-overlay { color: rgb(225, 225, 225); }
-#pivot-post-play .pivot-video-tile .tile-overlay .icon { font-size: 4.5em; padding-bottom: 0.15em; padding-top: 0.4em; }
-#pivot-post-play .pivot-video-tile .tile-overlay .label, #pivot-post-play .pivot-video-tile .tile-overlay .icon { opacity: 0; transition: opacity 0.25s; }
-#pivot-post-play.focused .pivot-video-tile .tile-overlay .label, #pivot-post-play.focused .pivot-video-tile .tile-overlay .icon { opacity: 1; }
-.limited-animation #pivot-post-play .pivot-video-tile .tile-overlay .label, .limited-animation #pivot-post-play .pivot-video-tile .tile-overlay .icon, #pivot-post-play.forced-limited-animation .pivot-video-tile .tile-overlay .label, #pivot-post-play.forced-limited-animation .pivot-video-tile .tile-overlay .icon { transition: none; }
-.pivot-video-tile .video-thumb { height: 100%; width: 100%; background-size: 100%; background-position: 50% 50%; background-repeat: no-repeat; }
-.pivot-video-tile .decoration { margin-top: -2.1em; text-align: right; }
-.pivot-video-tile .duration { font-size: 1em; font-weight: bold; padding: 0.5em; background-color: rgba(0, 0, 0, 0.701961); }
-.pivot-auto-play-tile { height: 10.625em; overflow: visible; width: 18.5em; background: none; }
-.forced-limited-animation .pivot-auto-play-tile, .limited-animation .pivot-auto-play-tile { height: 10.625em; width: 18.5em; }
-.pivot-auto-play-tile .post-play-countdown { display: block; font-size: 1.8em; margin-left: 10.8em; opacity: 0; pointer-events: none; position: absolute; text-align: left; text-shadow: none; top: 0px; width: 17.5em; }
-.pivot-auto-play-tile.countdown-active .post-play-countdown { opacity: 1; pointer-events: inherit; }
-.pivot-auto-play-tile .details, .pivot-auto-play-tile .title { color: rgb(255, 255, 255); opacity: 0; pointer-events: none; }
-.pivot-auto-play-tile.focused .details, .pivot-auto-play-tile.focused .title { opacity: 1; pointer-events: inherit; }
-.pivot-auto-play-tile .title { font-size: 1.4em; margin-left: 14em; max-height: 2.5em; overflow: hidden; position: absolute; top: 2.2em; width: 20em; }
-.pivot-auto-play-tile .details { font-size: 1.1em; margin-left: 17.8em; position: absolute; top: 6em; width: 37em; }
-.pivot-auto-play-tile .details, .pivot-auto-play-tile .title, .pivot-auto-play-tile .post-play-countdown { transition: opacity 0.25s; }
-.limited-animation .pivot-auto-play-tile .details, .limited-animation .pivot-auto-play-tile .title, .limited-animation .pivot-auto-play-tile .post-play-countdown { transition: none; }
-#pivot-post-play .pivot-auto-play-tile .pivot-video-tile { padding-left: 0px; padding-top: 0px; }
-#pivot-post-play #post-play-list .no-content-message { display: none; }
-.forced-limited-animation .pivot-horizontal-list, .limited-animation .pivot-horizontal-list { margin-left: -15em; }
-.pivot-horizontal-list.focused .pivot-sliding-highlighter, .post-play #post-play-list.focused .pivot-sliding-highlighter { display: block; }
-.pivot-horizontal-list .pivot-sliding-highlighter, .post-play .pivot-sliding-highlighter { border: 0.5em solid rgb(255, 255, 255); box-shadow: rgb(0, 0, 0) 0.083em 0.083em 0.75em 0.167em inset; height: 7.5em; margin-left: -0.4em; margin-top: -0.4em; pointer-events: none; width: 13.8em; background: transparent; }
-.pivot-shelf { position: absolute; width: 0px; }
-.forced-limited-animation .pivot-shelf, .limited-animation .pivot-shelf { opacity: 0.5; position: relative; }
-.forced-limited-animation .pivot-shelf.focused, .limited-animation .pivot-shelf.focused { opacity: 1; }
-.limited-memory.limited-animation .pivot-shelf { opacity: 1; }
-.pivot-shelf .title-container { margin-bottom: 1em; visibility: hidden; white-space: nowrap; }
-.pivot-shelf .title-container .icon { font-family: youtube-icons; vertical-align: middle; }
-.pivot-shelf .tile-title span { display: inline-block; overflow: hidden; text-overflow: ellipsis; }
-.pivot-shelf.focused .title-container { visibility: visible; }
-.pivot-shelf .tile-title, .pivot-shelf .shelf-title { margin-bottom: 0.3em; }
-.pivot-shelf .tile-title { height: 1.7em; }
-.pivot-shelf .tile-title .title { font-size: 1.3em; max-width: 30em; }
-.pivot-shelf .tile-title .author, .pivot-shelf .tile-title .view { margin-left: 0.3em; max-width: 20em; }
-.pivot-shelf .tile-title .author, .pivot-sliding-highlighter .select { display: none; }
-.pivot-shelf.has-author .tile-title .author { display: inline-block; }
-.forced-limited-animation .pivot-horizontal-list .list, .limited-animation .pivot-horizontal-list .list { width: 98em; }
-.forced-limited-animation .postplay-horizontal-list .list, .limited-animation .postplay-horizontal-list .list { margin-left: -13.4em; width: 98em; }
-.forced-limited-animation .pivot-channel-tile.focused .tile-top, .limited-animation .pivot-channel-tile.focused .tile-top { background-color: rgb(255, 255, 255); }
-.forced-limited-animation .pivot-channel-tile .tile-top, .limited-animation .pivot-channel-tile .tile-top { height: 6.83em; padding: 0.4em; width: 6.83em; }
-.pivot-channel-tile .tile-top { border-radius: 50%; height: 7.83em; margin: 0px auto; overflow: hidden; width: 7.83em; background: none; }
-.pivot-channel-tile .tile-top .video-thumb { background-color: rgba(0, 0, 0, 0); }
-.pivot-channel-tile .video-thumb { border-radius: 50%; }
-.pivot-shelf .pivot-horizontal-list.channel-selected .pivot-sliding-highlighter { border-radius: 50%; height: 7.5em; margin-left: -0.3em; margin-top: -0.3em; transform: translateX(3.2em); width: 7.5em; }
-.pivot-shelf.channel-selected .shelf-title { visibility: hidden; }
-.pivot-footer { height: 9em; }
-.pivot-button-list { padding-top: 4em; }
-.pivot-button-list .icon-button { display: inline-block; padding: 0.5em 1em; }
-.pivot-button-list .icon-button .icon { font-family: youtube-icons; margin-right: 0.3em; }
-.pivot-footer.focused .pivot-button-list .icon-button.selected { background-color: rgb(255, 255, 255); }
-.pivot-button-list .icon-button span { color: rgb(255, 255, 255); font-size: 1.5em; }
-.pivot-footer.focused .pivot-button-list .icon-button.selected span { color: rgb(0, 0, 0); }
-#pivot-post-play { padding-left: 6em; padding-top: 10em; }
-.limited-animation #pivot-post-play, #pivot-post-play.forced-limited-animation { padding-left: 0px; }
-#pivot-post-play #post-play-list { font-size: 1.1em; margin-left: 0.1em; }
-.forced-limited-animation .pivot-auto-play-tile, .limited-animation .pivot-auto-play-tile { padding-left: 0px; vertical-align: bottom; }
-#pivot-post-play.forced-limited-animation .pivot-video-tile, .limited-animation #pivot-post-play .pivot-video-tile { vertical-align: bottom; }
-.forced-limited-animation .pivot-auto-play-tile .pivot-video-tile, .limited-animation .pivot-auto-play-tile .pivot-video-tile { display: block; position: absolute; }
-#pivot-post-play .pivot-sliding-highlighter { border-width: 0.5em; height: 9.9em; margin-top: 0px; width: 18.4em; }
-.limited-animation.sets-ui .exp-densityBrowse .auto-play-tile:not(.focused) .video-tile, .limited-animation .exp-densityBrowse .auto-play-tile.focused .video-tile, .limited-animation .exp-densityBrowse .auto-play-tile { background-color: inherit; }
-.limited-animation .exp-densityBrowse .auto-play-tile.focused .tile-top { background: rgb(255, 255, 255); }
-.limited-animation .exp-densityBrowse .auto-play-tile .post-play-countdown { top: -2.67em; }
-.loki-video-source { color: rgb(255, 255, 255); font-size: 1.5em; left: 5em; position: absolute; top: 2.6em; }
-.loki-title-card { bottom: 0px; display: block; height: 25%; position: absolute; width: 100%; background: linear-gradient(to top, rgba(0, 0, 0, 0.901961) 0%, rgba(0, 0, 0, 0.6) 80%, transparent 100%); }
-.loki-title-card .loki-metadata { color: rgb(241, 241, 241); height: 100%; margin-bottom: 2.6em; margin-left: 8em; overflow: hidden; white-space: nowrap; width: 100%; }
-.loki-metadata #loki-progress-bar { display: block; height: 2em; left: 8em; padding: 0px; position: absolute; top: -4em; width: 80%; }
-#loki-progress-bar .progress-bar-playhead { display: none; }
-.loki-metadata .loki-video-avatar { display: inline-block; height: 8em; width: 8em; background-size: contain; }
-.loki-metadata .loki-video-text { display: inline-block; height: 100%; margin: 0px 5em 0px 3.5em; width: 80%; }
-.loki-video-text .loki-video-title { font-size: 2.4em; margin-top: -0.1em; overflow: hidden; text-overflow: ellipsis; width: 80%; }
-.loki-video-text .loki-channel-name { font-size: 1.5em; margin-top: 0.4em; overflow: hidden; text-overflow: ellipsis; width: 80%; }
-.loki-video-text .loki-video-description { line-height: 1.4em; margin-top: 0.4em; max-height: 4.2em; overflow: hidden; white-space: normal; width: 80%; }
-.toaster { color: rgb(170, 170, 170); font-size: 133%; position: absolute; top: 0px; width: 100%; }
-.toaster .list { margin-top: 0.8em; position: absolute; width: 100%; }
-.toaster .toast { min-height: 3.5em; overflow: hidden; position: relative; text-align: center; width: 100%; transition: all 0.6s ease; }
-.toaster .toast-container { border: 1px solid black; display: inline-block; margin: 0.2em 0px 1em; max-width: 60%; opacity: 1; padding: 0.5em 1em 0.6em; transition: all 0.3s ease; background-color: rgba(27, 25, 26, 0.8); }
-.toaster .toast.toast-removing .toast-container { opacity: 0; }
-.toaster .toast-container > div { display: inline-block; vertical-align: middle; }
-.toaster .toast-icon { height: 1.2em; width: 1.2em; background-size: 1.1em 1.1em; background-position: 50% 50%; background-repeat: no-repeat; }
-.device-toast .toast-container { padding: 0.7em; }
-.toaster .device-toast .toast-msg { padding-left: 0.8em; background-size: 1.1em 1.1em; background-position: 0% 50%; background-repeat: no-repeat; }
-.toaster .avatar { height: 2.6em; width: 2.6em; }
-.toaster .avatar > div { height: inherit; width: inherit; background-size: cover; background-position: 50% 50%; }
-.toaster .video-image > div { height: 100%; width: 100%; background-size: cover; background-position: 50% 50%; }
-.toast .update-playlist-toast { bottom: 0px; max-width: 14em; padding: 0.8em; position: fixed; right: 0px; text-align: left; }
-.update-playlist-toast .overlay { height: 55%; margin-left: 56%; margin-top: -55%; opacity: 0.8; width: 44%; background: rgb(0, 0, 0); }
-.update-playlist-toast .video-count { font-size: 2.3em; font-weight: normal; line-height: 1.2em; padding-top: 0.8em; text-align: center; }
-.update-playlist-toast .icon-playlist { font-family: youtube-icons; font-size: 2.2em; height: 50%; overflow: hidden; padding: 0.2em; text-align: center; }
-.update-playlist-toast .avatar { padding: 0.3em; }
-.update-playlist-toast .contrast-container { padding: 0.4em; background-color: rgba(0, 0, 0, 0.8); }
-.update-playlist-toast .tile-top { height: 7.7em; width: 14em; }
-.update-playlist-toast .toast-msg { font-size: 85%; padding-left: 0.6em; }
-.update-playlist-toast .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 13.2em; }
-.update-playlist-toast .toast-msg.avatar { height: 2.1em; width: 10em; overflow: hidden; }
-.update-playlist-toast .toast-msg.truncate { white-space: normal; }
-.update-playlist-toast .toast-msg.no-user-avatar { font-size: 85%; margin-left: -2.2em; }
-.update-playlist-toast .wrapper > div { display: inline-block; vertical-align: middle; }
-.toaster .toast-icon { max-width: 100%; background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/dial-sprite.png); background-size: 100%; }
-.toast-icon.avatar { background-image: none; }
-.toaster .android-phone-connected { background-position: 0px 0%; }
-.toaster .android-phone-disconnected { background-position: 0px 10.14%; }
-.toaster .android-tablet-connected { background-position: 0px 20.29%; }
-.toaster .android-tablet-disconnected { background-position: 0px 30.43%; }
-.toaster .ios-phone-connected { background-position: 0px 40.58%; }
-.toaster .ios-phone-disconnected { background-position: 0px 50.72%; }
-.toaster .ios-tablet-connected { background-position: 0px 60.87%; }
-.toaster .ios-tablet-disconnected { background-position: 0px 71%; }
-.toaster .laptop-connected { background-position: 0px 81.16%; }
-.toaster .laptop-disconnected { background-position: 0px 91.3%; }
-.toaster .remote-connected { background-size: 233.33%; background-position: 0px 100%; }
-.toaster .remote-disconnected { background-size: 233.33%; background-position: 0px 100%; }
-.toaster .toast-progress { border: 1px solid rgb(170, 170, 170); width: 10em; }
-.toaster .toast-progress .progress { height: 1em; background-color: rgb(102, 102, 102); }
-.toaster .volume-muted { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/volume_mute_pressed.png); }
-.toaster .volume-low { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/volume_0_pressed.png); }
-.toaster .volume-mid { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/volume_1_pressed.png); }
-.toaster .volume-high { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/volume_2_pressed.png); }
-.toaster .volume-toast .toast-msg { text-align: right; width: 1.2em; }
-.toaster .volume-toast .toast-container { transition-delay: 0.3s; }
-.toaster .volume-toast.toast-removing .toast-container { transition-delay: 0s; }
-.unlimited-welcome-toast .toast-container { box-shadow: rgb(0, 0, 0) 0em 0em 0.6em 0.02em; height: 6.5em; margin: 0em; padding: 0px; position: fixed; right: 0px; text-align: left; top: 0px; width: 24.5em; transform: translateX(0px); opacity: 1; transition: all 0.6s ease; }
-.unlimited-welcome-toast.toast-displaying .toast-container { opacity: 0; transform: translateX(18em); }
-.limited-animation .unlimited-welcome-toast .toast-container { opacity: 1; transition: none; transform: none; }
-.unlimited-toast-messages { position: absolute; padding-top: 2.1em; padding-left: 1.3em; width: 12em; }
-.unlimited-toast-msg-top { color: rgb(221, 221, 221); line-height: 1em; }
-.unlimited-toast-msg-bottom { padding-top: 0.5em; font-size: 0.7em; }
-.unlimited-toast-background { height: 100%; width: 9em; background-size: 100%; background-position: 0% 50%; background-repeat: no-repeat; }
-.unlimited-toast-logo { height: 100%; background-size: 100%; background-repeat: no-repeat; }
-#dialog { color: rgb(255, 255, 255); display: none; height: 100%; left: 0px; position: absolute; top: 0px; width: 100%; }
-#error-markup #dialog { display: block; }
-#dialog.focused { display: block; }
-#dialog-wrapper { height: 30em; margin-top: 11.1em; padding: 1.3em 6em; position: relative; background-color: rgb(0, 0, 0); }
-#dialog.browse-sets #dialog-wrapper { height: 100%; margin-top: 0px; padding: 1.3em 10%; background-color: rgba(32, 32, 32, 0.498039); }
-#dialog .dialog-contents { background: 90% 30% no-repeat; }
-#dialog.browse-sets .dialog-contents .icon-simple-dialog { color: rgb(255, 255, 255); }
-#dialog .dialog-contents .dialog-large-icon { display: none; }
-#dialog.browse-sets .dialog-contents .dialog-large-icon { display: inline-block; font-family: youtube-icons; font-size: 10em; height: 2.5em; line-height: 2.5em; text-align: center; width: 35%; }
-#dialog.browse-sets .icon-simple-dialog .icon-dialog-content .extra-info { color: rgba(255, 255, 255, 0.74902); display: block; font-family: monospace; font-size: 1.5em; line-height: 1.4em; padding-top: 0.8em; }
-#dialog.browse-sets .icon-simple-dialog .icon-dialog-content .label { display: block; font-size: 1.8em; line-height: 1.1em; padding-top: 6.45em; }
-#dialog .dialog-contents .header .title { font-size: 2.5em; }
-#dialog.browse-sets.browse-sets-titled-dialog .dialog-contents .header { border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgba(255, 255, 255, 0.2); height: 3.4em; margin: 0px 1.5em; }
-#dialog.browse-sets.browse-sets-titled-dialog .dialog-contents .header .title { color: rgba(255, 255, 255, 0.498039); display: block; font-size: 1.3em; font-weight: 300; height: 3em; line-height: 3em; }
-#dialog.browse-sets .buttons { font-size: 1.8em; margin-right: 2%; margin-top: 0.8em; text-align: right; }
-#dialog.browse-sets .connection-steps { padding: 0px; }
-#dialog.browse-sets.exit .dialog-contents .header .title { display: block; padding: 1em 6.5em 3em; }
-#dialog.browse-sets .dialog-contents { height: 80%; margin-top: 5%; background-color: rgb(0, 0, 0); }
-#dialog.browse-sets.closed-captions .dialog-contents { height: 75%; }
-#dialog.browse-sets .dialog-cancel-button { text-align: center; }
-.video-overview .dialog-contents { font-size: 2em; }
-#dialog.qr-dialog .dialog-contents { color: rgb(204, 204, 204); font-size: 1.1em; overflow: hidden; padding-top: 4em; }
-#dialog.qr-dialog .dialog-contents .header .title { color: rgb(255, 255, 255); font-size: 2em; }
-#dialog .box { padding-top: 1.5em; }
-#dialog.qr-dialog a { color: rgb(255, 255, 255); display: block; font-size: 1.5em; }
-#dialog.qr-dialog .qr { height: 7em; margin: 0.2em 0px; width: 7em; background-size: 100%; }
-#dialog.qr-dialog .dialog-icon { display: block; background-size: 12em; }
-#dialog.help .dialog-icon { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-help.png); }
-#dialog.feedback .dialog-icon { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-feedback.png); }
-#dialog.system-error .dialog-icon { font-family: youtube-icons; font-size: 10em; margin-right: 0px; padding-right: 0.5em; padding-top: 0.5em; text-align: right; width: 2em; }
-#dialog.system-error .dialog-icon::before { content: ""; }
-#dialog.qr-dialog.browse-sets .dialog-icon { display: none; }
-#dialog .text-dialog { bottom: 1.5em; left: 0px; padding: 2em 20em 0px 6em; position: absolute; white-space: normal; }
-#dialog.text-dialog .dialog-contents .header .title { font-size: 3em; padding-bottom: 0.5em; }
-.text-dialog #dialog-view { color: rgb(170, 170, 170); padding-bottom: 1em; width: 90%; }
-.text-dialog #dialog-view .dialog-contents { font-size: 1.8em; }
-#dialog.browse-sets .icon-dialog-content { display: inline-block; height: 25em; vertical-align: top; width: 60%; }
-#dialog-view .url { color: rgb(255, 255, 255); font-size: 1.25em; padding-bottom: 0.8em; }
-#dialog-view .flag-claim .url { padding-bottom: 0.5em; }
-#dialog-view .reset-help { display: block; width: 25em; }
-#dialog.browse-sets .tos-dialog .icon-dialog-content { padding-top: 9em; }
-#dialog.browse-sets .tos-dialog .icon-dialog-content .subtitle { color: rgb(170, 170, 170); }
-#dialog.browse-sets .tos-dialog .icon-dialog-content .url { font-size: 2em; }
-#dialog.browse-sets.qr-dialog .dialog-contents { padding-top: 0px; }
-#dialog.browse-sets.qr-dialog .icon-dialog-content .link { margin-top: 5em; padding-top: 0px; }
-#dialog.browse-sets.qr-dialog .icon-dialog-content .qr-code-wrapper { margin-top: 2em; }
-#dialog.browse-sets.qr-dialog .icon-dialog-content .qr-code-wrapper .qr { border: 0.2em solid rgba(255, 255, 255, 0.0980392); padding: 0.5em; }
-#dialog .signed-out-dialog { font-size: 1.8em; }
-.connection-error, .connection-steps { display: inline-block; font-weight: 300; padding: 0px 1em 1em 2em; white-space: normal; }
-.connection-error { vertical-align: top; }
-.connection-error div { margin-bottom: 1em; }
-#dialog .login-dialog .activation-code { font-size: 1.3em; letter-spacing: 0.1em; line-height: 1.3em; }
-#dialog .sets-login-dialog .body-text { display: inline-block; height: 25em; vertical-align: top; width: 50%; }
-#dialog .sets-login-dialog .body-text .connection-instructions { font-size: 1.9em; margin-top: 3.5em; }
-#dialog .sets-login-dialog .standard-message, #dialog .sets-login-dialog .like-dislike-message, #dialog .sets-login-dialog .subscribe-message, #dialog .sets-login-dialog .upload-message, #dialog .sets-login-dialog .player-message { display: none; }
-#dialog.standard-login .sets-login-dialog .standard-message, #dialog.like-dislike-login .sets-login-dialog .like-dislike-message, #dialog.subscribe-login .sets-login-dialog .subscribe-message, #dialog.upload-login .sets-login-dialog .upload-message, #dialog.player-login .sets-login-dialog .player-message { display: block; }
-#dialog .pairing .qr-code-wrapper { display: inline-block; vertical-align: top; }
-#dialog .manual-connect-content .connection-steps { padding: 0px; }
-#dialog .manual-connect-content .connection-steps .label { color: rgb(170, 170, 170); font-size: 0.7em; margin-top: 1em; }
-#dialog .manual-connect-content .connection-steps .step1, #dialog .manual-connect-content .connection-steps .step2 { margin-top: 0.7em; }
-#dialog .manual-connect-content .connection-steps .pair-url, #dialog .manual-connect-content .connection-steps .pair-code { margin-left: 0.3em; }
-#dialog.browse-sets .manual-connect-content .connection-steps .label { font-size: 1.3em; }
-#dialog.browse-sets .manual-connect-content .connection-steps .step1, #dialog.browse-sets .manual-connect-content .connection-steps .step2 { display: inline-block; font-size: 1.3em; }
-#dialog.browse-sets .manual-connect-content .connection-steps .pair-url, #dialog.browse-sets .manual-connect-content .connection-steps .pair-code { display: inline-block; font-size: 1.3em; margin-left: 0.3em; }
-#dialog.browse-sets .pairing .connection-instructions { font-size: 1em; padding-top: 10em; }
-#dialog .manual-connect .dial-upsell-content { display: none; }
-#dialog .dial-upsell .manual-connect-content .connection-steps .no-dial-connect-step1, #dialog .manual-connect .manual-connect-content .connection-steps .with-dial-connect-step1 { display: none; }
-#dialog .manual-connect .manual-connect-content .connection-steps { font-size: 1.5em; }
-#dialog .manual-connect .manual-connect-content .connection-steps .label { display: none; }
-#dialog.browse-sets .dial-upsell .dial-upsell-content { font-size: 1.8em; white-space: normal; width: 80%; }
-#dialog.browse-sets .dial-upsell .dial-upsell-content .cast-icon { height: 1.3em; margin: 0px; width: 1.5em; }
-#dialog.browse-sets .dial-upsell .manual-connect-content { color: rgb(170, 170, 170); font-size: 1.4em; line-height: 1em; }
-#dialog.browse-sets .remote-reset-dialog .connected-list .connected-header { color: rgb(255, 255, 255); font-size: 1.5em; margin-top: 6em; }
-#dialog.browse-sets .remote-reset-dialog .connected-list .devices { display: inline-block; font-size: 1em; }
-#dialog.browse-sets .remote-reset-dialog .connected-list .devices > div { display: inline-block; font-size: 1em; padding-left: 0px; padding-right: 1.5em; width: 10em; }
-#dialog.browse-sets .remote-reset-dialog .reset-help { font-size: 1.5em; margin-top: 1em; }
-#dialog .logout-authenticated-info { padding: 2.5em 0px; }
-#dialog .login-user-icon { display: inline-block; height: 4em; margin: 2em 2em 0px 0px; width: 4em; background-size: cover; }
-#dialog.browse-sets .login-user-icon { margin: 0px 15%; border-radius: 20em; }
-#dialog .login-user-info { display: inline-block; margin-left: 1.7em; margin-top: -0.8em; font-size: 2em; font-weight: 300; width: 82%; }
-#dialog .login-user-info h3 { font-size: 2.2em; font-weight: normal; margin: 0px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
-#dialog.browse-sets .logout-authenticated-info { padding: 0px; }
-#dialog.browse-sets .login-user-info { height: 13em; margin: 0px; width: 100%; }
-#dialog.browse-sets .login-user-info .display-name, #dialog.browse-sets .login-user-info .platform-container { display: none; }
-#dialog.browse-sets .login-user-info .signed-in-message { display: inline-block; width: 50%; }
-#dialog.browse-sets .login-user-info .signed-in-label strong { color: rgb(255, 255, 255); display: block; font-size: 2.5em; overflow: hidden; text-overflow: ellipsis; }
-#dialog.browse-sets .login-user-info .signed-in-label { color: rgb(170, 170, 170); font-size: 0.5em; margin-top: 10em; }
-#dialog.browse-sets .login-user-info .sign-out-label { margin-top: 1em; }
-#dialog .spinner { height: 10em; width: 10em; }
-#dialog .spinner .loading-indicator { height: 100%; width: 100%; background-size: contain; }
-#dialog .buttons { font-size: 3em; font-weight: 300; padding-top: 0.3em; }
-#dialog .buttons > div { color: rgb(0, 0, 0); cursor: pointer; display: inline-block; min-width: 2.4em; padding: 0px 0.3em; text-align: center; background-color: rgb(51, 51, 51); }
-#dialog.browse-sets .buttons .button { color: rgba(255, 255, 255, 0.498039); min-width: 3em; padding: 0.2em 0.8em; background-color: rgb(0, 0, 0); }
-#dialog.browse-sets .buttons .focused, #dialog.browse-sets .buttons .button.focused:hover { color: rgb(102, 102, 102); background-color: rgb(241, 241, 241); }
-#dialog .buttons .button:hover, #dialog.browse-sets .buttons .button:hover { background-color: rgb(102, 102, 102); }
-#dialog .buttons div { margin-left: 0.5em; }
-#dialog .buttons .focused, #dialog .buttons .focused:hover { color: rgb(102, 102, 102); background-color: rgb(241, 241, 241); }
-#dialog .whichOneIsThis-logout-dialog .logout-prompt { font-size: 1.7em; }
-#dialog .logout-prompt { margin-top: 6em; }
-.scrolling-text { font-size: 1.3em; height: 15em; margin-right: 1.1em; margin-top: 1em; overflow: hidden; }
-.scrolling-text h4 { margin: 0px; padding: 0px; }
-.scrolling-text > div { overflow: hidden; padding-bottom: 1em; }
-.flag-list-container { margin-top: 0.5em; }
-.flag-list .button { color: rgb(134, 134, 134); cursor: pointer; display: inline-block; font-size: 1.8em; padding: 0.4em; vertical-align: top; }
-.flag-list .button { width: 12em; }
-.flag-list .button:hover { background-color: rgb(68, 68, 68); }
-.flag-list .button.focused, .flag-list .button.focused:hover { color: rgb(103, 103, 103); background-color: rgb(255, 255, 255); }
-#flag-widget { font-weight: 300; }
-.flag-video { color: rgb(103, 103, 103); font-size: 1.8em; font-weight: 300; padding-top: 1em; width: 47%; }
-.flag-video .url { color: rgb(255, 255, 255); display: block; font-size: 1.6em; padding-top: 0.5em; }
-.flag-example { display: inline-block; height: 57%; position: absolute; right: 18%; top: 9%; width: 23%; background: url(www.youtube.com/s/tv/html5/f0d770f4/img/flag.png) 0px 0px / contain no-repeat; }
-.flag-claim .metadata { display: block; font-size: 1em; font-weight: 500; padding-top: 0.2em; white-space: normal; }
-.flag-claim .url { color: rgb(134, 134, 134); display: block; font-weight: 300; }
-.flag-claim { color: rgb(103, 103, 103); font-size: 1.6em; font-weight: 300; margin: 1em 0px 0px 2em; white-space: nowrap; }
-.flag-claim .copyright-infringment { display: inline-block; white-space: normal; width: 50%; }
-.flag-claim .privacy-invasion { display: inline-block; margin-left: 4%; vertical-align: top; white-space: normal; width: 40%; }
-.flag-claim .email { color: rgb(134, 134, 134); }
-.flag-claim .subtitle { font-size: 1.2em; font-weight: 500; }
-.player-error-dialog.player-error { color: rgb(170, 170, 170); font-size: 1.8em; padding: 1em 0px 8em 0em; }
-#dialog .scrollbar { height: 70%; margin-top: 5em; right: 5em; }
-#dialog .scrollbar .handle { height: 5em; }
-.paid-channel-info { font-size: 1.4em; padding-top: 1em; }
-.paid-channel-info .channel-url { font-weight: bold; }
-.status-dialog #dialog-wrapper { background-color: rgba(0, 0, 0, 0.498039); }
-.status-dialog .icon { display: inline-block; height: 11em; vertical-align: middle; width: 25%; background: url(www.youtube.com/s/tv/html5/f0d770f4/img/pairing-promo-combo.png) 50% 50% / contain no-repeat; }
-.status-dialog .info { display: inline-block; padding-left: 0.5em; vertical-align: middle; width: 70%; }
-.status-dialog .message { color: rgb(204, 204, 204); font-size: 2em; }
-.status-dialog #dialog-view { padding-top: 7em; }
-.dialog-focused #legend { bottom: 12%; display: block; }
-#legend.legend-for-dialog-closed-captions { bottom: 6%; }
-#dialog.confirm-cookies .dialog-contents .header .title { font-size: 3em; }
-#dialog.confirm-cookies #dialog-view { color: rgb(170, 170, 170); font-size: 1.8em; height: 8em; padding-top: 0.9em; }
-.single-pane-selector { padding-bottom: 1em; padding-top: 1em; white-space: nowrap; }
-.single-pane-selector .list { display: inline-block; margin-right: 0.5em; padding-left: 0.5em; padding-right: 0.5em; vertical-align: top; width: 94%; }
-.single-pane-selector .button .label { width: 90%; }
-.single-pane-selector .check-button.previously-selected .icon-check { display: inline-block; }
-.split-pane-selector { border-bottom-width: 0.1em; border-bottom-style: solid; border-bottom-color: rgba(255, 255, 255, 0.2); padding-bottom: 1em; padding-top: 1em; white-space: nowrap; }
-.check-button .icon-check { display: none; font-family: youtube-icons; }
-.single-pane-selector .labeled-value, .split-pane-selector .labeled-value { color: rgb(134, 134, 134); font-size: 1.4em; height: 2.8em; line-height: 1.5em; overflow: hidden; padding: 0px 1em; white-space: normal; }
-.single-pane-selector .labeled-value .value, .split-pane-selector .labeled-value .value { color: rgb(102, 102, 102); display: block; font-size: 0.7em; line-height: 1.4em; }
-.single-pane-selector .button, .split-pane-selector .button { color: rgb(134, 134, 134); cursor: pointer; font-size: 1.4em; height: 2.8em; line-height: 2.8em; overflow: hidden; padding: 0px 0.4em; white-space: normal; }
-.single-pane-selector .button .label, .split-pane-selector .button .label { display: inline-block; line-height: 1.3em; vertical-align: middle; }
-.single-pane-selector .subtitled-button, .split-pane-selector .subtitled-button { line-height: 1.5em; }
-.single-pane-selector .button.no-model, .split-pane-selector .button.no-model { visibility: hidden; }
-.split-pane-selector .list { display: inline-block; vertical-align: top; width: 47%; }
-.split-pane-selector .list:first-child { border-right-width: 0.1em; border-right-style: solid; border-right-color: rgba(255, 255, 255, 0.2); margin-right: 0.5em; padding-right: 0.5em; }
-.single-pane-selector .button:hover, .single-pane-selector .list:not(.focused) .button.selected, .split-pane-selector .button:hover, .split-pane-selector .list:not(.focused) .button.selected { color: rgb(255, 255, 255); background-color: rgb(68, 68, 68); }
-.single-pane-selector .button.focused, .single-pane-selector .button.focused:hover, .split-pane-selector .button.focused, .split-pane-selector .button.focused:hover { color: black; background-color: rgb(255, 255, 255); }
-.single-pane-selector .subtitled-button span.subtitle, .split-pane-selector .subtitled-button span.subtitle { color: rgb(102, 102, 102); display: block; font-size: 0.7em; line-height: 1.4em; }
-.color-button .preview { border: 2px solid rgb(0, 0, 0); color: rgb(134, 134, 134); display: inline-block; height: 1em; margin: 0px 0.2em 0.2em; vertical-align: middle; width: 1em; }
-.color-button .preview.rounded { border-radius: 50%; }
-.preview.black { border: 1px solid rgb(255, 255, 255); background-color: rgb(0, 0, 0); }
-.preview.red { background-color: rgb(255, 0, 0); }
-.preview.magenta { background-color: rgb(255, 0, 255); }
-.preview.blue { background-color: rgb(0, 0, 255); }
-.preview.cyan { background-color: rgb(0, 255, 255); }
-.preview.green { background-color: rgb(0, 255, 0); }
-.preview.yellow { background-color: rgb(255, 255, 0); }
-.preview.white { background-color: rgb(255, 255, 255); }
-.debug-dialog { font-size: 0.9em; }
-.debug-dialog span.label { font-weight: bold; }
-#dialog.browse-sets .video-upload-dialog-contents { display: inline-block; font-size: 1.6em; margin: 1em 3% 0px; text-align: left; vertical-align: top; width: 55%; }
-#dialog.browse-sets .modify-video .video-upload-dialog-contents { margin-top: 2em; text-align: center; }
-.video-upload-status .video-url { color: rgb(39, 147, 230); }
-.delete-video { padding-bottom: 6em; }
-.modify-video .list .button { color: rgb(132, 132, 132); display: inline-block; height: 8em; margin-right: 1em; text-align: center; width: 8em; background-size: 60% 60%; background-position: 50% 20%; background-repeat: no-repeat; }
-.modify-video .list .button.focused { color: rgb(40, 40, 40); background-color: rgb(255, 255, 255); }
-.modify-video .list .button span { display: block; font-size: 1.2em; margin: 4.6em 0.5em 0.5em; overflow: hidden; white-space: nowrap; }
-.modify-video .modify-edit-button { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_light.png); }
-.modify-video .modify-edit-button.focused { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_dark.png); }
-.modify-video .modify-delete-button { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_light.png); }
-.modify-video .modify-delete-button.focused { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_dark.png); }
-.delete-video-dialog .video-tile .details, .modify-video .video-tile .details { margin-top: -0.1em; }
-.browse-sets #modify-list .button { height: 7.5em; margin-right: 0.9em; width: 7.5em; }
-.browse-sets #modify-list .button span { font-size: 1.1em; margin-top: 5.2em; }
-.delete-video-dialog { margin-bottom: 14em; }
-.browse-sets .delete-video-dialog { margin-bottom: 1em; }
-.video-processing, .video-upload-error { font-size: 1.5em; }
-.video-upload-error .error-container { color: rgb(170, 170, 170); margin-top: 1em; }
-#dialog .buttons .upload-terms, #dialog .buttons .upload-terms:hover { color: rgb(85, 85, 85); display: block; font-size: 0.6em; margin-left: 1.5em; text-align: left; background-color: rgb(0, 0, 0); }
-.upload-progress { margin-bottom: 1em; width: 100%; }
-.upload-progress-value { text-align: left; width: 100%; }
-.upload-progress span { margin-left: -1em; position: relative; width: 4em; }
-.upload-progress .upload-progress-bar { width: 100%; background-color: rgb(170, 170, 170); }
-.upload-progress .upload-progress-bar .completed { height: 1em; background-color: rgb(39, 147, 230); }
-.privacy-button { cursor: pointer; position: relative; background: 0.4em 50% / 1.5em no-repeat; }
-.privacy-button .checkbox { height: 2em; left: 85%; position: absolute; top: 0px; width: 2em; background-size: 2em; background-position: 100% 50%; }
-.privacy-button.checked .checkbox { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-light.png); }
-.privacy-button.focused.checked .checkbox { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-dark.png); }
-.privacy-button .label .name { line-height: 1.5em; text-indent: 1.8em; background-size: 2em; background-position: 0px 0.5em; }
-.privacy-button .description { font-size: 0.6em; line-height: 0.8em; padding-left: 2.9em; }
-.privacy-button .name { font-size: 1em; line-height: 1.2em; padding-left: 1.7em; }
-.private-state, .video-tile .private { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-light.png); }
-.private-state.focused { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-dark.png); }
-.public-state, .video-tile .public { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-light.png); }
-.public-state.focused { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-dark.png); }
-.unlisted-state, .video-tile .unlisted { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-light.png); }
-.unlisted-state.focused { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-dark.png); }
-.video-tile .private, .video-tile .public, .video-tile .unlisted { min-height: 1.5em; min-width: 1.5em; padding-left: 1.5em; background-size: 1.5em; background-position: 0% 50%; background-repeat: no-repeat; }
-.video-privacy .button, .video-overview .button { display: inline-block; height: 2em; line-height: 2em; margin: 0.1em 0px; overflow: hidden; padding: 0.1em 0.5em; vertical-align: top; white-space: nowrap; width: 65%; }
-.video-privacy .button { width: 85%; }
-.video-overview .button:first-child { width: 20%; }
-.video-privacy .button.focused, .video-privacy .button:not(.disabled):hover, .video-overview .button.focused, .video-overview .button:not(.disabled):hover { color: rgb(103, 103, 103); background-color: rgb(255, 255, 255); }
-#dialog.browse-sets .video-privacy .button:nth-child(2) { width: 11em; }
-#dialog.browse-sets .video-uploads { margin: 3em 1em 2em; }
-#dialog.browse-sets .video-uploads .carousel { overflow: hidden; }
-#dialog.browse-sets .video-uploads .carousel .video-tile .details { text-align: left; }
-.video-overview .title-button { line-height: 1em; white-space: normal; }
-#dialog.browse-sets .video-overview .title-button .label { display: inline-block; line-height: 2em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 95%; }
-.video-overview .channel-button { line-height: 2em; overflow: hidden; text-indent: 1.8em; text-overflow: ellipsis; background-size: 1.5em; background-position: 0.35em 50%; background-repeat: no-repeat; }
-.video-uploads .carousel { height: 20em; position: relative; white-space: nowrap; }
-.video-tile-container { display: inline-block; margin-top: 1.7em; text-align: right; width: 35%; }
-.video-tile-container .video-tile { border: 0.1em solid rgba(255, 255, 255, 0.2); display: inline-block; height: 22em; position: static; text-align: left; width: 20em; }
-.video-tile-container .video-tile .tile-top { height: 51%; }
-.video-tile-container .video-tile .tile-bottom .details { height: inherit; }
-.video-uploads .carousel .video-tile { height: 20em; width: 18em; }
-.video-uploads .video-tile .decoration { top: 7em; }
-.video-tile-container .video-tile .tile-bottom, .video-uploads .video-tile .tile-bottom { width: initial; }
-.dialog.closed-captions #dialog-wrapper { margin-top: 5em; }
-#dialog.closed-captions-language-only #dialog-wrapper { padding: 1.6em 26%; }
-#dialog.closed-captions-language-only #options-list { display: none; }
-#legend.legend-for-dialog-closedCaptionsDialog { bottom: 24%; }
-#dialog.closed-captions-language-only ~ #legend { right: 29%; }
-.simple-dialog { margin: 3em; font-size: 1.6em; }
-.lang-ja_JP .connection-instructions .step1, .lang-ja_JP .connection-instructions .step2, .lang-ko_KR .connection-instructions .step1, .lang-ko_KR .connection-instructions .step2, .lang-zh_CN .connection-instructions .step1, .lang-zh_CN .connection-instructions .step2, .lang-zh_HK .connection-instructions .step1, .lang-zh_HK .connection-instructions .step2, .lang-zh_TW .connection-instructions .step1, .lang-zh_TW .connection-instructions .step2 { font-size: 0.8em; }
-.lang-de_DE .action-tile .content .title, .lang-el_GR .action-tile .content .title, .lang-es_ES .action-tile .content .title, .lang-es_MX .action-tile .content .title, .lang-fr_FR .action-tile .content .title, .lang-fr_CA .action-tile .content .title, .lang-ko_KR .action-tile .content .title, .lang-nl_NL .action-tile .content .title, .lang-pl_PL .action-tile .content .title, .lang-pt_BR .action-tile .content .title, .lang-pt_PT .action-tile .content .title, .lang-ru_RU .action-tile .content .title, .lang-uk_UA .action-tile .content .title { font-size: 2em; }
-.lang-it_IT .action-tile .content .title { font-size: 1.8em; }
-.lang-es_ES .action-tile .improve-yt-tile .title, .lang-fr_CA .action-tile .history-tile .title, .lang-fr_FR .action-tile .history-tile .title, .lang-de_DE .action-tile .terms-tile .title, .lang-fr_CA .action-tile .terms-tile .title, .lang-fr_FR .action-tile .terms-tile .title { font-size: 1.7em; }
-.lang-es_ES .action-tile .videoinfo-tile .title, .lang-es_MX .action-tile .videoinfo-tile .title, .lang-fr_CA .action-tile .videoinfo-tile .title, .lang-fr_FR .action-tile .videoinfo-tile .title, .lang-pt_BR .action-tile .videoinfo-tile .title { font-size: 1.5em; white-space: normal; }
-.lang-de_DE .action-tile .videoinfo-tile .title { font-size: 1.45em; padding-left: 0.5em; padding-right: 0.5em; white-space: normal; }
-.lang-es_ES .action-tile .videoinfo-tile .label, .lang-es_MX .action-tile .videoinfo-tile .label, .lang-fr_CA .action-tile .videoinfo-tile .label, .lang-fr_FR .action-tile .videoinfo-tile .label, .lang-pt_BR .action-tile .videoinfo-tile .label { padding-top: 0.6em; }
-.lang-de_DE .action-tile .videoinfo-tile .label { font-size: 1.6em; padding-top: 0.7em; }
-.lang-ja_JP .action-tile .terms-tile .title { font-size: 2em; }
-.lang-ja_JP #transliteration .list { font-size: 1.2em; }
-.lang-ja_JP #keyboard-grid { font-size: 1.5em; }
-.lang-ja_JP #keyboard-spacebar { margin-left: 5.5em; }
-.lang-zh_CN #search .horizontal-list, .lang-zh_HK #search .horizontal-list, .lang-zh_TW #search .horizontal-list, .lang-ja_JP #search .horizontal-list { transform: translateY(9.5em); }
-.lang-ko_KR #search .horizontal-list { transform: translateY(10.5em); }
-.lang-ko_KR #search-keyboard { font-size: 1.82em; }
-.lang-ko_KR #letter-suggest .button { width: 1em; }
-.lang-ko_KR #keyboard-grid, .lang-ru_RU #keyboard-grid, .lang-uk_UA #keyboard-grid { margin-top: 0.3em; }
-.lang-ko_KR #keyboard-grid.lang-ko .numbers-toggle-tile.button, .lang-ru_RU #keyboard-grid.lang-ru .numbers-toggle-tile.button, .lang-uk_UA #keyboard-grid.lang-ua .numbers-toggle-tile.button { font-size: 0.75em; }
-.lang-ko_KR #keyboard-grid .button, .lang-ru_RU #keyboard-grid .button, .lang-uk_UA #keyboard-grid .button { height: 1.2em; line-height: 1.1em; margin-top: 0.6em; }
-.lang-ko_KR #letter-suggest .button, .lang-ru_RU #letter-suggest .button, .lang-uk_UA #letter-suggest .button { height: 1.2em; line-height: 1.1em; width: 1.2em; }
-.lang-ko_KR .search-state #spinner, .lang-ru_RU .search-state #spinner, .lang-uk_UA .search-state #spinner, .lang-ja_JP .search-state #spinner { top: 25em; }
-.lang-ko_KR .search-state .application-message, .lang-ru_RU .search-state .application-message, .lang-uk_UA .search-state .application-message, .lang-ja_JP .search-state .application-message { top: 55%; }
-.lang-ru_RU #keyboard-grid.lang-ru .button, .lang-uk_UA #keyboard-grid.lang-ua .button, .lang-ko_KR #keyboard-grid, .lang-ko_KR #letter-suggest, .lang-ko_KR #keyboard-spacebar { font-size: 1em; }
-.lang-ru_RU #keyboard-spacebar, .lang-uk_UA #keyboard-spacebar { margin-left: 4.2em; }
-.lang-de_DE .countdown-ad-callout .time-left-label, .lang-de_DE .countdown-ad-callout .skip-time-label { font-size: 1.1em; }
-.lang-cs_CZ .action-tile .description, .lang-de_DE .action-tile .description, .lang-hi_IN .action-tile .description, .lang-pl_PL .action-tile .description, .lang-pt_BR .action-tile .description, .lang-pt_PT .action-tile .description, .lang-ru_RU .action-tile .description, .lang-uk_UA .action-tile .description { font-size: 1.3em; }
-.lang-de_DE .guide-button.footer .guide-button-title { width: 27.81em; }
-.lang-de_DE .guide-user-name { width: 13.5em; }
-.lang-nl_NL .guide-button.disabled .guide-button-title, .lang-de_DE .guide-button.disabled .guide-button-title, .lang-fr_FR .guide-button.disabled .guide-button-title, .lang-pt_PT .guide-button.disabled .guide-button-title { width: 13em; }
-.lang-tr_TR #search #keyboard-grid .button.clear-query-tile, .lang-tr_TR .action-tile .title, .lang-tr_TR .guide-button-icon, .lang-tr_TR #keyboard-grid .button, .lang-tr_TR .tile-top .badge, .lang-tr_TR .tile-top .duration, .lang-tr_TR .title-card .badges span .lang-tr_TR.lang-case-sensitive .player-controls .button span::first-letter, .lang-tr_TR.lang-case-sensitive .player-controls .toggle-button span::first-letter, .lang-tr_TR.lang-case-sensitive .snap-controls .speakable span::first-letter, .lang-tr_TR.lang-case-sensitive .voice-command::first-letter { text-transform: none; }
-.voice-command { display: none; }
-.lang-case-sensitive .voice-command::first-letter { text-transform: uppercase; }
-.engaged .voice-command { color: rgb(93, 194, 30); display: block; font-size: 1em; background-color: rgba(22, 22, 22, 0.701961); }
-.engaged .horizontal-list .carousel .voice-command { display: none; }
-.engaged .horizontal-list.focused .carousel .voice-command { display: block; }
-.engaged .pivot-video-tile .voice-command, .engaged .pivot-channel-tile .voice-command { display: none; }
-.engaged .pivot-video-tile.speakable .voice-command, .engaged .pivot-channel-tile.speakable .voice-command { display: block; }
-.engaged .video-tile .voice-command, .engaged .pivot-video-tile .voice-command, .engaged .pivot-channel-tile .voice-command, .engaged .playlist-tile .voice-command, .engaged .channel-tile .voice-command { bottom: 50%; font-size: 1.5em; margin-top: -2.17em; padding: 0.5em 0.9em; opacity: 0.999; }
-.engaged .video-tile.disabled .voice-command, .engaged .pivot-video-tile.disabled .voice-command, .engaged .pivot-channel-tile.disabled .voice-command { display: none; }
-.engagement-indicator { bottom: 0.8em; display: none; font-size: 1.5em; left: 1.8em; position: absolute; width: 16em; }
-.engaged .engagement-indicator { color: rgb(93, 194, 30); display: block; background-color: transparent; }
-.engagement-indicator .icon { display: inline-block; height: 2em; vertical-align: middle; width: 2em; background: 50% 50% no-repeat; }
-.engagement-indicator .stop-listening { padding: 0.5em; }
-.engagement-indicator .stop-listening .icon { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-aaa-engaged.png); }
-.engagement-indicator .text { text-align: center; }
-.engagement-indicator .title { display: inline-block; font-size: 0.9em; }
-.browse-sets-state.engaged .engagement-indicator, .browse-state.engaged .engagement-indicator, .post-play-state.engaged .engagement-indicator, .post-play-state.engaged .engagement-indicator, .settings-state.engaged .engagement-indicator, .search-state.engaged .engagement-indicator { display: block; }
-.watch-state.engaged .engagement-indicator { display: block; height: 3em; left: 0px; margin-left: auto; margin-right: auto; right: 0px; text-align: center; top: 20%; }
-.watch-focused .engagement-indicator .stop-listening { background-color: rgba(22, 22, 22, 0.701961); }
-.sliding-highlighter .select, .engaged .legend-item, .engaged #dialog .speakable.button, .engaged .context-menu .speakable.button, .engaged .speakable.action-tile .title, .engaged .modify-video .speakable, .engaged .modify-video .speakable.focused { color: rgb(93, 194, 30); }
-.voice-footer { bottom: 0px; color: rgb(93, 194, 30); font-size: 1.5em; height: 3em; padding: 1em 0px 0.6em; position: absolute; text-align: center; width: 100%; background-color: rgba(22, 22, 22, 0.701961); }
-.voice-footer .list { font-size: 0.65em; margin: -1.3em auto auto; padding-top: 1em; width: 29em; }
-.voice-footer .component { display: inline-block; padding-right: 1em; }
-.engaged .voice-footer { color: rgb(93, 194, 30); }
-.engaged .voice-footer li { display: inline; padding: 0px 2%; }
-.engaged .player-controls .button span, .engaged .player-controls .toggle-button span { color: rgb(93, 194, 30); display: block; }
-.engaged .player-controls .button.disabled span, .engaged .player-controls .toggle-button.disabled span { display: none; }
-.engaged #transport-controls.ad-active .player-controls #button-list div.skip-ad-button.canskip .label, .engaged .skip-ad-button.canskip .label { color: rgb(93, 194, 30); }
-.engaged .player-controls-widget { margin-top: 7.4em; }
-.engaged .player-controls .voice-command.transport { top: 1em; }
-.legend { bottom: 5.5%; color: rgb(241, 241, 241); position: absolute; right: 5.5%; text-shadow: rgb(0, 0, 0) 2px 2px 4px; display: none; background: radial-gradient(closest-side, rgba(0, 0, 0, 0.2) 25%, rgba(0, 0, 0, 0.0980392) 60%, rgba(0, 0, 0, 0)); }
-.limited-memory .legend { background: none; }
-.legend-item { cursor: pointer; display: none; margin: 0px 0px 0px 0.5em; }
-.legend-item span { vertical-align: middle; }
-.legend-item .icon { display: block; height: 2.5em; margin: auto; max-width: 100%; text-align: center; width: 2.5em; background-size: 100%; }
-.legend-item.more > .icon.icon-player-more { background-size: 0px; }
-.legend-item.more > .icon::before { font-family: youtube-icons; color: rgb(255, 255, 255); font-size: 1.9em; margin: auto; position: relative; top: 0.2em; }
-.legend-item .title { display: block; font-size: 1.1em; margin-top: 0px; text-align: center; text-transform: none; }
-#legend.back .back, #legend.close-guide .close-guide, #legend.delete .delete, #legend.exit .exit, #legend.guide .guide, #legend.search .search, #legend.space .space, #legend.home .home, #legend.modify .modify, #legend.more .more, .reversed-keys #legend.back .reversed-back { display: inline-block; }
-.reversed-keys #legend.back .back { display: none; }
-.desktop .legend, .game-console .legend, .tv .legend { display: inline-block; }
-.veryvibrant .legend { font-size: 1.2em; }
-.desktop .legend-item .icon { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-desktop.png); }
-.game-console.sony .legend-item .icon { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-bbb.png); }
-.rockandroll #legend .legend-item .icon { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ccc.png); }
-.skip-ad-callout .icon, .tv .legend-item .icon { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ddd.png); }
-.veryvibrant .legend-item .icon { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-eee.png); }
-.veryvibrant #user-info-background { transform: translateZ(0px); }
-.veryvibrant #search .horizontal-list { top: 30%; transform: none; }
-.veryvibrant .search-state #spinner { top: 20em; }
-.sellingApples .legend-item .icon { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ggg.png); }
-.nothingHere .legend-item .icon { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-fff.png); }
-.desktop .legend-item.back .icon, .desktop .legend-item.exit .icon { background-size: 240%; background-position: 0px 47.4%; }
-.desktop .legend-item.search .icon { background-size: 240%; background-position: 0px 100%; }
-.desktop .legend-item.close-guide .icon, .desktop .legend-item.guide .icon, .desktop .legend-item.home .icon, .desktop .legend-item.space .icon { background-size: 240%; background-position: 0px 73.7%; }
-.desktop .skip-ad-callout .icon { width: 6.6em; background-size: 520%; background-position: 31% 67.5%; }
-.game-console.sony .legend-item .icon, .tv .legend-item .icon, .veryvibrant .legend-item .icon { height: 1.5em; position: relative; bottom: 0.5em; width: 1.5em; background-repeat: no-repeat; }
-.game-console.sony .legend-item.more > .icon::before, .tv .legend-item.more > .icon::before, .veryvibrant .legend-item.more > .icon::before { top: initial; }
-.game-console.microsoft .legend-item { margin-left: 1.4em; }
-.game-console.microsoft .legend-item.back .icon, .game-console.microsoft .legend-item.exit .icon, .game-console.microsoft .legend-item.reversed-back .icon { background-position: 0px 27.5%; }
-.game-console.microsoft .legend-item.search .icon, .game-console.microsoft .legend-item.space .icon { background-position: 0px 82%; }
-.game-console.microsoft .legend-item.close-guide .icon, .game-console.microsoft .legend-item.delete .icon, .game-console.microsoft .legend-item.guide .icon, .game-console.microsoft .legend-item.home .icon, .game-console.microsoft .legend-item.modify .icon { background-position: 0px 54.9%; }
-.rockandroll #legend .legend-item.back .icon, .rockandroll #legend .legend-item.exit .icon { background-position: 0px 105%; }
-.game-console.sony .legend-item.back .icon, .game-console.sony .legend-item.exit .icon { background-position: 0px 0%; }
-.game-console.sony .legend-item.reversed-back .icon { background-position: 0px 100%; }
-.game-console.sony .legend-item.search .icon, .game-console.sony .legend-item.space .icon { background-position: 0px 87.5%; }
-.game-console.sony .legend-item.close-guide .icon, .game-console.sony .legend-item.delete .icon, .game-console.sony .legend-item.guide .icon, .game-console.sony .legend-item.home .icon { background-position: 0px 75%; }
-.game-console.sony #dialog .logout-authenticated-info, .game-console.microsoft #dialog .logout-authenticated-info { padding-top: 0px; }
-.game-console.sony .action-tile .platform-container, .game-console.microsoft .action-tile .platform-container { margin: 1em; text-align: center; }
-.game-console.sony .login-user-info .platform-user-name, .game-console.sony .platform-user-name, .game-console.microsoft .login-user-info .platform-user-name, .game-console.microsoft .platform-user-name { vertical-align: middle; }
-.game-console.sony .login-user-info .platform-user-icon, .game-console.sony .platform-user-icon, .game-console.microsoft .platform-user-icon, .game-console.microsoft .login-user-info .platform-user-icon { display: inline-block; height: 3em; vertical-align: middle; width: 3em; background-size: cover; }
-.game-console.sony #dialog .login-user-info .platform-container > div, .game-console.microsoft #dialog .login-user-info .platform-container > div { font-size: 1em; }
-.veryvibrant .advertisement-callout, .veryvibrant .advertisement-info, .veryvibrant #leanback-player-container, .veryvibrant .skip-ad-button, .veryvibrant .title-card, .veryvibrant #watch, .veryvibrant .toaster { }
-.veryvibrant .pivot-shelf-list { opacity: 1; }
-.veryvibrant .legend-item.back .icon, .veryvibrant .legend-item.exit .icon { background-position: 0px 33.3%; }
-.veryvibrant .legend-item.search .icon { background-position: 0px 100%; }
-.veryvibrant .legend-item.close-guide .icon, .veryvibrant .legend-item.delete .icon, .veryvibrant .legend-item.guide .icon, .veryvibrant .legend-item.home .icon { background-position: 0px 66.7%; }
-.veryvibrant .qr-code-wrapper { display: none; }
-.veryvibrant #search .search-pairing { display: none; }
-.veryvibrant #search-suggestions { font-size: 1.6em; height: 1.6em; }
-.veryvibrant .search-state .application-message { top: 35%; }
-.tv .legend-item.guide .icon, .tv .legend-item.close-guide .icon, .tv .skip-ad-callout .icon { background-position: 0px 100%; }
-.lg .legend-item.back, .lg .legend-item.exit { cursor: pointer; }
-.tv .legend-item.back .icon, .tv .legend-item.exit .icon { background-position: 0% 0%; }
-.lg .legend-item.back .icon, .lg .legend-item.exit .icon { opacity: 0.8; }
-.lg .legend-item.back:hover .icon, .lg .legend-item.exit:hover .icon { opacity: 1; }
-body.samsung { background-color: transparent !important; }
-body.lg { background-image: url(tv:) !important; background-color: transparent !important; }
-body.limited-memory { background-color: rgb(17, 17, 17); }
-.limited-memory .bg, .eureka .bg { background-image: none; background-color: rgb(46, 46, 46); }
-.limited-animation .loading-indicator, .opera .loading-indicator, .lg .loading-indicator { display: none; }
-.limited-animation .fallback-loading-indicator, .opera .fallback-loading-indicator, .lg .fallback-loading-indicator { display: block; }
-.limited-animation .video-tile .video-thumb { opacity: 1; }
-.limited-memory .video-tile .video-thumb { background-size: cover; }
-.limited-memory .video-tile .video-thumb.preloaded { background-size: auto; }
-.rockandroll.limited-memory .video-tile .video-thumb { opacity: 1; background-size: 100%; }
-.limited-animation.playlist-tile .count-overlay { background-color: rgb(0, 0, 0); }
-.search .placeholder-tile, .settings .placeholder-tile, .limited-animation .browse-content .list .placeholder-tile { height: 24em; width: 20.75em; }
-.guide .placeholder-tile { width: 100%; height: 2em; }
-.limited-animation .action-tile, .limited-animation .channel-tile, .limited-animation .playlist-tile, .limited-animation .auto-play-tile, .limited-animation .recent-search-tile, .limited-animation .video-tile, .limited-animation .browse-content .list .placeholder-tile, .search .placeholder-tile, .settings .placeholder-tile, .shelf .placeholder-tile { display: inline-block; margin-right: 1.1em; position: relative; vertical-align: top; }
-.limited-animation .shelves { margin-top: 2.5%; }
-.limited-animation .playlist-tile .overlay, .limited-animation .video-tile .overlay, .limited-memory .playlist-tile .overlay, .limited-memory .video-tile .overlay { opacity: 1; }
-.limited-memory .auto-play-tile .video-tile { margin: 0px; }
-.limited-animation .auto-play-tile .post-play-countdown { top: -4em; }
-.limited-animation .hide-background.video-tile .video-thumb { opacity: 1; background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/icon-playbutton.png) !important; background-repeat: no-repeat; }
-.limited-animation .action-tile.focused .content { text-shadow: none; }
-.limited-animation .post-play-countdown { text-shadow: none; }
-.limited-animation #keyboard-grid .button.disabled, .limited-animation #keyboard-grid .button.focused, .limited-animation #letter-suggest .button { background-color: rgb(153, 153, 153); }
-.limited-animation #search #text-box-background, .limited-animation #search #search-text-entry { background-color: rgb(0, 0, 0); }
-.limited-animation #search-keyboard, .limited-animation #letter-suggest { text-shadow: none; }
-.limited-animation #search-keyboard .disabled, .limited-animation #letter-suggest .button { color: rgb(0, 0, 0); text-shadow: none; }
-.limited-animation #letter-suggest .button.focused, .limited-animation #search-keyboard .button.focused { color: rgb(33, 33, 33); background-color: rgb(225, 225, 225); }
-.limited-animation #transliteration .list .button { border-right-color: rgb(241, 241, 241); }
-.limited-animation #transliteration .list .button.focused { background-color: rgb(153, 153, 153); }
-.limited-animation .toaster .toast-container { background-color: rgb(27, 25, 26); }
-.limited-animation .title-card, .limited-memory.limited-animation.sets-ui .title-card { height: 20%; background: rgb(0, 0, 0); }
-.opera .focused, .opera :focus { outline: invert none medium; }
-.eureka #browse-sets, .eureka #dialog .buttons, .eureka .legend, .eureka #transport-controls { display: none; }
-#eureka-player-controls-container { display: none; position: absolute; top: 17em; width: 100%; }
-.eureka #eureka-player-controls-container { display: block; }
-.eureka .loading #eureka-player-controls-container { opacity: 0; }
-#eureka-player-controls { border-radius: 1em; height: 11.5em; margin: 0px auto; overflow: hidden; width: 11.5em; background-size: 100%; }
-.eureka #eureka-player-controls { opacity: 0; }
-@-webkit-keyframes showAndShrinkPause {
- 0% { transform: scale(1.5); opacity: 0; }
- 100% { opacity: 0.7; }
-}
-@-webkit-keyframes hideAndGrowPlay {
- 0% { opacity: 0.7; }
- 100% { transform: scale(1.5); opacity: 0; }
-}
-.eureka #watch.play #eureka-player-controls { animation: hideAndGrowPlay 0.25s linear 0s 1 normal none; background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/player-play.png); }
-.eureka #watch.pause #eureka-player-controls { animation: showAndShrinkPause 0.25s linear 0s 1 normal none; opacity: 0.7; background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/player-pause.png); }
-.sellingApples .action-tile, .sellingApples .legend-item.back, .sellingApples .legend-item.delete, .sellingApples .legend-item.exit, .sellingApples .legend-item.home, .sellingApples .legend-item.modify, .sellingApples .legend-item.reversed-back, .sellingApples .legend-item.search, .sellingApples .player-controls div, .sellingApples .auto-play-tile, .sellingApples .video-stream, .sellingApples .video-tile, .sellingApples #browse-search-bar, .sellingApples #guide.focused .guide-button, .sellingApples #player-controls .item, .sellingApples #snap-buttons > div { }
-.sellingApples #browse-sets { }
-.sellingApples #guide.focused .carousel { }
-.sellingApples .settings-shelf { }
-.sellingApples #transliteration .button:hover, .sellingApples #keyboard-grid .button:hover { cursor: default; background: none; }
-.search-hint { display: none; }
-.sellingApples .search-hint, .nothingHere .search-hint { color: rgb(107, 107, 107); display: block; font-size: 1.4em; line-height: 2em; }
-.context-menu-defocuser { height: 100%; left: 0px; position: absolute; top: 0px; width: 100%; background-color: rgba(0, 0, 0, 0.498039); }
-.context-menu-list { height: initial; left: 50%; padding-top: 2.5em; position: relative; top: 50%; transform: translate(-50%, -50%); width: 30%; background-color: rgb(0, 0, 0); }
-.context-menu-list .button { border-color: rgb(0, 0, 0); border-style: solid; border-width: 0.5em 1em; color: rgb(225, 225, 225); cursor: pointer; font-family: roboto-regular; font-size: 1.5em; height: auto; line-height: 2.5em; margin: 0px; text-align: left; text-indent: 1em; transition-duration: 200ms; transition-property: background-color, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
-.context-menu-list .button::before { font-family: youtube-icons; padding-right: 1em; }
-.context-menu-list .button.icon-platform-switch-users { border-style: solid; border-color: rgb(31, 31, 31); border-width: 2em 1em; height: initial; line-height: initial; margin-top: 1em; padding: 0.5em 0px 0.5em 3em; text-indent: 0px; background: url(www.youtube.com/s/tv/html5/f0d770f4/app-prod.css) 0.5em 50% / 2em 2em no-repeat rgb(31, 31, 31); }
-.context-menu-list .button.focused { color: rgb(0, 0, 0); background-color: rgb(225, 225, 225); }
-.call-to-cast { display: none; }
-.call-to-cast.focused { bottom: 0px; display: block; left: 0px; position: absolute; right: 0px; top: 0px; }
-.call-to-cast-text { color: rgb(241, 241, 241); font-weight: normal; text-shadow: rgb(0, 0, 0) 0.06em 0.06em; width: 38%; }
-h2.call-to-cast-text { font-size: 3.2em; margin-bottom: 0.3em; margin-top: 0px; padding-top: 1.5em; }
-h3.call-to-cast-text { font-size: 1.7em; }
-.call-to-cast .end-screen { display: none; height: 100%; background-size: cover; background-position: 50% 50%; background-repeat: no-repeat; }
-.call-to-cast .end-screen.active { display: block; }
-.call-to-cast .end-screen .call-to-cast-text { color: rgb(255, 255, 255); width: 40%; }
-.call-to-cast .end-screen .call-to-cast-text em { color: rgb(0, 144, 255); font-style: normal; }
-.call-to-cast .end-screen h2.call-to-cast-text { margin-bottom: 0.5em; padding-top: 2em; }
-.call-to-cast .end-screen h3.call-to-cast-text { line-height: 1.5em; }
-.call-to-cast .end-screen.left .call-to-cast-text { margin-left: 5%; }
-.call-to-cast .end-screen.right .call-to-cast-text { margin-left: 50%; }
-.call-to-cast .end-screen .yt-logo, .call-to-cast .end-screen .yt-kids-logo { bottom: 8%; height: 13.88%; position: fixed; width: 100%; background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-yt-logo.png); background-size: contain; background-repeat: no-repeat; }
-.call-to-cast .end-screen.left .yt-logo, .call-to-cast .end-screen.left .yt-kids-logo { left: 4%; background-position: 0% 50%; }
-.call-to-cast .end-screen.right .yt-logo, .call-to-cast .end-screen.right .yt-kids-logo { right: 4%; background-position: 100% 50%; }
-.call-to-cast .end-screen .yt-kids-logo { height: 20%; background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/yt-kids-logo.png); }
-.call-to-cast .end-screen.multi-user { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-multi-user.jpg); }
-.call-to-cast .end-screen.yt-mix { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-yt-mix.jpg); }
-.call-to-cast .end-screen.tv-queue { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-tv-queue.jpg); }
-.call-to-cast .end-screen.kids-promo { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-promo.jpg); }
-.call-to-cast .end-screen.kids-mother-goose { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-mother-goose.jpg); }
-.call-to-cast .end-screen.kids-rainbow { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-rainbow.jpg); }
-.call-to-cast .end-screen.kids-sesame { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-sesame.jpg); }
-.call-to-cast .end-screen.kids-talking-tom { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-talking-tom.jpg); }
-.call-to-cast .end-screen.kids-wonderquest { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-wonderquest.jpg); }
-.call-to-cast .THEME-cl.end-screen.kids-promo h2.call-to-cast-text { width: 80%; }
-.call-to-cast .THEME-k.end-screen h3.call-to-cast-text { font-size: 3em; line-height: 1.4em; margin-top: 0px; padding-top: 10%; padding-left: 5%; width: 45%; }
-.call-to-cast .end-screen.gaming-heart { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-gaming-heart.jpg); }
-.call-to-cast .THEME-g.end-screen h3.call-to-cast-text { font-size: 2.2em; padding-top: 0%; width: 100%; }
-.call-to-cast .end-screen.loki { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-loki.jpg); }
-.call-to-cast .THEME-up.end-screen h3.call-to-cast-text { font-size: 2.2em; margin-left: 0%; padding-top: 17em; text-align: center; width: 100%; }
-.call-to-cast .THEME-m.end-screen h2.call-to-cast-text { font-size: 2.2em; margin-bottom: 0px; text-align: center; width: 100%; }
-.call-to-cast .THEME-m.end-screen h3.call-to-cast-text { margin-top: 0px; text-align: center; width: 100%; }
-.call-to-cast .THEME-m.end-screen.music-ready { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music.jpg); }
-.call-to-cast .THEME-m.end-screen.music-ready .call-to-cast-logo { height: 60%; background: url(www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo.png) 50% 100% no-repeat; }
-.call-to-cast .THEME-m.end-screen.music-ready h2.call-to-cast-text { padding-top: 10%; }
-.call-to-cast .THEME-m.end-screen.music-party { height: 100%; background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music.jpg); }
-.call-to-cast .THEME-m.end-screen.music-party .call-to-cast-logo { height: 55%; background: url(www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music-party-logo.png) 50% 100% no-repeat; }
-.call-to-cast .THEME-m.end-screen.music-party .footer { height: 10%; background: url(www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo-small.png) 50% 0% no-repeat; }
-.snap-controls { height: 90%; padding: 0.5em; position: relative; }
-.snapped.blurred #snap-buttons, .snapped.blurred #unsupported-mode, .snapped.blurred #ad-callout, .snapped.blurred .logo-container, .snapped.blurred .title-card, .snapped.blurred .up-next { opacity: 0.25 !important; }
-.snapped #dialog, .snapped #guide, .snapped #search, .snapped #settings, .snapped #title-tray, .snapped #transport-controls, .snapped .ad-showing .video-ads, .snapped .advertisement-info, .snapped .application-message, .snapped .browse, .snapped .browse-sets, .snapped .caption-window, .snapped .countdown-ad-callout, .snapped .html5-video-info-panel, .snapped .legend, .snapped .player-video-avatar, .snapped .quality-status, .snapped .skip-ad-button, .snapped .skip-ad-callout, .snapped .toaster, .snapped.blurred.browse-sets-state .title-card, .snapped.blurred.search-state .title-card, .snapped.blurred.settings-state .title-card, .snapped.dialog-focused #snap-progress-bar, .snapped.dialog-focused #watch { display: none !important; }
-.snapped .advertisement-tooltip { color: rgb(160, 160, 160); font-size: 0.4em; left: 0px; top: 0px; }
-.snapped .advertisement-tooltip .remaining_duration { color: rgb(113, 113, 113); }
-.snapped #ad-callout { left: 5%; top: 18%; }
-.snapped .debug-watermark { font-size: 0.2em; width: 100%; }
-#app-markup.snapped { background-color: rgb(35, 31, 32); }
-.snapped #background { display: none; }
-.snapped { font-size: 2em; }
-.snapped.watch-state .logo-container { opacity: inherit; }
-.snapped .icon-youtube-logo::before { content: ""; }
-.snap-controls .logo-container { display: inherit; height: 2.5em; left: 0px; position: absolute; right: 0px; top: 5%; background: url(www.youtube.com/s/tv/html5/f0d770f4/img/yt-logo-fullcolor.png) 50% 0% no-repeat; }
-.snapped .ad-video, .snapped .ad-created .video-stream { height: 270px !important; width: 480px !important; }
-.snapped .video-stream, .snapped .html5-video-content { max-height: 5.6em; transform: scale(0.9) !important; top: 4.4em !important; }
-.snapped .html5-video-controls { top: 9.8em !important; }
-.snapped .player-video-title { color: rgb(160, 160, 160); font-size: 0.7em; line-height: 1.1em; margin: 0px; max-height: 2.2em; white-space: normal; width: 12em; }
-.snapped .player-meta { left: 0px; margin: 0px; position: inherit; top: 0px; }
-.snapped .player-meta .player-video-text { padding-left: 0px; }
-.snapped .player-meta .player-video-details { color: rgb(113, 113, 113); font-size: 0.5em; line-height: 1.1em; }
-.snapped .player-meta .player-video-details > div { margin-left: 0px; }
-.snapped .player-video-details .uploaded-date, .snapped .player-video-details .set-context, .snapped .player-video-details .view-count { font-size: 0.9em; margin-top: 0px; }
-.watch-state.snapped #snap-progress-bar { display: block; }
-#snap-progress-bar { display: none; height: 0.1em; left: 0px; margin-top: 9.25em; padding: 0px; position: relative; top: 0px; width: 100%; background-position: 0% 0%; }
-#snap-progress-bar .progress-bar-disc, #snap-progress-bar .progress-bar-playhead { display: none; }
-#snap-progress-bar div { height: 5px; top: 0px; }
-.snapped .title-card { border: none; height: initial; padding-top: 0.3em; position: inherit; background: none; }
-#unsupported-mode { color: rgb(255, 255, 255); font-size: 0.9em; line-height: 1.2em; padding: 80% 1em 0px; width: 8em; }
-.snapped .loading-indicator { height: 5em; width: 5em; }
-.snapped #spinner { top: 19%; transform: scale(0.5); }
-.engaged.snapped .engagement-indicator { display: inline-block; left: 0px; margin-left: auto; margin-right: auto; position: absolute; right: 0px; text-align: center; font-size: 0.6em !important; top: 4.2em !important; }
-.engaged.snapped .engagement-indicator .stop-listening { background: transparent; }
-.snap-controls #snap-buttons { bottom: 0px; position: absolute; }
-.snap-controls #snap-buttons .focused, .snap-controls #snap-buttons :hover { border-radius: 0.15em; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); }
-.snap-controls #snap-buttons .button, .snap-controls #snap-buttons .toggle-button { display: inline-block; font-size: 0.8em; height: 1em; margin-left: 0.5em; padding: 1em; position: relative; text-align: center; top: 0px; width: 1em; }
-.snap-controls #snap-buttons div { color: rgb(255, 255, 255); cursor: pointer; vertical-align: middle; }
-.snap-controls #snap-buttons div.disabled:hover { color: rgb(255, 255, 255); background-color: transparent; }
-.snap-controls #snap-buttons div.focused { opacity: 1; }
-.snap-controls #snap-buttons div.disabled { opacity: 0.2; }
-.snap-controls .speakable span, .snap-controls .disabled span { display: none; }
-.engaged .snap-controls .speakable:not(.disabled) span { color: rgb(93, 194, 30); display: block; font-size: 0.6em; left: 0px; overflow: hidden; pointer-events: none; position: absolute; text-align: center; top: -1.5em; width: 100%; word-break: break-all; }
-.lang-case-sensitive .snap-controls .speakable span::first-letter { text-transform: uppercase; }
-.snap-controls .icon-player-play { font-family: youtube-icons; }
-.snap-controls .icon-mute, .snap-controls .icon-fullscreen { background-size: 3em; background-position: 50% 50%; background-repeat: no-repeat; }
-.snap-controls .icon-mute, .snap-controls .icon-mute.disabled { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-active.png); }
-.snap-controls .icon-mute.focused, .snap-controls .icon-mute:hover:not(.disabled) { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-onhover-active.png); }
-.snap-controls .icon-mute.toggle-selected { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-active.png); }
-.snap-controls .icon-mute.toggle-selected.focused, .snap-controls .icon-mute.toggle-selected:hover { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-onhover-active.png); }
-.snap-controls .icon-fullscreen { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-active.png); }
-.snap-controls .icon-fullscreen.focused, .snap-controls .icon-fullscreen:hover { background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-onhover-active.png); }
-.up-next { height: 3em; padding-top: 1em; }
-.up-next div { color: rgb(160, 160, 160); font-size: 0.6em; }
-.up-next .video-title { height: 1.2em; line-height: 1.2em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 100%; }
-.up-next .video-thumb { display: inline-block; height: 100%; margin-top: 0.2em; max-height: 2.5em; vertical-align: top; width: 5em; background: 50% 50% / 100% no-repeat; }
-#browse-sets { height: 100%; left: 0px; overflow: hidden; position: absolute; right: 0px; background-color: rgb(34, 34, 34); }
-#browse-sets.no-background, .limited-memory #browse-sets { background-color: rgba(0, 0, 0, 0); }
-#browse-search-bar { cursor: pointer; height: 3em; left: 8em; margin-right: 18em; position: absolute; right: 2.5em; top: 2.5em; background-color: rgba(153, 153, 153, 0.2); }
-.limited-animation #browse-search-bar { background-color: rgb(79, 87, 90); }
-#browse-search-bar.focused, #browse-search-bar:hover { background: rgb(255, 255, 255); }
-#browse-search-bar .icon { color: rgba(255, 255, 255, 0.4); display: block; font-family: youtube-icons; font-size: 1.8em; margin: 0px; padding: 0.35em 0px 0px 0.5em; text-align: left; }
-.limited-animation #browse-search-bar .icon { color: rgb(225, 225, 225); }
-.youtube-logo-top { height: 3.4em; position: absolute; right: 9.5em; top: 2.3em; width: 8.4em; font-family: youtube-icons; }
-#browse-sets.has-header-content .youtube-logo-top { display: none; }
-.youtube-logo::before { color: rgba(153, 153, 153, 0.498039); display: block; font-size: 3.4em; }
-.youtube-unlimited-logo::before { color: rgba(153, 153, 153, 0.498039); display: none; font-size: 3.4em; position: relative; right: 0.5em; }
-.unlimited .youtube-logo::before { display: none; }
-.unlimited .youtube-unlimited-logo::before { display: block; }
-.limited-animation .youtube-unlimited-logo::before, .limited-animation .youtube-logo::before { color: rgb(79, 87, 90); }
-#browse-search-bar.focused .icon, #browse-search-bar:hover .icon { color: rgb(68, 68, 68); }
-#platform-user-icon { height: 4em; position: absolute; right: 3em; top: 2em; width: 4em; background-size: contain; background-position: 50% 50%; background-repeat: no-repeat; }
-#browse-header { height: 60%; position: relative; background-size: cover; background-position: 0px -8em; }
-.limited-memory.limited-animation #browse-header { background-size: contain; background-position: 6em 0px; background-repeat: no-repeat; }
-.no-background #browse-header { background-image: none !important; }
-.browse-sets #browse-header.collapsed { transform: translateY(-27%); }
-.limited-memory .browse-sets #browse-header.collapsed { top: -7em; transform: none; }
-#browse-header .title { color: rgb(225, 225, 225); display: inline-block; font-size: 2.25em; margin-bottom: -0.23em; overflow: hidden; text-overflow: ellipsis; transform-origin: left 50% 0px; white-space: nowrap; width: 23.7em; }
-#browse-header.one-button .title { width: 18.7em; }
-#browse-header.two-buttons .title { width: 14em; }
-#browse-header.collapsed .title { overflow: visible; transform: scale(0.8, 0.8) translateY(-5em) translateX(-1.5em); }
-.browse-header-gradient { height: 100%; width: 100%; background: linear-gradient(rgba(34, 34, 34, 0) 0%, rgba(34, 34, 34, 0) 15%, rgb(34, 34, 34) 100%); }
-.limited-memory .browse-header-gradient { display: none; }
-.no-background .browse-header-gradient { visibility: hidden; }
-.browse-header-metadata { left: 8em; position: absolute; transform: translateZ(0px); }
-.limited-memory.limited-animation .browse-header-metadata { top: 11.6em; }
-.limited-memory.limited-animation #browse-header.collapsed .browse-header-metadata { font-size: inherit; left: 8em; top: 11em; }
-.limited-memory.limited-animation #browse-header.collapsed .browse-header-metadata .browse-header-avatar { height: 4em; margin-right: 1em; width: 4em; }
-.browse-header-avatar { display: inline-block; height: 5em; margin-right: 1.3em; transform-origin: left 50% 0px; width: 5em; background-size: contain; }
-#browse-header.collapsed .browse-header-avatar { transform: scale(0.61, 0.61) translateY(-13.5em); }
-#browse-header.collapsed .browse-header-button-bar { transform: translateY(-6.25em); opacity: 0; }
-.browse-header-button-bar { border-radius: 0.15em; font-size: 1.1em; height: 2.4em; margin-bottom: -0.59em; padding: 0.59em; position: absolute; right: 3.5em; background: rgba(0, 0, 0, 0.4); }
-.limited-animation .browse-header-button-bar { background: rgb(31, 36, 38); }
-.limited-memory.limited-animation .browse-header-button-bar { top: 13em; }
-.browse-header-button-bar, .browse-header-metadata { bottom: 3.9em; }
-.browse-header-button-bar .button { border-radius: 0.12em; color: rgb(225, 225, 225); cursor: default; display: inline-block; height: 2.4em; min-width: 8.2em; overflow: hidden; padding-right: 1em; white-space: nowrap; }
-.browse-header-button-bar .button span { line-height: 2.4em; vertical-align: middle; }
-.browse-header-button-bar .button.focused, .browse-header-button-bar .button.focused:hover { color: rgb(33, 33, 33); background: rgb(225, 225, 225); }
-.browse-header-button-bar .button:hover { background-color: rgb(102, 102, 102); }
-.browse-header-button-bar .button .icon { display: inline-block; font-family: youtube-icons; height: 2.4em; margin: 0px 1em; }
-.browse-header-subscribe .icon::before { font-size: 2em; }
-.browse-header-subscribe.toggle-selected .icon::before { content: ""; font-size: 1em; }
-.browse-header-subscribe.toggle-selected.focused { color: rgb(206, 41, 45); }
-.browse-header-subscribe.disabled { background-color: rgba(0, 0, 0, 0); }
-.browse-content { height: 80%; left: 8em; position: absolute; top: 14.5%; width: 100%; }
-.browse-sets.collapsed .browse-content { transform: translateY(44%); }
-.limited-memory .browse-sets.collapsed .browse-content { top: 20em; transform: none; }
-#browse-header, .browse-header-avatar, .browse-header-button-bar, .browse-content, #browse-header .title { transform: translateZ(0px); transition: -webkit-transform 0.25s; }
-.browse-header-button-bar { transition: opacity 0.25s, transform 0.25s; }
-.limited-animation #browse-header, .limited-animation .browse-header-avatar, .limited-animation #browse-header.collapsed .browse-header-avatar, .limited-animation .browse-content, .limited-animation .browse-header-button-bar, .limited-animation #browse-header .title, .limited-animation .browse-content .shelves, .limited-animation .browse-header-metadata, .limited-animation .shelf #content-container, .limited-animation .shelves > .title, .limited-animation .shelf > .title, .limited-animation .horizontal-list > .content, .limited-animation .horizontal-list, .limited-animation .shelves .carousel { transition: none; transform: none; }
-.limited-animation #browse-header.collapsed .browse-header-metadata { font-size: 0.6em; left: 13.25em; top: 17.75em; }
-.limited-animation #browse-header.collapsed .browse-header-metadata .title { font-size: 3em; }
-.limited-memory #browse-header.collapsed .browse-header-metadata .title { font-size: 1.8em; }
-.limited-animation .browse-content .list { margin-left: -9.5em; width: 126em; }
-.limited-animation .browse-content .shelf > .title { margin-left: 6em; }
-.limited-animation.sets-ui .action-tile:not(.focused), .limited-animation.sets-ui .auto-play-tile:not(.focused) .video-tile, .limited-animation.sets-ui .channel-tile:not(.focused), .limited-animation.sets-ui .playlist-tile:not(.focused), .limited-animation.sets-ui .recent-search-tile:not(.focused), .limited-animation.sets-ui .video-tile:not(.focused), .rockandroll.limited-animation.sets-ui .action-tile:hover:not(.focused), .rockandroll.limited-animation.sets-ui .auto-play-tile:hover:not(.focused) .video-tile, .rockandroll.limited-animation.sets-ui .channel-tile:hover:not(.focused), .rockandroll.limited-animation.sets-ui .playlist-tile:hover:not(.focused), .rockandroll.limited-animation.sets-ui .video-tile:hover:not(.focused) { background-color: rgb(33, 33, 33); }
-.limited-animation.sets-ui .action-tile:hover:not(.focused), .limited-animation.sets-ui .auto-play-tile:hover:not(.focused) .video-tile, .limited-animation.sets-ui .channel-tile:hover:not(.focused), .limited-animation.sets-ui .playlist-tile:hover:not(.focused), .limited-animation.sets-ui .recent-search-tile:hover:not(.focused), .limited-animation.sets-ui .video-tile:hover:not(.focused) { background-color: rgb(65, 65, 65); }
-.browse-content .shelves { margin-left: 0em; transform: translateZ(0px); }
-.browse-content .shelves > .no-content-message, .browse-content .horizontal-list > .no-content-message { margin-left: -8em; }
-.shelves > .no-content-message, .horizontal-list > .no-content-message { display: none; position: absolute; top: 8em; width: 100%; }
-.shelves.no-content > .no-content-message, .horizontal-list.no-content > .no-content-message { display: block; }
-.shelves > .no-content-message .text, .horizontal-list > .no-content-message .text { color: rgb(241, 241, 241); font-size: 1.8em; text-align: center; text-shadow: rgb(0, 0, 0) 0.04em 0.04em; }
-.shelf { width: 100%; }
-.limited-animation .shelf { margin-bottom: 1.8em; }
-.carousel .shelf { position: absolute; }
-.shelf #content-container { transform: translateZ(0px); }
-.shelves > .title, .shelf > .title { color: rgb(153, 153, 153); font-size: 1.6em; margin-bottom: 1em; margin-top: 0.2em; transform: translateZ(0px); white-space: nowrap; }
-.shelves > .title, .shelf.selected > .title { color: rgb(255, 255, 255); }
-.shelf > .title .annotation { color: rgb(119, 119, 119); font-size: 70%; margin-left: 0.5em; }
-.shelf.selected > .title .annotation { color: rgb(221, 221, 221); }
-.horizontal-list.no-model, .shelf.no-model, .survey-shelf.no-model { display: none; }
-.shelf > .icon { display: none; }
-.horizontal-list > .content { font-size: 79%; height: 26em; opacity: 1; transform: translateZ(0px); }
-.horizontal-list.focused > .content { opacity: 1; }
-.horizontal-list, .shelves .carousel, .browse-header-metadata { transform: translateZ(0px); }
-.shelf0to0 { opacity: 1; transform: translateY(0%) scale(1); }
-@-webkit-keyframes shelf0to1-anim {
- 0% { transform: translateY(0%); }
- 100% { transform: translateY(100%); }
-}
-.shelf0to1 { animation: shelf0to1-anim 200ms forwards; }
-@-webkit-keyframes shelf0to2-anim {
- 0% { opacity: 1; transform: translateX(0%) translateY(0%) scale(1); }
- 100% { opacity: 0; transform: translateX(-2%) translateY(-11%) scale(0.75); }
-}
-.shelf0to2 { animation: shelf0to2-anim 200ms forwards; }
-@-webkit-keyframes shelf1to0-anim {
- 0% { transform: translateX(0%) translateY(100%); }
- 100% { transform: translateX(0%) translateY(0%); }
-}
-.shelf1to0 { animation: shelf1to0-anim 200ms forwards; }
-.shelf1to1 { opacity: 1; transform: translateX(0%) translateY(100%) scale(1); }
-@-webkit-keyframes shelf1to2-anim {
- 0% { transform: translateX(0%) translateY(100%); }
- 99% { transform: translateX(0%) translateY(200%); }
- 100% { opacity: 0; transform: translateX(-2%) translateY(-11%) scale(0.75); }
-}
-.shelf1to2 { animation: shelf1to2-anim 200ms forwards; }
-@-webkit-keyframes shelf2to0-anim {
- 0% { opacity: 0; transform: translateX(-2%) translateY(-11%) scale(0.75); }
- 100% { opacity: 1; transform: translateX(0%) translateY(0%) scale(1); }
-}
-.shelf2to0 { animation: shelf2to0-anim 200ms forwards; }
-@-webkit-keyframes shelf2to1-anim {
- 0% { opacity: 1; transform: translateX(0%) translateY(200%); }
- 100% { opacity: 1; transform: translateX(0%) translateY(100%); }
-}
-.shelf2to1 { animation: shelf2to1-anim 200ms forwards; }
-.shelf2to2 { opacity: 0; transform: translateX(-2%) translateY(-11%) scale(0.75); }
-.limited-memory .shelves .list .video-tile:nth-child(1) .video-thumb, .limited-memory .shelves .list .channel-tile:nth-child(1) .video-thumb, .limited-memory.sets-ui #search .horizontal-list .list .video-tile:nth-child(1) .video-thumb, .limited-memory.sets-ui #search .horizontal-list .list .channel-tile:nth-child(1) .video-thumb, .limited-memory.sets-ui #browse .list .video-tile:nth-child(1) .video-thumb, .limited-memory.sets-ui #browse .list .channel-tile:nth-child(1) .video-thumb, .limited-memory.sets-ui #browse .list .video-tile:last-child .video-thumb, .limited-memory.sets-ui #browse .list .channel-tile:last-child .video-thumb { background: none !important; }
-.survey-shelf { position: absolute; }
-.survey-shelf > .title { color: rgb(255, 255, 255); display: inline-block; font-size: 1.6em; margin-bottom: 1em; margin-top: 0.2em; }
-.survey-shelf .action-tile .content > .title { display: none; }
-.survey-shelf .horizontal-list > .content { font-size: 79%; height: 26em; }
-.survey-shelf .description { color: rgb(255, 255, 255); visibility: visible; }
-.survey-shelf .button { display: inline-block; margin-bottom: 1em; margin-left: 2em; }
-.survey-shelf .sliding-highlighter { height: 8em; width: 8em; }
-.survey-shelf .action-tile, .exp-densityBrowse .survey-shelf .action-tile { border: 0px; height: 8em; width: 8em; }
-.survey-shelf .action-tile .content { height: 8em; width: 8em; }
-.survey-shelf .action-tile .description { color: rgb(119, 119, 119); font-size: 1.2em; margin-top: -1.3em; opacity: 1; white-space: nowrap; }
-.exp-densityBrowse .survey-shelf.focused .action-tile .description { display: block; }
-.exp-densityBrowse .survey-shelf .action-tile .description { display: none; }
-.survey-shelf .action-tile .large-action-icon, .exp-densityBrowse .survey-shelf .action-tile .large-action-icon { font-size: 5em; margin-top: 0.26em; padding-right: 0.2em; background-color: transparent; }
-.survey-shelf .action-tile.selected .large-action-icon, .exp-densityBrowse .survey-shelf .action-tile.selected .large-action-icon { color: rgb(255, 255, 255); }
-.survey-shelf .action-tile.focused .large-action-icon, .exp-densityBrowse .survey-shelf .action-tile.focused .large-action-icon { color: rgb(34, 34, 34); }
-.survey-shelf .button.focused { border-radius: 0.1em; color: rgb(34, 34, 34); padding: 0.2em; background-color: rgb(255, 255, 255); }
-.survey-shelf .button { color: rgb(119, 119, 119); }
-.limited-animation .survey-shelf { margin-bottom: 5em; position: relative; }
-.limited-animation .survey-shelf > .title { margin-left: 6em; }
-.limited-animation .exp-densityBrowse .survey-shelf > .title { margin-left: 5em; }
-.limited-animation .survey-shelf .horizontal-list { margin-left: 17.5em; }
-.limited-animation .exp-densityBrowse .survey-shelf .horizontal-list { margin-left: 13.5em; }
-.limited-animation .exp-densityBrowse .survey-shelf .action-tile .large-action-icon { margin-top: 0.12em; }
-.limited-animation .exp-densityBrowse .survey-shelf .action-tile .description { display: block; }
-#guide { box-shadow: black 0.1em 0px 1em 0em; height: 100%; left: 0px; overflow: hidden; position: absolute; transform: translateX(-23em) translateZ(0px); transition: transform 400ms cubic-bezier(0.4, 0, 0.2, 1); width: 28em; }
-.limited-memory.limited-animation #guide { box-shadow: none; transform: none; }
-.limited-memory #guide.focused { border-right-style: none; }
-#guide.focused { transform: translateX(0px); }
-#guide:hover { background-color: rgba(255, 255, 255, 0.2); }
-.limited-animation #guide:hover { background: none; }
-.limited-animation #guide, .limited-animation #guide #user-info-background, .limited-animation .guide-carousel-background { transition: none; }
-.guide-carousel-background { height: 100%; left: 0em; position: absolute; top: 0em; width: 100%; transition: background-color 400ms; background-color: rgba(0, 0, 0, 0.2); }
-.limited-animation .guide-carousel-background, .limited-animation #guide #user-info-background { background-color: rgb(31, 36, 38); }
-.limited-animation #guide:hover .guide-carousel-background, .limited-animation #guide:hover #user-info-background { background-color: rgb(56, 65, 69); }
-.limited-animation.limited-memory .guide-carousel-background, .limited-animation.limited-memory #guide #user-info-background { background-color: rgb(223, 35, 35); }
-.limited-memory .guide-carousel-background, .limited-memory #guide #user-info-background, #guide .list { display: none; }
-.limited-memory #guide.focused .guide-carousel-background, .limited-memory #guide.focused.logged-in #user-info-background, #guide.focused .list { display: block; }
-.logged-in .guide-carousel-background { top: 8.5em; }
-#guide.focused .guide-carousel-background, #guide.focused:hover .guide-carousel-background { background-color: rgb(223, 35, 35); }
-.collapsed-guide, #guide.focused .collapsed-guide { display: none; }
-.collapsed-guide-icons { color: rgb(133, 136, 138); font-size: 1.6em; left: 15em; opacity: 1; position: absolute; top: 7.5em; }
-.collapsed-guide-icon { font-family: youtube-icons; margin-top: 1em; margin-bottom: 1em; text-align: center; width: 2em; }
-#guide .collapsed-guide-icons { transition: opacity 150ms 450ms; }
-.limited-memory .collapsed-guide-icons { left: 1em; }
-.limited-animation #guide .collapsed-guide-icons { transition: none; }
-#guide.focused .collapsed-guide-icons { opacity: 0; transition: none; }
-#guide .collapsed-guide-icon.icon-guide-my-subs { display: none; }
-#guide.logged-in .collapsed-guide-icon.icon-guide-my-subs { display: block; }
-#guide.logged-in .collapsed-guide-icon.icon-popular { display: none; }
-.collapsed-guide-icon.icon-music { font-size: 0.925em; padding-left: 0.0375em; }
-.limited-memory .collapsed-guide { border-right-width: 0.2em; border-right-style: solid; border-right-color: rgb(17, 17, 17); display: block; height: 100%; left: 0px; width: 6em; background-color: rgb(31, 36, 38); }
-#error-message { display: none; }
-#guide.error.focused #error-message { color: rgb(255, 255, 255); display: block; font-size: 2em; padding: 2em; position: absolute; text-align: center; top: 12em; }
-#guide .sliding-highlighter { display: none; width: 100%; height: 4.2em; opacity: 0; }
-#guide.focused .sliding-highlighter { opacity: 1; }
-#guide.focused .sliding-highlighter { display: block; }
-#guide.focused #user-info-background { visibility: visible; }
-#guide #user-info-background { transition: background-color 400ms; background-color: rgba(0, 0, 0, 0.2); }
-#guide.focused #user-info-background, #guide.focused:hover #user-info-background { background-color: rgb(147, 23, 23); }
-.logged-in #user-info-background { display: block; }
-#guide.focused .guide-user-text { visibility: visible; }
-#guide .carousel, #guide .list, #guide .sliding-highlighter { color: rgb(255, 255, 255); margin-top: 2em; }
-#guide.logged-in .carousel, #guide.logged-in .list, #guide.logged-in .sliding-highlighter { margin-top: 1em; }
-#guide .carousel.hidden { visibility: hidden; display: block !important; }
-#guide .list { position: relative; }
-.carousel .guide-button { position: absolute; }
-.list .guide-button { margin-bottom: 0.1em; }
-.guide-button { font-size: 1.6em; height: 1.83em; overflow: hidden; padding: 0.5em 0.27em 0.3em 2.9em; white-space: nowrap; }
-.guide-button:hover { cursor: pointer; padding-right: 1.78em; background: rgb(153, 0, 0); }
-.guide-button.selected:hover { background: transparent; }
-.guide-button.disabled:hover { cursor: inherit; padding-right: inherit; background: transparent; }
-.guide-button.disabled { padding-left: 2.1em; text-transform: uppercase; }
-.guide-button.disabled.footer { text-transform: none; }
-.guide-button-icon { color: rgb(239, 145, 145); display: inline-block; font-family: youtube-icons; font-size: 1.2em; margin-top: 0.2em; text-align: center; width: 1.8em; }
-.guide-button.disabled .guide-button-icon { display: none; }
-.guide-user-text, .guide-button-title { color: rgb(251, 218, 218); display: inline-block; line-height: 1.7em; overflow: hidden; padding-left: 0.5em; text-overflow: ellipsis; vertical-align: top; }
-.guide-button.disabled .guide-button-title { color: rgb(239, 145, 145); }
-.guide-user-text { visibility: hidden; margin-left: -0.4em; position: relative; top: 30%; text-overflow: ellipsis; width: 9.5em; }
-.guide-button-title { width: 11em; }
-.engaged .guide-button-title { width: 8em; }
-.guide-button.footer .guide-button-title { font-size: 75%; padding-top: 0.8em; width: 21.15em; }
-.guide-button-icon .image, #guide-user-avatar { height: 1em; width: 1em; background: 50% 50% / 100% no-repeat; }
-.guide-button-icon .image { box-shadow: rgb(239, 145, 145) 0px 0px 0px 1px; margin: 0px 0.4em; background-color: rgb(255, 255, 255); }
-.guide-button.focused .guide-button-icon .image { box-shadow: none; }
-.guide-button .image { display: none; }
-.guide-button.has-image .image { display: block; }
-#guide-user-avatar { border-radius: 50%; box-shadow: rgba(239, 145, 145, 0.4) 0px 0px 0px 0.05em, rgb(239, 145, 145) 0px 0px 0.05em; display: inline-block; font-size: 2.31em; margin: 0.2em 0.2em 0.2em 0.4em; }
-#guide-user-avatar, .guide-user-text, .guide-button-icon, .guide-button-title { transition: color 50ms 25ms; }
-.no-transition .guide-button .guide-button-icon, .no-transition .guide-button .guide-button-title, .limited-animation .guide-button .guide-button-icon, .limited-animation .guide-button .guide-button-title, .limited-animation #guide-user-avatar, .limited-animation .guide-user-text { transition: none; }
-.guide-button.focused .guide-button-icon, .guide-button.focused .guide-button-title { color: rgb(223, 35, 35); }
-.limited-animation .guide-button.focused { background-color: rgb(255, 255, 255); }
-.user-info-container { height: 2.6em; padding: 1.1em 0em 0em 1.8em; font-size: 1.6em; white-space: nowrap; }
-#user-info-background { display: none; height: 8.53em; position: relative; width: inherit; z-index: 1; }
-.sliding-highlighter .select { display: none; height: 2.9em; min-width: 3.5em; padding: 1.3em 0.6em 0em; position: absolute; right: 0px; text-align: center; background-color: rgba(0, 0, 0, 0.8); }
-.engaged .guide .sliding-highlighter .select { display: block; }
-.unlimited .guide-user-text { line-height: 1em; }
-.guide-user-unlimited { font-size: 0.8em; color: rgb(170, 136, 136); text-transform: uppercase; }
-#settings { height: 100%; overflow: visible; position: absolute; right: 0px; left: 4.5em; }
-.settings-shelf { height: 24em; margin-left: 3.5em; margin-top: 1em; position: absolute; top: 19%; width: 100%; }
-.settings-title { color: rgb(255, 255, 255); font-size: 1.2em; line-height: 3em; white-space: nowrap; }
-.limited-animation .settings .content .list { width: 130em; }
-.limited-animation #settings-items { margin-left: -17em; }
-.settings-horizontal-list > .content { font-size: 79%; }
-.settings-horizontal-list > .no-content-message { display: none; }
-.pointer-overlay { display: block; }
-.pointer-overlay .nav-arrow { cursor: pointer; display: none; height: 5em; opacity: 0.5; position: absolute; width: 5em; background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/motion-control-sprite.png); background-size: 100%; background-repeat: no-repeat; }
-.pointer-overlay.enabled .nav-arrow { display: block; }
-.pointer-overlay .nav-arrow:hover { opacity: 1; }
-.pointer-overlay .up-arrow { left: 45%; top: 18%; background-position: 0px 100%; }
-.pointer-overlay .down-arrow { bottom: 11%; left: 45%; background-position: 0px 0%; }
-.pointer-overlay .left-arrow { top: 50%; left: 5%; background-position: 0px 33.3%; }
-.settings-focused .pointer-overlay .left-arrow, .browse-sets-state .pointer-overlay .left-arrow, .search-state .pointer-overlay .left-arrow { left: 7%; }
-.pointer-overlay .right-arrow { top: 50%; right: 5%; background-position: 0px 66.7%; }
-#search.input-open + .pointer-overlay .up-arrow, .post-play-state .pointer-overlay .up-arrow, .post-play-state .pointer-overlay .down-arrow { display: none; }
-.watch-state .pointer-overlay .down-arrow { bottom: 2%; }
-.search-state.guide-focused .pointer-overlay .up-arrow { top: 20%; }
-@media screen and (aspect-ratio: 5/4) {
- #dialog.browse-sets #dialog-wrapper { padding: 1.3em 2em; }
- .flag-list-container.flag-options-dialog { font-size: 0.875em; }
-}
-@media screen and (max-aspect-ratio: 4/3) {
- .player-controls #button-list { font-size: 0.875em; }
- #transport-controls.ad-active .player-controls-widget .player-controls #button-list { font-size: 1em; }
- .fresh-transport-controls .progress-bar { width: 70%; }
- .fresh-transport-controls #player-time-elapsed, .fresh-transport-controls .player-time-total { font-size: 1.1em; width: 10%; }
-}
-@media screen and (aspect-ratio: 4/3) {
- #browse-header .title { width: 18.3em; }
- #browse-header.one-button .title { width: 13.2em; }
- #browse-header.two-buttons .title { width: 8.5em; }
- .sets-ui .flag-list.grid { font-size: 0.8em; }
- .flag-claim { font-size: 1.4em; }
- #search .search-pairing { font-size: 0.7em; }
- .sets-ui .debug-dialog { font-size: 0.8em; }
- .voice-footer .list { padding-top: 0px; width: 16em; }
-}
-@media screen and (min-width: 3840px) {
- .player-controls { top: 21px; }
-}
-@media screen and (min-width: 1919px) {
- .opera .video-stream { height: 1080px; width: 1920px; }
- .watch-video-tile, .watch-list .button { padding: 10px; }
-}
-@media screen and (max-height: 576px) and (max-width: 1024px) and (min-width: 640px) {
- .countdown-ad-callout { font-size: 1.3em; right: 10%; }
- .opera .video-stream { height: 576px; width: 1024px; }
- #keyboard-grid .button { width: 0.7em; }
- #dialog-wrapper { padding-left: 4em; padding-right: 4em; }
- .pairing { transform-origin: 0px 50% 0px; transform: scale(0.7); }
- .browse-sets #browse-header.collapsed { transform: translateY(-19%); }
-}
-@media screen and (max-height: 480px) and (max-width: 720px) {
- .countdown-ad-callout { font-size: 0.9em; right: 5%; }
- .skip-ad-callout { right: 3%; }
- .opera .video-stream { height: 480px; }
- #search .pairing .alternatives { margin: 0px 0px 0px 1em; }
- #keyboard-grid .button { width: 0.8em; }
- #search .pairing .search-message .title { margin-top: 0.7em; }
- #dialog-view .pairing { font-size: 0.8em; margin-top: 2em; }
- .watch-list .list { margin-left: -4em; }
-}
-@media screen and (max-height: 480px) and (max-width: 640px) {
- .opera .video-stream { height: 480px; width: 640px; }
- #keyboard-grid .button { width: 0.7em; }
- #dialog-view .reset-help { display: block; width: 27em; }
- .watch-video-tile, .watch-list .button { padding: 4px; }
- .browse-header-metadata { bottom: 3.9em; }
- .browse-sets #browse-header.collapsed { transform: translateY(-27%); }
- .voice-footer .list { font-size: 0.6em; margin-left: 35%; width: 35%; }
- .engaged .engagement-indicator { display: inline-block; font-size: 1.3em; height: 3em; margin-bottom: 1.5em; }
- .engaged .engagement-indicator .title { display: inline-block; }
- .engagement-indicator .stop-listening .icon { display: inline-block; height: 3em; left: 0px; top: 0px; width: 15%; }
-}
-@media screen and (max-width: 1440px) and (min-height: 1080px) {
- .video-tile-container { transform: scale(0.7); transform-origin: right top 0px; }
- .player-controls #button-list .button, .player-controls #button-list .toggle-button { margin-right: 0.2em; margin-left: 0.2em; }
- .fresh-transport-controls .progress-bar { width: 59%; }
- .fresh-transport-controls #player-time-elapsed, .fresh-transport-controls .player-time-total { font-size: 1em; width: 14%; }
- .fresh-transport-controls .button, .fresh-transport-controls .toggle-button { font-size: 1.1em; }
- .fresh-transport-controls #transport-more-button { font-size: 1.7em; }
- #dialog-wrapper { padding: 1.3em 3em; }
- .dialog-contents { font-size: 95%; }
- #dialog-wrapper .connection-steps { padding: 0px; }
- #dialog-wrapper .pairing .qr-code, #dialog-wrapper .pairing .connected-list { margin: 0.2em; }
- .context-menu-list { left: 30%; right: 30%; }
- .voice-footer .list { font-size: 0.65em; padding-left: 22em; padding-right: 18em; padding-top: 1.3em; }
-}
-.sets-ui .carousel .item, .sets-ui .carousel .channel-tile, .sets-ui .carousel .auto-play-tile { background-color: inherit !important; }
-.sets-ui .carousel .item:hover, .sets-ui .carousel .channel-tile:hover, .sets-ui .carousel .auto-play-tile:hover { background-color: rgba(255, 255, 255, 0.0980392) !important; }
-.sets-ui .tile .channel-bottom > .title, .sets-ui .tile .tile-bottom > .title { color: rgb(225, 225, 225); }
-.sets-ui .tile .channel-bottom > .details, .sets-ui .tile .tile-bottom > .details { color: rgb(100, 100, 100); }
-.sets-ui .tile.focused.selected .channel-bottom > .title, .sets-ui .tile.focused.selected .tile-bottom > .title { color: rgb(33, 33, 33); }
-.sets-ui .tile.focused.selected .channel-bottom > .details, .sets-ui .tile.focused.selected .tile-bottom > .details { color: rgb(141, 141, 141); }
-.sets-ui #transport-controls .player-controls #button-list div.icon-player-more, .sets-ui #transport-controls .player-controls #button-list div.icon-player-less { color: rgb(255, 255, 255); }
-.sets-ui #transport-controls .player-controls #button-list div.icon-player-more.focused, .sets-ui #transport-controls .player-controls #button-list div.icon-player-less.focused { color: rgb(34, 34, 34); }
-.sets-ui .settings-title { font-size: 1.5em; }
-.sets-ui .action-tile .title { font-size: 2.4em; margin-left: 0.1em; margin-right: 0.1em; }
-.sets-ui .flag-list.grid { margin: 3.25em; }
-.sets-ui .flag-list .list { text-align: left; }
-.sets-ui .flag-list .button { width: 14em; text-align: center; }
-.sets-ui .flag-example { top: 20%; }
-.sets-ui .flag-video { margin-left: 2em; text-align: left; }
-.sets-ui .flag-claim .privacy-invasion { margin: auto; width: 50%; }
-.sets-ui .authentication-error-dialog, .sets-ui .delete-video-error, .sets-ui .missing-channel-error, .sets-ui .server-unavailable, .sets-ui .network-error-dialog { margin-top: 1em; }
-.sets-ui .eureka-authorization-dialog .icon, .sets-ui .eureka-player-error-dialog .icon { margin-left: 3em; }
-.sets-ui .eureka-authorization-dialog .info, .sets-ui .eureka-player-error-dialog .info { width: 50%; }
-.sets-ui .debug-dialog { padding: 0px 1em; text-align: left; }
-.sets-ui .text-dialog #dialog-view { width: auto; }
-.sets-ui #dialog .platform-container { font-size: 0.6em; margin-bottom: 0.5em; }
-.sets-ui .paid-channel-dialog { margin: 1em; }
-.sets-ui #dialog .connection-instructions .icon-settings-pair { display: none; }
-.sets-ui .closed-captions-dialog { text-align: left; padding-left: 1em; }
-.sets-ui .delete-video-error, .sets-ui .paid-scope-dialog, .sets-ui .video-edit-error, .sets-ui .video-processing, .sets-ui .video-upload-error { margin: 3em; font-size: 1.6em; }
-.limited-animation .auto-play-tile.focused .video-tile { background-color: rgb(241, 241, 241); }
-.limited-animation.sets-ui .title-card { background: linear-gradient(rgba(0, 0, 0, 0.901961), rgba(0, 0, 0, 0.8), transparent); }
-.limited-animation.sets-ui #search #text-box-background, .limited-animation.sets-ui #search #search-text-entry { background-color: rgba(0, 0, 0, 0); }
-.sets-ui .scrolling-text { text-align: left; padding-left: 1em; height: 20em; }
-.sets-ui #dialog .scrollbar { right: 11em; }
-.sets-ui #dialog-view .reset-help { width: 20em; }
-.sets-ui #dialog.remote-reset-dialog .buttons { position: inherit; }
-.sets-ui #dialog.remote-reset-dialog .reset-help { height: 11em; padding-left: 1em; text-align: left; }
-.sets-ui #dialog.remote-reset-dialog .connected-list { margin-right: 2em; }
-.sets-ui .dialog-focused #legend { bottom: 17%; right: 16%; }
-.exp-densityFiveTiles .horizontal-list > .content { font-size: 59%; }
-.exp-densityFiveTiles .shelf > .title { font-size: 1.5em; margin-bottom: 0.75em; margin-top: 0px; }
-.exp-densityFiveTiles .channel-bottom .title, .exp-densityFiveTiles .tile-bottom .title { font-size: 1.75em; }
-.exp-densityFiveTiles .tile-bottom .details { font-size: 1.5em; height: 50%; margin: 0.2em 1em 0px 0px; }
-.exp-densityFiveTiles .channel-top .video-thumb { border-radius: 50%; }
-.limited-animation .exp-densityFiveTiles .browse-content .list { margin-left: -8em; width: 155em; }
-.exp-densityFourTiles .horizontal-list > .content { font-size: 67%; }
-.exp-densityFourTiles .shelf > .title { font-size: 1.5em; margin-bottom: 0.75em; margin-top: 0px; }
-.exp-densityFourTiles .channel-bottom .title, .exp-densityFourTiles .tile-bottom .title { font-size: 1.75em; }
-.exp-densityFourTiles .tile-bottom .details { font-size: 1.5em; height: 50%; margin: 0.2em 1em 0px 0px; }
-.limited-animation .exp-densityFourTiles .browse-content .list { margin-left: -8.5em; width: 155em; }
-.exp-densityFourTiles .channel-top .video-thumb { border-radius: 50%; }
-.exp-densityHideMetadata .shelf .horizontal-list .tile-bottom, .exp-densityHideMetadata .shelf .horizontal-list .channel-bottom { display: none; }
-.exp-densityHideMetadata .shelf.selected .horizontal-list .tile-bottom, .exp-densityHideMetadata .shelf.selected .horizontal-list .channel-bottom { display: block; }
-.exp-densityHideMetadata .horizontal-list .video-tile .tile-top .decoration { display: none; }
-.exp-densityHideMetadata #search .tile-top .decoration, .exp-densityHideMetadata #post-play-list .tile-top .decoration, .exp-densityHideMetadata .shelf.selected .horizontal-list .tile-top .decoration { display: block; }
-.exp-densityHideMetadata .shelf:not(.selected) .channel-tile .video-thumb { height: 70%; width: 70%; }
-.sets-ui .exp-densityHideMetadata .shelf:not(.selected) .carousel .item:hover, .sets-ui .exp-densityHideMetadata .shelf:not(.selected) .carousel .channel-tile:hover { background-color: inherit !important; }
-.limited-animation .exp-densityHideMetadata .browse-content .list .shelf:nth-child(1) { margin-bottom: 9.5em; }
-.limited-animation.sets-ui .exp-densityHideMetadata .channel-tile:not(.focused), .limited-animation.sets-ui .exp-densityHideMetadata .video-tile:not(.focused) { background-color: inherit; }
-.rockandroll.limited-animation.sets-ui .exp-densityHideMetadata .channel-tile:hover:not(.focused), .rockandroll.limited-animation.sets-ui .exp-densityHideMetadata .video-tile:hover:not(.focused) { background-color: inherit; }</style><style>@font-face { font-family: roboto-regular; src: url(www.youtube.com/s/tv/html5/misc/fonts/Roboto-Regular-20140804.ttf) format(truetype); }
-html { font-family: roboto-regular; }
-body { font-family: roboto-regular; }
-.button span { font-family: roboto-regular; }
-.toggle-button span { font-family: roboto-regular; }
-@font-face { font-family: youtube-icons; src: url(www.youtube.com/s/tv/html5/f0d770f4/img/icons.ttf) format(truetype); }</style><script>(function (resourcePaths) {
- var imageContainer = document.createElement('div');
- imageContainer.style.position = 'absolute';
- imageContainer.style.left = '0px';
- imageContainer.style.top = '0px';
- imageContainer.style.visibility = 'hidden';
-
- var pendingResourceCount = 0;
- resourcePaths.forEach(function(resourcePath) {
- console.log(resourcePath);
- if (/\.(jpeg|jpg|png)$/i.test(resourcePath)) {
- ++pendingResourceCount;
- console.log(pendingResourceCount);
- var imageElement = new Image();
- imageElement.src = resourcePath;
- imageContainer.appendChild(imageElement);
- }
- });
- })(["www.youtube.com/s/tv/fonts/CutiveMono-Regular.woff","www.youtube.com/s/tv/fonts/PTM55FT.woff","www.youtube.com/s/tv/fonts/PT_Serif-Caption-Web-Regular.woff","www.youtube.com/s/tv/fonts/PT_Sans-Caption-Web-Regular.woff","www.youtube.com/s/tv/fonts/Handlee-Regular.woff","www.youtube.com/s/tv/fonts/DancingScript-Regular.woff","www.youtube.com/s/tv/fonts/MarcellusSC-Regular.woff","www.youtube.com/s/tv/html5/f0d770f4/img/circle.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-playbutton.png","www.youtube.com/s/tv/html5/f0d770f4/img/cast_disconnected_blue.png","www.youtube.com/s/tv/html5/f0d770f4/img/pair_promo.png","www.youtube.com/s/tv/html5/f0d770f4/img/dial-sprite.png","www.youtube.com/s/tv/html5/f0d770f4/img/volume_mute_pressed.png","www.youtube.com/s/tv/html5/f0d770f4/img/volume_0_pressed.png","www.youtube.com/s/tv/html5/f0d770f4/img/volume_1_pressed.png","www.youtube.com/s/tv/html5/f0d770f4/img/volume_2_pressed.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-help.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-feedback.png","www.youtube.com/s/tv/html5/f0d770f4/img/flag.png","www.youtube.com/s/tv/html5/f0d770f4/img/pairing-promo-combo.png","www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_light.png","www.youtube.com/s/tv/html5/f0d770f4/img/edit_tile_dark.png","www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_light.png","www.youtube.com/s/tv/html5/f0d770f4/img/trash_tile_dark.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-light.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-check-dark.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-light.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-private-dark.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-light.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-public-dark.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-light.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-privacy-unlisted-dark.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-aaa-engaged.png","www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-desktop.png","www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-bbb.png","www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ccc.png","www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ddd.png","www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-eee.png","www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-fff.png","www.youtube.com/s/tv/html5/f0d770f4/img/legend-sprite-ggg.png","www.youtube.com/s/tv/html5/f0d770f4/img/icon-playbutton.png","www.youtube.com/s/tv/html5/f0d770f4/img/player-play.png","www.youtube.com/s/tv/html5/f0d770f4/img/player-pause.png","www.youtube.com/s/tv/html5/f0d770f4/app-prod.css","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-yt-logo.png","www.youtube.com/s/tv/html5/f0d770f4/img/yt-kids-logo.png","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-multi-user.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-yt-mix.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-tv-queue.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-promo.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-mother-goose.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-rainbow.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-sesame.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-talking-tom.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-kids-wonderquest.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-gaming-heart.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-end-screen-loki.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo.png","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music.jpg","www.youtube.com/s/tv/html5/f0d770f4/img/call-to-cast-music-party-logo.png","www.youtube.com/s/tv/html5/f0d770f4/img/yt-music-logo-small.png","www.youtube.com/s/tv/html5/f0d770f4/img/yt-logo-fullcolor.png","www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-active.png","www.youtube.com/s/tv/html5/f0d770f4/img/button-unmute-onhover-active.png","www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-active.png","www.youtube.com/s/tv/html5/f0d770f4/img/button-mute-onhover-active.png","www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-active.png","www.youtube.com/s/tv/html5/f0d770f4/img/button-fullscreen-onhover-active.png","www.youtube.com/s/tv/html5/f0d770f4/img/motion-control-sprite.png","www.youtube.com/s/tv/html5/misc/fonts/Roboto-Regular-20140804.ttf","www.youtube.com/s/tv/html5/f0d770f4/img/icons.ttf","www.youtube.com/s/tv/html5/f0d770f4/img/default_bg.jpg","i.ytimg.com/vi/_TWbD3MKfMI/hqdefault.jpg","i.ytimg.com/vi/vvFHyFW_jFc/hqdefault.jpg","i.ytimg.com/vi/q14aPbvbvl8/hqdefault.jpg","i.ytimg.com/vi/M9WlASe5ThU/hqdefault.jpg","i.ytimg.com/vi/59_zMJRhFM0/hqdefault.jpg","i.ytimg.com/vi/tnfPNYpi8rc/hqdefault.jpg","i.ytimg.com/vi/F50yjSws9gQ/hqdefault.jpg","i.ytimg.com/vi/rs-Ou-gjReQ/hqdefault.jpg","i.ytimg.com/vi/x5ZxRObLLzE/hqdefault.jpg","i.ytimg.com/vi/LZoilVdo7Hw/hqdefault.jpg","i.ytimg.com/vi/0vEKItRNIb0/hqdefault.jpg","i.ytimg.com/vi/8VstEBbwhnc/hqdefault.jpg","i.ytimg.com/vi/qkKRkfZYhlE/hqdefault.jpg","i.ytimg.com/vi/MODTYlzxY9U/hqdefault.jpg","i.ytimg.com/vi/D-YPnDvTCmI/hqdefault.jpg","i.ytimg.com/vi/wNRUzu4fTgw/hqdefault.jpg","i.ytimg.com/vi/GwzBLYGRj6c/hqdefault.jpg","i.ytimg.com/vi/rtzlT78OEks/hqdefault.jpg","i.ytimg.com/vi/eOOyxSMI0aE/hqdefault.jpg","i.ytimg.com/vi/RL7grUEo960/hqdefault.jpg","i.ytimg.com/vi/2A07xMhKC6g/hqdefault.jpg","i.ytimg.com/vi/Z31LDqbhN8U/hqdefault.jpg","i.ytimg.com/vi/zzmrTdAtEu4/hqdefault.jpg","i.ytimg.com/vi/1dXVzBU5p-Q/hqdefault.jpg","i.ytimg.com/vi/spC883rn6zk/hqdefault.jpg","i.ytimg.com/vi/XilhAJZ2qxs/hqdefault.jpg","i.ytimg.com/vi/tCehxI5a1y0/hqdefault.jpg","i.ytimg.com/vi/qrZcKwcVwk8/hqdefault.jpg","i.ytimg.com/i/F0pVplsI8R5kcAqgtoRqoA/1.jpg","i.ytimg.com/i/-9-kyTW8ZkZNDHQJ6FgpwQ/1.jpg","i.ytimg.com/i/Egdi0XIXXZ-qJOFPf4JSKw/1.jpg","i.ytimg.com/i/OpNcN46UbXVtpKMrmU4Abg/1.jpg","i.ytimg.com/i/YfdidRxbB8Qhf0Nx7ioOYw/1.jpg","i.ytimg.com/i/4R8DWoMoI7CAwX8_LjQHig/1.jpg","yt3.ggpht.com/-dL2jeHlm2Ok/AAAAAAAAAAI/AAAAAAAAAAA/ZCMMkRj-hrw/s88-c-k-no/photo.jpg","i.ytimg.com/i/xAgnFbkxldX6YUEvdcNjnA/1.jpg","i.ytimg.com/i/i-g4cjqGV7jvU8aeSuj0jQ/1.jpg"]);</script></head>
- <body class="desktop sets-ui lang-en_US lang-case-sensitive" style="font-size: 150%;">
-
- <div id="leanback"><div id="app-markup" class="focused exp-autoOpenGuide exp-mdxIgnoreFlings exp-innertubeCountdown exp-enableSafetyModeRename exp-atomSubscriptionsMultirowShelves browse-sets-state guide-focused application" tabindex="-1"> <div id="background" class="no-model background" tabindex="-1" style="background-image: url(www.youtube.com/s/tv/html5/f0d770f4/img/default_bg.jpg);"></div> <div id="watch" class="no-model watch" tabindex="-1"> <div id="leanback-player-container"><div class="html5-video-player el-leanback ytp-no-controls" tabindex="-1" id="movie_player" data-version="//s.ytimg.com/yts/jsbin/html5player-new-en_GB-vflmdFuIW/html5player-new.js"><div class="html5-video-container"><video class="video-stream html5-main-video" style="width: 1920px; height: 1080px; left: 0px; top: -1080px; transform: none;"></video><div class="html5-video-content" style="width: 1920px; height: 1080px; left: 0px; top: 0px;"></div></div></div></div> <div class="title-card no-model watch-title-tray" id="title-tray" tabindex="-1"> <div class="player-meta"> <div class="user-details hidden"> <div class="message">Added by </div> <div class="avatar no-model image" data-image-url="{{addedByUserAvatarUrl}}" tabindex="-1"></div> </div> <div class="player-video-avatar no-model image" data-image-url="{{channelAvatarUrl}}" tabindex="-1"></div> <div class="player-video-text"> <div class="player-video-title"></div> <div class="player-video-details"> <div class="username"></div> <div class="set-context hidden"></div> <div class="set-context-position hidden">0 of 0</div> <div class="uploaded-date"></div> <div class="view-count"><span class="view-count-label"></span></div> <div class="hidden no-model quality-status" tabindex="-1"> <div class="quality-status-hd-badge"></div></div> <div id="badges" class="badges hidden"> <span class="live-badge">Live</span> </div> <div class="ypc-preview">Preview: This video requires payment to watch.</div> </div> </div> </div></div> <div id="eureka-player-controls-container"> <div id="eureka-player-controls"></div> </div> <div id="pivot-post-play" class="hidden no-model pivot-post-play" tabindex="-1"> <div id="post-play-list" class="no-model no-content postplay-horizontal-list" tabindex="-1"> <div class="no-content-message"> <div class="text">No videos are available</div> </div> <div class="content"><div class="no-model carousel" tabindex="-1"></div><div class="hidden no-model pivot-sliding-highlighter" tabindex="-1"> <div class="select">Select</div></div></div></div></div> <div id="bottom-half"> <div id="transport-controls" class="no-model transport-controls" tabindex="-1"> <div class="player-controls-widget"> <div id="player-controls" class="player-controls"> <div id="button-list" class=" list" data-model="{{buttonCollection}}" data-enable-sounds="false" tabindex="-1"><div class="icon-ellipsis button" tabindex="-1"><span class="label">more actions</span></div><div class="icon-home button" tabindex="-1"><span class="label">Go Home</span></div><div class="icon-player-prev button" tabindex="-1"><span class="label">skip backward</span></div><div class="icon-player-rew button" tabindex="-1"><span class="label">rewind</span></div><div class="selected icon-player-play toggle-button" tabindex="-1"><span>play</span></div><div class="icon-player-ff button" tabindex="-1"><span class="label">forward</span></div><div class="icon-player-next button" tabindex="-1"><span class="label">skip forward</span></div><div class="icon-player-closedcaptions toggle-button" tabindex="-1"><span>captions</span></div><div class="disabled spacer button" tabindex="-1"><span class="label"></span></div></div> </div> <div class="player-seekbar"> <div id="progress-bar" class=" progress-bar" tabindex="-1"> <div class="progress-bar-line"> <div class="progress-bar-background"></div> <div class="progress-bar-loaded" style="width:0%"></div> <div class="progress-bar-played" style="width:0%"></div> </div> <div class="progress-bar-playhead"> <div class="no-model cue-range-markers" tabindex="-1"></div> <div class="progress-bar-disc" style="left:0%"></div> </div></div> <div id="player-time-elapsed" class="no-model elapsed-time" tabindex="-1">0:00</div> <div class="player-time-total"></div> <div class="live-indicator">Live</div> </div> </div></div> <div class="hidden skip-ad-button" tabindex="-1"> <div class="label"> <span class="skip-button-text"></span> <span class="skip-symbol icon-player-next"></span> <span class="skip-symbol icon-settings-pair"></span> <span class="skip-symbol icon-cast_on"></span> </div></div> <div class="hidden no-model advertisement-info" tabindex="-1"> <div class="advertisement-info-top"> <div class="youtube-hosted"> <div class="advertisement-avatar no-model image" data-image-url="{{advertiserAvatar}}" tabindex="-1"></div> <div class="advertisement-info-details"> <div class="advertisement-title"></div> <div class="advertisement-advertiser"> <span class="ad-badge">Ad</span> <span class="remaining-duration"></span> <span class="ad-point-separator">•</span> <span class="ad-by">by </span> </div> </div> </div> <div class="third-party"> <span class="ad-badge">Ad</span> <span class="ad-point-separator">•</span> <span class="remaining-duration"></span> </div> </div></div> <div class="no-model no-content pivot-shelf-list" tabindex="-1"> <div class="no-content-message"> <div class="text">No videos are available</div> </div><div class=" carousel" tabindex="-1"></div></div></div></div> <div id="call-to-cast" class="no-model call-to-cast" tabindex="-1"> <div class="THEME-cl end-screen multi-user left"> <h2 class="call-to-cast-text">Everyone's connected.</h2> <h3 class="call-to-cast-text">Friends and family can <em>join in</em> and add videos to your TV Queue.</h3> <div class="yt-logo"></div> </div> <div class="THEME-cl end-screen yt-mix right"> <h2 class="call-to-cast-text">Find the perfect mix.</h2> <h3 class="call-to-cast-text">Play a nonstop <em>YouTube Mix</em> inspired by your favorite artist or video.</h3> <div class="yt-logo"></div> </div> <div class="THEME-cl end-screen kids-promo left"> <h2 class="call-to-cast-text"> Have the YouTube Kids app? </h2> <h3 class="call-to-cast-text"> Get the family <em>together</em> and watch your favorite videos on the big screen. </h3> <div class="yt-kids-logo"></div> </div> <div class="THEME-cl end-screen tv-queue left"> <h2 class="call-to-cast-text">What's up next?</h2> <h3 class="call-to-cast-text">Browse and add videos to your <em>TV Queue</em> while your current video keeps playing.</h3> <div class="yt-logo"></div> </div> <div class="THEME-k end-screen kids-mother-goose left"> <h3 class="call-to-cast-text">Tap a video to watch on your TV.</h3> </div> <div class="THEME-k end-screen kids-rainbow left"> <h3 class="call-to-cast-text">Tap a video to watch on your TV.</h3> </div> <div class="THEME-k end-screen kids-sesame left"> <h3 class="call-to-cast-text">Tap a video to watch on your TV.</h3> </div> <div class="THEME-k end-screen kids-talking-tom left"> <h3 class="call-to-cast-text">Tap a video to watch on your TV.</h3> </div> <div class="THEME-k end-screen kids-wonderquest left"> <h3 class="call-to-cast-text">Tap a video to watch on your TV.</h3> </div> <div class="THEME-g end-screen gaming-heart left"> <h3 class="call-to-cast-text"></h3> </div> <div class="THEME-up end-screen loki left"> <h3 class="call-to-cast-text">Pick a video, yo.</h3> </div> <div class="THEME-m end-screen music-ready"> <div class="call-to-cast-logo"></div> <h2 class="call-to-cast-text">Ready to play</h2> <h3 class="call-to-cast-text">Choose some music in YouTube Music and play it here</h3> </div> <div class="THEME-m end-screen music-party"> <div class="call-to-cast-logo"></div> <h3 class="call-to-cast-text">Need a soundtrack for your party?</h3> <h3 class="call-to-cast-text">Stream endless video or audio stations to match the mood.</h3> <div class="footer"></div> </div></div> <div id="browse-sets" class="no-background browse-sets" tabindex="-1"> <div id="browse-search-bar" class="no-model icon-button" tabindex="-1"> <span class="icon icon-search"></span> <span class="label"></span></div> <div class="youtube-logo-top"> <div class="youtube-logo icon-youtube-logo"></div> <div class="youtube-unlimited-logo icon-youtube-unlimited-logo"></div> </div> <div id="browse-header" class="hidden no-model collapsed two-buttons browse-header" tabindex="-1"> <div class="browse-header-gradient"></div> <div class="browse-header-metadata"> <div class="browse-header-avatar no-model image" data-image-url="{{avatarImageURL}}" tabindex="-1"></div> <div class="title"></div> </div> <div class="browse-header-button-bar no-model component" tabindex="-1"> <div class="button browse-header-trailer no-model icon-button" tabindex="-1"> <span class="icon icon-player-play"></span> <span class="label"></span></div> <div class="button browse-header-subscribe no-model subscribe-button" tabindex="-1"> <span class="icon icon-logo-lozenge"></span> <span class="label"></span></div> </div></div> <div id="platform-user-icon" class="hidden no-model image" data-image-url="{{platformUserIcon}}" tabindex="-1"></div> <div class="browse-content"> <div id="shelves" class=" shelves" tabindex="-1"> <div class="title"></div> <div class="no-content-message"> <div class="text">No videos are available</div> </div><div class=" carousel" tabindex="-1"><div class="selected shelf" tabindex="-1" style="height: 24em; opacity: 1; z-index: 1; transform: translateX(0%) translateY(0%) scale(1) translateZ(0px); transition: none 0s;"> <div class="icon "></div> <div class="title"> <span class="main">Screen Rant</span> <span class="annotation">Recommended channel</span> </div> <div class="content-container"><div class=" horizontal-list" tabindex="-1"> <div class="no-content-message"> <div class="text">No videos are available</div> </div> <div class="content"><div class=" sliding-highlighter" tabindex="-1" style="transform: translateX(0%) translateZ(0px); transition: none 0s;"> <div class="select">Select</div></div><div class=" carousel" tabindex="-1"><div class="item tile selected video-tile" tabindex="-1" style="transform: translateX(0%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/_TWbD3MKfMI/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">7:30</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">16,573,823 views</div> <div class="age">3 months ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(107%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/vvFHyFW_jFc/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">7:06</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">11,425,149 views</div> <div class="age">3 months ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(214%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/q14aPbvbvl8/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">7:25</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">8,454,555 views</div> <div class="age">5 months ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(321%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/M9WlASe5ThU/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">6:24</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">3,804,435 views</div> <div class="age">2 months ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(428%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/59_zMJRhFM0/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">7:14</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">487,432 views</div> <div class="age">3 weeks ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(535%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/tnfPNYpi8rc/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">9:22</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">3,156,426 views</div> <div class="age">7 months ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(642%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/F50yjSws9gQ/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">5:27</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">1,108,695 views</div> <div class="age">3 weeks ago</div> </div> </div></div></div></div></div></div></div><div class=" shelf" tabindex="-1" style="height: 24em; opacity: 1; z-index: 2; transform: translateX(0%) translateY(106%) scale(1) translateZ(0px); transition: none 0s;"> <div class="icon "></div> <div class="title"> <span class="main">FailArmy</span> <span class="annotation">Recommended channel</span> </div> <div class="content-container"><div class=" horizontal-list" tabindex="-1"> <div class="no-content-message"> <div class="text">No videos are available</div> </div> <div class="content"><div class=" sliding-highlighter" tabindex="-1" style="transform: translateX(0%) translateZ(0px); transition: none 0s;"> <div class="select">Select</div></div><div class=" carousel" tabindex="-1"><div class="item tile selected video-tile" tabindex="-1" style="transform: translateX(0%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/rs-Ou-gjReQ/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">7:01</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">4,792,124 views</div> <div class="age">1 month ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(107%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/x5ZxRObLLzE/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">6:49</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">5,144,308 views</div> <div class="age">2 weeks ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(214%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/LZoilVdo7Hw/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">7:06</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">3,485,342 views</div> <div class="age">3 weeks ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(321%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/0vEKItRNIb0/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">6:54</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">KidsCat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">3,469,457 views</div> <div class="age">3 weeks ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(428%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/8VstEBbwhnc/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">6:52</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">4,334,756 views</div> <div class="age">1 week ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(535%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/qkKRkfZYhlE/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">6:37</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">3,053,167 views</div> <div class="age">2 weeks ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(642%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/MODTYlzxY9U/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">6:44</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">2,734,235 views</div> <div class="age">1 week ago</div> </div> </div></div></div></div></div></div></div><div class=" shelf" tabindex="-1" style="height: 24em; opacity: 1; z-index: 3; transform: translateX(0%) translateY(212%) scale(1) translateZ(0px); transition: none 0s;"> <div class="icon "></div> <div class="title"> <span class="main">Cyprien</span> <span class="annotation">Recommended channel</span> </div> <div class="content-container"><div class=" horizontal-list" tabindex="-1"> <div class="no-content-message"> <div class="text">No videos are available</div> </div> <div class="content"><div class=" sliding-highlighter" tabindex="-1" style="transform: translateX(0%) translateZ(0px); transition: none 0s;"> <div class="select">Select</div></div><div class=" carousel" tabindex="-1"><div class="item tile selected video-tile" tabindex="-1" style="transform: translateX(0%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/D-YPnDvTCmI/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">5:02</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">byby Not a Cat</div> <div class="views">9,832,315 views</div> <div class="age">1 month ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(107%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/wNRUzu4fTgw/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">11:44</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">15,035,125 views</div> <div class="age">8 months ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(214%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/GwzBLYGRj6c/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">6:32</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">10,769,981 views</div> <div class="age">4 months ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(321%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/rtzlT78OEks/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">6:32</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">12,174,818 views</div> <div class="age">4 months ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(428%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/eOOyxSMI0aE/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">6:32</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">11,402,149 views</div> <div class="age">5 months ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(535%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/RL7grUEo960/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">4:50</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">27,077,657 views</div> <div class="age">1 year ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(642%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/2A07xMhKC6g/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">5:55</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">11,230,070 views</div> <div class="age">6 months ago</div> </div> </div></div></div></div></div></div></div><div class=" shelf" tabindex="-1" style="height: 24em; opacity: 1; z-index: 3; transform: translateX(0%) translateY(212%) scale(1) translateZ(0px); transition: none 0s;"> <div class="icon "></div> <div class="title"> <span class="main">Recently Uploaded</span> <span class="annotation">Recommended videos</span> </div> <div class="content-container"><div class=" horizontal-list" tabindex="-1"> <div class="no-content-message"> <div class="text">No videos are available</div> </div> <div class="content"><div class=" sliding-highlighter" tabindex="-1" style="transform: translateX(0%) translateZ(0px); transition: none 0s;"> <div class="select">Select</div></div><div class=" carousel" tabindex="-1"><div class="item tile selected video-tile" tabindex="-1" style="transform: translateX(0%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/Z31LDqbhN8U/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">10:23</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">23,123 views</div> <div class="age">5 days ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(107%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/zzmrTdAtEu4/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">14:09</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">23,595 views</div> <div class="age">3 days ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(214%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/1dXVzBU5p-Q/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">14:26</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">53,711 views</div> <div class="age">6 days ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(321%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/spC883rn6zk/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">17:41</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">62,903 views</div> <div class="age">5 days ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(428%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/XilhAJZ2qxs/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">11:46</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">37,470 views</div> <div class="age">2 days ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(535%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/tCehxI5a1y0/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">10:28</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">9,132 views</div> <div class="age">2 days ago</div> </div> </div></div><div class="item tile video-tile" tabindex="-1" style="transform: translateX(642%) translateZ(0px); transition: none 0s;"><div class="no-model tile-focus-target" tabindex="-1"></div> <div class="tile-top"> <div class="video-thumb no-model image" data-image-url="{{model.imageUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/vi/qrZcKwcVwk8/hqdefault.jpg);"></div> <div class="voice-command">Cat Video</div> <div class="decoration"> <div class="live-badge badge hidden"></div> <div class="text-badge badge hidden"></div> <div class="duration">8:43</div> </div> </div> <div class="overlay hidden"> <div class="count"><div><strong></strong></div>videos</div> <div class="icon"></div> </div> <div class="tile-bottom"> <div class="title">Cat Video</div> <div class="details"> <div class="by">by Not a Cat</div> <div class="views">23,568 views</div> <div class="age">3 days ago</div> </div> </div></div></div></div></div></div></div></div></div> </div></div> <div id="settings-placeholder"></div> <div id="search" class="hidden no-model search" tabindex="-1"> <div class="youtube-logo-top"> <div class="youtube-logo icon-youtube-logo"></div> <div class="youtube-unlimited-logo icon-youtube-unlimited-logo"></div> </div> <div class="controls"> <div id="text-box-background"> <div id="search-text-box"> <span class="icon-search"></span> <input id="search-input" autocomplete="off" class="no-model component" title="search" placeholder="Search..." tabindex="-1"> <span id="search-query" class="hidden"></span> </div> </div> <div id="search-text-entry"> <div class="suggestions-container"> <div id="keyboard-icon" class="icon-search-keyboard"></div> <div id="search-suggestions" class=" suggestions" tabindex="-1"> <div id="suggest-list" class=" list" data-model="{{model.suggestions}}" data-catch-mouse-move="{{catchMouseMove}}" data-scroll-on-focus="true" tabindex="-1"></div></div> </div> <div id="search-keyboard" class=" keyboard" tabindex="-1"> <div id="transliteration-container"> <div id="transliteration" class="no-model transliteration" tabindex="-1"> <div class=" list" data-model="{{transliterations}}" tabindex="-1"> </div></div> </div> <div id="keyboard-grid" class=" grid" tabindex="-1"> <div class="selected list" data-catch-mouse-move="{{catchRowMouseMove}}" data-item-factory="{{itemFactory}}" data-item-name="{{itemName}}" data-is-vertical="false" data-loop="{{loopRows}}" data-consume-events="{{consumeEvents}}" data-rate-limit="{{rateLimit}}" tabindex="-1"><div class="selected button" tabindex="-1"><span class="label">a</span></div><div class=" button" tabindex="-1"><span class="label">b</span></div><div class=" button" tabindex="-1"><span class="label">c</span></div><div class=" button" tabindex="-1"><span class="label">d</span></div><div class=" button" tabindex="-1"><span class="label">e</span></div><div class=" button" tabindex="-1"><span class="label">f</span></div><div class=" button" tabindex="-1"><span class="label">g</span></div><div class="icon-key-delete button" tabindex="-1"><span class="label"></span></div></div><div class=" list" data-catch-mouse-move="{{catchRowMouseMove}}" data-item-factory="{{itemFactory}}" data-item-name="{{itemName}}" data-is-vertical="false" data-loop="{{loopRows}}" data-consume-events="{{consumeEvents}}" data-rate-limit="{{rateLimit}}" tabindex="-1"><div class="selected button" tabindex="-1"><span class="label">h</span></div><div class=" button" tabindex="-1"><span class="label">i</span></div><div class=" button" tabindex="-1"><span class="label">j</span></div><div class=" button" tabindex="-1"><span class="label">k</span></div><div class=" button" tabindex="-1"><span class="label">l</span></div><div class=" button" tabindex="-1"><span class="label">m</span></div><div class=" button" tabindex="-1"><span class="label">n</span></div><div class="clear-query-tile button" tabindex="-1"><span class="label">Clear</span></div></div><div class=" list" data-catch-mouse-move="{{catchRowMouseMove}}" data-item-factory="{{itemFactory}}" data-item-name="{{itemName}}" data-is-vertical="false" data-loop="{{loopRows}}" data-consume-events="{{consumeEvents}}" data-rate-limit="{{rateLimit}}" tabindex="-1"><div class="selected button" tabindex="-1"><span class="label">o</span></div><div class=" button" tabindex="-1"><span class="label">p</span></div><div class=" button" tabindex="-1"><span class="label">q</span></div><div class=" button" tabindex="-1"><span class="label">r</span></div><div class=" button" tabindex="-1"><span class="label">s</span></div><div class=" button" tabindex="-1"><span class="label">t</span></div><div class=" button" tabindex="-1"><span class="label">u</span></div><div class="numbers-toggle-tile button" tabindex="-1"><span class="label">&123</span></div></div><div class=" list" data-catch-mouse-move="{{catchRowMouseMove}}" data-item-factory="{{itemFactory}}" data-item-name="{{itemName}}" data-is-vertical="false" data-loop="{{loopRows}}" data-consume-events="{{consumeEvents}}" data-rate-limit="{{rateLimit}}" tabindex="-1"><div class="selected button" tabindex="-1"><span class="label">v</span></div><div class=" button" tabindex="-1"><span class="label">w</span></div><div class=" button" tabindex="-1"><span class="label">x</span></div><div class=" button" tabindex="-1"><span class="label">y</span></div><div class=" button" tabindex="-1"><span class="label">z</span></div><div class=" button" tabindex="-1"><span class="label">-</span></div><div class=" button" tabindex="-1"><span class="label">'</span></div></div></div> <div id="letter-suggest" class=" list" data-is-vertical="true" data-catch-mouse-move="true" data-model="{{letterSuggestions}}" tabindex="-1"></div> <div> <div id="keyboard-spacebar" class="icon-key-space button" tabindex="-1"><span class="label"></span></div> </div></div> <div class="search-hint"> Voice search is not supported. </div> </div> </div> <div class="search-pairing"> <div class="search-img"></div> <div class="search-message"> <div class="title">Search Faster</div> <div class="pairing no-model dial-upsell pairing-dialog" id="pairing" tabindex="-1"> <div class="dialog-large-icon icon-settings-pair"></div> <div class="connection-instructions icon-dialog-content"> <div class="dial-upsell-content"> Connect one or more devices to the same Wi-Fi network and select <div class="cast-icon"> </div> </div> <div class="manual-connect-content"> <div class="connection-steps"> <div class="with-dial-connect-step1"> <div class="step1">Or go to</div> <div class="pair-url">youtube.com/pair</div> </div> <div class="no-dial-connect-step1"> <div class="step1">Go to</div> <div class="pair-url">youtube.com/pair</div> </div> <div class="no-dial-connect-step2"> <div class="step2">and enter</div> <div class="pair-code">Loading...</div> </div> </div> </div> </div></div> </div> </div> <div id="results-placeholder"></div></div> <div id="pointer-overlay" class="-overlay hidden"></div> <div id="guide" class="focused guide" tabindex="-1"> <div id="user-info-background"> <div class="user-info-container"> <div id="guide-user-avatar" style="background-image: url()"></div> <div class="guide-user-text"> <div class="guide-user-name"></div> <div class="guide-user-unlimited"></div> </div> </div> </div> <div class="collapsed-guide"></div> <div class="guide-carousel-background"></div> <div class="collapsed-guide-icons"> <div class="collapsed-guide-icon icon-guide-what-to-watch"></div> <div class="collapsed-guide-icon icon-guide-my-subs"></div> <div class="collapsed-guide-icon icon-popular"></div> <div class="collapsed-guide-icon icon-music"></div> <div class="collapsed-guide-icon icon-ellipsis"></div> </div> <div id="error-message">Sorry, the rest of this Guide isn’t available right now.</div><div class=" sliding-highlighter" tabindex="-1" style="transform: translateY(200%) translateZ(0px); transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 0.2, 1);"> <div class="select">Select</div></div><div class="focused carousel" tabindex="-1"><div class=" guide-button" tabindex="-1" style="transform: translateY(0%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon icon-people"> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1"></div> </div> <div class="guide-button-title">Sign In</div></div><div class=" guide-button" tabindex="-1" style="transform: translateY(100%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon icon-search"> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1"></div> </div> <div class="guide-button-title">Search</div></div><div class="focused selected guide-button" tabindex="-1" style="transform: translateY(200%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon icon-guide-what-to-watch"> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1"></div> </div> <div class="guide-button-title">Home</div></div><div class=" guide-button" tabindex="-1" style="transform: translateY(300%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon icon-player-settings"> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1"></div> </div> <div class="guide-button-title">Settings</div></div><div class="disabled guide-button" tabindex="-1" style="transform: translateY(400%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon "> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1"></div> </div> <div class="guide-button-title">Best of YouTube</div></div><div class="has-image guide-button" tabindex="-1" style="transform: translateY(500%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon "> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/i/F0pVplsI8R5kcAqgtoRqoA/1.jpg);"></div> </div> <div class="guide-button-title">Popular on YouTube</div></div><div class="has-image guide-button" tabindex="-1" style="transform: translateY(600%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon "> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/i/-9-kyTW8ZkZNDHQJ6FgpwQ/1.jpg);"></div> </div> <div class="guide-button-title">Music</div></div><div class="has-image guide-button" tabindex="-1" style="transform: translateY(700%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon "> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/i/Egdi0XIXXZ-qJOFPf4JSKw/1.jpg);"></div> </div> <div class="guide-button-title">Sports</div></div><div class="has-image guide-button" tabindex="-1" style="transform: translateY(800%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon "> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/i/OpNcN46UbXVtpKMrmU4Abg/1.jpg);"></div> </div> <div class="guide-button-title">Gaming</div></div><div class="has-image guide-button" tabindex="-1" style="transform: translateY(900%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon "> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/i/YfdidRxbB8Qhf0Nx7ioOYw/1.jpg);"></div> </div> <div class="guide-button-title">News</div></div><div class="has-image guide-button" tabindex="-1" style="transform: translateY(1000%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon "> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/i/4R8DWoMoI7CAwX8_LjQHig/1.jpg);"></div> </div> <div class="guide-button-title">Live</div></div><div class="has-image guide-button" tabindex="-1" style="transform: translateY(1100%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon "> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1" style="background-image: url(yt3.ggpht.com/-dL2jeHlm2Ok/AAAAAAAAAAI/AAAAAAAAAAA/ZCMMkRj-hrw/s88-c-k-no/photo.jpg);"></div> </div> <div class="guide-button-title">Spotlight</div></div><div class="has-image guide-button" tabindex="-1" style="transform: translateY(1200%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon "> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/i/xAgnFbkxldX6YUEvdcNjnA/1.jpg);"></div> </div> <div class="guide-button-title">Film & Animation</div></div><div class="has-image guide-button" tabindex="-1" style="transform: translateY(1300%) translateZ(0px); transition: none 0s;"> <div class="guide-button-icon "> <div class="no-model image" data-image-url="{{model.iconUrl}}" tabindex="-1" style="background-image: url(i.ytimg.com/i/i-g4cjqGV7jvU8aeSuj0jQ/1.jpg);"></div> </div> <div class="guide-button-title">Entertainment</div></div></div></div> <div class="no-model application-message" tabindex="-1"></div> <div id="spinner" class="hidden no-model spinner" tabindex="-1"> <div class="fallback-loading-indicator">LOADING...</div> <div class="loading-indicator"> <div class="dot" id="dot1"></div> <div class="dot" id="dot2"></div> <div class="dot" id="dot3"></div> <div class="dot" id="dot4"></div> <div class="dot" id="dot5"></div> <div class="dot" id="dot6"></div> <div class="dot" id="dot7"></div> <div class="dot" id="dot8"></div> </div></div> <h1 class=" debug-watermark" tabindex="-1"></h1> <div class="browse-sets no-model dialog" id="dialog" tabindex="-1"> <div id="dialog-wrapper"> <div class="dialog-icon"></div> <!-- Only used for flat UI --> <div class="dialog-contents"> <div class="header"> <div class="title"></div> </div> <div class="no-model component" id="dialog-view" tabindex="-1"></div> <div class="buttons"> <div id="dialog-cancel-button" class="no-model button" tabindex="-1"><span class="label"></span></div> <div id="dialog-ok-button" class="no-model button" tabindex="-1"><span class="label"></span></div> </div> </div> </div></div> <div id="voice-footer-placeholder"></div> <div id="legend" class="close-guide search legend" tabindex="-1"> <div class="more no-model legend-item" tabindex="-1"> <span class="icon icon-player-more"></span> <span class="title">Show More</span></div> <div class="back no-model legend-item" tabindex="-1"> <span class="icon "></span> <span class="title">Go Back</span></div> <div class="exit no-model legend-item" tabindex="-1"> <span class="icon "></span> <span class="title">Exit</span></div> <div class="reversed-back no-model legend-item" tabindex="-1"> <span class="icon "></span> <span class="title">Go Back</span></div> <div class="search no-model legend-item" tabindex="-1"> <span class="icon "></span> <span class="title">Search</span></div> <div class="space no-model legend-item" tabindex="-1"> <span class="icon "></span> <span class="title">Space</span></div> <div class="home no-model legend-item" tabindex="-1"> <span class="icon "></span> <span class="title">Go Home</span></div> <div class="modify no-model legend-item" tabindex="-1"> <span class="icon "></span> <span class="title">Modify</span></div> <div class="delete no-model legend-item" tabindex="-1"> <span class="icon "></span> <span class="title">Delete</span></div> <div class="guide no-model legend-item" tabindex="-1"> <span class="icon "></span> <span class="title">Open Guide</span></div> <div class="close-guide no-model legend-item" tabindex="-1"> <span class="icon "></span> <span class="title">Close Guide</span></div></div> <div class=" toaster" tabindex="-1"> <div class=" list" data-model="{{model}}" tabindex="-1"></div></div> <div class="no-model engagement-indicator" tabindex="-1"></div> <div class=" hidden" id="snap-controls" data-is-hidden="true"></div> <div id="context-menu-placeholder" class="hidden"></div> <div class="hidden no-model fps" tabindex="-1"></div></div></div>
-
-
-
-
-<div id="window-resizer-tooltip"><a href="#" title="Edit settings"></a><span class="tooltipTitle">Window size: </span><span class="tooltipWidth" id="winWidth"></span> x <span class="tooltipHeight" id="winHeight"></span><br><span class="tooltipTitle">Viewport size: </span><span class="tooltipWidth" id="vpWidth"></span> x <span class="tooltipHeight" id="vpHeight"></span></div></body></html>
diff --git a/src/cobalt/layout_tests/testdata/benchmarks/yt3.ggpht.com/-dL2jeHlm2Ok/AAAAAAAAAAI/AAAAAAAAAAA/ZCMMkRj-hrw/s88-c-k-no/photo.jpg b/src/cobalt/layout_tests/testdata/benchmarks/yt3.ggpht.com/-dL2jeHlm2Ok/AAAAAAAAAAI/AAAAAAAAAAA/ZCMMkRj-hrw/s88-c-k-no/photo.jpg
deleted file mode 100644
index 56b34fe..0000000
--- a/src/cobalt/layout_tests/testdata/benchmarks/yt3.ggpht.com/-dL2jeHlm2Ok/AAAAAAAAAAI/AAAAAAAAAAA/ZCMMkRj-hrw/s88-c-k-no/photo.jpg
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/combined-baseline-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-baseline-expected.png
new file mode 100644
index 0000000..4afe5c9
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-baseline-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/combined-baseline.html b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-baseline.html
new file mode 100644
index 0000000..ec8d3a2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-baseline.html
@@ -0,0 +1,181 @@
+<!DOCTYPE html>
+<!--
+ | Combined tests for basic functionality of CSS Flexible Box Layout Module.
+ | https://www.w3.org/TR/css-flexbox-1
+ -->
+<html>
+<head>
+<style>
+ body {
+ margin: 0px;
+ font-family: Roboto;
+ background-color: #808080;
+ font-size: 12px;
+ }
+ .vsized {
+ height: 38px;
+ }
+ .flex {
+ display: flex;
+ color: #99b9f3;
+ background-color: #ffee00;
+ opacity: 0.75;
+ }
+ .inlineflex {
+ display: inline-flex;
+ color: #99b9f3;
+ background-color: #ffee01;
+ opacity: 0.75;
+ }
+ .row {
+ flex-flow: row wrap;
+ }
+ .column {
+ flex-flow: column wrap;
+ }
+ .container {
+ overflow: hidden;
+ min-width: 2px;
+ padding: 2px;
+ border: 2px solid #000060;
+ outline: 2px solid #00f000;
+ margin: 6px;
+ border-bottom-width: 10px;
+ }
+ .item {
+ flex: 1 1 50px;
+ /* blue */
+ margin: 1px;
+ order: 0;
+ }
+ div > span {
+ background-color: #0047ab;
+ }
+</style>
+</head>
+<body>
+<div>
+
+-hg
+<div class="vsized inlineflex row container">
+ <span style="align-self: flex-end;">end</span>
+ <span style="align-self: flex-start;">start</span>
+ <span style="align-self: center;">center</span>
+ <span class="vsized" style="align-self: stretch;">stretch</span>
+</div>
+hg-hg
+<div class="vsized inlineflex row container">
+ <span style="align-self: center;">center</span>
+ <span style="align-self: flex-end;">end</span>
+ <span style="align-self: flex-start;">start</span>
+ <span class="vsized" style="align-self: stretch;">stretch</span>
+</div>
+hg-hg
+<div class="vsized inlineflex row container">
+ <span style="align-self: flex-start;">start</span>
+ <span style="align-self: flex-end;">end</span>
+ <span style="align-self: center;">center</span>
+ <span class="vsized" style="align-self: stretch;">stretch</span>
+</div>
+hg-
+</div><div>
+-hg
+<div class="vsized inlineflex row container">
+ <span style="align-self: flex-start;">start</span>
+ <span style="align-self: flex-end;">end</span>
+ <span style="align-self: center;">center</span>
+ <span style="align-self: baseline;">hg</span>
+ <span style="margin-top: auto; font-size: 2em; align-self: baseline;">hg</span>
+ <span class="vsized" style="align-self: stretch;">stretch</span>
+</div>
+hg-hg
+<div class="vsized inlineflex row container">
+ <span style="align-self: flex-start;">start</span>
+ <span style="align-self: flex-end;">end</span>
+ <span style="align-self: center;">center</span>
+ <span style="margin-top: auto; font-size: 2em; align-self: baseline;">hg</span>
+ <span class="vsized" style="align-self: stretch;">stretch</span>
+</div>
+hg-hg
+<div class="vsized inlineflex row container">
+ <span style="align-self: flex-start;">start</span>
+ <span style="align-self: flex-end;">end</span>
+ <span style="align-self: center;">center</span>
+ <span style="align-self: baseline;">hg</span>
+ <span style="font-size: 2em; align-self: baseline;">hg</span>
+ <span class="vsized" style="align-self: stretch;">stretch</span>
+</div>
+hg-
+</div><div>
+-hg
+<div class="vsized inlineflex row container">
+ <span style="align-self: baseline;">hg</span>
+ <span style="font-size: 2em; align-self: baseline;">hg</span>
+ <span style="align-self: flex-start;">start</span>
+ <span style="align-self: flex-end;">end</span>
+ <span style="align-self: center;">center</span>
+ <span class="vsized" style="align-self: stretch;">stretch</span>
+</div>
+hg-hg
+<div class="vsized inlineflex row container">
+ <span style="font-size: 2em; align-self: baseline;">hg</span>
+ <span style="align-self: baseline;">hg</span>
+ <span style="align-self: flex-start;">start</span>
+ <span style="align-self: flex-end;">end</span>
+ <span style="align-self: center;">center</span>
+ <span class="vsized" style="align-self: stretch;">stretch</span>
+</div>
+hg-hg
+<div class="vsized inlineflex row container">
+ <span style="align-self: flex-start;">start</span>
+ <span style="align-self: flex-end;">end</span>
+ <span style="align-self: center;">center</span>
+ <span class="vsized" style="align-self: stretch;">stretch</span>
+ <span style="font-size: 2em; align-self: baseline;">hg</span>
+ <span style="align-self: baseline;">hg</span>
+</div>
+hg-
+</div><div>
+-hg
+<div class="vsized inlineflex row container">
+ <span style="display: inline-block; align-self: center; width: 10px; height: 20px;"></span>
+ <span style="align-self: flex-start;">start</span>
+ <span style="align-self: flex-end;">end</span>
+ <span style="align-self: center;">center</span>
+ <span class="vsized" style="align-self: stretch;">stretch</span>
+</div>
+hg-hg
+<div class="vsized inlineflex row container">
+</div>
+hg-hg
+<div class="vsized inlineflex row container">
+ <span></span>
+</div>
+hg-hg
+<div class="vsized inlineflex column container">
+ <span style="display: inline-block; width: 10px; height: 10px;"></span>
+ <span style="display: inline-block; width: 10px; height: 10px;"></span>
+ <span style="display: inline-block; width: 10px; height: 10px;"></span>
+</div>
+hg-hg
+<div class="vsized inlineflex column container">
+ <span style="display: inline-block; width: 10px; height: 30px;"></span>
+</div>
+hg-hg
+<div class="vsized inlineflex column container">
+ <span style="display: inline-block; width: 10px; height: 10px;"></span>
+</div>
+hg-hg
+<div class="vsized inlineflex column container">
+ <span></span>
+</div>
+hg-hg
+<div class="vsized inlineflex column container">
+</div>
+hg-
+
+</div>
+
+</body>
+</html>
+
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/combined-positioning-tests-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-positioning-tests-expected.png
index a755805..cbf7803 100644
--- a/src/cobalt/layout_tests/testdata/css3-flexbox/combined-positioning-tests-expected.png
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-positioning-tests-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/combined-shrinking-and-justify-content-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-shrinking-and-justify-content-expected.png
new file mode 100644
index 0000000..010813f
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-shrinking-and-justify-content-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/combined-shrinking-and-justify-content.html b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-shrinking-and-justify-content.html
new file mode 100644
index 0000000..128a8f0
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-shrinking-and-justify-content.html
@@ -0,0 +1,271 @@
+<!DOCTYPE html>
+<!--
+ | Combined tests for basic functionality of CSS Flexible Box Layout Module.
+ | https://www.w3.org/TR/css-flexbox-1
+ | This test focuses on shrinking flex items and justify-content values.
+ -->
+<html>
+<head>
+<style>
+ body {
+ margin: 0px;
+ font-family: Roboto;
+ background-color: #808080;
+ font-size: 12px;
+ }
+ .inlineflex {
+ display: inline-flex;
+ color: #99b9f3;
+ background-color: #ffee08;
+ opacity: 0.75;
+ }
+ .flex {
+ display: flex;
+ color: #99b9f3;
+ background-color: #ffee08;
+ opacity: 0.75;
+ }
+
+ .widesized {
+ width: 100px;
+ height: 10px;
+ -no-margin-left: auto;
+ }
+ .sized {
+ width: 50px;
+ height: 10px;
+ }
+ .container {
+ flex-flow: row nowrap;
+ padding: 1px;
+ border: 1px solid #000060;
+ outline: 1px solid #00f000;
+ margin: 3px;
+ }
+ .flex-end {
+ justify-content: flex-end;
+ align-items: center;
+ align-content: center;
+ }
+ .center {
+ justify-content: center;
+ align-items: center;
+ align-content: center;
+ }
+ .space-between {
+ justify-content: space-between;
+ align-items: center;
+ align-content: center;
+ }
+ .center {
+ justify-content: center;
+ align-items: center;
+ align-content: center;
+ }
+ .space-around {
+ justify-content: space-around;
+ align-items: center;
+ align-content: center;
+ }
+ .blue {
+ background-color: #0047ab;
+ }
+ .red {
+ background-color: red;
+ }
+ .hidden {
+ overflow: hidden;
+ }
+ .visible {
+ overflow: visible;
+ }
+ .shrink-1 {
+ flex-shrink: 1;
+ }
+ .shrink-0-5 {
+ flex-shrink: 0.5;
+ }
+ .shrink-0-25 {
+ flex-shrink: 0.25;
+ }
+ .basis-0 {
+ flex-basis: 0;
+ }
+ .basis-big {
+ flex-basis: 100px;
+ }
+
+</style>
+</head>
+<body>
+<div style="display:inline-block; margin: 0 5px 0 40px; width: 50px;">
+
+<div class="sized flex flex-end container">
+ <div class="blue widesized shrink-1"></div>
+</div>
+
+<div class="sized flex flex-end container">
+ <div class="red widesized shrink-1"></div>
+ <div class="blue widesized shrink-0-5"></div>
+</div>
+
+<div class="sized flex flex-end container">
+ <div class="red widesized shrink-1"></div>
+ <div class="blue widesized shrink-1"></div>
+</div>
+
+<div class="sized flex flex-end container">
+ <div class="blue widesized shrink-0-5"></div>
+</div>
+
+<div class="sized flex flex-end container">
+ <div class="red widesized shrink-0-5"></div>
+ <div class="blue widesized shrink-0-25"></div>
+</div>
+
+<div class="sized flex flex-end container">
+ <div class="red widesized shrink-0-5 basis-big"></div>
+ <div class="blue widesized shrink-0-25 basis-big"></div>
+</div>
+
+flex-end
+</div>
+<div style="display:inline-block; margin: 0 55px 0 0; width: 50px;">
+
+<div class="sized flex container">
+ <div class="blue widesized shrink-1"></div>
+</div>
+
+<div class="sized flex container">
+ <div class="red widesized shrink-1"></div>
+ <div class="blue widesized shrink-0-5"></div>
+</div>
+
+<div class="sized flex container">
+ <div class="red widesized shrink-1"></div>
+ <div class="blue widesized shrink-1"></div>
+</div>
+
+<div class="sized flex container">
+ <div class="blue widesized shrink-0-5"></div>
+</div>
+
+<div class="sized flex container">
+ <div class="red widesized shrink-0-5"></div>
+ <div class="blue widesized shrink-0-25"></div>
+</div>
+
+<div class="sized flex container">
+ <div class="red widesized shrink-0-5 basis-big"></div>
+ <div class="blue widesized shrink-0-25 basis-big"></div>
+</div>
+
+flex-start
+</div>
+<div style="display:inline-block; margin: 0 0 0 5px; width: 75px;">
+
+
+<div class="sized flex space-around container">
+ <div class="blue widesized shrink-1"></div>
+</div>
+
+<div class="sized flex space-around container">
+ <div class="red widesized shrink-1"></div>
+ <div class="blue widesized shrink-0-5"></div>
+</div>
+
+<div class="sized flex space-around container">
+ <div class="red widesized shrink-1"></div>
+ <div class="blue widesized shrink-1"></div>
+</div>
+
+<div class="sized flex space-around container">
+ <div class="blue widesized shrink-0-5"></div>
+</div>
+
+<div class="sized flex space-around container">
+ <div class="red widesized shrink-0-5"></div>
+ <div class="blue widesized shrink-0-25"></div>
+</div>
+
+<div class="sized flex space-around container">
+ <div class="red widesized shrink-0-5 basis-big"></div>
+ <div class="blue widesized shrink-0-25 basis-big"></div>
+</div>
+
+
+space-around
+</div>
+<div style="display:inline-block; margin: 0 0 0 15px; width: 75px;">
+
+
+<div class="sized flex center container">
+ <div class="blue widesized shrink-1"></div>
+</div>
+
+<div class="sized flex center container">
+ <div class="red widesized shrink-1"></div>
+ <div class="blue widesized shrink-0-5"></div>
+</div>
+
+<div class="sized flex center container">
+ <div class="red widesized shrink-1"></div>
+ <div class="blue widesized shrink-1"></div>
+</div>
+
+<div class="sized flex center container">
+ <div class="blue widesized shrink-0-5"></div>
+</div>
+
+<div class="sized flex center container">
+ <div class="red widesized shrink-0-5"></div>
+ <div class="blue widesized shrink-0-25"></div>
+</div>
+
+<div class="sized flex center container">
+ <div class="red widesized shrink-0-5 basis-big"></div>
+ <div class="blue widesized shrink-0-25 basis-big"></div>
+</div>
+
+
+center
+</div>
+<div style="display:inline-block; margin: 0 0 0 5px; width: 90px;">
+
+
+
+<div class="sized flex space-between container">
+ <div class="blue widesized shrink-1"></div>
+</div>
+
+<div class="sized flex space-between container">
+ <div class="red widesized shrink-1"></div>
+ <div class="blue widesized shrink-0-5"></div>
+</div>
+
+<div class="sized flex space-between container">
+ <div class="red widesized shrink-1"></div>
+ <div class="blue widesized shrink-1"></div>
+</div>
+
+<div class="sized flex space-between container">
+ <div class="blue widesized shrink-0-5"></div>
+</div>
+
+<div class="sized flex space-between container">
+ <div class="red widesized shrink-0-5"></div>
+ <div class="blue widesized shrink-0-25"></div>
+</div>
+
+<div class="sized flex space-between container">
+ <div class="red widesized shrink-0-5 basis-big"></div>
+ <div class="blue widesized shrink-0-25 basis-big"></div>
+</div>
+
+
+space-between
+</div>
+
+</body>
+</html>
+
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages-expected.png
index 1475746..881adc4 100644
--- a/src/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages-expected.png
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages.html b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages.html
index 6319586..5629e51 100644
--- a/src/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages.html
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages.html
@@ -22,7 +22,7 @@
height: 40px;
}
.small {
- width: 100px;
+ width: 30px;
min-height: 40px;
}
.flex {
@@ -83,56 +83,113 @@
<span class="blue" style="flex-basis: 20%; margin: 0px; border: 0px; padding: 0px; align-self:center;">WWWW</span>
<span class="blue" style="flex-basis: 95%; margin: 0px; border: 0px; padding: 0px; align-self:center;">XXXX</span>
</div>
-[5]
-
-(1)
+gbHO-
<div class="small inlineflex container">
<span class="blue" style="flex-basis: 20%;">a</span>
</div>
-(2a)
<div class="inlineflex container">
<span class="blue">AAa</span>
</div>
-(2b)
<div class="inlineflex container">
<span class="blue" style="overflow:hidden; flex-basis: 20px;">AAb</span>
</div>
-(2c)
<div class="inlineflex container">
<span class="blue" style="overflow:hidden; flex-basis: 20px; max-width:21px;">AAc</span>
</div>
-(3)
<div class="inlineflex container green">
<div class="inlineflex container">
- <span class="blue" style="overflow:hidden; flex-basis: 50%;">DDD</span>
+ <span class="blue" style="overflow:hidden; flex-basis: 50%;">DDh</span>
</div>
</div>
-(4a)
+<div class="inlineflex container green">
+<div class="inlineflex container">
+ <span class="blue" style="flex-basis: 50%;">DDv</span>
+</div>
+</div>
<div class="vsized inlineflex container">
- <span class="blue" style="flex-basis: 12%;">VVVV</span>
+ <span class="blue" style="flex-basis: 5%;">V1V</span>
</div>
-(4b)
<div class="vsized inlineflex container">
- <span class="blue" style="flex-basis: 12%; max-width:25px;">VVVV</span>
+ <span class="blue" style="flex-basis: 12%; max-width:15px;">V2V</span>
</div>
-(5)
-<div class="vsized inlineflex container" style="min-width: 100px">
- <span class="blue" style="flex-basis: 12%; max-width:25px;">VVVV</span>
+<div class="vsized inlineflex container">
+ <span class="blue" style="flex-basis: 12%; max-width:70%;">V3V</span>
</div>
-(6)
-<div class="vsized inlineflex container" style="max-width: 5px;">
+<div class="vsized inlineflex container" style="min-width: 5%">
+ <span class="blue" style="flex-basis: 12%; max-width:15px;">V4V</span>
+</div>
+<div class="vsized inlineflex container" style="width: 40px;">
+ <span class="blue" style="flex-basis: 12%; max-width:15px;">V5V</span>
+</div>
+<div class="vsized inlineflex container" style="width: 40px;">
+ <span class="blue" style="flex-basis: 12%; max-width:30%;">V6V</span>
+</div>
+<div class="vsized inlineflex container" style="min-width: 5%">
+ <span class="blue" style="flex-basis: 12%; max-width:15px;">V7V</span>
+</div>
+<div class="vsized inlineflex container" style="min-width: 5%">
+ <span class="blue" style="flex-basis: 12%; max-width:50%;">V8V</span>
+</div>
+
+
+<div class="vsized inlineflex container" style="max-width: 1%;">
<span class="blue">VVVV</span>
</div>
-(7)
-<div class="vsized inlineflex container" style="max-width: 5px; overflow: visible;">
+<div class="vsized inlineflex container" style="max-width: 1%; overflow: visible;">
<span class="blue">VVVV</span>
</div>
-(8)
+<div class="vsized inlineflex container" style="max-width: 1%;">
+ <span class="blue">VVVV</span>
+</div>
+<div class="vsized inlineflex container" style="max-width: 1%; overflow: visible;">
+ <span class="blue">VVVV</span>
+</div>
+
+<div class="vsized inlineflex container" style="max-width: 10px;">
+ <span class="blue">HHHH</span>
+</div>
+
+<div class="vsized inlineflex container" style="max-width: 10px; overflow: visible;">
+ <span class="blue">VVVV</span>
+</div>
+
+<div class="vsized inlineflex container" style="max-width: 10px;">
+ <span class="blue" style="overflow: hidden;">HHHH</span>
+</div>
+
+<div class="vsized inlineflex container" style="max-width: 10px;">
+ <span class="blue" style="overflow: visible;">HHHH</span>
+</div>
+
+<div class="vsized inlineflex container" style="max-width: 10px;">
+ <span class="blue" style="min-width: 1px;">MHHM</span>
+</div>
+
+<div class="vsized inlineflex container" style="max-width: 10px; overflow: visible;">
+ <span class="blue" style="min-width: 1px;">MVVM</span>
+</div>
+
+<div class="vsized inlineflex container" style="max-width: 10px;">
+ <span class="blue" style="max-width: 4px; overflow: visible;">MHHM</span>
+</div>
+
+<div class="vsized inlineflex container" style="max-width: 10px; overflow: visible;">
+ <span class="blue" style="max-width: 4px; overflow: visible;">MVVM</span>
+</div>
+
+<div class="vsized inlineflex container" style="max-width: 10px;">
+ <span class="blue" style="max-width: 4px; overflow: hidden;">MHHM</span>
+</div>
+
+<div class="vsized inlineflex container" style="max-width: 10px; overflow: visible;">
+ <span class="blue" style="max-width: 4px; overflow: hidden;">MVVM</span>
+</div>
+-OHgb
<div class="flex" style="flex-flow: row wrap; height:75px; ">
-<div>block first</div>
-<div style="position: abolute;">block abs</div>
+<div>block first item</div>
+<div id="item2" style="position: absolute; background-color:#FF8C00;">block abs</div>
anonymous item 3
<div style="margin-left:auto; margin-right:auto">block middle</div>
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/content-based-minimum-size-expected.png b/src/cobalt/layout_tests/testdata/css3-flexbox/content-based-minimum-size-expected.png
new file mode 100644
index 0000000..b17c1ce
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/content-based-minimum-size-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/content-based-minimum-size.html b/src/cobalt/layout_tests/testdata/css3-flexbox/content-based-minimum-size.html
new file mode 100644
index 0000000..c9dd6b7
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/content-based-minimum-size.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<!--
+ | Combined tests for basic functionality of CSS Flexible Box Layout Module.
+ | https://www.w3.org/TR/css-flexbox-1
+ | This test focuses on content-based minimum size.
+ -->
+<html>
+<head>
+<style>
+ body {
+ margin: 0px;
+ font-family: Roboto;
+ background-color: #808080;
+ font-size: 12px;
+ }
+ .inlineflex {
+ display:inline-flex;
+ color: #99b9f3;
+ background-color: #ffee08;
+ opacity: 0.75;
+ }
+ .container {
+ overflow: hidden;
+ flex-flow: row wrap;
+ justify-content: space-around;
+ align-items: center;
+ align-content: flex-end;
+ min-width: 2px;
+ padding: 2px;
+ border: 2px solid #000060;
+ outline: 2px solid #00f000;
+ margin: 6px;
+ }
+ .blue {
+ background-color: #0047ab;
+ }
+ .hidden {
+ overflow: hidden;
+ }
+ .visible {
+ overflow: visible;
+ }
+
+</style>
+</head>
+<body>
+
+<div class="inlineflex container" style="max-width: 20px;">
+ <span class="blue">HHHHH</span>
+</div>
+
+<div class="visible inlineflex container" style="max-width: 20px;">
+ <span class="blue">VVVVV</span>
+</div>
+
+<div class="visible inlineflex container" style="max-width: 20px;">
+ <span class="hidden blue">HHHHH</span>
+</div>
+
+<div class="inlineflex container" style="max-width: 20px;">
+ <span class="blue" style="min-width: 5px;">mHHHm</span>
+</div>
+
+<div class="visible inlineflex container" style="max-width: 20px;">
+ <span class="blue" style="min-width: 5px;">mVVVm</span>
+</div>
+
+</body>
+</html>
+
diff --git a/src/cobalt/layout_tests/testdata/css3-flexbox/layout_tests.txt b/src/cobalt/layout_tests/testdata/css3-flexbox/layout_tests.txt
index 759ff0c..da59b48 100644
--- a/src/cobalt/layout_tests/testdata/css3-flexbox/layout_tests.txt
+++ b/src/cobalt/layout_tests/testdata/css3-flexbox/layout_tests.txt
@@ -1,3 +1,6 @@
+combined-baseline
combined-order-and-multiline
combined-positioning-tests
+combined-shrinking-and-justify-content
combined-with-baselines-percentages
+content-based-minimum-size
diff --git a/src/cobalt/layout_tests/testdata/intersection-observer/intersection-ratio-is-nonzero-but-is-intersecting-is-false-expected.png b/src/cobalt/layout_tests/testdata/intersection-observer/intersection-ratio-is-nonzero-but-is-intersecting-is-false-expected.png
new file mode 100644
index 0000000..3388bb1
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/intersection-observer/intersection-ratio-is-nonzero-but-is-intersecting-is-false-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/intersection-observer/intersection-ratio-is-nonzero-but-is-intersecting-is-false.html b/src/cobalt/layout_tests/testdata/intersection-observer/intersection-ratio-is-nonzero-but-is-intersecting-is-false.html
new file mode 100644
index 0000000..86dace5
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/intersection-observer/intersection-ratio-is-nonzero-but-is-intersecting-is-false.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<!--
+ | This test checks that an IntersectionObserverEntry's |isIntersecting|
+ | property is set to false if its |intersectionRatio| > 0 but
+ | |intersectionRatio| < all of the IntersectionObserver's threshold values.
+ | The target element is initially yellow, and only turns blue if the
+ | IntersectionObserver correctly computes the |isIntersecting| and
+ | |intersectionRatio| fields as described above.
+ | https://www.w3.org/TR/intersection-observer/
+ -->
+<html>
+<head>
+ <style>
+ #target {
+ background-color: yellow;
+ width: 200px;
+ height: 150px;
+ position: absolute;
+ left: -100px;
+ top: -75px;
+ }
+ </style>
+</head>
+<body>
+ <div>
+ <div id="target">
+ </div>
+ </div>
+
+ <script>
+ if (window.testRunner) {
+ window.testRunner.waitUntilDone();
+ }
+
+ window.addEventListener("load", function() {
+ var targetElement = document.querySelector('#target');
+ var expectedRatio = 0.25;
+
+ function handleIntersect(entries, observer) {
+ entries.forEach(function(entry) {
+ console.log(entry.intersectionRatio);
+ if (entry.intersectionRatio == expectedRatio && !entry.isIntersecting) {
+ entry.target.style.backgroundColor = "blue";
+ }
+ });
+ }
+
+ function createObserver() {
+ var options = {
+ root: null,
+ rootMargin: "0px",
+ threshold: 0.5
+ };
+
+ var observer = new IntersectionObserver(handleIntersect, options);
+ observer.observe(targetElement);
+ }
+
+ createObserver();
+
+ if (window.testRunner) {
+ window.testRunner.DoNonMeasuredLayout();
+ window.setTimeout(function() { window.testRunner.notifyDone(); }, 0);
+ }
+ });
+ </script>
+
+</body>
+</html>
diff --git a/src/cobalt/layout_tests/testdata/intersection-observer/layout_tests.txt b/src/cobalt/layout_tests/testdata/intersection-observer/layout_tests.txt
index 8962d98..f449fdd 100644
--- a/src/cobalt/layout_tests/testdata/intersection-observer/layout_tests.txt
+++ b/src/cobalt/layout_tests/testdata/intersection-observer/layout_tests.txt
@@ -1,5 +1,6 @@
element-in-containing-block-chain-has-overflow-clip-with-padding-and-border
element-in-containing-block-chain-has-overflow-clip-without-padding-or-border
+intersection-ratio-is-nonzero-but-is-intersecting-is-false
multiple-observers-with-different-roots-and-targets
no-intersection-when-root-is-not-in-containing-block-chain-of-target
observers-should-update-when-elements-move
diff --git a/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt b/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt
index 64d65f0..f500a93 100644
--- a/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt
+++ b/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt
@@ -152,7 +152,7 @@
# SyntaxError: Unexpected EOF
# js_error: send-entity-body-document.htm,FAIL
send-entity-body-empty.htm,FAIL
-# TODO[johnx]: re-enable this after Cobalt wpt refactoring.
+# TODO: re-enable this after Cobalt wpt refactoring.
send-entity-body-get-head-async.htm,PASS
send-entity-body-get-head.htm,FAIL
send-entity-body-none.htm,FAIL
diff --git a/src/cobalt/loader/fetcher.h b/src/cobalt/loader/fetcher.h
index 1bc7010..152d790 100644
--- a/src/cobalt/loader/fetcher.h
+++ b/src/cobalt/loader/fetcher.h
@@ -74,33 +74,23 @@
};
// Concrete Fetcher subclass should start fetching immediately in constructor.
- explicit Fetcher(Handler* handler)
- : handler_(handler), did_fail_from_transient_error_(false) {}
-
- const Origin& last_url_origin() const { return last_url_origin_; }
-
- bool did_fail_from_transient_error() const {
- return did_fail_from_transient_error_;
- }
+ explicit Fetcher(Handler* handler) : handler_(handler) {}
// Concrete Fetcher subclass should cancel fetching in destructor.
virtual ~Fetcher() = 0;
- protected:
- Handler* handler() const { return handler_; }
-
- void SetLastUrlOrigin(const Origin& origin) { last_url_origin_ = origin; }
- void SetFailedFromTransientError() { did_fail_from_transient_error_ = true; }
-
- private:
- Handler* handler_;
-
// Indicates whether the resource is cross-origin.
- Origin last_url_origin_;
+ virtual Origin last_url_origin() const { return Origin(); }
// Whether or not the fetcher failed from an error that is considered
// transient, indicating that the same fetch may later succeed.
- bool did_fail_from_transient_error_;
+ virtual bool did_fail_from_transient_error() const { return false; }
+
+ protected:
+ Handler* handler() const { return handler_; }
+
+ private:
+ Handler* handler_;
};
} // namespace loader
diff --git a/src/cobalt/loader/fetcher_cache.cc b/src/cobalt/loader/fetcher_cache.cc
index e07ba47..9b0244f 100644
--- a/src/cobalt/loader/fetcher_cache.cc
+++ b/src/cobalt/loader/fetcher_cache.cc
@@ -21,36 +21,47 @@
namespace cobalt {
namespace loader {
+namespace {
-class FetcherCache::CachedFetcherHandler : public Fetcher::Handler {
+// Wraps a Fetcher::Handler and saves all data fetched and its associated
+// information.
+class CachedFetcherHandler : public Fetcher::Handler {
public:
typedef base::Callback<void(
- CachedFetcherHandler* handler, const std::string& url,
+ const std::string& url,
const scoped_refptr<net::HttpResponseHeaders>& headers,
- const Origin& last_url_origin, std::string* data)>
+ const Origin& last_url_origin, bool did_fail_from_transient_error,
+ std::string* data)>
SuccessCallback;
- typedef base::Callback<void(CachedFetcherHandler* handler)> FailureCallback;
CachedFetcherHandler(const std::string& url, Fetcher::Handler* handler,
- const SuccessCallback& on_success_callback,
- const FailureCallback& on_failure_callback)
+ const SuccessCallback& on_success_callback)
: url_(url),
handler_(handler),
- on_success_callback_(on_success_callback),
- on_failure_callback_(on_failure_callback) {
+ on_success_callback_(on_success_callback) {
DCHECK(handler_);
DCHECK(!on_success_callback_.is_null());
- DCHECK(!on_failure_callback_.is_null());
+ }
+
+ // Attach a wrapping fetcher so it can be used when forwarding the callbacks.
+ // This ensures that the underlying handler sees the same Fetcher object in
+ // the callback as the one returned by CreateCachedFetcher().
+ void AttachFetcher(Fetcher* wrapping_fetcher) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ DCHECK(!wrapping_fetcher_);
+ DCHECK(wrapping_fetcher);
+ wrapping_fetcher_ = wrapping_fetcher;
}
private:
// From Fetcher::Handler.
LoadResponseType OnResponseStarted(
- Fetcher* fetcher,
+ Fetcher*,
const scoped_refptr<net::HttpResponseHeaders>& headers) override {
// TODO: Respect HttpResponseHeaders::GetMaxAgeValue().
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- auto response = handler_->OnResponseStarted(fetcher, headers);
+ DCHECK(wrapping_fetcher_);
+ auto response = handler_->OnResponseStarted(wrapping_fetcher_, headers);
if (response == kLoadResponseContinue && headers) {
headers_ = headers;
auto content_length = headers_->GetContentLength();
@@ -61,46 +72,120 @@
return response;
}
- void OnReceived(Fetcher* fetcher, const char* data, size_t size) override {
+ void OnReceived(Fetcher*, const char* data, size_t size) override {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ DCHECK(wrapping_fetcher_);
data_.insert(data_.end(), data, data + size);
- handler_->OnReceived(fetcher, data, size);
+ handler_->OnReceived(wrapping_fetcher_, data, size);
}
- void OnReceivedPassed(Fetcher* fetcher,
- std::unique_ptr<std::string> data) override {
+
+ void OnReceivedPassed(Fetcher*, std::unique_ptr<std::string> data) override {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ DCHECK(wrapping_fetcher_);
data_.insert(data_.end(), data->begin(), data->end());
- handler_->OnReceivedPassed(fetcher, std::move(data));
+ handler_->OnReceivedPassed(wrapping_fetcher_, std::move(data));
}
- void OnDone(Fetcher* fetcher) override {
+
+ void OnDone(Fetcher*) override {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- last_url_origin_ = fetcher->last_url_origin();
- handler_->OnDone(fetcher);
- on_success_callback_.Run(this, url_, headers_, last_url_origin_, &data_);
+ DCHECK(wrapping_fetcher_);
+ handler_->OnDone(wrapping_fetcher_);
+ on_success_callback_.Run(
+ url_, headers_, wrapping_fetcher_->last_url_origin(),
+ wrapping_fetcher_->did_fail_from_transient_error(), &data_);
}
- void OnError(Fetcher* fetcher, const std::string& error) override {
+
+ void OnError(Fetcher*, const std::string& error) override {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- handler_->OnError(fetcher, error);
- on_failure_callback_.Run(this);
+ DCHECK(wrapping_fetcher_);
+ handler_->OnError(wrapping_fetcher_, error);
}
THREAD_CHECKER(thread_checker_);
const std::string url_;
+ Fetcher* wrapping_fetcher_ = nullptr;
Fetcher::Handler* const handler_;
const SuccessCallback on_success_callback_;
- const FailureCallback on_failure_callback_;
scoped_refptr<net::HttpResponseHeaders> headers_;
- Origin last_url_origin_;
std::string data_;
};
+// Wraps an underlying, real Fetcher for an ongoing request, so we can ensure
+// that |handler_| is deleted when the Fetcher object is deleted.
+class OngoingFetcher : public Fetcher {
+ public:
+ OngoingFetcher(std::unique_ptr<CachedFetcherHandler> handler,
+ const Loader::FetcherCreator& real_fetcher_creator)
+ : Fetcher(handler.get()), handler_(std::move(handler)) {
+ DCHECK(handler_);
+ handler_->AttachFetcher(this);
+ fetcher_ = real_fetcher_creator.Run(handler_.get());
+ }
+ ~OngoingFetcher() override { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); }
+
+ Origin last_url_origin() const override {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ // Some Fetchers may call callbacks inside its ctor, in such case |fetcher_|
+ // hasn't been assigned and a default value is returned.
+ return fetcher_ ? fetcher_->last_url_origin() : Origin();
+ }
+ bool did_fail_from_transient_error() const override {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ // Some Fetchers may call callbacks inside its ctor, in such case |fetcher_|
+ // hasn't been assigned and a default value is returned.
+ return fetcher_ ? fetcher_->did_fail_from_transient_error() : false;
+ }
+
+ private:
+ THREAD_CHECKER(thread_checker_);
+
+ std::unique_ptr<CachedFetcherHandler> handler_;
+ std::unique_ptr<Fetcher> fetcher_;
+};
+
+// Fulfills the request directly using the data passed to ctor.
+class CachedFetcher : public Fetcher {
+ public:
+ CachedFetcher(const GURL& url,
+ const scoped_refptr<net::HttpResponseHeaders>& headers,
+ const char* data, size_t size, const Origin& last_url_origin,
+ bool did_fail_from_transient_error, Handler* handler)
+ : Fetcher(handler),
+ last_url_origin_(last_url_origin),
+ did_fail_from_transient_error_(did_fail_from_transient_error) {
+ auto response_type = handler->OnResponseStarted(this, headers);
+ if (response_type == kLoadResponseAbort) {
+ std::string error_msg(base::StringPrintf(
+ "Handler::OnResponseStarted() aborted URL %s", url.spec().c_str()));
+ handler->OnError(this, error_msg.c_str());
+ return;
+ }
+ handler->OnReceived(this, data, size);
+ handler->OnDone(this);
+ }
+
+ Origin last_url_origin() const override { return last_url_origin_; }
+ bool did_fail_from_transient_error() const override {
+ return did_fail_from_transient_error_;
+ }
+
+ private:
+ Origin last_url_origin_;
+ bool did_fail_from_transient_error_;
+};
+
+} // namespace
+
class FetcherCache::CacheEntry {
public:
CacheEntry(const scoped_refptr<net::HttpResponseHeaders>& headers,
- const Origin& last_url_origin, std::string* data)
- : headers_(headers), last_url_origin_(last_url_origin) {
+ const Origin& last_url_origin, bool did_fail_from_transient_error,
+ std::string* data)
+ : headers_(headers),
+ last_url_origin_(last_url_origin),
+ did_fail_from_transient_error_(did_fail_from_transient_error) {
DCHECK(data);
data_.swap(*data);
}
@@ -113,6 +198,9 @@
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return last_url_origin_;
}
+ bool did_fail_from_transient_error() const {
+ return did_fail_from_transient_error_;
+ }
const char* data() const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return data_.data();
@@ -121,33 +209,20 @@
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return data_.size();
}
+ size_t capacity() const {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ return data_.capacity();
+ }
private:
THREAD_CHECKER(thread_checker_);
scoped_refptr<net::HttpResponseHeaders> headers_;
Origin last_url_origin_;
+ bool did_fail_from_transient_error_;
std::string data_;
};
-class FetcherCache::CachedFetcher : public Fetcher {
- public:
- CachedFetcher(const GURL& url, const FetcherCache::CacheEntry& entry,
- Handler* handler)
- : Fetcher(handler) {
- SetLastUrlOrigin(entry.last_url_origin());
- auto response_type = handler->OnResponseStarted(this, entry.headers());
- if (response_type == kLoadResponseAbort) {
- std::string error_msg(base::StringPrintf(
- "Handler::OnResponseStarted() aborted URL %s", url.spec().c_str()));
- handler->OnError(this, error_msg.c_str());
- return;
- }
- handler->OnReceived(this, entry.data(), entry.size());
- handler->OnDone(this);
- }
-};
-
FetcherCache::FetcherCache(const char* name, size_t capacity)
: capacity_(capacity),
memory_size_in_bytes_(
@@ -160,11 +235,6 @@
FetcherCache::~FetcherCache() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- while (!ongoing_fetchers_.empty()) {
- delete *ongoing_fetchers_.begin();
- ongoing_fetchers_.erase(ongoing_fetchers_.begin());
- }
-
while (!cache_entries_.empty()) {
delete cache_entries_.begin()->second;
cache_entries_.erase(cache_entries_.begin());
@@ -206,34 +276,35 @@
auto entry = iterator->second;
cache_entries_.erase(iterator);
cache_entries_.insert(std::make_pair(url.spec(), entry));
- return std::unique_ptr<Fetcher>(new CachedFetcher(url, *entry, handler));
+ return std::unique_ptr<Fetcher>(
+ new CachedFetcher(url, entry->headers(), entry->data(), entry->size(),
+ entry->last_url_origin(),
+ entry->did_fail_from_transient_error(), handler));
}
- auto cached_handler = new CachedFetcherHandler(
+ std::unique_ptr<CachedFetcherHandler> cached_handler(new CachedFetcherHandler(
url.spec(), handler,
- base::Bind(&FetcherCache::OnFetchSuccess, base::Unretained(this)),
- base::Bind(&FetcherCache::OnFetchFailure, base::Unretained(this)));
- ongoing_fetchers_.insert(cached_handler);
- return real_fetcher_creator.Run(cached_handler);
+ base::Bind(&FetcherCache::OnFetchSuccess, base::Unretained(this))));
+ return std::unique_ptr<Fetcher>(
+ new OngoingFetcher(std::move(cached_handler), real_fetcher_creator));
}
void FetcherCache::OnFetchSuccess(
- CachedFetcherHandler* handler, const std::string& url,
+ const std::string& url,
const scoped_refptr<net::HttpResponseHeaders>& headers,
- const Origin& last_url_origin, std::string* data) {
+ const Origin& last_url_origin, bool did_fail_from_transient_error,
+ std::string* data) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(data);
- auto iterator = ongoing_fetchers_.find(handler);
- DCHECK(iterator != ongoing_fetchers_.end());
-
if (data->size() <= capacity_) {
- auto entry = new CacheEntry(headers, last_url_origin, data);
- total_size_ += entry->size();
+ auto entry = new CacheEntry(headers, last_url_origin,
+ did_fail_from_transient_error, data);
+ total_size_ += entry->capacity();
cache_entries_.insert(std::make_pair(url, entry));
while (total_size_ > capacity_) {
DCHECK(!cache_entries_.empty());
- total_size_ -= cache_entries_.begin()->second->size();
+ total_size_ -= cache_entries_.begin()->second->capacity();
delete cache_entries_.begin()->second;
cache_entries_.erase(cache_entries_.begin());
--count_resources_cached_;
@@ -241,18 +312,6 @@
++count_resources_cached_;
memory_size_in_bytes_ = total_size_;
}
-
- delete *iterator;
- ongoing_fetchers_.erase(iterator);
-}
-
-void FetcherCache::OnFetchFailure(CachedFetcherHandler* handler) {
- DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
- auto iterator = ongoing_fetchers_.find(handler);
- DCHECK(iterator != ongoing_fetchers_.end());
- delete *iterator;
- ongoing_fetchers_.erase(iterator);
}
} // namespace loader
diff --git a/src/cobalt/loader/fetcher_cache.h b/src/cobalt/loader/fetcher_cache.h
index 37ddf8a..32a4466 100644
--- a/src/cobalt/loader/fetcher_cache.h
+++ b/src/cobalt/loader/fetcher_cache.h
@@ -42,24 +42,21 @@
void NotifyResourceRequested(const std::string& url);
private:
- class CachedFetcherHandler;
class CacheEntry;
- class CachedFetcher;
std::unique_ptr<Fetcher> CreateCachedFetcher(
const GURL& url, const Loader::FetcherCreator& real_fetcher_creator,
Fetcher::Handler* handler);
- void OnFetchSuccess(CachedFetcherHandler* handler, const std::string& url,
+ void OnFetchSuccess(const std::string& url,
const scoped_refptr<net::HttpResponseHeaders>& headers,
- const Origin& last_url_origin, std::string* data);
- void OnFetchFailure(CachedFetcherHandler* handler);
+ const Origin& last_url_origin,
+ bool did_fail_from_transient_error, std::string* data);
THREAD_CHECKER(thread_checker_);
const size_t capacity_;
size_t total_size_ = 0;
- base::hash_set<CachedFetcherHandler*> ongoing_fetchers_;
net::linked_hash_map<std::string, CacheEntry*> cache_entries_;
base::CVal<base::cval::SizeInBytes, base::CValPublic> memory_size_in_bytes_;
diff --git a/src/cobalt/loader/net_fetcher.cc b/src/cobalt/loader/net_fetcher.cc
index bbb0027..cb084a1 100644
--- a/src/cobalt/loader/net_fetcher.cc
+++ b/src/cobalt/loader/net_fetcher.cc
@@ -160,7 +160,7 @@
return HandleError(msg).InvalidateThis();
}
- SetLastUrlOrigin(Origin(source->GetURL()));
+ last_url_origin_ = Origin(source->GetURL());
}
void NetFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
@@ -189,7 +189,7 @@
status.error() == net::ERR_CONNECTION_RESET ||
status.error() == net::ERR_CONNECTION_CLOSED ||
status.error() == net::ERR_CONNECTION_ABORTED) {
- SetFailedFromTransientError();
+ did_fail_from_transient_error_ = true;
}
std::string msg(base::StringPrintf(
diff --git a/src/cobalt/loader/net_fetcher.h b/src/cobalt/loader/net_fetcher.h
index a29f899..2ab6df8 100644
--- a/src/cobalt/loader/net_fetcher.h
+++ b/src/cobalt/loader/net_fetcher.h
@@ -62,6 +62,12 @@
}
private:
+ // Fetcher interface
+ Origin last_url_origin() const override { return last_url_origin_; }
+ bool did_fail_from_transient_error() const override {
+ return did_fail_from_transient_error_;
+ }
+
void Start();
// Empty struct to ensure the caller of |HandleError()| knows that |this|
@@ -94,6 +100,13 @@
// The request's origin.
Origin origin_;
+ // Indicates whether the resource is cross-origin.
+ Origin last_url_origin_;
+
+ // Whether or not the fetcher failed from an error that is considered
+ // transient, indicating that the same fetch may later succeed.
+ bool did_fail_from_transient_error_ = false;
+
DISALLOW_COPY_AND_ASSIGN(NetFetcher);
};
diff --git a/src/cobalt/media/base/drm_system.cc b/src/cobalt/media/base/drm_system.cc
index ea3888a..3e46a77 100644
--- a/src/cobalt/media/base/drm_system.cc
+++ b/src/cobalt/media/base/drm_system.cc
@@ -26,29 +26,23 @@
DrmSystem::Session::Session(
DrmSystem* drm_system
-#if SB_HAS(DRM_KEY_STATUSES)
,
SessionUpdateKeyStatusesCallback update_key_statuses_callback
#if SB_HAS(DRM_SESSION_CLOSED)
,
SessionClosedCallback session_closed_callback
#endif // SB_HAS(DRM_SESSION_CLOSED)
-#endif // SB_HAS(DRM_KEY_STATUSES)
)
: drm_system_(drm_system),
-#if SB_HAS(DRM_KEY_STATUSES)
update_key_statuses_callback_(update_key_statuses_callback),
#if SB_HAS(DRM_SESSION_CLOSED)
session_closed_callback_(session_closed_callback),
#endif // SB_HAS(DRM_SESSION_CLOSED)
-#endif // SB_HAS(DRM_KEY_STATUSES)
closed_(false) {
-#if SB_HAS(DRM_KEY_STATUSES)
DCHECK(!update_key_statuses_callback_.is_null());
#if SB_HAS(DRM_SESSION_CLOSED)
DCHECK(!session_closed_callback_.is_null());
#endif // SB_HAS(DRM_SESSION_CLOSED)
-#endif // SB_HAS(DRM_KEY_STATUSES)
}
DrmSystem::Session::~Session() {
@@ -94,10 +88,8 @@
: wrapped_drm_system_(SbDrmCreateSystem(key_system, this,
OnSessionUpdateRequestGeneratedFunc,
OnSessionUpdatedFunc
-#if SB_HAS(DRM_KEY_STATUSES)
,
OnSessionKeyStatusesChangedFunc
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
,
OnServerCertificateUpdatedFunc
@@ -116,25 +108,21 @@
DrmSystem::~DrmSystem() { SbDrmDestroySystem(wrapped_drm_system_); }
std::unique_ptr<DrmSystem::Session> DrmSystem::CreateSession(
-#if SB_HAS(DRM_KEY_STATUSES)
SessionUpdateKeyStatusesCallback session_update_key_statuses_callback
#if SB_HAS(DRM_SESSION_CLOSED)
,
SessionClosedCallback session_closed_callback
#endif // SB_HAS(DRM_SESSION_CLOSED)
-#endif // SB_HAS(DRM_KEY_STATUSES)
) { // NOLINT(whitespace/parens)
DCHECK(message_loop_->BelongsToCurrentThread());
return std::unique_ptr<DrmSystem::Session>(new Session(
this
-#if SB_HAS(DRM_KEY_STATUSES)
,
session_update_key_statuses_callback
#if SB_HAS(DRM_SESSION_CLOSED)
,
session_closed_callback
#endif // SB_HAS(DRM_SESSION_CLOSED)
-#endif // SB_HAS(DRM_KEY_STATUSES)
)); // NOLINT(whitespace/parens)
}
@@ -304,7 +292,6 @@
ticket_to_session_update_map_.erase(session_update_iterator);
}
-#if SB_HAS(DRM_KEY_STATUSES)
void DrmSystem::OnSessionKeyStatusChanged(
const std::string& session_id, const std::vector<std::string>& key_ids,
const std::vector<SbDrmKeyStatus>& key_statuses) {
@@ -319,7 +306,6 @@
session->update_key_statuses_callback().Run(key_ids, key_statuses);
}
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_HAS(DRM_SESSION_CLOSED)
void DrmSystem::OnSessionClosed(const std::string& session_id) {
@@ -418,7 +404,6 @@
status, error_message ? std::string(error_message) : ""));
}
-#if SB_HAS(DRM_KEY_STATUSES)
// static
void DrmSystem::OnSessionKeyStatusesChangedFunc(
SbDrmSystem wrapped_drm_system, void* context, const void* session_id,
@@ -450,7 +435,6 @@
base::Bind(&DrmSystem::OnSessionKeyStatusChanged, drm_system->weak_this_,
session_id_copy, key_ids_copy, key_statuses_copy));
}
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
// static
diff --git a/src/cobalt/media/base/drm_system.h b/src/cobalt/media/base/drm_system.h
index 2b01077..819d9c9 100644
--- a/src/cobalt/media/base/drm_system.h
+++ b/src/cobalt/media/base/drm_system.h
@@ -47,11 +47,9 @@
typedef base::Callback<void(SbDrmStatus status,
const std::string& error_message)>
SessionDidNotUpdateCallback;
-#if SB_HAS(DRM_KEY_STATUSES)
typedef base::Callback<void(const std::vector<std::string>& key_ids,
const std::vector<SbDrmKeyStatus>& key_statuses)>
SessionUpdateKeyStatusesCallback;
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_HAS(DRM_SESSION_CLOSED)
typedef base::Callback<void()> SessionClosedCallback;
#endif // SB_HAS(DRM_SESSION_CLOSED)
@@ -102,10 +100,8 @@
private:
// Private API for |DrmSystem|.
Session(DrmSystem* drm_system
-#if SB_HAS(DRM_KEY_STATUSES)
,
SessionUpdateKeyStatusesCallback update_key_statuses_callback
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_HAS(DRM_SESSION_CLOSED)
,
SessionClosedCallback session_closed_callback
@@ -116,12 +112,10 @@
update_request_generated_callback() const {
return update_request_generated_callback_;
}
-#if SB_HAS(DRM_KEY_STATUSES)
const SessionUpdateKeyStatusesCallback& update_key_statuses_callback()
const {
return update_key_statuses_callback_;
}
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_HAS(DRM_SESSION_CLOSED)
const SessionClosedCallback& session_closed_callback() const {
return session_closed_callback_;
@@ -129,9 +123,7 @@
#endif // SB_HAS(DRM_SESSION_CLOSED)
DrmSystem* const drm_system_;
-#if SB_HAS(DRM_KEY_STATUSES)
SessionUpdateKeyStatusesCallback update_key_statuses_callback_;
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_HAS(DRM_SESSION_CLOSED)
SessionClosedCallback session_closed_callback_;
#endif // SB_HAS(DRM_SESSION_CLOSED)
@@ -151,9 +143,7 @@
SbDrmSystem wrapped_drm_system() { return wrapped_drm_system_; }
std::unique_ptr<Session> CreateSession(
-#if SB_HAS(DRM_KEY_STATUSES)
SessionUpdateKeyStatusesCallback session_update_key_statuses_callback
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_HAS(DRM_SESSION_CLOSED)
,
SessionClosedCallback session_closed_callback
@@ -216,11 +206,9 @@
std::unique_ptr<uint8[]> message, int message_size);
void OnSessionUpdated(int ticket, SbDrmStatus status,
const std::string& error_message);
-#if SB_HAS(DRM_KEY_STATUSES)
void OnSessionKeyStatusChanged(
const std::string& session_id, const std::vector<std::string>& key_ids,
const std::vector<SbDrmKeyStatus>& key_statuses);
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
void OnServerCertificateUpdated(int ticket, SbDrmStatus status,
const std::string& error_message);
@@ -253,12 +241,10 @@
int session_id_length, bool succeeded);
#endif // SB_API_VERSION >= 10
-#if SB_HAS(DRM_KEY_STATUSES)
static void OnSessionKeyStatusesChangedFunc(
SbDrmSystem wrapped_drm_system, void* context, const void* session_id,
int session_id_size, int number_of_keys, const SbDrmKeyId* key_ids,
const SbDrmKeyStatus* key_statuses);
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_HAS(DRM_SESSION_CLOSED)
static void OnSessionClosedFunc(SbDrmSystem wrapped_drm_system, void* context,
diff --git a/src/cobalt/media/base/starboard_utils.cc b/src/cobalt/media/base/starboard_utils.cc
index 60c6109..9926a4e 100644
--- a/src/cobalt/media/base/starboard_utils.cc
+++ b/src/cobalt/media/base/starboard_utils.cc
@@ -100,7 +100,6 @@
audio_sample_info.block_alignment = 4;
audio_sample_info.bits_per_sample = audio_decoder_config.bits_per_channel();
-#if SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
audio_sample_info.audio_specific_config_size =
static_cast<uint16_t>(audio_decoder_config.extra_data().size());
if (audio_sample_info.audio_specific_config_size == 0) {
@@ -109,16 +108,6 @@
audio_sample_info.audio_specific_config =
&audio_decoder_config.extra_data()[0];
}
-#else // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
- audio_sample_info.audio_specific_config_size = static_cast<uint16_t>(
- std::min(audio_decoder_config.extra_data().size(),
- sizeof(audio_sample_info.audio_specific_config)));
- if (audio_sample_info.audio_specific_config_size > 0) {
- SbMemoryCopy(audio_sample_info.audio_specific_config,
- &audio_decoder_config.extra_data()[0],
- audio_sample_info.audio_specific_config_size);
- }
-#endif // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
return audio_sample_info;
}
diff --git a/src/cobalt/media/formats/mp4/mp4_stream_parser.cc b/src/cobalt/media/formats/mp4/mp4_stream_parser.cc
index 8271529..e4d7754 100644
--- a/src/cobalt/media/formats/mp4/mp4_stream_parser.cc
+++ b/src/cobalt/media/formats/mp4/mp4_stream_parser.cc
@@ -203,7 +203,7 @@
const SampleDescription& samp_descr =
track->media.information.sample_table.description;
- // TODO(strobe): When codec reconfigurations are supported, detect and send
+ // TODO: When codec reconfigurations are supported, detect and send
// a codec reconfiguration for fragments using a sample description index
// different from the previous one
size_t desc_idx = 0;
@@ -337,7 +337,7 @@
return false;
}
- // TODO(strobe): Recover correct crop box
+ // TODO: Recover correct crop box
gfx::Size coded_size(entry.width, entry.height);
gfx::Rect visible_rect(coded_size);
@@ -459,7 +459,7 @@
void MP4StreamParser::OnEncryptedMediaInitData(
const std::vector<ProtectionSystemSpecificHeader>& headers) {
- // TODO(strobe): ensure that the value of init_data (all PSSH headers
+ // TODO: ensure that the value of init_data (all PSSH headers
// concatenated in arbitrary order) matches the EME spec.
// See https://www.w3.org/Bugs/Public/show_bug.cgi?id=17673.
size_t total_size = 0;
diff --git a/src/cobalt/media/media_module.cc b/src/cobalt/media/media_module.cc
index 2230b68..e476a6f 100644
--- a/src/cobalt/media/media_module.cc
+++ b/src/cobalt/media/media_module.cc
@@ -111,23 +111,6 @@
std::vector<std::string> disabled_media_codecs_;
};
-void RunClosureAndSignal(const base::Closure& closure,
- base::WaitableEvent* event) {
- closure.Run();
- event->Signal();
-}
-
-void RunClosureOnMessageLoopAndWait(
- const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
- const base::Closure& closure) {
- base::WaitableEvent waitable_event(
- base::WaitableEvent::ResetPolicy::MANUAL,
- base::WaitableEvent::InitialState::NOT_SIGNALED);
- task_runner->PostTask(
- FROM_HERE, base::Bind(&RunClosureAndSignal, closure, &waitable_event));
- waitable_event.Wait();
-}
-
} // namespace
std::unique_ptr<WebMediaPlayer> MediaModule::CreateWebMediaPlayer(
@@ -146,33 +129,7 @@
}
void MediaModule::Suspend() {
- RunClosureOnMessageLoopAndWait(
- task_runner_,
- base::Bind(&MediaModule::SuspendTask, base::Unretained(this)));
- resource_provider_ = NULL;
-}
-
-void MediaModule::Resume(render_tree::ResourceProvider* resource_provider) {
- resource_provider_ = resource_provider;
- RunClosureOnMessageLoopAndWait(
- task_runner_,
- base::Bind(&MediaModule::ResumeTask, base::Unretained(this)));
-}
-
-void MediaModule::RegisterPlayer(WebMediaPlayer* player) {
- RunClosureOnMessageLoopAndWait(task_runner_,
- base::Bind(&MediaModule::RegisterPlayerTask,
- base::Unretained(this), player));
-}
-
-void MediaModule::UnregisterPlayer(WebMediaPlayer* player) {
- RunClosureOnMessageLoopAndWait(task_runner_,
- base::Bind(&MediaModule::UnregisterPlayerTask,
- base::Unretained(this), player));
-}
-
-void MediaModule::SuspendTask() {
- DCHECK(task_runner_->BelongsToCurrentThread());
+ starboard::ScopedLock scoped_lock(players_lock_);
suspended_ = true;
@@ -183,10 +140,14 @@
iter->first->Suspend();
}
}
+
+ resource_provider_ = NULL;
}
-void MediaModule::ResumeTask() {
- DCHECK(task_runner_->BelongsToCurrentThread());
+void MediaModule::Resume(render_tree::ResourceProvider* resource_provider) {
+ starboard::ScopedLock scoped_lock(players_lock_);
+
+ resource_provider_ = resource_provider;
for (Players::iterator iter = players_.begin(); iter != players_.end();
++iter) {
@@ -199,8 +160,8 @@
suspended_ = false;
}
-void MediaModule::RegisterPlayerTask(WebMediaPlayer* player) {
- DCHECK(task_runner_->BelongsToCurrentThread());
+void MediaModule::RegisterPlayer(WebMediaPlayer* player) {
+ starboard::ScopedLock scoped_lock(players_lock_);
DCHECK(players_.find(player) == players_.end());
players_.insert(std::make_pair(player, false));
@@ -210,13 +171,23 @@
}
}
-void MediaModule::UnregisterPlayerTask(WebMediaPlayer* player) {
- DCHECK(task_runner_->BelongsToCurrentThread());
+void MediaModule::UnregisterPlayer(WebMediaPlayer* player) {
+ starboard::ScopedLock scoped_lock(players_lock_);
DCHECK(players_.find(player) != players_.end());
players_.erase(players_.find(player));
}
+void MediaModule::EnumerateWebMediaPlayers(
+ const EnumeratePlayersCB& enumerate_callback) const {
+ starboard::ScopedLock scoped_lock(players_lock_);
+
+ for (Players::const_iterator iter = players_.begin(); iter != players_.end();
+ ++iter) {
+ enumerate_callback.Run(iter->first);
+ }
+}
+
std::unique_ptr<CanPlayTypeHandler> MediaModule::CreateCanPlayTypeHandler() {
return std::unique_ptr<CanPlayTypeHandler>(new CanPlayTypeHandlerStarboard);
}
diff --git a/src/cobalt/media/media_module.h b/src/cobalt/media/media_module.h
index 7f06370..b3ee10d 100644
--- a/src/cobalt/media/media_module.h
+++ b/src/cobalt/media/media_module.h
@@ -23,9 +23,7 @@
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
#include "base/optional.h"
-#include "base/threading/thread.h"
#include "cobalt/math/size.h"
#include "cobalt/media/can_play_type_handler.h"
#include "cobalt/media/decoder_buffer_allocator.h"
@@ -35,6 +33,7 @@
#include "cobalt/render_tree/image.h"
#include "cobalt/render_tree/resource_provider.h"
#include "cobalt/system_window/system_window.h"
+#include "starboard/common/mutex.h"
namespace cobalt {
namespace media {
@@ -57,13 +56,9 @@
MediaModule(system_window::SystemWindow* system_window,
render_tree::ResourceProvider* resource_provider,
const Options& options = Options())
- : thread_("media_module"),
- options_(options),
+ : options_(options),
system_window_(system_window),
- resource_provider_(resource_provider) {
- thread_.Start();
- task_runner_ = thread_.task_runner();
- }
+ resource_provider_(resource_provider) {}
// Returns true when the setting is set successfully or if the setting has
// already been set to the expected value. Returns false when the setting is
@@ -77,6 +72,8 @@
// WebMediaPlayerFactory methods
std::unique_ptr<WebMediaPlayer> CreateWebMediaPlayer(
WebMediaPlayerClient* client) override;
+ void EnumerateWebMediaPlayers(
+ const EnumeratePlayersCB& enumerate_callback) const override;
void Suspend();
void Resume(render_tree::ResourceProvider* resource_provider);
@@ -90,10 +87,6 @@
private:
void RegisterDebugState(WebMediaPlayer* player);
void DeregisterDebugState();
- void SuspendTask();
- void ResumeTask();
- void RegisterPlayerTask(WebMediaPlayer* player);
- void UnregisterPlayerTask(WebMediaPlayer* player);
SbDecodeTargetGraphicsContextProvider*
GetSbDecodeTargetGraphicsContextProvider() {
@@ -108,14 +101,13 @@
// paused by us.
typedef std::map<WebMediaPlayer*, bool> Players;
- // The thread that |players_| is accessed from,
- base::Thread thread_;
- scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
const Options options_;
system_window::SystemWindow* system_window_;
cobalt::render_tree::ResourceProvider* resource_provider_;
+ // Protect access to the list of players.
+ starboard::Mutex players_lock_;
+
Players players_;
bool suspended_ = false;
diff --git a/src/cobalt/media/player/web_media_player.h b/src/cobalt/media/player/web_media_player.h
index fd02a83..79ce44b 100644
--- a/src/cobalt/media/player/web_media_player.h
+++ b/src/cobalt/media/player/web_media_player.h
@@ -132,6 +132,7 @@
virtual base::Time GetStartDate() const = 0;
#endif // SB_HAS(PLAYER_WITH_URL)
virtual float GetCurrentTime() const = 0;
+ virtual float GetPlaybackRate() const = 0;
// Get rate of loading the resource.
virtual int GetDataRate() const = 0;
diff --git a/src/cobalt/media/player/web_media_player_impl.cc b/src/cobalt/media/player/web_media_player_impl.cc
index a72957c..6185a52 100644
--- a/src/cobalt/media/player/web_media_player_impl.cc
+++ b/src/cobalt/media/player/web_media_player_impl.cc
@@ -483,6 +483,14 @@
return static_cast<float>(pipeline_->GetMediaTime().InSecondsF());
}
+float WebMediaPlayerImpl::GetPlaybackRate() const {
+ DCHECK_EQ(main_loop_, base::MessageLoop::current());
+ if (state_.paused) {
+ return 0.0f;
+ }
+ return state_.playback_rate;
+}
+
int WebMediaPlayerImpl::GetDataRate() const {
DCHECK_EQ(main_loop_, base::MessageLoop::current());
diff --git a/src/cobalt/media/player/web_media_player_impl.h b/src/cobalt/media/player/web_media_player_impl.h
index 60ce328..55a00c9 100644
--- a/src/cobalt/media/player/web_media_player_impl.h
+++ b/src/cobalt/media/player/web_media_player_impl.h
@@ -157,6 +157,7 @@
base::Time GetStartDate() const override;
#endif // SB_HAS(PLAYER_WITH_URL)
float GetCurrentTime() const override;
+ float GetPlaybackRate() const override;
// Get rate of loading the resource.
int32 GetDataRate() const override;
diff --git a/src/cobalt/media/sandbox/web_media_player_sandbox.cc b/src/cobalt/media/sandbox/web_media_player_sandbox.cc
index 079cee5..ed0ca18 100644
--- a/src/cobalt/media/sandbox/web_media_player_sandbox.cc
+++ b/src/cobalt/media/sandbox/web_media_player_sandbox.cc
@@ -14,6 +14,7 @@
#include <algorithm>
#include <memory>
+#include <sstream>
#include <string>
#include <vector>
@@ -31,6 +32,7 @@
#include "cobalt/render_tree/image.h"
#include "starboard/event.h"
#include "starboard/file.h"
+#include "starboard/log.h"
#include "starboard/system.h"
namespace cobalt {
@@ -52,25 +54,40 @@
const char kExampleProgressiveUrl[] =
"https://storage.googleapis.com/yt-cobalt-media-element-demo/"
"progressive.mp4";
- LOG(ERROR) << "\n\n\n" // Extra empty lines to separate from other messages
- << "Usage: " << executable_file_name
- << " [OPTIONS] <adaptive audio file path>\n"
- << " or: " << executable_file_name
- << " [OPTIONS] <adaptive video file path>\n"
- << " or: " << executable_file_name
- << " [OPTIONS] <adaptive audio file path> "
- << " <adaptive video file path>\n"
- << " or: " << executable_file_name
- << " [OPTIONS] <progressive video path or url>\n"
- << "Play adaptive audio/video or progressive video\n\n"
- << "For example:\n"
- << executable_file_name << " " << kExampleAdaptiveAudioPathName
- << "\n"
- << executable_file_name << " " << kExampleAdaptiveVideoPathName
- << "\n"
- << executable_file_name << " " << kExampleAdaptiveAudioPathName
- << " " << kExampleAdaptiveVideoPathName << "\n"
- << executable_file_name << " " << kExampleProgressiveUrl << "\n\n";
+ std::stringstream ss;
+ // Head
+ ss << "\n\n"
+ << "======================== " << executable_file_name
+ << " ========================\n";
+
+ // Basic usage
+ ss << "Usage: " << executable_file_name
+ << " [OPTIONS] <adaptive audio file path>\n"
+ << " or: " << executable_file_name
+ << " [OPTIONS] <adaptive video file path>\n"
+ << " or: " << executable_file_name
+ << " [OPTIONS] <adaptive audio file path> "
+ << " <adaptive video file path>\n"
+ << " or: " << executable_file_name
+ << " [OPTIONS] <progressive video path or url>\n"
+ << "Play adaptive audio/video or progressive video\n\n";
+
+ // Options
+ ss << "OPTIONS:\n"
+ << " --dump_video_data: Dump video data into .dmp files\n"
+ << " --use_stub_audio_decoder: Use stub audio decoder to play the video\n"
+ << " --use_stub_audio_sink: Use stub audio sink to play the video\n"
+ << " --use_stub_video_decoder: Use stub video decoder to play the video\n"
+ << "\n";
+
+ // Usage examples
+ ss << "For example:\n " << executable_file_name << " --dump_video_data "
+ << kExampleAdaptiveAudioPathName << "\n " << executable_file_name << " "
+ << kExampleAdaptiveVideoPathName << "\n " << executable_file_name << " "
+ << kExampleAdaptiveAudioPathName << " " << kExampleAdaptiveVideoPathName
+ << "\n " << executable_file_name << " " << kExampleProgressiveUrl
+ << "\n\n";
+ SbLogRaw(ss.str().c_str());
}
std::string MakeCodecParameter(const std::string& string) { return string; }
@@ -373,6 +390,11 @@
case kSbEventTypeStart: {
SbEventStartData* data = static_cast<SbEventStartData*>(event->data);
DCHECK(!s_application);
+ if (data->argument_count == 1) {
+ cobalt::media::sandbox::PrintUsage(data->argument_values[0]);
+ SbSystemRequestStop(0);
+ return;
+ }
s_application =
new Application(data->argument_count, data->argument_values);
break;
diff --git a/src/cobalt/media/web_media_player_factory.h b/src/cobalt/media/web_media_player_factory.h
index c05a924..9b9a37f 100644
--- a/src/cobalt/media/web_media_player_factory.h
+++ b/src/cobalt/media/web_media_player_factory.h
@@ -17,6 +17,7 @@
#include <memory>
+#include "base/callback.h"
#include "cobalt/media/player/web_media_player.h"
namespace cobalt {
@@ -24,9 +25,15 @@
class WebMediaPlayerFactory {
public:
+ typedef base::RepeatingCallback<void(const WebMediaPlayer*)>
+ EnumeratePlayersCB;
+
virtual std::unique_ptr<WebMediaPlayer> CreateWebMediaPlayer(
WebMediaPlayerClient* client) = 0;
+ virtual void EnumerateWebMediaPlayers(
+ const EnumeratePlayersCB& enumerate_callback) const = 0;
+
protected:
WebMediaPlayerFactory() {}
~WebMediaPlayerFactory() {}
diff --git a/src/cobalt/media_session/media_session.cc b/src/cobalt/media_session/media_session.cc
index c615a35..b9d04a0 100644
--- a/src/cobalt/media_session/media_session.cc
+++ b/src/cobalt/media_session/media_session.cc
@@ -36,19 +36,19 @@
void MediaSession::set_metadata(scoped_refptr<MediaMetadata> value) {
metadata_ = value;
- MaybeQueueChangeTask();
+ MaybeQueueChangeTask(base::TimeDelta());
}
void MediaSession::set_playback_state(
MediaSessionPlaybackState playback_state) {
playback_state_ = playback_state;
- MaybeQueueChangeTask();
+ MaybeQueueChangeTask(base::TimeDelta());
}
void MediaSession::SetActionHandler(
MediaSessionAction action, const MediaSessionActionHandlerHolder& handler) {
// See algorithm https://wicg.github.io/mediasession/#actions-model
- DCHECK_EQ(base::MessageLoop::current()->task_runner(), task_runner_);
+ DCHECK(task_runner_->BelongsToCurrentThread());
ActionMap::iterator it = action_map_.find(action);
if (it != action_map_.end()) {
@@ -59,32 +59,41 @@
action_map_[action] = new MediaSessionActionHandlerReference(this, handler);
}
- MaybeQueueChangeTask();
+ MaybeQueueChangeTask(base::TimeDelta());
}
void MediaSession::SetPositionState(base::Optional<MediaPositionState> state) {
last_position_updated_time_ = GetMonotonicNow();
media_position_state_ = state;
- MaybeQueueChangeTask();
+ MaybeQueueChangeTask(base::TimeDelta());
}
void MediaSession::TraceMembers(script::Tracer* tracer) {
tracer->Trace(metadata_.get());
}
-void MediaSession::MaybeQueueChangeTask() {
- DCHECK_EQ(base::MessageLoop::current()->task_runner(), task_runner_);
+bool MediaSession::IsChangeTaskQueuedForTesting() const {
+ DCHECK(task_runner_->BelongsToCurrentThread());
+ return is_change_task_queued_;
+}
+
+void MediaSession::MaybeQueueChangeTask(base::TimeDelta delay) {
+ DCHECK(task_runner_->BelongsToCurrentThread());
if (is_change_task_queued_) {
return;
}
is_change_task_queued_ = true;
- task_runner_->PostTask(
- FROM_HERE, base::Bind(&MediaSession::OnChanged, base::Unretained(this)));
+ task_runner_->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&MediaSession::OnChanged, this),
+ delay);
}
void MediaSession::OnChanged() {
is_change_task_queued_ = false;
- media_session_client_->UpdateMediaSessionState();
+ if (media_session_client_) {
+ media_session_client_->UpdateMediaSessionState();
+ }
}
} // namespace media_session
diff --git a/src/cobalt/media_session/media_session.gyp b/src/cobalt/media_session/media_session.gyp
index 242f152..da0d96b 100644
--- a/src/cobalt/media_session/media_session.gyp
+++ b/src/cobalt/media_session/media_session.gyp
@@ -38,7 +38,8 @@
],
'dependencies': [
'<(DEPTH)/cobalt/base/base.gyp:base',
- '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types'
+ '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
+ '<(DEPTH)/cobalt/math/math.gyp:math',
],
# This target doesn't generate any headers, but it exposes generated
# header files (for idl dictionaries) through this module's public header
diff --git a/src/cobalt/media_session/media_session.h b/src/cobalt/media_session/media_session.h
index b08d977..6c1db11 100644
--- a/src/cobalt/media_session/media_session.h
+++ b/src/cobalt/media_session/media_session.h
@@ -77,8 +77,12 @@
DEFINE_WRAPPABLE_TYPE(MediaSession);
void TraceMembers(script::Tracer* tracer) override;
+ // Check whether a change task has been queued. Should only be called by
+ // unit tests.
+ bool IsChangeTaskQueuedForTesting() const;
+
private:
- void MaybeQueueChangeTask();
+ void MaybeQueueChangeTask(base::TimeDelta delay);
void OnChanged();
// Returns a time representing right now - may be overridden for testing.
diff --git a/src/cobalt/media_session/media_session_client.cc b/src/cobalt/media_session/media_session_client.cc
index 96376c2..c3c6fe8 100644
--- a/src/cobalt/media_session/media_session_client.cc
+++ b/src/cobalt/media_session/media_session_client.cc
@@ -15,11 +15,66 @@
#include "cobalt/media_session/media_session_client.h"
#include <algorithm>
+#include <cmath>
#include <memory>
+#include "starboard/time.h"
+
namespace cobalt {
namespace media_session {
+namespace {
+
+// Delay to re-query position state after an action has been invoked.
+const base::TimeDelta kUpdateDelay = base::TimeDelta::FromMilliseconds(250);
+
+// Guess the media position state for the media session.
+void GuessMediaPositionState(MediaSessionState* session_state,
+ const media::WebMediaPlayer** guess_player,
+ const media::WebMediaPlayer* current_player) {
+ // Assume the player with the biggest video size is the one controlled by the
+ // media session. This isn't perfect, so it's best that the web app set the
+ // media position state explicitly.
+ if (*guess_player == nullptr ||
+ (*guess_player)->GetNaturalSize().GetArea() <
+ current_player->GetNaturalSize().GetArea()) {
+ *guess_player = current_player;
+
+ MediaPositionState position_state;
+ float duration = (*guess_player)->GetDuration();
+ if (std::isfinite(duration)) {
+ position_state.set_duration(duration);
+ } else if (std::isinf(duration)) {
+ position_state.set_duration(kSbTimeMax);
+ } else {
+ position_state.set_duration(0.0);
+ }
+ position_state.set_playback_rate((*guess_player)->GetPlaybackRate());
+ position_state.set_position((*guess_player)->GetCurrentTime());
+
+ *session_state = MediaSessionState(
+ session_state->metadata(),
+ SbTimeGetMonotonicNow(),
+ position_state,
+ session_state->actual_playback_state(),
+ session_state->available_actions());
+ }
+}
+
+} // namespace
+
+MediaSessionClient::~MediaSessionClient() {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ // Prevent any outstanding MediaSession::OnChanged tasks from calling this.
+ media_session_->media_session_client_ = nullptr;
+}
+
+void MediaSessionClient::SetMediaPlayerFactory(
+ const media::WebMediaPlayerFactory* factory) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ media_player_factory_ = factory;
+}
+
MediaSessionPlaybackState MediaSessionClient::ComputeActualPlaybackState()
const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -76,6 +131,13 @@
result[kMediaSessionActionPlay] = false;
break;
case kMediaSessionPlaybackStateNone:
+ // Not defined in the spec: disable Seekbackward, Seekforward, SeekTo, &
+ // Stop when no media is playing.
+ result[kMediaSessionActionSeekbackward] = false;
+ result[kMediaSessionActionSeekforward] = false;
+ result[kMediaSessionActionSeekto] = false;
+ result[kMediaSessionActionStop] = false;
+ // Fall-through intended (None case falls through to Paused case).
case kMediaSessionPlaybackStatePaused:
// "Otherwise, remove pause from available actions."
result[kMediaSessionActionPause] = false;
@@ -134,26 +196,11 @@
}
it->second->value().Run(*details);
-}
-MediaSessionState MediaSessionClient::GetMediaSessionState() {
- MediaSessionState session_state;
- GetMediaSessionStateInternal(&session_state);
- return session_state;
-}
-
-void MediaSessionClient::GetMediaSessionStateInternal(
- MediaSessionState* session_state) {
- DCHECK(media_session_->task_runner_);
- if (!media_session_->task_runner_->BelongsToCurrentThread()) {
- media_session_->task_runner_->PostBlockingTask(
- FROM_HERE,
- base::Bind(&MediaSessionClient::GetMediaSessionStateInternal,
- base::Unretained(this), base::Unretained(session_state)));
- return;
+ // Queue a session update to reflect the effects of the action.
+ if (!media_session_->media_position_state_) {
+ media_session_->MaybeQueueChangeTask(kUpdateDelay);
}
-
- *session_state = session_state_;
}
void MediaSessionClient::UpdateMediaSessionState() {
@@ -168,12 +215,30 @@
metadata->set_album(session_metadata->album());
metadata->set_artwork(session_metadata->artwork());
}
+
session_state_ = MediaSessionState(
metadata,
media_session_->last_position_updated_time_,
media_session_->media_position_state_,
ComputeActualPlaybackState(),
ComputeAvailableActions());
+
+ // Compute the media position state if it's not set in the media session.
+ if (!media_session_->media_position_state_ && media_player_factory_) {
+ const media::WebMediaPlayer* player = nullptr;
+ media_player_factory_->EnumerateWebMediaPlayers(
+ base::BindRepeating(&GuessMediaPositionState,
+ &session_state_, &player));
+
+ // The media duration may be reported as 0 when seeking. Re-query the
+ // media session state after a delay.
+ if (session_state_.actual_playback_state() ==
+ kMediaSessionPlaybackStatePlaying &&
+ session_state_.duration() == 0) {
+ media_session_->MaybeQueueChangeTask(kUpdateDelay);
+ }
+ }
+
OnMediaSessionStateChanged(session_state_);
}
diff --git a/src/cobalt/media_session/media_session_client.h b/src/cobalt/media_session/media_session_client.h
index 77118d9..baf5277 100644
--- a/src/cobalt/media_session/media_session_client.h
+++ b/src/cobalt/media_session/media_session_client.h
@@ -19,6 +19,7 @@
#include <memory>
#include "base/threading/thread_checker.h"
+#include "cobalt/media/web_media_player_factory.h"
#include "cobalt/media_session/media_session.h"
#include "cobalt/media_session/media_session_action_details.h"
#include "cobalt/media_session/media_session_state.h"
@@ -40,7 +41,7 @@
: media_session_(media_session),
platform_playback_state_(kMediaSessionPlaybackStateNone) {}
- virtual ~MediaSessionClient() {}
+ virtual ~MediaSessionClient();
// Creates platform-specific instance.
static std::unique_ptr<MediaSessionClient> Create();
@@ -48,6 +49,12 @@
// Retrieves the singleton MediaSession associated with this client.
scoped_refptr<MediaSession>& GetMediaSession() { return media_session_; }
+ // The web app should set the MediaPositionState of the MediaSession object.
+ // However, if that is not done, then query the web media player factory to
+ // guess which player is associated with the media session to get the media
+ // position state. The player factory must outlive the media session client.
+ void SetMediaPlayerFactory(const media::WebMediaPlayerFactory* factory);
+
// Sets the platform's current playback state. This is used to compute
// the "guessed playback state"
// https://wicg.github.io/mediasession/#guessed-playback-state
@@ -69,9 +76,6 @@
InvokeActionInternal(std::move(details));
}
- // Returns a copy of the current MediaSessionState.
- MediaSessionState GetMediaSessionState();
-
// Invoked on the browser thread when any metadata, position state, playback
// state, or supported session actions change.
virtual void OnMediaSessionStateChanged(
@@ -82,9 +86,9 @@
scoped_refptr<MediaSession> media_session_;
MediaSessionState session_state_;
MediaSessionPlaybackState platform_playback_state_;
+ const media::WebMediaPlayerFactory* media_player_factory_ = nullptr;
void UpdateMediaSessionState();
- void GetMediaSessionStateInternal(MediaSessionState* session_state);
MediaSessionPlaybackState ComputeActualPlaybackState() const;
MediaSessionState::AvailableActionsSet ComputeAvailableActions() const;
diff --git a/src/cobalt/media_session/media_session_state.h b/src/cobalt/media_session/media_session_state.h
index e567f60..65148b4 100644
--- a/src/cobalt/media_session/media_session_state.h
+++ b/src/cobalt/media_session/media_session_state.h
@@ -53,6 +53,9 @@
return metadata_;
}
+ // Returns whether media position state was specified.
+ bool has_position_state() const { return last_position_updated_time_ != 0; }
+
// Returns the position of the current playback.
// https://wicg.github.io/mediasession/#current-playback-position
// Returns the position
diff --git a/src/cobalt/media_session/media_session_test.cc b/src/cobalt/media_session/media_session_test.cc
index 63808c6..687167a 100644
--- a/src/cobalt/media_session/media_session_test.cc
+++ b/src/cobalt/media_session/media_session_test.cc
@@ -25,6 +25,8 @@
#include "cobalt/script/script_value.h"
#include "cobalt/script/testing/fake_script_value.h"
#include "cobalt/script/wrappable.h"
+#include "starboard/thread.h"
+#include "starboard/time.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -62,7 +64,25 @@
MockMediaSession& mock_session() {
return static_cast<MockMediaSession&>(*GetMediaSession().get());
}
- MOCK_METHOD1(OnMediaSessionStateChanged, void(const MediaSessionState&));
+ void OnMediaSessionStateChanged(const MediaSessionState& session_state)
+ override {
+ session_state_ = session_state;
+ ++session_change_count_;
+ }
+ void WaitForSessionStateChange() {
+ size_t current_change_count = session_change_count_;
+ while (GetMediaSession()->IsChangeTaskQueuedForTesting()) {
+ base::RunLoop().RunUntilIdle();
+ if (current_change_count != session_change_count_) {
+ break;
+ }
+ SbThreadSleep(kSbTimeMillisecond);
+ }
+ }
+ MediaSessionState GetMediaSessionState() const { return session_state_; }
+ size_t GetMediaSessionChangeCount() const { return session_change_count_; }
+ MediaSessionState session_state_;
+ size_t session_change_count_ = 0;
};
MATCHER_P(SeekTime, time, "") {
@@ -79,99 +99,86 @@
TEST(MediaSessionTest, MediaSessionTest) {
base::MessageLoop message_loop(base::MessageLoop::TYPE_DEFAULT);
- base::RunLoop run_loop;
MockMediaSessionClient client;
-
- ON_CALL(client, OnMediaSessionStateChanged(_))
- .WillByDefault(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
- EXPECT_CALL(client, OnMediaSessionStateChanged(_)).Times(1);
-
scoped_refptr<MediaSession> session = client.GetMediaSession();
- base::RunLoop().RunUntilIdle();
- EXPECT_EQ(kMediaSessionPlaybackStateNone,
- client.GetMediaSessionState().actual_playback_state());
+ EXPECT_EQ(kMediaSessionPlaybackStateNone, session->playback_state());
session->set_playback_state(kMediaSessionPlaybackStatePlaying);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
EXPECT_EQ(kMediaSessionPlaybackStatePlaying,
client.GetMediaSessionState().actual_playback_state());
- run_loop.Run();
+ EXPECT_EQ(client.GetMediaSessionChangeCount(), 1);
}
TEST(MediaSessionTest, ActualPlaybackState) {
base::MessageLoop message_loop(base::MessageLoop::TYPE_DEFAULT);
- base::RunLoop run_loop;
MockMediaSessionClient client;
-
- ON_CALL(client, OnMediaSessionStateChanged(_))
- .WillByDefault(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
- EXPECT_CALL(client, OnMediaSessionStateChanged(_)).Times(AtLeast(2));
-
scoped_refptr<MediaSession> session = client.GetMediaSession();
- base::RunLoop().RunUntilIdle();
+ // Trigger a session state change without impacting playback state.
+ session->set_metadata(new MediaMetadata);
+ client.WaitForSessionStateChange();
+ EXPECT_EQ(client.GetMediaSessionChangeCount(), 1);
+
EXPECT_EQ(kMediaSessionPlaybackStateNone,
client.GetMediaSessionState().actual_playback_state());
client.UpdatePlatformPlaybackState(kMediaSessionPlaybackStatePlaying);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
EXPECT_EQ(kMediaSessionPlaybackStatePlaying,
client.GetMediaSessionState().actual_playback_state());
session->set_playback_state(kMediaSessionPlaybackStatePlaying);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
EXPECT_EQ(kMediaSessionPlaybackStatePlaying,
client.GetMediaSessionState().actual_playback_state());
session->set_playback_state(kMediaSessionPlaybackStatePaused);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
EXPECT_EQ(kMediaSessionPlaybackStatePlaying,
client.GetMediaSessionState().actual_playback_state());
client.UpdatePlatformPlaybackState(kMediaSessionPlaybackStatePaused);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
EXPECT_EQ(kMediaSessionPlaybackStatePaused,
client.GetMediaSessionState().actual_playback_state());
session->set_playback_state(kMediaSessionPlaybackStateNone);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
EXPECT_EQ(kMediaSessionPlaybackStateNone,
client.GetMediaSessionState().actual_playback_state());
client.UpdatePlatformPlaybackState(kMediaSessionPlaybackStateNone);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
EXPECT_EQ(kMediaSessionPlaybackStateNone,
client.GetMediaSessionState().actual_playback_state());
- run_loop.Run();
+ EXPECT_GE(client.GetMediaSessionChangeCount(), 2);
}
TEST(MediaSessionTest, NullActionClears) {
base::MessageLoop message_loop(base::MessageLoop::TYPE_DEFAULT);
- base::RunLoop run_loop;
MockMediaSessionClient client;
- MediaSessionState state;
-
- ON_CALL(client, OnMediaSessionStateChanged(_))
- .WillByDefault(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
- EXPECT_CALL(client, OnMediaSessionStateChanged(_)).Times(AtLeast(0));
-
scoped_refptr<MediaSession> session = client.GetMediaSession();
- base::RunLoop().RunUntilIdle();
- state = client.GetMediaSessionState();
+ // Trigger a session state change without impacting playback state.
+ session->set_metadata(new MediaMetadata);
+ client.WaitForSessionStateChange();
+ EXPECT_EQ(client.GetMediaSessionChangeCount(), 1);
+
+ MediaSessionState state = client.GetMediaSessionState();
EXPECT_EQ(kMediaSessionPlaybackStateNone, state.actual_playback_state());
EXPECT_EQ(0, state.available_actions().to_ulong());
@@ -184,30 +191,30 @@
FakeScriptValue<MediaSession::MediaSessionActionHandler> null_holder(NULL);
session->SetActionHandler(kMediaSessionActionPlay, holder);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
EXPECT_EQ(1, client.GetMediaSessionState().available_actions().to_ulong());
client.InvokeAction(kMediaSessionActionPlay);
session->SetActionHandler(kMediaSessionActionPlay, null_holder);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
EXPECT_EQ(0, client.GetMediaSessionState().available_actions().to_ulong());
client.InvokeAction(kMediaSessionActionPlay);
+
+ EXPECT_GE(client.GetMediaSessionChangeCount(), 3);
}
TEST(MediaSessionTest, AvailableActions) {
base::MessageLoop message_loop(base::MessageLoop::TYPE_DEFAULT);
- base::RunLoop run_loop;
MockMediaSessionClient client;
MediaSessionState state;
-
- ON_CALL(client, OnMediaSessionStateChanged(_))
- .WillByDefault(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
- EXPECT_CALL(client, OnMediaSessionStateChanged(_)).Times(AtLeast(0));
-
scoped_refptr<MediaSession> session = client.GetMediaSession();
- base::RunLoop().RunUntilIdle();
+ // Trigger a session state change without impacting playback state.
+ session->set_metadata(new MediaMetadata);
+ client.WaitForSessionStateChange();
+ EXPECT_EQ(client.GetMediaSessionChangeCount(), 1);
+
state = client.GetMediaSessionState();
EXPECT_EQ(kMediaSessionPlaybackStateNone, state.actual_playback_state());
EXPECT_EQ(0, state.available_actions().to_ulong());
@@ -218,28 +225,27 @@
session->SetActionHandler(kMediaSessionActionPlay, holder);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(1 << kMediaSessionActionPlay,
state.available_actions().to_ulong());
session->SetActionHandler(kMediaSessionActionPause, holder);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(1 << kMediaSessionActionPlay,
state.available_actions().to_ulong());
session->SetActionHandler(kMediaSessionActionSeekto, holder);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
- EXPECT_EQ(1 << kMediaSessionActionPlay | 1 << kMediaSessionActionSeekto,
- state.available_actions().to_ulong());
+ EXPECT_EQ(1 << kMediaSessionActionPlay, state.available_actions().to_ulong());
client.UpdatePlatformPlaybackState(kMediaSessionPlaybackStatePlaying);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(kMediaSessionPlaybackStatePlaying, state.actual_playback_state());
EXPECT_EQ(1 << kMediaSessionActionPause | 1 << kMediaSessionActionSeekto,
@@ -247,7 +253,7 @@
session->set_playback_state(kMediaSessionPlaybackStatePlaying);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(kMediaSessionPlaybackStatePlaying, state.actual_playback_state());
EXPECT_EQ(1 << kMediaSessionActionPause | 1 << kMediaSessionActionSeekto,
@@ -255,7 +261,7 @@
session->set_playback_state(kMediaSessionPlaybackStatePaused);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(kMediaSessionPlaybackStatePlaying, state.actual_playback_state());
EXPECT_EQ(1 << kMediaSessionActionPause | 1 << kMediaSessionActionSeekto,
@@ -263,7 +269,7 @@
session->set_playback_state(kMediaSessionPlaybackStatePlaying);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(kMediaSessionPlaybackStatePlaying, state.actual_playback_state());
EXPECT_EQ(1 << kMediaSessionActionPause | 1 << kMediaSessionActionSeekto,
@@ -271,7 +277,7 @@
client.UpdatePlatformPlaybackState(kMediaSessionPlaybackStatePaused);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(kMediaSessionPlaybackStatePlaying, state.actual_playback_state());
EXPECT_EQ(1 << kMediaSessionActionPause | 1 << kMediaSessionActionSeekto,
@@ -279,15 +285,14 @@
session->set_playback_state(kMediaSessionPlaybackStateNone);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(kMediaSessionPlaybackStateNone, state.actual_playback_state());
- EXPECT_EQ(1 << kMediaSessionActionPlay | 1 << kMediaSessionActionSeekto,
- state.available_actions().to_ulong());
+ EXPECT_EQ(1 << kMediaSessionActionPlay, state.available_actions().to_ulong());
session->set_playback_state(kMediaSessionPlaybackStatePaused);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(kMediaSessionPlaybackStatePaused, state.actual_playback_state());
EXPECT_EQ(1 << kMediaSessionActionPlay | 1 << kMediaSessionActionSeekto,
@@ -295,25 +300,17 @@
client.UpdatePlatformPlaybackState(kMediaSessionPlaybackStateNone);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(kMediaSessionPlaybackStatePaused, state.actual_playback_state());
EXPECT_EQ(1 << kMediaSessionActionPlay | 1 << kMediaSessionActionSeekto,
state.available_actions().to_ulong());
-
- run_loop.Run();
}
TEST(MediaSessionTest, SeekDetails) {
base::MessageLoop message_loop(base::MessageLoop::TYPE_DEFAULT);
- base::RunLoop run_loop;
MockMediaSessionClient client;
-
- ON_CALL(client, OnMediaSessionStateChanged(_))
- .WillByDefault(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
- EXPECT_CALL(client, OnMediaSessionStateChanged(_)).Times(AtLeast(0));
-
scoped_refptr<MediaSession> session = client.GetMediaSession();
MockCallbackFunction cf;
@@ -351,18 +348,15 @@
details->set_action(kMediaSessionActionSeekbackward);
details->set_seek_offset(5.6);
client.InvokeAction(std::move(details));
+
+ client.WaitForSessionStateChange();
+ EXPECT_GE(client.GetMediaSessionChangeCount(), 0);
}
TEST(MediaSessionTest, PositionState) {
base::MessageLoop message_loop(base::MessageLoop::TYPE_DEFAULT);
- base::RunLoop run_loop;
MockMediaSessionClient client;
-
- ON_CALL(client, OnMediaSessionStateChanged(_))
- .WillByDefault(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
- EXPECT_CALL(client, OnMediaSessionStateChanged(_)).Times(AtLeast(3));
-
MockMediaSession& session = client.mock_session();
MediaSessionState state;
@@ -373,8 +367,12 @@
position_state->set_duration(100.0);
position_state->set_position(10.0);
+ // Trigger a session state change without impacting playback state.
+ session.set_metadata(new MediaMetadata);
+ client.WaitForSessionStateChange();
+ EXPECT_EQ(client.GetMediaSessionChangeCount(), 1);
+
// Position state not yet reported
- base::RunLoop().RunUntilIdle();
state = client.GetMediaSessionState();
EXPECT_EQ(0,
state.GetCurrentPlaybackPosition(start_time + 999 * kSbTimeSecond));
@@ -385,7 +383,7 @@
EXPECT_CALL(session, GetMonotonicNow()).WillOnce(Return(start_time));
position_state->set_playback_rate(1.0);
session.SetPositionState(position_state);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ((10 + 50) * kSbTimeSecond,
state.GetCurrentPlaybackPosition(start_time + 50 * kSbTimeSecond));
@@ -398,7 +396,7 @@
EXPECT_CALL(session, GetMonotonicNow()).WillOnce(Return(start_time));
position_state->set_playback_rate(2.0);
session.SetPositionState(position_state);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ((10 + 2 * 20) * kSbTimeSecond,
state.GetCurrentPlaybackPosition(start_time + 20 * kSbTimeSecond));
@@ -411,7 +409,7 @@
EXPECT_CALL(session, GetMonotonicNow()).WillOnce(Return(start_time));
position_state->set_playback_rate(-1.0);
session.SetPositionState(position_state);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(0 * kSbTimeSecond,
state.GetCurrentPlaybackPosition(start_time + 20 * kSbTimeSecond));
@@ -425,7 +423,7 @@
position_state->set_duration(std::numeric_limits<double>::infinity());
position_state->set_playback_rate(1.0);
session.SetPositionState(position_state);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(10 * kSbTimeSecond + 1 * kSbTimeDay,
state.GetCurrentPlaybackPosition(start_time + 1 * kSbTimeDay));
@@ -436,7 +434,7 @@
// (Actual playback rate is 0.0, so position is the last reported position.
// The web app should update position and playback states together.)
session.set_playback_state(kMediaSessionPlaybackStatePaused);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(10 * kSbTimeSecond,
state.GetCurrentPlaybackPosition(start_time + 999 * kSbTimeSecond));
@@ -447,32 +445,32 @@
// Position state cleared
EXPECT_CALL(session, GetMonotonicNow()).WillOnce(Return(start_time));
session.SetPositionState(base::nullopt);
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
EXPECT_EQ(0,
state.GetCurrentPlaybackPosition(start_time + 999 * kSbTimeSecond));
EXPECT_EQ(0, state.duration());
EXPECT_EQ(0.0, state.actual_playback_rate());
+
+ EXPECT_GE(client.GetMediaSessionChangeCount(), 3);
}
TEST(MediaSessionTest, Metadata) {
base::MessageLoop message_loop(base::MessageLoop::TYPE_DEFAULT);
- base::RunLoop run_loop;
MockMediaSessionClient client;
-
- ON_CALL(client, OnMediaSessionStateChanged(_))
- .WillByDefault(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
- EXPECT_CALL(client, OnMediaSessionStateChanged(_)).Times(AtLeast(0));
-
MockMediaSession& session = client.mock_session();
MediaSessionState state;
MediaMetadataInit init_metadata;
base::Optional<MediaMetadataInit> state_metadata;
+ // Trigger a session state change without impacting metadata.
+ session.set_playback_state(kMediaSessionPlaybackStateNone);
+ client.WaitForSessionStateChange();
+ EXPECT_EQ(client.GetMediaSessionChangeCount(), 1);
+
// Metadata not yet set
- base::RunLoop().RunUntilIdle();
state = client.GetMediaSessionState();
state_metadata = state.metadata();
EXPECT_FALSE(state.has_metadata());
@@ -491,7 +489,7 @@
session.set_metadata(
scoped_refptr<MediaMetadata>(new MediaMetadata(init_metadata)));
- base::RunLoop().RunUntilIdle();
+ client.WaitForSessionStateChange();
state = client.GetMediaSessionState();
state_metadata = state.metadata();
EXPECT_TRUE(state.has_metadata());
@@ -501,6 +499,8 @@
EXPECT_EQ("album", state_metadata->album());
EXPECT_EQ(1, state_metadata->artwork().size());
EXPECT_EQ("http://art.image", state_metadata->artwork().at(0).src());
+
+ EXPECT_GE(client.GetMediaSessionChangeCount(), 2);
}
} // namespace
diff --git a/src/cobalt/network/net_log_constants.cc b/src/cobalt/network/net_log_constants.cc
index 6f96411..a012c4b 100644
--- a/src/cobalt/network/net_log_constants.cc
+++ b/src/cobalt/network/net_log_constants.cc
@@ -115,7 +115,7 @@
{
std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- // TODO[johnx]: find out where the corresponding integer number for each
+ // TODO: find out where the corresponding integer number for each
// event phase lives and replace the following hard-coded number with them.
dict->SetInteger("PHASE_BEGIN", 0);
dict->SetInteger("PHASE_END", 1);
diff --git a/src/cobalt/network/switches.cc b/src/cobalt/network/switches.cc
index 6a7bd0a..469b8ae 100644
--- a/src/cobalt/network/switches.cc
+++ b/src/cobalt/network/switches.cc
@@ -33,6 +33,9 @@
const char kUserAgent[] = "user_agent";
#endif // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
+// Switch to disable use of the Quic network protocol.
+const char kDisableQuic[] = "disable_quic";
+
} // namespace switches
} // namespace network
} // namespace cobalt
diff --git a/src/cobalt/network/switches.h b/src/cobalt/network/switches.h
index 8d46ce1..a3c3894 100644
--- a/src/cobalt/network/switches.h
+++ b/src/cobalt/network/switches.h
@@ -24,6 +24,7 @@
extern const char kNetLogCaptureMode[];
extern const char kUserAgent[];
#endif // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
+extern const char kDisableQuic[];
} // namespace switches
} // namespace network
diff --git a/src/cobalt/network/url_request_context.cc b/src/cobalt/network/url_request_context.cc
index 850eade..4cfb2c8 100644
--- a/src/cobalt/network/url_request_context.cc
+++ b/src/cobalt/network/url_request_context.cc
@@ -22,11 +22,12 @@
#include "cobalt/network/network_delegate.h"
#include "cobalt/network/persistent_cookie_store.h"
#include "cobalt/network/proxy_config_service.h"
+#include "cobalt/network/switches.h"
#include "net/cert/cert_net_fetcher.h"
+#include "net/cert/cert_verifier.h"
#include "net/cert/cert_verify_proc.h"
#include "net/cert/ct_policy_enforcer.h"
#include "net/cert/do_nothing_ct_verifier.h"
-#include "net/cert/multi_threaded_cert_verifier.h"
#include "net/cert_net/cert_net_fetcher_impl.h"
#include "net/dns/host_cache.h"
#include "net/http/http_auth_handler_factory.h"
@@ -49,13 +50,30 @@
proxy_config.proxy_rules().ParseFromString(proxy_rules);
return proxy_config;
}
+
+#if defined(ENABLE_DEBUGGER)
+const char kQUICToggleCommand[] = "quic_toggle";
+const char kQUICToggleCommandShortHelp[] = "Toggles QUIC support on/off.";
+const char kQUICToggleCommandLongHelp[] =
+ "Each time this is called, it will toggle whether QUIC support is "
+ "enabled or not. The new value will apply for new streams.";
+#endif // defined(ENABLE_DEBUGGER)
+
} // namespace
URLRequestContext::URLRequestContext(
storage::StorageManager* storage_manager, const std::string& custom_proxy,
net::NetLog* net_log, bool ignore_certificate_errors,
scoped_refptr<base::SingleThreadTaskRunner> network_task_runner)
- : ALLOW_THIS_IN_INITIALIZER_LIST(storage_(this)) {
+ : ALLOW_THIS_IN_INITIALIZER_LIST(storage_(this))
+#if defined(ENABLE_DEBUGGER)
+ ,
+ ALLOW_THIS_IN_INITIALIZER_LIST(quic_toggle_command_handler_(
+ kQUICToggleCommand,
+ base::Bind(&URLRequestContext::OnQuicToggle, base::Unretained(this)),
+ kQUICToggleCommandShortHelp, kQUICToggleCommandLongHelp))
+#endif // defined(ENABLE_DEBUGGER)
+{
if (storage_manager) {
persistent_cookie_store_ =
new PersistentCookieStore(storage_manager, network_task_runner);
@@ -85,11 +103,13 @@
storage_.set_ct_policy_enforcer(std::unique_ptr<net::CTPolicyEnforcer>(
new net::DefaultCTPolicyEnforcer()));
DCHECK(ct_policy_enforcer());
- storage_.set_cert_verifier(std::make_unique<net::MultiThreadedCertVerifier>(
- net::CertVerifyProc::CreateDefault()));
+ // As of Chromium m70 net, CreateDefault will return a caching multi-thread
+ // cert verifier, the verification cache will usually cache 25-40
+ // results in a single session which can take up to 100KB memory.
+ storage_.set_cert_verifier(net::CertVerifier::CreateDefault());
storage_.set_transport_security_state(
std::make_unique<net::TransportSecurityState>());
- // TODO[johnx]: Investigate if we want the cert transparency verifier.
+ // TODO: Investigate if we want the cert transparency verifier.
storage_.set_cert_transparency_verifier(
std::make_unique<net::DoNothingCTVerifier>());
storage_.set_ssl_config_service(
@@ -102,15 +122,13 @@
net::HttpNetworkSession::Params params;
#if defined(COBALT_ENABLE_QUIC)
- params.enable_quic = true;
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ params.enable_quic = !command_line->HasSwitch(switches::kDisableQuic);
#endif
#if defined(ENABLE_IGNORE_CERTIFICATE_ERRORS)
params.ignore_certificate_errors = ignore_certificate_errors;
if (ignore_certificate_errors) {
- auto* multi_threaded_cert_verifier =
- base::polymorphic_downcast<net::MultiThreadedCertVerifier*>(
- cert_verifier());
- multi_threaded_cert_verifier->set_ignore_errors(true);
+ cert_verifier()->set_ignore_certificate_errors(true);
LOG(INFO) << "ignore_certificate_errors option specified, Certificate "
"validation results will be ignored but error message will "
"still be displayed.";
@@ -164,5 +182,12 @@
std::make_unique<ProxyConfigService>(proxy_config));
}
+#if defined(ENABLE_DEBUGGER)
+void URLRequestContext::OnQuicToggle(const std::string& /*message*/) {
+ DCHECK(storage_.http_network_session());
+ storage_.http_network_session()->ToggleQuic();
+}
+#endif // defined(ENABLE_DEBUGGER)
+
} // namespace network
} // namespace cobalt
diff --git a/src/cobalt/network/url_request_context.h b/src/cobalt/network/url_request_context.h
index 8845870..56852a9 100644
--- a/src/cobalt/network/url_request_context.h
+++ b/src/cobalt/network/url_request_context.h
@@ -23,6 +23,10 @@
#include "net/url_request/url_request_context_getter.h"
#include "net/url_request/url_request_context_storage.h"
+#if defined(ENABLE_DEBUGGER)
+#include "cobalt/debug/console/command_manager.h"
+#endif // ENABLE_DEBUGGER
+
namespace cobalt {
namespace storage {
class StorageManager;
@@ -44,6 +48,16 @@
net::URLRequestContextStorage storage_;
scoped_refptr<net::CookieMonster::PersistentCookieStore>
persistent_cookie_store_;
+
+#if defined(ENABLE_DEBUGGER)
+ // Command handler object for toggling the input fuzzer on/off.
+ debug::console::ConsoleCommandManager::CommandHandler
+ quic_toggle_command_handler_;
+
+ // Toggles the input fuzzer on/off. Ignores the parameter.
+ void OnQuicToggle(const std::string&);
+#endif // defined(ENABLE_DEBUGGER)
+
DISALLOW_COPY_AND_ASSIGN(URLRequestContext);
};
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_texture_lookup_translated_rectangle.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_texture_lookup_translated_rectangle.glsl
new file mode 100644
index 0000000..6969506
--- /dev/null
+++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_texture_lookup_translated_rectangle.glsl
@@ -0,0 +1,39 @@
+#version 100
+
+uniform highp float u_skRTHeight;
+precision mediump float;
+uniform vec4 uColor_Stage0;
+uniform vec4 uproxyRect_Stage1;
+uniform float ucornerRadius_Stage1;
+uniform float ublurRadius_Stage1;
+uniform highp sampler2D uTextureSampler_0_Stage1;
+void main() {
+highp vec2 _sktmpCoord = gl_FragCoord.xy;
+highp vec4 sk_FragCoord = vec4(_sktmpCoord.x, u_skRTHeight - _sktmpCoord.y, 1.0, 1.0);
+ vec4 outputColor_Stage0;
+ {
+ outputColor_Stage0 = uColor_Stage0;
+ }
+ vec4 output_Stage1;
+ {
+ vec2 translatedFragPos = sk_FragCoord.xy - uproxyRect_Stage1.xy;
+ float threshold = ucornerRadius_Stage1 + 2.0 * ublurRadius_Stage1;
+ vec2 middle = (uproxyRect_Stage1.zw - uproxyRect_Stage1.xy) - 2.0 * threshold;
+ if (translatedFragPos.x >= threshold && translatedFragPos.x < middle.x + threshold) {
+ translatedFragPos.x = threshold;
+ } else if (translatedFragPos.x >= middle.x + threshold) {
+ translatedFragPos.x -= middle.x - 1.0;
+ }
+ if (translatedFragPos.y > threshold && translatedFragPos.y < middle.y + threshold) {
+ translatedFragPos.y = threshold;
+ } else if (translatedFragPos.y >= middle.y + threshold) {
+ translatedFragPos.y -= middle.y - 1.0;
+ }
+ vec2 proxyDims = vec2(2.0 * threshold + 1.0);
+ vec2 texCoord = translatedFragPos / proxyDims;
+ output_Stage1 = texture2D(uTextureSampler_0_Stage1, texCoord);
+ }
+ {
+ gl_FragColor = outputColor_Stage0 * output_Stage1;
+ }
+}
diff --git a/src/cobalt/renderer/pipeline.cc b/src/cobalt/renderer/pipeline.cc
index 8685199..ef54726 100644
--- a/src/cobalt/renderer/pipeline.cc
+++ b/src/cobalt/renderer/pipeline.cc
@@ -175,18 +175,20 @@
FROM_HERE,
base::Bind(&Pipeline::ShutdownSubmissionQueue, base::Unretained(this)));
- // This potential reference to a render tree whose animations may have ended
- // must be destroyed before we shutdown the rasterizer thread since it may
- // contain references to render tree nodes and resources.
- last_render_tree_ = NULL;
- last_animated_render_tree_ = NULL;
-
// Submit a shutdown task to the rasterizer thread so that it can shutdown
// anything that must be shutdown from that thread.
- rasterizer_thread_.message_loop()->task_runner()->PostTask(
+ rasterizer_thread_.message_loop()->task_runner()->PostBlockingTask(
FROM_HERE,
base::Bind(&Pipeline::ShutdownRasterizerThread, base::Unretained(this)));
+ // Finally shutdown the rasterizer. Do this after ShutdownRasterizerThread()
+ // has run, just in case it posted more tasks to the rasterizer thread. This
+ // will free the rasterizer after the posted tasks have executed (unless they
+ // were delayed tasks).
+ rasterizer_thread_.message_loop()->task_runner()->PostBlockingTask(
+ FROM_HERE,
+ base::Bind(&Pipeline::ShutdownRasterizer, base::Unretained(this)));
+
rasterizer_thread_.Stop();
}
@@ -584,8 +586,11 @@
render_target_);
}
- // Finally, destroy the rasterizer.
- rasterizer_.reset();
+ // This potential reference to a render tree whose animations may have ended
+ // must be destroyed before we shutdown the rasterizer thread since it may
+ // contain references to render tree nodes and resources.
+ last_render_tree_ = NULL;
+ last_animated_render_tree_ = NULL;
}
#if defined(ENABLE_DEBUGGER)
diff --git a/src/cobalt/renderer/pipeline.h b/src/cobalt/renderer/pipeline.h
index c96da47..edd931d 100644
--- a/src/cobalt/renderer/pipeline.h
+++ b/src/cobalt/renderer/pipeline.h
@@ -163,6 +163,11 @@
// needs to be shutdown from there.
void ShutdownRasterizerThread();
+ // This method releases the rasterizer. This is exposed separately from
+ // ShutdownRasterizerThread() so it can be executed after tasks that may
+ // be posted by ShutdownRasterizerThread().
+ void ShutdownRasterizer() { rasterizer_.reset(); }
+
#if defined(ENABLE_DEBUGGER)
void OnDumpCurrentRenderTree(const std::string&);
void OnToggleFpsStdout(const std::string&);
diff --git a/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.cc b/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.cc
index bfff114..e2a4b5c 100644
--- a/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.cc
+++ b/src/cobalt/renderer/rasterizer/blitter/render_tree_node_visitor.cc
@@ -51,6 +51,8 @@
namespace rasterizer {
namespace blitter {
+using common::utils::IsOpaque;
+using common::utils::IsTransparent;
using math::Matrix3F;
using math::Rect;
using math::RectF;
@@ -154,9 +156,9 @@
}
if (!filter_node->data().opacity_filter ||
- filter_node->data().opacity_filter->opacity() == 1.0f) {
+ IsOpaque(filter_node->data().opacity_filter->opacity())) {
source->Accept(this);
- } else if (filter_node->data().opacity_filter->opacity() != 0.0f) {
+ } else if (!IsTransparent(filter_node->data().opacity_filter->opacity())) {
// If the opacity is set to 0, the contents are invisible and we are
// trivially done. However, if we made it into this branch, then
// we know that opacity is in the range (0, 1), exclusive.
@@ -254,7 +256,7 @@
-local_matrix.Get(1, 2) * image_size.height()));
// Render the image.
- if (render_state_.opacity < 1.0f) {
+ if (!IsOpaque(render_state_.opacity)) {
SbBlitterSetBlending(context_, true);
SbBlitterSetModulateBlitsWithColor(context_, true);
SbBlitterSetColor(
@@ -336,12 +338,7 @@
const RectF& rect) {
SbBlitterColor blitter_color = RenderTreeToBlitterColor(color);
SbBlitterSetColor(context, blitter_color);
-
- if (SbBlitterAFromColor(blitter_color) < 255) {
- SbBlitterSetBlending(context, true);
- } else {
- SbBlitterSetBlending(context, false);
- }
+ SbBlitterSetBlending(context, !IsOpaque(color.a()));
// We draw four rectangles, one for each border edge. They have the following
// layout:
@@ -407,11 +404,11 @@
rect_node->data().background_brush.get());
ColorRGBA color = solid_color_brush->color();
- if (render_state_.opacity < 1.0f) {
+ if (!IsOpaque(render_state_.opacity)) {
color.set_a(color.a() * render_state_.opacity);
}
- SbBlitterSetBlending(context_, color.a() < 1.0f);
+ SbBlitterSetBlending(context_, !IsOpaque(color.a()));
SbBlitterSetColor(context_, RenderTreeToBlitterColor(color));
SbBlitterFillRect(context_, RectFToBlitterRect(transformed_rect));
@@ -448,7 +445,7 @@
border.bottom.width * render_state_.transform.scale().y();
ColorRGBA color = border.left.color;
- if (render_state_.opacity < 1.0f) {
+ if (!IsOpaque(render_state_.opacity)) {
color.set_a(color.a() * render_state_.opacity);
}
RenderRectNodeBorder(context_, color, left_width, right_width, top_width,
@@ -493,7 +490,7 @@
SbBlitterSetBlending(context_, true);
- if (render_state_.opacity < 1.0f) {
+ if (!IsOpaque(render_state_.opacity)) {
SbBlitterSetModulateBlitsWithColor(context_, true);
SbBlitterSetColor(
context_,
diff --git a/src/cobalt/renderer/rasterizer/common/utils.cc b/src/cobalt/renderer/rasterizer/common/utils.cc
index 4f7c304..d7049a2 100644
--- a/src/cobalt/renderer/rasterizer/common/utils.cc
+++ b/src/cobalt/renderer/rasterizer/common/utils.cc
@@ -52,6 +52,14 @@
return false;
}
+bool IsOpaque(float opacity) {
+ return opacity >= 254.5f / 255.0f;
+}
+
+bool IsTransparent(float opacity) {
+ return opacity <= 0.5f / 255.0f;
+}
+
} // namespace utils
} // namespace common
} // namespace rasterizer
diff --git a/src/cobalt/renderer/rasterizer/common/utils.h b/src/cobalt/renderer/rasterizer/common/utils.h
index b67314a..5fe915b 100644
--- a/src/cobalt/renderer/rasterizer/common/utils.h
+++ b/src/cobalt/renderer/rasterizer/common/utils.h
@@ -32,6 +32,13 @@
// offscreen target, then rendering that target with opacity.
bool NodeCanRenderWithOpacity(render_tree::Node* node);
+// Returns whether the given opacity [0,1] should be considered fully opaque.
+bool IsOpaque(float opacity);
+
+// Returns whether the given opacity [0,1] should be considered fully
+// transparent.
+bool IsTransparent(float opacity);
+
} // namespace utils
} // namespace common
} // namespace rasterizer
diff --git a/src/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc b/src/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc
index 13a8e7e..40c04a4 100644
--- a/src/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc
+++ b/src/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc
@@ -47,6 +47,9 @@
namespace rasterizer {
namespace egl {
+using common::utils::IsOpaque;
+using common::utils::IsTransparent;
+
namespace {
typedef float ColorTransformMatrix[16];
@@ -76,8 +79,6 @@
return kBT709ColorTransformMatrixInColumnMajor;
}
-bool IsOpaque(float opacity) { return opacity >= 0.999f; }
-
bool IsUniformSolidColor(const render_tree::Border& border) {
return border.left.style == render_tree::kBorderStyleSolid &&
border.right.style == render_tree::kBorderStyleSolid &&
@@ -413,10 +414,10 @@
if (data.opacity_filter && !data.viewport_filter && !data.blur_filter &&
!data.map_to_mesh_filter) {
const float filter_opacity = data.opacity_filter->opacity();
- if (filter_opacity <= 0.0f) {
+ if (IsTransparent(filter_opacity)) {
// Totally transparent. Ignore the source.
return;
- } else if (filter_opacity >= 1.0f) {
+ } else if (IsOpaque(filter_opacity)) {
// Totally opaque. Render like normal.
data.source->Accept(this);
return;
@@ -1111,7 +1112,7 @@
// clear command instead of a more general draw command, to give the GL
// driver a better chance to optimize.
if (!draw_state_.rounded_scissor_corners &&
- draw_state_.transform.IsIdentity() && draw_state_.opacity == 1.0f) {
+ draw_state_.transform.IsIdentity() && IsOpaque(draw_state_.opacity)) {
math::Rect old_scissor = draw_state_.scissor;
draw_state_.scissor.Intersect(math::Rect::RoundFromRectF(rect));
std::unique_ptr<DrawObject> draw_clear(
diff --git a/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc b/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc
index 37ffae8..7c44ce9 100644
--- a/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc
+++ b/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc
@@ -81,6 +81,9 @@
namespace rasterizer {
namespace skia {
+using common::utils::IsOpaque;
+using common::utils::IsTransparent;
+
RenderTreeNodeVisitor::RenderTreeNodeVisitor(
SkCanvas* render_target,
const CreateScratchSurfaceFunction* create_scratch_surface_function,
@@ -450,13 +453,13 @@
#endif // ENABLE_RENDER_TREE_VISITOR_TRACING
if (filter_node->data().opacity_filter &&
- filter_node->data().opacity_filter->opacity() <= 0.0f) {
+ IsTransparent(filter_node->data().opacity_filter->opacity())) {
// The opacity 0, so we have nothing to render.
return;
}
if ((!filter_node->data().opacity_filter ||
- filter_node->data().opacity_filter->opacity() == 1.0f) &&
+ IsOpaque(filter_node->data().opacity_filter->opacity())) &&
!filter_node->data().viewport_filter &&
(!filter_node->data().blur_filter ||
filter_node->data().blur_filter->blur_sigma() == 0.0f)) {
@@ -557,7 +560,7 @@
// |kLow_SkFilterQuality| is used for bilinear interpolation of images.
paint.setFilterQuality(kLow_SkFilterQuality);
- if (draw_state.opacity < 1.0f) {
+ if (!IsOpaque(draw_state.opacity)) {
paint.setAlpha(draw_state.opacity * 255);
} else if (is_opaque && draw_state.clip_is_rect) {
paint.setBlendMode(SkBlendMode::kSrc);
@@ -811,7 +814,7 @@
const cobalt::render_tree::ColorRGBA& color = solid_color_brush->color();
float alpha = color.a() * draw_state_.opacity;
- if (alpha == 1.0f) {
+ if (IsOpaque(alpha)) {
paint_->setBlendMode(SkBlendMode::kSrc);
} else {
paint_->setBlendMode(SkBlendMode::kSrcOver);
@@ -862,10 +865,10 @@
SkGradientShader::kInterpolateColorsInPremul_Flag, NULL));
paint_->setShader(shader);
- if (!skia_color_stops.has_alpha && draw_state_.opacity == 1.0f) {
+ if (!skia_color_stops.has_alpha && IsOpaque(draw_state_.opacity)) {
paint_->setBlendMode(SkBlendMode::kSrc);
} else {
- if (draw_state_.opacity < 1.0f) {
+ if (!IsOpaque(draw_state_.opacity)) {
paint_->setAlpha(255 * draw_state_.opacity);
}
paint_->setBlendMode(SkBlendMode::kSrcOver);
@@ -900,10 +903,10 @@
SkGradientShader::kInterpolateColorsInPremul_Flag, &local_matrix));
paint_->setShader(shader);
- if (!skia_color_stops.has_alpha && draw_state_.opacity == 1.0f) {
+ if (!skia_color_stops.has_alpha && IsOpaque(draw_state_.opacity)) {
paint_->setBlendMode(SkBlendMode::kSrc);
} else {
- if (draw_state_.opacity < 1.0f) {
+ if (!IsOpaque(draw_state_.opacity)) {
paint_->setAlpha(255 * draw_state_.opacity);
}
paint_->setBlendMode(SkBlendMode::kSrcOver);
@@ -985,7 +988,7 @@
paint.setARGB(alpha * 255, border_color.r() * 255, border_color.g() * 255,
border_color.b() * 255);
paint.setAntiAlias(anti_alias);
- if (alpha == 1.0f) {
+ if (IsOpaque(alpha)) {
paint.setBlendMode(SkBlendMode::kSrc);
} else {
paint.setBlendMode(SkBlendMode::kSrcOver);
@@ -1012,7 +1015,7 @@
paint.setARGB(alpha * 255, color.r() * 255, color.g() * 255,
color.b() * 255);
paint.setAntiAlias(anti_alias);
- if (alpha == 1.0f) {
+ if (IsOpaque(alpha)) {
paint.setBlendMode(SkBlendMode::kSrc);
} else {
paint.setBlendMode(SkBlendMode::kSrcOver);
@@ -1128,7 +1131,7 @@
float alpha = color.a();
alpha *= draw_state->opacity;
paint.setARGB(alpha * 255, color.r() * 255, color.g() * 255, color.b() * 255);
- if (alpha == 1.0f) {
+ if (IsOpaque(alpha)) {
paint.setBlendMode(SkBlendMode::kSrc);
} else {
paint.setBlendMode(SkBlendMode::kSrcOver);
diff --git a/src/cobalt/script/sequence.h b/src/cobalt/script/sequence.h
index 5344212..5c32d8d 100644
--- a/src/cobalt/script/sequence.h
+++ b/src/cobalt/script/sequence.h
@@ -36,6 +36,7 @@
// --- Vector partial emulation ---
typedef typename SequenceType::size_type size_type;
+ typedef typename SequenceType::value_type value_type;
typedef typename SequenceType::reference reference;
typedef typename SequenceType::const_reference const_reference;
typedef typename SequenceType::iterator iterator;
diff --git a/src/cobalt/script/shared/stub_script_debugger.cc b/src/cobalt/script/shared/stub_script_debugger.cc
index 060a90e..a8ef40b 100644
--- a/src/cobalt/script/shared/stub_script_debugger.cc
+++ b/src/cobalt/script/shared/stub_script_debugger.cc
@@ -14,36 +14,36 @@
#include <memory>
-#include "cobalt/script/script_debugger.h"
-
#include "base/logging.h"
+#include "cobalt/script/global_environment.h"
+#include "cobalt/script/script_debugger.h"
+#include "cobalt/script/source_code.h"
namespace cobalt {
namespace script {
class StubScriptDebugger : public ScriptDebugger {
public:
- StubScriptDebugger(GlobalEnvironment* global_environment,
- Delegate* delegate) {
- NOTIMPLEMENTED();
- }
- ~StubScriptDebugger() override { NOTIMPLEMENTED(); }
+ StubScriptDebugger(GlobalEnvironment* global_environment, Delegate* delegate)
+ : global_environment_(global_environment), delegate_(delegate) {}
+ ~StubScriptDebugger() override {}
- void Attach(const std::string& state) override { NOTIMPLEMENTED(); }
- std::string Detach() override {
- NOTIMPLEMENTED();
- return std::string();
- }
+ void Attach(const std::string& state) override {}
+ std::string Detach() override { return std::string(); }
bool EvaluateDebuggerScript(const std::string& js_code,
std::string* out_result_utf8) override {
- return false;
+ // The stub just evaluates debugger scripts as if they are part of the page.
+ scoped_refptr<script::SourceCode> source_code =
+ script::SourceCode::CreateSourceCode(
+ js_code, base::SourceLocation("[object StubScriptDebugger]", 1, 1));
+ return global_environment_->EvaluateScript(source_code, out_result_utf8);
}
std::set<std::string> SupportedProtocolDomains() override {
- NOTIMPLEMENTED();
return std::set<std::string>();
}
+
bool DispatchProtocolMessage(const std::string& method,
const std::string& message) override {
NOTIMPLEMENTED();
@@ -70,9 +70,12 @@
PauseOnExceptionsState SetPauseOnExceptions(
PauseOnExceptionsState state) override {
- NOTIMPLEMENTED();
return kNone;
}
+
+ private:
+ GlobalEnvironment* global_environment_;
+ Delegate* delegate_;
};
// Static factory method declared in public interface.
diff --git a/src/cobalt/script/v8c/isolate_fellowship.cc b/src/cobalt/script/v8c/isolate_fellowship.cc
index b554b8a..9e402e9 100644
--- a/src/cobalt/script/v8c/isolate_fellowship.cc
+++ b/src/cobalt/script/v8c/isolate_fellowship.cc
@@ -39,6 +39,8 @@
// ScriptValue::*Reference do not currently
// support incremental tracing.
"--noincremental_marking_wrappers",
+ "--noexpose_wasm",
+ "--novalidate_asm",
#if defined(COBALT_GC_ZEAL)
"--gc_interval=1200"
#endif
diff --git a/src/cobalt/site/docs/development/setup-raspi.md b/src/cobalt/site/docs/development/setup-raspi.md
index 50faeb9..1c584e6 100644
--- a/src/cobalt/site/docs/development/setup-raspi.md
+++ b/src/cobalt/site/docs/development/setup-raspi.md
@@ -91,8 +91,8 @@
1. Run the following commands to build Cobalt:
```
- $ gyp_cobalt raspi-1
- $ ninja -C out/raspi-1_debug cobalt
+ $ gyp_cobalt raspi-2
+ $ ninja -C out/raspi-2_debug cobalt
```
1. Run the following command to install your Cobalt binary (and content)
@@ -100,7 +100,7 @@
```
rsync -avzh --exclude="obj*" \
- $COBALT_SRC/out/raspi-1_debug pi@$RASPI_ADDR:~/
+ $COBALT_SRC/out/raspi-2_debug pi@$RASPI_ADDR:~/
```
The `rsyncs` get somewhat faster after the first time, as `rsync` is good at
@@ -112,7 +112,7 @@
```
ssh pi@$RASPI_ADDR
- cd raspi-1_debug
+ cd raspi-2_debug
./cobalt
```
diff --git a/src/cobalt/speech/sandbox/sandbox.gyp b/src/cobalt/speech/sandbox/sandbox.gyp
index 1a19a35..03be453 100644
--- a/src/cobalt/speech/sandbox/sandbox.gyp
+++ b/src/cobalt/speech/sandbox/sandbox.gyp
@@ -30,6 +30,7 @@
'dependencies': [
'<(DEPTH)/cobalt/audio/audio.gyp:audio',
'<(DEPTH)/cobalt/base/base.gyp:base',
+ '<(DEPTH)/cobalt/debug/debug.gyp:console_command_manager',
'<(DEPTH)/cobalt/dom/dom.gyp:dom',
'<(DEPTH)/cobalt/loader/loader.gyp:loader',
'<(DEPTH)/cobalt/network/network.gyp:network',
diff --git a/src/cobalt/tools/automated_testing/cobalt_runner.py b/src/cobalt/tools/automated_testing/cobalt_runner.py
index 6d9ae62..d21b9d5 100644
--- a/src/cobalt/tools/automated_testing/cobalt_runner.py
+++ b/src/cobalt/tools/automated_testing/cobalt_runner.py
@@ -247,7 +247,8 @@
def _KillLauncher(self):
"""Kills the launcher and its attached Cobalt instance."""
- self.ExecuteJavaScript('window.close();')
+ if self.CanExecuteJavaScript():
+ self.ExecuteJavaScript('window.close();')
self.runner_thread.join(COBALT_EXIT_TIMEOUT_SECONDS)
if self.runner_thread.isAlive():
@@ -305,6 +306,9 @@
thread.interrupt_main()
return 0
+ def CanExecuteJavaScript(self):
+ return self.webdriver is not None
+
def ExecuteJavaScript(self, js_code):
return self.webdriver.execute_script(js_code)
diff --git a/src/cobalt/tools/collectd/README.md b/src/cobalt/tools/collectd/README.md
new file mode 100644
index 0000000..9148e19
--- /dev/null
+++ b/src/cobalt/tools/collectd/README.md
@@ -0,0 +1,67 @@
+### Collectd monitoring setup for Cobalt
+
+A python plugin that sends Cobalt CVals to [Collectd](https://collectd.org/)
+metrics collection daemon. The values are retrieved via WebSocket connection
+from Cobalt built-in Chrome DevTools protocol.
+
+
+
+Graphs are available from any Collectd frontend, configuration for
+[CGP](https://github.com/pommi/CGP) is included.
+
+**Note**: Currently the plugin only monitors one target, multi-target
+connection will be added soon.
+
+### Installation
+
+There is a small installation shell script `install.sh` included, that is
+tested to work on Raspberry Pi Raspbian Jessie and desktop Ubuntu. To
+install and configure, simply run `sudo ./install.sh` from the checkout
+directory.
+
+If you intend to run `collectd` and the CGP web frontend on a Linux
+target like Raspberry Pi, please first copy the plugin directory to a
+convenient location on the target and run the install script from its shell.
+
+Note that it is also possible to configure the plugin to connect from host to
+remote target like Pi, however this is useful if the rest of the `collectd`
+data streams are sent to a host in a [networked configuration](https://collectd.org/wiki/index.php/Networking_introduction)
+and not detailed here.
+
+Cobalt DevTools service currently does not listen on localhost or 127.0.0.1
+address, so you'll need to manually edit cobalt.conf with your local machine
+network adapter IP address, or to target IP address.
+
+**Note**: The script also enables RRD and CSV data outputs, RRD is required
+for CGP to display the data and CSV is useful for post-processing.
+
+After installation, CGP web dashboard will be available at
+http://localhost/CGP
+
+**Note**: Although `collectd` is a system daemon that always runs, the data
+from the Cobalt plugin on the web dashboard will not appear before any data
+is actually sampled. To do this quickly after the installation, start a
+Cobalt instance and restart the `collectd` daemon ( see below ), otherwise
+data sampling frequency gets automatically throttled by `collectd`.
+
+### Troubleshooting
+
+By default, `collectd` outputs log messages to `syslog`. If there is a
+configuration problem, restarting `collectd` daemon and checking syslog usually
+indicates the cause
+
+```
+ sudo service collectd restart
+ tail -n 100 /var/log/syslog | egrep collectd
+```
+
+Verifying that Cobalt DevTools is listening can be done by shell command
+
+```
+ netstat -an | egrep "^tcp .*LISTEN"
+```
+
+If the configured port ( 9222 by default ) is listening, the connection
+should work. To manually verify that the plugin can connect to WebSocket
+and retrieve data, simply run `python cobalt.py` if connecting to localhost
+or `python cobalt.py --host <IP> --port 9222` if connecting to a remote target.
diff --git a/src/cobalt/tools/collectd/cobalt-types.db b/src/cobalt/tools/collectd/cobalt-types.db
new file mode 100644
index 0000000..43cf2b8
--- /dev/null
+++ b/src/cobalt/tools/collectd/cobalt-types.db
@@ -0,0 +1,22 @@
+# Copyright 2019 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.
+
+lifetime value:DERIVE:0:U
+gauge_100 value:GAUGE:U:U
+gauge_10k value:GAUGE:U:U
+gauge_100k value:GAUGE:U:U
+gauge_1M value:GAUGE:U:U
+gauge_10M value:GAUGE:U:U
+gauge_100M value:GAUGE:U:U
+gauge_1G value:GAUGE:U:U
diff --git a/src/cobalt/tools/collectd/cobalt.py b/src/cobalt/tools/collectd/cobalt.py
new file mode 100644
index 0000000..dd38f9e
--- /dev/null
+++ b/src/cobalt/tools/collectd/cobalt.py
@@ -0,0 +1,175 @@
+# Copyright 2019 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.
+
+import json
+import time
+import argparse
+import random
+import websocket
+
+try:
+ import collectd
+except ImportError:
+ collectd = None
+
+conf_ = {'host': 'localhost', 'port': 9222}
+
+
+def config(conf):
+ print('config called {!r}'.format(conf))
+ conf_['collectd_conf'] = conf
+ collectd.info('config called {!r}'.format(conf))
+
+
+def reconnect():
+ ws = websocket.create_connection('ws://{}:{}'.format(conf_['host'],
+ conf_['port']))
+ ws.settimeout(3)
+ setattr(ws, 'message_id', 1)
+ conf_['ws'] = ws
+
+
+def init():
+ conf = conf_['collectd_conf']
+ for child in conf.children:
+ collectd.info('conf.child key {} values {}'.format(child.key, child.values))
+ if child.key.lower() == 'address':
+ host, port = child.values[0].split(':')
+ conf_['host'] = host
+ conf_['port'] = int(port)
+
+ reconnect()
+
+
+def wait_result(ws, result_id, timeout):
+ start_time = time.time()
+ messages = []
+ matching_result = None
+ while True:
+ now = time.time()
+ if now - start_time > timeout:
+ break
+ try:
+ message = ws.recv()
+ parsed_message = json.loads(message)
+ messages.append(parsed_message)
+ if 'result' in parsed_message and parsed_message['id'] == result_id:
+ matching_result = parsed_message
+ break
+ except:
+ break
+ return (matching_result, messages)
+
+
+def exec_js(ws, expr):
+ ws.message_id += 1
+ call_obj = {
+ 'id': ws.message_id,
+ 'method': 'Runtime.evaluate',
+ 'params': {
+ 'expression': expr,
+ 'returnByValue': True
+ }
+ }
+ ws.send(json.dumps(call_obj))
+ result, _ = wait_result(ws, ws.message_id, 10)
+ return result['result']['result']
+
+
+def report_value(plugin, type, instance, value, plugin_instance=None):
+ vl = collectd.Values(plugin=plugin, type=type, type_instance=instance)
+ if plugin_instance:
+ vl.plugin_instance = plugin_instance
+ vl.dispatch(values=[value])
+
+
+def report_cobalt_stat(key, collectd_type):
+ val = exec_js(conf_['ws'], 'h5vcc.cVal.getValue("' + key + '")')
+ try:
+ value = int(val['value'])
+ # collectd.warning('key {} value: {}'.format(key, value))
+ report_value('cobalt', collectd_type, key, value)
+ except TypeError:
+ collectd.warning('Failed to collect: {} {}'.format(key, val))
+
+
+# Tuple of a Cobalt Cval, and data type
+# Collectd frontends like CGP group values to graphs by the reported data type. The types here are
+# simple gauges grouped by their rough estimated orders of magnitude, so that all plots are still
+# somewhat discernible.
+tracked_stats = [('Cobalt.Lifetime', 'lifetime'),
+ ('Count.DOM.ActiveJavaScriptEvents', 'gauge'),
+ ('Count.DOM.Attrs', 'gauge_10k'),
+ ('Count.DOM.EventListeners', 'gauge_10k'),
+ ('Count.DOM.HtmlCollections', 'gauge_10k'),
+ ('Count.DOM.NodeLists', 'gauge_10k'),
+ ('Count.DOM.NodeMaps', 'gauge_10k'),
+ ('Count.DOM.Nodes', 'gauge_10k'),
+ ('Count.DOM.StringMaps', 'gauge_100'),
+ ('Count.DOM.TokenLists', 'gauge_10k'),
+ ('Count.MainWebModule.DOM.HtmlElement', 'gauge_10k'),
+ ('Count.MainWebModule.DOM.HtmlElement.Document', 'gauge_10k'),
+ ('Count.MainWebModule.DOM.HtmlScriptElement.Execute', 'gauge'),
+ ('Count.Renderer.Rasterize.NewRenderTree', 'gauge_100k'),
+ ('Count.XHR', 'gauge_100'), ('Memory.CPU.Free', 'gauge_1G'),
+ ('Memory.CPU.Used', 'gauge_100M'),
+ ('Memory.DebugConsoleWebModule.DOM.HtmlScriptElement.Execute',
+ 'gauge_100k'),
+ ('Memory.Font.LocalTypefaceCache.Capacity', 'gauge_10M'),
+ ('Memory.Font.LocalTypefaceCache.Size', 'gauge_10M'),
+ ('Memory.JS', 'gauge_10M'),
+ ('Memory.MainWebModule.DOM.HtmlScriptElement.Execute',
+ 'gauge_1M'), ('Memory.XHR', 'gauge_1M'),
+ ('Memory.MainWebModule.ImageCache.Size', 'gauge_10M'),
+ ('Renderer.SubmissionQueueSize', 'gauge')]
+
+
+def cobalt_read():
+ for name, type in tracked_stats:
+ report_cobalt_stat(name, type)
+
+
+def read(*args, **kwargs):
+ try:
+ cobalt_read()
+ except Exception:
+ reconnect()
+
+
+if collectd:
+ collectd.register_config(config)
+ collectd.register_init(init)
+ collectd.register_read(read)
+
+
+# Debugcode to verify plugin connection
+if __name__ == '__main__':
+ class Bunch:
+ def __init__(self, **kwds):
+ self.__dict__.update(kwds)
+ def debugprint(*args,**kwargs):
+ print('{!r} {!r}'.format(args,kwargs))
+ def debugvalues(**kwargs):
+ debugprint(**kwargs)
+ return Bunch(dispatch=debugprint,**kwargs)
+ collectd = Bunch(info=debugprint,warning=debugprint,Values=debugvalues)
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--host', default='localhost')
+ parser.add_argument('--port', type=int, default=9222)
+ args = parser.parse_args()
+ conf = Bunch(children=[Bunch( key='address',
+ values=['{}:{}'.format(args.host,args.port)])])
+ conf_['collectd_conf'] = conf
+ init()
+ cobalt_read()
diff --git a/src/cobalt/tools/collectd/conf/CGP_conf.patch b/src/cobalt/tools/collectd/conf/CGP_conf.patch
new file mode 100644
index 0000000..75711a6
--- /dev/null
+++ b/src/cobalt/tools/collectd/conf/CGP_conf.patch
@@ -0,0 +1,28 @@
+--- /var/www/html/CGP/conf/config.php 2019-08-07 09:02:26.935953434 -0700
++++ conf/config.php 2019-08-07 08:41:05.058259144 -0700
+@@ -29,7 +29,7 @@
+ #$CONFIG['overview_filter']['interface'] = array('ti' => 'eth0', 't' => 'if_octets');
+
+ # default plugins time range
+-$CONFIG['time_range']['default'] = 86400;
++$CONFIG['time_range']['default'] = 3600 * 2;
+ $CONFIG['time_range']['uptime'] = 31536000;
+
+ # show load averages and used memory on overview page
+@@ -38,6 +38,7 @@
+ $CONFIG['showtime'] = false;
+
+ $CONFIG['term'] = array(
++ '30minute'=> 60 * 30,
+ '2hour' => 3600 * 2,
+ '8hour' => 3600 * 8,
+ 'day' => 86400,
+@@ -51,7 +52,7 @@
+ $CONFIG['network_datasize'] = 'bytes';
+
+ # "png", "svg", "canvas" or "hybrid" (canvas on detail page, png on the others) graphs
+-$CONFIG['graph_type'] = 'png';
++$CONFIG['graph_type'] = 'hybrid';
+
+ # For canvas graphs, use 'async' or 'sync' fetch method
+ $CONFIG['rrd_fetch_method'] = 'sync';
diff --git a/src/cobalt/tools/collectd/conf/cobalt.conf.tmpl b/src/cobalt/tools/collectd/conf/cobalt.conf.tmpl
new file mode 100644
index 0000000..96f0a2b
--- /dev/null
+++ b/src/cobalt/tools/collectd/conf/cobalt.conf.tmpl
@@ -0,0 +1,34 @@
+# Copyright 2019 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.
+
+<LoadPlugin python>
+ Globals true
+ Interval 10
+</LoadPlugin>
+
+TypesDB "##PLUGIN_DIR##/cobalt-types.db"
+
+<Plugin python>
+ ModulePath "##PLUGIN_DIR##"
+ LogTraces true
+ Import "cobalt"
+ <Module cobalt>
+ Address "localhost:9222"
+ </Module>
+</Plugin>
+
+# Tell processes plugin to look for processes named "cobalt"
+<Plugin "processes">
+ ProcessMatch "cobalt" "cobalt"
+</Plugin>
diff --git a/src/cobalt/tools/collectd/conf/csv.conf b/src/cobalt/tools/collectd/conf/csv.conf
new file mode 100644
index 0000000..f663285
--- /dev/null
+++ b/src/cobalt/tools/collectd/conf/csv.conf
@@ -0,0 +1,22 @@
+# Copyright 2019 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.
+
+<LoadPlugin csv>
+ Interval 30
+</LoadPlugin>
+
+<Plugin "csv">
+ DataDir "/var/lib/collectd/csv"
+ StoreRates true
+</Plugin>
diff --git a/src/cobalt/tools/collectd/conf/rrd.conf b/src/cobalt/tools/collectd/conf/rrd.conf
new file mode 100644
index 0000000..2f96f34
--- /dev/null
+++ b/src/cobalt/tools/collectd/conf/rrd.conf
@@ -0,0 +1,21 @@
+# Copyright 2019 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.
+
+<LoadPlugin rrdtool>
+ Interval 10
+</LoadPlugin>
+
+<Plugin rrdtool>
+ DataDir "/var/lib/collectd/rrd"
+</Plugin>
diff --git a/src/cobalt/tools/collectd/conf/standard_types.conf b/src/cobalt/tools/collectd/conf/standard_types.conf
new file mode 100644
index 0000000..c95cf60
--- /dev/null
+++ b/src/cobalt/tools/collectd/conf/standard_types.conf
@@ -0,0 +1,15 @@
+# Copyright 2019 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.
+
+TypesDB "/usr/share/collectd/types.db"
diff --git a/src/cobalt/tools/collectd/doc/Collectd_crop.png b/src/cobalt/tools/collectd/doc/Collectd_crop.png
new file mode 100644
index 0000000..0161b11
--- /dev/null
+++ b/src/cobalt/tools/collectd/doc/Collectd_crop.png
Binary files differ
diff --git a/src/cobalt/tools/collectd/install.sh b/src/cobalt/tools/collectd/install.sh
new file mode 100755
index 0000000..d2ef017
--- /dev/null
+++ b/src/cobalt/tools/collectd/install.sh
@@ -0,0 +1,69 @@
+#!/bin/bash
+#
+# Copyright 2019 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.
+
+if [[ ${EUID} -ne 0 ]]; then
+ echo "This script must be run as root"
+ exit 1
+fi
+
+function print_msg() {
+ echo '============= ' ${@} ' ============='
+}
+
+WEBROOT=/var/www/html
+CGP_ROOT=${WEBROOT}/CGP
+
+COLLECTD_CONF_DIR=/etc/collectd/collectd.conf.d
+RRD_ENABLED=1
+if [[ -d "/etc/collectd/google.conf.d" ]]; then
+ COLLECTD_CONF_DIR=/etc/collectd/google.conf.d
+ RRD_ENABLED=0
+fi
+
+
+print_msg "Installing apt deps"
+PKGS="collectd-core lighttpd libphp-jpgraph python-websocket"
+[[ ! -f /etc/collectd/collectd.conf ]] && PKGS="${PKGS} collectd"
+apt install ${PKGS}
+# grab the installed php version
+CGI_PKG=$(dpkg -l "*php*" | egrep -i "ii.*php.*-cli" | sed -E 's/.*(php.*-)(cli).*/\1cgi/')
+apt install ${CGI_PKG}
+
+
+print_msg "Checking out CGP from Github to: " ${CGP_ROOT}
+[[ ! -d "${CGP_ROOT}" ]] && git -C ${WEBROOT} clone https://github.com/pommi/CGP.git
+
+
+print_msg "Copying config files"
+sed 's@##PLUGIN_DIR##@'"${PWD}"'@' < conf/cobalt.conf.tmpl > /tmp/cobalt.conf
+cp -v /tmp/cobalt.conf ${COLLECTD_CONF_DIR}/cobalt.conf
+
+[[ "${RRD_ENABLED}" -eq "0" ]] && cp -v conf/rrd.conf ${COLLECTD_CONF_DIR}/
+cp -v conf/csv.conf ${COLLECTD_CONF_DIR}/
+# Change graph display defaults in CGP config
+patch --forward -r - ${CGP_ROOT}/conf/config.php < conf/CGP_conf.patch
+[[ "${RRD_ENABLED}" -eq "1" ]] && cp -v conf/standard_types.conf ${COLLECTD_CONF_DIR}/
+
+
+print_msg "Restarting services"
+lighty-enable-mod fastcgi fastcgi-php
+service collectd restart
+service lighttpd restart
+
+print_msg "Cobalt DevTools do not currently listen on 'localhost' or 127.0.0.1"
+print_msg "Please manually edit target IP address to your adapter IP address in " ${COLLECTD_CONF_DIR}/cobalt.conf
+ifconfig | egrep "inet " | sed -E "s/.*inet (.*) netmask.*/\1/" | egrep -v "127.0.0.1"
+
diff --git a/src/cobalt/websocket/cobalt_web_socket_event_handler.cc b/src/cobalt/websocket/cobalt_web_socket_event_handler.cc
index b389576..9654695 100644
--- a/src/cobalt/websocket/cobalt_web_socket_event_handler.cc
+++ b/src/cobalt/websocket/cobalt_web_socket_event_handler.cc
@@ -110,7 +110,7 @@
std::unique_ptr<net::WebSocketEventInterface::SSLErrorCallbacks>
ssl_error_callbacks,
const GURL& /*url*/, const net::SSLInfo& /*ssl_info*/, bool /*fatal*/) {
- // TODO[johnx]: determine if there are circumstances we want to continue
+ // TODO: determine if there are circumstances we want to continue
// the request.
DLOG(WARNING) << "SSL cert failure occured, cancelling connection";
ssl_error_callbacks->CancelSSLRequest(net::ERR_BAD_SSL_CLIENT_AUTH_CERT,
diff --git a/src/cobalt/websocket/web_socket_event_interface.cc b/src/cobalt/websocket/web_socket_event_interface.cc
index a323111..f47ad29 100644
--- a/src/cobalt/websocket/web_socket_event_interface.cc
+++ b/src/cobalt/websocket/web_socket_event_interface.cc
@@ -106,7 +106,7 @@
void CobaltWebSocketEventHandler::OnSSLCertificateError(
std::unique_ptr<net::SSLErrorCallbacks> ssl_error_callbacks,
const GURL& /*url*/, const SSLInfo& ssl_info, bool /*fatal*/) {
- // TODO[johnx]: determine if there are circumstances we want to continue
+ // TODO: determine if there are circumstances we want to continue
// the request.
DLOG(WARNING) << "SSL cert failure occured, cancelling connection";
ssl_error_callbacks->CancelSSLRequest(-1, ssl_info);
diff --git a/src/cobalt/websocket/web_socket_impl.cc b/src/cobalt/websocket/web_socket_impl.cc
index 39df930..5a920b4 100644
--- a/src/cobalt/websocket/web_socket_impl.cc
+++ b/src/cobalt/websocket/web_socket_impl.cc
@@ -212,7 +212,7 @@
delegate_task_runner_->PostTask(FROM_HERE, do_send_closure);
}
- // TODO[johnx]:Change to void function?
+ // TODO: Change to void function?
return true;
}
diff --git a/src/cobalt/websocket/web_socket_impl.h b/src/cobalt/websocket/web_socket_impl.h
index 2786092..2a81b41 100644
--- a/src/cobalt/websocket/web_socket_impl.h
+++ b/src/cobalt/websocket/web_socket_impl.h
@@ -72,7 +72,7 @@
void Close(const net::WebSocketError code, const std::string& reason);
// These are legacy API from old net::SocketStream::Delegate.
- // TODO[johnx]: investigate if we need to remove these.
+ // TODO: investigate if we need to remove these.
// Called when the socket stream has been closed.
void OnClose(bool was_clean = true,
int error_code = net::kWebSocketNormalClosure,
diff --git a/src/net/cert/caching_cert_verifier.h b/src/net/cert/caching_cert_verifier.h
index 2ccc5cb..aacec7e 100644
--- a/src/net/cert/caching_cert_verifier.h
+++ b/src/net/cert/caching_cert_verifier.h
@@ -50,6 +50,14 @@
const NetLogWithSource& net_log) override;
void SetConfig(const Config& config) override;
+#if defined(STARBOARD) && defined(ENABLE_IGNORE_CERTIFICATE_ERRORS)
+ // Used to disable certificate verification errors for testing/development
+ // purpose.
+ void set_ignore_certificate_errors(bool ignore_certificate_errors) override {
+ verifier_->set_ignore_certificate_errors(ignore_certificate_errors);
+ }
+#endif
+
private:
FRIEND_TEST_ALL_PREFIXES(CachingCertVerifierTest, CacheHit);
FRIEND_TEST_ALL_PREFIXES(CachingCertVerifierTest, Visitor);
diff --git a/src/net/cert/cert_verifier.h b/src/net/cert/cert_verifier.h
index 7a637bf..df852b1 100644
--- a/src/net/cert/cert_verifier.h
+++ b/src/net/cert/cert_verifier.h
@@ -181,6 +181,14 @@
// the preferred underlying cryptographic libraries, using the specified
// configuration.
static std::unique_ptr<CertVerifier> CreateDefault();
+
+#if defined(STARBOARD) && defined(ENABLE_IGNORE_CERTIFICATE_ERRORS)
+ // Used to disable certificate verification errors for testing/development
+ // purpose.
+ virtual void set_ignore_certificate_errors(bool ignore_certificate_errors) {
+ NOTREACHED();
+ }
+#endif
};
// Overloads for comparing two configurations. Note, comparison is shallow -
diff --git a/src/net/cert/multi_threaded_cert_verifier.cc b/src/net/cert/multi_threaded_cert_verifier.cc
index 261c1a3..a513f01 100644
--- a/src/net/cert/multi_threaded_cert_verifier.cc
+++ b/src/net/cert/multi_threaded_cert_verifier.cc
@@ -235,7 +235,9 @@
void set_is_first_job(bool is_first_job) { is_first_job_ = is_first_job; }
#if defined(STARBOARD) && defined(ENABLE_IGNORE_CERTIFICATE_ERRORS)
- void set_ignore_errors(bool ignore_errors) { ignore_errors_ = ignore_errors; }
+ void set_ignore_certificate_errors(bool ignore_certificate_errors) {
+ ignore_certificate_errors_ = ignore_certificate_errors;
+ }
#endif
const CertVerifier::RequestParams& key() const { return key_; }
@@ -321,7 +323,7 @@
cert_verifier_->RemoveJob(this);
#if defined(STARBOARD) && defined(ENABLE_IGNORE_CERTIFICATE_ERRORS)
- if (ignore_errors_) {
+ if (ignore_certificate_errors_) {
verify_result->result.verified_cert = key_.certificate();
verify_result->result.cert_status = MapNetErrorToCertStatus(OK);
verify_result->error = OK;
@@ -358,7 +360,7 @@
bool is_first_job_;
#if defined(STARBOARD) && defined(ENABLE_IGNORE_CERTIFICATE_ERRORS)
- bool ignore_errors_ = false;
+ bool ignore_certificate_errors_ = false;
#endif
base::WeakPtrFactory<CertVerifierJob> weak_ptr_factory_;
};
@@ -407,7 +409,7 @@
std::unique_ptr<CertVerifierJob> new_job =
std::make_unique<CertVerifierJob>(params, net_log.net_log(), this);
#if defined(STARBOARD) && defined(ENABLE_IGNORE_CERTIFICATE_ERRORS)
- new_job->set_ignore_errors(ignore_errors_);
+ new_job->set_ignore_certificate_errors(ignore_certificate_errors_);
#endif
new_job->Start(verify_proc_, config_, config_id_);
diff --git a/src/net/cert/multi_threaded_cert_verifier.h b/src/net/cert/multi_threaded_cert_verifier.h
index a5cd9dd..b8c6cd0 100644
--- a/src/net/cert/multi_threaded_cert_verifier.h
+++ b/src/net/cert/multi_threaded_cert_verifier.h
@@ -68,7 +68,9 @@
#if defined(STARBOARD) && defined(ENABLE_IGNORE_CERTIFICATE_ERRORS)
// Used to disable certificate verification errors for testing/developerment
// purpose.
- void set_ignore_errors(bool ignore_errors) { ignore_errors_ = ignore_errors; }
+ void set_ignore_certificate_errors(bool ignore_certificate_errors) {
+ ignore_certificate_errors_ = ignore_certificate_errors;
+ }
#endif
private:
@@ -131,7 +133,7 @@
bool should_record_histograms_ = true;
#if defined(STARBOARD) && defined(ENABLE_IGNORE_CERTIFICATE_ERRORS)
- bool ignore_errors_ = false;
+ bool ignore_certificate_errors_ = false;
#endif
THREAD_CHECKER(thread_checker_);
diff --git a/src/net/http/http_network_session.cc b/src/net/http/http_network_session.cc
index e1ff8c6..0415c27 100644
--- a/src/net/http/http_network_session.cc
+++ b/src/net/http/http_network_session.cc
@@ -274,7 +274,6 @@
http_stream_factory_(std::make_unique<HttpStreamFactory>(this)),
params_(params),
context_(context) {
-
DCHECK(proxy_resolution_service_);
DCHECK(ssl_config_service_);
CHECK(http_server_properties_);
@@ -555,6 +554,12 @@
params_.enable_quic = false;
}
+#if defined(STARBOARD)
+void HttpNetworkSession::ToggleQuic() {
+ params_.enable_quic = !params_.enable_quic;
+}
+#endif // defined(STARBOARD)
+
ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager(
SocketPoolType pool_type) {
switch (pool_type) {
diff --git a/src/net/http/http_network_session.h b/src/net/http/http_network_session.h
index 7c72310..ded46f4 100644
--- a/src/net/http/http_network_session.h
+++ b/src/net/http/http_network_session.h
@@ -400,6 +400,11 @@
// Disable QUIC for new streams.
void DisableQuic();
+#if defined(STARBOARD)
+ // Toggle QUIC support for new streams.
+ void ToggleQuic();
+#endif // defined(STARBOARD)
+
private:
friend class HttpNetworkSessionPeer;
diff --git a/src/net/log/net_log_with_source.cc b/src/net/log/net_log_with_source.cc
index 50020e5..a4ad7e1 100644
--- a/src/net/log/net_log_with_source.cc
+++ b/src/net/log/net_log_with_source.cc
@@ -94,7 +94,6 @@
void NetLogWithSource::AddEventWithNetErrorCode(NetLogEventType event_type,
int net_error) const {
- DCHECK_NE(ERR_IO_PENDING, net_error);
if (net_error >= 0) {
AddEvent(event_type);
} else {
diff --git a/src/net/socket/udp_socket_starboard.cc b/src/net/socket/udp_socket_starboard.cc
index d63b047..707fb74 100644
--- a/src/net/socket/udp_socket_starboard.cc
+++ b/src/net/socket/udp_socket_starboard.cc
@@ -163,6 +163,12 @@
&read_socket_watcher_, &read_watcher_)) {
PLOG(ERROR) << "WatchSocket failed on read";
Error result = MapLastSocketError(socket_);
+ if (result == ERR_IO_PENDING) {
+ // Watch(...) might call SbSocketWaiterAdd() which does not guarantee
+ // setting system error on failure, but we need to treat this as an
+ // error since watching the socket failed.
+ result = ERR_FAILED;
+ }
LogRead(result, NULL, NULL);
return result;
}
@@ -801,7 +807,9 @@
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(SbSocketIsValid(socket_));
- NOTIMPLEMENTED();
+ // Starboard does not supported sending non-fragmented packets yet.
+ // All QUIC Streams call this function at initialization, setting sockets to
+ // send non-fragmented packets may have a slight performance boost.
return ERR_NOT_IMPLEMENTED;
}
diff --git a/src/net/spdy/spdy_proxy_client_socket_unittest.cc b/src/net/spdy/spdy_proxy_client_socket_unittest.cc
index 3b7a5b1..8952ca8 100644
--- a/src/net/spdy/spdy_proxy_client_socket_unittest.cc
+++ b/src/net/spdy/spdy_proxy_client_socket_unittest.cc
@@ -880,7 +880,11 @@
AssertSyncReadEquals(kMsg2, kLen2);
}
+#if defined(STARBOARD)
+TEST_P(SpdyProxyClientSocketTest, FLAKY_ReadErrorResponseBody) {
+#else
TEST_P(SpdyProxyClientSocketTest, ReadErrorResponseBody) {
+#endif
spdy::SpdySerializedFrame conn(ConstructConnectRequestFrame());
MockWrite writes[] = {
CreateMockWrite(conn, 0, SYNCHRONOUS),
diff --git a/src/starboard/CHANGELOG.md b/src/starboard/CHANGELOG.md
index b9bb48b..b4e9fe3 100644
--- a/src/starboard/CHANGELOG.md
+++ b/src/starboard/CHANGELOG.md
@@ -82,7 +82,10 @@
The system properties `kSbSystemPropertyCertificationScope` and
`kSbSystemPropertyBase64EncodedCertificationSecret` have been added to enable
client apps to perform device authentication. The values will be queried by
-calls to `SbSystemGetProperty()` in `starboard/system.h`.
+calls to `SbSystemGetProperty()` in `starboard/system.h`. An alternative to
+providing the `kSbSystemPropertyBase64EncodedCertificationSecret` property is
+to implement the SbSystemSignWithCertificationSecretKey() function, enabling
+the key to remain private and secure.
### Add support for `SbThreadSampler` and `SbThreadContext`.
@@ -153,6 +156,14 @@
CPU features are available, which can enable the application to perform certain
CPU-specific optimizations (e.g. SIMD).
+### Deprecated SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER and
+SB_HAS_DRM_KEY_STATUSES.
+
+These macros must always be set to 1 for Starboard version 6 or later. They will
+be removed in a future version. Any implementation that supports Starboard
+version 6 or later should be modified to no longer depend on these macros, with
+the assumption that their values are always 1.
+
## Version 10
@@ -622,3 +633,9 @@
### Mark `SbSystemBreakIntoDebugger` `SB_NORETURN`.
Add `SB_NORETURN` to declaration of `SbSystemBreakIntoDebugger`, to allow it to
be used in a manner similar to `abort`.
+
+### Introduce `SbAudioSinkGetMinBufferSizeInFrames()`
+
+Introduce `SbAudioSinkGetMinBufferSizeInFrames()` to `starboard/audio_sink.h`
+which communicates to the platform how many audio frames are required to ensure
+that audio sink can keep playing without underflow.
diff --git a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioOutputManager.java b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioOutputManager.java
index 0a72bc8..2105e5b 100644
--- a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioOutputManager.java
+++ b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioOutputManager.java
@@ -46,9 +46,9 @@
@SuppressWarnings("unused")
@UsedByNative
AudioTrackBridge createAudioTrackBridge(
- int sampleType, int sampleRate, int channelCount, int framesPerChannel) {
+ int sampleType, int sampleRate, int channelCount, int preferredBufferSizeInBytes) {
AudioTrackBridge audioTrackBridge =
- new AudioTrackBridge(sampleType, sampleRate, channelCount, framesPerChannel);
+ new AudioTrackBridge(sampleType, sampleRate, channelCount, preferredBufferSizeInBytes);
if (!audioTrackBridge.isAudioTrackValid()) {
Log.e(TAG, "AudioTrackBridge has invalid audio track");
return null;
diff --git a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java
index 733cf2b..ec1fd88 100644
--- a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java
+++ b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java
@@ -16,6 +16,7 @@
import static dev.cobalt.media.Log.TAG;
+import android.annotation.TargetApi;
import android.media.AudioAttributes;
import android.media.AudioFormat;
import android.media.AudioManager;
@@ -35,24 +36,8 @@
private AudioTimestamp audioTimestamp = new AudioTimestamp();
private long maxFramePositionSoFar = 0;
- private int GetFrameSize(int sampleType, int channelCount) {
- switch (sampleType) {
- case AudioFormat.ENCODING_PCM_16BIT:
- {
- return 2 * channelCount;
- }
- case AudioFormat.ENCODING_PCM_FLOAT:
- {
- return 4 * channelCount;
- }
- default:
- {
- throw new RuntimeException("Unsupported sample type: " + sampleType);
- }
- }
- }
-
- public AudioTrackBridge(int sampleType, int sampleRate, int channelCount, int framesPerChannel) {
+ public AudioTrackBridge(
+ int sampleType, int sampleRate, int channelCount, int preferredBufferSizeInBytes) {
int channelConfig;
switch (channelCount) {
case 1:
@@ -80,33 +65,16 @@
.setChannelMask(channelConfig)
.build();
- // Try to create AudioTrack with the same size buffer as in renderer. But AudioTrack would not
- // start playing until the buffer is fully filled once. A large buffer may cause
- // AudioTrack not able to start. And we now pass no more than 1s of audio data to
- // starboard player, limit the buffer size to store at most 0.5s of audio data.
- int audioTrackBufferSize =
- Math.min(framesPerChannel, sampleRate / 2) * GetFrameSize(sampleType, channelCount);
+ int audioTrackBufferSize = preferredBufferSizeInBytes;
while (audioTrackBufferSize > 0) {
try {
- if (Build.VERSION.SDK_INT >= 26) {
- audioTrack =
- new AudioTrack.Builder()
- .setAudioAttributes(attributes)
- .setAudioFormat(format)
- .setBufferSizeInBytes(audioTrackBufferSize)
- .setTransferMode(AudioTrack.MODE_STREAM)
- .setSessionId(AudioManager.AUDIO_SESSION_ID_GENERATE)
- .setPerformanceMode(AudioTrack.PERFORMANCE_MODE_LOW_LATENCY)
- .build();
- } else {
- audioTrack =
- new AudioTrack(
- attributes,
- format,
- audioTrackBufferSize,
- AudioTrack.MODE_STREAM,
- AudioManager.AUDIO_SESSION_ID_GENERATE);
- }
+ audioTrack =
+ new AudioTrack(
+ attributes,
+ format,
+ audioTrackBufferSize,
+ AudioTrack.MODE_STREAM,
+ AudioManager.AUDIO_SESSION_ID_GENERATE);
} catch (Exception e) {
audioTrack = null;
}
@@ -120,8 +88,10 @@
Log.i(
TAG,
String.format(
- "AudioTrack created with buffer size %d. The minimum buffer size is %d.",
+ "AudioTrack created with buffer size %d (prefered: %d). The minimum buffer size is"
+ + " %d.",
audioTrackBufferSize,
+ preferredBufferSizeInBytes,
AudioTrack.getMinBufferSize(sampleRate, channelConfig, sampleType)));
}
@@ -232,4 +202,23 @@
return audioTimestamp;
}
+
+ @SuppressWarnings("unused")
+ @UsedByNative
+ private int getUnderrunCount() {
+ if (Build.VERSION.SDK_INT >= 24) {
+ return getUnderrunCountV24();
+ }
+ // The funtion getUnderrunCount() is added in API level 24.
+ return 0;
+ }
+
+ @TargetApi(24)
+ private int getUnderrunCountV24() {
+ if (audioTrack == null) {
+ Log.e(TAG, "Unable to call getUnderrunCount() with NULL audio track.");
+ return 0;
+ }
+ return audioTrack.getUnderrunCount();
+ }
}
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 8ca2a31..a0e687b 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
@@ -24,12 +24,12 @@
import android.media.AudioAttributes.Builder;
import android.media.AudioFocusRequest;
import android.media.AudioManager;
-import android.media.MediaMetadata;
-import android.media.session.MediaSession;
-import android.media.session.PlaybackState;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
+import android.support.v4.media.MediaMetadataCompat;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.support.v4.media.session.PlaybackStateCompat;
import android.view.WindowManager;
import dev.cobalt.util.DisplayUtil;
import dev.cobalt.util.Holder;
@@ -47,7 +47,7 @@
// deprecated and unnecessary on API 26+.
@SuppressWarnings("deprecation")
private static final int MEDIA_SESSION_FLAG_HANDLES_TRANSPORT_CONTROLS =
- MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS;
+ MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS;
private AudioFocusRequest audioFocusRequest;
@@ -69,15 +69,15 @@
private final UpdateVolumeListener volumeListener;
private final ArtworkLoader artworkLoader;
- private MediaSession mediaSession;
+ private MediaSessionCompat mediaSession;
// We re-use the builder to hold onto the most recent metadata and add artwork later.
- private MediaMetadata.Builder metadataBuilder = new MediaMetadata.Builder();
+ private MediaMetadataCompat.Builder metadataBuilder = new MediaMetadataCompat.Builder();
// We re-use the builder to hold onto the most recent playback state.
- private PlaybackState.Builder playbackStateBuilder = new PlaybackState.Builder();
+ private PlaybackStateCompat.Builder playbackStateBuilder = new PlaybackStateCompat.Builder();
// Duplicated in starboard/android/shared/android_media_session_client.h
- // PlaybackState
+ // PlaybackStateCompat
private static final int PLAYBACK_STATE_PLAYING = 0;
private static final int PLAYBACK_STATE_PAUSED = 1;
private static final int PLAYBACK_STATE_NONE = 2;
@@ -99,50 +99,56 @@
}
private void setMediaSession() {
- mediaSession = new MediaSession(context, TAG);
+ mediaSession = new MediaSessionCompat(context, TAG);
mediaSession.setFlags(MEDIA_SESSION_FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSession.setCallback(
- new MediaSession.Callback() {
+ new MediaSessionCompat.Callback() {
@Override
public void onFastForward() {
Log.i(TAG, "MediaSession action: FAST FORWARD");
- nativeInvokeAction(PlaybackState.ACTION_FAST_FORWARD);
+ nativeInvokeAction(PlaybackStateCompat.ACTION_FAST_FORWARD);
}
@Override
public void onPause() {
Log.i(TAG, "MediaSession action: PAUSE");
- nativeInvokeAction(PlaybackState.ACTION_PAUSE);
+ nativeInvokeAction(PlaybackStateCompat.ACTION_PAUSE);
}
@Override
public void onPlay() {
Log.i(TAG, "MediaSession action: PLAY");
- nativeInvokeAction(PlaybackState.ACTION_PLAY);
+ nativeInvokeAction(PlaybackStateCompat.ACTION_PLAY);
}
@Override
public void onRewind() {
Log.i(TAG, "MediaSession action: REWIND");
- nativeInvokeAction(PlaybackState.ACTION_REWIND);
+ nativeInvokeAction(PlaybackStateCompat.ACTION_REWIND);
}
@Override
public void onSkipToNext() {
Log.i(TAG, "MediaSession action: SKIP NEXT");
- nativeInvokeAction(PlaybackState.ACTION_SKIP_TO_NEXT);
+ nativeInvokeAction(PlaybackStateCompat.ACTION_SKIP_TO_NEXT);
}
@Override
public void onSkipToPrevious() {
Log.i(TAG, "MediaSession action: SKIP PREVIOUS");
- nativeInvokeAction(PlaybackState.ACTION_SKIP_TO_PREVIOUS);
+ nativeInvokeAction(PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS);
}
@Override
public void onSeekTo(long pos) {
Log.i(TAG, "MediaSession action: SEEK " + pos);
- nativeInvokeAction(PlaybackState.ACTION_SEEK_TO, pos);
+ nativeInvokeAction(PlaybackStateCompat.ACTION_SEEK_TO, pos);
+ }
+
+ @Override
+ public void onStop() {
+ Log.i(TAG, "MediaSession action: STOP");
+ nativeInvokeAction(PlaybackStateCompat.ACTION_STOP);
}
});
// |metadataBuilder| may still have no fields at this point, yielding empty metadata.
@@ -209,7 +215,7 @@
// This shouldn't happen, but pause playback to be nice if it does.
if (res != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.w(TAG, "Audiofocus action: PAUSE (not granted)");
- nativeInvokeAction(PlaybackState.ACTION_PAUSE);
+ nativeInvokeAction(PlaybackStateCompat.ACTION_PAUSE);
}
} else {
if (Build.VERSION.SDK_INT < 26) {
@@ -264,7 +270,7 @@
Log.i(TAG, "Audiofocus loss" + logExtra);
if (playbackState == PLAYBACK_STATE_PLAYING) {
Log.i(TAG, "Audiofocus action: PAUSE");
- nativeInvokeAction(PlaybackState.ACTION_PAUSE);
+ nativeInvokeAction(PlaybackStateCompat.ACTION_PAUSE);
}
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
@@ -281,7 +287,7 @@
volumeListener.onUpdateVolume(1.0f);
if (transientPause && playbackState == PLAYBACK_STATE_PAUSED) {
Log.i(TAG, "Audiofocus action: PLAY");
- nativeInvokeAction(PlaybackState.ACTION_PLAY);
+ nativeInvokeAction(PlaybackStateCompat.ACTION_PLAY);
}
break;
default: // fall out
@@ -334,7 +340,7 @@
// be none the wiser.
playbackStateBuilder.setState(
playbackState,
- PlaybackState.PLAYBACK_POSITION_UNKNOWN,
+ PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN,
playbackState == PLAYBACK_STATE_PLAYING ? 1.0f : 0.0f);
configureMediaFocus(PLAYBACK_STATE_NONE);
}
@@ -359,8 +365,7 @@
@Override
public void run() {
updateMediaSessionInternal(
- playbackState, actions, positionMs, speed,
- title, artist, album, artwork);
+ playbackState, actions, positionMs, speed, title, artist, album, artwork);
}
});
}
@@ -398,43 +403,46 @@
String stateName;
switch (playbackState) {
case PLAYBACK_STATE_PLAYING:
- androidPlaybackState = PlaybackState.STATE_PLAYING;
+ androidPlaybackState = PlaybackStateCompat.STATE_PLAYING;
stateName = "PLAYING";
break;
case PLAYBACK_STATE_PAUSED:
- androidPlaybackState = PlaybackState.STATE_PAUSED;
+ androidPlaybackState = PlaybackStateCompat.STATE_PAUSED;
stateName = "PAUSED";
break;
case PLAYBACK_STATE_NONE:
default:
- androidPlaybackState = PlaybackState.STATE_NONE;
+ androidPlaybackState = PlaybackStateCompat.STATE_NONE;
stateName = "NONE";
break;
}
- Log.i(TAG, String.format(
- "MediaSession state: %s, position: %d ms, speed: %f x", stateName, positionMs, speed));
+ Log.i(
+ TAG,
+ String.format(
+ "MediaSession state: %s, position: %d ms, speed: %f x", stateName, positionMs, speed));
playbackStateBuilder =
- new PlaybackState.Builder()
+ new PlaybackStateCompat.Builder()
.setActions(actions)
.setState(androidPlaybackState, positionMs, speed);
mediaSession.setPlaybackState(playbackStateBuilder.build());
// Reset the metadata to make sure we don't retain any fields from previous playback.
- metadataBuilder = new MediaMetadata.Builder();
+ metadataBuilder = new MediaMetadataCompat.Builder();
metadataBuilder
- .putString(MediaMetadata.METADATA_KEY_TITLE, title)
- .putString(MediaMetadata.METADATA_KEY_ARTIST, artist)
- .putString(MediaMetadata.METADATA_KEY_ALBUM, album)
- .putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, artworkLoader.getOrLoadArtwork(artwork));
+ .putString(MediaMetadataCompat.METADATA_KEY_TITLE, title)
+ .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist)
+ .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, album)
+ .putBitmap(
+ MediaMetadataCompat.METADATA_KEY_ALBUM_ART, artworkLoader.getOrLoadArtwork(artwork));
// Update the metadata as soon as we can - even before artwork is loaded.
mediaSession.setMetadata(metadataBuilder.build());
}
@Override
public void onArtworkLoaded(Bitmap bitmap) {
- metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, bitmap);
+ metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bitmap);
mediaSession.setMetadata(metadataBuilder.build());
}
}
diff --git a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
index 3be35ef..63d27d8 100644
--- a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
+++ b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
@@ -499,7 +499,10 @@
Log.d(TAG, "Setting HDR info.");
mediaFormat.setInteger(MediaFormat.KEY_COLOR_TRANSFER, colorInfo.colorTransfer);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_STANDARD, colorInfo.colorStandard);
- mediaFormat.setInteger(MediaFormat.KEY_COLOR_RANGE, colorInfo.colorRange);
+ // If color range is unspecified, don't set it.
+ if (colorInfo.colorRange != 0) {
+ mediaFormat.setInteger(MediaFormat.KEY_COLOR_RANGE, colorInfo.colorRange);
+ }
mediaFormat.setByteBuffer(MediaFormat.KEY_HDR_STATIC_INFO, colorInfo.hdrStaticInfo);
}
@@ -548,28 +551,6 @@
@SuppressWarnings("unused")
@UsedByNative
- private void dequeueInputBuffer(long timeoutUs, DequeueInputResult outDequeueInputResult) {
- int status = MEDIA_CODEC_ERROR;
- int index = -1;
- try {
- int indexOrStatus = mMediaCodec.dequeueInputBuffer(timeoutUs);
- if (indexOrStatus >= 0) { // index!
- status = MEDIA_CODEC_OK;
- index = indexOrStatus;
- } else if (indexOrStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
- status = MEDIA_CODEC_DEQUEUE_INPUT_AGAIN_LATER;
- } else {
- throw new AssertionError("Unexpected index_or_status: " + indexOrStatus);
- }
- } catch (Exception e) {
- Log.e(TAG, "Failed to dequeue input buffer", e);
- }
- outDequeueInputResult.mStatus = status;
- outDequeueInputResult.mIndex = index;
- }
-
- @SuppressWarnings("unused")
- @UsedByNative
private int flush() {
try {
mFlushed = true;
@@ -778,47 +759,6 @@
}
}
- @SuppressWarnings({"unused", "deprecation"})
- @UsedByNative
- private void dequeueOutputBuffer(long timeoutUs, DequeueOutputResult outDequeueOutputResult) {
- int status = MEDIA_CODEC_ERROR;
- int index = -1;
- try {
- int indexOrStatus = mMediaCodec.dequeueOutputBuffer(info, timeoutUs);
- if (info.presentationTimeUs < mLastPresentationTimeUs) {
- // TODO: return a special code through DequeueOutputResult
- // to notify the native code that the frame has a wrong presentation
- // timestamp and should be skipped.
- info.presentationTimeUs = mLastPresentationTimeUs;
- }
- mLastPresentationTimeUs = info.presentationTimeUs;
-
- if (indexOrStatus >= 0) { // index!
- status = MEDIA_CODEC_OK;
- index = indexOrStatus;
- } else if (indexOrStatus == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
- status = MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED;
- } else if (indexOrStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
- status = MEDIA_CODEC_OUTPUT_FORMAT_CHANGED;
- MediaFormat newFormat = mMediaCodec.getOutputFormat();
- } else if (indexOrStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
- status = MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER;
- } else {
- throw new AssertionError("Unexpected index_or_status: " + indexOrStatus);
- }
- } catch (IllegalStateException e) {
- status = MEDIA_CODEC_ERROR;
- Log.e(TAG, "Failed to dequeue output buffer", e);
- }
-
- outDequeueOutputResult.mStatus = status;
- outDequeueOutputResult.mIndex = index;
- outDequeueOutputResult.mFlags = info.flags;
- outDequeueOutputResult.mOffset = info.offset;
- outDequeueOutputResult.mPresentationTimeMicroseconds = info.presentationTimeUs;
- outDequeueOutputResult.mNumBytes = info.size;
- }
-
@SuppressWarnings("unused")
@UsedByNative
private boolean configureVideo(
diff --git a/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoSurfaceTexture.java b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoSurfaceTexture.java
new file mode 100644
index 0000000..6987021
--- /dev/null
+++ b/src/starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoSurfaceTexture.java
@@ -0,0 +1,46 @@
+// Copyright 2019 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.
+
+package dev.cobalt.media;
+
+import android.graphics.SurfaceTexture;
+import dev.cobalt.util.UsedByNative;
+
+// A wrapper of SurfaceTexture class.
+// VideoSurfaceTexture allows native code to receive OnFrameAvailable event.
+@UsedByNative
+public class VideoSurfaceTexture extends SurfaceTexture {
+ @UsedByNative
+ VideoSurfaceTexture(int texName) {
+ super(texName);
+ }
+
+ @UsedByNative
+ void setOnFrameAvailableListener(final long nativeVideoDecoder) {
+ super.setOnFrameAvailableListener(
+ new SurfaceTexture.OnFrameAvailableListener() {
+ @Override
+ public void onFrameAvailable(SurfaceTexture surfaceTexture) {
+ nativeOnFrameAvailable(nativeVideoDecoder);
+ }
+ });
+ }
+
+ @UsedByNative
+ void removeOnFrameAvailableListener() {
+ super.setOnFrameAvailableListener(null);
+ }
+
+ private native void nativeOnFrameAvailable(long nativeVideoDecoder);
+}
diff --git a/src/starboard/android/apk/build.id b/src/starboard/android/apk/build.id
index 80c1e89..4c97ae0 100644
--- a/src/starboard/android/apk/build.id
+++ b/src/starboard/android/apk/build.id
@@ -1 +1 @@
-217501
\ No newline at end of file
+220597
\ No newline at end of file
diff --git a/src/starboard/android/shared/audio_sink_get_min_buffer_size_in_frames.cc b/src/starboard/android/shared/audio_sink_get_min_buffer_size_in_frames.cc
new file mode 100644
index 0000000..2bd7c3f
--- /dev/null
+++ b/src/starboard/android/shared/audio_sink_get_min_buffer_size_in_frames.cc
@@ -0,0 +1,43 @@
+// Copyright 2019 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/audio_sink.h"
+
+#include "starboard/android/shared/audio_track_audio_sink_type.h"
+#include "starboard/common/log.h"
+
+int SbAudioSinkGetMinBufferSizeInFrames(int channels,
+ SbMediaAudioSampleType sample_type,
+ int sampling_frequency_hz) {
+ // Currently, we only use |min_required_frames_| for web audio, which
+ // only supports 48k mono or stereo sound.
+ SB_DCHECK(sampling_frequency_hz == 48000);
+
+ if (channels <= 0 || channels > SbAudioSinkGetMaxChannels()) {
+ SB_LOG(ERROR) << "Not support channels count " << channels;
+ return -1;
+ }
+ if (sample_type != kSbMediaAudioSampleTypeInt16Deprecated &&
+ sample_type != kSbMediaAudioSampleTypeFloat32) {
+ SB_LOG(ERROR) << "Not support sample type " << sample_type;
+ return -1;
+ }
+ if (sampling_frequency_hz <= 0) {
+ SB_LOG(ERROR) << "Not support sample frequency " << sampling_frequency_hz;
+ return -1;
+ }
+
+ return starboard::android::shared::AudioTrackAudioSinkType::
+ GetMinBufferSizeInFrames(channels, sample_type, sampling_frequency_hz);
+}
diff --git a/src/starboard/android/shared/audio_sink_min_required_frames_tester.cc b/src/starboard/android/shared/audio_sink_min_required_frames_tester.cc
new file mode 100644
index 0000000..e9a87a3
--- /dev/null
+++ b/src/starboard/android/shared/audio_sink_min_required_frames_tester.cc
@@ -0,0 +1,224 @@
+// Copyright 2019 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/android/shared/audio_sink_min_required_frames_tester.h"
+
+#include <vector>
+
+#include "starboard/android/shared/audio_track_audio_sink_type.h"
+
+namespace starboard {
+namespace android {
+namespace shared {
+
+namespace {
+const int kCheckpointFramesInterval = 1024;
+
+// Helper function to compute the size of the two valid starboard audio sample
+// types.
+size_t GetSampleSize(SbMediaAudioSampleType sample_type) {
+ switch (sample_type) {
+ case kSbMediaAudioSampleTypeFloat32:
+ return sizeof(float);
+ case kSbMediaAudioSampleTypeInt16Deprecated:
+ return sizeof(int16_t);
+ }
+ SB_NOTREACHED();
+ return 0u;
+}
+} // namespace
+
+MinRequiredFramesTester::MinRequiredFramesTester(int audio_sink_buffer_size,
+ int max_required_frames,
+ int default_required_frames,
+ int required_frames_increment,
+ int min_stable_played_frames)
+ : audio_sink_buffer_size_(audio_sink_buffer_size),
+ max_required_frames_(max_required_frames),
+ default_required_frames_(default_required_frames),
+ required_frames_increment_(required_frames_increment),
+ min_stable_played_frames_(min_stable_played_frames),
+ condition_variable_(mutex_),
+ destroyed_(false) {}
+
+MinRequiredFramesTester::~MinRequiredFramesTester() {
+ SB_DCHECK(thread_checker_.CalledOnValidThread());
+ destroyed_.store(true);
+ if (SbThreadIsValid(tester_thread_)) {
+ {
+ ScopedLock scoped_lock(mutex_);
+ condition_variable_.Signal();
+ }
+ SbThreadJoin(tester_thread_, NULL);
+ tester_thread_ = kSbThreadInvalid;
+ }
+}
+
+void MinRequiredFramesTester::StartTest(
+ int number_of_channels,
+ SbMediaAudioSampleType sample_type,
+ int sample_rate,
+ OnMinRequiredFramesReceivedCallback received_cb) {
+ SB_DCHECK(thread_checker_.CalledOnValidThread());
+ // MinRequiredFramesTester only supports to do test once now.
+ SB_DCHECK(!SbThreadIsValid(tester_thread_));
+
+ number_of_channels_ = number_of_channels;
+ sample_type_ = sample_type;
+ sample_rate_ = sample_rate;
+ received_cb_ = received_cb;
+
+ tester_thread_ =
+ SbThreadCreate(0, kSbThreadPriorityLowest, kSbThreadNoAffinity, true,
+ "audio_track_tester",
+ &MinRequiredFramesTester::TesterThreadEntryPoint, this);
+ SB_DCHECK(SbThreadIsValid(tester_thread_));
+}
+
+// static
+void* MinRequiredFramesTester::TesterThreadEntryPoint(void* context) {
+ SB_DCHECK(context);
+ MinRequiredFramesTester* tester =
+ static_cast<MinRequiredFramesTester*>(context);
+ tester->TesterThreadFunc();
+ return NULL;
+}
+
+void MinRequiredFramesTester::TesterThreadFunc() {
+ bool wait_timeout = false;
+ // Currently, we only support test once. But we can put following codes in
+ // a for loop easily to support test multiple times.
+ std::vector<uint8_t> silence_buffer(
+ max_required_frames_ * number_of_channels_ * GetSampleSize(sample_type_),
+ 0);
+ void* frame_buffers[1];
+ frame_buffers[0] = silence_buffer.data();
+ // Set default values.
+ min_required_frames_ = default_required_frames_;
+ total_consumed_frames_ = 0;
+ last_underrun_count_ = -1;
+ last_total_consumed_frames_ = 0;
+ {
+ ScopedLock scoped_lock(mutex_);
+ // Need to check |destroyed_| before start, as MinRequiredFramesTester may
+ // be destroyed immediately after tester thread started.
+ if (!destroyed_.load()) {
+ audio_sink_ = new AudioTrackAudioSink(
+ NULL, number_of_channels_, sample_rate_, sample_type_, frame_buffers,
+ max_required_frames_,
+ audio_sink_buffer_size_ * number_of_channels_ *
+ GetSampleSize(sample_type_),
+ &MinRequiredFramesTester::UpdateSourceStatusFunc,
+ &MinRequiredFramesTester::ConsumeFramesFunc, this);
+ wait_timeout = !condition_variable_.WaitTimed(kSbTimeSecond * 5);
+ if (wait_timeout) {
+ SB_LOG(ERROR) << "Audio sink min required frames tester timeout.";
+ SB_NOTREACHED();
+ }
+ }
+ }
+ delete audio_sink_;
+ audio_sink_ = nullptr;
+ // Call |received_cb_| after audio sink thread is ended.
+ // |number_of_channels_|, |sample_type_|, |sample_rate_| and
+ // |min_required_frames_| are shared between two threads.
+ if (!destroyed_.load() && !wait_timeout) {
+ received_cb_(number_of_channels_, sample_type_, sample_rate_,
+ min_required_frames_);
+ }
+}
+
+// static
+void MinRequiredFramesTester::UpdateSourceStatusFunc(int* frames_in_buffer,
+ int* offset_in_frames,
+ bool* is_playing,
+ bool* is_eos_reached,
+ void* context) {
+ MinRequiredFramesTester* tester =
+ static_cast<MinRequiredFramesTester*>(context);
+ SB_DCHECK(tester);
+ SB_DCHECK(frames_in_buffer);
+ SB_DCHECK(offset_in_frames);
+ SB_DCHECK(is_playing);
+ SB_DCHECK(is_eos_reached);
+
+ tester->UpdateSourceStatus(frames_in_buffer, offset_in_frames, is_playing,
+ is_eos_reached);
+}
+
+// static
+void MinRequiredFramesTester::ConsumeFramesFunc(int frames_consumed,
+ SbTime frames_consumed_at,
+ void* context) {
+ SB_UNREFERENCED_PARAMETER(frames_consumed_at);
+
+ MinRequiredFramesTester* tester =
+ static_cast<MinRequiredFramesTester*>(context);
+ SB_DCHECK(tester);
+
+ tester->ConsumeFrames(frames_consumed);
+}
+
+void MinRequiredFramesTester::UpdateSourceStatus(int* frames_in_buffer,
+ int* offset_in_frames,
+ bool* is_playing,
+ bool* is_eos_reached) {
+ *frames_in_buffer = min_required_frames_;
+ *offset_in_frames = 0;
+ *is_playing = true;
+ *is_eos_reached = false;
+}
+
+void MinRequiredFramesTester::ConsumeFrames(int frames_consumed) {
+ total_consumed_frames_ += frames_consumed;
+ // Wait until played enough frames.
+ if (total_consumed_frames_ - kCheckpointFramesInterval <
+ last_total_consumed_frames_) {
+ return;
+ }
+ if (last_underrun_count_ == -1) {
+ // |last_underrun_count_| is unknown, record the current underrun count
+ // and start to observe the underrun count.
+ last_underrun_count_ = audio_sink_->GetUnderrunCount();
+ last_total_consumed_frames_ = total_consumed_frames_;
+ return;
+ }
+ // The playback should be played for a while. If we still get new underruns,
+ // we need to write more buffers into audio sink.
+ int underrun_count = audio_sink_->GetUnderrunCount();
+ if (underrun_count > last_underrun_count_) {
+ min_required_frames_ += required_frames_increment_;
+ if (min_required_frames_ >= max_required_frames_) {
+ SB_LOG(WARNING) << "Min required frames reached maximum.";
+ } else {
+ last_underrun_count_ = -1;
+ last_total_consumed_frames_ = total_consumed_frames_;
+ return;
+ }
+ }
+
+ if (min_required_frames_ >= max_required_frames_ ||
+ total_consumed_frames_ - min_stable_played_frames_ >=
+ last_total_consumed_frames_) {
+ // |min_required_frames_| reached maximum, or playback is stable and
+ // doesn't have underruns. Stop the test.
+ last_total_consumed_frames_ = INT_MAX;
+ ScopedLock scoped_lock(mutex_);
+ condition_variable_.Signal();
+ }
+}
+
+} // namespace shared
+} // namespace android
+} // namespace starboard
diff --git a/src/starboard/android/shared/audio_sink_min_required_frames_tester.h b/src/starboard/android/shared/audio_sink_min_required_frames_tester.h
new file mode 100644
index 0000000..9e53134
--- /dev/null
+++ b/src/starboard/android/shared/audio_sink_min_required_frames_tester.h
@@ -0,0 +1,109 @@
+// Copyright 2019 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_ANDROID_SHARED_AUDIO_SINK_MIN_REQUIRED_FRAMES_TESTER_H_
+#define STARBOARD_ANDROID_SHARED_AUDIO_SINK_MIN_REQUIRED_FRAMES_TESTER_H_
+
+#include <atomic>
+#include <functional>
+
+#include "starboard/common/condition_variable.h"
+#include "starboard/common/mutex.h"
+#include "starboard/media.h"
+#include "starboard/shared/starboard/thread_checker.h"
+#include "starboard/thread.h"
+
+namespace starboard {
+namespace android {
+namespace shared {
+
+class AudioTrackAudioSink;
+
+// The class is to detect min required frames for audio sink to play audio
+// without underflow.
+class MinRequiredFramesTester {
+ public:
+ typedef std::function<void(int number_of_channels,
+ SbMediaAudioSampleType sample_type,
+ int sample_rate,
+ int min_required_frames)>
+ OnMinRequiredFramesReceivedCallback;
+
+ MinRequiredFramesTester(int audio_sink_buffer_size,
+ int max_required_frames,
+ int default_required_frames,
+ int required_frames_increment,
+ int min_stable_played_frames);
+ ~MinRequiredFramesTester();
+
+ void StartTest(int number_of_channels,
+ SbMediaAudioSampleType sample_type,
+ int sample_rate,
+ OnMinRequiredFramesReceivedCallback received_cb);
+
+ private:
+ static void* TesterThreadEntryPoint(void* context);
+ void TesterThreadFunc();
+
+ static void UpdateSourceStatusFunc(int* frames_in_buffer,
+ int* offset_in_frames,
+ bool* is_playing,
+ bool* is_eos_reached,
+ void* context);
+ static void ConsumeFramesFunc(int frames_consumed,
+ SbTime frames_consumed_at,
+ void* context);
+ void UpdateSourceStatus(int* frames_in_buffer,
+ int* offset_in_frames,
+ bool* is_playing,
+ bool* is_eos_reached);
+ void ConsumeFrames(int frames_consumed);
+
+ MinRequiredFramesTester(const MinRequiredFramesTester&) = delete;
+ MinRequiredFramesTester& operator=(const MinRequiredFramesTester&) = delete;
+
+ const int audio_sink_buffer_size_;
+ const int max_required_frames_;
+ const int default_required_frames_;
+ const int required_frames_increment_;
+ const int min_stable_played_frames_;
+
+ ::starboard::shared::starboard::ThreadChecker thread_checker_;
+
+ // Shared variables between tester thread and audio sink thread.
+ AudioTrackAudioSink* audio_sink_ = nullptr;
+ int number_of_channels_;
+ SbMediaAudioSampleType sample_type_;
+ int sample_rate_;
+ int min_required_frames_;
+
+ // Used only by tester thread.
+ OnMinRequiredFramesReceivedCallback received_cb_;
+
+ // Used only by audio sink thread.
+ int total_consumed_frames_;
+ int last_underrun_count_;
+ int last_total_consumed_frames_;
+
+ Mutex mutex_;
+ ConditionVariable condition_variable_;
+ SbThread tester_thread_ = kSbThreadInvalid;
+ std::atomic_bool destroyed_;
+};
+
+} // namespace shared
+} // namespace android
+} // namespace starboard
+
+#endif // STARBOARD_ANDROID_SHARED_AUDIO_SINK_MIN_REQUIRED_FRAMES_TESTER_H_
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 24f1c5f..994d904 100644
--- a/src/starboard/android/shared/audio_track_audio_sink_type.cc
+++ b/src/starboard/android/shared/audio_track_audio_sink_type.cc
@@ -15,13 +15,12 @@
#include "starboard/android/shared/audio_track_audio_sink_type.h"
#include <algorithm>
-#include <deque>
+#include <vector>
-#include "starboard/android/shared/jni_env_ext.h"
-#include "starboard/android/shared/jni_utils.h"
-#include "starboard/common/mutex.h"
-#include "starboard/common/scoped_ptr.h"
-#include "starboard/thread.h"
+namespace {
+starboard::android::shared::AudioTrackAudioSinkType*
+ audio_track_audio_sink_type_;
+}
namespace starboard {
namespace android {
@@ -33,13 +32,14 @@
// we will repeatedly allocate a large byte array which cannot be consumed by
// audio track completely.
const int kMaxFramesPerRequest = 65536;
-
const jint kNoOffset = 0;
-
const size_t kSilenceFramesPerAppend = 1024;
-// 6 (max channels) * 4 (max sample size) * kSilenceFramesPerAppend, the number
-// is to ensure we always have at least 1024 frames silence to write.
-const uint8_t kSilenceBuffer[24 * kSilenceFramesPerAppend] = {0};
+
+const int kAudioSinkBufferSize = 4 * 1024;
+const int kMaxRequiredFrames = 16 * 1024;
+const int kDefaultRequiredFrames = 8 * 1024;
+const int kRequiredFramesIncrement = 2 * 1024;
+const int kMinStablePlayedFrames = 12 * 1024;
// Helper function to compute the size of the two valid starboard audio sample
// types.
@@ -71,62 +71,7 @@
return static_cast<uint8_t*>(pointer) + offset;
}
-class AudioTrackAudioSink : public SbAudioSinkPrivate {
- public:
- AudioTrackAudioSink(
- Type* type,
- int channels,
- int sampling_frequency_hz,
- SbMediaAudioSampleType sample_type,
- SbAudioSinkFrameBuffers frame_buffers,
- int frames_per_channel,
- SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
- SbAudioSinkConsumeFramesFunc consume_frame_func,
- void* context);
- ~AudioTrackAudioSink() override;
-
- bool IsAudioTrackValid() const { return j_audio_track_bridge_; }
- bool IsType(Type* type) override { return type_ == type; }
- void SetPlaybackRate(double playback_rate) override {
- SB_DCHECK(playback_rate >= 0.0);
- if (playback_rate != 0.0 && playback_rate != 1.0) {
- SB_NOTIMPLEMENTED() << "TODO: Only playback rates of 0.0 and 1.0 are "
- "currently supported.";
- playback_rate = (playback_rate > 0.0) ? 1.0 : 0.0;
- }
- ScopedLock lock(mutex_);
- playback_rate_ = playback_rate;
- }
-
- void SetVolume(double volume) override;
-
- private:
- static void* ThreadEntryPoint(void* context);
- void AudioThreadFunc();
-
- int WriteData(JniEnvExt* env, const void* buffer, int size);
-
- Type* type_;
- int channels_;
- int sampling_frequency_hz_;
- SbMediaAudioSampleType sample_type_;
- void* frame_buffer_;
- int frames_per_channel_;
- SbAudioSinkUpdateSourceStatusFunc update_source_status_func_;
- SbAudioSinkConsumeFramesFunc consume_frame_func_;
- void* context_;
- int last_playback_head_position_;
- jobject j_audio_track_bridge_;
- jobject j_audio_data_;
-
- volatile bool quit_;
- SbThread audio_out_thread_;
-
- starboard::Mutex mutex_;
- double playback_rate_;
-
- int written_frames_;
-};
+} // namespace
AudioTrackAudioSink::AudioTrackAudioSink(
Type* type,
@@ -135,6 +80,7 @@
SbMediaAudioSampleType sample_type,
SbAudioSinkFrameBuffers frame_buffers,
int frames_per_channel,
+ int preferred_buffer_size,
SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
SbAudioSinkConsumeFramesFunc consume_frame_func,
void* context)
@@ -167,7 +113,7 @@
j_audio_output_manager.Get(), "createAudioTrackBridge",
"(IIII)Ldev/cobalt/media/AudioTrackBridge;",
GetAudioFormatSampleType(sample_type_), sampling_frequency_hz_, channels_,
- frames_per_channel);
+ preferred_buffer_size);
if (!j_audio_track_bridge) {
return;
}
@@ -214,6 +160,17 @@
}
}
+void AudioTrackAudioSink::SetPlaybackRate(double playback_rate) {
+ SB_DCHECK(playback_rate >= 0.0);
+ if (playback_rate != 0.0 && playback_rate != 1.0) {
+ SB_NOTIMPLEMENTED() << "TODO: Only playback rates of 0.0 and 1.0 are "
+ "currently supported.";
+ playback_rate = (playback_rate > 0.0) ? 1.0 : 0.0;
+ }
+ ScopedLock lock(mutex_);
+ playback_rate_ = playback_rate;
+}
+
// static
void* AudioTrackAudioSink::ThreadEntryPoint(void* context) {
SB_DCHECK(context);
@@ -305,8 +262,11 @@
// its buffer is fully filled once.
if (is_eos_reached) {
// Currently AudioDevice and AudioRenderer will write tail silence.
- // It should be reached only in tests.
- WriteData(env, kSilenceBuffer, kSilenceFramesPerAppend);
+ // It should be reached only in tests. It's not ideal to allocate
+ // a new silence buffer every time.
+ std::vector<uint8_t> silence_buffer(
+ channels_ * GetSampleSize(sample_type_) * kSilenceFramesPerAppend);
+ WriteData(env, silence_buffer.data(), kSilenceFramesPerAppend);
}
SbThreadSleep(10 * kSbTimeMillisecond);
continue;
@@ -384,7 +344,30 @@
}
}
-} // namespace
+int AudioTrackAudioSink::GetUnderrunCount() {
+ auto* env = JniEnvExt::Get();
+ jint underrun_count = env->CallIntMethodOrAbort(j_audio_track_bridge_,
+ "getUnderrunCount", "()I");
+ return underrun_count;
+}
+
+// static
+int AudioTrackAudioSinkType::GetMinBufferSizeInFrames(
+ int channels,
+ SbMediaAudioSampleType sample_type,
+ int sampling_frequency_hz) {
+ SB_DCHECK(audio_track_audio_sink_type_);
+
+ return audio_track_audio_sink_type_->min_required_frames_.load();
+}
+
+AudioTrackAudioSinkType::AudioTrackAudioSinkType()
+ : min_required_frames_tester_(kAudioSinkBufferSize,
+ kMaxRequiredFrames,
+ kDefaultRequiredFrames,
+ kRequiredFramesIncrement,
+ kMinStablePlayedFrames),
+ min_required_frames_(kMaxRequiredFrames) {}
SbAudioSink AudioTrackAudioSinkType::Create(
int channels,
@@ -396,10 +379,18 @@
SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
SbAudioSinkConsumeFramesFunc consume_frames_func,
void* context) {
+ // Try to create AudioTrack with the same size buffer as in renderer. But
+ // AudioTrack would not start playing until the buffer is fully filled once. A
+ // large buffer may cause AudioTrack not able to start. And Cobalt now write
+ // no more than 1s of audio data and no more than 0.5 ahead to starboard
+ // player, limit the buffer size to store at most 0.5s of audio data.
+ int preferred_buffer_size =
+ std::min(frames_per_channel, sampling_frequency_hz / 2) * channels *
+ GetSampleSize(audio_sample_type);
AudioTrackAudioSink* audio_sink = new AudioTrackAudioSink(
this, channels, sampling_frequency_hz, audio_sample_type, frame_buffers,
- frames_per_channel, update_source_status_func, consume_frames_func,
- context);
+ frames_per_channel, preferred_buffer_size, update_source_status_func,
+ consume_frames_func, context);
if (!audio_sink->IsAudioTrackValid()) {
SB_DLOG(ERROR)
<< "AudioTrackAudioSinkType::Create failed to create audio track";
@@ -409,14 +400,33 @@
return audio_sink;
}
+void AudioTrackAudioSinkType::TestMinRequiredFrames() {
+ auto onMinRequiredFramesForWebAudioReceived =
+ [&](int number_of_channels, SbMediaAudioSampleType sample_type,
+ int sample_rate, int min_required_frames) {
+ SB_LOG(INFO) << "Received min required frames " << min_required_frames
+ << " for " << number_of_channels << " channels, "
+ << sample_rate << "hz.";
+ min_required_frames_.store(min_required_frames);
+ };
+
+ SbMediaAudioSampleType sample_type = kSbMediaAudioSampleTypeFloat32;
+ if (!SbAudioSinkIsAudioSampleTypeSupported(sample_type)) {
+ sample_type = kSbMediaAudioSampleTypeInt16Deprecated;
+ SB_DCHECK(SbAudioSinkIsAudioSampleTypeSupported(sample_type));
+ }
+
+ // Currently, cobalt only use |min_required_frames_| for web audio, which
+ // only supports 48k mono or stereo sound. It should be fine now to only
+ // test 48k stereo sound.
+ min_required_frames_tester_.StartTest(2, sample_type, 48000,
+ onMinRequiredFramesForWebAudioReceived);
+}
+
} // namespace shared
} // namespace android
} // namespace starboard
-namespace {
-SbAudioSinkPrivate::Type* audio_track_audio_sink_type_;
-} // namespace
-
// static
void SbAudioSinkPrivate::PlatformInitialize() {
SB_DCHECK(!audio_track_audio_sink_type_);
@@ -424,6 +434,7 @@
new starboard::android::shared::AudioTrackAudioSinkType;
SetPrimaryType(audio_track_audio_sink_type_);
EnableFallbackToStub();
+ audio_track_audio_sink_type_->TestMinRequiredFrames();
}
// static
diff --git a/src/starboard/android/shared/audio_track_audio_sink_type.h b/src/starboard/android/shared/audio_track_audio_sink_type.h
index ef53d9f..821a146 100644
--- a/src/starboard/android/shared/audio_track_audio_sink_type.h
+++ b/src/starboard/android/shared/audio_track_audio_sink_type.h
@@ -15,11 +15,20 @@
#ifndef STARBOARD_ANDROID_SHARED_AUDIO_TRACK_AUDIO_SINK_TYPE_H_
#define STARBOARD_ANDROID_SHARED_AUDIO_TRACK_AUDIO_SINK_TYPE_H_
+#include <atomic>
+#include <functional>
+
+#include "starboard/android/shared/audio_sink_min_required_frames_tester.h"
+#include "starboard/android/shared/jni_env_ext.h"
+#include "starboard/android/shared/jni_utils.h"
#include "starboard/audio_sink.h"
#include "starboard/common/log.h"
+#include "starboard/common/mutex.h"
+#include "starboard/common/scoped_ptr.h"
#include "starboard/configuration.h"
#include "starboard/shared/internal_only.h"
#include "starboard/shared/starboard/audio_sink/audio_sink_internal.h"
+#include "starboard/thread.h"
namespace starboard {
namespace android {
@@ -27,6 +36,12 @@
class AudioTrackAudioSinkType : public SbAudioSinkPrivate::Type {
public:
+ static int GetMinBufferSizeInFrames(int channels,
+ SbMediaAudioSampleType sample_type,
+ int sampling_frequency_hz);
+
+ AudioTrackAudioSinkType();
+
SbAudioSink Create(
int channels,
int sampling_frequency_hz,
@@ -49,6 +64,62 @@
}
delete audio_sink;
}
+
+ void TestMinRequiredFrames();
+
+ private:
+ std::atomic_int min_required_frames_;
+ MinRequiredFramesTester min_required_frames_tester_;
+};
+
+class AudioTrackAudioSink : public SbAudioSinkPrivate {
+ public:
+ AudioTrackAudioSink(
+ Type* type,
+ int channels,
+ int sampling_frequency_hz,
+ SbMediaAudioSampleType sample_type,
+ SbAudioSinkFrameBuffers frame_buffers,
+ int frames_per_channel,
+ int preferred_buffer_size,
+ SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
+ SbAudioSinkConsumeFramesFunc consume_frame_func,
+ void* context);
+ ~AudioTrackAudioSink() override;
+
+ bool IsAudioTrackValid() const { return j_audio_track_bridge_; }
+ bool IsType(Type* type) override { return type_ == type; }
+ void SetPlaybackRate(double playback_rate) override;
+
+ void SetVolume(double volume) override;
+ int GetUnderrunCount();
+
+ private:
+ static void* ThreadEntryPoint(void* context);
+ void AudioThreadFunc();
+
+ int WriteData(JniEnvExt* env, const void* buffer, int size);
+
+ Type* type_;
+ int channels_;
+ int sampling_frequency_hz_;
+ SbMediaAudioSampleType sample_type_;
+ void* frame_buffer_;
+ int frames_per_channel_;
+ SbAudioSinkUpdateSourceStatusFunc update_source_status_func_;
+ SbAudioSinkConsumeFramesFunc consume_frame_func_;
+ void* context_;
+ int last_playback_head_position_;
+ jobject j_audio_track_bridge_;
+ jobject j_audio_data_;
+
+ volatile bool quit_;
+ SbThread audio_out_thread_;
+
+ starboard::Mutex mutex_;
+ double playback_rate_;
+
+ int written_frames_;
};
} // namespace shared
diff --git a/src/starboard/android/shared/cobalt/android_media_session_client.cc b/src/starboard/android/shared/cobalt/android_media_session_client.cc
index 87f4f9f..0b4b5c1 100644
--- a/src/starboard/android/shared/cobalt/android_media_session_client.cc
+++ b/src/starboard/android/shared/cobalt/android_media_session_client.cc
@@ -23,7 +23,6 @@
#include "starboard/common/log.h"
#include "starboard/common/mutex.h"
#include "starboard/once.h"
-#include "starboard/player.h"
namespace starboard {
namespace android {
@@ -43,6 +42,7 @@
using ::cobalt::media_session::kMediaSessionActionSeekto;
using ::cobalt::media_session::kMediaSessionActionSeekbackward;
using ::cobalt::media_session::kMediaSessionActionSeekforward;
+using ::cobalt::media_session::kMediaSessionActionStop;
using ::cobalt::media_session::kMediaSessionActionPrevioustrack;
using ::cobalt::media_session::kMediaSessionActionNexttrack;
using ::cobalt::media_session::kMediaSessionPlaybackStateNone;
@@ -57,7 +57,7 @@
namespace {
// These constants are from android.media.session.PlaybackState
-const jlong kPlaybackStateActionStop = 1 << 0; // not supported
+const jlong kPlaybackStateActionStop = 1 << 0;
const jlong kPlaybackStateActionPause = 1 << 1;
const jlong kPlaybackStateActionPlay = 1 << 2;
const jlong kPlaybackStateActionRewind = 1 << 3;
@@ -93,6 +93,9 @@
if (actions[kMediaSessionActionSeekto]) {
result |= kPlaybackStateActionSeekTo;
}
+ if (actions[kMediaSessionActionStop]) {
+ result |= kPlaybackStateActionStop;
+ }
return result;
}
@@ -132,6 +135,9 @@
case kPlaybackStateActionSeekTo:
result = kMediaSessionActionSeekto;
break;
+ case kPlaybackStateActionStop:
+ result = kMediaSessionActionStop;
+ break;
default:
SB_NOTREACHED() << "Unsupported MediaSessionAction 0x"
<< std::hex << action;
@@ -171,10 +177,6 @@
// Protected by "mutex"
static AndroidMediaSessionClient* active_client;
- // TODO: Pass the necessary info through web MediaSession so we don't need to
- // short-circuit to the player implementation to get info about the playback.
- static SbPlayer active_player;
-
static void OnceInit() { SbMutexCreate(&mutex); }
public:
@@ -208,15 +210,6 @@
SbMutexRelease(&mutex);
}
- static void UpdateActiveSessionPlatformPlayer(SbPlayer player) {
- SbOnce(&once_flag, OnceInit);
- SbMutexAcquire(&mutex);
-
- active_player = player;
-
- SbMutexRelease(&mutex);
- }
-
AndroidMediaSessionClient() {}
virtual ~AndroidMediaSessionClient() {
@@ -242,12 +235,6 @@
} else if (active_client == this) {
active_client = NULL;
}
-
- SbPlayerInfo2 player_info;
- SbMemorySet(&player_info, 0, sizeof(player_info));
- if (active_player != kSbPlayerInvalid) {
- SbPlayerGetInfo2(active_player, &player_info);
- }
SbMutexRelease(&mutex);
jlong playback_state_actions = MediaSessionActionsToPlaybackStateActions(
@@ -307,8 +294,8 @@
"(IJJFLjava/lang/String;Ljava/lang/String;Ljava/lang/String;"
"[Ldev/cobalt/media/MediaImage;)V",
playback_state, playback_state_actions,
- player_info.current_media_timestamp / kSbTimeMillisecond,
- static_cast<jfloat>(player_info.playback_rate),
+ session_state.current_playback_position() / kSbTimeMillisecond,
+ static_cast<jfloat>(session_state.actual_playback_rate()),
j_title.Get(), j_artist.Get(), j_album.Get(), j_artwork.Get());
}
};
@@ -316,7 +303,6 @@
SbOnceControl AndroidMediaSessionClient::once_flag = SB_ONCE_INITIALIZER;
SbMutex AndroidMediaSessionClient::mutex;
AndroidMediaSessionClient* AndroidMediaSessionClient::active_client = NULL;
-SbPlayer AndroidMediaSessionClient::active_player = kSbPlayerInvalid;
void UpdateActiveSessionPlatformPlaybackState(PlaybackState state) {
MediaSessionPlaybackState media_session_state =
@@ -326,10 +312,6 @@
media_session_state);
}
-void UpdateActiveSessionPlatformPlayer(SbPlayer player) {
- AndroidMediaSessionClient::UpdateActiveSessionPlatformPlayer(player);
-}
-
} // namespace cobalt
} // namespace shared
} // namespace android
diff --git a/src/starboard/android/shared/cobalt/android_media_session_client.h b/src/starboard/android/shared/cobalt/android_media_session_client.h
index 284e165..5fc3f41 100644
--- a/src/starboard/android/shared/cobalt/android_media_session_client.h
+++ b/src/starboard/android/shared/cobalt/android_media_session_client.h
@@ -15,8 +15,6 @@
#ifndef STARBOARD_ANDROID_SHARED_COBALT_ANDROID_MEDIA_SESSION_CLIENT_H_
#define STARBOARD_ANDROID_SHARED_COBALT_ANDROID_MEDIA_SESSION_CLIENT_H_
-#include "starboard/player.h"
-
namespace starboard {
namespace android {
namespace shared {
@@ -27,10 +25,6 @@
void UpdateActiveSessionPlatformPlaybackState(PlaybackState state);
-// TODO: Pass the necessary info through web MediaSession so we don't need to
-// short-circuit to the player implementation to get info about the playback.
-void UpdateActiveSessionPlatformPlayer(SbPlayer player);
-
} // namespace cobalt
} // namespace shared
} // namespace android
diff --git a/src/starboard/android/shared/decode_target_create.cc b/src/starboard/android/shared/decode_target_create.cc
index 9b6f900..f54f90b 100644
--- a/src/starboard/android/shared/decode_target_create.cc
+++ b/src/starboard/android/shared/decode_target_create.cc
@@ -37,7 +37,7 @@
JniEnvExt* env = JniEnvExt::Get();
jobject local_surface_texture = env->NewObjectOrAbort(
- "android/graphics/SurfaceTexture", "(I)V", gl_texture_id);
+ "dev/cobalt/media/VideoSurfaceTexture", "(I)V", gl_texture_id);
jobject global_surface_texture =
env->ConvertLocalRefToGlobalRef(local_surface_texture);
diff --git a/src/starboard/android/shared/drm_system.cc b/src/starboard/android/shared/drm_system.cc
index d1212c6..943633e 100644
--- a/src/starboard/android/shared/drm_system.cc
+++ b/src/starboard/android/shared/drm_system.cc
@@ -36,6 +36,26 @@
const jint MEDIA_DRM_KEY_STATUS_PENDING = 3;
const jint MEDIA_DRM_KEY_STATUS_USABLE = 0;
+// They must have the same values as defined in MediaDrm.KeyRequest.
+const jint REQUEST_TYPE_INITIAL = 0;
+const jint REQUEST_TYPE_RENEWAL = 1;
+const jint REQUEST_TYPE_RELEASE = 2;
+
+SbDrmSessionRequestType SbDrmSessionRequestTypeFromMediaDrmKeyRequestType(
+ jint request_type) {
+ if (request_type == REQUEST_TYPE_INITIAL) {
+ return kSbDrmSessionRequestTypeLicenseRequest;
+ }
+ if (request_type == REQUEST_TYPE_RENEWAL) {
+ return kSbDrmSessionRequestTypeLicenseRenewal;
+ }
+ if (request_type == REQUEST_TYPE_RELEASE) {
+ return kSbDrmSessionRequestTypeLicenseRelease;
+ }
+ SB_NOTREACHED();
+ return kSbDrmSessionRequestTypeLicenseRequest;
+}
+
} // namespace
// This has to be defined outside the above anonymous namespace to be picked up
@@ -68,9 +88,10 @@
DrmSystem* drm_system = reinterpret_cast<DrmSystem*>(native_media_drm_bridge);
SB_DCHECK(drm_system);
- drm_system->CallUpdateRequestCallback(ticket, session_id_elements,
- session_id_size, message_elements,
- message_size, kNoUrl);
+ drm_system->CallUpdateRequestCallback(
+ ticket, SbDrmSessionRequestTypeFromMediaDrmKeyRequestType(request_type),
+ session_id_elements, session_id_size, message_elements, message_size,
+ kNoUrl);
env->ReleaseByteArrayElements(j_session_id, session_id_elements, JNI_ABORT);
env->ReleaseByteArrayElements(j_message, message_elements, JNI_ABORT);
}
@@ -255,15 +276,15 @@
}
void DrmSystem::CallUpdateRequestCallback(int ticket,
+ SbDrmSessionRequestType request_type,
const void* session_id,
int session_id_size,
const void* content,
int content_size,
const char* url) {
update_request_callback_(this, context_, ticket, kSbDrmStatusSuccess,
- kSbDrmSessionRequestTypeLicenseRequest, NULL,
- session_id, session_id_size, content, content_size,
- url);
+ request_type, NULL, session_id, session_id_size,
+ content, content_size, url);
}
void DrmSystem::CallDrmSessionKeyStatusesChangedCallback(
diff --git a/src/starboard/android/shared/drm_system.h b/src/starboard/android/shared/drm_system.h
index 49d5c72..9bdd875 100644
--- a/src/starboard/android/shared/drm_system.h
+++ b/src/starboard/android/shared/drm_system.h
@@ -61,6 +61,7 @@
jobject GetMediaCrypto() const { return j_media_crypto_; }
void CallUpdateRequestCallback(int ticket,
+ SbDrmSessionRequestType request_type,
const void* session_id,
int session_id_size,
const void* content,
diff --git a/src/starboard/android/shared/gyp_configuration.py b/src/starboard/android/shared/gyp_configuration.py
index d674f72..8fc3c9b 100644
--- a/src/starboard/android/shared/gyp_configuration.py
+++ b/src/starboard/android/shared/gyp_configuration.py
@@ -274,30 +274,13 @@
# A map of failing or crashing tests per target.
__FILTERED_TESTS = { # pylint: disable=invalid-name
'player_filter_tests': [
- 'VideoDecoderTests/VideoDecoderTest.DecodeFullGOP/0',
- 'VideoDecoderTests/VideoDecoderTest.DecodeFullGOP/1',
- 'VideoDecoderTests/VideoDecoderTest.DecodeFullGOP/2',
- 'VideoDecoderTests/VideoDecoderTest.DecodeFullGOP/3',
- 'VideoDecoderTests/VideoDecoderTest.EndOfStreamWithoutAnyInput/0',
- 'VideoDecoderTests/VideoDecoderTest.EndOfStreamWithoutAnyInput/1',
- 'VideoDecoderTests/VideoDecoderTest.EndOfStreamWithoutAnyInput/2',
- 'VideoDecoderTests/VideoDecoderTest.EndOfStreamWithoutAnyInput/3',
- 'VideoDecoderTests/VideoDecoderTest'
- '.GetCurrentDecodeTargetBeforeWriteInputBuffer/0',
- 'VideoDecoderTests/VideoDecoderTest'
- '.GetCurrentDecodeTargetBeforeWriteInputBuffer/2',
- 'VideoDecoderTests/VideoDecoderTest.HoldFramesUntilFull/0',
- 'VideoDecoderTests/VideoDecoderTest.HoldFramesUntilFull/1',
- 'VideoDecoderTests/VideoDecoderTest.ResetBeforeInput/0',
- 'VideoDecoderTests/VideoDecoderTest.ResetBeforeInput/1',
- 'VideoDecoderTests/VideoDecoderTest.ResetBeforeInput/2',
- 'VideoDecoderTests/VideoDecoderTest.ResetBeforeInput/3',
- 'VideoDecoderTests/VideoDecoderTest.Preroll/0',
- 'VideoDecoderTests/VideoDecoderTest.Preroll/1',
- 'VideoDecoderTests/VideoDecoderTest.SingleInput/0',
- 'VideoDecoderTests/VideoDecoderTest.SingleInput/1',
- 'VideoDecoderTests/VideoDecoderTest.SingleInput/2',
- 'VideoDecoderTests/VideoDecoderTest.SingleInput/3',
+ # GetMaxNumberOfCachedFrames() on Android is device dependent,
+ # and Android doesn't provide an API to get it. So, this function
+ # doesn't make sense on Android. But HoldFramesUntilFull tests depend
+ # on this number strictly.
+ 'VideoDecoderTests/VideoDecoderTest.HoldFramesUntilFull/*',
+
+ # Currently, invalid input tests are not supported.
'VideoDecoderTests/VideoDecoderTest.SingleInvalidInput/*',
'VideoDecoderTests/VideoDecoderTest'
'.MultipleValidInputsAfterInvalidKeyFrame/*',
@@ -305,9 +288,6 @@
# Android currently does not support multi-video playback, which
# the following tests depend upon.
- 'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/0',
- 'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/1',
- 'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/2',
- 'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/3',
+ 'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/*',
],
}
diff --git a/src/starboard/android/shared/launcher.py b/src/starboard/android/shared/launcher.py
deleted file mode 100644
index 5a0d6bb..0000000
--- a/src/starboard/android/shared/launcher.py
+++ /dev/null
@@ -1,401 +0,0 @@
-#
-# Copyright 2017 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.
-#
-"""Android implementation of Starboard launcher abstraction."""
-
-import os
-import Queue
-import re
-import socket
-import subprocess
-import sys
-import threading
-import time
-
-import _env # pylint: disable=unused-import
-
-from starboard.android.shared import sdk_utils
-from starboard.tools import abstract_launcher
-
-_APP_PACKAGE_NAME = 'dev.cobalt.coat'
-
-_APP_START_INTENT = 'dev.cobalt.coat/dev.cobalt.app.MainActivity'
-
-# Matches an "adb shell am monitor" error line.
-_RE_ADB_AM_MONITOR_ERROR = re.compile(r'\*\* ERROR')
-
-# String added to queue to indicate process has crashed
-_QUEUE_CODE_CRASHED = 'crashed'
-
-# Args to go/crow, which is started if no other device is attached.
-_CROW_COMMANDLINE = ['/google/data/ro/teams/mobile_eng_prod/crow/crow.par',
- '--api_level', '24', '--device', 'tv',
- '--open_gl_driver', 'host',
- '--noenable_g3_monitor']
-
-# How long to keep logging after a crash in order to emit the stack trace.
-_CRASH_LOG_SECONDS = 1.0
-
-_DEV_NULL = open('/dev/null')
-
-_ADB = os.path.join(sdk_utils.GetSdkPath(), 'platform-tools', 'adb')
-
-_RUNTIME_PERMISSIONS = [
- 'android.permission.GET_ACCOUNTS',
- 'android.permission.RECORD_AUDIO',
-]
-
-
-def TargetOsPathJoin(*path_elements):
- """os.path.join for the target (Android)."""
- return '/'.join(path_elements)
-
-
-def CleanLine(line):
- """Removes trailing carriages returns from ADB output."""
- return line.replace('\r', '')
-
-
-class StepTimer(object):
- """Class for timing how long install/run steps take."""
-
- def __init__(self, step_name):
- self.step_name = step_name
- self.start_time = time.time()
- self.end_time = None
-
- def Stop(self):
- if self.start_time is None:
- sys.stderr.write('Cannot stop timer; not started\n')
- else:
- self.end_time = time.time()
- total_time = self.end_time - self.start_time
- sys.stderr.write('Step \"{}\" took {} seconds.\n'.format(
- self.step_name, total_time))
-
-
-class AdbCommandBuilder(object):
- """Builder for 'adb' commands."""
-
- def __init__(self, device_id):
- self.device_id = device_id
-
- def Build(self, *args):
- """Builds an 'adb' commandline with the given args."""
- result = [_ADB]
- if self.device_id:
- result.append('-s')
- result.append(self.device_id)
- result += list(args)
- return result
-
-
-class AdbAmMonitorWatcher(object):
- """Watches an "adb shell am monitor" process to detect crashes."""
-
- def __init__(self, adb_builder, done_queue):
- self.adb_builder = adb_builder
- self.process = subprocess.Popen(
- adb_builder.Build('shell', 'am', 'monitor'),
- stdout=subprocess.PIPE,
- stderr=_DEV_NULL,
- close_fds=True)
- self.thread = threading.Thread(target=self._Run)
- self.thread.start()
- self.done_queue = done_queue
-
- def Shutdown(self):
- self.process.kill()
- self.thread.join()
-
- def _Run(self):
- while True:
- line = CleanLine(self.process.stdout.readline())
- if not line:
- return
- if re.search(_RE_ADB_AM_MONITOR_ERROR, line):
- self.done_queue.put(_QUEUE_CODE_CRASHED)
- # This log line will wake up the main thread
- subprocess.call(
- self.adb_builder.Build('shell', 'log', '-t', 'starboard',
- 'am monitor detected crash'),
- close_fds=True)
-
-
-class Launcher(abstract_launcher.AbstractLauncher):
- """Run an application on Android."""
-
- def __init__(self, platform, target_name, config, device_id, **kwargs):
-
- super(Launcher, self).__init__(platform, target_name, config, device_id,
- **kwargs)
-
- if not self.device_id:
- self.device_id = self._IdentifyDevice()
- else:
- self._ConnectIfNecessary()
-
- self.adb_builder = AdbCommandBuilder(self.device_id)
-
- out_directory = os.path.split(self.GetTargetPath())[0]
- self.apk_path = os.path.join(out_directory, '{}.apk'.format(target_name))
- if not os.path.exists(self.apk_path):
- raise Exception("Can't find APK {}".format(self.apk_path))
-
- # This flag is set when the main Run() loop exits. If Kill() is called
- # after this flag is set, it will not do anything.
- self.killed = threading.Event()
-
- # Keep track of the port used by ADB forward in order to remove it later
- # on.
- self.local_port = None
-
- def _IsValidIPv4Address(self, address):
- """Returns True if address is a valid IPv4 address, False otherwise."""
- try:
- # inet_aton throws an exception if the address is not a valid IPv4
- # address. However addresses such as '127.1' might still be considered
- # valid, hence the check for 3 '.' in the address.
- if socket.inet_aton(address) and address.count('.') == 3:
- return True
- except:
- pass
- return False
-
- def _GetAdbDevices(self):
- """Returns a list of names of connected devices, or empty list if none."""
-
- # Does not use the ADBCommandBuilder class because this command should be
- # run without targeting a specific device.
- p = subprocess.Popen([_ADB, 'devices'], stderr=_DEV_NULL,
- stdout=subprocess.PIPE, close_fds=True)
- result = p.stdout.readlines()[1:-1]
- p.wait()
-
- names = []
- for device in result:
- name_info = device.split('\t')
- # Some devices may not have authorization for USB debugging.
- try:
- if 'unauthorized' not in name_info[1]:
- names.append(name_info[0])
- # Sometimes happens when device is found, even though none are connected.
- except IndexError:
- continue
- return names
-
- def _IdentifyDevice(self):
- """Picks a device to be used to run the executable.
-
- In the event that no device_id is provided, but multiple
- devices are connected, this method chooses the first device
- listed.
-
- Returns:
- The name of an attached device, or None if no devices are present.
- """
- device_name = None
-
- devices = self._GetAdbDevices()
- if devices:
- device_name = devices[0]
-
- return device_name
-
- def _ConnectIfNecessary(self):
- """Run ADB connect if needed for devices connected over IP."""
- if not self._IsValidIPv4Address(self.device_id):
- return
- for device in self._GetAdbDevices():
- # Devices returned by _GetAdbDevices might include port number, so cannot
- # simply check if self.device_id is in the returned list.
- if self.device_id in device:
- return
-
- # Device isn't connected. Run ADB connect.
- # Does not use the ADBCommandBuilder class because this command should be
- # run without targeting a specific device.
- p = subprocess.Popen([_ADB, 'connect', self.device_id], stderr=_DEV_NULL,
- stdout=subprocess.PIPE, close_fds=True)
- result = p.stdout.readlines()[0]
- p.wait()
-
- if 'connected to' not in result:
- sys.stderr.write('Failed to connect to {}\n'.format(self.device_id))
-
- def _LaunchCrowIfNecessary(self):
- if self.device_id:
- return
-
- # Note that we just leave Crow running, since we uninstall/reinstall
- # each time anyway.
- self._CheckCall(*_CROW_COMMANDLINE)
-
- def _Call(self, *args):
- sys.stderr.write('{}\n'.format(' '.join(args)))
- subprocess.call(args, stdout=_DEV_NULL, stderr=_DEV_NULL,
- close_fds=True)
-
- def _CallAdb(self, *in_args):
- args = self.adb_builder.Build(*in_args)
- self._Call(*args)
-
- def _CheckCall(self, *args):
- sys.stderr.write('{}\n'.format(' '.join(args)))
- subprocess.check_call(args, stdout=_DEV_NULL, stderr=_DEV_NULL,
- close_fds=True)
-
- def _CheckCallAdb(self, *in_args):
- args = self.adb_builder.Build(*in_args)
- self._CheckCall(*args)
-
- def _PopenAdb(self, *args, **kwargs):
- return subprocess.Popen(self.adb_builder.Build(*args), close_fds=True,
- **kwargs)
-
- def Run(self):
- # The return code for binaries run on Android is read from a log line that
- # it emitted in android_main.cc. This return_code variable will be assigned
- # the value read when we see that line, or left at 1 in the event of a crash
- # or early exit.
- return_code = 1
-
- # Setup for running executable
- self._LaunchCrowIfNecessary()
- self._CheckCallAdb('wait-for-device')
- self._Shutdown()
-
- # Clear logcat
- self._CheckCallAdb('logcat', '-c')
-
- # Install the APK.
- install_timer = StepTimer('install')
- self._CheckCallAdb('install', '-r', self.apk_path)
- install_timer.Stop()
-
- # Send the wakeup key to ensure daydream isn't running, otherwise Activity
- # Manager may get in a loop running the test over and over again.
- self._CheckCallAdb('shell', 'input', 'keyevent', 'KEYCODE_WAKEUP')
-
- # Grant runtime permissions to avoid prompts during testing.
- for permission in _RUNTIME_PERMISSIONS:
- self._CheckCallAdb('shell', 'pm', 'grant', _APP_PACKAGE_NAME, permission)
-
- done_queue = Queue.Queue()
- am_monitor = AdbAmMonitorWatcher(self.adb_builder, done_queue)
-
- # Increases the size of the logcat buffer. Without this, the log buffer
- # will not flush quickly enough and output will be cut off.
- self._CheckCallAdb('logcat', '-G', '2M')
-
- # Ctrl + C will kill this process
- logcat_process = self._PopenAdb(
- 'logcat', '-v', 'raw', '-s', '*:F', 'DEBUG:*', 'System.err:*',
- 'starboard:*', 'starboard_media:*',
- stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-
- # Actually running executable
- run_timer = StepTimer('running executable')
- try:
- args = ['shell', 'am', 'start']
- command_line_params = [
- '--android_log_sleep_time=1000',
- '--disable_sign_in',
- ]
- if self.target_command_line_params:
- command_line_params += self.target_command_line_params
- args += ['--esa', 'args', "'{}'".format(','.join(command_line_params))]
- args += [_APP_START_INTENT]
-
- self._CheckCallAdb(*args)
-
- app_crashed = False
- while True:
- if not done_queue.empty():
- done_queue_code = done_queue.get_nowait()
- if done_queue_code == _QUEUE_CODE_CRASHED:
- app_crashed = True
- threading.Timer(_CRASH_LOG_SECONDS, logcat_process.kill).start()
-
- # Note we cannot use "for line in logcat_process.stdout" because
- # that uses a large buffer which will cause us to deadlock.
- line = CleanLine(logcat_process.stdout.readline())
-
- # Some crashes are not caught by the am_monitor thread, but they do
- # produce the following string in logcat before they exit.
- if 'beginning of crash' in line:
- app_crashed = True
- threading.Timer(_CRASH_LOG_SECONDS, logcat_process.kill).start()
-
- if not line: # Logcat exited, or was killed
- break
- else:
- self._WriteLine(line)
- # Don't break until we see the below text in logcat, which should be
- # written when the Starboard application event loop finishes.
- if '***Application Stopped***' in line:
- try:
- return_code = int(line.split(' ')[-1])
- except ValueError: # Error message was printed to stdout
- pass
- logcat_process.kill()
- break
-
- finally:
- if app_crashed:
- self._WriteLine('***Application Crashed***\n')
- else:
- self._Shutdown()
- if self.local_port is not None:
- self._CallAdb('forward', '--remove', 'tcp:{}'.format(self.local_port))
- am_monitor.Shutdown()
- self.killed.set()
- run_timer.Stop()
- if logcat_process.poll() is None:
- # This could happen when using SIGINT to kill the launcher
- # (e.g. when using starboard/tools/example/app_launcher_client.py).
- sys.stderr.write('Logcat process is still running. Killing it now.\n')
- logcat_process.kill()
-
- return return_code
-
- def _Shutdown(self):
- self._CallAdb('shell', 'am', 'force-stop', _APP_PACKAGE_NAME)
-
- def Kill(self):
- if not self.killed.is_set():
- sys.stderr.write('***Killing Launcher***\n')
- self._CheckCallAdb('shell', 'log', '-t', 'starboard',
- '***Application Stopped*** 1')
- self._Shutdown()
- else:
- sys.stderr.write('Cannot kill launcher: already dead.\n')
-
- def _WriteLine(self, line):
- """Write log output to stdout."""
- self.output_file.write(line)
- self.output_file.flush()
-
- def GetHostAndPortGivenPort(self, port):
- forward_p = self._PopenAdb(
- 'forward', 'tcp:0', 'tcp:{}'.format(port),
- stdout=subprocess.PIPE,
- stderr=_DEV_NULL)
- forward_p.wait()
-
- self.local_port = CleanLine(forward_p.stdout.readline()).rstrip('\n')
- sys.stderr.write('ADB forward local port {} '
- '=> device port {}\n'.format(self.local_port, port))
- return socket.gethostbyname('localhost'), self.local_port
diff --git a/src/starboard/android/shared/media_codec_bridge.cc b/src/starboard/android/shared/media_codec_bridge.cc
index 8b4daa4..01ed2e3 100644
--- a/src/starboard/android/shared/media_codec_bridge.cc
+++ b/src/starboard/android/shared/media_codec_bridge.cc
@@ -24,6 +24,8 @@
// https://developer.android.com/reference/android/media/MediaFormat.html#COLOR_RANGE_FULL.
const jint COLOR_RANGE_FULL = 1;
const jint COLOR_RANGE_LIMITED = 2;
+// Not defined in MediaFormat. Represents unspecified color ID range.
+const jint COLOR_RANGE_UNSPECIFIED = 0;
const jint COLOR_STANDARD_BT2020 = 6;
const jint COLOR_STANDARD_BT601_NTSC = 4;
@@ -70,6 +72,8 @@
return COLOR_RANGE_LIMITED;
case kSbMediaRangeIdFull:
return COLOR_RANGE_FULL;
+ case kSbMediaRangeIdUnspecified:
+ return COLOR_RANGE_UNSPECIFIED;
default:
return COLOR_VALUE_UNKNOWN;
}
@@ -254,18 +258,6 @@
j_reused_get_output_format_result_ = NULL;
}
-DequeueInputResult MediaCodecBridge::DequeueInputBuffer(jlong timeout_us) {
- JniEnvExt* env = JniEnvExt::Get();
- env->CallVoidMethodOrAbort(
- j_media_codec_bridge_, "dequeueInputBuffer",
- "(JLdev/cobalt/media/MediaCodecBridge$DequeueInputResult;)V", timeout_us,
- j_reused_dequeue_input_result_);
- return {env->CallIntMethodOrAbort(j_reused_dequeue_input_result_, "status",
- "()I"),
- env->CallIntMethodOrAbort(j_reused_dequeue_input_result_, "index",
- "()I")};
-}
-
jobject MediaCodecBridge::GetInputBuffer(jint index) {
SB_DCHECK(index >= 0);
return JniEnvExt::Get()->CallObjectMethodOrAbort(
@@ -318,26 +310,6 @@
presentation_time_microseconds);
}
-DequeueOutputResult MediaCodecBridge::DequeueOutputBuffer(jlong timeout_us) {
- JniEnvExt* env = JniEnvExt::Get();
- env->CallVoidMethodOrAbort(
- j_media_codec_bridge_, "dequeueOutputBuffer",
- "(JLdev/cobalt/media/MediaCodecBridge$DequeueOutputResult;)V", timeout_us,
- j_reused_dequeue_output_result_);
- return {env->CallIntMethodOrAbort(j_reused_dequeue_output_result_, "status",
- "()I"),
- env->CallIntMethodOrAbort(j_reused_dequeue_output_result_, "index",
- "()I"),
- env->CallIntMethodOrAbort(j_reused_dequeue_output_result_, "flags",
- "()I"),
- env->CallIntMethodOrAbort(j_reused_dequeue_output_result_, "offset",
- "()I"),
- env->CallLongMethodOrAbort(j_reused_dequeue_output_result_,
- "presentationTimeMicroseconds", "()J"),
- env->CallIntMethodOrAbort(j_reused_dequeue_output_result_, "numBytes",
- "()I")};
-}
-
jobject MediaCodecBridge::GetOutputBuffer(jint index) {
SB_DCHECK(index >= 0);
return JniEnvExt::Get()->CallObjectMethodOrAbort(
diff --git a/src/starboard/android/shared/media_decoder.cc b/src/starboard/android/shared/media_decoder.cc
index c47c126..fe757cc 100644
--- a/src/starboard/android/shared/media_decoder.cc
+++ b/src/starboard/android/shared/media_decoder.cc
@@ -303,7 +303,11 @@
if (is_valid()) {
host_->OnFlushing();
-
+ // After |decoder_thread_| is ended and before |media_codec_bridge_| is
+ // flushed, OnMediaCodecOutputBufferAvailable() would still be called.
+ // So that, |dequeue_output_results_| may not be empty. As we call
+ // JoinOnThreads() in destructor and DequeueOutputResult is consisted of
+ // plain data, it's fine to let destructor delete |dequeue_output_results_|.
jint status = media_codec_bridge_->Flush();
if (status != MEDIA_CODEC_OK) {
SB_LOG(ERROR) << "Failed to flush media codec.";
diff --git a/src/starboard/android/shared/player_create.cc b/src/starboard/android/shared/player_create.cc
index 800735b..ffa2260 100644
--- a/src/starboard/android/shared/player_create.cc
+++ b/src/starboard/android/shared/player_create.cc
@@ -28,7 +28,6 @@
using starboard::android::shared::cobalt::kPlaying;
using starboard::android::shared::cobalt::
UpdateActiveSessionPlatformPlaybackState;
-using starboard::android::shared::cobalt::UpdateActiveSessionPlatformPlayer;
SbPlayer SbPlayerCreate(SbWindow window,
SbMediaVideoCodec video_codec,
@@ -116,7 +115,5 @@
// matter.
SbPlayerSetBounds(player, 0, 0, 0, 0, 0);
- UpdateActiveSessionPlatformPlayer(player);
-
return player;
}
diff --git a/src/starboard/android/shared/player_destroy.cc b/src/starboard/android/shared/player_destroy.cc
index b1b5a96..b790729 100644
--- a/src/starboard/android/shared/player_destroy.cc
+++ b/src/starboard/android/shared/player_destroy.cc
@@ -20,13 +20,11 @@
using starboard::android::shared::cobalt::kNone;
using starboard::android::shared::cobalt::
UpdateActiveSessionPlatformPlaybackState;
-using starboard::android::shared::cobalt::UpdateActiveSessionPlatformPlayer;
void SbPlayerDestroy(SbPlayer player) {
if (!SbPlayerIsValid(player)) {
return;
}
UpdateActiveSessionPlatformPlaybackState(kNone);
- UpdateActiveSessionPlatformPlayer(kSbPlayerInvalid);
delete player;
}
diff --git a/src/starboard/android/shared/starboard_platform.gypi b/src/starboard/android/shared/starboard_platform.gypi
index 977c928..186c9df 100644
--- a/src/starboard/android/shared/starboard_platform.gypi
+++ b/src/starboard/android/shared/starboard_platform.gypi
@@ -62,6 +62,9 @@
'audio_decoder.h',
'audio_renderer.h',
'audio_sink_get_max_channels.cc',
+ 'audio_sink_get_min_buffer_size_in_frames.cc',
+ 'audio_sink_min_required_frames_tester.cc',
+ 'audio_sink_min_required_frames_tester.h',
'audio_sink_get_nearest_supported_sample_frequency.cc',
'audio_sink_is_audio_frame_storage_type_supported.cc',
'audio_sink_is_audio_sample_type_supported.cc',
@@ -444,6 +447,7 @@
'<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
'<(DEPTH)/starboard/shared/stub/system_request_pause.cc',
'<(DEPTH)/starboard/shared/stub/system_request_unpause.cc',
+ '<(DEPTH)/starboard/shared/stub/system_sign_with_certification_secret_key.cc',
'<(DEPTH)/starboard/shared/stub/thread_context_get_pointer.cc',
'<(DEPTH)/starboard/shared/stub/thread_sampler_create.cc',
'<(DEPTH)/starboard/shared/stub/thread_sampler_destroy.cc',
diff --git a/src/starboard/android/shared/video_decoder.cc b/src/starboard/android/shared/video_decoder.cc
index 4d3400a..227b54c 100644
--- a/src/starboard/android/shared/video_decoder.cc
+++ b/src/starboard/android/shared/video_decoder.cc
@@ -61,9 +61,6 @@
if (!released_) {
media_codec_bridge_->ReleaseOutputBuffer(dequeue_output_result_.index,
false);
- if (is_end_of_stream()) {
- media_codec_bridge_->Flush();
- }
}
}
@@ -166,10 +163,7 @@
output_mode_(output_mode),
decode_target_graphics_context_provider_(
decode_target_graphics_context_provider),
- decode_target_(kSbDecodeTargetInvalid),
- frame_width_(0),
- frame_height_(0),
- first_buffer_received_(false),
+ has_new_texture_available_(false),
surface_condition_variable_(surface_destroy_mutex_) {
if (!InitializeCodec()) {
SB_LOG(ERROR) << "Failed to initialize video decoder.";
@@ -245,11 +239,17 @@
SB_LOG(ERROR) << "Failed to reinitialize codec.";
TeardownCodec();
error_cb_(kSbPlayerErrorDecode, "Cannot initialize codec.");
+ return;
}
}
}
-
+ // There's a race condition when suspending the app. If surface view is
+ // destroyed before video decoder stopped, |media_decoder_| could be null
+ // here. And error_cb_() could be handled asynchronously. It's possible
+ // that WriteInputBuffer() is called again when the first WriteInputBuffer()
+ // fails, in such case is_valid() will also return false.
if (!is_valid()) {
+ SB_LOG(INFO) << "Trying to write input buffer when codec is not available.";
return;
}
media_decoder_->WriteInputBuffer(input_buffer);
@@ -262,11 +262,22 @@
SB_DCHECK(decoder_status_cb_);
if (!first_buffer_received_) {
+ // In this case, |media_decoder_|'s decoder thread is not initialized.
+ // Return EOS frame directly.
first_buffer_received_ = true;
first_buffer_timestamp_ = 0;
+ decoder_status_cb_(kBufferFull, VideoFrame::CreateEOSFrame());
+ return;
}
+ // There's a race condition when suspending the app. If surface view is
+ // destroyed before video decoder stopped, |media_decoder_| could be null
+ // here. And error_cb_() could be handled asynchronously. It's possible
+ // that WriteEndOfStream() is called immediately after the first
+ // WriteInputBuffer() fails, in such case is_valid() will also return false.
if (!is_valid()) {
+ SB_LOG(INFO)
+ << "Trying to write end of stream when codec is not available.";
return;
}
media_decoder_->WriteEndOfStream();
@@ -306,6 +317,10 @@
}
j_output_surface = decode_target->data->surface;
+ JniEnvExt* env = JniEnvExt::Get();
+ env->CallVoidMethodOrAbort(decode_target->data->surface_texture,
+ "setOnFrameAvailableListener", "(J)V", this);
+
starboard::ScopedLock lock(decode_target_mutex_);
decode_target_ = decode_target;
} break;
@@ -349,11 +364,34 @@
media_decoder_.reset();
color_metadata_ = starboard::nullopt;
- starboard::ScopedLock lock(decode_target_mutex_);
- if (SbDecodeTargetIsValid(decode_target_)) {
+ SbDecodeTarget decode_target_to_release = kSbDecodeTargetInvalid;
+ {
+ starboard::ScopedLock lock(decode_target_mutex_);
+ if (SbDecodeTargetIsValid(decode_target_)) {
+ // Remove OnFrameAvailableListener to make sure the callback
+ // would not be called.
+ JniEnvExt* env = JniEnvExt::Get();
+ env->CallVoidMethodOrAbort(decode_target_->data->surface_texture,
+ "removeOnFrameAvailableListener", "()V");
+
+ decode_target_to_release = decode_target_;
+ decode_target_ = kSbDecodeTargetInvalid;
+ first_texture_received_ = false;
+ has_new_texture_available_.store(false);
+ } else {
+ // If |decode_target_| is not created, |first_texture_received_| and
+ // |has_new_texture_available_| should always be false.
+ SB_DCHECK(!first_texture_received_);
+ SB_DCHECK(!has_new_texture_available_.load());
+ }
+ }
+ // Release SbDecodeTarget on renderer thread. As |decode_target_mutex_| may
+ // be required in renderer thread, SbDecodeTargetReleaseInGlesContext() must
+ // be called when |decode_target_mutex_| is not locked, or we may get
+ // deadlock.
+ if (SbDecodeTargetIsValid(decode_target_to_release)) {
SbDecodeTargetReleaseInGlesContext(decode_target_graphics_context_provider_,
- decode_target_);
- decode_target_ = kSbDecodeTargetInvalid;
+ decode_target_to_release);
}
}
@@ -481,32 +519,43 @@
// We must take a lock here since this function can be called from a separate
// thread.
starboard::ScopedLock lock(decode_target_mutex_);
-
if (SbDecodeTargetIsValid(decode_target_)) {
- updateTexImage(decode_target_->data->surface_texture);
+ bool has_new_texture = has_new_texture_available_.exchange(false);
+ if (has_new_texture) {
+ updateTexImage(decode_target_->data->surface_texture);
- float matrix4x4[16];
- getTransformMatrix(decode_target_->data->surface_texture, matrix4x4);
- SetDecodeTargetContentRegionFromMatrix(
- &decode_target_->data->info.planes[0].content_region, 1, 1, matrix4x4);
+ float matrix4x4[16];
+ getTransformMatrix(decode_target_->data->surface_texture, matrix4x4);
+ SetDecodeTargetContentRegionFromMatrix(
+ &decode_target_->data->info.planes[0].content_region, 1, 1,
+ matrix4x4);
- // Mark the decode target's width and height as 1, so that the
- // |content_region|'s coordinates will be interpreted as normalized
- // coordinates. This is nice because on Android we're never explicitly
- // told the texture width/height, and we are only provided the content
- // region via normalized coordinates.
- decode_target_->data->info.planes[0].width = 1;
- decode_target_->data->info.planes[0].height = 1;
- decode_target_->data->info.width = 1;
- decode_target_->data->info.height = 1;
+ // Mark the decode target's width and height as 1, so that the
+ // |content_region|'s coordinates will be interpreted as normalized
+ // coordinates. This is nice because on Android we're never explicitly
+ // told the texture width/height, and we are only provided the content
+ // region via normalized coordinates.
+ decode_target_->data->info.planes[0].width = 1;
+ decode_target_->data->info.planes[0].height = 1;
+ decode_target_->data->info.width = 1;
+ decode_target_->data->info.height = 1;
- SbDecodeTarget out_decode_target = new SbDecodeTargetPrivate;
- out_decode_target->data = decode_target_->data;
+ if (!first_texture_received_) {
+ first_texture_received_ = true;
+ }
+ }
- return out_decode_target;
- } else {
- return kSbDecodeTargetInvalid;
+ if (first_texture_received_) {
+ SbDecodeTarget out_decode_target = new SbDecodeTargetPrivate;
+ out_decode_target->data = decode_target_->data;
+ return out_decode_target;
+ }
}
+ return kSbDecodeTargetInvalid;
+}
+
+void VideoDecoder::OnNewTextureAvailable() {
+ has_new_texture_available_.store(true);
}
void VideoDecoder::OnSurfaceDestroyed() {
@@ -527,3 +576,16 @@
} // namespace shared
} // namespace android
} // namespace starboard
+
+extern "C" SB_EXPORT_PLATFORM void
+Java_dev_cobalt_media_VideoSurfaceTexture_nativeOnFrameAvailable(
+ JNIEnv* env,
+ jobject unused_this,
+ jlong native_video_decoder) {
+ using starboard::android::shared::VideoDecoder;
+
+ VideoDecoder* video_decoder =
+ reinterpret_cast<VideoDecoder*>(native_video_decoder);
+ SB_DCHECK(video_decoder);
+ video_decoder->OnNewTextureAvailable();
+}
diff --git a/src/starboard/android/shared/video_decoder.h b/src/starboard/android/shared/video_decoder.h
index ef5964c..18f3730 100644
--- a/src/starboard/android/shared/video_decoder.h
+++ b/src/starboard/android/shared/video_decoder.h
@@ -62,6 +62,11 @@
const ErrorCB& error_cb) override;
size_t GetPrerollFrameCount() const override;
SbTime GetPrerollTimeout() const override;
+ // As we hold output buffers received from MediaCodec, the max number of
+ // cached frames depends on the max number of output buffers in MediaCodec,
+ // which is device dependent. The media decoder may stall if we hold all
+ // output buffers. But it would continue working once we release output
+ // buffer.
size_t GetMaxNumberOfCachedFrames() const override { return 12; }
void WriteInputBuffer(const scoped_refptr<InputBuffer>& input_buffer)
@@ -72,6 +77,8 @@
bool is_valid() const { return media_decoder_ != NULL; }
+ void OnNewTextureAvailable();
+
private:
// Attempt to initialize the codec. Returns whether initialization was
// successful.
@@ -100,7 +107,7 @@
// If decode-to-texture is enabled, then we store the decode target texture
// inside of this |decode_target_| member.
- SbDecodeTarget decode_target_;
+ SbDecodeTarget decode_target_ = kSbDecodeTargetInvalid;
// Since GetCurrentDecodeTarget() needs to be called from an arbitrary thread
// to obtain the current decode target (which ultimately ends up being a
@@ -109,8 +116,8 @@
starboard::Mutex decode_target_mutex_;
// The width and height of the latest decoded frame.
- int32_t frame_width_;
- int32_t frame_height_;
+ int32_t frame_width_ = 0;
+ int32_t frame_height_ = 0;
// The last enqueued |SbMediaColorMetadata|.
optional<SbMediaColorMetadata> color_metadata_;
@@ -120,8 +127,10 @@
atomic_int32_t number_of_frames_being_decoded_;
scoped_refptr<Sink> sink_;
- bool first_buffer_received_;
+ bool first_buffer_received_ = false;
+ bool first_texture_received_ = false;
volatile SbTime first_buffer_timestamp_;
+ atomic_bool has_new_texture_available_;
// Use |owns_video_surface_| only on decoder thread, to avoid unnecessary
// invocation of ReleaseVideoSurface(), though ReleaseVideoSurface() would
diff --git a/src/starboard/audio_sink.h b/src/starboard/audio_sink.h
index cab09dc..c0655b8 100644
--- a/src/starboard/audio_sink.h
+++ b/src/starboard/audio_sink.h
@@ -170,6 +170,25 @@
SB_EXPORT bool SbAudioSinkIsAudioFrameStorageTypeSupported(
SbMediaAudioFrameStorageType audio_frame_storage_type);
+#if SB_API_VERSION >= 11
+// Returns the minimum frames required by audio sink to play without underflows.
+// Returns -1, if |channels|, |sample_type| or |sampling_frequency_hz| is not
+// supported. It's user's responsibility to ensure that there're enough
+// frames written into audio sink during playing, or it may have underflows.
+//
+// |channels|: The number of audio channels, such as left and right channels
+// in stereo audio.
+// |audio_sample_type|: The type of each sample of the audio data --
+// |int16|, |float32|, etc.
+// |sampling_frequency_hz|: The sample frequency of the audio data being
+// streamed. For example, 22,000 Hz means 22,000 sample elements represents
+// one second of audio data.
+SB_EXPORT int SbAudioSinkGetMinBufferSizeInFrames(
+ int channels,
+ SbMediaAudioSampleType sample_type,
+ int sampling_frequency_hz);
+#endif // SB_API_VERSION >= 11
+
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/src/starboard/build/filelist.py b/src/starboard/build/filelist.py
index c2ec006..c42f2f9 100644
--- a/src/starboard/build/filelist.py
+++ b/src/starboard/build/filelist.py
@@ -34,8 +34,8 @@
"""Makes it easy to include files for things like archive operations."""
def __init__(self):
- self.file_list = [] # List of 2-tuples: file_path, archive_path
- self.symlink_dir_list = [] # Same
+ self.file_list = [] # List of (file_path, archive_path)
+ self.symlink_dir_list = [] # List of (file_path, link_path, target_path)
def AddAllFilesInPath(self, root_dir, sub_path):
"""Starting at the root path, the sub_paths are searched for files."""
@@ -45,12 +45,16 @@
self.AddFile(root_dir, sub_path)
elif not os.path.isdir(sub_path):
raise IOError('Expected root directory to exist: %s' % sub_path)
+ cwd = os.getcwd()
for root, dirs, files in port_symlink.OsWalk(sub_path):
+ # Do not use os.path.abspath as it does not work on Win for long paths.
+ if not os.path.isabs(root):
+ root = os.path.join(cwd, root)
for f in files:
- full_path = os.path.abspath(os.path.join(root, f))
+ full_path = os.path.join(root, f)
all_files.append(full_path)
for dir_name in dirs:
- full_path = os.path.abspath(os.path.join(root, dir_name))
+ full_path = os.path.join(root, dir_name)
if port_symlink.IsSymLink(full_path):
all_symlinks.append(full_path)
for f in all_files + all_symlinks:
@@ -84,11 +88,19 @@
def _ResolveSymLink(link_file):
+ """Returns the absolute path of the resolved link. This path should exist."""
target_path = port_symlink.ReadSymLink(link_file)
- if os.path.exists(target_path): # Absolute path
+ if os.path.isabs(target_path): # Absolute path
+ assert os.path.exists(target_path), (
+ 'Path {} does not exist.'.format(target_path))
return target_path
- else:
- return os.path.join(link_file, target_path) # Relative path from link_file.
+ else: # Relative path from link_file.
+ abs_path = os.path.normpath(
+ os.path.join(os.path.dirname(link_file), target_path))
+ assert os.path.exists(abs_path), (
+ 'Path {} does not exist (link file: {}, target_path: {})'.format(
+ abs_path, link_file, target_path))
+ return abs_path
def _FallbackOsGetRelPath(path, start_dir):
@@ -103,24 +115,26 @@
def _OsGetRelpath(path, start_dir):
+ path = os.path.normpath(path)
+ start_dir = os.path.normpath(start_dir)
+ # Use absolute paths for Windows (nt paths checks the drive specifier).
+ # Do not use os.path.abspath as it does not work on Win for long paths.
+ if not os.path.isabs(path):
+ path = os.path.join(os.getcwd(), path)
+ if not os.path.isabs(start_dir):
+ start_dir = os.path.join(os.getcwd(), start_dir)
try:
return os.path.relpath(path, start_dir)
except ValueError:
try:
- # Windows: nt paths checks the drive specifier, which is given by the
- # abspath operation.
- return os.path.relpath(os.path.abspath(path), os.path.abspath(start_dir))
- except ValueError:
- try:
- # Last resort: do a string comparison to get relative path.
- # Fixes issue b/134589032
- rel_path = _FallbackOsGetRelPath(path, start_dir)
- if not os.path.exists(os.path.join(start_dir, rel_path)):
- raise ValueError('% does not exist.' % os.path.abspath(rel_path))
- return rel_path
- except ValueError as err:
- logging.exception('Error %s while calling os.path.relpath(%s, %s)',
- err, path, start_dir)
+ # Do a string comparison to get relative path.
+ rel_path = _FallbackOsGetRelPath(path, start_dir)
+ if not os.path.exists(os.path.join(start_dir, rel_path)):
+ raise ValueError('%s does not exist.' % os.path.abspath(rel_path))
+ return rel_path
+ except ValueError as err:
+ logging.exception('Error %s while calling os.path.relpath(%s, %s)',
+ err, path, start_dir)
TYPE_NONE = 'NONE'
diff --git a/src/starboard/build/filelist_test.py b/src/starboard/build/filelist_test.py
index 7463ebb..34fc71b 100644
--- a/src/starboard/build/filelist_test.py
+++ b/src/starboard/build/filelist_test.py
@@ -21,18 +21,32 @@
import _env # pylint: disable=relative-import,unused-import
+from cobalt.build import cobalt_archive_extract
from starboard.build import filelist
from starboard.build import port_symlink
from starboard.tools import util
+LONG_DIR_NAME_1 = 'really_l' + 'o' * 120 + 'ng_dir_name'
+LONG_DIR_NAME_2 = 'another_really_l' + 'o' * 120 + 'ng_dir_name'
+LONG_SUB_DIRS = os.path.join(LONG_DIR_NAME_1, LONG_DIR_NAME_2)
+
+
def _MakeDirs(path):
if not os.path.isdir(path):
os.makedirs(path)
class TempFileSystem(object):
- """Generates a test file structure with file/dir/symlink for testing."""
+ """Generates a test file structure with file/dir/symlink for testing.
+
+ <temp_dir>
+ |-> <root_sub_dir>
+ | |-> in
+ | | |-> from_dir
+ | | | |-> test.txt
+ | | |-> from_dir_lnk -> <temp_dir>/<root_sub_dir>/in/from_dir
+ """
def __init__(self, root_sub_dir='bundler'):
root_sub_dir = os.path.normpath(root_sub_dir)
@@ -40,9 +54,9 @@
if os.path.exists(self.root_tmp):
port_symlink.Rmtree(self.root_tmp)
self.root_in_tmp = os.path.join(self.root_tmp, 'in')
- self.test_txt = os.path.join(self.root_in_tmp, 'from_dir', 'test.txt')
self.sym_dir = os.path.join(self.root_in_tmp, 'from_dir_lnk')
self.from_dir = os.path.join(self.root_in_tmp, 'from_dir')
+ self.test_txt = os.path.join(self.from_dir, 'test.txt')
def Make(self):
_MakeDirs(self.root_in_tmp)
@@ -51,6 +65,15 @@
with open(self.test_txt, 'w') as fd:
fd.write('TEST')
+ def MakeLongPathFile(self):
+ long_path_txt = os.path.join(self.from_dir, LONG_SUB_DIRS, 'test2.txt')
+ self.long_path_txt = long_path_txt
+ if port_symlink.IsWindows():
+ long_path_txt = cobalt_archive_extract.ToWinUncPath(long_path_txt)
+ _MakeDirs(os.path.dirname(long_path_txt))
+ with open(long_path_txt, 'w') as fd:
+ fd.write('TEST BIS')
+
def Clear(self):
port_symlink.Rmtree(self.root_tmp)
@@ -99,10 +122,15 @@
def testAddAllFilesInPath(self):
tf = TempFileSystem()
tf.Make()
+ tf.MakeLongPathFile()
flist = filelist.FileList()
flist.AddAllFilesInPath(tf.root_in_tmp, tf.root_in_tmp)
self.assertTrue(flist.symlink_dir_list)
- self.assertTrue(flist.file_list)
+ expected_file_list = [
+ [tf.test_txt, os.path.join('from_dir', 'test.txt')],
+ [tf.long_path_txt,
+ os.path.join('from_dir', LONG_SUB_DIRS , 'test2.txt')]]
+ self.assertEqual(flist.file_list, expected_file_list)
def testAddSymlink(self):
tf = TempFileSystem()
@@ -114,27 +142,30 @@
self.assertFalse(flist.file_list)
def testAddRelativeSymlink(self):
- """Tests the that adding a relative symlink works as expected."""
+ """Tests that adding a relative symlink works as expected."""
tf = TempFileSystem()
tf.Make()
flist = filelist.FileList()
- in2 = os.path.join(tf.root_in_tmp, 'in2')
- target_path = os.path.relpath(tf.from_dir, in2)
+ in2 = os.path.join(tf.root_in_tmp, 'subdir', 'in2')
+ target_path = os.path.relpath(tf.from_dir, os.path.dirname(in2))
# Sanity check that target_path is relative.
- self.assertIn('..', target_path)
+ self.assertEqual(target_path, os.path.join('..', 'from_dir'))
+ # Create the link and check that it points to the correct folder.
port_symlink.MakeSymLink(target_path, in2)
self.assertTrue(port_symlink.IsSymLink(in2))
- read_back_target_path = port_symlink.ReadSymLink(in2)
- self.assertIn('..', read_back_target_path)
+ self.assertEqual(port_symlink.ReadSymLink(in2), target_path)
+ self.assertEqual(os.listdir(in2), ['test.txt'])
+ # Add the symlink to flist and check its content.
flist.AddFile(tf.root_tmp, in2)
flist.Print()
self.assertTrue(flist.symlink_dir_list)
- symlink_entry = flist.symlink_dir_list[0][1:]
- expected = [os.path.join('in', 'in2'), os.path.join('in', 'from_dir')]
- self.assertEqual(expected, symlink_entry)
+ expected = [
+ tf.root_tmp,
+ os.path.join('in', 'subdir', 'in2'),
+ os.path.join('in', 'from_dir')]
+ self.assertEqual(flist.symlink_dir_list[0], expected)
def testOsGetRelpathFallback(self):
- # Tests issue b/134589032
path = (
'src/out/tmp/cobalt_archive/archive/____app_launcher/third_party/'
'web_platform_tests/custom-elements/registering-custom-elements/'
diff --git a/src/starboard/build/platform_configuration.py b/src/starboard/build/platform_configuration.py
index 6ef6650..61ce79a 100644
--- a/src/starboard/build/platform_configuration.py
+++ b/src/starboard/build/platform_configuration.py
@@ -106,7 +106,7 @@
Args:
application_name: The name of the application to load, in a canonical
- filesystem-friendly form.
+ filesystem-friendly form.
Returns:
An instance of ApplicationConfiguration defined for the application being
@@ -143,7 +143,9 @@
return self._application_configuration
def SetupPlatformTools(self, build_number):
- """Install tools, SDKs, etc. needed to build for the platform.
+ """Install tools, SDKs, etc.
+
+ needed to build for the platform.
Installs tools needed to build for this platform, possibly downloading
and/or interacting with the user to do so. Raises a RuntimeError if the
@@ -232,7 +234,7 @@
# Which JavaScript engine to use. Currently, both SpiderMonkey 45 and
# V8 are supported. Note that V8 can only be used on platforms that
# support JIT.
- 'javascript_engine': 'mozjs-45',
+ 'javascript_engine': 'v8',
# Disable JIT and run in interpreter-only mode by default. It can be
# set to 1 to run in JIT mode. For SpiderMonkey in particular, we
@@ -240,7 +242,7 @@
# execution and lower memory usage. Setting this to 0 for engine that
# requires JIT, or 1 on a platform that does not support JIT, is a
# usage error.
- 'cobalt_enable_jit': 0,
+ 'cobalt_enable_jit': 1,
# TODO: Remove these compatibility variables.
'cobalt_config': config_name,
diff --git a/src/starboard/build/port_symlink.py b/src/starboard/build/port_symlink.py
index 33c417b..ec9f46c 100644
--- a/src/starboard/build/port_symlink.py
+++ b/src/starboard/build/port_symlink.py
@@ -104,7 +104,7 @@
def _ReadSymLink(link_path):
- """Returns a absolute path to the folder referred to by the link_path."""
+ """Returns the path (abs. or rel.) to the folder referred to by link_path."""
if IsWindows():
# pylint: disable=g-import-not-at-top
from starboard.build import win_symlink
diff --git a/src/starboard/build/win_symlink.py b/src/starboard/build/win_symlink.py
index ef9ac07..1992561 100644
--- a/src/starboard/build/win_symlink.py
+++ b/src/starboard/build/win_symlink.py
@@ -31,6 +31,8 @@
import subprocess
import time
+from cobalt.build import cobalt_archive_extract
+
################################################################################
# API #
@@ -278,15 +280,20 @@
def _OsWalk(top, topdown, onerror, followlinks):
"""See api version of OsWalk above, for docstring."""
+ # Need an absolute path to use listdir and isdir with long paths.
+ top_abs_path = top
+ if not os.path.isabs(top_abs_path):
+ top_abs_path = os.path.join(os.getcwd(), top_abs_path)
+ top_abs_path = cobalt_archive_extract.ToWinUncPath(top)
try:
- names = os.listdir(top)
+ names = os.listdir(top_abs_path)
except OSError as err:
if onerror is not None:
onerror(err)
return
dirs, nondirs = [], []
for name in names:
- if os.path.isdir(os.path.join(top, name)):
+ if os.path.isdir(os.path.join(top_abs_path, name)):
dirs.append(name)
else:
nondirs.append(name)
diff --git a/src/starboard/build/win_symlink_fast.py b/src/starboard/build/win_symlink_fast.py
index e5c33af..7e8942f 100644
--- a/src/starboard/build/win_symlink_fast.py
+++ b/src/starboard/build/win_symlink_fast.py
@@ -119,7 +119,9 @@
IO_REPARSE_TAG_SYMLINK = 0xA000000C
MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 0x4000
SYMBOLIC_LINK_FLAG_DIRECTORY = 0x1
+# Developer Mode must be enabled in order to use the following flag.
SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE = 0x2
+SYMLINK_FLAG_RELATIVE = 0x1
class GenericReparseBuffer(ctypes.Structure):
@@ -143,6 +145,16 @@
offset = type(self).PathBuffer.offset + self.PrintNameOffset
return arrayt.from_address(ctypes.addressof(self) + offset).value
+ @property
+ def substitute_name(self):
+ arrayt = WCHAR * (self.SubstituteNameLength // 2)
+ offset = type(self).PathBuffer.offset + self.SubstituteNameOffset
+ return arrayt.from_address(ctypes.addressof(self) + offset).value
+
+ @property
+ def is_relative_path(self):
+ return bool(self.Flags & SYMLINK_FLAG_RELATIVE)
+
class MountPointReparseBuffer(ctypes.Structure):
"""Win32 api data structure."""
@@ -158,6 +170,12 @@
offset = type(self).PathBuffer.offset + self.PrintNameOffset
return arrayt.from_address(ctypes.addressof(self) + offset).value
+ @property
+ def substitute_name(self):
+ arrayt = WCHAR * (self.SubstituteNameLength // 2)
+ offset = type(self).PathBuffer.offset + self.SubstituteNameOffset
+ return arrayt.from_address(ctypes.addressof(self) + offset).value
+
class ReparseDataBuffer(ctypes.Structure):
"""Win32 api data structure."""
diff --git a/src/starboard/common/log.h b/src/starboard/common/log.h
index bc8caf1..c7e34e5 100644
--- a/src/starboard/common/log.h
+++ b/src/starboard/common/log.h
@@ -123,9 +123,19 @@
#define SB_LAZY_STREAM(stream, condition) \
!(condition) ? (void)0 : ::starboard::logging::LogMessageVoidify() & (stream)
+#if SB_LOGGING_IS_OFFICIAL_BUILD
+#define SB_LOG_IS_ON(severity) \
+ (::starboard::logging::SB_LOG_##severity >= \
+ ::starboard::logging::SB_LOG_FATAL) \
+ ? ((::starboard::logging::SB_LOG_##severity) >= \
+ ::starboard::logging::GetMinLogLevel()) \
+ : false
+#else // SB_LOGGING_IS_OFFICIAL_BUILD
#define SB_LOG_IS_ON(severity) \
((::starboard::logging::SB_LOG_##severity) >= \
- ::starboard::logging::GetMinLogLevel())
+ ::starboard::logging::GetMinLogLevel())
+#endif // SB_LOGGING_IS_OFFICIAL_BUILD
+
#define SB_LOG_IF(severity, condition) \
SB_LAZY_STREAM(SB_LOG_STREAM(severity), SB_LOG_IS_ON(severity) && (condition))
#define SB_LOG(severity) SB_LOG_IF(severity, true)
diff --git a/src/starboard/common/rwlock.cc b/src/starboard/common/rwlock.cc
index 0a9c867..3e54d03 100644
--- a/src/starboard/common/rwlock.cc
+++ b/src/starboard/common/rwlock.cc
@@ -14,50 +14,61 @@
#include "starboard/common/rwlock.h"
+#include "starboard/common/log.h"
+
namespace starboard {
-RWLock::RWLock() : num_readers_(0), reader_(), writer_(1) {}
+// Write-preferring lock.
+// https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
+RWLock::RWLock()
+ : readers_(0),
+ writing_(false) {
+ SB_CHECK(SbMutexCreate(&mutex_));
+ SB_CHECK(SbConditionVariableCreate(&condition_, &mutex_));
+}
-RWLock::~RWLock() {}
+RWLock::~RWLock() {
+ SbConditionVariableDestroy(&condition_);
+ SbMutexDestroy(&mutex_);
+}
void RWLock::AcquireReadLock() {
- reader_.Acquire();
- if (0 == num_readers_++) {
- AcquireWriteLock();
+ SB_CHECK(SbMutexAcquire(&mutex_) == kSbMutexAcquired);
+ while (writing_) {
+ SB_CHECK(SbConditionVariableWait(&condition_, &mutex_) !=
+ kSbConditionVariableFailed);
}
- reader_.Release();
+ ++readers_;
+ SB_CHECK(SbMutexRelease(&mutex_));
}
void RWLock::ReleaseReadLock() {
- reader_.Acquire();
- if (--num_readers_ == 0) {
- ReleaseWriteLock();
+ SB_CHECK(SbMutexAcquire(&mutex_) == kSbMutexAcquired);
+ if (--readers_ == 0) {
+ SB_CHECK(SbConditionVariableBroadcast(&condition_));
}
- reader_.Release();
+ SB_CHECK(SbMutexRelease(&mutex_));
}
void RWLock::AcquireWriteLock() {
- writer_.Take();
+ SB_CHECK(SbMutexAcquire(&mutex_) == kSbMutexAcquired);
+ while (writing_) {
+ SB_CHECK(SbConditionVariableWait(&condition_, &mutex_) !=
+ kSbConditionVariableFailed);
+ }
+ writing_ = true;
+ while (readers_ > 0) {
+ SB_CHECK(SbConditionVariableWait(&condition_, &mutex_) !=
+ kSbConditionVariableFailed);
+ }
+ SB_CHECK(SbMutexRelease(&mutex_));
}
void RWLock::ReleaseWriteLock() {
- writer_.Put();
-}
-
-ScopedReadLock::ScopedReadLock(RWLock* rw_lock) : rw_lock_(rw_lock) {
- rw_lock_->AcquireReadLock();
-}
-
-ScopedReadLock::~ScopedReadLock() {
- rw_lock_->ReleaseReadLock();
-}
-
-ScopedWriteLock::ScopedWriteLock(RWLock* rw_lock) : rw_lock_(rw_lock) {
- rw_lock_->AcquireWriteLock();
-}
-
-ScopedWriteLock::~ScopedWriteLock() {
- rw_lock_->ReleaseWriteLock();
+ SB_CHECK(SbMutexAcquire(&mutex_) == kSbMutexAcquired);
+ writing_ = false;
+ SB_CHECK(SbConditionVariableBroadcast(&condition_));
+ SB_CHECK(SbMutexRelease(&mutex_));
}
} // namespace starboard
diff --git a/src/starboard/common/rwlock.h b/src/starboard/common/rwlock.h
index 245a4d8..2ec8d05 100644
--- a/src/starboard/common/rwlock.h
+++ b/src/starboard/common/rwlock.h
@@ -20,8 +20,8 @@
#ifndef STARBOARD_COMMON_RWLOCK_H_
#define STARBOARD_COMMON_RWLOCK_H_
-#include "starboard/common/mutex.h"
-#include "starboard/common/semaphore.h"
+#include "starboard/condition_variable.h"
+#include "starboard/mutex.h"
namespace starboard {
@@ -33,8 +33,7 @@
// This RWLock is non-upgradeable, if the read lock is held then it must
// be released before the write lock can be used.
//
-// This implementation favors readers over writers. This implementation was
-// first described by Michel Raynal.
+// This implementation favors writers over readers.
//
// Example:
// std::map<...> my_map = ...;
@@ -43,15 +42,14 @@
//
// bool Exists() { // This function is concurrent.
// rw_lock.AcquireReadLock();
-// bool found = my_map.find(...);
+// bool found = my_map.find(...) != my_map.end();
// rw_lock.ReleaseReadLock();
// return found;
// }
-// bool Add(...) { // Write operations are exclusive.
+// void Add(...) { // Write operations are exclusive.
// rw_lock.AcquireWriteLock();
-// bool erased = my_map.erase(...);
+// my_map.insert(...);
// rw_lock.ReleaseWriteLock();
-// return erased;
// }
class RWLock {
public:
@@ -65,18 +63,20 @@
void ReleaseWriteLock();
private:
- Mutex reader_;
- // Semaphore is necessary because of shared ownership: a different
- // thread can unlock a writer than the one that locks it.
- Semaphore writer_;
- int num_readers_;
+ SbMutex mutex_;
+ SbConditionVariable condition_;
+ int32_t readers_;
+ bool writing_;
+
SB_DISALLOW_COPY_AND_ASSIGN(RWLock);
};
class ScopedReadLock {
public:
- explicit ScopedReadLock(RWLock* rw_lock);
- ~ScopedReadLock();
+ explicit ScopedReadLock(RWLock* rw_lock) : rw_lock_(rw_lock) {
+ rw_lock_->AcquireReadLock();
+ }
+ ~ScopedReadLock() { rw_lock_->ReleaseReadLock(); }
private:
RWLock* rw_lock_;
@@ -85,8 +85,10 @@
class ScopedWriteLock {
public:
- explicit ScopedWriteLock(RWLock* rw_lock);
- ~ScopedWriteLock();
+ explicit ScopedWriteLock(RWLock* rw_lock) : rw_lock_(rw_lock) {
+ rw_lock_->AcquireWriteLock();
+ }
+ ~ScopedWriteLock() { rw_lock_->ReleaseWriteLock(); }
private:
RWLock* rw_lock_;
diff --git a/src/starboard/configuration.h b/src/starboard/configuration.h
index 4e16a26..e06b52e 100644
--- a/src/starboard/configuration.h
+++ b/src/starboard/configuration.h
@@ -567,24 +567,6 @@
#error "SB_MEDIA_GPU_BUFFER_BUDGET is deprecated."
#endif // defined(SB_MEDIA_GPU_BUFFER_BUDGET)
-#if defined(SB_HAS_DRM_KEY_STATUSES)
-#if !SB_HAS(DRM_KEY_STATUSES)
-#error "SB_HAS_DRM_KEY_STATUSES is required for Starboard 6 or later."
-#endif // !SB_HAS(DRM_KEY_STATUSES)
-#else // defined(SB_HAS_DRM_KEY_STATUSES)
-#define SB_HAS_DRM_KEY_STATUSES 1
-#endif // defined(SB_HAS_DRM_KEY_STATUSES)
-
-#if defined(SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER)
-#if !SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
-#error \
- "SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER is required for Starboard 6 " \
- "or later."
-#endif // !SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
-#else // defined(SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER)
-#define SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER 1
-#endif // defined(SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER)
-
#if SB_API_VERSION >= 11
#if defined(SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
#if !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
@@ -704,4 +686,28 @@
#endif
#endif
+// Deprecated feature macros
+// These feature macros are deprecated in Starboard version 6 and later, and are
+// no longer referenced by application code. They will be removed in a future
+// version. Any Starboard implementation that supports Starboard version 6 or
+// later should be modified to no longer depend on these macros, with the
+// assumption that their values are always 1.
+#if defined(SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER)
+#if !SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
+#error \
+ "SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER is required for Starboard 6 " \
+ "or later."
+#endif // !SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
+#else // defined(SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER)
+#define SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER 1
+#endif // defined(SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER)
+
+#if defined(SB_HAS_DRM_KEY_STATUSES)
+#if !SB_HAS(DRM_KEY_STATUSES)
+#error "SB_HAS_DRM_KEY_STATUSES is required for Starboard 6 or later."
+#endif // !SB_HAS(DRM_KEY_STATUSES)
+#else // defined(SB_HAS_DRM_KEY_STATUSES)
+#define SB_HAS_DRM_KEY_STATUSES 1
+#endif // defined(SB_HAS_DRM_KEY_STATUSES)
+
#endif // STARBOARD_CONFIGURATION_H_
diff --git a/src/starboard/contrib/creator/shared/starboard_platform.gypi b/src/starboard/contrib/creator/shared/starboard_platform.gypi
index 4a5e4f8..e33ae3d 100644
--- a/src/starboard/contrib/creator/shared/starboard_platform.gypi
+++ b/src/starboard/contrib/creator/shared/starboard_platform.gypi
@@ -316,6 +316,7 @@
'<(DEPTH)/starboard/shared/stub/system_get_used_gpu_memory.cc',
'<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
'<(DEPTH)/starboard/shared/stub/system_raise_platform_error.cc',
+ '<(DEPTH)/starboard/shared/stub/system_sign_with_certification_secret_key.cc',
'<(DEPTH)/starboard/shared/stub/ui_nav_get_interface.cc',
'<(DEPTH)/starboard/shared/stub/window_get_diagonal_size_in_inches.cc',
],
diff --git a/src/starboard/drm.h b/src/starboard/drm.h
index 143cd94..35bdf7e 100644
--- a/src/starboard/drm.h
+++ b/src/starboard/drm.h
@@ -76,14 +76,12 @@
int32_t encrypted_byte_count;
} SbDrmSubSampleMapping;
-#if SB_HAS(DRM_KEY_STATUSES)
typedef struct SbDrmKeyId {
// The ID of the license (or key) required to decrypt this sample. For
// PlayReady, this is the license GUID in packed little-endian binary form.
uint8_t identifier[16];
int identifier_size;
} SbDrmKeyId;
-#endif // SB_HAS(DRM_KEY_STATUSES)
// All the optional information needed per sample for encrypted samples.
typedef struct SbDrmSampleInfo {
@@ -187,7 +185,6 @@
// A callback for notifications that the status of one or more keys in a session
// has been changed. All keys of the session and their new status will be
// passed along. Any keys not in the list is considered as deleted.
-#if SB_HAS(DRM_KEY_STATUSES)
typedef void (*SbDrmSessionKeyStatusesChangedFunc)(
SbDrmSystem drm_system,
void* context,
@@ -196,7 +193,6 @@
int number_of_keys,
const SbDrmKeyId* key_ids,
const SbDrmKeyStatus* key_statuses);
-#endif // SB_HAS(DRM_KEY_STATUSES)
// A callback for signalling that a session has been closed by the SbDrmSystem
#if SB_HAS(DRM_SESSION_CLOSED)
@@ -284,11 +280,6 @@
#elif SB_HAS(DRM_SESSION_CLOSED)
-#if !SB_HAS(DRM_KEY_STATUSES)
-#error "Platforms with SB_HAS_DRM_SESSION_CLOSED must also set "
- "SB_HAS_DRM_KEY_STATUSES"
-#endif // !SB_HAS(DRM_KEY_STATUSES)
-
SB_EXPORT SbDrmSystem SbDrmCreateSystem(
const char* key_system,
void* context,
@@ -297,7 +288,7 @@
SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback,
SbDrmSessionClosedFunc session_closed_callback);
-#elif SB_HAS(DRM_KEY_STATUSES)
+#else // SB_HAS(DRM_SESSION_CLOSED)
SB_EXPORT SbDrmSystem SbDrmCreateSystem(
const char* key_system,
@@ -306,15 +297,7 @@
SbDrmSessionUpdatedFunc session_updated_callback,
SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback);
-#else // SB_HAS(DRM_KEY_STATUSES)
-
-SB_EXPORT SbDrmSystem
-SbDrmCreateSystem(const char* key_system,
- void* context,
- SbDrmSessionUpdateRequestFunc update_request_callback,
- SbDrmSessionUpdatedFunc session_updated_callback);
-
-#endif // SB_HAS(DRM_KEY_STATUSES)
+#endif // SB_HAS(DRM_SESSION_CLOSED)
// Asynchronously generates a session update request payload for
// |initialization_data|, of |initialization_data_size|, in case sensitive
diff --git a/src/starboard/elf_loader/elf_loader_impl.cc b/src/starboard/elf_loader/elf_loader_impl.cc
index f81db05..733da88 100644
--- a/src/starboard/elf_loader/elf_loader_impl.cc
+++ b/src/starboard/elf_loader/elf_loader_impl.cc
@@ -22,7 +22,12 @@
namespace starboard {
namespace elf_loader {
-ElfLoaderImpl::ElfLoaderImpl() {}
+ElfLoaderImpl::ElfLoaderImpl() {
+#if SB_API_VERSION < 12 || !SB_HAS(MMAP) || !SB_CAN(MAP_EXECUTABLE_MEMORY)
+ SB_CHECK(false) << "The elf_loader requires SB_API_VERSION >= 12 with "
+ "executable memory map support!";
+#endif
+}
bool ElfLoaderImpl::Load(const char* name) {
SB_LOG(INFO) << "Loading: " << name;
@@ -103,11 +108,15 @@
if (relocations_->HasTextRelocations()) {
// Restores the memory protection to its original state.
+#if SB_API_VERSION >= 10 && SB_HAS(MMAP)
if (program_table_->AdjustMemoryProtectionOfReadOnlySegments(
kSbMemoryMapProtectReserved) < 0) {
SB_LOG(ERROR) << "Unable to restore segment protection";
return false;
}
+#else
+ SB_CHECK(false);
+#endif
}
SB_LOG(INFO) << "Applied relocations";
diff --git a/src/starboard/elf_loader/exported_symbols.cc b/src/starboard/elf_loader/exported_symbols.cc
index a4c4539..ea440bf 100644
--- a/src/starboard/elf_loader/exported_symbols.cc
+++ b/src/starboard/elf_loader/exported_symbols.cc
@@ -14,19 +14,6 @@
#include "starboard/elf_loader/exported_symbols.h"
-// TODO: Remove these once the API leaks are fixed.
-//#define LOCAL_TEST_WITH_API_LEAKS
-#ifdef LOCAL_TEST_WITH_API_LEAKS
-#include <dlfcn.h>
-#include <fcntl.h>
-#include <nl_types.h>
-#include <setjmp.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
#include "starboard/accessibility.h"
#include "starboard/audio_sink.h"
#include "starboard/byte_swap.h"
@@ -58,27 +45,21 @@
#include "starboard/time_zone.h"
#include "starboard/ui_navigation.h"
-// TODO: cleanup these hack as we fix the API leaks
-
-void tmp_dl_iterate_phdr() {
- SB_LOG(INFO) << "tmp_dl_iterate_phdr";
-}
-
-void tmp__cxa_thread_atexit_impl() {
- SB_LOG(INFO) << "tmp__cxa_thread_atexit_impl";
-}
-
namespace starboard {
namespace elf_loader {
ExportedSymbols::ExportedSymbols() {
- map_["SbAccessibilityGetDisplaySettings"] =
+ map_["SbAccessibilityGetDisplaySettings"] =
reinterpret_cast<const void*>(SbAccessibilityGetDisplaySettings);
map_["SbAccessibilityGetTextToSpeechSettings"] =
reinterpret_cast<const void*>(SbAccessibilityGetTextToSpeechSettings);
map_["SbAudioSinkCreate"] = reinterpret_cast<const void*>(SbAudioSinkCreate);
map_["SbAudioSinkDestroy"] =
reinterpret_cast<const void*>(SbAudioSinkDestroy);
+#if SB_API_VERSION >= 11
+ map_["SbAudioSinkGetMinBufferSizeInFrames"] =
+ reinterpret_cast<const void*>(SbAudioSinkGetMinBufferSizeInFrames);
+#endif
map_["SbAudioSinkGetNearestSupportedSampleFrequency"] =
reinterpret_cast<const void*>(
SbAudioSinkGetNearestSupportedSampleFrequency);
@@ -114,7 +95,11 @@
reinterpret_cast<const void*>(SbConditionVariableWait);
map_["SbConditionVariableWaitTimed"] =
reinterpret_cast<const void*>(SbConditionVariableWaitTimed);
+
+#if SB_API_VERSION >= 11
map_["SbCPUFeaturesGet"] = reinterpret_cast<const void*>(SbCPUFeaturesGet);
+#endif
+
map_["SbDecodeTargetGetInfo"] =
reinterpret_cast<const void*>(SbDecodeTargetGetInfo);
map_["SbDecodeTargetRelease"] =
@@ -137,10 +122,14 @@
reinterpret_cast<const void*>(SbDrmDestroySystem);
map_["SbDrmGenerateSessionUpdateRequest"] =
reinterpret_cast<const void*>(SbDrmGenerateSessionUpdateRequest);
+
+#if SB_API_VERSION >= 10
map_["SbDrmIsServerCertificateUpdatable"] =
reinterpret_cast<const void*>(SbDrmIsServerCertificateUpdatable);
map_["SbDrmUpdateServerCertificate"] =
reinterpret_cast<const void*>(SbDrmUpdateServerCertificate);
+#endif
+
map_["SbDrmUpdateSession"] =
reinterpret_cast<const void*>(SbDrmUpdateSession);
map_["SbEventCancel"] = reinterpret_cast<const void*>(SbEventCancel);
@@ -173,6 +162,8 @@
map_["SbLogRawFormat"] = reinterpret_cast<const void*>(SbLogRawFormat);
map_["SbMediaCanPlayMimeAndKeySystem"] =
reinterpret_cast<const void*>(SbMediaCanPlayMimeAndKeySystem);
+
+#if SB_API_VERSION >= 10
map_["SbMediaGetAudioBufferBudget"] =
reinterpret_cast<const void*>(SbMediaGetAudioBufferBudget);
map_["SbMediaGetBufferAlignment"] =
@@ -196,8 +187,13 @@
reinterpret_cast<const void*>(SbMediaIsBufferPoolAllocateOnDemand);
map_["SbMediaIsBufferUsingMemoryPool"] =
reinterpret_cast<const void*>(SbMediaIsBufferUsingMemoryPool);
+#endif
+
+#if SB_API_VERSION >= 11
map_["SbMediaSetAudioWriteDuration"] =
reinterpret_cast<const void*>(SbMediaSetAudioWriteDuration);
+#endif
+
map_["SbMemoryAllocateAlignedUnchecked"] =
reinterpret_cast<const void*>(SbMemoryAllocateAlignedUnchecked);
map_["SbMemoryAllocateUnchecked"] =
@@ -208,13 +204,23 @@
map_["SbMemoryFree"] = reinterpret_cast<const void*>(SbMemoryFree);
map_["SbMemoryFreeAligned"] =
reinterpret_cast<const void*>(SbMemoryFreeAligned);
+
+#if SB_HAS(MMAP)
map_["SbMemoryMap"] = reinterpret_cast<const void*>(SbMemoryMap);
+#endif
map_["SbMemoryMove"] = reinterpret_cast<const void*>(SbMemoryMove);
+
+#if SB_API_VERSION >= 10 && SB_HAS(MMAP)
map_["SbMemoryProtect"] = reinterpret_cast<const void*>(SbMemoryProtect);
+#endif
+
map_["SbMemoryReallocateUnchecked"] =
reinterpret_cast<const void*>(SbMemoryReallocateUnchecked);
map_["SbMemorySet"] = reinterpret_cast<const void*>(SbMemorySet);
+
+#if SB_HAS(MMAP)
map_["SbMemoryUnmap"] = reinterpret_cast<const void*>(SbMemoryUnmap);
+#endif
#if SB_HAS(MICROPHONE)
map_["SbMicrophoneClose"] = reinterpret_cast<const void*>(SbMicrophoneClose);
@@ -241,20 +247,33 @@
map_["SbPlayerDestroy"] = reinterpret_cast<const void*>(SbPlayerDestroy);
map_["SbPlayerGetCurrentFrame"] =
reinterpret_cast<const void*>(SbPlayerGetCurrentFrame);
+
+#if SB_API_VERSION >= 10
map_["SbPlayerGetInfo2"] = reinterpret_cast<const void*>(SbPlayerGetInfo2);
map_["SbPlayerGetMaximumNumberOfSamplesPerWrite"] =
reinterpret_cast<const void*>(SbPlayerGetMaximumNumberOfSamplesPerWrite);
+
+#endif
+
map_["SbPlayerOutputModeSupported"] =
reinterpret_cast<const void*>(SbPlayerOutputModeSupported);
+
+#if SB_API_VERSION >= 10
map_["SbPlayerSeek2"] = reinterpret_cast<const void*>(SbPlayerSeek2);
+#endif
+
map_["SbPlayerSetBounds"] = reinterpret_cast<const void*>(SbPlayerSetBounds);
map_["SbPlayerSetPlaybackRate"] =
reinterpret_cast<const void*>(SbPlayerSetPlaybackRate);
map_["SbPlayerSetVolume"] = reinterpret_cast<const void*>(SbPlayerSetVolume);
map_["SbPlayerWriteEndOfStream"] =
reinterpret_cast<const void*>(SbPlayerWriteEndOfStream);
+
+#if SB_API_VERSION >= 10
map_["SbPlayerWriteSample2"] =
reinterpret_cast<const void*>(SbPlayerWriteSample2);
+#endif
+
map_["SbSocketAccept"] = reinterpret_cast<const void*>(SbSocketAccept);
map_["SbSocketBind"] = reinterpret_cast<const void*>(SbSocketBind);
map_["SbSocketClearLastError"] = reinterpret_cast<const void*>(SbSocketClearLastError);
@@ -317,6 +336,9 @@
reinterpret_cast<const void*>(SbSpeechRecognizerStart);
map_["SbSpeechRecognizerStop"] =
reinterpret_cast<const void*>(SbSpeechRecognizerStop);
+#endif
+
+#if SB_HAS(SPEECH_SYNTHESIS)
map_["SbSpeechSynthesisCancel"] =
reinterpret_cast<const void*>(SbSpeechSynthesisCancel);
map_["SbSpeechSynthesisSpeak"] =
@@ -376,8 +398,12 @@
reinterpret_cast<const void*>(SbSystemGetDeviceType);
map_["SbSystemGetErrorString"] =
reinterpret_cast<const void*>(SbSystemGetErrorString);
+
+#if SB_API_VERSION >= 11
map_["SbSystemGetExtension"] =
reinterpret_cast<const void*>(SbSystemGetExtension);
+#endif
+
map_["SbSystemGetLastError"] =
reinterpret_cast<const void*>(SbSystemGetLastError);
map_["SbSystemGetLocaleId"] =
@@ -416,12 +442,26 @@
reinterpret_cast<const void*>(SbSystemRequestSuspend);
map_["SbSystemRequestUnpause"] =
reinterpret_cast<const void*>(SbSystemRequestUnpause);
+
+#if SB_API_VERSION >= 11
+ map_["SbSystemSignWithCertificationSecretKey"] =
+ reinterpret_cast<const void*>(SbSystemSignWithCertificationSecretKey);
+#endif
+
map_["SbSystemSort"] = reinterpret_cast<const void*>(SbSystemSort);
+
+#if SB_API_VERSION >= 10
map_["SbSystemSupportsResume"] =
reinterpret_cast<const void*>(SbSystemSupportsResume);
+#endif
+
map_["SbSystemSymbolize"] = reinterpret_cast<const void*>(SbSystemSymbolize);
+
+#if SB_API_VERSION >= 11
map_["SbThreadContextGetPointer"] =
reinterpret_cast<const void*>(SbThreadContextGetPointer);
+#endif
+
map_["SbThreadCreate"] = reinterpret_cast<const void*>(SbThreadCreate);
map_["SbThreadCreateLocalKey"] =
reinterpret_cast<const void*>(SbThreadCreateLocalKey);
@@ -435,14 +475,19 @@
reinterpret_cast<const void*>(SbThreadGetLocalValue);
map_["SbThreadIsEqual"] = reinterpret_cast<const void*>(SbThreadIsEqual);
map_["SbThreadJoin"] = reinterpret_cast<const void*>(SbThreadJoin);
+
+#if SB_API_VERSION >= 11
map_["SbThreadSamplerCreate"] =
reinterpret_cast<const void*>(SbThreadSamplerCreate);
+
map_["SbThreadSamplerDestroy"] =
reinterpret_cast<const void*>(SbThreadSamplerDestroy);
map_["SbThreadSamplerFreeze"] =
reinterpret_cast<const void*>(SbThreadSamplerFreeze);
map_["SbThreadSamplerThaw"] =
reinterpret_cast<const void*>(SbThreadSamplerThaw);
+#endif
+
map_["SbThreadSetLocalValue"] =
reinterpret_cast<const void*>(SbThreadSetLocalValue);
map_["SbThreadSetName"] = reinterpret_cast<const void*>(SbThreadSetName);
@@ -450,62 +495,44 @@
map_["SbThreadYield"] = reinterpret_cast<const void*>(SbThreadYield);
map_["SbTimeGetMonotonicNow"] =
reinterpret_cast<const void*>(SbTimeGetMonotonicNow);
+
+#if SB_HAS(TIME_THREAD_NOW)
map_["SbTimeGetMonotonicThreadNow"] =
reinterpret_cast<const void*>(SbTimeGetMonotonicThreadNow);
+#endif
+
map_["SbTimeGetNow"] = reinterpret_cast<const void*>(SbTimeGetNow);
map_["SbTimeZoneGetCurrent"] =
reinterpret_cast<const void*>(SbTimeZoneGetCurrent);
map_["SbTimeZoneGetName"] = reinterpret_cast<const void*>(SbTimeZoneGetName);
+
#if SB_API_VERSION >= SB_UI_NAVIGATION_VERSION
map_["SbUiNavGetInterface"] =
reinterpret_cast<const void*>(SbUiNavGetInterface);
#endif
+
map_["SbUserGetCurrent"] = reinterpret_cast<const void*>(SbUserGetCurrent);
map_["SbUserGetProperty"] = reinterpret_cast<const void*>(SbUserGetProperty);
map_["SbUserGetPropertySize"] =
reinterpret_cast<const void*>(SbUserGetPropertySize);
map_["SbWindowCreate"] = reinterpret_cast<const void*>(SbWindowCreate);
map_["SbWindowDestroy"] = reinterpret_cast<const void*>(SbWindowDestroy);
+
+#if SB_API_VERSION >= 11
map_["SbWindowGetDiagonalSizeInInches"] =
reinterpret_cast<const void*>(SbWindowGetDiagonalSizeInInches);
+#endif
+
map_["SbWindowGetPlatformHandle"] =
reinterpret_cast<const void*>(SbWindowGetPlatformHandle);
map_["SbWindowGetSize"] = reinterpret_cast<const void*>(SbWindowGetSize);
map_["SbWindowSetDefaultOptions"] =
reinterpret_cast<const void*>(SbWindowSetDefaultOptions);
-#ifdef LOCAL_TEST_WITH_API_LEAKS
- map_["atexit"] = reinterpret_cast<const void*>(atexit);
- map_["btowc"] = reinterpret_cast<const void*>(btowc);
- map_["__ctype_get_mb_cur_max"] =
- map_["__cxa_thread_atexit_impl"] =
- reinterpret_cast<const void*>(tmp__cxa_thread_atexit_impl);
- map_["dladdr"] = reinterpret_cast<const void*>(dladdr);
- map_["dl_iterate_phdr"] = reinterpret_cast<const void*>(tmp_dl_iterate_phdr);
- map_["longjmp"] = reinterpret_cast<const void*>(longjmp);
- map_["mbrlen"] = reinterpret_cast<const void*>(mbrlen);
- map_["mbrtowc"] = reinterpret_cast<const void*>(mbrtowc);
- map_["mbsnrtowcs"] = reinterpret_cast<const void*>(mbsnrtowcs);
- map_["mbsrtowcs"] = reinterpret_cast<const void*>(mbsrtowcs);
- map_["mbtowc"] = reinterpret_cast<const void*>(mbtowc);
-
- map_["setjmp"] = reinterpret_cast<const void*>(setjmp);
- map_["wcrtomb"] = reinterpret_cast<const void*>(wcrtomb);
- map_["wcsnrtombs"] = reinterpret_cast<const void*>(wcsnrtombs);
- map_["wcstod"] = reinterpret_cast<const void*>(wcstod);
- map_["wcstof"] = reinterpret_cast<const void*>(wcstof);
- map_["wcstol"] = reinterpret_cast<const void*>(wcstol);
- map_["wcstold"] = reinterpret_cast<const void*>(wcstold);
- map_["wcstoll"] = reinterpret_cast<const void*>(wcstoll);
- map_["wcstoul"] = reinterpret_cast<const void*>(wcstoul);
- map_["wcstoull"] = reinterpret_cast<const void*>(wcstoull);
- map_["wcsxfrm_l"] = reinterpret_cast<const void*>(wcsxfrm_l);
- map_["wctob"] = reinterpret_cast<const void*>(wctob);
-#endif
}
const void* ExportedSymbols::Lookup(const char* name) {
const void* ret = map_[name];
- SB_CHECK(ret);
+ SB_CHECK(ret) << name;
return ret;
}
} // namespace elf_loader
diff --git a/src/starboard/elf_loader/program_table.cc b/src/starboard/elf_loader/program_table.cc
index 7542604..7b48e3c 100644
--- a/src/starboard/elf_loader/program_table.cc
+++ b/src/starboard/elf_loader/program_table.cc
@@ -18,10 +18,13 @@
#include "starboard/memory.h"
#define MAYBE_MAP_FLAG(x, from, to) (((x) & (from)) ? (to) : 0)
+
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
#define PFLAGS_TO_PROT(x) \
(MAYBE_MAP_FLAG((x), PF_X, kSbMemoryMapProtectExec) | \
MAYBE_MAP_FLAG((x), PF_R, kSbMemoryMapProtectRead) | \
MAYBE_MAP_FLAG((x), PF_W, kSbMemoryMapProtectWrite))
+#endif
#define MAP_FAILED ((void*)-1)
@@ -69,6 +72,7 @@
SB_LOG(INFO) << "page_max - page_min=" << page_max - page_min;
+#if SB_HAS(MMAP)
phdr_mmap_ =
SbMemoryMap(phdr_size_, kSbMemoryMapProtectWrite, "program_header");
if (!phdr_mmap_) {
@@ -77,14 +81,16 @@
}
SB_LOG(INFO) << "Allocated address=" << phdr_mmap_;
-
+#else
+ SB_CHECK(false);
+#endif
if (!elf_file->ReadFromOffset(page_min, reinterpret_cast<char*>(phdr_mmap_),
phdr_size_)) {
SB_LOG(ERROR) << "Failed to read program header from file offset: "
<< page_min;
return false;
}
-
+#if SB_API_VERSION >= 10 && SB_HAS(MMAP)
bool mp_result =
SbMemoryProtect(phdr_mmap_, phdr_size_, kSbMemoryMapProtectRead);
SB_LOG(INFO) << "mp_result=" << mp_result;
@@ -92,6 +98,10 @@
SB_LOG(ERROR) << "Failed to protect program header";
return false;
}
+#else
+ SB_CHECK(false);
+#endif
+
phdr_table_ = reinterpret_cast<Phdr*>(reinterpret_cast<char*>(phdr_mmap_) +
page_offset);
@@ -130,6 +140,7 @@
<< " file_length=" << file_length << " seg_page_start=0x"
<< std::hex << seg_page_start;
+#if SB_API_VERSION >= 10 && SB_HAS(MMAP) && SB_CAN(MAP_EXECUTABLE_MEMORY)
if (file_length != 0) {
const int prot_flags = PFLAGS_TO_PROT(phdr->p_flags);
SB_LOG(INFO) << "segment prot_flags=" << std::hex << prot_flags;
@@ -150,7 +161,6 @@
<< file_page_start;
return false;
}
-
mp_ret = SbMemoryProtect(seg_addr, file_length, prot_flags);
SB_LOG(INFO) << "mp_ret=" << mp_ret;
if (!mp_ret) {
@@ -162,6 +172,9 @@
return false;
}
}
+#else
+ SB_CHECK(false);
+#endif
// if the segment is writable, and does not end on a page boundary,
// zero-fill it until the page limit.
@@ -177,6 +190,7 @@
// between them. This is done by using a private anonymous
// map for all extra pages.
if (seg_page_end > seg_file_end) {
+#if SB_API_VERSION >= 10 && SB_HAS(MMAP) && SB_CAN(MAP_EXECUTABLE_MEMORY)
bool mprotect_fix = SbMemoryProtect(reinterpret_cast<void*>(seg_file_end),
seg_page_end - seg_file_end,
kSbMemoryMapProtectWrite);
@@ -185,8 +199,13 @@
SB_LOG(ERROR) << "Failed to unprotect end of segment";
return false;
}
+#else
+ SB_CHECK(false);
+#endif
+
SbMemorySet(reinterpret_cast<void*>(seg_file_end), 0,
seg_page_end - seg_file_end);
+#if SB_API_VERSION >= 10 && SB_HAS(MMAP) && SB_CAN(MAP_EXECUTABLE_MEMORY)
SbMemoryProtect(reinterpret_cast<void*>(seg_file_end),
seg_page_end - seg_file_end,
PFLAGS_TO_PROT(phdr->p_flags));
@@ -195,6 +214,9 @@
SB_LOG(ERROR) << "Failed to protect end of segment";
return false;
}
+#else
+ SB_CHECK(false);
+#endif
}
}
return true;
@@ -277,13 +299,16 @@
Addr seg_page_start = PAGE_START(phdr->p_vaddr) + base_memory_address_;
Addr seg_page_end =
PAGE_END(phdr->p_vaddr + phdr->p_memsz) + base_memory_address_;
-
+#if SB_API_VERSION >= 10 && SB_HAS(MMAP) && SB_CAN(MAP_EXECUTABLE_MEMORY)
int ret = SbMemoryProtect(reinterpret_cast<void*>(seg_page_start),
seg_page_end - seg_page_start,
PFLAGS_TO_PROT(phdr->p_flags) | extra_prot_flags);
if (ret < 0) {
return -1;
}
+#else
+ SB_CHECK(false);
+#endif
}
return 0;
}
@@ -297,6 +322,7 @@
SB_LOG(INFO) << "Load size=" << load_size_;
+#if SB_API_VERSION >= 10 && SB_HAS(MMAP)
load_start_ =
SbMemoryMap(load_size_, kSbMemoryMapProtectReserved, "reserved_mem");
if (load_start_ == MAP_FAILED) {
@@ -304,7 +330,9 @@
<< " bytes of address space";
return false;
}
-
+#else
+ SB_CHECK(false);
+#endif
base_memory_address_ = reinterpret_cast<Addr>(load_start_);
SB_LOG(INFO) << "Load start=" << std::hex << load_start_
@@ -317,12 +345,16 @@
}
ProgramTable::~ProgramTable() {
+#if SB_HAS(MMAP)
if (load_start_) {
SbMemoryUnmap(load_start_, load_size_);
}
if (phdr_mmap_) {
SbMemoryUnmap(phdr_mmap_, phdr_size_);
}
+#else
+ SB_CHECK(false);
+#endif
}
} // namespace elf_loader
diff --git a/src/starboard/elf_loader/relocations.cc b/src/starboard/elf_loader/relocations.cc
index 4b7131c..dae9157 100644
--- a/src/starboard/elf_loader/relocations.cc
+++ b/src/starboard/elf_loader/relocations.cc
@@ -242,7 +242,6 @@
#if defined(USE_RELA)
bool Relocations::ApplyResolvedReloc(const Rela* rela, Addr sym_addr) {
const Word rela_type = ELF_R_TYPE(rela->r_info);
- const Word rela_symbol = ELF_R_SYM(rela->r_info);
const Sword addend = rela->r_addend;
const Addr reloc = static_cast<Addr>(rela->r_offset + base_memory_address_);
@@ -274,10 +273,6 @@
SB_LOG(INFO) << " R_AARCH64_RELATIVE target=" << std::hex << target
<< " " << *target
<< " bias=" << base_memory_address_ + addend;
- if (!rela_symbol) {
- SB_LOG(ERROR) << "Invalid relative relocation with symbol";
- return false;
- }
*target = base_memory_address_ + addend;
break;
@@ -302,11 +297,6 @@
break;
case R_X86_64_RELATIVE:
- if (rela_symbol) {
- SB_LOG(ERROR) << "Invalid R_X86_64_RELATIVE";
- return false;
- }
-
SB_LOG(INFO) << " R_X86_64_RELATIVE target=" << std::hex << target << " "
<< *target << " bias=" << base_memory_address_ + addend;
*target = base_memory_address_ + addend;
@@ -331,8 +321,6 @@
#else
bool Relocations::ApplyResolvedReloc(const Rel* rel, Addr sym_addr) {
const Word rel_type = ELF_R_TYPE(rel->r_info);
- const Word rel_symbol = ELF_R_SYM(rel->r_info);
-
const Addr reloc = static_cast<Addr>(rel->r_offset + base_memory_address_);
SB_LOG(INFO) << " rel reloc=0x" << std::hex << reloc << " offset=0x"
@@ -369,10 +357,6 @@
case R_ARM_RELATIVE:
SB_LOG(INFO) << " RR_ARM_RELATIVE target=" << std::hex << target << " "
<< *target << " bias=" << base_memory_address_;
- if (!rel_symbol) {
- SB_LOG(ERROR) << "Invalid relative relocation with symbol";
- return false;
- }
*target += base_memory_address_;
break;
@@ -401,10 +385,6 @@
break;
case R_386_RELATIVE:
- if (rel_symbol) {
- SB_LOG(ERROR) << "Invalid relative relocation with symbol";
- return false;
- }
SB_LOG(INFO) << " R_386_RELATIVE target=" << std::hex << target << " "
<< *target << " bias=" << base_memory_address_;
diff --git a/src/starboard/linux/shared/drm_create_system.cc b/src/starboard/linux/shared/drm_create_system.cc
index 93ac58b..cde9aa9 100644
--- a/src/starboard/linux/shared/drm_create_system.cc
+++ b/src/starboard/linux/shared/drm_create_system.cc
@@ -22,11 +22,8 @@
const char* key_system,
void* context,
SbDrmSessionUpdateRequestFunc update_request_callback,
- SbDrmSessionUpdatedFunc session_updated_callback
-#if SB_HAS(DRM_KEY_STATUSES)
- ,
+ SbDrmSessionUpdatedFunc session_updated_callback,
SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
,
SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback,
@@ -37,11 +34,9 @@
if (!update_request_callback || !session_updated_callback) {
return kSbDrmSystemInvalid;
}
-#if SB_HAS(DRM_KEY_STATUSES)
if (!key_statuses_changed_callback) {
return kSbDrmSystemInvalid;
}
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
if (!server_certificate_updated_callback || !session_closed_callback) {
return kSbDrmSystemInvalid;
@@ -52,11 +47,8 @@
return kSbDrmSystemInvalid;
}
return new DrmSystemWidevine(context, update_request_callback,
- session_updated_callback
-#if SB_HAS(DRM_KEY_STATUSES)
- ,
+ session_updated_callback,
key_statuses_changed_callback
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
,
server_certificate_updated_callback
diff --git a/src/starboard/linux/shared/gyp_configuration.py b/src/starboard/linux/shared/gyp_configuration.py
index 56673d5..c77e593 100644
--- a/src/starboard/linux/shared/gyp_configuration.py
+++ b/src/starboard/linux/shared/gyp_configuration.py
@@ -71,6 +71,18 @@
})
return env_variables
+ def GetTestEnvVariables(self):
+ # Due to fragile nature of dynamic TLS tracking, in particular LSAN reliance
+ # on GLIBC private APIs, tracking TLS leaks is unstable and can trigger
+ # sporadic false positives and/or crashes, depending on the used compiler,
+ # direct library dependencies and runtime-loaded dynamic libraries. Hence,
+ # TLS leak tracing in LSAN is turned off.
+ # For reference, https://sourceware.org/ml/libc-alpha/2018-02/msg00567.html
+ # When failing, 'LeakSanitizer has encountered a fatal error' message would
+ # be printed at test shutdown, and env var LSAN_OPTIONS=verbosity=2 would
+ # further point to 'Scanning DTLS range ..' prior to crash.
+ return {'ASAN_OPTIONS': 'intercept_tls_get_addr=0'}
+
def GetTestFilters(self):
filters = super(LinuxConfiguration, self).GetTestFilters()
for target, tests in self.__FILTERED_TESTS.iteritems():
diff --git a/src/starboard/linux/shared/media_is_audio_supported.cc b/src/starboard/linux/shared/media_is_audio_supported.cc
index f20d64a..d0d9c7a 100644
--- a/src/starboard/linux/shared/media_is_audio_supported.cc
+++ b/src/starboard/linux/shared/media_is_audio_supported.cc
@@ -23,7 +23,6 @@
return bitrate <= SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND;
}
-#if SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
if (audio_codec == kSbMediaAudioCodecOpus) {
return bitrate <= SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND;
}
@@ -34,7 +33,6 @@
return bitrate <= SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND;
}
#endif // SB_HAS(AC3_AUDIO)
-#endif // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
return false;
}
diff --git a/src/starboard/linux/shared/starboard_platform.gypi b/src/starboard/linux/shared/starboard_platform.gypi
index b4f4566..1297986 100644
--- a/src/starboard/linux/shared/starboard_platform.gypi
+++ b/src/starboard/linux/shared/starboard_platform.gypi
@@ -227,6 +227,7 @@
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_create.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_destroy.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_max_channels_5_1.cc',
+ '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_min_buffer_size_in_frames.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_nearest_supported_sample_frequency.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_internal.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_internal.h',
@@ -317,7 +318,7 @@
'<(DEPTH)/starboard/shared/starboard/window_set_default_options.cc',
'<(DEPTH)/starboard/shared/stub/accessibility_get_display_settings.cc',
'<(DEPTH)/starboard/shared/stub/accessibility_get_text_to_speech_settings.cc',
- '<(DEPTH)/starboard/shared/stub/cpu_features_get.cc',
+ '<(DEPTH)/starboard/shared/linux/cpu_features_get.cc',
'<(DEPTH)/starboard/shared/stub/cryptography_create_transformer.cc',
'<(DEPTH)/starboard/shared/stub/cryptography_destroy_transformer.cc',
'<(DEPTH)/starboard/shared/stub/cryptography_get_tag.cc',
@@ -339,6 +340,7 @@
'<(DEPTH)/starboard/shared/stub/system_get_used_gpu_memory.cc',
'<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
'<(DEPTH)/starboard/shared/stub/system_raise_platform_error.cc',
+ '<(DEPTH)/starboard/shared/stub/system_sign_with_certification_secret_key.cc',
'<(DEPTH)/starboard/shared/stub/ui_nav_get_interface.cc',
'<(DEPTH)/starboard/shared/stub/window_get_diagonal_size_in_inches.cc',
],
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/10/atomic_public.h b/src/starboard/linux/x64x11/blittergles/sbversion/10/atomic_public.h
new file mode 100644
index 0000000..071ab1b
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/10/atomic_public.h
@@ -0,0 +1,23 @@
+// Copyright 2019 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_10_ATOMIC_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_10_ATOMIC_PUBLIC_H_
+
+#include "starboard/linux/x64x11/blittergles/atomic_public.h"
+
+#endif // STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_10_ATOMIC_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/10/configuration_public.h b/src/starboard/linux/x64x11/blittergles/sbversion/10/configuration_public.h
new file mode 100644
index 0000000..53a5d3f
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/10/configuration_public.h
@@ -0,0 +1,23 @@
+// Copyright 2019 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_10_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_10_CONFIGURATION_PUBLIC_H_
+
+#include "starboard/linux/x64x11/blittergles/configuration_public.h"
+
+#endif // STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_10_CONFIGURATION_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/10/gyp_configuration.gypi b/src/starboard/linux/x64x11/blittergles/sbversion/10/gyp_configuration.gypi
new file mode 100644
index 0000000..d9855d7
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/10/gyp_configuration.gypi
@@ -0,0 +1,40 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+ 'target_defaults': {
+ 'default_configuration': 'linux-x64x11-blittergles-sbversion-10_debug',
+ 'configurations': {
+ 'linux-x64x11-blittergles-sbversion-10_debug': {
+ 'inherit_from': ['debug_base'],
+ },
+ 'linux-x64x11-blittergles-sbversion-10_devel': {
+ 'inherit_from': ['devel_base'],
+ },
+ 'linux-x64x11-blittergles-sbversion-10_qa': {
+ 'inherit_from': ['qa_base'],
+ },
+ 'linux-x64x11-blittergles-sbversion-10_gold': {
+ 'inherit_from': ['gold_base'],
+ },
+ }, # end of configurations
+ },
+
+ 'includes': [
+ '<(DEPTH)/starboard/linux/x64x11/blittergles/gyp_configuration.gypi',
+ ],
+}
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/10/gyp_configuration.py b/src/starboard/linux/x64x11/blittergles/sbversion/10/gyp_configuration.py
new file mode 100644
index 0000000..046bf56
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/10/gyp_configuration.py
@@ -0,0 +1,25 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+"""Starboard Linux X64X11 Blittergles Sbversion 10 platform configuration."""
+
+
+from starboard.linux.x64x11 import gyp_configuration as parent_configuration
+
+
+def CreatePlatformConfig():
+ return parent_configuration.LinuxX64X11Configuration(
+ 'linux-x64x11-blittergles-sbversion-10')
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/10/starboard_platform.gyp b/src/starboard/linux/x64x11/blittergles/sbversion/10/starboard_platform.gyp
new file mode 100644
index 0000000..8163408
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/10/starboard_platform.gyp
@@ -0,0 +1,24 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+ 'includes': [
+ # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file. The idea
+ # is that we just want this file to *be* the parent gyp file.
+ '<(DEPTH)/starboard/linux/x64x11/blittergles/starboard_platform.gyp',
+ ],
+}
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/10/starboard_platform_tests.gyp b/src/starboard/linux/x64x11/blittergles/sbversion/10/starboard_platform_tests.gyp
new file mode 100644
index 0000000..94e7cc2
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/10/starboard_platform_tests.gyp
@@ -0,0 +1,24 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+ 'includes': [
+ # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file. The idea
+ # is that we just want this file to *be* the parent gyp file.
+ '<(DEPTH)/starboard/linux/x64x11/blittergles/starboard_platform_tests.gyp',
+ ],
+}
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/10/thread_types_public.h b/src/starboard/linux/x64x11/blittergles/sbversion/10/thread_types_public.h
new file mode 100644
index 0000000..cfe4a35
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/10/thread_types_public.h
@@ -0,0 +1,23 @@
+// Copyright 2019 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_10_THREAD_TYPES_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_10_THREAD_TYPES_PUBLIC_H_
+
+#include "starboard/linux/x64x11/blittergles/thread_types_public.h"
+
+#endif // STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_10_THREAD_TYPES_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/11/atomic_public.h b/src/starboard/linux/x64x11/blittergles/sbversion/11/atomic_public.h
new file mode 100644
index 0000000..0fdbbea
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/11/atomic_public.h
@@ -0,0 +1,23 @@
+// Copyright 2019 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_11_ATOMIC_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_11_ATOMIC_PUBLIC_H_
+
+#include "starboard/linux/x64x11/blittergles/atomic_public.h"
+
+#endif // STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_11_ATOMIC_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/11/configuration_public.h b/src/starboard/linux/x64x11/blittergles/sbversion/11/configuration_public.h
new file mode 100644
index 0000000..55cf0ba
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/11/configuration_public.h
@@ -0,0 +1,23 @@
+// Copyright 2019 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_11_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_11_CONFIGURATION_PUBLIC_H_
+
+#include "starboard/linux/x64x11/blittergles/configuration_public.h"
+
+#endif // STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_11_CONFIGURATION_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/11/gyp_configuration.gypi b/src/starboard/linux/x64x11/blittergles/sbversion/11/gyp_configuration.gypi
new file mode 100644
index 0000000..573d659
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/11/gyp_configuration.gypi
@@ -0,0 +1,40 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+ 'target_defaults': {
+ 'default_configuration': 'linux-x64x11-blittergles-sbversion-11_debug',
+ 'configurations': {
+ 'linux-x64x11-blittergles-sbversion-11_debug': {
+ 'inherit_from': ['debug_base'],
+ },
+ 'linux-x64x11-blittergles-sbversion-11_devel': {
+ 'inherit_from': ['devel_base'],
+ },
+ 'linux-x64x11-blittergles-sbversion-11_qa': {
+ 'inherit_from': ['qa_base'],
+ },
+ 'linux-x64x11-blittergles-sbversion-11_gold': {
+ 'inherit_from': ['gold_base'],
+ },
+ }, # end of configurations
+ },
+
+ 'includes': [
+ '<(DEPTH)/starboard/linux/x64x11/blittergles/gyp_configuration.gypi',
+ ],
+}
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/11/gyp_configuration.py b/src/starboard/linux/x64x11/blittergles/sbversion/11/gyp_configuration.py
new file mode 100644
index 0000000..ff1fc94
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/11/gyp_configuration.py
@@ -0,0 +1,24 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+"""Starboard Linux X64X11 Blittergles Sbversion 11 platform configuration."""
+
+from starboard.linux.x64x11 import gyp_configuration as parent_configuration
+
+
+def CreatePlatformConfig():
+ return parent_configuration.LinuxX64X11Configuration(
+ 'linux-x64x11-blittergles-sbversion-11')
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/11/starboard_platform.gyp b/src/starboard/linux/x64x11/blittergles/sbversion/11/starboard_platform.gyp
new file mode 100644
index 0000000..8163408
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/11/starboard_platform.gyp
@@ -0,0 +1,24 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+ 'includes': [
+ # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file. The idea
+ # is that we just want this file to *be* the parent gyp file.
+ '<(DEPTH)/starboard/linux/x64x11/blittergles/starboard_platform.gyp',
+ ],
+}
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/11/starboard_platform_tests.gyp b/src/starboard/linux/x64x11/blittergles/sbversion/11/starboard_platform_tests.gyp
new file mode 100644
index 0000000..94e7cc2
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/11/starboard_platform_tests.gyp
@@ -0,0 +1,24 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+ 'includes': [
+ # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file. The idea
+ # is that we just want this file to *be* the parent gyp file.
+ '<(DEPTH)/starboard/linux/x64x11/blittergles/starboard_platform_tests.gyp',
+ ],
+}
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/11/thread_types_public.h b/src/starboard/linux/x64x11/blittergles/sbversion/11/thread_types_public.h
new file mode 100644
index 0000000..3f38d1c
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/11/thread_types_public.h
@@ -0,0 +1,23 @@
+// Copyright 2019 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_11_THREAD_TYPES_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_11_THREAD_TYPES_PUBLIC_H_
+
+#include "starboard/linux/x64x11/blittergles/thread_types_public.h"
+
+#endif // STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_11_THREAD_TYPES_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/6/atomic_public.h b/src/starboard/linux/x64x11/blittergles/sbversion/6/atomic_public.h
new file mode 100644
index 0000000..d2414dd
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/6/atomic_public.h
@@ -0,0 +1,23 @@
+// Copyright 2019 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_6_ATOMIC_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_6_ATOMIC_PUBLIC_H_
+
+#include "starboard/linux/x64x11/blittergles/atomic_public.h"
+
+#endif // STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_6_ATOMIC_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/6/configuration_public.h b/src/starboard/linux/x64x11/blittergles/sbversion/6/configuration_public.h
new file mode 100644
index 0000000..e73676b
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/6/configuration_public.h
@@ -0,0 +1,23 @@
+// Copyright 2019 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_6_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_6_CONFIGURATION_PUBLIC_H_
+
+#include "starboard/linux/x64x11/blittergles/configuration_public.h"
+
+#endif // STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_6_CONFIGURATION_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/6/gyp_configuration.gypi b/src/starboard/linux/x64x11/blittergles/sbversion/6/gyp_configuration.gypi
new file mode 100644
index 0000000..44aba2b
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/6/gyp_configuration.gypi
@@ -0,0 +1,40 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+ 'target_defaults': {
+ 'default_configuration': 'linux-x64x11-blittergles-sbversion-6_debug',
+ 'configurations': {
+ 'linux-x64x11-blittergles-sbversion-6_debug': {
+ 'inherit_from': ['debug_base'],
+ },
+ 'linux-x64x11-blittergles-sbversion-6_devel': {
+ 'inherit_from': ['devel_base'],
+ },
+ 'linux-x64x11-blittergles-sbversion-6_qa': {
+ 'inherit_from': ['qa_base'],
+ },
+ 'linux-x64x11-blittergles-sbversion-6_gold': {
+ 'inherit_from': ['gold_base'],
+ },
+ }, # end of configurations
+ },
+
+ 'includes': [
+ '<(DEPTH)/starboard/linux/x64x11/blittergles/gyp_configuration.gypi',
+ ],
+}
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/6/gyp_configuration.py b/src/starboard/linux/x64x11/blittergles/sbversion/6/gyp_configuration.py
new file mode 100644
index 0000000..6930874
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/6/gyp_configuration.py
@@ -0,0 +1,39 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+"""Starboard Linux X64X11 Blittergles Sbversion 6 platform configuration."""
+
+from starboard.linux.x64x11 import gyp_configuration as parent_configuration
+
+
+class LinuxX64X11BlitterglesSbversion6Configuration(
+ parent_configuration.LinuxX64X11Configuration('linux-x64x11-blittergles')):
+
+ def GetVariables(self, config_name):
+ variables = super(LinuxX64X11BlitterglesSbversion6Configuration,
+ self).GetVariables(config_name)
+ # V8 requires new Starboard features so we must use SpiderMonkey in older
+ # versions of Starboard.
+ variables.update({
+ 'javascript_engine': 'mozjs-45',
+ 'cobalt_enable_jit': 0,
+ })
+ return variables
+
+
+def CreatePlatformConfig():
+ return parent_configuration.LinuxX64X11Configuration(
+ 'linux-x64x11-blittergles-sbversion-6')
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/6/starboard_platform.gyp b/src/starboard/linux/x64x11/blittergles/sbversion/6/starboard_platform.gyp
new file mode 100644
index 0000000..8163408
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/6/starboard_platform.gyp
@@ -0,0 +1,24 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+ 'includes': [
+ # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file. The idea
+ # is that we just want this file to *be* the parent gyp file.
+ '<(DEPTH)/starboard/linux/x64x11/blittergles/starboard_platform.gyp',
+ ],
+}
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/6/starboard_platform_tests.gyp b/src/starboard/linux/x64x11/blittergles/sbversion/6/starboard_platform_tests.gyp
new file mode 100644
index 0000000..94e7cc2
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/6/starboard_platform_tests.gyp
@@ -0,0 +1,24 @@
+# Copyright 2019 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.
+
+# This file was initially generated by starboard/tools/create_derived_build.py,
+# though it may have been modified since its creation.
+
+{
+ 'includes': [
+ # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file. The idea
+ # is that we just want this file to *be* the parent gyp file.
+ '<(DEPTH)/starboard/linux/x64x11/blittergles/starboard_platform_tests.gyp',
+ ],
+}
diff --git a/src/starboard/linux/x64x11/blittergles/sbversion/6/thread_types_public.h b/src/starboard/linux/x64x11/blittergles/sbversion/6/thread_types_public.h
new file mode 100644
index 0000000..6e977ae
--- /dev/null
+++ b/src/starboard/linux/x64x11/blittergles/sbversion/6/thread_types_public.h
@@ -0,0 +1,23 @@
+// Copyright 2019 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.
+
+// This file was initially generated by starboard/tools/create_derived_build.py,
+// though it may have been modified since its creation.
+
+#ifndef STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_6_THREAD_TYPES_PUBLIC_H_
+#define STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_6_THREAD_TYPES_PUBLIC_H_
+
+#include "starboard/linux/x64x11/blittergles/thread_types_public.h"
+
+#endif // STARBOARD_LINUX_X64X11_BLITTERGLES_SBVERSION_6_THREAD_TYPES_PUBLIC_H_
diff --git a/src/starboard/linux/x64x11/clang/3.6/download_clang.sh b/src/starboard/linux/x64x11/clang/3.6/download_clang.sh
index 15815a2..0117209 100755
--- a/src/starboard/linux/x64x11/clang/3.6/download_clang.sh
+++ b/src/starboard/linux/x64x11/clang/3.6/download_clang.sh
@@ -24,9 +24,9 @@
binary_path="llvm/Release+Asserts/bin/clang++"
-# This version of clang depends on libstdc++-7, version 7.3.0.
+# This version of clang depends on libstdc++-7, version 7.4.0.
# The package "libstdc++-7-dev" provides that version.
-libstdcxx_version="7.3.0"
+libstdcxx_version="7.4.0"
libstdcxx_path="libstdc++-7"
libstdcxx_symlink_folder="${libstdcxx_path}/lib/gcc/x86_64-linux-gnu"
symlink_path="${libstdcxx_symlink_folder}/${libstdcxx_version}"
diff --git a/src/starboard/linux/x64x11/gcc/6.3/compiler_flags.gypi b/src/starboard/linux/x64x11/gcc/6.3/compiler_flags.gypi
index 639e270..cd8b46d 100644
--- a/src/starboard/linux/x64x11/gcc/6.3/compiler_flags.gypi
+++ b/src/starboard/linux/x64x11/gcc/6.3/compiler_flags.gypi
@@ -74,6 +74,12 @@
'-fno-delete-null-pointer-checks',
# Do not warn about unused function params.
'-Wno-unused-parameter',
+ # Do not warn about multi-character character constant values.
+ '-Wno-multichar',
+ # Do not warn for ignoring return value declared with attribute warn_unused_result.
+ '-Wno-unused-result',
+ # Do now warn for unknown pragmas.
+ '-Wno-unknown-pragmas',
],
'conditions': [
['cobalt_fastbuild==0', {
diff --git a/src/starboard/linux/x64x11/gcc/6.3/download_gcc.sh b/src/starboard/linux/x64x11/gcc/6.3/download_gcc.sh
index 6453533..efdd807 100755
--- a/src/starboard/linux/x64x11/gcc/6.3/download_gcc.sh
+++ b/src/starboard/linux/x64x11/gcc/6.3/download_gcc.sh
@@ -24,7 +24,8 @@
binary_path="gcc/bin/g++"
build_duration="about 40 minutes"
-cd $(dirname $0)
+scriptfolder=$(dirname $(realpath $0))
+cd ${scriptfolder}
source ../../toolchain_paths.sh
(
@@ -35,7 +36,14 @@
wget -c http://ftpmirror.gnu.org/gcc/gcc-${version}/${file}.sig
wget -c http://ftp.gnu.org/gnu/gnu-keyring.gpg
signature_invalid=`gpg --verify --no-default-keyring --keyring ./gnu-keyring.gpg ${file}.sig`
- if [ $signature_invalid ]; then echo "Invalid signature" ; exit 1 ; fi
+ if [ $signature_invalid ]; then
+ echo "Invalid signature for " $file
+ exit 1
+ fi
+ echo "f06ae7f3f790fbf0f018f6d40e844451e6bc3b7bc96e128e63b09825c1f8b29f gcc-6.3.0.tar.bz2" | sha256sum -c || (
+ echo "Invalid Checksum for " $file
+ exit 1
+ )
rm -rf gcc-${version}
tar -xjf ${file}
cd gcc-${version}
@@ -43,9 +51,20 @@
if [ -f ./contrib/download_prerequisites ]; then
./contrib/download_prerequisites
fi
+
+ cat <<EOF | sha256sum -c || ( echo "Invalid Checksum for prerequisites"; exit 1 )
+c7e75a08a8d49d2082e4caee1591a05d11b9d5627514e678f02d66a124bcf2ba mpfr-2.4.2.tar.bz2
+936162c0312886c21581002b79932829aa048cfaf9937c6265aeaa14f1cd1775 gmp-4.3.2.tar.bz2
+e664603757251fd8a352848276497a4c79b7f8b21fd8aedd5cc0598a38fee3e4 mpc-0.8.1.tar.gz
+8ceebbf4d9a81afa2b4449113cee4b7cb14a687d7a549a963deb5e2a41458b6b isl-0.15.tar.bz2
+EOF
cd ${toolchain_path}
fi
+ # Patches for compiling with gcc 7.2
+ patch -p1 <${scriptfolder}/ucontext.diff
+ patch -p1 <${scriptfolder}/nosanitizer.diff
+
# Create clean build folder for gcc
rm -rf gcc gcc-${version}-build
mkdir gcc-${version}-build
diff --git a/src/starboard/linux/x64x11/gcc/6.3/gyp_configuration.py b/src/starboard/linux/x64x11/gcc/6.3/gyp_configuration.py
index a5e7568..0066119 100644
--- a/src/starboard/linux/x64x11/gcc/6.3/gyp_configuration.py
+++ b/src/starboard/linux/x64x11/gcc/6.3/gyp_configuration.py
@@ -49,13 +49,13 @@
return variables
def GetEnvironmentVariables(self):
- env_variables = super(LinuxX64X11Gcc63Configuration,
- self).GetEnvironmentVariables()
toolchain_bin_dir = os.path.join(self.toolchain_dir, 'bin')
- env_variables.update({
+ env_variables = {
'CC': os.path.join(toolchain_bin_dir, 'gcc'),
'CXX': os.path.join(toolchain_bin_dir, 'g++'),
- })
+ 'CC_HOST': os.path.join(toolchain_bin_dir, 'gcc'),
+ 'CXX_HOST': os.path.join(toolchain_bin_dir, 'g++'),
+ }
return env_variables
diff --git a/src/starboard/linux/x64x11/gcc/6.3/nosanitizer.diff b/src/starboard/linux/x64x11/gcc/6.3/nosanitizer.diff
new file mode 100644
index 0000000..838bf56
--- /dev/null
+++ b/src/starboard/linux/x64x11/gcc/6.3/nosanitizer.diff
@@ -0,0 +1,17 @@
+diff -ur x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libsanitizer/configure.tgt x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libsanitizer/configure.tgt
+--- x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libsanitizer/configure.tgt 2015-11-23 01:07:18.000000000 -0800
++++ x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libsanitizer/configure.tgt 2019-08-13 15:41:51.394524015 -0700
+@@ -21,13 +21,6 @@
+ # Filter out unsupported systems.
+ TSAN_TARGET_DEPENDENT_OBJECTS=
+ case "${target}" in
+- x86_64-*-linux* | i?86-*-linux*)
+- if test x$ac_cv_sizeof_void_p = x8; then
+- TSAN_SUPPORTED=yes
+- LSAN_SUPPORTED=yes
+- TSAN_TARGET_DEPENDENT_OBJECTS=tsan_rtl_amd64.lo
+- fi
+- ;;
+ powerpc*-*-linux*)
+ ;;
+ sparc*-*-linux*)
diff --git a/src/starboard/linux/x64x11/gcc/6.3/ucontext.diff b/src/starboard/linux/x64x11/gcc/6.3/ucontext.diff
new file mode 100644
index 0000000..31206da
--- /dev/null
+++ b/src/starboard/linux/x64x11/gcc/6.3/ucontext.diff
@@ -0,0 +1,33 @@
+diff -ur x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libgcc/config/aarch64/linux-unwind.h x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libgcc/config/aarch64/linux-unwind.h
+--- x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libgcc/config/aarch64/linux-unwind.h 2016-01-04 06:30:50.000000000 -0800
++++ x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libgcc/config/aarch64/linux-unwind.h 2019-08-13 14:11:12.318898306 -0700
+@@ -52,7 +52,7 @@
+ struct rt_sigframe
+ {
+ siginfo_t info;
+- struct ucontext uc;
++ ucontext_t uc;
+ };
+
+ struct rt_sigframe *rt_;
+diff -ur x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libgcc/config/i386/linux-unwind.h x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libgcc/config/i386/linux-unwind.h
+--- x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libgcc/config/i386/linux-unwind.h 2016-01-04 06:30:50.000000000 -0800
++++ x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libgcc/config/i386/linux-unwind.h 2019-08-13 14:11:20.386855553 -0700
+@@ -58,7 +58,7 @@
+ if (*(unsigned char *)(pc+0) == 0x48
+ && *(unsigned long long *)(pc+1) == RT_SIGRETURN_SYSCALL)
+ {
+- struct ucontext *uc_ = context->cfa;
++ ucontext_t *uc_ = context->cfa;
+ /* The void * cast is necessary to avoid an aliasing warning.
+ The aliasing warning is correct, but should not be a problem
+ because it does not alias anything. */
+@@ -138,7 +138,7 @@
+ siginfo_t *pinfo;
+ void *puc;
+ siginfo_t info;
+- struct ucontext uc;
++ ucontext_t uc;
+ } *rt_ = context->cfa;
+ /* The void * cast is necessary to avoid an aliasing warning.
+ The aliasing warning is correct, but should not be a problem
diff --git a/src/starboard/linux/x64x11/mock/gyp_configuration.py b/src/starboard/linux/x64x11/mock/gyp_configuration.py
index 450394f..2abddb0 100644
--- a/src/starboard/linux/x64x11/mock/gyp_configuration.py
+++ b/src/starboard/linux/x64x11/mock/gyp_configuration.py
@@ -27,8 +27,13 @@
return 'ninja,qtcreator_ninja'
def GetVariables(self, configuration):
- return super(LinuxX64X11MockConfiguration, self).GetVariables(
+ variables = super(LinuxX64X11MockConfiguration, self).GetVariables(
configuration, use_clang=1)
+ variables.update({
+ 'javascript_engine': 'mozjs-45',
+ 'cobalt_enable_jit': 0,
+ })
+ return variables
def GetGeneratorVariables(self, configuration):
del configuration
diff --git a/src/starboard/media.h b/src/starboard/media.h
index a34a3a4..e890124 100644
--- a/src/starboard/media.h
+++ b/src/starboard/media.h
@@ -496,11 +496,7 @@
// The AudioSpecificConfig, as specified in ISO/IEC-14496-3, section 1.6.2.1:
// http://read.pudn.com/downloads98/doc/comm/401153/14496/ISO_IEC_14496-3%20Part%203%20Audio/C036083E_SUB1.PDF
-#if SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
const void* audio_specific_config;
-#else // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
- int8_t audio_specific_config[8];
-#endif // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
} SbMediaAudioSampleInfo;
#if SB_API_VERSION < 11
diff --git a/src/starboard/nplb/audio_sink_get_min_buffer_size_in_frames_test.cc b/src/starboard/nplb/audio_sink_get_min_buffer_size_in_frames_test.cc
new file mode 100644
index 0000000..a07a8c8
--- /dev/null
+++ b/src/starboard/nplb/audio_sink_get_min_buffer_size_in_frames_test.cc
@@ -0,0 +1,56 @@
+// Copyright 2019 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/audio_sink.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace starboard {
+namespace nplb {
+
+#if SB_API_VERSION >= 11
+TEST(SbAudioSinkGetMinBufferSizeInFramesTest, SunnyDay) {
+ SbMediaAudioSampleType sample_type = kSbMediaAudioSampleTypeFloat32;
+ if (!SbAudioSinkIsAudioSampleTypeSupported(sample_type)) {
+ sample_type = kSbMediaAudioSampleTypeInt16Deprecated;
+ }
+ const int kDefaultSampleFrequency = 48000;
+ int max_channels = SbAudioSinkGetMaxChannels();
+ int min_required_frames = SbAudioSinkGetMinBufferSizeInFrames(
+ max_channels, sample_type,
+ SbAudioSinkGetNearestSupportedSampleFrequency(kDefaultSampleFrequency));
+
+ EXPECT_GT(min_required_frames, 0);
+ EXPECT_LE(min_required_frames, 10 * 1024);
+
+ if (max_channels > 1) {
+ min_required_frames = SbAudioSinkGetMinBufferSizeInFrames(
+ 1, sample_type,
+ SbAudioSinkGetNearestSupportedSampleFrequency(kDefaultSampleFrequency));
+
+ EXPECT_GT(min_required_frames, 0);
+ EXPECT_LE(min_required_frames, 10 * 1024);
+ }
+ if (max_channels > 2) {
+ min_required_frames = SbAudioSinkGetMinBufferSizeInFrames(
+ 2, sample_type,
+ SbAudioSinkGetNearestSupportedSampleFrequency(kDefaultSampleFrequency));
+
+ EXPECT_GT(min_required_frames, 0);
+ EXPECT_LE(min_required_frames, 10 * 1024);
+ }
+}
+#endif // SB_API_VERSION >= 11
+
+} // namespace nplb
+} // namespace starboard
diff --git a/src/starboard/nplb/directory_get_next_test.cc b/src/starboard/nplb/directory_get_next_test.cc
index d382284..24c05ba 100644
--- a/src/starboard/nplb/directory_get_next_test.cc
+++ b/src/starboard/nplb/directory_get_next_test.cc
@@ -103,6 +103,20 @@
EXPECT_FALSE(SbDirectoryGetNext(kSbDirectoryInvalid, NULL));
}
+TEST(SbDirectoryGetNextTest, FailureOnEmptyDirectory) {
+ ScopedRandomFile dir(ScopedRandomFile::kDontCreate);
+ const std::string& path = dir.filename();
+ ASSERT_TRUE(SbDirectoryCreate(path.c_str()));
+ SbFileError error = kSbFileErrorMax;
+ SbDirectory directory = SbDirectoryOpen(path.c_str(), &error);
+ ASSERT_TRUE(SbDirectoryIsValid(directory));
+ ASSERT_EQ(kSbFileOk, error);
+
+ SbDirectoryEntry entry = {0};
+ EXPECT_FALSE(SbDirectoryGetNext(directory, &entry));
+ ASSERT_TRUE(SbDirectoryClose(directory));
+}
+
} // namespace
} // namespace nplb
} // namespace starboard
diff --git a/src/starboard/nplb/drm_create_system_test.cc b/src/starboard/nplb/drm_create_system_test.cc
index a59b86a..0b68275 100644
--- a/src/starboard/nplb/drm_create_system_test.cc
+++ b/src/starboard/nplb/drm_create_system_test.cc
@@ -119,7 +119,7 @@
EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
SbDrmDestroySystem(drm_system);
}
-#elif SB_HAS(DRM_KEY_STATUSES)
+#else // SB_HAS(DRM_SESSION_CLOSED)
{
SbDrmSystem drm_system = SbDrmCreateSystem(
key_system, NULL /* context */,
@@ -143,21 +143,7 @@
EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
SbDrmDestroySystem(drm_system);
}
-#else
- {
- SbDrmSystem drm_system = SbDrmCreateSystem(
- key_system, NULL /* context */,
- NULL /* session_update_request_func */, DummySessionUpdatedFunc);
- EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
- }
- {
- SbDrmSystem drm_system = SbDrmCreateSystem(
- key_system, NULL /* context */, DummySessionUpdateRequestFunc,
- NULL /* session_updated_func */);
- EXPECT_FALSE(SbDrmSystemIsValid(drm_system));
- SbDrmDestroySystem(drm_system);
- }
-#endif // SB_HAS(DRM_KEY_STATUSES)
+#endif // SB_HAS(DRM_SESSION_CLOSED)
}
}
#endif // SB_API_VERSION >= 10
diff --git a/src/starboard/nplb/drm_helpers.cc b/src/starboard/nplb/drm_helpers.cc
index 83a7a5e..930fb82 100644
--- a/src/starboard/nplb/drm_helpers.cc
+++ b/src/starboard/nplb/drm_helpers.cc
@@ -67,7 +67,6 @@
#endif // SB_API_VERSION >= 10
-#if SB_HAS(DRM_KEY_STATUSES)
void DummySessionKeyStatusesChangedFunc(SbDrmSystem drm_system,
void* context,
const void* session_id,
@@ -75,7 +74,6 @@
int number_of_keys,
const SbDrmKeyId* key_ids,
const SbDrmKeyStatus* key_statuses) {}
-#endif // SB_HAS(DRM_KEY_STATUSES)
void DummySessionClosedFunc(SbDrmSystem drm_system,
void* context,
@@ -93,15 +91,11 @@
key_system, NULL /* context */, DummySessionUpdateRequestFunc,
DummySessionUpdatedFunc, DummySessionKeyStatusesChangedFunc,
DummySessionClosedFunc);
-#elif SB_HAS(DRM_KEY_STATUSES)
+#else // SB_HAS(DRM_SESSION_CLOSED)
return SbDrmCreateSystem(
key_system, NULL /* context */, DummySessionUpdateRequestFunc,
DummySessionUpdatedFunc, DummySessionKeyStatusesChangedFunc);
-#else // SB_HAS(DRM_KEY_STATUSES)
- return SbDrmCreateSystem(key_system, NULL /* context */,
- DummySessionUpdateRequestFunc,
- DummySessionUpdatedFunc);
-#endif // SB_HAS(DRM_KEY_STATUSES)
+#endif // SB_HAS(DRM_SESSION_CLOSED)
}
} // namespace nplb
diff --git a/src/starboard/nplb/drm_helpers.h b/src/starboard/nplb/drm_helpers.h
index d48ed5e..f6d012d 100644
--- a/src/starboard/nplb/drm_helpers.h
+++ b/src/starboard/nplb/drm_helpers.h
@@ -68,7 +68,6 @@
#endif // SB_API_VERSION >= 10
-#if SB_HAS(DRM_KEY_STATUSES)
void DummySessionKeyStatusesChangedFunc(SbDrmSystem drm_system,
void* context,
const void* session_id,
@@ -76,7 +75,6 @@
int number_of_keys,
const SbDrmKeyId* key_ids,
const SbDrmKeyStatus* key_statuses);
-#endif // SB_HAS(DRM_KEY_STATUSES)
void DummySessionClosedFunc(SbDrmSystem drm_system,
void* context,
diff --git a/src/starboard/nplb/media_set_audio_write_duration_test.cc b/src/starboard/nplb/media_set_audio_write_duration_test.cc
index 0ca9a37..bcbe76a 100644
--- a/src/starboard/nplb/media_set_audio_write_duration_test.cc
+++ b/src/starboard/nplb/media_set_audio_write_duration_test.cc
@@ -242,7 +242,7 @@
SbPlayerDestroy(player);
}
-TEST_P(SbMediaSetAudioWriteDurationTest, WriteContinuedLimitedInput) {
+TEST_P(SbMediaSetAudioWriteDurationTest, FLAKY_WriteContinuedLimitedInput) {
ASSERT_NE(dmp_reader_.audio_codec(), kSbMediaAudioCodecNone);
ASSERT_GT(dmp_reader_.number_of_audio_buffers(), 0);
diff --git a/src/starboard/nplb/nplb.gyp b/src/starboard/nplb/nplb.gyp
index 4338c4d..0dce66d 100644
--- a/src/starboard/nplb/nplb.gyp
+++ b/src/starboard/nplb/nplb.gyp
@@ -46,6 +46,7 @@
'audio_sink_create_test.cc',
'audio_sink_destroy_test.cc',
'audio_sink_get_max_channels_test.cc',
+ 'audio_sink_get_min_buffer_size_in_frames_test.cc',
'audio_sink_get_nearest_supported_sample_frequency_test.cc',
'audio_sink_helpers.cc',
'audio_sink_helpers.h',
@@ -264,6 +265,7 @@
'system_hide_splash_screen_test.cc',
'system_is_debugger_attached_test.cc',
'system_sort_test.cc',
+ 'system_sign_with_certification_secret_key_test.cc',
'system_symbolize_test.cc',
'thread_create_test.cc',
'thread_detach_test.cc',
diff --git a/src/starboard/nplb/system_sign_with_certification_secret_key_test.cc b/src/starboard/nplb/system_sign_with_certification_secret_key_test.cc
new file mode 100644
index 0000000..7b22229
--- /dev/null
+++ b/src/starboard/nplb/system_sign_with_certification_secret_key_test.cc
@@ -0,0 +1,56 @@
+// Copyright 2019 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.
+
+// SbDirectoryClose is well-covered in all the other tests, so just the
+// leftovers are here.
+
+#include <string>
+
+#include "starboard/system.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if SB_API_VERSION >= 11
+
+namespace starboard {
+namespace nplb {
+namespace {
+
+TEST(SbSystemSignWithCertificationSecretKeyTest, DoesNotCrash) {
+ const size_t kDigestSize = 32;
+ uint8_t digest[kDigestSize];
+
+ std::string message("test_message");
+ SbSystemSignWithCertificationSecretKey(
+ reinterpret_cast<const uint8_t*>(message.data()), message.size(), digest,
+ kDigestSize);
+}
+
+// Since SbSystemSignWithCertificationSecretKey() uses the SHA256 algorithm,
+// the output digest size must be at least 256 bits, or 32 bytes.
+TEST(SbSystemSignWithCertificationSecretKeyTest,
+ RainyDayFailsOnLessThan32Bytes) {
+ const size_t kDigestSize = 32;
+ uint8_t digest[kDigestSize];
+
+ std::string message("test_message");
+ EXPECT_FALSE(SbSystemSignWithCertificationSecretKey(
+ reinterpret_cast<const uint8_t*>(message.data()), message.size(), digest,
+ 31));
+}
+
+} // namespace
+} // namespace nplb
+} // namespace starboard
+
+#endif // SB_API_VERSION >= 11
diff --git a/src/starboard/player.h b/src/starboard/player.h
index 4cb0cab..08e16d1 100644
--- a/src/starboard/player.h
+++ b/src/starboard/player.h
@@ -407,11 +407,9 @@
// Otherwise, |audio_sample_info| can be NULL. See media.h for the format of
// the |SbMediaAudioSampleInfo| struct.
#endif // SB_API_VERSION < 11
-#if SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
// Note that |audio_specific_config| is a pointer and the content it points to
// is no longer valid after this function returns. The implementation has to
// make a copy of the content if it is needed after the function returns.
-#endif // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
#if SB_API_VERSION >= 11
// |max_video_capabilities|: This string communicates the video maximums to the
// platform. The web app will not provide a video stream exceeding the
diff --git a/src/starboard/raspi/0/gyp_configuration.py b/src/starboard/raspi/0/gyp_configuration.py
index 933c6ee..b247085 100644
--- a/src/starboard/raspi/0/gyp_configuration.py
+++ b/src/starboard/raspi/0/gyp_configuration.py
@@ -41,6 +41,11 @@
# TODO: debug these failures.
'SbPlayerTest.MultiPlayer', # crashes
],
+ # Temporarily disable most of the tests until we can narrow it down to the
+ # minimum number of cases that are real test failures.
+ 'player_filter_tests': [
+ 'AudioDecoderTest.*',
+ ],
}
diff --git a/src/starboard/raspi/shared/gyp_configuration.py b/src/starboard/raspi/shared/gyp_configuration.py
index e7668ea..f25f2a4 100644
--- a/src/starboard/raspi/shared/gyp_configuration.py
+++ b/src/starboard/raspi/shared/gyp_configuration.py
@@ -107,7 +107,6 @@
# TODO: debug these failures.
'VideoDecoderTests/VideoDecoderTest.EndOfStreamWithoutAnyInput/0',
'VideoDecoderTests/VideoDecoderTest.MultipleResets/0',
- 'VideoDecoderTests/VideoDecoderTest.SingleInvalidInput/*',
'VideoDecoderTests/VideoDecoderTest'
'.MultipleValidInputsAfterInvalidKeyFrame/*',
'VideoDecoderTests/VideoDecoderTest.MultipleInvalidInput/*',
diff --git a/src/starboard/raspi/shared/open_max/video_decoder.cc b/src/starboard/raspi/shared/open_max/video_decoder.cc
index 2d10bfc..712ff8b 100644
--- a/src/starboard/raspi/shared/open_max/video_decoder.cc
+++ b/src/starboard/raspi/shared/open_max/video_decoder.cc
@@ -203,9 +203,6 @@
stream_ended = true;
} else if (event->type == Event::kReset) {
ScopedLock scoped_lock(mutex_);
- component.Flush();
- stream_ended = false;
- eos_written = false;
while (!freed_buffers_.empty()) {
component.DropOutputBuffer(freed_buffers_.front());
@@ -216,6 +213,10 @@
component.DropOutputBuffer(filled_buffers_.front());
filled_buffers_.pop();
}
+
+ component.Flush();
+ stream_ended = false;
+ eos_written = false;
} else {
SB_NOTREACHED() << "event type " << event->type;
}
diff --git a/src/starboard/raspi/shared/starboard_platform.gypi b/src/starboard/raspi/shared/starboard_platform.gypi
index b20edc6..3c0ebb4 100644
--- a/src/starboard/raspi/shared/starboard_platform.gypi
+++ b/src/starboard/raspi/shared/starboard_platform.gypi
@@ -261,6 +261,7 @@
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_create.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_destroy.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_max_channels_5_1.cc',
+ '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_min_buffer_size_in_frames.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_nearest_supported_sample_frequency.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_is_audio_frame_storage_type_supported_interleaved_only.cc',
'<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_is_audio_sample_type_supported_float32_only.cc',
@@ -374,6 +375,7 @@
'<(DEPTH)/starboard/shared/stub/system_get_used_gpu_memory.cc',
'<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
'<(DEPTH)/starboard/shared/stub/system_raise_platform_error.cc',
+ '<(DEPTH)/starboard/shared/stub/system_sign_with_certification_secret_key.cc',
'<(DEPTH)/starboard/shared/stub/ui_nav_get_interface.cc',
'<(DEPTH)/starboard/shared/stub/window_get_diagonal_size_in_inches.cc',
],
diff --git a/src/starboard/shared/alsa/alsa_audio_sink_type.cc b/src/starboard/shared/alsa/alsa_audio_sink_type.cc
index a55e83f..62ae12b 100644
--- a/src/starboard/shared/alsa/alsa_audio_sink_type.cc
+++ b/src/starboard/shared/alsa/alsa_audio_sink_type.cc
@@ -261,6 +261,7 @@
{
ScopedLock lock(mutex_);
if (destroying_) {
+ SB_DLOG(INFO) << "alsa::AlsaAudioSink exits idle loop : destroying";
break;
}
playback_rate = playback_rate_;
@@ -270,6 +271,9 @@
update_source_status_func_(&frames_in_buffer, &offset_in_frames,
&is_playing, &is_eos_reached, context_);
if (is_playing && frames_in_buffer > 0 && playback_rate > 0.0) {
+ SB_DLOG(INFO) << "alsa::AlsaAudioSink exits idle loop : is playing "
+ << is_playing << " frames in buffer " << frames_in_buffer
+ << " playback_rate " << playback_rate;
return true;
}
if (drain) {
@@ -294,6 +298,8 @@
ScopedTryLock lock(mutex_);
if (lock.is_locked()) {
if (destroying_) {
+ SB_DLOG(INFO)
+ << "alsa::AlsaAudioSink exits playback loop : destroying";
break;
}
playback_rate = playback_rate_;
@@ -302,6 +308,8 @@
if (delayed_frame < kMinimumFramesInALSA) {
if (playback_rate == 0.0) {
+ SB_DLOG(INFO)
+ << "alsa::AlsaAudioSink exits playback loop: playback rate 0";
return true;
}
int frames_in_buffer, offset_in_frames;
@@ -309,6 +317,8 @@
update_source_status_func_(&frames_in_buffer, &offset_in_frames,
&is_playing, &is_eos_reached, context_);
if (!is_playing || frames_in_buffer == 0) {
+ SB_DLOG(INFO) << "alsa::AlsaAudioSink exits playback loop: is playing "
+ << is_playing << " frames in buffer " << frames_in_buffer;
return true;
}
WriteFrames(playback_rate, std::min(kFramesPerRequest, frames_in_buffer),
@@ -338,6 +348,9 @@
frames_to_buffer_end);
consume_frame_func_(consumed, context_);
if (consumed != frames_to_buffer_end) {
+ SB_DLOG(INFO) << "alsa::AlsaAudioSink exits write frames : consumed "
+ << consumed << " frames, with " << frames_to_buffer_end
+ << " frames to buffer end";
return;
}
diff --git a/src/starboard/shared/blittergles/blitter_create_default_device.cc b/src/starboard/shared/blittergles/blitter_create_default_device.cc
index abec352..8435118 100644
--- a/src/starboard/shared/blittergles/blitter_create_default_device.cc
+++ b/src/starboard/shared/blittergles/blitter_create_default_device.cc
@@ -115,16 +115,7 @@
return kSbBlitterInvalidDevice;
}
- // When running on Xvfb, sometimes ANGLE fails to open the default X display.
- // By retrying, we increase the chances that eglInitialize() will succeed.
- // This is a temporary fix.
- int max_tries = 3, num_tries = 0;
- bool initialized = false;
- do {
- initialized = eglInitialize(device->display, NULL, NULL);
- ++num_tries;
- } while (!initialized && num_tries < max_tries);
- if (!initialized) {
+ if (!eglInitialize(device->display, NULL, NULL)) {
SB_DLOG(ERROR) << ": Failed to initialize device.";
return kSbBlitterInvalidDevice;
}
diff --git a/src/starboard/shared/iso/impl/directory_get_next.h b/src/starboard/shared/iso/impl/directory_get_next.h
index 488249f..1bb4a1d 100644
--- a/src/starboard/shared/iso/impl/directory_get_next.h
+++ b/src/starboard/shared/iso/impl/directory_get_next.h
@@ -36,12 +36,23 @@
return false;
}
+ // Look for the first directory that isn't current or parent.
struct dirent dirent_buffer;
struct dirent* dirent;
- int result = readdir_r(directory->directory, &dirent_buffer, &dirent);
- if (result || !dirent) {
- return false;
- }
+ int result;
+ do {
+ result = readdir_r(directory->directory, &dirent_buffer, &dirent);
+ if (!result && dirent) {
+ if ((SbStringCompareAll(dirent->d_name, ".") == 0) ||
+ (SbStringCompareAll(dirent->d_name, "..") == 0)) {
+ continue;
+ } else {
+ break;
+ }
+ } else {
+ return false;
+ }
+ } while (true);
SbStringCopy(out_entry->name, dirent->d_name,
SB_ARRAY_SIZE_INT(out_entry->name));
diff --git a/src/starboard/shared/linux/cpu_features_get.cc b/src/starboard/shared/linux/cpu_features_get.cc
index d8ce245..2eeedf1 100644
--- a/src/starboard/shared/linux/cpu_features_get.cc
+++ b/src/starboard/shared/linux/cpu_features_get.cc
@@ -12,6 +12,21 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+// This file contains implementations of SbCPUFeaturesGet() on all supported
+// architectures defined in Starboard header cpu_features.h on linux platform.
+// We use the most applicable and precise approach to get CPU features on each
+// architecture. To be specific,
+//
+// On Arm/Arm64, we read CPU version information from /proc/cpuinfo. We get
+// feature flags by parsing HWCAP bitmasks retrieved from function getauxval()
+// or /proc/self/auxv, or by reading the flags from /proc/cpuinfo.
+//
+// On X86/X86_64, we read CPU version strings from /proc/cpuinfo. We get other
+// CPU version information and feature flags by CPUID instruction, which gives
+// more precise and complete information than reading from /proc/cpuinfo.
+//
+// TODO: Mips/Mips64 and Ppc/Ppc64
+
#include "starboard/cpu_features.h"
#include <dlfcn.h> // dlsym, dlclose, dlopen
@@ -19,7 +34,7 @@
#include <stdio.h> // fopen, fclose
#include <string.h>
#include <strings.h> // strcasecmp
-#include <sys/auxv.h>
+#include <sys/auxv.h> // getauxval()
#include <unistd.h> // sysconf()
#include <memory>
@@ -32,7 +47,10 @@
namespace {
-// See <asm/hwcap.h> kernel header.
+#if SB_IS(ARCH_ARM)
+
+#if SB_IS(32_BIT)
+// See <arch/arm/include/uapi/asm/hwcap.h> kernel header.
#define HWCAP_VFP (1 << 6)
#define HWCAP_IWMMXT (1 << 9)
#define HWCAP_NEON (1 << 12)
@@ -44,7 +62,6 @@
#define HWCAP_VFPD32 (1 << 19) /* set if VFP has 32 regs (not 16) */
#define HWCAP_IDIV (HWCAP_IDIVA | HWCAP_IDIVT)
-// see <uapi/asm/hwcap.h> kernel header
#define HWCAP2_AES (1 << 0)
#define HWCAP2_PMULL (1 << 1)
#define HWCAP2_SHA1 (1 << 2)
@@ -55,39 +72,54 @@
#define HWCAP_SET_FOR_ARMV8 \
(HWCAP_VFP | HWCAP_NEON | HWCAP_VFPv3 | HWCAP_VFPv4 | HWCAP_IDIV)
+#elif SB_IS(64_BIT)
+// See <arch/arm64/include/uapi/asm/hwcap.h> kernel header
+#define HWCAP_FP (1 << 0)
+#define HWCAP_ASIMD (1 << 1)
+#define HWCAP_AES (1 << 3)
+#define HWCAP_PMULL (1 << 4)
+#define HWCAP_SHA1 (1 << 5)
+#define HWCAP_SHA2 (1 << 6)
+#define HWCAP_CRC32 (1 << 7)
+
+#endif // SB_IS(32_BIT)
+
+#elif SB_IS(ARCH_X86)
+
+// x86_xgetbv returns the value of an Intel Extended Control Register (XCR).
+// Currently only XCR0 is defined by Intel so |xcr| should always be zero.
+uint64_t x86_xgetbv(uint32_t xcr) {
+ uint32_t eax, edx;
+
+ __asm__ volatile("xgetbv" : "=a"(eax), "=d"(edx) : "c"(xcr));
+ return (static_cast<uint64_t>(edx) << 32) | eax;
+}
+
+#if SB_IS(32_BIT)
+void x86_cpuid(int cpuid_info[4], int info_type) {
+ __asm__ volatile(
+ "mov %%ebx, %%edi\n"
+ "cpuid\n"
+ "xchg %%edi, %%ebx\n"
+ : "=a"(cpuid_info[0]), "=D"(cpuid_info[1]), "=c"(cpuid_info[2]),
+ "=d"(cpuid_info[3])
+ : "a"(info_type), "c"(0));
+}
+#elif SB_IS(64_BIT)
+void x86_cpuid(int cpuid_info[4], int info_type) {
+ __asm__ volatile("cpuid\n"
+ : "=a"(cpuid_info[0]), "=b"(cpuid_info[1]),
+ "=c"(cpuid_info[2]), "=d"(cpuid_info[3])
+ : "a"(info_type), "c"(0));
+}
+#endif // SB_IS(32_BIT)
+
+#endif // SB_IS(ARCH_ARM)
+
using starboard::shared::SetX86FeaturesInvalid;
using starboard::shared::SetArmFeaturesInvalid;
using starboard::shared::SetGeneralFeaturesInvalid;
-// Checks if a space-separated list of items |list|, in the form of a string,
-// contains one given item |item|.
-bool HasItemInList(const char* list, const char* flag) {
- ssize_t flag_length = strlen(flag);
- const char* list_ptr = list;
- if (list_ptr == nullptr) {
- return false;
- }
- while (*list_ptr != '\0') {
- // Skip whitespace.
- while (isspace(*list_ptr))
- ++list_ptr;
-
- // Find end of current list flag.
- const char* end_ptr = list_ptr;
- while (*end_ptr != '\0' && !isspace(*end_ptr))
- ++end_ptr;
-
- if (flag_length == end_ptr - list_ptr &&
- memcmp(list_ptr, flag, flag_length) == 0) {
- return true;
- }
-
- // Continue to the next flag.
- list_ptr = end_ptr;
- }
- return false;
-}
-
// Class that holds the information in system file /proc/cpuinfo.
class ProcCpuInfo {
// Raw data of the file /proc/cpuinfo
@@ -304,6 +336,36 @@
return hwcap;
}
+#if SB_IS(ARCH_ARM)
+// Checks if a space-separated list of items |list|, in the form of a string,
+// contains one given item |item|.
+bool HasItemInList(const char* list, const char* flag) {
+ ssize_t flag_length = strlen(flag);
+ const char* list_ptr = list;
+ if (list_ptr == nullptr) {
+ return false;
+ }
+ while (*list_ptr != '\0') {
+ // Skip whitespace.
+ while (isspace(*list_ptr))
+ ++list_ptr;
+
+ // Find end of current list flag.
+ const char* end_ptr = list_ptr;
+ while (*end_ptr != '\0' && !isspace(*end_ptr))
+ ++end_ptr;
+
+ if (flag_length == end_ptr - list_ptr &&
+ memcmp(list_ptr, flag, flag_length) == 0) {
+ return true;
+ }
+
+ // Continue to the next flag.
+ list_ptr = end_ptr;
+ }
+ return false;
+}
+
// Construct hwcap bitmask by the feature flags in /proc/cpuinfo
uint32_t ConstructHwcapFromCPUInfo(ProcCpuInfo* cpu_info,
int16_t architecture_generation,
@@ -352,8 +414,13 @@
bool SbCPUFeaturesGet_ARM(SbCPUFeatures* features) {
memset(features, 0, sizeof(*features));
- // Raspi is a 32-bit ARM platform.
+#if SB_IS(32_BIT)
features->architecture = kSbCPUFeaturesArchitectureArm;
+#elif SB_IS(64_BIT)
+ features->architecture = kSbCPUFeaturesArchitectureArm64;
+#else
+#error "Your platform must be either 32-bit or 64-bit."
+#endif
// Set the default value of the features to be invalid, then fill them in
// if appropriate.
@@ -399,7 +466,11 @@
// ARMv7-based CPU, and "(v6l)" for an ARMv6-one. For example,
// the Raspberry Pi is one popular ARMv6 device that reports
// architecture 7. The 'Processor' or 'model name' fields
- // also contain processor brand information.
+ // also contain processor brand information. "model name" is used in
+ // Linux 3.8 and later (3.7
+ // and later for arm64) and is shown once per CPU. "Processor" is used in
+ // earler versions and is shown only once at the top of /proc/cpuinfo
+ // regardless of the number CPUs.
// Allocate 256 bytes for "Processor"/"model name" field.
static char brand_buffer[256] = {0};
@@ -418,6 +489,7 @@
}
}
+#if SB_IS(32_BIT)
// Get hwcap bitmask and extract the CPU feature flags from it.
features->hwcap = ReadElfHwcaps(AT_HWCAP);
if (features->hwcap == 0) {
@@ -481,10 +553,22 @@
features->arm.has_aes = (features->hwcap2 & HWCAP2_AES) != 0;
features->arm.has_pmull = (features->hwcap2 & HWCAP2_PMULL) != 0;
- features->arm.has_sha1 = (features->hwcap2 & HWCAP2_PMULL) != 0;
+ features->arm.has_sha1 = (features->hwcap2 & HWCAP2_SHA1) != 0;
features->arm.has_sha2 = (features->hwcap2 & HWCAP2_SHA2) != 0;
features->arm.has_crc32 = (features->hwcap2 & HWCAP2_CRC32) != 0;
+#elif SB_IS(64_BIT)
+ // Read hwcaps bitmask and extract the CPU feature flags from it.
+ features->hwcap = ReadElfHwcaps(AT_HWCAP);
+
+ features->arm.has_aes = (features->hwcap & HWCAP_AES) != 0;
+ features->arm.has_pmull = (features->hwcap & HWCAP_PMULL) != 0;
+ features->arm.has_sha1 = (features->hwcap & HWCAP_SHA1) != 0;
+ features->arm.has_sha2 = (features->hwcap & HWCAP_SHA2) != 0;
+ features->arm.has_crc32 = (features->hwcap & HWCAP_CRC32) != 0;
+
+#endif // SB_IS(32_BIT)
+
// Get L1 ICACHE and DCACHE line size.
features->icache_line_size = sysconf(_SC_LEVEL1_ICACHE_LINESIZE);
features->dcache_line_size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
@@ -492,12 +576,158 @@
return true;
}
+#elif SB_IS(ARCH_X86)
+
+bool SbCPUFeaturesGet_X86(SbCPUFeatures* features) {
+ memset(features, 0, sizeof(*features));
+
+#if SB_IS(32_BIT)
+ features->architecture = kSbCPUFeaturesArchitectureX86;
+#elif SB_IS(64_BIT)
+ features->architecture = kSbCPUFeaturesArchitectureX86_64;
+#else
+#error "Your platform must be either 32-bit or 64-bit."
+#endif
+
+ // Set the default value of the features to be invalid, then fill them in
+ // if appropriate.
+ SetGeneralFeaturesInvalid(features);
+ SetArmFeaturesInvalid(features);
+ SetX86FeaturesInvalid(features);
+
+ ProcCpuInfo cpu_info;
+
+ // Extract brand and vendor information.
+ // Allocate 256 bytes for "model name" field.
+ static char brand_buffer[256] = {0};
+ if (cpu_info.ExtractStringFeature(
+ "model name", brand_buffer,
+ sizeof(brand_buffer) / sizeof(brand_buffer[0]))) {
+ features->brand = brand_buffer;
+ }
+
+ // Allocate 128 bytes for "vendor_id" field.
+ static char vendor_buffer[128] = {0};
+ if (cpu_info.ExtractStringFeature(
+ "vendor_id", vendor_buffer,
+ sizeof(vendor_buffer) / sizeof(vendor_buffer[0]))) {
+ features->x86.vendor = vendor_buffer;
+ }
+
+ // Get L1 ICACHE and DCACHE line size.
+ features->icache_line_size = sysconf(_SC_LEVEL1_ICACHE_LINESIZE);
+ features->dcache_line_size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
+
+ // Hwcap bitmasks are not applicable to x86/x86_64. They'll remain 0.
+
+ // Use cpuid instruction to get feature flags.
+ int cpuid_info[4] = {0};
+
+ // x86_cpuid with an InfoType argument of 0 returns the number of
+ // valid Ids in cpuid_info[0].
+ x86_cpuid(cpuid_info, 0);
+ unsigned int num_ids = cpuid_info[0];
+
+ // Interpret CPU feature information of CPUID level 1. EAX is returned
+ // in cpuid_info[0], EBX in cpuid_info[1], ECX in cpuid_info[2],
+ // EDX in cpuid_info[3].
+ if (num_ids > 0) {
+ x86_cpuid(cpuid_info, 1);
+ features->x86.signature = cpuid_info[0];
+ features->x86.stepping = cpuid_info[0] & 0xF;
+ features->x86.model =
+ ((cpuid_info[0] >> 4) & 0xF) + ((cpuid_info[0] >> 12) & 0xF0);
+ features->x86.family = (cpuid_info[0] >> 8) & 0xF;
+ features->x86.type = (cpuid_info[0] >> 12) & 0x3;
+ features->x86.ext_model = (cpuid_info[0] >> 16) & 0xF;
+ features->x86.ext_family = (cpuid_info[0] >> 20) & 0xFF;
+
+ features->has_fpu = (cpuid_info[3] & (1 << 0)) != 0;
+
+ features->x86.has_cmov = (cpuid_info[3] & (1 << 15)) != 0;
+ features->x86.has_mmx = (cpuid_info[3] & (1 << 23)) != 0;
+ features->x86.has_sse = (cpuid_info[3] & (1 << 25)) != 0;
+ features->x86.has_sse2 = (cpuid_info[3] & (1 < 26)) != 0;
+ features->x86.has_tsc = (cpuid_info[3] & (1 << 4)) != 0;
+
+ features->x86.has_sse3 = (cpuid_info[2] & (1 << 0)) != 0;
+ features->x86.has_ssse3 = (cpuid_info[2] & (1 << 9)) != 0;
+ features->x86.has_sse41 = (cpuid_info[2] & (1 << 19)) != 0;
+ features->x86.has_sse42 = (cpuid_info[2] & (1 << 20)) != 0;
+ features->x86.has_movbe = (cpuid_info[2] & (1 << 22)) != 0;
+ features->x86.has_popcnt = (cpuid_info[2] & (1 << 23)) != 0;
+ features->x86.has_osxsave = (cpuid_info[2] & (1 << 27)) != 0;
+ features->x86.has_f16c = (cpuid_info[2] & (1 << 29)) != 0;
+ features->x86.has_fma3 = (cpuid_info[2] & (1 << 12)) != 0;
+ features->x86.has_aesni = (cpuid_info[2] & (1 << 25)) != 0;
+
+ // AVX instructions will generate an illegal instruction exception unless
+ // a) they are supported by the CPU,
+ // b) XSAVE is supported by the CPU and
+ // c) XSAVE is enabled by the kernel.
+ // See http://software.intel.com/en-us/blogs/2011/04/14/is-avx-enabled
+ //
+ // In addition, we have observed some crashes with the xgetbv instruction
+ // even after following Intel's example code. (See crbug.com/375968.)
+ // Because of that, we also test the XSAVE bit because its description in
+ // the CPUID documentation suggests that it signals xgetbv support.
+ features->x86.has_avx =
+ (cpuid_info[2] & (1 << 28)) != 0 &&
+ (cpuid_info[2] & (1 << 26)) != 0 /* XSAVE */ &&
+ (cpuid_info[2] & (1 << 27)) != 0 /* OSXSAVE */ &&
+ (x86_xgetbv(0) & 6) == 6 /* XSAVE enabled by kernel */;
+ }
+
+ // Interpret CPU feature information of CPUID level 7.
+ if (num_ids >= 7) {
+ x86_cpuid(cpuid_info, 7);
+ features->x86.has_avx2 =
+ features->x86.has_avx && (cpuid_info[1] & (1 << 5)) != 0;
+ features->x86.has_avx512f =
+ features->x86.has_avx && (cpuid_info[1] & (1 << 16)) != 0;
+ features->x86.has_avx512dq =
+ features->x86.has_avx && (cpuid_info[1] & (1 << 17)) != 0;
+ features->x86.has_avx512ifma =
+ features->x86.has_avx && (cpuid_info[1] & (1 << 21)) != 0;
+ features->x86.has_avx512pf =
+ features->x86.has_avx && (cpuid_info[1] & (1 << 26)) != 0;
+ features->x86.has_avx512er =
+ features->x86.has_avx && (cpuid_info[1] & (1 << 27)) != 0;
+ features->x86.has_avx512cd =
+ features->x86.has_avx && (cpuid_info[1] & (1 << 28)) != 0;
+ features->x86.has_avx512bw =
+ features->x86.has_avx && (cpuid_info[1] & (1 << 30)) != 0;
+ features->x86.has_avx512vl =
+ features->x86.has_avx && (cpuid_info[1] & (1 << 31)) != 0;
+ features->x86.has_bmi1 = (cpuid_info[1] & (1 << 3)) != 0;
+ features->x86.has_bmi2 = (cpuid_info[1] & (1 << 8)) != 0;
+ }
+
+ // Query extended IDs.
+ x86_cpuid(cpuid_info, 0x80000000);
+ unsigned int num_ext_ids = cpuid_info[0];
+
+ // Interpret extended CPU feature information.
+ if (num_ext_ids > 0x80000000) {
+ // Interpret CPU feature information of CPUID level 0x80000001.
+ x86_cpuid(cpuid_info, 0x80000001);
+ features->x86.has_lzcnt = (cpuid_info[2] & (1 << 5)) != 0;
+ // SAHF must be probed in long mode.
+ features->x86.has_sahf = (cpuid_info[2] & (1 << 0)) != 0;
+ }
+
+ return true;
+}
+#endif
+
} // namespace
-// TODO: Only ARM is currently implemented and tested
+// TODO: Only ARM/ARM64 and X86/X86_64 are currently implemented and tested
bool SbCPUFeaturesGet(SbCPUFeatures* features) {
#if SB_IS(ARCH_ARM)
return SbCPUFeaturesGet_ARM(features);
+#elif SB_IS(ARCH_X86)
+ return SbCPUFeaturesGet_X86(features);
#else
SB_NOTIMPLEMENTED();
diff --git a/src/starboard/shared/linux/dev_input/dev_input.cc b/src/starboard/shared/linux/dev_input/dev_input.cc
index b051f00..4e76bb4 100644
--- a/src/starboard/shared/linux/dev_input/dev_input.cc
+++ b/src/starboard/shared/linux/dev_input/dev_input.cc
@@ -21,12 +21,15 @@
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
+#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
+#include <memory>
#include <string>
+#include <vector>
#include "starboard/common/log.h"
#include "starboard/common/string.h"
@@ -35,6 +38,7 @@
#include "starboard/input.h"
#include "starboard/key.h"
#include "starboard/memory.h"
+#include "starboard/once.h"
#include "starboard/shared/posix/handle_eintr.h"
#include "starboard/shared/posix/time_internal.h"
@@ -60,15 +64,149 @@
kTouchPadPositionAll = kTouchPadPositionX | kTouchPadPositionY
};
+class ControllerTuning {
+ public:
+ ~ControllerTuning() {}
+
+ uint16_t GetKeyCode(uint16_t from);
+ void MapKeyCode(uint16_t from, uint16_t to) { key_map_[from] = to; }
+
+ float GetMinimumFlat() { return minimum_flat_; }
+ void SetMinimumFlat(float value) { minimum_flat_ = value; }
+
+ protected:
+ // Only create this object from DeviceMap::CreateControllerTuning()
+ ControllerTuning() {}
+
+ private:
+ std::unordered_map<int, int> key_map_;
+ float minimum_flat_ = 0;
+
+ friend class DeviceMap;
+};
+
+uint16_t ControllerTuning::GetKeyCode(uint16_t from) {
+ auto mapped_code = key_map_.find(from);
+ if (mapped_code != key_map_.end()) {
+ return mapped_code->second;
+ }
+ return from;
+}
+
+class DeviceMap {
+ public:
+ DeviceMap();
+ ~DeviceMap() = delete;
+
+ // Gets the singleton instance of the default DeviceMap. This
+ // is created the first time it is used.
+ static DeviceMap* Get();
+
+ // Return the controller tuning object for a given device. Return null if none
+ // is registered.
+ ControllerTuning* GetControllerTuning(const std::string& device) const;
+
+ private:
+ // Create a controllertuning object.
+ ControllerTuning* CreateControllerTuning();
+
+ // Register a controller tuning object for a given device.
+ void RegisterControllerTuning(const std::string& device,
+ ControllerTuning* tuning);
+
+ std::unordered_map<std::string, ControllerTuning*> device_map_;
+
+ // Registry for all known controller tunings.
+ std::vector<std::unique_ptr<ControllerTuning>> controller_tunings_;
+};
+
+DeviceMap::DeviceMap() {
+ // Add key mappings for the Xbox controllers.
+ ControllerTuning* xbox_one_controller = CreateControllerTuning();
+ RegisterControllerTuning("Microsoft X-Box One S pad", xbox_one_controller);
+ RegisterControllerTuning("Microsoft X-Box One pad", xbox_one_controller);
+ RegisterControllerTuning("Microsoft X-Box 360 pad", xbox_one_controller);
+ xbox_one_controller->SetMinimumFlat(0.125);
+ xbox_one_controller->MapKeyCode(BTN_NORTH, BTN_WEST); // Map for 'X'
+ xbox_one_controller->MapKeyCode(BTN_WEST, BTN_NORTH); // Map for 'Y'
+ xbox_one_controller->MapKeyCode(BTN_TL, BTN_TL2); // Map for left bumper.
+ xbox_one_controller->MapKeyCode(BTN_TR, BTN_TR2); // Map for right bumper.
+
+ // Add key mappings for the PlayStation 4 controller.
+ ControllerTuning* ps4_controller = CreateControllerTuning();
+ RegisterControllerTuning("Sony Interactive Entertainment Wireless Controller",
+ ps4_controller);
+ RegisterControllerTuning("Sony Computer Entertainment Wireless Controller",
+ ps4_controller);
+ RegisterControllerTuning("Sony PLAYSTATION(R)3 Controller", ps4_controller);
+
+ ps4_controller->MapKeyCode(BTN_TL2, BTN_TL); // Map for left trigger.
+ ps4_controller->MapKeyCode(BTN_TR2, BTN_TR); // Map for right trigger.
+ ps4_controller->MapKeyCode(BTN_TL, BTN_TL2); // Map for left bumper.
+ ps4_controller->MapKeyCode(BTN_TR, BTN_TR2); // Map for right bumper.
+
+ // Add key mappings for the Horipad Switch wired controller.
+ ControllerTuning* switch_controller = CreateControllerTuning();
+ RegisterControllerTuning("HORI CO.,LTD. HORIPAD S", switch_controller);
+
+ switch_controller->MapKeyCode(BTN_C, BTN_SOUTH); // Map for 'A'.
+ switch_controller->MapKeyCode(BTN_A, BTN_NORTH); // Map for 'Y'.
+ switch_controller->MapKeyCode(BTN_NORTH, BTN_WEST); // Map for 'X'.
+ switch_controller->MapKeyCode(BTN_WEST, BTN_TL2); // Map for left bumper.
+ switch_controller->MapKeyCode(BTN_Z, BTN_TR2); // Map for right bumper.
+
+ switch_controller->MapKeyCode(BTN_THUMBL, BTN_SELECT); // Map for 'capture'.
+ switch_controller->MapKeyCode(BTN_MODE, KEY_HOME); // Map for 'home'.
+
+ switch_controller->MapKeyCode(BTN_TL2, KEY_KPMINUS); // Map for '-'.
+ switch_controller->MapKeyCode(BTN_TR2, KEY_KPPLUS); // Map for '+'.
+
+ switch_controller->MapKeyCode(BTN_SELECT, BTN_THUMBL); // Map for left hat.
+ switch_controller->MapKeyCode(BTN_START, BTN_THUMBR); // Map for right hat.
+}
+
+void DeviceMap::RegisterControllerTuning(const std::string& device,
+ ControllerTuning* tuning) {
+ SB_DCHECK(GetControllerTuning(device) == NULL ||
+ GetControllerTuning(device) == tuning);
+ device_map_[device] = tuning;
+}
+
+ControllerTuning* DeviceMap::CreateControllerTuning() {
+ ControllerTuning* tuning = new ControllerTuning();
+ controller_tunings_.emplace_back(tuning);
+ return tuning;
+}
+
+ControllerTuning* DeviceMap::GetControllerTuning(
+ const std::string& device) const {
+ auto mapped_device = device_map_.find(device);
+ if (mapped_device != device_map_.end()) {
+ return mapped_device->second;
+ }
+ return NULL;
+}
+
+SB_ONCE_INITIALIZE_FUNCTION(DeviceMap, GetDeviceMap);
+
+DeviceMap* DeviceMap::Get() {
+ DeviceMap* device_map = GetDeviceMap();
+ return device_map;
+}
+
struct InputDeviceInfo {
InputDeviceInfo() : fd(-1), touchpad_position_state(kTouchPadPositionNone) {}
+ // Device Name
+ std::string name;
+
// File descriptor open for the device
FileDescriptor fd;
// Absolute Axis info.
std::map<int, struct input_absinfo> axis_info;
std::map<int, float> axis_value;
int touchpad_position_state;
+ ControllerTuning* tuning;
};
bool IsTouchpadPositionKnown(InputDeviceInfo* device_info) {
@@ -92,21 +230,22 @@
// Converts an input_event into a kSbEventInput Application::Event. The caller
// is responsible for deleting the returned event.
Event* InputToApplicationEvent(const struct input_event& event,
- InputDeviceInfo* device_info,
- int modifiers);
+ int modifiers,
+ InputDeviceInfo* device_info);
// Converts an input_event containing a key input into a kSbEventInput
// Application::Event. The caller is responsible for deleting the returned
// event.
Event* KeyInputToApplicationEvent(const struct input_event& event,
- int modifiers);
+ int modifiers,
+ InputDeviceInfo* device_info);
// Converts an input_event containing an axis event into a kSbEventInput
// Application::Event. The caller is responsible for deleting the returned
// event.
Event* AxisInputToApplicationEvent(const struct input_event& event,
- InputDeviceInfo* device_info,
- int modifiers);
+ int modifiers,
+ InputDeviceInfo* device_info);
// The window to attribute /dev/input events to.
SbWindow window_;
@@ -432,34 +571,28 @@
return kSbKeyGamepadDPadLeft;
case BTN_DPAD_RIGHT:
return kSbKeyGamepadDPadRight;
- // The mapping for the buttons below can vary from controller to controller.
- // TODO: Include button mapping for controllers with different layout.
- case BTN_B:
- return kSbKeyGamepad1;
- case BTN_C:
- return kSbKeyGamepad2;
- case BTN_A:
- return kSbKeyGamepad3;
- case BTN_X:
- return kSbKeyGamepad4;
- case BTN_Y:
- return kSbKeyGamepadLeftBumper;
- case BTN_Z:
- return kSbKeyGamepadRightBumper;
case BTN_TL2:
- return kSbKeyGamepad5;
+ return kSbKeyGamepadLeftBumper;
case BTN_TR2:
- return kSbKeyGamepad6;
+ return kSbKeyGamepadRightBumper;
+ case BTN_SOUTH:
+ return kSbKeyGamepad1;
+ case BTN_EAST:
+ return kSbKeyGamepad2;
+ case BTN_WEST:
+ return kSbKeyGamepad3;
+ case BTN_NORTH:
+ return kSbKeyGamepad4;
case BTN_SELECT:
- return kSbKeyGamepadLeftStick;
+ return kSbKeyGamepad5;
case BTN_START:
- return kSbKeyGamepadRightStick;
+ return kSbKeyGamepad6;
case BTN_MODE:
return kSbKeyGamepadSystem;
case BTN_THUMBL:
- return kSbKeyGamepad1;
+ return kSbKeyGamepadLeftStick;
case BTN_THUMBR:
- return kSbKeyGamepad1;
+ return kSbKeyGamepadRightStick;
}
SB_DLOG(WARNING) << "Unknown code: 0x" << std::hex << code;
return kSbKeyUnknown;
@@ -494,19 +627,26 @@
return !!(bitset.at(bit / 8) & (1 << (bit % 8)));
}
-bool IsAxisFlat(float median, const struct input_absinfo& axis_info) {
+bool IsAxisFlat(int minimum_flat,
+ float rest_value,
+ const struct input_absinfo& axis_info) {
SB_DCHECK((axis_info.flat * 2) <= (axis_info.maximum - axis_info.minimum));
- return (axis_info.flat != 0) && (axis_info.value > median - axis_info.flat) &&
- (axis_info.value < median + axis_info.flat);
+ int flat = std::max(minimum_flat, axis_info.flat);
+ return (flat != 0) && (axis_info.value > rest_value - flat) &&
+ (axis_info.value < rest_value + flat);
}
-float GetAxisValue(const struct input_absinfo& axis_info) {
+float GetAxisValue(bool is_trigger,
+ float minimum_flat,
+ const struct input_absinfo& axis_info) {
float median =
static_cast<float>(axis_info.maximum + axis_info.minimum) / 2.0f;
- if (IsAxisFlat(median, axis_info))
- return 0;
float range = static_cast<float>(axis_info.maximum - axis_info.minimum);
float radius = range / 2.0f;
+ if (IsAxisFlat(minimum_flat * radius, is_trigger ? axis_info.minimum : median,
+ axis_info)) {
+ return is_trigger ? -1 : 0;
+ }
// Scale the axis value to [-1, 1].
float axis_value = (static_cast<float>(axis_info.value) - median) / radius;
@@ -532,11 +672,22 @@
return;
}
info->axis_info.insert(std::make_pair(axis, axis_info));
- info->axis_value.insert(std::make_pair(axis, GetAxisValue(axis_info)));
+ bool is_trigger = axis == ABS_Z || axis == ABS_RZ;
+ info->axis_value.insert(std::make_pair(
+ axis,
+ GetAxisValue(is_trigger, info->tuning->GetMinimumFlat(), axis_info)));
}
}
void GetInputDeviceInfo(InputDeviceInfo* info) {
+ char device_name[1024];
+ if (ioctl(info->fd, EVIOCGNAME(sizeof(device_name)), device_name) >= 0) {
+ size_t length = strnlen(device_name, sizeof(device_name));
+ info->name.assign(device_name, length);
+ }
+
+ info->tuning = DeviceMap::Get()->GetControllerTuning(info->name);
+
std::vector<uint8_t> axis_bits(BytesNeededForBitSet(KEY_MAX));
int result =
ioctl(info->fd, EVIOCGBIT(EV_ABS, axis_bits.size()), axis_bits.data());
@@ -811,7 +962,7 @@
continue;
}
- return InputToApplicationEvent(event, &device, modifiers);
+ return InputToApplicationEvent(event, modifiers, &device);
}
return NULL;
}
@@ -968,8 +1119,8 @@
DevInput::Event* DevInputImpl::AxisInputToApplicationEvent(
const struct input_event& event,
- InputDeviceInfo* device_info,
- int modifiers) {
+ int modifiers,
+ InputDeviceInfo* device_info) {
SB_DCHECK(event.type == EV_ABS);
SbKey key = kSbKeyUnknown;
float axis_value = 0;
@@ -978,7 +1129,9 @@
if (axis_info_it != device_info->axis_info.end()) {
struct input_absinfo& axis_info = axis_info_it->second;
axis_info.value = event.value;
- axis_value = GetAxisValue(axis_info);
+ bool is_trigger = event.code == ABS_Z || event.code == ABS_RZ;
+ axis_value = GetAxisValue(is_trigger, device_info->tuning->GetMinimumFlat(),
+ axis_info);
float& stored_axis_value = device_info->axis_value[event.code];
previous_axis_value = stored_axis_value;
if (previous_axis_value == axis_value) {
@@ -1009,21 +1162,21 @@
return CreateMoveEventWithKey(window_, key, location, modifiers,
input_vector);
}
- case ABS_Z:
+ case ABS_RX:
input_vector.x = axis_value;
input_vector.y = device_info->axis_value[ABS_RZ];
key = kSbKeyGamepadRightStickLeft;
location = kSbKeyLocationRight;
return CreateMoveEventWithKey(window_, key, location, modifiers,
input_vector);
- case ABS_RZ:
+ case ABS_RY:
input_vector.x = device_info->axis_value[ABS_Z];
input_vector.y = axis_value;
key = kSbKeyGamepadRightStickUp;
location = kSbKeyLocationRight;
return CreateMoveEventWithKey(window_, key, location, modifiers,
input_vector);
- case ABS_RX: {
+ case ABS_Z: {
key = kSbKeyGamepadLeftTrigger;
location = kSbKeyLocationLeft;
// For trigger buttons, the range is [0..1].
@@ -1033,7 +1186,7 @@
previous_trigger_value, key, location,
modifiers, event);
}
- case ABS_RY: {
+ case ABS_RZ: {
key = kSbKeyGamepadRightTrigger;
location = kSbKeyLocationRight;
// For trigger buttons, the range is [0..1].
@@ -1120,9 +1273,18 @@
DevInput::Event* DevInputImpl::KeyInputToApplicationEvent(
const struct input_event& event,
- int modifiers) {
+ int modifiers,
+ InputDeviceInfo* device_info) {
SB_DCHECK(event.type == EV_KEY);
SB_DCHECK(event.value <= 2);
+
+ SbKey key = KeyCodeToSbKey(device_info->tuning
+ ? device_info->tuning->GetKeyCode(event.code)
+ : event.code);
+ if (key == kSbKeyUnknown) {
+ return NULL;
+ }
+
SbInputData* data = new SbInputData();
SbMemorySet(data, 0, sizeof(*data));
#if SB_API_VERSION >= 10
@@ -1133,7 +1295,7 @@
(event.value == 0 ? kSbInputEventTypeUnpress : kSbInputEventTypePress);
data->device_type = kSbInputDeviceTypeKeyboard;
data->device_id = kKeyboardDeviceId;
- data->key = KeyCodeToSbKey(event.code);
+ data->key = key;
data->key_location = KeyCodeToSbKeyLocation(event.code);
data->key_modifiers = modifiers;
return new Event(kSbEventTypeInput, data,
@@ -1142,15 +1304,15 @@
DevInput::Event* DevInputImpl::InputToApplicationEvent(
const struct input_event& event,
- InputDeviceInfo* device_info,
- int modifiers) {
+ int modifiers,
+ InputDeviceInfo* device_info) {
// EV_ABS events are axis values: Sticks, dpad, and touchpad.
// https://www.kernel.org/doc/Documentation/input/event-codes.txt
switch (event.type) {
case EV_ABS:
- return AxisInputToApplicationEvent(event, device_info, modifiers);
+ return AxisInputToApplicationEvent(event, modifiers, device_info);
case EV_KEY:
- return KeyInputToApplicationEvent(event, modifiers);
+ return KeyInputToApplicationEvent(event, modifiers, device_info);
}
return NULL;
}
diff --git a/src/starboard/shared/starboard/audio_sink/audio_sink_get_min_buffer_size_in_frames.cc b/src/starboard/shared/starboard/audio_sink/audio_sink_get_min_buffer_size_in_frames.cc
new file mode 100644
index 0000000..6bbaf73
--- /dev/null
+++ b/src/starboard/shared/starboard/audio_sink/audio_sink_get_min_buffer_size_in_frames.cc
@@ -0,0 +1,37 @@
+// Copyright 2019 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/audio_sink.h"
+
+#include "starboard/common/log.h"
+
+int SbAudioSinkGetMinBufferSizeInFrames(int channels,
+ SbMediaAudioSampleType sample_type,
+ int sampling_frequency_hz) {
+ if (channels <= 0 || channels > SbAudioSinkGetMaxChannels()) {
+ SB_LOG(ERROR) << "Not support channels count " << channels;
+ return -1;
+ }
+ if (sample_type != kSbMediaAudioSampleTypeInt16Deprecated &&
+ sample_type != kSbMediaAudioSampleTypeFloat32) {
+ SB_LOG(ERROR) << "Not support sample type " << sample_type;
+ return -1;
+ }
+ if (sampling_frequency_hz <= 0) {
+ SB_LOG(ERROR) << "Not support sample frequency " << sampling_frequency_hz;
+ return -1;
+ }
+
+ return 8 * 1024;
+}
diff --git a/src/starboard/shared/starboard/media/media_is_audio_supported_aac_and_opus.cc b/src/starboard/shared/starboard/media/media_is_audio_supported_aac_and_opus.cc
index 9772e30..e137651 100644
--- a/src/starboard/shared/starboard/media/media_is_audio_supported_aac_and_opus.cc
+++ b/src/starboard/shared/starboard/media/media_is_audio_supported_aac_and_opus.cc
@@ -23,11 +23,9 @@
return bitrate <= SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND;
}
-#if SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
if (audio_codec == kSbMediaAudioCodecOpus) {
return bitrate <= SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND;
}
-#endif // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
return false;
}
diff --git a/src/starboard/shared/starboard/player/filter/audio_renderer_internal.cc b/src/starboard/shared/starboard/player/filter/audio_renderer_internal.cc
index 996f9aa..8d4695e 100644
--- a/src/starboard/shared/starboard/player/filter/audio_renderer_internal.cc
+++ b/src/starboard/shared/starboard/player/filter/audio_renderer_internal.cc
@@ -80,6 +80,10 @@
process_audio_data_job_(
std::bind(&AudioRenderer::ProcessAudioData, this)),
audio_renderer_sink_(audio_renderer_sink.Pass()) {
+ SB_DLOG(INFO) << "Creating AudioRenderer with " << channels_ << " channels, "
+ << bytes_per_frame_ << " bytes per frame, "
+ << max_cached_frames_ << " max cached frames, and "
+ << max_frames_per_append_ << " max frames per append.";
SB_DCHECK(decoder_ != NULL);
SB_DCHECK(max_frames_per_append_ > 0);
SB_DCHECK(max_cached_frames_ >= max_frames_per_append_ * 2);
@@ -93,6 +97,10 @@
}
AudioRenderer::~AudioRenderer() {
+ SB_DLOG(INFO) << "Destroying AudioRenderer with " << channels_
+ << " channels, " << bytes_per_frame_ << " bytes per frame, "
+ << max_cached_frames_ << " max cached frames, and "
+ << max_frames_per_append_ << " max frames per append.";
SB_DCHECK(BelongsToCurrentThread());
}
@@ -470,7 +478,8 @@
total_frames_consumed_by_sink_ - silence_frames_consumed_on_sink_thread_);
underflow_ |=
frames_in_buffer_on_sink_thread_ < kFramesInBufferBeginUnderflow;
- if (is_eos_reached_on_sink_thread_) {
+ if (is_eos_reached_on_sink_thread_ ||
+ frames_in_buffer_on_sink_thread_ >= buffered_frames_to_start_) {
underflow_ = false;
}
is_playing_on_sink_thread_ = !paused_ && !seeking_ && !underflow_;
@@ -494,6 +503,9 @@
time_stretcher_.Initialize(sink_sample_type_, channels_,
destination_sample_rate);
+ // Start play after have enough buffered frames to play 0.2s.
+ buffered_frames_to_start_ = destination_sample_rate * 0.2;
+
SbMediaAudioSampleType source_sample_type = decoder_->GetSampleType();
SbMediaAudioFrameStorageType source_storage_type = decoder_->GetStorageType();
@@ -656,7 +668,6 @@
seeking_ = false;
Schedule(prerolled_cb_);
}
- underflow_ = false;
}
if (seeking_ || playback_rate_ == 0.0) {
diff --git a/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h b/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h
index ef27230..43be250 100644
--- a/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h
+++ b/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h
@@ -104,6 +104,9 @@
const int max_cached_frames_;
const int max_frames_per_append_;
+ // |buffered_frames_to_start_| would be initialized in OnFirstOutput().
+ // Before it's initialized, set it to a large number.
+ int buffered_frames_to_start_ = 48 * 1024;
ErrorCB error_cb_;
PrerolledCB prerolled_cb_;
diff --git a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
index 1f2d675..6f5593e 100644
--- a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
+++ b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
@@ -65,7 +65,6 @@
if (audio_codec != kSbMediaAudioCodecNone) {
audio_sample_info_ = *audio_sample_info;
-#if SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
if (audio_sample_info_.audio_specific_config_size > 0) {
audio_specific_config_.reset(
new int8_t[audio_sample_info_.audio_specific_config_size]);
@@ -74,7 +73,6 @@
audio_sample_info->audio_specific_config_size);
audio_sample_info_.audio_specific_config = audio_specific_config_.get();
}
-#endif // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
}
update_job_ = std::bind(&FilterBasedPlayerWorkerHandler::Update, this);
diff --git a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
index 3328ce6..e8c4d69 100644
--- a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
+++ b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
@@ -88,11 +88,9 @@
SbMediaVideoCodec video_codec_;
SbMediaAudioCodec audio_codec_;
SbDrmSystem drm_system_;
-#if SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
// Store a copy of |SbMediaAudioSampleInfo::audio_specific_config| passed to
// the ctor so it is valid for the life time of the player worker.
scoped_array<int8_t> audio_specific_config_;
-#endif // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
SbMediaAudioSampleInfo audio_sample_info_;
// |media_time_provider_impl_| is used to provide the media playback time when
diff --git a/src/starboard/shared/starboard/player/filter/testing/audio_decoder_test.cc b/src/starboard/shared/starboard/player/filter/testing/audio_decoder_test.cc
index 9b8e5ce..737c399 100644
--- a/src/starboard/shared/starboard/player/filter/testing/audio_decoder_test.cc
+++ b/src/starboard/shared/starboard/player/filter/testing/audio_decoder_test.cc
@@ -16,6 +16,7 @@
#include <deque>
#include <functional>
+#include <map>
#include "starboard/common/condition_variable.h"
#include "starboard/common/mutex.h"
@@ -147,7 +148,6 @@
SbThreadSleep(kSbTimeMillisecond);
}
*event = kError;
- FAIL();
}
// TODO: Add test to ensure that |consumed_cb| is not reused by the decoder.
@@ -165,8 +165,6 @@
last_input_buffer_ = GetAudioInputBuffer(index);
- outstanding_inputs_.insert(last_input_buffer_->timestamp());
-
audio_decoder_->Decode(last_input_buffer_, consumed_cb());
}
@@ -190,10 +188,15 @@
}
void WriteMultipleInputs(size_t start_index,
- size_t number_of_inputs_to_write) {
+ size_t number_of_inputs_to_write,
+ bool* error_occurred = NULL) {
ASSERT_LE(start_index + number_of_inputs_to_write,
dmp_reader_.number_of_audio_buffers());
+ if (error_occurred) {
+ *error_occurred = false;
+ }
+
ASSERT_NO_FATAL_FAILURE(WriteSingleInput(start_index));
++start_index;
--number_of_inputs_to_write;
@@ -207,6 +210,11 @@
--number_of_inputs_to_write;
continue;
}
+ if (event == kError) {
+ ASSERT_TRUE(error_occurred);
+ *error_occurred = true;
+ return;
+ }
ASSERT_EQ(kOutput, event);
scoped_refptr<DecodedAudio> decoded_audio;
ASSERT_NO_FATAL_FAILURE(ReadFromDecoder(&decoded_audio));
@@ -281,7 +289,6 @@
can_accept_more_input_ = true;
last_input_buffer_ = NULL;
last_decoded_audio_ = NULL;
- outstanding_inputs_.clear();
eos_written_ = false;
}
@@ -304,14 +311,27 @@
auto player_sample_info =
dmp_reader_.GetPlayerSampleInfo(kSbMediaTypeAudio, index);
#if SB_API_VERSION >= 11
- return new InputBuffer(DeallocateSampleFunc, NULL, NULL,
- player_sample_info);
+ auto input_buffer =
+ new InputBuffer(DeallocateSampleFunc, NULL, NULL, player_sample_info);
#else // SB_API_VERSION >= 11
SbMediaAudioSampleInfo audio_sample_info =
dmp_reader_.GetAudioSampleInfo(index);
- return new InputBuffer(kSbMediaTypeAudio, DeallocateSampleFunc, NULL, NULL,
- player_sample_info, &audio_sample_info);
+ auto input_buffer =
+ new InputBuffer(kSbMediaTypeAudio, DeallocateSampleFunc, NULL, NULL,
+ player_sample_info, &audio_sample_info);
#endif // SB_API_VERSION >= 11
+ auto iter = invalid_inputs_.find(index);
+ if (iter != invalid_inputs_.end()) {
+ std::vector<uint8_t> content(input_buffer->size(), iter->second);
+ // Replace the content with invalid data.
+ input_buffer->SetDecryptedContent(content.data(),
+ static_cast<int>(content.size()));
+ }
+ return input_buffer;
+ }
+
+ void UseInvalidDataForInput(size_t index, uint8_t byte_to_fill) {
+ invalid_inputs_[index] = byte_to_fill;
}
void WriteEndOfStream() {
@@ -355,11 +375,9 @@
scoped_refptr<InputBuffer> last_input_buffer_;
scoped_refptr<DecodedAudio> last_decoded_audio_;
- // List of timestamps of InputBuffers provided to the Decoder so far, sorted
- // in ascending order.
- std::set<SbTime> outstanding_inputs_;
-
bool eos_written_ = false;
+
+ std::map<size_t, uint8_t> invalid_inputs_;
};
TEST_P(AudioDecoderTest, ThreeMoreDecoders) {
@@ -414,24 +432,48 @@
}
TEST_P(AudioDecoderTest, SingleInvalidInput) {
- can_accept_more_input_ = false;
- last_input_buffer_ = GetAudioInputBuffer(0);
- std::vector<uint8_t> content(last_input_buffer_->size(), 0xab);
- // Replace the content with invalid data.
- last_input_buffer_->SetDecryptedContent(content.data(),
- static_cast<int>(content.size()));
- audio_decoder_->Decode(last_input_buffer_, consumed_cb());
+ UseInvalidDataForInput(0, 0xab);
+ WriteSingleInput(0);
WriteEndOfStream();
- bool error_occurred = false;
+ bool error_occurred = true;
ASSERT_NO_FATAL_FAILURE(DrainOutputs(&error_occurred));
- // The decoder is allowed to either signal an error or return dummy audio
- // data but not both.
- if (error_occurred) {
- ASSERT_FALSE(last_decoded_audio_);
- } else {
- ASSERT_TRUE(last_decoded_audio_);
+}
+
+TEST_P(AudioDecoderTest, MultipleValidInputsAfterInvalidInput) {
+ const size_t kMaxNumberOfInputToWrite = 10;
+ const size_t number_of_input_to_write =
+ std::min(kMaxNumberOfInputToWrite, dmp_reader_.number_of_audio_buffers());
+
+ UseInvalidDataForInput(0, 0xab);
+
+ bool error_occurred = true;
+ // Write first few frames. The first one is invalid and the rest are valid.
+ WriteMultipleInputs(0, number_of_input_to_write, &error_occurred);
+
+ if (!error_occurred) {
+ WriteEndOfStream();
+ ASSERT_NO_FATAL_FAILURE(DrainOutputs(&error_occurred));
+ }
+}
+
+TEST_P(AudioDecoderTest, MultipleInvalidInput) {
+ const size_t kMaxNumberOfInputToWrite = 128;
+ const size_t number_of_input_to_write =
+ std::min(kMaxNumberOfInputToWrite, dmp_reader_.number_of_audio_buffers());
+ // Replace the content of the first few input buffers with invalid data.
+ // Every test instance loads its own copy of data so this won't affect other
+ // tests.
+ for (size_t i = 0; i < number_of_input_to_write; ++i) {
+ UseInvalidDataForInput(i, static_cast<uint8_t>(0xab + i));
+ }
+
+ bool error_occurred = true;
+ WriteMultipleInputs(0, number_of_input_to_write, &error_occurred);
+ if (!error_occurred) {
+ WriteEndOfStream();
+ ASSERT_NO_FATAL_FAILURE(DrainOutputs(&error_occurred));
}
}
diff --git a/src/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc b/src/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
index c977332..e19d7b6 100644
--- a/src/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
+++ b/src/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
@@ -113,7 +113,8 @@
output_mode_(std::get<0>(GetParam()).output_mode),
using_stub_decoder_(std::get<1>(GetParam())),
dmp_reader_(ResolveTestFileName(test_filename_).c_str()) {
- SB_LOG(INFO) << "Testing " << test_filename_
+ SB_LOG(INFO) << "Testing " << test_filename_ << ", output mode "
+ << output_mode_
<< (using_stub_decoder_ ? " with stub video decoder." : ".");
}
@@ -198,7 +199,8 @@
enum Status {
kNeedMoreInput = VideoDecoder::kNeedMoreInput,
kBufferFull = VideoDecoder::kBufferFull,
- kError
+ kError,
+ kTimeout
};
struct Event {
@@ -242,8 +244,7 @@
}
SbThreadSleep(kSbTimeMillisecond);
}
- event->status = kError;
- FAIL();
+ event->status = kTimeout;
}
bool HasPendingEvents() {
@@ -314,7 +315,7 @@
ASSERT_NO_FATAL_FAILURE(WriteSingleInput(start_index));
++start_index;
--number_of_inputs_to_write;
- } else if (event.status == kError) {
+ } else if (event.status == kError || event.status == kTimeout) {
// Assume that the caller does't expect an error when |event_cb| isn't
// provided.
ASSERT_TRUE(event_cb);
@@ -356,7 +357,7 @@
while (!end_of_stream_decoded) {
Event event;
ASSERT_NO_FATAL_FAILURE(WaitForNextEvent(&event));
- if (event.status == kError) {
+ if (event.status == kError || event.status == kTimeout) {
if (error_occurred) {
*error_occurred = true;
} else {
@@ -591,7 +592,10 @@
ASSERT_NO_FATAL_FAILURE(DrainOutputs(
&error_occurred, [=](const Event& event, bool* continue_process) {
if (event.frame) {
- AssertValidDecodeTargetWhenSupported();
+ // TODO: On some platforms, decode texture will be ready only after
+ // rendered by renderer, so decode target is not always available
+ // at this point. We should provide a mock renderer and then check
+ // the decode target here with AssertValidDecodeTargetWhenSupported().
}
*continue_process = true;
}));
@@ -619,19 +623,23 @@
UseInvalidDataForInput(0, 0xab);
bool error_occurred = false;
-
+ bool timeout_occurred = false;
// Write first few frames. The first one is invalid and the rest are valid.
WriteMultipleInputs(0, number_of_input_to_write,
[&](const Event& event, bool* continue_process) {
+ if (event.status == kTimeout) {
+ timeout_occurred = true;
+ *continue_process = false;
+ return;
+ }
if (event.status == kError) {
error_occurred = true;
*continue_process = false;
return;
}
-
*continue_process = event.status != kBufferFull;
});
-
+ ASSERT_FALSE(timeout_occurred);
if (!error_occurred) {
GetDecodeTargetWhenSupported();
WriteEndOfStream();
@@ -654,8 +662,14 @@
}
bool error_occurred = false;
+ bool timeout_occurred = false;
WriteMultipleInputs(0, number_of_input_to_write,
[&](const Event& event, bool* continue_process) {
+ if (event.status == kTimeout) {
+ timeout_occurred = true;
+ *continue_process = false;
+ return;
+ }
if (event.status == kError) {
error_occurred = true;
*continue_process = false;
@@ -664,7 +678,7 @@
*continue_process = event.status != kBufferFull;
});
-
+ ASSERT_FALSE(timeout_occurred);
if (!error_occurred) {
GetDecodeTargetWhenSupported();
WriteEndOfStream();
@@ -692,21 +706,34 @@
TEST_P(VideoDecoderTest, ResetAfterInput) {
const size_t kMaxInputToWrite = 10;
- WriteMultipleInputs(0, kMaxInputToWrite,
- [](const Event& event, bool* continue_process) {
- *continue_process = event.status != kBufferFull;
- });
-
+ bool error_occurred = false;
+ WriteMultipleInputs(
+ 0, kMaxInputToWrite, [&](const Event& event, bool* continue_process) {
+ if (event.status == kTimeout || event.status == kError) {
+ error_occurred = true;
+ *continue_process = false;
+ return;
+ }
+ *continue_process = event.status != kBufferFull;
+ });
+ ASSERT_FALSE(error_occurred);
ResetDecoderAndClearPendingEvents();
EXPECT_FALSE(HasPendingEvents());
}
TEST_P(VideoDecoderTest, MultipleResets) {
for (int max_inputs = 1; max_inputs < 10; ++max_inputs) {
- WriteMultipleInputs(0, max_inputs,
- [](const Event& event, bool* continue_process) {
- *continue_process = event.status != kBufferFull;
- });
+ bool error_occurred = false;
+ WriteMultipleInputs(
+ 0, max_inputs, [&](const Event& event, bool* continue_process) {
+ if (event.status == kTimeout || event.status == kError) {
+ error_occurred = true;
+ *continue_process = false;
+ return;
+ }
+ *continue_process = event.status != kBufferFull;
+ });
+ ASSERT_FALSE(error_occurred);
ResetDecoderAndClearPendingEvents();
EXPECT_FALSE(HasPendingEvents());
WriteSingleInput(0);
@@ -722,14 +749,20 @@
const size_t number_of_expected_decoded_frames = std::min(
kMaxNumberOfExpectedDecodedFrames, dmp_reader_.number_of_video_buffers());
size_t frames_decoded = 0;
+ bool error_occurred = false;
ASSERT_NO_FATAL_FAILURE(WriteMultipleInputs(
0, dmp_reader_.number_of_video_buffers(),
[&](const Event& event, bool* continue_process) {
- SB_UNREFERENCED_PARAMETER(event);
+ if (event.status == kTimeout || event.status == kError) {
+ error_occurred = true;
+ *continue_process = false;
+ return;
+ }
frames_decoded += decoded_frames_.size();
decoded_frames_.clear();
*continue_process = frames_decoded < number_of_expected_decoded_frames;
}));
+ ASSERT_FALSE(error_occurred);
if (frames_decoded < number_of_expected_decoded_frames) {
WriteEndOfStream();
ASSERT_NO_FATAL_FAILURE(DrainOutputs());
@@ -739,39 +772,51 @@
TEST_P(VideoDecoderTest, Preroll) {
SbTimeMonotonic start = SbTimeGetMonotonicNow();
SbTime preroll_timeout = video_decoder_->GetPrerollTimeout();
+ bool error_occurred = false;
ASSERT_NO_FATAL_FAILURE(WriteMultipleInputs(
0, dmp_reader_.number_of_video_buffers(),
- [=](const Event& event, bool* continue_process) {
- SB_UNREFERENCED_PARAMETER(event);
+ [&](const Event& event, bool* continue_process) {
+ if (event.status == kError) {
+ error_occurred = true;
+ *continue_process = false;
+ return;
+ }
if (decoded_frames_.size() >= video_decoder_->GetPrerollFrameCount()) {
*continue_process = false;
return;
}
if (SbTimeGetMonotonicNow() - start >= preroll_timeout) {
+ // After preroll timeout, we should get at least 1 decoded frame.
+ ASSERT_GT(decoded_frames_.size(), 0);
*continue_process = false;
return;
}
*continue_process = true;
return;
}));
+ ASSERT_FALSE(error_occurred);
}
TEST_P(VideoDecoderTest, HoldFramesUntilFull) {
+ bool error_occurred = false;
ASSERT_NO_FATAL_FAILURE(WriteMultipleInputs(
0, dmp_reader_.number_of_video_buffers(),
- [=](const Event& event, bool* continue_process) {
- SB_UNREFERENCED_PARAMETER(event);
+ [&](const Event& event, bool* continue_process) {
+ if (event.status == kTimeout || event.status == kError) {
+ error_occurred = true;
+ *continue_process = false;
+ return;
+ }
*continue_process = decoded_frames_.size() <
video_decoder_->GetMaxNumberOfCachedFrames();
}));
+ ASSERT_FALSE(error_occurred);
WriteEndOfStream();
if (decoded_frames_.size() >= video_decoder_->GetMaxNumberOfCachedFrames()) {
return;
}
- bool error_occurred = false;
ASSERT_NO_FATAL_FAILURE(DrainOutputs(
&error_occurred, [=](const Event& event, bool* continue_process) {
- SB_UNREFERENCED_PARAMETER(event);
*continue_process = decoded_frames_.size() <
video_decoder_->GetMaxNumberOfCachedFrames();
}));
@@ -786,24 +831,27 @@
}
++gop_size;
}
-
+ bool error_occurred = false;
ASSERT_NO_FATAL_FAILURE(WriteMultipleInputs(
- 0, gop_size, [=](const Event& event, bool* continue_process) {
- SB_UNREFERENCED_PARAMETER(event);
- while (decoded_frames_.size() >=
- video_decoder_->GetPrerollFrameCount()) {
+ 0, gop_size, [&](const Event& event, bool* continue_process) {
+ if (event.status == kTimeout || event.status == kError) {
+ error_occurred = true;
+ *continue_process = false;
+ return;
+ }
+ // Keep 1 decoded frame, assuming it's used by renderer.
+ while (decoded_frames_.size() > 1) {
decoded_frames_.pop_front();
}
*continue_process = true;
}));
+ ASSERT_FALSE(error_occurred);
WriteEndOfStream();
- bool error_occurred = true;
ASSERT_NO_FATAL_FAILURE(DrainOutputs(
&error_occurred, [=](const Event& event, bool* continue_process) {
- SB_UNREFERENCED_PARAMETER(event);
- while (decoded_frames_.size() >=
- video_decoder_->GetMaxNumberOfCachedFrames()) {
+ // Keep 1 decoded frame, assuming it's used by renderer.
+ while (decoded_frames_.size() > 1) {
decoded_frames_.pop_front();
}
*continue_process = true;
diff --git a/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc b/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
index a5f7002..afa527c 100644
--- a/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
+++ b/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
@@ -90,13 +90,13 @@
if (frames->front()->timestamp() != last_frame_timestamp_) {
#if SB_PLAYER_FILTER_ENABLE_STATE_CHECK
auto now = SbTimeGetMonotonicNow();
- SB_LOG(ERROR) << "Dropping frame @ " << frames->front()->timestamp()
- << " microseconds, the elasped media time/system time from"
- << " last Render() call are "
- << media_time - media_time_of_last_render_call_ << "/"
- << now - system_time_of_last_render_call_
- << " microseconds, with " << frames->size()
- << " frames in the backlog.";
+ SB_LOG(WARNING)
+ << "Dropping frame @ " << frames->front()->timestamp()
+ << " microseconds, the elasped media time/system time from"
+ << " last Render() call are "
+ << media_time - media_time_of_last_render_call_ << "/"
+ << now - system_time_of_last_render_call_ << " microseconds, with "
+ << frames->size() << " frames in the backlog.";
#endif // SB_PLAYER_FILTER_ENABLE_STATE_CHECK
++dropped_frames_;
}
diff --git a/src/starboard/shared/starboard/player/input_buffer_internal.cc b/src/starboard/shared/starboard/player/input_buffer_internal.cc
index 48d7ed4..c757c6d 100644
--- a/src/starboard/shared/starboard/player/input_buffer_internal.cc
+++ b/src/starboard/shared/starboard/player/input_buffer_internal.cc
@@ -100,8 +100,9 @@
DeallocateSampleBuffer(data_);
if (size > 0) {
- flattened_data_.resize(size);
- SbMemoryCopy(flattened_data_.data(), buffer, size);
+ flattened_data_.clear();
+ flattened_data_.assign(static_cast<const uint8_t*>(buffer),
+ static_cast<const uint8_t*>(buffer) + size);
data_ = flattened_data_.data();
} else {
data_ = NULL;
diff --git a/src/starboard/shared/starboard/player/player_internal.cc b/src/starboard/shared/starboard/player/player_internal.cc
index ebbba98..7312db7 100644
--- a/src/starboard/shared/starboard/player/player_internal.cc
+++ b/src/starboard/shared/starboard/player/player_internal.cc
@@ -71,6 +71,8 @@
this, context));
++number_of_players_;
+ SB_DLOG(INFO) << "Creating SbPlayerPrivate. There are " << number_of_players_
+ << " players.";
}
// static
diff --git a/src/starboard/shared/starboard/player/player_internal.h b/src/starboard/shared/starboard/player/player_internal.h
index e6e713e..9cadbb7 100644
--- a/src/starboard/shared/starboard/player/player_internal.h
+++ b/src/starboard/shared/starboard/player/player_internal.h
@@ -62,7 +62,11 @@
SbDecodeTarget GetCurrentDecodeTarget();
- ~SbPlayerPrivate() { --number_of_players_; }
+ ~SbPlayerPrivate() {
+ --number_of_players_;
+ SB_DLOG(INFO) << "Destroying SbPlayerPrivate. There are "
+ << number_of_players_ << " players.";
+ }
static int number_of_players() { return number_of_players_; }
diff --git a/src/starboard/shared/starboard/player/video_dmp_common.cc b/src/starboard/shared/starboard/player/video_dmp_common.cc
index 2770b9b..1a97ed8 100644
--- a/src/starboard/shared/starboard/player/video_dmp_common.cc
+++ b/src/starboard/shared/starboard/player/video_dmp_common.cc
@@ -108,16 +108,8 @@
&audio_sample_info->audio_specific_config_size);
audio_sample_info->stored_audio_specific_config.resize(
audio_sample_info->audio_specific_config_size);
-#if SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
audio_sample_info->audio_specific_config =
audio_sample_info->stored_audio_specific_config.data();
-#else // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
- SB_DCHECK(sizeof(audio_sample_info->audio_specific_config) >=
- audio_sample_info->stored_audio_specific_config.size());
- SbMemoryCopy(audio_sample_info->audio_specific_config,
- audio_sample_info->stored_audio_specific_config.data(),
- audio_sample_info->stored_audio_specific_config.size());
-#endif // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
Read(read_cb, audio_sample_info->stored_audio_specific_config.data(),
audio_sample_info->audio_specific_config_size);
}
diff --git a/src/starboard/shared/starboard/player/video_dmp_common.h b/src/starboard/shared/starboard/player/video_dmp_common.h
index a6a8d44..5625142 100644
--- a/src/starboard/shared/starboard/player/video_dmp_common.h
+++ b/src/starboard/shared/starboard/player/video_dmp_common.h
@@ -76,13 +76,7 @@
SbMediaAudioSampleInfoWithConfig(const SbMediaAudioSampleInfoWithConfig& that)
: SbMediaAudioSampleInfo(that),
stored_audio_specific_config(that.stored_audio_specific_config) {
-#if SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
audio_specific_config = stored_audio_specific_config.data();
-#else // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
- SB_DCHECK(8 >= stored_audio_specific_config.size());
- SbMemoryCopy(audio_specific_config, stored_audio_specific_config.data(),
- stored_audio_specific_config.size());
-#endif // SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
}
void operator=(const SbMediaAudioSampleInfoWithConfig& that) = delete;
diff --git a/src/cobalt/dom/c_val_key_list.idl b/src/starboard/shared/stub/audio_sink_get_min_buffer_size_in_frames.cc
similarity index 62%
rename from src/cobalt/dom/c_val_key_list.idl
rename to src/starboard/shared/stub/audio_sink_get_min_buffer_size_in_frames.cc
index ffe9013..f64f8ec 100644
--- a/src/cobalt/dom/c_val_key_list.idl
+++ b/src/starboard/shared/stub/audio_sink_get_min_buffer_size_in_frames.cc
@@ -1,4 +1,4 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+// Copyright 2019 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.
@@ -12,9 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-[ArrayClass]
-interface CValKeyList {
- getter DOMString? item(unsigned long index);
- readonly attribute unsigned long length;
- long indexOf(DOMString key);
-};
+#include "starboard/audio_sink.h"
+
+int SbAudioSinkGetMinBufferSizeInFrames(int /*channels*/,
+ SbMediaAudioSampleType /*sample_type*/,
+ int /*sampling_frequency_hz*/) {
+ return 8 * 1024;
+}
diff --git a/src/starboard/shared/stub/drm_create_system.cc b/src/starboard/shared/stub/drm_create_system.cc
index b384a3f..5d8628f 100644
--- a/src/starboard/shared/stub/drm_create_system.cc
+++ b/src/starboard/shared/stub/drm_create_system.cc
@@ -52,7 +52,7 @@
return kSbDrmSystemInvalid;
}
-#elif SB_HAS(DRM_KEY_STATUSES)
+#else // SB_HAS(DRM_SESSION_CLOSED)
SbDrmSystem SbDrmCreateSystem(
const char* key_system,
@@ -68,18 +68,4 @@
return kSbDrmSystemInvalid;
}
-#else // SB_API_VERSION >= 10
-
-SbDrmSystem SbDrmCreateSystem(
- const char* key_system,
- void* context,
- SbDrmSessionUpdateRequestFunc update_request_callback,
- SbDrmSessionUpdatedFunc session_updated_callback) {
- SB_UNREFERENCED_PARAMETER(context);
- SB_UNREFERENCED_PARAMETER(key_system);
- SB_UNREFERENCED_PARAMETER(update_request_callback);
- SB_UNREFERENCED_PARAMETER(session_updated_callback);
- return kSbDrmSystemInvalid;
-}
-
-#endif // SB_API_VERSION >= 10
+#endif // SB_HAS(DRM_SESSION_CLOSED)
diff --git a/src/starboard/shared/stub/image_decode.cc b/src/starboard/shared/stub/image_decode.cc
index 42369db..e3a2043 100644
--- a/src/starboard/shared/stub/image_decode.cc
+++ b/src/starboard/shared/stub/image_decode.cc
@@ -15,10 +15,6 @@
#include "starboard/configuration.h"
#include "starboard/image.h"
-#if !SB_HAS(GRAPHICS)
-#error "SbImageDecode requires SB_HAS(GRAPHICS)."
-#endif
-
SbDecodeTarget SbImageDecode(SbDecodeTargetGraphicsContextProvider* provider,
void* data,
int data_size,
diff --git a/src/starboard/shared/stub/image_is_decode_supported.cc b/src/starboard/shared/stub/image_is_decode_supported.cc
index 984a139..9e04d60 100644
--- a/src/starboard/shared/stub/image_is_decode_supported.cc
+++ b/src/starboard/shared/stub/image_is_decode_supported.cc
@@ -15,10 +15,6 @@
#include "starboard/configuration.h"
#include "starboard/image.h"
-#if !SB_HAS(GRAPHICS)
-#error "Requires SB_HAS(GRAPHICS)."
-#endif
-
bool SbImageIsDecodeSupported(const char* mime_type,
SbDecodeTargetFormat format) {
SB_UNREFERENCED_PARAMETER(mime_type);
diff --git a/src/starboard/shared/stub/system_sign_with_certification_secret_key.cc b/src/starboard/shared/stub/system_sign_with_certification_secret_key.cc
new file mode 100644
index 0000000..b64bb21
--- /dev/null
+++ b/src/starboard/shared/stub/system_sign_with_certification_secret_key.cc
@@ -0,0 +1,26 @@
+// Copyright 2019 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/system.h"
+
+#if SB_API_VERSION >= 11
+
+bool SbSystemSignWithCertificationSecretKey(const uint8_t* message,
+ size_t message_size_in_bytes,
+ uint8_t* digest,
+ size_t digest_size_in_bytes) {
+ return false;
+}
+
+#endif // SB_API_VERSION >= 11
diff --git a/src/starboard/shared/widevine/drm_create_system.cc b/src/starboard/shared/widevine/drm_create_system.cc
index 544fb79..595cf4d 100644
--- a/src/starboard/shared/widevine/drm_create_system.cc
+++ b/src/starboard/shared/widevine/drm_create_system.cc
@@ -30,11 +30,8 @@
const char* key_system,
void* context,
SbDrmSessionUpdateRequestFunc update_request_callback,
- SbDrmSessionUpdatedFunc session_updated_callback
-#if SB_HAS(DRM_KEY_STATUSES)
- ,
+ SbDrmSessionUpdatedFunc session_updated_callback,
SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
,
SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback,
@@ -45,11 +42,9 @@
if (!update_request_callback || !session_updated_callback) {
return kSbDrmSystemInvalid;
}
-#if SB_HAS(DRM_KEY_STATUSES)
if (!key_statuses_changed_callback) {
return kSbDrmSystemInvalid;
}
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
if (!server_certificate_updated_callback || !session_closed_callback) {
return kSbDrmSystemInvalid;
@@ -63,10 +58,8 @@
<< "premium content playback resolution may be limited.";
return new DrmSystemWidevine(context, update_request_callback,
session_updated_callback
-#if SB_HAS(DRM_KEY_STATUSES)
,
key_statuses_changed_callback
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
,
server_certificate_updated_callback
diff --git a/src/starboard/shared/widevine/drm_system_widevine.cc b/src/starboard/shared/widevine/drm_system_widevine.cc
index 8d6ff57..e884249 100644
--- a/src/starboard/shared/widevine/drm_system_widevine.cc
+++ b/src/starboard/shared/widevine/drm_system_widevine.cc
@@ -41,6 +41,11 @@
const char* kWidevineKeySystem[] = {"com.widevine", "com.widevine.alpha"};
const char kWidevineStorageFileName[] = "wvcdm.dat";
+// Key usage may be blocked due to incomplete HDCP authentication which could
+// take up to 5 seconds. For such a case it is good to give a try few times to
+// get HDCP authentication complete. We set a timeout of 6 seconds for retries.
+const SbTimeMonotonic kUnblockKeyRetryTimeout = kSbTimeSecond * 6;
+
class WidevineClock : public wv3cdm::IClock {
public:
int64_t now() override {
@@ -193,11 +198,8 @@
DrmSystemWidevine::DrmSystemWidevine(
void* context,
SbDrmSessionUpdateRequestFunc session_update_request_callback,
- SbDrmSessionUpdatedFunc session_updated_callback
-#if SB_HAS(DRM_KEY_STATUSES)
- ,
+ SbDrmSessionUpdatedFunc session_updated_callback,
SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
,
SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback
@@ -212,9 +214,7 @@
: context_(context),
session_update_request_callback_(session_update_request_callback),
session_updated_callback_(session_updated_callback),
-#if SB_HAS(DRM_KEY_STATUSES)
key_statuses_changed_callback_(key_statuses_changed_callback),
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
server_certificate_updated_callback_(server_certificate_updated_callback),
#endif // SB_API_VERSION >= 10
@@ -320,6 +320,7 @@
sb_drm_session_id, sb_drm_session_id_size, &wvcdm_session_id);
SB_DCHECK(succeeded);
status = cdm_->update(wvcdm_session_id, str_key);
+ first_update_session_received_.store(true);
}
SB_DLOG(INFO) << "Update keys status " << status;
#if SB_API_VERSION >= 10
@@ -395,6 +396,10 @@
return kSuccess;
}
+ if (!first_update_session_received_.load()) {
+ return kRetry;
+ }
+
// Adapt |buffer| and |drm_info| to a |cdm::InputBuffer|.
SB_DCHECK(drm_info->initialization_vector_size == kInitializationVectorSize);
std::vector<uint8_t> initialization_vector(
@@ -459,6 +464,18 @@
SB_DLOG(ERROR) << "Decrypt status: kNoKey";
return kRetry;
}
+ if (status == wv3cdm::kKeyUsageBlockedByPolicy) {
+ {
+ ScopedLock lock(unblock_key_retry_mutex_);
+ if (!unblock_key_retry_start_time_) {
+ unblock_key_retry_start_time_ = SbTimeGetMonotonicNow();
+ }
+ }
+ if (SbTimeGetMonotonicNow() - unblock_key_retry_start_time_.value() <
+ kUnblockKeyRetryTimeout) {
+ return kRetry;
+ }
+ }
SB_DLOG(ERROR) << "Decrypt status " << status;
SB_DLOG(ERROR) << "Key ID "
<< wvcdm::b2a_hex(
@@ -467,7 +484,10 @@
drm_info->identifier_size));
return kFailure;
}
-
+ {
+ ScopedLock lock(unblock_key_retry_mutex_);
+ unblock_key_retry_start_time_ = nullopt;
+ }
input.data += subsample.encrypted_byte_count;
output.data += subsample.encrypted_byte_count;
output.data_length -= subsample.encrypted_byte_count;
@@ -582,7 +602,6 @@
void DrmSystemWidevine::onKeyStatusesChange(
const std::string& wvcdm_session_id) {
-#if SB_HAS(DRM_KEY_STATUSES)
wv3cdm::KeyStatusMap key_statuses;
wv3cdm::Status status = cdm_->getKeyStatuses(wvcdm_session_id, &key_statuses);
@@ -608,9 +627,6 @@
key_statuses_changed_callback_(this, context_, sb_drm_session_id.c_str(),
sb_drm_session_id.size(), sb_key_ids.size(),
sb_key_ids.data(), sb_key_statuses.data());
-#else // SB_HAS(DRM_KEY_STATUSES)
- SB_UNREFERENCED_PARAMETER(wvcdm_session_id);
-#endif // SB_HAS(DRM_KEY_STATUSES)
}
void DrmSystemWidevine::onRemoveComplete(const std::string& wvcdm_session_id) {
diff --git a/src/starboard/shared/widevine/drm_system_widevine.h b/src/starboard/shared/widevine/drm_system_widevine.h
index c8e9d22..fb7bce7 100644
--- a/src/starboard/shared/widevine/drm_system_widevine.h
+++ b/src/starboard/shared/widevine/drm_system_widevine.h
@@ -20,7 +20,10 @@
#include <string>
#include <vector>
+#include "starboard/atomic.h"
+#include "starboard/common/optional.h"
#include "starboard/common/scoped_ptr.h"
+#include "starboard/mutex.h"
#include "starboard/shared/starboard/drm/drm_system_internal.h"
#include "starboard/shared/starboard/thread_checker.h"
#include "starboard/thread.h"
@@ -41,11 +44,8 @@
DrmSystemWidevine(
void* context,
SbDrmSessionUpdateRequestFunc update_request_callback,
- SbDrmSessionUpdatedFunc session_updated_callback
-#if SB_HAS(DRM_KEY_STATUSES)
- ,
+ SbDrmSessionUpdatedFunc session_updated_callback,
SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
,
SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback
@@ -163,9 +163,7 @@
void* const context_;
const SbDrmSessionUpdateRequestFunc session_update_request_callback_;
const SbDrmSessionUpdatedFunc session_updated_callback_;
-#if SB_HAS(DRM_KEY_STATUSES)
const SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback_;
-#endif // SB_HAS(DRM_KEY_STATUSES)
#if SB_API_VERSION >= 10
const SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback_;
#endif // SB_API_VERSION >= 10
@@ -204,10 +202,15 @@
volatile bool quitting_ = false;
+ Mutex unblock_key_retry_mutex_;
+ optional<SbTimeMonotonic> unblock_key_retry_start_time_;
+
#if !defined(COBALT_BUILD_TYPE_GOLD)
int number_of_session_updates_sent_ = 0;
int maximum_number_of_session_updates_ = std::numeric_limits<int>::max();
#endif // !defined(COBALT_BUILD_TYPE_GOLD)
+
+ atomic_bool first_update_session_received_{false};
};
} // namespace widevine
diff --git a/src/starboard/stub/stub_sources.gypi b/src/starboard/stub/stub_sources.gypi
index 27da555..8a9cffb 100644
--- a/src/starboard/stub/stub_sources.gypi
+++ b/src/starboard/stub/stub_sources.gypi
@@ -31,6 +31,7 @@
'<(DEPTH)/starboard/shared/stub/audio_sink_create.cc',
'<(DEPTH)/starboard/shared/stub/audio_sink_destroy.cc',
'<(DEPTH)/starboard/shared/stub/audio_sink_get_max_channels.cc',
+ '<(DEPTH)/starboard/shared/stub/audio_sink_get_min_buffer_size_in_frames.cc',
'<(DEPTH)/starboard/shared/stub/audio_sink_get_nearest_supported_sample_frequency.cc',
'<(DEPTH)/starboard/shared/stub/audio_sink_is_audio_frame_storage_type_supported.cc',
'<(DEPTH)/starboard/shared/stub/audio_sink_is_audio_sample_type_supported.cc',
@@ -56,6 +57,8 @@
'<(DEPTH)/starboard/shared/stub/cryptography_set_authenticated_data.cc',
'<(DEPTH)/starboard/shared/stub/cryptography_set_initialization_vector.cc',
'<(DEPTH)/starboard/shared/stub/cryptography_transform.cc',
+ '<(DEPTH)/starboard/shared/stub/decode_target_get_info.cc',
+ '<(DEPTH)/starboard/shared/stub/decode_target_release.cc',
'<(DEPTH)/starboard/shared/stub/directory_can_open.cc',
'<(DEPTH)/starboard/shared/stub/directory_close.cc',
'<(DEPTH)/starboard/shared/stub/directory_create.cc',
@@ -74,6 +77,8 @@
'<(DEPTH)/starboard/shared/stub/drm_system_internal.h',
'<(DEPTH)/starboard/shared/stub/drm_update_server_certificate.cc',
'<(DEPTH)/starboard/shared/stub/drm_update_session.cc',
+ '<(DEPTH)/starboard/shared/stub/image_decode.cc',
+ '<(DEPTH)/starboard/shared/stub/image_is_decode_supported.cc',
'<(DEPTH)/starboard/shared/stub/file_can_open.cc',
'<(DEPTH)/starboard/shared/stub/file_close.cc',
'<(DEPTH)/starboard/shared/stub/file_delete.cc',
@@ -253,6 +258,7 @@
'<(DEPTH)/starboard/shared/stub/system_request_stop.cc',
'<(DEPTH)/starboard/shared/stub/system_request_suspend.cc',
'<(DEPTH)/starboard/shared/stub/system_request_unpause.cc',
+ '<(DEPTH)/starboard/shared/stub/system_sign_with_certification_secret_key.cc',
'<(DEPTH)/starboard/shared/stub/system_sort.cc',
'<(DEPTH)/starboard/shared/stub/system_supports_resume.cc',
'<(DEPTH)/starboard/shared/stub/system_symbolize.cc',
diff --git a/src/starboard/system.h b/src/starboard/system.h
index 0012d64..1f41f54 100644
--- a/src/starboard/system.h
+++ b/src/starboard/system.h
@@ -618,6 +618,24 @@
SB_EXPORT const void* SbSystemGetExtension(const char* name);
#endif // SB_API_VERSION >= 11
+#if SB_API_VERSION >= 11
+// Computes a HMAC-SHA256 digest of |message| into |digest| using the
+// application's certification secret.
+//
+// This function may be implemented as an alternative to implementing
+// SbSystemGetProperty(kSbSystemPropertyBase64EncodedCertificationSecret),
+// however both should not be implemented.
+//
+// The output will be written into |digest|. |digest_size_in_bytes| must be 32
+// (or greater), since 32-bytes will be written into it.
+// Returns false in the case of an error, or if it is not implemented. In this
+// case the contents of |digest| will be undefined.
+bool SbSystemSignWithCertificationSecretKey(const uint8_t* message,
+ size_t message_size_in_bytes,
+ uint8_t* digest,
+ size_t digest_size_in_bytes);
+#endif
+
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/src/starboard/tools/app_launcher_packager.py b/src/starboard/tools/app_launcher_packager.py
index 092b387..4991c6a 100644
--- a/src/starboard/tools/app_launcher_packager.py
+++ b/src/starboard/tools/app_launcher_packager.py
@@ -66,6 +66,8 @@
from paths import REPOSITORY_ROOT
from paths import THIRD_PARTY_ROOT
sys.path.append(THIRD_PARTY_ROOT)
+from cobalt.build import cobalt_archive_extract
+import starboard.build.port_symlink as port_symlink
import starboard.tools.platform
import jinja2
@@ -168,10 +170,18 @@
def _CopyAppLauncherTools(repo_root, dest_root, additional_glob_patterns,
include_black_box_tests):
- # Step 1: Remove previous output directory if it exists
+ # Step 1: Make sure dest_root is an absolute path.
+ logging.info('Copying App Launcher tools to = %s', dest_root)
+ dest_root = os.path.normpath(dest_root)
+ if not os.path.isabs(dest_root):
+ dest_root = os.path.join(os.getcwd(), dest_root)
+ if port_symlink.IsWindows():
+ dest_root = cobalt_archive_extract.ToWinUncPath(dest_root)
+ logging.info('Absolute destination path = %s', dest_root)
+ # Step 2: Remove previous output directory if it exists
if os.path.isdir(dest_root):
shutil.rmtree(dest_root)
- # Step 2: Find all glob files from specified search directories.
+ # Step 3: Find all glob files from specified search directories.
include_glob_patterns = _INCLUDE_FILE_PATTERNS
if additional_glob_patterns:
include_glob_patterns += additional_glob_patterns
@@ -190,7 +200,7 @@
copy_list = list(set(copy_list))
copy_list.sort()
folders_logged = set()
- # Step 3: Copy the src files to the destination directory.
+ # Step 4: Copy the src files to the destination directory.
for src in copy_list:
tail_path = os.path.relpath(src, repo_root)
dst = os.path.join(dest_root, tail_path)
@@ -202,7 +212,7 @@
folders_logged.add(src_folder)
logging.info(src_folder + ' -> ' + os.path.dirname(dst))
shutil.copy2(src, dst)
- # Step 4: Re-write the platform infos file in the new repo copy.
+ # Step 5: Re-write the platform infos file in the new repo copy.
_WritePlatformsInfo(repo_root, dest_root)
diff --git a/src/starboard/tools/testing/test_runner.py b/src/starboard/tools/testing/test_runner.py
index ee3b7d7..5896355 100755
--- a/src/starboard/tools/testing/test_runner.py
+++ b/src/starboard/tools/testing/test_runner.py
@@ -288,7 +288,7 @@
def _GetAllTestEnvVariables(self):
"""Gets all environment variables used for tests on the given platform."""
- env_variables = self._platform_config.GetTestEnvVariables()
+ env_variables = {}
for test, test_env in self._app_config.GetTestEnvVariables().iteritems():
if test in env_variables:
env_variables[test].update(test_env)
@@ -309,7 +309,9 @@
"""
# Get the environment variables for the test target
- env = self.test_env_vars.get(target_name, {})
+ env = {}
+ env.update(self._platform_config.GetTestEnvVariables())
+ env.update(self.test_env_vars.get(target_name, {}))
# Set up a pipe for processing test output
read_fd, write_fd = os.pipe()
@@ -362,13 +364,19 @@
self.threads.append(test_launcher)
self.threads.append(test_reader)
+ dump_params = " ARGS:" + " ".join(test_params) if test_params else ""
+ dump_env = " ENV VARS: " + ";".join(
+ "{}={}".format(k, v) for k, v in env.items()) if env else ""
# Output either the name of the test target or the specific test case
# being run.
# pylint: disable=g-long-ternary
- sys.stdout.write(
- "Starting {}".format(test_name if test_name else target_name))
+ sys.stdout.write("Starting {}{}{}".format(
+ test_name if test_name else target_name, dump_params, dump_env))
if self.dry_run:
+ # Output a newline before running the test target / case.
+ sys.stdout.write("\n")
+
if test_params:
sys.stdout.write(" {}\n".format(test_params))
write_pipe.close()
@@ -517,14 +525,16 @@
flaky_passed_tests = []
for test_case in flaky_failed_tests:
for retry in range(_FLAKY_RETRY_LIMIT):
- retry_result = self._RunTest(target_name, test_case)
+ # Sometimes the returned test "name" includes information about the
+ # parameter that was passed to it. This needs to be stripped off.
+ retry_result = self._RunTest(target_name, test_case.split(",")[0])
print # Explicit print for empty formatting line.
if retry_result[2] == 1:
flaky_passed_tests.append(test_case)
logging.info("%s succeeded on run #%d!\n", test_case, retry + 2)
break
else:
- logging.warning("%s Failed. Re-running...\n", test_case)
+ logging.warning("%s failed. Re-running...\n", test_case)
# Remove newly passing flaky tests from failing flaky test list.
for test_case in flaky_passed_tests:
flaky_failed_tests.remove(test_case)
diff --git a/src/testing/gtest/include/gtest/gtest.h b/src/testing/gtest/include/gtest/gtest.h
index 8e8d922..4f611e1 100644
--- a/src/testing/gtest/include/gtest/gtest.h
+++ b/src/testing/gtest/include/gtest/gtest.h
@@ -66,6 +66,14 @@
#include "gtest/gtest-test-part.h"
#include "gtest/gtest-typed-test.h"
+#if defined(COBALT_BUILD_TYPE_QA)
+#error You cannot build unit tests in qa builds.
+#endif
+
+#if defined(COBALT_BUILD_TYPE_GOLD)
+#error You cannot build unit tests in gold builds.
+#endif
+
// Depending on the platform, different string classes are available.
// On Linux, in addition to ::std::string, Google also makes use of
// class ::string, which has the same interface as ::std::string, but
diff --git a/src/testing/gtest/include/gtest/internal/gtest-port.h b/src/testing/gtest/include/gtest/internal/gtest-port.h
index b060901..2f88ab2 100644
--- a/src/testing/gtest/include/gtest/internal/gtest-port.h
+++ b/src/testing/gtest/include/gtest/internal/gtest-port.h
@@ -1572,7 +1572,7 @@
} else {
T* new_value = new T();
bool is_set = SbThreadSetLocalValue(key_, new_value);
- SB_DCHECK(is_set);
+ SB_CHECK(is_set);
return new_value;
}
}
diff --git a/src/third_party/boringssl/boringssl.gyp b/src/third_party/boringssl/boringssl.gyp
index a6cd7c8..692b6c7 100644
--- a/src/third_party/boringssl/boringssl.gyp
+++ b/src/third_party/boringssl/boringssl.gyp
@@ -15,7 +15,6 @@
'OPENSSL_NO_DTLS1',
],
'cflags': [
- '-g',
'-fPIC',
'-fvisibility=hidden',
],
diff --git a/src/third_party/boringssl/boringssl.gypi b/src/third_party/boringssl/boringssl.gypi
index c1e4e2e..69d1a1f 100644
--- a/src/third_party/boringssl/boringssl.gypi
+++ b/src/third_party/boringssl/boringssl.gypi
@@ -208,11 +208,13 @@
'<(boringssl_root)/crypto/rc4/rc4.c',
'<(boringssl_root)/crypto/refcount_c11.c',
'<(boringssl_root)/crypto/refcount_lock.c',
+ '<(boringssl_root)/crypto/refcount_starboard.c',
'<(boringssl_root)/crypto/rsa_extra/rsa_asn1.c',
'<(boringssl_root)/crypto/stack/stack.c',
'<(boringssl_root)/crypto/thread.c',
'<(boringssl_root)/crypto/thread_none.c',
'<(boringssl_root)/crypto/thread_pthread.c',
+ '<(boringssl_root)/crypto/thread_starboard.cc',
'<(boringssl_root)/crypto/thread_win.c',
'<(boringssl_root)/crypto/x509/a_digest.c',
'<(boringssl_root)/crypto/x509/a_sign.c',
diff --git a/src/third_party/boringssl/src/crypto/internal.h b/src/third_party/boringssl/src/crypto/internal.h
index 4b88bcf..dc9c61b 100644
--- a/src/third_party/boringssl/src/crypto/internal.h
+++ b/src/third_party/boringssl/src/crypto/internal.h
@@ -116,6 +116,10 @@
#include <assert.h>
#include <string.h>
+#include "starboard/atomic.h"
+#include "starboard/once.h"
+#include "starboard/thread.h"
+
#if !defined(__cplusplus)
#if defined(__GNUC__) && \
(__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800
@@ -370,7 +374,10 @@
// Thread-safe initialisation.
-#if defined(OPENSSL_NO_THREADS)
+#if defined(STARBOARD)
+typedef SbOnceControl CRYPTO_once_t;
+#define CRYPTO_ONCE_INIT SB_ONCE_INITIALIZER
+#elif defined(OPENSSL_NO_THREADS)
typedef uint32_t CRYPTO_once_t;
#define CRYPTO_ONCE_INIT 0
#elif defined(OPENSSL_WINDOWS_THREADS)
@@ -390,13 +397,21 @@
//
// The |once| argument must be a |CRYPTO_once_t| that has been initialised with
// the value |CRYPTO_ONCE_INIT|.
+#if defined(STARBOARD)
+#define CRYPTO_once SbOnce
+#else
OPENSSL_EXPORT void CRYPTO_once(CRYPTO_once_t *once, void (*init)(void));
+#endif
// Reference counting.
// CRYPTO_REFCOUNT_MAX is the value at which the reference count saturates.
+#if defined(STARBOARD)
+#define CRYPTO_REFCOUNT_MAX 0x7fffffff
+#else
#define CRYPTO_REFCOUNT_MAX 0xffffffff
+#endif
// CRYPTO_refcount_inc atomically increments the value at |*count| unless the
// value would overflow. It's safe for multiple threads to concurrently call
@@ -426,7 +441,13 @@
// thread.h as a structure large enough to fit the real type. The global lock is
// a different type so it may be initialized with platform initializer macros.
-#if defined(OPENSSL_NO_THREADS)
+#if defined(STARBOARD)
+struct CRYPTO_STATIC_MUTEX {
+ SbAtomic32 initialized;
+ CRYPTO_MUTEX mutex;
+};
+#define CRYPTO_STATIC_MUTEX_INIT { 0 }
+#elif defined(OPENSSL_NO_THREADS)
struct CRYPTO_STATIC_MUTEX {
char padding; // Empty structs have different sizes in C and C++.
};
diff --git a/src/third_party/boringssl/src/crypto/refcount_lock.c b/src/third_party/boringssl/src/crypto/refcount_lock.c
index 54bc6ca..f6f0727 100644
--- a/src/third_party/boringssl/src/crypto/refcount_lock.c
+++ b/src/third_party/boringssl/src/crypto/refcount_lock.c
@@ -19,7 +19,7 @@
#include <openssl/type_check.h>
-#if !defined(OPENSSL_C11_ATOMIC)
+#if !defined(OPENSSL_C11_ATOMIC) && !defined(STARBOARD)
OPENSSL_COMPILE_ASSERT((CRYPTO_refcount_t)-1 == CRYPTO_REFCOUNT_MAX,
CRYPTO_REFCOUNT_MAX_is_incorrect);
@@ -50,4 +50,4 @@
return ret;
}
-#endif // OPENSSL_C11_ATOMIC
+#endif // !OPENSSL_C11_ATOMIC && !STARBOARD
diff --git a/src/third_party/boringssl/src/crypto/refcount_starboard.c b/src/third_party/boringssl/src/crypto/refcount_starboard.c
new file mode 100644
index 0000000..8c9bc39
--- /dev/null
+++ b/src/third_party/boringssl/src/crypto/refcount_starboard.c
@@ -0,0 +1,57 @@
+// Copyright 2019 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.
+
+// Based on refcount_c11.c implementation.
+
+#include "internal.h"
+
+#if defined(STARBOARD)
+
+#include "starboard/atomic.h"
+
+void CRYPTO_refcount_inc(CRYPTO_refcount_t *count) {
+ CRYPTO_refcount_t expected = SbAtomicNoBarrier_Load(count);
+
+ while (expected != CRYPTO_REFCOUNT_MAX) {
+ CRYPTO_refcount_t new_value = expected + 1;
+ CRYPTO_refcount_t old_value = SbAtomicNoBarrier_CompareAndSwap(
+ count, expected, new_value);
+ if (old_value == expected) {
+ break;
+ }
+ expected = old_value;
+ }
+}
+
+int CRYPTO_refcount_dec_and_test_zero(CRYPTO_refcount_t *count) {
+ CRYPTO_refcount_t expected = SbAtomicNoBarrier_Load(count);
+
+ for (;;) {
+ if (expected == 0) {
+ OPENSSL_port_abort();
+ } else if (expected == CRYPTO_REFCOUNT_MAX) {
+ return 0;
+ } else {
+ CRYPTO_refcount_t new_value = expected - 1;
+ CRYPTO_refcount_t old_value = SbAtomicNoBarrier_CompareAndSwap(
+ count, expected, new_value);
+ if (old_value == expected) {
+ return new_value == 0;
+ }
+ expected = old_value;
+ }
+ }
+}
+
+#endif // defined(STARBOARD)
diff --git a/src/third_party/boringssl/src/crypto/thread_none.c b/src/third_party/boringssl/src/crypto/thread_none.c
index 718d960..8475854 100644
--- a/src/third_party/boringssl/src/crypto/thread_none.c
+++ b/src/third_party/boringssl/src/crypto/thread_none.c
@@ -14,7 +14,7 @@
#include "internal.h"
-#if defined(OPENSSL_NO_THREADS)
+#if defined(OPENSSL_NO_THREADS) && !defined(STARBOARD)
void CRYPTO_MUTEX_init(CRYPTO_MUTEX *lock) {}
@@ -56,4 +56,4 @@
return 1;
}
-#endif // OPENSSL_NO_THREADS
+#endif // OPENSSL_NO_THREADS && !STARBOARD
diff --git a/src/third_party/boringssl/src/crypto/thread_starboard.cc b/src/third_party/boringssl/src/crypto/thread_starboard.cc
new file mode 100644
index 0000000..40ac897
--- /dev/null
+++ b/src/third_party/boringssl/src/crypto/thread_starboard.cc
@@ -0,0 +1,231 @@
+// Copyright 2019 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.
+
+// Based on thread_pthread.c.
+
+#include "internal.h"
+
+#if defined(STARBOARD)
+
+#include <openssl/mem.h>
+
+#include "starboard/once.h"
+#include "starboard/thread.h"
+
+namespace {
+
+// Each enum of thread_local_data_t corresponds to a ThreadLocalEntry.
+struct ThreadLocalEntry {
+ thread_local_destructor_t destructor;
+ void* value;
+};
+
+// One thread local key will point to an array of ThreadLocalEntry.
+SbThreadLocalKey g_thread_local_key = kSbThreadLocalKeyInvalid;
+
+// Control the creation of the global thread local key.
+SbOnceControl g_thread_local_once_control = SB_ONCE_INITIALIZER;
+
+void ThreadLocalDestructor(void* value) {
+ if (value) {
+ ThreadLocalEntry* thread_locals = static_cast<ThreadLocalEntry*>(value);
+ for (int i = 0; i < NUM_OPENSSL_THREAD_LOCALS; ++i) {
+ if (thread_locals[i].destructor != nullptr) {
+ thread_locals[i].destructor(thread_locals[i].value);
+ }
+ }
+ OPENSSL_free(value);
+ }
+}
+
+void ThreadLocalInit() {
+ g_thread_local_key = SbThreadCreateLocalKey(&ThreadLocalDestructor);
+}
+
+void EnsureInitialized(struct CRYPTO_STATIC_MUTEX* lock) {
+ enum {
+ kUninitialized = 0,
+ kInitializing,
+ kInitialized
+ };
+
+ if (SbAtomicNoBarrier_Load(&lock->initialized) == kInitialized) {
+ return;
+ }
+ if (SbAtomicNoBarrier_CompareAndSwap(&lock->initialized,
+ kUninitialized, kInitializing) == kUninitialized) {
+ CRYPTO_MUTEX_init(&lock->mutex);
+ SbAtomicNoBarrier_Store(&lock->initialized, kInitialized);
+ return;
+ }
+ while (SbAtomicNoBarrier_Load(&lock->initialized) != kInitialized) {
+ SbThreadSleep(kSbTimeMillisecond);
+ }
+}
+
+} // namespace
+
+void CRYPTO_MUTEX_init(CRYPTO_MUTEX* lock) {
+ if (!SbMutexCreate(&lock->mutex)) {
+ OPENSSL_port_abort();
+ }
+ if (!SbConditionVariableCreate(&lock->condition, &lock->mutex)) {
+ OPENSSL_port_abort();
+ }
+ lock->readers = 0;
+ lock->writing = false;
+}
+
+// https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
+void CRYPTO_MUTEX_lock_read(CRYPTO_MUTEX* lock) {
+ if (SbMutexAcquire(&lock->mutex) != kSbMutexAcquired) {
+ OPENSSL_port_abort();
+ }
+ while (lock->writing) {
+ if (SbConditionVariableWait(&lock->condition, &lock->mutex) ==
+ kSbConditionVariableFailed) {
+ OPENSSL_port_abort();
+ }
+ }
+ ++(lock->readers);
+ if (!SbMutexRelease(&lock->mutex)) {
+ OPENSSL_port_abort();
+ }
+}
+
+// https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
+void CRYPTO_MUTEX_lock_write(CRYPTO_MUTEX* lock) {
+ if (SbMutexAcquire(&lock->mutex) != kSbMutexAcquired) {
+ OPENSSL_port_abort();
+ }
+ while (lock->writing) {
+ if (SbConditionVariableWait(&lock->condition, &lock->mutex) ==
+ kSbConditionVariableFailed) {
+ OPENSSL_port_abort();
+ }
+ }
+ lock->writing = true;
+ while (lock->readers > 0) {
+ if (SbConditionVariableWait(&lock->condition, &lock->mutex) ==
+ kSbConditionVariableFailed) {
+ OPENSSL_port_abort();
+ }
+ }
+ if (!SbMutexRelease(&lock->mutex)) {
+ OPENSSL_port_abort();
+ }
+}
+
+// https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
+void CRYPTO_MUTEX_unlock_read(CRYPTO_MUTEX* lock) {
+ if (SbMutexAcquire(&lock->mutex) != kSbMutexAcquired) {
+ OPENSSL_port_abort();
+ }
+ if (--(lock->readers) == 0) {
+ SbConditionVariableBroadcast(&lock->condition);
+ }
+ if (!SbMutexRelease(&lock->mutex)) {
+ OPENSSL_port_abort();
+ }
+}
+
+// https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
+void CRYPTO_MUTEX_unlock_write(CRYPTO_MUTEX* lock) {
+ if (SbMutexAcquire(&lock->mutex) != kSbMutexAcquired) {
+ OPENSSL_port_abort();
+ }
+ lock->writing = false;
+ SbConditionVariableBroadcast(&lock->condition);
+ if (!SbMutexRelease(&lock->mutex)) {
+ OPENSSL_port_abort();
+ }
+}
+
+void CRYPTO_MUTEX_cleanup(CRYPTO_MUTEX* lock) {
+ if (!SbConditionVariableDestroy(&lock->condition)) {
+ OPENSSL_port_abort();
+ }
+ if (!SbMutexDestroy(&lock->mutex)) {
+ OPENSSL_port_abort();
+ }
+}
+
+void CRYPTO_STATIC_MUTEX_lock_read(struct CRYPTO_STATIC_MUTEX* lock) {
+ EnsureInitialized(lock);
+ CRYPTO_MUTEX_lock_read(&lock->mutex);
+}
+
+void CRYPTO_STATIC_MUTEX_lock_write(struct CRYPTO_STATIC_MUTEX* lock) {
+ EnsureInitialized(lock);
+ CRYPTO_MUTEX_lock_write(&lock->mutex);
+}
+
+void CRYPTO_STATIC_MUTEX_unlock_read(struct CRYPTO_STATIC_MUTEX* lock) {
+ EnsureInitialized(lock);
+ CRYPTO_MUTEX_unlock_read(&lock->mutex);
+}
+
+void CRYPTO_STATIC_MUTEX_unlock_write(struct CRYPTO_STATIC_MUTEX* lock) {
+ EnsureInitialized(lock);
+ CRYPTO_MUTEX_unlock_write(&lock->mutex);
+}
+
+void* CRYPTO_get_thread_local(thread_local_data_t index) {
+ SbOnce(&g_thread_local_once_control, &ThreadLocalInit);
+ if (!SbThreadIsValidLocalKey(g_thread_local_key)) {
+ return nullptr;
+ }
+
+ ThreadLocalEntry* thread_locals = static_cast<ThreadLocalEntry*>(
+ SbThreadGetLocalValue(g_thread_local_key));
+ if (thread_locals == nullptr) {
+ return nullptr;
+ }
+
+ return thread_locals[index].value;
+}
+
+int CRYPTO_set_thread_local(thread_local_data_t index, void *value,
+ thread_local_destructor_t destructor) {
+ SbOnce(&g_thread_local_once_control, &ThreadLocalInit);
+ if (!SbThreadIsValidLocalKey(g_thread_local_key)) {
+ destructor(value);
+ return 0;
+ }
+
+ ThreadLocalEntry* thread_locals = static_cast<ThreadLocalEntry*>(
+ SbThreadGetLocalValue(g_thread_local_key));
+ if (thread_locals == nullptr) {
+ size_t thread_locals_size =
+ sizeof(ThreadLocalEntry) * NUM_OPENSSL_THREAD_LOCALS;
+ thread_locals = static_cast<ThreadLocalEntry*>(
+ OPENSSL_malloc(thread_locals_size));
+ if (thread_locals == nullptr) {
+ destructor(value);
+ return 0;
+ }
+ OPENSSL_memset(thread_locals, 0, thread_locals_size);
+ if (!SbThreadSetLocalValue(g_thread_local_key, thread_locals)) {
+ OPENSSL_free(thread_locals);
+ destructor(value);
+ return 0;
+ }
+ }
+
+ thread_locals[index].destructor = destructor;
+ thread_locals[index].value = value;
+ return 1;
+}
+
+#endif // defined(STARBOARD)
diff --git a/src/third_party/boringssl/src/include/openssl/thread.h b/src/third_party/boringssl/src/include/openssl/thread.h
index 98073b0..da3cdfa 100644
--- a/src/third_party/boringssl/src/include/openssl/thread.h
+++ b/src/third_party/boringssl/src/include/openssl/thread.h
@@ -61,12 +61,29 @@
#include <openssl/base.h>
+#include "starboard/atomic.h"
+#include "starboard/condition_variable.h"
+#include "starboard/mutex.h"
+
#if defined(__cplusplus)
extern "C" {
#endif
-#if defined(OPENSSL_NO_THREADS)
+#if defined(STARBOARD)
+typedef struct crypto_mutex_st {
+ // It would be nice to use starboard::RWLock. However, that's a C++ class, so
+ // it can't even be included in this C header. It's possible to use an opaque
+ // pointer to it, but then an allocation would be needed or we somehow embed
+ // a byte array that is sizeof(starboard::RWLock) without including the
+ // declaration. Avoid the complication and just implement the RWMutex using
+ // starboard C structs.
+ SbMutex mutex;
+ SbConditionVariable condition;
+ size_t readers;
+ bool writing;
+} CRYPTO_MUTEX;
+#elif defined(OPENSSL_NO_THREADS)
typedef struct crypto_mutex_st {
char padding; // Empty structs have different sizes in C and C++.
} CRYPTO_MUTEX;
@@ -98,7 +115,11 @@
// as C code that might not set -std=c11. So, in practice, it's not possible to
// do that. Instead we statically assert that the size and native alignment of
// a plain uint32_t and an _Atomic uint32_t are equal in refcount_c11.c.
+#if defined(STARBOARD)
+typedef SbAtomic32 CRYPTO_refcount_t;
+#else
typedef uint32_t CRYPTO_refcount_t;
+#endif
// Deprecated functions.
diff --git a/src/third_party/icu/README.cobalt b/src/third_party/icu/README.cobalt
new file mode 100644
index 0000000..cf85b3f
--- /dev/null
+++ b/src/third_party/icu/README.cobalt
@@ -0,0 +1,102 @@
+How to rebuild the ICU data files.
+
+This is based off of section B in the README.chromium file.
+
+1. First revert to the non-Starboardized version of ICU in the Cobalt source
+ tree. This is necessary because regenerating the data files requires building
+ ICU, and this is best done with a non-Starboardized version of the library.
+
+ You can do this by looking at the git log for third_party/icu and tracing
+ it back until you find the first non-Cobalt change, and then checking out
+ that commit.
+
+2. Set ICU_ROOT to the directory of the ICU source code in the Cobalt source
+ tree, e.g. `$COBALT_SRC_ROOT/src/third_party/icu`.
+
+3. Create a build directory outside of the Cobalt codebase, and make that your
+ current working directory. Set ICU_DATA_ROOT to this directory.
+
+4. Configure the ICU build. Note that we setup our compiler defines in the same
+ way that they are set when building ICU within Cobalt, according to our
+ icu.gyp file. Note that below, `-DUCONFIG_NO_LEGACY_CONVERSION=1` is left
+ out on purpose even though it is used when building ICU for Cobalt because
+ it causes an issue when converting to big endian
+ ( https://unicode-org.atlassian.net/browse/ICU-11046 ). In addition,
+ `-DU_CHARSET_IS_UTF8=1` is also left out for the same reason as it was found
+ to produce a similar error.
+
+ ```
+ env CPPFLAGS="-DUCONFIG_ONLY_HTML_CONVERSION=1 -DUCONFIG_NO_TRANSLITERATION=1 -DUCONFIG_NO_COLLATION=1" $ICU_ROOT/source/runConfigureICU Linux --disable-layout
+
+ ```
+
+5. Run make.
+
+ ```
+ make -j8
+ ```
+
+ Note that it's okay for it to end in an error around `css3transform.res`,
+ enough of it should have built successfully for us to complete the remaining
+ instructions.
+
+6. Revert your ICU source checkout back to the tip, there have been local
+ modifications to it (specifically `source/data/mappings/convrtrs.txt`) that
+ we want to pick up here.
+
+ ```
+ cd $ICU_ROOT
+ git checkout origin/COBALT
+ cd $ICU_DATA_ROOT
+ ```
+
+7. Run `$ICU_ROOT/scripts/trim_data.sh`
+
+8. Run `$ICU_ROOT/android/patch_locale.sh`.
+
+9. Run `$ICU_ROOT/scripts/make_data.sh`.
+
+10. Run `$ICU_ROOT/scripts/clean_up_data_source.sh` to clean up the changes
+ made to $ICU_ROOT from the call to `patch_locale.sh`.
+
+11. Create a new directory where we will rebuild ICU with different options
+ because the options used above will produce a version of the tool `icupkg` (
+ which we need to use to translate from little to big endian) that does not
+ work. Call this new directory $ICU_PKG_ROOT.
+
+12. Change directory to $ICU_PKG_ROOT.
+
+13. Run `$ICU_ROOT/source/runConfigureICU Linux --disable-layout && make -j8`
+
+14. Run `$ICU_ROOT/scripts/make_data.sh`
+
+15. Run `export LD_LIBRARY_PATH=$ICU_PKG_ROOT/lib`
+
+16. Run `sudo apt install icu-devtools` to obtain the `icupkg` command and its
+ dependencies. Even though you will be running a locally-built version of
+ `icupkg`, you will need the shared libraries installed by this command.
+
+17. Replace the files in this directory with the new files that you have built.
+ They will exist as a little-endian package file, but you can use the
+ `icupkg` tool to both unpack the files out of the package (which Cobalt
+ prefers), and switch from little-endian to big-endian.
+
+ Run:
+
+ ```
+ cd $COBALT_SRC_ROOT/src/cobalt/content/icu
+ rm -rf *
+ mkdir icudt56l icudt56b
+ $ICU_PKG_ROOT/bin/icupkg -tl -x '*' -d icudt56l $ICU_DATA_ROOT/data/out/tmp/icudt56l.dat
+ $ICU_PKG_ROOT/bin/icupkg -tb -x '*' -d icudt56b $ICU_DATA_ROOT/data/out/tmp/icudt56l.dat
+ ```
+
+
+You should now have the ICU data files generated and ready to go in the Cobalt
+source tree, and you can clean up any outstanding files. If there are any
+leftover changes in your $ICU_ROOT directory, you can revert them. At this
+point you can re-gyp, re-ninja, and run Cobalt and it should work.
+
+Note that at the time of this writing, the final resulting contents had a size
+of 6.9MB, from running the command
+`du -sh $COBALT_SRC_ROOT/src/cobalt/content/icu/icudt56l`.
diff --git a/src/third_party/libvpx_gpu/vp9-dec-core/build/obj_int_extract.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-core/build/obj_int_extract.vcxproj
deleted file mode 100644
index b4fddc6..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-core/build/obj_int_extract.vcxproj
+++ /dev/null
@@ -1,166 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{E1360C65-D375-4335-8057-7ED99CC3F9B2}</ProjectGuid>
- <RootNamespace>obj_int_extract</RootNamespace>
- <Keyword>ManagedCProj</Keyword>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>false</WholeProgramOptimization>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>false</WholeProgramOptimization>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup>
- <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;..;./build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>OldStyle</DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>obj_int_extract.exe</OutputFile>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </Link>
- <PreBuildEvent>
- <Command>
- </Command>
- </PreBuildEvent>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;..;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>OldStyle</DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>obj_int_extract.exe</OutputFile>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </Link>
- <PreBuildEvent>
- <Command>
- </Command>
- </PreBuildEvent>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <ClCompile>
- <Optimization>MaxSpeed</Optimization>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>.;..;./build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>
- </DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>obj_int_extract.exe</OutputFile>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </Link>
- <PreBuildEvent>
- <Command>
- </Command>
- </PreBuildEvent>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <Optimization>MaxSpeed</Optimization>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>.;..;./build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>
- </DebugInformationFormat>
- </ClCompile>
- <Link>
- <OutputFile>obj_int_extract.exe</OutputFile>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </Link>
- <PreBuildEvent>
- <Command>
- </Command>
- </PreBuildEvent>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="make\obj_int_extract.c">
- <ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)build_make_obj_int_extract.obj</ObjectFileName>
- <ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)build_make_obj_int_extract.obj</ObjectFileName>
- <ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)build_make_obj_int_extract.obj</ObjectFileName>
- <ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)build_make_obj_int_extract.obj</ObjectFileName>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <None Include="obj_int_extract.bat" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-core/build/obj_int_extract.vcxproj.filters b/src/third_party/libvpx_gpu/vp9-dec-core/build/obj_int_extract.vcxproj.filters
deleted file mode 100644
index 93e8543..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-core/build/obj_int_extract.vcxproj.filters
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <UniqueIdentifier>4C149771-9F7E-4C2B-541A-6353828BEB52</UniqueIdentifier>
- <Extensions>c;cc;def;odl;idl;hpj;bat;asm;asmx</Extensions>
- </Filter>
- <Filter Include="Header Files">
- <UniqueIdentifier>05FD4944-2E7C-8CFC-0443-D6DAD06BE957</UniqueIdentifier>
- <Extensions>h;hm;inl;inc;xsd</Extensions>
- </Filter>
- <Filter Include="Resource Files">
- <UniqueIdentifier>01A2776B-A9DA-4C36-2179-2D64860A04BF</UniqueIdentifier>
- <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
- </Filter>
- <Filter Include="Build Files">
- <UniqueIdentifier>83458B37-ADD7-A5C2-40D2-5EB607F2C856</UniqueIdentifier>
- <Extensions>mk</Extensions>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="make\obj_int_extract.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <None Include="obj_int_extract.bat">
- <Filter>Source Files</Filter>
- </None>
- </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-core - Copy.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-core - Copy.vcxproj
deleted file mode 100644
index e101eb4..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-core - Copy.vcxproj
+++ /dev/null
@@ -1,477 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|ORBIS">
- <Configuration>Debug</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ORBIS">
- <Configuration>Release</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}</ProjectGuid>
- <RootNamespace>vpx</RootNamespace>
- <Keyword>ManagedCProj</Keyword>
- <ProjectName>vp9-dec-core</ProjectName>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings" />
- <ImportGroup Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(SolutionDir)\SceGnm.props" Condition="Exists('$(SolutionDir)\SceGnm.Development.props')" />
- <Import Project="$(SCE_ORBIS_SDK_DIR)\host_tools\msbuild\SceGnm.props" Condition="!Exists('$(SolutionDir)\SceGnm.Development.props')" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <OutDir>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- <TargetName>$(ProjectName)$(PlatformArchitecture)</TargetName>
- <IncludePath>$(DXSDK_DIR)include;$(IncludePath)</IncludePath>
- <LibraryPath>$(DXSDK_DIR)lib\x64;$(LibraryPath)</LibraryPath>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <TargetName>$(ProjectName)$(PlatformArchitecture)</TargetName>
- <IncludePath>$(IncludePath)</IncludePath>
- <LibraryPath>$(LibraryPath)</LibraryPath>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <OutDir>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- <TargetName>$(ProjectName)$(PlatformArchitecture)</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <OutDir>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- <TargetName>$(ProjectName)$(PlatformArchitecture)</TargetName>
- <IncludePath>$(DXSDK_DIR)include;$(IncludePath)</IncludePath>
- <LibraryPath>$(DXSDK_DIR)lib\x64;$(LibraryPath)</LibraryPath>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <TargetName>$(ProjectName)$(PlatformArchitecture)</TargetName>
- <IncludePath>$(DXSDK_DIR)include;$(IncludePath)</IncludePath>
- <LibraryPath>$(DXSDK_DIR)lib\x64;$(LibraryPath)</LibraryPath>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <OutDir>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- <TargetName>$(ProjectName)$(PlatformArchitecture)</TargetName>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <PreBuildEvent>
- <Command>cd ./script
-call amd_build.bat</Command>
- </PreBuildEvent>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>
- </AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <PreBuildEvent>
- <Command>cd ./script
-call amd_build.bat</Command>
- </PreBuildEvent>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir)ORBIS_Debug;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>
- </AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- <PSSL />
- <PSSL>
- <Verbosity>Quiet</Verbosity>
- </PSSL>
- <PSSL>
- <AuxData>Disabled</AuxData>
- </PSSL>
- <Compile_PSSL_To_Header />
- <Compile_PSSL_To_Header />
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <PreBuildEvent>
- <Command>cd ./script
-call amd_build.bat</Command>
- </PreBuildEvent>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>
- </AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- <ProjectReference>
- <LinkLibraryDependencies>true</LinkLibraryDependencies>
- </ProjectReference>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <PreBuildEvent>
- <Command>cd ./script
-call amd_build.bat</Command>
- </PreBuildEvent>
- <ClCompile>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <Optimization>MaxSpeed</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>
- </AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <PreBuildEvent>
- <Command>cd ./script
-call amd_build.bat</Command>
- </PreBuildEvent>
- <ClCompile>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <Optimization>MaxSpeed</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>
- </AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <PreBuildEvent>
- <Command>cd ./script
-call amd_build.bat</Command>
- </PreBuildEvent>
- <ClCompile>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <Optimization>MaxSpeed</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;</AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="..\vp9\decoder\interop\vp9lux_cl_wrapper.cpp">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\interop\vp9lux_interop.c">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_alt_inter_ocl.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_decode_block.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_dx_compute.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_dx_window.cpp">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_intra_ocl.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_loopfilter_ocl.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_ocl.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_ocl_mem_amd.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_ocl_programs.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_thread.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_transform_ocl.cpp" />
- <ClCompile Include="..\vpx\src\vpx_decoder.c">
- <ObjectFileName>$(IntDir)vpx_src_vpx_decoder.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx\src\vpx_codec.c">
- <ObjectFileName>$(IntDir)vpx_src_vpx_codec.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx\src\vpx_image.c">
- <ObjectFileName>$(IntDir)vpx_src_vpx_image.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_mem\vpx_mem.c">
- <ObjectFileName>$(IntDir)vpx_mem_vpx_mem.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\vpx_scale.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_vpx_scale.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\yv12config.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_yv12config.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\yv12extend.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_yv12extend.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\gen_scalers.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_gen_scalers.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\vpx_scale_rtcd.c" />
- <ClCompile Include="..\vp9\common\vp9_blockd.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_blockd.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_debugmodes.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_debugmodes.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_entropy.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_entropy.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_entropymode.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_entropymode.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_entropymv.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_entropymv.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_pred_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_pred_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_prob.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_prob.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_rtcd.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_rtcd.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_scale.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_scale.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_seg_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_seg_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_thread.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_thread.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_tile_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_tile_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_loopfilter.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_loopfilter.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_mvref_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_mvref_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_quant_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_quant_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_common_data.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_common_data.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_scan.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_scan.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\vp9_dx_iface.c">
- <ObjectFileName>$(IntDir)vp9_vp9_dx_iface.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_decodemv.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_decodemv.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_decodeframe.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_decodeframe.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_detokenize.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_detokenize.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_reader.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_reader.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_read_bit_buffer.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_read_bit_buffer.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_decoder.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_decoder.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_dsubexp.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_dsubexp.obj</ObjectFileName>
- </ClCompile>
- <None Include="..\vpx.def" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\vp9\common\vp9lux_log.h" />
- <ClInclude Include="..\vp9\decoder\interop\vp9lux_cl_wrapper.h" />
- <ClInclude Include="..\vp9\decoder\interop\vp9lux_interop.h" />
- <ClInclude Include="..\vp9\decoder\kernels\pssl_common.h" />
- <ClInclude Include="..\vp9\decoder\kernels\pssl_idct_base.h" />
- <ClInclude Include="..\vp9\decoder\kernels\pssl_inter_common.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_alt_inter_ocl.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_decode_block.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_dx_compute.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_dx_window.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_intra_modes_table_binary.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_intra_ocl.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_loopfilter_ocl.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_ocl.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_ocl_binary.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_ocl_programs.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_thread.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_transform_ocl.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_types.h" />
- <ClInclude Include="..\vpx\vpx_decoder.h" />
- <ClInclude Include="..\vpx\internal\vpx_codec_internal.h" />
- <ClInclude Include="..\vpx\vpx_codec.h" />
- <ClInclude Include="..\vpx\vpx_frame_buffer.h" />
- <ClInclude Include="..\vpx\vpx_hw_image.h" />
- <ClInclude Include="..\vpx\vpx_image.h" />
- <ClInclude Include="..\vpx\vpx_integer.h" />
- <ClInclude Include="..\vpx_mem\vpx_mem.h" />
- <ClInclude Include="..\vpx_mem\include\vpx_mem_intrnl.h" />
- <ClInclude Include="..\vpx_scale\yv12config.h" />
- <ClInclude Include="..\vpx_scale\vpx_scale.h" />
- <ClInclude Include="..\vpx_ports\asm_offsets.h" />
- <ClInclude Include="..\vpx_ports\mem.h" />
- <ClInclude Include="..\vpx_ports\vpx_timer.h" />
- <ClInclude Include="..\vpx_ports\x86.h" />
- <ClInclude Include="..\vp9\vp9_iface_common.h" />
- <ClInclude Include="..\vp9\common\vp9_ppflags.h" />
- <ClInclude Include="..\vp9\common\vp9_filter.h" />
- <ClInclude Include="..\vp9\common\vp9_frame_buffers.h" />
- <ClInclude Include="..\vp9\common\vp9_blockd.h" />
- <ClInclude Include="..\vp9\common\vp9_common.h" />
- <ClInclude Include="..\vp9\common\vp9_entropy.h" />
- <ClInclude Include="..\vp9\common\vp9_entropymode.h" />
- <ClInclude Include="..\vp9\common\vp9_entropymv.h" />
- <ClInclude Include="..\vp9\common\vp9_enums.h" />
- <ClInclude Include="..\vp9\common\vp9_loopfilter.h" />
- <ClInclude Include="..\vp9\common\vp9_mv.h" />
- <ClInclude Include="..\vp9\common\vp9_pred_common.h" />
- <ClInclude Include="..\vp9\common\vp9_prob.h" />
- <ClInclude Include="..\vp9\common\vp9_quant_common.h" />
- <ClInclude Include="..\vp9\common\vp9_scale.h" />
- <ClInclude Include="..\vp9\common\vp9_seg_common.h" />
- <ClInclude Include="..\vp9\common\vp9_systemdependent.h" />
- <ClInclude Include="..\vp9\common\vp9_textblit.h" />
- <ClInclude Include="..\vp9\common\vp9_thread.h" />
- <ClInclude Include="..\vp9\common\vp9_tile_common.h" />
- <ClInclude Include="..\vp9\common\vp9_mvref_common.h" />
- <ClInclude Include="..\vp9\common\vp9_common_data.h" />
- <ClInclude Include="..\vp9\common\vp9_scan.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decodeframe.h" />
- <ClInclude Include="..\vp9\decoder\vp9_dthread.h" />
- <ClInclude Include="..\vp9\decoder\vp9_reader.h" />
- <ClInclude Include="..\vp9\decoder\vp9_read_bit_buffer.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decodemv.h" />
- <ClInclude Include="..\vp9\decoder\vp9_detokenize.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decoder.h" />
- <ClInclude Include="..\vp9\decoder\vp9_dsubexp.h" />
- <ClInclude Include="..\vpx_ports\emmintrin_compat.h" />
- <ClInclude Include="..\vpx_ports\mem_ops.h" />
- <ClInclude Include="..\vpx_ports\mem_ops_aligned.h" />
- <ClInclude Include="..\vpx_ports\vpx_once.h" />
- <ClInclude Include="..\vp9_rtcd.h" />
- <ClInclude Include="vpx_scale_rtcd.h" />
- </ItemGroup>
- <ItemGroup>
- <None Include="..\vpx\vpx_codec.mk" />
- </ItemGroup>
- <ItemGroup>
- <None Include="..\vp9\decoder\kernels\ps.hlsl">
- <FileType>Document</FileType>
- </None>
- <None Include="..\vp9\decoder\kernels\vs.hlsl">
- <FileType>Document</FileType>
- </None>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_16x16full_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_32x32full_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_4x4full_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_8x8full_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_compound_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_main_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\intra_borders_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\intra_main_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\lf_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <Import Project="$(SolutionDir)\SceGnm.targets" Condition="Exists('$(SolutionDir)\SceGnm.Development.props')" />
- <Import Project="$(SCE_ORBIS_SDK_DIR)\host_tools\msbuild\SceGnm.targets" Condition="!Exists('$(SolutionDir)\SceGnm.Development.props')" />
- <ImportGroup Label="ExtensionTargets" />
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-core.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-core.vcxproj
deleted file mode 100644
index 0e81043..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-core.vcxproj
+++ /dev/null
@@ -1,677 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|ORBIS">
- <Configuration>Debug</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ORBIS">
- <Configuration>Release</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}</ProjectGuid>
- <RootNamespace>vpx</RootNamespace>
- <Keyword>ManagedCProj</Keyword>
- <ProjectName>vp9-dec-core</ProjectName>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <PlatformToolset>v140</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <PlatformToolset>v140</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <PlatformToolset>v140</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v140</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>Clang</PlatformToolset>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- <Import Project="$(ProgramFiles)\SCE\ORBIS SDKs\3.500\host_tools\msbuild\SceShader.props" />
- <Import Project="$(VCTargetsPath)\BuildCustomizations\OrbisWavePsslc.props" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <OutDir>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- <TargetName>$(ProjectName)$(PlatformArchitecture)</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <OutDir>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- <TargetName>$(ProjectName)$(PlatformArchitecture)</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <TargetName>$(ProjectName)</TargetName>
- <GnmUseGnm>true</GnmUseGnm>
- <GnmUseGnmx>true</GnmUseGnmx>
- <GnmUseAddressLibrary>true</GnmUseAddressLibrary>
- <GnmUseLibShaderBinary>true</GnmUseLibShaderBinary>
- <GnmUseGNF>true</GnmUseGNF>
- <GnmUseTextureTool>false</GnmUseTextureTool>
- <GnmUsePM4Dump>true</GnmUsePM4Dump>
- <GnmUseSampleCommon>false</GnmUseSampleCommon>
- <GnmProjectType>SampleLib</GnmProjectType>
- <OutDir>$(SolutionDir)lib\$(Configuration)\</OutDir>
- <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <OutDir>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- <TargetName>$(ProjectName)$(PlatformArchitecture)</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <OutDir>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- <TargetName>$(ProjectName)$(PlatformArchitecture)</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <TargetName>$(ProjectName)</TargetName>
- <OutDir>$(SolutionDir)lib\$(Configuration)\</OutDir>
- <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <PreBuildEvent>
- <Command>cd ./script
-call amd_build.bat</Command>
- </PreBuildEvent>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>
- </AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <PreBuildEvent>
- <Command>
- </Command>
- </PreBuildEvent>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>
- </AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- <ProjectReference>
- <LinkLibraryDependencies>true</LinkLibraryDependencies>
- </ProjectReference>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <PreBuildEvent>
- <Command>
- </Command>
- </PreBuildEvent>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>LUXOFT_VP9_ENABLE_SCALING;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>
- </AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- <ProjectReference>
- <LinkLibraryDependencies>true</LinkLibraryDependencies>
- </ProjectReference>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <PreBuildEvent>
- <Command>cd ./script
-call amd_build.bat</Command>
- </PreBuildEvent>
- <ClCompile>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <Optimization>MaxSpeed</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>
- </AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <PreBuildEvent>
- <Command>cd ./script
-call amd_build.bat</Command>
- </PreBuildEvent>
- <ClCompile>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <Optimization>MaxSpeed</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;</AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <PreBuildEvent>
- <Command>
- </Command>
- </PreBuildEvent>
- <ClCompile>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <Optimization>MaxSpeed</Optimization>
- <AdditionalIncludeDirectories>.;..;$(SolutionDir)../Thirdparty/amd/mcl/1.6/amdmcl/inc;$(ProjectDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>LUXOFT_VP9_ENABLE_SCALING;WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <OptimizationLevel>Level3</OptimizationLevel>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <LinkTimeOptimization>true</LinkTimeOptimization>
- <NoStrictAliasing>true</NoStrictAliasing>
- <UnrollLoops>false</UnrollLoops>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;</AdditionalLibraryDirectories>
- <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
- </Lib>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="..\vp9\common\vp9_scale.c" />
- <ClCompile Include="..\vp9\common\vp9_scan.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_inter.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_decode_block.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_intra.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_linear_allocator.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_loopfilter.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_dec.cpp">
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Levels</OptimizationLevel>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_gpu_mem_ps4.cpp">
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Levels</OptimizationLevel>
- <LinkTimeOptimization Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">false</LinkTimeOptimization>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_gpu_programs.cpp" />
- <ClCompile Include="..\vp9\decoder\vp9lux_thread.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_transform.cpp" />
- <ClCompile Include="..\vpx\src\vpx_decoder.c">
- <ObjectFileName>$(IntDir)vpx_src_vpx_decoder.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx\src\vpx_codec.c">
- <ObjectFileName>$(IntDir)vpx_src_vpx_codec.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Level3</OptimizationLevel>
- <LinkTimeOptimization Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</LinkTimeOptimization>
- </ClCompile>
- <ClCompile Include="..\vpx\src\vpx_image.c">
- <ObjectFileName>$(IntDir)vpx_src_vpx_image.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_mem\vpx_mem.c">
- <ObjectFileName>$(IntDir)vpx_mem_vpx_mem.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\vpx_scale.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_vpx_scale.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\yv12config.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_yv12config.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Level3</OptimizationLevel>
- <LinkTimeOptimization Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</LinkTimeOptimization>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\yv12extend.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_yv12extend.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Level3</OptimizationLevel>
- <LinkTimeOptimization Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</LinkTimeOptimization>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\gen_scalers.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_gen_scalers.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\vpx_scale_rtcd.c">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">false</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_blockd.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_blockd.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_debugmodes.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_debugmodes.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_entropy.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_entropy.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Level3</OptimizationLevel>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_entropymode.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_entropymode.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Level3</OptimizationLevel>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_entropymv.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_entropymv.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Level3</OptimizationLevel>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_pred_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_pred_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_prob.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_prob.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Level3</OptimizationLevel>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_seg_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_seg_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_thread.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_thread.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_tile_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_tile_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_loopfilter.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_loopfilter.obj</ObjectFileName>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">false</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_mvref_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_mvref_common.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Levels</OptimizationLevel>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_quant_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_quant_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_common_data.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_common_data.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\vp9_dx_iface.c">
- <ObjectFileName>$(IntDir)vp9_vp9_dx_iface.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Level3</OptimizationLevel>
- <LinkTimeOptimization Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">true</LinkTimeOptimization>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_decodemv.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_decodemv.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Levels</OptimizationLevel>
- <AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">-Wno-unused-function %(AdditionalOptions)</AdditionalOptions>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_decodeframe.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_decodeframe.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Level3</OptimizationLevel>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_detokenize.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_detokenize.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Level3</OptimizationLevel>
- <UnrollLoops Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">false</UnrollLoops>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_reader.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_reader.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_read_bit_buffer.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_read_bit_buffer.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_decoder.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_decoder.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_dsubexp.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_dsubexp.obj</ObjectFileName>
- <OptimizationLevel Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Level3</OptimizationLevel>
- </ClCompile>
- <None Include="..\vpx.def" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\vp9\common\vp9lux_log.h" />
- <ClInclude Include="..\vp9\common\vp9_onyxc_int.h" />
- <ClInclude Include="..\vp9\common\vp9_scale.h" />
- <ClInclude Include="..\vp9\common\vp9_scan.h" />
- <ClInclude Include="..\vp9\decoder\kernels\pssl_common.h" />
- <ClInclude Include="..\vp9\decoder\kernels\pssl_genblock_common.h" />
- <ClInclude Include="..\vp9\decoder\kernels\pssl_idct_base.h" />
- <ClInclude Include="..\vp9\decoder\kernels\pssl_inter_common.h" />
- <ClInclude Include="..\vp9\decoder\kernels\pssl_intra_common.h" />
- <ClInclude Include="..\vp9\decoder\kernels\pssl_lf_common.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_inter.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_decode_block.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_intra_modes_table_binary.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_intra.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_linear_allocator.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_loopfilter.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_dec.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_gpu_programs.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_thread.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_transform.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_types.h" />
- <ClInclude Include="..\vpx\vpx_decoder.h" />
- <ClInclude Include="..\vpx\internal\vpx_codec_internal.h" />
- <ClInclude Include="..\vpx\vpx_codec.h" />
- <ClInclude Include="..\vpx\vpx_frame_buffer.h" />
- <ClInclude Include="..\vpx\vpx_hw_image.h" />
- <ClInclude Include="..\vpx\vpx_image.h" />
- <ClInclude Include="..\vpx\vpx_integer.h" />
- <ClInclude Include="..\vpx_mem\vpx_mem.h" />
- <ClInclude Include="..\vpx_mem\include\vpx_mem_intrnl.h" />
- <ClInclude Include="..\vpx_scale\yv12config.h" />
- <ClInclude Include="..\vpx_scale\vpx_scale.h" />
- <ClInclude Include="..\vpx_ports\asm_offsets.h" />
- <ClInclude Include="..\vpx_ports\mem.h" />
- <ClInclude Include="..\vpx_ports\vpx_timer.h" />
- <ClInclude Include="..\vpx_ports\x86.h" />
- <ClInclude Include="..\vp9\common\vp9_ppflags.h" />
- <ClInclude Include="..\vp9\common\vp9_filter.h" />
- <ClInclude Include="..\vp9\common\vp9_frame_buffers.h" />
- <ClInclude Include="..\vp9\common\vp9_blockd.h" />
- <ClInclude Include="..\vp9\common\vp9_common.h" />
- <ClInclude Include="..\vp9\common\vp9_entropy.h" />
- <ClInclude Include="..\vp9\common\vp9_entropymode.h" />
- <ClInclude Include="..\vp9\common\vp9_entropymv.h" />
- <ClInclude Include="..\vp9\common\vp9_enums.h" />
- <ClInclude Include="..\vp9\common\vp9_loopfilter.h" />
- <ClInclude Include="..\vp9\common\vp9_mv.h" />
- <ClInclude Include="..\vp9\common\vp9_pred_common.h" />
- <ClInclude Include="..\vp9\common\vp9_prob.h" />
- <ClInclude Include="..\vp9\common\vp9_quant_common.h" />
- <ClInclude Include="..\vp9\common\vp9_seg_common.h" />
- <ClInclude Include="..\vp9\common\vp9_systemdependent.h" />
- <ClInclude Include="..\vp9\common\vp9_textblit.h" />
- <ClInclude Include="..\vp9\common\vp9_thread.h" />
- <ClInclude Include="..\vp9\common\vp9_tile_common.h" />
- <ClInclude Include="..\vp9\common\vp9_mvref_common.h" />
- <ClInclude Include="..\vp9\common\vp9_common_data.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decodeframe.h" />
- <ClInclude Include="..\vp9\decoder\vp9_dthread.h" />
- <ClInclude Include="..\vp9\decoder\vp9_reader.h" />
- <ClInclude Include="..\vp9\decoder\vp9_read_bit_buffer.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decodemv.h" />
- <ClInclude Include="..\vp9\decoder\vp9_detokenize.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decoder.h" />
- <ClInclude Include="..\vp9\decoder\vp9_dsubexp.h" />
- <ClInclude Include="..\vpx_ports\emmintrin_compat.h" />
- <ClInclude Include="..\vpx_ports\mem_ops.h" />
- <ClInclude Include="..\vpx_ports\mem_ops_aligned.h" />
- <ClInclude Include="vpx_scale_rtcd.h">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">false</ExcludedFromBuild>
- </ClInclude>
- </ItemGroup>
- <ItemGroup>
- <None Include="..\vpx\vpx_codec.mk" />
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_16x16full_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_32x32full_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_8x8full_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_compound_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_main_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_ext_borders_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\intra_main_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\lf_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_4x4full_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_4x4lossless_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_resize_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_resize_compound_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_main_copy_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_main_hor_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_main_ver_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\gen_blocks_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_clear_block_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\gen_blocks_lf_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_16x16full_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_32x32full_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_4x4full_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_4x4lossless_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_8x8full_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\intra_main_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\intra_fillborder_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_main_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_compound_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\lf_hbd_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_ext_borders_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_resize_compound_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_resize_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_copy_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_hor_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_ver_hbd_c.pssl">
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sce_cs_orbis</Profile>
- <Profile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">sce_cs_orbis</Profile>
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- <Import Project="$(ProgramFiles)\SCE\ORBIS SDKs\3.500\host_tools\msbuild\SceShader.targets" />
- <Import Project="$(VCTargetsPath)\BuildCustomizations\OrbisWavePsslc.targets" />
- </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-core.vcxproj.filters b/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-core.vcxproj.filters
deleted file mode 100644
index 7622140..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-core.vcxproj.filters
+++ /dev/null
@@ -1,294 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <ClCompile Include="..\vpx\src\vpx_decoder.c" />
- <ClCompile Include="..\vpx\src\vpx_codec.c" />
- <ClCompile Include="..\vpx\src\vpx_image.c" />
- <ClCompile Include="..\vpx_mem\vpx_mem.c" />
- <ClCompile Include="..\vpx_scale\generic\vpx_scale.c" />
- <ClCompile Include="..\vpx_scale\generic\yv12config.c" />
- <ClCompile Include="..\vpx_scale\generic\yv12extend.c" />
- <ClCompile Include="..\vpx_scale\generic\gen_scalers.c" />
- <ClCompile Include="..\vp9\common\vp9_blockd.c" />
- <ClCompile Include="..\vp9\common\vp9_debugmodes.c" />
- <ClCompile Include="..\vp9\common\vp9_entropy.c" />
- <ClCompile Include="..\vp9\common\vp9_entropymode.c" />
- <ClCompile Include="..\vp9\common\vp9_entropymv.c" />
- <ClCompile Include="..\vp9\common\vp9_pred_common.c" />
- <ClCompile Include="..\vp9\common\vp9_prob.c" />
- <ClCompile Include="..\vp9\common\vp9_scale.c" />
- <ClCompile Include="..\vp9\common\vp9_seg_common.c" />
- <ClCompile Include="..\vp9\common\vp9_thread.c" />
- <ClCompile Include="..\vp9\common\vp9_tile_common.c" />
- <ClCompile Include="..\vp9\common\vp9_loopfilter.c" />
- <ClCompile Include="..\vp9\common\vp9_mvref_common.c" />
- <ClCompile Include="..\vp9\common\vp9_quant_common.c" />
- <ClCompile Include="..\vp9\common\vp9_common_data.c" />
- <ClCompile Include="..\vp9\common\vp9_scan.c" />
- <ClCompile Include="..\vp9\vp9_dx_iface.c" />
- <ClCompile Include="..\vp9\decoder\vp9_decodemv.c" />
- <ClCompile Include="..\vp9\decoder\vp9_decodeframe.c" />
- <ClCompile Include="..\vp9\decoder\vp9_detokenize.c" />
- <ClCompile Include="..\vp9\decoder\vp9_reader.c" />
- <ClCompile Include="..\vp9\decoder\vp9_read_bit_buffer.c" />
- <ClCompile Include="..\vp9\decoder\vp9_decoder.c" />
- <ClCompile Include="..\vp9\decoder\vp9_dsubexp.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_thread.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\vpx_scale_rtcd.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_decode_block.cpp">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_inter.cpp">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_transform.cpp">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_gpu_programs.cpp">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_gpu_mem_ps4.cpp">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_dec.cpp">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_loopfilter.cpp">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_intra.cpp">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_linear_allocator.cpp">
- <Filter>lux</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\vpx\vpx_decoder.h" />
- <ClInclude Include="..\vpx\internal\vpx_codec_internal.h" />
- <ClInclude Include="..\vpx\vpx_codec.h" />
- <ClInclude Include="..\vpx\vpx_frame_buffer.h" />
- <ClInclude Include="..\vpx\vpx_image.h" />
- <ClInclude Include="..\vpx\vpx_integer.h" />
- <ClInclude Include="..\vpx_mem\vpx_mem.h" />
- <ClInclude Include="..\vpx_mem\include\vpx_mem_intrnl.h" />
- <ClInclude Include="..\vpx_scale\yv12config.h" />
- <ClInclude Include="..\vpx_scale\vpx_scale.h" />
- <ClInclude Include="..\vpx_ports\asm_offsets.h" />
- <ClInclude Include="..\vpx_ports\mem.h" />
- <ClInclude Include="..\vpx_ports\vpx_timer.h" />
- <ClInclude Include="..\vpx_ports\x86.h" />
- <ClInclude Include="..\vp9\common\vp9_ppflags.h" />
- <ClInclude Include="..\vp9\common\vp9_filter.h" />
- <ClInclude Include="..\vp9\common\vp9_frame_buffers.h" />
- <ClInclude Include="..\vp9\common\vp9_blockd.h" />
- <ClInclude Include="..\vp9\common\vp9_common.h" />
- <ClInclude Include="..\vp9\common\vp9_entropy.h" />
- <ClInclude Include="..\vp9\common\vp9_entropymode.h" />
- <ClInclude Include="..\vp9\common\vp9_entropymv.h" />
- <ClInclude Include="..\vp9\common\vp9_enums.h" />
- <ClInclude Include="..\vp9\common\vp9_loopfilter.h" />
- <ClInclude Include="..\vp9\common\vp9_mv.h" />
- <ClInclude Include="..\vp9\common\vp9_pred_common.h" />
- <ClInclude Include="..\vp9\common\vp9_prob.h" />
- <ClInclude Include="..\vp9\common\vp9_quant_common.h" />
- <ClInclude Include="..\vp9\common\vp9_scale.h" />
- <ClInclude Include="..\vp9\common\vp9_seg_common.h" />
- <ClInclude Include="..\vp9\common\vp9_systemdependent.h" />
- <ClInclude Include="..\vp9\common\vp9_textblit.h" />
- <ClInclude Include="..\vp9\common\vp9_thread.h" />
- <ClInclude Include="..\vp9\common\vp9_tile_common.h" />
- <ClInclude Include="..\vp9\common\vp9_mvref_common.h" />
- <ClInclude Include="..\vp9\common\vp9_common_data.h" />
- <ClInclude Include="..\vp9\common\vp9_scan.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decodeframe.h" />
- <ClInclude Include="..\vp9\decoder\vp9_dthread.h" />
- <ClInclude Include="..\vp9\decoder\vp9_reader.h" />
- <ClInclude Include="..\vp9\decoder\vp9_read_bit_buffer.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decodemv.h" />
- <ClInclude Include="..\vp9\decoder\vp9_detokenize.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decoder.h" />
- <ClInclude Include="..\vp9\decoder\vp9_dsubexp.h" />
- <ClInclude Include="..\vpx_ports\emmintrin_compat.h" />
- <ClInclude Include="..\vpx_ports\mem_ops.h" />
- <ClInclude Include="..\vpx_ports\mem_ops_aligned.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_types.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_decode_block.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_intra_modes_table_binary.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\common\vp9lux_log.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_thread.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="vpx_scale_rtcd.h" />
- <ClInclude Include="..\vpx\vpx_hw_image.h" />
- <ClInclude Include="..\vp9\decoder\kernels\pssl_common.h">
- <Filter>lux\kernels</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\kernels\pssl_idct_base.h">
- <Filter>lux\kernels</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\kernels\pssl_inter_common.h">
- <Filter>lux\kernels</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_inter.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_transform.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_gpu_programs.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_dec.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_loopfilter.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_intra.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\common\vp9_onyxc_int.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_linear_allocator.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\kernels\pssl_intra_common.h">
- <Filter>lux\kernels</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\kernels\pssl_genblock_common.h">
- <Filter>lux\kernels</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\kernels\pssl_lf_common.h">
- <Filter>lux\kernels</Filter>
- </ClInclude>
- </ItemGroup>
- <ItemGroup>
- <None Include="..\vpx.def" />
- <None Include="..\vpx\vpx_codec.mk" />
- </ItemGroup>
- <ItemGroup>
- <Filter Include="lux">
- <UniqueIdentifier>{9c8917ac-b928-40c6-b3e4-6014d514ece6}</UniqueIdentifier>
- </Filter>
- <Filter Include="lux\kernels">
- <UniqueIdentifier>{7e8d8f3b-6882-4b26-a6a1-9d61b33b1f82}</UniqueIdentifier>
- </Filter>
- <Filter Include="asm">
- <UniqueIdentifier>{6c274781-a394-48cf-baf1-485def749ece}</UniqueIdentifier>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_4x4full_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_8x8full_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_16x16full_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_32x32full_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_compound_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_main_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\intra_main_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\lf_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_ext_borders_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_4x4lossless_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_main_copy_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_main_ver_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_main_hor_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_resize_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_resize_compound_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\gen_blocks_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\gen_blocks_lf_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_clear_block_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_4x4full_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_4x4lossless_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_8x8full_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_16x16full_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\idct_32x32full_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\intra_main_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\intra_fillborder_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_main_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_compound_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_copy_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_ext_borders_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_hor_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_resize_compound_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_resize_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\inter_ver_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="..\vp9\decoder\kernels\lf_hbd_c.pssl">
- <Filter>lux\kernels</Filter>
- </Compile_PSSL_To_Header>
- </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-coreVS13.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-coreVS13.vcxproj
deleted file mode 100644
index 049a40b..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-coreVS13.vcxproj
+++ /dev/null
@@ -1,507 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}</ProjectGuid>
- <RootNamespace>vpx</RootNamespace>
- <Keyword>ManagedCProj</Keyword>
- <ProjectName>vp9-dec-core</ProjectName>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
- <IntDir>$(Platform)\$(Configuration)\vpx\</IntDir>
- <TargetName>$(ProjectName)</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
- <IntDir>$(Platform)\$(Configuration)\vpx\</IntDir>
- <TargetName>$(ProjectName)</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
- <IntDir>$(Platform)\$(Configuration)\vpx\</IntDir>
- <TargetName>$(ProjectName)</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
- <IntDir>$(Platform)\$(Configuration)\vpx\</IntDir>
- <TargetName>$(ProjectName)</TargetName>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <PreBuildEvent>
- <Command>call obj_int_extract.bat .. build_$(Platform)</Command>
- </PreBuildEvent>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;..;$(AMDAPPSDKROOT)\include;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>AMD_DX_INTEROP;ENABLE_DX_INTEROP;_LUXWIN32;ALT_INTER_OCL;WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;</AdditionalLibraryDirectories>
- </Lib>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <PreBuildEvent>
- <Command>
- </Command>
- </PreBuildEvent>
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;..;$(AMDAPPSDKROOT)\include;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>AMD_DX_INTEROP;_LUXWIN32;ALT_INTER_OCL;WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;</AdditionalLibraryDirectories>
- </Lib>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <PreBuildEvent>
- <Command>call obj_int_extract.bat .. build_$(Platform)
-cd ./script
-call mclBuild.bat</Command>
- </PreBuildEvent>
- <ClCompile>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <Optimization>MaxSpeed</Optimization>
- <AdditionalIncludeDirectories>.;..;$(AMDAPPSDKROOT)\include;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>AMD_DX_INTEROP;ENABLE_DX_INTEROP;_LUXWIN32;ALT_INTER_OCL;WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;</AdditionalLibraryDirectories>
- </Lib>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <PreBuildEvent>
- <Command>call obj_int_extract.bat .. build_$(Platform)
-cd ./script
-call mclBuild.bat</Command>
- </PreBuildEvent>
- <ClCompile>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <Optimization>MaxSpeed</Optimization>
- <AdditionalIncludeDirectories>.;..;$(AMDAPPSDKROOT)\include;$(ProjectDir)build_$(Platform);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>AMD_DX_INTEROP;_LUXWIN32;ALT_INTER_OCL;WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- <Lib>
- <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;</AdditionalLibraryDirectories>
- </Lib>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="..\vp9\decoder\interop\vp9lux_cl_wrapper.c" />
- <ClCompile Include="..\vp9\decoder\interop\vp9lux_interop.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_alt_inter_ocl.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_decode_block.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_inter_ocl.c">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_intra_ocl.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_loopfilter_ocl.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_mem_cuda.c">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_ocl.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_ocl_mem_amd.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_ocl_mem_generic.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_ocl_programs.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_reconinter_cl.c">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_thread.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_transform_ocl.c" />
- <ClCompile Include="..\vpx\src\vpx_decoder.c">
- <ObjectFileName>$(IntDir)vpx_src_vpx_decoder.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx\src\vpx_encoder.c">
- <ObjectFileName>$(IntDir)vpx_src_vpx_encoder.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx\src\vpx_codec.c">
- <ObjectFileName>$(IntDir)vpx_src_vpx_codec.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx\src\vpx_image.c">
- <ObjectFileName>$(IntDir)vpx_src_vpx_image.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx\src\vpx_psnr.c">
- <ObjectFileName>$(IntDir)vpx_src_vpx_psnr.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_mem\vpx_mem.c">
- <ObjectFileName>$(IntDir)vpx_mem_vpx_mem.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\vpx_scale.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_vpx_scale.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\yv12config.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_yv12config.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\yv12extend.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_yv12extend.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\generic\gen_scalers.c">
- <ObjectFileName>$(IntDir)vpx_scale_generic_gen_scalers.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\vpx_scale_asm_offsets.c">
- <ObjectFileName>$(IntDir)vpx_scale_vpx_scale_asm_offsets.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vpx_scale\vpx_scale_rtcd.c">
- <ObjectFileName>$(IntDir)vpx_scale_vpx_scale_rtcd.obj</ObjectFileName>
- </ClCompile>
- <CustomBuild Include="..\vpx_ports\emms.asm">
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Assembling %(Filename)%(Extension)</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Assembling %(Filename)%(Extension)</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\yasm\yasm.exe -Xvc -g cv8 -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vpx_ports_emms_asm.obj</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\yasm\yasm.exe -Xvc -g cv8 -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vpx_ports_emms_asm.obj</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)vpx_ports_emms_asm.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)vpx_ports_emms_asm.obj</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Assembling %(Filename)%(Extension)</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Assembling %(Filename)%(Extension)</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\yasm\yasm.exe -Xvc -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vpx_ports_emms_asm.obj</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\yasm\yasm.exe -Xvc -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vpx_ports_emms_asm.obj</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)vpx_ports_emms_asm.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)vpx_ports_emms_asm.obj</Outputs>
- <FileType>Document</FileType>
- </CustomBuild>
- <ClCompile Include="..\vp9\common\vp9_alloccommon.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_alloccommon.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_blockd.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_blockd.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_convolve.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_convolve.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_debugmodes.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_debugmodes.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_entropy.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_entropy.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_entropymode.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_entropymode.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_entropymv.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_entropymv.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_filter.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_filter.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_frame_buffers.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_frame_buffers.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_idct.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_idct.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_pred_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_pred_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_prob.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_prob.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_rtcd.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_rtcd.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_scale.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_scale.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_seg_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_seg_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_thread.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_thread.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_tile_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_tile_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_loopfilter.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_loopfilter.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_loopfilter_filters.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_loopfilter_filters.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_mvref_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_mvref_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_quant_common.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_quant_common.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_reconinter.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_reconinter.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_reconintra.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_reconintra.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_common_data.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_common_data.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\vp9_scan.c">
- <ObjectFileName>$(IntDir)vp9_common_vp9_scan.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\x86\vp9_asm_stubs.c">
- <ObjectFileName>$(IntDir)vp9_common_x86_vp9_asm_stubs.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\x86\vp9_loopfilter_intrin_sse2.c">
- <ObjectFileName>$(IntDir)vp9_common_x86_vp9_loopfilter_intrin_sse2.obj</ObjectFileName>
- </ClCompile>
- <CustomBuild Include="..\vp9\common\x86\vp9_loopfilter_mmx.asm">
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Assembling %(Filename)%(Extension)</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Assembling %(Filename)%(Extension)</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\yasm\yasm.exe -Xvc -g cv8 -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_loopfilter_mmx_asm.obj</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\yasm\yasm.exe -Xvc -g cv8 -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_loopfilter_mmx_asm.obj</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)vp9_common_x86_vp9_loopfilter_mmx_asm.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)vp9_common_x86_vp9_loopfilter_mmx_asm.obj</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Assembling %(Filename)%(Extension)</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Assembling %(Filename)%(Extension)</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\yasm\yasm.exe -Xvc -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_loopfilter_mmx_asm.obj</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\yasm\yasm.exe -Xvc -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_loopfilter_mmx_asm.obj</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)vp9_common_x86_vp9_loopfilter_mmx_asm.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)vp9_common_x86_vp9_loopfilter_mmx_asm.obj</Outputs>
- <FileType>Document</FileType>
- </CustomBuild>
- <ClCompile Include="..\vp9\common\x86\vp9_subpixel_8t_intrin_ssse3.c">
- <ObjectFileName>$(IntDir)vp9_common_x86_vp9_subpixel_8t_intrin_ssse3.obj</ObjectFileName>
- </ClCompile>
- <CustomBuild Include="..\vp9\common\x86\vp9_copy_sse2.asm">
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Assembling %(Filename)%(Extension)</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Assembling %(Filename)%(Extension)</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\yasm\yasm.exe -Xvc -g cv8 -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_copy_sse2_asm.obj</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\yasm\yasm.exe -Xvc -g cv8 -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_copy_sse2_asm.obj</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)vp9_common_x86_vp9_copy_sse2_asm.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)vp9_common_x86_vp9_copy_sse2_asm.obj</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Assembling %(Filename)%(Extension)</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Assembling %(Filename)%(Extension)</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\yasm\yasm.exe -Xvc -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_copy_sse2_asm.obj</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\yasm\yasm.exe -Xvc -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_copy_sse2_asm.obj</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)vp9_common_x86_vp9_copy_sse2_asm.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)vp9_common_x86_vp9_copy_sse2_asm.obj</Outputs>
- <FileType>Document</FileType>
- </CustomBuild>
- <CustomBuild Include="..\vp9\common\x86\vp9_intrapred_sse2.asm">
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Assembling %(Filename)%(Extension)</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Assembling %(Filename)%(Extension)</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\yasm\yasm.exe -Xvc -g cv8 -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_intrapred_sse2_asm.obj</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\yasm\yasm.exe -Xvc -g cv8 -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_intrapred_sse2_asm.obj</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)vp9_common_x86_vp9_intrapred_sse2_asm.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)vp9_common_x86_vp9_intrapred_sse2_asm.obj</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Assembling %(Filename)%(Extension)</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Assembling %(Filename)%(Extension)</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\yasm\yasm.exe -Xvc -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_intrapred_sse2_asm.obj</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\yasm\yasm.exe -Xvc -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_intrapred_sse2_asm.obj</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)vp9_common_x86_vp9_intrapred_sse2_asm.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)vp9_common_x86_vp9_intrapred_sse2_asm.obj</Outputs>
- <FileType>Document</FileType>
- </CustomBuild>
- <CustomBuild Include="..\vp9\common\x86\vp9_intrapred_ssse3.asm">
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Assembling %(Filename)%(Extension)</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Assembling %(Filename)%(Extension)</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\yasm\yasm.exe -Xvc -g cv8 -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_intrapred_ssse3_asm.obj</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\yasm\yasm.exe -Xvc -g cv8 -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_intrapred_ssse3_asm.obj</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)vp9_common_x86_vp9_intrapred_ssse3_asm.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)vp9_common_x86_vp9_intrapred_ssse3_asm.obj</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Assembling %(Filename)%(Extension)</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Assembling %(Filename)%(Extension)</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\yasm\yasm.exe -Xvc -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_intrapred_ssse3_asm.obj</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\yasm\yasm.exe -Xvc -f $(Platform) -I. -I.. -I $(ProjectDir)build_$(Platform) "%(FullPath)" -o $(IntDir)vp9_common_x86_vp9_intrapred_ssse3_asm.obj</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)vp9_common_x86_vp9_intrapred_ssse3_asm.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)vp9_common_x86_vp9_intrapred_ssse3_asm.obj</Outputs>
- <FileType>Document</FileType>
- </CustomBuild>
- <ClCompile Include="..\vp9\common\x86\vp9_idct_intrin_sse2.c">
- <ObjectFileName>$(IntDir)vp9_common_x86_vp9_idct_intrin_sse2.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\common\x86\vp9_idct_intrin_ssse3.c">
- <ObjectFileName>$(IntDir)vp9_common_x86_vp9_idct_intrin_ssse3.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\vp9_dx_iface.c">
- <ObjectFileName>$(IntDir)vp9_vp9_dx_iface.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_decodemv.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_decodemv.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_decodeframe.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_decodeframe.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_detokenize.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_detokenize.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_dthread.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_dthread.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_reader.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_reader.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_read_bit_buffer.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_read_bit_buffer.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_decoder.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_decoder.obj</ObjectFileName>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9_dsubexp.c">
- <ObjectFileName>$(IntDir)vp9_decoder_vp9_dsubexp.obj</ObjectFileName>
- </ClCompile>
- <None Include="..\vp9\decoder\kernels\altinter.cl" />
- <None Include="..\vp9\decoder\kernels\altinter_intel.cl" />
- <None Include="..\vp9\decoder\kernels\alttransform.cl" />
- <None Include="..\vp9\decoder\kernels\fastinterpred8x8kernel.cl" />
- <None Include="..\vp9\decoder\kernels\interpred8x8kernel.cl" />
- <None Include="..\vp9\decoder\kernels\intra.cl" />
- <None Include="..\vp9\decoder\kernels\intra_intel.cl" />
- <None Include="..\vp9\decoder\kernels\loopfilter.cl" />
- <None Include="..\vp9\decoder\kernels\loopfilter_intel.cl" />
- <None Include="..\vp9\decoder\kernels\transform.cl" />
- <None Include="..\vpx.def" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\vp9\common\vp9lux_log.h" />
- <ClInclude Include="..\vp9\decoder\interop\vp9lux_cl_wrapper.h" />
- <ClInclude Include="..\vp9\decoder\interop\vp9lux_interop.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_alt_inter_ocl.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_decode_block.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_frame_struct.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_inter_ocl.h">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_intra_modes_table_binary.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_intra_ocl.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_loopfilter_ocl.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_ocl.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_ocl_binary.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_ocl_programs.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_reconinter_cl.h">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_thread.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_transform_ocl.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_types.h" />
- <ClInclude Include="..\vpx\vpx_decoder.h" />
- <ClInclude Include="..\vpx\vpx_encoder.h" />
- <ClInclude Include="..\vpx\internal\vpx_codec_internal.h" />
- <ClInclude Include="..\vpx\internal\vpx_psnr.h" />
- <ClInclude Include="..\vpx\vpx_codec.h" />
- <ClInclude Include="..\vpx\vpx_frame_buffer.h" />
- <ClInclude Include="..\vpx\vpx_image.h" />
- <ClInclude Include="..\vpx\vpx_integer.h" />
- <ClInclude Include="..\vpx_mem\vpx_mem.h" />
- <ClInclude Include="..\vpx_mem\include\vpx_mem_intrnl.h" />
- <ClInclude Include="..\vpx_scale\yv12config.h" />
- <ClInclude Include="..\vpx_scale\vpx_scale.h" />
- <ClInclude Include="..\vpx_ports\asm_offsets.h" />
- <ClInclude Include="..\vpx_ports\mem.h" />
- <ClInclude Include="..\vpx_ports\vpx_timer.h" />
- <ClInclude Include="..\vpx_ports\x86.h" />
- <ClInclude Include="..\vp9\vp9_iface_common.h" />
- <ClInclude Include="..\vp9\common\vp9_ppflags.h" />
- <ClInclude Include="..\vp9\common\vp9_convolve.h" />
- <ClInclude Include="..\vp9\common\vp9_filter.h" />
- <ClInclude Include="..\vp9\common\vp9_frame_buffers.h" />
- <ClInclude Include="..\vp9\common\vp9_alloccommon.h" />
- <ClInclude Include="..\vp9\common\vp9_blockd.h" />
- <ClInclude Include="..\vp9\common\vp9_common.h" />
- <ClInclude Include="..\vp9\common\vp9_entropy.h" />
- <ClInclude Include="..\vp9\common\vp9_entropymode.h" />
- <ClInclude Include="..\vp9\common\vp9_entropymv.h" />
- <ClInclude Include="..\vp9\common\vp9_enums.h" />
- <ClInclude Include="..\vp9\common\vp9_idct.h" />
- <ClInclude Include="..\vp9\common\vp9_loopfilter.h" />
- <ClInclude Include="..\vp9\common\vp9_mv.h" />
- <ClInclude Include="..\vp9\common\vp9_pred_common.h" />
- <ClInclude Include="..\vp9\common\vp9_prob.h" />
- <ClInclude Include="..\vp9\common\vp9_quant_common.h" />
- <ClInclude Include="..\vp9\common\vp9_reconinter.h" />
- <ClInclude Include="..\vp9\common\vp9_reconintra.h" />
- <ClInclude Include="..\vp9\common\vp9_scale.h" />
- <ClInclude Include="..\vp9\common\vp9_seg_common.h" />
- <ClInclude Include="..\vp9\common\vp9_systemdependent.h" />
- <ClInclude Include="..\vp9\common\vp9_textblit.h" />
- <ClInclude Include="..\vp9\common\vp9_thread.h" />
- <ClInclude Include="..\vp9\common\vp9_tile_common.h" />
- <ClInclude Include="..\vp9\common\vp9_mvref_common.h" />
- <ClInclude Include="..\vp9\common\vp9_common_data.h" />
- <ClInclude Include="..\vp9\common\vp9_scan.h" />
- <ClInclude Include="..\vp9\common\x86\vp9_idct_intrin_sse2.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decodeframe.h" />
- <ClInclude Include="..\vp9\decoder\vp9_dthread.h" />
- <ClInclude Include="..\vp9\decoder\vp9_reader.h" />
- <ClInclude Include="..\vp9\decoder\vp9_read_bit_buffer.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decodemv.h" />
- <ClInclude Include="..\vp9\decoder\vp9_detokenize.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decoder.h" />
- <ClInclude Include="..\vp9\decoder\vp9_dsubexp.h" />
- <ClInclude Include="..\vpx_ports\emmintrin_compat.h" />
- <ClInclude Include="..\vpx_ports\mem_ops.h" />
- <ClInclude Include="..\vpx_ports\mem_ops_aligned.h" />
- <ClInclude Include="..\vpx_ports\vpx_once.h" />
- <ClInclude Include="..\vpx_scale_rtcd.h" />
- <ClInclude Include="..\vp9_rtcd.h" />
- </ItemGroup>
- <ItemGroup>
- <None Include="..\vpx\vpx_codec.mk" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-coreVS13.vcxproj.filters b/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-coreVS13.vcxproj.filters
deleted file mode 100644
index be08b3e..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-core/build/vpx-dec-coreVS13.vcxproj.filters
+++ /dev/null
@@ -1,276 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <ClCompile Include="..\vpx\src\vpx_decoder.c" />
- <ClCompile Include="..\vpx\src\vpx_encoder.c" />
- <ClCompile Include="..\vpx\src\vpx_codec.c" />
- <ClCompile Include="..\vpx\src\vpx_image.c" />
- <ClCompile Include="..\vpx\src\vpx_psnr.c" />
- <ClCompile Include="..\vpx_mem\vpx_mem.c" />
- <ClCompile Include="..\vpx_scale\generic\vpx_scale.c" />
- <ClCompile Include="..\vpx_scale\generic\yv12config.c" />
- <ClCompile Include="..\vpx_scale\generic\yv12extend.c" />
- <ClCompile Include="..\vpx_scale\generic\gen_scalers.c" />
- <ClCompile Include="..\vpx_scale\vpx_scale_asm_offsets.c" />
- <ClCompile Include="..\vpx_scale\vpx_scale_rtcd.c" />
- <ClCompile Include="..\vp9\common\vp9_alloccommon.c" />
- <ClCompile Include="..\vp9\common\vp9_blockd.c" />
- <ClCompile Include="..\vp9\common\vp9_convolve.c" />
- <ClCompile Include="..\vp9\common\vp9_debugmodes.c" />
- <ClCompile Include="..\vp9\common\vp9_entropy.c" />
- <ClCompile Include="..\vp9\common\vp9_entropymode.c" />
- <ClCompile Include="..\vp9\common\vp9_entropymv.c" />
- <ClCompile Include="..\vp9\common\vp9_filter.c" />
- <ClCompile Include="..\vp9\common\vp9_frame_buffers.c" />
- <ClCompile Include="..\vp9\common\vp9_idct.c" />
- <ClCompile Include="..\vp9\common\vp9_pred_common.c" />
- <ClCompile Include="..\vp9\common\vp9_prob.c" />
- <ClCompile Include="..\vp9\common\vp9_rtcd.c" />
- <ClCompile Include="..\vp9\common\vp9_scale.c" />
- <ClCompile Include="..\vp9\common\vp9_seg_common.c" />
- <ClCompile Include="..\vp9\common\vp9_thread.c" />
- <ClCompile Include="..\vp9\common\vp9_tile_common.c" />
- <ClCompile Include="..\vp9\common\vp9_loopfilter.c" />
- <ClCompile Include="..\vp9\common\vp9_loopfilter_filters.c" />
- <ClCompile Include="..\vp9\common\vp9_mvref_common.c" />
- <ClCompile Include="..\vp9\common\vp9_quant_common.c" />
- <ClCompile Include="..\vp9\common\vp9_reconinter.c" />
- <ClCompile Include="..\vp9\common\vp9_reconintra.c" />
- <ClCompile Include="..\vp9\common\vp9_common_data.c" />
- <ClCompile Include="..\vp9\common\vp9_scan.c" />
- <ClCompile Include="..\vp9\common\x86\vp9_asm_stubs.c" />
- <ClCompile Include="..\vp9\common\x86\vp9_loopfilter_intrin_sse2.c" />
- <ClCompile Include="..\vp9\common\x86\vp9_idct_intrin_sse2.c" />
- <ClCompile Include="..\vp9\common\x86\vp9_idct_intrin_ssse3.c" />
- <ClCompile Include="..\vp9\vp9_dx_iface.c" />
- <ClCompile Include="..\vp9\decoder\vp9_decodemv.c" />
- <ClCompile Include="..\vp9\decoder\vp9_decodeframe.c" />
- <ClCompile Include="..\vp9\decoder\vp9_detokenize.c" />
- <ClCompile Include="..\vp9\decoder\vp9_dthread.c" />
- <ClCompile Include="..\vp9\decoder\vp9_reader.c" />
- <ClCompile Include="..\vp9\decoder\vp9_read_bit_buffer.c" />
- <ClCompile Include="..\vp9\decoder\vp9_decoder.c" />
- <ClCompile Include="..\vp9\decoder\vp9_dsubexp.c" />
- <ClCompile Include="..\vp9\decoder\vp9lux_alt_inter_ocl.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\interop\vp9lux_cl_wrapper.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_decode_block.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_inter_ocl.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\interop\vp9lux_interop.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_intra_ocl.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_loopfilter_ocl.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_mem_cuda.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_ocl.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_ocl_mem_amd.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_ocl_mem_generic.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_ocl_programs.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_reconinter_cl.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_thread.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\decoder\vp9lux_transform_ocl.c">
- <Filter>lux</Filter>
- </ClCompile>
- <ClCompile Include="..\vp9\common\x86\vp9_subpixel_8t_intrin_ssse3.c" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\vpx\vpx_decoder.h" />
- <ClInclude Include="..\vpx\vpx_encoder.h" />
- <ClInclude Include="..\vpx\internal\vpx_codec_internal.h" />
- <ClInclude Include="..\vpx\internal\vpx_psnr.h" />
- <ClInclude Include="..\vpx\vpx_codec.h" />
- <ClInclude Include="..\vpx\vpx_frame_buffer.h" />
- <ClInclude Include="..\vpx\vpx_image.h" />
- <ClInclude Include="..\vpx\vpx_integer.h" />
- <ClInclude Include="..\vpx_mem\vpx_mem.h" />
- <ClInclude Include="..\vpx_mem\include\vpx_mem_intrnl.h" />
- <ClInclude Include="..\vpx_scale\yv12config.h" />
- <ClInclude Include="..\vpx_scale\vpx_scale.h" />
- <ClInclude Include="..\vpx_ports\asm_offsets.h" />
- <ClInclude Include="..\vpx_ports\mem.h" />
- <ClInclude Include="..\vpx_ports\vpx_timer.h" />
- <ClInclude Include="..\vpx_ports\x86.h" />
- <ClInclude Include="..\vp9\vp9_iface_common.h" />
- <ClInclude Include="..\vp9\common\vp9_ppflags.h" />
- <ClInclude Include="..\vp9\common\vp9_convolve.h" />
- <ClInclude Include="..\vp9\common\vp9_filter.h" />
- <ClInclude Include="..\vp9\common\vp9_frame_buffers.h" />
- <ClInclude Include="..\vp9\common\vp9_alloccommon.h" />
- <ClInclude Include="..\vp9\common\vp9_blockd.h" />
- <ClInclude Include="..\vp9\common\vp9_common.h" />
- <ClInclude Include="..\vp9\common\vp9_entropy.h" />
- <ClInclude Include="..\vp9\common\vp9_entropymode.h" />
- <ClInclude Include="..\vp9\common\vp9_entropymv.h" />
- <ClInclude Include="..\vp9\common\vp9_enums.h" />
- <ClInclude Include="..\vp9\common\vp9_idct.h" />
- <ClInclude Include="..\vp9\common\vp9_loopfilter.h" />
- <ClInclude Include="..\vp9\common\vp9_mv.h" />
- <ClInclude Include="..\vp9\common\vp9_pred_common.h" />
- <ClInclude Include="..\vp9\common\vp9_prob.h" />
- <ClInclude Include="..\vp9\common\vp9_quant_common.h" />
- <ClInclude Include="..\vp9\common\vp9_reconinter.h" />
- <ClInclude Include="..\vp9\common\vp9_reconintra.h" />
- <ClInclude Include="..\vp9\common\vp9_scale.h" />
- <ClInclude Include="..\vp9\common\vp9_seg_common.h" />
- <ClInclude Include="..\vp9\common\vp9_systemdependent.h" />
- <ClInclude Include="..\vp9\common\vp9_textblit.h" />
- <ClInclude Include="..\vp9\common\vp9_thread.h" />
- <ClInclude Include="..\vp9\common\vp9_tile_common.h" />
- <ClInclude Include="..\vp9\common\vp9_mvref_common.h" />
- <ClInclude Include="..\vp9\common\vp9_common_data.h" />
- <ClInclude Include="..\vp9\common\vp9_scan.h" />
- <ClInclude Include="..\vp9\common\x86\vp9_idct_intrin_sse2.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decodeframe.h" />
- <ClInclude Include="..\vp9\decoder\vp9_dthread.h" />
- <ClInclude Include="..\vp9\decoder\vp9_reader.h" />
- <ClInclude Include="..\vp9\decoder\vp9_read_bit_buffer.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decodemv.h" />
- <ClInclude Include="..\vp9\decoder\vp9_detokenize.h" />
- <ClInclude Include="..\vp9\decoder\vp9_decoder.h" />
- <ClInclude Include="..\vp9\decoder\vp9_dsubexp.h" />
- <ClInclude Include="..\vpx_ports\emmintrin_compat.h" />
- <ClInclude Include="..\vpx_ports\mem_ops.h" />
- <ClInclude Include="..\vpx_ports\mem_ops_aligned.h" />
- <ClInclude Include="..\vpx_ports\vpx_once.h" />
- <ClInclude Include="..\vpx_scale_rtcd.h" />
- <ClInclude Include="..\vp9_rtcd.h" />
- <ClInclude Include="..\vp9\decoder\vp9lux_types.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_alt_inter_ocl.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\interop\vp9lux_cl_wrapper.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_decode_block.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_frame_struct.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_inter_ocl.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\interop\vp9lux_interop.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_intra_modes_table_binary.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_intra_ocl.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\common\vp9lux_log.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_loopfilter_ocl.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_ocl.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_ocl_binary.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_ocl_programs.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_reconinter_cl.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_thread.h">
- <Filter>lux</Filter>
- </ClInclude>
- <ClInclude Include="..\vp9\decoder\vp9lux_transform_ocl.h">
- <Filter>lux</Filter>
- </ClInclude>
- </ItemGroup>
- <ItemGroup>
- <None Include="..\vpx.def" />
- <None Include="..\vpx\vpx_codec.mk" />
- <None Include="..\vp9\decoder\kernels\altinter.cl">
- <Filter>lux\kernels</Filter>
- </None>
- <None Include="..\vp9\decoder\kernels\altinter_intel.cl">
- <Filter>lux\kernels</Filter>
- </None>
- <None Include="..\vp9\decoder\kernels\alttransform.cl">
- <Filter>lux\kernels</Filter>
- </None>
- <None Include="..\vp9\decoder\kernels\interpred8x8kernel.cl">
- <Filter>lux\kernels</Filter>
- </None>
- <None Include="..\vp9\decoder\kernels\intra.cl">
- <Filter>lux\kernels</Filter>
- </None>
- <None Include="..\vp9\decoder\kernels\intra_intel.cl">
- <Filter>lux\kernels</Filter>
- </None>
- <None Include="..\vp9\decoder\kernels\loopfilter.cl">
- <Filter>lux\kernels</Filter>
- </None>
- <None Include="..\vp9\decoder\kernels\loopfilter_intel.cl">
- <Filter>lux\kernels</Filter>
- </None>
- <None Include="..\vp9\decoder\kernels\fastinterpred8x8kernel.cl">
- <Filter>lux\kernels</Filter>
- </None>
- <None Include="..\vp9\decoder\kernels\transform.cl">
- <Filter>lux\kernels</Filter>
- </None>
- </ItemGroup>
- <ItemGroup>
- <Filter Include="lux">
- <UniqueIdentifier>{9c8917ac-b928-40c6-b3e4-6014d514ece6}</UniqueIdentifier>
- </Filter>
- <Filter Include="lux\kernels">
- <UniqueIdentifier>{7e8d8f3b-6882-4b26-a6a1-9d61b33b1f82}</UniqueIdentifier>
- </Filter>
- <Filter Include="asm">
- <UniqueIdentifier>{6c274781-a394-48cf-baf1-485def749ece}</UniqueIdentifier>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <CustomBuild Include="..\vpx_ports\emms.asm">
- <Filter>asm</Filter>
- </CustomBuild>
- <CustomBuild Include="..\vp9\common\x86\vp9_loopfilter_mmx.asm">
- <Filter>asm</Filter>
- </CustomBuild>
- <CustomBuild Include="..\vp9\common\x86\vp9_copy_sse2.asm">
- <Filter>asm</Filter>
- </CustomBuild>
- <CustomBuild Include="..\vp9\common\x86\vp9_intrapred_sse2.asm">
- <Filter>asm</Filter>
- </CustomBuild>
- <CustomBuild Include="..\vp9\common\x86\vp9_intrapred_ssse3.asm">
- <Filter>asm</Filter>
- </CustomBuild>
- </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/ErrorResilienceTest/ErrorResilienceTest.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-test/ErrorResilienceTest/ErrorResilienceTest.vcxproj
deleted file mode 100644
index d676550..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/ErrorResilienceTest/ErrorResilienceTest.vcxproj
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|ORBIS">
- <Configuration>Debug</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ORBIS">
- <Configuration>Release</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <VCTargetsPath Condition="'$(VCTargetsPath12)' != '' and '$(VSVersion)' == '' and '$(VisualStudioVersion)' == ''">$(VCTargetsPath12)</VCTargetsPath>
- <ProjectGuid>{F216E2AC-3265-4071-9F17-709D747FF1D1}</ProjectGuid>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <PropertyGroup Condition="'$(DebuggerFlavor)'=='ORBISDebugger'" Label="OverrideDebuggerDefaults">
- <!--LocalDebuggerCommand>$(TargetPath)</LocalDebuggerCommand-->
- <!--LocalDebuggerCommandArguments></LocalDebuggerCommandArguments-->
- <!--LocalDebuggerTarget></LocalDebuggerTarget-->
- <!--LocalDebuggerWorkingDirectory>$(ProjectDir)</LocalDebuggerWorkingDirectory-->
- <!--LocalRunCommandLine></LocalRunCommandLine-->
- </PropertyGroup>
- <ImportGroup Label="ExtensionSettings">
- <Import Project="$(VCTargetsPath)\BuildCustomizations\OrbisWavePsslc.props" />
- <Import Project="$(VCTargetsPath)\BuildCustomizations\SCU.props" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
- <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
- <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions);</PreprocessorDefinitions>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <AdditionalIncludeDirectories>../../vp9-dec-core;../../vp9-dec-core/build;../libwebm;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- </ClCompile>
- <Link>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).a;libSceUserService_stub_weak.a;libScePerf_stub_weak.a;libSceGnmDriver_stub_weak.a;libScePm4Dump.a;libSceGnf.a;libSceShaderBinary.a;libSceGpuAddress.a;libSceGnmx_debug.a;libSceGnm_debug.a;libScePosix_stub_weak.a;libScePad_stub_weak.a;libSceVideoOut_stub_weak.a</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(SolutionDir)lib\$(Configuration)</AdditionalLibraryDirectories>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions);</PreprocessorDefinitions>
- <OptimizationLevel>Level2</OptimizationLevel>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <AdditionalIncludeDirectories>../../vp9-dec-core;../../vp9-dec-core/build;../libwebm;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </ClCompile>
- <Link>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).a;libSceUserService_stub_weak.a;libScePerf_stub_weak.a;libSceGnmDriver_stub_weak.a;libScePm4Dump.a;libSceGnf.a;libSceShaderBinary.a;libSceGpuAddress.a;libSceGnmx_debug.a;libSceGnm_debug.a;libScePosix_stub_weak.a;libScePad_stub_weak.a;libSceVideoOut_stub_weak.a</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(SolutionDir)lib\$(Configuration)</AdditionalLibraryDirectories>
- </Link>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="..\libwebm\mkvparser\mkvparser.cc" />
- <ClCompile Include="..\libwebm\mkvparser\mkvreader.cc" />
- <ClCompile Include="..\vpxdec\webmdec.cc" />
- <ClCompile Include="errors_main.cpp" />
- <ClCompile Include="user_malloc.cpp" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\libwebm\mkvparser\mkvparser.h" />
- <ClInclude Include="..\libwebm\mkvparser\mkvreader.h" />
- <ClInclude Include="ivf_video_source.h" />
- <ClInclude Include="video_source.h" />
- <ClInclude Include="webm_video_source.h" />
- </ItemGroup>
- <Import Condition="'$(ConfigurationType)' == 'Makefile' and Exists('$(VCTargetsPath)\Platforms\$(Platform)\SCE.Makefile.$(Platform).targets')" Project="$(VCTargetsPath)\Platforms\$(Platform)\SCE.Makefile.$(Platform).targets" />
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- <Import Project="$(VCTargetsPath)\BuildCustomizations\OrbisWavePsslc.targets" />
- <Import Project="$(VCTargetsPath)\BuildCustomizations\SCU.targets" />
- </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/ErrorResilienceTest/ErrorResilienceTest.vcxproj.filters b/src/third_party/libvpx_gpu/vp9-dec-test/ErrorResilienceTest/ErrorResilienceTest.vcxproj.filters
deleted file mode 100644
index d9ee00d..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/ErrorResilienceTest/ErrorResilienceTest.vcxproj.filters
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- <Extensions>cpp;c;cxx;cc;s;asm</Extensions>
- </Filter>
- <Filter Include="Header Files">
- <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- <Extensions>h;hpp</Extensions>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="errors_main.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\vpxdec\webmdec.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="user_malloc.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\libwebm\mkvparser\mkvparser.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\libwebm\mkvparser\mkvreader.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="ivf_video_source.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="video_source.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="webm_video_source.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\mkvparser\mkvparser.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\mkvparser\mkvreader.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.sln b/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.sln
deleted file mode 100644
index 14f4a95..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.40629.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libSceSampleUtil", "libSceSampleUtil.vcxproj", "{30A1B994-C2C6-485F-911B-FB4674366DA8}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|ORBIS = Debug|ORBIS
- Release|ORBIS = Release|ORBIS
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {30A1B994-C2C6-485F-911B-FB4674366DA8}.Debug|ORBIS.ActiveCfg = Debug|ORBIS
- {30A1B994-C2C6-485F-911B-FB4674366DA8}.Debug|ORBIS.Build.0 = Debug|ORBIS
- {30A1B994-C2C6-485F-911B-FB4674366DA8}.Release|ORBIS.ActiveCfg = Release|ORBIS
- {30A1B994-C2C6-485F-911B-FB4674366DA8}.Release|ORBIS.Build.0 = Release|ORBIS
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.vcxproj
deleted file mode 100644
index edeb2e5..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.vcxproj
+++ /dev/null
@@ -1,1301 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|ORBIS">
- <Configuration>Debug</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ORBIS">
- <Configuration>Release</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{30A1B994-C2C6-485F-911B-FB4674366DA8}</ProjectGuid>
- <ProjectName>libSceSampleUtil</ProjectName>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup />
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>_DEBUG;SCE_SAMPLE_UTIL_ASSERTS_ENABLED=1;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <GenerateDebugInformation>true</GenerateDebugInformation>
-<AdditionalIncludeDirectories>$(ProjectDir)\..\..\include;$(ProjectDir)\..\..\include\external\tinyxml;$(ProjectDir)\..\sampleutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <AdditionalOptions>-frtti -Wno-unknown-pragmas -Wnull-conversion %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <Lib>
- <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- </Lib>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <ClCompile>
- <PreprocessorDefinitions>_DEBUG;SCE_SAMPLE_UTIL_ASSERTS_ENABLED=1;SCE_SAMPLE_UTIL_BUILD;SCE_DBG_LOGGING_ENABLED=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <AdditionalIncludeDirectories>$(ProjectDir)\..\..\include;$(ProjectDir)\..\..\include\external\tinyxml;$(ProjectDir)\..\sampleutil;$(SCE_PSP2_SDK_DIR)\target\include_common;$(CG_INC_PATH);$(SCE_PSP2_SDK_DIR)\host_tools\include;$(SCE_ORBIS_SDK_DIR)\host_tools\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- </ClCompile>
- <Lib>
- <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- </Lib>
- <Link>
- <AdditionalLibraryDirectories>$(CG_LIB64_PATH);$(SCE_ORBIS_SDK_DIR)\host_tools\lib;$(SCE_ORBIS_SAMPLE_DIR)\sample_code\common\lib.x64\external;$(SCE_PSP2_SDK_DIR)\host_tools\lib.x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <AdditionalDependencies>tinyxml.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>SCE_SAMPLE_UTIL_ASSERTS_ENABLED=1;SCE_SAMPLE_UTIL_RELEASE=1;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <OptimizationLevel>Level2</OptimizationLevel>
-<AdditionalIncludeDirectories>$(ProjectDir)\..\..\include;$(ProjectDir)\..\..\include\external\tinyxml;$(ProjectDir)\..\sampleutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <AdditionalOptions>-frtti -Wno-unknown-pragmas %(AdditionalOptions)</AdditionalOptions>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- <Warnings>MoreWarnings</Warnings>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <ClCompile>
- <PreprocessorDefinitions>SCE_SAMPLE_UTIL_ASSERTS_ENABLED=1;SCE_SAMPLE_UTIL_BUILD;SCE_DBG_LOGGING_ENABLED=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <OptimizationLevel>Level2</OptimizationLevel>
- <AdditionalIncludeDirectories>$(ProjectDir)\..\..\include;$(ProjectDir)\..\..\include\external\tinyxml;$(ProjectDir)\..\sampleutil;$(SCE_PSP2_SDK_DIR)\target\include_common;$(CG_INC_PATH);$(SCE_PSP2_SDK_DIR)\host_tools\include;$(SCE_ORBIS_SDK_DIR)\host_tools\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- </ClCompile>
- <Link>
- <AdditionalLibraryDirectories>$(CG_LIB64_PATH);$(SCE_ORBIS_SDK_DIR)\host_tools\lib;$(SCE_ORBIS_SAMPLE_DIR)\sample_code\common\lib.x64\external;$(SCE_PSP2_SDK_DIR)\host_tools\lib.x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <AdditionalDependencies>tinyxml.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </Link>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClInclude Include="..\..\include\sampleutil.h" />
- <ClInclude Include="..\..\include\sampleutil\audio.h" />
- <ClInclude Include="..\..\include\sampleutil\audio\context.h" />
- <ClInclude Include="..\..\include\sampleutil\audio\data.h" />
- <ClInclude Include="..\..\include\sampleutil\audio\voice.h" />
- <ClInclude Include="..\..\include\sampleutil\debug\console.h" />
- <ClInclude Include="..\..\include\sampleutil\debug\menu.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\buffer.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\collada.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_animation.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_base.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_effect.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_geometry.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_image.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_scene.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\constant.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\context.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\effect.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\font.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\loader.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\platform.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\platform_dx11\platform_dx11.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\platform_gnm\platform_gnm.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\platform_gxm\platform_gxm.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\program.h" />
- <ClInclude Include="..\..\include\sampleutil\graphics\sprite.h" />
- <ClInclude Include="..\..\include\sampleutil\input.h" />
- <ClInclude Include="..\..\include\sampleutil\input\controller.h" />
- <ClInclude Include="..\..\include\sampleutil\input\motion.h" />
- <ClInclude Include="..\..\include\sampleutil\input\touch.h" />
- <ClInclude Include="..\..\include\sampleutil\sampleutil_common.h" />
- <ClInclude Include="..\..\include\sampleutil\sampleutil_error.h" />
- <ClInclude Include="..\..\include\sampleutil\skeleton.h" />
- <ClInclude Include="..\..\include\sampleutil\system.h" />
- <ClInclude Include="audio\audio_internal.h" />
- <ClInclude Include="audio\ngs2\ngs2_internal.h" />
- <ClInclude Include="audio\ngs2\ngs2_stream.h" />
- <ClInclude Include="audio\ngs\ngs_internal.h" />
- <ClInclude Include="audio\ngs\ngs_module.h" />
- <ClInclude Include="debug\debug_menu_internal.h" />
- <ClInclude Include="graphics\collada\collada_internal.h" />
- <ClInclude Include="graphics\collada\collada_material.h" />
- <ClInclude Include="graphics\collada\collada_scene.h" />
- <ClInclude Include="graphics\collada\collada_transform.h" />
- <ClInclude Include="graphics\collada\collada_util.h" />
- <ClInclude Include="graphics\collada\dae\dae.h" />
- <ClInclude Include="graphics\collada\dae\dae_animation.h" />
- <ClInclude Include="graphics\collada\dae\dae_common.h" />
- <ClInclude Include="graphics\collada\dae\dae_control.h" />
- <ClInclude Include="graphics\collada\dae\dae_data_flow.h" />
- <ClInclude Include="graphics\collada\dae\dae_effect.h" />
- <ClInclude Include="graphics\collada\dae\dae_geometry.h" />
- <ClInclude Include="graphics\collada\dae\dae_scene.h" />
- <ClInclude Include="graphics\collada\dae\dae_transform.h" />
- <ClInclude Include="graphics\collada\dae\dae_vscene.h" />
- <ClInclude Include="graphics\constant_internal.h" />
- <ClInclude Include="graphics\font_internal.h" />
- <ClInclude Include="graphics\graphics_internal.h" />
- <ClInclude Include="graphics\image.h" />
- <ClInclude Include="graphics\platform_dx11\buffer_internal_dx11.h" />
- <ClInclude Include="graphics\platform_dx11\constant_internal_dx11.h" />
- <ClInclude Include="graphics\platform_dx11\context_internal_dx11.h" />
- <ClInclude Include="graphics\platform_dx11\dx11_internal.h" />
- <ClInclude Include="graphics\platform_dx11\font_win.h" />
- <ClInclude Include="graphics\platform_dx11\loader_internal_dx11.h" />
- <ClInclude Include="graphics\platform_dx11\program_internal_dx11.h" />
- <ClInclude Include="graphics\platform_gnm\buffer_internal_gnm.h" />
- <ClInclude Include="graphics\platform_gnm\constant_internal_gnm.h" />
- <ClInclude Include="graphics\platform_gnm\context_internal_gnm.h" />
- <ClInclude Include="graphics\platform_gnm\font_orbis.h" />
- <ClInclude Include="graphics\platform_gnm\gnm_internal.h" />
- <ClInclude Include="graphics\platform_gnm\heap_gnm.h" />
- <ClInclude Include="graphics\platform_gnm\image_gnm.h" />
- <ClInclude Include="graphics\platform_gnm\loader_internal_gnm.h" />
- <ClInclude Include="graphics\platform_gnm\program_internal_gnm.h" />
- <ClInclude Include="graphics\platform_gxm\buffer_internal_gxm.h" />
- <ClInclude Include="graphics\platform_gxm\constant_internal_gxm.h" />
- <ClInclude Include="graphics\platform_gxm\context_internal_gxm.h" />
- <ClInclude Include="graphics\platform_gxm\font_psp2.h" />
- <ClInclude Include="graphics\platform_gxm\gxm_internal.h" />
- <ClInclude Include="graphics\platform_gxm\heap_gxm.h" />
- <ClInclude Include="graphics\platform_gxm\loader_internal_gxm.h" />
- <ClInclude Include="graphics\platform_gxm\program_internal_gxm.h" />
- <ClInclude Include="graphics\platform_gxm\texture_util_gxm.h" />
- <ClInclude Include="graphics\sprite_internal.h" />
- <ClInclude Include="input\controller_common.h" />
- <ClInclude Include="input\pad_common.h" />
- <ClInclude Include="resource\resource_manager.h" />
- <ClInclude Include="resource\shader_base.h" />
- <ClInclude Include="resource\std_cbuffer.h" />
- <ClInclude Include="sampleutil_internal.h" />
- <ClInclude Include="stdafx.h" />
- <ClInclude Include="util\util.h" />
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="audio\audio.cpp" />
- <ClCompile Include="audio\audio_data.cpp" />
- <ClCompile Include="audio\ngs2\ngs2_context.cpp" />
- <ClCompile Include="audio\ngs2\ngs2_data.cpp" />
- <ClCompile Include="audio\ngs2\ngs2_rack.cpp" />
- <ClCompile Include="audio\ngs2\ngs2_stream.cpp" />
- <ClCompile Include="audio\ngs2\ngs2_thread.cpp" />
- <ClCompile Include="audio\ngs2\ngs2_voice.cpp" />
- <ClCompile Include="audio\ngs\ngs_audio_util.cpp" />
- <ClCompile Include="audio\ngs\ngs_buss.cpp" />
- <ClCompile Include="audio\ngs\ngs_context.cpp" />
- <ClCompile Include="audio\ngs\ngs_data.cpp" />
- <ClCompile Include="audio\ngs\ngs_module.cpp" />
- <ClCompile Include="audio\ngs\ngs_stream.cpp" />
- <ClCompile Include="audio\ngs\ngs_voice.cpp" />
- <ClCompile Include="audio\ngs\ngs_worker_thread.cpp" />
- <ClCompile Include="debug\console.cpp" />
- <ClCompile Include="debug\debug_menu_item_group.cpp" />
- <ClCompile Include="debug\menu.cpp" />
- <ClCompile Include="graphics\buffer.cpp" />
- <ClCompile Include="graphics\collada\collada.cpp" />
- <ClCompile Include="graphics\collada\collada_animation.cpp" />
- <ClCompile Include="graphics\collada\collada_base.cpp" />
- <ClCompile Include="graphics\collada\collada_controller.cpp" />
- <ClCompile Include="graphics\collada\collada_effect.cpp" />
- <ClCompile Include="graphics\collada\collada_geometry.cpp" />
- <ClCompile Include="graphics\collada\collada_image.cpp" />
- <ClCompile Include="graphics\collada\collada_scene.cpp" />
- <ClCompile Include="graphics\collada\collada_util.cpp" />
- <ClCompile Include="graphics\collada\dae\dae_animation.cpp" />
- <ClCompile Include="graphics\collada\dae\dae_control.cpp" />
- <ClCompile Include="graphics\collada\dae\dae_data_flow.cpp" />
- <ClCompile Include="graphics\collada\dae\dae_effect.cpp" />
- <ClCompile Include="graphics\collada\dae\dae_geom.cpp" />
- <ClCompile Include="graphics\collada\dae\dae_geometry.cpp" />
- <ClCompile Include="graphics\collada\dae\dae_scene.cpp" />
- <ClCompile Include="graphics\collada\dae\dae_transform.cpp" />
- <ClCompile Include="graphics\effect.cpp" />
- <ClCompile Include="graphics\font.cpp" />
- <ClCompile Include="graphics\frame_buffer.cpp" />
- <ClCompile Include="graphics\image.cpp" />
- <ClCompile Include="graphics\loader.cpp" />
- <ClCompile Include="graphics\platform_dx11\buffer_dx11.cpp" />
- <ClCompile Include="graphics\platform_dx11\constant_dx11.cpp" />
- <ClCompile Include="graphics\platform_dx11\context_dx11.cpp" />
- <ClCompile Include="graphics\platform_dx11\font_win.cpp" />
- <ClCompile Include="graphics\platform_dx11\frame_buffer_dx11.cpp" />
- <ClCompile Include="graphics\platform_dx11\image_dx11.cpp" />
- <ClCompile Include="graphics\platform_dx11\loader_dx11.cpp" />
- <ClCompile Include="graphics\platform_dx11\program_dx11.cpp" />
- <ClCompile Include="graphics\platform_dx11\render_target_dx11.cpp" />
- <ClCompile Include="graphics\platform_dx11\texture_dx11.cpp" />
- <ClCompile Include="graphics\platform_gnm\buffer_gnm.cpp" />
- <ClCompile Include="graphics\platform_gnm\constant_gnm.cpp" />
- <ClCompile Include="graphics\platform_gnm\context_gnm.cpp" />
- <ClCompile Include="graphics\platform_gnm\font_orbis.cpp" />
- <ClCompile Include="graphics\platform_gnm\frame_buffer_gnm.cpp" />
- <ClCompile Include="graphics\platform_gnm\heap_gnm.cpp" />
- <ClCompile Include="graphics\platform_gnm\image_gnm.cpp" />
- <ClCompile Include="graphics\platform_gnm\loader_gnm.cpp" />
- <ClCompile Include="graphics\platform_gnm\memory_gnm.cpp" />
- <ClCompile Include="graphics\platform_gnm\program_gnm.cpp" />
- <ClCompile Include="graphics\platform_gnm\render_target_gnm.cpp" />
- <ClCompile Include="graphics\platform_gnm\shader_loader_gnm.cpp" />
- <ClCompile Include="graphics\platform_gnm\texture_gnm.cpp" />
- <ClCompile Include="graphics\platform_gxm\buffer_gxm.cpp" />
- <ClCompile Include="graphics\platform_gxm\constant_gxm.cpp" />
- <ClCompile Include="graphics\platform_gxm\context_gxm.cpp" />
- <ClCompile Include="graphics\platform_gxm\font_psp2.cpp" />
- <ClCompile Include="graphics\platform_gxm\frame_buffer_gxm.cpp" />
- <ClCompile Include="graphics\platform_gxm\heap_gxm.cpp" />
- <ClCompile Include="graphics\platform_gxm\image_gxm.cpp" />
- <ClCompile Include="graphics\platform_gxm\loader_gxm.cpp" />
- <ClCompile Include="graphics\platform_gxm\program_gxm.cpp" />
- <ClCompile Include="graphics\platform_gxm\render_target_gxm.cpp" />
- <ClCompile Include="graphics\platform_gxm\texture_gxm.cpp" />
- <ClCompile Include="graphics\platform_gxm\texture_util_gxm.cpp" />
- <ClCompile Include="graphics\program.cpp" />
- <ClCompile Include="graphics\sprite.cpp" />
- <ClCompile Include="graphics\sprite_effect_2d.cpp" />
- <ClCompile Include="graphics\texture.cpp" />
- <ClCompile Include="input\controller_common.cpp" />
- <ClCompile Include="input\orbis\pad_orbis.cpp" />
- <ClCompile Include="input\pad_common.cpp" />
- <ClCompile Include="input\psp2\controller_psp2.cpp" />
- <ClCompile Include="input\psp2\motion_psp2.cpp" />
- <ClCompile Include="input\psp2\pad_psp2.cpp" />
- <ClCompile Include="input\psp2\touch_psp2.cpp" />
- <ClCompile Include="input\win\controller_win.cpp" />
- <ClCompile Include="input\win\pad_win.cpp" />
- <ClCompile Include="input\win\touch_win.cpp" />
- <ClCompile Include="resource\dllmain.cpp" />
- <ClCompile Include="resource\resource_manager.cpp" />
- <ClCompile Include="sampleutil_common.cpp" />
- <ClCompile Include="skeleton.cpp" />
- <ClCompile Include="system\orbis\save_data_orbis.cpp" />
- <ClCompile Include="system\orbis\user_orbis.cpp" />
- <ClCompile Include="system\psp2\save_data_psp2.cpp" />
- <ClCompile Include="system\psp2\user_psp2.cpp" />
- <ClCompile Include="system\win\save_data_win.cpp" />
- <ClCompile Include="system\win\user_win.cpp" />
- <ClCompile Include="util\util.cpp" />
- <ClCompile Include="util\util_streaming.cpp" />
- </ItemGroup>
- <ItemGroup>
- <CustomBuild Include="resource\sampleutil_fill2d_f.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- </AdditionalInputs>
- <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- </AdditionalInputs>
- <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">
- </AdditionalInputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill2d_v.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </CustomBuild>
- </ItemGroup>
- <ItemGroup>
- <CustomBuild Include="resource\sampleutil_clear_p.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_clear_vv.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </CustomBuild>
- </ItemGroup>
- <ItemGroup>
- <CustomBuild Include="resource\sampleutil_point_sprite2d_f.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- </AdditionalInputs>
- <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- </AdditionalInputs>
- <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">
- </AdditionalInputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_point_sprite2d_v.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_f.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_v.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_collada_skinning_phong_f.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_collada_skinning_phong_v.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_ascii.tga">
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-copy "%(FullPath)" "$(IntDir)%(Filename).tga"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).tga" "%(Filename).obj"
-popd
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-copy "%(FullPath)" "$(IntDir)%(Filename).tga"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).tga" "%(Filename).obj"
-popd
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "%(FullPath)" -b2e PSP2,_binary_%(Filename)_tga_start,_binary_%(Filename)_tga_size -o "$(IntDir)%(Filename)_tga.obj"
-</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_tga.obj;%(Outputs)</Outputs>
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-copy "%(FullPath)" "$(IntDir)%(Filename).tga"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).tga" "%(Filename).obj"
-popd
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">if not exist "$(IntDir)" md "$(IntDir)"
-copy "%(FullPath)" "$(IntDir)%(Filename).tga"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).tga" "%(Filename).obj"
-popd
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "%(FullPath)" -b2e PSP2,_binary_%(Filename)_tga_start,_binary_%(Filename)_tga_size -o "$(IntDir)%(Filename)_tga.obj"
-</Command>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_tga.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </CustomBuild>
- </ItemGroup>
- <ItemGroup>
- <CustomBuild Include="resource\sampleutil_clear_f.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_clear_v.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_collada_skinning_phong_f.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_collada_skinning_phong_v.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill2d_f.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill2d_v.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_point_sprite2d_f.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_point_sprite2d_v.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_f.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_v.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_2_f.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_2_v.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_2_f.pssl">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_2_v.pssl">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_yuy2_f.cg">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_yuy2_f.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_yuy2_v.cg">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_yuy2_v.pssl">
- <FileType>Document</FileType>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill3d_f.cg">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill3d_f.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj;</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill3d_v.cg">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill3d_v.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">true</ExcludedFromBuild>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_sb.obj;</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_sb.obj;</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_wireframe_f.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_fp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_wireframe_f.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_wireframe_v.cg">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">"$(SCE_PSP2_SDK_DIR)"\host_tools\bin\psp2cgc.exe --profile sce_vp_psp2 "%(FullPath)" -o "$(IntDir)%(Filename).gxp"
-"$(SCE_PSP2_SDK_DIR)"\host_tools\build\bin\psp2bin.exe "$(IntDir)%(Filename).gxp" -b2e PSP2,_binary_%(Filename)_gxp_start,_binary_%(Filename)_gxp_size,4 -o "$(IntDir)%(Filename)_gxp.obj"
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|PSVita'">$(IntDir)%(Filename)_gxp.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_wireframe_v.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj;%(Outputs)</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_ycbcr_f.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_ps_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Fragment Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_ycbcr_v.pssl">
- <FileType>Document</FileType>
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd
-</Command>
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">if not exist "$(IntDir)" md "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-wave-psslc.exe" -profile sce_vs_vs_orbis "%(FullPath)" -o "$(IntDir)%(Filename).sb"
-pushd "$(IntDir)"
-"$(SCE_ORBIS_SDK_DIR)\host_tools\bin\orbis-objcopy.exe" -I binary -O elf64-x86-64 -B i386 "%(Filename).sb" "%(Filename)_sb.obj"
-popd
-</Command>
- <Message Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- <Message Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">Compiling Vertex Shader: "%(FullPath)"</Message>
- <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(IntDir)%(Filename)_sb.obj</Outputs>
- </CustomBuild>
- <None Include="resource\vsoutput.hs" />
- </ItemGroup>
- <ItemGroup>
- <ResourceCompile Include="resource\libSceSampleUtil.rc" />
- </ItemGroup>
- <Import Condition="'$(ConfigurationType)' == 'Makefile' and Exists('$(VCTargetsPath)\Platforms\$(Platform)\SCE.Makefile.$(Platform).targets')" Project="$(VCTargetsPath)\Platforms\$(Platform)\SCE.Makefile.$(Platform).targets" />
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.vcxproj.filters b/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.vcxproj.filters
deleted file mode 100644
index 7284c3d..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.vcxproj.filters
+++ /dev/null
@@ -1,833 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- <Extensions>cpp;c;cxx;cc;s;asm</Extensions>
- </Filter>
- <Filter Include="Header Files">
- <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- <Extensions>h;hpp</Extensions>
- </Filter>
- <Filter Include="Source Files\graphics">
- <UniqueIdentifier>{b1346de6-e476-4511-b903-d7900f31aa0f}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\input">
- <UniqueIdentifier>{77dd35ea-1790-4bdf-932a-211ab73b875b}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\graphics\collada">
- <UniqueIdentifier>{96fc6757-68ff-4fc1-aebf-889d255c56b7}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\graphics\collada\dae">
- <UniqueIdentifier>{fc715001-0ae0-4f30-aab3-959f7c73bc29}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\graphics\platform_gnm">
- <UniqueIdentifier>{ecf91a0b-ee15-4b04-abf4-f61372b83438}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\audio">
- <UniqueIdentifier>{f30bddbc-6aad-436b-8ff6-2686aac95c18}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\audio\ngs2">
- <UniqueIdentifier>{67e01345-fdb3-473d-bcc2-772196cb6852}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\Resource">
- <UniqueIdentifier>{719af2ff-2b25-49d6-bcf2-5613eef4f3f3}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files\sample_util">
- <UniqueIdentifier>{24b4b573-8fbb-49e0-a960-fe051cb20da3}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files\sample_util\Audio">
- <UniqueIdentifier>{9be1ca38-b2c3-4228-a208-4fb50c69b823}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files\sample_util\graphics">
- <UniqueIdentifier>{02155831-4f6c-4313-be6c-0455083f264d}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files\sample_util\graphics\collada">
- <UniqueIdentifier>{251fc1da-25f4-4982-835e-e4aab23a3ee9}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files\sample_util\graphics\platform_gnm">
- <UniqueIdentifier>{9a407e69-ecd3-488e-83a3-aed61cd20707}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files\sample_util\debug">
- <UniqueIdentifier>{09e2ddc6-9563-4fae-8a60-c1c1499a9493}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\debug">
- <UniqueIdentifier>{1a668115-ef74-4445-8af9-808390b4ad4d}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files\sample_util\graphics\platform_gxm">
- <UniqueIdentifier>{8da06857-7958-4602-a123-517aa1d98f5d}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files\sample_util\graphics\platform_dx11">
- <UniqueIdentifier>{8c93893c-27c0-4eb6-8205-0f7132b8615e}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\graphics\platform_gxm">
- <UniqueIdentifier>{21d0ef12-3fc4-4a49-8d9d-622a43acc513}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\graphics\platform_dx11">
- <UniqueIdentifier>{b669e6e8-f199-4744-9a55-6e24f82088fa}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\Resource\pssl">
- <UniqueIdentifier>{c5092e21-dfbf-4506-8610-2c7790192e9e}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\Resource\cg">
- <UniqueIdentifier>{3e4bb032-bb60-4124-a966-9d6261bf8549}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\audio\ngs">
- <UniqueIdentifier>{d5851d03-29f7-4e6b-95e2-b51f3e1bb5b0}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\input\psp2">
- <UniqueIdentifier>{5805689e-aa21-46d0-a3fb-b3f0d31257db}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\input\win">
- <UniqueIdentifier>{249df471-9168-4b5c-b3df-19fb830ecb34}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\input\orbis">
- <UniqueIdentifier>{04f123fb-f86e-4833-9370-401bd85796c6}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files\sample_util\input">
- <UniqueIdentifier>{efe408b5-ffd2-43ae-9e89-89318a99b8f1}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\util">
- <UniqueIdentifier>{18bab552-4afd-4f0f-b241-6c47ab235426}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files\sample_util\system">
- <UniqueIdentifier>{c714f3b2-b8ba-480b-8398-dcd8938f5c08}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\system">
- <UniqueIdentifier>{c4a34eee-25ee-427d-966b-0f1123e33beb}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\system\win">
- <UniqueIdentifier>{131f6b49-ff8f-494a-a2fc-c0b44b6c3cf7}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\system\orbis">
- <UniqueIdentifier>{f9c9275c-0ccf-4206-b558-7ccbb825e264}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\system\psp2">
- <UniqueIdentifier>{2b5f4786-b6f4-43c2-9c4d-d16e5d308abb}</UniqueIdentifier>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="graphics\collada\dae\dae.h">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\dae\dae_animation.h">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\dae\dae_common.h">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\dae\dae_control.h">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\dae\dae_data_flow.h">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\dae\dae_effect.h">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\dae\dae_geometry.h">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\dae\dae_scene.h">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\dae\dae_transform.h">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\dae\dae_vscene.h">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\collada_internal.h">
- <Filter>Source Files\graphics\collada</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\collada_material.h">
- <Filter>Source Files\graphics\collada</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\collada_scene.h">
- <Filter>Source Files\graphics\collada</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\collada_util.h">
- <Filter>Source Files\graphics\collada</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gnm\gnm_internal.h">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\image.h">
- <Filter>Source Files\graphics</Filter>
- </ClInclude>
- <ClInclude Include="graphics\collada\collada_transform.h">
- <Filter>Source Files\graphics\collada</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics.h">
- <Filter>Header Files\sample_util</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\buffer.h">
- <Filter>Header Files\sample_util\graphics</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\collada.h">
- <Filter>Header Files\sample_util\graphics</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\constant.h">
- <Filter>Header Files\sample_util\graphics</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\context.h">
- <Filter>Header Files\sample_util\graphics</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\effect.h">
- <Filter>Header Files\sample_util\graphics</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\loader.h">
- <Filter>Header Files\sample_util\graphics</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\platform.h">
- <Filter>Header Files\sample_util\graphics</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\program.h">
- <Filter>Header Files\sample_util\graphics</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\sprite.h">
- <Filter>Header Files\sample_util\graphics</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\platform_gnm\platform_gnm.h">
- <Filter>Header Files\sample_util\graphics\platform_gnm</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_animation.h">
- <Filter>Header Files\sample_util\graphics\collada</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_base.h">
- <Filter>Header Files\sample_util\graphics\collada</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_effect.h">
- <Filter>Header Files\sample_util\graphics\collada</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_geometry.h">
- <Filter>Header Files\sample_util\graphics\collada</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_image.h">
- <Filter>Header Files\sample_util\graphics\collada</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\collada\collada_scene.h">
- <Filter>Header Files\sample_util\graphics\collada</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\audio.h">
- <Filter>Header Files\sample_util</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\audio\context.h">
- <Filter>Header Files\sample_util\Audio</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\audio\data.h">
- <Filter>Header Files\sample_util\Audio</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\audio\voice.h">
- <Filter>Header Files\sample_util\Audio</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\input.h">
- <Filter>Header Files\sample_util</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\sampleutil_common.h">
- <Filter>Header Files\sample_util</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\sampleutil_error.h">
- <Filter>Header Files\sample_util</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\skeleton.h">
- <Filter>Header Files\sample_util</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil.h">
- <Filter>Header Files\sample_util</Filter>
- </ClInclude>
- <ClInclude Include="audio\ngs2\ngs2_internal.h">
- <Filter>Source Files\audio\ngs2</Filter>
- </ClInclude>
- <ClInclude Include="audio\ngs2\ngs2_stream.h">
- <Filter>Source Files\audio\ngs2</Filter>
- </ClInclude>
- <ClInclude Include="resource\resource_manager.h">
- <Filter>Source Files\Resource</Filter>
- </ClInclude>
- <ClInclude Include="resource\shader_base.h">
- <Filter>Source Files\Resource</Filter>
- </ClInclude>
- <ClInclude Include="resource\std_cbuffer.h">
- <Filter>Source Files\Resource</Filter>
- </ClInclude>
- <ClInclude Include="stdafx.h">
- <Filter>Source Files</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\debug\console.h">
- <Filter>Header Files\sample_util\debug</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\debug\menu.h">
- <Filter>Header Files\sample_util\debug</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\font.h">
- <Filter>Header Files\sample_util\graphics</Filter>
- </ClInclude>
- <ClInclude Include="graphics\graphics_internal.h">
- <Filter>Source Files\graphics</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\platform_gxm\platform_gxm.h">
- <Filter>Header Files\sample_util\graphics\platform_gxm</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\graphics\platform_dx11\platform_dx11.h">
- <Filter>Header Files\sample_util\graphics\platform_dx11</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gxm\gxm_internal.h">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_dx11\dx11_internal.h">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gnm\image_gnm.h">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\constant_internal.h">
- <Filter>Source Files\graphics</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\input\controller.h">
- <Filter>Header Files\sample_util\input</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\input\motion.h">
- <Filter>Header Files\sample_util\input</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\input\touch.h">
- <Filter>Header Files\sample_util\input</Filter>
- </ClInclude>
- <ClInclude Include="audio\ngs\ngs_internal.h">
- <Filter>Source Files\audio\ngs</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gxm\heap_gxm.h">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gnm\heap_gnm.h">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClInclude>
- <ClInclude Include="util\util.h">
- <Filter>Source Files\util</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gxm\texture_util_gxm.h">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClInclude>
- <ClInclude Include="..\..\include\sampleutil\system.h">
- <Filter>Header Files\sample_util</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gnm\buffer_internal_gnm.h">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gnm\constant_internal_gnm.h">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gnm\context_internal_gnm.h">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gnm\loader_internal_gnm.h">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gnm\program_internal_gnm.h">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_dx11\buffer_internal_dx11.h">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_dx11\constant_internal_dx11.h">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_dx11\context_internal_dx11.h">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_dx11\loader_internal_dx11.h">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_dx11\program_internal_dx11.h">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClInclude>
- <ClInclude Include="sampleutil_internal.h">
- <Filter>Source Files</Filter>
- </ClInclude>
- <ClInclude Include="graphics\font_internal.h">
- <Filter>Source Files\graphics</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gxm\buffer_internal_gxm.h">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gxm\constant_internal_gxm.h">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gxm\context_internal_gxm.h">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gxm\loader_internal_gxm.h">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gxm\program_internal_gxm.h">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClInclude>
- <ClInclude Include="debug\debug_menu_internal.h">
- <Filter>Source Files\debug</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_dx11\font_win.h">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gnm\font_orbis.h">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\platform_gxm\font_psp2.h">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClInclude>
- <ClInclude Include="graphics\sprite_internal.h">
- <Filter>Source Files\graphics</Filter>
- </ClInclude>
- <ClInclude Include="input\pad_common.h">
- <Filter>Source Files\input</Filter>
- </ClInclude>
- <ClInclude Include="input\controller_common.h">
- <Filter>Source Files\input</Filter>
- </ClInclude>
- <ClInclude Include="audio\audio_internal.h">
- <Filter>Source Files\audio</Filter>
- </ClInclude>
- <ClInclude Include="audio\ngs\ngs_module.h">
- <Filter>Source Files\audio\ngs</Filter>
- </ClInclude>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="graphics\frame_buffer.cpp">
- <Filter>Source Files\graphics</Filter>
- </ClCompile>
- <ClCompile Include="graphics\loader.cpp">
- <Filter>Source Files\graphics</Filter>
- </ClCompile>
- <ClCompile Include="graphics\program.cpp">
- <Filter>Source Files\graphics</Filter>
- </ClCompile>
- <ClCompile Include="graphics\effect.cpp">
- <Filter>Source Files\graphics</Filter>
- </ClCompile>
- <ClCompile Include="graphics\sprite.cpp">
- <Filter>Source Files\graphics</Filter>
- </ClCompile>
- <ClCompile Include="graphics\texture.cpp">
- <Filter>Source Files\graphics</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\dae\dae_animation.cpp">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\dae\dae_control.cpp">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\dae\dae_data_flow.cpp">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\dae\dae_effect.cpp">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\dae\dae_geom.cpp">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\dae\dae_geometry.cpp">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\dae\dae_scene.cpp">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\dae\dae_transform.cpp">
- <Filter>Source Files\graphics\collada\dae</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\collada.cpp">
- <Filter>Source Files\graphics\collada</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\collada_animation.cpp">
- <Filter>Source Files\graphics\collada</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\collada_base.cpp">
- <Filter>Source Files\graphics\collada</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\collada_controller.cpp">
- <Filter>Source Files\graphics\collada</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\collada_effect.cpp">
- <Filter>Source Files\graphics\collada</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\collada_geometry.cpp">
- <Filter>Source Files\graphics\collada</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\collada_image.cpp">
- <Filter>Source Files\graphics\collada</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\collada_scene.cpp">
- <Filter>Source Files\graphics\collada</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\buffer_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\constant_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\context_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\frame_buffer_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\loader_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\program_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\render_target_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\texture_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\image.cpp">
- <Filter>Source Files\graphics</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs2\ngs2_context.cpp">
- <Filter>Source Files\audio\ngs2</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs2\ngs2_voice.cpp">
- <Filter>Source Files\audio\ngs2</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs2\ngs2_data.cpp">
- <Filter>Source Files\audio\ngs2</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs2\ngs2_rack.cpp">
- <Filter>Source Files\audio\ngs2</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs2\ngs2_stream.cpp">
- <Filter>Source Files\audio\ngs2</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs2\ngs2_thread.cpp">
- <Filter>Source Files\audio\ngs2</Filter>
- </ClCompile>
- <ClCompile Include="resource\resource_manager.cpp">
- <Filter>Source Files\Resource</Filter>
- </ClCompile>
- <ClCompile Include="graphics\collada\collada_util.cpp">
- <Filter>Source Files\graphics\collada</Filter>
- </ClCompile>
- <ClCompile Include="skeleton.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="debug\console.cpp">
- <Filter>Source Files\debug</Filter>
- </ClCompile>
- <ClCompile Include="debug\menu.cpp">
- <Filter>Source Files\debug</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\buffer_gxm.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\constant_gxm.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\context_gxm.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\frame_buffer_gxm.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\loader_gxm.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\program_gxm.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\render_target_gxm.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\texture_gxm.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_dx11\buffer_dx11.cpp">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_dx11\constant_dx11.cpp">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_dx11\context_dx11.cpp">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_dx11\frame_buffer_dx11.cpp">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_dx11\loader_dx11.cpp">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_dx11\program_dx11.cpp">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_dx11\render_target_dx11.cpp">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_dx11\texture_dx11.cpp">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\image_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\shader_loader_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\buffer.cpp">
- <Filter>Source Files\graphics</Filter>
- </ClCompile>
- <ClCompile Include="audio\audio.cpp">
- <Filter>Source Files\audio</Filter>
- </ClCompile>
- <ClCompile Include="input\psp2\controller_psp2.cpp">
- <Filter>Source Files\input\psp2</Filter>
- </ClCompile>
- <ClCompile Include="input\psp2\touch_psp2.cpp">
- <Filter>Source Files\input\psp2</Filter>
- </ClCompile>
- <ClCompile Include="input\win\controller_win.cpp">
- <Filter>Source Files\input\win</Filter>
- </ClCompile>
- <ClCompile Include="input\win\touch_win.cpp">
- <Filter>Source Files\input\win</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs\ngs_audio_util.cpp">
- <Filter>Source Files\audio\ngs</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs\ngs_buss.cpp">
- <Filter>Source Files\audio\ngs</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs\ngs_context.cpp">
- <Filter>Source Files\audio\ngs</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs\ngs_data.cpp">
- <Filter>Source Files\audio\ngs</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs\ngs_module.cpp">
- <Filter>Source Files\audio\ngs</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs\ngs_stream.cpp">
- <Filter>Source Files\audio\ngs</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs\ngs_voice.cpp">
- <Filter>Source Files\audio\ngs</Filter>
- </ClCompile>
- <ClCompile Include="audio\ngs\ngs_worker_thread.cpp">
- <Filter>Source Files\audio\ngs</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\heap_gxm.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\heap_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\memory_gnm.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="resource\dllmain.cpp">
- <Filter>Source Files\Resource</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_dx11\image_dx11.cpp">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\image_gxm.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\texture_util_gxm.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="sampleutil_common.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="system\orbis\save_data_orbis.cpp">
- <Filter>Source Files\system\orbis</Filter>
- </ClCompile>
- <ClCompile Include="system\psp2\save_data_psp2.cpp">
- <Filter>Source Files\system\psp2</Filter>
- </ClCompile>
- <ClCompile Include="system\win\save_data_win.cpp">
- <Filter>Source Files\system\win</Filter>
- </ClCompile>
- <ClCompile Include="graphics\font.cpp">
- <Filter>Source Files\graphics</Filter>
- </ClCompile>
- <ClCompile Include="util\util.cpp">
- <Filter>Source Files\util</Filter>
- </ClCompile>
- <ClCompile Include="debug\debug_menu_item_group.cpp">
- <Filter>Source Files\debug</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_dx11\font_win.cpp">
- <Filter>Source Files\graphics\platform_dx11</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gnm\font_orbis.cpp">
- <Filter>Source Files\graphics\platform_gnm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\platform_gxm\font_psp2.cpp">
- <Filter>Source Files\graphics\platform_gxm</Filter>
- </ClCompile>
- <ClCompile Include="graphics\sprite_effect_2d.cpp">
- <Filter>Source Files\graphics</Filter>
- </ClCompile>
- <ClCompile Include="input\pad_common.cpp">
- <Filter>Source Files\input</Filter>
- </ClCompile>
- <ClCompile Include="input\psp2\pad_psp2.cpp">
- <Filter>Source Files\input\psp2</Filter>
- </ClCompile>
- <ClCompile Include="system\win\user_win.cpp">
- <Filter>Source Files\system\win</Filter>
- </ClCompile>
- <ClCompile Include="system\psp2\user_psp2.cpp">
- <Filter>Source Files\system\psp2</Filter>
- </ClCompile>
- <ClCompile Include="system\orbis\user_orbis.cpp">
- <Filter>Source Files\system\orbis</Filter>
- </ClCompile>
- <ClCompile Include="input\orbis\pad_orbis.cpp">
- <Filter>Source Files\input\orbis</Filter>
- </ClCompile>
- <ClCompile Include="input\psp2\motion_psp2.cpp">
- <Filter>Source Files\input\psp2</Filter>
- </ClCompile>
- <ClCompile Include="input\win\pad_win.cpp">
- <Filter>Source Files\input\win</Filter>
- </ClCompile>
- <ClCompile Include="input\controller_common.cpp">
- <Filter>Source Files\input</Filter>
- </ClCompile>
- <ClCompile Include="audio\audio_data.cpp">
- <Filter>Source Files\audio</Filter>
- </ClCompile>
- <ClCompile Include="util\util_streaming.cpp">
- <Filter>Source Files\util</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <CustomBuild Include="resource\sampleutil_ascii.tga">
- <Filter>Source Files\Resource</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_clear_p.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_v.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_clear_vv.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_collada_skinning_phong_f.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_collada_skinning_phong_v.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill2d_f.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill2d_v.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_point_sprite2d_f.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_point_sprite2d_v.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_f.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_clear_f.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_clear_v.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_collada_skinning_phong_f.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_collada_skinning_phong_v.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill2d_f.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill2d_v.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_point_sprite2d_f.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_point_sprite2d_v.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_f.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_v.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_2_f.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_2_v.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_2_f.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_2_v.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_yuy2_f.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_yuy2_v.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_yuy2_f.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_yuy2_v.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill3d_f.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill3d_v.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill3d_f.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_fill3d_v.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_wireframe_f.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_wireframe_v.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_wireframe_f.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_wireframe_v.cg">
- <Filter>Source Files\Resource\cg</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_ycbcr_f.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- <CustomBuild Include="resource\sampleutil_sprite2d_ycbcr_v.pssl">
- <Filter>Source Files\Resource\pssl</Filter>
- </CustomBuild>
- </ItemGroup>
- <ItemGroup>
- <None Include="resource\vsoutput.hs">
- <Filter>Source Files\Resource</Filter>
- </None>
- </ItemGroup>
- <ItemGroup>
- <ResourceCompile Include="resource\libSceSampleUtil.rc">
- <Filter>Source Files\Resource</Filter>
- </ResourceCompile>
- </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.vcxproj.user b/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.vcxproj.user
deleted file mode 100644
index 695b5c7..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/common/source/sampleutil/libSceSampleUtil.vcxproj.user
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/dbg_font/dbg_font.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-test/PS4/dbg_font/dbg_font.vcxproj
deleted file mode 100644
index 68ff2dc..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/dbg_font/dbg_font.vcxproj
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|ORBIS">
- <Configuration>Debug</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ORBIS">
- <Configuration>Release</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectName>_dbg_font</ProjectName>
- <ProjectGuid>{43565ad8-688c-4451-a81f-2aba8e957753}</ProjectGuid>
- <RootNamespace>dkdev</RootNamespace>
- <Keyword>Win32Proj</Keyword>
- <GnmProjectType>SampleLib</GnmProjectType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <ImportGroup Label="PropertySheets">
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <Import Project="$(SolutionDir)\SceGnm.props" Condition="Exists('$(SolutionDir)\SceGnm.props')" />
- <Import Project="$(SCE_ORBIS_SDK_DIR)\host_tools\msbuild\SceGnm.props" Condition="!Exists('$(SolutionDir)\SceGnm.props')" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup>
- <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">libSceDbgFont_debug</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">libSceDbgFont</TargetName>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <UseFullPaths>true</UseFullPaths>
- <ProgramDataBaseFileName>$(OutDir)\$(TargetName)-vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
- </ClCompile>
- <Lib />
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <UseFullPaths>true</UseFullPaths>
- <ProgramDataBaseFileName>$(OutDir)\$(TargetName)-vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
- </ClCompile>
- <Lib />
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="dbg_font.cpp" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="dbg_font.h" />
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="dbg_font_printf_c.pssl" />
- <Compile_PSSL_To_Header Include="dbg_font_render_c.pssl" />
- <Compile_PSSL_To_Header Include="dbg_font_render_p.pssl" />
- </ItemGroup>
- <ItemGroup>
- <None Include="dbg_font_render.hs" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <Import Project="$(SolutionDir)\SceGnm.targets" Condition="Exists('$(SolutionDir)\SceGnm.targets')" />
- <Import Project="$(SCE_ORBIS_SDK_DIR)\host_tools\msbuild\SceGnm.targets" Condition="!Exists('$(SolutionDir)\SceGnm.targets')" />
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/framework/framework.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-test/PS4/framework/framework.vcxproj
deleted file mode 100644
index 27927f1..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/framework/framework.vcxproj
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|ORBIS">
- <Configuration>Debug</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ORBIS">
- <Configuration>Release</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectName>_framework</ProjectName>
- <ProjectGuid>{F950CC65-80EF-4B1F-86A3-2B87B3F23C96}</ProjectGuid>
- <RootNamespace>dkdev</RootNamespace>
- <Keyword>Win32Proj</Keyword>
- <GnmProjectType>SampleLib</GnmProjectType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Platform)'=='ORBIS'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <ImportGroup Label="PropertySheets">
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <Import Project="$(SolutionDir)\SceGnm.props" Condition="Exists('$(SolutionDir)\SceGnm.props')" />
- <Import Project="$(SCE_ORBIS_SDK_DIR)\host_tools\msbuild\SceGnm.props" Condition="!Exists('$(SolutionDir)\SceGnm.props')" />
- </ImportGroup>
- <ImportGroup Label="ExtensionSettings" />
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup>
- <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">framework_debug</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">framework</TargetName>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <UseFullPaths>true</UseFullPaths>
- <ProgramDataBaseFileName>$(OutDir)\$(TargetName)-vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
- </ClCompile>
- <Lib />
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <UseFullPaths>true</UseFullPaths>
- <ProgramDataBaseFileName>$(OutDir)\$(TargetName)-vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
- </ClCompile>
- <Lib />
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="controller.cpp" />
- <ClCompile Include="debug_objects.cpp" />
- <ClCompile Include="eopeventqueue.cpp" />
- <ClCompile Include="frame.cpp" />
- <ClCompile Include="framework.cpp" />
- <ClCompile Include="gnf_loader.cpp" />
- <ClCompile Include="noise_prep.cpp" />
- <ClCompile Include="sample_framework.cpp" />
- <ClCompile Include="sample_framework_menu.cpp" />
- <ClCompile Include="simple_mesh.cpp" />
- <ClCompile Include="thread.cpp" />
- </ItemGroup>
- <ItemGroup>
- <CustomBuildStep Include="framework.h" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="configdata.h" />
- <ClInclude Include="controller.h" />
- <ClInclude Include="debug_objects.h" />
- <ClInclude Include="eopeventqueue.h" />
- <ClInclude Include="frame.h" />
- <ClInclude Include="framework.h" />
- <ClInclude Include="gnf_loader.h" />
- <ClInclude Include="noise_prep.h" />
- <ClInclude Include="sample_framework.h" />
- <ClInclude Include="sample_framework_menu.h" />
- <ClInclude Include="simple_mesh.h" />
- <ClInclude Include="thread.h" />
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="dbg_font_repair_c.pssl" />
- <Compile_PSSL_To_Header Include="dbg_font_timer_c.pssl" />
- <Compile_PSSL_To_Header Include="dbg_font_unsigned_c.pssl" />
- <Compile_PSSL_To_Header Include="debug_vertex_p.pssl" />
- <Compile_PSSL_To_Header Include="debug_vertex_vv.pssl" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <Import Project="$(SolutionDir)\SceGnm.targets" Condition="Exists('$(SolutionDir)\SceGnm.targets')" />
- <Import Project="$(SCE_ORBIS_SDK_DIR)\host_tools\msbuild\SceGnm.targets" Condition="!Exists('$(SolutionDir)\SceGnm.targets')" />
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/toolkit/toolkit.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-test/PS4/toolkit/toolkit.vcxproj
deleted file mode 100644
index b62f72b..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/PS4/toolkit/toolkit.vcxproj
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|ORBIS">
- <Configuration>Debug</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ORBIS">
- <Configuration>Release</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectName>_toolkit</ProjectName>
- <ProjectGuid>{2F4CCF89-7649-4C7F-8CBF-F976B4FBC2B6}</ProjectGuid>
- <RootNamespace>dkdev</RootNamespace>
- <Keyword>Win32Proj</Keyword>
- <GnmProjectType>SampleLib</GnmProjectType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <ImportGroup Label="PropertySheets">
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <Import Project="$(SolutionDir)\SceGnm.props" Condition="Exists('$(SolutionDir)\SceGnm.props')" />
- <Import Project="$(SCE_ORBIS_SDK_DIR)\host_tools\msbuild\SceGnm.props" Condition="!Exists('$(SolutionDir)\SceGnm.props')" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup>
- <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">toolkit</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <TargetName>toolkit_debug</TargetName>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <UseFullPaths>true</UseFullPaths>
- <ProgramDataBaseFileName>$(OutDir)\$(TargetName)-vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
- </ClCompile>
- <Lib />
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <UseFullPaths>true</UseFullPaths>
- <ProgramDataBaseFileName>$(OutDir)\$(TargetName)-vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
- </ClCompile>
- <Lib />
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="allocators.cpp" />
- <ClCompile Include="dataformat_interpreter.cpp" />
- <ClCompile Include="dataformat_tests.cpp" />
- <ClCompile Include="deallocator.cpp" />
- <ClCompile Include="embedded_shader.cpp" />
- <ClCompile Include="floating_point.cpp" />
- <ClCompile Include="region_allocator.cpp" />
- <ClCompile Include="shader_loader.cpp" />
- <ClCompile Include="stack_allocator.cpp" />
- <ClCompile Include="toolkit.cpp" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="allocator.h" />
- <ClInclude Include="allocators.h" />
- <ClInclude Include="dataformat_interpreter.h" />
- <ClInclude Include="dataformat_tests.h" />
- <ClInclude Include="deallocator.h" />
- <ClInclude Include="embedded_shader.h" />
- <ClInclude Include="floating_point.h" />
- <ClInclude Include="geommath\matrix4unaligned.h" />
- <ClInclude Include="geommath\vector2unaligned.h" />
- <ClInclude Include="geommath\vector3unaligned.h" />
- <ClInclude Include="geommath\vector4unaligned.h" />
- <ClInclude Include="geommath\geommath.h" />
- <ClInclude Include="memory.h" />
- <ClInclude Include="region_allocator.h" />
- <ClInclude Include="shader_common\illum.hs" />
- <ClInclude Include="shader_common\noise.hs" />
- <ClInclude Include="shader_common\shader_base.h" />
- <ClInclude Include="shader_common\vsoutput_common.hs" />
- <ClInclude Include="shader_loader.h" />
- <ClInclude Include="stack_allocator.h" />
- <CustomBuildStep Include="toolkit.h" />
- </ItemGroup>
- <ItemGroup>
- <Compile_PSSL_To_Header Include="shader_common\copytexture2d_p.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\cs_clearbuffer_c.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\cs_cleartexture1d_c.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\cs_cleartexture2d_c.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\cs_cleartexture3d_c.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\cs_copybuffer_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="shader_common\cs_copyrawtexture1d_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="shader_common\cs_copyrawtexture2d_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="shader_common\cs_copyrawtexture3d_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="shader_common\cs_copytexture1d_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="shader_common\cs_copytexture2d_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="shader_common\cs_copytexture3d_c.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <Compile_PSSL_To_Header Include="shader_common\copydepth_p.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <PSSL Include="shader_common\pixbg_p.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\cs_set_uint_c.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\cs_set_uint_fast_c.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\cs_test_buffer_read_c.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\cs_test_texture_read_c.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\pix_clear_p.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- <PSSL Include="shader_common\vexbg_vv.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\pix_generateMipMaps_3d_p.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\pix_generateMipMaps_2d_p.pssl" />
- <Compile_PSSL_To_Header Include="shader_common\vex_clear_vv.pssl">
- <FileType>Document</FileType>
- </Compile_PSSL_To_Header>
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <Import Project="$(SolutionDir)\SceGnm.targets" Condition="Exists('$(SolutionDir)\SceGnm.targets')" />
- <Import Project="$(SCE_ORBIS_SDK_DIR)\host_tools\msbuild\SceGnm.targets" Condition="!Exists('$(SolutionDir)\SceGnm.targets')" />
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/google-tests/build/test-vp9-dec.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-test/google-tests/build/test-vp9-dec.vcxproj
deleted file mode 100644
index f414575..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/google-tests/build/test-vp9-dec.vcxproj
+++ /dev/null
@@ -1,276 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|ORBIS">
- <Configuration>Debug</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ORBIS">
- <Configuration>Release</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{020D5EB9-D317-46FE-9CEC-557444DCDC6E}</ProjectGuid>
- <Keyword>Win32Proj</Keyword>
- <RootNamespace>testvp9dec</RootNamespace>
- <ProjectName>google-tests</ProjectName>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>$(SolutionDir)..\bin\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
- <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>$(SolutionDir)..\bin\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <LinkIncremental>false</LinkIncremental>
- <OutDir>$(SolutionDir)..\bin\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <LinkIncremental>false</LinkIncremental>
- <OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
- <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <LinkIncremental>false</LinkIncremental>
- <OutDir>$(SolutionDir)..\bin\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)..\vp9-dec-core\build\build_$(Platform);$(SolutionDir)..\vp9-dec-core;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc</AdditionalIncludeDirectories>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <AdditionalLibraryDirectories>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)</AdditionalLibraryDirectories>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <ClCompile>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)vp9-dec-core\build;$(SolutionDir)vp9-dec-core;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;../../libwebm</AdditionalIncludeDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <OptimizationLevel>Level0</OptimizationLevel>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <AdditionalLibraryDirectories>$(SolutionDir)lib\$(Configuration);$(SolutionDir)ORBIS_Debug</AdditionalLibraryDirectories>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).a;libSceUserService_stub_weak.a;libScePerf_stub_weak.a;libSceGnmDriver_stub_weak.a;libScePm4Dump.a;libSceGnf.a;libSceShaderBinary.a;libSceGpuAddress.a;libSceGnmx_debug.a;libSceGnm_debug.a;libScePosix_stub_weak.a;libScePad_stub_weak.a;libSceVideoOut_stub_weak.a;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <ClCompile>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)..\vp9-dec-core\build\build_$(Platform);$(SolutionDir)..\vp9-dec-core;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc</AdditionalIncludeDirectories>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <AdditionalLibraryDirectories>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)</AdditionalLibraryDirectories>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <WarningLevel>Level3</WarningLevel>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)..\vp9-dec-core\build\build_$(Platform);$(SolutionDir)..\vp9-dec-core;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc</AdditionalIncludeDirectories>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <AdditionalLibraryDirectories>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)</AdditionalLibraryDirectories>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <ClCompile>
- <WarningLevel>Level3</WarningLevel>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)vp9-dec-core\build;$(SolutionDir)vp9-dec-core;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc;../../libwebm</AdditionalIncludeDirectories>
- <OptimizationLevel>Level2</OptimizationLevel>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <AdditionalLibraryDirectories>$(SolutionDir)lib\$(Configuration);$(SolutionDir)ORBIS_Release</AdditionalLibraryDirectories>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).a;libSceUserService_stub_weak.a;libScePerf_stub_weak.a;libSceGnmDriver_stub_weak.a;libScePm4Dump.a;libSceGnf.a;libSceShaderBinary.a;libSceGpuAddress.a;libSceGnmx.a;libSceGnm.a;libScePosix_stub_weak.a;libScePad_stub_weak.a;libSceVideoOut_stub_weak.a;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <ClCompile>
- <WarningLevel>Level3</WarningLevel>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)..\vp9-dec-core\build\build_$(Platform);$(SolutionDir)..\vp9-dec-core;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc</AdditionalIncludeDirectories>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <AdditionalLibraryDirectories>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)</AdditionalLibraryDirectories>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemGroup>
- <None Include="ReadMe.txt" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\..\libwebm\mkvparser\mkvparser.h" />
- <ClInclude Include="..\..\libwebm\mkvparser\mkvreader.h" />
- <ClInclude Include="..\..\vpxdec\md5_utils.h" />
- <ClInclude Include="..\..\vpxdec\webmdec.h" />
- <ClInclude Include="..\gtest\gtest.h" />
- <ClInclude Include="..\stdafx.h" />
- <ClInclude Include="..\targetver.h" />
- <ClInclude Include="..\tests\conformance_files.h" />
- <ClInclude Include="..\tests\decode_test_driver.h" />
- <ClInclude Include="..\tests\ivf_video_source.h" />
- <ClInclude Include="..\tests\md5_helper.h" />
- <ClInclude Include="..\tests\test_vectors.h" />
- <ClInclude Include="..\tests\video_source.h" />
- <ClInclude Include="..\tests\webm_video_source.h" />
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\..\libSimplePlayer\memory_helper.cpp" />
- <ClCompile Include="..\..\libwebm\mkvparser\mkvparser.cc" />
- <ClCompile Include="..\..\libwebm\mkvparser\mkvreader.cc" />
- <ClCompile Include="..\..\vpxdec\md5_utils.c" />
- <ClCompile Include="..\..\vpxdec\user_malloc.cpp" />
- <ClCompile Include="..\..\vpxdec\webmdec.cc" />
- <ClCompile Include="..\gtest\gtest-all.cc" />
- <ClCompile Include="..\stdafx.cpp" />
- <ClCompile Include="..\test-vp9-dec.cpp" />
- <ClCompile Include="..\tests\frame_cb_test.cpp" />
- <ClCompile Include="..\tests\decode_api_test.cc" />
- <ClCompile Include="..\tests\decode_test_driver.cc" />
- <ClCompile Include="..\tests\external_frame_buffer_test.cc" />
- <ClCompile Include="..\tests\invalid_file_test.cc" />
- <ClCompile Include="..\tests\test_conformance.cc" />
- <ClCompile Include="..\tests\test_vectors.cc" />
- <ClCompile Include="..\tests\test_vector_test.cc" />
- <ClCompile Include="..\tests\user_priv_test.cc" />
- <ClCompile Include="..\tests\vp9_decrypt_test.cc" />
- <ClCompile Include="..\tests\vp9_frame_parallel_test.cc" />
- <ClCompile Include="..\tests\vp9_skip_loopfilter_test.cc" />
- <ClCompile Include="..\tests\vp9_thread_test.cc" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/google-tests/build/test-vp9-dec.vcxproj.filters b/src/third_party/libvpx_gpu/vp9-dec-test/google-tests/build/test-vp9-dec.vcxproj.filters
deleted file mode 100644
index 462392e..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/google-tests/build/test-vp9-dec.vcxproj.filters
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
- </Filter>
- <Filter Include="Header Files">
- <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
- </Filter>
- <Filter Include="Resource Files">
- <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
- <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
- </Filter>
- <Filter Include="Source Files\gtest">
- <UniqueIdentifier>{4f095190-995f-4343-a0ac-89cf69fbd8f1}</UniqueIdentifier>
- </Filter>
- <Filter Include="Source Files\tests">
- <UniqueIdentifier>{4e2171ea-d54f-478c-b71d-61374f0b6a6a}</UniqueIdentifier>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <None Include="ReadMe.txt" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\stdafx.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\targetver.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\gtest\gtest.h">
- <Filter>Source Files\gtest</Filter>
- </ClInclude>
- <ClInclude Include="..\tests\decode_test_driver.h">
- <Filter>Source Files\tests</Filter>
- </ClInclude>
- <ClInclude Include="..\tests\md5_helper.h">
- <Filter>Source Files\tests</Filter>
- </ClInclude>
- <ClInclude Include="..\tests\webm_video_source.h">
- <Filter>Source Files\tests</Filter>
- </ClInclude>
- <ClInclude Include="..\tests\test_vectors.h">
- <Filter>Source Files\tests</Filter>
- </ClInclude>
- <ClInclude Include="..\tests\video_source.h">
- <Filter>Source Files\tests</Filter>
- </ClInclude>
- <ClInclude Include="..\..\vpxdec\webmdec.h">
- <Filter>Source Files\tests</Filter>
- </ClInclude>
- <ClInclude Include="..\tests\ivf_video_source.h">
- <Filter>Source Files\tests</Filter>
- </ClInclude>
- <ClInclude Include="..\tests\conformance_files.h">
- <Filter>Source Files\tests</Filter>
- </ClInclude>
- <ClInclude Include="..\..\vpxdec\md5_utils.h">
- <Filter>Source Files\tests</Filter>
- </ClInclude>
- <ClInclude Include="..\..\libwebm\mkvparser\mkvparser.h">
- <Filter>Source Files\tests</Filter>
- </ClInclude>
- <ClInclude Include="..\..\libwebm\mkvparser\mkvreader.h">
- <Filter>Source Files\tests</Filter>
- </ClInclude>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\stdafx.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\test-vp9-dec.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\user_priv_test.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\gtest\gtest-all.cc">
- <Filter>Source Files\gtest</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\decode_test_driver.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\invalid_file_test.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\vp9_frame_parallel_test.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\vp9_thread_test.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\test_vector_test.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\test_vectors.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\vp9_skip_loopfilter_test.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\vp9_decrypt_test.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\decode_api_test.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\..\vpxdec\user_malloc.cpp">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\..\vpxdec\webmdec.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\..\vpxdec\md5_utils.c">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\external_frame_buffer_test.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\..\libSimplePlayer\memory_helper.cpp">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\frame_cb_test.cpp">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\tests\test_conformance.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\..\libwebm\mkvparser\mkvparser.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- <ClCompile Include="..\..\libwebm\mkvparser\mkvreader.cc">
- <Filter>Source Files\tests</Filter>
- </ClCompile>
- </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/libSimplePlayer/libSimplePlayer.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-test/libSimplePlayer/libSimplePlayer.vcxproj
deleted file mode 100644
index 8284322..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/libSimplePlayer/libSimplePlayer.vcxproj
+++ /dev/null
@@ -1,155 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|ORBIS">
- <Configuration>Debug</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ORBIS">
- <Configuration>Release</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <VCTargetsPath Condition="'$(VCTargetsPath12)' != '' and '$(VSVersion)' == '' and '$(VisualStudioVersion)' == ''">$(VCTargetsPath12)</VCTargetsPath>
- <ProjectGuid>{901DB192-225E-48D3-8C4D-015A4DE1F6B4}</ProjectGuid>
- <ProjectName>luxSimplePlayer</ProjectName>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <PropertyGroup Condition="'$(DebuggerFlavor)'=='ORBISDebugger'" Label="OverrideDebuggerDefaults">
- <!--LocalDebuggerCommand>$(TargetPath)</LocalDebuggerCommand-->
- <!--LocalDebuggerCommandArguments></LocalDebuggerCommandArguments-->
- <!--LocalDebuggerTarget></LocalDebuggerTarget-->
- <!--LocalDebuggerWorkingDirectory>$(ProjectDir)</LocalDebuggerWorkingDirectory-->
- <!--LocalRunCommandLine></LocalRunCommandLine-->
- </PropertyGroup>
- <ImportGroup Label="ExtensionSettings">
- <Import Project="$(VCTargetsPath)\BuildCustomizations\OrbisWavePsslc.props" />
- <Import Project="$(VCTargetsPath)\BuildCustomizations\SCU.props" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
- <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
- <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <AdditionalIncludeDirectories>../PS4/;../PS4/common/include;../../vp9-dec-core;../../vp9-dec-core/build;../libwebm;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- </ClCompile>
- <Link>
- <AdditionalDependencies>-lScePosix_stub_weak;-lSceVideodec_stub_weak;libScePm4Dump.a;vp9-dec-core$(PlatformArchitecture).a;libSceGnm.a;libSceGnmx.a;libSceVideoOut_stub_weak.a;libSceGpuAddress.a;libScePad_stub_weak.a;libSceGnmDriver_stub_weak.a;libSceGnf.a;libSceShaderBinary.a</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(SolutionDir)lib\$(Configuration)</AdditionalLibraryDirectories>
- </Link>
- <OrbisWavePsslc>
- <OutputFileName>$(ProjectDir)%(FileName).sb</OutputFileName>
- </OrbisWavePsslc>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <ClCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <OptimizationLevel>Levels</OptimizationLevel>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <AdditionalIncludeDirectories>../PS4/;../PS4/common/include;../../vp9-dec-core;../../vp9-dec-core/build;../libwebm;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </ClCompile>
- <Link>
- <AdditionalDependencies>-lScePosix_stub_weak;-lSceVideodec_stub_weak;libScePm4Dump.a;vp9-dec-core$(PlatformArchitecture).a;libSceGnm.a;libSceGnmx.a;libSceVideoOut_stub_weak.a;libSceGpuAddress.a;libScePad_stub_weak.a;libSceGnmDriver_stub_weak.a;libSceGnf.a;libSceShaderBinary.a</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(SolutionDir)lib\$(Configuration)</AdditionalLibraryDirectories>
- </Link>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="..\..\vp9-dec-core\vp9\decoder\vp9lux_linear_allocator.cpp" />
- <ClCompile Include="..\..\vp9-dec-core\vp9\decoder\vp9lux_thread.c" />
- <ClCompile Include="..\libwebm\common\hdr_util.cc" />
- <ClCompile Include="..\libwebm\mkvmuxer\mkvmuxer.cc" />
- <ClCompile Include="..\libwebm\mkvmuxer\mkvmuxerutil.cc" />
- <ClCompile Include="..\libwebm\mkvmuxer\mkvwriter.cc" />
- <ClCompile Include="..\libwebm\mkvparser\mkvparser.cc" />
- <ClCompile Include="..\libwebm\mkvparser\mkvreader.cc" />
- <ClCompile Include="..\vpxdec\md5_utils.c" />
- <ClCompile Include="..\vpxdec\tools_common.c" />
- <ClCompile Include="..\vpxdec\user_malloc.cpp" />
- <ClCompile Include="..\vpxdec\webmdec.cc" />
- <ClCompile Include="display.cpp" />
- <ClCompile Include="main.cpp" />
- <ClCompile Include="memory_helper.cpp" />
- <ClCompile Include="stream_metadata.cpp" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\..\vp9-dec-core\vp9\decoder\vp9lux_linear_allocator.h" />
- <ClInclude Include="..\..\vp9-dec-core\vp9\decoder\vp9lux_thread.h" />
- <ClInclude Include="..\libwebm\common\hdr_util.h" />
- <ClInclude Include="..\libwebm\common\webmids.h" />
- <ClInclude Include="..\libwebm\mkvmuxer\mkvmuxer.h" />
- <ClInclude Include="..\libwebm\mkvmuxer\mkvmuxertypes.h" />
- <ClInclude Include="..\libwebm\mkvmuxer\mkvmuxerutil.h" />
- <ClInclude Include="..\libwebm\mkvmuxer\mkvwriter.h" />
- <ClInclude Include="..\libwebm\mkvparser\mkvparser.h" />
- <ClInclude Include="..\libwebm\mkvparser\mkvreader.h" />
- <ClInclude Include="..\vpxdec\md5_utils.h" />
- <ClInclude Include="..\vpxdec\tools_common.h" />
- <ClInclude Include="..\vpxdec\webmdec.h" />
- <ClInclude Include="display.h" />
- <ClInclude Include="ivf_video_source.h" />
- <ClInclude Include="memory_helper.h" />
- <ClInclude Include="stream_metadata.h" />
- <ClInclude Include="video_source.h" />
- <ClInclude Include="webm_video_source.h" />
- </ItemGroup>
- <ItemGroup>
- <OrbisWavePsslc Include="shader_CSC_p.pssl" />
- <OrbisWavePsslc Include="shader_vv.pssl">
- <FileType>Document</FileType>
- <OutputFileName Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">$(ProjectDir)%(FileName).sb</OutputFileName>
- </OrbisWavePsslc>
- </ItemGroup>
- <ItemGroup>
- <ProjectReference Include="..\PS4\common\source\sampleutil\libSceSampleUtil.vcxproj">
- <Project>{30a1b994-c2c6-485f-911b-fb4674366da8}</Project>
- </ProjectReference>
- <ProjectReference Include="..\PS4\dbg_font\dbg_font.vcxproj">
- <Project>{43565ad8-688c-4451-a81f-2aba8e957753}</Project>
- </ProjectReference>
- <ProjectReference Include="..\PS4\framework\framework.vcxproj">
- <Project>{f950cc65-80ef-4b1f-86a3-2b87b3f23c96}</Project>
- </ProjectReference>
- <ProjectReference Include="..\PS4\toolkit\toolkit.vcxproj">
- <Project>{2f4ccf89-7649-4c7f-8cbf-f976b4fbc2b6}</Project>
- </ProjectReference>
- </ItemGroup>
- <ItemGroup>
- <None Include="helper_functions.hs" />
- </ItemGroup>
- <Import Condition="'$(ConfigurationType)' == 'Makefile' and Exists('$(VCTargetsPath)\Platforms\$(Platform)\SCE.Makefile.$(Platform).targets')" Project="$(VCTargetsPath)\Platforms\$(Platform)\SCE.Makefile.$(Platform).targets" />
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- <Import Project="$(VCTargetsPath)\BuildCustomizations\OrbisWavePsslc.targets" />
- <Import Project="$(VCTargetsPath)\BuildCustomizations\SCU.targets" />
- </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/libSimplePlayer/libSimplePlayer.vcxproj.filters b/src/third_party/libvpx_gpu/vp9-dec-test/libSimplePlayer/libSimplePlayer.vcxproj.filters
deleted file mode 100644
index 074c689..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/libSimplePlayer/libSimplePlayer.vcxproj.filters
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- <Extensions>cpp;c;cxx;cc;s;asm</Extensions>
- </Filter>
- <Filter Include="Header Files">
- <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- <Extensions>h;hpp</Extensions>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="display.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="main.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\vpxdec\webmdec.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\vpxdec\user_malloc.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\vpxdec\tools_common.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\vpxdec\md5_utils.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\..\vp9-dec-core\vp9\decoder\vp9lux_linear_allocator.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\..\vp9-dec-core\vp9\decoder\vp9lux_thread.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="memory_helper.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\libwebm\mkvparser\mkvparser.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\libwebm\mkvparser\mkvreader.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\libwebm\common\hdr_util.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\libwebm\mkvmuxer\mkvmuxer.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\libwebm\mkvmuxer\mkvmuxerutil.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\libwebm\mkvmuxer\mkvwriter.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="stream_metadata.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="display.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="video_source.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="webm_video_source.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="ivf_video_source.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\vpxdec\webmdec.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\vpxdec\tools_common.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\vpxdec\md5_utils.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\..\vp9-dec-core\vp9\decoder\vp9lux_linear_allocator.h">
- <Filter>Source Files</Filter>
- </ClInclude>
- <ClInclude Include="..\..\vp9-dec-core\vp9\decoder\vp9lux_thread.h">
- <Filter>Source Files</Filter>
- </ClInclude>
- <ClInclude Include="memory_helper.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\common\hdr_util.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\common\webmids.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\mkvmuxer\mkvmuxer.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\mkvmuxer\mkvmuxertypes.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\mkvmuxer\mkvmuxerutil.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\mkvmuxer\mkvwriter.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\mkvparser\mkvparser.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\mkvparser\mkvreader.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="stream_metadata.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- </ItemGroup>
- <ItemGroup>
- <OrbisWavePsslc Include="shader_vv.pssl" />
- <OrbisWavePsslc Include="shader_CSC_p.pssl" />
- </ItemGroup>
- <ItemGroup>
- <None Include="helper_functions.hs">
- <Filter>Source Files</Filter>
- </None>
- </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/vpxdec/vpxdec.vcxproj b/src/third_party/libvpx_gpu/vp9-dec-test/vpxdec/vpxdec.vcxproj
deleted file mode 100644
index bbe42aa..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/vpxdec/vpxdec.vcxproj
+++ /dev/null
@@ -1,308 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|ORBIS">
- <Configuration>Debug</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ORBIS">
- <Configuration>Release</Configuration>
- <Platform>ORBIS</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{427CA27F-0F97-4791-912D-E2499DCAE406}</ProjectGuid>
- <Keyword>Win32Proj</Keyword>
- <RootNamespace>vpxdec</RootNamespace>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>Clang</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <CharacterSet>Unicode</CharacterSet>
- <PlatformToolset>v120</PlatformToolset>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings" />
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>$(SolutionDir)..\bin\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- <IncludePath>$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;$(ProgramFiles)\Visual Leak Detector\include</IncludePath>
- <LibraryPath>$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib;$(ProgramFiles)\Visual Leak Detector\lib\Win32</LibraryPath>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>$(SolutionDir)..\bin\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- <LibraryPath>$(DXSDK_DIR)lib\x64;$(LibraryPath)</LibraryPath>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <LibraryPath>$(SCE_ORBIS_SDK_DIR)\target\lib;$(LibraryPath)</LibraryPath>
- <LinkIncremental>true</LinkIncremental>
- <GnmUseGnm>true</GnmUseGnm>
- <GnmUseGnmx>true</GnmUseGnmx>
- <GnmUseAddressLibrary>true</GnmUseAddressLibrary>
- <GnmUseLibShaderBinary>true</GnmUseLibShaderBinary>
- <GnmUseGNF>true</GnmUseGNF>
- <GnmUseTextureTool>false</GnmUseTextureTool>
- <GnmUsePM4Dump>true</GnmUsePM4Dump>
- <GnmUseSampleCommon>false</GnmUseSampleCommon>
- <GnmProjectType>Sample</GnmProjectType>
- <OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
- <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <LinkIncremental>false</LinkIncremental>
- <OutDir>$(SolutionDir)..\bin\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <LinkIncremental>false</LinkIncremental>
- <OutDir>$(SolutionDir)..\bin\msvs10\$(Configuration)\win$(PlatformArchitecture)\</OutDir>
- <IntDir>$(SolutionDir)..\obj\msvs10\$(ProjectName)\$(Configuration)\win$(PlatformArchitecture)\</IntDir>
- <LibraryPath>$(DXSDK_DIR)lib\x64;$(LibraryPath)</LibraryPath>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <LibraryPath>$(DXSDK_DIR)lib\x64;$(LibraryPath)</LibraryPath>
- <LinkIncremental>false</LinkIncremental>
- <OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
- <IntDir>$(SolutionDir)obj\$(ProjectName)\$(Configuration)\</IntDir>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)..\..\Thirdparty\VpxThirdParty\libyuv\include\libyuv;$(SolutionDir)..\..\dec-cores\vp9-dec-core\build;$(SolutionDir)..\..\dec-cores\vp9-dec-core;$(SolutionDir)..\..\dec-cores\vp9-dec-core\build\build_$(Platform);$(SolutionDir)..\..\Thirdparty\VpxThirdParty\libyuv\include;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <AdditionalLibraryDirectories>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)</AdditionalLibraryDirectories>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).lib</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <ClCompile>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)..\..\Thirdparty\VpxThirdParty\libyuv\include\libyuv;$(SolutionDir)..\..\dec-cores\vp9-dec-core\build;$(SolutionDir)..\..\dec-cores\vp9-dec-core;$(SolutionDir)..\..\dec-cores\vp9-dec-core\build\build_$(Platform);$(SolutionDir)..\..\Thirdparty\VpxThirdParty\libyuv\include;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <AdditionalLibraryDirectories>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)</AdditionalLibraryDirectories>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).lib;D3D11.lib;d3dcompiler.lib</AdditionalDependencies>
- <IgnoreSpecificDefaultLibraries>
- </IgnoreSpecificDefaultLibraries>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">
- <ClCompile>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)..\Thirdparty\VpxThirdParty\libyuv\include\libyuv;$(SolutionDir)vp9-dec-core\build;$(SolutionDir)vp9-dec-core;$(SolutionDir)vp9-dec-core\build\ORBIS_Debug;$(SolutionDir)..\Thirdparty\VpxThirdParty\libyuv\include;$(SolutionDir)../Thirdparty/amd/mcl/1.6/amdmcl/inc;../libwebm</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <AdditionalLibraryDirectories>$(SolutionDir)lib\$(Configuration);$(SolutionDir)ORBIS_Debug</AdditionalLibraryDirectories>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).a;libSceUserService_stub_weak.a;libScePerf_stub_weak.a;libSceGnmDriver_stub_weak.a;libScePm4Dump.a;libSceGnf.a;libSceShaderBinary.a;libSceGpuAddress.a;libSceGnmx_debug.a;libSceGnm_debug.a;libScePosix_stub_weak.a;libScePad_stub_weak.a;libSceVideoOut_stub_weak.a;%(AdditionalDependencies)</AdditionalDependencies>
- <IgnoreSpecificDefaultLibraries>
- </IgnoreSpecificDefaultLibraries>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <WarningLevel>Level3</WarningLevel>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)..\..\Thirdparty\VpxThirdParty\libyuv\include\libyuv;$(SolutionDir)..\..\dec-cores\vp9-dec-core\build;$(SolutionDir)..\..\dec-cores\vp9-dec-core;$(SolutionDir)..\..\dec-cores\vp9-dec-core\build\build_$(Platform);$(SolutionDir)..\..\Thirdparty\VpxThirdParty\libyuv\include;$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc</AdditionalIncludeDirectories>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).lib</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)</AdditionalLibraryDirectories>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <ClCompile>
- <WarningLevel>Level3</WarningLevel>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)..\..\dec-cores\vp9-dec-core\build;$(SolutionDir)..\..\dec-cores\vp9-dec-core;$(SolutionDir)..\..\dec-cores\vp9-dec-core\build\build_$(Platform);$(SolutionDir)/../../Thirdparty/amd/mcl/1.6/amdmcl/inc</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).lib;D3D11.lib;d3dcompiler.lib</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(SolutionDir)..\lib\msvs10\$(Configuration)\win$(PlatformArchitecture)</AdditionalLibraryDirectories>
- <IgnoreSpecificDefaultLibraries>
- </IgnoreSpecificDefaultLibraries>
- </Link>
- <PostBuildEvent>
- <Command>
- </Command>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ORBIS'">
- <ClCompile>
- <WarningLevel>Level3</WarningLevel>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)..\Thirdparty\VpxThirdParty\libyuv\include\libyuv;$(SolutionDir)vp9-dec-core\build;$(SolutionDir)vp9-dec-core;$(SolutionDir)vp9-dec-core\build\ORBIS_Release;$(SolutionDir)..\Thirdparty\VpxThirdParty\libyuv\include;$(SolutionDir)../Thirdparty/amd/mcl/1.6/amdmcl/inc;../libwebm</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <OptimizationLevel>Levels</OptimizationLevel>
- <LinkTimeOptimization>true</LinkTimeOptimization>
- <NoStrictAliasing>false</NoStrictAliasing>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <AdditionalDependencies>vp9-dec-core$(PlatformArchitecture).a;libSceUserService_stub_weak.a;libScePerf_stub_weak.a;libSceGnmDriver_stub_weak.a;libScePm4Dump.a;libSceGnf.a;libSceShaderBinary.a;libSceGpuAddress.a;libSceGnmx_debug.a;libSceGnm_debug.a;libScePosix_stub_weak.a;libScePad_stub_weak.a;libSceVideoOut_stub_weak.a;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(SolutionDir)lib\$(Configuration);</AdditionalLibraryDirectories>
- <IgnoreSpecificDefaultLibraries>
- </IgnoreSpecificDefaultLibraries>
- </Link>
- <PostBuildEvent>
- <Command>
- </Command>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemGroup>
- <None Include="ReadMe.txt" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\..\vp9-dec-core\vpx_mem\sce_mem.h" />
- <ClInclude Include="..\libwebm\mkvparser\mkvparser.h" />
- <ClInclude Include="..\libwebm\mkvparser\mkvreader.h" />
- <ClInclude Include="args.h" />
- <ClInclude Include="ivfdec.h" />
- <ClInclude Include="md5_utils.h" />
- <ClInclude Include="stdafx.h">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">false</ExcludedFromBuild>
- </ClInclude>
- <ClInclude Include="targetver.h">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ORBIS'">true</ExcludedFromBuild>
- </ClInclude>
- <ClInclude Include="webmdec.h" />
- <ClInclude Include="y4menc.h" />
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\..\vp9-dec-core\vpx_mem\vpx_mem.c" />
- <ClCompile Include="..\libwebm\mkvparser\mkvparser.cc" />
- <ClCompile Include="..\libwebm\mkvparser\mkvreader.cc" />
- <ClCompile Include="args.c" />
- <ClCompile Include="ivfdec.c" />
- <ClCompile Include="md5_utils.c" />
- <ClCompile Include="stdafx.cpp" />
- <ClCompile Include="tools_common.c" />
- <ClCompile Include="user_malloc.cpp" />
- <ClCompile Include="vpxdec.c" />
- <ClCompile Include="webmdec.cc" />
- <ClCompile Include="y4menc.c" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets" />
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9-dec-test/vpxdec/vpxdec.vcxproj.filters b/src/third_party/libvpx_gpu/vp9-dec-test/vpxdec/vpxdec.vcxproj.filters
deleted file mode 100644
index f670f6f..0000000
--- a/src/third_party/libvpx_gpu/vp9-dec-test/vpxdec/vpxdec.vcxproj.filters
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
- </Filter>
- <Filter Include="Header Files">
- <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
- </Filter>
- <Filter Include="Resource Files">
- <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
- <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <None Include="ReadMe.txt" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="stdafx.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="targetver.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="args.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="md5_utils.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="y4menc.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="webmdec.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="ivfdec.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\..\vp9-dec-core\vpx_mem\sce_mem.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\mkvparser\mkvparser.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\libwebm\mkvparser\mkvreader.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="stdafx.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="vpxdec.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="tools_common.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="args.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="md5_utils.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="y4menc.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="webmdec.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="ivfdec.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="user_malloc.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\..\vp9-dec-core\vpx_mem\vpx_mem.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\libwebm\mkvparser\mkvparser.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\libwebm\mkvparser\mkvreader.cc">
- <Filter>Source Files</Filter>
- </ClCompile>
- </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/src/third_party/libvpx_gpu/vp9decoder.sln b/src/third_party/libvpx_gpu/vp9decoder.sln
deleted file mode 100644
index 87ac9f9..0000000
--- a/src/third_party/libvpx_gpu/vp9decoder.sln
+++ /dev/null
@@ -1,97 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.40629.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vp9-dec-core", "vp9-dec-core\build\vpx-dec-core.vcxproj", "{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vpxdec", "vp9-dec-test\vpxdec\vpxdec.vcxproj", "{427CA27F-0F97-4791-912D-E2499DCAE406}"
- ProjectSection(ProjectDependencies) = postProject
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "google-tests", "vp9-dec-test\google-tests\build\test-vp9-dec.vcxproj", "{020D5EB9-D317-46FE-9CEC-557444DCDC6E}"
- ProjectSection(ProjectDependencies) = postProject
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{3FD52CF0-07C7-4FFB-B2D1-6D23F366E206}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "luxSimplePlayer", "vp9-dec-test\libSimplePlayer\libSimplePlayer.vcxproj", "{901DB192-225E-48D3-8C4D-015A4DE1F6B4}"
- ProjectSection(ProjectDependencies) = postProject
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libSceSampleUtil", "vp9-dec-test\PS4\common\source\sampleutil\libSceSampleUtil.vcxproj", "{30A1B994-C2C6-485F-911B-FB4674366DA8}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_toolkit", "vp9-dec-test\PS4\toolkit\toolkit.vcxproj", "{2F4CCF89-7649-4C7F-8CBF-F976B4FBC2B6}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_framework", "vp9-dec-test\PS4\framework\framework.vcxproj", "{F950CC65-80EF-4B1F-86A3-2B87B3F23C96}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_dbg_font", "vp9-dec-test\PS4\dbg_font\dbg_font.vcxproj", "{43565AD8-688C-4451-A81F-2ABA8E957753}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "player", "player", "{1453DBCA-657E-4D99-A391-EDDE23FC4396}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ErrorResilienceTest", "vp9-dec-test\ErrorResilienceTest\ErrorResilienceTest.vcxproj", "{F216E2AC-3265-4071-9F17-709D747FF1D1}"
- ProjectSection(ProjectDependencies) = postProject
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|ORBIS = Debug|ORBIS
- Release|ORBIS = Release|ORBIS
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|ORBIS.ActiveCfg = Debug|ORBIS
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|ORBIS.Build.0 = Debug|ORBIS
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|ORBIS.ActiveCfg = Release|ORBIS
- {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|ORBIS.Build.0 = Release|ORBIS
- {427CA27F-0F97-4791-912D-E2499DCAE406}.Debug|ORBIS.ActiveCfg = Debug|ORBIS
- {427CA27F-0F97-4791-912D-E2499DCAE406}.Debug|ORBIS.Build.0 = Debug|ORBIS
- {427CA27F-0F97-4791-912D-E2499DCAE406}.Release|ORBIS.ActiveCfg = Release|ORBIS
- {427CA27F-0F97-4791-912D-E2499DCAE406}.Release|ORBIS.Build.0 = Release|ORBIS
- {020D5EB9-D317-46FE-9CEC-557444DCDC6E}.Debug|ORBIS.ActiveCfg = Debug|ORBIS
- {020D5EB9-D317-46FE-9CEC-557444DCDC6E}.Debug|ORBIS.Build.0 = Debug|ORBIS
- {020D5EB9-D317-46FE-9CEC-557444DCDC6E}.Release|ORBIS.ActiveCfg = Release|ORBIS
- {020D5EB9-D317-46FE-9CEC-557444DCDC6E}.Release|ORBIS.Build.0 = Release|ORBIS
- {901DB192-225E-48D3-8C4D-015A4DE1F6B4}.Debug|ORBIS.ActiveCfg = Debug|ORBIS
- {901DB192-225E-48D3-8C4D-015A4DE1F6B4}.Debug|ORBIS.Build.0 = Debug|ORBIS
- {901DB192-225E-48D3-8C4D-015A4DE1F6B4}.Release|ORBIS.ActiveCfg = Release|ORBIS
- {901DB192-225E-48D3-8C4D-015A4DE1F6B4}.Release|ORBIS.Build.0 = Release|ORBIS
- {30A1B994-C2C6-485F-911B-FB4674366DA8}.Debug|ORBIS.ActiveCfg = Debug|ORBIS
- {30A1B994-C2C6-485F-911B-FB4674366DA8}.Debug|ORBIS.Build.0 = Debug|ORBIS
- {30A1B994-C2C6-485F-911B-FB4674366DA8}.Release|ORBIS.ActiveCfg = Release|ORBIS
- {30A1B994-C2C6-485F-911B-FB4674366DA8}.Release|ORBIS.Build.0 = Release|ORBIS
- {2F4CCF89-7649-4C7F-8CBF-F976B4FBC2B6}.Debug|ORBIS.ActiveCfg = Debug|ORBIS
- {2F4CCF89-7649-4C7F-8CBF-F976B4FBC2B6}.Debug|ORBIS.Build.0 = Debug|ORBIS
- {2F4CCF89-7649-4C7F-8CBF-F976B4FBC2B6}.Release|ORBIS.ActiveCfg = Release|ORBIS
- {2F4CCF89-7649-4C7F-8CBF-F976B4FBC2B6}.Release|ORBIS.Build.0 = Release|ORBIS
- {F950CC65-80EF-4B1F-86A3-2B87B3F23C96}.Debug|ORBIS.ActiveCfg = Debug|ORBIS
- {F950CC65-80EF-4B1F-86A3-2B87B3F23C96}.Debug|ORBIS.Build.0 = Debug|ORBIS
- {F950CC65-80EF-4B1F-86A3-2B87B3F23C96}.Release|ORBIS.ActiveCfg = Release|ORBIS
- {F950CC65-80EF-4B1F-86A3-2B87B3F23C96}.Release|ORBIS.Build.0 = Release|ORBIS
- {43565AD8-688C-4451-A81F-2ABA8E957753}.Debug|ORBIS.ActiveCfg = Debug|ORBIS
- {43565AD8-688C-4451-A81F-2ABA8E957753}.Debug|ORBIS.Build.0 = Debug|ORBIS
- {43565AD8-688C-4451-A81F-2ABA8E957753}.Release|ORBIS.ActiveCfg = Release|ORBIS
- {43565AD8-688C-4451-A81F-2ABA8E957753}.Release|ORBIS.Build.0 = Release|ORBIS
- {F216E2AC-3265-4071-9F17-709D747FF1D1}.Debug|ORBIS.ActiveCfg = Debug|ORBIS
- {F216E2AC-3265-4071-9F17-709D747FF1D1}.Debug|ORBIS.Build.0 = Debug|ORBIS
- {F216E2AC-3265-4071-9F17-709D747FF1D1}.Release|ORBIS.ActiveCfg = Release|ORBIS
- {F216E2AC-3265-4071-9F17-709D747FF1D1}.Release|ORBIS.Build.0 = Release|ORBIS
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {427CA27F-0F97-4791-912D-E2499DCAE406} = {3FD52CF0-07C7-4FFB-B2D1-6D23F366E206}
- {020D5EB9-D317-46FE-9CEC-557444DCDC6E} = {3FD52CF0-07C7-4FFB-B2D1-6D23F366E206}
- {901DB192-225E-48D3-8C4D-015A4DE1F6B4} = {1453DBCA-657E-4D99-A391-EDDE23FC4396}
- {30A1B994-C2C6-485F-911B-FB4674366DA8} = {1453DBCA-657E-4D99-A391-EDDE23FC4396}
- {2F4CCF89-7649-4C7F-8CBF-F976B4FBC2B6} = {1453DBCA-657E-4D99-A391-EDDE23FC4396}
- {F950CC65-80EF-4B1F-86A3-2B87B3F23C96} = {1453DBCA-657E-4D99-A391-EDDE23FC4396}
- {43565AD8-688C-4451-A81F-2ABA8E957753} = {1453DBCA-657E-4D99-A391-EDDE23FC4396}
- {1453DBCA-657E-4D99-A391-EDDE23FC4396} = {3FD52CF0-07C7-4FFB-B2D1-6D23F366E206}
- {F216E2AC-3265-4071-9F17-709D747FF1D1} = {3FD52CF0-07C7-4FFB-B2D1-6D23F366E206}
- EndGlobalSection
-EndGlobal
diff --git a/src/third_party/llvm-project/libunwind/libunwind.gyp b/src/third_party/llvm-project/libunwind/libunwind.gyp
index 833ca4a..3a32bbd 100644
--- a/src/third_party/llvm-project/libunwind/libunwind.gyp
+++ b/src/third_party/llvm-project/libunwind/libunwind.gyp
@@ -20,8 +20,6 @@
'include_dirs': [
'include',
'<(DEPTH)/third_party/llvm-project/libcxx/include',
- '<(DEPTH)/third_party/musl/include',
- '<(DEPTH)/third_party/musl/generated/include',
],
'dependencies': [
'<(DEPTH)/starboard/common/common.gyp:common',
@@ -86,8 +84,6 @@
'all_dependent_settings': {
'include_dirs': [
'<(DEPTH)/third_party/llvm-project/libcxx/include',
- '<(DEPTH)/third_party/musl/include',
- '<(DEPTH)/third_party/musl/generated/include',
],
'defines': [
# Ensure that __external_threading is used for threading support.
diff --git a/src/third_party/llvm-project/libunwind/src/AddressSpace.hpp b/src/third_party/llvm-project/libunwind/src/AddressSpace.hpp
index e3a7e40..a2ea283 100644
--- a/src/third_party/llvm-project/libunwind/src/AddressSpace.hpp
+++ b/src/third_party/llvm-project/libunwind/src/AddressSpace.hpp
@@ -385,6 +385,9 @@
inline bool LocalAddressSpace::findUnwindSections(pint_t targetAddr,
UnwindInfoSections &info) {
+#if defined(STARBOARD)
+ return false;
+#endif
#ifdef __APPLE__
dyld_unwind_sections dyldInfo;
if (_dyld_find_unwind_sections((void *)targetAddr, &dyldInfo)) {
@@ -584,6 +587,7 @@
inline bool LocalAddressSpace::findFunctionName(pint_t addr, char *buf,
size_t bufLen,
unw_word_t *offset) {
+#if !defined(STARBOARD)
#if _LIBUNWIND_USE_DLADDR
Dl_info dyldInfo;
if (dladdr((void *)addr, &dyldInfo)) {
@@ -594,6 +598,7 @@
}
}
#endif
+#endif
return false;
}
diff --git a/src/third_party/musl/arch/aarch64/bits/alltypes.h b/src/third_party/musl/arch/aarch64/bits/alltypes.h
new file mode 100644
index 0000000..f90365e
--- /dev/null
+++ b/src/third_party/musl/arch/aarch64/bits/alltypes.h
@@ -0,0 +1,401 @@
+#define _Addr long
+#define _Int64 long
+#define _Reg long
+
+#if defined(__NEED_va_list) && !defined(__DEFINED_va_list)
+typedef __builtin_va_list va_list;
+#define __DEFINED_va_list
+#endif
+
+#if defined(__NEED___isoc_va_list) && !defined(__DEFINED___isoc_va_list)
+typedef __builtin_va_list __isoc_va_list;
+#define __DEFINED___isoc_va_list
+#endif
+
+
+#ifndef __cplusplus
+#if defined(__NEED_wchar_t) && !defined(__DEFINED_wchar_t)
+typedef unsigned wchar_t;
+#define __DEFINED_wchar_t
+#endif
+
+#endif
+#if defined(__NEED_wint_t) && !defined(__DEFINED_wint_t)
+typedef unsigned wint_t;
+#define __DEFINED_wint_t
+#endif
+
+
+#if defined(__NEED_blksize_t) && !defined(__DEFINED_blksize_t)
+typedef int blksize_t;
+#define __DEFINED_blksize_t
+#endif
+
+#if defined(__NEED_nlink_t) && !defined(__DEFINED_nlink_t)
+typedef unsigned int nlink_t;
+#define __DEFINED_nlink_t
+#endif
+
+
+#if defined(__NEED_float_t) && !defined(__DEFINED_float_t)
+typedef float float_t;
+#define __DEFINED_float_t
+#endif
+
+#if defined(__NEED_double_t) && !defined(__DEFINED_double_t)
+typedef double double_t;
+#define __DEFINED_double_t
+#endif
+
+
+#if defined(__NEED_max_align_t) && !defined(__DEFINED_max_align_t)
+typedef struct { long long __ll; long double __ld; } max_align_t;
+#define __DEFINED_max_align_t
+#endif
+
+
+#if defined(__NEED_time_t) && !defined(__DEFINED_time_t)
+typedef long time_t;
+#define __DEFINED_time_t
+#endif
+
+#if defined(__NEED_suseconds_t) && !defined(__DEFINED_suseconds_t)
+typedef long suseconds_t;
+#define __DEFINED_suseconds_t
+#endif
+
+
+#if defined(__NEED_pthread_attr_t) && !defined(__DEFINED_pthread_attr_t)
+typedef struct { union { int __i[14]; volatile int __vi[14]; unsigned long __s[7]; } __u; } pthread_attr_t;
+#define __DEFINED_pthread_attr_t
+#endif
+
+#if defined(__NEED_pthread_mutex_t) && !defined(__DEFINED_pthread_mutex_t)
+typedef struct { union { int __i[10]; volatile int __vi[10]; volatile void *volatile __p[5]; } __u; } pthread_mutex_t;
+#define __DEFINED_pthread_mutex_t
+#endif
+
+#if defined(__NEED_mtx_t) && !defined(__DEFINED_mtx_t)
+typedef struct { union { int __i[10]; volatile int __vi[10]; volatile void *volatile __p[5]; } __u; } mtx_t;
+#define __DEFINED_mtx_t
+#endif
+
+#if defined(__NEED_pthread_cond_t) && !defined(__DEFINED_pthread_cond_t)
+typedef struct { union { int __i[12]; volatile int __vi[12]; void *__p[6]; } __u; } pthread_cond_t;
+#define __DEFINED_pthread_cond_t
+#endif
+
+#if defined(__NEED_cnd_t) && !defined(__DEFINED_cnd_t)
+typedef struct { union { int __i[12]; volatile int __vi[12]; void *__p[6]; } __u; } cnd_t;
+#define __DEFINED_cnd_t
+#endif
+
+#if defined(__NEED_pthread_rwlock_t) && !defined(__DEFINED_pthread_rwlock_t)
+typedef struct { union { int __i[14]; volatile int __vi[14]; void *__p[7]; } __u; } pthread_rwlock_t;
+#define __DEFINED_pthread_rwlock_t
+#endif
+
+#if defined(__NEED_pthread_barrier_t) && !defined(__DEFINED_pthread_barrier_t)
+typedef struct { union { int __i[8]; volatile int __vi[8]; void *__p[4]; } __u; } pthread_barrier_t;
+#define __DEFINED_pthread_barrier_t
+#endif
+
+#if defined(__NEED_size_t) && !defined(__DEFINED_size_t)
+typedef unsigned _Addr size_t;
+#define __DEFINED_size_t
+#endif
+
+#if defined(__NEED_uintptr_t) && !defined(__DEFINED_uintptr_t)
+typedef unsigned _Addr uintptr_t;
+#define __DEFINED_uintptr_t
+#endif
+
+#if defined(__NEED_ptrdiff_t) && !defined(__DEFINED_ptrdiff_t)
+typedef _Addr ptrdiff_t;
+#define __DEFINED_ptrdiff_t
+#endif
+
+#if defined(__NEED_ssize_t) && !defined(__DEFINED_ssize_t)
+typedef _Addr ssize_t;
+#define __DEFINED_ssize_t
+#endif
+
+#if defined(__NEED_intptr_t) && !defined(__DEFINED_intptr_t)
+typedef _Addr intptr_t;
+#define __DEFINED_intptr_t
+#endif
+
+#if defined(__NEED_regoff_t) && !defined(__DEFINED_regoff_t)
+typedef _Addr regoff_t;
+#define __DEFINED_regoff_t
+#endif
+
+#if defined(__NEED_register_t) && !defined(__DEFINED_register_t)
+typedef _Reg register_t;
+#define __DEFINED_register_t
+#endif
+
+
+#if defined(__NEED_int8_t) && !defined(__DEFINED_int8_t)
+typedef signed char int8_t;
+#define __DEFINED_int8_t
+#endif
+
+#if defined(__NEED_int16_t) && !defined(__DEFINED_int16_t)
+typedef signed short int16_t;
+#define __DEFINED_int16_t
+#endif
+
+#if defined(__NEED_int32_t) && !defined(__DEFINED_int32_t)
+typedef signed int int32_t;
+#define __DEFINED_int32_t
+#endif
+
+#if defined(__NEED_int64_t) && !defined(__DEFINED_int64_t)
+typedef signed _Int64 int64_t;
+#define __DEFINED_int64_t
+#endif
+
+#if defined(__NEED_intmax_t) && !defined(__DEFINED_intmax_t)
+typedef signed _Int64 intmax_t;
+#define __DEFINED_intmax_t
+#endif
+
+#if defined(__NEED_uint8_t) && !defined(__DEFINED_uint8_t)
+typedef unsigned char uint8_t;
+#define __DEFINED_uint8_t
+#endif
+
+#if defined(__NEED_uint16_t) && !defined(__DEFINED_uint16_t)
+typedef unsigned short uint16_t;
+#define __DEFINED_uint16_t
+#endif
+
+#if defined(__NEED_uint32_t) && !defined(__DEFINED_uint32_t)
+typedef unsigned int uint32_t;
+#define __DEFINED_uint32_t
+#endif
+
+#if defined(__NEED_uint64_t) && !defined(__DEFINED_uint64_t)
+typedef unsigned _Int64 uint64_t;
+#define __DEFINED_uint64_t
+#endif
+
+#if defined(__NEED_u_int64_t) && !defined(__DEFINED_u_int64_t)
+typedef unsigned _Int64 u_int64_t;
+#define __DEFINED_u_int64_t
+#endif
+
+#if defined(__NEED_uintmax_t) && !defined(__DEFINED_uintmax_t)
+typedef unsigned _Int64 uintmax_t;
+#define __DEFINED_uintmax_t
+#endif
+
+
+#if defined(__NEED_mode_t) && !defined(__DEFINED_mode_t)
+typedef unsigned mode_t;
+#define __DEFINED_mode_t
+#endif
+
+#if defined(__NEED_nlink_t) && !defined(__DEFINED_nlink_t)
+typedef unsigned _Reg nlink_t;
+#define __DEFINED_nlink_t
+#endif
+
+#if defined(__NEED_off_t) && !defined(__DEFINED_off_t)
+typedef _Int64 off_t;
+#define __DEFINED_off_t
+#endif
+
+#if defined(__NEED_ino_t) && !defined(__DEFINED_ino_t)
+typedef unsigned _Int64 ino_t;
+#define __DEFINED_ino_t
+#endif
+
+#if defined(__NEED_dev_t) && !defined(__DEFINED_dev_t)
+typedef unsigned _Int64 dev_t;
+#define __DEFINED_dev_t
+#endif
+
+#if defined(__NEED_blksize_t) && !defined(__DEFINED_blksize_t)
+typedef long blksize_t;
+#define __DEFINED_blksize_t
+#endif
+
+#if defined(__NEED_blkcnt_t) && !defined(__DEFINED_blkcnt_t)
+typedef _Int64 blkcnt_t;
+#define __DEFINED_blkcnt_t
+#endif
+
+#if defined(__NEED_fsblkcnt_t) && !defined(__DEFINED_fsblkcnt_t)
+typedef unsigned _Int64 fsblkcnt_t;
+#define __DEFINED_fsblkcnt_t
+#endif
+
+#if defined(__NEED_fsfilcnt_t) && !defined(__DEFINED_fsfilcnt_t)
+typedef unsigned _Int64 fsfilcnt_t;
+#define __DEFINED_fsfilcnt_t
+#endif
+
+
+#if defined(__NEED_wint_t) && !defined(__DEFINED_wint_t)
+typedef unsigned wint_t;
+#define __DEFINED_wint_t
+#endif
+
+#if defined(__NEED_wctype_t) && !defined(__DEFINED_wctype_t)
+typedef unsigned long wctype_t;
+#define __DEFINED_wctype_t
+#endif
+
+
+#if defined(__NEED_timer_t) && !defined(__DEFINED_timer_t)
+typedef void * timer_t;
+#define __DEFINED_timer_t
+#endif
+
+#if defined(__NEED_clockid_t) && !defined(__DEFINED_clockid_t)
+typedef int clockid_t;
+#define __DEFINED_clockid_t
+#endif
+
+#if defined(__NEED_clock_t) && !defined(__DEFINED_clock_t)
+typedef long clock_t;
+#define __DEFINED_clock_t
+#endif
+
+#if defined(__NEED_struct_timeval) && !defined(__DEFINED_struct_timeval)
+struct timeval { time_t tv_sec; suseconds_t tv_usec; };
+#define __DEFINED_struct_timeval
+#endif
+
+#if defined(__NEED_struct_timespec) && !defined(__DEFINED_struct_timespec)
+struct timespec { time_t tv_sec; long tv_nsec; };
+#define __DEFINED_struct_timespec
+#endif
+
+
+#if defined(__NEED_pid_t) && !defined(__DEFINED_pid_t)
+typedef int pid_t;
+#define __DEFINED_pid_t
+#endif
+
+#if defined(__NEED_id_t) && !defined(__DEFINED_id_t)
+typedef unsigned id_t;
+#define __DEFINED_id_t
+#endif
+
+#if defined(__NEED_uid_t) && !defined(__DEFINED_uid_t)
+typedef unsigned uid_t;
+#define __DEFINED_uid_t
+#endif
+
+#if defined(__NEED_gid_t) && !defined(__DEFINED_gid_t)
+typedef unsigned gid_t;
+#define __DEFINED_gid_t
+#endif
+
+#if defined(__NEED_key_t) && !defined(__DEFINED_key_t)
+typedef int key_t;
+#define __DEFINED_key_t
+#endif
+
+#if defined(__NEED_useconds_t) && !defined(__DEFINED_useconds_t)
+typedef unsigned useconds_t;
+#define __DEFINED_useconds_t
+#endif
+
+
+#ifdef __cplusplus
+#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t)
+typedef unsigned long pthread_t;
+#define __DEFINED_pthread_t
+#endif
+
+#else
+#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t)
+typedef struct __pthread * pthread_t;
+#define __DEFINED_pthread_t
+#endif
+
+#endif
+#if defined(__NEED_pthread_once_t) && !defined(__DEFINED_pthread_once_t)
+typedef int pthread_once_t;
+#define __DEFINED_pthread_once_t
+#endif
+
+#if defined(__NEED_pthread_key_t) && !defined(__DEFINED_pthread_key_t)
+typedef unsigned pthread_key_t;
+#define __DEFINED_pthread_key_t
+#endif
+
+#if defined(__NEED_pthread_spinlock_t) && !defined(__DEFINED_pthread_spinlock_t)
+typedef int pthread_spinlock_t;
+#define __DEFINED_pthread_spinlock_t
+#endif
+
+#if defined(__NEED_pthread_mutexattr_t) && !defined(__DEFINED_pthread_mutexattr_t)
+typedef struct { unsigned __attr; } pthread_mutexattr_t;
+#define __DEFINED_pthread_mutexattr_t
+#endif
+
+#if defined(__NEED_pthread_condattr_t) && !defined(__DEFINED_pthread_condattr_t)
+typedef struct { unsigned __attr; } pthread_condattr_t;
+#define __DEFINED_pthread_condattr_t
+#endif
+
+#if defined(__NEED_pthread_barrierattr_t) && !defined(__DEFINED_pthread_barrierattr_t)
+typedef struct { unsigned __attr; } pthread_barrierattr_t;
+#define __DEFINED_pthread_barrierattr_t
+#endif
+
+#if defined(__NEED_pthread_rwlockattr_t) && !defined(__DEFINED_pthread_rwlockattr_t)
+typedef struct { unsigned __attr[2]; } pthread_rwlockattr_t;
+#define __DEFINED_pthread_rwlockattr_t
+#endif
+
+
+#if defined(__NEED_FILE) && !defined(__DEFINED_FILE)
+typedef struct _IO_FILE FILE;
+#define __DEFINED_FILE
+#endif
+
+
+#if defined(__NEED_mbstate_t) && !defined(__DEFINED_mbstate_t)
+typedef struct __mbstate_t { unsigned __opaque1, __opaque2; } mbstate_t;
+#define __DEFINED_mbstate_t
+#endif
+
+
+#if defined(__NEED_locale_t) && !defined(__DEFINED_locale_t)
+typedef struct __locale_struct * locale_t;
+#define __DEFINED_locale_t
+#endif
+
+
+#if defined(__NEED_sigset_t) && !defined(__DEFINED_sigset_t)
+typedef struct __sigset_t { unsigned long __bits[128/sizeof(long)]; } sigset_t;
+#define __DEFINED_sigset_t
+#endif
+
+
+#if defined(__NEED_struct_iovec) && !defined(__DEFINED_struct_iovec)
+struct iovec { void *iov_base; size_t iov_len; };
+#define __DEFINED_struct_iovec
+#endif
+
+
+#if defined(__NEED_socklen_t) && !defined(__DEFINED_socklen_t)
+typedef unsigned socklen_t;
+#define __DEFINED_socklen_t
+#endif
+
+#if defined(__NEED_sa_family_t) && !defined(__DEFINED_sa_family_t)
+typedef unsigned short sa_family_t;
+#define __DEFINED_sa_family_t
+#endif
+
+
+#undef _Addr
+#undef _Int64
+#undef _Reg
diff --git a/src/third_party/musl/arch/arm/bits/alltypes.h b/src/third_party/musl/arch/arm/bits/alltypes.h
new file mode 100644
index 0000000..f8c6e76
--- /dev/null
+++ b/src/third_party/musl/arch/arm/bits/alltypes.h
@@ -0,0 +1,385 @@
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#if defined(__NEED_va_list) && !defined(__DEFINED_va_list)
+typedef __builtin_va_list va_list;
+#define __DEFINED_va_list
+#endif
+
+#if defined(__NEED___isoc_va_list) && !defined(__DEFINED___isoc_va_list)
+typedef __builtin_va_list __isoc_va_list;
+#define __DEFINED___isoc_va_list
+#endif
+
+
+#ifndef __cplusplus
+#if defined(__NEED_wchar_t) && !defined(__DEFINED_wchar_t)
+typedef unsigned wchar_t;
+#define __DEFINED_wchar_t
+#endif
+
+#endif
+
+#if defined(__NEED_float_t) && !defined(__DEFINED_float_t)
+typedef float float_t;
+#define __DEFINED_float_t
+#endif
+
+#if defined(__NEED_double_t) && !defined(__DEFINED_double_t)
+typedef double double_t;
+#define __DEFINED_double_t
+#endif
+
+
+#if defined(__NEED_max_align_t) && !defined(__DEFINED_max_align_t)
+typedef struct { long long __ll; long double __ld; } max_align_t;
+#define __DEFINED_max_align_t
+#endif
+
+
+#if defined(__NEED_time_t) && !defined(__DEFINED_time_t)
+typedef long time_t;
+#define __DEFINED_time_t
+#endif
+
+#if defined(__NEED_suseconds_t) && !defined(__DEFINED_suseconds_t)
+typedef long suseconds_t;
+#define __DEFINED_suseconds_t
+#endif
+
+
+#if defined(__NEED_pthread_attr_t) && !defined(__DEFINED_pthread_attr_t)
+typedef struct { union { int __i[9]; volatile int __vi[9]; unsigned __s[9]; } __u; } pthread_attr_t;
+#define __DEFINED_pthread_attr_t
+#endif
+
+#if defined(__NEED_pthread_mutex_t) && !defined(__DEFINED_pthread_mutex_t)
+typedef struct { union { int __i[6]; volatile int __vi[6]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t;
+#define __DEFINED_pthread_mutex_t
+#endif
+
+#if defined(__NEED_mtx_t) && !defined(__DEFINED_mtx_t)
+typedef struct { union { int __i[6]; volatile int __vi[6]; volatile void *volatile __p[6]; } __u; } mtx_t;
+#define __DEFINED_mtx_t
+#endif
+
+#if defined(__NEED_pthread_cond_t) && !defined(__DEFINED_pthread_cond_t)
+typedef struct { union { int __i[12]; volatile int __vi[12]; void *__p[12]; } __u; } pthread_cond_t;
+#define __DEFINED_pthread_cond_t
+#endif
+
+#if defined(__NEED_cnd_t) && !defined(__DEFINED_cnd_t)
+typedef struct { union { int __i[12]; volatile int __vi[12]; void *__p[12]; } __u; } cnd_t;
+#define __DEFINED_cnd_t
+#endif
+
+#if defined(__NEED_pthread_rwlock_t) && !defined(__DEFINED_pthread_rwlock_t)
+typedef struct { union { int __i[8]; volatile int __vi[8]; void *__p[8]; } __u; } pthread_rwlock_t;
+#define __DEFINED_pthread_rwlock_t
+#endif
+
+#if defined(__NEED_pthread_barrier_t) && !defined(__DEFINED_pthread_barrier_t)
+typedef struct { union { int __i[5]; volatile int __vi[5]; void *__p[5]; } __u; } pthread_barrier_t;
+#define __DEFINED_pthread_barrier_t
+#endif
+
+#if defined(__NEED_size_t) && !defined(__DEFINED_size_t)
+typedef unsigned _Addr size_t;
+#define __DEFINED_size_t
+#endif
+
+#if defined(__NEED_uintptr_t) && !defined(__DEFINED_uintptr_t)
+typedef unsigned _Addr uintptr_t;
+#define __DEFINED_uintptr_t
+#endif
+
+#if defined(__NEED_ptrdiff_t) && !defined(__DEFINED_ptrdiff_t)
+typedef _Addr ptrdiff_t;
+#define __DEFINED_ptrdiff_t
+#endif
+
+#if defined(__NEED_ssize_t) && !defined(__DEFINED_ssize_t)
+typedef _Addr ssize_t;
+#define __DEFINED_ssize_t
+#endif
+
+#if defined(__NEED_intptr_t) && !defined(__DEFINED_intptr_t)
+typedef _Addr intptr_t;
+#define __DEFINED_intptr_t
+#endif
+
+#if defined(__NEED_regoff_t) && !defined(__DEFINED_regoff_t)
+typedef _Addr regoff_t;
+#define __DEFINED_regoff_t
+#endif
+
+#if defined(__NEED_register_t) && !defined(__DEFINED_register_t)
+typedef _Reg register_t;
+#define __DEFINED_register_t
+#endif
+
+
+#if defined(__NEED_int8_t) && !defined(__DEFINED_int8_t)
+typedef signed char int8_t;
+#define __DEFINED_int8_t
+#endif
+
+#if defined(__NEED_int16_t) && !defined(__DEFINED_int16_t)
+typedef signed short int16_t;
+#define __DEFINED_int16_t
+#endif
+
+#if defined(__NEED_int32_t) && !defined(__DEFINED_int32_t)
+typedef signed int int32_t;
+#define __DEFINED_int32_t
+#endif
+
+#if defined(__NEED_int64_t) && !defined(__DEFINED_int64_t)
+typedef signed _Int64 int64_t;
+#define __DEFINED_int64_t
+#endif
+
+#if defined(__NEED_intmax_t) && !defined(__DEFINED_intmax_t)
+typedef signed _Int64 intmax_t;
+#define __DEFINED_intmax_t
+#endif
+
+#if defined(__NEED_uint8_t) && !defined(__DEFINED_uint8_t)
+typedef unsigned char uint8_t;
+#define __DEFINED_uint8_t
+#endif
+
+#if defined(__NEED_uint16_t) && !defined(__DEFINED_uint16_t)
+typedef unsigned short uint16_t;
+#define __DEFINED_uint16_t
+#endif
+
+#if defined(__NEED_uint32_t) && !defined(__DEFINED_uint32_t)
+typedef unsigned int uint32_t;
+#define __DEFINED_uint32_t
+#endif
+
+#if defined(__NEED_uint64_t) && !defined(__DEFINED_uint64_t)
+typedef unsigned _Int64 uint64_t;
+#define __DEFINED_uint64_t
+#endif
+
+#if defined(__NEED_u_int64_t) && !defined(__DEFINED_u_int64_t)
+typedef unsigned _Int64 u_int64_t;
+#define __DEFINED_u_int64_t
+#endif
+
+#if defined(__NEED_uintmax_t) && !defined(__DEFINED_uintmax_t)
+typedef unsigned _Int64 uintmax_t;
+#define __DEFINED_uintmax_t
+#endif
+
+
+#if defined(__NEED_mode_t) && !defined(__DEFINED_mode_t)
+typedef unsigned mode_t;
+#define __DEFINED_mode_t
+#endif
+
+#if defined(__NEED_nlink_t) && !defined(__DEFINED_nlink_t)
+typedef unsigned _Reg nlink_t;
+#define __DEFINED_nlink_t
+#endif
+
+#if defined(__NEED_off_t) && !defined(__DEFINED_off_t)
+typedef _Int64 off_t;
+#define __DEFINED_off_t
+#endif
+
+#if defined(__NEED_ino_t) && !defined(__DEFINED_ino_t)
+typedef unsigned _Int64 ino_t;
+#define __DEFINED_ino_t
+#endif
+
+#if defined(__NEED_dev_t) && !defined(__DEFINED_dev_t)
+typedef unsigned _Int64 dev_t;
+#define __DEFINED_dev_t
+#endif
+
+#if defined(__NEED_blksize_t) && !defined(__DEFINED_blksize_t)
+typedef long blksize_t;
+#define __DEFINED_blksize_t
+#endif
+
+#if defined(__NEED_blkcnt_t) && !defined(__DEFINED_blkcnt_t)
+typedef _Int64 blkcnt_t;
+#define __DEFINED_blkcnt_t
+#endif
+
+#if defined(__NEED_fsblkcnt_t) && !defined(__DEFINED_fsblkcnt_t)
+typedef unsigned _Int64 fsblkcnt_t;
+#define __DEFINED_fsblkcnt_t
+#endif
+
+#if defined(__NEED_fsfilcnt_t) && !defined(__DEFINED_fsfilcnt_t)
+typedef unsigned _Int64 fsfilcnt_t;
+#define __DEFINED_fsfilcnt_t
+#endif
+
+
+#if defined(__NEED_wint_t) && !defined(__DEFINED_wint_t)
+typedef unsigned wint_t;
+#define __DEFINED_wint_t
+#endif
+
+#if defined(__NEED_wctype_t) && !defined(__DEFINED_wctype_t)
+typedef unsigned long wctype_t;
+#define __DEFINED_wctype_t
+#endif
+
+
+#if defined(__NEED_timer_t) && !defined(__DEFINED_timer_t)
+typedef void * timer_t;
+#define __DEFINED_timer_t
+#endif
+
+#if defined(__NEED_clockid_t) && !defined(__DEFINED_clockid_t)
+typedef int clockid_t;
+#define __DEFINED_clockid_t
+#endif
+
+#if defined(__NEED_clock_t) && !defined(__DEFINED_clock_t)
+typedef long clock_t;
+#define __DEFINED_clock_t
+#endif
+
+#if defined(__NEED_struct_timeval) && !defined(__DEFINED_struct_timeval)
+struct timeval { time_t tv_sec; suseconds_t tv_usec; };
+#define __DEFINED_struct_timeval
+#endif
+
+#if defined(__NEED_struct_timespec) && !defined(__DEFINED_struct_timespec)
+struct timespec { time_t tv_sec; long tv_nsec; };
+#define __DEFINED_struct_timespec
+#endif
+
+
+#if defined(__NEED_pid_t) && !defined(__DEFINED_pid_t)
+typedef int pid_t;
+#define __DEFINED_pid_t
+#endif
+
+#if defined(__NEED_id_t) && !defined(__DEFINED_id_t)
+typedef unsigned id_t;
+#define __DEFINED_id_t
+#endif
+
+#if defined(__NEED_uid_t) && !defined(__DEFINED_uid_t)
+typedef unsigned uid_t;
+#define __DEFINED_uid_t
+#endif
+
+#if defined(__NEED_gid_t) && !defined(__DEFINED_gid_t)
+typedef unsigned gid_t;
+#define __DEFINED_gid_t
+#endif
+
+#if defined(__NEED_key_t) && !defined(__DEFINED_key_t)
+typedef int key_t;
+#define __DEFINED_key_t
+#endif
+
+#if defined(__NEED_useconds_t) && !defined(__DEFINED_useconds_t)
+typedef unsigned useconds_t;
+#define __DEFINED_useconds_t
+#endif
+
+
+#ifdef __cplusplus
+#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t)
+typedef unsigned long pthread_t;
+#define __DEFINED_pthread_t
+#endif
+
+#else
+#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t)
+typedef struct __pthread * pthread_t;
+#define __DEFINED_pthread_t
+#endif
+
+#endif
+#if defined(__NEED_pthread_once_t) && !defined(__DEFINED_pthread_once_t)
+typedef int pthread_once_t;
+#define __DEFINED_pthread_once_t
+#endif
+
+#if defined(__NEED_pthread_key_t) && !defined(__DEFINED_pthread_key_t)
+typedef unsigned pthread_key_t;
+#define __DEFINED_pthread_key_t
+#endif
+
+#if defined(__NEED_pthread_spinlock_t) && !defined(__DEFINED_pthread_spinlock_t)
+typedef int pthread_spinlock_t;
+#define __DEFINED_pthread_spinlock_t
+#endif
+
+#if defined(__NEED_pthread_mutexattr_t) && !defined(__DEFINED_pthread_mutexattr_t)
+typedef struct { unsigned __attr; } pthread_mutexattr_t;
+#define __DEFINED_pthread_mutexattr_t
+#endif
+
+#if defined(__NEED_pthread_condattr_t) && !defined(__DEFINED_pthread_condattr_t)
+typedef struct { unsigned __attr; } pthread_condattr_t;
+#define __DEFINED_pthread_condattr_t
+#endif
+
+#if defined(__NEED_pthread_barrierattr_t) && !defined(__DEFINED_pthread_barrierattr_t)
+typedef struct { unsigned __attr; } pthread_barrierattr_t;
+#define __DEFINED_pthread_barrierattr_t
+#endif
+
+#if defined(__NEED_pthread_rwlockattr_t) && !defined(__DEFINED_pthread_rwlockattr_t)
+typedef struct { unsigned __attr[2]; } pthread_rwlockattr_t;
+#define __DEFINED_pthread_rwlockattr_t
+#endif
+
+
+#if defined(__NEED_FILE) && !defined(__DEFINED_FILE)
+typedef struct _IO_FILE FILE;
+#define __DEFINED_FILE
+#endif
+
+
+#if defined(__NEED_mbstate_t) && !defined(__DEFINED_mbstate_t)
+typedef struct __mbstate_t { unsigned __opaque1, __opaque2; } mbstate_t;
+#define __DEFINED_mbstate_t
+#endif
+
+
+#if defined(__NEED_locale_t) && !defined(__DEFINED_locale_t)
+typedef struct __locale_struct * locale_t;
+#define __DEFINED_locale_t
+#endif
+
+
+#if defined(__NEED_sigset_t) && !defined(__DEFINED_sigset_t)
+typedef struct __sigset_t { unsigned long __bits[128/sizeof(long)]; } sigset_t;
+#define __DEFINED_sigset_t
+#endif
+
+
+#if defined(__NEED_struct_iovec) && !defined(__DEFINED_struct_iovec)
+struct iovec { void *iov_base; size_t iov_len; };
+#define __DEFINED_struct_iovec
+#endif
+
+
+#if defined(__NEED_socklen_t) && !defined(__DEFINED_socklen_t)
+typedef unsigned socklen_t;
+#define __DEFINED_socklen_t
+#endif
+
+#if defined(__NEED_sa_family_t) && !defined(__DEFINED_sa_family_t)
+typedef unsigned short sa_family_t;
+#define __DEFINED_sa_family_t
+#endif
+
+
+#undef _Addr
+#undef _Int64
+#undef _Reg
diff --git a/src/third_party/musl/arch/i386/bits/alltypes.h b/src/third_party/musl/arch/i386/bits/alltypes.h
new file mode 100644
index 0000000..6bbc3ab
--- /dev/null
+++ b/src/third_party/musl/arch/i386/bits/alltypes.h
@@ -0,0 +1,433 @@
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#if __GNUC__ >= 3
+#if defined(__NEED_va_list) && !defined(__DEFINED_va_list)
+typedef __builtin_va_list va_list;
+#define __DEFINED_va_list
+#endif
+
+#if defined(__NEED___isoc_va_list) && !defined(__DEFINED___isoc_va_list)
+typedef __builtin_va_list __isoc_va_list;
+#define __DEFINED___isoc_va_list
+#endif
+
+#else
+#if defined(__NEED_va_list) && !defined(__DEFINED_va_list)
+typedef struct __va_list * va_list;
+#define __DEFINED_va_list
+#endif
+
+#if defined(__NEED___isoc_va_list) && !defined(__DEFINED___isoc_va_list)
+typedef struct __va_list * __isoc_va_list;
+#define __DEFINED___isoc_va_list
+#endif
+
+#endif
+
+#ifndef __cplusplus
+#ifdef __WCHAR_TYPE__
+#if defined(__NEED_wchar_t) && !defined(__DEFINED_wchar_t)
+typedef __WCHAR_TYPE__ wchar_t;
+#define __DEFINED_wchar_t
+#endif
+
+#else
+#if defined(__NEED_wchar_t) && !defined(__DEFINED_wchar_t)
+typedef long wchar_t;
+#define __DEFINED_wchar_t
+#endif
+
+#endif
+#endif
+
+#if defined(__FLT_EVAL_METHOD__) && __FLT_EVAL_METHOD__ == 0
+#if defined(__NEED_float_t) && !defined(__DEFINED_float_t)
+typedef float float_t;
+#define __DEFINED_float_t
+#endif
+
+#if defined(__NEED_double_t) && !defined(__DEFINED_double_t)
+typedef double double_t;
+#define __DEFINED_double_t
+#endif
+
+#else
+#if defined(__NEED_float_t) && !defined(__DEFINED_float_t)
+typedef long double float_t;
+#define __DEFINED_float_t
+#endif
+
+#if defined(__NEED_double_t) && !defined(__DEFINED_double_t)
+typedef long double double_t;
+#define __DEFINED_double_t
+#endif
+
+#endif
+
+#if !defined(__cplusplus)
+#if defined(__NEED_max_align_t) && !defined(__DEFINED_max_align_t)
+typedef struct { _Alignas(8) long long __ll; long double __ld; } max_align_t;
+#define __DEFINED_max_align_t
+#endif
+
+#elif defined(__GNUC__)
+#if defined(__NEED_max_align_t) && !defined(__DEFINED_max_align_t)
+typedef struct { __attribute__((__aligned__(8))) long long __ll; long double __ld; } max_align_t;
+#define __DEFINED_max_align_t
+#endif
+
+#else
+#if defined(__NEED_max_align_t) && !defined(__DEFINED_max_align_t)
+typedef struct { alignas(8) long long __ll; long double __ld; } max_align_t;
+#define __DEFINED_max_align_t
+#endif
+
+#endif
+
+#if defined(__NEED_time_t) && !defined(__DEFINED_time_t)
+typedef long time_t;
+#define __DEFINED_time_t
+#endif
+
+#if defined(__NEED_suseconds_t) && !defined(__DEFINED_suseconds_t)
+typedef long suseconds_t;
+#define __DEFINED_suseconds_t
+#endif
+
+
+#if defined(__NEED_pthread_attr_t) && !defined(__DEFINED_pthread_attr_t)
+typedef struct { union { int __i[9]; volatile int __vi[9]; unsigned __s[9]; } __u; } pthread_attr_t;
+#define __DEFINED_pthread_attr_t
+#endif
+
+#if defined(__NEED_pthread_mutex_t) && !defined(__DEFINED_pthread_mutex_t)
+typedef struct { union { int __i[6]; volatile int __vi[6]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t;
+#define __DEFINED_pthread_mutex_t
+#endif
+
+#if defined(__NEED_mtx_t) && !defined(__DEFINED_mtx_t)
+typedef struct { union { int __i[6]; volatile int __vi[6]; volatile void *volatile __p[6]; } __u; } mtx_t;
+#define __DEFINED_mtx_t
+#endif
+
+#if defined(__NEED_pthread_cond_t) && !defined(__DEFINED_pthread_cond_t)
+typedef struct { union { int __i[12]; volatile int __vi[12]; void *__p[12]; } __u; } pthread_cond_t;
+#define __DEFINED_pthread_cond_t
+#endif
+
+#if defined(__NEED_cnd_t) && !defined(__DEFINED_cnd_t)
+typedef struct { union { int __i[12]; volatile int __vi[12]; void *__p[12]; } __u; } cnd_t;
+#define __DEFINED_cnd_t
+#endif
+
+#if defined(__NEED_pthread_rwlock_t) && !defined(__DEFINED_pthread_rwlock_t)
+typedef struct { union { int __i[8]; volatile int __vi[8]; void *__p[8]; } __u; } pthread_rwlock_t;
+#define __DEFINED_pthread_rwlock_t
+#endif
+
+#if defined(__NEED_pthread_barrier_t) && !defined(__DEFINED_pthread_barrier_t)
+typedef struct { union { int __i[5]; volatile int __vi[5]; void *__p[5]; } __u; } pthread_barrier_t;
+#define __DEFINED_pthread_barrier_t
+#endif
+
+#if defined(__NEED_size_t) && !defined(__DEFINED_size_t)
+typedef unsigned _Addr size_t;
+#define __DEFINED_size_t
+#endif
+
+#if defined(__NEED_uintptr_t) && !defined(__DEFINED_uintptr_t)
+typedef unsigned _Addr uintptr_t;
+#define __DEFINED_uintptr_t
+#endif
+
+#if defined(__NEED_ptrdiff_t) && !defined(__DEFINED_ptrdiff_t)
+typedef _Addr ptrdiff_t;
+#define __DEFINED_ptrdiff_t
+#endif
+
+#if defined(__NEED_ssize_t) && !defined(__DEFINED_ssize_t)
+typedef _Addr ssize_t;
+#define __DEFINED_ssize_t
+#endif
+
+#if defined(__NEED_intptr_t) && !defined(__DEFINED_intptr_t)
+typedef _Addr intptr_t;
+#define __DEFINED_intptr_t
+#endif
+
+#if defined(__NEED_regoff_t) && !defined(__DEFINED_regoff_t)
+typedef _Addr regoff_t;
+#define __DEFINED_regoff_t
+#endif
+
+#if defined(__NEED_register_t) && !defined(__DEFINED_register_t)
+typedef _Reg register_t;
+#define __DEFINED_register_t
+#endif
+
+
+#if defined(__NEED_int8_t) && !defined(__DEFINED_int8_t)
+typedef signed char int8_t;
+#define __DEFINED_int8_t
+#endif
+
+#if defined(__NEED_int16_t) && !defined(__DEFINED_int16_t)
+typedef signed short int16_t;
+#define __DEFINED_int16_t
+#endif
+
+#if defined(__NEED_int32_t) && !defined(__DEFINED_int32_t)
+typedef signed int int32_t;
+#define __DEFINED_int32_t
+#endif
+
+#if defined(__NEED_int64_t) && !defined(__DEFINED_int64_t)
+typedef signed _Int64 int64_t;
+#define __DEFINED_int64_t
+#endif
+
+#if defined(__NEED_intmax_t) && !defined(__DEFINED_intmax_t)
+typedef signed _Int64 intmax_t;
+#define __DEFINED_intmax_t
+#endif
+
+#if defined(__NEED_uint8_t) && !defined(__DEFINED_uint8_t)
+typedef unsigned char uint8_t;
+#define __DEFINED_uint8_t
+#endif
+
+#if defined(__NEED_uint16_t) && !defined(__DEFINED_uint16_t)
+typedef unsigned short uint16_t;
+#define __DEFINED_uint16_t
+#endif
+
+#if defined(__NEED_uint32_t) && !defined(__DEFINED_uint32_t)
+typedef unsigned int uint32_t;
+#define __DEFINED_uint32_t
+#endif
+
+#if defined(__NEED_uint64_t) && !defined(__DEFINED_uint64_t)
+typedef unsigned _Int64 uint64_t;
+#define __DEFINED_uint64_t
+#endif
+
+#if defined(__NEED_u_int64_t) && !defined(__DEFINED_u_int64_t)
+typedef unsigned _Int64 u_int64_t;
+#define __DEFINED_u_int64_t
+#endif
+
+#if defined(__NEED_uintmax_t) && !defined(__DEFINED_uintmax_t)
+typedef unsigned _Int64 uintmax_t;
+#define __DEFINED_uintmax_t
+#endif
+
+
+#if defined(__NEED_mode_t) && !defined(__DEFINED_mode_t)
+typedef unsigned mode_t;
+#define __DEFINED_mode_t
+#endif
+
+#if defined(__NEED_nlink_t) && !defined(__DEFINED_nlink_t)
+typedef unsigned _Reg nlink_t;
+#define __DEFINED_nlink_t
+#endif
+
+#if defined(__NEED_off_t) && !defined(__DEFINED_off_t)
+typedef _Int64 off_t;
+#define __DEFINED_off_t
+#endif
+
+#if defined(__NEED_ino_t) && !defined(__DEFINED_ino_t)
+typedef unsigned _Int64 ino_t;
+#define __DEFINED_ino_t
+#endif
+
+#if defined(__NEED_dev_t) && !defined(__DEFINED_dev_t)
+typedef unsigned _Int64 dev_t;
+#define __DEFINED_dev_t
+#endif
+
+#if defined(__NEED_blksize_t) && !defined(__DEFINED_blksize_t)
+typedef long blksize_t;
+#define __DEFINED_blksize_t
+#endif
+
+#if defined(__NEED_blkcnt_t) && !defined(__DEFINED_blkcnt_t)
+typedef _Int64 blkcnt_t;
+#define __DEFINED_blkcnt_t
+#endif
+
+#if defined(__NEED_fsblkcnt_t) && !defined(__DEFINED_fsblkcnt_t)
+typedef unsigned _Int64 fsblkcnt_t;
+#define __DEFINED_fsblkcnt_t
+#endif
+
+#if defined(__NEED_fsfilcnt_t) && !defined(__DEFINED_fsfilcnt_t)
+typedef unsigned _Int64 fsfilcnt_t;
+#define __DEFINED_fsfilcnt_t
+#endif
+
+
+#if defined(__NEED_wint_t) && !defined(__DEFINED_wint_t)
+typedef unsigned wint_t;
+#define __DEFINED_wint_t
+#endif
+
+#if defined(__NEED_wctype_t) && !defined(__DEFINED_wctype_t)
+typedef unsigned long wctype_t;
+#define __DEFINED_wctype_t
+#endif
+
+
+#if defined(__NEED_timer_t) && !defined(__DEFINED_timer_t)
+typedef void * timer_t;
+#define __DEFINED_timer_t
+#endif
+
+#if defined(__NEED_clockid_t) && !defined(__DEFINED_clockid_t)
+typedef int clockid_t;
+#define __DEFINED_clockid_t
+#endif
+
+#if defined(__NEED_clock_t) && !defined(__DEFINED_clock_t)
+typedef long clock_t;
+#define __DEFINED_clock_t
+#endif
+
+#if defined(__NEED_struct_timeval) && !defined(__DEFINED_struct_timeval)
+struct timeval { time_t tv_sec; suseconds_t tv_usec; };
+#define __DEFINED_struct_timeval
+#endif
+
+#if defined(__NEED_struct_timespec) && !defined(__DEFINED_struct_timespec)
+struct timespec { time_t tv_sec; long tv_nsec; };
+#define __DEFINED_struct_timespec
+#endif
+
+
+#if defined(__NEED_pid_t) && !defined(__DEFINED_pid_t)
+typedef int pid_t;
+#define __DEFINED_pid_t
+#endif
+
+#if defined(__NEED_id_t) && !defined(__DEFINED_id_t)
+typedef unsigned id_t;
+#define __DEFINED_id_t
+#endif
+
+#if defined(__NEED_uid_t) && !defined(__DEFINED_uid_t)
+typedef unsigned uid_t;
+#define __DEFINED_uid_t
+#endif
+
+#if defined(__NEED_gid_t) && !defined(__DEFINED_gid_t)
+typedef unsigned gid_t;
+#define __DEFINED_gid_t
+#endif
+
+#if defined(__NEED_key_t) && !defined(__DEFINED_key_t)
+typedef int key_t;
+#define __DEFINED_key_t
+#endif
+
+#if defined(__NEED_useconds_t) && !defined(__DEFINED_useconds_t)
+typedef unsigned useconds_t;
+#define __DEFINED_useconds_t
+#endif
+
+
+#ifdef __cplusplus
+#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t)
+typedef unsigned long pthread_t;
+#define __DEFINED_pthread_t
+#endif
+
+#else
+#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t)
+typedef struct __pthread * pthread_t;
+#define __DEFINED_pthread_t
+#endif
+
+#endif
+#if defined(__NEED_pthread_once_t) && !defined(__DEFINED_pthread_once_t)
+typedef int pthread_once_t;
+#define __DEFINED_pthread_once_t
+#endif
+
+#if defined(__NEED_pthread_key_t) && !defined(__DEFINED_pthread_key_t)
+typedef unsigned pthread_key_t;
+#define __DEFINED_pthread_key_t
+#endif
+
+#if defined(__NEED_pthread_spinlock_t) && !defined(__DEFINED_pthread_spinlock_t)
+typedef int pthread_spinlock_t;
+#define __DEFINED_pthread_spinlock_t
+#endif
+
+#if defined(__NEED_pthread_mutexattr_t) && !defined(__DEFINED_pthread_mutexattr_t)
+typedef struct { unsigned __attr; } pthread_mutexattr_t;
+#define __DEFINED_pthread_mutexattr_t
+#endif
+
+#if defined(__NEED_pthread_condattr_t) && !defined(__DEFINED_pthread_condattr_t)
+typedef struct { unsigned __attr; } pthread_condattr_t;
+#define __DEFINED_pthread_condattr_t
+#endif
+
+#if defined(__NEED_pthread_barrierattr_t) && !defined(__DEFINED_pthread_barrierattr_t)
+typedef struct { unsigned __attr; } pthread_barrierattr_t;
+#define __DEFINED_pthread_barrierattr_t
+#endif
+
+#if defined(__NEED_pthread_rwlockattr_t) && !defined(__DEFINED_pthread_rwlockattr_t)
+typedef struct { unsigned __attr[2]; } pthread_rwlockattr_t;
+#define __DEFINED_pthread_rwlockattr_t
+#endif
+
+
+#if defined(__NEED_FILE) && !defined(__DEFINED_FILE)
+typedef struct _IO_FILE FILE;
+#define __DEFINED_FILE
+#endif
+
+
+#if defined(__NEED_mbstate_t) && !defined(__DEFINED_mbstate_t)
+typedef struct __mbstate_t { unsigned __opaque1, __opaque2; } mbstate_t;
+#define __DEFINED_mbstate_t
+#endif
+
+
+#if defined(__NEED_locale_t) && !defined(__DEFINED_locale_t)
+typedef struct __locale_struct * locale_t;
+#define __DEFINED_locale_t
+#endif
+
+
+#if defined(__NEED_sigset_t) && !defined(__DEFINED_sigset_t)
+typedef struct __sigset_t { unsigned long __bits[128/sizeof(long)]; } sigset_t;
+#define __DEFINED_sigset_t
+#endif
+
+
+#if defined(__NEED_struct_iovec) && !defined(__DEFINED_struct_iovec)
+struct iovec { void *iov_base; size_t iov_len; };
+#define __DEFINED_struct_iovec
+#endif
+
+
+#if defined(__NEED_socklen_t) && !defined(__DEFINED_socklen_t)
+typedef unsigned socklen_t;
+#define __DEFINED_socklen_t
+#endif
+
+#if defined(__NEED_sa_family_t) && !defined(__DEFINED_sa_family_t)
+typedef unsigned short sa_family_t;
+#define __DEFINED_sa_family_t
+#endif
+
+
+#undef _Addr
+#undef _Int64
+#undef _Reg
diff --git a/src/third_party/musl/arch/mips/bits/alltypes.h b/src/third_party/musl/arch/mips/bits/alltypes.h
new file mode 100644
index 0000000..2d70952
--- /dev/null
+++ b/src/third_party/musl/arch/mips/bits/alltypes.h
@@ -0,0 +1,385 @@
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#if defined(__NEED_va_list) && !defined(__DEFINED_va_list)
+typedef __builtin_va_list va_list;
+#define __DEFINED_va_list
+#endif
+
+#if defined(__NEED___isoc_va_list) && !defined(__DEFINED___isoc_va_list)
+typedef __builtin_va_list __isoc_va_list;
+#define __DEFINED___isoc_va_list
+#endif
+
+
+#ifndef __cplusplus
+#if defined(__NEED_wchar_t) && !defined(__DEFINED_wchar_t)
+typedef int wchar_t;
+#define __DEFINED_wchar_t
+#endif
+
+#endif
+
+#if defined(__NEED_float_t) && !defined(__DEFINED_float_t)
+typedef float float_t;
+#define __DEFINED_float_t
+#endif
+
+#if defined(__NEED_double_t) && !defined(__DEFINED_double_t)
+typedef double double_t;
+#define __DEFINED_double_t
+#endif
+
+
+#if defined(__NEED_max_align_t) && !defined(__DEFINED_max_align_t)
+typedef struct { long long __ll; long double __ld; } max_align_t;
+#define __DEFINED_max_align_t
+#endif
+
+
+#if defined(__NEED_time_t) && !defined(__DEFINED_time_t)
+typedef long time_t;
+#define __DEFINED_time_t
+#endif
+
+#if defined(__NEED_suseconds_t) && !defined(__DEFINED_suseconds_t)
+typedef long suseconds_t;
+#define __DEFINED_suseconds_t
+#endif
+
+
+#if defined(__NEED_pthread_attr_t) && !defined(__DEFINED_pthread_attr_t)
+typedef struct { union { int __i[9]; volatile int __vi[9]; unsigned __s[9]; } __u; } pthread_attr_t;
+#define __DEFINED_pthread_attr_t
+#endif
+
+#if defined(__NEED_pthread_mutex_t) && !defined(__DEFINED_pthread_mutex_t)
+typedef struct { union { int __i[6]; volatile int __vi[6]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t;
+#define __DEFINED_pthread_mutex_t
+#endif
+
+#if defined(__NEED_mtx_t) && !defined(__DEFINED_mtx_t)
+typedef struct { union { int __i[6]; volatile int __vi[6]; volatile void *volatile __p[6]; } __u; } mtx_t;
+#define __DEFINED_mtx_t
+#endif
+
+#if defined(__NEED_pthread_cond_t) && !defined(__DEFINED_pthread_cond_t)
+typedef struct { union { int __i[12]; volatile int __vi[12]; void *__p[12]; } __u; } pthread_cond_t;
+#define __DEFINED_pthread_cond_t
+#endif
+
+#if defined(__NEED_cnd_t) && !defined(__DEFINED_cnd_t)
+typedef struct { union { int __i[12]; volatile int __vi[12]; void *__p[12]; } __u; } cnd_t;
+#define __DEFINED_cnd_t
+#endif
+
+#if defined(__NEED_pthread_rwlock_t) && !defined(__DEFINED_pthread_rwlock_t)
+typedef struct { union { int __i[8]; volatile int __vi[8]; void *__p[8]; } __u; } pthread_rwlock_t;
+#define __DEFINED_pthread_rwlock_t
+#endif
+
+#if defined(__NEED_pthread_barrier_t) && !defined(__DEFINED_pthread_barrier_t)
+typedef struct { union { int __i[5]; volatile int __vi[5]; void *__p[5]; } __u; } pthread_barrier_t;
+#define __DEFINED_pthread_barrier_t
+#endif
+
+#if defined(__NEED_size_t) && !defined(__DEFINED_size_t)
+typedef unsigned _Addr size_t;
+#define __DEFINED_size_t
+#endif
+
+#if defined(__NEED_uintptr_t) && !defined(__DEFINED_uintptr_t)
+typedef unsigned _Addr uintptr_t;
+#define __DEFINED_uintptr_t
+#endif
+
+#if defined(__NEED_ptrdiff_t) && !defined(__DEFINED_ptrdiff_t)
+typedef _Addr ptrdiff_t;
+#define __DEFINED_ptrdiff_t
+#endif
+
+#if defined(__NEED_ssize_t) && !defined(__DEFINED_ssize_t)
+typedef _Addr ssize_t;
+#define __DEFINED_ssize_t
+#endif
+
+#if defined(__NEED_intptr_t) && !defined(__DEFINED_intptr_t)
+typedef _Addr intptr_t;
+#define __DEFINED_intptr_t
+#endif
+
+#if defined(__NEED_regoff_t) && !defined(__DEFINED_regoff_t)
+typedef _Addr regoff_t;
+#define __DEFINED_regoff_t
+#endif
+
+#if defined(__NEED_register_t) && !defined(__DEFINED_register_t)
+typedef _Reg register_t;
+#define __DEFINED_register_t
+#endif
+
+
+#if defined(__NEED_int8_t) && !defined(__DEFINED_int8_t)
+typedef signed char int8_t;
+#define __DEFINED_int8_t
+#endif
+
+#if defined(__NEED_int16_t) && !defined(__DEFINED_int16_t)
+typedef signed short int16_t;
+#define __DEFINED_int16_t
+#endif
+
+#if defined(__NEED_int32_t) && !defined(__DEFINED_int32_t)
+typedef signed int int32_t;
+#define __DEFINED_int32_t
+#endif
+
+#if defined(__NEED_int64_t) && !defined(__DEFINED_int64_t)
+typedef signed _Int64 int64_t;
+#define __DEFINED_int64_t
+#endif
+
+#if defined(__NEED_intmax_t) && !defined(__DEFINED_intmax_t)
+typedef signed _Int64 intmax_t;
+#define __DEFINED_intmax_t
+#endif
+
+#if defined(__NEED_uint8_t) && !defined(__DEFINED_uint8_t)
+typedef unsigned char uint8_t;
+#define __DEFINED_uint8_t
+#endif
+
+#if defined(__NEED_uint16_t) && !defined(__DEFINED_uint16_t)
+typedef unsigned short uint16_t;
+#define __DEFINED_uint16_t
+#endif
+
+#if defined(__NEED_uint32_t) && !defined(__DEFINED_uint32_t)
+typedef unsigned int uint32_t;
+#define __DEFINED_uint32_t
+#endif
+
+#if defined(__NEED_uint64_t) && !defined(__DEFINED_uint64_t)
+typedef unsigned _Int64 uint64_t;
+#define __DEFINED_uint64_t
+#endif
+
+#if defined(__NEED_u_int64_t) && !defined(__DEFINED_u_int64_t)
+typedef unsigned _Int64 u_int64_t;
+#define __DEFINED_u_int64_t
+#endif
+
+#if defined(__NEED_uintmax_t) && !defined(__DEFINED_uintmax_t)
+typedef unsigned _Int64 uintmax_t;
+#define __DEFINED_uintmax_t
+#endif
+
+
+#if defined(__NEED_mode_t) && !defined(__DEFINED_mode_t)
+typedef unsigned mode_t;
+#define __DEFINED_mode_t
+#endif
+
+#if defined(__NEED_nlink_t) && !defined(__DEFINED_nlink_t)
+typedef unsigned _Reg nlink_t;
+#define __DEFINED_nlink_t
+#endif
+
+#if defined(__NEED_off_t) && !defined(__DEFINED_off_t)
+typedef _Int64 off_t;
+#define __DEFINED_off_t
+#endif
+
+#if defined(__NEED_ino_t) && !defined(__DEFINED_ino_t)
+typedef unsigned _Int64 ino_t;
+#define __DEFINED_ino_t
+#endif
+
+#if defined(__NEED_dev_t) && !defined(__DEFINED_dev_t)
+typedef unsigned _Int64 dev_t;
+#define __DEFINED_dev_t
+#endif
+
+#if defined(__NEED_blksize_t) && !defined(__DEFINED_blksize_t)
+typedef long blksize_t;
+#define __DEFINED_blksize_t
+#endif
+
+#if defined(__NEED_blkcnt_t) && !defined(__DEFINED_blkcnt_t)
+typedef _Int64 blkcnt_t;
+#define __DEFINED_blkcnt_t
+#endif
+
+#if defined(__NEED_fsblkcnt_t) && !defined(__DEFINED_fsblkcnt_t)
+typedef unsigned _Int64 fsblkcnt_t;
+#define __DEFINED_fsblkcnt_t
+#endif
+
+#if defined(__NEED_fsfilcnt_t) && !defined(__DEFINED_fsfilcnt_t)
+typedef unsigned _Int64 fsfilcnt_t;
+#define __DEFINED_fsfilcnt_t
+#endif
+
+
+#if defined(__NEED_wint_t) && !defined(__DEFINED_wint_t)
+typedef unsigned wint_t;
+#define __DEFINED_wint_t
+#endif
+
+#if defined(__NEED_wctype_t) && !defined(__DEFINED_wctype_t)
+typedef unsigned long wctype_t;
+#define __DEFINED_wctype_t
+#endif
+
+
+#if defined(__NEED_timer_t) && !defined(__DEFINED_timer_t)
+typedef void * timer_t;
+#define __DEFINED_timer_t
+#endif
+
+#if defined(__NEED_clockid_t) && !defined(__DEFINED_clockid_t)
+typedef int clockid_t;
+#define __DEFINED_clockid_t
+#endif
+
+#if defined(__NEED_clock_t) && !defined(__DEFINED_clock_t)
+typedef long clock_t;
+#define __DEFINED_clock_t
+#endif
+
+#if defined(__NEED_struct_timeval) && !defined(__DEFINED_struct_timeval)
+struct timeval { time_t tv_sec; suseconds_t tv_usec; };
+#define __DEFINED_struct_timeval
+#endif
+
+#if defined(__NEED_struct_timespec) && !defined(__DEFINED_struct_timespec)
+struct timespec { time_t tv_sec; long tv_nsec; };
+#define __DEFINED_struct_timespec
+#endif
+
+
+#if defined(__NEED_pid_t) && !defined(__DEFINED_pid_t)
+typedef int pid_t;
+#define __DEFINED_pid_t
+#endif
+
+#if defined(__NEED_id_t) && !defined(__DEFINED_id_t)
+typedef unsigned id_t;
+#define __DEFINED_id_t
+#endif
+
+#if defined(__NEED_uid_t) && !defined(__DEFINED_uid_t)
+typedef unsigned uid_t;
+#define __DEFINED_uid_t
+#endif
+
+#if defined(__NEED_gid_t) && !defined(__DEFINED_gid_t)
+typedef unsigned gid_t;
+#define __DEFINED_gid_t
+#endif
+
+#if defined(__NEED_key_t) && !defined(__DEFINED_key_t)
+typedef int key_t;
+#define __DEFINED_key_t
+#endif
+
+#if defined(__NEED_useconds_t) && !defined(__DEFINED_useconds_t)
+typedef unsigned useconds_t;
+#define __DEFINED_useconds_t
+#endif
+
+
+#ifdef __cplusplus
+#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t)
+typedef unsigned long pthread_t;
+#define __DEFINED_pthread_t
+#endif
+
+#else
+#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t)
+typedef struct __pthread * pthread_t;
+#define __DEFINED_pthread_t
+#endif
+
+#endif
+#if defined(__NEED_pthread_once_t) && !defined(__DEFINED_pthread_once_t)
+typedef int pthread_once_t;
+#define __DEFINED_pthread_once_t
+#endif
+
+#if defined(__NEED_pthread_key_t) && !defined(__DEFINED_pthread_key_t)
+typedef unsigned pthread_key_t;
+#define __DEFINED_pthread_key_t
+#endif
+
+#if defined(__NEED_pthread_spinlock_t) && !defined(__DEFINED_pthread_spinlock_t)
+typedef int pthread_spinlock_t;
+#define __DEFINED_pthread_spinlock_t
+#endif
+
+#if defined(__NEED_pthread_mutexattr_t) && !defined(__DEFINED_pthread_mutexattr_t)
+typedef struct { unsigned __attr; } pthread_mutexattr_t;
+#define __DEFINED_pthread_mutexattr_t
+#endif
+
+#if defined(__NEED_pthread_condattr_t) && !defined(__DEFINED_pthread_condattr_t)
+typedef struct { unsigned __attr; } pthread_condattr_t;
+#define __DEFINED_pthread_condattr_t
+#endif
+
+#if defined(__NEED_pthread_barrierattr_t) && !defined(__DEFINED_pthread_barrierattr_t)
+typedef struct { unsigned __attr; } pthread_barrierattr_t;
+#define __DEFINED_pthread_barrierattr_t
+#endif
+
+#if defined(__NEED_pthread_rwlockattr_t) && !defined(__DEFINED_pthread_rwlockattr_t)
+typedef struct { unsigned __attr[2]; } pthread_rwlockattr_t;
+#define __DEFINED_pthread_rwlockattr_t
+#endif
+
+
+#if defined(__NEED_FILE) && !defined(__DEFINED_FILE)
+typedef struct _IO_FILE FILE;
+#define __DEFINED_FILE
+#endif
+
+
+#if defined(__NEED_mbstate_t) && !defined(__DEFINED_mbstate_t)
+typedef struct __mbstate_t { unsigned __opaque1, __opaque2; } mbstate_t;
+#define __DEFINED_mbstate_t
+#endif
+
+
+#if defined(__NEED_locale_t) && !defined(__DEFINED_locale_t)
+typedef struct __locale_struct * locale_t;
+#define __DEFINED_locale_t
+#endif
+
+
+#if defined(__NEED_sigset_t) && !defined(__DEFINED_sigset_t)
+typedef struct __sigset_t { unsigned long __bits[128/sizeof(long)]; } sigset_t;
+#define __DEFINED_sigset_t
+#endif
+
+
+#if defined(__NEED_struct_iovec) && !defined(__DEFINED_struct_iovec)
+struct iovec { void *iov_base; size_t iov_len; };
+#define __DEFINED_struct_iovec
+#endif
+
+
+#if defined(__NEED_socklen_t) && !defined(__DEFINED_socklen_t)
+typedef unsigned socklen_t;
+#define __DEFINED_socklen_t
+#endif
+
+#if defined(__NEED_sa_family_t) && !defined(__DEFINED_sa_family_t)
+typedef unsigned short sa_family_t;
+#define __DEFINED_sa_family_t
+#endif
+
+
+#undef _Addr
+#undef _Int64
+#undef _Reg
diff --git a/src/third_party/musl/generated/include/bits/alltypes.h b/src/third_party/musl/arch/x86_64/bits/alltypes.h
similarity index 100%
rename from src/third_party/musl/generated/include/bits/alltypes.h
rename to src/third_party/musl/arch/x86_64/bits/alltypes.h
diff --git a/src/third_party/musl/generate.sh b/src/third_party/musl/generate.sh
new file mode 100755
index 0000000..a3d7285
--- /dev/null
+++ b/src/third_party/musl/generate.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+sed -f tools/mkalltypes.sed arch/aarch64/bits/alltypes.h.in include/alltypes.h.in > arch/aarch64/bits/alltypes.h
+sed -f tools/mkalltypes.sed arch/arm/bits/alltypes.h.in include/alltypes.h.in > arch/arm/bits/alltypes.h
+sed -f tools/mkalltypes.sed arch/x86_64/bits/alltypes.h.in include/alltypes.h.in > arch/x86_64/bits/alltypes.h
+sed -f tools/mkalltypes.sed arch/i386/bits/alltypes.h.in include/alltypes.h.in > arch/i386/bits/alltypes.h
+sed -f tools/mkalltypes.sed arch/mips/bits/alltypes.h.in include/alltypes.h.in > arch/mips/bits/alltypes.h
+
diff --git a/src/third_party/musl/generated/README.md b/src/third_party/musl/generated/README.md
deleted file mode 100644
index ae1726d..0000000
--- a/src/third_party/musl/generated/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-This directory contains generated headers made by
-running "./configure && make" on a stock Google Rodete machine.
-
-TODO: Generate these via the Cobalt gyp build.
diff --git a/src/third_party/musl/musl.gyp b/src/third_party/musl/musl.gyp
index 58afe2f..895e07f 100644
--- a/src/third_party/musl/musl.gyp
+++ b/src/third_party/musl/musl.gyp
@@ -57,7 +57,6 @@
'-isystem<(DEPTH)/third_party/musl/include',
'-isystem<(DEPTH)/third_party/musl/arch/x86_64',
'-isystem<(DEPTH)/third_party/musl/arch/generic',
- '-isystem<(DEPTH)/third_party/musl/generated/include',
'-w',
],
'direct_dependent_settings': {
@@ -77,19 +76,25 @@
'conditions': [
['musl_arch in ["i386", "x86_64", "aarch64"]', {
'sources': [
- 'src/fenv/<(musl_arch)/fenv.s'
+ 'src/fenv/<(musl_arch)/fenv.s',
+ 'src/setjmp/<(musl_arch)/setjmp.s',
+ 'src/setjmp/<(musl_arch)/longjmp.s',
],
}],
['musl_arch == "arm"', {
'sources': [
'src/fenv/arm/fenv.c',
- 'src/fenv/arm/fenv-hf.S'
+ 'src/fenv/arm/fenv-hf.S',
+ 'src/setjmp/<(musl_arch)/setjmp.s',
+ 'src/setjmp/<(musl_arch)/longjmp.s',
],
}],
['musl_arch == "mips"', {
'sources': [
'src/fenv/mips/fenv.S,',
- 'src/fenv/mips/fenv-sf.c'
+ 'src/fenv/mips/fenv-sf.c',
+ 'src/setjmp/<(musl_arch)/setjmp.S',
+ 'src/setjmp/<(musl_arch)/longjmp.S',
],
}],
['musl_arch in ["i386", "x86_64"]', {
@@ -123,6 +128,7 @@
'src/starboard/ctype/__ctype_get_mb_cur_max.c',
'src/starboard/errno/__errno_location.c',
'src/starboard/exit/abort.c',
+ 'src/starboard/hwcap/sethwcap.c',
'src/starboard/locale/freelocale.c',
'src/starboard/locale/langinfo.c',
'src/starboard/locale/localeconv.c',
diff --git a/src/third_party/musl/src/math/rint.c b/src/third_party/musl/src/math/rint.c
index dd14bf6..54414b5 100644
--- a/src/third_party/musl/src/math/rint.c
+++ b/src/third_party/musl/src/math/rint.c
@@ -1,6 +1,7 @@
#include <float.h>
#include <math.h>
#include <stdint.h>
+#include "libc.h"
#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
#define EPS DBL_EPSILON
@@ -31,3 +32,7 @@
return s ? -0.0 : 0;
return y;
}
+
+#ifdef COBALT_MUSL_W_GLIBC_HEADERS
+weak_alias(rint_internal, rint);
+#endif // COBALT_MUSL_W_GLIBC_HEADERS
diff --git a/src/third_party/musl/src/starboard/hwcap/sethwcap.c b/src/third_party/musl/src/starboard/hwcap/sethwcap.c
new file mode 100644
index 0000000..8f54cd6
--- /dev/null
+++ b/src/third_party/musl/src/starboard/hwcap/sethwcap.c
@@ -0,0 +1,15 @@
+#include "hwcap_impl.h"
+#include "libc.h"
+#include "starboard/cpu_features.h"
+
+size_t __hwcap;
+
+// Set __hwcap bitmask by Starboard CPU features API.
+void init_musl_hwcap() {
+ SbCPUFeatures features;
+ if (SbCPUFeaturesGet(&features)) {
+ __hwcap = features.hwcap;
+ } else {
+ __hwcap = 0;
+ }
+}
diff --git a/src/third_party/musl/src/starboard/internal/hwcap_impl.h b/src/third_party/musl/src/starboard/internal/hwcap_impl.h
new file mode 100644
index 0000000..4039e08
--- /dev/null
+++ b/src/third_party/musl/src/starboard/internal/hwcap_impl.h
@@ -0,0 +1,14 @@
+#ifndef _HWCAP_IMPL_H_
+#define _HWCAP_IMPL_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
+
+void init_musl_hwcap();
+
+#ifdef __cplusplus
+} // extern "C"
+#endif // __cplusplus
+
+#endif
diff --git a/src/v8/gypfiles/toolchain.gypi b/src/v8/gypfiles/toolchain.gypi
index fce4d07..14183a9 100644
--- a/src/v8/gypfiles/toolchain.gypi
+++ b/src/v8/gypfiles/toolchain.gypi
@@ -158,12 +158,14 @@
}],
],
'target_defaults': {
- 'ldflags_host': [
- # mksnapshot can not be compiled on host machine with default clang
- # linker.
- '-fuse-ld=lld',
- ],
'conditions': [
+ ['clang==1', {
+ 'ldflags_host': [
+ # mksnapshot can not be compiled on host machine with default clang
+ # linker.
+ '-fuse-ld=lld',
+ ],
+ }],
['v8_target_arch=="arm"', {
'defines': [
'V8_TARGET_ARCH_ARM',
diff --git a/src/v8/src/builtins/builtins-regexp-gen.cc b/src/v8/src/builtins/builtins-regexp-gen.cc
index 4227c62..34e8af9 100644
--- a/src/v8/src/builtins/builtins-regexp-gen.cc
+++ b/src/v8/src/builtins/builtins-regexp-gen.cc
@@ -2022,10 +2022,7 @@
Node* const result_fixed_array = LoadElements(result);
Node* const match = LoadFixedArrayElement(result_fixed_array, 0);
- // The match is guaranteed to be a string on the fast path.
- CSA_ASSERT(this, IsString(match));
-
- var_match.Bind(match);
+ var_match.Bind(ToString_Inline(context, match));
Goto(&if_didmatch);
}
diff --git a/src/v8/src/regexp/regexp-utils.cc b/src/v8/src/regexp/regexp-utils.cc
index d483125..4030ad4 100644
--- a/src/v8/src/regexp/regexp-utils.cc
+++ b/src/v8/src/regexp/regexp-utils.cc
@@ -35,7 +35,7 @@
namespace {
-V8_INLINE bool HasInitialRegExpMap(Isolate* isolate, Handle<JSReceiver> recv) {
+V8_INLINE bool HasInitialRegExpMap(Isolate* isolate, JSReceiver* recv) {
return recv->map() == isolate->regexp_function()->initial_map();
}
@@ -46,7 +46,7 @@
uint64_t value) {
Handle<Object> value_as_object =
isolate->factory()->NewNumberFromInt64(value);
- if (HasInitialRegExpMap(isolate, recv)) {
+ if (HasInitialRegExpMap(isolate, *recv)) {
JSRegExp::cast(*recv)->set_last_index(*value_as_object, SKIP_WRITE_BARRIER);
return recv;
} else {
@@ -57,7 +57,7 @@
MaybeHandle<Object> RegExpUtils::GetLastIndex(Isolate* isolate,
Handle<JSReceiver> recv) {
- if (HasInitialRegExpMap(isolate, recv)) {
+ if (HasInitialRegExpMap(isolate, *recv)) {
return handle(JSRegExp::cast(*recv)->last_index(), isolate);
} else {
return Object::GetProperty(recv, isolate->factory()->lastIndex_string());
@@ -142,9 +142,7 @@
JSReceiver* recv = JSReceiver::cast(*obj);
- // Check the receiver's map.
- Handle<JSFunction> regexp_function = isolate->regexp_function();
- if (recv->map() != regexp_function->initial_map()) return false;
+ if (!HasInitialRegExpMap(isolate, recv)) return false;
// Check the receiver's prototype's map.
Object* proto = recv->map()->prototype();
diff --git a/src/v8/src/runtime/runtime-regexp.cc b/src/v8/src/runtime/runtime-regexp.cc
index d0afcd2..135853a 100644
--- a/src/v8/src/runtime/runtime-regexp.cc
+++ b/src/v8/src/runtime/runtime-regexp.cc
@@ -1303,10 +1303,9 @@
MUST_USE_RESULT MaybeHandle<String> RegExpReplace(Isolate* isolate,
Handle<JSRegExp> regexp,
Handle<String> string,
- Handle<Object> replace_obj) {
+ Handle<String> replace) {
// Functional fast-paths are dispatched directly by replace builtin.
DCHECK(RegExpUtils::IsUnmodifiedRegExp(isolate, regexp));
- DCHECK(!replace_obj->IsCallable());
Factory* factory = isolate->factory();
@@ -1314,9 +1313,6 @@
const bool global = (flags & JSRegExp::kGlobal) != 0;
const bool sticky = (flags & JSRegExp::kSticky) != 0;
- Handle<String> replace;
- ASSIGN_RETURN_ON_EXCEPTION(isolate, replace,
- Object::ToString(isolate, replace_obj), String);
replace = String::Flatten(replace);
Handle<RegExpMatchInfo> last_match_info = isolate->regexp_last_match_info();
@@ -1411,18 +1407,23 @@
CONVERT_ARG_HANDLE_CHECKED(String, subject, 1);
CONVERT_ARG_HANDLE_CHECKED(RegExpMatchInfo, last_match_info, 2);
CONVERT_ARG_HANDLE_CHECKED(JSArray, result_array, 3);
+
+ DCHECK(RegExpUtils::IsUnmodifiedRegExp(isolate, regexp));
CHECK(result_array->HasObjectElements());
subject = String::Flatten(subject);
CHECK(regexp->GetFlags() & JSRegExp::kGlobal);
+ Object* result;
if (regexp->CaptureCount() == 0) {
- return SearchRegExpMultiple<false>(isolate, subject, regexp,
- last_match_info, result_array);
+ result = SearchRegExpMultiple<false>(isolate, subject, regexp,
+ last_match_info, result_array);
} else {
- return SearchRegExpMultiple<true>(isolate, subject, regexp, last_match_info,
- result_array);
+ result = SearchRegExpMultiple<true>(isolate, subject, regexp,
+ last_match_info, result_array);
}
+ DCHECK(RegExpUtils::IsUnmodifiedRegExp(isolate, regexp));
+ return result;
}
RUNTIME_FUNCTION(Runtime_StringReplaceNonGlobalRegExpWithFunction) {
@@ -1737,14 +1738,6 @@
string = String::Flatten(string);
- // Fast-path for unmodified JSRegExps.
- if (RegExpUtils::IsUnmodifiedRegExp(isolate, recv)) {
- RETURN_RESULT_OR_FAILURE(
- isolate, RegExpReplace(isolate, Handle<JSRegExp>::cast(recv), string,
- replace_obj));
- }
-
- const uint32_t length = string->length();
const bool functional_replace = replace_obj->IsCallable();
Handle<String> replace;
@@ -1753,6 +1746,21 @@
Object::ToString(isolate, replace_obj));
}
+ // Fast-path for unmodified JSRegExps (and non-functional replace).
+ if (RegExpUtils::IsUnmodifiedRegExp(isolate, recv)) {
+ // We should never get here with functional replace because unmodified
+ // regexp and functional replace should be fully handled in CSA code.
+ CHECK(!functional_replace);
+ Handle<Object> result;
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
+ isolate, result,
+ RegExpReplace(isolate, Handle<JSRegExp>::cast(recv), string, replace));
+ DCHECK(RegExpUtils::IsUnmodifiedRegExp(isolate, recv));
+ return *result;
+ }
+
+ const uint32_t length = string->length();
+
Handle<Object> global_obj;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, global_obj,
diff --git a/src/v8/src/wasm/baseline/liftoff-compiler.cc b/src/v8/src/wasm/baseline/liftoff-compiler.cc
index 255ee03..0acbc07 100644
--- a/src/v8/src/wasm/baseline/liftoff-compiler.cc
+++ b/src/v8/src/wasm/baseline/liftoff-compiler.cc
@@ -62,8 +62,13 @@
class LiftoffCompiler {
public:
+ // This was causing cascading build errors when compiling v8 for the older
+ // clang compilers.Some private variables of this class have their move
+ // constructor implicitly deleted. Trying to fix that causes a chain of
+ // deleting the move constructor for multiple classes.
+#if !defined(V8_OS_STARBOARD)
MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(LiftoffCompiler);
-
+#endif
// TODO(clemensh): Make this a template parameter.
static constexpr wasm::Decoder::ValidateFlag validate =
wasm::Decoder::kValidate;
diff --git a/src/v8/src/wasm/wasm-debug.cc b/src/v8/src/wasm/wasm-debug.cc
index 87995df..60366bd 100644
--- a/src/v8/src/wasm/wasm-debug.cc
+++ b/src/v8/src/wasm/wasm-debug.cc
@@ -92,7 +92,13 @@
}
class InterpreterHandle {
+ // This was causing cascading build errors when compiling v8 for the older
+ // clang compilers.Some private variables of this class have their move
+ // constructor implicitly deleted. Trying to fix that causes a chain of
+ // deleting the move constructor for multiple classes.
+#if !defined(V8_OS_STARBOARD)
MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(InterpreterHandle);
+#endif
Isolate* isolate_;
const WasmModule* module_;
WasmInterpreter interpreter_;
diff --git a/src/v8/src/x64/assembler-x64.cc b/src/v8/src/x64/assembler-x64.cc
index c8f326e..1b768de 100644
--- a/src/v8/src/x64/assembler-x64.cc
+++ b/src/v8/src/x64/assembler-x64.cc
@@ -36,9 +36,10 @@
namespace {
-#if !V8_LIBC_MSVCRT
-
-V8_INLINE uint64_t _xgetbv(unsigned int xcr) {
+V8_INLINE uint64_t xgetbv(unsigned int xcr) {
+#if V8_LIBC_MSVCRT
+ return _xgetbv(xcr);
+#else
unsigned eax, edx;
// Check xgetbv; this uses a .byte sequence instead of the instruction
// directly because older assemblers do not include support for xgetbv and
@@ -46,13 +47,9 @@
// used.
__asm__ volatile(".byte 0x0F, 0x01, 0xD0" : "=a"(eax), "=d"(edx) : "c"(xcr));
return static_cast<uint64_t>(eax) | (static_cast<uint64_t>(edx) << 32);
+#endif
}
-#define _XCR_XFEATURE_ENABLED_MASK 0
-
-#endif // !V8_LIBC_MSVCRT
-
-
bool OSHasAVXSupport() {
#if V8_OS_MACOSX
// Mac OS X up to 10.9 has a bug where AVX transitions were indeed being
@@ -72,7 +69,7 @@
if (kernel_version_major <= 13) return false;
#endif // V8_OS_MACOSX
// Check whether OS claims to support AVX.
- uint64_t feature_mask = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);
+ uint64_t feature_mask = xgetbv(0); // XCR_XFEATURE_ENABLED_MASK
return (feature_mask & 0x6) == 0x6;
}